aboutsummaryrefslogtreecommitdiffstats
path: root/agent
diff options
context:
space:
mode:
Diffstat (limited to 'agent')
-rw-r--r--agent/pksign.c15
-rw-r--r--agent/sexp-secret.c1
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;