agent: Stop scdaemon after reload when disable_scdaemon.
[gnupg.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 "../common/exechelp.h"
35 #include "../common/i18n.h"
36 #include "../common/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   gnupg_ksba_io_t 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_KEYGRIP)); i++)
202         ;
203       if (i == ndesc)
204         keydb_set_ephemeral (hd, 1);
205     }
206
207   while (!(rc = keydb_search (ctrl, hd, desc, ndesc)))
208     {
209       unsigned char fpr[20];
210       int exists;
211
212       if (!names)
213         desc[0].mode = KEYDB_SEARCH_MODE_NEXT;
214
215       rc = keydb_get_cert (hd, &cert);
216       if (rc)
217         {
218           log_error ("keydb_get_cert failed: %s\n", gpg_strerror (rc));
219           goto leave;
220         }
221
222       gpgsm_get_fingerprint (cert, 0, fpr, NULL);
223       rc = insert_duptable (dtable, fpr, &exists);
224       if (rc)
225         {
226           log_error ("inserting into duplicates table failed: %s\n",
227                      gpg_strerror (rc));
228           goto leave;
229         }
230
231       if (!exists && count && !ctrl->create_pem)
232         {
233           log_info ("exporting more than one certificate "
234                     "is not possible in binary mode\n");
235           log_info ("ignoring other certificates\n");
236           break;
237         }
238
239       if (!exists)
240         {
241           const unsigned char *image;
242           size_t imagelen;
243
244           image = ksba_cert_get_image (cert, &imagelen);
245           if (!image)
246             {
247               log_error ("ksba_cert_get_image failed\n");
248               goto leave;
249             }
250
251
252           if (ctrl->create_pem)
253             {
254               if (count)
255                 es_putc ('\n', stream);
256               print_short_info (cert, stream);
257               es_putc ('\n', stream);
258             }
259           count++;
260
261           if (!b64writer)
262             {
263               ctrl->pem_name = "CERTIFICATE";
264               rc = gnupg_ksba_create_writer
265                 (&b64writer, ((ctrl->create_pem? GNUPG_KSBA_IO_PEM : 0)
266                               | (ctrl->create_base64? GNUPG_KSBA_IO_BASE64 :0)),
267                  ctrl->pem_name, stream, &writer);
268               if (rc)
269                 {
270                   log_error ("can't create writer: %s\n", gpg_strerror (rc));
271                   goto leave;
272                 }
273             }
274
275           rc = ksba_writer_write (writer, image, imagelen);
276           if (rc)
277             {
278               log_error ("write error: %s\n", gpg_strerror (rc));
279               goto leave;
280             }
281
282           if (ctrl->create_pem)
283             {
284               /* We want one certificate per PEM block */
285               rc = gnupg_ksba_finish_writer (b64writer);
286               if (rc)
287                 {
288                   log_error ("write failed: %s\n", gpg_strerror (rc));
289                   goto leave;
290                 }
291               gnupg_ksba_destroy_writer (b64writer);
292               b64writer = NULL;
293             }
294         }
295
296       ksba_cert_release (cert);
297       cert = NULL;
298     }
299   if (rc && rc != -1)
300     log_error ("keydb_search failed: %s\n", gpg_strerror (rc));
301   else if (b64writer)
302     {
303       rc = gnupg_ksba_finish_writer (b64writer);
304       if (rc)
305         {
306           log_error ("write failed: %s\n", gpg_strerror (rc));
307           goto leave;
308         }
309     }
310
311  leave:
312   gnupg_ksba_destroy_writer (b64writer);
313   ksba_cert_release (cert);
314   xfree (desc);
315   keydb_release (hd);
316   destroy_duptable (dtable);
317 }
318
319
320 /* Export a certificate and its private key.  RAWMODE controls the
321    actual output:
322        0 - Private key and certifciate in PKCS#12 format
323        1 - Only unencrypted private key in PKCS#8 format
324        2 - Only unencrypted private key in PKCS#1 format
325     */
326 void
327 gpgsm_p12_export (ctrl_t ctrl, const char *name, estream_t stream, int rawmode)
328 {
329   gpg_error_t err = 0;
330   KEYDB_HANDLE hd;
331   KEYDB_SEARCH_DESC *desc = NULL;
332   gnupg_ksba_io_t b64writer = NULL;
333   ksba_writer_t writer;
334   ksba_cert_t cert = NULL;
335   const unsigned char *image;
336   size_t imagelen;
337   char *keygrip = NULL;
338   char *prompt;
339   void *data;
340   size_t datalen;
341
342   hd = keydb_new ();
343   if (!hd)
344     {
345       log_error ("keydb_new failed\n");
346       goto leave;
347     }
348
349   desc = xtrycalloc (1, sizeof *desc);
350   if (!desc)
351     {
352       log_error ("allocating memory for export failed: %s\n",
353                  gpg_strerror (out_of_core ()));
354       goto leave;
355     }
356
357   err = classify_user_id (name, desc, 0);
358   if (err)
359     {
360       log_error ("key '%s' not found: %s\n",
361                  name, gpg_strerror (err));
362       goto leave;
363     }
364
365   /* Lookup the certificate and make sure that it is unique. */
366   err = keydb_search (ctrl, hd, desc, 1);
367   if (!err)
368     {
369       err = keydb_get_cert (hd, &cert);
370       if (err)
371         {
372           log_error ("keydb_get_cert failed: %s\n", gpg_strerror (err));
373           goto leave;
374         }
375
376     next_ambiguous:
377       err = keydb_search (ctrl, hd, desc, 1);
378       if (!err)
379         {
380           ksba_cert_t cert2 = NULL;
381
382           if (!keydb_get_cert (hd, &cert2))
383             {
384               if (gpgsm_certs_identical_p (cert, cert2))
385                 {
386                   ksba_cert_release (cert2);
387                   goto next_ambiguous;
388                 }
389               ksba_cert_release (cert2);
390             }
391           err = gpg_error (GPG_ERR_AMBIGUOUS_NAME);
392         }
393       else if (err == -1 || gpg_err_code (err) == GPG_ERR_EOF)
394         err = 0;
395       if (err)
396         {
397           log_error ("key '%s' not found: %s\n",
398                      name, gpg_strerror (err));
399           goto leave;
400         }
401     }
402
403   keygrip = gpgsm_get_keygrip_hexstring (cert);
404   if (!keygrip || gpgsm_agent_havekey (ctrl, keygrip))
405     {
406       /* Note, that the !keygrip case indicates a bad certificate. */
407       err = gpg_error (GPG_ERR_NO_SECKEY);
408       log_error ("can't export key '%s': %s\n", name, gpg_strerror (err));
409       goto leave;
410     }
411
412   image = ksba_cert_get_image (cert, &imagelen);
413   if (!image)
414     {
415       log_error ("ksba_cert_get_image failed\n");
416       goto leave;
417     }
418
419   if (ctrl->create_pem)
420     {
421       print_short_info (cert, stream);
422       es_putc ('\n', stream);
423     }
424
425   if (opt.p12_charset && ctrl->create_pem && !rawmode)
426     {
427       es_fprintf (stream, "The passphrase is %s encoded.\n\n",
428                   opt.p12_charset);
429     }
430
431   if (rawmode == 0)
432     ctrl->pem_name = "PKCS12";
433   else if (rawmode == 1)
434     ctrl->pem_name = "PRIVATE KEY";
435   else
436     ctrl->pem_name = "RSA PRIVATE KEY";
437   err = gnupg_ksba_create_writer
438     (&b64writer, ((ctrl->create_pem? GNUPG_KSBA_IO_PEM : 0)
439                   | (ctrl->create_base64? GNUPG_KSBA_IO_BASE64 : 0)),
440      ctrl->pem_name, stream, &writer);
441   if (err)
442     {
443       log_error ("can't create writer: %s\n", gpg_strerror (err));
444       goto leave;
445     }
446
447   prompt = gpgsm_format_keydesc (cert);
448   err = export_p12 (ctrl, image, imagelen, prompt, keygrip, rawmode,
449                     &data, &datalen);
450   xfree (prompt);
451   if (err)
452     goto leave;
453   err = ksba_writer_write (writer, data, datalen);
454   xfree (data);
455   if (err)
456     {
457       log_error ("write failed: %s\n", gpg_strerror (err));
458       goto leave;
459     }
460
461   if (ctrl->create_pem)
462     {
463       /* We want one certificate per PEM block */
464       err = gnupg_ksba_finish_writer (b64writer);
465       if (err)
466         {
467           log_error ("write failed: %s\n", gpg_strerror (err));
468           goto leave;
469         }
470       gnupg_ksba_destroy_writer (b64writer);
471       b64writer = NULL;
472     }
473
474   ksba_cert_release (cert);
475   cert = NULL;
476
477  leave:
478   gnupg_ksba_destroy_writer (b64writer);
479   ksba_cert_release (cert);
480   xfree (keygrip);
481   xfree (desc);
482   keydb_release (hd);
483 }
484
485
486 /* Print some info about the certifciate CERT to FP or STREAM */
487 static void
488 print_short_info (ksba_cert_t cert, estream_t stream)
489 {
490   char *p;
491   ksba_sexp_t sexp;
492   int idx;
493
494   for (idx=0; (p = ksba_cert_get_issuer (cert, idx)); idx++)
495     {
496       es_fputs ((!idx
497                  ?   "Issuer ...: "
498                  : "\n   aka ...: "), stream);
499       gpgsm_es_print_name (stream, p);
500       xfree (p);
501     }
502   es_putc ('\n', stream);
503
504   es_fputs ("Serial ...: ", stream);
505   sexp = ksba_cert_get_serial (cert);
506   if (sexp)
507     {
508       int len;
509       const unsigned char *s = sexp;
510
511       if (*s == '(')
512         {
513           s++;
514           for (len=0; *s && *s != ':' && digitp (s); s++)
515             len = len*10 + atoi_1 (s);
516           if (*s == ':')
517             es_write_hexstring (stream, s+1, len, 0, NULL);
518         }
519       xfree (sexp);
520     }
521   es_putc ('\n', stream);
522
523   for (idx=0; (p = ksba_cert_get_subject (cert, idx)); idx++)
524     {
525       es_fputs ((!idx
526                  ?   "Subject ..: "
527                  : "\n    aka ..: "), stream);
528       gpgsm_es_print_name (stream, p);
529       xfree (p);
530     }
531   es_putc ('\n', stream);
532
533   p = gpgsm_get_keygrip_hexstring (cert);
534   if (p)
535     {
536       es_fprintf (stream, "Keygrip ..: %s\n", p);
537       xfree (p);
538     }
539 }
540
541
542 \f
543 /* Parse a private key S-expression and return a malloced array with
544    the RSA parameters in pkcs#12 order.  The caller needs to
545    deep-release this array.  */
546 static gcry_mpi_t *
547 sexp_to_kparms (gcry_sexp_t sexp)
548 {
549   gcry_sexp_t list, l2;
550   const char *name;
551   const char *s;
552   size_t n;
553   int idx;
554   const char *elems;
555   gcry_mpi_t *array;
556
557   list = gcry_sexp_find_token (sexp, "private-key", 0 );
558   if(!list)
559     return NULL;
560   l2 = gcry_sexp_cadr (list);
561   gcry_sexp_release (list);
562   list = l2;
563   name = gcry_sexp_nth_data (list, 0, &n);
564   if(!name || n != 3 || memcmp (name, "rsa", 3))
565     {
566       gcry_sexp_release (list);
567       return NULL;
568     }
569
570   /* Parameter names used with RSA in the pkcs#12 order. */
571   elems = "nedqp--u";
572   array = xtrycalloc (strlen(elems) + 1, sizeof *array);
573   if (!array)
574     {
575       gcry_sexp_release (list);
576       return NULL;
577     }
578   for (idx=0, s=elems; *s; s++, idx++ )
579     {
580       if (*s == '-')
581         continue; /* Computed below  */
582       l2 = gcry_sexp_find_token (list, s, 1);
583       if (l2)
584         {
585           array[idx] = gcry_sexp_nth_mpi (l2, 1, GCRYMPI_FMT_USG);
586           gcry_sexp_release (l2);
587         }
588       if (!array[idx]) /* Required parameter not found or invalid.  */
589         {
590           for (idx=0; array[idx]; idx++)
591             gcry_mpi_release (array[idx]);
592           xfree (array);
593           gcry_sexp_release (list);
594           return NULL;
595         }
596     }
597   gcry_sexp_release (list);
598
599   array[5] = gcry_mpi_snew (0);  /* compute d mod (q-1) */
600   gcry_mpi_sub_ui (array[5], array[3], 1);
601   gcry_mpi_mod (array[5], array[2], array[5]);
602
603   array[6] = gcry_mpi_snew (0);  /* compute d mod (p-1) */
604   gcry_mpi_sub_ui (array[6], array[4], 1);
605   gcry_mpi_mod (array[6], array[2], array[6]);
606
607   return array;
608 }
609
610
611 static gpg_error_t
612 export_p12 (ctrl_t ctrl, const unsigned char *certimg, size_t certimglen,
613             const char *prompt, const char *keygrip, int rawmode,
614             void **r_result, size_t *r_resultlen)
615 {
616   gpg_error_t err = 0;
617   void *kek = NULL;
618   size_t keklen;
619   unsigned char *wrappedkey = NULL;
620   size_t wrappedkeylen;
621   gcry_cipher_hd_t cipherhd = NULL;
622   gcry_sexp_t s_skey = NULL;
623   gcry_mpi_t *kparms = NULL;
624   unsigned char *key = NULL;
625   size_t keylen;
626   char *passphrase = NULL;
627   unsigned char *result = NULL;
628   size_t resultlen;
629   int i;
630
631   *r_result = NULL;
632
633   /* Get the current KEK.  */
634   err = gpgsm_agent_keywrap_key (ctrl, 1, &kek, &keklen);
635   if (err)
636     {
637       log_error ("error getting the KEK: %s\n", gpg_strerror (err));
638       goto leave;
639     }
640
641   /* Receive the wrapped key from the agent.  */
642   err = gpgsm_agent_export_key (ctrl, keygrip, prompt,
643                                 &wrappedkey, &wrappedkeylen);
644   if (err)
645     goto leave;
646
647
648   /* Unwrap the key.  */
649   err = gcry_cipher_open (&cipherhd, GCRY_CIPHER_AES128,
650                           GCRY_CIPHER_MODE_AESWRAP, 0);
651   if (err)
652     goto leave;
653   err = gcry_cipher_setkey (cipherhd, kek, keklen);
654   if (err)
655     goto leave;
656   xfree (kek);
657   kek = NULL;
658
659   if (wrappedkeylen < 24)
660     {
661       err = gpg_error (GPG_ERR_INV_LENGTH);
662       goto leave;
663     }
664   keylen = wrappedkeylen - 8;
665   key = xtrymalloc_secure (keylen);
666   if (!key)
667     {
668       err = gpg_error_from_syserror ();
669       goto leave;
670     }
671   err = gcry_cipher_decrypt (cipherhd, key, keylen, wrappedkey, wrappedkeylen);
672   if (err)
673     goto leave;
674   xfree (wrappedkey);
675   wrappedkey = NULL;
676   gcry_cipher_close (cipherhd);
677   cipherhd = NULL;
678
679
680   /* Convert to a gcrypt S-expression.  */
681   err = gcry_sexp_create (&s_skey, key, keylen, 0, xfree_fnc);
682   if (err)
683     goto leave;
684   key = NULL; /* Key is now owned by S_KEY.  */
685
686   /* Get the parameters from the S-expression.  */
687   kparms = sexp_to_kparms (s_skey);
688   gcry_sexp_release (s_skey);
689   s_skey = NULL;
690   if (!kparms)
691     {
692       log_error ("error converting key parameters\n");
693       err = GPG_ERR_BAD_SECKEY;
694       goto leave;
695     }
696
697   if (rawmode)
698     {
699       /* Export in raw mode, that is only the pkcs#1/#8 private key. */
700       result = p12_raw_build (kparms, rawmode, &resultlen);
701       if (!result)
702         err = gpg_error (GPG_ERR_GENERAL);
703     }
704   else
705     {
706       err = gpgsm_agent_ask_passphrase
707         (ctrl,
708          i18n_utf8 ("Please enter the passphrase to protect the "
709                     "new PKCS#12 object."),
710          1, &passphrase);
711       if (err)
712         goto leave;
713
714       result = p12_build (kparms, certimg, certimglen, passphrase,
715                           opt.p12_charset, &resultlen);
716       xfree (passphrase);
717       passphrase = NULL;
718       if (!result)
719         err = gpg_error (GPG_ERR_GENERAL);
720     }
721
722  leave:
723   xfree (key);
724   gcry_sexp_release (s_skey);
725   if (kparms)
726     {
727       for (i=0; kparms[i]; i++)
728         gcry_mpi_release (kparms[i]);
729       xfree (kparms);
730     }
731   gcry_cipher_close (cipherhd);
732   xfree (wrappedkey);
733   xfree (kek);
734
735   if (gpg_err_code (err) == GPG_ERR_BAD_PASSPHRASE)
736     {
737       /* During export this is the passphrase used to unprotect the
738          key and not the pkcs#12 thing as in export.  Therefore we can
739          issue the regular passphrase status.  FIXME: replace the all
740          zero keyid by a regular one. */
741       gpgsm_status (ctrl, STATUS_BAD_PASSPHRASE, "0000000000000000");
742     }
743
744   if (err)
745     {
746       xfree (result);
747     }
748   else
749     {
750       *r_result = result;
751       *r_resultlen = resultlen;
752     }
753   return err;
754 }