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 Skein code).
30716fd348SMartin Matuska */
31716fd348SMartin Matuska
32716fd348SMartin Matuska #include <sys/skein.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 * Skein test suite using values from the Skein V1.3 specification found at:
41716fd348SMartin Matuska * http://www.skein-hash.info/sites/default/files/skein1.3.pdf
42716fd348SMartin Matuska */
43716fd348SMartin Matuska
44716fd348SMartin Matuska /*
45716fd348SMartin Matuska * Test messages from the Skein spec, Appendix C.
46716fd348SMartin Matuska */
47*dbd5678dSMartin Matuska static const uint8_t test_msg0[] = {
48716fd348SMartin Matuska 0xFF
49716fd348SMartin Matuska };
50716fd348SMartin Matuska
51*dbd5678dSMartin Matuska static const uint8_t test_msg1[] = {
52716fd348SMartin Matuska 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8,
53716fd348SMartin Matuska 0xF7, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0,
54716fd348SMartin Matuska 0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8,
55716fd348SMartin Matuska 0xE7, 0xE6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1, 0xE0
56716fd348SMartin Matuska };
57716fd348SMartin Matuska
58*dbd5678dSMartin Matuska static const uint8_t test_msg2[] = {
59716fd348SMartin Matuska 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8,
60716fd348SMartin Matuska 0xF7, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0,
61716fd348SMartin Matuska 0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8,
62716fd348SMartin Matuska 0xE7, 0xE6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1, 0xE0,
63716fd348SMartin Matuska 0xDF, 0xDE, 0xDD, 0xDC, 0xDB, 0xDA, 0xD9, 0xD8,
64716fd348SMartin Matuska 0xD7, 0xD6, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xD0,
65716fd348SMartin Matuska 0xCF, 0xCE, 0xCD, 0xCC, 0xCB, 0xCA, 0xC9, 0xC8,
66716fd348SMartin Matuska 0xC7, 0xC6, 0xC5, 0xC4, 0xC3, 0xC2, 0xC1, 0xC0
67716fd348SMartin Matuska };
68716fd348SMartin Matuska
69*dbd5678dSMartin Matuska static const uint8_t test_msg3[] = {
70716fd348SMartin Matuska 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8,
71716fd348SMartin Matuska 0xF7, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0,
72716fd348SMartin Matuska 0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8,
73716fd348SMartin Matuska 0xE7, 0xE6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1, 0xE0,
74716fd348SMartin Matuska 0xDF, 0xDE, 0xDD, 0xDC, 0xDB, 0xDA, 0xD9, 0xD8,
75716fd348SMartin Matuska 0xD7, 0xD6, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xD0,
76716fd348SMartin Matuska 0xCF, 0xCE, 0xCD, 0xCC, 0xCB, 0xCA, 0xC9, 0xC8,
77716fd348SMartin Matuska 0xC7, 0xC6, 0xC5, 0xC4, 0xC3, 0xC2, 0xC1, 0xC0,
78716fd348SMartin Matuska 0xBF, 0xBE, 0xBD, 0xBC, 0xBB, 0xBA, 0xB9, 0xB8,
79716fd348SMartin Matuska 0xB7, 0xB6, 0xB5, 0xB4, 0xB3, 0xB2, 0xB1, 0xB0,
80716fd348SMartin Matuska 0xAF, 0xAE, 0xAD, 0xAC, 0xAB, 0xAA, 0xA9, 0xA8,
81716fd348SMartin Matuska 0xA7, 0xA6, 0xA5, 0xA4, 0xA3, 0xA2, 0xA1, 0xA0,
82716fd348SMartin Matuska 0x9F, 0x9E, 0x9D, 0x9C, 0x9B, 0x9A, 0x99, 0x98,
83716fd348SMartin Matuska 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
84716fd348SMartin Matuska 0x8F, 0x8E, 0x8D, 0x8C, 0x8B, 0x8A, 0x89, 0x88,
85716fd348SMartin Matuska 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80
86716fd348SMartin Matuska };
87716fd348SMartin Matuska
88*dbd5678dSMartin Matuska static const uint8_t test_msg4[] = {
89716fd348SMartin Matuska 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0xF9, 0xF8,
90716fd348SMartin Matuska 0xF7, 0xF6, 0xF5, 0xF4, 0xF3, 0xF2, 0xF1, 0xF0,
91716fd348SMartin Matuska 0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8,
92716fd348SMartin Matuska 0xE7, 0xE6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1, 0xE0,
93716fd348SMartin Matuska 0xDF, 0xDE, 0xDD, 0xDC, 0xDB, 0xDA, 0xD9, 0xD8,
94716fd348SMartin Matuska 0xD7, 0xD6, 0xD5, 0xD4, 0xD3, 0xD2, 0xD1, 0xD0,
95716fd348SMartin Matuska 0xCF, 0xCE, 0xCD, 0xCC, 0xCB, 0xCA, 0xC9, 0xC8,
96716fd348SMartin Matuska 0xC7, 0xC6, 0xC5, 0xC4, 0xC3, 0xC2, 0xC1, 0xC0,
97716fd348SMartin Matuska 0xBF, 0xBE, 0xBD, 0xBC, 0xBB, 0xBA, 0xB9, 0xB8,
98716fd348SMartin Matuska 0xB7, 0xB6, 0xB5, 0xB4, 0xB3, 0xB2, 0xB1, 0xB0,
99716fd348SMartin Matuska 0xAF, 0xAE, 0xAD, 0xAC, 0xAB, 0xAA, 0xA9, 0xA8,
100716fd348SMartin Matuska 0xA7, 0xA6, 0xA5, 0xA4, 0xA3, 0xA2, 0xA1, 0xA0,
101716fd348SMartin Matuska 0x9F, 0x9E, 0x9D, 0x9C, 0x9B, 0x9A, 0x99, 0x98,
102716fd348SMartin Matuska 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
103716fd348SMartin Matuska 0x8F, 0x8E, 0x8D, 0x8C, 0x8B, 0x8A, 0x89, 0x88,
104716fd348SMartin Matuska 0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80,
105716fd348SMartin Matuska 0x7F, 0x7E, 0x7D, 0x7C, 0x7B, 0x7A, 0x79, 0x78,
106716fd348SMartin Matuska 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70,
107716fd348SMartin Matuska 0x6F, 0x6E, 0x6D, 0x6C, 0x6B, 0x6A, 0x69, 0x68,
108716fd348SMartin Matuska 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60,
109716fd348SMartin Matuska 0x5F, 0x5E, 0x5D, 0x5C, 0x5B, 0x5A, 0x59, 0x58,
110716fd348SMartin Matuska 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50,
111716fd348SMartin Matuska 0x4F, 0x4E, 0x4D, 0x4C, 0x4B, 0x4A, 0x49, 0x48,
112716fd348SMartin Matuska 0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40,
113716fd348SMartin Matuska 0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38,
114716fd348SMartin Matuska 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,
115716fd348SMartin Matuska 0x2F, 0x2E, 0x2D, 0x2C, 0x2B, 0x2A, 0x29, 0x28,
116716fd348SMartin Matuska 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20,
117716fd348SMartin Matuska 0x1F, 0x1E, 0x1D, 0x1C, 0x1B, 0x1A, 0x19, 0x18,
118716fd348SMartin Matuska 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
119716fd348SMartin Matuska 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08,
120716fd348SMartin Matuska 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00
121716fd348SMartin Matuska };
122716fd348SMartin Matuska
123716fd348SMartin Matuska /*
124716fd348SMartin Matuska * Test digests from the Skein spec, Appendix C.
125716fd348SMartin Matuska */
126*dbd5678dSMartin Matuska static const uint8_t skein_256_test_digests[][32] = {
127716fd348SMartin Matuska {
128716fd348SMartin Matuska /* for test_msg0 */
129716fd348SMartin Matuska 0x0B, 0x98, 0xDC, 0xD1, 0x98, 0xEA, 0x0E, 0x50,
130716fd348SMartin Matuska 0xA7, 0xA2, 0x44, 0xC4, 0x44, 0xE2, 0x5C, 0x23,
131716fd348SMartin Matuska 0xDA, 0x30, 0xC1, 0x0F, 0xC9, 0xA1, 0xF2, 0x70,
132716fd348SMartin Matuska 0xA6, 0x63, 0x7F, 0x1F, 0x34, 0xE6, 0x7E, 0xD2
133716fd348SMartin Matuska },
134716fd348SMartin Matuska {
135716fd348SMartin Matuska /* for test_msg1 */
136716fd348SMartin Matuska 0x8D, 0x0F, 0xA4, 0xEF, 0x77, 0x7F, 0xD7, 0x59,
137716fd348SMartin Matuska 0xDF, 0xD4, 0x04, 0x4E, 0x6F, 0x6A, 0x5A, 0xC3,
138716fd348SMartin Matuska 0xC7, 0x74, 0xAE, 0xC9, 0x43, 0xDC, 0xFC, 0x07,
139716fd348SMartin Matuska 0x92, 0x7B, 0x72, 0x3B, 0x5D, 0xBF, 0x40, 0x8B
140716fd348SMartin Matuska },
141716fd348SMartin Matuska {
142716fd348SMartin Matuska /* for test_msg2 */
143716fd348SMartin Matuska 0xDF, 0x28, 0xE9, 0x16, 0x63, 0x0D, 0x0B, 0x44,
144716fd348SMartin Matuska 0xC4, 0xA8, 0x49, 0xDC, 0x9A, 0x02, 0xF0, 0x7A,
145716fd348SMartin Matuska 0x07, 0xCB, 0x30, 0xF7, 0x32, 0x31, 0x82, 0x56,
146716fd348SMartin Matuska 0xB1, 0x5D, 0x86, 0x5A, 0xC4, 0xAE, 0x16, 0x2F
147716fd348SMartin Matuska }
148716fd348SMartin Matuska /* no test digests for test_msg3 and test_msg4 */
149716fd348SMartin Matuska };
150716fd348SMartin Matuska
151*dbd5678dSMartin Matuska static const uint8_t skein_512_test_digests[][64] = {
152716fd348SMartin Matuska {
153716fd348SMartin Matuska /* for test_msg0 */
154716fd348SMartin Matuska 0x71, 0xB7, 0xBC, 0xE6, 0xFE, 0x64, 0x52, 0x22,
155716fd348SMartin Matuska 0x7B, 0x9C, 0xED, 0x60, 0x14, 0x24, 0x9E, 0x5B,
156716fd348SMartin Matuska 0xF9, 0xA9, 0x75, 0x4C, 0x3A, 0xD6, 0x18, 0xCC,
157716fd348SMartin Matuska 0xC4, 0xE0, 0xAA, 0xE1, 0x6B, 0x31, 0x6C, 0xC8,
158716fd348SMartin Matuska 0xCA, 0x69, 0x8D, 0x86, 0x43, 0x07, 0xED, 0x3E,
159716fd348SMartin Matuska 0x80, 0xB6, 0xEF, 0x15, 0x70, 0x81, 0x2A, 0xC5,
160716fd348SMartin Matuska 0x27, 0x2D, 0xC4, 0x09, 0xB5, 0xA0, 0x12, 0xDF,
161716fd348SMartin Matuska 0x2A, 0x57, 0x91, 0x02, 0xF3, 0x40, 0x61, 0x7A
162716fd348SMartin Matuska },
163716fd348SMartin Matuska {
164716fd348SMartin Matuska /* no test vector for test_msg1 */
165716fd348SMartin Matuska 0,
166716fd348SMartin Matuska },
167716fd348SMartin Matuska {
168716fd348SMartin Matuska /* for test_msg2 */
169716fd348SMartin Matuska 0x45, 0x86, 0x3B, 0xA3, 0xBE, 0x0C, 0x4D, 0xFC,
170716fd348SMartin Matuska 0x27, 0xE7, 0x5D, 0x35, 0x84, 0x96, 0xF4, 0xAC,
171716fd348SMartin Matuska 0x9A, 0x73, 0x6A, 0x50, 0x5D, 0x93, 0x13, 0xB4,
172716fd348SMartin Matuska 0x2B, 0x2F, 0x5E, 0xAD, 0xA7, 0x9F, 0xC1, 0x7F,
173716fd348SMartin Matuska 0x63, 0x86, 0x1E, 0x94, 0x7A, 0xFB, 0x1D, 0x05,
174716fd348SMartin Matuska 0x6A, 0xA1, 0x99, 0x57, 0x5A, 0xD3, 0xF8, 0xC9,
175716fd348SMartin Matuska 0xA3, 0xCC, 0x17, 0x80, 0xB5, 0xE5, 0xFA, 0x4C,
176716fd348SMartin Matuska 0xAE, 0x05, 0x0E, 0x98, 0x98, 0x76, 0x62, 0x5B
177716fd348SMartin Matuska },
178716fd348SMartin Matuska {
179716fd348SMartin Matuska /* for test_msg3 */
180716fd348SMartin Matuska 0x91, 0xCC, 0xA5, 0x10, 0xC2, 0x63, 0xC4, 0xDD,
181716fd348SMartin Matuska 0xD0, 0x10, 0x53, 0x0A, 0x33, 0x07, 0x33, 0x09,
182716fd348SMartin Matuska 0x62, 0x86, 0x31, 0xF3, 0x08, 0x74, 0x7E, 0x1B,
183716fd348SMartin Matuska 0xCB, 0xAA, 0x90, 0xE4, 0x51, 0xCA, 0xB9, 0x2E,
184716fd348SMartin Matuska 0x51, 0x88, 0x08, 0x7A, 0xF4, 0x18, 0x87, 0x73,
185716fd348SMartin Matuska 0xA3, 0x32, 0x30, 0x3E, 0x66, 0x67, 0xA7, 0xA2,
186716fd348SMartin Matuska 0x10, 0x85, 0x6F, 0x74, 0x21, 0x39, 0x00, 0x00,
187716fd348SMartin Matuska 0x71, 0xF4, 0x8E, 0x8B, 0xA2, 0xA5, 0xAD, 0xB7
188716fd348SMartin Matuska }
189716fd348SMartin Matuska /* no test digests for test_msg4 */
190716fd348SMartin Matuska };
191716fd348SMartin Matuska
192*dbd5678dSMartin Matuska static const uint8_t skein_1024_test_digests[][128] = {
193716fd348SMartin Matuska {
194716fd348SMartin Matuska /* for test_msg0 */
195716fd348SMartin Matuska 0xE6, 0x2C, 0x05, 0x80, 0x2E, 0xA0, 0x15, 0x24,
196716fd348SMartin Matuska 0x07, 0xCD, 0xD8, 0x78, 0x7F, 0xDA, 0x9E, 0x35,
197716fd348SMartin Matuska 0x70, 0x3D, 0xE8, 0x62, 0xA4, 0xFB, 0xC1, 0x19,
198716fd348SMartin Matuska 0xCF, 0xF8, 0x59, 0x0A, 0xFE, 0x79, 0x25, 0x0B,
199716fd348SMartin Matuska 0xCC, 0xC8, 0xB3, 0xFA, 0xF1, 0xBD, 0x24, 0x22,
200716fd348SMartin Matuska 0xAB, 0x5C, 0x0D, 0x26, 0x3F, 0xB2, 0xF8, 0xAF,
201716fd348SMartin Matuska 0xB3, 0xF7, 0x96, 0xF0, 0x48, 0x00, 0x03, 0x81,
202716fd348SMartin Matuska 0x53, 0x1B, 0x6F, 0x00, 0xD8, 0x51, 0x61, 0xBC,
203716fd348SMartin Matuska 0x0F, 0xFF, 0x4B, 0xEF, 0x24, 0x86, 0xB1, 0xEB,
204716fd348SMartin Matuska 0xCD, 0x37, 0x73, 0xFA, 0xBF, 0x50, 0xAD, 0x4A,
205716fd348SMartin Matuska 0xD5, 0x63, 0x9A, 0xF9, 0x04, 0x0E, 0x3F, 0x29,
206716fd348SMartin Matuska 0xC6, 0xC9, 0x31, 0x30, 0x1B, 0xF7, 0x98, 0x32,
207716fd348SMartin Matuska 0xE9, 0xDA, 0x09, 0x85, 0x7E, 0x83, 0x1E, 0x82,
208716fd348SMartin Matuska 0xEF, 0x8B, 0x46, 0x91, 0xC2, 0x35, 0x65, 0x65,
209716fd348SMartin Matuska 0x15, 0xD4, 0x37, 0xD2, 0xBD, 0xA3, 0x3B, 0xCE,
210716fd348SMartin Matuska 0xC0, 0x01, 0xC6, 0x7F, 0xFD, 0xE1, 0x5B, 0xA8
211716fd348SMartin Matuska },
212716fd348SMartin Matuska {
213716fd348SMartin Matuska /* no test vector for test_msg1 */
214716fd348SMartin Matuska 0
215716fd348SMartin Matuska },
216716fd348SMartin Matuska {
217716fd348SMartin Matuska /* no test vector for test_msg2 */
218716fd348SMartin Matuska 0
219716fd348SMartin Matuska },
220716fd348SMartin Matuska {
221716fd348SMartin Matuska /* for test_msg3 */
222716fd348SMartin Matuska 0x1F, 0x3E, 0x02, 0xC4, 0x6F, 0xB8, 0x0A, 0x3F,
223716fd348SMartin Matuska 0xCD, 0x2D, 0xFB, 0xBC, 0x7C, 0x17, 0x38, 0x00,
224716fd348SMartin Matuska 0xB4, 0x0C, 0x60, 0xC2, 0x35, 0x4A, 0xF5, 0x51,
225716fd348SMartin Matuska 0x18, 0x9E, 0xBF, 0x43, 0x3C, 0x3D, 0x85, 0xF9,
226716fd348SMartin Matuska 0xFF, 0x18, 0x03, 0xE6, 0xD9, 0x20, 0x49, 0x31,
227716fd348SMartin Matuska 0x79, 0xED, 0x7A, 0xE7, 0xFC, 0xE6, 0x9C, 0x35,
228716fd348SMartin Matuska 0x81, 0xA5, 0xA2, 0xF8, 0x2D, 0x3E, 0x0C, 0x7A,
229716fd348SMartin Matuska 0x29, 0x55, 0x74, 0xD0, 0xCD, 0x7D, 0x21, 0x7C,
230716fd348SMartin Matuska 0x48, 0x4D, 0x2F, 0x63, 0x13, 0xD5, 0x9A, 0x77,
231716fd348SMartin Matuska 0x18, 0xEA, 0xD0, 0x7D, 0x07, 0x29, 0xC2, 0x48,
232716fd348SMartin Matuska 0x51, 0xD7, 0xE7, 0xD2, 0x49, 0x1B, 0x90, 0x2D,
233716fd348SMartin Matuska 0x48, 0x91, 0x94, 0xE6, 0xB7, 0xD3, 0x69, 0xDB,
234716fd348SMartin Matuska 0x0A, 0xB7, 0xAA, 0x10, 0x6F, 0x0E, 0xE0, 0xA3,
235716fd348SMartin Matuska 0x9A, 0x42, 0xEF, 0xC5, 0x4F, 0x18, 0xD9, 0x37,
236716fd348SMartin Matuska 0x76, 0x08, 0x09, 0x85, 0xF9, 0x07, 0x57, 0x4F,
237716fd348SMartin Matuska 0x99, 0x5E, 0xC6, 0xA3, 0x71, 0x53, 0xA5, 0x78
238716fd348SMartin Matuska },
239716fd348SMartin Matuska {
240716fd348SMartin Matuska /* for test_msg4 */
241716fd348SMartin Matuska 0x84, 0x2A, 0x53, 0xC9, 0x9C, 0x12, 0xB0, 0xCF,
242716fd348SMartin Matuska 0x80, 0xCF, 0x69, 0x49, 0x1B, 0xE5, 0xE2, 0xF7,
243716fd348SMartin Matuska 0x51, 0x5D, 0xE8, 0x73, 0x3B, 0x6E, 0xA9, 0x42,
244716fd348SMartin Matuska 0x2D, 0xFD, 0x67, 0x66, 0x65, 0xB5, 0xFA, 0x42,
245716fd348SMartin Matuska 0xFF, 0xB3, 0xA9, 0xC4, 0x8C, 0x21, 0x77, 0x77,
246716fd348SMartin Matuska 0x95, 0x08, 0x48, 0xCE, 0xCD, 0xB4, 0x8F, 0x64,
247716fd348SMartin Matuska 0x0F, 0x81, 0xFB, 0x92, 0xBE, 0xF6, 0xF8, 0x8F,
248716fd348SMartin Matuska 0x7A, 0x85, 0xC1, 0xF7, 0xCD, 0x14, 0x46, 0xC9,
249716fd348SMartin Matuska 0x16, 0x1C, 0x0A, 0xFE, 0x8F, 0x25, 0xAE, 0x44,
250716fd348SMartin Matuska 0x4F, 0x40, 0xD3, 0x68, 0x00, 0x81, 0xC3, 0x5A,
251716fd348SMartin Matuska 0xA4, 0x3F, 0x64, 0x0F, 0xD5, 0xFA, 0x3C, 0x3C,
252716fd348SMartin Matuska 0x03, 0x0B, 0xCC, 0x06, 0xAB, 0xAC, 0x01, 0xD0,
253716fd348SMartin Matuska 0x98, 0xBC, 0xC9, 0x84, 0xEB, 0xD8, 0x32, 0x27,
254716fd348SMartin Matuska 0x12, 0x92, 0x1E, 0x00, 0xB1, 0xBA, 0x07, 0xD6,
255716fd348SMartin Matuska 0xD0, 0x1F, 0x26, 0x90, 0x70, 0x50, 0x25, 0x5E,
256716fd348SMartin Matuska 0xF2, 0xC8, 0xE2, 0x4F, 0x71, 0x6C, 0x52, 0xA5
257716fd348SMartin Matuska }
258716fd348SMartin Matuska };
259716fd348SMartin Matuska
260716fd348SMartin Matuska int
main(int argc,char * argv[])261716fd348SMartin Matuska main(int argc, char *argv[])
262716fd348SMartin Matuska {
263716fd348SMartin Matuska boolean_t failed = B_FALSE;
264716fd348SMartin Matuska uint64_t cpu_mhz = 0;
265716fd348SMartin Matuska
266716fd348SMartin Matuska if (argc == 2)
267716fd348SMartin Matuska cpu_mhz = atoi(argv[1]);
268716fd348SMartin Matuska
269716fd348SMartin Matuska #define SKEIN_ALGO_TEST(_m, mode, diglen, testdigest) \
270716fd348SMartin Matuska do { \
271716fd348SMartin Matuska Skein ## mode ## _Ctxt_t ctx; \
272716fd348SMartin Matuska uint8_t digest[diglen / 8]; \
273716fd348SMartin Matuska (void) Skein ## mode ## _Init(&ctx, diglen); \
274716fd348SMartin Matuska (void) Skein ## mode ## _Update(&ctx, _m, sizeof (_m)); \
275716fd348SMartin Matuska (void) Skein ## mode ## _Final(&ctx, digest); \
276716fd348SMartin Matuska (void) printf("Skein" #mode "/" #diglen \
277716fd348SMartin Matuska "\tMessage: " #_m "\tResult: "); \
278716fd348SMartin Matuska if (memcmp(digest, testdigest, diglen / 8) == 0) { \
279716fd348SMartin Matuska (void) printf("OK\n"); \
280716fd348SMartin Matuska } else { \
281716fd348SMartin Matuska (void) printf("FAILED!\n"); \
282716fd348SMartin Matuska failed = B_TRUE; \
283716fd348SMartin Matuska } \
284716fd348SMartin Matuska } while (0)
285716fd348SMartin Matuska
286716fd348SMartin Matuska #define SKEIN_PERF_TEST(mode, diglen) \
287716fd348SMartin Matuska do { \
288716fd348SMartin Matuska Skein ## mode ## _Ctxt_t ctx; \
289716fd348SMartin Matuska uint8_t digest[diglen / 8]; \
290716fd348SMartin Matuska uint8_t block[131072]; \
291716fd348SMartin Matuska uint64_t delta; \
292716fd348SMartin Matuska double cpb = 0; \
293716fd348SMartin Matuska int i; \
294716fd348SMartin Matuska struct timeval start, end; \
295716fd348SMartin Matuska memset(block, 0, sizeof (block)); \
296716fd348SMartin Matuska (void) gettimeofday(&start, NULL); \
297716fd348SMartin Matuska (void) Skein ## mode ## _Init(&ctx, diglen); \
298716fd348SMartin Matuska for (i = 0; i < 8192; i++) { \
299716fd348SMartin Matuska (void) Skein ## mode ## _Update(&ctx, block, \
300716fd348SMartin Matuska sizeof (block)); \
301716fd348SMartin Matuska } \
302716fd348SMartin Matuska (void) Skein ## mode ## _Final(&ctx, digest); \
303716fd348SMartin Matuska (void) gettimeofday(&end, NULL); \
304716fd348SMartin Matuska delta = (end.tv_sec * 1000000llu + end.tv_usec) - \
305716fd348SMartin Matuska (start.tv_sec * 1000000llu + start.tv_usec); \
306716fd348SMartin Matuska if (cpu_mhz != 0) { \
307716fd348SMartin Matuska cpb = (cpu_mhz * 1e6 * ((double)delta / \
308716fd348SMartin Matuska 1000000)) / (8192 * 128 * 1024); \
309716fd348SMartin Matuska } \
310716fd348SMartin Matuska (void) printf("Skein" #mode "/" #diglen "\t%llu us " \
311716fd348SMartin Matuska "(%.02f CPB)\n", (u_longlong_t)delta, cpb); \
312716fd348SMartin Matuska } while (0)
313716fd348SMartin Matuska
314716fd348SMartin Matuska (void) printf("Running algorithm correctness tests:\n");
315716fd348SMartin Matuska SKEIN_ALGO_TEST(test_msg0, _256, 256, skein_256_test_digests[0]);
316716fd348SMartin Matuska SKEIN_ALGO_TEST(test_msg1, _256, 256, skein_256_test_digests[1]);
317716fd348SMartin Matuska SKEIN_ALGO_TEST(test_msg2, _256, 256, skein_256_test_digests[2]);
318716fd348SMartin Matuska SKEIN_ALGO_TEST(test_msg0, _512, 512, skein_512_test_digests[0]);
319716fd348SMartin Matuska SKEIN_ALGO_TEST(test_msg2, _512, 512, skein_512_test_digests[2]);
320716fd348SMartin Matuska SKEIN_ALGO_TEST(test_msg3, _512, 512, skein_512_test_digests[3]);
321716fd348SMartin Matuska SKEIN_ALGO_TEST(test_msg0, 1024, 1024, skein_1024_test_digests[0]);
322716fd348SMartin Matuska SKEIN_ALGO_TEST(test_msg3, 1024, 1024, skein_1024_test_digests[3]);
323716fd348SMartin Matuska SKEIN_ALGO_TEST(test_msg4, 1024, 1024, skein_1024_test_digests[4]);
324716fd348SMartin Matuska if (failed)
325716fd348SMartin Matuska return (1);
326716fd348SMartin Matuska
327716fd348SMartin Matuska (void) printf("Running performance tests (hashing 1024 MiB of "
328716fd348SMartin Matuska "data):\n");
329716fd348SMartin Matuska SKEIN_PERF_TEST(_256, 256);
330716fd348SMartin Matuska SKEIN_PERF_TEST(_512, 512);
331716fd348SMartin Matuska SKEIN_PERF_TEST(1024, 1024);
332716fd348SMartin Matuska
333716fd348SMartin Matuska return (0);
334716fd348SMartin Matuska }
335