aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--scd/app-openpgp.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c
index 4e042e728..d75721fc3 100644
--- a/scd/app-openpgp.c
+++ b/scd/app-openpgp.c
@@ -4406,20 +4406,29 @@ 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 & ECC_FLAG_DJB_TWEAK))
- { /* Add the prefix 0x40 */
- fixbuf = xtrymalloc (*outdatalen + 1);
- if (!fixbuf)
- {
+ if (app->app_local->keyattr[1].key_type == KEY_TYPE_ECC)
+ {
+ unsigned char prefix = 0;
+
+ if (app->app_local->keyattr[1].ecc.flags & ECC_FLAG_DJB_TWEAK)
+ prefix = 0x40;
+ else if ((*outdatalen % 2) == 0) /* No 0x04 -> x-coordinate only */
+ prefix = 0x41;
+
+ if (prefix)
+ { /* Add the prefix */
+ fixbuf = xtrymalloc (*outdatalen + 1);
+ if (!fixbuf)
+ {
+ xfree (*outdata);
+ return gpg_error_from_syserror ();
+ }
+ fixbuf[0] = prefix;
+ memcpy (fixbuf+1, *outdata, *outdatalen);
xfree (*outdata);
- return gpg_error_from_syserror ();
+ *outdata = fixbuf;
+ *outdatalen = *outdatalen + 1;
}
- fixbuf[0] = 0x40;
- memcpy (fixbuf+1, *outdata, *outdatalen);
- xfree (*outdata);
- *outdata = fixbuf;
- *outdatalen = *outdatalen + 1;
}
if (gpg_err_code (rc) == GPG_ERR_CARD /* actual SW is 0x640a */