diff options
-rw-r--r-- | keygen.cpp | 50 |
1 files changed, 48 insertions, 2 deletions
@@ -6,6 +6,7 @@ #include "keygen.h" #include "miller_rabin.h" +#define DEBUG /* forward declaration of variables from keygen_args.h */ extern char *pubkey; @@ -60,6 +61,12 @@ int main(int argc, char **argv) /* n = p * q */ unsigned long n = prime_p * prime_q; + if (n <= 127) + { + fprintf(stderr, "p * q needs to be bigger than 127\n"); + exit(EXIT_FAILURE); + } + /* phi = (p-1)(q-1) */ unsigned long phi = (prime_p-1) * (prime_q-1); @@ -67,6 +74,7 @@ int main(int argc, char **argv) unsigned long e; /* find e, 1 < e < phi, such that gcd(e, phi) = 1 */ int i; + fprintf(stdout, "computing e... "); for (i = 0; i < 4; i++) { e = fermat_primes[i]; @@ -78,6 +86,19 @@ int main(int argc, char **argv) fprintf(stderr, "error, could not find e\n"); exit(EXIT_FAILURE); } + fprintf(stdout, "done\n"); + + /* find d */ + unsigned long d = 1; + fprintf(stdout, "computing d... "); + while (1) + { + if ( (e*d - 1) / phi ) + break; + else + d++; + } + fprintf(stdout, "done\n"); #ifdef DEBUG fprintf(stdout, "debug: pubkey = \"%s\"\n" @@ -86,10 +107,35 @@ int main(int argc, char **argv) " q = \"%ld\"\n" " n = \"%lu\"\n" " phi = \"%lu\"\n" - " e = \"%lu\"\n", - pubkey, prikey, prime_p, prime_q, n, phi, e); + " e = \"%lu\"\n" + " d = \"%lu\"\n", + pubkey, prikey, prime_p, prime_q, n, phi, e, d); #endif + /* save to xml files */ + FILE *public_key = fopen(pubkey, "w"); + FILE *private_key = fopen(prikey, "w"); + if (public_key == NULL || private_key == NULL) + { + perror("fopen"); + exit(EXIT_FAILURE); + } + + fprintf(public_key, "<rsakey>\n"); + fprintf(public_key, "\t<evalue>%lu</evalue>\n", e); + fprintf(public_key, "\t<nvalue>%lu</nvalue>\n", n); + fprintf(public_key, "</rsakey>\n"); + fprintf(stdout, "wrote \"%s\" file\n", pubkey); + + fprintf(private_key, "<rsakey>\n"); + fprintf(private_key, "\t<dvalue>%lu</dvalue>\n", d); + fprintf(private_key, "\t<nvalue>%lu</nvalue>\n", n); + fprintf(private_key, "</rsakey>\n"); + fprintf(stdout, "wrote \"%s\" file\n", prikey); + + fclose(public_key); + fclose(private_key); + return 0; } |