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 
24 FILE_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") */
47 DIGEST_TEST ( sha512_empty, &sha512_algorithm, DIGEST_EMPTY,
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" */
58 DIGEST_TEST ( sha512_nist_abc, &sha512_algorithm, DIGEST_NIST_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" */
69 DIGEST_TEST ( sha512_nist_abc_stu, &sha512_algorithm, DIGEST_NIST_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") */
80 DIGEST_TEST ( sha384_empty, &sha384_algorithm, DIGEST_EMPTY,
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" */
89 DIGEST_TEST ( sha384_nist_abc, &sha384_algorithm, DIGEST_NIST_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" */
98 DIGEST_TEST ( sha384_nist_abc_stu, &sha384_algorithm, DIGEST_NIST_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") */
107 DIGEST_TEST ( sha512_256_empty, &sha512_256_algorithm, DIGEST_EMPTY,
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" */
114 DIGEST_TEST ( sha512_256_nist_abc, &sha512_256_algorithm, DIGEST_NIST_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" */
121 DIGEST_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") */
129 DIGEST_TEST ( sha512_224_empty, &sha512_224_algorithm, DIGEST_EMPTY,
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" */
136 DIGEST_TEST ( sha512_224_nist_abc, &sha512_224_algorithm, DIGEST_NIST_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" */
143 DIGEST_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  */
154 static 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 */
182 struct self_test sha512_test __self_test = {
183  .name = "sha512",
184  .exec = sha512_test_exec,
185 };
struct digest_algorithm sha512_algorithm
SHA-512 algorithm.
Definition: sha512.c:285
static void sha512_test_exec(void)
Perform SHA-512 family self-test.
Definition: sha512_test.c:154
#define DIGEST_NIST_ABC
Standard test vector: NIST string "abc".
Definition: digest_test.h:60
Self-test infrastructure.
const char * name
Test set name.
Definition: test.h:17
struct digest_algorithm sha384_algorithm
SHA-384 algorithm.
Definition: sha384.c:64
A self-test set.
Definition: test.h:15
unsigned long digest_cost(struct digest_algorithm *digest)
Calculate digest algorithm cost.
Definition: digest_test.c:131
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
struct digest_algorithm sha512_224_algorithm
SHA-512/224 algorithm.
Definition: sha512_224.c:65
#define digest_ok(test)
Report a digest test result.
Definition: digest_test.h:109
DIGEST_TEST(sha512_empty, &sha512_algorithm, DIGEST_EMPTY, DIGEST(0xcf, 0x83, 0xe1, 0x35, 0x7e, 0xef, 0xb8, 0xbd, 0xf1, 0x54, 0x28, 0x50, 0xd6, 0x6d, 0x80, 0x07, 0xd6, 0x20, 0xe4, 0x05, 0x0b, 0x57, 0x15, 0xdc, 0x83, 0xf4, 0xa9, 0x21, 0xd3, 0x6c, 0xe9, 0xce, 0x47, 0xd0, 0xd1, 0x3c, 0x5d, 0x85, 0xf2, 0xb0, 0xff, 0x83, 0x18, 0xd2, 0x87, 0x7e, 0xec, 0x2f, 0x63, 0xb9, 0x31, 0xbd, 0x47, 0x41, 0x7a, 0x81, 0xa5, 0x38, 0x32, 0x7a, 0xf9, 0x27, 0xda, 0x3e))
#define DIGEST_EMPTY
Standard test vector: empty data.
Definition: digest_test.h:51
#define DIGEST_NIST_ABC_STU
Standard test vector: NIST string "abc...stu".
Definition: digest_test.h:89
struct digest_algorithm sha512_256_algorithm
SHA-512/256 algorithm.
Definition: sha512_256.c:65
SHA-512 algorithm.
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define DIGEST(...)
Define inline expected digest.
Definition: der_test.c:45
struct self_test sha512_test __self_test
SHA-512 family self-test.
Definition: sha512_test.c:182