/* 
   http://ardoino.altervista.org/crypto-security/articles/openssl_all
   Simple RSA Key generator. Saves keys in PEM format.
   Coded by binduck - <binduck@coder.hu>
   Compile: gcc -lssl keygen.c -o keygen
   Usage: ./keygen <numbits>
   Ex. ./keygen 1024

*/

#include <stdio.h>
#include <openssl/err.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#define SECFILE "sec.pem"
#define PUBFILE "pub.pem"
int main(int argc, char *argv[])
{
 RSA *key;
 FILE *fp;
 int keylen=0;
 if(argc!=2)
 {
  fprintf(stderr,"Error: too many/few arguments.\n "
  "Usage: %s <numbits>\n",argv[0]);
  exit(0);
 }
 keylen = atoi(argv[1]);
 if((key = RSA_generate_key(keylen,3,NULL,NULL)) == NULL)
 {
  fprintf(stderr,"%s\n",ERR_error_string(ERR_get_error(),NULL));
  exit(-1);
 }
 if(RSA_check_key(key) < 1)
 {
 fprintf(stderr,"Error: Problems while generating RSA Key.\nRetry.\n");
 exit(-1);
 }
 fp=fopen(SECFILE,"w");
 if(PEM_write_RSAPrivateKey(fp,key,NULL,NULL,0,0,NULL) == 0)
 {
  fprintf(stderr,"Error: problems while writing RSA Private Key.\n");
  exit(-1);
 }
 fclose(fp);
 fp=fopen(PUBFILE,"w");
 if(PEM_write_RSAPublicKey(fp,key) == 0)
 {
  fprintf(stderr,"Error: problems while writing RSA Public Key.\n");
  exit(-1);
 }
 fclose(fp);
 RSA_free(key);
 printf("RSA key generated.\nLenght = %d bits.\n",keylen);
 return 0;
}