diff options
author | NIIBE Yutaka <[email protected]> | 2020-06-08 01:55:16 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2020-06-08 01:55:16 +0000 |
commit | e2e5736842299ebfb8263b674d5cbfb9b784d70f (patch) | |
tree | 3b398d876466c1f285b1a2130be4b4f80f232afe | |
parent | agent,ecc: Use of opaque MPI for ECC, fixup 'd'. (diff) | |
download | gnupg-e2e5736842299ebfb8263b674d5cbfb9b784d70f.tar.gz gnupg-e2e5736842299ebfb8263b674d5cbfb9b784d70f.zip |
agent: Fix the condition to detect leading 0x00 problem.
* agent/sexp-secret.c (fixup_when_ecc_private_key): Use curve name
to identify the issue.
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r-- | agent/sexp-secret.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/agent/sexp-secret.c b/agent/sexp-secret.c index 5f0bdfa2e..7e3de8e5d 100644 --- a/agent/sexp-secret.c +++ b/agent/sexp-secret.c @@ -29,6 +29,7 @@ gpg_error_t fixup_when_ecc_private_key (unsigned char *buf, size_t *buflen_p) { const unsigned char *s; + char curve_name[256]; size_t n; size_t buflen = *buflen_p; @@ -55,7 +56,18 @@ fixup_when_ecc_private_key (unsigned char *buf, size_t *buflen_p) n = snext (&s); if (!n) return gpg_error (GPG_ERR_INV_SEXP); - if (n == 1 && *s == 'd') + if (n == 5 && !memcmp (s, "curve", 5)) + { + s += n; + n = snext (&s); + if (!n || n >= sizeof curve_name) + return gpg_error (GPG_ERR_INV_SEXP); + + memcpy (curve_name, s, n); + curve_name[n] = 0; + s += n; + } + else if (n == 1 && *s == 'd') { unsigned char *s0; size_t n0; @@ -67,10 +79,9 @@ fixup_when_ecc_private_key (unsigned char *buf, size_t *buflen_p) if (!n) return gpg_error (GPG_ERR_INV_SEXP); - else if ((n & 1) && !*s) - /* Detect wrongly added 0x00. */ - /* For all existing curves in libgcrypt-1.9 (so far), the - size of private part should be even. */ + else if (!*s /* Leading 0x00 added at the front for classic curve */ + && strcmp (curve_name, "Ed25519") + && strcmp (curve_name, "X448")) { size_t numsize; |