aboutsummaryrefslogtreecommitdiffstats
path: root/scd/app-openpgp.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2015-12-02 23:48:51 +0000
committerNIIBE Yutaka <[email protected]>2015-12-02 23:48:51 +0000
commit11b2691eddc42e91651e4f95dd2731255a3e9211 (patch)
tree8439f450a4299de7e2a2441e5f7075d4bad6a18c /scd/app-openpgp.c
parentgpg: Use the matching key if the search description is exact. (diff)
downloadgnupg-11b2691eddc42e91651e4f95dd2731255a3e9211.tar.gz
gnupg-11b2691eddc42e91651e4f95dd2731255a3e9211.zip
scd: Fix for Curve25519 prefix handling.
* scd/app-openpgp.c (do_decipher): More condition for AES decipher. Handle the prefix in cipher text. Always add the prefix in result.
Diffstat (limited to 'scd/app-openpgp.c')
-rw-r--r--scd/app-openpgp.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c
index 0fcfffe0b..ed1bce6b9 100644
--- a/scd/app-openpgp.c
+++ b/scd/app-openpgp.c
@@ -4114,7 +4114,8 @@ do_decipher (app_t app, const char *keyidstr,
if (rc)
return rc;
- if (indatalen == 16 + 1 || indatalen == 32 + 1)
+ if (indatalen == 16 + 1 || indatalen == 32 + 1
+ && ((char *)indata)[0] == 0x02)
/* PSO:DECIPHER with symmetric key. */
padind = -1;
else if (app->app_local->keyattr[1].key_type == KEY_TYPE_RSA)
@@ -4172,6 +4173,16 @@ do_decipher (app_t app, const char *keyidstr,
}
else if (app->app_local->keyattr[1].key_type == KEY_TYPE_ECC)
{
+ if (app->app_local->keyattr[1].ecc.flags
+ && (indatalen%2))
+ { /*
+ * Skip the prefix. It may be 0x40 (in new format), or MPI
+ * head of 0x00 (in old format).
+ */
+ indata++;
+ indatalen--;
+ }
+
fixuplen = 7;
fixbuf = xtrymalloc (fixuplen + indatalen);
if (!fixbuf)
@@ -4211,6 +4222,20 @@ do_decipher (app_t app, const char *keyidstr,
indata, indatalen, le_value, padind,
outdata, outdatalen);
xfree (fixbuf);
+ if (app->app_local->keyattr[1].key_type == KEY_TYPE_ECC
+ && app->app_local->keyattr[1].ecc.flags)
+ { /* Add the prefix 0x40 */
+ fixbuf = xtrymalloc (*outdatalen + 1);
+ if (!fixbuf)
+ {
+ xfree (outdata);
+ return gpg_error_from_syserror ();
+ }
+ xfree (outdata);
+ outdata = fixbuf;
+ outdata[0] = 0x40;
+ *outdatalen = *outdatalen + 1;
+ }
if (gpg_err_code (rc) == GPG_ERR_CARD /* actual SW is 0x640a */
&& app->app_local->manufacturer == 5