X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilccrypt%2Fsilcpkcs1.c;h=347addecbfd59d06647d2b1d67848f7591857a80;hb=bd548b5771a325d3dc051887d3fd0225550d4418;hp=5db3f82a72e2795f26ac133d6d25de6de8846c89;hpb=e0ab4ae1e6e96ab2bed087da2a19947d7a2cb22a;p=crypto.git diff --git a/lib/silccrypt/silcpkcs1.c b/lib/silccrypt/silcpkcs1.c index 5db3f82a..347addec 100644 --- a/lib/silccrypt/silcpkcs1.c +++ b/lib/silccrypt/silcpkcs1.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2003 - 2007 Pekka Riikonen + Copyright (C) 2003 - 2008 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,9 +16,8 @@ GNU General Public License for more details. */ -/* $Id$ */ -#include "silc.h" +#include "silccrypto.h" #include "rsa.h" #include "silcpkcs1_i.h" @@ -339,6 +338,7 @@ SILC_PKCS_ALG_PUBLIC_KEY_FREE(silc_pkcs1_public_key_free) silc_mp_uninit(&key->n); silc_mp_uninit(&key->e); + silc_hash_free(key->hash); silc_free(key); } @@ -458,6 +458,7 @@ SILC_PKCS_ALG_PRIVATE_KEY_FREE(silc_pkcs1_private_key_free) silc_mp_uninit(&key->qP); silc_mp_uninit(&key->p); silc_mp_uninit(&key->q); + silc_hash_free(key->hash); silc_free(key); } @@ -502,8 +503,8 @@ SILC_PKCS_ALG_ENCRYPT(silc_pkcs1_encrypt) encrypt_cb(TRUE, padded, len, context); memset(padded, 0, sizeof(padded)); - silc_mp_suninit(stack, &mp_tmp); - silc_mp_suninit(stack, &mp_dst); + silc_mp_uninit(&mp_tmp); + silc_mp_uninit(&mp_dst); silc_stack_free(stack); return NULL; @@ -542,8 +543,8 @@ SILC_PKCS_ALG_DECRYPT(silc_pkcs1_decrypt) unpadded, sizeof(unpadded), &dst_len)) { memset(padded, 0, padded_len); silc_free(padded); - silc_mp_suninit(stack, &mp_tmp); - silc_mp_suninit(stack, &mp_dst); + silc_mp_uninit(&mp_tmp); + silc_mp_uninit(&mp_dst); decrypt_cb(FALSE, NULL, 0, context); return NULL; } @@ -554,8 +555,8 @@ SILC_PKCS_ALG_DECRYPT(silc_pkcs1_decrypt) memset(padded, 0, padded_len); memset(unpadded, 0, sizeof(unpadded)); silc_free(padded); - silc_mp_suninit(stack, &mp_tmp); - silc_mp_suninit(stack, &mp_dst); + silc_mp_uninit(&mp_tmp); + silc_mp_uninit(&mp_dst); silc_stack_free(stack); return NULL; @@ -599,6 +600,8 @@ SILC_PKCS_ALG_SIGN(silc_pkcs1_sign) /* Compute hash */ if (compute_hash) { + if (!hash) + hash = key->hash; silc_hash_make(hash, src, src_len, hashr); src = hashr; src_len = silc_hash_len(hash); @@ -649,8 +652,8 @@ SILC_PKCS_ALG_SIGN(silc_pkcs1_sign) memset(padded, 0, sizeof(padded)); if (compute_hash) memset(hashr, 0, sizeof(hashr)); - silc_mp_suninit(stack, &mp_tmp); - silc_mp_suninit(stack, &mp_dst); + silc_mp_uninit(&mp_tmp); + silc_mp_uninit(&mp_dst); silc_asn1_free(asn1); silc_stack_free(stack); @@ -703,33 +706,35 @@ SILC_PKCS_ALG_VERIFY(silc_pkcs1_verify) silc_buffer_set(&di, unpadded, len); /* If hash isn't given, allocate the one given in digest info */ - if (!hash) { - has_null = FALSE; + if (compute_hash) { + if (!hash) { + has_null = FALSE; - /* Decode digest info */ - if (!silc_asn1_decode(asn1, &di, - SILC_ASN1_OPTS(SILC_ASN1_ACCUMUL), - SILC_ASN1_SEQUENCE, + /* Decode digest info */ + if (!silc_asn1_decode(asn1, &di, + SILC_ASN1_OPTS(SILC_ASN1_ACCUMUL), SILC_ASN1_SEQUENCE, - SILC_ASN1_OID(&oid), - SILC_ASN1_NULL_T(SILC_ASN1_OPTIONAL, - SILC_ASN1_TAG_NULL, &has_null), - SILC_ASN1_END, - SILC_ASN1_END, SILC_ASN1_END)) - goto err; - - if (!silc_hash_alloc_by_oid(oid, &ihash)) { - SILC_LOG_DEBUG(("Unknown OID %s", oid)); - goto err; + SILC_ASN1_SEQUENCE, + SILC_ASN1_OID(&oid), + SILC_ASN1_NULL_T(SILC_ASN1_OPTIONAL, + SILC_ASN1_TAG_NULL, &has_null), + SILC_ASN1_END, + SILC_ASN1_END, SILC_ASN1_END)) + goto err; + + if (!silc_hash_alloc_by_oid(oid, &ihash)) { + SILC_LOG_DEBUG(("Unknown OID %s", oid)); + goto err; + } + hash = ihash; } - hash = ihash; - } - /* Hash the data */ - silc_hash_make(hash, data, data_len, hashr); - data = hashr; - data_len = silc_hash_len(hash); - oid = (char *)silc_hash_get_oid(hash); + /* Hash the data */ + silc_hash_make(hash, data, data_len, hashr); + data = hashr; + data_len = silc_hash_len(hash); + oid = (char *)silc_hash_get_oid(hash); + } /* Encode digest info for comparison */ memset(&ldi, 0, sizeof(ldi)); @@ -761,9 +766,9 @@ SILC_PKCS_ALG_VERIFY(silc_pkcs1_verify) memset(verify, 0, verify_len); memset(unpadded, 0, sizeof(unpadded)); silc_free(verify); - silc_mp_suninit(stack, &mp_tmp2); - silc_mp_suninit(stack, &mp_dst); - if (hash) + silc_mp_uninit(&mp_tmp2); + silc_mp_uninit(&mp_dst); + if (compute_hash) memset(hashr, 0, sizeof(hashr)); if (ihash) silc_hash_free(ihash); @@ -775,8 +780,8 @@ SILC_PKCS_ALG_VERIFY(silc_pkcs1_verify) err: memset(verify, 0, verify_len); silc_free(verify); - silc_mp_suninit(stack, &mp_tmp2); - silc_mp_suninit(stack, &mp_dst); + silc_mp_uninit(&mp_tmp2); + silc_mp_uninit(&mp_dst); if (ihash) silc_hash_free(ihash); silc_asn1_free(asn1); @@ -806,6 +811,8 @@ SILC_PKCS_ALG_SIGN(silc_pkcs1_sign_no_oid) /* Compute hash if requested */ if (compute_hash) { + if (!hash) + hash = key->hash; silc_hash_make(hash, src, src_len, hashr); src = hashr; src_len = silc_hash_len(hash); @@ -838,8 +845,8 @@ SILC_PKCS_ALG_SIGN(silc_pkcs1_sign_no_oid) memset(padded, 0, sizeof(padded)); if (compute_hash) memset(hashr, 0, sizeof(hashr)); - silc_mp_suninit(stack, &mp_tmp); - silc_mp_suninit(stack, &mp_dst); + silc_mp_uninit(&mp_tmp); + silc_mp_uninit(&mp_dst); silc_stack_free(stack); return NULL; @@ -878,15 +885,17 @@ SILC_PKCS_ALG_VERIFY(silc_pkcs1_verify_no_oid) unpadded, sizeof(unpadded), &len)) { memset(verify, 0, verify_len); silc_free(verify); - silc_mp_suninit(stack, &mp_tmp2); - silc_mp_suninit(stack, &mp_dst); + silc_mp_uninit(&mp_tmp2); + silc_mp_uninit(&mp_dst); silc_stack_free(stack); verify_cb(FALSE, context); return NULL; } /* Hash data if requested */ - if (hash) { + if (compute_hash) { + if (!hash) + hash = key->hash; silc_hash_make(hash, data, data_len, hashr); data = hashr; data_len = silc_hash_len(hash); @@ -901,11 +910,11 @@ SILC_PKCS_ALG_VERIFY(silc_pkcs1_verify_no_oid) memset(verify, 0, verify_len); memset(unpadded, 0, sizeof(unpadded)); - if (hash) + if (compute_hash) memset(hashr, 0, sizeof(hashr)); silc_free(verify); - silc_mp_suninit(stack, &mp_tmp2); - silc_mp_suninit(stack, &mp_dst); + silc_mp_uninit(&mp_tmp2); + silc_mp_uninit(&mp_dst); silc_stack_free(stack); return NULL;