1/* $NetBSD: h_sha2hmac.c,v 1.1 2019/12/03 04:20:45 hikaru Exp $ */
2
3/*-
4 * Copyright (c) 2014 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <err.h>
30#include <fcntl.h>
31#include <stdio.h>
32#include <string.h>
33
34#include <sys/ioctl.h>
35#include <sys/time.h>
36
37#include <crypto/cryptodev.h>
38
39/* Test data from RFC4868 */
40const struct {
41	int num;
42	int alg;
43	size_t key_len;
44	size_t len;
45	size_t mac_len;
46	unsigned char key[80];
47	unsigned char data[80];
48	unsigned char mac[80];
49} tests[] = {
50	{ 1, CRYPTO_SHA2_256_HMAC, 32, 8, 16,
51	  { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
52	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
53	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
54	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b },
55	  "Hi There",
56	  { 0x19, 0x8a, 0x60, 0x7e, 0xb4, 0x4b, 0xfb, 0xc6,
57	    0x99, 0x03, 0xa0, 0xf1, 0xcf, 0x2b, 0xbd, 0xc5 }
58	},
59	{ 2, CRYPTO_SHA2_256_HMAC, 32, 28, 16,
60	  "JefeJefeJefeJefe"
61	  "JefeJefeJefeJefe",
62	  "what do ya want "
63	  "for nothing?",
64	  { 0x16, 0x7f, 0x92, 0x85, 0x88, 0xc5, 0xcc, 0x2e,
65	    0xef, 0x8e, 0x30, 0x93, 0xca, 0xa0, 0xe8, 0x7c }
66	},
67	{ 3, CRYPTO_SHA2_256_HMAC, 32, 50, 16,
68	  { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
69	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
70	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
71	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa },
72	  { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
73	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
74	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
75	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
76	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
77	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
78	    0xdd, 0xdd },
79          { 0xcd, 0xcb, 0x12, 0x20, 0xd1, 0xec, 0xcc, 0xea,
80	    0x91, 0xe5, 0x3a, 0xba, 0x30, 0x92, 0xf9, 0x62 }
81	},
82	{ 4, CRYPTO_SHA2_256_HMAC, 32, 50, 16,
83	  { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
84	    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
85	    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
86	    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 },
87	  { 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
88	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
89	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
90	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
91	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
92	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
93	    0xcd, 0xcd },
94	  { 0x37, 0x2e, 0xfc, 0xf9, 0xb4, 0x0b, 0x35, 0xc2,
95	    0x11, 0x5b, 0x13, 0x46, 0x90, 0x3d, 0x2e, 0xf4 }
96	},
97	{ 5, CRYPTO_SHA2_384_HMAC, 48, 8, 24,
98	  { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
99	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
100	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
101	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
102	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
103	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b },
104	  "Hi There",
105	  { 0xb6, 0xa8, 0xd5, 0x63, 0x6f, 0x5c, 0x6a, 0x72,
106	    0x24, 0xf9, 0x97, 0x7d, 0xcf, 0x7e, 0xe6, 0xc7,
107	    0xfb, 0x6d, 0x0c, 0x48, 0xcb, 0xde, 0xe9, 0x73 }
108	},
109	{ 6, CRYPTO_SHA2_384_HMAC, 48, 28, 24,
110	  "JefeJefeJefeJefe"
111	  "JefeJefeJefeJefe"
112	  "JefeJefeJefeJefe",
113	  "what do ya want "
114	  "for nothing?",
115	  { 0x2c, 0x73, 0x53, 0x97, 0x4f, 0x18, 0x42, 0xfd,
116	    0x66, 0xd5, 0x3c, 0x45, 0x2c, 0xa4, 0x21, 0x22,
117	    0xb2, 0x8c, 0x0b, 0x59, 0x4c, 0xfb, 0x18, 0x4d }
118	},
119	{ 7, CRYPTO_SHA2_384_HMAC, 48, 50, 24,
120	  { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
121	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
122	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
123	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
124	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
125	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa },
126	  { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
127	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
128	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
129	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
130	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
131	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
132	    0xdd, 0xdd },
133	  { 0x80, 0x9f, 0x43, 0x9b, 0xe0, 0x02, 0x74, 0x32,
134	    0x1d, 0x4a, 0x53, 0x86, 0x52, 0x16, 0x4b, 0x53,
135	    0x55, 0x4a, 0x50, 0x81, 0x84, 0xa0, 0xc3, 0x16 }
136	},
137	{ 8, CRYPTO_SHA2_384_HMAC, 48, 50, 24,
138	  { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
139	    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
140	    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
141	    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
142	    0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
143	    0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19 },
144	  { 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
145	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
146	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
147	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
148	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
149	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
150	    0xcd, 0xcd },
151	  { 0x5b, 0x54, 0x00, 0x85, 0xc6, 0xe6, 0x35, 0x80,
152	    0x96, 0x53, 0x2b, 0x24, 0x93, 0x60, 0x9e, 0xd1,
153	    0xcb, 0x29, 0x8f, 0x77, 0x4f, 0x87, 0xbb, 0x5c }
154	},
155	{ 9, CRYPTO_SHA2_512_HMAC, 64, 8, 32,
156	  { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
157	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
158	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
159	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
160	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
161	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
162	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
163	    0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b },
164	  "Hi There",
165	  { 0x63, 0x7e, 0xdc, 0x6e, 0x01, 0xdc, 0xe7, 0xe6,
166	    0x74, 0x2a, 0x99, 0x45, 0x1a, 0xae, 0x82, 0xdf,
167	    0x23, 0xda, 0x3e, 0x92, 0x43, 0x9e, 0x59, 0x0e,
168	    0x43, 0xe7, 0x61, 0xb3, 0x3e, 0x91, 0x0f, 0xb8 }
169	},
170	{ 10, CRYPTO_SHA2_512_HMAC, 64, 28, 32,
171	  "JefeJefeJefeJefe"
172	  "JefeJefeJefeJefe"
173	  "JefeJefeJefeJefe"
174	  "JefeJefeJefeJefe",
175	  "what do ya want "
176	  "for nothing?",
177	  { 0xcb, 0x37, 0x09, 0x17, 0xae, 0x8a, 0x7c, 0xe2,
178	    0x8c, 0xfd, 0x1d, 0x8f, 0x47, 0x05, 0xd6, 0x14,
179	    0x1c, 0x17, 0x3b, 0x2a, 0x93, 0x62, 0xc1, 0x5d,
180	    0xf2, 0x35, 0xdf, 0xb2, 0x51, 0xb1, 0x54, 0x54 }
181	},
182	{ 11, CRYPTO_SHA2_512_HMAC, 64, 50, 32,
183	  { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
184	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
185	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
186	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
187	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
188	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
189	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
190	    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa },
191	  { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
192	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
193	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
194	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
195	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
196	    0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
197	    0xdd, 0xdd },
198	  { 0x2e, 0xe7, 0xac, 0xd7, 0x83, 0x62, 0x4c, 0xa9,
199	    0x39, 0x87, 0x10, 0xf3, 0xee, 0x05, 0xae, 0x41,
200	    0xb9, 0xf9, 0xb0, 0x51, 0x0c, 0x87, 0xe4, 0x9e,
201	    0x58, 0x6c, 0xc9, 0xbf, 0x96, 0x17, 0x33, 0xd8
202	  }
203	},
204	{ 12, CRYPTO_SHA2_512_HMAC, 64, 50, 32,
205	  { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
206	    0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
207	    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
208	    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
209	    0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
210	    0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
211	    0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
212	    0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40 },
213	  { 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
214	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
215	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
216	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
217	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
218	    0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
219	    0xcd, 0xcd },
220	  { 0x5e, 0x66, 0x88, 0xe5, 0xa3, 0xda, 0xec, 0x82,
221	    0x6c, 0xa3, 0x2e, 0xae, 0xa2, 0x24, 0xef, 0xf5,
222	    0xe7, 0x00, 0x62, 0x89, 0x47, 0x47, 0x0e, 0x13,
223	    0xad, 0x01, 0x30, 0x25, 0x61, 0xba, 0xb1, 0x08 }
224	},
225};
226
227int
228main(void)
229{
230	size_t i;
231	int fd, res;
232	struct session_op cs;
233	struct crypt_op co;
234	unsigned char buf[80];
235
236	fd = open("/dev/crypto", O_RDWR, 0);
237	if (fd < 0)
238		err(1, "open");
239	for (i = 0; i < __arraycount(tests); i++) {
240		memset(&cs, 0, sizeof(cs));
241		cs.mac = tests[i].alg;
242		cs.mackeylen = tests[i].key_len;
243		cs.mackey = __UNCONST(&tests[i].key);
244		res = ioctl(fd, CIOCGSESSION, &cs);
245		if (res < 0)
246			err(1, "CIOCGSESSION test %d", tests[i].num);
247
248		memset(&co, 0, sizeof(co));
249		memset(buf, 0, sizeof(buf));
250		co.ses = cs.ses;
251		co.op = COP_ENCRYPT;
252		co.len = tests[i].len;
253		co.src = __UNCONST(&tests[i].data);
254		co.mac = buf;
255		res = ioctl(fd, CIOCCRYPT, &co);
256		if (res < 0)
257			err(1, "CIOCCRYPT test %d", tests[i].num);
258
259		/* compare with trailing zeros */
260		if (memcmp(co.mac, &tests[i].mac, sizeof(tests[i].mac)))
261			errx(1, "verification failed test %d", tests[i].num);
262
263		res = ioctl(fd, CIOCFSESSION, &cs.ses);
264		if (res < 0)
265			err(1, "CIOCFSESSION test %d", tests[i].num);
266	}
267	return 0;
268}
269