1 // SPDX-License-Identifier: BSD-2-Clause
2 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
3 *
4 * LibTomCrypt is a library that provides various cryptographic
5 * algorithms in a highly modular and flexible manner.
6 *
7 * The library is free for all purposes without any express
8 * guarantee it works.
9 */
10 #include "tomcrypt_private.h"
11
12 /**
13 @file sprng.c
14 Secure PRNG, Tom St Denis
15 */
16
17 /* A secure PRNG using the RNG functions. Basically this is a
18 * wrapper that allows you to use a secure RNG as a PRNG
19 * in the various other functions.
20 */
21
22 #ifdef LTC_SPRNG
23
24 const struct ltc_prng_descriptor sprng_desc =
25 {
26 "sprng", 0,
27 &sprng_start,
28 &sprng_add_entropy,
29 &sprng_ready,
30 &sprng_read,
31 &sprng_done,
32 &sprng_export,
33 &sprng_import,
34 &sprng_test
35 };
36
37 /**
38 Start the PRNG
39 @param prng [out] The PRNG state to initialize
40 @return CRYPT_OK if successful
41 */
sprng_start(prng_state * prng)42 int sprng_start(prng_state *prng)
43 {
44 LTC_UNUSED_PARAM(prng);
45 return CRYPT_OK;
46 }
47
48 /**
49 Add entropy to the PRNG state
50 @param in The data to add
51 @param inlen Length of the data to add
52 @param prng PRNG state to update
53 @return CRYPT_OK if successful
54 */
sprng_add_entropy(const unsigned char * in,unsigned long inlen,prng_state * prng)55 int sprng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng)
56 {
57 LTC_UNUSED_PARAM(in);
58 LTC_UNUSED_PARAM(inlen);
59 LTC_UNUSED_PARAM(prng);
60 return CRYPT_OK;
61 }
62
63 /**
64 Make the PRNG ready to read from
65 @param prng The PRNG to make active
66 @return CRYPT_OK if successful
67 */
sprng_ready(prng_state * prng)68 int sprng_ready(prng_state *prng)
69 {
70 LTC_UNUSED_PARAM(prng);
71 return CRYPT_OK;
72 }
73
74 /**
75 Read from the PRNG
76 @param out Destination
77 @param outlen Length of output
78 @param prng The active PRNG to read from
79 @return Number of octets read
80 */
sprng_read(unsigned char * out,unsigned long outlen,prng_state * prng)81 unsigned long sprng_read(unsigned char *out, unsigned long outlen, prng_state *prng)
82 {
83 LTC_ARGCHK(out != NULL);
84 LTC_UNUSED_PARAM(prng);
85 return rng_get_bytes(out, outlen, NULL);
86 }
87
88 /**
89 Terminate the PRNG
90 @param prng The PRNG to terminate
91 @return CRYPT_OK if successful
92 */
sprng_done(prng_state * prng)93 int sprng_done(prng_state *prng)
94 {
95 LTC_UNUSED_PARAM(prng);
96 return CRYPT_OK;
97 }
98
99 /**
100 Export the PRNG state
101 @param out [out] Destination
102 @param outlen [in/out] Max size and resulting size of the state
103 @param prng The PRNG to export
104 @return CRYPT_OK if successful
105 */
106 /* NOLINTNEXTLINE(readability-non-const-parameter) - silence clang-tidy warning */
sprng_export(unsigned char * out,unsigned long * outlen,prng_state * prng)107 int sprng_export(unsigned char *out, unsigned long *outlen, prng_state *prng)
108 {
109 LTC_ARGCHK(outlen != NULL);
110 LTC_UNUSED_PARAM(out);
111 LTC_UNUSED_PARAM(prng);
112
113 *outlen = 0;
114 return CRYPT_OK;
115 }
116
117 /**
118 Import a PRNG state
119 @param in The PRNG state
120 @param inlen Size of the state
121 @param prng The PRNG to import
122 @return CRYPT_OK if successful
123 */
sprng_import(const unsigned char * in,unsigned long inlen,prng_state * prng)124 int sprng_import(const unsigned char *in, unsigned long inlen, prng_state *prng)
125 {
126 LTC_UNUSED_PARAM(in);
127 LTC_UNUSED_PARAM(inlen);
128 LTC_UNUSED_PARAM(prng);
129 return CRYPT_OK;
130 }
131
132 /**
133 PRNG self-test
134 @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
135 */
sprng_test(void)136 int sprng_test(void)
137 {
138 #ifndef LTC_TEST
139 return CRYPT_NOP;
140 #else
141 prng_state st;
142 unsigned char en[] = { 0x01, 0x02, 0x03, 0x04 };
143 unsigned char out[1000];
144 int err;
145
146 if ((err = sprng_start(&st)) != CRYPT_OK) return err;
147 if ((err = sprng_add_entropy(en, sizeof(en), &st)) != CRYPT_OK) return err;
148 if ((err = sprng_ready(&st)) != CRYPT_OK) return err;
149 if (sprng_read(out, 500, &st) != 500) return CRYPT_ERROR_READPRNG; /* skip 500 bytes */
150 if ((err = sprng_done(&st)) != CRYPT_OK) return err;
151
152 return CRYPT_OK;
153 #endif
154 }
155
156 #endif
157
158
159
160
161 /* ref: $Format:%D$ */
162 /* git commit: $Format:%H$ */
163 /* commit time: $Format:%ai$ */
164