chiark / gitweb /
gnupg2 (2.1.17-3) unstable; urgency=medium
[gnupg2.git] / sm / export.c
1 /* export.c - Export certificates and private keys.
2  * Copyright (C) 2002, 2003, 2004, 2007, 2009,
3  *               2010 Free Software Foundation, Inc.
4  *
5  * This file is part of GnuPG.
6  *
7  * GnuPG is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * GnuPG is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see <https://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <errno.h>
26 #include <time.h>
27 #include <assert.h>
28
29 #include "gpgsm.h"
30 #include <gcrypt.h>
31 #include <ksba.h>
32
33 #include "keydb.h"
34 #include "exechelp.h"
35 #include "i18n.h"
36 #include "sysutils.h"
37 #include "minip12.h"
38
39 /* A table to store a fingerprint as used in a duplicates table.  We
40    don't need to hash here because a fingerprint is already a perfect
41    hash value.  This we use the most significant bits to index the
42    table and then use a linked list for the overflow.  Possible
43    enhancement for very large number of certificates:  Add a second
44    level table and then resort to a linked list.  */
45 struct duptable_s
46 {
47   struct duptable_s *next;
48
49   /* Note that we only need to store 19 bytes because the first byte
50      is implictly given by the table index (we require at least 8
51      bits). */
52   unsigned char fpr[19];
53 };
54 typedef struct duptable_s *duptable_t;
55 #define DUPTABLE_BITS 12
56 #define DUPTABLE_SIZE (1 << DUPTABLE_BITS)
57
58
59 static void print_short_info (ksba_cert_t cert, estream_t stream);
60 static gpg_error_t export_p12 (ctrl_t ctrl,
61                                const unsigned char *certimg, size_t certimglen,
62                                const char *prompt, const char *keygrip,
63                                int rawmode,
64                                void **r_result, size_t *r_resultlen);
65
66
67 /* Create a table used to indetify duplicated certificates. */
68 static duptable_t *
69 create_duptable (void)
70 {
71   return xtrycalloc (DUPTABLE_SIZE, sizeof (duptable_t));
72 }
73
74 static void
75 destroy_duptable (duptable_t *table)
76 {
77   int idx;
78   duptable_t t, t2;
79
80   if (table)
81     {
82       for (idx=0; idx < DUPTABLE_SIZE; idx++)
83         for (t = table[idx]; t; t = t2)
84           {
85             t2 = t->next;
86             xfree (t);
87           }
88       xfree (table);
89     }
90 }
91
92 /* Insert the 20 byte fingerprint FPR into TABLE.  Sets EXITS to true
93    if the fingerprint already exists in the table. */
94 static gpg_error_t
95 insert_duptable (duptable_t *table, unsigned char *fpr, int *exists)
96 {
97   size_t idx;
98   duptable_t t;
99
100   *exists = 0;
101   idx = fpr[0];
102 #if DUPTABLE_BITS > 16 || DUPTABLE_BITS < 8
103 #error cannot handle a table larger than 16 bits or smaller than 8 bits
104 #elif DUPTABLE_BITS > 8
105   idx <<= (DUPTABLE_BITS - 8);
106   idx |= (fpr[1] & ~(~0U << 4));
107 #endif
108
109   for (t = table[idx]; t; t = t->next)
110     if (!memcmp (t->fpr, fpr+1, 19))
111       break;
112   if (t)
113     {
114       *exists = 1;
115       return 0;
116     }
117   /* Insert that fingerprint. */
118   t = xtrymalloc (sizeof *t);
119   if (!t)
120     return gpg_error_from_syserror ();
121   memcpy (t->fpr, fpr+1, 19);
122   t->next = table[idx];
123   table[idx] = t;
124   return 0;
125 }
126
127
128 /* Export all certificates or just those given in NAMES.  The output
129    is written to STREAM.  */
130 void
131 gpgsm_export (ctrl_t ctrl, strlist_t names, estream_t stream)
132 {
133   KEYDB_HANDLE hd = NULL;
134   KEYDB_SEARCH_DESC *desc = NULL;
135   int ndesc;
136   Base64Context b64writer = NULL;
137   ksba_writer_t writer;
138   strlist_t sl;
139   ksba_cert_t cert = NULL;
140   int rc=0;
141   int count = 0;
142   int i;
143   duptable_t *dtable;
144
145
146   dtable = create_duptable ();
147   if (!dtable)
148     {
149       log_error ("creating duplicates table failed: %s\n", strerror (errno));
150       goto leave;
151     }
152
153   hd = keydb_new ();
154   if (!hd)
155     {
156       log_error ("keydb_new failed\n");
157       goto leave;
158     }
159
160   if (!names)
161     ndesc = 1;
162   else
163     {
164       for (sl=names, ndesc=0; sl; sl = sl->next, ndesc++)
165         ;
166     }
167
168   desc = xtrycalloc (ndesc, sizeof *desc);
169   if (!ndesc)
170     {
171       log_error ("allocating memory for export failed: %s\n",
172                  gpg_strerror (out_of_core ()));
173       goto leave;
174     }
175
176   if (!names)
177     desc[0].mode = KEYDB_SEARCH_MODE_FIRST;
178   else
179     {
180       for (ndesc=0, sl=names; sl; sl = sl->next)
181         {
182           rc = classify_user_id (sl->d, desc+ndesc, 0);
183           if (rc)
184             {
185               log_error ("key '%s' not found: %s\n",
186                          sl->d, gpg_strerror (rc));
187               rc = 0;
188             }
189           else
190             ndesc++;
191         }
192     }
193
194   /* If all specifications are done by fingerprint or keygrip, we
195      switch to ephemeral mode so that _all_ currently available and
196      matching certificates are exported.  */
197   if (names && ndesc)
198     {
199       for (i=0; (i < ndesc
200                  && (desc[i].mode == KEYDB_SEARCH_MODE_FPR
201                      || desc[i].mode == KEYDB_SEARCH_MODE_FPR20
202                      || desc[i].mode == KEYDB_SEARCH_MODE_FPR16
203                      || desc[i].mode == KEYDB_SEARCH_MODE_KEYGRIP)); i++)
204         ;
205       if (i == ndesc)
206         keydb_set_ephemeral (hd, 1);
207     }
208
209   while (!(rc = keydb_search (ctrl, hd, desc, ndesc)))
210     {
211       unsigned char fpr[20];
212       int exists;
213
214       if (!names)
215         desc[0].mode = KEYDB_SEARCH_MODE_NEXT;
216
217       rc = keydb_get_cert (hd, &cert);
218       if (rc)
219         {
220           log_error ("keydb_get_cert failed: %s\n", gpg_strerror (rc));
221           goto leave;
222         }
223
224       gpgsm_get_fingerprint (cert, 0, fpr, NULL);
225       rc = insert_duptable (dtable, fpr, &exists);
226       if (rc)
227         {
228           log_error ("inserting into duplicates table failed: %s\n",
229                      gpg_strerror (rc));
230           goto leave;
231         }
232
233       if (!exists && count && !ctrl->create_pem)
234         {
235           log_info ("exporting more than one certificate "
236                     "is not possible in binary mode\n");
237           log_info ("ignoring other certificates\n");
238           break;
239         }
240
241       if (!exists)
242         {
243           const unsigned char *image;
244           size_t imagelen;
245
246           image = ksba_cert_get_image (cert, &imagelen);
247           if (!image)
248             {
249               log_error ("ksba_cert_get_image failed\n");
250               goto leave;
251             }
252
253
254           if (ctrl->create_pem)
255             {
256               if (count)
257                 es_putc ('\n', stream);
258               print_short_info (cert, stream);
259               es_putc ('\n', stream);
260             }
261           count++;
262
263           if (!b64writer)
264             {
265               ctrl->pem_name = "CERTIFICATE";
266               rc = gpgsm_create_writer (&b64writer, ctrl, stream, &writer);
267               if (rc)
268                 {
269                   log_error ("can't create writer: %s\n", gpg_strerror (rc));
270                   goto leave;
271                 }
272             }
273
274           rc = ksba_writer_write (writer, image, imagelen);
275           if (rc)
276             {
277               log_error ("write error: %s\n", gpg_strerror (rc));
278               goto leave;
279             }
280
281           if (ctrl->create_pem)
282             {
283               /* We want one certificate per PEM block */
284               rc = gpgsm_finish_writer (b64writer);
285               if (rc)
286                 {
287                   log_error ("write failed: %s\n", gpg_strerror (rc));
288                   goto leave;
289                 }
290               gpgsm_destroy_writer (b64writer);
291               b64writer = NULL;
292             }
293         }
294
295       ksba_cert_release (cert);
296       cert = NULL;
297     }
298   if (rc && rc != -1)
299     log_error ("keydb_search failed: %s\n", gpg_strerror (rc));
300   else if (b64writer)
301     {
302       rc = gpgsm_finish_writer (b64writer);
303       if (rc)
304         {
305           log_error ("write failed: %s\n", gpg_strerror (rc));
306           goto leave;
307         }
308     }
309
310  leave:
311   gpgsm_destroy_writer (b64writer);
312   ksba_cert_release (cert);
313   xfree (desc);
314   keydb_release (hd);
315   destroy_duptable (dtable);
316 }
317
318
319 /* Export a certificate and its private key.  RAWMODE controls the
320    actual output:
321        0 - Private key and certifciate in PKCS#12 format
322        1 - Only unencrypted private key in PKCS#8 format
323        2 - Only unencrypted private key in PKCS#1 format
324     */
325 void
326 gpgsm_p12_export (ctrl_t ctrl, const char *name, estream_t stream, int rawmode)
327 {
328   gpg_error_t err = 0;
329   KEYDB_HANDLE hd;
330   KEYDB_SEARCH_DESC *desc = NULL;
331   Base64Context b64writer = NULL;
332   ksba_writer_t writer;
333   ksba_cert_t cert = NULL;
334   const unsigned char *image;
335   size_t imagelen;
336   char *keygrip = NULL;
337   char *prompt;
338   void *data;
339   size_t datalen;
340
341   hd = keydb_new ();
342   if (!hd)
343     {
344       log_error ("keydb_new failed\n");
345       goto leave;
346     }
347
348   desc = xtrycalloc (1, sizeof *desc);
349   if (!desc)
350     {
351       log_error ("allocating memory for export failed: %s\n",
352                  gpg_strerror (out_of_core ()));
353       goto leave;
354     }
355
356   err = classify_user_id (name, desc, 0);
357   if (err)
358     {
359       log_error ("key '%s' not found: %s\n",
360                  name, gpg_strerror (err));
361       goto leave;
362     }
363
364   /* Lookup the certificate and make sure that it is unique. */
365   err = keydb_search (ctrl, hd, desc, 1);
366   if (!err)
367     {
368       err = keydb_get_cert (hd, &cert);
369       if (err)
370         {
371           log_error ("keydb_get_cert failed: %s\n", gpg_strerror (err));
372           goto leave;
373         }
374
375     next_ambiguous:
376       err = keydb_search (ctrl, hd, desc, 1);
377       if (!err)
378         {
379           ksba_cert_t cert2 = NULL;
380
381           if (!keydb_get_cert (hd, &cert2))
382             {
383               if (gpgsm_certs_identical_p (cert, cert2))
384                 {
385                   ksba_cert_release (cert2);
386                   goto next_ambiguous;
387                 }
388               ksba_cert_release (cert2);
389             }
390           err = gpg_error (GPG_ERR_AMBIGUOUS_NAME);
391         }
392       else if (err == -1 || gpg_err_code (err) == GPG_ERR_EOF)
393         err = 0;
394       if (err)
395         {
396           log_error ("key '%s' not found: %s\n",
397                      name, gpg_strerror (err));
398           goto leave;
399         }
400     }
401
402   keygrip = gpgsm_get_keygrip_hexstring (cert);
403   if (!keygrip || gpgsm_agent_havekey (ctrl, keygrip))
404     {
405       /* Note, that the !keygrip case indicates a bad certificate. */
406       err = gpg_error (GPG_ERR_NO_SECKEY);
407       log_error ("can't export key '%s': %s\n", name, gpg_strerror (err));
408       goto leave;
409     }
410
411   image = ksba_cert_get_image (cert, &imagelen);
412   if (!image)
413     {
414       log_error ("ksba_cert_get_image failed\n");
415       goto leave;
416     }
417
418   if (ctrl->create_pem)
419     {
420       print_short_info (cert, stream);
421       es_putc ('\n', stream);
422     }
423
424   if (opt.p12_charset && ctrl->create_pem && !rawmode)
425     {
426       es_fprintf (stream, "The passphrase is %s encoded.\n\n",
427                   opt.p12_charset);
428     }
429
430   if (rawmode == 0)
431     ctrl->pem_name = "PKCS12";
432   else if (rawmode == 1)
433     ctrl->pem_name = "PRIVATE KEY";
434   else
435     ctrl->pem_name = "RSA PRIVATE KEY";
436   err = gpgsm_create_writer (&b64writer, ctrl, stream, &writer);
437   if (err)
438     {
439       log_error ("can't create writer: %s\n", gpg_strerror (err));
440       goto leave;
441     }
442
443   prompt = gpgsm_format_keydesc (cert);
444   err = export_p12 (ctrl, image, imagelen, prompt, keygrip, rawmode,
445                     &data, &datalen);
446   xfree (prompt);
447   if (err)
448     goto leave;
449   err = ksba_writer_write (writer, data, datalen);
450   xfree (data);
451   if (err)
452     {
453       log_error ("write failed: %s\n", gpg_strerror (err));
454       goto leave;
455     }
456
457   if (ctrl->create_pem)
458     {
459       /* We want one certificate per PEM block */
460       err = gpgsm_finish_writer (b64writer);
461       if (err)
462         {
463           log_error ("write failed: %s\n", gpg_strerror (err));
464           goto leave;
465         }
466       gpgsm_destroy_writer (b64writer);
467       b64writer = NULL;
468     }
469
470   ksba_cert_release (cert);
471   cert = NULL;
472
473  leave:
474   gpgsm_destroy_writer (b64writer);
475   ksba_cert_release (cert);
476   xfree (desc);
477   keydb_release (hd);
478 }
479
480
481 /* Print some info about the certifciate CERT to FP or STREAM */
482 static void
483 print_short_info (ksba_cert_t cert, estream_t stream)
484 {
485   char *p;
486   ksba_sexp_t sexp;
487   int idx;
488
489   for (idx=0; (p = ksba_cert_get_issuer (cert, idx)); idx++)
490     {
491       es_fputs ((!idx
492                  ?   "Issuer ...: "
493                  : "\n   aka ...: "), stream);
494       gpgsm_es_print_name (stream, p);
495       xfree (p);
496     }
497   es_putc ('\n', stream);
498
499   es_fputs ("Serial ...: ", stream);
500   sexp = ksba_cert_get_serial (cert);
501   if (sexp)
502     {
503       int len;
504       const unsigned char *s = sexp;
505
506       if (*s == '(')
507         {
508           s++;
509           for (len=0; *s && *s != ':' && digitp (s); s++)
510             len = len*10 + atoi_1 (s);
511           if (*s == ':')
512             es_write_hexstring (stream, s+1, len, 0, NULL);
513         }
514       xfree (sexp);
515     }
516   es_putc ('\n', stream);
517
518   for (idx=0; (p = ksba_cert_get_subject (cert, idx)); idx++)
519     {
520       es_fputs ((!idx
521                  ?   "Subject ..: "
522                  : "\n    aka ..: "), stream);
523       gpgsm_es_print_name (stream, p);
524       xfree (p);
525     }
526   es_putc ('\n', stream);
527
528   p = gpgsm_get_keygrip_hexstring (cert);
529   if (p)
530     {
531       es_fprintf (stream, "Keygrip ..: %s\n", p);
532       xfree (p);
533     }
534 }
535
536
537 \f
538 /* Parse a private key S-expression and return a malloced array with
539    the RSA parameters in pkcs#12 order.  The caller needs to
540    deep-release this array.  */
541 static gcry_mpi_t *
542 sexp_to_kparms (gcry_sexp_t sexp)
543 {
544   gcry_sexp_t list, l2;
545   const char *name;
546   const char *s;
547   size_t n;
548   int idx;
549   const char *elems;
550   gcry_mpi_t *array;
551
552   list = gcry_sexp_find_token (sexp, "private-key", 0 );
553   if(!list)
554     return NULL;
555   l2 = gcry_sexp_cadr (list);
556   gcry_sexp_release (list);
557   list = l2;
558   name = gcry_sexp_nth_data (list, 0, &n);
559   if(!name || n != 3 || memcmp (name, "rsa", 3))
560     {
561       gcry_sexp_release (list);
562       return NULL;
563     }
564
565   /* Parameter names used with RSA in the pkcs#12 order. */
566   elems = "nedqp--u";
567   array = xtrycalloc (strlen(elems) + 1, sizeof *array);
568   if (!array)
569     {
570       gcry_sexp_release (list);
571       return NULL;
572     }
573   for (idx=0, s=elems; *s; s++, idx++ )
574     {
575       if (*s == '-')
576         continue; /* Computed below  */
577       l2 = gcry_sexp_find_token (list, s, 1);
578       if (l2)
579         {
580           array[idx] = gcry_sexp_nth_mpi (l2, 1, GCRYMPI_FMT_USG);
581           gcry_sexp_release (l2);
582         }
583       if (!array[idx]) /* Required parameter not found or invalid.  */
584         {
585           for (idx=0; array[idx]; idx++)
586             gcry_mpi_release (array[idx]);
587           xfree (array);
588           gcry_sexp_release (list);
589           return NULL;
590         }
591     }
592   gcry_sexp_release (list);
593
594   array[5] = gcry_mpi_snew (0);  /* compute d mod (q-1) */
595   gcry_mpi_sub_ui (array[5], array[3], 1);
596   gcry_mpi_mod (array[5], array[2], array[5]);
597
598   array[6] = gcry_mpi_snew (0);  /* compute d mod (p-1) */
599   gcry_mpi_sub_ui (array[6], array[4], 1);
600   gcry_mpi_mod (array[6], array[3], array[6]);
601
602   return array;
603 }
604
605
606 static gpg_error_t
607 export_p12 (ctrl_t ctrl, const unsigned char *certimg, size_t certimglen,
608             const char *prompt, const char *keygrip, int rawmode,
609             void **r_result, size_t *r_resultlen)
610 {
611   gpg_error_t err = 0;
612   void *kek = NULL;
613   size_t keklen;
614   unsigned char *wrappedkey = NULL;
615   size_t wrappedkeylen;
616   gcry_cipher_hd_t cipherhd = NULL;
617   gcry_sexp_t s_skey = NULL;
618   gcry_mpi_t *kparms = NULL;
619   unsigned char *key = NULL;
620   size_t keylen;
621   char *passphrase = NULL;
622   unsigned char *result = NULL;
623   size_t resultlen;
624   int i;
625
626   *r_result = NULL;
627
628   /* Get the current KEK.  */
629   err = gpgsm_agent_keywrap_key (ctrl, 1, &kek, &keklen);
630   if (err)
631     {
632       log_error ("error getting the KEK: %s\n", gpg_strerror (err));
633       goto leave;
634     }
635
636   /* Receive the wrapped key from the agent.  */
637   err = gpgsm_agent_export_key (ctrl, keygrip, prompt,
638                                 &wrappedkey, &wrappedkeylen);
639   if (err)
640     goto leave;
641
642
643   /* Unwrap the key.  */
644   err = gcry_cipher_open (&cipherhd, GCRY_CIPHER_AES128,
645                           GCRY_CIPHER_MODE_AESWRAP, 0);
646   if (err)
647     goto leave;
648   err = gcry_cipher_setkey (cipherhd, kek, keklen);
649   if (err)
650     goto leave;
651   xfree (kek);
652   kek = NULL;
653
654   if (wrappedkeylen < 24)
655     {
656       err = gpg_error (GPG_ERR_INV_LENGTH);
657       goto leave;
658     }
659   keylen = wrappedkeylen - 8;
660   key = xtrymalloc_secure (keylen);
661   if (!key)
662     {
663       err = gpg_error_from_syserror ();
664       goto leave;
665     }
666   err = gcry_cipher_decrypt (cipherhd, key, keylen, wrappedkey, wrappedkeylen);
667   if (err)
668     goto leave;
669   xfree (wrappedkey);
670   wrappedkey = NULL;
671   gcry_cipher_close (cipherhd);
672   cipherhd = NULL;
673
674
675   /* Convert to a gcrypt S-expression.  */
676   err = gcry_sexp_create (&s_skey, key, keylen, 0, xfree_fnc);
677   if (err)
678     goto leave;
679   key = NULL; /* Key is now owned by S_KEY.  */
680
681   /* Get the parameters from the S-expression.  */
682   kparms = sexp_to_kparms (s_skey);
683   gcry_sexp_release (s_skey);
684   s_skey = NULL;
685   if (!kparms)
686     {
687       log_error ("error converting key parameters\n");
688       err = GPG_ERR_BAD_SECKEY;
689       goto leave;
690     }
691
692   if (rawmode)
693     {
694       /* Export in raw mode, that is only the pkcs#1/#8 private key. */
695       result = p12_raw_build (kparms, rawmode, &resultlen);
696       if (!result)
697         err = gpg_error (GPG_ERR_GENERAL);
698     }
699   else
700     {
701       err = gpgsm_agent_ask_passphrase
702         (ctrl,
703          i18n_utf8 ("Please enter the passphrase to protect the "
704                     "new PKCS#12 object."),
705          1, &passphrase);
706       if (err)
707         goto leave;
708
709       result = p12_build (kparms, certimg, certimglen, passphrase,
710                           opt.p12_charset, &resultlen);
711       xfree (passphrase);
712       passphrase = NULL;
713       if (!result)
714         err = gpg_error (GPG_ERR_GENERAL);
715     }
716
717  leave:
718   xfree (key);
719   gcry_sexp_release (s_skey);
720   if (kparms)
721     {
722       for (i=0; kparms[i]; i++)
723         gcry_mpi_release (kparms[i]);
724       xfree (kparms);
725     }
726   gcry_cipher_close (cipherhd);
727   xfree (wrappedkey);
728   xfree (kek);
729
730   if (gpg_err_code (err) == GPG_ERR_BAD_PASSPHRASE)
731     {
732       /* During export this is the passphrase used to unprotect the
733          key and not the pkcs#12 thing as in export.  Therefore we can
734          issue the regular passphrase status.  FIXME: replace the all
735          zero keyid by a regular one. */
736       gpgsm_status (ctrl, STATUS_BAD_PASSPHRASE, "0000000000000000");
737     }
738
739   if (err)
740     {
741       xfree (result);
742     }
743   else
744     {
745       *r_result = result;
746       *r_resultlen = resultlen;
747     }
748   return err;
749 }