diff options
Diffstat (limited to 'tests/run-genrandom.c')
-rw-r--r-- | tests/run-genrandom.c | 83 |
1 files changed, 68 insertions, 15 deletions
diff --git a/tests/run-genrandom.c b/tests/run-genrandom.c index 18b8c7ab..f28ef299 100644 --- a/tests/run-genrandom.c +++ b/tests/run-genrandom.c @@ -28,6 +28,8 @@ #include <stdio.h> #include <string.h> #include <assert.h> +#include <errno.h> +#include <stdint.h> #include <gpgme.h> @@ -42,10 +44,13 @@ static int verbose; static int show_usage (int ex) { - fputs ("usage: " PGM " [options]\n\n" + fputs ("usage: " PGM " [options] [LIMIT]\n\n" "Options:\n" " --verbose run in verbose mode\n" " --zbase32 generate 30 zbase32 characters\n" + " --hex return a hex value in LIMIT mode\n" + "\n" + "With LIMIT return a decimal value in the range [0,LIMIT)\n" , stderr); exit (ex); } @@ -60,6 +65,8 @@ main (int argc, char **argv) gpgme_protocol_t protocol = GPGME_PROTOCOL_OPENPGP; gpgme_random_mode_t mode = 0; char buffer[128]; + int hexmode = 0; + int valuemode = 0; if (argc) @@ -85,11 +92,21 @@ main (int argc, char **argv) mode = GPGME_RANDOM_MODE_ZBASE32; argc--; argv++; } + else if (!strcmp (*argv, "--hex")) + { + hexmode = 1; + argc--; argv++; + } else if (!strncmp (*argv, "--", 2)) show_usage (1); } - if (argc) + if (argc == 1) + valuemode = 1; + else if (argc) + show_usage (1); + + if ((valuemode && mode) || (!valuemode && hexmode)) show_usage (1); init_gpgme (protocol); @@ -98,26 +115,62 @@ main (int argc, char **argv) fail_if_err (err); gpgme_set_protocol (ctx, protocol); - err = gpgme_op_random_bytes (ctx, mode, buffer, sizeof buffer); - if (err) + if (valuemode) { - fprintf (stderr, PGM ": error getting random: %s\n", gpg_strerror (err)); - exit (1); - } + size_t limit, value; + + errno = 0; + limit = strtoul (*argv, NULL, 0); + if (errno) + { + fprintf (stderr, PGM ": error parsing LIMIT arg: %s\n", + strerror (errno)); + exit (1); + } + if (limit > SIZE_MAX) + { + fprintf (stderr, PGM ": error parsing LIMIT arg: %s\n", + "too large for size_t"); + exit (1); + } - if (mode == GPGME_RANDOM_MODE_ZBASE32) - puts (buffer); + err = gpgme_op_random_value (ctx, limit, &value); + if (err) + { + fprintf (stderr, PGM ": error getting random: %s\n", + gpg_strerror (err)); + exit (1); + } + + if (hexmode) + printf ("%zx\n", value); + else + printf ("%zu\n", value); + } else { - int i; + err = gpgme_op_random_bytes (ctx, mode, buffer, sizeof buffer); + if (err) + { + fprintf (stderr, PGM ": error getting random: %s\n", + gpg_strerror (err)); + exit (1); + } - for (i=0; i < sizeof buffer; i++) + if (mode == GPGME_RANDOM_MODE_ZBASE32) + puts (buffer); + else { - if (i && !(i%32)) - putchar ('\n'); - printf ("%02x", ((unsigned char *)buffer)[i]); + int i; + + for (i=0; i < sizeof buffer; i++) + { + if (i && !(i%32)) + putchar ('\n'); + printf ("%02x", ((unsigned char *)buffer)[i]); + } + putchar ('\n'); } - putchar ('\n'); } gpgme_release (ctx); |