/* -*-c-*-
*
- * $Id: rspit.c,v 1.9 2000/08/04 23:24:15 mdw Exp $
+ * $Id: rspit.c,v 1.14 2001/02/21 20:03:22 mdw Exp $
*
* Spit out random numbers
*
/*----- Revision history --------------------------------------------------*
*
* $Log: rspit.c,v $
+ * Revision 1.14 2001/02/21 20:03:22 mdw
+ * Added support for MD2 hash function.
+ *
+ * Revision 1.13 2000/12/06 20:33:27 mdw
+ * Make flags be macros rather than enumerations, to ensure that they're
+ * unsigned.
+ *
+ * Revision 1.12 2000/10/08 15:49:18 mdw
+ * Remove failed kludge for shutting up a warning.
+ *
+ * Revision 1.11 2000/10/08 12:10:32 mdw
+ * Make table have external linkage to bodge around deficiency in C. The
+ * problem is that @static gen generators[];@ is considered to be a
+ * `tentative definition', and therefore mustn't have incomplete type,
+ * which it obviously has.
+ *
+ * Revision 1.10 2000/08/11 21:34:59 mdw
+ * New restartable interface to Maurer testing.
+ *
* Revision 1.9 2000/08/04 23:24:15 mdw
* Add a timer and a discard option.
*
#include "square-counter.h"
#include "serpent-counter.h"
+#include "md2-mgf.h"
#include "md4-mgf.h"
#include "md5-mgf.h"
#include "sha-mgf.h"
const char *help;
} gen;
-static gen generators[];
+extern gen generators[];
#define CIPHERS \
E(DES, des) \
E(SERPENT, serpent)
#define HASHES \
+ E(MD2, md2) \
E(MD4, md4) \
E(MD5, md5) \
E(SHA, sha) \
static unsigned flags = 0;
-enum {
- f_progress = 1,
- f_file = 2,
- f_fips = 4,
- f_maurer = 8,
- f_timer = 16,
- f_discard = 32
-};
+#define f_progress 1u
+#define f_file 2u
+#define f_fips 4u
+#define f_maurer 8u
+#define f_timer 16u
+#define f_discard 32u
/*----- Help options ------------------------------------------------------*/
char *p;
unsigned long lo, hi;
lo = strtoul(optarg, &p, 0);
- if (*p == '-')
+ if (*p == '-' || *p == ',')
hi = strtoul(p + 1, &p, 0);
else
hi = lo;
/*----- Generators table --------------------------------------------------*/
-static gen generators[] = {
+gen generators[] = {
{ "fibonacci", gen_fib, 0,
"[-s SEED]" },
{ "lc", gen_lc, 0,
{ #pre "-counter", gen_counter, CIPHER_##PRE, \
"[-k KEY-PHRASE] [-H HEX-KEY] [-i HEX-IV]" },
CIPHERS
-#undef E(PRE, pre)
+#undef E
#define E(PRE, pre) \
{ #pre "-mgf", gen_mgf, HASH_##PRE, \
"[-k KEY-PHRASE] [-H HEX-KEY] [-i INDEX]" },
HASHES
-#undef E(PRE, pre)
+#undef E
{ "rc4", gen_rc4, 0,
"[-k KEY-PHRASE] [-H HEX-KEY]" },
{ "seal", gen_seal, 0,
return (0);
}
+typedef struct genmaurer_ctx {
+ size_t n;
+ maurer_ctx *m;
+} genmaurer_ctx;
+
+static int genmaurer(const void *buf, size_t sz, void *p)
+{
+ genmaurer_ctx *g = p;
+ size_t i;
+
+ for (i = 0; i < g->n; i++)
+ maurer_test(&g->m[i], buf, sz);
+ return (0);
+}
+
static int generate(grand *r, size_t outsz,
int (*func)(const void *buf, size_t sz, void *p),
void *p)
if (flags & f_progress)
fputc('\n', stderr);
if (flags & f_timer) {
- double sec = (double)clk/CLOCKS_PER_SEC;
- double bps = (outsz << 3)/sec;
- char *kk;
-
- for (kk = kmg; bps > 1024 && kk[1]; kk++, bps /= 1024)
- ;
- fprintf(stderr, "generated %lu bytes in %g secs (%g %cb/s)\n",
- (unsigned long)outsz, sec, bps, *kk);
+ fprintf(stderr, "generated %lu bytes ", (unsigned long)outsz);
+ if (!clk)
+ fputs("too quickly to measure\n", stderr);
+ else {
+ char *kk;
+ double sec = (double)clk/CLOCKS_PER_SEC;
+ double bps = (outsz << 3)/sec;
+ for (kk = kmg; bps > 1024 && kk[1]; kk++, bps /= 1024)
+ ;
+ fprintf(stderr, "in %g secs (%g %cb/s)\n", sec, bps, *kk);
+ }
}
return (0);
}
/* --- Do Maurer's test --- */
if (flags & f_maurer) {
- octet *buf;
size_t bufsz;
unsigned i;
unsigned rc = 0;
- unsigned f = 0, jj = 0;
- double maxz = 0;
- octet *p;
+ genmaurer_ctx g;
static struct { double x; const char *sig; } sigtab[] = {
{ 3.2905, "1e-3" },
{ 0 , 0 }
};
+ g.n = maurer_hi - maurer_lo + 1;
+ g.m = xmalloc(g.n * sizeof(maurer_ctx));
+ for (i = 0; i < g.n; i++)
+ maurer_init(&g.m[i], i + maurer_lo);
bufsz = (100 * maurer_hi) << maurer_hi;
- if ((buf = a_alloc(arena_global, bufsz)) == 0)
- die(EXIT_FAILURE, "not enough memory for data buffer");
- p = buf;
- generate(r, bufsz, genbuf, &p);
+
+ generate(r, bufsz, genmaurer, &g);
for (i = maurer_lo; i <= maurer_hi; i++) {
- double z = maurer(buf, bufsz, i);
+ double z = maurer_done(&g.m[i - maurer_lo]);
double zz = fabs(z);
unsigned j;
for (j = 0; sigtab[j].sig; j++) {
if (zz > sigtab[j].x) {
- if (zz > fabs(maxz)) {
- maxz = z;
- f = i;
- jj = j;
- }
rc = EXIT_FAILURE;
moan("failed, bits = %u, sig = %s, Z_u = %g",
i, sigtab[j].sig, z);
fprintf(stderr, "bits = %u, Z_u = %g\n", i, z);
}
+ xfree(g.m);
return (rc);
}