112 lines
2.8 KiB
C
112 lines
2.8 KiB
C
/*
|
|
genauth.c -- generate public/private keypairs
|
|
Copyright (C) 1998,1999,2000 Ivo Timmermans <zarq@iname.com>
|
|
2000 Guus Sliepen <guus@sliepen.warande.net>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
$Id: genauth.c,v 1.7.4.3 2000/10/19 14:42:00 guus Exp $
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <openssl/rsa.h>
|
|
#include <openssl/rand.h>
|
|
|
|
#include <xalloc.h>
|
|
|
|
#include "system.h"
|
|
|
|
#define RSA_PUBLIC_EXPONENT 65535
|
|
|
|
void indicator(int a, int b, void *p)
|
|
{
|
|
switch(a)
|
|
{
|
|
case 0:
|
|
fprintf(stderr, ".");
|
|
break;
|
|
case 1:
|
|
fprintf(stderr, "+");
|
|
break;
|
|
case 2:
|
|
fprintf(stderr, "-");
|
|
break;
|
|
case 3:
|
|
switch(b)
|
|
{
|
|
case 0:
|
|
fprintf(stderr, " p\n");
|
|
break;
|
|
case 1:
|
|
fprintf(stderr, " q\n");
|
|
break;
|
|
default:
|
|
fprintf(stderr, "?");
|
|
}
|
|
break;
|
|
default:
|
|
fprintf(stderr, "?");
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int bits;
|
|
RSA *key;
|
|
|
|
setlocale (LC_ALL, "");
|
|
bindtextdomain (PACKAGE, LOCALEDIR);
|
|
textdomain (PACKAGE);
|
|
|
|
if(argc > 2 || (argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))))
|
|
{
|
|
fprintf(stderr, _("Usage: %s bits\n"), argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
if(!argv[1])
|
|
argv[1] = "1024";
|
|
|
|
bits = atol(argv[1]);
|
|
|
|
if(bits<32)
|
|
{
|
|
fprintf(stderr, _("Illegal number: %s\n"), argv[1]);
|
|
return 1;
|
|
}
|
|
|
|
bits = ((bits - 1) | 7) + 1; /* Align to bytes for easy mallocing and reading */
|
|
|
|
fprintf(stderr, _("Seeding the PRNG: please press some keys or move\nthe mouse if this program seems to have halted...\n"));
|
|
|
|
RAND_load_file("/dev/random", 1024); /* OpenSSL PRNG state apparently uses 1024 bytes */
|
|
|
|
fprintf(stderr, _("Generating %d bits keys:\n"), bits);
|
|
|
|
key = RSA_generate_key(bits, RSA_PUBLIC_EXPONENT, indicator, NULL);
|
|
|
|
fprintf(stderr, _("Done.\n"));
|
|
|
|
printf(_("Public key: %s\n"), BN_bn2hex(key->n));
|
|
printf(_("Private key: %s\n"), BN_bn2hex(key->d));
|
|
|
|
fflush(stdin); /* Flush any input caused by random keypresses */
|
|
|
|
return 0;
|
|
}
|