16ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 26ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * prng.h 36ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 46ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * pseudorandom source 56ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * 66ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * David A. McGrew 76ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * Cisco Systems, Inc. 86ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 95961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com/* 105961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * 115961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * Copyright (c) 2001-2006, Cisco Systems, Inc. 125961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * All rights reserved. 135961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * 145961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * Redistribution and use in source and binary forms, with or without 155961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * modification, are permitted provided that the following conditions 165961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * are met: 175961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * 185961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * Redistributions of source code must retain the above copyright 195961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * notice, this list of conditions and the following disclaimer. 205961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * 215961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * Redistributions in binary form must reproduce the above 225961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * copyright notice, this list of conditions and the following 235961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * disclaimer in the documentation and/or other materials provided 245961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * with the distribution. 255961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * 265961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * Neither the name of the Cisco Systems, Inc. nor the names of its 275961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * contributors may be used to endorse or promote products derived 285961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * from this software without specific prior written permission. 295961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * 305961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 315961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 325961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 335961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 345961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 355961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 365961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 375961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 385961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 395961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 405961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 415961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * OF THE POSSIBILITY OF SUCH DAMAGE. 425961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com * 435961d8555973f660a94b77ffd7b9495291fbc874mallinath@google.com */ 446ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 456ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#ifndef PRNG_H 466ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define PRNG_H 476ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 486ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "rand_source.h" /* for rand_source_func_t definition */ 496ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "aes.h" /* for aes */ 506ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#include "aes_icm.h" /* for aes ctr */ 516ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 526ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#define MAX_PRNG_OUT_LEN 0xffffffffU 536ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 546ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 556ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * x917_prng is an ANSI X9.17-like AES-based PRNG 566ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 576ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 586ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct { 596ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org v128_t state; /* state data */ 606ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org aes_expanded_key_t key; /* secret key */ 616ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint32_t octet_count; /* number of octets output since last init */ 626ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org rand_source_func_t rand; /* random source for re-initialization */ 636ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} x917_prng_t; 646ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 656ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t 666ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgx917_prng_init(rand_source_func_t random_source); 676ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 686ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t 696ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgx917_prng_get_octet_string(uint8_t *dest, uint32_t len); 706ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 716ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 726ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org/* 736ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org * ctr_prng is an AES-CTR based PRNG 746ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org */ 756ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 766ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgtypedef struct { 776ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org uint32_t octet_count; /* number of octets output since last init */ 786ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org aes_icm_ctx_t state; /* state data */ 796ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org rand_source_func_t rand; /* random source for re-initialization */ 806ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org} ctr_prng_t; 816ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 826ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t 836ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgctr_prng_init(rand_source_func_t random_source); 846ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 856ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgerr_status_t 866ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.orgctr_prng_get_octet_string(void *dest, uint32_t len); 876ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 886ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org 896ed0ee98e1c3d29a0ef79996f7d1abf174f39besergeyu@chromium.org#endif 90