~ubuntu-branches/ubuntu/utopic/dropbear/utopic-proposed

« back to all changes in this revision

Viewing changes to libtomcrypt/pkcs_1_v15_sa_encode.c

  • Committer: Bazaar Package Importer
  • Author(s): Matt Johnston
  • Date: 2005-12-08 19:20:21 UTC
  • mfrom: (1.2.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20051208192021-nyp9rwnt77nsg6ty
Tags: 0.47-1
* New upstream release.
* SECURITY: Fix incorrect buffer sizing.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2
 
 *
3
 
 * LibTomCrypt is a library that provides various cryptographic
4
 
 * algorithms in a highly modular and flexible manner.
5
 
 *
6
 
 * The library is free for all purposes without any express
7
 
 * guarantee it works.
8
 
 *
9
 
 * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org
10
 
 */
11
 
#include "mycrypt.h"
12
 
 
13
 
/* PKCS #1 v1.5 Signature Padding -- Tom St Denis */
14
 
 
15
 
#ifdef PKCS_1
16
 
 
17
 
int pkcs_1_v15_sa_encode(const unsigned char *msghash,  unsigned long msghashlen,
18
 
                               int            hash_idx, unsigned long modulus_bitlen,
19
 
                               unsigned char *out,      unsigned long *outlen)
20
 
{
21
 
  unsigned long derlen, modulus_bytelen, x, y;
22
 
  int err;
23
 
 
24
 
  _ARGCHK(msghash != NULL)
25
 
  _ARGCHK(out     != NULL);
26
 
  _ARGCHK(outlen  != NULL);
27
 
 
28
 
  if ((err = hash_is_valid(hash_idx)) != CRYPT_OK) {
29
 
     return err;
30
 
  }
31
 
 
32
 
  /* hack, to detect any hash without a DER OID */
33
 
  if (hash_descriptor[hash_idx].DERlen == 0) {
34
 
     return CRYPT_INVALID_ARG; 
35
 
  }
36
 
 
37
 
  /* get modulus len */
38
 
  modulus_bytelen = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0);
39
 
 
40
 
  /* get der len ok?  Forgive my lame German accent.... */
41
 
  derlen = hash_descriptor[hash_idx].DERlen;
42
 
 
43
 
  /* valid sizes? */
44
 
  if (msghashlen + 3 + derlen > modulus_bytelen) {
45
 
     return CRYPT_PK_INVALID_SIZE;
46
 
  }
47
 
 
48
 
  if (*outlen < modulus_bytelen) {
49
 
     return CRYPT_BUFFER_OVERFLOW;
50
 
  }
51
 
 
52
 
  /* packet is 0x00 0x01 PS 0x00 T, where PS == 0xFF repeated modulus_bytelen - 3 - derlen - msghashlen times, T == DER || hash */
53
 
  x = 0;
54
 
  out[x++] = 0x00;
55
 
  out[x++] = 0x01;
56
 
  for (y = 0; y < (modulus_bytelen - 3 - derlen - msghashlen); y++) {
57
 
     out[x++] = 0xFF;
58
 
  }
59
 
  out[x++] = 0x00;
60
 
  for (y = 0; y < derlen; y++) {
61
 
     out[x++] = hash_descriptor[hash_idx].DER[y];
62
 
  }
63
 
  for (y = 0; y < msghashlen; y++) {
64
 
     out[x++] = msghash[y];
65
 
  }
66
 
 
67
 
  *outlen = modulus_bytelen;
68
 
  return CRYPT_OK;
69
 
}
70
 
 
71
 
#endif /* PKCS_1 */