a27bd77936bd01eb2a6c8cfc8f663398fad47f2c
[tinc] / src / genauth.c
1 /*
2     genauth.c -- generate public/private keypairs
3     Copyright (C) 1998,1999,2000 Ivo Timmermans <zarq@iname.com>
4                             2000 Guus Sliepen <guus@sliepen.warande.net>
5
6     This program 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     This program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
19
20     $Id: genauth.c,v 1.7.4.2 2000/10/15 00:59:34 guus Exp $
21 */
22
23 #include "config.h"
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <time.h>
28 #include <openssl/rsa.h>
29
30 #include <xalloc.h>
31
32 #include "system.h"
33
34 #define RSA_PUBLIC_EXPONENT 65535
35
36 void indicator(int a, int b, void *p)
37 {
38   switch(a)
39   {
40     case 0:
41       fprintf(stderr, ".");
42       break;
43     case 1:
44       fprintf(stderr, "+");
45       break;
46     case 2:
47       fprintf(stderr, "-");
48       break;
49     case 3:
50       switch(b)
51         {
52           case 0:
53             fprintf(stderr, " p\n");      
54             break;
55           case 1:
56             fprintf(stderr, " q\n");
57             break;
58           default:
59             fprintf(stderr, "?");
60          }
61        break;
62     default:
63       fprintf(stderr, "?");
64   }
65 }
66
67 int main(int argc, char **argv)
68 {
69   int bits;
70   RSA *key;
71
72   setlocale (LC_ALL, "");
73   bindtextdomain (PACKAGE, LOCALEDIR);
74   textdomain (PACKAGE);
75
76   if(argc > 2 || (argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))))
77     {
78       fprintf(stderr, _("Usage: %s bits\n"), argv[0]);
79       return 1;
80     }
81
82   if(!argv[1])
83     argv[1] = "1024";
84     
85   bits = atol(argv[1]);
86
87   if(bits<32)
88     {
89       fprintf(stderr, _("Illegal number: %s\n"), argv[1]);
90       return 1;
91     }
92     
93   bits = ((bits - 1) | 7) + 1;          /* Align to bytes for easy mallocing and reading */
94
95   fprintf(stderr, _("Generating %d bits keys:\n"), bits);
96
97   key = RSA_generate_key(bits, RSA_PUBLIC_EXPONENT, indicator, NULL); 
98
99   fprintf(stderr, _("Done.\n"));
100
101   printf(_("Public key:  %s\n"), BN_bn2hex(key->n));
102   printf(_("Private key: %s\n"), BN_bn2hex(key->d));
103
104   return 0;
105 }
106
107