added more stuff
[gnupg.git] / g10 / g10.c
1 /* g10.c - The G10 utility
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 <errno.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <unistd.h>
26
27 #include "packet.h"
28 #include "iobuf.h"
29 #include "memory.h"
30 #include "util.h"
31 #include "main.h"
32 #include "options.h"
33 #include "keydb.h"
34 #include "mpi.h"
35 #include "cipher.h"
36 #include "filter.h"
37
38 static void print_hex( byte *p, size_t n );
39 static void print_mds( const char *fname );
40 static void do_test(int);
41
42 const char *
43 strusage( int level )
44 {
45     const char *p;
46     switch( level ) {
47       case 10:
48       case 0:   p = "g10 - v" VERSION "; "
49                     "Copyright 1997 Werner Koch (dd9jn)\n" ; break;
50       case 13:  p = "g10"; break;
51       case 14:  p = VERSION; break;
52       case 1:
53       case 11:  p = "Usage: g10 [options] [files] (-h for help)";
54                 break;
55       case 2:
56       case 12:  p =
57     "Syntax: g10 [options] [files]\n"
58     "sign, check, encrypt or decrypt\n"
59     "default operation depends on the input data\n"; break;
60
61       case 26:
62         p = "Please report bugs to <g10-bugs@isil.d.shuttle.de>.\n";
63         break;
64
65       case 30: p = ""
66   #ifndef HAVE_ZLIB_H
67     "   NOTE: This version is compiled without ZLIB support;\n"
68     "         you are not able to process compresssed data!\n"
69   #endif
70   #ifdef HAVE_RSA_CIPHER
71     "WARNING: This version has RSA support! Your are not allowed to\n"
72     "         use it inside the Unites States before Sep 30, 2000!\n"
73   #endif
74         ;
75         break;
76       default:  p = default_strusage(level);
77     }
78     return p;
79 }
80
81 static void
82 set_debug(void)
83 {
84     if( opt.debug & DBG_MEMORY_VALUE )
85         memory_debug_mode = 1;
86     if( opt.debug & DBG_MEMSTAT_VALUE )
87         memory_stat_debug_mode = 1;
88     if( opt.debug & DBG_MPI_VALUE )
89         mpi_debug_mode = 1;
90     if( opt.debug & DBG_CIPHER_VALUE )
91         cipher_debug_mode = 1;
92     if( opt.debug & DBG_IOBUF_VALUE )
93         iobuf_debug_mode = 1;
94 }
95
96
97
98 int
99 main( int argc, char **argv )
100 {
101     static ARGPARSE_OPTS opts[] = {
102     { 'a', "armor",     0, "create ascii armored output"},
103     { 'v', "verbose",   0, "verbose" },
104     { 'z', NULL,        1, "set compress level (0 disables)" },
105     { 'n', "dry-run",   0, "don't make any changes" },
106     { 'c', "symmetric", 0, "do only a symmetric encryption" },
107     { 'o', "output",    2, "use as output file" },
108     { 500, "batch",     0, "batch mode: never ask" },
109     { 501, "yes",       0, "assume yes on most questions"},
110     { 502, "no",        0, "assume no on most questions"},
111     { 503, "gen-key",   0, "generate a new key pair" },
112     { 504, "add-key",   0, "add key to the public keyring" },
113     { 505, "delete-key",0, "remove key from public keyring" },
114     { 506, "sign-key"  ,0, "make a signature on a key in the keyring" },
115     { 507, "store",     0, "store only" },
116     { 508, "check-key" ,0, "check signatures on a key in the keyring" },
117     { 509, "keyring"   ,2, "add this keyring to the list of keyrings" },
118     { 's', "sign",      0, "make a signature"},
119     { 't', "textmode",  0, "use canonical text mode"},
120     { 'b', "detach-sign", 0, "make a detached signature"},
121     { 'e', "encrypt",   0, "encrypt data" },
122     { 'd', "decrypt",   0, "decrypt data (default)" },
123   /*{ 'c', "check",     0, "check a signature (default)" }, */
124     { 'u', "local-user",2, "use this user-id to sign or decrypt" },
125     { 'r', "remote-user", 2, "use this user-id for encryption" },
126     { 510, "debug"     ,4|16, "set debugging flags" },
127     { 511, "debug-all" ,0, "enable full debugging"},
128     { 512, "cache-all" ,0, "hold everything in memory"},
129     { 513, "gen-prime" , 0, "\r" },
130     { 514, "test"      , 0, "\r" },
131     { 515, "change-passphrase", 0, "change the passphrase of your secret keyring"},
132     { 515, "fingerprint", 0, "show the fingerprints"},
133     { 516, "print-mds" , 0, "print all message digests"},
134     { 517, "secret-keyring" ,2, "add this secret keyring to the list" },
135     { 518, "options"   , 2, "read options from file" },
136     { 519, "no-armor",   0, "\r"},
137     { 520, "no-default-keyring", 0, "\r" },
138     { 521, "list-packets",0,"list only the sequence of packets"},
139     { 522, "no-greeting", 0, "\r" },
140     { 523, "passphrase-fd",1, "\r" },
141     { 524, "edit-sig"  ,0, "edit a key signature" },
142
143     {0} };
144     ARGPARSE_ARGS pargs;
145     IOBUF a;
146     int rc;
147     enum { aNull, aSym, aStore, aEncr, aPrimegen, aKeygen, aSign, aSignEncr,
148            aTest, aPrintMDs, aSignKey, aClearsig, aListPackets, aEditSig,
149     } action = aNull;
150     int orig_argc;
151     char **orig_argv;
152     const char *fname, *fname_print;
153     STRLIST sl, remusr= NULL, locusr=NULL;
154     int nrings=0, sec_nrings=0;
155     armor_filter_context_t afx;
156     const char *s;
157     int detached_sig = 0;
158     FILE *configfp = NULL;
159     char *configname = NULL;
160     unsigned configlineno;
161     int parse_verbose = 0;
162     int default_config =1;
163     int errors=0;
164     int default_keyring = 1;
165     int greeting = 1;
166
167
168     opt.compress = -1; /* defaults to standard compress level */
169
170     /* check wether we have a config file on the commandline */
171     orig_argc = argc;
172     orig_argv = argv;
173     pargs.argc = &argc;
174     pargs.argv = &argv;
175     pargs.flags=  1;  /* do not remove the args */
176     while( arg_parse( &pargs, opts) ) {
177         if( pargs.r_opt == 'v' )
178             parse_verbose++;
179         else if( pargs.r_opt == 518 ) {
180             /* yes there is one, so we do not try the default one, but
181              * read the option file when it is encountered at the commandline
182              */
183             default_config = 0;
184         }
185     }
186
187     if( default_config )
188         configname = make_filename("~/.g10", "options", NULL );
189
190     argc = orig_argc;
191     argv = orig_argv;
192     pargs.argc = &argc;
193     pargs.argv = &argv;
194     pargs.flags=  1;  /* do not remove the args */
195   next_pass:
196     if( configname ) {
197         configlineno = 0;
198         configfp = fopen( configname, "r" );
199         if( !configfp ) {
200             if( default_config ) {
201                 if( parse_verbose > 1 )
202                 log_info("note: no default option file '%s'\n", configname );
203             }
204             else
205                 log_fatal("option file '%s': %s\n",
206                                     configname, strerror(errno) );
207             m_free(configname); configname = NULL;
208         }
209         if( parse_verbose > 1 )
210             log_info("reading options from '%s'\n", configname );
211         default_config = 0;
212     }
213
214     while( optfile_parse( configfp, configname, &configlineno,
215                                                 &pargs, opts) ) {
216         switch( pargs.r_opt ) {
217           case 'v': opt.verbose++;
218                     opt.list_sigs=1;
219                     break;
220           case 'z': opt.compress = pargs.r.ret_int; break;
221           case 'a': opt.armor = 1; opt.no_armor=0; break;
222           case 'c': action = aSym; break;
223           case 'o': opt.outfile = pargs.r.ret_str; break;
224           case 'e': action = action == aSign? aSignEncr : aEncr; break;
225           case 'b': detached_sig = 1;
226                /* fall trough */
227           case 's': action = action == aEncr? aSignEncr : aSign;  break;
228           case 't': action = aClearsig;  break;
229           case 'u': /* store the local users */
230             sl = m_alloc( sizeof *sl + strlen(pargs.r.ret_str));
231             strcpy(sl->d, pargs.r.ret_str);
232             sl->next = locusr;
233             locusr = sl;
234             break;
235           case 'r': /* store the remote users */
236             sl = m_alloc( sizeof *sl + strlen(pargs.r.ret_str));
237             strcpy(sl->d, pargs.r.ret_str);
238             sl->next = remusr;
239             remusr = sl;
240             break;
241           case 500: opt.batch = 1; greeting = 0; break;
242           case 501: opt.answer_yes = 1; break;
243           case 502: opt.answer_no = 1; break;
244           case 503: action = aKeygen; break;
245           case 506: action = aSignKey; break;
246           case 507: action = aStore; break;
247           case 508: opt.check_sigs = 1; opt.list_sigs = 1; break;
248           case 509: add_keyring(pargs.r.ret_str); nrings++; break;
249           case 510: opt.debug |= pargs.r.ret_ulong; break;
250           case 511: opt.debug = ~0; break;
251           case 512: opt.cache_all = 1; break;
252           case 513: action = aPrimegen; break;
253           case 514: action = aTest; break;
254           case 515: opt.fingerprint = 1; break;
255           case 516: action = aPrintMDs; break;
256           case 517: add_secret_keyring(pargs.r.ret_str); sec_nrings++; break;
257           case 518:
258             /* config files may not be nested (silently ignore them) */
259             if( !configfp ) {
260                 m_free(configname);
261                 configname = m_strdup(pargs.r.ret_str);
262                 goto next_pass;
263             }
264             break;
265           case 519: opt.no_armor=1; opt.armor=0; break;
266           case 520: default_keyring = 0; break;
267           case 521: action = aListPackets; break;
268           case 522: greeting = 0; break;
269           case 523: set_passphrase_fd( pargs.r.ret_int ); break;
270           case 524: action = aEditSig; break;
271           default : errors++; pargs.err = configfp? 1:2; break;
272         }
273     }
274     if( configfp ) {
275         fclose( configfp );
276         configfp = NULL;
277         m_free(configname); configname = NULL;
278         goto next_pass;
279     }
280     m_free( configname ); configname = NULL;
281     if( errors )
282         exit(2);
283
284     set_debug();
285     if( opt.verbose > 1 )
286         set_packet_list_mode(1);
287     if( greeting ) {
288         if( *(s=strusage(10))  )
289             tty_printf("%s", s);
290         if( *(s=strusage(30))  )
291             tty_printf("%s", s);
292     }
293
294     if( !sec_nrings || default_keyring ) { /* add default secret rings */
295         char *p = make_filename("~/.g10", "secring.g10", NULL );
296         add_secret_keyring(p);
297         m_free(p);
298     }
299     if( !nrings || default_keyring ) { /* add default ring */
300         char *p = make_filename("~/.g10", "pubring.g10", NULL );
301         add_keyring(p);
302         m_free(p);
303     }
304
305     if( argc ) {
306         fname_print = fname = *argv;
307     }
308     else {
309         fname_print = "[stdin]";
310         fname = NULL;
311     }
312
313     switch( action ) {
314       case aStore: /* only store the file */
315         if( argc > 1 )
316             usage(1);
317         if( (rc = encode_store(fname)) )
318             log_error("encode_store('%s'): %s\n",
319                                     fname_print, g10_errstr(rc) );
320         break;
321
322       case aSym: /* encrypt the given file only with the symmetric cipher */
323         if( argc > 1 )
324             usage(1);
325         if( (rc = encode_symmetric(fname)) )
326             log_error("encode_symmetric('%s'): %s\n", fname_print, g10_errstr(rc) );
327         break;
328
329       case aEncr: /* encrypt the given file */
330         if( argc > 1 )
331             usage(1);
332         if( (rc = encode_crypt(fname,remusr)) )
333             log_error("encode_crypt('%s'): %s\n", fname_print, g10_errstr(rc) );
334         break;
335
336       case aSign: /* sign the given file */
337         if( argc > 1 )
338             usage(1);
339         if( (rc = sign_file(fname, detached_sig, locusr, 0, NULL)) )
340             log_error("sign_file('%s'): %s\n", fname_print, g10_errstr(rc) );
341         break;
342
343       case aSignEncr: /* sign and encrypt the given file */
344         if( argc > 1 )
345             usage(1);
346         if( (rc = sign_file(fname, detached_sig, locusr, 1, remusr)) )
347             log_error("sign_file('%s'): %s\n", fname_print, g10_errstr(rc) );
348         break;
349
350
351       case aSignKey: /* sign the key given as argument */
352         if( argc != 1 )
353             usage(1);
354         /* note: fname is the user id! */
355         if( (rc = sign_key(fname, locusr)) )
356             log_error("sign_key('%s'): %s\n", fname_print, g10_errstr(rc) );
357         break;
358
359       case aEditSig: /* Edit a key signature */
360         if( argc != 1 )
361             usage(1);
362         /* note: fname is the user id! */
363         if( (rc = edit_keysigs(fname)) )
364             log_error("edit_keysig('%s'): %s\n", fname_print, g10_errstr(rc) );
365         break;
366
367
368       case aPrimegen:
369         if( argc == 1 ) {
370             mpi_print( stdout, generate_public_prime( atoi(argv[0]) ), 1);
371             putchar('\n');
372         }
373         else if( argc == 2 ) {
374             mpi_print( stdout, generate_elg_prime( atoi(argv[0]),
375                                                    atoi(argv[1]), NULL ), 1);
376             putchar('\n');
377         }
378         else if( argc == 3 ) {
379             MPI g = mpi_alloc(1);
380             mpi_print( stdout, generate_elg_prime( atoi(argv[0]),
381                                                    atoi(argv[1]), g ), 1);
382             printf("\nGenerator: ");
383             mpi_print( stdout, g, 1 );
384             putchar('\n');
385             mpi_free(g);
386         }
387         else
388             usage(1);
389         break;
390
391       case aPrintMDs:
392         if( !argc )
393             print_mds(NULL);
394         else {
395             for(; argc; argc--, argv++ )
396                 print_mds(*argv);
397         }
398         break;
399
400       case aKeygen: /* generate a key (interactive) */
401         if( argc )
402             usage(1);
403         generate_keypair();
404         break;
405
406       case aTest: do_test( argc? atoi(*argv): 0 ); break;
407
408       case aListPackets:
409         opt.list_packets=1;
410       default:
411         if( argc > 1 )
412             usage(1);
413         if( !(a = iobuf_open(fname)) )
414             log_fatal("can't open '%s'\n", fname_print);
415         if( !opt.no_armor ) {
416             /* push the armor filter, so it can peek at the input data */
417             memset( &afx, 0, sizeof afx);
418             iobuf_push_filter( a, armor_filter, &afx );
419         }
420         if( action == aListPackets ) {
421             set_packet_list_mode(1);
422             opt.list_packets=1;
423         }
424         proc_packets( a );
425         iobuf_close(a);
426         break;
427     }
428
429     /* cleanup */
430     FREE_STRLIST(remusr);
431     FREE_STRLIST(locusr);
432     return log_get_errorcount(0)? 2:0;
433 }
434
435
436 static void
437 print_hex( byte *p, size_t n )
438 {
439     int i;
440
441     if( n == 20 ) {
442         for(i=0; i < n ; i++, i++, p += 2 ) {
443             if( i == 10 )
444                 putchar(' ');
445             printf(" %02X%02X", *p, p[1] );
446         }
447     }
448     else {
449         for(i=0; i < n ; i++, p++ ) {
450             if( i && !(i%8) )
451                 putchar(' ');
452             printf(" %02X", *p );
453         }
454     }
455 }
456
457 static void
458 print_mds( const char *fname )
459 {
460     FILE *fp;
461     char buf[1024];
462     size_t n;
463     MD5HANDLE md5;
464     RMDHANDLE rmd160;
465     SHA1HANDLE sha1;
466
467     if( !fname ) {
468         fp = stdin;
469         fname = "[stdin]";
470     }
471     else
472         fp = fopen( fname, "rb" );
473     if( !fp ) {
474         log_error("%s: %s\n", fname, strerror(errno) );
475         return;
476     }
477
478     md5    = md5_open(0);
479     rmd160 = rmd160_open(0);
480     sha1   = sha1_open(0);
481
482     while( (n=fread( buf, 1, DIM(buf), fp )) ) {
483         md5_write( md5, buf, n );
484         rmd160_write( rmd160, buf, n );
485         sha1_write( sha1, buf, n );
486     }
487     if( ferror(fp) )
488         log_error("%s: %s\n", fname, strerror(errno) );
489     else {
490         byte *p;
491
492         md5_final(md5);
493         printf(  "%s:    MD5 =", fname ); print_hex(md5_read(md5), 16 );
494         printf("\n%s: RMD160 =", fname ); print_hex(rmd160_final(rmd160), 20 );
495         printf("\n%s:   SHA1 =", fname ); print_hex(sha1_final(sha1), 20 );
496         putchar('\n');
497     }
498
499
500     md5_close(md5);
501     rmd160_close(rmd160);
502     sha1_close(sha1);
503
504     if( fp != stdin )
505         fclose(fp);
506 }
507
508
509
510 static void
511 do_test(int times)
512 {
513   #if 0
514     MPI t = mpi_alloc( 50 );
515     MPI m = mpi_alloc( 50 );
516     MPI a = mpi_alloc( 50 );
517     MPI b = mpi_alloc( 50 );
518     MPI p = mpi_alloc( 50 );
519     MPI x = mpi_alloc( 50 );
520
521     /* output = b/(a^x) mod p */
522     log_debug("invm %d times ", times);
523     for( ; times > 0; times -- ) {
524         mpi_fromstr(a, "0xef45678343589854354a4545545454554545455"
525                        "aaaaaaaaaaaaa44444fffdecb33434343443331" );
526         mpi_fromstr(b, "0x8765765589854354a4545545454554545455"
527                        "aaaaaaa466577778decb36666343443331" );
528         mpi_invm( t, a, b );
529         fputc('.', stderr); fflush(stderr);
530     }
531
532
533     m_check(NULL);
534   #endif
535 }
536