add-key works
[gnupg.git] / g10 / keygen.c
1 /* keygen.c - generate a key pair
2  *      Copyright (C) 1998 Free Software Foundation, Inc.
3  *
4  * This file is part of GNUPG.
5  *
6  * GNUPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * GNUPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <ctype.h>
26 #include <errno.h>
27 #include <assert.h>
28 #include "util.h"
29 #include "main.h"
30 #include "packet.h"
31 #include "cipher.h"
32 #include "ttyio.h"
33 #include "options.h"
34 #include "keydb.h"
35 #include "i18n.h"
36
37
38 #if defined(HAVE_RSA_CIPHER) && 0
39   #define ENABLE_RSA_KEYGEN 1
40 #endif
41
42
43 static void
44 write_uid( KBNODE root, const char *s )
45 {
46     PACKET *pkt = m_alloc_clear(sizeof *pkt );
47     size_t n = strlen(s);
48
49     pkt->pkttype = PKT_USER_ID;
50     pkt->pkt.user_id = m_alloc( sizeof *pkt->pkt.user_id + n - 1 );
51     pkt->pkt.user_id->len = n;
52     strcpy(pkt->pkt.user_id->name, s);
53     add_kbnode( root, new_kbnode( pkt ) );
54 }
55
56
57 static int
58 write_selfsig( KBNODE root, KBNODE pub_root, PKT_secret_cert *skc )
59 {
60     PACKET *pkt;
61     PKT_signature *sig;
62     PKT_user_id *uid;
63     int rc=0;
64     KBNODE node;
65     PKT_public_cert *pkc;
66
67     if( opt.verbose )
68         log_info(_("writing self signature\n"));
69
70     /* get the uid packet from the list */
71     node = find_kbnode( root, PKT_USER_ID );
72     if( !node )
73         BUG(); /* no user id packet in tree */
74     uid = node->pkt->pkt.user_id;
75     /* get the pkc packet from the pub_tree */
76     node = find_kbnode( pub_root, PKT_PUBLIC_CERT );
77     if( !node )
78         BUG();
79     pkc = node->pkt->pkt.public_cert;
80
81     /* and make the signature */
82     rc = make_keysig_packet( &sig, pkc, uid, NULL, skc, 0x13, 0 );
83     if( rc ) {
84         log_error("make_keysig_packet failed: %s\n", g10_errstr(rc) );
85         return rc;
86     }
87
88     pkt = m_alloc_clear( sizeof *pkt );
89     pkt->pkttype = PKT_SIGNATURE;
90     pkt->pkt.signature = sig;
91     add_kbnode( root, new_kbnode( pkt ) );
92     return rc;
93 }
94
95 static int
96 write_keybinding( KBNODE root, KBNODE pub_root, PKT_secret_cert *skc )
97 {
98     PACKET *pkt;
99     PKT_signature *sig;
100     int rc=0;
101     KBNODE node;
102     PKT_public_cert *pkc, *subpkc;
103
104     if( opt.verbose )
105         log_info(_("writing key binding signature\n"));
106
107     /* get the pkc packet from the pub_tree */
108     node = find_kbnode( pub_root, PKT_PUBLIC_CERT );
109     if( !node )
110         BUG();
111     pkc = node->pkt->pkt.public_cert;
112     /* find the last subkey */
113     subpkc = NULL;
114     for(node=pub_root; node; node = node->next ) {
115         if( node->pkt->pkttype == PKT_PUBKEY_SUBCERT )
116             subpkc = node->pkt->pkt.public_cert;
117     }
118     if( !subpkc )
119         BUG();
120
121     /* and make the signature */
122     rc = make_keysig_packet( &sig, pkc, NULL, subpkc, skc, 0x18, 0 );
123     if( rc ) {
124         log_error("make_keysig_packet failed: %s\n", g10_errstr(rc) );
125         return rc;
126     }
127
128     pkt = m_alloc_clear( sizeof *pkt );
129     pkt->pkttype = PKT_SIGNATURE;
130     pkt->pkt.signature = sig;
131     add_kbnode( root, new_kbnode( pkt ) );
132     return rc;
133 }
134
135
136 static int
137 gen_elg(unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
138         STRING2KEY *s2k, PKT_secret_cert **ret_skc, u16 valid_days,
139                                                         int version )
140 {
141     int rc;
142     int i;
143     PACKET *pkt;
144     PKT_secret_cert *skc;
145     PKT_public_cert *pkc;
146     ELG_public_key pk;
147     ELG_secret_key sk;
148     MPI *factors;
149
150     elg_generate( &pk, &sk, nbits, &factors );
151
152     skc = m_alloc_clear( sizeof *skc );
153     pkc = m_alloc_clear( sizeof *pkc );
154     skc->timestamp = pkc->timestamp = make_timestamp();
155     skc->version = pkc->version = version;
156     skc->valid_days = pkc->valid_days = valid_days;
157     skc->pubkey_algo = pkc->pubkey_algo = PUBKEY_ALGO_ELGAMAL;
158                        pkc->d.elg.p = pk.p;
159                        pkc->d.elg.g = pk.g;
160                        pkc->d.elg.y = pk.y;
161     skc->d.elg.p = sk.p;
162     skc->d.elg.g = sk.g;
163     skc->d.elg.y = sk.y;
164     skc->d.elg.x = sk.x;
165     skc->is_protected = 0;
166     skc->protect.algo = 0;
167
168     skc->csum = checksum_mpi( skc->d.elg.x );
169     if( ret_skc ) /* not a subkey: return an unprotected version of the skc */
170         *ret_skc = copy_secret_cert( NULL, skc );
171
172     if( dek ) {
173         skc->protect.algo = dek->algo;
174         skc->protect.s2k = *s2k;
175         rc = protect_secret_key( skc, dek );
176         if( rc ) {
177             log_error("protect_secret_key failed: %s\n", g10_errstr(rc) );
178             free_public_cert(pkc);
179             free_secret_cert(skc);
180             return rc;
181         }
182     }
183
184     pkt = m_alloc_clear(sizeof *pkt);
185     pkt->pkttype = ret_skc ? PKT_PUBLIC_CERT : PKT_PUBKEY_SUBCERT;
186     pkt->pkt.public_cert = pkc;
187     add_kbnode(pub_root, new_kbnode( pkt ));
188
189     /* don't know whether it makes sense to have the factors, so for now
190      * we store them in the secret keyring (but they are not secret) */
191     pkt = m_alloc_clear(sizeof *pkt);
192     pkt->pkttype = ret_skc ? PKT_SECRET_CERT : PKT_SECKEY_SUBCERT;
193     pkt->pkt.secret_cert = skc;
194     add_kbnode(sec_root, new_kbnode( pkt ));
195     for(i=0; factors[i]; i++ )
196         add_kbnode( sec_root,
197                     make_mpi_comment_node("#:ELG_factor:", factors[i] ));
198
199     return 0;
200 }
201
202
203
204 #ifdef ENABLE_RSA_KEYGEN
205 static int
206 gen_rsa(unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
207         STRING2KEY *s2k, PKT_secret_cert **ret_skc, u16 valid_days )
208 {
209     int rc;
210     PACKET *pkt;
211     PKT_secret_cert *skc;
212     PKT_public_cert *pkc;
213     RSA_public_key pk;
214     RSA_secret_key sk;
215
216     rsa_generate( &pk, &sk, nbits );
217
218     skc = m_alloc_clear( sizeof *skc );
219     pkc = m_alloc_clear( sizeof *pkc );
220     skc->timestamp = pkc->timestamp = make_timestamp();
221     skc->valid_days = pkc->valid_days = valid_days;
222     skc->pubkey_algo = pkc->pubkey_algo = PUBKEY_ALGO_RSA;
223                        memset(&pkc->mfx, 0, sizeof pkc->mfx);
224                        pkc->d.rsa.rsa_n = pk.n;
225                        pkc->d.rsa.rsa_e = pk.e;
226     skc->d.rsa.rsa_n = sk.n;
227     skc->d.rsa.rsa_e = sk.e;
228     skc->d.rsa.rsa_d = sk.d;
229     skc->d.rsa.rsa_p = sk.p;
230     skc->d.rsa.rsa_q = sk.q;
231     skc->d.rsa.rsa_u = sk.u;
232     skc->d.rsa.csum  = checksum_mpi( skc->d.rsa.rsa_d );
233     skc->d.rsa.csum += checksum_mpi( skc->d.rsa.rsa_p );
234     skc->d.rsa.csum += checksum_mpi( skc->d.rsa.rsa_q );
235     skc->d.rsa.csum += checksum_mpi( skc->d.rsa.rsa_u );
236
237     if( ret_skc ) /* not a subkey: return an unprotected version of the skc */
238         *ret_skc = copy_secret_cert( NULL, skc );
239
240     if( dek ) {
241         skc->d.rsa.is_protected = 1;
242         skc->d.rsa.protect_algo = CIPHER_ALGO_BLOWFISH;
243         randomize_buffer( skc->d.rsa.protect.blowfish.iv, 8, 1);
244         skc->d.rsa.csum += checksum( skc->d.rsa.protect.blowfish.iv, 8 );
245         rc = protect_secret_key( skc, dek );
246         if( rc ) {
247             log_error("protect_secret_key failed: %s\n", g10_errstr(rc) );
248             free_public_cert(pkc);
249             free_secret_cert(skc);
250             return rc;
251         }
252     }
253
254     pkt = m_alloc_clear(sizeof *pkt);
255     pkt->pkttype = ret_skc ? PKT_PUBLIC_CERT : PKT_PUBKEY_SUBCERT;
256     pkt->pkt.public_cert = pkc;
257     add_kbnode(pub_root, new_kbnode( pkt ));
258
259     pkt = m_alloc_clear(sizeof *pkt);
260     pkt->pkttype = ret_skc ? PKT_SECRET_CERT : PKT_SECKEY_SUBCERT;
261     pkt->pkt.secret_cert = skc;
262     add_kbnode(sec_root, new_kbnode( pkt ));
263
264     return rc;
265 }
266 #endif /*ENABLE_RSA_KEYGEN*/
267
268
269 /****************
270  * Generate a DSA key
271  */
272 static int
273 gen_dsa(unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
274             STRING2KEY *s2k, PKT_secret_cert **ret_skc, u16 valid_days )
275 {
276     int rc;
277     int i;
278     PACKET *pkt;
279     PKT_secret_cert *skc;
280     PKT_public_cert *pkc;
281     DSA_public_key pk;
282     DSA_secret_key sk;
283     MPI *factors;
284
285     if( nbits > 1024 )
286         nbits = 1024;
287
288     dsa_generate( &pk, &sk, nbits, &factors );
289
290     skc = m_alloc_clear( sizeof *skc );
291     pkc = m_alloc_clear( sizeof *pkc );
292     skc->timestamp = pkc->timestamp = make_timestamp();
293     skc->version = pkc->version = 4;
294     /* valid days are not stored in the packet, but it is
295      * used here to put it into the signature.
296      */
297     skc->valid_days = pkc->valid_days = valid_days;
298     skc->pubkey_algo = pkc->pubkey_algo = PUBKEY_ALGO_DSA;
299                        pkc->d.dsa.p = pk.p;
300                        pkc->d.dsa.q = pk.q;
301                        pkc->d.dsa.g = pk.g;
302                        pkc->d.dsa.y = pk.y;
303     skc->d.dsa.p = sk.p;
304     skc->d.dsa.q = sk.q;
305     skc->d.dsa.g = sk.g;
306     skc->d.dsa.y = sk.y;
307     skc->d.dsa.x = sk.x;
308     skc->is_protected = 0;
309     skc->protect.algo = 0;
310
311     skc->csum = checksum_mpi( skc->d.dsa.x );
312     if( ret_skc ) /* not a subkey: return an unprotected version of the skc */
313          *ret_skc = copy_secret_cert( NULL, skc );
314
315     if( dek ) {
316         skc->protect.algo = dek->algo;
317         skc->protect.s2k = *s2k;
318         rc = protect_secret_key( skc, dek );
319         if( rc ) {
320             log_error("protect_secret_key failed: %s\n", g10_errstr(rc) );
321             free_public_cert(pkc);
322             free_secret_cert(skc);
323             return rc;
324         }
325     }
326
327     pkt = m_alloc_clear(sizeof *pkt);
328     pkt->pkttype = ret_skc ? PKT_PUBLIC_CERT : PKT_PUBKEY_SUBCERT;
329     pkt->pkt.public_cert = pkc;
330     add_kbnode(pub_root, new_kbnode( pkt ));
331
332     /* don't know whether it makes sense to have the factors, so for now
333      * we store them in the secret keyring (but they are not secret)
334      * p = 2 * q * f1 * f2 * ... * fn
335      * We store only f1 to f_n-1;  fn can be calculated because p and q
336      * are known.
337      */
338     pkt = m_alloc_clear(sizeof *pkt);
339     pkt->pkttype = ret_skc ? PKT_SECRET_CERT : PKT_SECKEY_SUBCERT;
340     pkt->pkt.secret_cert = skc;
341     add_kbnode(sec_root, new_kbnode( pkt ));
342     for(i=1; factors[i]; i++ )  /* the first one is q */
343         add_kbnode( sec_root,
344                     make_mpi_comment_node("#:DSA_factor:", factors[i] ));
345
346     return 0;
347 }
348
349
350
351 /****************
352  * check valid days:
353  * return 0 on error or the multiplier
354  */
355 static int
356 check_valid_days( const char *s )
357 {
358     if( !isdigit(*s) )
359         return 0;
360     for( s++; *s; s++)
361         if( !isdigit(*s) )
362             break;
363     if( !*s )
364         return 1;
365     if( s[1] )
366         return 0; /* e.g. "2323wc" */
367     if( *s == 'd' || *s == 'D' )
368         return 1;
369     if( *s == 'w' || *s == 'W' )
370         return 7;
371     if( *s == 'm' || *s == 'M' )
372         return 30;
373     if( *s == 'y' || *s == 'Y' )
374         return 365;
375     return 0;
376 }
377
378
379 static int
380 ask_algo( int *ret_v4 )
381 {
382     char *answer;
383     int algo;
384
385     tty_printf(_("Please select the algorithm to use:\n"
386                  "   (1) ElGamal is the suggested one.\n"
387                  "   (2) ElGamal using v4 packets (OpenPGP)\n"
388                  "   (3) DSA can only be used for signatures.\n"));
389   #ifdef ENABLE_RSA_KEYGEN
390     tty_printf(_("   (4) RSA cannot be used in the U.S.\n"));
391   #endif
392
393     *ret_v4 = 0;
394     for(;;) {
395       #ifdef ENABLE_RSA_KEYGEN
396         answer = tty_get(_("Your selection? (1,2,3,4) "));
397       #else
398         answer = tty_get(_("Your selection? (1,2,3) "));
399       #endif
400         tty_kill_prompt();
401         algo = *answer? atoi(answer): 1;
402         m_free(answer);
403         if( algo == 1 || algo == 2 ) {
404             if( algo == 2 )
405                 *ret_v4 = 1;
406             algo = PUBKEY_ALGO_ELGAMAL;
407             break;
408         }
409         else if( algo == 3 ) {
410             *ret_v4 = 1;
411             algo = PUBKEY_ALGO_DSA;
412             break;
413         }
414       #ifdef ENABLE_RSA_KEYGEN
415         else if( algo == 4 ) {
416             algo = PUBKEY_ALGO_RSA;
417             break;
418         }
419       #endif
420     }
421     return algo;
422 }
423
424
425 static unsigned
426 ask_keysize( int algo )
427 {
428     char *answer;
429     unsigned nbits;
430
431     tty_printf(_("About to generate a new %s keypair.\n"
432                  "              minimum keysize is  768 bits\n"
433                  "              default keysize is 1024 bits\n"
434                  "    highest suggested keysize is 2048 bits\n"),
435                                         pubkey_algo_to_string(algo) );
436     for(;;) {
437         answer = tty_get(_("What keysize do you want? (1024) "));
438         tty_kill_prompt();
439         nbits = *answer? atoi(answer): 1024;
440         m_free(answer);
441         if( algo == PUBKEY_ALGO_DSA && (nbits < 512 || nbits > 1024) )
442             tty_printf(_("DSA only allows keysizes from 512 to 1024\n"));
443         else if( nbits < 768 )
444             tty_printf(_("keysize too small; 768 is smallest value allowed.\n"));
445         else if( nbits > 2048 ) {
446             tty_printf(_("Keysizes larger than 2048 are not suggested, because "
447                          "computations take REALLY long!\n"));
448             answer = tty_get(_("Are you sure, that you want this keysize? "));
449             tty_kill_prompt();
450             if( answer_is_yes(answer) ) {
451                 m_free(answer);
452                 tty_printf(_("Okay, but keep in mind that your monitor "
453                              "and keyboard radiation is also very vulnerable "
454                              "to attacks!\n"));
455                 break;
456             }
457             m_free(answer);
458         }
459         else if( nbits > 1536 ) {
460             answer = tty_get(_("Do you really need such a large keysize? "));
461             tty_kill_prompt();
462             if( answer_is_yes(answer) ) {
463                 m_free(answer);
464                 break;
465             }
466             m_free(answer);
467         }
468         else
469             break;
470     }
471     tty_printf(_("Requested keysize is %u bits\n"), nbits );
472     if( algo == PUBKEY_ALGO_DSA && (nbits % 64) ) {
473         nbits = ((nbits + 63) / 64) * 64;
474         tty_printf(_("rounded up to %u bits\n"), nbits );
475     }
476     else if( (nbits % 32) ) {
477         nbits = ((nbits + 31) / 32) * 32;
478         tty_printf(_("rounded up to %u bits\n"), nbits );
479     }
480     return nbits;
481 }
482
483
484 static int
485 ask_valid_days()
486 {
487     char *answer;
488     int valid_days=0;
489
490     tty_printf(_("Please specify how long the key should be valid.\n"
491                  "         0 = key does not expire\n"
492                  "      <n>  = key expires in n days\n"
493                  "      <n>w = key expires in n weeks\n"
494                  "      <n>m = key expires in n months\n"
495                  "      <n>y = key expires in n years\n"));
496     /* Note: The elgamal subkey for DSA has no exiration date because
497      * is must be signed with the DSA key and this one has the expiration
498      * date */
499
500     answer = NULL;
501     for(;;) {
502         int mult;
503
504         m_free(answer);
505         answer = tty_get(_("Key is valid for? (0) "));
506         tty_kill_prompt();
507         trim_spaces(answer);
508         if( !*answer )
509             valid_days = 0;
510         else if( (mult=check_valid_days(answer)) ) {
511             valid_days = atoi(answer) * mult;
512             if( valid_days < 0 || valid_days > 32767 )
513                 valid_days = 0;
514         }
515         else {
516             tty_printf(_("invalid value\n"));
517             continue;
518         }
519
520         if( !valid_days )
521             tty_printf(_("Key does not expire at all\n"));
522         else {
523             tty_printf(_("Key expires at %s\n"), strtimestamp(
524                        add_days_to_timestamp( make_timestamp(), valid_days )));
525         }
526
527         m_free(answer);
528         answer = tty_get(_("Is this correct (y/n)? "));
529         tty_kill_prompt();
530         if( answer_is_yes(answer) )
531             break;
532     }
533     m_free(answer);
534     return valid_days;
535 }
536
537
538 static char *
539 ask_user_id()
540 {
541     char *answer;
542     char *aname, *acomment, *amail, *uid;
543
544     tty_printf( _("\n"
545 "You need a User-ID to identify your key; the software constructs the user id\n"
546 "from Real Name, Comment and Email Address in this form:\n"
547 "    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n\n") );
548     uid = aname = acomment = amail = NULL;
549     for(;;) {
550         char *p;
551
552         if( !aname ) {
553             for(;;) {
554                 m_free(aname);
555                 aname = tty_get(_("Real name: "));
556                 trim_spaces(aname);
557                 tty_kill_prompt();
558                 if( strpbrk( aname, "<([])>" ) )
559                     tty_printf(_("Invalid character in name\n"));
560                 else if( isdigit(*aname) )
561                     tty_printf(_("Name may not start with a digit\n"));
562                 else if( strlen(aname) < 5 )
563                     tty_printf(_("Name must be at least 5 characters long\n"));
564                 else
565                     break;
566             }
567         }
568         if( !amail ) {
569             for(;;) {
570                 m_free(amail);
571                 amail = tty_get(_("Email address: "));
572                 trim_spaces(amail);
573                 strlwr(amail);
574                 tty_kill_prompt();
575                 if( !*amail )
576                     break;   /* no email address is okay */
577                 else if( strcspn( amail, "abcdefghijklmnopqrstuvwxyz_-.@" )
578                          || string_count_chr(amail,'@') != 1
579                          || *amail == '@'
580                          || amail[strlen(amail)-1] == '@'
581                          || amail[strlen(amail)-1] == '.'
582                          || strstr(amail, "..") )
583                     tty_printf(_("Not a valid email address\n"));
584                 else
585                     break;
586             }
587         }
588         if( !acomment ) {
589             for(;;) {
590                 m_free(acomment);
591                 acomment = tty_get(_("Comment: "));
592                 trim_spaces(acomment);
593                 tty_kill_prompt();
594                 if( !*acomment )
595                     break;   /* no comment is okay */
596                 else if( strpbrk( acomment, "()" ) )
597                     tty_printf(_("Invalid character in comment\n"));
598                 else
599                     break;
600             }
601         }
602
603         m_free(uid);
604         uid = p = m_alloc(strlen(aname)+strlen(amail)+strlen(acomment)+12+10);
605         p = stpcpy(p, aname );
606         if( *acomment )
607             p = stpcpy(stpcpy(stpcpy(p," ("), acomment),")");
608         if( *amail )
609             p = stpcpy(stpcpy(stpcpy(p," <"), amail),">");
610
611         /* append a warning if we do not have dev/random
612          * or it is switched into  quick testmode */
613         if( quick_random_gen(-1) )
614             strcpy(p, " (INSECURE!)" );
615
616
617         tty_printf(_("You selected this USER-ID:\n    \"%s\"\n\n"), uid);
618         /* fixme: add a warning if this user-id already exists */
619         for(;;) {
620             answer = tty_get(_("Edit (N)ame, (C)omment, (E)mail or (O)kay? "));
621             tty_kill_prompt();
622             if( strlen(answer) > 1 )
623                 ;
624             else if( *answer == 'N' || *answer == 'n' ) {
625                 m_free(aname); aname = NULL;
626                 break;
627             }
628             else if( *answer == 'C' || *answer == 'c' ) {
629                 m_free(acomment); acomment = NULL;
630                 break;
631             }
632             else if( *answer == 'E' || *answer == 'e' ) {
633                 m_free(amail); amail = NULL;
634                 break;
635             }
636             else if( *answer == 'O' || *answer == 'o' ) {
637                 m_free(aname); aname = NULL;
638                 m_free(acomment); acomment = NULL;
639                 m_free(amail); amail = NULL;
640                 break;
641             }
642             m_free(answer);
643         }
644         m_free(answer);
645         if( !amail && !acomment && !amail )
646             break;
647         m_free(uid); uid = NULL;
648     }
649     return uid;
650 }
651
652
653 static DEK *
654 ask_passphrase( STRING2KEY **ret_s2k )
655 {
656     DEK *dek = NULL;
657     STRING2KEY *s2k;
658
659     tty_printf(_("You need a Passphrase to protect your secret key.\n\n") );
660
661     s2k = m_alloc_secure( sizeof *s2k );
662     for(;;) {
663         s2k->mode = 1;
664         s2k->hash_algo = DIGEST_ALGO_RMD160;
665         dek = passphrase_to_dek( NULL, CIPHER_ALGO_BLOWFISH, s2k, 2 );
666         if( !dek ) {
667             tty_printf(_("passphrase not correctly repeated; try again.\n"));
668         }
669         else if( !dek->keylen ) {
670             m_free(dek); dek = NULL;
671             m_free(s2k); s2k = NULL;
672             tty_printf(_(
673             "You don't want a passphrase - this is probably a *bad* idea!\n"
674             "I will do it anyway.  You can change your passphrase at any time,\n"
675             "using this program with the option \"--change-passphrase\"\n\n"));
676             break;
677         }
678         else
679             break; /* okay */
680     }
681     *ret_s2k = s2k;
682     return dek;
683 }
684
685
686 static int
687 do_create( int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root,
688            DEK *dek, STRING2KEY *s2k, PKT_secret_cert **skc, int valid_days,
689                                                              int v4_packet )
690 {
691     int rc=0;
692
693     tty_printf(_(
694 "We need to generate a lot of random bytes. It is a good idea to perform\n"
695 "some other action (work in another window, move the mouse, utilize the\n"
696 "network and the disks) during the prime generation; this gives the random\n"
697 "number generator a better chance to gain enough entropy.\n") );
698
699     if( algo == PUBKEY_ALGO_ELGAMAL )
700         rc = gen_elg(nbits, pub_root, sec_root, dek, s2k,
701                            skc, valid_days, v4_packet? 4:3 );
702   #ifdef ENABLE_RSA_KEYGEN
703     else if( algo == PUBKEY_ALGO_RSA )
704         rc = gen_rsa(nbits, pub_root, sec_root, dek, s2k, skc, valid_days  );
705   #endif
706     else if( algo == PUBKEY_ALGO_DSA )
707         rc = gen_dsa(nbits, pub_root, sec_root, dek, s2k, skc, valid_days);
708     else
709         BUG();
710     if( !rc ) {
711         add_kbnode( pub_root,
712                 make_comment_node("#created by GNUPG v" VERSION " ("
713                                             PRINTABLE_OS_NAME ")"));
714         add_kbnode( sec_root,
715                 make_comment_node("#created by GNUPG v" VERSION " ("
716                                             PRINTABLE_OS_NAME ")"));
717     }
718     return rc;
719 }
720
721
722 /****************
723  * Generate a keypair
724  */
725 void
726 generate_keypair()
727 {
728     unsigned nbits;
729     char *pub_fname = NULL;
730     char *sec_fname = NULL;
731     char *uid = NULL;
732     KBNODE pub_root = NULL;
733     KBNODE sec_root = NULL;
734     PKT_secret_cert *skc = NULL;
735     DEK *dek;
736     STRING2KEY *s2k;
737     int rc;
738     int algo;
739     int ndays;
740     int v4;
741
742     if( opt.batch || opt.answer_yes || opt.answer_no ) {
743         log_error(_("Key generation can only be used in interactive mode\n"));
744         return;
745     }
746
747     algo = ask_algo( &v4 );
748     nbits = ask_keysize( algo );
749     ndays = ask_valid_days();
750     uid = ask_user_id();
751     dek = ask_passphrase( &s2k );
752
753
754     /* now check whether we are allowed to write to the keyrings */
755     pub_fname = make_filename(opt.homedir, "pubring.gpg", NULL );
756     sec_fname = make_filename(opt.homedir, "secring.gpg", NULL );
757     if( opt.verbose ) {
758         tty_printf(_("writing public certificate to '%s'\n"), pub_fname );
759         tty_printf(_("writing secret certificate to '%s'\n"), sec_fname );
760     }
761
762     /* we create the packets as a tree of kbnodes. Because the structure
763      * we create is known in advance we simply generate a linked list
764      * The first packet is a dummy comment packet which we flag
765      * as deleted.  The very first packet must always be a CERT packet.
766      */
767     pub_root = make_comment_node("#"); delete_kbnode(pub_root);
768     sec_root = make_comment_node("#"); delete_kbnode(sec_root);
769
770     rc = do_create( algo, nbits, pub_root, sec_root, dek, s2k, &skc, ndays, v4);
771     if( !rc )
772         write_uid(pub_root, uid );
773     if( !rc )
774         write_uid(sec_root, uid );
775     if( !rc )
776         rc = write_selfsig(pub_root, pub_root, skc);
777     if( !rc )
778         rc = write_selfsig(sec_root, pub_root, skc);
779
780     if( !rc ) {
781         KBPOS pub_kbpos;
782         KBPOS sec_kbpos;
783         int rc1 = -1;
784         int rc2 = -1;
785
786         /* we can now write the certificates */
787
788         if( get_keyblock_handle( pub_fname, 0, &pub_kbpos ) ) {
789             if( add_keyblock_resource( pub_fname, 1, 0 ) ) {
790                 log_error("can add keyblock file '%s'\n", pub_fname );
791                 rc = G10ERR_CREATE_FILE;
792             }
793             else if( get_keyblock_handle( pub_fname, 0, &pub_kbpos ) ) {
794                 log_error("can get keyblock handle for '%s'\n", pub_fname );
795                 rc = G10ERR_CREATE_FILE;
796             }
797         }
798         if( rc )
799             ;
800         else if( get_keyblock_handle( sec_fname, 1, &sec_kbpos ) ) {
801             if( add_keyblock_resource( sec_fname, 1, 1 ) ) {
802                 log_error("can add keyblock file '%s'\n", sec_fname );
803                 rc = G10ERR_CREATE_FILE;
804             }
805             else if( get_keyblock_handle( sec_fname, 1, &sec_kbpos ) ) {
806                 log_error("can get keyblock handle for '%s'\n", sec_fname );
807                 rc = G10ERR_CREATE_FILE;
808             }
809         }
810
811         if( rc )
812             ;
813         else if( (rc=rc1=lock_keyblock( &pub_kbpos )) )
814             log_error("can't lock public keyring: %s\n", g10_errstr(rc) );
815         else if( (rc=rc2=lock_keyblock( &sec_kbpos )) )
816             log_error("can't lock secret keyring: %s\n", g10_errstr(rc) );
817         else if( (rc=insert_keyblock( &pub_kbpos, pub_root )) )
818             log_error("can't write public key: %s\n", g10_errstr(rc) );
819         else if( (rc=insert_keyblock( &sec_kbpos, sec_root )) )
820             log_error("can't write secret key: %s\n", g10_errstr(rc) );
821         else {
822             tty_printf(_("public and secret key created and signed.\n") );
823             if( algo == PUBKEY_ALGO_DSA )
824                 tty_printf(_("Note that this key cannot be used for "
825                              "encryption.  You may want to use\n"
826                              "the command \"--add-key\" to generate a "
827                              "secondary key for this purpose.\n") );
828         }
829
830         if( !rc1 )
831             unlock_keyblock( &pub_kbpos );
832         if( !rc2 )
833             unlock_keyblock( &sec_kbpos );
834     }
835
836
837     if( rc )
838         tty_printf(_("Key generation failed: %s\n"), g10_errstr(rc) );
839     release_kbnode( pub_root );
840     release_kbnode( sec_root );
841     if( skc ) /* the unprotected  secret certificate */
842         free_secret_cert(skc);
843     m_free(uid);
844     m_free(dek);
845     m_free(s2k);
846     m_free(pub_fname);
847     m_free(sec_fname);
848 }
849
850
851 /****************
852  * add a new subkey to an existing key.
853  */
854 void
855 generate_subkeypair( const char *username )
856 {
857     int rc=0;
858     KBPOS pub_kbpos, sec_kbpos;
859     KBNODE pub_keyblock = NULL;
860     KBNODE sec_keyblock = NULL;
861     KBNODE node;
862     PKT_secret_cert *skc = NULL; /* this is the primary skc */
863     u32 keyid[2];
864     int v4, algo, ndays;
865     unsigned nbits;
866     char *passphrase = NULL;
867     DEK *dek = NULL;
868     STRING2KEY *s2k = NULL;
869
870     if( opt.batch || opt.answer_yes || opt.answer_no ) {
871         log_error(_("Key generation can only be used in interactive mode\n"));
872         return;
873     }
874
875     /* search the userid */
876     rc = find_secret_keyblock_byname( &sec_kbpos, username );
877     if( rc ) {
878         log_error("user '%s' not found\n", username );
879         goto leave;
880     }
881     rc = read_keyblock( &sec_kbpos, &sec_keyblock );
882     if( rc ) {
883         log_error("error reading the secret key: %s\n", g10_errstr(rc) );
884         goto leave;
885     }
886     /* and the public key */
887     rc = find_keyblock_byname( &pub_kbpos, username );
888     if( rc ) {
889         log_error("user '%s' not found in public ring\n", username );
890         goto leave;
891     }
892     rc = read_keyblock( &pub_kbpos, &pub_keyblock );
893     if( rc ) {
894         log_error("error reading the public key: %s\n", g10_errstr(rc) );
895         goto leave;
896     }
897
898     /* break out the primary key */
899     node = find_kbnode( sec_keyblock, PKT_SECRET_CERT );
900     if( !node ) {
901         log_error("Oops; secret key not found anymore!\n");
902         rc = G10ERR_GENERAL;
903         goto leave;
904     }
905
906     /* make a copy of the skc to keep the protected one in the keyblock */
907     skc = copy_secret_cert( NULL, node->pkt->pkt.secret_cert );
908     keyid_from_skc( skc, keyid );
909     /* display primary and all secondary keys */
910     tty_printf("sec  %4u%c/%08lX %s   ",
911               nbits_from_skc( skc ),
912               pubkey_letter( skc->pubkey_algo ),
913               keyid[1], datestr_from_skc(skc) );
914     {
915         size_t n;
916         char *p = get_user_id( keyid, &n );
917         tty_print_string( p, n );
918         m_free(p);
919         tty_printf("\n");
920     }
921     for(node=sec_keyblock; node; node = node->next ) {
922         if( node->pkt->pkttype == PKT_SECKEY_SUBCERT ) {
923             PKT_secret_cert *subskc = node->pkt->pkt.secret_cert;
924             keyid_from_skc( subskc, keyid );
925             tty_printf("sub  %4u%c/%08lX %s\n",
926                       nbits_from_skc( subskc ),
927                       pubkey_letter( subskc->pubkey_algo ),
928                       keyid[1], datestr_from_skc(subskc) );
929         }
930     }
931     tty_printf("\n");
932
933
934
935     /* unprotect to get the passphrase */
936     switch( is_secret_key_protected( skc ) ) {
937       case -1:
938         rc = G10ERR_PUBKEY_ALGO;
939         break;
940       case 0:
941         tty_printf("This key is not protected.\n");
942         break;
943       default:
944         tty_printf("Key is protected.\n");
945         rc = check_secret_key( skc );
946         if( !rc )
947             passphrase = get_last_passphrase();
948         break;
949     }
950     if( rc )
951         goto leave;
952
953
954     algo = ask_algo( &v4 );
955     nbits = ask_keysize( algo );
956     ndays = ask_valid_days();
957
958     if( passphrase ) {
959         s2k = m_alloc_secure( sizeof *s2k );
960         s2k->mode = 1;
961         s2k->hash_algo = DIGEST_ALGO_RMD160;
962         set_next_passphrase( passphrase );
963         dek = passphrase_to_dek( NULL, CIPHER_ALGO_BLOWFISH, s2k, 2 );
964     }
965
966     rc = do_create( algo, nbits, pub_keyblock, sec_keyblock,
967                                       dek, s2k, NULL, ndays, v4 );
968     if( !rc )
969         rc = write_keybinding(pub_keyblock, pub_keyblock, skc);
970     if( !rc )
971         rc = write_keybinding(sec_keyblock, pub_keyblock, skc);
972     /* write back */
973     if( !rc ) {
974         rc = update_keyblock( &pub_kbpos, pub_keyblock );
975         if( rc )
976             log_error("update_public_keyblock failed\n" );
977     }
978     if( !rc ) {
979         rc = update_keyblock( &sec_kbpos, sec_keyblock );
980         if( rc )
981             log_error("update_secret_keyblock failed\n" );
982     }
983     if( !rc )
984         tty_printf(_("public and secret subkey created.\n") );
985
986
987   leave:
988     if( rc )
989         tty_printf(_("Key generation failed: %s\n"), g10_errstr(rc) );
990     m_free( passphrase );
991     m_free( dek );
992     m_free( s2k );
993     if( skc ) /* release the copy of the (now unprotected) secret key */
994         free_secret_cert(skc);
995     release_kbnode( sec_keyblock );
996     release_kbnode( pub_keyblock );
997     set_next_passphrase( NULL );
998 }
999