5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 2000, 2001, 2004, 2005, 2007, 2015, 2016 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff */
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff
70e5a7403f0e0a3bd292b8287c5fed5772c15270Automatic Updater/* $Id: entropy_test.c,v 1.23 2007/06/19 23:46:59 tbox Exp $ */
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*! \file */
ae302c18c296f31c02efb613887f206894caa749David Lawrence
ae302c18c296f31c02efb613887f206894caa749David Lawrence#include <config.h>
ae302c18c296f31c02efb613887f206894caa749David Lawrence
ae302c18c296f31c02efb613887f206894caa749David Lawrence#include <stdio.h>
3c9b0570ed1d506bb0dc02fa5358594b0b57c2b1David Lawrence#include <stdlib.h>
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff#include <isc/entropy.h>
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff#include <isc/mem.h>
3759f10fc543747668b1ca4b4671f35b0dea8445Francis Dupont#include <isc/print.h>
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff#include <isc/string.h>
3759f10fc543747668b1ca4b4671f35b0dea8445Francis Dupont#include <isc/util.h>
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graffstatic void
2124020751154638341dd82e5203315973103901Michael Graffhex_dump(const char *msg, void *data, unsigned int length) {
d70dac20d2b88e48fbf2606180d0ba6dcc4bc44fTinderbox User unsigned int len;
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff unsigned char *base;
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff isc_boolean_t first = ISC_TRUE;
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff base = data;
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff
d70dac20d2b88e48fbf2606180d0ba6dcc4bc44fTinderbox User printf("DUMP of %d bytes: %s\n\t", length, msg);
d70dac20d2b88e48fbf2606180d0ba6dcc4bc44fTinderbox User for (len = 0; len < length; len++) {
d70dac20d2b88e48fbf2606180d0ba6dcc4bc44fTinderbox User if (len % 16 == 0 && !first)
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff printf("\n\t");
d70dac20d2b88e48fbf2606180d0ba6dcc4bc44fTinderbox User printf("%02x ", base[len]);
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff first = ISC_FALSE;
d70dac20d2b88e48fbf2606180d0ba6dcc4bc44fTinderbox User }
d70dac20d2b88e48fbf2606180d0ba6dcc4bc44fTinderbox User printf("\n");
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff}
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graffstatic void
9403a56228ea64101e082720fd276a8bda16cfe1Michael GraffCHECK(const char *msg, isc_result_t result) {
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff if (result != ISC_R_SUCCESS) {
2124020751154638341dd82e5203315973103901Michael Graff printf("FAILURE: %s: %s\n", msg, isc_result_totext(result));
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff exit(1);
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff }
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff}
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graffint
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graffmain(int argc, char **argv) {
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff isc_mem_t *mctx;
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff unsigned char buffer[512];
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff isc_entropy_t *ent;
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff unsigned int returned;
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff unsigned int flags;
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff isc_result_t result;
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff UNUSED(argc);
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff UNUSED(argv);
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff mctx = NULL;
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff CHECK("isc_mem_create()",
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff isc_mem_create(0, 0, &mctx));
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff ent = NULL;
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff CHECK("isc_entropy_create()",
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff isc_entropy_create(mctx, &ent));
9403a56228ea64101e082720fd276a8bda16cfe1Michael Graff
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff isc_entropy_stats(ent, stderr);
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff
2124020751154638341dd82e5203315973103901Michael Graff#if 1
c3581e2bccf659792bf78e0f672b23f9e42dddc5Michael Graff CHECK("isc_entropy_createfilesource() 1",
7685c082c8ac5e01bef287b831ef13ec307119c1Michael Graff isc_entropy_createfilesource(ent, "/dev/random"));
c3581e2bccf659792bf78e0f672b23f9e42dddc5Michael Graff CHECK("isc_entropy_createfilesource() 2",
7685c082c8ac5e01bef287b831ef13ec307119c1Michael Graff isc_entropy_createfilesource(ent, "/dev/random"));
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff#else
c3581e2bccf659792bf78e0f672b23f9e42dddc5Michael Graff CHECK("isc_entropy_createfilesource() 3",
7685c082c8ac5e01bef287b831ef13ec307119c1Michael Graff isc_entropy_createfilesource(ent, "/tmp/foo"));
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff#endif
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff fprintf(stderr,
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff "Reading 32 bytes of GOOD random data only, partial OK\n");
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff flags = 0;
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff flags |= ISC_ENTROPY_GOODONLY;
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff flags |= ISC_ENTROPY_PARTIAL;
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff result = isc_entropy_getdata(ent, buffer, 32, &returned, flags);
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff if (result == ISC_R_NOENTROPY) {
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff fprintf(stderr, "No entropy.\n");
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff goto any;
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff }
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff hex_dump("good data only:", buffer, returned);
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff any:
630a9557113ab52288de873f563ef35c75a2871aMichael Graff isc_entropy_stats(ent, stderr);
c3581e2bccf659792bf78e0f672b23f9e42dddc5Michael Graff CHECK("isc_entropy_getdata() pseudorandom",
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff isc_entropy_getdata(ent, buffer, 128, NULL, 0));
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff hex_dump("pseudorandom data", buffer, 128);
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff isc_entropy_stats(ent, stderr);
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff flags = 0;
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff flags |= ISC_ENTROPY_GOODONLY;
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff flags |= ISC_ENTROPY_BLOCKING;
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson result = isc_entropy_getdata(ent, buffer, sizeof(buffer), &returned,
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff flags);
79fdce6aff049fde7ac8aa6c35a4fac24c4c0b06Michael Graff CHECK("good data only, blocking mode", result);
91cd0f93ad34d23e8b09dca337120f64fbe8f0a1Andreas Gustafsson hex_dump("blocking mode data", buffer, sizeof(buffer));
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff {
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_t *entcopy1 = NULL;
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_t *entcopy2 = NULL;
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_t *entcopy3 = NULL;
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_attach(ent, &entcopy1);
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_attach(ent, &entcopy2);
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_attach(ent, &entcopy3);
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_stats(ent, stderr);
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_detach(&entcopy1);
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_detach(&entcopy2);
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_detach(&entcopy3);
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff }
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff
b90f80957a972c969a98d0ce74828fb1816572baMichael Graff isc_entropy_detach(&ent);
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff isc_mem_stats(mctx, stderr);
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff isc_mem_destroy(&mctx);
c6e2d36708ce0caa235de426dbda5924d758f272Michael Graff
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff return (0);
5c14b1acbe0e7d244fbebbe5a16cea29233d79a3Michael Graff}
c3581e2bccf659792bf78e0f672b23f9e42dddc5Michael Graff