nist_hash_drbg.c revision 1.3 1 1.3 riastrad /* $NetBSD: nist_hash_drbg.c,v 1.3 2019/09/19 18:29:55 riastradh Exp $ */
2 1.1 riastrad
3 1.1 riastrad /*-
4 1.1 riastrad * Copyright (c) 2019 The NetBSD Foundation, Inc.
5 1.1 riastrad * All rights reserved.
6 1.1 riastrad *
7 1.1 riastrad * This code is derived from software contributed to The NetBSD Foundation
8 1.1 riastrad * by Taylor R. Campbell.
9 1.1 riastrad *
10 1.1 riastrad * Redistribution and use in source and binary forms, with or without
11 1.1 riastrad * modification, are permitted provided that the following conditions
12 1.1 riastrad * are met:
13 1.1 riastrad * 1. Redistributions of source code must retain the above copyright
14 1.1 riastrad * notice, this list of conditions and the following disclaimer.
15 1.1 riastrad * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 riastrad * notice, this list of conditions and the following disclaimer in the
17 1.1 riastrad * documentation and/or other materials provided with the distribution.
18 1.1 riastrad *
19 1.1 riastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 riastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 riastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 riastrad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 riastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 riastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 riastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 riastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 riastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 riastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 riastrad * POSSIBILITY OF SUCH DAMAGE.
30 1.1 riastrad */
31 1.1 riastrad
32 1.1 riastrad /*
33 1.1 riastrad * This file implements Hash_DRBG, a `deterministic random bit
34 1.1 riastrad * generator' (more commonly known in lay terms and in the cryptography
35 1.1 riastrad * literature as a pseudorandom bit generator or pseudorandom number
36 1.1 riastrad * generator), described in
37 1.1 riastrad *
38 1.1 riastrad * Elaine Barker and John Kelsey, `Recommendation for Random
39 1.1 riastrad * Number Generation Using Deterministic Random Bit Generators',
40 1.1 riastrad * NIST SP800-90A, June 2015.
41 1.1 riastrad *
42 1.1 riastrad * This code is meant to work in userland or in kernel. For a test
43 1.1 riastrad * program, compile with -DNIST_HASH_DRBG_MAIN to define a `main'
44 1.1 riastrad * function; for verbose debugging output, compile with
45 1.1 riastrad * -DNIST_HASH_DRBG_DEBUG, mainly useful if you need to change
46 1.1 riastrad * something and have to diagnose what's wrong with the known-answer
47 1.1 riastrad * tests.
48 1.1 riastrad */
49 1.1 riastrad
50 1.1 riastrad #ifdef _KERNEL
52 1.3 riastrad #include <sys/cdefs.h>
53 1.1 riastrad __KERNEL_RCSID(0, "$NetBSD: nist_hash_drbg.c,v 1.3 2019/09/19 18:29:55 riastradh Exp $");
54 1.1 riastrad #endif
55 1.1 riastrad
56 1.1 riastrad #include <sys/param.h>
57 1.1 riastrad #include <sys/types.h>
58 1.1 riastrad #include <sys/sha2.h>
59 1.1 riastrad
60 1.1 riastrad #ifdef _KERNEL
61 1.1 riastrad #include <sys/systm.h> /* memcpy */
62 1.1 riastrad #include <lib/libkern/libkern.h> /* KASSERT */
63 1.1 riastrad #define ASSERT KASSERT
64 1.1 riastrad #else
65 1.1 riastrad #include <assert.h>
66 1.1 riastrad #include <stdbool.h>
67 1.1 riastrad #include <stdio.h>
68 1.1 riastrad #include <string.h>
69 1.1 riastrad #define ASSERT assert
70 1.1 riastrad #define CTASSERT __CTASSERT
71 1.1 riastrad #endif
72 1.1 riastrad
73 1.1 riastrad #include "nist_hash_drbg.h"
74 1.1 riastrad
75 1.1 riastrad #define secret /* must not use in variable-time operations; should zero */
76 1.1 riastrad #define arraycount(A) (sizeof(A)/sizeof(A[0]))
77 1.1 riastrad
78 1.1 riastrad CTASSERT(0 < NIST_HASH_DRBG_RESEED_INTERVAL);
79 1.1 riastrad CTASSERT(NIST_HASH_DRBG_RESEED_INTERVAL <= INT_MAX);
80 1.1 riastrad CTASSERT(NIST_HASH_DRBG_RESEED_INTERVAL <= ~(~0ull << 48));
81 1.1 riastrad
82 1.1 riastrad /* Instantiation: SHA-256 */
83 1.1 riastrad #define HASH_LENGTH SHA256_DIGEST_LENGTH
84 1.1 riastrad #define HASH_CTX SHA256_CTX
85 1.1 riastrad #define hash_init SHA256_Init
86 1.1 riastrad #define hash_update SHA256_Update
87 1.1 riastrad #define hash_final SHA256_Final
88 1.1 riastrad
89 1.1 riastrad #define SEEDLEN_BYTES NIST_HASH_DRBG_SEEDLEN_BYTES
90 1.1 riastrad
91 1.1 riastrad struct hvec {
92 1.1 riastrad const void *hv_base;
93 1.1 riastrad size_t hv_len;
94 1.1 riastrad };
95 1.1 riastrad
96 1.1 riastrad static void hashgen(secret uint8_t *, size_t,
97 1.1 riastrad const secret uint8_t[SEEDLEN_BYTES]);
98 1.1 riastrad static void add8(secret uint8_t *, size_t, const secret uint8_t *, size_t);
99 1.1 riastrad static void hash_df(secret void *, size_t, const struct hvec *, size_t);
100 1.1 riastrad static void hash_df_block(secret void *, uint8_t, uint8_t[4],
101 1.1 riastrad const struct hvec *, size_t);
102 1.1 riastrad
103 1.1 riastrad /* 10.1.1 Hash_DRBG */
105 1.1 riastrad
106 1.1 riastrad int
107 1.1 riastrad nist_hash_drbg_destroy(struct nist_hash_drbg *D)
108 1.1 riastrad {
109 1.1 riastrad
110 1.1 riastrad explicit_memset(D, 0, sizeof(*D));
111 1.1 riastrad D->reseed_counter = UINT_MAX; /* paranoia: make generate fail */
112 1.1 riastrad
113 1.1 riastrad /* Always return zero for hysterical raisins. (XXX) */
114 1.1 riastrad return 0;
115 1.1 riastrad }
116 1.1 riastrad
117 1.1 riastrad /* 10.1.1.2 Instantiation of Hash_DRBG */
118 1.1 riastrad
119 1.1 riastrad int
120 1.1 riastrad nist_hash_drbg_instantiate(secret struct nist_hash_drbg *D,
121 1.1 riastrad const secret void *entropy, size_t entropylen,
122 1.1 riastrad const void *nonce, size_t noncelen,
123 1.1 riastrad const void *personalization, size_t personalizationlen)
124 1.1 riastrad {
125 1.1 riastrad /*
126 1.1 riastrad * 1. seed_material = entropy_input || nonce || personalization_string
127 1.1 riastrad */
128 1.1 riastrad const struct hvec seed_material[] = {
129 1.1 riastrad { .hv_base = entropy, .hv_len = entropylen },
130 1.1 riastrad { .hv_base = nonce, .hv_len = noncelen },
131 1.1 riastrad { .hv_base = personalization, .hv_len = personalizationlen },
132 1.1 riastrad };
133 1.1 riastrad
134 1.1 riastrad /*
135 1.1 riastrad * 2. seed = Hash_df(seed_material, seedlen)
136 1.1 riastrad * 3. V = seed
137 1.1 riastrad */
138 1.1 riastrad CTASSERT(sizeof D->V == SEEDLEN_BYTES);
139 1.1 riastrad hash_df(D->V, sizeof D->V, seed_material, arraycount(seed_material));
140 1.1 riastrad
141 1.1 riastrad /* 4. C = Hash_df((0x00 || V), seedlen) */
142 1.1 riastrad const struct hvec hv[] = {
143 1.1 riastrad { .hv_base = (const uint8_t[]) {0x00}, .hv_len = 1 },
144 1.1 riastrad { .hv_base = D->V, .hv_len = sizeof D->V },
145 1.1 riastrad };
146 1.1 riastrad CTASSERT(sizeof D->C == SEEDLEN_BYTES);
147 1.1 riastrad hash_df(D->C, sizeof D->C, hv, arraycount(hv));
148 1.1 riastrad
149 1.1 riastrad /* 5. reseed_counter = 1 */
150 1.1 riastrad D->reseed_counter = 1;
151 1.1 riastrad
152 1.1 riastrad /* Always return zero for hysterical raisins. (XXX) */
153 1.1 riastrad return 0;
154 1.1 riastrad }
155 1.1 riastrad
156 1.1 riastrad /* 10.1.1.3 Reseeding a Hash_DRBG Instantiation */
158 1.1 riastrad
159 1.1 riastrad int
160 1.1 riastrad nist_hash_drbg_reseed(secret struct nist_hash_drbg *D,
161 1.1 riastrad const secret void *entropy, size_t entropylen,
162 1.1 riastrad const void *additional, size_t additionallen)
163 1.1 riastrad {
164 1.1 riastrad /* 1. seed_material = 0x01 || V || entropy_input || additional_input */
165 1.1 riastrad const struct hvec seed_material[] = {
166 1.1 riastrad { .hv_base = (const uint8_t[]) {0x01}, .hv_len = 1 },
167 1.1 riastrad { .hv_base = D->V, .hv_len = sizeof D->V },
168 1.1 riastrad { .hv_base = entropy, .hv_len = entropylen },
169 1.1 riastrad { .hv_base = additional, .hv_len = additionallen },
170 1.1 riastrad };
171 1.1 riastrad uint8_t seed[SEEDLEN_BYTES];
172 1.1 riastrad
173 1.1 riastrad /*
174 1.1 riastrad * 2. seed = Hash_df(seed_material, seedlen)
175 1.1 riastrad * 3. V = seed
176 1.1 riastrad */
177 1.1 riastrad CTASSERT(sizeof D->V == SEEDLEN_BYTES);
178 1.1 riastrad hash_df(seed, sizeof seed, seed_material, arraycount(seed_material));
179 1.1 riastrad memcpy(D->V, seed, sizeof D->V);
180 1.1 riastrad
181 1.1 riastrad /* 3. C = Hash_df((0x00 || V), seedlen) */
182 1.1 riastrad const struct hvec hv[] = {
183 1.1 riastrad { .hv_base = (const uint8_t[]) {0x00}, .hv_len = 1 },
184 1.1 riastrad { .hv_base = D->V, .hv_len = sizeof D->V },
185 1.1 riastrad };
186 1.1 riastrad CTASSERT(sizeof D->C == SEEDLEN_BYTES);
187 1.1 riastrad hash_df(D->C, sizeof D->C, hv, arraycount(hv));
188 1.1 riastrad
189 1.1 riastrad /* 5. reseed_counter = 1 */
190 1.1 riastrad D->reseed_counter = 1;
191 1.1 riastrad
192 1.1 riastrad /* Always return zero for hysterical raisins. (XXX) */
193 1.1 riastrad return 0;
194 1.1 riastrad }
195 1.1 riastrad
196 1.1 riastrad /* 10.1.1.4 Generating Pseudorandom Bits Using Hash_DRBG */
198 1.1 riastrad
199 1.1 riastrad int
200 1.1 riastrad nist_hash_drbg_generate(secret struct nist_hash_drbg *D,
201 1.1 riastrad secret void *output, size_t outputlen,
202 1.1 riastrad const void *additional, size_t additionallen)
203 1.1 riastrad {
204 1.1 riastrad secret HASH_CTX ctx;
205 1.1 riastrad secret uint8_t H[HASH_LENGTH];
206 1.1 riastrad uint8_t reseed_counter[4];
207 1.1 riastrad
208 1.1 riastrad ASSERT(outputlen <= NIST_HASH_DRBG_MAX_REQUEST_BYTES);
209 1.1 riastrad
210 1.1 riastrad /*
211 1.1 riastrad * 1. If reseed_counter > reseed_interval, then return an
212 1.1 riastrad * indication that a reseed is required.
213 1.1 riastrad */
214 1.1 riastrad if (D->reseed_counter > NIST_HASH_DRBG_RESEED_INTERVAL)
215 1.1 riastrad return 1;
216 1.1 riastrad
217 1.1 riastrad /* 2. If (additional_input != Null), then do: */
218 1.1 riastrad if (additionallen) {
219 1.1 riastrad /* 2.1 w = Hash(0x02 || V || additional_input) */
220 1.1 riastrad secret uint8_t w[HASH_LENGTH];
221 1.1 riastrad
222 1.1 riastrad hash_init(&ctx);
223 1.1 riastrad hash_update(&ctx, (const uint8_t[]) {0x02}, 1);
224 1.1 riastrad hash_update(&ctx, D->V, sizeof D->V);
225 1.1 riastrad hash_update(&ctx, additional, additionallen);
226 1.1 riastrad hash_final(w, &ctx);
227 1.1 riastrad
228 1.1 riastrad /* 2.2 V = (V + w) mod 2^seedlen */
229 1.1 riastrad add8(D->V, sizeof D->V, w, sizeof w);
230 1.1 riastrad
231 1.1 riastrad explicit_memset(w, 0, sizeof w);
232 1.1 riastrad }
233 1.1 riastrad
234 1.1 riastrad /* 3. (returned_bits) = Hashgen(requested_number_of_bits, V) */
235 1.1 riastrad hashgen(output, outputlen, D->V);
236 1.1 riastrad
237 1.1 riastrad /* 4. H = Hash(0x03 || V) */
238 1.1 riastrad hash_init(&ctx);
239 1.1 riastrad hash_update(&ctx, (const uint8_t[]) {0x03}, 1);
240 1.1 riastrad hash_update(&ctx, D->V, sizeof D->V);
241 1.1 riastrad hash_final(H, &ctx);
242 1.1 riastrad
243 1.1 riastrad /* 5. V = (V + H + C + reseed_counter) mod 2^seedlen */
244 1.1 riastrad be32enc(reseed_counter, D->reseed_counter);
245 1.1 riastrad add8(D->V, sizeof D->V, H, sizeof H);
246 1.1 riastrad add8(D->V, sizeof D->V, D->C, sizeof D->C);
247 1.1 riastrad add8(D->V, sizeof D->V, reseed_counter, sizeof reseed_counter);
248 1.1 riastrad
249 1.1 riastrad /* 6. reseed_counter = reseed_counter + 1 */
250 1.1 riastrad D->reseed_counter++;
251 1.1 riastrad
252 1.1 riastrad explicit_memset(&ctx, 0, sizeof ctx);
253 1.1 riastrad explicit_memset(H, 0, sizeof H);
254 1.1 riastrad
255 1.1 riastrad /* 7. Return SUCCESS, ... */
256 1.1 riastrad return 0;
257 1.1 riastrad }
258 1.1 riastrad
259 1.1 riastrad /*
261 1.1 riastrad * p := H(V) || H(V + 1) || H(V + 2) || ...
262 1.1 riastrad */
263 1.1 riastrad static void
264 1.1 riastrad hashgen(secret uint8_t *p, size_t n, const secret uint8_t V[SEEDLEN_BYTES])
265 1.1 riastrad {
266 1.1 riastrad secret uint8_t data[SEEDLEN_BYTES];
267 1.1 riastrad secret HASH_CTX ctx;
268 1.1 riastrad
269 1.1 riastrad /* Save a copy so that we can increment it. */
270 1.1 riastrad memcpy(data, V, SEEDLEN_BYTES);
271 1.1 riastrad
272 1.1 riastrad /* Generate block by block into p directly. */
273 1.1 riastrad while (HASH_LENGTH <= n) {
274 1.1 riastrad hash_init(&ctx);
275 1.1 riastrad hash_update(&ctx, data, SEEDLEN_BYTES);
276 1.1 riastrad hash_final(p, &ctx);
277 1.1 riastrad
278 1.1 riastrad p += HASH_LENGTH;
279 1.1 riastrad n -= HASH_LENGTH;
280 1.1 riastrad add8(data, sizeof data, (const uint8_t[]) {1}, 1);
281 1.1 riastrad }
282 1.1 riastrad
283 1.1 riastrad /*
284 1.1 riastrad * If any partial block requested, generate a full block and
285 1.1 riastrad * copy the part we need.
286 1.1 riastrad */
287 1.1 riastrad if (n) {
288 1.1 riastrad secret uint8_t t[HASH_LENGTH];
289 1.1 riastrad
290 1.1 riastrad hash_init(&ctx);
291 1.1 riastrad hash_update(&ctx, data, SEEDLEN_BYTES);
292 1.1 riastrad hash_final(t, &ctx);
293 1.1 riastrad
294 1.1 riastrad memcpy(p, t, n);
295 1.1 riastrad explicit_memset(t, 0, sizeof t);
296 1.1 riastrad }
297 1.1 riastrad
298 1.1 riastrad explicit_memset(data, 0, sizeof data);
299 1.1 riastrad explicit_memset(&ctx, 0, sizeof ctx);
300 1.1 riastrad }
301 1.1 riastrad
302 1.1 riastrad /*
303 1.1 riastrad * s := s + a (big-endian, radix-2^8)
304 1.1 riastrad */
305 1.1 riastrad static void
306 1.1 riastrad add8(secret uint8_t *s, size_t slen, const secret uint8_t *a, size_t alen)
307 1.1 riastrad {
308 1.1 riastrad const size_t smax = slen - 1, amax = alen - 1;
309 1.1 riastrad size_t i;
310 1.1 riastrad secret unsigned c = 0;
311 1.1 riastrad
312 1.1 riastrad /* 2^8 c + s_i := s_i + a_i + c */
313 1.1 riastrad for (i = 0; i < MIN(slen, alen); i++) {
314 1.1 riastrad c += s[smax - i] + a[amax - i];
315 1.1 riastrad s[smax - i] = c & 0xff;
316 1.1 riastrad c >>= 8;
317 1.1 riastrad }
318 1.1 riastrad
319 1.1 riastrad /* 2^8 c + s_i := s_i + c */
320 1.1 riastrad for (; i < slen; i++) {
321 1.1 riastrad c += s[smax - i];
322 1.1 riastrad s[smax - i] = c & 0xff;
323 1.1 riastrad c >>= 8;
324 1.1 riastrad }
325 1.1 riastrad
326 1.1 riastrad explicit_memset(&c, 0, sizeof c);
327 1.1 riastrad }
328 1.1 riastrad
329 1.1 riastrad /* 10.4.1 Derivation Function Using a Hash Function (Hash_df) */
331 1.1 riastrad
332 1.1 riastrad static void
333 1.1 riastrad hash_df(void *h, size_t hlen, const struct hvec *input, size_t inputlen)
334 1.1 riastrad {
335 1.1 riastrad uint8_t *p = h;
336 1.1 riastrad size_t n = hlen;
337 1.1 riastrad uint8_t counter = 1;
338 1.1 riastrad uint8_t hbits[4];
339 1.1 riastrad
340 1.1 riastrad ASSERT(hlen <= 255*HASH_LENGTH);
341 1.1 riastrad ASSERT(hlen <= UINT32_MAX/8);
342 1.1 riastrad be32enc(hbits, 8*hlen);
343 1.1 riastrad
344 1.1 riastrad while (HASH_LENGTH <= n) {
345 1.1 riastrad hash_df_block(p, counter++, hbits, input, inputlen);
346 1.1 riastrad p += HASH_LENGTH;
347 1.1 riastrad n -= HASH_LENGTH;
348 1.1 riastrad }
349 1.1 riastrad
350 1.1 riastrad if (n) {
351 1.1 riastrad secret uint8_t t[HASH_LENGTH];
352 1.1 riastrad
353 1.1 riastrad hash_df_block(t, counter, hbits, input, inputlen);
354 1.1 riastrad memcpy(p, t, n);
355 1.1 riastrad
356 1.1 riastrad explicit_memset(t, 0, sizeof t);
357 1.1 riastrad }
358 1.1 riastrad }
359 1.1 riastrad
360 1.1 riastrad static void
361 1.1 riastrad hash_df_block(secret void *h, uint8_t counter, uint8_t hbits[4],
362 1.1 riastrad const struct hvec *input, size_t inputlen)
363 1.1 riastrad {
364 1.1 riastrad secret HASH_CTX ctx;
365 1.1 riastrad size_t i;
366 1.1 riastrad
367 1.1 riastrad /*
368 1.1 riastrad * Hash_df Process, step 4.1:
369 1.1 riastrad * Hash(counter || no_of_bits_to_return || input_string)
370 1.1 riastrad */
371 1.1 riastrad hash_init(&ctx);
372 1.1 riastrad hash_update(&ctx, &counter, 1);
373 1.1 riastrad hash_update(&ctx, hbits, 4);
374 1.1 riastrad for (i = 0; i < inputlen; i++) {
375 1.1 riastrad if (input[i].hv_len)
376 1.1 riastrad hash_update(&ctx, input[i].hv_base, input[i].hv_len);
377 1.1 riastrad }
378 1.1 riastrad hash_final(h, &ctx);
379 1.1 riastrad
380 1.1 riastrad explicit_memset(&ctx, 0, sizeof ctx);
381 1.1 riastrad }
382 1.1 riastrad
383 1.1 riastrad /*
385 1.1 riastrad * Known-answer test vectors for Hash_DRBG with SHA-256
386 1.1 riastrad */
387 1.1 riastrad
388 1.1 riastrad /* Hash_DRBG.PDF, p. 190 */
389 1.1 riastrad static const uint8_t kat_entropy[3][SEEDLEN_BYTES] = {
390 1.1 riastrad [0] = {
391 1.1 riastrad 0x00,0x01,0x02,0x03, 0x04,0x05,0x06,0x07,
392 1.1 riastrad 0x08,0x09,0x0a,0x0b, 0x0c,0x0d,0x0e,0x0f,
393 1.1 riastrad 0x10,0x11,0x12,0x13, 0x14,0x15,0x16,0x17,
394 1.1 riastrad 0x18,0x19,0x1a,0x1b, 0x1c,0x1d,0x1e,0x1f,
395 1.1 riastrad 0x20,0x21,0x22,0x23, 0x24,0x25,0x26,0x27,
396 1.1 riastrad 0x28,0x29,0x2a,0x2b, 0x2c,0x2d,0x2e,0x2f,
397 1.1 riastrad 0x30,0x31,0x32,0x33, 0x34,0x35,0x36,
398 1.1 riastrad },
399 1.1 riastrad [1] = { /* for reseed1 */
400 1.1 riastrad 0x80,0x81,0x82,0x83, 0x84,0x85,0x86,0x87,
401 1.1 riastrad 0x88,0x89,0x8a,0x8b, 0x8c,0x8d,0x8e,0x8f,
402 1.1 riastrad 0x90,0x91,0x92,0x93, 0x94,0x95,0x96,0x97,
403 1.1 riastrad 0x98,0x99,0x9a,0x9b, 0x9c,0x9d,0x9e,0x9f,
404 1.1 riastrad 0xa0,0xa1,0xa2,0xa3, 0xa4,0xa5,0xa6,0xa7,
405 1.1 riastrad 0xa8,0xa9,0xaa,0xab, 0xac,0xad,0xae,0xaf,
406 1.1 riastrad 0xb0,0xb1,0xb2,0xb3, 0xb4,0xb5,0xb6,
407 1.1 riastrad },
408 1.1 riastrad [2] = { /* for reseed2 */
409 1.1 riastrad 0xc0,0xc1,0xc2,0xc3, 0xc4,0xc5,0xc6,0xc7,
410 1.1 riastrad 0xc8,0xc9,0xca,0xcb, 0xcc,0xcd,0xce,0xcf,
411 1.1 riastrad 0xd0,0xd1,0xd2,0xd3, 0xd4,0xd5,0xd6,0xd7,
412 1.1 riastrad 0xd8,0xd9,0xda,0xdb, 0xdc,0xdd,0xde,0xdf,
413 1.1 riastrad 0xe0,0xe1,0xe2,0xe3, 0xe4,0xe5,0xe6,0xe7,
414 1.1 riastrad 0xe8,0xe9,0xea,0xeb, 0xec,0xed,0xee,0xef,
415 1.1 riastrad 0xf0,0xf1,0xf2,0xf3, 0xf4,0xf5,0xf6,
416 1.1 riastrad },
417 1.1 riastrad };
418 1.1 riastrad
419 1.1 riastrad static const uint8_t kat_nonce[] = {
420 1.1 riastrad 0x20,0x21,0x22,0x23, 0x24,0x25,0x26,0x27,
421 1.1 riastrad };
422 1.1 riastrad
423 1.1 riastrad static const struct hvec kat_zero = { .hv_base = 0, .hv_len = 0 };
424 1.1 riastrad
425 1.1 riastrad static const struct hvec kat_personalization = {
427 1.1 riastrad .hv_len = 55,
428 1.1 riastrad .hv_base = (const void *)(const uint8_t[]) { /* p. 208 */
429 1.1 riastrad 0x40,0x41,0x42,0x43, 0x44,0x45,0x46,0x47,
430 1.1 riastrad 0x48,0x49,0x4a,0x4b, 0x4c,0x4d,0x4e,0x4f,
431 1.1 riastrad 0x50,0x51,0x52,0x53, 0x54,0x55,0x56,0x57,
432 1.1 riastrad 0x58,0x59,0x5a,0x5b, 0x5c,0x5d,0x5e,0x5f,
433 1.1 riastrad 0x60,0x61,0x62,0x63, 0x64,0x65,0x66,0x67,
434 1.1 riastrad 0x68,0x69,0x6a,0x6b, 0x6c,0x6d,0x6e,0x6f,
435 1.1 riastrad 0x70,0x71,0x72,0x73, 0x74,0x75,0x76,
436 1.1 riastrad },
437 1.1 riastrad };
438 1.1 riastrad
439 1.1 riastrad static const struct hvec *const kat_no_additional[] = {
440 1.1 riastrad [0] = &kat_zero,
441 1.1 riastrad [1] = &kat_zero,
442 1.1 riastrad };
443 1.1 riastrad
444 1.1 riastrad static const struct hvec *const kat_additional[] = {
445 1.1 riastrad [0] = &(const struct hvec) {
446 1.1 riastrad .hv_len = 55,
447 1.1 riastrad .hv_base = (const void *)(const uint8_t[]) {
448 1.1 riastrad 0x60,0x61,0x62,0x63, 0x64,0x65,0x66,0x67,
449 1.1 riastrad 0x68,0x69,0x6a,0x6b, 0x6c,0x6d,0x6e,0x6f,
450 1.1 riastrad 0x70,0x71,0x72,0x73, 0x74,0x75,0x76,0x77,
451 1.1 riastrad 0x78,0x79,0x7a,0x7b, 0x7c,0x7d,0x7e,0x7f,
452 1.1 riastrad 0x80,0x81,0x82,0x83, 0x84,0x85,0x86,0x87,
453 1.1 riastrad 0x88,0x89,0x8a,0x8b, 0x8c,0x8d,0x8e,0x8f,
454 1.1 riastrad 0x90,0x91,0x92,0x93, 0x94,0x95,0x96,
455 1.1 riastrad },
456 1.1 riastrad },
457 1.1 riastrad [1] = &(const struct hvec) {
458 1.1 riastrad .hv_len = 55,
459 1.1 riastrad .hv_base = (const void *)(const uint8_t[]) {
460 1.1 riastrad 0xa0,0xa1,0xa2,0xa3, 0xa4,0xa5,0xa6,0xa7,
461 1.1 riastrad 0xa8,0xa9,0xaa,0xab, 0xac,0xad,0xae,0xaf,
462 1.1 riastrad 0xb0,0xb1,0xb2,0xb3, 0xb4,0xb5,0xb6,0xb7,
463 1.1 riastrad 0xb8,0xb9,0xba,0xbb, 0xbc,0xbd,0xbe,0xbf,
464 1.1 riastrad 0xc0,0xc1,0xc2,0xc3, 0xc4,0xc5,0xc6,0xc7,
465 1.1 riastrad 0xc8,0xc9,0xca,0xcb, 0xcc,0xcd,0xce,0xcf,
466 1.1 riastrad 0xd0,0xd1,0xd2,0xd3, 0xd4,0xd5,0xd6,
467 1.1 riastrad },
468 1.1 riastrad },
469 1.1 riastrad };
470 1.1 riastrad
471 1.1 riastrad static const struct {
473 1.1 riastrad const struct hvec *personalization;
474 1.1 riastrad const struct hvec *const *additional;
475 1.1 riastrad bool reseed;
476 1.1 riastrad uint8_t C[SEEDLEN_BYTES];
477 1.1 riastrad uint8_t V[3][SEEDLEN_BYTES];
478 1.1 riastrad uint8_t rnd_val[2][64];
479 1.1 riastrad } kat[] = {
480 1.1 riastrad [0] = { /* Hash_DRBG.pdf, p. 190 */
481 1.1 riastrad .personalization = &kat_zero,
482 1.1 riastrad .additional = kat_no_additional,
483 1.1 riastrad .reseed = false,
484 1.1 riastrad .C = { /* p. 193 */
485 1.1 riastrad 0xe1,0x5d,0xe4,0xa8, 0xe3,0xb1,0x41,0x9b,
486 1.1 riastrad 0x61,0xd5,0x34,0xf1, 0x5d,0xbd,0x31,0xee,
487 1.1 riastrad 0x19,0xec,0x59,0x5f, 0x8b,0x98,0x11,0x1a,
488 1.1 riastrad 0x94,0xf5,0x22,0x37, 0xad,0x5d,0x66,0xf0,
489 1.1 riastrad 0xcf,0xaa,0xfd,0xdc, 0x90,0x19,0x59,0x02,
490 1.1 riastrad 0xe9,0x79,0xf7,0x9b, 0x65,0x35,0x7f,0xea,
491 1.1 riastrad 0x85,0x99,0x8e,0x4e, 0x37,0xd2,0xc1,
492 1.1 riastrad },
493 1.1 riastrad .V = {
494 1.1 riastrad [0] = { /* p. 192 */
495 1.1 riastrad 0xab,0x41,0xcd,0xe4, 0x37,0xab,0x8b,0x09,
496 1.1 riastrad 0x1c,0xa7,0xc5,0x75, 0x5d,0x10,0xf0,0x11,
497 1.1 riastrad 0x0c,0x1d,0xbd,0x46, 0x2f,0x22,0x6c,0xfd,
498 1.1 riastrad 0xab,0xfb,0xb0,0x4a, 0x8b,0xcd,0xef,0x95,
499 1.1 riastrad 0x16,0x7d,0x84,0xaf, 0x64,0x12,0x8c,0x0d,
500 1.1 riastrad 0x71,0xf4,0xd5,0xb8, 0xc0,0xed,0xfb,0xbe,
501 1.1 riastrad 0x3d,0xf4,0x04,0x48, 0xd2,0xd8,0xe1,
502 1.1 riastrad },
503 1.1 riastrad [1] = { /* p. 195 */
504 1.1 riastrad 0x8c,0x9f,0xb2,0x8d, 0x1b,0x5c,0xcc,0xa4,
505 1.1 riastrad 0x7e,0x7c,0xfa,0x66, 0xba,0xce,0x21,0xff,
506 1.1 riastrad 0x26,0x0a,0x16,0xa5, 0xba,0xba,0x7f,0x14,
507 1.1 riastrad 0x4e,0x75,0x79,0x36, 0x8e,0x99,0x55,0xbe,
508 1.1 riastrad 0xfb,0xe7,0x00,0xee, 0xf8,0x72,0x77,0x6b,
509 1.1 riastrad 0x17,0xae,0xff,0xd5, 0x3d,0x76,0xf4,0xe3,
510 1.1 riastrad 0xbe,0x65,0xe8,0xc9, 0x4b,0x70,0x8f,
511 1.1 riastrad },
512 1.1 riastrad [2] = { /* p. 197 */
513 1.1 riastrad 0x6d,0xfd,0x97,0x35, 0xff,0x0e,0x0e,0x3f,
514 1.1 riastrad 0xe0,0x52,0x2f,0x58, 0x18,0x8b,0x53,0xed,
515 1.1 riastrad 0x3f,0xf6,0x70,0x05, 0x46,0x52,0x90,0x44,
516 1.1 riastrad 0xb6,0x2b,0xe1,0x7d, 0x1b,0x1c,0x21,0xd0,
517 1.1 riastrad 0x91,0xb0,0x89,0xb1, 0x77,0x47,0x95,0xdb,
518 1.1 riastrad 0x14,0x22,0xa8,0x6c, 0x95,0x46,0x34,0x80,
519 1.1 riastrad 0x76,0xb4,0xb6,0x21, 0xc7,0x2f,0x91,
520 1.1 riastrad },
521 1.1 riastrad },
522 1.1 riastrad .rnd_val = {
523 1.1 riastrad [0] = {
524 1.1 riastrad 0x77,0xe0,0x5a,0x0e, 0x7d,0xc7,0x8a,0xb5,
525 1.1 riastrad 0xd8,0x93,0x4d,0x5e, 0x93,0xe8,0x2c,0x06,
526 1.1 riastrad 0xa0,0x7c,0x04,0xce, 0xe6,0xc9,0xc5,0x30,
527 1.1 riastrad 0x45,0xee,0xb4,0x85, 0x87,0x27,0x77,0xcf,
528 1.1 riastrad 0x3b,0x3e,0x35,0xc4, 0x74,0xf9,0x76,0xb8,
529 1.1 riastrad 0x94,0xbf,0x30,0x1a, 0x86,0xfa,0x65,0x1f,
530 1.1 riastrad 0x46,0x39,0x70,0xe8, 0x9d,0x4a,0x05,0x34,
531 1.1 riastrad 0xb2,0xec,0xad,0x29, 0xec,0x04,0x4e,0x7e,
532 1.1 riastrad },
533 1.1 riastrad {
534 1.1 riastrad 0x5f,0xf4,0xba,0x49, 0x3c,0x40,0xcf,0xff,
535 1.1 riastrad 0x3b,0x01,0xe4,0x72, 0xc5,0x75,0x66,0x8c,
536 1.1 riastrad 0xce,0x38,0x80,0xb9, 0x29,0x0b,0x05,0xbf,
537 1.1 riastrad 0xed,0xe5,0xec,0x96, 0xed,0x5e,0x9b,0x28,
538 1.1 riastrad 0x98,0x50,0x8b,0x09, 0xbc,0x80,0x0e,0xee,
539 1.1 riastrad 0x09,0x9a,0x3c,0x90, 0x60,0x2a,0xbd,0x4b,
540 1.1 riastrad 0x1d,0x4f,0x34,0x3d, 0x49,0x7c,0x60,0x55,
541 1.1 riastrad 0xc8,0x7b,0xb9,0x56, 0xd5,0x3b,0xf3,0x51,
542 1.1 riastrad },
543 1.1 riastrad },
544 1.1 riastrad },
545 1.1 riastrad
546 1.1 riastrad [1] = { /* Hash_DRBG.pdf, p. 198 */
548 1.1 riastrad .personalization = &kat_zero,
549 1.1 riastrad .additional = kat_additional,
550 1.1 riastrad .reseed = false,
551 1.1 riastrad .C = { /* p. 201 */
552 1.1 riastrad 0xe1,0x5d,0xe4,0xa8, 0xe3,0xb1,0x41,0x9b,
553 1.1 riastrad 0x61,0xd5,0x34,0xf1, 0x5d,0xbd,0x31,0xee,
554 1.1 riastrad 0x19,0xec,0x59,0x5f, 0x8b,0x98,0x11,0x1a,
555 1.1 riastrad 0x94,0xf5,0x22,0x37, 0xad,0x5d,0x66,0xf0,
556 1.1 riastrad 0xcf,0xaa,0xfd,0xdc, 0x90,0x19,0x59,0x02,
557 1.1 riastrad 0xe9,0x79,0xf7,0x9b, 0x65,0x35,0x7f,0xea,
558 1.1 riastrad 0x85,0x99,0x8e,0x4e, 0x37,0xd2,0xc1,
559 1.1 riastrad },
560 1.1 riastrad .V = {
561 1.1 riastrad [0] = { /* p. 200 */
562 1.1 riastrad 0xab,0x41,0xcd,0xe4, 0x37,0xab,0x8b,0x09,
563 1.1 riastrad 0x1c,0xa7,0xc5,0x75, 0x5d,0x10,0xf0,0x11,
564 1.1 riastrad 0x0c,0x1d,0xbd,0x46, 0x2f,0x22,0x6c,0xfd,
565 1.1 riastrad 0xab,0xfb,0xb0,0x4a, 0x8b,0xcd,0xef,0x95,
566 1.1 riastrad 0x16,0x7d,0x84,0xaf, 0x64,0x12,0x8c,0x0d,
567 1.1 riastrad 0x71,0xf4,0xd5,0xb8, 0xc0,0xed,0xfb,0xbe,
568 1.1 riastrad 0x3d,0xf4,0x04,0x48, 0xd2,0xd8,0xe1,
569 1.1 riastrad },
570 1.1 riastrad [1] = { /* p. 204 */
571 1.1 riastrad 0x8c,0x9f,0xb2,0x8d, 0x1b,0x5c,0xcc,0xa4,
572 1.1 riastrad 0x7e,0x7c,0xfa,0x66, 0xba,0xce,0x21,0xff,
573 1.1 riastrad 0x26,0x0a,0x16,0xa5, 0xba,0xba,0x7f,0x1f,
574 1.1 riastrad 0xd3,0x3b,0x30,0x79, 0x8f,0xb2,0x9a,0x0f,
575 1.1 riastrad 0xba,0x66,0x65,0x02, 0x7d,0x7f,0x10,0x58,
576 1.1 riastrad 0x71,0xbf,0xb4,0x40, 0xdf,0xbe,0xde,0x81,
577 1.1 riastrad 0xd0,0x4d,0x22,0xdf, 0xf7,0x89,0xe1,
578 1.1 riastrad },
579 1.1 riastrad [2] = { /* p. 207 */
580 1.1 riastrad 0x6d,0xfd,0x97,0x35, 0xff,0x0e,0x0e,0x3f,
581 1.1 riastrad 0xe0,0x52,0x2f,0x58, 0x18,0x8b,0x53,0xed,
582 1.1 riastrad 0x3f,0xf6,0x70,0x05, 0x46,0x52,0x90,0xe1,
583 1.1 riastrad 0x7c,0x5a,0xd8,0x2d, 0xa9,0x2a,0x05,0x01,
584 1.1 riastrad 0xaa,0x66,0x3a,0xa6, 0x9f,0xa5,0xa0,0xb0,
585 1.1 riastrad 0x81,0x2b,0x4b,0x4f, 0xaf,0xf3,0xfe,0xce,
586 1.1 riastrad 0x79,0xcc,0xf6,0xaa, 0xde,0xc1,0xd0,
587 1.1 riastrad },
588 1.1 riastrad },
589 1.1 riastrad .rnd_val = {
590 1.1 riastrad [0] = { /* p. 203 */
591 1.1 riastrad 0x51,0x07,0x24,0xb9, 0x3a,0xe9,0xa1,0x82,
592 1.1 riastrad 0x70,0xe4,0x84,0x73, 0x71,0x1d,0x88,0x24,
593 1.1 riastrad 0x63,0x1b,0xaa,0x7f, 0x1d,0x9a,0xc9,0x28,
594 1.1 riastrad 0x4e,0x7e,0xc8,0xf3, 0x63,0x7f,0x7a,0x74,
595 1.1 riastrad 0x3b,0x36,0x44,0xeb, 0x96,0xc9,0x86,0x27,
596 1.1 riastrad 0xc8,0xfd,0x40,0x5a, 0x7a,0x46,0x03,0xf3,
597 1.1 riastrad 0x8c,0xff,0x7c,0x89, 0xe9,0xc1,0x33,0xf5,
598 1.1 riastrad 0x85,0x1f,0x40,0xe9, 0x20,0x30,0xfe,0xa2,
599 1.1 riastrad },
600 1.1 riastrad [1] = { /* p. 206 */
601 1.1 riastrad 0x62,0x53,0xda,0x3a, 0xae,0x8b,0x88,0xa3,
602 1.1 riastrad 0xb7,0x46,0xe4,0xc8, 0xb2,0x63,0x5c,0x54,
603 1.1 riastrad 0x0f,0x6e,0x9e,0xa7, 0x15,0x7e,0xe6,0x9d,
604 1.1 riastrad 0xd7,0x1e,0xfb,0x2e, 0x8f,0xf7,0xbb,0xe1,
605 1.1 riastrad 0xe3,0x33,0x68,0x88, 0x38,0xdd,0x7d,0xe4,
606 1.1 riastrad 0x9c,0xc8,0x89,0x90, 0x30,0x9c,0x96,0xcd,
607 1.1 riastrad 0xb2,0xab,0x92,0x95, 0x74,0x36,0xbf,0x83,
608 1.1 riastrad 0xd1,0xbd,0x83,0x08, 0x19,0xc7,0x48,0xca,
609 1.1 riastrad },
610 1.1 riastrad },
611 1.1 riastrad },
612 1.1 riastrad
613 1.1 riastrad [2] = { /* Hash_DRBG.pdf, p. 208 */
615 1.1 riastrad .personalization = &kat_personalization,
616 1.1 riastrad .additional = kat_no_additional,
617 1.1 riastrad .reseed = false,
618 1.1 riastrad .C = { /* p. 211 */
619 1.1 riastrad 0x44,0x74,0x8a,0x78, 0xb1,0x6e,0x75,0x55,
620 1.1 riastrad 0x9f,0x88,0x1d,0x51, 0xc1,0x5d,0xfe,0x6c,
621 1.1 riastrad 0x52,0xcf,0xb0,0xbb, 0x71,0x62,0x01,0x69,
622 1.1 riastrad 0xc7,0x93,0x34,0x27, 0x67,0xe7,0xf8,0x87,
623 1.1 riastrad 0x5f,0x42,0xcb,0x6a, 0x20,0xc8,0x9d,0x7c,
624 1.1 riastrad 0x6e,0xf3,0xdc,0x61, 0x0d,0x8f,0xf2,0x03,
625 1.1 riastrad 0xd6,0x76,0x6c,0xed, 0x19,0x19,0xd0,
626 1.1 riastrad },
627 1.1 riastrad .V = {
628 1.1 riastrad [0] = { /* p. 210 */
629 1.1 riastrad 0xa3,0xe9,0x4e,0x39, 0x26,0xfd,0xa1,0x69,
630 1.1 riastrad 0xc3,0x03,0xd6,0x64, 0x38,0x39,0x05,0xe0,
631 1.1 riastrad 0xd7,0x99,0x62,0xd1, 0x65,0x44,0x6d,0x63,
632 1.1 riastrad 0xbd,0xa6,0x54,0xd1, 0x32,0xf7,0x2d,0xb4,
633 1.1 riastrad 0x71,0x56,0x4b,0x45, 0x6f,0xf2,0xee,0xc8,
634 1.1 riastrad 0x36,0x42,0x2a,0xcc, 0x5a,0x02,0x99,0x35,
635 1.1 riastrad 0xa7,0x99,0x29,0x90, 0x94,0xa1,0xca,
636 1.1 riastrad },
637 1.1 riastrad [1] = { /* p. 213 */
638 1.1 riastrad 0xe8,0x5d,0xd8,0xb1, 0xd8,0x6c,0x16,0xbf,
639 1.1 riastrad 0x62,0x8b,0xf3,0xb5, 0xf9,0x97,0x04,0x4d,
640 1.1 riastrad 0x2a,0x69,0x13,0x8c, 0xd6,0xa6,0x6e,0xe7,
641 1.1 riastrad 0x36,0xdb,0xaa,0x3b, 0xf1,0xd0,0x28,0x3b,
642 1.1 riastrad 0x71,0x7b,0x33,0x6e, 0xb3,0xae,0x5b,0xdd,
643 1.1 riastrad 0x04,0x17,0x2e,0xa2, 0x6e,0x5a,0x48,0xf3,
644 1.1 riastrad 0xb3,0xfb,0xab,0xf8, 0x2f,0x76,0x79,
645 1.1 riastrad },
646 1.1 riastrad [2] = { /* p. 215 */
647 1.1 riastrad 0x2c,0xd2,0x63,0x2a, 0x89,0xda,0x8c,0x15,
648 1.1 riastrad 0x02,0x14,0x11,0x07, 0xba,0xf5,0x02,0xb9,
649 1.1 riastrad 0x7d,0x38,0xc4,0x48, 0x48,0x08,0x71,0x0a,
650 1.1 riastrad 0x66,0xf8,0x40,0x11, 0xd7,0x02,0x8d,0x14,
651 1.1 riastrad 0xd3,0x15,0x5a,0x73, 0x79,0xad,0xd5,0x3c,
652 1.1 riastrad 0xc8,0xea,0x84,0xd0, 0xfc,0x64,0x1d,0xfc,
653 1.1 riastrad 0x62,0x9e,0x06,0x19, 0x1f,0x5f,0x6d,
654 1.1 riastrad },
655 1.1 riastrad },
656 1.1 riastrad .rnd_val = {
657 1.1 riastrad [0] = { /* p. 213 */
658 1.1 riastrad 0x4a,0x62,0x66,0x4f, 0x26,0x6e,0xe5,0x37,
659 1.1 riastrad 0xb9,0x0d,0x64,0xb0, 0x5e,0x1d,0x81,0x3d,
660 1.1 riastrad 0x28,0xb1,0x59,0xa9, 0x79,0xf1,0x50,0x9d,
661 1.1 riastrad 0xde,0x31,0xb7,0x1d, 0xa4,0x3d,0x54,0x6e,
662 1.1 riastrad 0xe8,0xe7,0x86,0x78, 0x20,0x2d,0xc2,0x37,
663 1.1 riastrad 0xad,0x4a,0xfe,0x7d, 0xf3,0x10,0xc9,0xa4,
664 1.1 riastrad 0x13,0xe3,0x8a,0xaf, 0x41,0x7d,0x2d,0x22,
665 1.1 riastrad 0x5a,0xa3,0x65,0xec, 0x4a,0x7d,0x29,0x96,
666 1.1 riastrad },
667 1.1 riastrad [1] = { /* p. 215 */
668 1.1 riastrad 0x59,0x58,0x3d,0x3c, 0x0a,0xc3,0x71,0x30,
669 1.1 riastrad 0xc4,0x78,0x9a,0x83, 0x11,0xb8,0xca,0x8f,
670 1.1 riastrad 0x98,0x5e,0xf1,0xe8, 0xf9,0x4d,0x95,0x4e,
671 1.1 riastrad 0x32,0xe3,0x44,0xa6, 0x21,0xc2,0x4b,0x2f,
672 1.1 riastrad 0x37,0x1d,0xa9,0xba, 0x3c,0x33,0x15,0x3f,
673 1.1 riastrad 0x09,0xe5,0x51,0x45, 0xe7,0x62,0x92,0x6b,
674 1.1 riastrad 0x73,0xac,0x14,0x7a, 0x1e,0x86,0x31,0xd1,
675 1.1 riastrad 0xcc,0xd0,0x85,0x67, 0xcf,0x67,0x7c,0x72,
676 1.1 riastrad },
677 1.1 riastrad },
678 1.1 riastrad },
679 1.1 riastrad
680 1.1 riastrad [3] = { /* Hash_DRBG.pdf, p. 215 */
682 1.1 riastrad .personalization = &kat_personalization,
683 1.1 riastrad .additional = kat_additional,
684 1.1 riastrad .reseed = false,
685 1.1 riastrad .C = { /* p. 220 */
686 1.1 riastrad 0x44,0x74,0x8a,0x78, 0xb1,0x6e,0x75,0x55,
687 1.1 riastrad 0x9f,0x88,0x1d,0x51, 0xc1,0x5d,0xfe,0x6c,
688 1.1 riastrad 0x52,0xcf,0xb0,0xbb, 0x71,0x62,0x01,0x69,
689 1.1 riastrad 0xc7,0x93,0x34,0x27, 0x67,0xe7,0xf8,0x87,
690 1.1 riastrad 0x5f,0x42,0xcb,0x6a, 0x20,0xc8,0x9d,0x7c,
691 1.1 riastrad 0x6e,0xf3,0xdc,0x61, 0x0d,0x8f,0xf2,0x03,
692 1.1 riastrad 0xd6,0x76,0x6c,0xed, 0x19,0x19,0xd0,
693 1.1 riastrad },
694 1.1 riastrad .V = {
695 1.1 riastrad [0] = { /* p. 218 */
696 1.1 riastrad 0xa3,0xe9,0x4e,0x39, 0x26,0xfd,0xa1,0x69,
697 1.1 riastrad 0xc3,0x03,0xd6,0x64, 0x38,0x39,0x05,0xe0,
698 1.1 riastrad 0xd7,0x99,0x62,0xd1, 0x65,0x44,0x6d,0x63,
699 1.1 riastrad 0xbd,0xa6,0x54,0xd1, 0x32,0xf7,0x2d,0xb4,
700 1.1 riastrad 0x71,0x56,0x4b,0x45, 0x6f,0xf2,0xee,0xc8,
701 1.1 riastrad 0x36,0x42,0x2a,0xcc, 0x5a,0x02,0x99,0x35,
702 1.1 riastrad 0xa7,0x99,0x29,0x90, 0x94,0xa1,0xca,
703 1.1 riastrad },
704 1.1 riastrad [1] = { /* p. 222 */
705 1.1 riastrad 0xe8,0x5d,0xd8,0xb1, 0xd8,0x6c,0x16,0xbf,
706 1.1 riastrad 0x62,0x8b,0xf3,0xb5, 0xf9,0x97,0x04,0x4d,
707 1.1 riastrad 0x2a,0x69,0x13,0x8c, 0xd6,0xa6,0x6f,0x8c,
708 1.1 riastrad 0xa8,0x7b,0x87,0x43, 0x50,0x20,0x2e,0x1d,
709 1.1 riastrad 0x8a,0xb0,0xb5,0xad, 0x47,0xac,0xc2,0x75,
710 1.1 riastrad 0x40,0x28,0x9f,0xe3, 0xa8,0xe3,0x1f,0x7b,
711 1.1 riastrad 0x56,0x58,0xdd,0xd1, 0x96,0x94,0x89,
712 1.1 riastrad },
713 1.1 riastrad [2] = { /* p. 225 */
714 1.1 riastrad 0x2c,0xd2,0x63,0x2a, 0x89,0xda,0x8c,0x15,
715 1.1 riastrad 0x02,0x14,0x11,0x07, 0xba,0xf5,0x02,0xb9,
716 1.1 riastrad 0x7d,0x38,0xc4,0x48, 0x48,0x08,0x71,0xb2,
717 1.1 riastrad 0x77,0xae,0xc7,0xff, 0x8d,0xa2,0x3c,0x71,
718 1.1 riastrad 0xef,0xf5,0x9d,0xc2, 0x4e,0x5e,0x4c,0x7f,
719 1.1 riastrad 0x58,0x47,0xb0,0xc1, 0x2f,0x6a,0x59,0x9e,
720 1.1 riastrad 0x6b,0x2e,0xda,0xc0, 0x30,0x6b,0xcd,
721 1.1 riastrad },
722 1.1 riastrad },
723 1.1 riastrad .rnd_val = { /* p. 222 */
724 1.1 riastrad [0] = {
725 1.1 riastrad 0xe0,0xb9,0x7c,0x82, 0x12,0x68,0xfd,0x3b,
726 1.1 riastrad 0xb2,0xca,0xbf,0xd1, 0xf9,0x54,0x84,0x78,
727 1.1 riastrad 0xae,0x8a,0x60,0x41, 0x7f,0x7b,0x09,0x4a,
728 1.1 riastrad 0x26,0x13,0x95,0x46, 0x06,0x2b,0x52,0x1c,
729 1.1 riastrad 0xfd,0x33,0xe4,0xe3, 0x9b,0x9d,0xcd,0x0a,
730 1.1 riastrad 0x3d,0xa1,0x52,0x09, 0xc7,0x2a,0xdb,0xe5,
731 1.1 riastrad 0x8c,0x20,0xab,0x34, 0x07,0x02,0x69,0x51,
732 1.1 riastrad 0x29,0x7a,0xd2,0x54, 0x30,0x75,0x53,0xa5,
733 1.1 riastrad },
734 1.1 riastrad [1] = { /* p. 225 */
735 1.1 riastrad 0xc1,0xac,0xd3,0xad, 0xa4,0xc8,0xc4,0x95,
736 1.1 riastrad 0xbf,0x17,0x9d,0xb5, 0x98,0x22,0xc3,0x51,
737 1.1 riastrad 0xbc,0x47,0x9a,0xbe, 0x4e,0xb2,0x8f,0x84,
738 1.1 riastrad 0x39,0x57,0xb1,0x1e, 0x3c,0x2b,0xc0,0x48,
739 1.1 riastrad 0x83,0x96,0x42,0x97, 0x97,0x5b,0xd7,0x2d,
740 1.1 riastrad 0x10,0x24,0xab,0xcf, 0x6f,0x66,0x15,0xd7,
741 1.1 riastrad 0xf5,0xb4,0xfd,0x1e, 0x40,0xa6,0x4e,0xeb,
742 1.1 riastrad 0x45,0xba,0x21,0x81, 0xb8,0x39,0x37,0xed,
743 1.1 riastrad },
744 1.1 riastrad },
745 1.1 riastrad },
746 1.1 riastrad
747 1.1 riastrad [4] = { /* Hash_DRBG.pdf, p. 225 */
749 1.1 riastrad .personalization = &kat_zero,
750 1.1 riastrad .additional = kat_no_additional,
751 1.1 riastrad .reseed = true,
752 1.1 riastrad .C = { /* p. 229 */
753 1.1 riastrad 0xe1,0x5d,0xe4,0xa8, 0xe3,0xb1,0x41,0x9b,
754 1.1 riastrad 0x61,0xd5,0x34,0xf1, 0x5d,0xbd,0x31,0xee,
755 1.1 riastrad 0x19,0xec,0x59,0x5f, 0x8b,0x98,0x11,0x1a,
756 1.1 riastrad 0x94,0xf5,0x22,0x37, 0xad,0x5d,0x66,0xf0,
757 1.1 riastrad 0xcf,0xaa,0xfd,0xdc, 0x90,0x19,0x59,0x02,
758 1.1 riastrad 0xe9,0x79,0xf7,0x9b, 0x65,0x35,0x7f,0xea,
759 1.1 riastrad 0x85,0x99,0x8e,0x4e, 0x37,0xd2,0xc1,
760 1.1 riastrad },
761 1.1 riastrad .V = {
762 1.1 riastrad [0] = { /* p. 227 */
763 1.1 riastrad 0xab,0x41,0xcd,0xe4, 0x37,0xab,0x8b,0x09,
764 1.1 riastrad 0x1c,0xa7,0xc5,0x75, 0x5d,0x10,0xf0,0x11,
765 1.1 riastrad 0x0c,0x1d,0xbd,0x46, 0x2f,0x22,0x6c,0xfd,
766 1.1 riastrad 0xab,0xfb,0xb0,0x4a, 0x8b,0xcd,0xef,0x95,
767 1.1 riastrad 0x16,0x7d,0x84,0xaf, 0x64,0x12,0x8c,0x0d,
768 1.1 riastrad 0x71,0xf4,0xd5,0xb8, 0xc0,0xed,0xfb,0xbe,
769 1.1 riastrad 0x3d,0xf4,0x04,0x48, 0xd2,0xd8,0xe1,
770 1.1 riastrad },
771 1.1 riastrad [1] = { /* p. 234 */
772 1.1 riastrad 0x23,0x97,0x6c,0x61, 0x63,0xd7,0xe2,0x4a,
773 1.1 riastrad 0x1a,0x03,0x8f,0x2b, 0x2b,0x64,0x67,0x97,
774 1.1 riastrad 0x50,0xca,0x9e,0xd8, 0xd1,0x40,0x69,0x8d,
775 1.1 riastrad 0x64,0x22,0x39,0x7b, 0x02,0x96,0x9e,0x6e,
776 1.1 riastrad 0xcd,0xd2,0x9d,0xac, 0xc5,0x76,0x7e,0x2c,
777 1.1 riastrad 0xc2,0xd0,0xa1,0x56, 0xc8,0x7a,0xd0,0xb3,
778 1.1 riastrad 0x57,0x89,0x05,0x07, 0xe0,0x37,0x77,
779 1.1 riastrad },
780 1.1 riastrad [2] = { /* p. 239 */
781 1.1 riastrad 0x92,0xfb,0x0e,0x48, 0x0e,0x86,0x99,0x13,
782 1.1 riastrad 0xc7,0xad,0x45,0xc7, 0xe3,0xfd,0x46,0x10,
783 1.1 riastrad 0x17,0xe5,0xa6,0xb7, 0x70,0xf3,0x3b,0x31,
784 1.1 riastrad 0x3c,0x38,0x83,0xf1, 0xcc,0x56,0x71,0x89,
785 1.1 riastrad 0x45,0x21,0xf5,0xed, 0xe6,0x2e,0xaa,0xb0,
786 1.1 riastrad 0x83,0xb1,0x41,0xa7, 0x5b,0x5c,0xc0,0x22,
787 1.1 riastrad 0x60,0x5a,0x8a,0x3d, 0xc7,0x1b,0xa7,
788 1.1 riastrad },
789 1.1 riastrad },
790 1.1 riastrad .rnd_val = {
791 1.1 riastrad [0] = { /* p. 234 */
792 1.1 riastrad 0x92,0x27,0x55,0x23, 0xc7,0x0e,0x56,0x7b,
793 1.1 riastrad 0xcf,0x9b,0x35,0xec, 0x50,0xb9,0x33,0xf8,
794 1.1 riastrad 0x12,0x61,0x6d,0xf5, 0x86,0xb7,0xf7,0x2e,
795 1.1 riastrad 0xe1,0xbc,0x77,0x35, 0xa5,0xc2,0x65,0x43,
796 1.1 riastrad 0x73,0xcb,0xbc,0x72, 0x31,0x6d,0xff,0x84,
797 1.1 riastrad 0x20,0xa3,0x3b,0xf0, 0x2b,0x97,0xac,0x8d,
798 1.1 riastrad 0x19,0x52,0x58,0x3f, 0x27,0x0a,0xcd,0x70,
799 1.1 riastrad 0x05,0xcc,0x02,0x7f, 0x4c,0xf1,0x18,0x7e,
800 1.1 riastrad },
801 1.1 riastrad [1] = { /* p. 239 */
802 1.1 riastrad 0x68,0x1a,0x46,0xb2, 0xaa,0x86,0x94,0xa0,
803 1.1 riastrad 0xfe,0x4d,0xee,0xa7, 0x20,0x92,0x7a,0x84,
804 1.1 riastrad 0xea,0xaa,0x98,0x5e, 0x59,0xc1,0x9f,0x8b,
805 1.1 riastrad 0xe0,0x98,0x4d,0x8c, 0xbe,0xf8,0xc6,0x9b,
806 1.1 riastrad 0x75,0x41,0x67,0x64, 0x19,0x46,0xe0,0x40,
807 1.1 riastrad 0xee,0x20,0x43,0xe1, 0xcc,0xb2,0x9d,0xcf,
808 1.1 riastrad 0x06,0x3c,0x0a,0x50, 0x83,0x0e,0x42,0x8e,
809 1.1 riastrad 0x6d,0xca,0x26,0x2e, 0xcd,0x77,0xc5,0x42,
810 1.1 riastrad },
811 1.1 riastrad },
812 1.1 riastrad },
813 1.1 riastrad
814 1.1 riastrad [5] = { /* Hash_DRBG.pdf, p. 239 */
816 1.1 riastrad .personalization = &kat_zero,
817 1.1 riastrad .additional = kat_additional,
818 1.1 riastrad .reseed = true,
819 1.1 riastrad .C = { /* p. 243 */
820 1.1 riastrad 0xe1,0x5d,0xe4,0xa8, 0xe3,0xb1,0x41,0x9b,
821 1.1 riastrad 0x61,0xd5,0x34,0xf1, 0x5d,0xbd,0x31,0xee,
822 1.1 riastrad 0x19,0xec,0x59,0x5f, 0x8b,0x98,0x11,0x1a,
823 1.1 riastrad 0x94,0xf5,0x22,0x37, 0xad,0x5d,0x66,0xf0,
824 1.1 riastrad 0xcf,0xaa,0xfd,0xdc, 0x90,0x19,0x59,0x02,
825 1.1 riastrad 0xe9,0x79,0xf7,0x9b, 0x65,0x35,0x7f,0xea,
826 1.1 riastrad 0x85,0x99,0x8e,0x4e, 0x37,0xd2,0xc1,
827 1.1 riastrad },
828 1.1 riastrad .V = {
829 1.1 riastrad [0] = { /* p. 242 */
830 1.1 riastrad 0xab,0x41,0xcd,0xe4, 0x37,0xab,0x8b,0x09,
831 1.1 riastrad 0x1c,0xa7,0xc5,0x75, 0x5d,0x10,0xf0,0x11,
832 1.1 riastrad 0x0c,0x1d,0xbd,0x46, 0x2f,0x22,0x6c,0xfd,
833 1.1 riastrad 0xab,0xfb,0xb0,0x4a, 0x8b,0xcd,0xef,0x95,
834 1.1 riastrad 0x16,0x7d,0x84,0xaf, 0x64,0x12,0x8c,0x0d,
835 1.1 riastrad 0x71,0xf4,0xd5,0xb8, 0xc0,0xed,0xfb,0xbe,
836 1.1 riastrad 0x3d,0xf4,0x04,0x48, 0xd2,0xd8,0xe1,
837 1.1 riastrad },
838 1.1 riastrad [1] = { /* p. 249 */
839 1.1 riastrad 0xb3,0x74,0x95,0x46, 0x81,0xcf,0xc9,0x5b,
840 1.1 riastrad 0x8d,0xb8,0x39,0x52, 0x8c,0x71,0x08,0x83,
841 1.1 riastrad 0x5e,0xb4,0xf3,0x0a, 0xd9,0x1c,0xbe,0x9e,
842 1.1 riastrad 0xa0,0xd5,0x45,0xcc, 0xfd,0x18,0x13,0x2a,
843 1.1 riastrad 0xf1,0xd3,0x76,0x8f, 0x47,0x02,0x77,0x2b,
844 1.1 riastrad 0x69,0x15,0x9f,0x2c, 0xc0,0x7f,0x48,0x74,
845 1.1 riastrad 0x1e,0xb5,0xb2,0xb1, 0x22,0x11,0x25,
846 1.1 riastrad },
847 1.1 riastrad [2] = { /* p. 254 */
848 1.1 riastrad 0xbf,0xe3,0xd6,0x81, 0xa2,0x0f,0xbe,0x39,
849 1.1 riastrad 0x03,0x8f,0x4d,0x66, 0x77,0x7c,0x1b,0xe5,
850 1.1 riastrad 0x79,0xee,0xb4,0x85, 0x7b,0x42,0xf2,0x1c,
851 1.1 riastrad 0x3f,0x59,0x8b,0x59, 0x62,0xb7,0xaa,0x48,
852 1.1 riastrad 0x0e,0xa5,0x65,0xfe, 0xea,0xbd,0xfb,0xd6,
853 1.1 riastrad 0xa7,0xec,0xcb,0x96, 0x02,0xc1,0x4b,0xfa,
854 1.1 riastrad 0x30,0xf0,0xf9,0x81, 0x90,0x0c,0xd0,
855 1.1 riastrad },
856 1.1 riastrad },
857 1.1 riastrad .rnd_val = {
858 1.1 riastrad [0] = { /* p. 249 */
859 1.1 riastrad 0x11,0x60,0x1b,0x72, 0xca,0x60,0x89,0x73,
860 1.1 riastrad 0x6b,0x20,0x47,0x44, 0xb2,0x9d,0xa1,0xaa,
861 1.1 riastrad 0xaf,0xba,0xca,0xa5, 0x28,0x8f,0x06,0xbe,
862 1.1 riastrad 0x48,0x45,0x69,0xcc, 0xed,0xbe,0xce,0x03,
863 1.1 riastrad 0xe8,0x22,0xea,0xa5, 0xb1,0x4f,0x0e,0x04,
864 1.1 riastrad 0x94,0x8c,0x05,0xcd, 0x3c,0xc2,0xe2,0x88,
865 1.1 riastrad 0x9a,0x89,0xfa,0x03, 0xd6,0x5d,0x4d,0x74,
866 1.1 riastrad 0xac,0x50,0xff,0x6b, 0xd8,0x56,0xe5,0x79,
867 1.1 riastrad },
868 1.1 riastrad [1] = { /* p. 255 */
869 1.1 riastrad 0x05,0x5b,0xc1,0x28, 0xcc,0x2d,0x0e,0x25,
870 1.1 riastrad 0x0f,0x47,0xe4,0xe4, 0xf5,0x82,0x37,0x5d,
871 1.1 riastrad 0xe3,0xee,0x5e,0x9f, 0xe8,0x31,0x68,0x74,
872 1.1 riastrad 0x97,0xe5,0xaf,0x1e, 0x7c,0xb6,0x9e,0xfd,
873 1.1 riastrad 0xeb,0xd2,0xfd,0x31, 0xc7,0xce,0x2b,0xba,
874 1.1 riastrad 0x0d,0xbc,0x6c,0x74, 0xc8,0xa2,0x0a,0x7d,
875 1.1 riastrad 0x72,0xf6,0x0e,0x6d, 0x9f,0x63,0xed,0x50,
876 1.1 riastrad 0x9e,0x96,0x3e,0x54, 0xa6,0x9e,0x90,0x48,
877 1.1 riastrad },
878 1.1 riastrad },
879 1.1 riastrad },
880 1.1 riastrad
881 1.1 riastrad [6] = { /* Hash_DRBG.pdf, p. 255 */
883 1.1 riastrad .personalization = &kat_personalization,
884 1.1 riastrad .additional = kat_no_additional,
885 1.1 riastrad .reseed = true,
886 1.1 riastrad .C = { /* p. 259 */
887 1.1 riastrad 0x44,0x74,0x8a,0x78, 0xb1,0x6e,0x75,0x55,
888 1.1 riastrad 0x9f,0x88,0x1d,0x51, 0xc1,0x5d,0xfe,0x6c,
889 1.1 riastrad 0x52,0xcf,0xb0,0xbb, 0x71,0x62,0x01,0x69,
890 1.1 riastrad 0xc7,0x93,0x34,0x27, 0x67,0xe7,0xf8,0x87,
891 1.1 riastrad 0x5f,0x42,0xcb,0x6a, 0x20,0xc8,0x9d,0x7c,
892 1.1 riastrad 0x6e,0xf3,0xdc,0x61, 0x0d,0x8f,0xf2,0x03,
893 1.1 riastrad 0xd6,0x76,0x6c,0xed, 0x19,0x19,0xd0,
894 1.1 riastrad },
895 1.1 riastrad .V = {
896 1.1 riastrad [0] = { /* p. 257 */
897 1.1 riastrad 0xa3,0xe9,0x4e,0x39, 0x26,0xfd,0xa1,0x69,
898 1.1 riastrad 0xc3,0x03,0xd6,0x64, 0x38,0x39,0x05,0xe0,
899 1.1 riastrad 0xd7,0x99,0x62,0xd1, 0x65,0x44,0x6d,0x63,
900 1.1 riastrad 0xbd,0xa6,0x54,0xd1, 0x32,0xf7,0x2d,0xb4,
901 1.1 riastrad 0x71,0x56,0x4b,0x45, 0x6f,0xf2,0xee,0xc8,
902 1.1 riastrad 0x36,0x42,0x2a,0xcc, 0x5a,0x02,0x99,0x35,
903 1.1 riastrad 0xa7,0x99,0x29,0x90, 0x94,0xa1,0xca,
904 1.1 riastrad },
905 1.1 riastrad [1] = { /* p. 264 */
906 1.1 riastrad 0xaa,0x11,0x1b,0x0e, 0xd5,0x6c,0xf4,0xa6,
907 1.1 riastrad 0xcc,0xe4,0xad,0xe7, 0xf1,0x1b,0x06,0x10,
908 1.1 riastrad 0x45,0xbf,0x10,0x92, 0xcb,0xb3,0x8f,0xf3,
909 1.1 riastrad 0x23,0x95,0xea,0x62, 0xd2,0x6b,0x27,0xc8,
910 1.1 riastrad 0x86,0x89,0x45,0xc5, 0x93,0xba,0x70,0xc3,
911 1.1 riastrad 0x84,0xad,0xad,0x45, 0x77,0x1c,0x93,0xb0,
912 1.1 riastrad 0x9c,0x27,0x69,0x07, 0x52,0xd1,0xd8,
913 1.1 riastrad },
914 1.1 riastrad [2] = { /* p. 269 */
915 1.1 riastrad 0x5f,0x0f,0xd4,0x0c, 0x8c,0x82,0xef,0x41,
916 1.1 riastrad 0x03,0x14,0xb8,0x30, 0xc2,0x0f,0xcc,0xea,
917 1.1 riastrad 0x71,0x59,0x18,0x9a, 0xea,0x13,0xe8,0x48,
918 1.1 riastrad 0x75,0x68,0x68,0x18, 0xcd,0x4f,0x12,0xb9,
919 1.1 riastrad 0xde,0xa8,0x82,0x58, 0x16,0xa4,0x13,0xa2,
920 1.1 riastrad 0x95,0x72,0x5e,0xb3, 0x3e,0x33,0xb9,0xad,
921 1.1 riastrad 0xfe,0xe0,0xb1,0xc2, 0x34,0x0a,0xe0,
922 1.1 riastrad },
923 1.1 riastrad },
924 1.1 riastrad .rnd_val = {
925 1.1 riastrad [0] = { /* p. 264 */
926 1.1 riastrad 0x7a,0x33,0xd3,0x90, 0x33,0xf8,0x60,0x58,
927 1.1 riastrad 0x9f,0x37,0x5e,0x73, 0x35,0x30,0x75,0x52,
928 1.1 riastrad 0x96,0x58,0xbb,0xed, 0x99,0xc8,0xa0,0xef,
929 1.1 riastrad 0x5e,0x28,0xb3,0x51, 0xb2,0xdf,0x33,0x58,
930 1.1 riastrad 0xb3,0xd8,0x9b,0xac, 0x72,0x25,0xdf,0x9e,
931 1.1 riastrad 0x3b,0xcd,0x08,0x36, 0xb9,0x9b,0x5d,0xbf,
932 1.1 riastrad 0x36,0x3a,0x17,0x0c, 0x7b,0xb9,0xbe,0x41,
933 1.1 riastrad 0xa4,0xaa,0x97,0x44, 0x5e,0xce,0xe4,0x1e,
934 1.1 riastrad },
935 1.1 riastrad [1] = { /* p. 269 */
936 1.1 riastrad 0x04,0x1a,0xbd,0x94, 0x07,0x9a,0x05,0x71,
937 1.1 riastrad 0x88,0x5f,0x16,0x65, 0x94,0x4e,0x0e,0x7f,
938 1.1 riastrad 0x1b,0xfa,0xcd,0xea, 0xea,0xe9,0xd4,0x4e,
939 1.1 riastrad 0xed,0xc1,0x1f,0xad, 0xd8,0x4c,0x34,0xc7,
940 1.1 riastrad 0xca,0xa7,0x3d,0x09, 0xa0,0x19,0x31,0x93,
941 1.1 riastrad 0xfa,0x40,0xa1,0x9f, 0x64,0x4f,0x04,0x8d,
942 1.1 riastrad 0x2a,0x54,0x17,0x04, 0x25,0x53,0xdf,0x52,
943 1.1 riastrad 0x51,0x74,0x1b,0x40, 0xea,0xcf,0xeb,0x98,
944 1.1 riastrad },
945 1.1 riastrad },
946 1.1 riastrad },
947 1.1 riastrad
948 1.1 riastrad [7] = { /* Hash_DRBG.pdf, p. 269 */
950 1.1 riastrad .personalization = &kat_personalization,
951 1.1 riastrad .additional = kat_additional,
952 1.1 riastrad .reseed = true,
953 1.1 riastrad .C = { /* p. 274 */
954 1.1 riastrad 0x44,0x74,0x8a,0x78, 0xb1,0x6e,0x75,0x55,
955 1.1 riastrad 0x9f,0x88,0x1d,0x51, 0xc1,0x5d,0xfe,0x6c,
956 1.1 riastrad 0x52,0xcf,0xb0,0xbb, 0x71,0x62,0x01,0x69,
957 1.1 riastrad 0xc7,0x93,0x34,0x27, 0x67,0xe7,0xf8,0x87,
958 1.1 riastrad 0x5f,0x42,0xcb,0x6a, 0x20,0xc8,0x9d,0x7c,
959 1.1 riastrad 0x6e,0xf3,0xdc,0x61, 0x0d,0x8f,0xf2,0x03,
960 1.1 riastrad 0xd6,0x76,0x6c,0xed, 0x19,0x19,0xd0,
961 1.1 riastrad },
962 1.1 riastrad .V = {
963 1.1 riastrad [0] = { /* p. 272 */
964 1.1 riastrad 0xa3,0xe9,0x4e,0x39, 0x26,0xfd,0xa1,0x69,
965 1.1 riastrad 0xc3,0x03,0xd6,0x64, 0x38,0x39,0x05,0xe0,
966 1.1 riastrad 0xd7,0x99,0x62,0xd1, 0x65,0x44,0x6d,0x63,
967 1.1 riastrad 0xbd,0xa6,0x54,0xd1, 0x32,0xf7,0x2d,0xb4,
968 1.1 riastrad 0x71,0x56,0x4b,0x45, 0x6f,0xf2,0xee,0xc8,
969 1.1 riastrad 0x36,0x42,0x2a,0xcc, 0x5a,0x02,0x99,0x35,
970 1.1 riastrad 0xa7,0x99,0x29,0x90, 0x94,0xa1,0xca,
971 1.1 riastrad },
972 1.1 riastrad [1] = { /* p. 279 */
973 1.1 riastrad 0xaa,0xf6,0xb9,0x9b, 0x7f,0x84,0xb0,0x36,
974 1.1 riastrad 0xe1,0xcc,0xbc,0x9d, 0x57,0x3a,0x36,0xb8,
975 1.1 riastrad 0xbd,0xd4,0x7c,0x35, 0x8b,0xb5,0xf3,0xc1,
976 1.1 riastrad 0xd6,0xe7,0x90,0x3a, 0xaa,0x29,0xf1,0xc8,
977 1.1 riastrad 0x7a,0xe6,0x66,0xb8, 0x86,0x93,0xbe,0xf4,
978 1.1 riastrad 0x6c,0x51,0xc2,0x4c, 0x47,0xbe,0xfe,0x4b,
979 1.1 riastrad 0x35,0x75,0x4d,0xcb, 0xfa,0x1e,0x7d,
980 1.1 riastrad },
981 1.1 riastrad [2] = { /* p. 285 */
982 1.1 riastrad 0x0c,0x75,0x77,0x4d, 0x61,0x02,0x69,0xad,
983 1.1 riastrad 0x5b,0xb4,0xab,0xbb, 0x14,0x83,0x23,0xc9,
984 1.1 riastrad 0x78,0x9f,0x8f,0x76, 0x25,0xcc,0x34,0x33,
985 1.1 riastrad 0x7c,0x03,0x47,0x2d, 0x9a,0x0c,0x4f,0xac,
986 1.1 riastrad 0x30,0xbe,0xd2,0xdd, 0xde,0x64,0xb8,0x7a,
987 1.1 riastrad 0x2c,0x70,0x67,0x52, 0xc2,0x1a,0xc0,0x11,
988 1.1 riastrad 0x27,0x43,0x59,0x2c, 0x4f,0xdf,0x67,
989 1.1 riastrad },
990 1.1 riastrad },
991 1.1 riastrad .rnd_val = { /* p. 279 */
992 1.1 riastrad [0] = {
993 1.1 riastrad 0x88,0x97,0x32,0x97, 0x5b,0x36,0xe8,0xe2,
994 1.1 riastrad 0xe7,0xb7,0x40,0x50, 0xae,0xa1,0x71,0x39,
995 1.1 riastrad 0xda,0x2b,0x86,0x34, 0xdc,0xe2,0x13,0x3b,
996 1.1 riastrad 0x06,0x34,0x74,0x3f, 0x47,0x75,0x57,0xab,
997 1.1 riastrad 0x7b,0x84,0x4e,0xd3, 0xf2,0xa4,0x6c,0xc6,
998 1.1 riastrad 0x3e,0xb2,0x32,0x86, 0x46,0x4c,0x51,0xd5,
999 1.1 riastrad 0xd7,0x69,0x71,0xc4, 0x7b,0xc5,0xb5,0x5f,
1000 1.1 riastrad 0xed,0x72,0xa8,0x04, 0x3c,0xbf,0x66,0x4f,
1001 1.1 riastrad },
1002 1.1 riastrad [1] = {
1003 1.1 riastrad 0xbf,0x49,0xb8,0x89, 0xba,0x98,0x4d,0x34,
1004 1.1 riastrad 0x63,0x87,0xe8,0x64, 0x7e,0x98,0xbb,0x99,
1005 1.1 riastrad 0xcd,0x41,0xa3,0x2f, 0xbe,0xc1,0xfc,0xb3,
1006 1.1 riastrad 0xb6,0xa1,0xb7,0xd9, 0x93,0x2b,0xa7,0xe1,
1007 1.1 riastrad 0x1e,0xe6,0xbb,0xd9, 0x24,0x40,0x5a,0x2c,
1008 1.1 riastrad 0x7f,0xca,0x89,0x0a, 0x5e,0x9a,0x8d,0xea,
1009 1.1 riastrad 0x66,0xac,0x0c,0xac, 0xa0,0xca,0x7b,0xc1,
1010 1.1 riastrad 0x8d,0x74,0xfb,0xc0, 0x2a,0x11,0xe4,0x53,
1011 1.1 riastrad },
1012 1.1 riastrad },
1013 1.1 riastrad },
1014 1.1 riastrad };
1015 1.1 riastrad
1016 1.1 riastrad #ifdef NIST_HASH_DRBG_DEBUG
1018 1.1 riastrad #define DPRINTF(fmt, ...) \
1019 1.1 riastrad printf("%s:%d: " fmt, __func__, __LINE__, ##__VA_ARGS__)
1020 1.1 riastrad #define DUSE(v)
1021 1.1 riastrad #else
1022 1.1 riastrad #define DPRINTF(fmt, ...)
1023 1.1 riastrad #define DUSE(v) (void)(v)
1024 1.1 riastrad #endif
1025 1.1 riastrad
1026 1.1 riastrad #define CHECK(i, name, actual, expected, n) do \
1027 1.1 riastrad { \
1028 1.1 riastrad CTASSERT(sizeof(actual) == (n)); \
1029 1.1 riastrad ok &= check(i, name, actual, expected, (n)); \
1030 1.1 riastrad } while (0)
1031 1.1 riastrad
1032 1.1 riastrad static bool
1033 1.1 riastrad check(unsigned katno, const char *name, const uint8_t *actual,
1034 1.1 riastrad const uint8_t *expected, size_t n)
1035 1.1 riastrad {
1036 1.1 riastrad bool ok = true;
1037 1.1 riastrad size_t i;
1038 1.1 riastrad
1039 1.1 riastrad DUSE(katno);
1040 1.1 riastrad DUSE(name);
1041 1.1 riastrad
1042 1.1 riastrad for (i = 0; i < n; i++) {
1043 1.1 riastrad if (actual[i] != expected[i]) {
1044 1.1 riastrad DPRINTF("KAT %u %s[%zu] = %02x, expected %02x\n",
1045 1.1 riastrad katno, name, i, actual[i], expected[i]);
1046 1.1 riastrad ok = false;
1047 1.1 riastrad }
1048 1.1 riastrad }
1049 1.1 riastrad
1050 1.1 riastrad return ok;
1051 1.1 riastrad }
1052 1.1 riastrad
1053 1.1 riastrad #ifdef NIST_HASH_DRBG_MAIN
1054 1.1 riastrad int
1055 1.1 riastrad main(void)
1056 1.1 riastrad {
1057 1.1 riastrad int ret;
1058 1.1 riastrad
1059 1.1 riastrad ret = nist_hash_drbg_initialize();
1060 1.1 riastrad
1061 1.1 riastrad fflush(stdout);
1062 1.1 riastrad return ret || ferror(stdout);
1063 1.1 riastrad }
1064 1.1 riastrad #endif
1065 1.1 riastrad
1066 1.1 riastrad int
1068 1.1 riastrad nist_hash_drbg_initialize(void)
1069 1.1 riastrad {
1070 1.1 riastrad const unsigned truncation[] = { 0, 1, 32, 63 };
1071 1.1 riastrad bool ok = true;
1072 1.1 riastrad size_t i, j;
1073 1.1 riastrad
1074 1.1 riastrad for (i = 0; i < arraycount(kat); i++) {
1075 1.1 riastrad for (j = 0; j < arraycount(truncation); j++) {
1076 1.1 riastrad const unsigned trunc = truncation[j];
1077 1.1 riastrad struct nist_hash_drbg drbg, *D = &drbg;
1078 1.1 riastrad uint8_t rnd_val[64];
1079 1.1 riastrad unsigned reseed_counter;
1080 1.1 riastrad
1081 1.1 riastrad nist_hash_drbg_instantiate(D,
1082 1.1 riastrad kat_entropy[0], sizeof kat_entropy[0],
1083 1.1 riastrad kat_nonce, sizeof kat_nonce,
1084 1.1 riastrad kat[i].personalization->hv_base,
1085 1.1 riastrad kat[i].personalization->hv_len);
1086 1.1 riastrad reseed_counter = 1;
1087 1.1 riastrad CHECK(i, "C", D->C, kat[i].C, SEEDLEN_BYTES);
1088 1.1 riastrad CHECK(i, "V[0]", D->V, kat[i].V[0], SEEDLEN_BYTES);
1089 1.1 riastrad if (D->reseed_counter != reseed_counter) {
1090 1.3 riastrad DPRINTF("bad reseed counter: %u, expected %u",
1091 1.3 riastrad D->reseed_counter, reseed_counter);
1092 1.3 riastrad ok = false;
1093 1.1 riastrad }
1094 1.1 riastrad
1095 1.1 riastrad if (kat[i].reseed) {
1096 1.1 riastrad nist_hash_drbg_reseed(D,
1097 1.1 riastrad kat_entropy[1], sizeof kat_entropy[1],
1098 1.1 riastrad kat[i].additional[0]->hv_base,
1099 1.1 riastrad kat[i].additional[0]->hv_len);
1100 1.1 riastrad }
1101 1.1 riastrad
1102 1.1 riastrad nist_hash_drbg_generate(D, rnd_val,
1103 1.1 riastrad sizeof(rnd_val) - trunc,
1104 1.1 riastrad kat[i].reseed ? 0 : kat[i].additional[0]->hv_base,
1105 1.1 riastrad kat[i].reseed ? 0 : kat[i].additional[0]->hv_len);
1106 1.1 riastrad reseed_counter++;
1107 1.1 riastrad CHECK(i, "V[1]", D->V, kat[i].V[1], SEEDLEN_BYTES);
1108 1.1 riastrad ASSERT(sizeof(kat[i].rnd_val[0]) - trunc <=
1109 1.1 riastrad sizeof rnd_val);
1110 1.1 riastrad check(i, "rnd_val[0]", rnd_val, kat[i].rnd_val[0],
1111 1.1 riastrad sizeof(kat[i].rnd_val[0]) - trunc);
1112 1.1 riastrad if (D->reseed_counter != reseed_counter) {
1113 1.1 riastrad DPRINTF("bad reseed counter: %u, expected %u",
1114 1.3 riastrad D->reseed_counter, reseed_counter);
1115 1.3 riastrad ok = false;
1116 1.3 riastrad }
1117 1.1 riastrad
1118 1.1 riastrad if (kat[i].reseed) {
1119 1.1 riastrad nist_hash_drbg_reseed(D,
1120 1.1 riastrad kat_entropy[2], sizeof kat_entropy[2],
1121 1.1 riastrad kat[i].additional[1]->hv_base,
1122 1.1 riastrad kat[i].additional[1]->hv_len);
1123 1.1 riastrad reseed_counter = 1;
1124 1.1 riastrad }
1125 1.1 riastrad
1126 1.1 riastrad nist_hash_drbg_generate(D, rnd_val,
1127 1.1 riastrad sizeof(rnd_val) - trunc,
1128 1.1 riastrad kat[i].reseed ? 0 : kat[i].additional[1]->hv_base,
1129 1.1 riastrad kat[i].reseed ? 0 : kat[i].additional[1]->hv_len);
1130 1.1 riastrad reseed_counter++;
1131 1.1 riastrad CHECK(i, "V[2]", D->V, kat[i].V[2], SEEDLEN_BYTES);
1132 ASSERT(sizeof(kat[i].rnd_val[1]) - trunc <=
1133 sizeof rnd_val);
1134 check(i, "rnd_val[1]", rnd_val, kat[i].rnd_val[1],
1135 sizeof(kat[i].rnd_val[1]) - trunc);
1136 if (D->reseed_counter != reseed_counter) {
1137 DPRINTF("bad reseed counter: %u, expected %u",
1138 D->reseed_counter, reseed_counter);
1139 ok = false;
1140 }
1141
1142 nist_hash_drbg_destroy(D);
1143 }
1144 }
1145
1146 if (!ok)
1147 return 1;
1148 return 0;
1149 }
1150