aboutsummaryrefslogtreecommitdiffstats
path: root/agent/pksign.c
diff options
context:
space:
mode:
authorAndrey Jivsov <[email protected]>2011-01-13 05:14:45 +0000
committerAndrey Jivsov <[email protected]>2011-01-13 05:14:45 +0000
commitb73d8ed06ffef8d2fd70ab2e48da9ef515472fe9 (patch)
tree1f9b06bf3bbf7647235f6080dca2abcb013f35b5 /agent/pksign.c
parent'g10/gpg2 --encrypt --debug 15 -r ecdsa -a -o _e.asc _' and 'g10/gpg2 --deb... (diff)
downloadgnupg-b73d8ed06ffef8d2fd70ab2e48da9ef515472fe9.tar.gz
gnupg-b73d8ed06ffef8d2fd70ab2e48da9ef515472fe9.zip
Fixed key generation with P-521. Confirmed that signature generation and verification work.
Diffstat (limited to 'agent/pksign.c')
-rw-r--r--agent/pksign.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/agent/pksign.c b/agent/pksign.c
index ac5f4e1a0..a6dbf2509 100644
--- a/agent/pksign.c
+++ b/agent/pksign.c
@@ -119,12 +119,15 @@ do_encode_dsa (const byte * md, size_t mdlen, int dsaalgo, gcry_sexp_t pkey,
gpg_error_t err;
gcry_sexp_t hash;
unsigned int qbits;
+ int gcry_pkalgo;
*r_hash = NULL;
- if (dsaalgo == GCRY_PK_ECDSA)
+ gcry_pkalgo = map_pk_openpgp_to_gcry( dsaalgo );
+
+ if (gcry_pkalgo == GCRY_PK_ECDSA)
qbits = gcry_pk_get_nbits (pkey);
- else if (dsaalgo == GCRY_PK_DSA)
+ else if (gcry_pkalgo == GCRY_PK_DSA)
qbits = get_dsa_qbits (pkey);
else
return gpg_error (GPG_ERR_WRONG_PUBKEY_ALGO);
@@ -143,20 +146,25 @@ do_encode_dsa (const byte * md, size_t mdlen, int dsaalgo, gcry_sexp_t pkey,
if (qbits < 160)
{
log_error (_("%s key uses an unsafe (%u bit) hash\n"),
- gcry_pk_algo_name (dsaalgo), qbits);
+ gcry_pk_algo_name (gcry_pkalgo), qbits);
return gpg_error (GPG_ERR_INV_LENGTH);
}
/* Check if we're too short. Too long is safe as we'll
automatically left-truncate. */
- if (mdlen < qbits/8)
+
+ /* This check would require the use of SHA512 with ECDSA 512. I think this is overkill to fail in this case.
+ * Therefore, relax the check, but only for ECDSA keys. We may need to adjust it later for general case.
+ * ( Note that the check is really a bug for ECDSA 521 as the only hash that matches it is SHA 512, but 512 < 521 ).
+ */
+ if( mdlen < ((gcry_pkalgo==GCRY_PK_ECDSA && qbits>521) ? 512 : qbits) )
{
log_error (_("a %zu bit hash is not valid for a %u bit %s key\n"),
- mdlen*8,
+ mdlen,
gcry_pk_get_nbits (pkey),
- gcry_pk_algo_name (dsaalgo));
+ gcry_pk_algo_name (gcry_pkalgo));
/* FIXME: we need to check the requirements for ECDSA. */
- if (mdlen < 20 || dsaalgo == GCRY_PK_DSA)
+ if (mdlen < 20 || gcry_pkalgo == GCRY_PK_DSA)
return gpg_error (GPG_ERR_INV_LENGTH);
}