Home | History | Annotate | Line # | Download | only in nist_hash_drbg
      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