silc_pem_* routines renamed to silc_base64_*
[silc.git] / lib / silccrypt / silcpkcs1.c
index 0094e13089bf348da224efe520ac4d600be0ad84..a438ef3ceccf5fd3d2b8661e6a22bdf5434d6474 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 2003 - 2006 Pekka Riikonen
+  Copyright (C) 2003 - 2007 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -20,6 +20,7 @@
 
 #include "silc.h"
 #include "rsa.h"
+#include "silcpkcs1_i.h"
 
 /************************** PKCS #1 message format ***************************/
 
@@ -74,14 +75,15 @@ SilcBool silc_pkcs1_encode(SilcPkcs1BlockType bt,
 
   case SILC_PKCS1_BT_PUB:
     /* Encryption */
+    if (!rng) {
+      SILC_LOG_ERROR(("Cannot encrypt: random number generator not provided"));
+      return FALSE;
+    }
 
     /* It is guaranteed this routine does not return zero byte. */
-    if (rng)
-      for (i = 2; i < padlen; i++)
-       dest_data[i] = silc_rng_get_byte_fast(rng);
-    else
-      for (i = 2; i < padlen; i++)
-       dest_data[i] = silc_rng_global_get_byte_fast();
+    for (i = 2; i < padlen; i++)
+      dest_data[i] = silc_rng_get_byte_fast(rng);
+
     break;
   }
 
@@ -203,7 +205,7 @@ SilcBool silc_pkcs1_generate_key(SilcUInt32 keylen,
   }
 
   /* Generate the actual keys */
-  if (!rsa_generate_keys(keylen, &p, &q, ret_public_key, ret_private_key))
+  if (!silc_rsa_generate_keys(keylen, &p, &q, ret_public_key, ret_private_key))
     return FALSE;
 
   silc_mp_uninit(&p);
@@ -214,20 +216,20 @@ SilcBool silc_pkcs1_generate_key(SilcUInt32 keylen,
 
 /* Import PKCS #1 compliant public key */
 
-SilcBool silc_pkcs1_import_public_key(unsigned char *key,
-                                     SilcUInt32 key_len,
-                                     void **ret_public_key)
+int silc_pkcs1_import_public_key(unsigned char *key,
+                                SilcUInt32 key_len,
+                                void **ret_public_key)
 {
   SilcAsn1 asn1 = NULL;
   SilcBufferStruct alg_key;
   RsaPublicKey *pubkey;
 
   if (!ret_public_key)
-    return FALSE;
+    return 0;
 
   asn1 = silc_asn1_alloc();
   if (!asn1)
-    return FALSE;
+    return 0;
 
   /* Allocate RSA public key */
   *ret_public_key = pubkey = silc_calloc(1, sizeof(*pubkey));
@@ -249,11 +251,12 @@ SilcBool silc_pkcs1_import_public_key(unsigned char *key,
 
   silc_asn1_free(asn1);
 
-  return TRUE;
+  return key_len;
 
  err:
+  silc_free(pubkey);
   silc_asn1_free(asn1);
-  return FALSE;
+  return 0;
 }
 
 /* Export PKCS #1 compliant public key */
@@ -347,9 +350,9 @@ void silc_pkcs1_public_key_free(void *public_key)
 
 /* Import PKCS #1 compliant private key */
 
-SilcBool silc_pkcs1_import_private_key(unsigned char *key,
-                                      SilcUInt32 key_len,
-                                      void **ret_private_key)
+int silc_pkcs1_import_private_key(unsigned char *key,
+                                 SilcUInt32 key_len,
+                                 void **ret_private_key)
 {
   SilcAsn1 asn1;
   SilcBufferStruct alg_key;
@@ -357,11 +360,11 @@ SilcBool silc_pkcs1_import_private_key(unsigned char *key,
   SilcUInt32 ver;
 
   if (!ret_private_key)
-    return FALSE;
+    return 0;
 
   asn1 = silc_asn1_alloc();
   if (!asn1)
-    return FALSE;
+    return 0;
 
   /* Allocate RSA private key */
   *ret_private_key = privkey = silc_calloc(1, sizeof(*privkey));
@@ -393,11 +396,12 @@ SilcBool silc_pkcs1_import_private_key(unsigned char *key,
 
   silc_asn1_free(asn1);
 
-  return TRUE;
+  return key_len;
 
  err:
+  silc_free(privkey);
   silc_asn1_free(asn1);
-  return FALSE;
+  return 0;
 }
 
 /* Export PKCS #1 compliant private key */
@@ -473,7 +477,8 @@ SilcBool silc_pkcs1_encrypt(void *public_key,
                            SilcUInt32 src_len,
                            unsigned char *dst,
                            SilcUInt32 dst_size,
-                           SilcUInt32 *ret_dst_len)
+                           SilcUInt32 *ret_dst_len,
+                           SilcRng rng)
 {
   RsaPublicKey *key = public_key;
   SilcMPInt mp_tmp;
@@ -488,7 +493,7 @@ SilcBool silc_pkcs1_encrypt(void *public_key,
 
   /* Pad data */
   if (!silc_pkcs1_encode(SILC_PKCS1_BT_PUB, src, src_len,
-                        padded, len, NULL))
+                        padded, len, rng))
     return FALSE;
 
   silc_mp_init(&mp_tmp);
@@ -498,7 +503,7 @@ SilcBool silc_pkcs1_encrypt(void *public_key,
   silc_mp_bin2mp(padded, len, &mp_tmp);
 
   /* Encrypt */
-  rsa_public_operation(key, &mp_tmp, &mp_dst);
+  silc_rsa_public_operation(key, &mp_tmp, &mp_dst);
 
   /* MP to data */
   silc_mp_mp2bin_noalloc(&mp_dst, dst, len);
@@ -534,7 +539,7 @@ SilcBool silc_pkcs1_decrypt(void *private_key,
   silc_mp_bin2mp(src, src_len, &mp_tmp);
 
   /* Decrypt */
-  rsa_private_operation(key, &mp_tmp, &mp_dst);
+  silc_rsa_private_operation(key, &mp_tmp, &mp_dst);
 
   /* MP to data */
   padded = silc_mp_mp2bin(&mp_dst, (key->bits + 7) / 8, &padded_len);
@@ -561,6 +566,8 @@ SilcBool silc_pkcs1_decrypt(void *private_key,
   return TRUE;
 }
 
+/* PKCS #1 sign with appendix, hash OID included in the signature */
+
 SilcBool silc_pkcs1_sign(void *private_key,
                         unsigned char *src,
                         SilcUInt32 src_len,
@@ -572,6 +579,8 @@ SilcBool silc_pkcs1_sign(void *private_key,
   return FALSE;
 }
 
+/* PKCS #1 verification with appendix. */
+
 SilcBool silc_pkcs1_verify(void *public_key,
                           unsigned char *signature,
                           SilcUInt32 signature_len,
@@ -622,7 +631,7 @@ SilcBool silc_pkcs1_sign_no_oid(void *private_key,
   silc_mp_bin2mp(padded, len, &mp_tmp);
 
   /* Sign */
-  rsa_private_operation(key, &mp_tmp, &mp_dst);
+  silc_rsa_private_operation(key, &mp_tmp, &mp_dst);
 
   /* MP to data */
   silc_mp_mp2bin_noalloc(&mp_dst, signature, len);
@@ -660,7 +669,7 @@ SilcBool silc_pkcs1_verify_no_oid(void *public_key,
   silc_mp_bin2mp(signature, signature_len, &mp_tmp2);
 
   /* Verify */
-  rsa_public_operation(key, &mp_tmp2, &mp_dst);
+  silc_rsa_public_operation(key, &mp_tmp2, &mp_dst);
 
   /* MP to data */
   verify = silc_mp_mp2bin(&mp_dst, len, &verify_len);