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