xref: /openbsd-src/regress/lib/libcrypto/sha/sha_test.c (revision 684e594694328e98dc5ad6f14760a65d9428b85e)
1*684e5946Sjoshua /*	$OpenBSD: sha_test.c,v 1.6 2023/07/19 15:11:42 joshua Exp $ */
255e6bb00Stb /*
36f73b466Sjoshua  * Copyright (c) 2022, 2023 Joshua Sing <joshua@hypera.dev>
455e6bb00Stb  *
555e6bb00Stb  * Permission to use, copy, modify, and distribute this software for any
655e6bb00Stb  * purpose with or without fee is hereby granted, provided that the above
755e6bb00Stb  * copyright notice and this permission notice appear in all copies.
855e6bb00Stb  *
955e6bb00Stb  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1055e6bb00Stb  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1155e6bb00Stb  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1255e6bb00Stb  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1355e6bb00Stb  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1455e6bb00Stb  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1555e6bb00Stb  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1655e6bb00Stb  */
1755e6bb00Stb 
1855e6bb00Stb #include <openssl/evp.h>
1955e6bb00Stb #include <openssl/sha.h>
2055e6bb00Stb 
2155e6bb00Stb #include <stdint.h>
2255e6bb00Stb #include <string.h>
2355e6bb00Stb 
2455e6bb00Stb struct sha_test {
2555e6bb00Stb 	const int algorithm;
2655e6bb00Stb 	const uint8_t in[128];
2755e6bb00Stb 	const size_t in_len;
2855e6bb00Stb 	const uint8_t out[EVP_MAX_MD_SIZE];
2955e6bb00Stb };
3055e6bb00Stb 
31a79bf4b0Stb static const struct sha_test sha_tests[] = {
3255e6bb00Stb 	/* SHA-1 */
3355e6bb00Stb 	{
3455e6bb00Stb 		.algorithm = NID_sha1,
3555e6bb00Stb 		.in = "abc",
3655e6bb00Stb 		.in_len = 3,
3755e6bb00Stb 		.out = {
3855e6bb00Stb 			0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a,
3955e6bb00Stb 			0xba, 0x3e, 0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c,
4055e6bb00Stb 			0x9c, 0xd0, 0xd8, 0x9d,
41*684e5946Sjoshua 		},
4255e6bb00Stb 	},
4355e6bb00Stb 	{
4455e6bb00Stb 		.algorithm = NID_sha1,
4555e6bb00Stb 		.in = "",
4655e6bb00Stb 		.in_len = 0,
4755e6bb00Stb 		.out = {
4855e6bb00Stb 			0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d,
4955e6bb00Stb 			0x32, 0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90,
5055e6bb00Stb 			0xaf, 0xd8, 0x07, 0x09,
51*684e5946Sjoshua 		},
5255e6bb00Stb 	},
5355e6bb00Stb 	{
5455e6bb00Stb 		.algorithm = NID_sha1,
5555e6bb00Stb 		.in =
5655e6bb00Stb 		    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmno"
5755e6bb00Stb 		    "mnopnopq",
5855e6bb00Stb 		.in_len = 56,
5955e6bb00Stb 		.out = {
6055e6bb00Stb 			0x84, 0x98, 0x3e, 0x44, 0x1c, 0x3b, 0xd2, 0x6e,
6155e6bb00Stb 			0xba, 0xae, 0x4a, 0xa1, 0xf9, 0x51, 0x29, 0xe5,
6255e6bb00Stb 			0xe5, 0x46, 0x70, 0xf1,
63*684e5946Sjoshua 		},
6455e6bb00Stb 	},
6555e6bb00Stb 	{
6655e6bb00Stb 		.algorithm = NID_sha1,
6755e6bb00Stb 		.in =
6855e6bb00Stb 		    "abcdefghbcdefghicdefghijdefghijkefghijklfghijklm"
6955e6bb00Stb 		    "ghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrs"
7055e6bb00Stb 		    "mnopqrstnopqrstu",
7155e6bb00Stb 		.in_len = 112,
7255e6bb00Stb 		.out = {
7355e6bb00Stb 			0xa4, 0x9b, 0x24, 0x46, 0xa0, 0x2c, 0x64, 0x5b,
7455e6bb00Stb 			0xf4, 0x19, 0xf9, 0x95, 0xb6, 0x70, 0x91, 0x25,
7555e6bb00Stb 			0x3a, 0x04, 0xa2, 0x59,
76*684e5946Sjoshua 		},
7755e6bb00Stb 	},
7855e6bb00Stb 
7955e6bb00Stb 	/* SHA-224 */
8055e6bb00Stb 	{
8155e6bb00Stb 		.algorithm = NID_sha224,
8255e6bb00Stb 		.in = "abc",
8355e6bb00Stb 		.in_len = 3,
8455e6bb00Stb 		.out = {
8555e6bb00Stb 			0x23, 0x09, 0x7d, 0x22, 0x34, 0x05, 0xd8, 0x22,
8655e6bb00Stb 			0x86, 0x42, 0xa4, 0x77, 0xbd, 0xa2, 0x55, 0xb3,
8755e6bb00Stb 			0x2a, 0xad, 0xbc, 0xe4, 0xbd, 0xa0, 0xb3, 0xf7,
8855e6bb00Stb 			0xe3, 0x6c, 0x9d, 0xa7,
89*684e5946Sjoshua 		},
9055e6bb00Stb 	},
9155e6bb00Stb 	{
9255e6bb00Stb 		.algorithm = NID_sha224,
9355e6bb00Stb 		.in = "",
9455e6bb00Stb 		.in_len = 0,
9555e6bb00Stb 		.out = {
9655e6bb00Stb 			0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9,
9755e6bb00Stb 			0x47, 0x61, 0x02, 0xbb, 0x28, 0x82, 0x34, 0xc4,
9855e6bb00Stb 			0x15, 0xa2, 0xb0, 0x1f, 0x82, 0x8e, 0xa6, 0x2a,
9955e6bb00Stb 			0xc5, 0xb3, 0xe4, 0x2f,
100*684e5946Sjoshua 		},
10155e6bb00Stb 	},
10255e6bb00Stb 	{
10355e6bb00Stb 		.algorithm = NID_sha224,
104c8db7e74Stb 		.in =
105c8db7e74Stb 		    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmno"
10655e6bb00Stb 		    "mnopnopq",
10755e6bb00Stb 		.in_len = 56,
10855e6bb00Stb 		.out = {
10955e6bb00Stb 			0x75, 0x38, 0x8b, 0x16, 0x51, 0x27, 0x76, 0xcc,
11055e6bb00Stb 			0x5d, 0xba, 0x5d, 0xa1, 0xfd, 0x89, 0x01, 0x50,
11155e6bb00Stb 			0xb0, 0xc6, 0x45, 0x5c, 0xb4, 0xf5, 0x8b, 0x19,
11255e6bb00Stb 			0x52, 0x52, 0x25, 0x25,
113*684e5946Sjoshua 		},
11455e6bb00Stb 	},
11555e6bb00Stb 	{
11655e6bb00Stb 		.algorithm = NID_sha224,
11755e6bb00Stb 		.in =
11855e6bb00Stb 		    "abcdefghbcdefghicdefghijdefghijkefghijklfghijklm"
11955e6bb00Stb 		    "ghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrs"
12055e6bb00Stb 		    "mnopqrstnopqrstu",
12155e6bb00Stb 		.in_len = 112,
12255e6bb00Stb 		.out = {
12355e6bb00Stb 			0xc9, 0x7c, 0xa9, 0xa5, 0x59, 0x85, 0x0c, 0xe9,
12455e6bb00Stb 			0x7a, 0x04, 0xa9, 0x6d, 0xef, 0x6d, 0x99, 0xa9,
12555e6bb00Stb 			0xe0, 0xe0, 0xe2, 0xab, 0x14, 0xe6, 0xb8, 0xdf,
12655e6bb00Stb 			0x26, 0x5f, 0xc0, 0xb3,
127*684e5946Sjoshua 		},
12855e6bb00Stb 	},
12955e6bb00Stb 
13055e6bb00Stb 	/* SHA-256 */
13155e6bb00Stb 	{
13255e6bb00Stb 		.algorithm = NID_sha256,
13355e6bb00Stb 		.in = "abc",
13455e6bb00Stb 		.in_len = 3,
13555e6bb00Stb 		.out = {
13655e6bb00Stb 			0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
13755e6bb00Stb 			0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
13855e6bb00Stb 			0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
13955e6bb00Stb 			0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad,
140*684e5946Sjoshua 		},
14155e6bb00Stb 	},
14255e6bb00Stb 	{
14355e6bb00Stb 		.algorithm = NID_sha256,
14455e6bb00Stb 		.in = "",
14555e6bb00Stb 		.in_len = 0,
14655e6bb00Stb 		.out = {
14755e6bb00Stb 			0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14,
14855e6bb00Stb 			0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24,
14955e6bb00Stb 			0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
15055e6bb00Stb 			0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55,
151*684e5946Sjoshua 		},
15255e6bb00Stb 	},
15355e6bb00Stb 	{
15455e6bb00Stb 		.algorithm = NID_sha256,
15555e6bb00Stb 		.in =
15655e6bb00Stb 		    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmno"
15755e6bb00Stb 		    "mnopnopq",
15855e6bb00Stb 		.in_len = 56,
15955e6bb00Stb 		.out = {
16055e6bb00Stb 			0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8,
16155e6bb00Stb 			0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39,
16255e6bb00Stb 			0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67,
16355e6bb00Stb 			0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1,
164*684e5946Sjoshua 		},
16555e6bb00Stb 	},
16655e6bb00Stb 	{
16755e6bb00Stb 		.algorithm = NID_sha256,
16855e6bb00Stb 		.in =
16955e6bb00Stb 		    "abcdefghbcdefghicdefghijdefghijkefghijklfghijklm"
17055e6bb00Stb 		    "ghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrs"
17155e6bb00Stb 		    "mnopqrstnopqrstu",
17255e6bb00Stb 		.in_len = 112,
17355e6bb00Stb 		.out = {
17455e6bb00Stb 			0xcf, 0x5b, 0x16, 0xa7, 0x78, 0xaf, 0x83, 0x80,
17555e6bb00Stb 			0x03, 0x6c, 0xe5, 0x9e, 0x7b, 0x04, 0x92, 0x37,
17655e6bb00Stb 			0x0b, 0x24, 0x9b, 0x11, 0xe8, 0xf0, 0x7a, 0x51,
17755e6bb00Stb 			0xaf, 0xac, 0x45, 0x03, 0x7a, 0xfe, 0xe9, 0xd1,
178*684e5946Sjoshua 		},
17955e6bb00Stb 	},
18055e6bb00Stb 
18155e6bb00Stb 	/* SHA-384 */
18255e6bb00Stb 	{
18355e6bb00Stb 		.algorithm = NID_sha384,
18455e6bb00Stb 		.in = "abc",
18555e6bb00Stb 		.in_len = 3,
18655e6bb00Stb 		.out = {
18755e6bb00Stb 			0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b,
18855e6bb00Stb 			0xb5, 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07,
18955e6bb00Stb 			0x27, 0x2c, 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63,
19055e6bb00Stb 			0x1a, 0x8b, 0x60, 0x5a, 0x43, 0xff, 0x5b, 0xed,
19155e6bb00Stb 			0x80, 0x86, 0x07, 0x2b, 0xa1, 0xe7, 0xcc, 0x23,
19255e6bb00Stb 			0x58, 0xba, 0xec, 0xa1, 0x34, 0xc8, 0x25, 0xa7,
193*684e5946Sjoshua 		},
19455e6bb00Stb 	},
19555e6bb00Stb 	{
19655e6bb00Stb 		.algorithm = NID_sha384,
19755e6bb00Stb 		.in = "",
19855e6bb00Stb 		.in_len = 0,
19955e6bb00Stb 		.out = {
20055e6bb00Stb 			0x38, 0xb0, 0x60, 0xa7, 0x51, 0xac, 0x96, 0x38,
20155e6bb00Stb 			0x4c, 0xd9, 0x32, 0x7e, 0xb1, 0xb1, 0xe3, 0x6a,
20255e6bb00Stb 			0x21, 0xfd, 0xb7, 0x11, 0x14, 0xbe, 0x07, 0x43,
20355e6bb00Stb 			0x4c, 0x0c, 0xc7, 0xbf, 0x63, 0xf6, 0xe1, 0xda,
20455e6bb00Stb 			0x27, 0x4e, 0xde, 0xbf, 0xe7, 0x6f, 0x65, 0xfb,
20555e6bb00Stb 			0xd5, 0x1a, 0xd2, 0xf1, 0x48, 0x98, 0xb9, 0x5b,
206*684e5946Sjoshua 		},
20755e6bb00Stb 	},
20855e6bb00Stb 	{
20955e6bb00Stb 		.algorithm = NID_sha384,
21055e6bb00Stb 		.in =
21155e6bb00Stb 		    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmno"
21255e6bb00Stb 		    "mnopnopq",
21355e6bb00Stb 		.in_len = 56,
21455e6bb00Stb 		.out = {
21555e6bb00Stb 			0x33, 0x91, 0xfd, 0xdd, 0xfc, 0x8d, 0xc7, 0x39,
21655e6bb00Stb 			0x37, 0x07, 0xa6, 0x5b, 0x1b, 0x47, 0x09, 0x39,
21755e6bb00Stb 			0x7c, 0xf8, 0xb1, 0xd1, 0x62, 0xaf, 0x05, 0xab,
21855e6bb00Stb 			0xfe, 0x8f, 0x45, 0x0d, 0xe5, 0xf3, 0x6b, 0xc6,
21955e6bb00Stb 			0xb0, 0x45, 0x5a, 0x85, 0x20, 0xbc, 0x4e, 0x6f,
22055e6bb00Stb 			0x5f, 0xe9, 0x5b, 0x1f, 0xe3, 0xc8, 0x45, 0x2b,
221*684e5946Sjoshua 		},
22255e6bb00Stb 	},
22355e6bb00Stb 	{
22455e6bb00Stb 		.algorithm = NID_sha384,
22555e6bb00Stb 		.in =
22655e6bb00Stb 		    "abcdefghbcdefghicdefghijdefghijkefghijklfghijklm"
22755e6bb00Stb 		    "ghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrs"
22855e6bb00Stb 		    "mnopqrstnopqrstu",
22955e6bb00Stb 		.in_len = 112,
23055e6bb00Stb 		.out = {
23155e6bb00Stb 			0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8,
23255e6bb00Stb 			0x3d, 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47,
23355e6bb00Stb 			0x53, 0x11, 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2,
23455e6bb00Stb 			0x2f, 0xa0, 0x80, 0x86, 0xe3, 0xb0, 0xf7, 0x12,
23555e6bb00Stb 			0xfc, 0xc7, 0xc7, 0x1a, 0x55, 0x7e, 0x2d, 0xb9,
23655e6bb00Stb 			0x66, 0xc3, 0xe9, 0xfa, 0x91, 0x74, 0x60, 0x39,
237*684e5946Sjoshua 		},
23855e6bb00Stb 	},
23955e6bb00Stb 
24055e6bb00Stb 	/* SHA-512 */
24155e6bb00Stb 	{
24255e6bb00Stb 		.algorithm = NID_sha512,
24355e6bb00Stb 		.in = "abc",
24455e6bb00Stb 		.in_len = 3,
24555e6bb00Stb 		.out = {
24655e6bb00Stb 			0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba,
24755e6bb00Stb 			0xcc, 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31,
24855e6bb00Stb 			0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
24955e6bb00Stb 			0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a,
25055e6bb00Stb 			0x21, 0x92, 0x99, 0x2a, 0x27, 0x4f, 0xc1, 0xa8,
25155e6bb00Stb 			0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
25255e6bb00Stb 			0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e,
25355e6bb00Stb 			0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4, 0x9f,
254*684e5946Sjoshua 		},
25555e6bb00Stb 	},
25655e6bb00Stb 	{
25755e6bb00Stb 		.algorithm = NID_sha512,
25855e6bb00Stb 		.in = "",
25955e6bb00Stb 		.in_len = 0,
26055e6bb00Stb 		.out = {
26155e6bb00Stb 			0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd,
26255e6bb00Stb 			0xf1, 0x54, 0x28, 0x50, 0xd6, 0x6d, 0x80, 0x07,
26355e6bb00Stb 			0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc,
26455e6bb00Stb 			0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce,
26555e6bb00Stb 			0x47, 0xd0, 0xd1, 0x3c, 0x5d, 0x85, 0xf2, 0xb0,
26655e6bb00Stb 			0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f,
26755e6bb00Stb 			0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81,
26855e6bb00Stb 			0xa5, 0x38, 0x32, 0x7a, 0xf9, 0x27, 0xda, 0x3e,
269*684e5946Sjoshua 		},
27055e6bb00Stb 	},
27155e6bb00Stb 	{
27255e6bb00Stb 		.algorithm = NID_sha512,
27355e6bb00Stb 		.in =
27455e6bb00Stb 		    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmno"
27555e6bb00Stb 		    "mnopnopq",
27655e6bb00Stb 		.in_len = 56,
27755e6bb00Stb 		.out = {
27855e6bb00Stb 			0x20, 0x4a, 0x8f, 0xc6, 0xdd, 0xa8, 0x2f, 0x0a,
27955e6bb00Stb 			0x0c, 0xed, 0x7b, 0xeb, 0x8e, 0x08, 0xa4, 0x16,
28055e6bb00Stb 			0x57, 0xc1, 0x6e, 0xf4, 0x68, 0xb2, 0x28, 0xa8,
28155e6bb00Stb 			0x27, 0x9b, 0xe3, 0x31, 0xa7, 0x03, 0xc3, 0x35,
28255e6bb00Stb 			0x96, 0xfd, 0x15, 0xc1, 0x3b, 0x1b, 0x07, 0xf9,
28355e6bb00Stb 			0xaa, 0x1d, 0x3b, 0xea, 0x57, 0x78, 0x9c, 0xa0,
28455e6bb00Stb 			0x31, 0xad, 0x85, 0xc7, 0xa7, 0x1d, 0xd7, 0x03,
28555e6bb00Stb 			0x54, 0xec, 0x63, 0x12, 0x38, 0xca, 0x34, 0x45,
286*684e5946Sjoshua 		},
28755e6bb00Stb 	},
28855e6bb00Stb 	{
28955e6bb00Stb 		.algorithm = NID_sha512,
29055e6bb00Stb 		.in =
29155e6bb00Stb 		    "abcdefghbcdefghicdefghijdefghijkefghijklfghijklm"
29255e6bb00Stb 		    "ghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrs"
29355e6bb00Stb 		    "mnopqrstnopqrstu",
29455e6bb00Stb 		.in_len = 112,
29555e6bb00Stb 		.out = {
29655e6bb00Stb 			0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda,
29755e6bb00Stb 			0x8c, 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f,
29855e6bb00Stb 			0x8f, 0x77, 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1,
29955e6bb00Stb 			0x72, 0x99, 0xae, 0xad, 0xb6, 0x88, 0x90, 0x18,
30055e6bb00Stb 			0x50, 0x1d, 0x28, 0x9e, 0x49, 0x00, 0xf7, 0xe4,
30155e6bb00Stb 			0x33, 0x1b, 0x99, 0xde, 0xc4, 0xb5, 0x43, 0x3a,
30255e6bb00Stb 			0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd, 0x26, 0x54,
30355e6bb00Stb 			0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9, 0x09,
304*684e5946Sjoshua 		},
30555e6bb00Stb 	},
3066f73b466Sjoshua 
3076f73b466Sjoshua 	/* SHA3-224 */
3086f73b466Sjoshua 	{
3096f73b466Sjoshua 		.algorithm = NID_sha3_224,
3106f73b466Sjoshua 		.in = "abc",
3116f73b466Sjoshua 		.in_len = 3,
3126f73b466Sjoshua 		.out = {
3136f73b466Sjoshua 			0xe6, 0x42, 0x82, 0x4c, 0x3f, 0x8c, 0xf2, 0x4a,
3146f73b466Sjoshua 			0xd0, 0x92, 0x34, 0xee, 0x7d, 0x3c, 0x76, 0x6f,
3156f73b466Sjoshua 			0xc9, 0xa3, 0xa5, 0x16, 0x8d, 0x0c, 0x94, 0xad,
3166f73b466Sjoshua 			0x73, 0xb4, 0x6f, 0xdf,
3176f73b466Sjoshua 		},
3186f73b466Sjoshua 	},
3196f73b466Sjoshua 	{
3206f73b466Sjoshua 		.algorithm = NID_sha3_224,
3216f73b466Sjoshua 		.in = "",
3226f73b466Sjoshua 		.in_len = 0,
3236f73b466Sjoshua 		.out = {
3246f73b466Sjoshua 			0x6b, 0x4e, 0x03, 0x42, 0x36, 0x67, 0xdb, 0xb7,
3256f73b466Sjoshua 			0x3b, 0x6e, 0x15, 0x45, 0x4f, 0x0e, 0xb1, 0xab,
3266f73b466Sjoshua 			0xd4, 0x59, 0x7f, 0x9a, 0x1b, 0x07, 0x8e, 0x3f,
3276f73b466Sjoshua 			0x5b, 0x5a, 0x6b, 0xc7,
3286f73b466Sjoshua 		},
3296f73b466Sjoshua 	},
3306f73b466Sjoshua 	{
3316f73b466Sjoshua 		.algorithm = NID_sha3_224,
3326f73b466Sjoshua 		.in =
3336f73b466Sjoshua 		    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmno"
3346f73b466Sjoshua 		    "mnopnopq",
3356f73b466Sjoshua 		.in_len = 56,
3366f73b466Sjoshua 		.out = {
3376f73b466Sjoshua 			0x8a, 0x24, 0x10, 0x8b, 0x15, 0x4a, 0xda, 0x21,
3386f73b466Sjoshua 			0xc9, 0xfd, 0x55, 0x74, 0x49, 0x44, 0x79, 0xba,
3396f73b466Sjoshua 			0x5c, 0x7e, 0x7a, 0xb7, 0x6e, 0xf2, 0x64, 0xea,
3406f73b466Sjoshua 			0xd0, 0xfc, 0xce, 0x33,
3416f73b466Sjoshua 		},
3426f73b466Sjoshua 	},
3436f73b466Sjoshua 	{
3446f73b466Sjoshua 		.algorithm = NID_sha3_224,
3456f73b466Sjoshua 		.in =
3466f73b466Sjoshua 		    "abcdefghbcdefghicdefghijdefghijkefghijklfghijklm"
3476f73b466Sjoshua 		    "ghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrs"
3486f73b466Sjoshua 		    "mnopqrstnopqrstu",
3496f73b466Sjoshua 		.in_len = 112,
3506f73b466Sjoshua 		.out = {
3516f73b466Sjoshua 			0x54, 0x3e, 0x68, 0x68, 0xe1, 0x66, 0x6c, 0x1a,
3526f73b466Sjoshua 			0x64, 0x36, 0x30, 0xdf, 0x77, 0x36, 0x7a, 0xe5,
3536f73b466Sjoshua 			0xa6, 0x2a, 0x85, 0x07, 0x0a, 0x51, 0xc1, 0x4c,
3546f73b466Sjoshua 			0xbf, 0x66, 0x5c, 0xbc,
3556f73b466Sjoshua 		},
3566f73b466Sjoshua 	},
3576f73b466Sjoshua 
3586f73b466Sjoshua 	/* SHA3-256 */
3596f73b466Sjoshua 	{
3606f73b466Sjoshua 		.algorithm = NID_sha3_256,
3616f73b466Sjoshua 		.in = "abc",
3626f73b466Sjoshua 		.in_len = 3,
3636f73b466Sjoshua 		.out = {
3646f73b466Sjoshua 			0x3a, 0x98, 0x5d, 0xa7, 0x4f, 0xe2, 0x25, 0xb2,
3656f73b466Sjoshua 			0x04, 0x5c, 0x17, 0x2d, 0x6b, 0xd3, 0x90, 0xbd,
3666f73b466Sjoshua 			0x85, 0x5f, 0x08, 0x6e, 0x3e, 0x9d, 0x52, 0x5b,
3676f73b466Sjoshua 			0x46, 0xbf, 0xe2, 0x45, 0x11, 0x43, 0x15, 0x32,
3686f73b466Sjoshua 		},
3696f73b466Sjoshua 	},
3706f73b466Sjoshua 	{
3716f73b466Sjoshua 		.algorithm = NID_sha3_256,
3726f73b466Sjoshua 		.in = "",
3736f73b466Sjoshua 		.in_len = 0,
3746f73b466Sjoshua 		.out = {
3756f73b466Sjoshua 			0xa7, 0xff, 0xc6, 0xf8, 0xbf, 0x1e, 0xd7, 0x66,
3766f73b466Sjoshua 			0x51, 0xc1, 0x47, 0x56, 0xa0, 0x61, 0xd6, 0x62,
3776f73b466Sjoshua 			0xf5, 0x80, 0xff, 0x4d, 0xe4, 0x3b, 0x49, 0xfa,
3786f73b466Sjoshua 			0x82, 0xd8, 0x0a, 0x4b, 0x80, 0xf8, 0x43, 0x4a,
3796f73b466Sjoshua 		},
3806f73b466Sjoshua 	},
3816f73b466Sjoshua 	{
3826f73b466Sjoshua 		.algorithm = NID_sha3_256,
3836f73b466Sjoshua 		.in =
3846f73b466Sjoshua 		    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmno"
3856f73b466Sjoshua 		    "mnopnopq",
3866f73b466Sjoshua 		.in_len = 56,
3876f73b466Sjoshua 		.out = {
3886f73b466Sjoshua 			0x41, 0xc0, 0xdb, 0xa2, 0xa9, 0xd6, 0x24, 0x08,
3896f73b466Sjoshua 			0x49, 0x10, 0x03, 0x76, 0xa8, 0x23, 0x5e, 0x2c,
3906f73b466Sjoshua 			0x82, 0xe1, 0xb9, 0x99, 0x8a, 0x99, 0x9e, 0x21,
3916f73b466Sjoshua 			0xdb, 0x32, 0xdd, 0x97, 0x49, 0x6d, 0x33, 0x76,
3926f73b466Sjoshua 		},
3936f73b466Sjoshua 	},
3946f73b466Sjoshua 	{
3956f73b466Sjoshua 		.algorithm = NID_sha3_256,
3966f73b466Sjoshua 		.in =
3976f73b466Sjoshua 		    "abcdefghbcdefghicdefghijdefghijkefghijklfghijklm"
3986f73b466Sjoshua 		    "ghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrs"
3996f73b466Sjoshua 		    "mnopqrstnopqrstu",
4006f73b466Sjoshua 		.in_len = 112,
4016f73b466Sjoshua 		.out = {
4026f73b466Sjoshua 			0x91, 0x6f, 0x60, 0x61, 0xfe, 0x87, 0x97, 0x41,
4036f73b466Sjoshua 			0xca, 0x64, 0x69, 0xb4, 0x39, 0x71, 0xdf, 0xdb,
4046f73b466Sjoshua 			0x28, 0xb1, 0xa3, 0x2d, 0xc3, 0x6c, 0xb3, 0x25,
4056f73b466Sjoshua 			0x4e, 0x81, 0x2b, 0xe2, 0x7a, 0xad, 0x1d, 0x18,
4066f73b466Sjoshua 		},
4076f73b466Sjoshua 	},
4086f73b466Sjoshua 
4096f73b466Sjoshua 	/* SHA3-384 */
4106f73b466Sjoshua 	{
4116f73b466Sjoshua 		.algorithm = NID_sha3_384,
4126f73b466Sjoshua 		.in = "abc",
4136f73b466Sjoshua 		.in_len = 3,
4146f73b466Sjoshua 		.out = {
4156f73b466Sjoshua 			0xec, 0x01, 0x49, 0x82, 0x88, 0x51, 0x6f, 0xc9,
4166f73b466Sjoshua 			0x26, 0x45, 0x9f, 0x58, 0xe2, 0xc6, 0xad, 0x8d,
4176f73b466Sjoshua 			0xf9, 0xb4, 0x73, 0xcb, 0x0f, 0xc0, 0x8c, 0x25,
4186f73b466Sjoshua 			0x96, 0xda, 0x7c, 0xf0, 0xe4, 0x9b, 0xe4, 0xb2,
4196f73b466Sjoshua 			0x98, 0xd8, 0x8c, 0xea, 0x92, 0x7a, 0xc7, 0xf5,
4206f73b466Sjoshua 			0x39, 0xf1, 0xed, 0xf2, 0x28, 0x37, 0x6d, 0x25,
4216f73b466Sjoshua 		},
4226f73b466Sjoshua 	},
4236f73b466Sjoshua 	{
4246f73b466Sjoshua 		.algorithm = NID_sha3_384,
4256f73b466Sjoshua 		.in = "",
4266f73b466Sjoshua 		.in_len = 0,
4276f73b466Sjoshua 		.out = {
4286f73b466Sjoshua 			0x0c, 0x63, 0xa7, 0x5b, 0x84, 0x5e, 0x4f, 0x7d,
4296f73b466Sjoshua 			0x01, 0x10, 0x7d, 0x85, 0x2e, 0x4c, 0x24, 0x85,
4306f73b466Sjoshua 			0xc5, 0x1a, 0x50, 0xaa, 0xaa, 0x94, 0xfc, 0x61,
4316f73b466Sjoshua 			0x99, 0x5e, 0x71, 0xbb, 0xee, 0x98, 0x3a, 0x2a,
4326f73b466Sjoshua 			0xc3, 0x71, 0x38, 0x31, 0x26, 0x4a, 0xdb, 0x47,
4336f73b466Sjoshua 			0xfb, 0x6b, 0xd1, 0xe0, 0x58, 0xd5, 0xf0, 0x04,
4346f73b466Sjoshua 		},
4356f73b466Sjoshua 	},
4366f73b466Sjoshua 	{
4376f73b466Sjoshua 		.algorithm = NID_sha3_384,
4386f73b466Sjoshua 		.in =
4396f73b466Sjoshua 		    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmno"
4406f73b466Sjoshua 		    "mnopnopq",
4416f73b466Sjoshua 		.in_len = 56,
4426f73b466Sjoshua 		.out = {
4436f73b466Sjoshua 			0x99, 0x1c, 0x66, 0x57, 0x55, 0xeb, 0x3a, 0x4b,
4446f73b466Sjoshua 			0x6b, 0xbd, 0xfb, 0x75, 0xc7, 0x8a, 0x49, 0x2e,
4456f73b466Sjoshua 			0x8c, 0x56, 0xa2, 0x2c, 0x5c, 0x4d, 0x7e, 0x42,
4466f73b466Sjoshua 			0x9b, 0xfd, 0xbc, 0x32, 0xb9, 0xd4, 0xad, 0x5a,
4476f73b466Sjoshua 			0xa0, 0x4a, 0x1f, 0x07, 0x6e, 0x62, 0xfe, 0xa1,
4486f73b466Sjoshua 			0x9e, 0xef, 0x51, 0xac, 0xd0, 0x65, 0x7c, 0x22,
4496f73b466Sjoshua 		},
4506f73b466Sjoshua 	},
4516f73b466Sjoshua 	{
4526f73b466Sjoshua 		.algorithm = NID_sha3_384,
4536f73b466Sjoshua 		.in =
4546f73b466Sjoshua 		    "abcdefghbcdefghicdefghijdefghijkefghijklfghijklm"
4556f73b466Sjoshua 		    "ghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrs"
4566f73b466Sjoshua 		    "mnopqrstnopqrstu",
4576f73b466Sjoshua 		.in_len = 112,
4586f73b466Sjoshua 		.out = {
4596f73b466Sjoshua 			0x79, 0x40, 0x7d, 0x3b, 0x59, 0x16, 0xb5, 0x9c,
4606f73b466Sjoshua 			0x3e, 0x30, 0xb0, 0x98, 0x22, 0x97, 0x47, 0x91,
4616f73b466Sjoshua 			0xc3, 0x13, 0xfb, 0x9e, 0xcc, 0x84, 0x9e, 0x40,
4626f73b466Sjoshua 			0x6f, 0x23, 0x59, 0x2d, 0x04, 0xf6, 0x25, 0xdc,
4636f73b466Sjoshua 			0x8c, 0x70, 0x9b, 0x98, 0xb4, 0x3b, 0x38, 0x52,
4646f73b466Sjoshua 			0xb3, 0x37, 0x21, 0x61, 0x79, 0xaa, 0x7f, 0xc7,
4656f73b466Sjoshua 		},
4666f73b466Sjoshua 	},
4676f73b466Sjoshua 
4686f73b466Sjoshua 	/* SHA3-512 */
4696f73b466Sjoshua 	{
4706f73b466Sjoshua 		.algorithm = NID_sha3_512,
4716f73b466Sjoshua 		.in = "abc",
4726f73b466Sjoshua 		.in_len = 3,
4736f73b466Sjoshua 		.out = {
4746f73b466Sjoshua 			0xb7, 0x51, 0x85, 0x0b, 0x1a, 0x57, 0x16, 0x8a,
4756f73b466Sjoshua 			0x56, 0x93, 0xcd, 0x92, 0x4b, 0x6b, 0x09, 0x6e,
4766f73b466Sjoshua 			0x08, 0xf6, 0x21, 0x82, 0x74, 0x44, 0xf7, 0x0d,
4776f73b466Sjoshua 			0x88, 0x4f, 0x5d, 0x02, 0x40, 0xd2, 0x71, 0x2e,
4786f73b466Sjoshua 			0x10, 0xe1, 0x16, 0xe9, 0x19, 0x2a, 0xf3, 0xc9,
4796f73b466Sjoshua 			0x1a, 0x7e, 0xc5, 0x76, 0x47, 0xe3, 0x93, 0x40,
4806f73b466Sjoshua 			0x57, 0x34, 0x0b, 0x4c, 0xf4, 0x08, 0xd5, 0xa5,
4816f73b466Sjoshua 			0x65, 0x92, 0xf8, 0x27, 0x4e, 0xec, 0x53, 0xf0,
4826f73b466Sjoshua 		},
4836f73b466Sjoshua 	},
4846f73b466Sjoshua 	{
4856f73b466Sjoshua 		.algorithm = NID_sha3_512,
4866f73b466Sjoshua 		.in = "",
4876f73b466Sjoshua 		.in_len = 0,
4886f73b466Sjoshua 		.out = {
4896f73b466Sjoshua 			0xa6, 0x9f, 0x73, 0xcc, 0xa2, 0x3a, 0x9a, 0xc5,
4906f73b466Sjoshua 			0xc8, 0xb5, 0x67, 0xdc, 0x18, 0x5a, 0x75, 0x6e,
4916f73b466Sjoshua 			0x97, 0xc9, 0x82, 0x16, 0x4f, 0xe2, 0x58, 0x59,
4926f73b466Sjoshua 			0xe0, 0xd1, 0xdc, 0xc1, 0x47, 0x5c, 0x80, 0xa6,
4936f73b466Sjoshua 			0x15, 0xb2, 0x12, 0x3a, 0xf1, 0xf5, 0xf9, 0x4c,
4946f73b466Sjoshua 			0x11, 0xe3, 0xe9, 0x40, 0x2c, 0x3a, 0xc5, 0x58,
4956f73b466Sjoshua 			0xf5, 0x00, 0x19, 0x9d, 0x95, 0xb6, 0xd3, 0xe3,
4966f73b466Sjoshua 			0x01, 0x75, 0x85, 0x86, 0x28, 0x1d, 0xcd, 0x26,
4976f73b466Sjoshua 		},
4986f73b466Sjoshua 	},
4996f73b466Sjoshua 	{
5006f73b466Sjoshua 		.algorithm = NID_sha3_512,
5016f73b466Sjoshua 		.in =
5026f73b466Sjoshua 		    "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmno"
5036f73b466Sjoshua 		    "mnopnopq",
5046f73b466Sjoshua 		.in_len = 56,
5056f73b466Sjoshua 		.out = {
5066f73b466Sjoshua 			0x04, 0xa3, 0x71, 0xe8, 0x4e, 0xcf, 0xb5, 0xb8,
5076f73b466Sjoshua 			0xb7, 0x7c, 0xb4, 0x86, 0x10, 0xfc, 0xa8, 0x18,
5086f73b466Sjoshua 			0x2d, 0xd4, 0x57, 0xce, 0x6f, 0x32, 0x6a, 0x0f,
5096f73b466Sjoshua 			0xd3, 0xd7, 0xec, 0x2f, 0x1e, 0x91, 0x63, 0x6d,
5106f73b466Sjoshua 			0xee, 0x69, 0x1f, 0xbe, 0x0c, 0x98, 0x53, 0x02,
5116f73b466Sjoshua 			0xba, 0x1b, 0x0d, 0x8d, 0xc7, 0x8c, 0x08, 0x63,
5126f73b466Sjoshua 			0x46, 0xb5, 0x33, 0xb4, 0x9c, 0x03, 0x0d, 0x99,
5136f73b466Sjoshua 			0xa2, 0x7d, 0xaf, 0x11, 0x39, 0xd6, 0xe7, 0x5e,
5146f73b466Sjoshua 		},
5156f73b466Sjoshua 	},
5166f73b466Sjoshua 	{
5176f73b466Sjoshua 		.algorithm = NID_sha3_512,
5186f73b466Sjoshua 		.in =
5196f73b466Sjoshua 		    "abcdefghbcdefghicdefghijdefghijkefghijklfghijklm"
5206f73b466Sjoshua 		    "ghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrs"
5216f73b466Sjoshua 		    "mnopqrstnopqrstu",
5226f73b466Sjoshua 		.in_len = 112,
5236f73b466Sjoshua 		.out = {
5246f73b466Sjoshua 			0xaf, 0xeb, 0xb2, 0xef, 0x54, 0x2e, 0x65, 0x79,
5256f73b466Sjoshua 			0xc5, 0x0c, 0xad, 0x06, 0xd2, 0xe5, 0x78, 0xf9,
5266f73b466Sjoshua 			0xf8, 0xdd, 0x68, 0x81, 0xd7, 0xdc, 0x82, 0x4d,
5276f73b466Sjoshua 			0x26, 0x36, 0x0f, 0xee, 0xbf, 0x18, 0xa4, 0xfa,
5286f73b466Sjoshua 			0x73, 0xe3, 0x26, 0x11, 0x22, 0x94, 0x8e, 0xfc,
5296f73b466Sjoshua 			0xfd, 0x49, 0x2e, 0x74, 0xe8, 0x2e, 0x21, 0x89,
5306f73b466Sjoshua 			0xed, 0x0f, 0xb4, 0x40, 0xd1, 0x87, 0xf3, 0x82,
5316f73b466Sjoshua 			0x27, 0x0c, 0xb4, 0x55, 0xf2, 0x1d, 0xd1, 0x85,
5326f73b466Sjoshua 		},
5336f73b466Sjoshua 	},
53455e6bb00Stb };
53555e6bb00Stb 
536a79bf4b0Stb struct sha_repetition_test {
537c8db7e74Stb 	const int algorithm;
538c8db7e74Stb 	const uint8_t in;
539c8db7e74Stb 	const size_t in_repetitions;
540c8db7e74Stb 	const uint8_t out[EVP_MAX_MD_SIZE];
541c8db7e74Stb };
542c8db7e74Stb 
543a79bf4b0Stb static const struct sha_repetition_test sha_repetition_tests[] = {
544c8db7e74Stb 	/* SHA-1 */
545c8db7e74Stb 	{
546c8db7e74Stb 		.algorithm = NID_sha1,
547c8db7e74Stb 		.in = 'a',
548c8db7e74Stb 		.in_repetitions = 1000000,
549c8db7e74Stb 		.out = {
550c8db7e74Stb 			0x34, 0xaa, 0x97, 0x3c, 0xd4, 0xc4, 0xda, 0xa4,
551c8db7e74Stb 			0xf6, 0x1e, 0xeb, 0x2b, 0xdb, 0xad, 0x27, 0x31,
552c8db7e74Stb 			0x65, 0x34, 0x01, 0x6f,
553*684e5946Sjoshua 		},
554c8db7e74Stb 	},
555c8db7e74Stb 
556c8db7e74Stb 	/* SHA-224 */
557c8db7e74Stb 	{
558c8db7e74Stb 		.algorithm = NID_sha224,
559c8db7e74Stb 		.in = 'a',
560c8db7e74Stb 		.in_repetitions = 1000000,
561c8db7e74Stb 		.out = {
562c8db7e74Stb 			0x20, 0x79, 0x46, 0x55, 0x98, 0x0c, 0x91, 0xd8,
563c8db7e74Stb 			0xbb, 0xb4, 0xc1, 0xea, 0x97, 0x61, 0x8a, 0x4b,
564c8db7e74Stb 			0xf0, 0x3f, 0x42, 0x58, 0x19, 0x48, 0xb2, 0xee,
565c8db7e74Stb 			0x4e, 0xe7, 0xad, 0x67,
566*684e5946Sjoshua 		},
567c8db7e74Stb 	},
568c8db7e74Stb 
569c8db7e74Stb 	/* SHA-256 */
570c8db7e74Stb 	{
571c8db7e74Stb 		.algorithm = NID_sha256,
572c8db7e74Stb 		.in = 'a',
573c8db7e74Stb 		.in_repetitions = 1000000,
574c8db7e74Stb 		.out = {
575c8db7e74Stb 			0xcd, 0xc7, 0x6e, 0x5c, 0x99, 0x14, 0xfb, 0x92,
576c8db7e74Stb 			0x81, 0xa1, 0xc7, 0xe2, 0x84, 0xd7, 0x3e, 0x67,
577c8db7e74Stb 			0xf1, 0x80, 0x9a, 0x48, 0xa4, 0x97, 0x20, 0x0e,
578c8db7e74Stb 			0x04, 0x6d, 0x39, 0xcc, 0xc7, 0x11, 0x2c, 0xd0,
579*684e5946Sjoshua 		},
580c8db7e74Stb 	},
581c8db7e74Stb 
582c8db7e74Stb 	/* SHA-384 */
583c8db7e74Stb 	{
584c8db7e74Stb 		.algorithm = NID_sha384,
585c8db7e74Stb 		.in = 'a',
586c8db7e74Stb 		.in_repetitions = 1000000,
587c8db7e74Stb 		.out = {
588c8db7e74Stb 			0x9d, 0x0e, 0x18, 0x09, 0x71, 0x64, 0x74, 0xcb,
589c8db7e74Stb 			0x08, 0x6e, 0x83, 0x4e, 0x31, 0x0a, 0x4a, 0x1c,
590c8db7e74Stb 			0xed, 0x14, 0x9e, 0x9c, 0x00, 0xf2, 0x48, 0x52,
591c8db7e74Stb 			0x79, 0x72, 0xce, 0xc5, 0x70, 0x4c, 0x2a, 0x5b,
592c8db7e74Stb 			0x07, 0xb8, 0xb3, 0xdc, 0x38, 0xec, 0xc4, 0xeb,
593c8db7e74Stb 			0xae, 0x97, 0xdd, 0xd8, 0x7f, 0x3d, 0x89, 0x85,
594*684e5946Sjoshua 		},
595c8db7e74Stb 	},
596c8db7e74Stb 
597c8db7e74Stb 	/* SHA-512 */
598c8db7e74Stb 	{
599c8db7e74Stb 		.algorithm = NID_sha512,
600c8db7e74Stb 		.in = 'a',
601c8db7e74Stb 		.in_repetitions = 1000000,
602c8db7e74Stb 		.out = {
603c8db7e74Stb 			0xe7, 0x18, 0x48, 0x3d, 0x0c, 0xe7, 0x69, 0x64,
604c8db7e74Stb 			0x4e, 0x2e, 0x42, 0xc7, 0xbc, 0x15, 0xb4, 0x63,
605c8db7e74Stb 			0x8e, 0x1f, 0x98, 0xb1, 0x3b, 0x20, 0x44, 0x28,
606c8db7e74Stb 			0x56, 0x32, 0xa8, 0x03, 0xaf, 0xa9, 0x73, 0xeb,
607c8db7e74Stb 			0xde, 0x0f, 0xf2, 0x44, 0x87, 0x7e, 0xa6, 0x0a,
608c8db7e74Stb 			0x4c, 0xb0, 0x43, 0x2c, 0xe5, 0x77, 0xc3, 0x1b,
609c8db7e74Stb 			0xeb, 0x00, 0x9c, 0x5c, 0x2c, 0x49, 0xaa, 0x2e,
610c8db7e74Stb 			0x4e, 0xad, 0xb2, 0x17, 0xad, 0x8c, 0xc0, 0x9b,
611*684e5946Sjoshua 		},
612c8db7e74Stb 	},
6136f73b466Sjoshua 
6146f73b466Sjoshua 	/* SHA3-224 */
6156f73b466Sjoshua 	{
6166f73b466Sjoshua 		.algorithm = NID_sha3_224,
6176f73b466Sjoshua 		.in = 'a',
6186f73b466Sjoshua 		.in_repetitions = 1000000,
6196f73b466Sjoshua 		.out = {
6206f73b466Sjoshua 			0xd6, 0x93, 0x35, 0xb9, 0x33, 0x25, 0x19, 0x2e,
6216f73b466Sjoshua 			0x51, 0x6a, 0x91, 0x2e, 0x6d, 0x19, 0xa1, 0x5c,
6226f73b466Sjoshua 			0xb5, 0x1c, 0x6e, 0xd5, 0xc1, 0x52, 0x43, 0xe7,
6236f73b466Sjoshua 			0xa7, 0xfd, 0x65, 0x3c,
6246f73b466Sjoshua 		},
6256f73b466Sjoshua 	},
6266f73b466Sjoshua 
6276f73b466Sjoshua 	/* SHA3-256 */
6286f73b466Sjoshua 	{
6296f73b466Sjoshua 		.algorithm = NID_sha3_256,
6306f73b466Sjoshua 		.in = 'a',
6316f73b466Sjoshua 		.in_repetitions = 1000000,
6326f73b466Sjoshua 		.out = {
6336f73b466Sjoshua 			0x5c, 0x88, 0x75, 0xae, 0x47, 0x4a, 0x36, 0x34,
6346f73b466Sjoshua 			0xba, 0x4f, 0xd5, 0x5e, 0xc8, 0x5b, 0xff, 0xd6,
6356f73b466Sjoshua 			0x61, 0xf3, 0x2a, 0xca, 0x75, 0xc6, 0xd6, 0x99,
6366f73b466Sjoshua 			0xd0, 0xcd, 0xcb, 0x6c, 0x11, 0x58, 0x91, 0xc1,
6376f73b466Sjoshua 		},
6386f73b466Sjoshua 	},
6396f73b466Sjoshua 
6406f73b466Sjoshua 	/* SHA3-384 */
6416f73b466Sjoshua 	{
6426f73b466Sjoshua 		.algorithm = NID_sha3_384,
6436f73b466Sjoshua 		.in = 'a',
6446f73b466Sjoshua 		.in_repetitions = 1000000,
6456f73b466Sjoshua 		.out = {
6466f73b466Sjoshua 			0xee, 0xe9, 0xe2, 0x4d, 0x78, 0xc1, 0x85, 0x53,
6476f73b466Sjoshua 			0x37, 0x98, 0x34, 0x51, 0xdf, 0x97, 0xc8, 0xad,
6486f73b466Sjoshua 			0x9e, 0xed, 0xf2, 0x56, 0xc6, 0x33, 0x4f, 0x8e,
6496f73b466Sjoshua 			0x94, 0x8d, 0x25, 0x2d, 0x5e, 0x0e, 0x76, 0x84,
6506f73b466Sjoshua 			0x7a, 0xa0, 0x77, 0x4d, 0xdb, 0x90, 0xa8, 0x42,
6516f73b466Sjoshua 			0x19, 0x0d, 0x2c, 0x55, 0x8b, 0x4b, 0x83, 0x40,
6526f73b466Sjoshua 		},
6536f73b466Sjoshua 	},
6546f73b466Sjoshua 
6556f73b466Sjoshua 	/* SHA3-512 */
6566f73b466Sjoshua 	{
6576f73b466Sjoshua 		.algorithm = NID_sha3_512,
6586f73b466Sjoshua 		.in = 'a',
6596f73b466Sjoshua 		.in_repetitions = 1000000,
6606f73b466Sjoshua 		.out = {
6616f73b466Sjoshua 			0x3c, 0x3a, 0x87, 0x6d, 0xa1, 0x40, 0x34, 0xab,
6626f73b466Sjoshua 			0x60, 0x62, 0x7c, 0x07, 0x7b, 0xb9, 0x8f, 0x7e,
6636f73b466Sjoshua 			0x12, 0x0a, 0x2a, 0x53, 0x70, 0x21, 0x2d, 0xff,
6646f73b466Sjoshua 			0xb3, 0x38, 0x5a, 0x18, 0xd4, 0xf3, 0x88, 0x59,
6656f73b466Sjoshua 			0xed, 0x31, 0x1d, 0x0a, 0x9d, 0x51, 0x41, 0xce,
6666f73b466Sjoshua 			0x9c, 0xc5, 0xc6, 0x6e, 0xe6, 0x89, 0xb2, 0x66,
6676f73b466Sjoshua 			0xa8, 0xaa, 0x18, 0xac, 0xe8, 0x28, 0x2a, 0x0e,
6686f73b466Sjoshua 			0x0d, 0xb5, 0x96, 0xc9, 0x0b, 0x0a, 0x7b, 0x87,
6696f73b466Sjoshua 		},
6706f73b466Sjoshua 	},
671c8db7e74Stb };
672c8db7e74Stb 
67355e6bb00Stb #define N_SHA_TESTS (sizeof(sha_tests) / sizeof(sha_tests[0]))
674c8db7e74Stb #define N_SHA_REPETITION_TESTS (sizeof(sha_repetition_tests) / sizeof(sha_repetition_tests[0]))
675c8db7e74Stb 
676c8db7e74Stb typedef unsigned char *(*sha_hash_func)(const unsigned char *, size_t,
677c8db7e74Stb     unsigned char *);
678c8db7e74Stb 
679c8db7e74Stb static int
sha_hash_from_algorithm(int algorithm,const char ** out_label,sha_hash_func * out_func,const EVP_MD ** out_md,size_t * out_len)680c8db7e74Stb sha_hash_from_algorithm(int algorithm, const char **out_label,
681c8db7e74Stb     sha_hash_func *out_func, const EVP_MD **out_md, size_t *out_len)
682c8db7e74Stb {
683c8db7e74Stb 	const char *label;
684c8db7e74Stb 	sha_hash_func sha_func;
685c8db7e74Stb 	const EVP_MD *md;
686c8db7e74Stb 	size_t len;
687c8db7e74Stb 
688c8db7e74Stb 	switch (algorithm) {
689c8db7e74Stb 	case NID_sha1:
690c8db7e74Stb 		label = SN_sha1;
691c8db7e74Stb 		sha_func = SHA1;
692c8db7e74Stb 		md = EVP_sha1();
693c8db7e74Stb 		len = SHA_DIGEST_LENGTH;
694c8db7e74Stb 		break;
695c8db7e74Stb 	case NID_sha224:
696c8db7e74Stb 		label = SN_sha224;
697c8db7e74Stb 		sha_func = SHA224;
698c8db7e74Stb 		md = EVP_sha224();
699c8db7e74Stb 		len = SHA224_DIGEST_LENGTH;
700c8db7e74Stb 		break;
701c8db7e74Stb 	case NID_sha256:
702c8db7e74Stb 		label = SN_sha256;
703c8db7e74Stb 		sha_func = SHA256;
704c8db7e74Stb 		md = EVP_sha256();
705c8db7e74Stb 		len = SHA256_DIGEST_LENGTH;
706c8db7e74Stb 		break;
707c8db7e74Stb 	case NID_sha384:
708c8db7e74Stb 		label = SN_sha384;
709c8db7e74Stb 		sha_func = SHA384;
710c8db7e74Stb 		md = EVP_sha384();
711c8db7e74Stb 		len = SHA384_DIGEST_LENGTH;
712c8db7e74Stb 		break;
713c8db7e74Stb 	case NID_sha512:
714c8db7e74Stb 		label = SN_sha512;
715c8db7e74Stb 		sha_func = SHA512;
716c8db7e74Stb 		md = EVP_sha512();
717c8db7e74Stb 		len = SHA512_DIGEST_LENGTH;
718c8db7e74Stb 		break;
7196f73b466Sjoshua 	case NID_sha3_224:
7206f73b466Sjoshua 		label = SN_sha3_224;
7216f73b466Sjoshua 		sha_func = NULL;
7226f73b466Sjoshua 		md = EVP_sha3_224();
7236f73b466Sjoshua 		len = 224 / 8;
7246f73b466Sjoshua 		break;
7256f73b466Sjoshua 	case NID_sha3_256:
7266f73b466Sjoshua 		label = SN_sha3_256;
7276f73b466Sjoshua 		sha_func = NULL;
7286f73b466Sjoshua 		md = EVP_sha3_256();
7296f73b466Sjoshua 		len = 256 / 8;
7306f73b466Sjoshua 		break;
7316f73b466Sjoshua 	case NID_sha3_384:
7326f73b466Sjoshua 		label = SN_sha3_384;
7336f73b466Sjoshua 		sha_func = NULL;
7346f73b466Sjoshua 		md = EVP_sha3_384();
7356f73b466Sjoshua 		len = 384 / 8;
7366f73b466Sjoshua 		break;
7376f73b466Sjoshua 	case NID_sha3_512:
7386f73b466Sjoshua 		label = SN_sha3_512;
7396f73b466Sjoshua 		sha_func = NULL;
7406f73b466Sjoshua 		md = EVP_sha3_512();
7416f73b466Sjoshua 		len = 512 / 8;
7426f73b466Sjoshua 		break;
743c8db7e74Stb 	default:
744c8db7e74Stb 		fprintf(stderr, "FAIL: unknown algorithm (%d)\n",
745c8db7e74Stb 		    algorithm);
746c8db7e74Stb 		return 0;
747c8db7e74Stb 	}
748c8db7e74Stb 
749c8db7e74Stb 	if (out_label != NULL)
750c8db7e74Stb 		*out_label = label;
751c8db7e74Stb 	if (out_func != NULL)
752c8db7e74Stb 		*out_func = sha_func;
753c8db7e74Stb 	if (out_md != NULL)
754c8db7e74Stb 		*out_md = md;
755c8db7e74Stb 	if (out_len != NULL)
756c8db7e74Stb 		*out_len = len;
757c8db7e74Stb 
758c8db7e74Stb 	return 1;
759c8db7e74Stb }
76055e6bb00Stb 
76155e6bb00Stb static int
sha_test(void)76255e6bb00Stb sha_test(void)
76355e6bb00Stb {
764c8db7e74Stb 	sha_hash_func sha_func;
765ece7faebStb 	const struct sha_test *st;
76655e6bb00Stb 	EVP_MD_CTX *hash = NULL;
76755e6bb00Stb 	const EVP_MD *md;
76855e6bb00Stb 	uint8_t out[EVP_MAX_MD_SIZE];
76955e6bb00Stb 	size_t in_len, out_len;
77055e6bb00Stb 	size_t i;
77155e6bb00Stb 	const char *label;
77255e6bb00Stb 	int failed = 1;
77355e6bb00Stb 
77455e6bb00Stb 	if ((hash = EVP_MD_CTX_new()) == NULL) {
77555e6bb00Stb 		fprintf(stderr, "FAIL: EVP_MD_CTX_new() failed\n");
77655e6bb00Stb 		goto failed;
77755e6bb00Stb 	}
77855e6bb00Stb 
77955e6bb00Stb 	for (i = 0; i < N_SHA_TESTS; i++) {
78055e6bb00Stb 		st = &sha_tests[i];
781c8db7e74Stb 		if (!sha_hash_from_algorithm(st->algorithm, &label, &sha_func,
782c8db7e74Stb 		    &md, &out_len))
78355e6bb00Stb 			goto failed;
78455e6bb00Stb 
78555e6bb00Stb 		/* Digest */
7866f73b466Sjoshua 		if (sha_func != NULL) {
78755e6bb00Stb 			memset(out, 0, sizeof(out));
78855e6bb00Stb 			sha_func(st->in, st->in_len, out);
78955e6bb00Stb 			if (memcmp(st->out, out, out_len) != 0) {
7906f73b466Sjoshua 				fprintf(stderr, "FAIL (%s:%zu): mismatch\n",
7916f73b466Sjoshua 				    label, i);
79255e6bb00Stb 				goto failed;
79355e6bb00Stb 			}
7946f73b466Sjoshua 		}
79555e6bb00Stb 
79655e6bb00Stb 		/* EVP single-shot digest */
79755e6bb00Stb 		memset(out, 0, sizeof(out));
79855e6bb00Stb 		if (!EVP_Digest(st->in, st->in_len, out, NULL, md, NULL)) {
7996f73b466Sjoshua 			fprintf(stderr, "FAIL (%s:%zu): EVP_Digest failed\n",
8006f73b466Sjoshua 			    label, i);
80155e6bb00Stb 			goto failed;
80255e6bb00Stb 		}
80355e6bb00Stb 
80455e6bb00Stb 		if (memcmp(st->out, out, out_len) != 0) {
8056f73b466Sjoshua 			fprintf(stderr,
8066f73b466Sjoshua 			    "FAIL (%s:%zu): EVP single-shot mismatch\n",
8076f73b466Sjoshua 			    label, i);
80855e6bb00Stb 			goto failed;
80955e6bb00Stb 		}
81055e6bb00Stb 
81155e6bb00Stb 		/* EVP digest */
81255e6bb00Stb 		memset(out, 0, sizeof(out));
81355e6bb00Stb 		if (!EVP_DigestInit_ex(hash, md, NULL)) {
8146f73b466Sjoshua 			fprintf(stderr,
8156f73b466Sjoshua 			    "FAIL (%s:%zu): EVP_DigestInit_ex failed\n",
8166f73b466Sjoshua 			    label, i);
81755e6bb00Stb 			goto failed;
81855e6bb00Stb 		}
81955e6bb00Stb 
82055e6bb00Stb 		in_len = st->in_len / 2;
82155e6bb00Stb 		if (!EVP_DigestUpdate(hash, st->in, in_len)) {
82255e6bb00Stb 			fprintf(stderr,
8236f73b466Sjoshua 			    "FAIL (%s:%zu): EVP_DigestUpdate first half "
8246f73b466Sjoshua 			    "failed\n", label, i);
82555e6bb00Stb 			goto failed;
82655e6bb00Stb 		}
82755e6bb00Stb 
82855e6bb00Stb 		if (!EVP_DigestUpdate(hash, st->in + in_len,
82955e6bb00Stb 		    st->in_len - in_len)) {
83055e6bb00Stb 			fprintf(stderr,
8316f73b466Sjoshua 			    "FAIL (%s:%zu): EVP_DigestUpdate second half "
8326f73b466Sjoshua 			    "failed\n", label, i);
83355e6bb00Stb 			goto failed;
83455e6bb00Stb 		}
83555e6bb00Stb 
83655e6bb00Stb 		if (!EVP_DigestFinal_ex(hash, out, NULL)) {
83755e6bb00Stb 			fprintf(stderr,
8386f73b466Sjoshua 			    "FAIL (%s:%zu): EVP_DigestFinal_ex failed\n",
8396f73b466Sjoshua 			    label, i);
84055e6bb00Stb 			goto failed;
84155e6bb00Stb 		}
84255e6bb00Stb 
84355e6bb00Stb 		if (memcmp(st->out, out, out_len) != 0) {
8446f73b466Sjoshua 			fprintf(stderr, "FAIL (%s:%zu): EVP mismatch\n",
8456f73b466Sjoshua 			    label, i);
84655e6bb00Stb 			goto failed;
84755e6bb00Stb 		}
84855e6bb00Stb 	}
84955e6bb00Stb 
85055e6bb00Stb 	failed = 0;
85155e6bb00Stb 
85255e6bb00Stb  failed:
85355e6bb00Stb 	EVP_MD_CTX_free(hash);
85455e6bb00Stb 	return failed;
85555e6bb00Stb }
85655e6bb00Stb 
857c8db7e74Stb static int
sha_repetition_test(void)858c8db7e74Stb sha_repetition_test(void)
859c8db7e74Stb {
860ece7faebStb 	const struct sha_repetition_test *st;
861c8db7e74Stb 	EVP_MD_CTX *hash = NULL;
862c8db7e74Stb 	const EVP_MD *md;
863c8db7e74Stb 	uint8_t buf[1024];
864c8db7e74Stb 	uint8_t out[EVP_MAX_MD_SIZE];
865c8db7e74Stb 	size_t out_len, part_len;
866c8db7e74Stb 	size_t i, j;
867c8db7e74Stb 	const char *label;
868c8db7e74Stb 	int failed = 1;
869c8db7e74Stb 
870c8db7e74Stb 	if ((hash = EVP_MD_CTX_new()) == NULL) {
871c8db7e74Stb 		fprintf(stderr, "FAIL: EVP_MD_CTX_new() failed\n");
872c8db7e74Stb 		goto failed;
873c8db7e74Stb 	}
874c8db7e74Stb 
875c8db7e74Stb 	for (i = 0; i < N_SHA_REPETITION_TESTS; i++) {
876c8db7e74Stb 		st = &sha_repetition_tests[i];
877c8db7e74Stb 		if (!sha_hash_from_algorithm(st->algorithm, &label, NULL, &md,
878c8db7e74Stb 		    &out_len))
879c8db7e74Stb 			goto failed;
880c8db7e74Stb 
881c8db7e74Stb 		/* EVP digest */
882c8db7e74Stb 		if (!EVP_DigestInit_ex(hash, md, NULL)) {
883c8db7e74Stb 			fprintf(stderr,
8846f73b466Sjoshua 			    "FAIL (%s:%zu): EVP_DigestInit_ex failed\n",
8856f73b466Sjoshua 			    label, i);
886c8db7e74Stb 			goto failed;
887c8db7e74Stb 		}
888c8db7e74Stb 
889c8db7e74Stb 		memset(buf, st->in, sizeof(buf));
890c8db7e74Stb 
891c8db7e74Stb 		for (j = 0; j < st->in_repetitions;) {
892c8db7e74Stb 			part_len = arc4random_uniform(sizeof(buf));
893c8db7e74Stb 			if (part_len > st->in_repetitions - j)
894c8db7e74Stb 				part_len = st->in_repetitions - j;
895c8db7e74Stb 
896c8db7e74Stb 			if (!EVP_DigestUpdate(hash, buf, part_len)) {
897c8db7e74Stb 				fprintf(stderr,
8986f73b466Sjoshua 				    "FAIL (%s:%zu): EVP_DigestUpdate failed\n",
8996f73b466Sjoshua 				    label, i);
900c8db7e74Stb 				goto failed;
901c8db7e74Stb 			}
902c8db7e74Stb 
903c8db7e74Stb 			j += part_len;
904c8db7e74Stb 		}
905c8db7e74Stb 
906c8db7e74Stb 		if (!EVP_DigestFinal_ex(hash, out, NULL)) {
907c8db7e74Stb 			fprintf(stderr,
9086f73b466Sjoshua 			    "FAIL (%s:%zu): EVP_DigestFinal_ex failed\n",
9096f73b466Sjoshua 			    label, i);
910c8db7e74Stb 			goto failed;
911c8db7e74Stb 		}
912c8db7e74Stb 
913c8db7e74Stb 		if (memcmp(st->out, out, out_len) != 0) {
9146f73b466Sjoshua 			fprintf(stderr, "FAIL (%s:%zu): EVP mismatch\n",
9156f73b466Sjoshua 			    label, i);
916c8db7e74Stb 			goto failed;
917c8db7e74Stb 		}
918c8db7e74Stb 	}
919c8db7e74Stb 
920c8db7e74Stb 	failed = 0;
921c8db7e74Stb 
922c8db7e74Stb  failed:
923c8db7e74Stb 	EVP_MD_CTX_free(hash);
924c8db7e74Stb 	return failed;
925c8db7e74Stb }
926c8db7e74Stb 
92755e6bb00Stb int
main(int argc,char ** argv)92855e6bb00Stb main(int argc, char **argv)
92955e6bb00Stb {
93055e6bb00Stb 	int failed = 0;
93155e6bb00Stb 
93255e6bb00Stb 	failed |= sha_test();
933c8db7e74Stb 	failed |= sha_repetition_test();
93455e6bb00Stb 
93555e6bb00Stb 	return failed;
93655e6bb00Stb }
937