diff options
Diffstat (limited to 'agent')
-rw-r--r-- | agent/pksign.c | 15 | ||||
-rw-r--r-- | agent/sexp-secret.c | 1 |
2 files changed, 11 insertions, 5 deletions
diff --git a/agent/pksign.c b/agent/pksign.c index a2d5362be..0640b04ef 100644 --- a/agent/pksign.c +++ b/agent/pksign.c @@ -129,15 +129,20 @@ rfc6979_hash_algo_string (size_t mdlen) /* Encode a message digest for use with the EdDSA algorithm (i.e. curve Ed25519). */ static gpg_error_t -do_encode_eddsa (const byte *md, size_t mdlen, gcry_sexp_t *r_hash) +do_encode_eddsa (size_t nbits, const byte *md, size_t mdlen, + gcry_sexp_t *r_hash) { gpg_error_t err; gcry_sexp_t hash; + const char *fmt; + + if (nbits == 448) + fmt = "(data(value %b))"; + else + fmt = "(data(flags eddsa)(hash-algo sha512)(value %b))"; *r_hash = NULL; - err = gcry_sexp_build (&hash, NULL, - "(data(flags eddsa)(hash-algo sha512)(value %b))", - (int)mdlen, md); + err = gcry_sexp_build (&hash, NULL, fmt, (int)mdlen, md); if (!err) *r_hash = hash; return err; @@ -482,7 +487,7 @@ agent_pksign_do (ctrl_t ctrl, const char *cache_nonce, /* Put the hash into a sexp */ if (algo == GCRY_PK_EDDSA) - err = do_encode_eddsa (data, datalen, + err = do_encode_eddsa (gcry_pk_get_nbits (s_skey), data, datalen, &s_hash); else if (ctrl->digest.algo == MD_USER_TLS_MD5SHA1) err = do_encode_raw_pkcs1 (data, datalen, diff --git a/agent/sexp-secret.c b/agent/sexp-secret.c index d67836769..b539659e2 100644 --- a/agent/sexp-secret.c +++ b/agent/sexp-secret.c @@ -83,6 +83,7 @@ fixup_when_ecc_private_key (unsigned char *buf, size_t *buflen_p) return gpg_error (GPG_ERR_INV_SEXP); else if (!*s /* Leading 0x00 added at the front for classic curve */ && strcmp (curve_name, "Ed25519") + && strcmp (curve_name, "Ed448") && strcmp (curve_name, "X448")) { size_t numsize; |