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