Added SILC Thread Queue API
[silc.git] / lib / silccrypt / silcpk.c
index b383db8c19637a2efb0a90f89068f9d645d31250..42aada1c1b7c2d7f6c9c6c924a4d74100c79d332 100644 (file)
@@ -85,7 +85,8 @@ SilcBool silc_pkcs_silc_generate_key(const char *algorithm,
     silc_free(privkey);
     return FALSE;
   }
-  (*ret_public_key)->pkcs = pkcs;
+  (*ret_public_key)->pkcs = (SilcPKCSObject *)pkcs;
+  (*ret_public_key)->alg = alg;
   (*ret_public_key)->public_key = pubkey;
 
   /* Allocate private key */
@@ -96,7 +97,8 @@ SilcBool silc_pkcs_silc_generate_key(const char *algorithm,
     silc_free(*ret_public_key);
     return FALSE;
   }
-  (*ret_private_key)->pkcs = pkcs;
+  (*ret_private_key)->pkcs = (SilcPKCSObject *)pkcs;
+  (*ret_private_key)->alg = alg;
   (*ret_private_key)->private_key = privkey;
 
   /* Generate the algorithm key pair */
@@ -124,7 +126,7 @@ SilcBool silc_pkcs_silc_decode_identifier(const char *identifier,
   int len;
 
   /* Protocol says that at least UN and HN must be provided as identifier */
-  if (!strstr(identifier, "UN=") && !strstr(identifier, "HN=")) {
+  if (!strstr(identifier, "UN=") || !strstr(identifier, "HN=")) {
     SILC_LOG_DEBUG(("The public does not have the required UN= and HN= "
                    "identifiers"));
     return FALSE;
@@ -205,9 +207,11 @@ char *silc_pkcs_silc_encode_identifier(SilcStack stack,
   SilcBufferStruct buf;
   char *identifier;
 
-  if (!username || !host)
+  if (!username || !host) {
+    SILC_LOG_ERROR(("Public key identifier is missing UN and/or HN"));
     return NULL;
-  if (strlen(username) < 3 || strlen(host) < 3)
+  }
+  if (strlen(username) < 1 || strlen(host) < 1)
     return NULL;
 
   memset(&buf, 0, sizeof(buf));
@@ -262,6 +266,7 @@ char *silc_pkcs_silc_encode_identifier(SilcStack stack,
   if (version) {
     if (strlen(version) > 1 || !isdigit(version[0])) {
       silc_buffer_spurge(stack, &buf);
+      SILC_LOG_ERROR(("Public key identifier has invalid version (V)"));
       return NULL;
     }
     silc_buffer_sformat(stack, &buf,
@@ -300,9 +305,7 @@ int silc_pkcs_silc_public_key_version(SilcPublicKey public_key)
 
 /* Returns PKCS algorithm context */
 
-const SilcPKCSAlgorithm *
-silc_pkcs_silc_get_algorithm(const struct SilcPKCSObjectStruct *pkcs,
-                            void *public_key)
+SILC_PKCS_GET_ALGORITHM(silc_pkcs_silc_get_algorithm)
 {
   SilcSILCPublicKey silc_pubkey = public_key;
   return silc_pubkey->pkcs;
@@ -310,12 +313,7 @@ silc_pkcs_silc_get_algorithm(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Imports SILC protocol style public key from SILC public key file */
 
-SilcBool
-silc_pkcs_silc_import_public_key_file(const struct SilcPKCSObjectStruct *pkcs,
-                                     unsigned char *filedata,
-                                     SilcUInt32 filedata_len,
-                                     SilcPKCSFileEncoding encoding,
-                                     void **ret_public_key)
+SILC_PKCS_IMPORT_PUBLIC_KEY_FILE(silc_pkcs_silc_import_public_key_file)
 {
   SilcUInt32 i, len;
   unsigned char *data = NULL;
@@ -329,12 +327,12 @@ silc_pkcs_silc_import_public_key_file(const struct SilcPKCSObjectStruct *pkcs,
   /* Check start of file and remove header from the data. */
   len = strlen(SILC_PKCS_PUBLIC_KEYFILE_BEGIN);
   if (filedata_len < len + strlen(SILC_PKCS_PUBLIC_KEYFILE_END)) {
-    SILC_LOG_ERROR(("Malformed SILC public key header"));
+    SILC_LOG_DEBUG(("Malformed SILC public key header"));
     return FALSE;
   }
   for (i = 0; i < len; i++) {
     if (*filedata != SILC_PKCS_PUBLIC_KEYFILE_BEGIN[i]) {
-      SILC_LOG_ERROR(("Malformed SILC public key header"));
+      SILC_LOG_DEBUG(("Malformed SILC public key header"));
       return FALSE;
     }
     filedata++;
@@ -354,8 +352,8 @@ silc_pkcs_silc_import_public_key_file(const struct SilcPKCSObjectStruct *pkcs,
     break;
   }
 
-  ret = silc_pkcs_silc_import_public_key(pkcs, filedata, filedata_len,
-                                        ret_public_key);
+  ret = silc_pkcs_silc_import_public_key(pkcs, NULL, filedata, filedata_len,
+                                        ret_public_key, ret_alg);
   silc_free(data);
 
   return ret ? TRUE : FALSE;
@@ -363,12 +361,8 @@ silc_pkcs_silc_import_public_key_file(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Imports SILC protocol style public key */
 
-int silc_pkcs_silc_import_public_key(const struct SilcPKCSObjectStruct *pkcs,
-                                    void *key,
-                                    SilcUInt32 key_len,
-                                    void **ret_public_key)
+SILC_PKCS_IMPORT_PUBLIC_KEY(silc_pkcs_silc_import_public_key)
 {
-  const SilcPKCSAlgorithm *alg;
   SilcBufferStruct buf, alg_key;
   SilcSILCPublicKey silc_pubkey = NULL;
   SilcAsn1 asn1 = NULL;
@@ -512,6 +506,7 @@ int silc_pkcs_silc_import_public_key(const struct SilcPKCSObjectStruct *pkcs,
   silc_asn1_free(asn1);
 
   *ret_public_key = silc_pubkey;
+  *ret_alg = alg;
 
   return key_len;
 
@@ -526,12 +521,7 @@ int silc_pkcs_silc_import_public_key(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Exports public key as SILC protocol style public key file */
 
-unsigned char *
-silc_pkcs_silc_export_public_key_file(const struct SilcPKCSObjectStruct *pkcs,
-                                     SilcStack stack,
-                                     void *public_key,
-                                     SilcPKCSFileEncoding encoding,
-                                     SilcUInt32 *ret_len)
+SILC_PKCS_EXPORT_PUBLIC_KEY_FILE(silc_pkcs_silc_export_public_key_file)
 {
   SilcBuffer buf;
   unsigned char *key, *data;
@@ -586,11 +576,7 @@ silc_pkcs_silc_export_public_key_file(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Exports public key as SILC protocol style public key */
 
-unsigned char *
-silc_pkcs_silc_export_public_key(const struct SilcPKCSObjectStruct *pkcs,
-                                SilcStack stack,
-                                void *public_key,
-                                SilcUInt32 *ret_len)
+SILC_PKCS_EXPORT_PUBLIC_KEY(silc_pkcs_silc_export_public_key)
 {
   SilcSILCPublicKey silc_pubkey = public_key;
   const SilcPKCSAlgorithm *alg = silc_pubkey->pkcs;
@@ -714,9 +700,7 @@ silc_pkcs_silc_export_public_key(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Return key length */
 
-SilcUInt32
-silc_pkcs_silc_public_key_bitlen(const struct SilcPKCSObjectStruct *pkcs,
-                                void *public_key)
+SILC_PKCS_PUBLIC_KEY_BITLEN(silc_pkcs_silc_public_key_bitlen)
 {
   SilcSILCPublicKey silc_pubkey = public_key;
   return silc_pubkey->pkcs->public_key_bitlen(silc_pubkey->pkcs,
@@ -725,8 +709,7 @@ silc_pkcs_silc_public_key_bitlen(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Copy public key */
 
-void *silc_pkcs_silc_public_key_copy(const struct SilcPKCSObjectStruct *pkcs,
-                                    void *public_key)
+SILC_PKCS_PUBLIC_KEY_COPY(silc_pkcs_silc_public_key_copy)
 {
   SilcSILCPublicKey silc_pubkey = public_key, new_pubkey;
   SilcPublicKeyIdentifier ident = &silc_pubkey->identifier;
@@ -771,9 +754,7 @@ void *silc_pkcs_silc_public_key_copy(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Compares public keys */
 
-SilcBool
-silc_pkcs_silc_public_key_compare(const struct SilcPKCSObjectStruct *pkcs,
-                                 void *key1, void *key2)
+SILC_PKCS_PUBLIC_KEY_COMPARE(silc_pkcs_silc_public_key_compare)
 {
   SilcSILCPublicKey k1 = key1, k2 = key2;
 
@@ -827,8 +808,7 @@ silc_pkcs_silc_public_key_compare(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Frees public key */
 
-void silc_pkcs_silc_public_key_free(const struct SilcPKCSObjectStruct *pkcs,
-                                   void *public_key)
+SILC_PKCS_PUBLIC_KEY_FREE(silc_pkcs_silc_public_key_free)
 {
   SilcSILCPublicKey silc_pubkey = public_key;
 
@@ -853,14 +833,7 @@ void silc_pkcs_silc_public_key_free(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Imports SILC implementation style private key file */
 
-SilcBool
-silc_pkcs_silc_import_private_key_file(const struct SilcPKCSObjectStruct *pkcs,
-                                      unsigned char *filedata,
-                                      SilcUInt32 filedata_len,
-                                      const char *passphrase,
-                                      SilcUInt32 passphrase_len,
-                                      SilcPKCSFileEncoding encoding,
-                                      void **ret_private_key)
+SILC_PKCS_IMPORT_PRIVATE_KEY_FILE(silc_pkcs_silc_import_private_key_file)
 {
   SilcCipher aes;
   SilcHash sha1;
@@ -875,12 +848,12 @@ silc_pkcs_silc_import_private_key_file(const struct SilcPKCSObjectStruct *pkcs,
   /* Check start of file and remove header from the data. */
   len = strlen(SILC_PKCS_PRIVATE_KEYFILE_BEGIN);
   if (filedata_len < len + strlen(SILC_PKCS_PRIVATE_KEYFILE_END)) {
-    SILC_LOG_ERROR(("Malformed SILC private key header"));
+    SILC_LOG_DEBUG(("Malformed SILC private key header"));
     return FALSE;
   }
   for (i = 0; i < len; i++) {
     if (*filedata != SILC_PKCS_PRIVATE_KEYFILE_BEGIN[i]) {
-      SILC_LOG_ERROR(("Malformed SILC private key header"));
+      SILC_LOG_DEBUG(("Malformed SILC private key header"));
       return FALSE;
     }
     filedata++;
@@ -992,7 +965,8 @@ silc_pkcs_silc_import_private_key_file(const struct SilcPKCSObjectStruct *pkcs,
   silc_cipher_free(aes);
 
   /* Import the private key */
-  ret = silc_pkcs_silc_import_private_key(pkcs, filedata, len, ret_private_key);
+  ret = silc_pkcs_silc_import_private_key(pkcs, NULL, filedata,
+                                         len, ret_private_key, ret_alg);
 
   silc_free(data);
 
@@ -1005,13 +979,9 @@ silc_pkcs_silc_import_private_key_file(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Imports SILC implementation style private key */
 
-int silc_pkcs_silc_import_private_key(const struct SilcPKCSObjectStruct *pkcs,
-                                     void *key,
-                                     SilcUInt32 key_len,
-                                     void **ret_private_key)
+SILC_PKCS_IMPORT_PRIVATE_KEY(silc_pkcs_silc_import_private_key)
 {
   SilcBufferStruct buf;
-  const SilcPKCSAlgorithm *alg;
   SilcBufferStruct alg_key;
   SilcSILCPrivateKey silc_privkey = NULL;
   SilcAsn1 asn1 = NULL;
@@ -1294,6 +1264,7 @@ int silc_pkcs_silc_import_private_key(const struct SilcPKCSObjectStruct *pkcs,
   silc_asn1_free(asn1);
 
   *ret_private_key = silc_privkey;
+  *ret_alg = alg;
 
   return key_len;
 
@@ -1308,15 +1279,7 @@ int silc_pkcs_silc_import_private_key(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Exports private key as SILC implementation style private key file */
 
-unsigned char *
-silc_pkcs_silc_export_private_key_file(const struct SilcPKCSObjectStruct *pkcs,
-                                      SilcStack stack,
-                                      void *private_key,
-                                      const char *passphrase,
-                                      SilcUInt32 passphrase_len,
-                                      SilcPKCSFileEncoding encoding,
-                                      SilcRng rng,
-                                      SilcUInt32 *ret_len)
+SILC_PKCS_EXPORT_PRIVATE_KEY_FILE(silc_pkcs_silc_export_private_key_file)
 {
   SilcCipher aes;
   SilcHash sha1;
@@ -1477,11 +1440,7 @@ silc_pkcs_silc_export_private_key_file(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Exports private key as SILC implementation style private key */
 
-unsigned char *
-silc_pkcs_silc_export_private_key(const struct SilcPKCSObjectStruct *pkcs,
-                                 SilcStack stack,
-                                 void *private_key,
-                                 SilcUInt32 *ret_len)
+SILC_PKCS_EXPORT_PRIVATE_KEY(silc_pkcs_silc_export_private_key)
 {
   SilcSILCPrivateKey silc_privkey = private_key;
   const SilcPKCSAlgorithm *alg = silc_privkey->pkcs;
@@ -1611,9 +1570,7 @@ silc_pkcs_silc_export_private_key(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Return key length */
 
-SilcUInt32
-silc_pkcs_silc_private_key_bitlen(const struct SilcPKCSObjectStruct *pkcs,
-                                 void *private_key)
+SILC_PKCS_PRIVATE_KEY_BITLEN(silc_pkcs_silc_private_key_bitlen)
 {
   SilcSILCPrivateKey silc_privkey = private_key;
   return silc_privkey->pkcs->private_key_bitlen(silc_privkey->pkcs,
@@ -1622,8 +1579,7 @@ silc_pkcs_silc_private_key_bitlen(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Frees private key */
 
-void silc_pkcs_silc_private_key_free(const struct SilcPKCSObjectStruct *pkcs,
-                                    void *private_key)
+SILC_PKCS_PRIVATE_KEY_FREE(silc_pkcs_silc_private_key_free)
 {
   SilcSILCPrivateKey silc_privkey = private_key;
 
@@ -1637,14 +1593,7 @@ void silc_pkcs_silc_private_key_free(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Encrypts as specified in SILC protocol specification */
 
-SilcAsyncOperation
-silc_pkcs_silc_encrypt(const struct SilcPKCSObjectStruct *pkcs,
-                      void *public_key,
-                      unsigned char *src,
-                      SilcUInt32 src_len,
-                      SilcRng rng,
-                      SilcPKCSEncryptCb encrypt_cb,
-                      void *context)
+SILC_PKCS_ENCRYPT(silc_pkcs_silc_encrypt)
 {
   SilcSILCPublicKey silc_pubkey = public_key;
 
@@ -1660,13 +1609,7 @@ silc_pkcs_silc_encrypt(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Decrypts as specified in SILC protocol specification */
 
-SilcAsyncOperation
-silc_pkcs_silc_decrypt(const struct SilcPKCSObjectStruct *pkcs,
-                      void *private_key,
-                      unsigned char *src,
-                      SilcUInt32 src_len,
-                      SilcPKCSDecryptCb decrypt_cb,
-                      void *context)
+SILC_PKCS_DECRYPT(silc_pkcs_silc_decrypt)
 {
   SilcSILCPrivateKey silc_privkey = private_key;
 
@@ -1682,15 +1625,7 @@ silc_pkcs_silc_decrypt(const struct SilcPKCSObjectStruct *pkcs,
 
 /* Signs as specified in SILC protocol specification */
 
-SilcAsyncOperation
-silc_pkcs_silc_sign(const struct SilcPKCSObjectStruct *pkcs,
-                   void *private_key,
-                   unsigned char *src,
-                   SilcUInt32 src_len,
-                   SilcBool compute_hash,
-                   SilcHash hash,
-                   SilcPKCSSignCb sign_cb,
-                   void *context)
+SILC_PKCS_SIGN(silc_pkcs_silc_sign)
 {
   SilcSILCPrivateKey silc_privkey = private_key;
 
@@ -1702,22 +1637,13 @@ silc_pkcs_silc_sign(const struct SilcPKCSObjectStruct *pkcs,
   return silc_privkey->pkcs->sign(silc_privkey->pkcs,
                                  silc_privkey->private_key,
                                  src, src_len,
-                                 compute_hash, hash,
+                                 compute_hash, hash, rng,
                                  sign_cb, context);
 }
 
 /* Verifies as specified in SILC protocol specification */
 
-SilcAsyncOperation
-silc_pkcs_silc_verify(const struct SilcPKCSObjectStruct *pkcs,
-                     void *public_key,
-                     unsigned char *signature,
-                     SilcUInt32 signature_len,
-                     unsigned char *data,
-                     SilcUInt32 data_len,
-                     SilcHash hash,
-                     SilcPKCSVerifyCb verify_cb,
-                     void *context)
+SILC_PKCS_VERIFY(silc_pkcs_silc_verify)
 {
   SilcSILCPublicKey silc_pubkey = public_key;
 
@@ -1729,6 +1655,6 @@ silc_pkcs_silc_verify(const struct SilcPKCSObjectStruct *pkcs,
   return silc_pubkey->pkcs->verify(silc_pubkey->pkcs,
                                   silc_pubkey->public_key,
                                   signature, signature_len,
-                                  data, data_len, hash,
+                                  data, data_len, hash, rng,
                                   verify_cb, context);
 }