diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2017-08-29 07:35:47 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2017-09-11 11:39:14 +0200 |
commit | 827abe01a72a50eab1cdcde78985b42a4a8480fb (patch) | |
tree | afa07a345979dba1781c4a0ffcb798eabda5779e /scd/app-openpgp.c | |
parent | gpg: Fix key generation with only an email part. (diff) | |
download | gnupg2-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.c | 40 |
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); |