Merged silc_1_0_branch to trunk.
[silc.git] / lib / silccrypt / pkcs1.c
index 3b99b69b77408fb609854a6f4d0954e477dd276f..98963739d8565565e05cb5624b4f41107449e0c6 100644 (file)
@@ -27,7 +27,7 @@
    Hence, the encoding is always in PKCS #1 version 1.5 format.
 
    Any questions and comments regarding this modified version should be
-   sent to priikone@poseidon.pspt.fi.
+   sent to priikone@silcnet.org.
 
    References: ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-1v2.asc,
                ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-1.asc,
@@ -105,8 +105,8 @@ typedef enum {
  * the rules defined in PKCS #1.
  */
 static unsigned char *
-RSA_FormatOneBlock(uint32 modulusLen, RSA_BlockType blockType,
-                  unsigned char *data, uint32 data_len)
+RSA_FormatOneBlock(SilcUInt32 modulusLen, RSA_BlockType blockType,
+                  unsigned char *data, SilcUInt32 data_len)
 {
     unsigned char *block;
     unsigned char *bp;
@@ -164,7 +164,7 @@ RSA_FormatOneBlock(uint32 modulusLen, RSA_BlockType blockType,
        for (i = 0; i < padLen; i++) {
            /* Pad with non-zero random data. */
            do {
-               silc_rng_global_get_byte(bp + i);
+             bp[i] = silc_rng_global_get_byte();
            } while (bp[i] == RSA_BLOCK_AFTER_PAD_OCTET);
        }
        bp += padLen;
@@ -181,10 +181,10 @@ RSA_FormatOneBlock(uint32 modulusLen, RSA_BlockType blockType,
 }
 
 static int
-RSA_FormatBlock(unsigned char **result, uint32 *result_len,
-               uint32 modulusLen,
+RSA_FormatBlock(unsigned char **result, SilcUInt32 *result_len,
+               SilcUInt32 modulusLen,
                RSA_BlockType blockType, unsigned char *data,
-               uint32 data_len)
+               SilcUInt32 data_len)
 {
     /*
      * XXX For now assume that the data length fits in a single
@@ -238,14 +238,14 @@ RSA_FormatBlock(unsigned char **result, uint32 *result_len,
  */
 unsigned char *
 RSA_DecodeOneBlock(unsigned char *data,
-                  uint32 modulusLen,
-                  uint32 expectedLen,
+                  SilcUInt32 modulusLen,
+                  SilcUInt32 expectedLen,
                   RSA_BlockType bt,
-                  uint32 *pResultLen)
+                  SilcUInt32 *pResultLen)
 {
     RSA_BlockType blockType;
     unsigned char *dp, *res;
-    uint32 i, len = 0;
+    SilcUInt32 i, len = 0;
 
     dp = data;
     if (dp[0] != RSA_BLOCK_FIRST_OCTET) {
@@ -256,6 +256,9 @@ RSA_DecodeOneBlock(unsigned char *data,
     if (blockType != bt)
       return NULL;
 
+    if (modulusLen < 2 + 1)
+      return NULL;
+
     dp += 2;
 
     switch (blockType) {
@@ -317,7 +320,7 @@ SILC_PKCS_API_ENCRYPT(pkcs1)
   SilcMPInt mp_tmp;
   SilcMPInt mp_dst;
   unsigned char *padded;
-  uint32 padded_len, len = key->bits / 8;
+  SilcUInt32 padded_len, len = (key->bits + 7) / 8;
 
   /* Pad data */
   if (!RSA_FormatBlock(&padded, &padded_len, len,
@@ -326,8 +329,6 @@ SILC_PKCS_API_ENCRYPT(pkcs1)
 
   silc_mp_init(&mp_tmp);
   silc_mp_init(&mp_dst);
-  silc_mp_set_ui(&mp_tmp, 0);
-  silc_mp_set_ui(&mp_dst, 0);
 
   /* Data to MP */
   silc_mp_bin2mp(padded, padded_len, &mp_tmp);
@@ -353,12 +354,10 @@ SILC_PKCS_API_DECRYPT(pkcs1)
   SilcMPInt mp_tmp;
   SilcMPInt mp_dst;
   unsigned char *padded, *unpadded;
-  uint32 padded_len;
+  SilcUInt32 padded_len;
 
   silc_mp_init(&mp_tmp);
   silc_mp_init(&mp_dst);
-  silc_mp_set_ui(&mp_tmp, 0);
-  silc_mp_set_ui(&mp_dst, 0);
 
   /* Data to MP */
   silc_mp_bin2mp(src, src_len, &mp_tmp);
@@ -367,7 +366,7 @@ SILC_PKCS_API_DECRYPT(pkcs1)
   rsa_en_de_crypt(&mp_dst, &mp_tmp, &key->d, &key->n);
 
   /* MP to data */
-  padded = silc_mp_mp2bin(&mp_dst, key->bits / 8, &padded_len);
+  padded = silc_mp_mp2bin(&mp_dst, (key->bits + 7) / 8, &padded_len);
 
   /* Unpad data */
   unpadded = RSA_DecodeOneBlock(padded, padded_len, 0, 
@@ -400,8 +399,8 @@ SILC_PKCS_API_SIGN(pkcs1)
   SilcMPInt mp_tmp;
   SilcMPInt mp_dst;
   unsigned char *padded;
-  uint32 padded_len;
-  uint32 len = key->bits / 8;
+  SilcUInt32 padded_len;
+  SilcUInt32 len = (key->bits + 7) / 8;
 
   /* Pad data */
   if (!RSA_FormatBlock(&padded, &padded_len, len, RSA_BlockPrivate, 
@@ -410,8 +409,6 @@ SILC_PKCS_API_SIGN(pkcs1)
 
   silc_mp_init(&mp_tmp);
   silc_mp_init(&mp_dst);
-  silc_mp_set_ui(&mp_tmp, 0);
-  silc_mp_set_ui(&mp_dst, 0);
 
   /* Data to MP */
   silc_mp_bin2mp(padded, len, &mp_tmp);
@@ -438,12 +435,10 @@ SILC_PKCS_API_VERIFY(pkcs1)
   SilcMPInt mp_tmp2;
   SilcMPInt mp_dst;
   unsigned char *verify, *unpadded;
-  uint32 verify_len, len = key->bits / 8;
+  SilcUInt32 verify_len, len = (key->bits + 7) / 8;
 
   silc_mp_init(&mp_tmp2);
   silc_mp_init(&mp_dst);
-  silc_mp_set_ui(&mp_tmp2, 0);
-  silc_mp_set_ui(&mp_dst, 0);
 
   /* Format the signature into MP int */
   silc_mp_bin2mp(signature, signature_len, &mp_tmp2);