xref: /netbsd/sys/opencrypto/xform.c (revision 1c8e0458)
1 /*	$NetBSD: xform.c,v 1.31 2020/06/30 04:14:56 riastradh Exp $ */
2 /*	$FreeBSD: src/sys/opencrypto/xform.c,v 1.1.2.1 2002/11/21 23:34:23 sam Exp $	*/
3 /*	$OpenBSD: xform.c,v 1.19 2002/08/16 22:47:25 dhartmei Exp $	*/
4 
5 /*
6  * The authors of this code are John Ioannidis (ji@tla.org),
7  * Angelos D. Keromytis (kermit@csd.uch.gr) and
8  * Niels Provos (provos@physnet.uni-hamburg.de).
9  *
10  * This code was written by John Ioannidis for BSD/OS in Athens, Greece,
11  * in November 1995.
12  *
13  * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996,
14  * by Angelos D. Keromytis.
15  *
16  * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis
17  * and Niels Provos.
18  *
19  * Additional features in 1999 by Angelos D. Keromytis.
20  *
21  * Copyright (C) 1995, 1996, 1997, 1998, 1999 by John Ioannidis,
22  * Angelos D. Keromytis and Niels Provos.
23  *
24  * Copyright (C) 2001, Angelos D. Keromytis.
25  *
26  * Permission to use, copy, and modify this software with or without fee
27  * is hereby granted, provided that this entire notice is included in
28  * all copies of any software which is or includes a copy or
29  * modification of this software.
30  * You may use this code under the GNU public license if you so wish. Please
31  * contribute changes back to the authors under this freer than GPL license
32  * so that we may further the use of strong encryption without limitations to
33  * all.
34  *
35  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
36  * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
37  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
38  * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
39  * PURPOSE.
40  */
41 
42 #include <sys/cdefs.h>
43 __KERNEL_RCSID(0, "$NetBSD: xform.c,v 1.31 2020/06/30 04:14:56 riastradh Exp $");
44 
45 #include <sys/param.h>
46 #include <sys/malloc.h>
47 
48 #include <opencrypto/cryptodev.h>
49 #include <opencrypto/xform.h>
50 
51 MALLOC_DEFINE(M_XDATA, "xform", "xform data buffers");
52 
53 const u_int8_t hmac_ipad_buffer[128] = {
54 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
55 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
56 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
57 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
58 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
59 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
60 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
61 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
62 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
63 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
64 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
65 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
66 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
67 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
68 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
69 	0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36
70 };
71 
72 const u_int8_t hmac_opad_buffer[128] = {
73 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
74 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
75 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
76 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
77 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
78 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
79 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
80 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
81 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
82 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
83 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
84 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
85 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
86 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
87 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C,
88 	0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C
89 };
90 
91 /* Encryption instances */
92 const struct enc_xform enc_xform_null = {
93 	.type		= CRYPTO_NULL_CBC,
94 	.name		= "NULL",
95 	/* NB: blocksize of 4 is to generate a properly aligned ESP header */
96 	.blocksize	= 4,
97 	.ivsize		= 0,
98 	.minkey		= 0,
99 	.maxkey		= 256, /* 2048 bits, max key */
100 };
101 
102 const struct enc_xform enc_xform_des = {
103 	.type		= CRYPTO_DES_CBC,
104 	.name		= "DES",
105 	.blocksize	= 8,
106 	.ivsize		= 8,
107 	.minkey		= 8,
108 	.maxkey		= 8,
109 };
110 
111 const struct enc_xform enc_xform_3des = {
112 	.type		= CRYPTO_3DES_CBC,
113 	.name		= "3DES",
114 	.blocksize	= 8,
115 	.ivsize		= 8,
116 	.minkey		= 24,
117 	.maxkey		= 24,
118 };
119 
120 const struct enc_xform enc_xform_blf = {
121 	.type		= CRYPTO_BLF_CBC,
122 	.name		= "Blowfish",
123 	.blocksize	= 8,
124 	.ivsize		= 8,
125 	.minkey		= 5,
126 	.maxkey		= 56, /* 448 bits, max key */
127 };
128 
129 const struct enc_xform enc_xform_cast5 = {
130 	.type		= CRYPTO_CAST_CBC,
131 	.name		= "CAST-128",
132 	.blocksize	= 8,
133 	.ivsize		= 8,
134 	.minkey		= 5,
135 	.maxkey		= 16,
136 };
137 
138 const struct enc_xform enc_xform_skipjack = {
139 	.type		= CRYPTO_SKIPJACK_CBC,
140 	.name		= "Skipjack",
141 	.blocksize	= 8,
142 	.ivsize		= 8,
143 	.minkey		= 10,
144 	.maxkey		= 10,
145 };
146 
147 const struct enc_xform enc_xform_aes = {
148 	.type		= CRYPTO_AES_CBC,
149 	.name		= "AES",
150 	.blocksize	= 16,
151 	.ivsize		= 16,
152 	.minkey		= 16,
153 	.maxkey		= 32,
154 };
155 
156 const struct enc_xform enc_xform_arc4 = {
157 	.type		= CRYPTO_ARC4,
158 	.name		= "ARC4",
159 	.blocksize	= 1,
160 	.ivsize		= 0,
161 	.minkey		= 1,
162 	.maxkey		= 32,
163 };
164 
165 const struct enc_xform enc_xform_camellia = {
166 	.type		= CRYPTO_CAMELLIA_CBC,
167 	.name		= "Camellia",
168 	.blocksize	= 16,
169 	.ivsize		= 16,
170 	.minkey		= 8,
171 	.maxkey		= 32,
172 };
173 
174 const struct enc_xform enc_xform_aes_ctr = {
175 	.type		= CRYPTO_AES_CTR,
176 	.name		= "AES-CTR",
177 	.blocksize	= 16,
178 	.ivsize		= 8,
179 	.minkey		= 16 + 4,
180 	.maxkey		= 32 + 4,
181 };
182 
183 const struct enc_xform enc_xform_aes_gcm = {
184 	.type		= CRYPTO_AES_GCM_16,
185 	.name		= "AES-GCM",
186 	.blocksize	= 4, /* ??? */
187 	.ivsize		= 8,
188 	.minkey		= 16 + 4,
189 	.maxkey		= 32 + 4,
190 };
191 
192 const struct enc_xform enc_xform_aes_gmac = {
193 	.type		= CRYPTO_AES_GMAC,
194 	.name		= "AES-GMAC",
195 	.blocksize	= 4, /* ??? */
196 	.ivsize		= 8,
197 	.minkey		= 16 + 4,
198 	.maxkey		= 32 + 4,
199 };
200 
201 /* Authentication instances */
202 const struct auth_hash auth_hash_null = {
203 	.type		= CRYPTO_NULL_HMAC,
204 	.name		= "NULL-HMAC",
205 	.keysize	= 0,
206 	.hashsize	= 0,
207 	.authsize	= 12,
208 	.blocksize	= 64,
209 };
210 
211 const struct auth_hash auth_hash_hmac_md5 = {
212 	.type		= CRYPTO_MD5_HMAC,
213 	.name		= "HMAC-MD5",
214 	.keysize	= 16,
215 	.hashsize	= 16,
216 	.authsize	= 16,
217 	.blocksize	= 64,
218 };
219 
220 const struct auth_hash auth_hash_hmac_sha1 = {
221 	.type		= CRYPTO_SHA1_HMAC,
222 	.name		= "HMAC-SHA1",
223 	.keysize	= 20,
224 	.hashsize	= 20,
225 	.authsize	= 20,
226 	.blocksize	= 64,
227 };
228 
229 const struct auth_hash auth_hash_hmac_ripemd_160 = {
230 	.type		= CRYPTO_RIPEMD160_HMAC,
231 	.name		= "HMAC-RIPEMD-160",
232 	.keysize	= 20,
233 	.hashsize	= 20,
234 	.authsize	= 20,
235 	.blocksize	= 64,
236 };
237 
238 const struct auth_hash auth_hash_hmac_md5_96 = {
239 	.type		= CRYPTO_MD5_HMAC_96,
240 	.name		= "HMAC-MD5-96",
241 	.keysize	= 16,
242 	.hashsize	= 16,
243 	.authsize	= 12,
244 	.blocksize	= 64,
245 };
246 
247 const struct auth_hash auth_hash_hmac_sha1_96 = {
248 	.type		= CRYPTO_SHA1_HMAC_96,
249 	.name		= "HMAC-SHA1-96",
250 	.keysize	= 20,
251 	.hashsize	= 20,
252 	.authsize	= 12,
253 	.blocksize	= 64,
254 };
255 
256 const struct auth_hash auth_hash_hmac_ripemd_160_96 = {
257 	.type		= CRYPTO_RIPEMD160_HMAC_96,
258 	.name		= "HMAC-RIPEMD-160",
259 	.keysize	= 20,
260 	.hashsize	= 20,
261 	.authsize	= 12,
262 	.blocksize	= 64,
263 };
264 
265 const struct auth_hash auth_hash_key_md5 = {
266 	.type		= CRYPTO_MD5_KPDK,
267 	.name		= "Keyed MD5",
268 	.keysize	= 0,
269 	.hashsize	= 16,
270 	.authsize	= 16,
271 	.blocksize	= 0,
272 };
273 
274 const struct auth_hash auth_hash_key_sha1 = {
275 	.type		= CRYPTO_SHA1_KPDK,
276 	.name		= "Keyed SHA1",
277 	.keysize	= 0,
278 	.hashsize	= 20,
279 	.authsize	= 20,
280 	.blocksize	= 0,
281 };
282 
283 const struct auth_hash auth_hash_md5 = {
284 	.type		= CRYPTO_MD5,
285 	.name		= "MD5",
286 	.keysize	= 0,
287 	.hashsize	= 16,
288 	.authsize	= 16,
289 	.blocksize	= 0,
290 };
291 
292 const struct auth_hash auth_hash_sha1 = {
293 	.type		= CRYPTO_SHA1,
294 	.name		= "SHA1",
295 	.keysize	= 0,
296 	.hashsize	= 20,
297 	.authsize	= 20,
298 	.blocksize	= 0,
299 };
300 
301 const struct auth_hash auth_hash_hmac_sha2_256 = {
302 	.type		= CRYPTO_SHA2_256_HMAC,
303 	.name		= "HMAC-SHA2",
304 	.keysize	= 32,
305 	.hashsize	= 32,
306 	.authsize	= 16,
307 	.blocksize	= 64,
308 };
309 
310 const struct auth_hash auth_hash_hmac_sha2_384 = {
311 	.type		= CRYPTO_SHA2_384_HMAC,
312 	.name		= "HMAC-SHA2-384",
313 	.keysize	= 48,
314 	.hashsize	= 48,
315 	.authsize	= 24,
316 	.blocksize	= 128,
317 };
318 
319 const struct auth_hash auth_hash_hmac_sha2_512 = {
320 	.type		= CRYPTO_SHA2_512_HMAC,
321 	.name		= "HMAC-SHA2-512",
322 	.keysize	= 64,
323 	.hashsize	= 64,
324 	.authsize	= 32,
325 	.blocksize	= 128,
326 };
327 
328 const struct auth_hash auth_hash_aes_xcbc_mac_96 = {
329 	.type		= CRYPTO_AES_XCBC_MAC_96,
330 	.name		= "AES-XCBC-MAC-96",
331 	.keysize	= 16,
332 	.hashsize	= 16,
333 	.authsize	= 12,
334 	.blocksize	= 0,
335 };
336 
337 const struct auth_hash auth_hash_gmac_aes_128 = {
338 	.type		= CRYPTO_AES_128_GMAC,
339 	.name		= "GMAC-AES-128",
340 	.keysize	= 16 + 4,
341 	.hashsize	= 16,
342 	.authsize	= 16,
343 	.blocksize	= 16, /* ??? */
344 };
345 
346 const struct auth_hash auth_hash_gmac_aes_192 = {
347 	.type		= CRYPTO_AES_192_GMAC,
348 	.name		= "GMAC-AES-192",
349 	.keysize	= 24 + 4,
350 	.hashsize	= 16,
351 	.authsize	= 16,
352 	.blocksize	= 16, /* ??? */
353 };
354 
355 const struct auth_hash auth_hash_gmac_aes_256 = {
356 	.type		= CRYPTO_AES_256_GMAC,
357 	.name		= "GMAC-AES-256",
358 	.keysize	= 32 + 4,
359 	.hashsize	= 16,
360 	.authsize	= 16,
361 	.blocksize	= 16, /* ??? */
362 };
363 
364 /* Compression instance */
365 const struct comp_algo comp_algo_deflate = {
366 	.type	= CRYPTO_DEFLATE_COMP,
367 	.name	= "Deflate",
368 	.minlen	= 90,
369 };
370 
371 const struct comp_algo comp_algo_deflate_nogrow = {
372 	.type	= CRYPTO_DEFLATE_COMP_NOGROW,
373 	.name	= "Deflate",
374 	.minlen	= 90,
375 };
376 
377 const struct comp_algo comp_algo_gzip = {
378 	.type	= CRYPTO_GZIP_COMP,
379 	.name	= "GZIP",
380 	.minlen	= 90,
381 };
382