3a6ebb50538e576d31f086616c883d3503440cc5
[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 = m_alloc_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 = m_alloc ( 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         else
235           {
236             /* It's a public key export */
237             if((options&EXPORT_MINIMAL)
238                && (node=find_kbnode(keyblock,PKT_PUBLIC_KEY)))
239               keyid_from_pk(node->pkt->pkt.public_key,keyid);
240
241             if(options&EXPORT_CLEAN_UIDS)
242               clean_uids_from_key(keyblock,opt.verbose);
243           }
244
245         /* and write it */
246         for( kbctx=NULL; (node = walk_kbnode( keyblock, &kbctx, 0 )); ) {
247             if( skip_until_subkey )
248               {
249                 if(node->pkt->pkttype==PKT_PUBLIC_SUBKEY
250                    || node->pkt->pkttype==PKT_SECRET_SUBKEY)
251                   skip_until_subkey=0;
252                 else
253                   continue;
254               }
255
256             /* We used to use comment packets, but not any longer.  In
257                case we still have comments on a key, strip them here
258                before we call build_packet(). */
259             if( node->pkt->pkttype == PKT_COMMENT )
260               continue;
261
262             /* make sure that ring_trust packets never get exported */
263             if (node->pkt->pkttype == PKT_RING_TRUST)
264               continue;
265
266             /* If exact is set, then we only export what was requested
267                (plus the primary key, if the user didn't specifically
268                request it) */
269             if(desc[descindex].exact
270                && (node->pkt->pkttype==PKT_PUBLIC_SUBKEY
271                    || node->pkt->pkttype==PKT_SECRET_SUBKEY))
272               {
273                 u32 kid[2];
274                 byte fpr[MAX_FINGERPRINT_LEN];
275                 size_t fprlen;
276
277                 switch(desc[descindex].mode)
278                   {
279                   case KEYDB_SEARCH_MODE_SHORT_KID:
280                   case KEYDB_SEARCH_MODE_LONG_KID:
281                     if(node->pkt->pkttype==PKT_PUBLIC_SUBKEY)
282                       keyid_from_pk(node->pkt->pkt.public_key,kid);
283                     else
284                       keyid_from_sk(node->pkt->pkt.secret_key,kid);
285                     break;
286
287                   case KEYDB_SEARCH_MODE_FPR16:
288                   case KEYDB_SEARCH_MODE_FPR20:
289                   case KEYDB_SEARCH_MODE_FPR:
290                     if(node->pkt->pkttype==PKT_PUBLIC_SUBKEY)
291                       fingerprint_from_pk(node->pkt->pkt.public_key,
292                                           fpr,&fprlen);
293                     else
294                       fingerprint_from_sk(node->pkt->pkt.secret_key,
295                                           fpr,&fprlen);
296                     break;
297
298                   default:
299                     break;
300                   }
301
302                 switch(desc[descindex].mode)
303                   {
304                   case KEYDB_SEARCH_MODE_SHORT_KID:
305                     if (desc[descindex].u.kid[1] != kid[1])
306                       skip_until_subkey=1;
307                     break;
308                   case KEYDB_SEARCH_MODE_LONG_KID:
309                     if (desc[descindex].u.kid[0] != kid[0]
310                         || desc[descindex].u.kid[1] != kid[1])
311                       skip_until_subkey=1;
312                     break;
313                   case KEYDB_SEARCH_MODE_FPR16:
314                     if (memcmp (desc[descindex].u.fpr, fpr, 16))
315                       skip_until_subkey=1;
316                     break;
317                   case KEYDB_SEARCH_MODE_FPR20:
318                   case KEYDB_SEARCH_MODE_FPR:
319                     if (memcmp (desc[descindex].u.fpr, fpr, 20))
320                       skip_until_subkey=1;
321                     break;
322                   default:
323                     break;
324                   }
325
326                 if(skip_until_subkey)
327                   continue;
328               }
329
330             if(node->pkt->pkttype==PKT_USER_ID)
331               {
332                 /* Run clean_sigs_from_uid against each uid if
333                    export-clean-sigs is on. */
334                 if(options&EXPORT_CLEAN_SIGS)
335                   clean_sigs_from_uid(keyblock,node,opt.verbose);
336               }
337             else if(node->pkt->pkttype==PKT_SIGNATURE)
338               {
339                 /* If we have export-minimal turned on, do not include
340                    any signature that isn't a selfsig.  Note that this
341                    only applies to uid sigs (0x10, 0x11, 0x12, and
342                    0x13).  A designated revocation is not stripped. */
343                 if((options&EXPORT_MINIMAL)
344                    && IS_UID_SIG(node->pkt->pkt.signature)
345                    && (node->pkt->pkt.signature->keyid[0]!=keyid[0]
346                        || node->pkt->pkt.signature->keyid[1]!=keyid[1]))
347                   continue;
348
349                 /* do not export packets which are marked as not
350                    exportable */
351                 if(!(options&EXPORT_LOCAL_SIGS)
352                    && !node->pkt->pkt.signature->flags.exportable)
353                   continue; /* not exportable */
354
355                 /* Do not export packets with a "sensitive" revocation
356                    key unless the user wants us to.  Note that we do
357                    export these when issuing the actual revocation
358                    (see revoke.c). */
359                 if(!(options&EXPORT_SENSITIVE_REVKEYS)
360                    && node->pkt->pkt.signature->revkey)
361                   {
362                     int i;
363
364                     for(i=0;i<node->pkt->pkt.signature->numrevkeys;i++)
365                       if(node->pkt->pkt.signature->revkey[i]->class & 0x40)
366                         break;
367
368                     if(i<node->pkt->pkt.signature->numrevkeys)
369                       continue;
370                   }
371               }
372
373             /* Don't export attribs? */
374             if( !(options&EXPORT_ATTRIBUTES) &&
375                 node->pkt->pkttype == PKT_USER_ID &&
376                 node->pkt->pkt.user_id->attrib_data ) {
377               /* Skip until we get to something that is not an attrib
378                  or a signature on an attrib */
379               while(kbctx->next && kbctx->next->pkt->pkttype==PKT_SIGNATURE) {
380                 kbctx=kbctx->next;
381               }
382  
383               continue;
384             }
385
386             if( secret == 2 && node->pkt->pkttype == PKT_SECRET_KEY )
387               {
388                 /* We don't want to export the secret parts of the
389                  * primary key, this is done by using GNU protection mode 1001
390                  */
391                 int save_mode = node->pkt->pkt.secret_key->protect.s2k.mode;
392                 node->pkt->pkt.secret_key->protect.s2k.mode = 1001;
393                 rc = build_packet( out, node->pkt );
394                 node->pkt->pkt.secret_key->protect.s2k.mode = save_mode;
395               }
396             else if (secret == 2 && node->pkt->pkttype == PKT_SECRET_SUBKEY
397                      && (opt.export_options&EXPORT_RESET_SUBKEY_PASSWD))
398               {
399                 /* If the subkey is protected reset the passphrase to
400                    export an unprotected subkey.  This feature is
401                    useful in cases of a subkey copied to an unattended
402                    machine where a passphrase is not required. */
403                 PKT_secret_key *sk_save, *sk;
404
405                 sk_save = node->pkt->pkt.secret_key;
406                 sk = copy_secret_key (NULL, sk_save);
407                 node->pkt->pkt.secret_key = sk;
408
409                 log_info ("about to export an unprotected subkey\n");
410                 switch (is_secret_key_protected (sk))
411                   {
412                   case -1:
413                     rc = G10ERR_PUBKEY_ALGO;
414                     break;
415                   case 0:
416                     break;
417                   default:
418                     if (sk->protect.s2k.mode == 1001)
419                       ; /* No secret parts. */
420                     else if( sk->protect.s2k.mode == 1002 ) 
421                       ; /* Card key stub. */
422                     else 
423                       {
424                         rc = check_secret_key( sk, 0 );
425                       }
426                     break;
427                   }
428                 if (rc)
429                   {
430                     node->pkt->pkt.secret_key = sk_save;
431                     free_secret_key (sk);
432                     /* FIXME: Make translatable after releasing 1.4.2 */
433                     log_error ("failed to unprotect the subkey: %s\n",
434                                g10_errstr (rc));
435                     goto leave;
436                   }
437
438                 rc = build_packet (out, node->pkt);
439
440                 node->pkt->pkt.secret_key = sk_save;
441                 free_secret_key (sk);
442               }
443             else
444               {
445                 /* Warn the user if the secret key or any of the secret
446                    subkeys are protected with SHA1 and we have
447                    simple_sk_checksum set. */
448                 if(!sha1_warned && opt.simple_sk_checksum &&
449                    (node->pkt->pkttype==PKT_SECRET_KEY ||
450                     node->pkt->pkttype==PKT_SECRET_SUBKEY) &&
451                    node->pkt->pkt.secret_key->protect.sha1chk)
452                   {
453                     /* I hope this warning doesn't confuse people. */
454                     log_info(_("WARNING: secret key %s does not have a "
455                                "simple SK checksum\n"),keystr(sk_keyid));
456
457                     sha1_warned=1;
458                   }
459
460                 rc = build_packet( out, node->pkt );
461               }
462
463             if( rc ) {
464                 log_error("build_packet(%d) failed: %s\n",
465                             node->pkt->pkttype, g10_errstr(rc) );
466                 rc = G10ERR_WRITE_FILE;
467                 goto leave;
468             }
469         }
470         ++*any;
471         if(keyblock_out)
472           {
473             *keyblock_out=keyblock;
474             break;
475           }
476     }
477     if( rc == -1 )
478         rc = 0;
479
480   leave:
481     m_free(desc);
482     keydb_release (kdbhd);
483     if(rc || keyblock_out==NULL)
484       release_kbnode( keyblock );
485     if( !*any )
486         log_info(_("WARNING: nothing exported\n"));
487     return rc;
488 }