b171b06764b53ecf5dc373b34c8c276da7ed25eb
[gnupg.git] / g10 / keygen.c
1 /* keygen.c - generate a key pair
2  *      Copyright (c) 1997 by Werner Koch (dd9jn)
3  *
4  * This file is part of G10.
5  *
6  * G10 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  * G10 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 <errno.h>
26 #include <assert.h>
27 #include "util.h"
28 #include "main.h"
29 #include "packet.h"
30 #include "cipher.h"
31 #include "ttyio.h"
32 #include "options.h"
33 #include "keydb.h"
34
35 #if 0
36   #define TEST_ALGO  1
37   #define TEST_NBITS 256
38   #define TEST_UID   "Karl Test"
39 #endif
40
41
42 static int
43 answer_is_yes( const char *s )
44 {
45     if( !stricmp(s, "yes") )
46         return 1;
47     if( *s == 'y' && !s[1] )
48         return 1;
49     if( *s == 'Y' && !s[1] )
50         return 1;
51     return 0;
52 }
53
54
55 static u16
56 checksum_u16( unsigned n )
57 {
58     u16 a;
59
60     a  = (n >> 8) & 0xff;
61     a |= n & 0xff;
62     return a;
63 }
64
65 static u16
66 checksum( byte *p, unsigned n )
67 {
68     u16 a;
69
70     for(a=0; n; n-- )
71         a += *p++;
72     return a;
73 }
74
75 static u16
76 checksum_mpi( MPI a )
77 {
78     u16 csum;
79     byte *buffer;
80     unsigned nbytes;
81
82     buffer = mpi_get_buffer( a, &nbytes, NULL );
83     csum = checksum_u16( nbytes*8 );
84     csum += checksum( buffer, nbytes );
85     m_free( buffer );
86     return csum;
87 }
88
89
90
91 static void
92 write_uid( KBNODE root, const char *s )
93 {
94     PACKET *pkt = m_alloc_clear(sizeof *pkt );
95     size_t n = strlen(s);
96
97     pkt->pkttype = PKT_USER_ID;
98     pkt->pkt.user_id = m_alloc( sizeof *pkt->pkt.user_id + n - 1 );
99     pkt->pkt.user_id->len = n;
100     strcpy(pkt->pkt.user_id->name, s);
101     add_kbnode( root, new_kbnode( pkt ) );
102 }
103
104
105 static int
106 write_selfsig( KBNODE root, KBNODE pub_root, PKT_secret_cert *skc )
107 {
108     PACKET *pkt;
109     PKT_signature *sig;
110     PKT_user_id *uid;
111     int rc=0;
112     KBNODE kbctx, node;
113     PKT_public_cert *pkc;
114
115     if( opt.verbose )
116         log_info("writing self signature\n");
117
118     /* get the uid packet from the tree */
119     for( kbctx=NULL; (node=walk_kbtree( root, &kbctx)) ; ) {
120         if( node->pkt->pkttype == PKT_USER_ID )
121             break;
122     }
123     if( !node )
124         log_bug(NULL); /* no user id packet in tree */
125     uid = node->pkt->pkt.user_id;
126     /* get the pkc packet from the pub_tree */
127     for( kbctx=NULL; (node=walk_kbtree( pub_root, &kbctx)) ; ) {
128         if( node->pkt->pkttype == PKT_PUBLIC_CERT )
129             break;
130     }
131     if( !node )
132         log_bug(NULL);
133     pkc = node->pkt->pkt.public_cert;
134
135     /* and make the signature */
136     rc = make_keysig_packet( &sig, pkc, uid, skc, 0x13, DIGEST_ALGO_RMD160 );
137     if( rc ) {
138         log_error("make_keysig_packet failed: %s\n", g10_errstr(rc) );
139         return rc;
140     }
141
142     pkt = m_alloc_clear( sizeof *pkt );
143     pkt->pkttype = PKT_SIGNATURE;
144     pkt->pkt.signature = sig;
145     add_kbnode( root, new_kbnode( pkt ) );
146     return rc;
147 }
148
149
150 static int
151 gen_elg(unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
152         PKT_secret_cert **ret_skc )
153 {
154     int rc;
155     PACKET *pkt;
156     PKT_secret_cert *skc;
157     PKT_public_cert *pkc;
158     ELG_public_key pk;
159     ELG_secret_key sk;
160     unsigned nbytes;
161
162     elg_generate( &pk, &sk, nbits );
163
164     skc = m_alloc( sizeof *skc );
165     pkc = m_alloc( sizeof *pkc );
166     skc->timestamp = pkc->timestamp = make_timestamp();
167     skc->valid_days = pkc->valid_days = 0; /* fixme: make it configurable*/
168     skc->pubkey_algo = pkc->pubkey_algo = PUBKEY_ALGO_ELGAMAL;
169                        memset(&pkc->mfx, 0, sizeof pkc->mfx);
170                        pkc->d.elg.p = pk.p;
171                        pkc->d.elg.g = pk.g;
172                        pkc->d.elg.y = pk.y;
173     skc->d.elg.p = sk.p;
174     skc->d.elg.g = sk.g;
175     skc->d.elg.y = sk.y;
176     skc->d.elg.x = sk.x;
177     skc->d.elg.is_protected = 0;
178     skc->d.elg.protect_algo = 0;
179
180     skc->d.elg.csum = checksum_mpi( skc->d.elg.x );
181     /* return an unprotected version of the skc */
182     *ret_skc = copy_secret_cert( NULL, skc );
183
184     if( dek ) {
185         skc->d.elg.protect_algo = CIPHER_ALGO_BLOWFISH;
186         randomize_buffer(skc->d.elg.protect.blowfish.iv, 8, 1);
187         rc = protect_secret_key( skc, dek );
188         if( rc ) {
189             log_error("protect_secret_key failed: %s\n", g10_errstr(rc) );
190             free_public_cert(pkc);
191             free_secret_cert(skc);
192             return rc;
193         }
194     }
195
196     pkt = m_alloc_clear(sizeof *pkt);
197     pkt->pkttype = PKT_PUBLIC_CERT;
198     pkt->pkt.public_cert = pkc;
199     add_kbnode(pub_root, new_kbnode( pkt ));
200
201     pkt = m_alloc_clear(sizeof *pkt);
202     pkt->pkttype = PKT_SECRET_CERT;
203     pkt->pkt.secret_cert = skc;
204     add_kbnode(sec_root, new_kbnode( pkt ));
205
206     return 0;
207 }
208
209
210
211 #ifdef HAVE_RSA_CIPHER
212 static int
213 gen_rsa(unsigned nbits, IOBUF pub_io, IOBUF sec_io, DEK *dek,
214         PKT_public_cert **ret_pkc, PKT_secret_cert **ret_skc )
215 {
216     int rc;
217     PACKET pkt1, pkt2;
218     PKT_secret_cert *skc;
219     PKT_public_cert *pkc;
220     RSA_public_key pk;
221     RSA_secret_key sk;
222
223     init_packet(&pkt1);
224     init_packet(&pkt2);
225
226     rsa_generate( &pk, &sk, nbits );
227
228     skc = m_alloc( sizeof *skc );
229     pkc = m_alloc( sizeof *pkc );
230     skc->timestamp = pkc->timestamp = make_timestamp();
231     skc->valid_days = pkc->valid_days = 0; /* fixme: make it configurable*/
232     skc->pubkey_algo = pkc->pubkey_algo = PUBKEY_ALGO_RSA;
233                        memset(&pkc->mfx, 0, sizeof pkc->mfx);
234                        pkc->d.rsa.rsa_n = pk.n;
235                        pkc->d.rsa.rsa_e = pk.e;
236     skc->d.rsa.rsa_n = sk.n;
237     skc->d.rsa.rsa_e = sk.e;
238     skc->d.rsa.rsa_d = sk.d;
239     skc->d.rsa.rsa_p = sk.p;
240     skc->d.rsa.rsa_q = sk.q;
241     skc->d.rsa.rsa_u = sk.u;
242     skc->d.rsa.csum  = checksum_mpi( skc->d.rsa.rsa_d );
243     skc->d.rsa.csum += checksum_mpi( skc->d.rsa.rsa_p );
244     skc->d.rsa.csum += checksum_mpi( skc->d.rsa.rsa_q );
245     skc->d.rsa.csum += checksum_mpi( skc->d.rsa.rsa_u );
246     if( !dek ) {
247         skc->d.rsa.is_protected = 0;
248         skc->d.rsa.protect_algo = 0;
249     }
250     else {
251         skc->d.rsa.is_protected = 1;
252         skc->d.rsa.protect_algo = CIPHER_ALGO_BLOWFISH;
253         randomize_buffer( skc->d.rsa.protect.blowfish.iv, 8, 1);
254         skc->d.rsa.csum += checksum( skc->d.rsa.protect.blowfish.iv, 8 );
255         rc = protect_secret_key( skc, dek );
256         if( rc ) {
257             log_error("protect_secret_key failed: %s\n", g10_errstr(rc) );
258             goto leave;
259         }
260     }
261
262     pkt1.pkttype = PKT_PUBLIC_CERT;
263     pkt1.pkt.public_cert = pkc;
264     pkt2.pkttype = PKT_SECRET_CERT;
265     pkt2.pkt.secret_cert = skc;
266
267     if( (rc = build_packet( pub_io, &pkt1 )) ) {
268         log_error("build public_cert packet failed: %s\n", g10_errstr(rc) );
269         goto leave;
270     }
271     if( (rc = build_packet( sec_io, &pkt2 )) ) {
272         log_error("build secret_cert packet failed: %s\n", g10_errstr(rc) );
273         goto leave;
274     }
275     *ret_pkc = pkt1.pkt.public_cert;
276     pkt1.pkt.public_cert = NULL;
277     *ret_skc = pkt1.pkt.secret_cert;
278     pkt1.pkt.secret_cert = NULL;
279
280   leave:
281     free_packet(&pkt1);
282     free_packet(&pkt2);
283     return rc;
284 }
285 #endif /*HAVE_RSA_CIPHER*/
286
287
288 static int
289 gen_dsa(unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
290         PKT_secret_cert **ret_skc )
291 {
292     return G10ERR_GENERAL;
293 }
294
295
296
297 /****************
298  * Generate a keypair
299  */
300 void
301 generate_keypair()
302 {
303     char *answer;
304     unsigned nbits;
305     char *pub_fname = NULL;
306     char *sec_fname = NULL;
307     char *uid = NULL;
308     IOBUF pub_io = NULL;
309     IOBUF sec_io = NULL;
310     KBNODE pub_root = NULL;
311     KBNODE sec_root = NULL;
312     PKT_secret_cert *skc = NULL;
313     DEK *dek = NULL;
314     int rc;
315     int algo;
316     const char *algo_name;
317
318   #ifndef TEST_ALGO
319     if( opt.batch || opt.answer_yes || opt.answer_no )
320         log_fatal("Key generation can only be used in interactive mode\n");
321
322     tty_printf("Please select the algorithm to use:\n"
323                "   (1) ElGamal is the suggested one.\n"
324            #ifdef HAVE_RSA_CIPHER
325                "   (2) RSA cannot be used in the U.S.\n"
326            #endif
327                "   (3) DSA can only be used for signatures.\n"
328                );
329   #endif
330
331     for(;;) {
332       #ifdef TEST_ALGO
333         algo = TEST_ALGO;
334       #else
335         answer = tty_get("Your selection? (1"
336                                            #ifdef HAVE_RSA_CIPHER
337                                              ",2"
338                                            #endif
339                                                ",3) ");
340         tty_kill_prompt();
341         algo = *answer? atoi(answer): 1;
342         m_free(answer);
343       #endif
344         if( algo == 1 ) {
345             algo = PUBKEY_ALGO_ELGAMAL;
346             algo_name = "ElGamal";
347             break;
348         }
349       #ifdef HAVE_RSA_CIPHER
350         else if( algo == 2 ) {
351             algo = PUBKEY_ALGO_RSA;
352             algo_name = "RSA";
353             break;
354         }
355       #endif
356         else if( algo == 3 ) {
357             algo = PUBKEY_ALGO_DSA;
358             algo_name = "DSA";
359             break;
360         }
361     }
362
363
364
365     tty_printf("About to generate a new %s keypair.\n"
366           #ifndef TEST_NBITS
367                "              minimum keysize is  768 bits\n"
368                "              default keysize is 1024 bits\n"
369                "    highest suggested keysize is 2048 bits\n"
370           #endif
371                                                              , algo_name );
372     for(;;) {
373       #ifdef TEST_NBITS
374         nbits = TEST_NBITS;
375       #else
376         answer = tty_get("What keysize do you want? (1024) ");
377         tty_kill_prompt();
378         nbits = *answer? atoi(answer): 1024;
379         m_free(answer);
380       #endif
381         if( algo == PUBKEY_ALGO_DSA && (nbits < 512 || nbits > 1024) )
382             tty_printf("DSA does only allow keysizes from 512 to 1024\n");
383         else if( nbits < 128 ) /* FIXME: change this to 768 */
384             tty_printf("keysize too small; please select a larger one\n");
385         else if( nbits > 2048 ) {
386             tty_printf("Keysizes larger than 2048 are not suggested, because "
387                        "computations take REALLY long!\n");
388             answer = tty_get("Are you sure, that you want this keysize? ");
389             tty_kill_prompt();
390             if( answer_is_yes(answer) ) {
391                 m_free(answer);
392                 tty_printf("Okay, but keep in mind that your monitor "
393                            "and keyboard radiation is also very vulnerable "
394                            "to attacks!\n");
395                 break;
396             }
397             m_free(answer);
398         }
399         else
400             break;
401     }
402     tty_printf("Requested keysize is %u bits\n", nbits );
403     if( algo == PUBKEY_ALGO_DSA && (nbits % 64) ) {
404         nbits = ((nbits + 63) / 64) * 64;
405         tty_printf("rounded up to %u bits\n", nbits );
406     }
407     else if( (nbits % 32) ) {
408         nbits = ((nbits + 31) / 32) * 32;
409         tty_printf("rounded up to %u bits\n", nbits );
410     }
411
412   #ifdef TEST_UID
413     uid = m_alloc(strlen(TEST_UID)+1);
414     strcpy(uid, TEST_UID);
415   #else
416     tty_printf( "\nYou need a User-ID to identify your key; please use your name and your\n"
417                 "email address in this suggested format:\n"
418                 "    \"Heinrich Heine <heinrichh@uni-duesseldorf.de>\n" );
419     uid = NULL;
420     for(;;) {
421         m_free(uid);
422         tty_printf("\n");
423         uid = tty_get("Your User-ID: ");
424         tty_kill_prompt();
425         if( strlen(uid) < 5 )
426             tty_printf("Please enter a string of at least 5 characters\n");
427         else  {
428             tty_printf("You selected this USER-ID:\n    \"%s\"\n\n", uid);
429             answer = tty_get("Is this correct? ");
430             tty_kill_prompt();
431             if( answer_is_yes(answer) ) {
432                 m_free(answer);
433                 break;
434             }
435             m_free(answer);
436         }
437     }
438   #endif
439
440
441     tty_printf( "You need a Passphrase to protect your secret key.\n\n" );
442
443     dek = m_alloc_secure( sizeof *dek );
444     dek->algo = CIPHER_ALGO_BLOWFISH;
445     rc = make_dek_from_passphrase( dek , 2 );
446     if( rc == -1 ) {
447         m_free(dek); dek = NULL;
448         tty_printf(
449             "You don't what a passphrase - this is probably a *bad* idea!\n"
450             "I will do it anyway.  You can change your passphrase at anytime,\n"
451             "using this program with the option \"--change-passphrase\"\n\n" );
452     }
453     else if( rc ) {
454         m_free(dek); dek = NULL;
455         m_free(uid);
456         log_error("Error getting the passphrase: %s\n", g10_errstr(rc) );
457         return;
458     }
459
460
461     /* now check wether we a are allowed to write to the keyrings */
462     pub_fname = make_filename("~/.g10", "pubring.g10", NULL );
463     sec_fname = make_filename("~/.g10", "secring.g10", NULL );
464     if( opt.verbose ) {
465         tty_printf("writing public certificate to '%s'\n", pub_fname );
466         tty_printf("writing secret certificate to '%s'\n", sec_fname );
467     }
468
469     /* we create the packets as a tree of kbnodes. Because the structure
470      * we create is known in advance we simply generate a linked list
471      * The first packet is a comment packet, followed by the userid and
472      * the self signature.
473      */
474     pub_root = make_comment_node("#created by G10 pre-release " VERSION );
475     sec_root = make_comment_node("#created by G10 pre-release " VERSION );
476
477     if( algo == PUBKEY_ALGO_ELGAMAL )
478         rc = gen_elg(nbits, pub_root, sec_root, dek, &skc );
479   #ifdef HAVE_RSA_CIPHER
480     else if( algo == PUBKEY_ALGO_RSA )
481         rc = gen_rsa(nbits, pub_io, sec_io, dek, &skc );
482   #endif
483     else if( algo == PUBKEY_ALGO_DSA )
484         rc = gen_dsa(nbits, pub_root, sec_root, dek, &skc );
485     else
486         log_bug(NULL);
487     if( !rc )
488         write_uid(pub_root, uid );
489     if( !rc )
490         write_uid(sec_root, uid );
491     if( !rc )
492         rc = write_selfsig(pub_root, pub_root, skc);
493     if( !rc )
494         rc = write_selfsig(sec_root, pub_root, skc);
495
496     if( !rc ) {
497         KBPOS pub_kbpos;
498         KBPOS sec_kbpos;
499         int rc1 = -1;
500         int rc2 = -1;
501
502         /* we can now write the certificates */
503         /* FIXME: should we check wether the user-id already exists? */
504
505         if( get_keyblock_handle( pub_fname, &pub_kbpos ) ) {
506             if( add_keyblock_resource( pub_fname, 1 ) ) {
507                 log_error("can add keyblock file '%s'\n", pub_fname );
508                 rc = G10ERR_CREATE_FILE;
509             }
510             else if( get_keyblock_handle( pub_fname, &pub_kbpos ) ) {
511                 log_error("can get keyblock handle for '%s'\n", pub_fname );
512                 rc = G10ERR_CREATE_FILE;
513             }
514         }
515         if( rc )
516             ;
517         else if( get_keyblock_handle( sec_fname, &sec_kbpos ) ) {
518             if( add_keyblock_resource( sec_fname, 1 ) ) {
519                 log_error("can add keyblock file '%s'\n", sec_fname );
520                 rc = G10ERR_CREATE_FILE;
521             }
522             else if( get_keyblock_handle( sec_fname, &sec_kbpos ) ) {
523                 log_error("can get keyblock handle for '%s'\n", sec_fname );
524                 rc = G10ERR_CREATE_FILE;
525             }
526         }
527
528         if( rc )
529             ;
530         else if( (rc=rc1=lock_keyblock( &pub_kbpos )) )
531             log_error("can't lock public keyring: %s\n", g10_errstr(rc) );
532         else if( (rc=rc2=lock_keyblock( &sec_kbpos )) )
533             log_error("can't lock secret keyring: %s\n", g10_errstr(rc) );
534         else if( (rc=insert_keyblock( &pub_kbpos, pub_root )) )
535             log_error("can't write public key: %s\n", g10_errstr(rc) );
536         else if( (rc=insert_keyblock( &sec_kbpos, sec_root )) )
537             log_error("can't write secret key: %s\n", g10_errstr(rc) );
538         else {
539             tty_printf("public and secret key created and signed.\n" );
540         }
541
542         if( !rc1 )
543             unlock_keyblock( &pub_kbpos );
544         if( !rc2 )
545             unlock_keyblock( &sec_kbpos );
546     }
547
548
549     if( rc )
550         tty_printf("Key generation failed: %s\n", g10_errstr(rc) );
551     release_kbnode( pub_root );
552     release_kbnode( sec_root );
553     if( skc ) /* the unprotected  secret certificate */
554         free_secret_cert(skc);
555     m_free(uid);
556     m_free(dek);
557     m_free(pub_fname);
558     m_free(sec_fname);
559 }
560