X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilccrypt%2Fsilcpkcs.c;h=6ce2f9fa389670e4c9991ee72267c4f418e8749a;hp=11dda7c95ad2e1d8c3f22d0101613f72b967dae4;hb=c257b555225193e54d85daf541d29578b3c93882;hpb=f658940d02cf2fd893296b6a7825b42502573668 diff --git a/lib/silccrypt/silcpkcs.c b/lib/silccrypt/silcpkcs.c index 11dda7c9..6ce2f9fa 100644 --- a/lib/silccrypt/silcpkcs.c +++ b/lib/silccrypt/silcpkcs.c @@ -21,7 +21,6 @@ #include "silcincludes.h" #include "rsa.h" -#include "pkcs1.h" /* The main SILC PKCS structure. */ struct SilcPKCSStruct { @@ -293,7 +292,10 @@ char *silc_pkcs_get_supported(void) bool silc_pkcs_generate_key(SilcPKCS pkcs, SilcUInt32 bits_key_len, SilcRng rng) { - return pkcs->pkcs->init(pkcs->context, bits_key_len, rng); + bool ret = pkcs->pkcs->init(pkcs->context, bits_key_len, rng); + if (ret) + pkcs->key_len = bits_key_len; + return ret; } /* Returns the length of the key */ @@ -636,9 +638,8 @@ SilcPublicKey silc_pkcs_public_key_alloc(const char *name, public_key = silc_calloc(1, sizeof(*public_key)); public_key->name = strdup(name); public_key->pk_len = pk_len; - public_key->pk = silc_calloc(pk_len, sizeof(*public_key->pk)); + public_key->pk = silc_memdup(pk, pk_len); public_key->pk_type = SILC_SKE_PK_TYPE_SILC; - memcpy(public_key->pk, pk, pk_len); if (!silc_utf8_valid(identifier, strlen(identifier))) { int len = silc_utf8_encoded_len(identifier, strlen(identifier), 0); @@ -678,8 +679,7 @@ SilcPrivateKey silc_pkcs_private_key_alloc(const char *name, private_key = silc_calloc(1, sizeof(*private_key)); private_key->name = strdup(name); private_key->prv_len = prv_len; - private_key->prv = silc_calloc(prv_len, sizeof(*private_key->prv)); - memcpy(private_key->prv, prv, prv_len); + private_key->prv = silc_memdup(prv, prv_len); return private_key; } @@ -690,7 +690,10 @@ void silc_pkcs_private_key_free(SilcPrivateKey private_key) { if (private_key) { silc_free(private_key->name); - silc_free(private_key->prv); + if (private_key->prv) { + memset(private_key->prv, 0, private_key->prv_len); + silc_free(private_key->prv); + } silc_free(private_key); } } @@ -701,26 +704,10 @@ void silc_pkcs_private_key_free(SilcPrivateKey private_key) unsigned char * silc_pkcs_public_key_encode(SilcPublicKey public_key, SilcUInt32 *len) { - SilcBuffer buf; - unsigned char *ret; - - buf = silc_buffer_alloc_size(public_key->len + 4); - if (!buf) - return NULL; - - silc_buffer_format(buf, - SILC_STR_UI_INT(public_key->len), - SILC_STR_UI_SHORT(strlen(public_key->name)), - SILC_STR_UI32_STRING(public_key->name), - SILC_STR_UI_SHORT(strlen(public_key->identifier)), - SILC_STR_UI32_STRING(public_key->identifier), - SILC_STR_UI_XNSTRING(public_key->pk, - public_key->pk_len), - SILC_STR_END); - - ret = silc_buffer_steal(buf, len); - silc_buffer_free(buf); - return ret; + return silc_pkcs_public_key_data_encode(public_key->pk, + public_key->pk_len, + public_key->name, + public_key->identifier, len); } /* Encodes SILC style public key. Returns the encoded data. */ @@ -966,25 +953,9 @@ SilcPublicKey silc_pkcs_public_key_copy(SilcPublicKey public_key) unsigned char * silc_pkcs_private_key_encode(SilcPrivateKey private_key, SilcUInt32 *len) { - SilcBuffer buf; - unsigned char *ret; - SilcUInt32 totlen; - - totlen = 2 + strlen(private_key->name) + private_key->prv_len; - buf = silc_buffer_alloc_size(totlen); - if (!buf) - return NULL; - - silc_buffer_format(buf, - SILC_STR_UI_SHORT(strlen(private_key->name)), - SILC_STR_UI32_STRING(private_key->name), - SILC_STR_UI_XNSTRING(private_key->prv, - private_key->prv_len), - SILC_STR_END); - - ret = silc_buffer_steal(buf, len); - silc_buffer_free(buf); - return ret; + return silc_pkcs_private_key_data_encode(private_key->prv, + private_key->prv_len, + private_key->name, len); } /* Encodes SILC private key. Returns the encoded data. */