fips_rand_selftest.c revision 296465
198184Sgordon/* ==================================================================== 298184Sgordon * Copyright (c) 2003 The OpenSSL Project. All rights reserved. 398184Sgordon * 498184Sgordon * Redistribution and use in source and binary forms, with or without 598184Sgordon * modification, are permitted provided that the following conditions 698184Sgordon * are met: 7208307Sdougb * 8208307Sdougb * 1. Redistributions of source code must retain the above copyright 9136224Smtm * notice, this list of conditions and the following disclaimer. 1098184Sgordon * 1198184Sgordon * 2. Redistributions in binary form must reproduce the above copyright 1298184Sgordon * notice, this list of conditions and the following disclaimer in 1398184Sgordon * the documentation and/or other materials provided with the 1498184Sgordon * distribution. 15125341Spjd * 1698184Sgordon * 3. All advertising materials mentioning features or use of this 17147107Sdes * software must display the following acknowledgment: 18147107Sdes * "This product includes software developed by the OpenSSL Project 19179943Smtm * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 20147107Sdes * 21147107Sdes * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 22147107Sdes * endorse or promote products derived from this software without 23147107Sdes * prior written permission. For written permission, please contact 24179943Smtm * openssl-core@openssl.org. 25147107Sdes * 26147107Sdes * 5. Products derived from this software may not be called "OpenSSL" 27147107Sdes * nor may "OpenSSL" appear in their names without prior written 2898184Sgordon * permission of the OpenSSL Project. 2998184Sgordon * 3098184Sgordon * 6. Redistributions of any form whatsoever must retain the following 3198184Sgordon * acknowledgment: 3298184Sgordon * "This product includes software developed by the OpenSSL Project 3398184Sgordon * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 3498184Sgordon * 3598184Sgordon * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 36135525Sdes * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 37150103Srwatson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 38147107Sdes * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 39147107Sdes * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 40147107Sdes * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 41147107Sdes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 42135525Sdes * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 43135525Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 44135525Sdes * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 45147107Sdes * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 46135525Sdes * OF THE POSSIBILITY OF SUCH DAMAGE. 47135525Sdes * 48135525Sdes */ 49135525Sdes 5098184Sgordon#include <string.h> 51147107Sdes#include <openssl/err.h> 5298184Sgordon#include <openssl/fips.h> 5398184Sgordon#include <openssl/rand.h> 5498184Sgordon#include <openssl/fips_rand.h> 5598184Sgordon 56125341Spjd#ifdef OPENSSL_FIPS 57125341Spjd 58125341Spjdtypedef struct { 59125341Spjd unsigned char DT[16]; 60125341Spjd unsigned char V[16]; 61125341Spjd unsigned char R[16]; 62136684Sthomas} AES_PRNG_TV; 63125341Spjd 64125341Spjd/* The following test vectors are taken directly from the RGNVS spec */ 65125341Spjd 66125341Spjdstatic unsigned char aes_128_key[16] = 67125341Spjd { 0xf3, 0xb1, 0x66, 0x6d, 0x13, 0x60, 0x72, 0x42, 6898184Sgordon 0xed, 0x06, 0x1c, 0xab, 0xb8, 0xd4, 0x62, 0x02 6998184Sgordon}; 70 71static AES_PRNG_TV aes_128_tv[] = { 72 { 73 /* DT */ 74 {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62, 75 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x22, 0xf9}, 76 /* V */ 77 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 79 /* R */ 80 {0x59, 0x53, 0x1e, 0xd1, 0x3b, 0xb0, 0xc0, 0x55, 81 0x84, 0x79, 0x66, 0x85, 0xc1, 0x2f, 0x76, 0x41} 82 }, 83 { 84 /* DT */ 85 {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62, 86 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x22, 0xfa}, 87 /* V */ 88 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 90 /* R */ 91 {0x7c, 0x22, 0x2c, 0xf4, 0xca, 0x8f, 0xa2, 0x4c, 92 0x1c, 0x9c, 0xb6, 0x41, 0xa9, 0xf3, 0x22, 0x0d} 93 }, 94 { 95 /* DT */ 96 {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62, 97 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x22, 0xfb}, 98 /* V */ 99 {0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 101 /* R */ 102 {0x8a, 0xaa, 0x00, 0x39, 0x66, 0x67, 0x5b, 0xe5, 103 0x29, 0x14, 0x28, 0x81, 0xa9, 0x4d, 0x4e, 0xc7} 104 }, 105 { 106 /* DT */ 107 {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62, 108 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x22, 0xfc}, 109 /* V */ 110 {0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 112 /* R */ 113 {0x88, 0xdd, 0xa4, 0x56, 0x30, 0x24, 0x23, 0xe5, 114 0xf6, 0x9d, 0xa5, 0x7e, 0x7b, 0x95, 0xc7, 0x3a} 115 }, 116 { 117 /* DT */ 118 {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62, 119 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x22, 0xfd}, 120 /* V */ 121 {0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 123 /* R */ 124 {0x05, 0x25, 0x92, 0x46, 0x61, 0x79, 0xd2, 0xcb, 125 0x78, 0xc4, 0x0b, 0x14, 0x0a, 0x5a, 0x9a, 0xc8} 126 }, 127 { 128 /* DT */ 129 {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62, 130 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x23, 0x77}, 131 /* V */ 132 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 133 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe}, 134 /* R */ 135 {0x0d, 0xd5, 0xa0, 0x36, 0x7a, 0x59, 0x26, 0xbc, 136 0x48, 0xd9, 0x38, 0xbf, 0xf0, 0x85, 0x8f, 0xea} 137 }, 138 { 139 /* DT */ 140 {0xe6, 0xb3, 0xbe, 0x78, 0x2a, 0x23, 0xfa, 0x62, 141 0xd7, 0x1d, 0x4a, 0xfb, 0xb0, 0xe9, 0x23, 0x78}, 142 /* V */ 143 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 144 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 145 /* R */ 146 {0xae, 0x53, 0x87, 0xee, 0x8c, 0xd9, 0x12, 0xf5, 147 0x73, 0x53, 0xae, 0x03, 0xf9, 0xd5, 0x13, 0x33} 148 }, 149}; 150 151static unsigned char aes_192_key[24] = 152 { 0x15, 0xd8, 0x78, 0x0d, 0x62, 0xd3, 0x25, 0x6e, 153 0x44, 0x64, 0x10, 0x13, 0x60, 0x2b, 0xa9, 0xbc, 154 0x4a, 0xfb, 0xca, 0xeb, 0x4c, 0x8b, 0x99, 0x3b 155}; 156 157static AES_PRNG_TV aes_192_tv[] = { 158 { 159 /* DT */ 160 {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1, 161 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0x4b}, 162 /* V */ 163 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 165 /* R */ 166 {0x17, 0x07, 0xd5, 0x28, 0x19, 0x79, 0x1e, 0xef, 167 0xa5, 0x0c, 0xbf, 0x25, 0xe5, 0x56, 0xb4, 0x93} 168 }, 169 { 170 /* DT */ 171 {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1, 172 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0x4c}, 173 /* V */ 174 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 176 /* R */ 177 {0x92, 0x8d, 0xbe, 0x07, 0xdd, 0xc7, 0x58, 0xc0, 178 0x6f, 0x35, 0x41, 0x9b, 0x17, 0xc9, 0xbd, 0x9b} 179 }, 180 { 181 /* DT */ 182 {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1, 183 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0x4d}, 184 /* V */ 185 {0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 187 /* R */ 188 {0xd5, 0xde, 0xf4, 0x50, 0xf3, 0xb7, 0x10, 0x4e, 189 0xb8, 0xc6, 0xf8, 0xcf, 0xe2, 0xb1, 0xca, 0xa2} 190 }, 191 { 192 /* DT */ 193 {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1, 194 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0x4e}, 195 /* V */ 196 {0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 198 /* R */ 199 {0xce, 0x29, 0x08, 0x43, 0xfc, 0x34, 0x41, 0xe7, 200 0x47, 0x8f, 0xb3, 0x66, 0x2b, 0x46, 0xb1, 0xbb} 201 }, 202 { 203 /* DT */ 204 {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1, 205 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0x4f}, 206 /* V */ 207 {0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 209 /* R */ 210 {0xb3, 0x26, 0x0f, 0xf5, 0xd6, 0xca, 0xa8, 0xbf, 211 0x89, 0xb8, 0x5e, 0x2f, 0x22, 0x56, 0x92, 0x2f} 212 }, 213 { 214 /* DT */ 215 {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1, 216 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0xc9}, 217 /* V */ 218 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 219 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe}, 220 /* R */ 221 {0x05, 0xeb, 0x18, 0x52, 0x34, 0x43, 0x00, 0x43, 222 0x6e, 0x5a, 0xa5, 0xfe, 0x7b, 0x32, 0xc4, 0x2d} 223 }, 224 { 225 /* DT */ 226 {0x3f, 0xd8, 0xff, 0xe8, 0x80, 0x69, 0x8b, 0xc1, 227 0xbf, 0x99, 0x7d, 0xa4, 0x24, 0x78, 0xf3, 0xca}, 228 /* V */ 229 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 230 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 231 /* R */ 232 {0x15, 0x3c, 0xe8, 0xd1, 0x04, 0xc7, 0xad, 0x50, 233 0x0b, 0xf0, 0x07, 0x16, 0xe7, 0x56, 0x7a, 0xea} 234 }, 235}; 236 237static unsigned char aes_256_key[32] = 238 { 0x6d, 0x14, 0x06, 0x6c, 0xb6, 0xd8, 0x21, 0x2d, 239 0x82, 0x8d, 0xfa, 0xf2, 0x7a, 0x03, 0xb7, 0x9f, 240 0x0c, 0xc7, 0x3e, 0xcd, 0x76, 0xeb, 0xee, 0xb5, 241 0x21, 0x05, 0x8c, 0x4f, 0x31, 0x7a, 0x80, 0xbb 242}; 243 244static AES_PRNG_TV aes_256_tv[] = { 245 { 246 /* DT */ 247 {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5, 248 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9e, 0x88}, 249 /* V */ 250 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 252 /* R */ 253 {0x35, 0xc7, 0xef, 0xa7, 0x78, 0x4d, 0x29, 0xbc, 254 0x82, 0x79, 0x99, 0xfb, 0xd0, 0xb3, 0x3b, 0x72} 255 }, 256 { 257 /* DT */ 258 {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5, 259 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9e, 0x89}, 260 /* V */ 261 {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 263 /* R */ 264 {0x6c, 0xf4, 0x42, 0x5d, 0xc7, 0x04, 0x1a, 0x41, 265 0x28, 0x2a, 0x78, 0xa9, 0xb0, 0x12, 0xc4, 0x95} 266 }, 267 { 268 /* DT */ 269 {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5, 270 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9e, 0x8a}, 271 /* V */ 272 {0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 274 /* R */ 275 {0x16, 0x90, 0xa4, 0xff, 0x7b, 0x7e, 0xb9, 0x30, 276 0xdb, 0x67, 0x4b, 0xac, 0x2d, 0xe1, 0xd1, 0x75} 277 }, 278 { 279 /* DT */ 280 {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5, 281 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9e, 0x8b}, 282 /* V */ 283 {0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 285 /* R */ 286 {0x14, 0x6f, 0xf5, 0x95, 0xa1, 0x46, 0x65, 0x30, 287 0xbc, 0x57, 0xe2, 0x4a, 0xf7, 0x45, 0x62, 0x05} 288 }, 289 { 290 /* DT */ 291 {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5, 292 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9e, 0x8c}, 293 /* V */ 294 {0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 296 /* R */ 297 {0x96, 0xe2, 0xb4, 0x1e, 0x66, 0x5e, 0x0f, 0xa4, 298 0xc5, 0xcd, 0xa2, 0x07, 0xcc, 0xb7, 0x94, 0x40} 299 }, 300 { 301 /* DT */ 302 {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5, 303 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9f, 0x06}, 304 /* V */ 305 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 306 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe}, 307 /* R */ 308 {0x61, 0xce, 0x1d, 0x6a, 0x48, 0x75, 0x97, 0x28, 309 0x4b, 0x41, 0xde, 0x18, 0x44, 0x4f, 0x56, 0xec} 310 }, 311 { 312 /* DT */ 313 {0xda, 0x3a, 0x41, 0xec, 0x1d, 0xa3, 0xb0, 0xd5, 314 0xf2, 0xa9, 0x4e, 0x34, 0x74, 0x8e, 0x9f, 0x07}, 315 /* V */ 316 {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 317 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 318 /* R */ 319 {0x52, 0x89, 0x59, 0x79, 0x2d, 0xaa, 0x28, 0xb3, 320 0xb0, 0x8a, 0x3e, 0x70, 0xfa, 0x71, 0x59, 0x84} 321 }, 322}; 323 324void FIPS_corrupt_rng() 325{ 326 aes_192_tv[0].V[0]++; 327} 328 329# define fips_rand_test(key, tv) \ 330 do_rand_test(key, sizeof key, tv, sizeof(tv)/sizeof(AES_PRNG_TV)) 331 332static int do_rand_test(unsigned char *key, int keylen, 333 AES_PRNG_TV * tv, int ntv) 334{ 335 unsigned char R[16]; 336 int i; 337 if (!FIPS_rand_set_key(key, keylen)) 338 return 0; 339 for (i = 0; i < ntv; i++) { 340 FIPS_rand_seed(tv[i].V, 16); 341 FIPS_rand_set_dt(tv[i].DT); 342 FIPS_rand_bytes(R, 16); 343 if (memcmp(R, tv[i].R, 16)) 344 return 0; 345 } 346 return 1; 347} 348 349int FIPS_selftest_rng() 350{ 351 FIPS_rand_reset(); 352 if (!FIPS_rand_test_mode()) { 353 FIPSerr(FIPS_F_FIPS_SELFTEST_RNG, FIPS_R_SELFTEST_FAILED); 354 return 0; 355 } 356 if (!fips_rand_test(aes_128_key, aes_128_tv) 357 || !fips_rand_test(aes_192_key, aes_192_tv) 358 || !fips_rand_test(aes_256_key, aes_256_tv)) { 359 FIPSerr(FIPS_F_FIPS_SELFTEST_RNG, FIPS_R_SELFTEST_FAILED); 360 return 0; 361 } 362 FIPS_rand_reset(); 363 return 1; 364} 365 366#endif 367