1/* 2 * stat-driver.c 3 * 4 * test driver for the stat_test functions 5 * 6 * David A. McGrew 7 * Cisco Systems, Inc. 8 */ 9 10/* 11 * 12 * Copyright (c) 2001-2006, Cisco Systems, Inc. 13 * All rights reserved. 14 * 15 * Redistribution and use in source and binary forms, with or without 16 * modification, are permitted provided that the following conditions 17 * are met: 18 * 19 * Redistributions of source code must retain the above copyright 20 * notice, this list of conditions and the following disclaimer. 21 * 22 * Redistributions in binary form must reproduce the above 23 * copyright notice, this list of conditions and the following 24 * disclaimer in the documentation and/or other materials provided 25 * with the distribution. 26 * 27 * Neither the name of the Cisco Systems, Inc. nor the names of its 28 * contributors may be used to endorse or promote products derived 29 * from this software without specific prior written permission. 30 * 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 34 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 35 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 36 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 37 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 38 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 41 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 42 * OF THE POSSIBILITY OF SUCH DAMAGE. 43 * 44 */ 45 46#include <stdio.h> /* for printf() */ 47 48#include "err.h" 49#include "stat.h" 50 51#include "cipher.h" 52 53typedef struct { 54 void *state; 55} random_source_t; 56 57err_status_t 58random_source_alloc(void); 59 60void 61err_check(err_status_t s) { 62 if (s) { 63 printf("error (code %d)\n", s); 64 exit(1); 65 } 66} 67 68int 69main (int argc, char *argv[]) { 70 uint8_t buffer[2500]; 71 unsigned int buf_len = 2500; 72 int i, j; 73 extern cipher_type_t aes_icm; 74 cipher_t *c; 75 uint8_t key[46] = { 76 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 77 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 78 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 79 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 80 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 81 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 82 }; 83 v128_t nonce; 84 int num_trials = 500; 85 int num_fail; 86 87 printf("statistical tests driver\n"); 88 89 for (i=0; i < 2500; i++) 90 buffer[i] = 0; 91 92 /* run tests */ 93 printf("running stat_tests on all-null buffer, expecting failure\n"); 94 printf("monobit %d\n", stat_test_monobit(buffer)); 95 printf("poker %d\n", stat_test_poker(buffer)); 96 printf("runs %d\n", stat_test_runs(buffer)); 97 98 for (i=0; i < 2500; i++) 99 buffer[i] = rand(); 100 printf("running stat_tests on rand(), expecting success\n"); 101 printf("monobit %d\n", stat_test_monobit(buffer)); 102 printf("poker %d\n", stat_test_poker(buffer)); 103 printf("runs %d\n", stat_test_runs(buffer)); 104 105 printf("running stat_tests on AES-128-ICM, expecting success\n"); 106 /* set buffer to cipher output */ 107 for (i=0; i < 2500; i++) 108 buffer[i] = 0; 109 err_check(cipher_type_alloc(&aes_icm, &c, 30)); 110 err_check(cipher_init(c, key, direction_encrypt)); 111 err_check(cipher_set_iv(c, &nonce)); 112 err_check(cipher_encrypt(c, buffer, &buf_len)); 113 /* run tests on cipher outout */ 114 printf("monobit %d\n", stat_test_monobit(buffer)); 115 printf("poker %d\n", stat_test_poker(buffer)); 116 printf("runs %d\n", stat_test_runs(buffer)); 117 118 printf("runs test (please be patient): "); 119 fflush(stdout); 120 num_fail = 0; 121 v128_set_to_zero(&nonce); 122 for(j=0; j < num_trials; j++) { 123 for (i=0; i < 2500; i++) 124 buffer[i] = 0; 125 nonce.v32[3] = i; 126 err_check(cipher_set_iv(c, &nonce)); 127 err_check(cipher_encrypt(c, buffer, &buf_len)); 128 if (stat_test_runs(buffer)) { 129 num_fail++; 130 } 131 } 132 133 printf("%d failures in %d tests\n", num_fail, num_trials); 134 printf("(nota bene: a small fraction of stat_test failures does not \n" 135 "indicate that the random source is invalid)\n"); 136 137 err_check(cipher_dealloc(c)); 138 139 printf("running stat_tests on AES-256-ICM, expecting success\n"); 140 /* set buffer to cipher output */ 141 for (i=0; i < 2500; i++) 142 buffer[i] = 0; 143 err_check(cipher_type_alloc(&aes_icm, &c, 46)); 144 err_check(cipher_init(c, key, direction_encrypt)); 145 err_check(cipher_set_iv(c, &nonce)); 146 err_check(cipher_encrypt(c, buffer, &buf_len)); 147 /* run tests on cipher outout */ 148 printf("monobit %d\n", stat_test_monobit(buffer)); 149 printf("poker %d\n", stat_test_poker(buffer)); 150 printf("runs %d\n", stat_test_runs(buffer)); 151 152 printf("runs test (please be patient): "); 153 fflush(stdout); 154 num_fail = 0; 155 v128_set_to_zero(&nonce); 156 for(j=0; j < num_trials; j++) { 157 for (i=0; i < 2500; i++) 158 buffer[i] = 0; 159 nonce.v32[3] = i; 160 err_check(cipher_set_iv(c, &nonce)); 161 err_check(cipher_encrypt(c, buffer, &buf_len)); 162 if (stat_test_runs(buffer)) { 163 num_fail++; 164 } 165 } 166 167 printf("%d failures in %d tests\n", num_fail, num_trials); 168 printf("(nota bene: a small fraction of stat_test failures does not \n" 169 "indicate that the random source is invalid)\n"); 170 171 err_check(cipher_dealloc(c)); 172 173 return 0; 174} 175