aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2025-03-14 12:03:46 +0000
committerWerner Koch <[email protected]>2025-03-14 12:08:37 +0000
commit926b1f1f1e3e382f08cc57fc86d5892649514007 (patch)
treeddc1bab10152c7de64a9c4167620f0683eac4a7f /tests
parentm4: Update libassuan.m4. (diff)
downloadgpgme-926b1f1f1e3e382f08cc57fc86d5892649514007.tar.gz
gpgme-926b1f1f1e3e382f08cc57fc86d5892649514007.zip
Add API gpgme_op_random_value.
* src/genrandom.c (getrandom_size_t): New. (gpgme_op_random_value): New. * src/gpgme.def: Add new function. * src/libgpgme.vers: Ditto. * src/gpgme.h.in: Add prototype. * tests/run-genrandom.c: Add an option to use the new function. -- The implementation is not optimized but sufficient for our use case. Possible improvements for this and gpgme_op_random_bytes are a cache for random bytes in the context so that we do not need to get out to gpgme for just a few random bytes. GnuPG-bug-id: 6694
Diffstat (limited to 'tests')
-rw-r--r--tests/run-genrandom.c83
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);