diff options
Diffstat (limited to 'g10')
-rw-r--r-- | g10/ChangeLog | 7 | ||||
-rw-r--r-- | g10/keyedit.c | 2 | ||||
-rw-r--r-- | g10/ringedit.c | 8 | ||||
-rw-r--r-- | g10/seckey-cert.c | 15 |
4 files changed, 26 insertions, 6 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog index 5acfd4f0f..4dd7ad675 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,10 @@ +Wed Sep 13 18:12:34 CEST 2000 Werner Koch <[email protected]> + + * keyedit.c (keyedit_menu): Allow to use "debug" on the secret key. + + * ringedit.c (cmp_seckey): Fix for v4 RSA keys. + * seckey-cert.c (do_check): Workaround for PGP 7 bug. + Wed Sep 6 17:55:47 CEST 2000 Werner Koch <[email protected]> * misc.c (print_pubkey_algo_note): Do not print the RSA notice. diff --git a/g10/keyedit.c b/g10/keyedit.c index 84e8cd194..79f7c6350 100644 --- a/g10/keyedit.c +++ b/g10/keyedit.c @@ -592,7 +592,7 @@ keyedit_menu( const char *username, STRLIST locusr, STRLIST commands, { N_("sign") , cmdSIGN , 0,1,1, N_("sign the key") }, { N_("s") , cmdSIGN , 0,1,1, NULL }, { N_("lsign") , cmdLSIGN , 0,1,1, N_("sign the key locally") }, - { N_("debug") , cmdDEBUG , 0,1,0, NULL }, + { N_("debug") , cmdDEBUG , 0,0,0, NULL }, { N_("adduid") , cmdADDUID , 1,1,0, N_("add a user ID") }, { N_("deluid") , cmdDELUID , 0,1,0, N_("delete user ID") }, { N_("addkey") , cmdADDKEY , 1,1,0, N_("add a secondary key") }, diff --git a/g10/ringedit.c b/g10/ringedit.c index 5fcd458b0..382d7281f 100644 --- a/g10/ringedit.c +++ b/g10/ringedit.c @@ -1070,7 +1070,13 @@ cmp_seckey( PKT_secret_key *req_sk, PKT_secret_key *sk ) n = pubkey_get_nskey( req_sk->pubkey_algo ); for(i=0; i < n; i++ ) { - if( mpi_cmp( req_sk->skey[i], sk->skey[i] ) ) + /* Note: becuase v4 protected keys have nothing in the + * mpis except for the first one, we skip all NULL MPIs. + * This might not be always correct in cases where the both + * keys do not match in their secret parts but we can ignore that + * because the need for this function is quite ugly. */ + if( req_sk->skey[1] && sk->skey[i] + && mpi_cmp( req_sk->skey[i], sk->skey[i] ) ) return -1; } return 0; diff --git a/g10/seckey-cert.c b/g10/seckey-cert.c index 5cb10ee13..55a11939f 100644 --- a/g10/seckey-cert.c +++ b/g10/seckey-cert.c @@ -80,10 +80,13 @@ do_check( PKT_secret_key *sk ) if( sk->version >= 4 ) { int ndata; byte *p, *data; + u16 csumc = 0; i = pubkey_get_npkey(sk->pubkey_algo); assert( mpi_is_opaque( sk->skey[i] ) ); p = mpi_get_opaque( sk->skey[i], &ndata ); + if ( ndata > 1 ) + csumc = p[ndata-2] << 8 | p[ndata-1]; data = m_alloc_secure( ndata ); cipher_decrypt( cipher_hd, data, p, ndata ); mpi_free( sk->skey[i] ); sk->skey[i] = NULL ; @@ -96,9 +99,14 @@ do_check( PKT_secret_key *sk ) else { csum = checksum( data, ndata-2); sk->csum = data[ndata-2] << 8 | data[ndata-1]; + if ( sk->csum != csum ) { + /* This is a PGP 7.0.0 workaround */ + sk->csum = csumc; /* take the encrypted one */ + } } + /* must check it here otherwise the mpi_read_xx would fail - * because the length das an abritary value */ + * because the length may have an arbitrary value */ if( sk->csum == csum ) { for( ; i < pubkey_get_nskey(sk->pubkey_algo); i++ ) { nbytes = ndata; @@ -106,6 +114,7 @@ do_check( PKT_secret_key *sk ) ndata -= nbytes; p += nbytes; } + /* at this point ndata should be equal to 2 (the checksum) */ } m_free(data); } @@ -237,9 +246,7 @@ protect_secret_key( PKT_secret_key *sk, DEK *dek ) randomize_buffer(sk->protect.iv, sk->protect.ivlen, 1); cipher_setiv( cipher_hd, sk->protect.iv, sk->protect.ivlen ); if( sk->version >= 4 ) { - /* FIXME: There is a bug in this function for all algorithms - * where the secret MPIs are more than 1 */ - byte *bufarr[PUBKEY_MAX_NSKEY]; + byte *bufarr[PUBKEY_MAX_NSKEY]; unsigned narr[PUBKEY_MAX_NSKEY]; unsigned nbits[PUBKEY_MAX_NSKEY]; int ndata=0; |