1716fd348SMartin Matuska /*
2716fd348SMartin Matuska * CDDL HEADER START
3716fd348SMartin Matuska *
4716fd348SMartin Matuska * The contents of this file are subject to the terms of the
5716fd348SMartin Matuska * Common Development and Distribution License (the "License").
6716fd348SMartin Matuska * You may not use this file except in compliance with the License.
7716fd348SMartin Matuska *
8716fd348SMartin Matuska * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9716fd348SMartin Matuska * or http://opensource.org/licenses/CDDL-1.0.
10716fd348SMartin Matuska * See the License for the specific language governing permissions
11716fd348SMartin Matuska * and limitations under the License.
12716fd348SMartin Matuska *
13716fd348SMartin Matuska * When distributing Covered Code, include this CDDL HEADER in each
14716fd348SMartin Matuska * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15716fd348SMartin Matuska * If applicable, add the following below this CDDL HEADER, with the
16716fd348SMartin Matuska * fields enclosed by brackets "[]" replaced with your own identifying
17716fd348SMartin Matuska * information: Portions Copyright [yyyy] [name of copyright owner]
18716fd348SMartin Matuska *
19716fd348SMartin Matuska * CDDL HEADER END
20716fd348SMartin Matuska */
21716fd348SMartin Matuska
22716fd348SMartin Matuska /*
23716fd348SMartin Matuska * Copyright 2013 Saso Kiselkov. All rights reserved.
24716fd348SMartin Matuska */
25716fd348SMartin Matuska
26716fd348SMartin Matuska /*
27716fd348SMartin Matuska * This is just to keep the compiler happy about sys/time.h not declaring
28716fd348SMartin Matuska * gettimeofday due to -D_KERNEL (we can do this since we're actually
29716fd348SMartin Matuska * running in userspace, but we need -D_KERNEL for the remaining Edon-R code).
30716fd348SMartin Matuska */
31716fd348SMartin Matuska
32716fd348SMartin Matuska #include <sys/edonr.h>
33716fd348SMartin Matuska #include <stdlib.h>
34716fd348SMartin Matuska #include <string.h>
35716fd348SMartin Matuska #include <stdio.h>
36716fd348SMartin Matuska #include <sys/time.h>
37716fd348SMartin Matuska #include <sys/stdtypes.h>
38716fd348SMartin Matuska
39716fd348SMartin Matuska /*
40716fd348SMartin Matuska * Test messages from:
41716fd348SMartin Matuska * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA_All.pdf
42716fd348SMartin Matuska */
43dbd5678dSMartin Matuska static const char *test_msg0 = "abc";
44*2a58b312SMartin Matuska static const char *test_msg1 = "abcdefghbcdefghicdefghijdefghijkefghijklfgh"
45dbd5678dSMartin Matuska "ijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
46716fd348SMartin Matuska
47dbd5678dSMartin Matuska static const uint8_t edonr_512_test_digests[][64] = {
48716fd348SMartin Matuska {
49716fd348SMartin Matuska /* for test_msg0 */
50716fd348SMartin Matuska 0x1b, 0x14, 0xdb, 0x15, 0x5f, 0x1d, 0x40, 0x65,
51716fd348SMartin Matuska 0x94, 0xb8, 0xce, 0xf7, 0x0a, 0x43, 0x62, 0xec,
52716fd348SMartin Matuska 0x6b, 0x5d, 0xe6, 0xa5, 0xda, 0xf5, 0x0e, 0xc9,
53716fd348SMartin Matuska 0x99, 0xe9, 0x87, 0xc1, 0x9d, 0x30, 0x49, 0xe2,
54716fd348SMartin Matuska 0xde, 0x59, 0x77, 0xbb, 0x05, 0xb1, 0xbb, 0x22,
55716fd348SMartin Matuska 0x00, 0x50, 0xa1, 0xea, 0x5b, 0x46, 0xa9, 0xf1,
56716fd348SMartin Matuska 0x74, 0x0a, 0xca, 0xfb, 0xf6, 0xb4, 0x50, 0x32,
57716fd348SMartin Matuska 0xad, 0xc9, 0x0c, 0x62, 0x83, 0x72, 0xc2, 0x2b
58716fd348SMartin Matuska },
59716fd348SMartin Matuska {
60716fd348SMartin Matuska /* no test vector for test_msg1 */
61716fd348SMartin Matuska 0
62716fd348SMartin Matuska },
63716fd348SMartin Matuska {
64*2a58b312SMartin Matuska /* for test_msg1 */
65716fd348SMartin Matuska 0x53, 0x51, 0x07, 0x0d, 0xc5, 0x1c, 0x3b, 0x2b,
66716fd348SMartin Matuska 0xac, 0xa5, 0xa6, 0x0d, 0x02, 0x52, 0xcc, 0xb4,
67716fd348SMartin Matuska 0xe4, 0x92, 0x1a, 0x96, 0xfe, 0x5a, 0x69, 0xe7,
68716fd348SMartin Matuska 0x6d, 0xad, 0x48, 0xfd, 0x21, 0xa0, 0x84, 0x5a,
69716fd348SMartin Matuska 0xd5, 0x7f, 0x88, 0x0b, 0x3e, 0x4a, 0x90, 0x7b,
70716fd348SMartin Matuska 0xc5, 0x03, 0x15, 0x18, 0x42, 0xbb, 0x94, 0x9e,
71716fd348SMartin Matuska 0x1c, 0xba, 0x74, 0x39, 0xa6, 0x40, 0x9a, 0x34,
72716fd348SMartin Matuska 0xb8, 0x43, 0x6c, 0xb4, 0x69, 0x21, 0x58, 0x3c
73716fd348SMartin Matuska }
74716fd348SMartin Matuska };
75716fd348SMartin Matuska
76716fd348SMartin Matuska int
main(int argc,char * argv[])77716fd348SMartin Matuska main(int argc, char *argv[])
78716fd348SMartin Matuska {
79716fd348SMartin Matuska boolean_t failed = B_FALSE;
80716fd348SMartin Matuska uint64_t cpu_mhz = 0;
81716fd348SMartin Matuska
82716fd348SMartin Matuska if (argc == 2)
83716fd348SMartin Matuska cpu_mhz = atoi(argv[1]);
84716fd348SMartin Matuska
85716fd348SMartin Matuska #define EDONR_ALGO_TEST(_m, mode, testdigest) \
86716fd348SMartin Matuska do { \
87716fd348SMartin Matuska EdonRState ctx; \
88716fd348SMartin Matuska uint8_t digest[mode / 8]; \
89*2a58b312SMartin Matuska EdonRInit(&ctx); \
90716fd348SMartin Matuska EdonRUpdate(&ctx, (const uint8_t *) _m, strlen(_m) * 8);\
91716fd348SMartin Matuska EdonRFinal(&ctx, digest); \
92716fd348SMartin Matuska (void) printf("Edon-R-%-6sMessage: " #_m \
93716fd348SMartin Matuska "\tResult: ", #mode); \
94716fd348SMartin Matuska if (memcmp(digest, testdigest, mode / 8) == 0) { \
95716fd348SMartin Matuska (void) printf("OK\n"); \
96716fd348SMartin Matuska } else { \
97716fd348SMartin Matuska (void) printf("FAILED!\n"); \
98716fd348SMartin Matuska failed = B_TRUE; \
99716fd348SMartin Matuska } \
100716fd348SMartin Matuska } while (0)
101716fd348SMartin Matuska
102716fd348SMartin Matuska #define EDONR_PERF_TEST(mode) \
103716fd348SMartin Matuska do { \
104716fd348SMartin Matuska EdonRState ctx; \
105716fd348SMartin Matuska uint8_t digest[mode / 8]; \
106716fd348SMartin Matuska uint8_t block[131072]; \
107716fd348SMartin Matuska uint64_t delta; \
108716fd348SMartin Matuska double cpb = 0; \
109716fd348SMartin Matuska int i; \
110716fd348SMartin Matuska struct timeval start, end; \
111716fd348SMartin Matuska memset(block, 0, sizeof (block)); \
112716fd348SMartin Matuska (void) gettimeofday(&start, NULL); \
113*2a58b312SMartin Matuska EdonRInit(&ctx); \
114716fd348SMartin Matuska for (i = 0; i < 8192; i++) \
115716fd348SMartin Matuska EdonRUpdate(&ctx, block, sizeof (block) * 8); \
116716fd348SMartin Matuska EdonRFinal(&ctx, digest); \
117716fd348SMartin Matuska (void) gettimeofday(&end, NULL); \
118716fd348SMartin Matuska delta = (end.tv_sec * 1000000llu + end.tv_usec) - \
119716fd348SMartin Matuska (start.tv_sec * 1000000llu + start.tv_usec); \
120716fd348SMartin Matuska if (cpu_mhz != 0) { \
121716fd348SMartin Matuska cpb = (cpu_mhz * 1e6 * ((double)delta / \
122716fd348SMartin Matuska 1000000)) / (8192 * 128 * 1024); \
123716fd348SMartin Matuska } \
124716fd348SMartin Matuska (void) printf("Edon-R-%-6s%llu us (%.02f CPB)\n", #mode,\
125716fd348SMartin Matuska (u_longlong_t)delta, cpb); \
126716fd348SMartin Matuska } while (0)
127716fd348SMartin Matuska
128716fd348SMartin Matuska (void) printf("Running algorithm correctness tests:\n");
129716fd348SMartin Matuska EDONR_ALGO_TEST(test_msg0, 512, edonr_512_test_digests[0]);
130*2a58b312SMartin Matuska EDONR_ALGO_TEST(test_msg1, 512, edonr_512_test_digests[2]);
131716fd348SMartin Matuska if (failed)
132716fd348SMartin Matuska return (1);
133716fd348SMartin Matuska
134716fd348SMartin Matuska (void) printf("Running performance tests (hashing 1024 MiB of "
135716fd348SMartin Matuska "data):\n");
136716fd348SMartin Matuska EDONR_PERF_TEST(512);
137716fd348SMartin Matuska
138716fd348SMartin Matuska return (0);
139716fd348SMartin Matuska }
140