]>
git.proxmox.com Git - mirror_zfs.git/blob - tests/zfs-tests/tests/functional/checksum/sha2_test.c
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://opensource.org/licenses/CDDL-1.0.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2013 Saso Kiselkov. All rights reserved.
27 * This is just to keep the compiler happy about sys/time.h not declaring
28 * gettimeofday due to -D_KERNEL (we can do this since we're actually
29 * running in userspace, but we need -D_KERNEL for the remaining SHA2 code).
43 typedef enum boolean
{ B_FALSE
, B_TRUE
} boolean_t
;
44 typedef unsigned long long u_longlong_t
;
49 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA_All.pdf
52 const char *test_msg0
= "abc";
53 const char *test_msg1
= "abcdbcdecdefdefgefghfghighijhijkijkljklmklmn"
55 const char *test_msg2
= "abcdefghbcdefghicdefghijdefghijkefghijklfghi"
56 "jklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
60 * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA_All.pdf
62 const uint8_t sha256_test_digests
[][32] = {
65 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,
66 0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,
67 0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,
68 0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD
72 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,
73 0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,
74 0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,
75 0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1
77 /* no test vector for test_msg2 */
80 const uint8_t sha384_test_digests
[][48] = {
83 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,
84 0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,
85 0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,
86 0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,
87 0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,
88 0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7
91 /* no test vector for test_msg1 */
96 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,
97 0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,
98 0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,
99 0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,
100 0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,
101 0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39
105 const uint8_t sha512_test_digests
[][64] = {
108 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,
109 0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,
110 0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,
111 0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,
112 0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,
113 0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,
114 0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,
115 0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F
118 /* no test vector for test_msg1 */
123 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,
124 0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,
125 0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,
126 0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,
127 0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,
128 0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,
129 0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,
130 0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09
134 const uint8_t sha512_224_test_digests
[][28] = {
137 0x46, 0x34, 0x27, 0x0F, 0x70, 0x7B, 0x6A, 0x54,
138 0xDA, 0xAE, 0x75, 0x30, 0x46, 0x08, 0x42, 0xE2,
139 0x0E, 0x37, 0xED, 0x26, 0x5C, 0xEE, 0xE9, 0xA4,
140 0x3E, 0x89, 0x24, 0xAA
143 /* no test vector for test_msg1 */
148 0x23, 0xFE, 0xC5, 0xBB, 0x94, 0xD6, 0x0B, 0x23,
149 0x30, 0x81, 0x92, 0x64, 0x0B, 0x0C, 0x45, 0x33,
150 0x35, 0xD6, 0x64, 0x73, 0x4F, 0xE4, 0x0E, 0x72,
151 0x68, 0x67, 0x4A, 0xF9
155 const uint8_t sha512_256_test_digests
[][32] = {
158 0x53, 0x04, 0x8E, 0x26, 0x81, 0x94, 0x1E, 0xF9,
159 0x9B, 0x2E, 0x29, 0xB7, 0x6B, 0x4C, 0x7D, 0xAB,
160 0xE4, 0xC2, 0xD0, 0xC6, 0x34, 0xFC, 0x6D, 0x46,
161 0xE0, 0xE2, 0xF1, 0x31, 0x07, 0xE7, 0xAF, 0x23
164 /* no test vector for test_msg1 */
169 0x39, 0x28, 0xE1, 0x84, 0xFB, 0x86, 0x90, 0xF8,
170 0x40, 0xDA, 0x39, 0x88, 0x12, 0x1D, 0x31, 0xBE,
171 0x65, 0xCB, 0x9D, 0x3E, 0xF8, 0x3E, 0xE6, 0x14,
172 0x6F, 0xEA, 0xC8, 0x61, 0xE1, 0x9B, 0x56, 0x3A
177 * Local reimplementation of cmn_err, since it's used in sha2.c.
181 cmn_err(int level
, char *format
, ...)
184 va_start(ap
, format
);
185 /* LINTED: E_SEC_PRINTF_VAR_FMT */
186 (void) vfprintf(stderr
, format
, ap
);
191 main(int argc
, char *argv
[])
193 boolean_t failed
= B_FALSE
;
194 uint64_t cpu_mhz
= 0;
197 cpu_mhz
= atoi(argv
[1]);
199 #define SHA2_ALGO_TEST(_m, mode, diglen, testdigest) \
202 uint8_t digest[diglen / 8]; \
203 SHA2Init(SHA ## mode ## _MECH_INFO_TYPE, &ctx); \
204 SHA2Update(&ctx, _m, strlen(_m)); \
205 SHA2Final(digest, &ctx); \
206 (void) printf("SHA%-9sMessage: " #_m \
207 "\tResult: ", #mode); \
208 if (bcmp(digest, testdigest, diglen / 8) == 0) { \
209 (void) printf("OK\n"); \
211 (void) printf("FAILED!\n"); \
217 #define SHA2_PERF_TEST(mode, diglen) \
220 uint8_t digest[diglen / 8]; \
221 uint8_t block[131072]; \
225 struct timeval start, end; \
226 bzero(block, sizeof (block)); \
227 (void) gettimeofday(&start, NULL); \
228 SHA2Init(SHA ## mode ## _MECH_INFO_TYPE, &ctx); \
229 for (i = 0; i < 8192; i++) \
230 SHA2Update(&ctx, block, sizeof (block)); \
231 SHA2Final(digest, &ctx); \
232 (void) gettimeofday(&end, NULL); \
233 delta = (end.tv_sec * 1000000llu + end.tv_usec) - \
234 (start.tv_sec * 1000000llu + start.tv_usec); \
235 if (cpu_mhz != 0) { \
236 cpb = (cpu_mhz * 1e6 * ((double)delta / \
237 1000000)) / (8192 * 128 * 1024); \
239 (void) printf("SHA%-9s%llu us (%.02f CPB)\n", #mode, \
240 (u_longlong_t)delta, cpb); \
244 (void) printf("Running algorithm correctness tests:\n");
245 SHA2_ALGO_TEST(test_msg0
, 256, 256, sha256_test_digests
[0]);
246 SHA2_ALGO_TEST(test_msg1
, 256, 256, sha256_test_digests
[1]);
247 SHA2_ALGO_TEST(test_msg0
, 384, 384, sha384_test_digests
[0]);
248 SHA2_ALGO_TEST(test_msg2
, 384, 384, sha384_test_digests
[2]);
249 SHA2_ALGO_TEST(test_msg0
, 512, 512, sha512_test_digests
[0]);
250 SHA2_ALGO_TEST(test_msg2
, 512, 512, sha512_test_digests
[2]);
251 SHA2_ALGO_TEST(test_msg0
, 512_224
, 224, sha512_224_test_digests
[0]);
252 SHA2_ALGO_TEST(test_msg2
, 512_224
, 224, sha512_224_test_digests
[2]);
253 SHA2_ALGO_TEST(test_msg0
, 512_256
, 256, sha512_256_test_digests
[0]);
254 SHA2_ALGO_TEST(test_msg2
, 512_256
, 256, sha512_256_test_digests
[2]);
259 (void) printf("Running performance tests (hashing 1024 MiB of "
261 SHA2_PERF_TEST(256, 256);
262 SHA2_PERF_TEST(512, 512);