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