aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2020-06-03 11:27:29 +0000
committerNIIBE Yutaka <[email protected]>2020-06-03 11:27:29 +0000
commitd1af7b781c74ed1144c8ad0693fa2bf7166068ef (patch)
tree2d9858758962d7c9a168d986bbf34bd4a157bcd4
parentecc-sos, agent: Add fixing up private key part for leading zero. (diff)
downloadgnupg-d1af7b781c74ed1144c8ad0693fa2bf7166068ef.tar.gz
gnupg-d1af7b781c74ed1144c8ad0693fa2bf7166068ef.zip
ecc-sos,agent: Fix sexp parsing of private key.
* agent/sexp-secret.c (fixup_when_ecc_private_key): Correctly parse SEXP. Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r--agent/sexp-secret.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/agent/sexp-secret.c b/agent/sexp-secret.c
index 52920792f..9ed9cd402 100644
--- a/agent/sexp-secret.c
+++ b/agent/sexp-secret.c
@@ -42,6 +42,7 @@ fixup_when_ecc_private_key (unsigned char *buf, size_t buflen)
if (*s != '(')
return gpg_error (GPG_ERR_UNKNOWN_SEXP);
s++;
+ n = snext (&s);
if (!smatch (&s, n, "ecc"))
return buflen;
@@ -54,12 +55,13 @@ fixup_when_ecc_private_key (unsigned char *buf, size_t buflen)
return gpg_error (GPG_ERR_INV_SEXP);
if (n == 1 && *s == 'd')
{
- const unsigned char *s0;
- size_t n0 = n;
+ unsigned char *s0;
+ size_t n0;
s += n;
- s0 = s;
+ s0 = (unsigned char *)s;
n = snext (&s);
+ n0 = s - s0;
if (!n)
return gpg_error (GPG_ERR_INV_SEXP);
@@ -72,8 +74,9 @@ fixup_when_ecc_private_key (unsigned char *buf, size_t buflen)
n--;
buflen--;
- numsize = snprintf (s0, s-s0, "%u:", (unsigned int)n);
- memmove (s0+numsize, s+1, buflen - (s - buf) - 1);
+ numsize = snprintf (s0, s-s0+1, "%u:", (unsigned int)n);
+ memmove (s0+numsize, s+1, buflen - (s - buf));
+ memset (s0+numsize+buflen - (s - buf), 0, (n0 - numsize) + 1);
buflen -= (n0 - numsize);
s = s0+numsize+n;
}