iPXE
sha512_test.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2015 Michael Brown <mbrown@fensystems.co.uk>.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301, USA.
18 *
19 * You can also choose to distribute this program under the terms of
20 * the Unmodified Binary Distribution Licence (as given in the file
21 * COPYING.UBDL), provided that you have satisfied its requirements.
22 */
23
24FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25
26/** @file
27 *
28 * SHA-512 family tests
29 *
30 * NIST test vectors are taken from
31 *
32 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA512.pdf
33 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA384.pdf
34 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA512_256.pdf
35 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA512_224.pdf
36 *
37 */
38
39/* Forcibly enable assertions */
40#undef NDEBUG
41
42#include <ipxe/sha512.h>
43#include <ipxe/test.h>
44#include "digest_test.h"
45
46/* Empty test vector (digest obtained from "sha512sum /dev/null") */
48 DIGEST ( 0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1,
49 0x54, 0x28, 0x50, 0xd6, 0x6d, 0x80, 0x07, 0xd6, 0x20,
50 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc, 0x83, 0xf4, 0xa9,
51 0x21, 0xd3, 0x6c, 0xe9, 0xce, 0x47, 0xd0, 0xd1, 0x3c,
52 0x5d, 0x85, 0xf2, 0xb0, 0xff, 0x83, 0x18, 0xd2, 0x87,
53 0x7e, 0xec, 0x2f, 0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41,
54 0x7a, 0x81, 0xa5, 0x38, 0x32, 0x7a, 0xf9, 0x27, 0xda,
55 0x3e ) );
56
57/* NIST test vector "abc" */
59 DIGEST ( 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc,
60 0x41, 0x73, 0x49, 0xae, 0x20, 0x41, 0x31, 0x12, 0xe6,
61 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2, 0x0a, 0x9e, 0xee,
62 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a,
63 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3,
64 0xfe, 0xeb, 0xbd, 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c,
65 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f, 0xa5, 0x4c, 0xa4,
66 0x9f ) );
67
68/* NIST test vector "abc...stu" */
70 DIGEST ( 0x8e, 0x95, 0x9b, 0x75, 0xda, 0xe3, 0x13, 0xda, 0x8c,
71 0xf4, 0xf7, 0x28, 0x14, 0xfc, 0x14, 0x3f, 0x8f, 0x77,
72 0x79, 0xc6, 0xeb, 0x9f, 0x7f, 0xa1, 0x72, 0x99, 0xae,
73 0xad, 0xb6, 0x88, 0x90, 0x18, 0x50, 0x1d, 0x28, 0x9e,
74 0x49, 0x00, 0xf7, 0xe4, 0x33, 0x1b, 0x99, 0xde, 0xc4,
75 0xb5, 0x43, 0x3a, 0xc7, 0xd3, 0x29, 0xee, 0xb6, 0xdd,
76 0x26, 0x54, 0x5e, 0x96, 0xe5, 0x5b, 0x87, 0x4b, 0xe9,
77 0x09 ) );
78
79/* Empty test vector (digest obtained from "sha384sum /dev/null") */
81 DIGEST ( 0x38, 0xb0, 0x60, 0xa7, 0x51, 0xac, 0x96, 0x38, 0x4c,
82 0xd9, 0x32, 0x7e, 0xb1, 0xb1, 0xe3, 0x6a, 0x21, 0xfd,
83 0xb7, 0x11, 0x14, 0xbe, 0x07, 0x43, 0x4c, 0x0c, 0xc7,
84 0xbf, 0x63, 0xf6, 0xe1, 0xda, 0x27, 0x4e, 0xde, 0xbf,
85 0xe7, 0x6f, 0x65, 0xfb, 0xd5, 0x1a, 0xd2, 0xf1, 0x48,
86 0x98, 0xb9, 0x5b ) );
87
88/* NIST test vector "abc" */
90 DIGEST ( 0xcb, 0x00, 0x75, 0x3f, 0x45, 0xa3, 0x5e, 0x8b, 0xb5,
91 0xa0, 0x3d, 0x69, 0x9a, 0xc6, 0x50, 0x07, 0x27, 0x2c,
92 0x32, 0xab, 0x0e, 0xde, 0xd1, 0x63, 0x1a, 0x8b, 0x60,
93 0x5a, 0x43, 0xff, 0x5b, 0xed, 0x80, 0x86, 0x07, 0x2b,
94 0xa1, 0xe7, 0xcc, 0x23, 0x58, 0xba, 0xec, 0xa1, 0x34,
95 0xc8, 0x25, 0xa7 ) );
96
97/* NIST test vector "abc...stu" */
99 DIGEST ( 0x09, 0x33, 0x0c, 0x33, 0xf7, 0x11, 0x47, 0xe8, 0x3d,
100 0x19, 0x2f, 0xc7, 0x82, 0xcd, 0x1b, 0x47, 0x53, 0x11,
101 0x1b, 0x17, 0x3b, 0x3b, 0x05, 0xd2, 0x2f, 0xa0, 0x80,
102 0x86, 0xe3, 0xb0, 0xf7, 0x12, 0xfc, 0xc7, 0xc7, 0x1a,
103 0x55, 0x7e, 0x2d, 0xb9, 0x66, 0xc3, 0xe9, 0xfa, 0x91,
104 0x74, 0x60, 0x39 ) );
105
106/* Empty test vector (digest obtained from "shasum -a 512256 /dev/null") */
108 DIGEST ( 0xc6, 0x72, 0xb8, 0xd1, 0xef, 0x56, 0xed, 0x28, 0xab,
109 0x87, 0xc3, 0x62, 0x2c, 0x51, 0x14, 0x06, 0x9b, 0xdd,
110 0x3a, 0xd7, 0xb8, 0xf9, 0x73, 0x74, 0x98, 0xd0, 0xc0,
111 0x1e, 0xce, 0xf0, 0x96, 0x7a ) );
112
113/* NIST test vector "abc" */
115 DIGEST ( 0x53, 0x04, 0x8e, 0x26, 0x81, 0x94, 0x1e, 0xf9, 0x9b,
116 0x2e, 0x29, 0xb7, 0x6b, 0x4c, 0x7d, 0xab, 0xe4, 0xc2,
117 0xd0, 0xc6, 0x34, 0xfc, 0x6d, 0x46, 0xe0, 0xe2, 0xf1,
118 0x31, 0x07, 0xe7, 0xaf, 0x23 ) );
119
120/* NIST test vector "abc...stu" */
121DIGEST_TEST ( sha512_256_nist_abc_stu, &sha512_256_algorithm,
123 DIGEST ( 0x39, 0x28, 0xe1, 0x84, 0xfb, 0x86, 0x90, 0xf8, 0x40,
124 0xda, 0x39, 0x88, 0x12, 0x1d, 0x31, 0xbe, 0x65, 0xcb,
125 0x9d, 0x3e, 0xf8, 0x3e, 0xe6, 0x14, 0x6f, 0xea, 0xc8,
126 0x61, 0xe1, 0x9b, 0x56, 0x3a ) );
127
128/* Empty test vector (digest obtained from "shasum -a 512224 /dev/null") */
130 DIGEST ( 0x6e, 0xd0, 0xdd, 0x02, 0x80, 0x6f, 0xa8, 0x9e, 0x25,
131 0xde, 0x06, 0x0c, 0x19, 0xd3, 0xac, 0x86, 0xca, 0xbb,
132 0x87, 0xd6, 0xa0, 0xdd, 0xd0, 0x5c, 0x33, 0x3b, 0x84,
133 0xf4 ) );
134
135/* NIST test vector "abc" */
137 DIGEST ( 0x46, 0x34, 0x27, 0x0f, 0x70, 0x7b, 0x6a, 0x54, 0xda,
138 0xae, 0x75, 0x30, 0x46, 0x08, 0x42, 0xe2, 0x0e, 0x37,
139 0xed, 0x26, 0x5c, 0xee, 0xe9, 0xa4, 0x3e, 0x89, 0x24,
140 0xaa ) );
141
142/* NIST test vector "abc...stu" */
143DIGEST_TEST ( sha512_224_nist_abc_stu, &sha512_224_algorithm,
145 DIGEST ( 0x23, 0xfe, 0xc5, 0xbb, 0x94, 0xd6, 0x0b, 0x23, 0x30,
146 0x81, 0x92, 0x64, 0x0b, 0x0c, 0x45, 0x33, 0x35, 0xd6,
147 0x64, 0x73, 0x4f, 0xe4, 0x0e, 0x72, 0x68, 0x67, 0x4a,
148 0xf9 ) );
149
150/**
151 * Perform SHA-512 family self-test
152 *
153 */
154static void sha512_test_exec ( void ) {
155
156 /* Correctness tests */
157 digest_ok ( &sha512_empty );
158 digest_ok ( &sha512_nist_abc );
159 digest_ok ( &sha512_nist_abc_stu );
160 digest_ok ( &sha384_empty );
161 digest_ok ( &sha384_nist_abc );
162 digest_ok ( &sha384_nist_abc_stu );
163 digest_ok ( &sha512_256_empty );
164 digest_ok ( &sha512_256_nist_abc );
165 digest_ok ( &sha512_256_nist_abc_stu );
166 digest_ok ( &sha512_224_empty );
167 digest_ok ( &sha512_224_nist_abc );
168 digest_ok ( &sha512_224_nist_abc_stu );
169
170 /* Speed tests */
171 DBG ( "SHA512 required %ld cycles per byte\n",
173 DBG ( "SHA384 required %ld cycles per byte\n",
175 DBG ( "SHA512/256 required %ld cycles per byte\n",
177 DBG ( "SHA512/224 required %ld cycles per byte\n",
179}
180
181/** SHA-512 family self-test */
182struct self_test sha512_test __self_test = {
183 .name = "sha512",
184 .exec = sha512_test_exec,
185};
#define DIGEST(...)
Define inline expected digest.
Definition der_test.c:45
unsigned long digest_cost(struct digest_algorithm *digest)
Calculate digest algorithm cost.
#define DIGEST_TEST(name, DIGEST, DATA, EXPECTED)
Define a digest test.
Definition digest_test.h:39
#define digest_ok(test)
Report a digest test result.
#define DIGEST_NIST_ABC_STU
Standard test vector: NIST string "abc...stu".
Definition digest_test.h:89
#define DIGEST_NIST_ABC
Standard test vector: NIST string "abc".
Definition digest_test.h:60
#define DIGEST_EMPTY
Standard test vector: empty data.
Definition digest_test.h:51
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
struct digest_algorithm sha384_algorithm
SHA-384 algorithm.
Definition sha384.c:64
struct digest_algorithm sha512_algorithm
SHA-512 algorithm.
Definition sha512.c:285
SHA-512 algorithm.
struct digest_algorithm sha512_224_algorithm
SHA-512/224 algorithm.
Definition sha512_224.c:65
struct digest_algorithm sha512_256_algorithm
SHA-512/256 algorithm.
Definition sha512_256.c:65
static void sha512_test_exec(void)
Perform SHA-512 family self-test.
A self-test set.
Definition test.h:15
Self-test infrastructure.
#define __self_test
Declare a self-test.
Definition test.h:32