1/*	$NetBSD: entropy_test.c,v 1.2.6.1 2012/06/05 21:15:19 bouyer Exp $	*/
2
3/*
4 * Copyright (C) 2004, 2005, 2007  Internet Systems Consortium, Inc. ("ISC")
5 * Copyright (C) 2000, 2001  Internet Software Consortium.
6 *
7 * Permission to use, copy, modify, and/or distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19
20/* Id: entropy_test.c,v 1.23 2007/06/19 23:46:59 tbox Exp  */
21
22/*! \file */
23
24#include <config.h>
25
26#include <stdio.h>
27#include <stdlib.h>
28
29#include <isc/entropy.h>
30#include <isc/mem.h>
31#include <isc/util.h>
32#include <isc/string.h>
33
34static void
35hex_dump(const char *msg, void *data, unsigned int length) {
36        unsigned int len;
37	unsigned char *base;
38	isc_boolean_t first = ISC_TRUE;
39
40	base = data;
41
42        printf("DUMP of %d bytes:  %s\n\t", length, msg);
43        for (len = 0; len < length; len++) {
44                if (len % 16 == 0 && !first)
45			printf("\n\t");
46                printf("%02x ", base[len]);
47		first = ISC_FALSE;
48        }
49        printf("\n");
50}
51
52static void
53CHECK(const char *msg, isc_result_t result) {
54	if (result != ISC_R_SUCCESS) {
55		printf("FAILURE:  %s:  %s\n", msg, isc_result_totext(result));
56		exit(1);
57	}
58}
59
60int
61main(int argc, char **argv) {
62	isc_mem_t *mctx;
63	unsigned char buffer[512];
64	isc_entropy_t *ent;
65	unsigned int returned;
66	unsigned int flags;
67	isc_result_t result;
68
69	UNUSED(argc);
70	UNUSED(argv);
71
72	mctx = NULL;
73	CHECK("isc_mem_create()",
74	      isc_mem_create(0, 0, &mctx));
75
76	ent = NULL;
77	CHECK("isc_entropy_create()",
78	      isc_entropy_create(mctx, &ent));
79
80	isc_entropy_stats(ent, stderr);
81
82#if 1
83	CHECK("isc_entropy_createfilesource() 1",
84	      isc_entropy_createfilesource(ent, "/dev/random"));
85	CHECK("isc_entropy_createfilesource() 2",
86	      isc_entropy_createfilesource(ent, "/dev/random"));
87#else
88	CHECK("isc_entropy_createfilesource() 3",
89	      isc_entropy_createfilesource(ent, "/tmp/foo"));
90#endif
91
92	fprintf(stderr,
93		"Reading 32 bytes of GOOD random data only, partial OK\n");
94
95	flags = 0;
96	flags |= ISC_ENTROPY_GOODONLY;
97	flags |= ISC_ENTROPY_PARTIAL;
98	result = isc_entropy_getdata(ent, buffer, 32, &returned, flags);
99	if (result == ISC_R_NOENTROPY) {
100		fprintf(stderr, "No entropy.\n");
101		goto any;
102	}
103	hex_dump("good data only:", buffer, returned);
104
105 any:
106	isc_entropy_stats(ent, stderr);
107	CHECK("isc_entropy_getdata() pseudorandom",
108	      isc_entropy_getdata(ent, buffer, 128, NULL, 0));
109	hex_dump("pseudorandom data", buffer, 128);
110
111	isc_entropy_stats(ent, stderr);
112	flags = 0;
113	flags |= ISC_ENTROPY_GOODONLY;
114	flags |= ISC_ENTROPY_BLOCKING;
115	result = isc_entropy_getdata(ent, buffer, sizeof(buffer), &returned,
116				     flags);
117	CHECK("good data only, blocking mode", result);
118	hex_dump("blocking mode data", buffer, sizeof(buffer));
119
120	{
121		isc_entropy_t *entcopy1 = NULL;
122		isc_entropy_t *entcopy2 = NULL;
123		isc_entropy_t *entcopy3 = NULL;
124
125		isc_entropy_attach(ent, &entcopy1);
126		isc_entropy_attach(ent, &entcopy2);
127		isc_entropy_attach(ent, &entcopy3);
128
129		isc_entropy_stats(ent, stderr);
130
131		isc_entropy_detach(&entcopy1);
132		isc_entropy_detach(&entcopy2);
133		isc_entropy_detach(&entcopy3);
134	}
135
136	isc_entropy_detach(&ent);
137	isc_mem_stats(mctx, stderr);
138	isc_mem_destroy(&mctx);
139
140	return (0);
141}
142
143