xref: /netbsd-src/tests/crypto/opencrypto/h_sha2hmac.c (revision 068d6bf6916be178af538ea32b0db1fbc20eb4ed)
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 */
40 const 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 
227 int
main(void)228 main(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