1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * prng.h
3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * pseudorandom source
5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew
7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc.
8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef PRNG_H
11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define PRNG_H
12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "rand_source.h"  /* for rand_source_func_t definition       */
14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "aes.h"          /* for aes                                 */
15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "aes_icm.h"      /* for aes ctr                             */
16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define MAX_PRNG_OUT_LEN 0xffffffffU
18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * x917_prng is an ANSI X9.17-like AES-based PRNG
21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef struct {
24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v128_t   state;          /* state data                              */
25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  aes_expanded_key_t key;  /* secret key                              */
26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t octet_count;    /* number of octets output since last init */
27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  rand_source_func_t rand; /* random source for re-initialization     */
28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} x917_prng_t;
29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarix917_prng_init(rand_source_func_t random_source);
32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarix917_prng_get_octet_string(uint8_t *dest, uint32_t len);
35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * ctr_prng is an AES-CTR based PRNG
39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef struct {
42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t octet_count;    /* number of octets output since last init */
43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  aes_icm_ctx_t   state;   /* state data                              */
44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  rand_source_func_t rand; /* random source for re-initialization     */
45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari} ctr_prng_t;
46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarictr_prng_init(rand_source_func_t random_source);
49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarierr_status_t
51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarictr_prng_get_octet_string(void *dest, uint32_t len);
52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
55