Fixes pertaining to revocation creation with subkey-only exported card keys
[gnupg.git] / g10 / export.c
1 /* export.c
2  * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3  *               2005 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 2 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, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20  * USA.
21  */
22
23 #include <config.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #include <errno.h>
28 #include <assert.h>
29
30 #include "options.h"
31 #include "packet.h"
32 #include "errors.h"
33 #include "keydb.h"
34 #include "memory.h"
35 #include "util.h"
36 #include "main.h"
37 #include "i18n.h"
38 #include "trustdb.h"
39
40 static int do_export( STRLIST users, int secret, unsigned int options );
41 static int do_export_stream( IOBUF out, STRLIST users, int secret,
42                              KBNODE *keyblock_out, unsigned int options,
43                              int *any );
44
45 int
46 parse_export_options(char *str,unsigned int *options,int noisy)
47 {
48   struct parse_options export_opts[]=
49     {
50       {"export-local-sigs",EXPORT_LOCAL_SIGS,NULL},
51       {"export-attributes",EXPORT_ATTRIBUTES,NULL},
52       {"export-sensitive-revkeys",EXPORT_SENSITIVE_REVKEYS,NULL},
53       {"export-minimal",EXPORT_MINIMAL|EXPORT_CLEAN_SIGS|EXPORT_CLEAN_UIDS,NULL},
54       {"export-clean",EXPORT_CLEAN_SIGS|EXPORT_CLEAN_UIDS,NULL},
55       {"export-clean-sigs",EXPORT_CLEAN_SIGS,NULL},
56       {"export-clean-uids",EXPORT_CLEAN_UIDS,NULL},
57
58       {"export-reset-subkey-passwd", EXPORT_RESET_SUBKEY_PASSWD, NULL},
59
60       /* Aliases for backward compatibility */
61       {"include-local-sigs",EXPORT_LOCAL_SIGS,NULL},
62       {"include-attributes",EXPORT_ATTRIBUTES,NULL},
63       {"include-sensitive-revkeys",EXPORT_SENSITIVE_REVKEYS,NULL},
64       /* dummy */
65       {"export-unusable-sigs",0,NULL},
66       {NULL,0,NULL}
67       /* add tags for include revoked and disabled? */
68     };
69
70   return parse_options(str,options,export_opts,noisy);
71 }
72
73 /****************
74  * Export the public keys (to standard out or --output).
75  * Depending on opt.armor the output is armored.
76  * options are defined in main.h.
77  * If USERS is NULL, the complete ring will be exported.  */
78 int
79 export_pubkeys( STRLIST users, unsigned int options )
80 {
81     return do_export( users, 0, options );
82 }
83
84 /****************
85  * Export to an already opened stream; return -1 if no keys have
86  * been exported
87  */
88 int
89 export_pubkeys_stream( IOBUF out, STRLIST users,
90                        KBNODE *keyblock_out, unsigned int options )
91 {
92     int any, rc;
93
94     rc = do_export_stream( out, users, 0, keyblock_out, options, &any );
95     if( !rc && !any )
96         rc = -1;
97     return rc;
98 }
99
100 int
101 export_seckeys( STRLIST users )
102 {
103     return do_export( users, 1, 0 );
104 }
105
106 int
107 export_secsubkeys( STRLIST users )
108 {
109     return do_export( users, 2, 0 );
110 }
111
112 static int
113 do_export( STRLIST users, int secret, unsigned int options )
114 {
115     IOBUF out = NULL;
116     int any, rc;
117     armor_filter_context_t afx;
118     compress_filter_context_t zfx;
119
120     memset( &afx, 0, sizeof afx);
121     memset( &zfx, 0, sizeof zfx);
122
123     rc = open_outfile( NULL, 0, &out );
124     if( rc )
125         return rc;
126
127     if( opt.armor ) {
128         afx.what = secret?5:1;
129         iobuf_push_filter( out, armor_filter, &afx );
130     }
131     if( opt.compress_keys )
132       push_compress_filter(out,&zfx,default_compress_algo());
133
134     rc = do_export_stream( out, users, secret, NULL, options, &any );
135     if( rc || !any )
136         iobuf_cancel(out);
137     else
138         iobuf_close(out);
139     return rc;
140 }
141
142
143 /* If keyblock_out is non-NULL, AND the exit code is zero, then it
144    contains a pointer to the first keyblock found and exported.  No
145    other keyblocks are exported.  The caller must free it. */
146 static int
147 do_export_stream( IOBUF out, STRLIST users, int secret,
148                   KBNODE *keyblock_out, unsigned int options, int *any )
149 {
150     int rc = 0;
151     PACKET pkt;
152     KBNODE keyblock = NULL;
153     KBNODE kbctx, node;
154     size_t ndesc, descindex;
155     KEYDB_SEARCH_DESC *desc = NULL;
156     KEYDB_HANDLE kdbhd;
157     STRLIST sl;
158     u32 keyid[2];
159
160     *any = 0;
161     init_packet( &pkt );
162     kdbhd = keydb_new (secret);
163
164     if (!users) {
165         ndesc = 1;
166         desc = xmalloc_clear ( ndesc * sizeof *desc);
167         desc[0].mode = KEYDB_SEARCH_MODE_FIRST;
168     }
169     else {
170         for (ndesc=0, sl=users; sl; sl = sl->next, ndesc++) 
171             ;
172         desc = xmalloc ( ndesc * sizeof *desc);
173         
174         for (ndesc=0, sl=users; sl; sl = sl->next) {
175             if (classify_user_id (sl->d, desc+ndesc))
176                 ndesc++;
177             else
178                 log_error (_("key \"%s\" not found: %s\n"),
179                            sl->d, g10_errstr (G10ERR_INV_USER_ID));
180         }
181
182         /* it would be nice to see which of the given users did
183            actually match one in the keyring.  To implement this we
184            need to have a found flag for each entry in desc and to set
185            this we must check all those entries after a match to mark
186            all matched one - currently we stop at the first match.  To
187            do this we need an extra flag to enable this feature so */
188     }
189
190 #ifdef ENABLE_SELINUX_HACKS
191     if (secret) {
192         log_error (_("exporting secret keys not allowed\n"));
193         rc = G10ERR_GENERAL;
194         goto leave;
195     }
196 #endif
197
198     while (!(rc = keydb_search2 (kdbhd, desc, ndesc, &descindex))) {
199         int sha1_warned=0,skip_until_subkey=0;
200         u32 sk_keyid[2];
201
202         if (!users) 
203             desc[0].mode = KEYDB_SEARCH_MODE_NEXT;
204
205         /* read the keyblock */
206         rc = keydb_get_keyblock (kdbhd, &keyblock );
207         if( rc ) {
208             log_error (_("error reading keyblock: %s\n"), g10_errstr(rc) );
209             goto leave;
210         }
211
212         if((node=find_kbnode(keyblock,PKT_SECRET_KEY)))
213           {
214             PKT_secret_key *sk=node->pkt->pkt.secret_key;
215
216             keyid_from_sk(sk,sk_keyid);
217
218             /* we can't apply GNU mode 1001 on an unprotected key */
219             if( secret == 2 && !sk->is_protected )
220               {
221                 log_info(_("key %s: not protected - skipped\n"),
222                          keystr(sk_keyid));
223                 continue;
224               }
225
226             /* no v3 keys with GNU mode 1001 */
227             if( secret == 2 && sk->version == 3 )
228               {
229                 log_info(_("key %s: PGP 2.x style key - skipped\n"),
230                          keystr(sk_keyid));
231                 continue;
232               }
233
234             /* It does not make sense to export a key with a primary
235                key on card using a non-key stub.  We simply skip those
236                keys when used with --export-secret-subkeys. */
237             if (secret == 2 && sk->is_protected
238                 && sk->protect.s2k.mode == 1002 ) 
239               {
240                 log_info(_("key %s: key material on-card - skipped\n"),
241                          keystr(sk_keyid));
242                 continue;
243               }
244           }
245         else
246           {
247             /* It's a public key export */
248             if((options&EXPORT_MINIMAL)
249                && (node=find_kbnode(keyblock,PKT_PUBLIC_KEY)))
250               keyid_from_pk(node->pkt->pkt.public_key,keyid);
251
252             if(options&EXPORT_CLEAN_UIDS)
253               clean_uids_from_key(keyblock,opt.verbose);
254           }
255
256         /* and write it */
257         for( kbctx=NULL; (node = walk_kbnode( keyblock, &kbctx, 0 )); ) {
258             if( skip_until_subkey )
259               {
260                 if(node->pkt->pkttype==PKT_PUBLIC_SUBKEY
261                    || node->pkt->pkttype==PKT_SECRET_SUBKEY)
262                   skip_until_subkey=0;
263                 else
264                   continue;
265               }
266
267             /* We used to use comment packets, but not any longer.  In
268                case we still have comments on a key, strip them here
269                before we call build_packet(). */
270             if( node->pkt->pkttype == PKT_COMMENT )
271               continue;
272
273             /* make sure that ring_trust packets never get exported */
274             if (node->pkt->pkttype == PKT_RING_TRUST)
275               continue;
276
277             /* If exact is set, then we only export what was requested
278                (plus the primary key, if the user didn't specifically
279                request it) */
280             if(desc[descindex].exact
281                && (node->pkt->pkttype==PKT_PUBLIC_SUBKEY
282                    || node->pkt->pkttype==PKT_SECRET_SUBKEY))
283               {
284                 u32 kid[2];
285                 byte fpr[MAX_FINGERPRINT_LEN];
286                 size_t fprlen;
287
288                 switch(desc[descindex].mode)
289                   {
290                   case KEYDB_SEARCH_MODE_SHORT_KID:
291                   case KEYDB_SEARCH_MODE_LONG_KID:
292                     if(node->pkt->pkttype==PKT_PUBLIC_SUBKEY)
293                       keyid_from_pk(node->pkt->pkt.public_key,kid);
294                     else
295                       keyid_from_sk(node->pkt->pkt.secret_key,kid);
296                     break;
297
298                   case KEYDB_SEARCH_MODE_FPR16:
299                   case KEYDB_SEARCH_MODE_FPR20:
300                   case KEYDB_SEARCH_MODE_FPR:
301                     if(node->pkt->pkttype==PKT_PUBLIC_SUBKEY)
302                       fingerprint_from_pk(node->pkt->pkt.public_key,
303                                           fpr,&fprlen);
304                     else
305                       fingerprint_from_sk(node->pkt->pkt.secret_key,
306                                           fpr,&fprlen);
307                     break;
308
309                   default:
310                     break;
311                   }
312
313                 switch(desc[descindex].mode)
314                   {
315                   case KEYDB_SEARCH_MODE_SHORT_KID:
316                     if (desc[descindex].u.kid[1] != kid[1])
317                       skip_until_subkey=1;
318                     break;
319                   case KEYDB_SEARCH_MODE_LONG_KID:
320                     if (desc[descindex].u.kid[0] != kid[0]
321                         || desc[descindex].u.kid[1] != kid[1])
322                       skip_until_subkey=1;
323                     break;
324                   case KEYDB_SEARCH_MODE_FPR16:
325                     if (memcmp (desc[descindex].u.fpr, fpr, 16))
326                       skip_until_subkey=1;
327                     break;
328                   case KEYDB_SEARCH_MODE_FPR20:
329                   case KEYDB_SEARCH_MODE_FPR:
330                     if (memcmp (desc[descindex].u.fpr, fpr, 20))
331                       skip_until_subkey=1;
332                     break;
333                   default:
334                     break;
335                   }
336
337                 if(skip_until_subkey)
338                   continue;
339               }
340
341             if(node->pkt->pkttype==PKT_USER_ID)
342               {
343                 /* Run clean_sigs_from_uid against each uid if
344                    export-clean-sigs is on. */
345                 if(options&EXPORT_CLEAN_SIGS)
346                   clean_sigs_from_uid(keyblock,node,opt.verbose);
347               }
348             else if(node->pkt->pkttype==PKT_SIGNATURE)
349               {
350                 /* If we have export-minimal turned on, do not include
351                    any signature that isn't a selfsig.  Note that this
352                    only applies to uid sigs (0x10, 0x11, 0x12, and
353                    0x13).  A designated revocation is not stripped. */
354                 if((options&EXPORT_MINIMAL)
355                    && IS_UID_SIG(node->pkt->pkt.signature)
356                    && (node->pkt->pkt.signature->keyid[0]!=keyid[0]
357                        || node->pkt->pkt.signature->keyid[1]!=keyid[1]))
358                   continue;
359
360                 /* do not export packets which are marked as not
361                    exportable */
362                 if(!(options&EXPORT_LOCAL_SIGS)
363                    && !node->pkt->pkt.signature->flags.exportable)
364                   continue; /* not exportable */
365
366                 /* Do not export packets with a "sensitive" revocation
367                    key unless the user wants us to.  Note that we do
368                    export these when issuing the actual revocation
369                    (see revoke.c). */
370                 if(!(options&EXPORT_SENSITIVE_REVKEYS)
371                    && node->pkt->pkt.signature->revkey)
372                   {
373                     int i;
374
375                     for(i=0;i<node->pkt->pkt.signature->numrevkeys;i++)
376                       if(node->pkt->pkt.signature->revkey[i]->class & 0x40)
377                         break;
378
379                     if(i<node->pkt->pkt.signature->numrevkeys)
380                       continue;
381                   }
382               }
383
384             /* Don't export attribs? */
385             if( !(options&EXPORT_ATTRIBUTES) &&
386                 node->pkt->pkttype == PKT_USER_ID &&
387                 node->pkt->pkt.user_id->attrib_data ) {
388               /* Skip until we get to something that is not an attrib
389                  or a signature on an attrib */
390               while(kbctx->next && kbctx->next->pkt->pkttype==PKT_SIGNATURE) {
391                 kbctx=kbctx->next;
392               }
393  
394               continue;
395             }
396
397             if( secret == 2 && node->pkt->pkttype == PKT_SECRET_KEY )
398               {
399                 /* We don't want to export the secret parts of the
400                  * primary key, this is done by using GNU protection mode 1001
401                  */
402                 int save_mode = node->pkt->pkt.secret_key->protect.s2k.mode;
403                 node->pkt->pkt.secret_key->protect.s2k.mode = 1001;
404                 rc = build_packet( out, node->pkt );
405                 node->pkt->pkt.secret_key->protect.s2k.mode = save_mode;
406               }
407             else if (secret == 2 && node->pkt->pkttype == PKT_SECRET_SUBKEY
408                      && (opt.export_options&EXPORT_RESET_SUBKEY_PASSWD))
409               {
410                 /* If the subkey is protected reset the passphrase to
411                    export an unprotected subkey.  This feature is
412                    useful in cases of a subkey copied to an unattended
413                    machine where a passphrase is not required. */
414                 PKT_secret_key *sk_save, *sk;
415
416                 sk_save = node->pkt->pkt.secret_key;
417                 sk = copy_secret_key (NULL, sk_save);
418                 node->pkt->pkt.secret_key = sk;
419
420                 log_info (_("about to export an unprotected subkey\n"));
421                 switch (is_secret_key_protected (sk))
422                   {
423                   case -1:
424                     rc = G10ERR_PUBKEY_ALGO;
425                     break;
426                   case 0:
427                     break;
428                   default:
429                     if (sk->protect.s2k.mode == 1001)
430                       ; /* No secret parts. */
431                     else if( sk->protect.s2k.mode == 1002 ) 
432                       ; /* Card key stub. */
433                     else 
434                       {
435                         rc = check_secret_key( sk, 0 );
436                       }
437                     break;
438                   }
439                 if (rc)
440                   {
441                     node->pkt->pkt.secret_key = sk_save;
442                     free_secret_key (sk);
443                     log_error (_("failed to unprotect the subkey: %s\n"),
444                                g10_errstr (rc));
445                     goto leave;
446                   }
447
448                 rc = build_packet (out, node->pkt);
449
450                 node->pkt->pkt.secret_key = sk_save;
451                 free_secret_key (sk);
452               }
453             else
454               {
455                 /* Warn the user if the secret key or any of the secret
456                    subkeys are protected with SHA1 and we have
457                    simple_sk_checksum set. */
458                 if(!sha1_warned && opt.simple_sk_checksum &&
459                    (node->pkt->pkttype==PKT_SECRET_KEY ||
460                     node->pkt->pkttype==PKT_SECRET_SUBKEY) &&
461                    node->pkt->pkt.secret_key->protect.sha1chk)
462                   {
463                     /* I hope this warning doesn't confuse people. */
464                     log_info(_("WARNING: secret key %s does not have a "
465                                "simple SK checksum\n"),keystr(sk_keyid));
466
467                     sha1_warned=1;
468                   }
469
470                 rc = build_packet( out, node->pkt );
471               }
472
473             if( rc ) {
474                 log_error("build_packet(%d) failed: %s\n",
475                             node->pkt->pkttype, g10_errstr(rc) );
476                 rc = G10ERR_WRITE_FILE;
477                 goto leave;
478             }
479         }
480         ++*any;
481         if(keyblock_out)
482           {
483             *keyblock_out=keyblock;
484             break;
485           }
486     }
487     if( rc == -1 )
488         rc = 0;
489
490   leave:
491     xfree(desc);
492     keydb_release (kdbhd);
493     if(rc || keyblock_out==NULL)
494       release_kbnode( keyblock );
495     if( !*any )
496         log_info(_("WARNING: nothing exported\n"));
497     return rc;
498 }