1 /* Bob Jenkins's cryptographic random number generators, ISAAC and ISAAC64.
2 
3    Copyright (C) 1999-2023 Free Software Foundation, Inc.
4    Copyright (C) 1997, 1998, 1999 Colin Plumb.
5 
6    This program is free software: you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation, either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <https://www.gnu.org/licenses/>.
18 
19    Written by Colin Plumb and Paul Eggert.  */
20 
21 #ifndef _GL_RAND_ISAAC_H
22 #define _GL_RAND_ISAAC_H
23 
24 #include <stddef.h>
25 #include <stdint.h>
26 
27 /* Log base 2 of the number of useful bits in an ISAAC word.  It must
28    be either 5 or 6.  By default, this uses a value that should be
29    faster for this architecture.  */
30 #ifndef ISAAC_BITS_LOG
31  #if SIZE_MAX >> 31 >> 31 < 3 /* SIZE_MAX < 2**64 - 1 */
32   #define ISAAC_BITS_LOG 5
33  #else
34   #define ISAAC_BITS_LOG 6
35  #endif
36 #endif
37 
38 /* The number of bits in an ISAAC word.  */
39 #define ISAAC_BITS (1 << ISAAC_BITS_LOG)
40 
41 #if ISAAC_BITS == 32
42   typedef uint_least32_t isaac_word;
43 #else
44   typedef uint_least64_t isaac_word;
45 #endif
46 
47 /* Size of the state tables to use.  ISAAC_WORDS_LOG should be at least 3,
48    and smaller values give less security.  */
49 #define ISAAC_WORDS_LOG 8
50 #define ISAAC_WORDS (1 << ISAAC_WORDS_LOG)
51 #define ISAAC_BYTES (ISAAC_WORDS * sizeof (isaac_word))
52 
53 /* State variables for the random number generator.  The M member
54    should be seeded with nonce data before calling isaac_seed.  The
55    other members are private.  */
56 struct isaac_state
57   {
58     isaac_word m[ISAAC_WORDS];	/* Main state array */
59     isaac_word a, b, c;		/* Extra variables */
60   };
61 
62 void isaac_seed (struct isaac_state *) _GL_ATTRIBUTE_NONNULL ();
63 void isaac_refill (struct isaac_state *, isaac_word[ISAAC_WORDS])
64   _GL_ATTRIBUTE_NONNULL ();
65 
66 #endif
67