Added macros helping defining PKCS APIs.
authorPekka Riikonen <priikone@silcnet.org>
Mon, 9 Jul 2007 17:32:04 +0000 (17:32 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Mon, 9 Jul 2007 17:32:04 +0000 (17:32 +0000)
Added SilcPKCSAlgorithm context to SilcPublicKey and
SilcPrivateKey contexts.

lib/silccrypt/silcpk.c
lib/silccrypt/silcpk_i.h
lib/silccrypt/silcpkcs.c
lib/silccrypt/silcpkcs.h
lib/silccrypt/silcpkcs1.c
lib/silccrypt/silcpkcs1_i.h
lib/silccrypt/silcpkcs_i.h

index b383db8c19637a2efb0a90f89068f9d645d31250..ad03a023610ff65356e1ba9b099a2dc470cfee91 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 */
@@ -300,9 +302,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 +310,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;
@@ -355,7 +350,7 @@ silc_pkcs_silc_import_public_key_file(const struct SilcPKCSObjectStruct *pkcs,
   }
 
   ret = silc_pkcs_silc_import_public_key(pkcs, filedata, filedata_len,
-                                        ret_public_key);
+                                        ret_public_key, ret_alg);
   silc_free(data);
 
   return ret ? TRUE : FALSE;
@@ -363,10 +358,7 @@ 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;
@@ -512,6 +504,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 +519,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 +574,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 +698,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 +707,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 +752,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 +806,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 +831,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;
@@ -992,7 +963,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, filedata, len, ret_private_key,
+                                         ret_alg);
 
   silc_free(data);
 
@@ -1005,10 +977,7 @@ 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;
@@ -1294,6 +1263,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 +1278,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 +1439,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 +1569,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 +1578,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 +1592,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 +1608,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 +1624,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;
 
@@ -1708,16 +1642,7 @@ silc_pkcs_silc_sign(const struct SilcPKCSObjectStruct *pkcs,
 
 /* 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;
 
index 48bfb465dda5d3cdf36bd2ba03503ee2bea6b2e4..e8d4e9eb8001a6dfc573fb64d866866f32d2a09c 100644 (file)
 #define SILC_PKCS_PRIVATE_KEYFILE_BEGIN "-----BEGIN SILC PRIVATE KEY-----\n"
 #define SILC_PKCS_PRIVATE_KEYFILE_END "\n-----END SILC PRIVATE KEY-----\n"
 
-const SilcPKCSAlgorithm *
-silc_pkcs_silc_get_algorithm(const struct SilcPKCSObjectStruct *pkcs,
-                            void *public_key);
-SilcBool
-silc_pkcs_silc_import_public_key_file(const struct SilcPKCSObjectStruct *pkcs,
-                                     unsigned char *filedata,
-                                     SilcUInt32 filedata_len,
-                                     SilcPKCSFileEncoding encoding,
-                                     void **ret_public_key);
-int silc_pkcs_silc_import_public_key(const struct SilcPKCSObjectStruct *pkcs,
-                                    void *key,
-                                    SilcUInt32 key_len,
-                                    void **ret_public_key);
-unsigned char *
-silc_pkcs_silc_export_public_key_file(const struct SilcPKCSObjectStruct *pkcs,
-                                     SilcStack stack,
-                                     void *public_key,
-                                     SilcPKCSFileEncoding encoding,
-                                     SilcUInt32 *ret_len);
-unsigned char *
-silc_pkcs_silc_export_public_key(const struct SilcPKCSObjectStruct *pkcs,
-                                SilcStack stack,
-                                void *public_key,
-                                SilcUInt32 *ret_len);
-SilcUInt32
-silc_pkcs_silc_public_key_bitlen(const struct SilcPKCSObjectStruct *pkcs,
-                                void *public_key);
-void *silc_pkcs_silc_public_key_copy(const struct SilcPKCSObjectStruct *pkcs,
-                                    void *public_key);
-SilcBool
-silc_pkcs_silc_public_key_compare(const struct SilcPKCSObjectStruct *pkcs,
-                                 void *key1, void *key2);
-void silc_pkcs_silc_public_key_free(const struct SilcPKCSObjectStruct *pkcs,
-                                   void *public_key);
-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);
-int silc_pkcs_silc_import_private_key(const struct SilcPKCSObjectStruct *pkcs,
-                                     void *key,
-                                     SilcUInt32 key_len,
-                                     void **ret_private_key);
-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);
-unsigned char *
-silc_pkcs_silc_export_private_key(const struct SilcPKCSObjectStruct *pkcs,
-                                 SilcStack stack,
-                                 void *private_key,
-                                 SilcUInt32 *ret_len);
-SilcUInt32
-silc_pkcs_silc_private_key_bitlen(const struct SilcPKCSObjectStruct *pkcs,
-                                 void *private_key);
-void silc_pkcs_silc_private_key_free(const struct SilcPKCSObjectStruct *pkcs,
-                                    void *private_key);
-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);
-SilcAsyncOperation
-silc_pkcs_silc_decrypt(const struct SilcPKCSObjectStruct *pkcs,
-                       void *private_key,
-                       unsigned char *src,
-                       SilcUInt32 src_len,
-                       SilcPKCSDecryptCb decrypt_cb,
-                       void *context);
-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);
-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_GET_ALGORITHM(silc_pkcs_silc_get_algorithm);
+SILC_PKCS_IMPORT_PUBLIC_KEY_FILE(silc_pkcs_silc_import_public_key_file);
+SILC_PKCS_IMPORT_PUBLIC_KEY(silc_pkcs_silc_import_public_key);
+SILC_PKCS_EXPORT_PUBLIC_KEY_FILE(silc_pkcs_silc_export_public_key_file);
+SILC_PKCS_EXPORT_PUBLIC_KEY(silc_pkcs_silc_export_public_key);
+SILC_PKCS_PUBLIC_KEY_BITLEN(silc_pkcs_silc_public_key_bitlen);
+SILC_PKCS_PUBLIC_KEY_COPY(silc_pkcs_silc_public_key_copy);
+SILC_PKCS_PUBLIC_KEY_COMPARE(silc_pkcs_silc_public_key_compare);
+SILC_PKCS_PUBLIC_KEY_FREE(silc_pkcs_silc_public_key_free);
+SILC_PKCS_IMPORT_PRIVATE_KEY_FILE(silc_pkcs_silc_import_private_key_file);
+SILC_PKCS_IMPORT_PRIVATE_KEY(silc_pkcs_silc_import_private_key);
+SILC_PKCS_EXPORT_PRIVATE_KEY_FILE(silc_pkcs_silc_export_private_key_file);
+SILC_PKCS_EXPORT_PRIVATE_KEY(silc_pkcs_silc_export_private_key);
+SILC_PKCS_PRIVATE_KEY_BITLEN(silc_pkcs_silc_private_key_bitlen);
+SILC_PKCS_PRIVATE_KEY_FREE(silc_pkcs_silc_private_key_free);
+SILC_PKCS_ENCRYPT(silc_pkcs_silc_encrypt);
+SILC_PKCS_DECRYPT(silc_pkcs_silc_decrypt);
+SILC_PKCS_SIGN(silc_pkcs_silc_sign);
+SILC_PKCS_VERIFY(silc_pkcs_silc_verify);
 
 #endif /* SILCPK_I_H */
index f537b880c1c2ebf01dfaef2570b99df347f81f3c..ebd6f16a6aabefe28ba965fae8e30a9f67e1f92d 100644 (file)
@@ -427,8 +427,7 @@ const SilcPKCSObject *silc_pkcs_get_pkcs(void *key)
 const SilcPKCSAlgorithm *silc_pkcs_get_algorithm(void *key)
 {
   SilcPublicKey public_key = key;
-  return public_key->pkcs->get_algorithm(public_key->pkcs,
-                                        public_key->public_key);
+  return public_key->alg;
 }
 
 /* Return algorithm name */
@@ -465,14 +464,17 @@ SilcBool silc_pkcs_public_key_alloc(SilcPKCSType type,
   if (!public_key)
     return FALSE;
 
-  public_key->pkcs = pkcs = silc_pkcs_find_pkcs(type);
+  pkcs = silc_pkcs_find_pkcs(type);
+  public_key->pkcs = (SilcPKCSObject *)pkcs;
   if (!public_key->pkcs) {
     silc_free(public_key);
     return FALSE;
   }
 
   /* Import the PKCS public key */
-  if (!pkcs->import_public_key(pkcs, key, key_len, &public_key->public_key)) {
+  if (!pkcs->import_public_key(pkcs, key, key_len,
+                              &public_key->public_key,
+                              &public_key->alg)) {
     silc_free(public_key);
     return FALSE;
   }
@@ -536,7 +538,8 @@ SilcBool silc_pkcs_private_key_alloc(SilcPKCSType type,
   if (!private_key)
     return FALSE;
 
-  private_key->pkcs = pkcs = silc_pkcs_find_pkcs(type);
+  pkcs = silc_pkcs_find_pkcs(type);
+  private_key->pkcs = (SilcPKCSObject *)pkcs;
   if (!private_key->pkcs) {
     silc_free(private_key);
     return FALSE;
@@ -544,7 +547,8 @@ SilcBool silc_pkcs_private_key_alloc(SilcPKCSType type,
 
   /* Import the PKCS private key */
   if (!pkcs->import_private_key(pkcs, key, key_len,
-                               &private_key->private_key)) {
+                               &private_key->private_key,
+                               &private_key->alg)) {
     silc_free(private_key);
     return FALSE;
   }
@@ -688,14 +692,15 @@ SilcBool silc_pkcs_load_public_key(const char *filename,
 
   /* Try loading all types until one succeeds. */
   for (type = SILC_PKCS_SILC; type <= SILC_PKCS_SPKI; type++) {
-    public_key->pkcs = silc_pkcs_find_pkcs(type);
+    public_key->pkcs = (SilcPKCSObject *)silc_pkcs_find_pkcs(type);
     if (!public_key->pkcs)
       continue;
 
     if (public_key->pkcs->import_public_key_file(public_key->pkcs,
                                                 data, data_len,
                                                 SILC_PKCS_FILE_BASE64,
-                                                &public_key->public_key)) {
+                                                &public_key->public_key,
+                                                &public_key->alg)) {
       silc_free(data);
       return TRUE;
     }
@@ -703,7 +708,8 @@ SilcBool silc_pkcs_load_public_key(const char *filename,
     if (public_key->pkcs->import_public_key_file(public_key->pkcs,
                                                 data, data_len,
                                                 SILC_PKCS_FILE_BIN,
-                                                &public_key->public_key)) {
+                                                &public_key->public_key,
+                                                &public_key->alg)) {
       silc_free(data);
       return TRUE;
     }
@@ -779,7 +785,7 @@ SilcBool silc_pkcs_load_private_key(const char *filename,
 
   /* Try loading all types until one succeeds. */
   for (type = SILC_PKCS_SILC; type <= SILC_PKCS_SPKI; type++) {
-    private_key->pkcs = silc_pkcs_find_pkcs(type);
+    private_key->pkcs = (SilcPKCSObject *)silc_pkcs_find_pkcs(type);
     if (!private_key->pkcs)
       continue;
 
@@ -789,7 +795,8 @@ SilcBool silc_pkcs_load_private_key(const char *filename,
                                              passphrase,
                                              passphrase_len,
                                              SILC_PKCS_FILE_BIN,
-                                             &private_key->private_key)) {
+                                             &private_key->private_key,
+                                             &private_key->alg)) {
       silc_free(data);
       return TRUE;
     }
@@ -800,7 +807,8 @@ SilcBool silc_pkcs_load_private_key(const char *filename,
                                              passphrase,
                                              passphrase_len,
                                              SILC_PKCS_FILE_BASE64,
-                                             &private_key->private_key)) {
+                                             &private_key->private_key,
+                                             &private_key->alg)) {
       silc_free(data);
       return TRUE;
     }
index 13488c72ee2cfd30eec8ee3d29be7b4b35fb3be3..47a898b9a2cedd58238a709b0ad3ec197cdc7802 100644 (file)
@@ -72,7 +72,8 @@ typedef enum {
  * SOURCE
  */
 typedef struct SilcPublicKeyStruct {
-  const SilcPKCSObject *pkcs;  /* PKCS */
+  SilcPKCSObject *pkcs;                /* PKCS */
+  const SilcPKCSAlgorithm *alg;        /* PKCS algorithm */
   void *public_key;            /* PKCS specific public key */
 } *SilcPublicKey;
 /***/
@@ -90,7 +91,8 @@ typedef struct SilcPublicKeyStruct {
  * SOURCE
  */
 typedef struct SilcPrivateKeyStruct {
-  const SilcPKCSObject *pkcs;  /* PKCS */
+  SilcPKCSObject *pkcs;                /* PKCS */
+  const SilcPKCSAlgorithm *alg;        /* PKCS algorithm */
   void *private_key;           /* PKCS specific private key */
 } *SilcPrivateKey;
 /***/
index b4ea51ca0e65790c02eab907b513e910132a4bfe..5db3f82a72e2795f26ac133d6d25de6de8846c89 100644 (file)
@@ -169,11 +169,7 @@ SilcBool silc_pkcs1_decode(SilcPkcs1BlockType bt,
 
 /* Generates RSA key pair. */
 
-SilcBool silc_pkcs1_generate_key(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                SilcUInt32 keylen,
-                                SilcRng rng,
-                                void **ret_public_key,
-                                void **ret_private_key)
+SILC_PKCS_ALG_GENERATE_KEY(silc_pkcs1_generate_key)
 {
   SilcUInt32 prime_bits = keylen / 2;
   SilcMPInt p, q;
@@ -217,10 +213,7 @@ SilcBool silc_pkcs1_generate_key(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* Import PKCS #1 compliant public key */
 
-int silc_pkcs1_import_public_key(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                void *key,
-                                SilcUInt32 key_len,
-                                void **ret_public_key)
+SILC_PKCS_ALG_IMPORT_PUBLIC_KEY(silc_pkcs1_import_public_key)
 {
   SilcAsn1 asn1 = NULL;
   SilcBufferStruct alg_key;
@@ -263,11 +256,7 @@ int silc_pkcs1_import_public_key(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* Export PKCS #1 compliant public key */
 
-unsigned char *
-silc_pkcs1_export_public_key(const struct SilcPKCSAlgorithmStruct *pkcs,
-                            SilcStack stack,
-                            void *public_key,
-                            SilcUInt32 *ret_len)
+SILC_PKCS_ALG_EXPORT_PUBLIC_KEY(silc_pkcs1_export_public_key)
 {
   RsaPublicKey *key = public_key;
   SilcAsn1 asn1 = NULL;
@@ -301,9 +290,7 @@ silc_pkcs1_export_public_key(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* Returns key length */
 
-SilcUInt32
-silc_pkcs1_public_key_bitlen(const struct SilcPKCSAlgorithmStruct *pkcs,
-                            void *public_key)
+SILC_PKCS_ALG_PUBLIC_KEY_BITLEN(silc_pkcs1_public_key_bitlen)
 {
   RsaPublicKey *key = public_key;
   return key->bits;
@@ -311,8 +298,7 @@ silc_pkcs1_public_key_bitlen(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* Copy public key */
 
-void *silc_pkcs1_public_key_copy(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                void *public_key)
+SILC_PKCS_ALG_PUBLIC_KEY_COPY(silc_pkcs1_public_key_copy)
 {
   RsaPublicKey *key = public_key, *new_key;
 
@@ -331,9 +317,7 @@ void *silc_pkcs1_public_key_copy(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* Compare public keys */
 
-SilcBool
-silc_pkcs1_public_key_compare(const struct SilcPKCSAlgorithmStruct *pkcs,
-                             void *key1, void *key2)
+SILC_PKCS_ALG_PUBLIC_KEY_COMPARE(silc_pkcs1_public_key_compare)
 {
   RsaPublicKey *k1 = key1, *k2 = key2;
 
@@ -349,8 +333,7 @@ silc_pkcs1_public_key_compare(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* Frees public key */
 
-void silc_pkcs1_public_key_free(const struct SilcPKCSAlgorithmStruct *pkcs,
-                               void *public_key)
+SILC_PKCS_ALG_PUBLIC_KEY_FREE(silc_pkcs1_public_key_free)
 {
   RsaPublicKey *key = public_key;
 
@@ -361,10 +344,7 @@ void silc_pkcs1_public_key_free(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* Import PKCS #1 compliant private key */
 
-int silc_pkcs1_import_private_key(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                 void *key,
-                                 SilcUInt32 key_len,
-                                 void **ret_private_key)
+SILC_PKCS_ALG_IMPORT_PRIVATE_KEY(silc_pkcs1_import_private_key)
 {
   SilcAsn1 asn1;
   SilcBufferStruct alg_key;
@@ -418,11 +398,7 @@ int silc_pkcs1_import_private_key(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* Export PKCS #1 compliant private key */
 
-unsigned char *
-silc_pkcs1_export_private_key(const struct SilcPKCSAlgorithmStruct *pkcs,
-                             SilcStack stack,
-                             void *private_key,
-                             SilcUInt32 *ret_len)
+SILC_PKCS_ALG_EXPORT_PRIVATE_KEY(silc_pkcs1_export_private_key)
 {
   RsaPrivateKey *key = private_key;
   SilcAsn1 asn1;
@@ -462,9 +438,7 @@ silc_pkcs1_export_private_key(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* Returns key length */
 
-SilcUInt32
-silc_pkcs1_private_key_bitlen(const struct SilcPKCSAlgorithmStruct *pkcs,
-                             void *private_key)
+SILC_PKCS_ALG_PRIVATE_KEY_BITLEN(silc_pkcs1_private_key_bitlen)
 {
   RsaPrivateKey *key = private_key;
   return key->bits;
@@ -472,8 +446,7 @@ silc_pkcs1_private_key_bitlen(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* Frees private key */
 
-void silc_pkcs1_private_key_free(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                void *private_key)
+SILC_PKCS_ALG_PRIVATE_KEY_FREE(silc_pkcs1_private_key_free)
 {
   RsaPrivateKey *key = private_key;
 
@@ -490,14 +463,7 @@ void silc_pkcs1_private_key_free(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* PKCS #1 RSA routines */
 
-SilcAsyncOperation
-silc_pkcs1_encrypt(const struct SilcPKCSAlgorithmStruct *pkcs,
-                  void *public_key,
-                  unsigned char *src,
-                  SilcUInt32 src_len,
-                  SilcRng rng,
-                  SilcPKCSEncryptCb encrypt_cb,
-                  void *context)
+SILC_PKCS_ALG_ENCRYPT(silc_pkcs1_encrypt)
 {
   RsaPublicKey *key = public_key;
   SilcMPInt mp_tmp;
@@ -543,13 +509,7 @@ silc_pkcs1_encrypt(const struct SilcPKCSAlgorithmStruct *pkcs,
   return NULL;
 }
 
-SilcAsyncOperation
-silc_pkcs1_decrypt(const struct SilcPKCSAlgorithmStruct *pkcs,
-                  void *private_key,
-                  unsigned char *src,
-                  SilcUInt32 src_len,
-                  SilcPKCSDecryptCb decrypt_cb,
-                  void *context)
+SILC_PKCS_ALG_DECRYPT(silc_pkcs1_decrypt)
 {
   RsaPrivateKey *key = private_key;
   SilcMPInt mp_tmp;
@@ -603,15 +563,7 @@ silc_pkcs1_decrypt(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* PKCS #1 sign with appendix, hash OID included in the signature */
 
-SilcAsyncOperation
-silc_pkcs1_sign(const struct SilcPKCSAlgorithmStruct *pkcs,
-               void *private_key,
-               unsigned char *src,
-               SilcUInt32 src_len,
-               SilcBool compute_hash,
-               SilcHash hash,
-               SilcPKCSSignCb sign_cb,
-               void *context)
+SILC_PKCS_ALG_SIGN(silc_pkcs1_sign)
 {
   RsaPrivateKey *key = private_key;
   unsigned char padded[2048 + 1], hashr[SILC_HASH_MAXLEN];
@@ -707,16 +659,7 @@ silc_pkcs1_sign(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* PKCS #1 verification with appendix. */
 
-SilcAsyncOperation
-silc_pkcs1_verify(const struct SilcPKCSAlgorithmStruct *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_ALG_VERIFY(silc_pkcs1_verify)
 {
   RsaPublicKey *key = public_key;
   SilcBool ret = FALSE;
@@ -845,15 +788,7 @@ silc_pkcs1_verify(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* PKCS #1 sign without hash oid */
 
-SilcAsyncOperation
-silc_pkcs1_sign_no_oid(const struct SilcPKCSAlgorithmStruct *pkcs,
-                      void *private_key,
-                      unsigned char *src,
-                      SilcUInt32 src_len,
-                      SilcBool compute_hash,
-                      SilcHash hash,
-                      SilcPKCSSignCb sign_cb,
-                      void *context)
+SILC_PKCS_ALG_SIGN(silc_pkcs1_sign_no_oid)
 {
   RsaPrivateKey *key = private_key;
   SilcMPInt mp_tmp;
@@ -912,16 +847,7 @@ silc_pkcs1_sign_no_oid(const struct SilcPKCSAlgorithmStruct *pkcs,
 
 /* PKCS #1 verify without hash oid */
 
-SilcAsyncOperation
-silc_pkcs1_verify_no_oid(const struct SilcPKCSAlgorithmStruct *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_ALG_VERIFY(silc_pkcs1_verify_no_oid)
 {
   RsaPublicKey *key = public_key;
   SilcBool ret = FALSE;
index ac74848f86002bcc070450235ecdba359bf01ffc..8f3cfe01e3d1d402bbe705f21512ffd580f41446 100644 (file)
 #ifndef SILCPKCS1_I_H
 #define SILCPKCS1_I_H
 
-SilcBool silc_pkcs1_generate_key(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                SilcUInt32 keylen,
-                                SilcRng rng,
-                                void **ret_public_key,
-                                void **ret_private_key);
-int silc_pkcs1_import_public_key(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                void *key,
-                                SilcUInt32 key_len,
-                                void **ret_public_key);
-unsigned char *
-silc_pkcs1_export_public_key(const struct SilcPKCSAlgorithmStruct *pkcs,
-                            SilcStack stack,
-                            void *public_key,
-                            SilcUInt32 *ret_len);
-SilcUInt32
-silc_pkcs1_public_key_bitlen(const struct SilcPKCSAlgorithmStruct *pkcs,
-                            void *public_key);
-void *silc_pkcs1_public_key_copy(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                void *public_key);
-SilcBool
-silc_pkcs1_public_key_compare(const struct SilcPKCSAlgorithmStruct *pkcs,
-                             void *key1, void *key2);
-void silc_pkcs1_public_key_free(const struct SilcPKCSAlgorithmStruct *pkcs,
-                               void *public_key);
-int silc_pkcs1_import_private_key(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                 void *key,
-                                 SilcUInt32 key_len,
-                                 void **ret_private_key);
-unsigned char *
-silc_pkcs1_export_private_key(const struct SilcPKCSAlgorithmStruct *pkcs,
-                             SilcStack stack,
-                             void *private_key,
-                             SilcUInt32 *ret_len);
-SilcUInt32
-silc_pkcs1_private_key_bitlen(const struct SilcPKCSAlgorithmStruct *pkcs,
-                             void *private_key);
-void silc_pkcs1_private_key_free(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                void *private_key);
-SilcAsyncOperation
-silc_pkcs1_encrypt(const struct SilcPKCSAlgorithmStruct *pkcs,
-                  void *public_key,
-                  unsigned char *src,
-                  SilcUInt32 src_len,
-                  SilcRng rng,
-                  SilcPKCSEncryptCb encrypt_cb,
-                  void *context);
-SilcAsyncOperation
-silc_pkcs1_decrypt(const struct SilcPKCSAlgorithmStruct *pkcs,
-                  void *private_key,
-                  unsigned char *src,
-                  SilcUInt32 src_len,
-                  SilcPKCSDecryptCb decrypt_cb,
-                  void *context);
-SilcAsyncOperation silc_pkcs1_sign(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                  void *private_key,
-                                  unsigned char *src,
-                                  SilcUInt32 src_len,
-                                  SilcBool compute_hash,
-                                  SilcHash hash,
-                                  SilcPKCSSignCb sign_cb,
-                                  void *context);
-SilcAsyncOperation silc_pkcs1_verify(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                    void *public_key,
-                                    unsigned char *signature,
-                                    SilcUInt32 signature_len,
-                                    unsigned char *data,
-                                    SilcUInt32 data_len,
-                                    SilcHash hash,
-                                    SilcPKCSVerifyCb verify_cb,
-                                    void *context);
-SilcAsyncOperation
-silc_pkcs1_sign_no_oid(const struct SilcPKCSAlgorithmStruct *pkcs,
-                      void *private_key,
-                      unsigned char *src,
-                      SilcUInt32 src_len,
-                      SilcBool compute_hash,
-                      SilcHash hash,
-                      SilcPKCSSignCb sign_cb,
-                      void *context);
-SilcAsyncOperation
-silc_pkcs1_verify_no_oid(const struct SilcPKCSAlgorithmStruct *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_ALG_GENERATE_KEY(silc_pkcs1_generate_key);
+SILC_PKCS_ALG_IMPORT_PUBLIC_KEY(silc_pkcs1_import_public_key);
+SILC_PKCS_ALG_EXPORT_PUBLIC_KEY(silc_pkcs1_export_public_key);
+SILC_PKCS_ALG_PUBLIC_KEY_BITLEN(silc_pkcs1_public_key_bitlen);
+SILC_PKCS_ALG_PUBLIC_KEY_COPY(silc_pkcs1_public_key_copy);
+SILC_PKCS_ALG_PUBLIC_KEY_COMPARE(silc_pkcs1_public_key_compare);
+SILC_PKCS_ALG_PUBLIC_KEY_FREE(silc_pkcs1_public_key_free);
+SILC_PKCS_ALG_IMPORT_PRIVATE_KEY(silc_pkcs1_import_private_key);
+SILC_PKCS_ALG_EXPORT_PRIVATE_KEY(silc_pkcs1_export_private_key);
+SILC_PKCS_ALG_PRIVATE_KEY_BITLEN(silc_pkcs1_private_key_bitlen);
+SILC_PKCS_ALG_PRIVATE_KEY_FREE(silc_pkcs1_private_key_free);
+SILC_PKCS_ALG_ENCRYPT(silc_pkcs1_encrypt);
+SILC_PKCS_ALG_DECRYPT(silc_pkcs1_decrypt);
+SILC_PKCS_ALG_SIGN(silc_pkcs1_sign);
+SILC_PKCS_ALG_VERIFY(silc_pkcs1_verify);
+SILC_PKCS_ALG_SIGN(silc_pkcs1_sign_no_oid);
+SILC_PKCS_ALG_VERIFY(silc_pkcs1_verify_no_oid);
 
 #endif /* SILCPKCS1_I_H */
index 7eb80ae4485e7fa67a89643596c198ab5d76b566..1321f0a3d31279d6250cd8912f83feaba2ac2d87 100644 (file)
 #error "Do not include this header directly"
 #endif
 
+/* Macros for defining the PKCS APIs.  Use these when you need to declare
+   PKCS API functions. */
+
+#define SILC_PKCS_ALG_GENERATE_KEY(name)                       \
+  SilcBool name(const struct SilcPKCSAlgorithmStruct *pkcs,    \
+               SilcUInt32 keylen, SilcRng rng,                 \
+               void **ret_public_key, void **ret_private_key)
+
+#define SILC_PKCS_ALG_IMPORT_PUBLIC_KEY(name)                          \
+  int name(const struct SilcPKCSAlgorithmStruct *pkcs,                 \
+          void *key, SilcUInt32 key_len,                               \
+          void **ret_public_key)
+
+#define SILC_PKCS_ALG_EXPORT_PUBLIC_KEY(name)                          \
+  unsigned char *name(const struct SilcPKCSAlgorithmStruct *pkcs,      \
+                     SilcStack stack,                                  \
+                     void *public_key,                                 \
+                     SilcUInt32 *ret_len)
+
+#define SILC_PKCS_ALG_PUBLIC_KEY_BITLEN(name)                          \
+  SilcUInt32 name(const struct SilcPKCSAlgorithmStruct *pkcs,          \
+                 void *public_key)
+
+#define SILC_PKCS_ALG_PUBLIC_KEY_COPY(name)                    \
+  void *name(const struct SilcPKCSAlgorithmStruct *pkcs,       \
+            void *public_key)
+
+#define SILC_PKCS_ALG_PUBLIC_KEY_COMPARE(name)                         \
+  SilcBool name(const struct SilcPKCSAlgorithmStruct *pkcs,            \
+               void *key1, void *key2)
+
+#define SILC_PKCS_ALG_PUBLIC_KEY_FREE(name)                            \
+  void name(const struct SilcPKCSAlgorithmStruct *pkcs, void *public_key)
+
+#define SILC_PKCS_ALG_IMPORT_PRIVATE_KEY(name)                         \
+  int name(const struct SilcPKCSAlgorithmStruct *pkcs,                 \
+          void *key, SilcUInt32 key_len, void **ret_private_key)
+
+#define SILC_PKCS_ALG_EXPORT_PRIVATE_KEY(name)                         \
+  unsigned char *name(const struct SilcPKCSAlgorithmStruct *pkcs,      \
+                     SilcStack stack, void *private_key,               \
+                     SilcUInt32 *ret_len)
+
+#define SILC_PKCS_ALG_PRIVATE_KEY_BITLEN(name)                 \
+  SilcUInt32 name(const struct SilcPKCSAlgorithmStruct *pkcs,  \
+                 void *private_key)
+
+#define SILC_PKCS_ALG_PRIVATE_KEY_FREE(name)           \
+  void name(const struct SilcPKCSAlgorithmStruct *pkcs,        \
+           void *private_key)
+
+#define SILC_PKCS_ALG_ENCRYPT(name)                                    \
+  SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs,  \
+                         void *public_key,                             \
+                         unsigned char *src,                           \
+                         SilcUInt32 src_len,                           \
+                         SilcRng rng,                                  \
+                         SilcPKCSEncryptCb encrypt_cb,                 \
+                         void *context)
+
+#define SILC_PKCS_ALG_DECRYPT(name)                                    \
+  SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs,  \
+                         void *private_key,                            \
+                         unsigned char *src,                           \
+                         SilcUInt32 src_len,                           \
+                         SilcPKCSDecryptCb decrypt_cb,                 \
+                         void *context)
+
+#define SILC_PKCS_ALG_SIGN(name)                                       \
+  SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs,  \
+                         void *private_key,                            \
+                         unsigned char *src,                           \
+                         SilcUInt32 src_len,                           \
+                         SilcBool compute_hash,                        \
+                         SilcHash hash,                                \
+                         SilcPKCSSignCb sign_cb,                       \
+                         void *context)
+
+#define SILC_PKCS_ALG_VERIFY(name)                                     \
+  SilcAsyncOperation name(const struct SilcPKCSAlgorithmStruct *pkcs,  \
+                         void *public_key,                             \
+                         unsigned char *signature,                     \
+                         SilcUInt32 signature_len,                     \
+                         unsigned char *data,                          \
+                         SilcUInt32 data_len,                          \
+                         SilcHash hash,                                \
+                         SilcPKCSVerifyCb verify_cb,                   \
+                         void *context)
+
 /* The PKCS Algorithm object to represent any PKCS algorithm.  This context
    implements the PKCS algorithm, such as RSA, DSA, etc. */
 struct SilcPKCSAlgorithmStruct {
@@ -36,106 +125,166 @@ struct SilcPKCSAlgorithmStruct {
 
   /* Generate new key pair. Returns PKCS algorithm specific public key
      and private key contexts. */
-  SilcBool (*generate_key)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                          SilcUInt32 keylen,
-                          SilcRng rng,
-                          void **ret_public_key,
-                          void **ret_private_key);
+  SILC_PKCS_ALG_GENERATE_KEY((*generate_key));
 
   /* Public key routines. */
 
   /* Import/create new public key.  Returns the length of the data that was
      imported from `key' or 0 on error.  Returns the PKCS algorithm specific
      public key to `ret_public_key'. */
-  int (*import_public_key)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                          void *key, SilcUInt32 key_len,
-                          void **ret_public_key);
+  SILC_PKCS_ALG_IMPORT_PUBLIC_KEY((*import_public_key));
 
   /* Export/encode public key.  Returns the encoded public key buffer that
      the caller must free. */
-  unsigned char *
-  (*export_public_key)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                      SilcStack stack,
-                      void *public_key,
-                      SilcUInt32 *ret_len);
+  SILC_PKCS_ALG_EXPORT_PUBLIC_KEY((*export_public_key));
 
   /* Returns the bit length of public key */
-  SilcUInt32 (*public_key_bitlen)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                 void *public_key);
+  SILC_PKCS_ALG_PUBLIC_KEY_BITLEN((*public_key_bitlen));
 
   /* Duplicated public key */
-  void *(*public_key_copy)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                          void *public_key);
+  SILC_PKCS_ALG_PUBLIC_KEY_COPY((*public_key_copy));
 
   /* Compares two public keys.  Returns TRUE if they are identical. */
-  SilcBool (*public_key_compare)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                void *key1, void *key2);
+  SILC_PKCS_ALG_PUBLIC_KEY_COMPARE((*public_key_compare));
 
   /* Free public key */
-  void (*public_key_free)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                         void *public_key);
+  SILC_PKCS_ALG_PUBLIC_KEY_FREE((*public_key_free));
 
   /* Private key routines. */
 
   /* Import/create new private key.  Returns the length of the data that was
      imported from `key' or 0 on error.  Returns the PKCS algorithm specific
      private key to `ret_private_key'. */
-  int (*import_private_key)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                           void *key,
-                           SilcUInt32 key_len,
-                           void **ret_private_key);
+  SILC_PKCS_ALG_IMPORT_PRIVATE_KEY((*import_private_key));
 
   /* Export/encode private key.  Returns the encoded private key buffer that
      the caller must free. */
-  unsigned char *
-  (*export_private_key)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                       SilcStack stack,
-                       void *private_key,
-                       SilcUInt32 *ret_len);
+  SILC_PKCS_ALG_EXPORT_PRIVATE_KEY((*export_private_key));
 
   /* Returns the bi length of private key */
-  SilcUInt32 (*private_key_bitlen)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                                  void *public_key);
+  SILC_PKCS_ALG_PRIVATE_KEY_BITLEN((*private_key_bitlen));
 
   /* Free private key */
-  void (*private_key_free)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                          void *private_key);
+  SILC_PKCS_ALG_PRIVATE_KEY_FREE((*private_key_free));
 
   /* Encrypt and decrypt operations */
-  SilcAsyncOperation (*encrypt)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                               void *public_key,
-                               unsigned char *src,
-                               SilcUInt32 src_len,
-                               SilcRng rng,
-                               SilcPKCSEncryptCb encrypt_cb,
-                               void *context);
-  SilcAsyncOperation (*decrypt)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                               void *private_key,
-                               unsigned char *src,
-                               SilcUInt32 src_len,
-                               SilcPKCSDecryptCb decrypt_cb,
-                               void *context);
+  SILC_PKCS_ALG_ENCRYPT((*encrypt));
+  SILC_PKCS_ALG_DECRYPT((*decrypt));
 
   /* Signature and verification operations */
-  SilcAsyncOperation (*sign)(const struct SilcPKCSAlgorithmStruct *pkcs,
-                            void *private_key,
-                            unsigned char *src,
-                            SilcUInt32 src_len,
-                            SilcBool compute_hash,
-                            SilcHash hash,
-                            SilcPKCSSignCb sign_cb,
-                            void *context);
-  SilcAsyncOperation (*verify)(const struct SilcPKCSAlgorithmStruct *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_ALG_SIGN((*sign));
+  SILC_PKCS_ALG_VERIFY((*verify));
 };
 
+/* Macros for defining the PKCS APIs.  Use these when you need to declare
+   PKCS API functions. */
+
+#define SILC_PKCS_GET_ALGORITHM(name)                                  \
+  const SilcPKCSAlgorithm *name(const struct SilcPKCSObjectStruct *pkcs, \
+                               void *public_key)
+
+#define SILC_PKCS_IMPORT_PUBLIC_KEY_FILE(name)                         \
+  SilcBool name(const struct SilcPKCSObjectStruct *pkcs,               \
+               unsigned char *filedata, SilcUInt32 filedata_len,       \
+               SilcPKCSFileEncoding encoding, void **ret_public_key,   \
+               const struct SilcPKCSAlgorithmStruct **ret_alg)
+
+#define SILC_PKCS_IMPORT_PUBLIC_KEY(name)                      \
+  int name(const struct SilcPKCSObjectStruct *pkcs, void *key, \
+          SilcUInt32 key_len, void **ret_public_key,           \
+          const struct SilcPKCSAlgorithmStruct **ret_alg)
+
+#define SILC_PKCS_EXPORT_PUBLIC_KEY_FILE(name)                 \
+  unsigned char *name(const struct SilcPKCSObjectStruct *pkcs, \
+                     SilcStack stack, void *public_key,        \
+                     SilcPKCSFileEncoding encoding,            \
+                     SilcUInt32 *ret_len)
+
+#define SILC_PKCS_EXPORT_PUBLIC_KEY(name)                              \
+  unsigned char *name(const struct SilcPKCSObjectStruct *pkcs,         \
+                     SilcStack stack, void *public_key, SilcUInt32 *ret_len)
+
+#define SILC_PKCS_PUBLIC_KEY_BITLEN(name)                      \
+  SilcUInt32 name(const struct SilcPKCSObjectStruct *pkcs,     \
+                 void *public_key)
+
+#define SILC_PKCS_PUBLIC_KEY_COPY(name)                                        \
+  void *name(const struct SilcPKCSObjectStruct *pkcs, void *public_key)
+
+#define SILC_PKCS_PUBLIC_KEY_COMPARE(name)                     \
+  SilcBool name(const struct SilcPKCSObjectStruct *pkcs,       \
+               void *key1, void *key2)
+
+#define SILC_PKCS_PUBLIC_KEY_FREE(name)                                        \
+  void name(const struct SilcPKCSObjectStruct *pkcs, void *public_key)
+
+#define SILC_PKCS_IMPORT_PRIVATE_KEY_FILE(name)                                \
+  SilcBool name(const struct SilcPKCSObjectStruct *pkcs,               \
+               unsigned char *filedata, SilcUInt32 filedata_len,       \
+               const char *passphrase, SilcUInt32 passphrase_len,      \
+               SilcPKCSFileEncoding encoding, void **ret_private_key,  \
+               const struct SilcPKCSAlgorithmStruct **ret_alg)
+
+#define SILC_PKCS_IMPORT_PRIVATE_KEY(name)                     \
+  int name(const struct SilcPKCSObjectStruct *pkcs, void *key, \
+          SilcUInt32 key_len, void **ret_private_key,          \
+          const struct SilcPKCSAlgorithmStruct **ret_alg)
+
+#define SILC_PKCS_EXPORT_PRIVATE_KEY_FILE(name)                                \
+  unsigned char *name(const struct SilcPKCSObjectStruct *pkcs,         \
+                     SilcStack stack, void *private_key,               \
+                     const char *passphrase, SilcUInt32 passphrase_len, \
+                     SilcPKCSFileEncoding encoding, SilcRng rng,       \
+                     SilcUInt32 *ret_len)
+
+#define SILC_PKCS_EXPORT_PRIVATE_KEY(name)                             \
+  unsigned char *name(const struct SilcPKCSObjectStruct *pkcs,         \
+                     SilcStack stack, void *private_key, SilcUInt32 *ret_len)
+
+#define SILC_PKCS_PRIVATE_KEY_BITLEN(name)                     \
+  SilcUInt32 name(const struct SilcPKCSObjectStruct *pkcs, void *private_key)
+
+#define SILC_PKCS_PRIVATE_KEY_FREE(name)                               \
+  void name(const struct SilcPKCSObjectStruct *pkcs, void *private_key)
+
+#define SILC_PKCS_ENCRYPT(name)                                                \
+  SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs,     \
+                         void *public_key,                             \
+                         unsigned char *src,                           \
+                         SilcUInt32 src_len,                           \
+                         SilcRng rng,                                  \
+                         SilcPKCSEncryptCb encrypt_cb,                 \
+                         void *context)
+
+#define SILC_PKCS_DECRYPT(name)                                                \
+  SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs,     \
+                         void *private_key,                            \
+                         unsigned char *src,                           \
+                         SilcUInt32 src_len,                           \
+                         SilcPKCSDecryptCb decrypt_cb,                 \
+                         void *context)
+
+#define SILC_PKCS_SIGN(name)                                           \
+  SilcAsyncOperation name(const struct SilcPKCSObjectStruct *pkcs,     \
+                         void *private_key,                            \
+                         unsigned char *src,                           \
+                         SilcUInt32 src_len,                           \
+                         SilcBool compute_hash,                        \
+                         SilcHash hash,                                \
+                         SilcPKCSSignCb sign_cb,                       \
+                         void *context)
+
+#define SILC_PKCS_VERIFY(name)                                         \
+  SilcAsyncOperation name(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)
+
 /* The PKCS (Public Key Cryptosystem) object to represent any PKCS.  This
    context implements the PKCS, such as SILC public keys, X.509 certificates,
    OpenPGP certificates, etc. under a common API. */
@@ -146,130 +295,61 @@ struct SilcPKCSObjectStruct {
   /* Public key routines */
 
   /* Returns PKCS algorithm context from public key */
-  const SilcPKCSAlgorithm *
-  (*get_algorithm)(const struct SilcPKCSObjectStruct *pkcs,
-                  void *public_key);
+  SILC_PKCS_GET_ALGORITHM((*get_algorithm));
 
   /* Imports from public key file */
-  SilcBool (*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((*import_public_key_file));
 
   /* Imports from public key binary data.  Returns the amount of bytes
      imported from `key' or 0 on error. */
-  int (*import_public_key)(const struct SilcPKCSObjectStruct *pkcs,
-                          void *key,
-                          SilcUInt32 key_len,
-                          void **ret_public_key);
+  SILC_PKCS_IMPORT_PUBLIC_KEY((*import_public_key));
 
   /* Exports public key to file */
-  unsigned char *
-  (*export_public_key_file)(const struct SilcPKCSObjectStruct *pkcs,
-                           SilcStack stack,
-                           void *public_key,
-                           SilcPKCSFileEncoding encoding,
-                           SilcUInt32 *ret_len);
+  SILC_PKCS_EXPORT_PUBLIC_KEY_FILE((*export_public_key_file));
 
   /* Export public key as binary data */
-  unsigned char *(*export_public_key)(const struct SilcPKCSObjectStruct *pkcs,
-                                     SilcStack stack,
-                                     void *public_key,
-                                     SilcUInt32 *ret_len);
+  SILC_PKCS_EXPORT_PUBLIC_KEY((*export_public_key));
 
   /* Returns key length in bits */
-  SilcUInt32 (*public_key_bitlen)(const struct SilcPKCSObjectStruct *pkcs,
-                                 void *public_key);
+  SILC_PKCS_PUBLIC_KEY_BITLEN((*public_key_bitlen));
 
   /* Copy public key */
-  void *(*public_key_copy)(const struct SilcPKCSObjectStruct *pkcs,
-                          void *public_key);
+  SILC_PKCS_PUBLIC_KEY_COPY((*public_key_copy));
 
   /* Compares public keys */
-  SilcBool (*public_key_compare)(const struct SilcPKCSObjectStruct *pkcs,
-                                void *key1, void *key2);
+  SILC_PKCS_PUBLIC_KEY_COMPARE((*public_key_compare));
 
   /* Free public key */
-  void (*public_key_free)(const struct SilcPKCSObjectStruct *pkcs,
-                         void *public_key);
+  SILC_PKCS_PUBLIC_KEY_FREE((*public_key_free));
 
   /* Private key routines */
 
   /* Imports from private key file */
-  SilcBool (*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((*import_private_key_file));
 
   /* Imports from private key binary data.  Returns the amount of bytes
      imported from `key' or 0 on error. */
-  int (*import_private_key)(const struct SilcPKCSObjectStruct *pkcs,
-                           void *key,
-                           SilcUInt32 key_len,
-                           void **ret_private_key);
+  SILC_PKCS_IMPORT_PRIVATE_KEY((*import_private_key));
 
   /* Exports private key to file */
-  unsigned char *
-  (*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((*export_private_key_file));
 
   /* Export private key as binary data */
-  unsigned char *(*export_private_key)(const struct SilcPKCSObjectStruct *pkcs,
-                                      SilcStack stack,
-                                      void *private_key,
-                                      SilcUInt32 *ret_len);
+  SILC_PKCS_EXPORT_PRIVATE_KEY((*export_private_key));
 
   /* Returns key length in bits */
-  SilcUInt32 (*private_key_bitlen)(const struct SilcPKCSObjectStruct *pkcs,
-                                  void *private_key);
+  SILC_PKCS_PRIVATE_KEY_BITLEN((*private_key_bitlen));
 
   /* Free private key */
-  void (*private_key_free)(const struct SilcPKCSObjectStruct *pkcs,
-                          void *private_key);
+  SILC_PKCS_PRIVATE_KEY_FREE((*private_key_free));
 
   /* Encrypt and decrypt operations */
-  SilcAsyncOperation (*encrypt)(const struct SilcPKCSObjectStruct *pkcs,
-                               void *public_key,
-                               unsigned char *src,
-                               SilcUInt32 src_len,
-                               SilcRng rng,
-                               SilcPKCSEncryptCb encrypt_cb,
-                               void *context);
-  SilcAsyncOperation (*decrypt)(const struct SilcPKCSObjectStruct *pkcs,
-                               void *private_key,
-                               unsigned char *src,
-                               SilcUInt32 src_len,
-                               SilcPKCSDecryptCb decrypt_cb,
-                               void *context);
+  SILC_PKCS_ENCRYPT((*encrypt));
+  SILC_PKCS_DECRYPT((*decrypt));
 
   /* Signature and verification operations */
-  SilcAsyncOperation (*sign)(const struct SilcPKCSObjectStruct *pkcs,
-                            void *private_key,
-                            unsigned char *src,
-                            SilcUInt32 src_len,
-                            SilcBool compute_hash,
-                            SilcHash hash,
-                            SilcPKCSSignCb sign_cb,
-                            void *context);
-  SilcAsyncOperation (*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_SIGN((*sign));
+  SILC_PKCS_VERIFY((*verify));
 };
 
 #endif /* SILCPKCS_I_H */