From: Pekka Riikonen Date: Mon, 9 Jul 2007 17:32:04 +0000 (+0000) Subject: Added macros helping defining PKCS APIs. X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=e0ab4ae1e6e96ab2bed087da2a19947d7a2cb22a Added macros helping defining PKCS APIs. Added SilcPKCSAlgorithm context to SilcPublicKey and SilcPrivateKey contexts. --- diff --git a/lib/silccrypt/silcpk.c b/lib/silccrypt/silcpk.c index b383db8c..ad03a023 100644 --- a/lib/silccrypt/silcpk.c +++ b/lib/silccrypt/silcpk.c @@ -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; diff --git a/lib/silccrypt/silcpk_i.h b/lib/silccrypt/silcpk_i.h index 48bfb465..e8d4e9eb 100644 --- a/lib/silccrypt/silcpk_i.h +++ b/lib/silccrypt/silcpk_i.h @@ -26,104 +26,24 @@ #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 */ diff --git a/lib/silccrypt/silcpkcs.c b/lib/silccrypt/silcpkcs.c index f537b880..ebd6f16a 100644 --- a/lib/silccrypt/silcpkcs.c +++ b/lib/silccrypt/silcpkcs.c @@ -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; } diff --git a/lib/silccrypt/silcpkcs.h b/lib/silccrypt/silcpkcs.h index 13488c72..47a898b9 100644 --- a/lib/silccrypt/silcpkcs.h +++ b/lib/silccrypt/silcpkcs.h @@ -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; /***/ diff --git a/lib/silccrypt/silcpkcs1.c b/lib/silccrypt/silcpkcs1.c index b4ea51ca..5db3f82a 100644 --- a/lib/silccrypt/silcpkcs1.c +++ b/lib/silccrypt/silcpkcs1.c @@ -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; diff --git a/lib/silccrypt/silcpkcs1_i.h b/lib/silccrypt/silcpkcs1_i.h index ac74848f..8f3cfe01 100644 --- a/lib/silccrypt/silcpkcs1_i.h +++ b/lib/silccrypt/silcpkcs1_i.h @@ -20,94 +20,22 @@ #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 */ diff --git a/lib/silccrypt/silcpkcs_i.h b/lib/silccrypt/silcpkcs_i.h index 7eb80ae4..1321f0a3 100644 --- a/lib/silccrypt/silcpkcs_i.h +++ b/lib/silccrypt/silcpkcs_i.h @@ -24,6 +24,95 @@ #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 */