summaryrefslogtreecommitdiffstats
path: root/scd/app-openpgp.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2017-08-29 07:35:47 +0200
committerWerner Koch <wk@gnupg.org>2017-09-11 11:39:14 +0200
commit827abe01a72a50eab1cdcde78985b42a4a8480fb (patch)
treeafa07a345979dba1781c4a0ffcb798eabda5779e /scd/app-openpgp.c
parentgpg: Fix key generation with only an email part. (diff)
downloadgnupg2-827abe01a72a50eab1cdcde78985b42a4a8480fb.tar.xz
gnupg2-827abe01a72a50eab1cdcde78985b42a4a8480fb.zip
scd: Fix for large ECC keys.
* scd/app-openpgp.c (do_decipher): Support larger length. -- Reported-by: Achim Pietig <achim@pietig.com> Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
Diffstat (limited to 'scd/app-openpgp.c')
-rw-r--r--scd/app-openpgp.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c
index f9d07ac46..6fcec3e4e 100644
--- a/scd/app-openpgp.c
+++ b/scd/app-openpgp.c
@@ -4575,19 +4575,43 @@ do_decipher (app_t app, const char *keyidstr,
}
}
- fixuplen = 7;
+ n = 0;
+ if (indatalen < 128)
+ fixuplen = 7;
+ else
+ fixuplen = 10;
+
fixbuf = xtrymalloc (fixuplen + indatalen);
if (!fixbuf)
return gpg_error_from_syserror ();
/* Build 'Cipher DO' */
- fixbuf[0] = '\xa6';
- fixbuf[1] = (char)(indatalen+5);
- fixbuf[2] = '\x7f';
- fixbuf[3] = '\x49';
- fixbuf[4] = (char)(indatalen+2);
- fixbuf[5] = '\x86';
- fixbuf[6] = (char)indatalen;
+ fixbuf[n++] = '\xa6';
+ if (indatalen < 128)
+ fixbuf[n++] = (char)(indatalen+5);
+ else
+ {
+ fixbuf[n++] = 0x81;
+ fixbuf[n++] = (char)(indatalen+7);
+ }
+ fixbuf[n++] = '\x7f';
+ fixbuf[n++] = '\x49';
+ if (indatalen < 128)
+ fixbuf[n++] = (char)(indatalen+2);
+ else
+ {
+ fixbuf[n++] = 0x81;
+ fixbuf[n++] = (char)(indatalen+3);
+ }
+ fixbuf[n++] = '\x86';
+ if (indatalen < 128)
+ fixbuf[n++] = (char)indatalen;
+ else
+ {
+ fixbuf[n++] = 0x81;
+ fixbuf[n++] = (char)indatalen;
+ }
+
if (old_format_len)
{
memset (fixbuf+fixuplen, 0, 32 - old_format_len);