Home | History | Annotate | Download | only in headers
      1 /* ---- PRNG Stuff ---- */
      2 #ifdef YARROW
      3 struct yarrow_prng {
      4     int                   cipher, hash;
      5     unsigned char         pool[MAXBLOCKSIZE];
      6     symmetric_CTR         ctr;
      7     LTC_MUTEX_TYPE(prng_lock)
      8 };
      9 #endif
     10 
     11 #ifdef RC4
     12 struct rc4_prng {
     13     int x, y;
     14     unsigned char buf[256];
     15 };
     16 #endif
     17 
     18 #ifdef FORTUNA
     19 struct fortuna_prng {
     20     hash_state pool[FORTUNA_POOLS];     /* the  pools */
     21 
     22     symmetric_key skey;
     23 
     24     unsigned char K[32],      /* the current key */
     25                   IV[16];     /* IV for CTR mode */
     26 
     27     unsigned long pool_idx,   /* current pool we will add to */
     28                   pool0_len,  /* length of 0'th pool */
     29                   wd;
     30 
     31     ulong64       reset_cnt;  /* number of times we have reset */
     32     LTC_MUTEX_TYPE(prng_lock)
     33 };
     34 #endif
     35 
     36 #ifdef SOBER128
     37 struct sober128_prng {
     38     ulong32      R[17],          /* Working storage for the shift register */
     39                  initR[17],      /* saved register contents */
     40                  konst,          /* key dependent constant */
     41                  sbuf;           /* partial word encryption buffer */
     42 
     43     int          nbuf,           /* number of part-word stream bits buffered */
     44                  flag,           /* first add_entropy call or not? */
     45                  set;            /* did we call add_entropy to set key? */
     46 
     47 };
     48 #endif
     49 
     50 typedef union Prng_state {
     51     char dummy[1];
     52 #ifdef YARROW
     53     struct yarrow_prng    yarrow;
     54 #endif
     55 #ifdef RC4
     56     struct rc4_prng       rc4;
     57 #endif
     58 #ifdef FORTUNA
     59     struct fortuna_prng   fortuna;
     60 #endif
     61 #ifdef SOBER128
     62     struct sober128_prng  sober128;
     63 #endif
     64 } prng_state;
     65 
     66 /** PRNG descriptor */
     67 extern struct ltc_prng_descriptor {
     68     /** Name of the PRNG */
     69     char *name;
     70     /** size in bytes of exported state */
     71     int  export_size;
     72     /** Start a PRNG state
     73         @param prng   [out] The state to initialize
     74         @return CRYPT_OK if successful
     75     */
     76     int (*start)(prng_state *prng);
     77     /** Add entropy to the PRNG
     78         @param in         The entropy
     79         @param inlen      Length of the entropy (octets)\
     80         @param prng       The PRNG state
     81         @return CRYPT_OK if successful
     82     */
     83     int (*add_entropy)(const unsigned char *in, unsigned long inlen, prng_state *prng);
     84     /** Ready a PRNG state to read from
     85         @param prng       The PRNG state to ready
     86         @return CRYPT_OK if successful
     87     */
     88     int (*ready)(prng_state *prng);
     89     /** Read from the PRNG
     90         @param out     [out] Where to store the data
     91         @param outlen  Length of data desired (octets)
     92         @param prng    The PRNG state to read from
     93         @return Number of octets read
     94     */
     95     unsigned long (*read)(unsigned char *out, unsigned long outlen, prng_state *prng);
     96     /** Terminate a PRNG state
     97         @param prng   The PRNG state to terminate
     98         @return CRYPT_OK if successful
     99     */
    100     int (*done)(prng_state *prng);
    101     /** Export a PRNG state
    102         @param out     [out] The destination for the state
    103         @param outlen  [in/out] The max size and resulting size of the PRNG state
    104         @param prng    The PRNG to export
    105         @return CRYPT_OK if successful
    106     */
    107     int (*pexport)(unsigned char *out, unsigned long *outlen, prng_state *prng);
    108     /** Import a PRNG state
    109         @param in      The data to import
    110         @param inlen   The length of the data to import (octets)
    111         @param prng    The PRNG to initialize/import
    112         @return CRYPT_OK if successful
    113     */
    114     int (*pimport)(const unsigned char *in, unsigned long inlen, prng_state *prng);
    115     /** Self-test the PRNG
    116         @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
    117     */
    118     int (*test)(void);
    119 } prng_descriptor[];
    120 
    121 #ifdef YARROW
    122 int yarrow_start(prng_state *prng);
    123 int yarrow_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
    124 int yarrow_ready(prng_state *prng);
    125 unsigned long yarrow_read(unsigned char *out, unsigned long outlen, prng_state *prng);
    126 int yarrow_done(prng_state *prng);
    127 int  yarrow_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
    128 int  yarrow_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
    129 int  yarrow_test(void);
    130 extern const struct ltc_prng_descriptor yarrow_desc;
    131 #endif
    132 
    133 #ifdef FORTUNA
    134 int fortuna_start(prng_state *prng);
    135 int fortuna_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
    136 int fortuna_ready(prng_state *prng);
    137 unsigned long fortuna_read(unsigned char *out, unsigned long outlen, prng_state *prng);
    138 int fortuna_done(prng_state *prng);
    139 int  fortuna_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
    140 int  fortuna_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
    141 int  fortuna_test(void);
    142 extern const struct ltc_prng_descriptor fortuna_desc;
    143 #endif
    144 
    145 #ifdef RC4
    146 int rc4_start(prng_state *prng);
    147 int rc4_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
    148 int rc4_ready(prng_state *prng);
    149 unsigned long rc4_read(unsigned char *out, unsigned long outlen, prng_state *prng);
    150 int  rc4_done(prng_state *prng);
    151 int  rc4_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
    152 int  rc4_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
    153 int  rc4_test(void);
    154 extern const struct ltc_prng_descriptor rc4_desc;
    155 #endif
    156 
    157 #ifdef SPRNG
    158 int sprng_start(prng_state *prng);
    159 int sprng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
    160 int sprng_ready(prng_state *prng);
    161 unsigned long sprng_read(unsigned char *out, unsigned long outlen, prng_state *prng);
    162 int sprng_done(prng_state *prng);
    163 int  sprng_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
    164 int  sprng_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
    165 int  sprng_test(void);
    166 extern const struct ltc_prng_descriptor sprng_desc;
    167 #endif
    168 
    169 #ifdef SOBER128
    170 int sober128_start(prng_state *prng);
    171 int sober128_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng);
    172 int sober128_ready(prng_state *prng);
    173 unsigned long sober128_read(unsigned char *out, unsigned long outlen, prng_state *prng);
    174 int sober128_done(prng_state *prng);
    175 int  sober128_export(unsigned char *out, unsigned long *outlen, prng_state *prng);
    176 int  sober128_import(const unsigned char *in, unsigned long inlen, prng_state *prng);
    177 int  sober128_test(void);
    178 extern const struct ltc_prng_descriptor sober128_desc;
    179 #endif
    180 
    181 int find_prng(const char *name);
    182 int register_prng(const struct ltc_prng_descriptor *prng);
    183 int unregister_prng(const struct ltc_prng_descriptor *prng);
    184 int prng_is_valid(int idx);
    185 LTC_MUTEX_PROTO(ltc_prng_mutex)
    186 
    187 /* Slow RNG you **might** be able to use to seed a PRNG with.  Be careful as this
    188  * might not work on all platforms as planned
    189  */
    190 unsigned long rng_get_bytes(unsigned char *out,
    191                             unsigned long outlen,
    192                             void (*callback)(void));
    193 
    194 int rng_make_prng(int bits, int wprng, prng_state *prng, void (*callback)(void));
    195 
    196 
    197 /* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_prng.h,v $ */
    198 /* $Revision: 1.8 $ */
    199 /* $Date: 2006/11/05 01:36:43 $ */
    200