[PATCH] scd: Fix KEYTOCARD for ECC.

NIIBE Yutaka gniibe at fsij.org
Fri Sep 18 14:57:06 CEST 2015


Hello,

During the tests of Gnuk Token, I found that KEYTOCARD doesn't work
sometimes.  Only public keys of Ed25519 and Curve25519 are in native
format.  It just worked for a specific private key with MSB=0.

Tested with Ed25519 and Curve25519 keys.

diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c
index 8f7c8b0..d43db5b 100644
--- a/scd/app-openpgp.c
+++ b/scd/app-openpgp.c
@@ -3243,11 +3243,12 @@ ecc_writekey (app_t app, gpg_error_t (*pincb)(void*, const char *, char **),
         {
           const unsigned char **buf2;
           size_t *buf2len;
+          int native = flag_djb_tweak;

           switch (*tok)
             {
             case 'q': buf2 = &ecc_q; buf2len = &ecc_q_len; break;
-            case 'd': buf2 = &ecc_d; buf2len = &ecc_d_len; break;
+            case 'd': buf2 = &ecc_d; buf2len = &ecc_d_len; native = 0; break;
             default: buf2 = NULL;  buf2len = NULL; break;
             }
           if (buf2 && *buf2)
@@ -3257,13 +3258,16 @@ ecc_writekey (app_t app, gpg_error_t (*pincb)(void*, const char *, char **),
             }
           if ((err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen)))
             goto leave;
-          if (tok && buf2 && !flag_djb_tweak)
-            /* It's MPI.  Strip off leading zero bytes and save. */
-            for (;toklen && !*tok; toklen--, tok++)
-              ;
+          if (tok && buf2)
+            {
+              if (!native)
+                /* Strip off leading zero bytes and save. */
+                for (;toklen && !*tok; toklen--, tok++)
+                  ;

-          *buf2 = tok;
-          *buf2len = toklen;
+              *buf2 = tok;
+              *buf2len = toklen;
+            }
         }
       /* Skip until end of list. */
       last_depth2 = depth;
--



More information about the Gnupg-devel mailing list