diff options
-rw-r--r-- | cipher/ChangeLog | 10 | ||||
-rw-r--r-- | cipher/pubkey.c | 40 |
2 files changed, 46 insertions, 4 deletions
diff --git a/cipher/ChangeLog b/cipher/ChangeLog index ef5e1e3d..94ea75a3 100644 --- a/cipher/ChangeLog +++ b/cipher/ChangeLog @@ -1,3 +1,13 @@ +2001-12-10 Werner Koch <wk@gnupg.org> + + * pubkey.c (gcry_pk_encrypt): Find the signature algorithm by name + and not by number. + + * pubkey.c (gcry_pk_encrypt,gcry_pk_decrypt,gcry_pk_sign) + (gcry_pk_verify,gcry_pk_testkey, gcry_pk_genkey) + (gcry_pk_get_nbits): Release the arrays. Noted by Nikos + Mavroyanopoulos. + 2001-12-06 Werner Koch <wk@gnupg.org> * cipher.c (gcry_cipher_map_name): Look also for OIDs prefixed diff --git a/cipher/pubkey.c b/cipher/pubkey.c index 0e8f2ecd..33ebfd43 100644 --- a/cipher/pubkey.c +++ b/cipher/pubkey.c @@ -937,22 +937,31 @@ int gcry_pk_encrypt( GCRY_SEXP *r_ciph, GCRY_SEXP s_data, GCRY_SEXP s_pkey ) { MPI *pkey, data, *ciph; - const char *algo_name, *algo_elems; + const char *key_algo_name, *algo_name, *algo_elems; int i, rc, algo; /* get the key */ - rc = sexp_to_key( s_pkey, 0, &pkey, &algo, NULL ); - if( rc ) { + rc = sexp_to_key( s_pkey, 0, &pkey, &algo, &i); + if( rc ) return rc; - } + key_algo_name = algo_info_table[i].name; + assert (key_algo_name); /* get the name and the required size of the return value */ for(i=0; (algo_name = enc_info_table[i].name); i++ ) { if( enc_info_table[i].algo == algo ) break; } + /* get the name and the required size of the result array. We + compare using the algorithm name and not the algo number - this way + we get the correct name for the return value */ + for(i=0; (algo_name = enc_info_table[i].name); i++ ) { + if( !strcmp (algo_name, key_algo_name) ) + break; + } if( !algo_name ) { release_mpi_array( pkey ); + gcry_free (pkey); return GCRYERR_INV_PK_ALGO; } algo_elems = enc_info_table[i].elements; @@ -961,6 +970,7 @@ gcry_pk_encrypt( GCRY_SEXP *r_ciph, GCRY_SEXP s_data, GCRY_SEXP s_pkey ) data = gcry_sexp_nth_mpi( s_data, 0, 0 ); if( !data ) { release_mpi_array( pkey ); + gcry_free (pkey); return GCRYERR_INV_OBJ; } @@ -968,6 +978,7 @@ gcry_pk_encrypt( GCRY_SEXP *r_ciph, GCRY_SEXP s_data, GCRY_SEXP s_pkey ) ciph = gcry_xcalloc( (strlen(algo_elems)+1) , sizeof *ciph ); rc = pubkey_encrypt( algo, ciph, data, pkey ); release_mpi_array( pkey ); + gcry_free (pkey); pkey = NULL; mpi_free( data ); if( rc ) { release_mpi_array( ciph ); @@ -1060,18 +1071,23 @@ gcry_pk_decrypt( GCRY_SEXP *r_plain, GCRY_SEXP s_data, GCRY_SEXP s_skey ) rc = sexp_to_enc( s_data, &data, &dataalgo ); if( rc ) { release_mpi_array( skey ); + gcry_free (skey); return rc; } if( algo != dataalgo ) { release_mpi_array( skey ); + gcry_free (skey); release_mpi_array( data ); + gcry_free (data); return -1; /* fixme: add real errornumber - algo does not match */ } rc = pubkey_decrypt( algo, &plain, data, skey ); if( rc ) { release_mpi_array( skey ); + gcry_free (skey); release_mpi_array( data ); + gcry_free (data); return -1; /* fixme: add real errornumber - decryption failed */ } @@ -1080,7 +1096,9 @@ gcry_pk_decrypt( GCRY_SEXP *r_plain, GCRY_SEXP s_data, GCRY_SEXP s_skey ) mpi_free( plain ); release_mpi_array( data ); + gcry_free (data); release_mpi_array( skey ); + gcry_free (skey); return 0; } @@ -1132,6 +1150,7 @@ gcry_pk_sign( GCRY_SEXP *r_sig, GCRY_SEXP s_hash, GCRY_SEXP s_skey ) } if( !algo_name ) { release_mpi_array( skey ); + gcry_free (skey); return -4; /* oops: unknown algorithm */ } assert (sig_info_table[i].algo == algo); @@ -1141,11 +1160,13 @@ gcry_pk_sign( GCRY_SEXP *r_sig, GCRY_SEXP s_hash, GCRY_SEXP s_skey ) hash = gcry_sexp_nth_mpi( s_hash, 0, 0 ); if( !hash ) { release_mpi_array( skey ); + gcry_free (skey); return -1; /* fixme: get a real errorcode for this */ } result = gcry_xcalloc( (strlen(algo_elems)+1) , sizeof *result ); rc = pubkey_sign( algo, result, hash, skey ); release_mpi_array( skey ); + gcry_free (skey); skey = NULL; mpi_free( hash ); if( rc ) { gcry_free( result ); @@ -1223,24 +1244,31 @@ gcry_pk_verify( GCRY_SEXP s_sig, GCRY_SEXP s_hash, GCRY_SEXP s_pkey ) rc = sexp_to_sig( s_sig, &sig, &sigalgo ); if( rc ) { release_mpi_array( pkey ); + gcry_free (pkey); return rc; } if( algo != sigalgo ) { release_mpi_array( pkey ); + gcry_free (pkey); release_mpi_array( sig ); + gcry_free (sig); return -1; /* fixme: add real errornumber - algo does not match */ } hash = gcry_sexp_nth_mpi( s_hash, 0, 0 ); if( !hash ) { release_mpi_array( pkey ); + gcry_free (pkey); release_mpi_array( sig ); + gcry_free (sig); return -1; /* fixme: get a real errorcode for this */ } rc = pubkey_verify( algo, hash, sig, pkey, NULL, NULL ); release_mpi_array( pkey ); + gcry_free (pkey); release_mpi_array( sig ); + gcry_free (sig); mpi_free(hash); return rc; @@ -1269,6 +1297,7 @@ gcry_pk_testkey( GCRY_SEXP s_key ) rc = pubkey_check_secret_key( algo, key ); release_mpi_array( key ); + gcry_free (key); return rc; } @@ -1445,7 +1474,9 @@ gcry_pk_genkey( GCRY_SEXP *r_key, GCRY_SEXP s_parms ) gcry_free ( string ); } release_mpi_array ( skey ); + gcry_free (skey); release_mpi_array ( factors ); + gcry_free (factors); return 0; } @@ -1480,6 +1511,7 @@ gcry_pk_get_nbits( GCRY_SEXP key ) nbits = mpi_get_nbits( keyarr[0] ); leave: release_mpi_array( keyarr ); + gcry_free (keyarr); return nbits; } |