From a9a02abb22f435bc037fd01dd5194ea2ab671a97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Wed, 10 Oct 2001 18:16:19 +0200 Subject: [PATCH] * testsuite/yarrow-test.c: Open rfc1750.txt. Hash input and output, and compare to expected values. Rev: src/nettle/testsuite/yarrow-test.c:1.3 --- testsuite/yarrow-test.c | 125 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 113 insertions(+), 12 deletions(-) diff --git a/testsuite/yarrow-test.c b/testsuite/yarrow-test.c index aff530eb..536aa3ae 100644 --- a/testsuite/yarrow-test.c +++ b/testsuite/yarrow-test.c @@ -1,10 +1,13 @@ #include "yarrow.h" #include "macros.h" +#include "testutils.h" #include <assert.h> +#include <errno.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> /* Lagged fibonacci sequence as described in Knuth 3.6 */ @@ -108,14 +111,19 @@ ran_test(void) } static int -get_event(unsigned *key, unsigned *time) +get_event(FILE *f, struct sha1_ctx *hash, + unsigned *key, unsigned *time) { static int t = 0; + uint8_t buf[1]; - int c = getchar(); + int c = getc(f); if (c == EOF) return 0; + buf[0] = c; + sha1_update(hash, sizeof(buf), buf); + *key = c; t += (ran_get() % 10000); @@ -124,21 +132,70 @@ get_event(unsigned *key, unsigned *time) return 1; } +static void +print_digest(uint8_t *digest) +{ + unsigned i; + + for (i = 0; i < SHA1_DIGEST_SIZE; i++) + { + if (! (i % 8)) + fprintf(stderr, " "); + fprintf(stderr, "%02x", digest[i]); + } +} + +static FILE * +open_file(const char *name) +{ + /* Tries opening the file in $srcdir, if set, otherwise the current + * working directory */ + + const char *srcdir = getenv("srcdir"); + if (srcdir && srcdir[0]) + { + char *buf = alloca(strlen(name) + strlen(srcdir) + 10); + sprintf(buf, "%s/%s", srcdir, name); + name = buf; + } + + /* Opens the file in text mode. */ + return fopen(name, "r"); +} + int main(int argc, char **argv) { + FILE *input; + struct yarrow256_ctx yarrow; struct yarrow_key_event_ctx estimator; struct yarrow_source sources[2]; + struct sha1_ctx output_hash; + struct sha1_ctx input_hash; + uint8_t digest[SHA1_DIGEST_SIZE]; + + const uint8_t *expected_output + = decode_hex_dup("0904a172950c7dc4 de5c788eaff58bfc 7def9039"); + + const uint8_t *expected_input + = decode_hex_dup("ca606b728892452b 7d6868d34a9743b9 16750284"); + unsigned c; unsigned t; - unsigned processed; + unsigned processed = 0; + unsigned output = 0; + + unsigned i; + static const char zeroes[100]; yarrow256_init(&yarrow, 2, sources); yarrow_key_event_init(&estimator); + sha1_init(&input_hash); + sha1_init(&output_hash); ran_test(); @@ -150,9 +207,18 @@ main(int argc, char **argv) fprintf(stderr, "source 0 entropy: %d\n", sources[0].estimate[YARROW_SLOW]); - fprintf(stderr, "seeded: %s\n", yarrow.seeded ? "yes": "no"); + assert(!yarrow.seeded); + + input = open_file("rfc1750.txt"); + + if (!input) + { + fprintf(stderr, "Couldn't open `rfc1750.txt', errno = %d\n", + errno); + return EXIT_FAILURE; + } - while (get_event(&c, &t)) + while (get_event(input, &input_hash, &c, &t)) { uint8_t buf[8]; @@ -170,23 +236,58 @@ main(int argc, char **argv) unsigned size = sizes[processed % 4]; uint8_t buf[500]; + + if (!output) + fprintf(stderr, "Generator was seeded after %d events\n", + processed); + yarrow256_random(&yarrow, size, buf); + sha1_update(&output_hash, size, buf); + fprintf(stderr, "%02x ", buf[0]); if (! (processed % 16)) fprintf(stderr, "\n"); + + output += size; } } - fprintf(stderr, "\n\nseeded: %s\n", yarrow.seeded ? "yes": "no"); + for (i = 0; i<2; i++) + fprintf(stderr, "source %d, (fast, slow) entropy: (%d, %d)\n", + i, + sources[i].estimate[YARROW_FAST], + sources[i].estimate[YARROW_SLOW]); + + fprintf(stderr, "Processed input: %d octets\n", processed); + fprintf(stderr, " sha1:"); + + sha1_final(&input_hash); + sha1_digest(&input_hash, sizeof(digest), digest); + + print_digest(digest); + fprintf(stderr, "\n"); + + if (memcmp(digest, expected_input, sizeof(digest))) + { + fprintf(stderr, "Failed.\n"); + return EXIT_FAILURE; + } + + fprintf(stderr, "Generated output: %d octets\n", output); + fprintf(stderr, " sha1:"); - fprintf(stderr, "source 0, (fast, slow) entropy: (%d, %d)\n", - sources[0].estimate[YARROW_FAST], - sources[0].estimate[YARROW_SLOW]); + sha1_final(&output_hash); + sha1_digest(&output_hash, sizeof(digest), digest); - fprintf(stderr, "source 1, (fast, slow) entropy: (%d, %d)\n", - sources[1].estimate[YARROW_FAST], - sources[1].estimate[YARROW_SLOW]); + print_digest(digest); + fprintf(stderr, "\n"); + if (memcmp(digest, expected_output, sizeof(digest))) + { + fprintf(stderr, "Failed.\n"); + return EXIT_FAILURE; + } + return EXIT_SUCCESS; } -- GitLab