From b0ce623f7715cee2fe3cabb3a590572c70c39944 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 25 Sep 2012 18:10:00 +0000 Subject: turn gnunet-rsa into key generation tool --- doc/man/gnunet-rsa.1 | 3 +++ src/util/gnunet-rsa.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/doc/man/gnunet-rsa.1 b/doc/man/gnunet-rsa.1 index 46f24de1c..c61bc1fd3 100644 --- a/doc/man/gnunet-rsa.1 +++ b/doc/man/gnunet-rsa.1 @@ -13,6 +13,9 @@ gnunet\-rsa \- manipulate GNUnet RSA key files .SH OPTIONS .B +.IP "\-g COUNT, \-\-generate-keys=COUNT" +Create COUNT public-private key pairs and write them to FILENAME. Used for creating a file for testing. +.B .IP "\-p, \-\-print-public-key" Print the corresponding public key to stdout. .B diff --git a/src/util/gnunet-rsa.c b/src/util/gnunet-rsa.c index e9fbf15df..69b500100 100644 --- a/src/util/gnunet-rsa.c +++ b/src/util/gnunet-rsa.c @@ -48,6 +48,10 @@ static int print_short_identity; */ static int weak_random; +/** + * Option set to create a bunch of keys at once. + */ +static unsigned int make_keys; /** * The private information of an RSA key pair. @@ -88,6 +92,59 @@ GNUNET_CRYPTO_rsa_key_create () #endif +/** + * Create a flat file with a large number of key pairs for testing. + */ +static void +create_keys (const char *fn) +{ + time_t start; + struct GNUNET_HashCode hc; + struct GNUNET_HashCode h2; + struct GNUNET_HashCode h3; + FILE *f; + struct GNUNET_CRYPTO_RsaPrivateKey *pk; + struct GNUNET_CRYPTO_RsaPrivateKeyBinaryEncoded *enc; + + start = time (NULL); + GNUNET_CRYPTO_hash (&start, sizeof (start), &hc); + if (NULL == (f = fopen (fn, "w+"))) + { + fprintf (stderr, + _("Failed to open `%s': %s\n"), + fn, + STRERROR (errno)); + return; + } + fprintf (stderr, + _("Generating %u keys, please wait"), + make_keys); + while (0 < make_keys--) + { + fprintf (stderr, + "."); + GNUNET_CRYPTO_hash (&make_keys, sizeof (make_keys), &h2); + GNUNET_CRYPTO_hash (&hc, sizeof (hc), &h3); + GNUNET_CRYPTO_hash_xor (&h2, &h3, &hc); + pk = GNUNET_CRYPTO_rsa_key_create_from_hash (&hc); + enc = GNUNET_CRYPTO_rsa_encode_key (pk); + if (htons (enc->len) != fwrite (enc, 1, htons (enc->len), f)) + { + fprintf (stderr, + _("\nFailed to write to `%s': %s\n"), + fn, + STRERROR (errno)); + break; + } + GNUNET_CRYPTO_rsa_key_free (pk); + } + if (0 == make_keys) + fprintf (stderr, + _("Finished!\n")); + fclose (f); +} + + /** * Main function that will be run by the scheduler. * @@ -111,6 +168,11 @@ run (void *cls, char *const *args, const char *cfgfile, } if (0 != weak_random) GNUNET_CRYPTO_random_disable_entropy_gathering (); + if (make_keys > 0) + { + create_keys (args[0]); + return; + } pk = GNUNET_CRYPTO_rsa_key_create_from_file (args[0]); if (NULL == pk) return; @@ -157,6 +219,9 @@ int main (int argc, char *const *argv) { static const struct GNUNET_GETOPT_CommandLineOption options[] = { + { 'g', "generate-keys", "COUNT", + gettext_noop ("create COUNT public-private key pairs (for testing)"), + 1, &GNUNET_GETOPT_set_uint, &make_keys }, { 'p', "print-public-key", NULL, gettext_noop ("print the public key in ASCII format"), 0, &GNUNET_GETOPT_set_one, &print_public_key }, -- cgit v1.2.3