xform.c revision 1.1 1 1.1 jonathan /* $NetBSD: xform.c,v 1.1 2003/07/25 21:12:49 jonathan Exp $ */
2 1.1 jonathan /* $FreeBSD: src/sys/opencrypto/xform.c,v 1.1.2.1 2002/11/21 23:34:23 sam Exp $ */
3 1.1 jonathan /* $OpenBSD: xform.c,v 1.19 2002/08/16 22:47:25 dhartmei Exp $ */
4 1.1 jonathan
5 1.1 jonathan /*
6 1.1 jonathan * The authors of this code are John Ioannidis (ji (at) tla.org),
7 1.1 jonathan * Angelos D. Keromytis (kermit (at) csd.uch.gr) and
8 1.1 jonathan * Niels Provos (provos (at) physnet.uni-hamburg.de).
9 1.1 jonathan *
10 1.1 jonathan * This code was written by John Ioannidis for BSD/OS in Athens, Greece,
11 1.1 jonathan * in November 1995.
12 1.1 jonathan *
13 1.1 jonathan * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996,
14 1.1 jonathan * by Angelos D. Keromytis.
15 1.1 jonathan *
16 1.1 jonathan * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis
17 1.1 jonathan * and Niels Provos.
18 1.1 jonathan *
19 1.1 jonathan * Additional features in 1999 by Angelos D. Keromytis.
20 1.1 jonathan *
21 1.1 jonathan * Copyright (C) 1995, 1996, 1997, 1998, 1999 by John Ioannidis,
22 1.1 jonathan * Angelos D. Keromytis and Niels Provos.
23 1.1 jonathan *
24 1.1 jonathan * Copyright (C) 2001, Angelos D. Keromytis.
25 1.1 jonathan *
26 1.1 jonathan * Permission to use, copy, and modify this software with or without fee
27 1.1 jonathan * is hereby granted, provided that this entire notice is included in
28 1.1 jonathan * all copies of any software which is or includes a copy or
29 1.1 jonathan * modification of this software.
30 1.1 jonathan * You may use this code under the GNU public license if you so wish. Please
31 1.1 jonathan * contribute changes back to the authors under this freer than GPL license
32 1.1 jonathan * so that we may further the use of strong encryption without limitations to
33 1.1 jonathan * all.
34 1.1 jonathan *
35 1.1 jonathan * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
36 1.1 jonathan * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
37 1.1 jonathan * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
38 1.1 jonathan * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
39 1.1 jonathan * PURPOSE.
40 1.1 jonathan */
41 1.1 jonathan
42 1.1 jonathan #include <sys/cdefs.h>
43 1.1 jonathan __KERNEL_RCSID(0, "$NetBSD: xform.c,v 1.1 2003/07/25 21:12:49 jonathan Exp $");
44 1.1 jonathan
45 1.1 jonathan #include <sys/param.h>
46 1.1 jonathan #include <sys/systm.h>
47 1.1 jonathan #include <sys/malloc.h>
48 1.1 jonathan #include <sys/sysctl.h>
49 1.1 jonathan #include <sys/errno.h>
50 1.1 jonathan #include <sys/time.h>
51 1.1 jonathan #include <sys/kernel.h>
52 1.1 jonathan #include <machine/cpu.h>
53 1.1 jonathan
54 1.1 jonathan #include <crypto/blowfish/blowfish.h>
55 1.1 jonathan #include <crypto/des/des.h>
56 1.1 jonathan
57 1.1 jonathan #include <opencrypto/rmd160.h>
58 1.1 jonathan #include <opencrypto/blf.h>
59 1.1 jonathan #include <opencrypto/cast.h>
60 1.1 jonathan #include <opencrypto/deflate.h>
61 1.1 jonathan #include <opencrypto/rijndael.h>
62 1.1 jonathan #include <opencrypto/skipjack.h>
63 1.1 jonathan
64 1.1 jonathan #include <sys/md5k.h>
65 1.1 jonathan #include <sys/sha1.h>
66 1.1 jonathan
67 1.1 jonathan #include <opencrypto/cryptodev.h>
68 1.1 jonathan #include <opencrypto/xform.h>
69 1.1 jonathan
70 1.1 jonathan static void null_encrypt(caddr_t, u_int8_t *);
71 1.1 jonathan static void null_decrypt(caddr_t, u_int8_t *);
72 1.1 jonathan static int null_setkey(u_int8_t **, u_int8_t *, int);
73 1.1 jonathan static void null_zerokey(u_int8_t **);
74 1.1 jonathan
75 1.1 jonathan static int des1_setkey(u_int8_t **, u_int8_t *, int);
76 1.1 jonathan static int des3_setkey(u_int8_t **, u_int8_t *, int);
77 1.1 jonathan static int blf_setkey(u_int8_t **, u_int8_t *, int);
78 1.1 jonathan static int cast5_setkey(u_int8_t **, u_int8_t *, int);
79 1.1 jonathan static int skipjack_setkey(u_int8_t **, u_int8_t *, int);
80 1.1 jonathan static int rijndael128_setkey(u_int8_t **, u_int8_t *, int);
81 1.1 jonathan static void des1_encrypt(caddr_t, u_int8_t *);
82 1.1 jonathan static void des3_encrypt(caddr_t, u_int8_t *);
83 1.1 jonathan static void blf_encrypt(caddr_t, u_int8_t *);
84 1.1 jonathan static void cast5_encrypt(caddr_t, u_int8_t *);
85 1.1 jonathan static void skipjack_encrypt(caddr_t, u_int8_t *);
86 1.1 jonathan static void rijndael128_encrypt(caddr_t, u_int8_t *);
87 1.1 jonathan static void des1_decrypt(caddr_t, u_int8_t *);
88 1.1 jonathan static void des3_decrypt(caddr_t, u_int8_t *);
89 1.1 jonathan static void blf_decrypt(caddr_t, u_int8_t *);
90 1.1 jonathan static void cast5_decrypt(caddr_t, u_int8_t *);
91 1.1 jonathan static void skipjack_decrypt(caddr_t, u_int8_t *);
92 1.1 jonathan static void rijndael128_decrypt(caddr_t, u_int8_t *);
93 1.1 jonathan static void des1_zerokey(u_int8_t **);
94 1.1 jonathan static void des3_zerokey(u_int8_t **);
95 1.1 jonathan static void blf_zerokey(u_int8_t **);
96 1.1 jonathan static void cast5_zerokey(u_int8_t **);
97 1.1 jonathan static void skipjack_zerokey(u_int8_t **);
98 1.1 jonathan static void rijndael128_zerokey(u_int8_t **);
99 1.1 jonathan
100 1.1 jonathan static void null_init(void *);
101 1.1 jonathan static int null_update(void *, u_int8_t *, u_int16_t);
102 1.1 jonathan static void null_final(u_int8_t *, void *);
103 1.1 jonathan
104 1.1 jonathan static int MD5Update_int(void *, u_int8_t *, u_int16_t);
105 1.1 jonathan static void SHA1Init_int(void *);
106 1.1 jonathan static int SHA1Update_int(void *, u_int8_t *, u_int16_t);
107 1.1 jonathan static void SHA1Final_int(u_int8_t *, void *);
108 1.1 jonathan
109 1.1 jonathan
110 1.1 jonathan static int RMD160Update_int(void *, u_int8_t *, u_int16_t);
111 1.1 jonathan static int SHA1Update_int(void *, u_int8_t *, u_int16_t);
112 1.1 jonathan static void SHA1Final_int(u_int8_t *, void *);
113 1.1 jonathan static int RMD160Update_int(void *, u_int8_t *, u_int16_t);
114 1.1 jonathan static int SHA256Update_int(void *, u_int8_t *, u_int16_t);
115 1.1 jonathan static int SHA384Update_int(void *, u_int8_t *, u_int16_t);
116 1.1 jonathan static int SHA512Update_int(void *, u_int8_t *, u_int16_t);
117 1.1 jonathan
118 1.1 jonathan static u_int32_t deflate_compress(u_int8_t *, u_int32_t, u_int8_t **);
119 1.1 jonathan static u_int32_t deflate_decompress(u_int8_t *, u_int32_t, u_int8_t **);
120 1.1 jonathan
121 1.1 jonathan MALLOC_DEFINE(M_XDATA, "xform", "xform data buffers");
122 1.1 jonathan
123 1.1 jonathan /* Encryption instances */
124 1.1 jonathan struct enc_xform enc_xform_null = {
125 1.1 jonathan CRYPTO_NULL_CBC, "NULL",
126 1.1 jonathan /* NB: blocksize of 4 is to generate a properly aligned ESP header */
127 1.1 jonathan 4, 0, 256, /* 2048 bits, max key */
128 1.1 jonathan null_encrypt,
129 1.1 jonathan null_decrypt,
130 1.1 jonathan null_setkey,
131 1.1 jonathan null_zerokey,
132 1.1 jonathan };
133 1.1 jonathan
134 1.1 jonathan struct enc_xform enc_xform_des = {
135 1.1 jonathan CRYPTO_DES_CBC, "DES",
136 1.1 jonathan 8, 8, 8,
137 1.1 jonathan des1_encrypt,
138 1.1 jonathan des1_decrypt,
139 1.1 jonathan des1_setkey,
140 1.1 jonathan des1_zerokey,
141 1.1 jonathan };
142 1.1 jonathan
143 1.1 jonathan struct enc_xform enc_xform_3des = {
144 1.1 jonathan CRYPTO_3DES_CBC, "3DES",
145 1.1 jonathan 8, 24, 24,
146 1.1 jonathan des3_encrypt,
147 1.1 jonathan des3_decrypt,
148 1.1 jonathan des3_setkey,
149 1.1 jonathan des3_zerokey
150 1.1 jonathan };
151 1.1 jonathan
152 1.1 jonathan struct enc_xform enc_xform_blf = {
153 1.1 jonathan CRYPTO_BLF_CBC, "Blowfish",
154 1.1 jonathan 8, 5, 56 /* 448 bits, max key */,
155 1.1 jonathan blf_encrypt,
156 1.1 jonathan blf_decrypt,
157 1.1 jonathan blf_setkey,
158 1.1 jonathan blf_zerokey
159 1.1 jonathan };
160 1.1 jonathan
161 1.1 jonathan struct enc_xform enc_xform_cast5 = {
162 1.1 jonathan CRYPTO_CAST_CBC, "CAST-128",
163 1.1 jonathan 8, 5, 16,
164 1.1 jonathan cast5_encrypt,
165 1.1 jonathan cast5_decrypt,
166 1.1 jonathan cast5_setkey,
167 1.1 jonathan cast5_zerokey
168 1.1 jonathan };
169 1.1 jonathan
170 1.1 jonathan struct enc_xform enc_xform_skipjack = {
171 1.1 jonathan CRYPTO_SKIPJACK_CBC, "Skipjack",
172 1.1 jonathan 8, 10, 10,
173 1.1 jonathan skipjack_encrypt,
174 1.1 jonathan skipjack_decrypt,
175 1.1 jonathan skipjack_setkey,
176 1.1 jonathan skipjack_zerokey
177 1.1 jonathan };
178 1.1 jonathan
179 1.1 jonathan struct enc_xform enc_xform_rijndael128 = {
180 1.1 jonathan CRYPTO_RIJNDAEL128_CBC, "Rijndael-128/AES",
181 1.1 jonathan 16, 8, 32,
182 1.1 jonathan rijndael128_encrypt,
183 1.1 jonathan rijndael128_decrypt,
184 1.1 jonathan rijndael128_setkey,
185 1.1 jonathan rijndael128_zerokey,
186 1.1 jonathan };
187 1.1 jonathan
188 1.1 jonathan struct enc_xform enc_xform_arc4 = {
189 1.1 jonathan CRYPTO_ARC4, "ARC4",
190 1.1 jonathan 1, 1, 32,
191 1.1 jonathan NULL,
192 1.1 jonathan NULL,
193 1.1 jonathan NULL,
194 1.1 jonathan NULL,
195 1.1 jonathan };
196 1.1 jonathan
197 1.1 jonathan /* Authentication instances */
198 1.1 jonathan struct auth_hash auth_hash_null = {
199 1.1 jonathan CRYPTO_NULL_HMAC, "NULL-HMAC",
200 1.1 jonathan 0, 0, 12, sizeof(int), /* NB: context isn't used */
201 1.1 jonathan null_init, null_update, null_final
202 1.1 jonathan };
203 1.1 jonathan
204 1.1 jonathan struct auth_hash auth_hash_hmac_md5_96 = {
205 1.1 jonathan CRYPTO_MD5_HMAC, "HMAC-MD5",
206 1.1 jonathan 16, 16, 12, sizeof(MD5_CTX),
207 1.1 jonathan (void (*) (void *)) MD5Init, MD5Update_int,
208 1.1 jonathan (void (*) (u_int8_t *, void *)) MD5Final
209 1.1 jonathan };
210 1.1 jonathan
211 1.1 jonathan struct auth_hash auth_hash_hmac_sha1_96 = {
212 1.1 jonathan CRYPTO_SHA1_HMAC, "HMAC-SHA1",
213 1.1 jonathan 20, 20, 12, sizeof(SHA1_CTX),
214 1.1 jonathan SHA1Init_int, SHA1Update_int, SHA1Final_int
215 1.1 jonathan };
216 1.1 jonathan
217 1.1 jonathan struct auth_hash auth_hash_hmac_ripemd_160_96 = {
218 1.1 jonathan CRYPTO_RIPEMD160_HMAC, "HMAC-RIPEMD-160",
219 1.1 jonathan 20, 20, 12, sizeof(RMD160_CTX),
220 1.1 jonathan (void (*)(void *)) RMD160Init, RMD160Update_int,
221 1.1 jonathan (void (*)(u_int8_t *, void *)) RMD160Final
222 1.1 jonathan };
223 1.1 jonathan
224 1.1 jonathan struct auth_hash auth_hash_key_md5 = {
225 1.1 jonathan CRYPTO_MD5_KPDK, "Keyed MD5",
226 1.1 jonathan 0, 16, 12, sizeof(MD5_CTX),
227 1.1 jonathan (void (*)(void *)) MD5Init, MD5Update_int,
228 1.1 jonathan (void (*)(u_int8_t *, void *)) MD5Final
229 1.1 jonathan };
230 1.1 jonathan
231 1.1 jonathan struct auth_hash auth_hash_key_sha1 = {
232 1.1 jonathan CRYPTO_SHA1_KPDK, "Keyed SHA1",
233 1.1 jonathan 0, 20, 12, sizeof(SHA1_CTX),
234 1.1 jonathan SHA1Init_int, SHA1Update_int, SHA1Final_int
235 1.1 jonathan };
236 1.1 jonathan
237 1.1 jonathan struct auth_hash auth_hash_md5 = {
238 1.1 jonathan CRYPTO_MD5, "MD5",
239 1.1 jonathan 0, 16, 16, sizeof(MD5_CTX),
240 1.1 jonathan (void (*) (void *)) MD5Init, MD5Update_int,
241 1.1 jonathan (void (*) (u_int8_t *, void *)) MD5Final
242 1.1 jonathan };
243 1.1 jonathan
244 1.1 jonathan struct auth_hash auth_hash_sha1 = {
245 1.1 jonathan CRYPTO_SHA1, "SHA1",
246 1.1 jonathan 0, 20, 20, sizeof(SHA1_CTX),
247 1.1 jonathan (void (*)(void *)) SHA1Init, SHA1Update_int,
248 1.1 jonathan (void (*)(u_int8_t *, void *)) SHA1Final
249 1.1 jonathan };
250 1.1 jonathan
251 1.1 jonathan struct auth_hash auth_hash_hmac_sha2_256 = {
252 1.1 jonathan CRYPTO_SHA2_HMAC, "HMAC-SHA2",
253 1.1 jonathan 32, 32, 12, sizeof(SHA256_CTX),
254 1.1 jonathan (void (*)(void *)) SHA256_Init, SHA256Update_int,
255 1.1 jonathan (void (*)(u_int8_t *, void *)) SHA256_Final
256 1.1 jonathan };
257 1.1 jonathan
258 1.1 jonathan struct auth_hash auth_hash_hmac_sha2_384 = {
259 1.1 jonathan CRYPTO_SHA2_HMAC, "HMAC-SHA2-384",
260 1.1 jonathan 48, 48, 12, sizeof(SHA384_CTX),
261 1.1 jonathan (void (*)(void *)) SHA384_Init, SHA384Update_int,
262 1.1 jonathan (void (*)(u_int8_t *, void *)) SHA384_Final
263 1.1 jonathan };
264 1.1 jonathan
265 1.1 jonathan struct auth_hash auth_hash_hmac_sha2_512 = {
266 1.1 jonathan CRYPTO_SHA2_HMAC, "HMAC-SHA2-512",
267 1.1 jonathan 64, 64, 12, sizeof(SHA512_CTX),
268 1.1 jonathan (void (*)(void *)) SHA512_Init, SHA512Update_int,
269 1.1 jonathan (void (*)(u_int8_t *, void *)) SHA512_Final
270 1.1 jonathan };
271 1.1 jonathan
272 1.1 jonathan /* Compression instance */
273 1.1 jonathan struct comp_algo comp_algo_deflate = {
274 1.1 jonathan CRYPTO_DEFLATE_COMP, "Deflate",
275 1.1 jonathan 90, deflate_compress,
276 1.1 jonathan deflate_decompress
277 1.1 jonathan };
278 1.1 jonathan
279 1.1 jonathan /*
280 1.1 jonathan * Encryption wrapper routines.
281 1.1 jonathan */
282 1.1 jonathan static void
283 1.1 jonathan null_encrypt(caddr_t key, u_int8_t *blk)
284 1.1 jonathan {
285 1.1 jonathan }
286 1.1 jonathan static void
287 1.1 jonathan null_decrypt(caddr_t key, u_int8_t *blk)
288 1.1 jonathan {
289 1.1 jonathan }
290 1.1 jonathan static int
291 1.1 jonathan null_setkey(u_int8_t **sched, u_int8_t *key, int len)
292 1.1 jonathan {
293 1.1 jonathan *sched = NULL;
294 1.1 jonathan return 0;
295 1.1 jonathan }
296 1.1 jonathan static void
297 1.1 jonathan null_zerokey(u_int8_t **sched)
298 1.1 jonathan {
299 1.1 jonathan *sched = NULL;
300 1.1 jonathan }
301 1.1 jonathan
302 1.1 jonathan static void
303 1.1 jonathan des1_encrypt(caddr_t key, u_int8_t *blk)
304 1.1 jonathan {
305 1.1 jonathan des_cblock *cb = (des_cblock *) blk;
306 1.1 jonathan des_key_schedule *p = (des_key_schedule *) key;
307 1.1 jonathan
308 1.1 jonathan des_ecb_encrypt(cb, cb, p[0], DES_ENCRYPT);
309 1.1 jonathan }
310 1.1 jonathan
311 1.1 jonathan static void
312 1.1 jonathan des1_decrypt(caddr_t key, u_int8_t *blk)
313 1.1 jonathan {
314 1.1 jonathan des_cblock *cb = (des_cblock *) blk;
315 1.1 jonathan des_key_schedule *p = (des_key_schedule *) key;
316 1.1 jonathan
317 1.1 jonathan des_ecb_encrypt(cb, cb, p[0], DES_DECRYPT);
318 1.1 jonathan }
319 1.1 jonathan
320 1.1 jonathan static int
321 1.1 jonathan des1_setkey(u_int8_t **sched, u_int8_t *key, int len)
322 1.1 jonathan {
323 1.1 jonathan des_key_schedule *p;
324 1.1 jonathan int err;
325 1.1 jonathan
326 1.1 jonathan MALLOC(p, des_key_schedule *, sizeof (des_key_schedule),
327 1.1 jonathan M_CRYPTO_DATA, M_NOWAIT);
328 1.1 jonathan if (p != NULL) {
329 1.1 jonathan bzero(p, sizeof(des_key_schedule));
330 1.1 jonathan des_set_key((des_cblock *) key, p[0]);
331 1.1 jonathan err = 0;
332 1.1 jonathan } else
333 1.1 jonathan err = ENOMEM;
334 1.1 jonathan *sched = (u_int8_t *) p;
335 1.1 jonathan return err;
336 1.1 jonathan }
337 1.1 jonathan
338 1.1 jonathan static void
339 1.1 jonathan des1_zerokey(u_int8_t **sched)
340 1.1 jonathan {
341 1.1 jonathan bzero(*sched, sizeof (des_key_schedule));
342 1.1 jonathan FREE(*sched, M_CRYPTO_DATA);
343 1.1 jonathan *sched = NULL;
344 1.1 jonathan }
345 1.1 jonathan
346 1.1 jonathan static void
347 1.1 jonathan des3_encrypt(caddr_t key, u_int8_t *blk)
348 1.1 jonathan {
349 1.1 jonathan des_cblock *cb = (des_cblock *) blk;
350 1.1 jonathan des_key_schedule *p = (des_key_schedule *) key;
351 1.1 jonathan
352 1.1 jonathan des_ecb3_encrypt(cb, cb, p[0], p[1], p[2], DES_ENCRYPT);
353 1.1 jonathan }
354 1.1 jonathan
355 1.1 jonathan static void
356 1.1 jonathan des3_decrypt(caddr_t key, u_int8_t *blk)
357 1.1 jonathan {
358 1.1 jonathan des_cblock *cb = (des_cblock *) blk;
359 1.1 jonathan des_key_schedule *p = (des_key_schedule *) key;
360 1.1 jonathan
361 1.1 jonathan des_ecb3_encrypt(cb, cb, p[0], p[1], p[2], DES_DECRYPT);
362 1.1 jonathan }
363 1.1 jonathan
364 1.1 jonathan static int
365 1.1 jonathan des3_setkey(u_int8_t **sched, u_int8_t *key, int len)
366 1.1 jonathan {
367 1.1 jonathan des_key_schedule *p;
368 1.1 jonathan int err;
369 1.1 jonathan
370 1.1 jonathan MALLOC(p, des_key_schedule *, 3*sizeof (des_key_schedule),
371 1.1 jonathan M_CRYPTO_DATA, M_NOWAIT);
372 1.1 jonathan if (p != NULL) {
373 1.1 jonathan bzero(p, 3*sizeof(des_key_schedule));
374 1.1 jonathan des_set_key((des_cblock *)(key + 0), p[0]);
375 1.1 jonathan des_set_key((des_cblock *)(key + 8), p[1]);
376 1.1 jonathan des_set_key((des_cblock *)(key + 16), p[2]);
377 1.1 jonathan err = 0;
378 1.1 jonathan } else
379 1.1 jonathan err = ENOMEM;
380 1.1 jonathan *sched = (u_int8_t *) p;
381 1.1 jonathan return err;
382 1.1 jonathan }
383 1.1 jonathan
384 1.1 jonathan static void
385 1.1 jonathan des3_zerokey(u_int8_t **sched)
386 1.1 jonathan {
387 1.1 jonathan bzero(*sched, 3*sizeof (des_key_schedule));
388 1.1 jonathan FREE(*sched, M_CRYPTO_DATA);
389 1.1 jonathan *sched = NULL;
390 1.1 jonathan }
391 1.1 jonathan
392 1.1 jonathan static void
393 1.1 jonathan blf_encrypt(caddr_t key, u_int8_t *blk)
394 1.1 jonathan {
395 1.1 jonathan blf_ecb_encrypt((blf_ctx *) key, blk, 8);
396 1.1 jonathan }
397 1.1 jonathan
398 1.1 jonathan static void
399 1.1 jonathan blf_decrypt(caddr_t key, u_int8_t *blk)
400 1.1 jonathan {
401 1.1 jonathan blf_ecb_decrypt((blf_ctx *) key, blk, 8);
402 1.1 jonathan }
403 1.1 jonathan
404 1.1 jonathan static int
405 1.1 jonathan blf_setkey(u_int8_t **sched, u_int8_t *key, int len)
406 1.1 jonathan {
407 1.1 jonathan int err;
408 1.1 jonathan
409 1.1 jonathan #ifdef __FreeBSD__
410 1.1 jonathan #define BLF_SIZ sizeof(BF_KEY)
411 1.1 jonathan #else
412 1.1 jonathan #define BLF_SIZ sizeof(blf_ctx)
413 1.1 jonathan #endif
414 1.1 jonathan
415 1.1 jonathan MALLOC(*sched, u_int8_t *, BLF_SIZ,
416 1.1 jonathan M_CRYPTO_DATA, M_NOWAIT);
417 1.1 jonathan if (*sched != NULL) {
418 1.1 jonathan bzero(*sched, BLF_SIZ);
419 1.1 jonathan #ifdef _FreeBSD__
420 1.1 jonathan BF_set_key((BF_KEY *) *sched, len, key);
421 1.1 jonathan #else
422 1.1 jonathan blf_key((blf_ctx *)*sched, key, len);
423 1.1 jonathan #endif
424 1.1 jonathan err = 0;
425 1.1 jonathan } else
426 1.1 jonathan err = ENOMEM;
427 1.1 jonathan return err;
428 1.1 jonathan }
429 1.1 jonathan
430 1.1 jonathan static void
431 1.1 jonathan blf_zerokey(u_int8_t **sched)
432 1.1 jonathan {
433 1.1 jonathan bzero(*sched, BLF_SIZ);
434 1.1 jonathan FREE(*sched, M_CRYPTO_DATA);
435 1.1 jonathan *sched = NULL;
436 1.1 jonathan }
437 1.1 jonathan
438 1.1 jonathan static void
439 1.1 jonathan cast5_encrypt(caddr_t key, u_int8_t *blk)
440 1.1 jonathan {
441 1.1 jonathan cast_encrypt((cast_key *) key, blk, blk);
442 1.1 jonathan }
443 1.1 jonathan
444 1.1 jonathan static void
445 1.1 jonathan cast5_decrypt(caddr_t key, u_int8_t *blk)
446 1.1 jonathan {
447 1.1 jonathan cast_decrypt((cast_key *) key, blk, blk);
448 1.1 jonathan }
449 1.1 jonathan
450 1.1 jonathan static int
451 1.1 jonathan cast5_setkey(u_int8_t **sched, u_int8_t *key, int len)
452 1.1 jonathan {
453 1.1 jonathan int err;
454 1.1 jonathan
455 1.1 jonathan MALLOC(*sched, u_int8_t *, sizeof(cast_key), M_CRYPTO_DATA,
456 1.1 jonathan M_NOWAIT);
457 1.1 jonathan if (*sched != NULL) {
458 1.1 jonathan bzero(*sched, sizeof(cast_key));
459 1.1 jonathan cast_setkey((cast_key *)*sched, key, len);
460 1.1 jonathan err = 0;
461 1.1 jonathan } else
462 1.1 jonathan err = ENOMEM;
463 1.1 jonathan return err;
464 1.1 jonathan }
465 1.1 jonathan
466 1.1 jonathan static void
467 1.1 jonathan cast5_zerokey(u_int8_t **sched)
468 1.1 jonathan {
469 1.1 jonathan bzero(*sched, sizeof(cast_key));
470 1.1 jonathan FREE(*sched, M_CRYPTO_DATA);
471 1.1 jonathan *sched = NULL;
472 1.1 jonathan }
473 1.1 jonathan
474 1.1 jonathan static void
475 1.1 jonathan skipjack_encrypt(caddr_t key, u_int8_t *blk)
476 1.1 jonathan {
477 1.1 jonathan skipjack_forwards(blk, blk, (u_int8_t **) key);
478 1.1 jonathan }
479 1.1 jonathan
480 1.1 jonathan static void
481 1.1 jonathan skipjack_decrypt(caddr_t key, u_int8_t *blk)
482 1.1 jonathan {
483 1.1 jonathan skipjack_backwards(blk, blk, (u_int8_t **) key);
484 1.1 jonathan }
485 1.1 jonathan
486 1.1 jonathan static int
487 1.1 jonathan skipjack_setkey(u_int8_t **sched, u_int8_t *key, int len)
488 1.1 jonathan {
489 1.1 jonathan int err;
490 1.1 jonathan
491 1.1 jonathan /* NB: allocate all the memory that's needed at once */
492 1.1 jonathan /* XXX assumes bytes are aligned on sizeof(u_char) == 1 boundaries.
493 1.1 jonathan * Will this break a pdp-10, Cray-1, or GE-645 port?
494 1.1 jonathan */
495 1.1 jonathan MALLOC(*sched, u_int8_t *, 10 * (sizeof(u_int8_t *) + 0x100),
496 1.1 jonathan M_CRYPTO_DATA, M_NOWAIT);
497 1.1 jonathan
498 1.1 jonathan if (*sched != NULL) {
499 1.1 jonathan
500 1.1 jonathan u_int8_t** key_tables = (u_int8_t**) *sched;
501 1.1 jonathan u_int8_t* table = (u_int8_t*) &key_tables[10];
502 1.1 jonathan int k;
503 1.1 jonathan
504 1.1 jonathan bzero(*sched, 10 * sizeof(u_int8_t *)+0x100);
505 1.1 jonathan
506 1.1 jonathan for (k = 0; k < 10; k++) {
507 1.1 jonathan key_tables[k] = table;
508 1.1 jonathan table += 0x100;
509 1.1 jonathan }
510 1.1 jonathan subkey_table_gen(key, (u_int8_t **) *sched);
511 1.1 jonathan err = 0;
512 1.1 jonathan } else
513 1.1 jonathan err = ENOMEM;
514 1.1 jonathan return err;
515 1.1 jonathan }
516 1.1 jonathan
517 1.1 jonathan static void
518 1.1 jonathan skipjack_zerokey(u_int8_t **sched)
519 1.1 jonathan {
520 1.1 jonathan bzero(*sched, 10 * (sizeof(u_int8_t *) + 0x100));
521 1.1 jonathan FREE(*sched, M_CRYPTO_DATA);
522 1.1 jonathan *sched = NULL;
523 1.1 jonathan }
524 1.1 jonathan
525 1.1 jonathan static void
526 1.1 jonathan rijndael128_encrypt(caddr_t key, u_int8_t *blk)
527 1.1 jonathan {
528 1.1 jonathan rijndael_encrypt((rijndael_ctx *) key, (u_char *) blk, (u_char *) blk);
529 1.1 jonathan }
530 1.1 jonathan
531 1.1 jonathan static void
532 1.1 jonathan rijndael128_decrypt(caddr_t key, u_int8_t *blk)
533 1.1 jonathan {
534 1.1 jonathan rijndael_decrypt(((rijndael_ctx *) key) + 1, (u_char *) blk,
535 1.1 jonathan (u_char *) blk);
536 1.1 jonathan }
537 1.1 jonathan
538 1.1 jonathan static int
539 1.1 jonathan rijndael128_setkey(u_int8_t **sched, u_int8_t *key, int len)
540 1.1 jonathan {
541 1.1 jonathan int err;
542 1.1 jonathan
543 1.1 jonathan MALLOC(*sched, u_int8_t *, 2 * sizeof(rijndael_ctx), M_CRYPTO_DATA,
544 1.1 jonathan M_WAITOK);
545 1.1 jonathan if (*sched != NULL) {
546 1.1 jonathan bzero(*sched, 2 * sizeof(rijndael_ctx));
547 1.1 jonathan rijndael_set_key((rijndael_ctx *) *sched, (u_char *) key, len * 8, 1);
548 1.1 jonathan rijndael_set_key(((rijndael_ctx *) *sched) + 1, (u_char *) key,
549 1.1 jonathan len * 8, 0);
550 1.1 jonathan err = 0;
551 1.1 jonathan } else
552 1.1 jonathan err = ENOMEM;
553 1.1 jonathan return err;
554 1.1 jonathan }
555 1.1 jonathan
556 1.1 jonathan static void
557 1.1 jonathan rijndael128_zerokey(u_int8_t **sched)
558 1.1 jonathan {
559 1.1 jonathan bzero(*sched, 2 * sizeof(rijndael_ctx));
560 1.1 jonathan FREE(*sched, M_CRYPTO_DATA);
561 1.1 jonathan *sched = NULL;
562 1.1 jonathan }
563 1.1 jonathan
564 1.1 jonathan /*
565 1.1 jonathan * And now for auth.
566 1.1 jonathan */
567 1.1 jonathan
568 1.1 jonathan static void
569 1.1 jonathan null_init(void *ctx)
570 1.1 jonathan {
571 1.1 jonathan }
572 1.1 jonathan
573 1.1 jonathan static int
574 1.1 jonathan null_update(void *ctx, u_int8_t *buf, u_int16_t len)
575 1.1 jonathan {
576 1.1 jonathan return 0;
577 1.1 jonathan }
578 1.1 jonathan
579 1.1 jonathan static void
580 1.1 jonathan null_final(u_int8_t *buf, void *ctx)
581 1.1 jonathan {
582 1.1 jonathan if (buf != (u_int8_t *) 0)
583 1.1 jonathan bzero(buf, 12);
584 1.1 jonathan }
585 1.1 jonathan
586 1.1 jonathan static int
587 1.1 jonathan RMD160Update_int(void *ctx, u_int8_t *buf, u_int16_t len)
588 1.1 jonathan {
589 1.1 jonathan RMD160Update(ctx, buf, len);
590 1.1 jonathan return 0;
591 1.1 jonathan }
592 1.1 jonathan
593 1.1 jonathan static int
594 1.1 jonathan MD5Update_int(void *ctx, u_int8_t *buf, u_int16_t len)
595 1.1 jonathan {
596 1.1 jonathan MD5Update(ctx, buf, len);
597 1.1 jonathan return 0;
598 1.1 jonathan }
599 1.1 jonathan
600 1.1 jonathan static void
601 1.1 jonathan SHA1Init_int(void *ctx)
602 1.1 jonathan {
603 1.1 jonathan SHA1Init(ctx);
604 1.1 jonathan }
605 1.1 jonathan
606 1.1 jonathan static int
607 1.1 jonathan SHA1Update_int(void *ctx, u_int8_t *buf, u_int16_t len)
608 1.1 jonathan {
609 1.1 jonathan SHA1Update(ctx, buf, len);
610 1.1 jonathan return 0;
611 1.1 jonathan }
612 1.1 jonathan
613 1.1 jonathan static void
614 1.1 jonathan SHA1Final_int(u_int8_t *blk, void *ctx)
615 1.1 jonathan {
616 1.1 jonathan SHA1Final(blk, ctx);
617 1.1 jonathan }
618 1.1 jonathan
619 1.1 jonathan static int
620 1.1 jonathan SHA256Update_int(void *ctx, u_int8_t *buf, u_int16_t len)
621 1.1 jonathan {
622 1.1 jonathan SHA256_Update(ctx, buf, len);
623 1.1 jonathan return 0;
624 1.1 jonathan }
625 1.1 jonathan
626 1.1 jonathan static int
627 1.1 jonathan SHA384Update_int(void *ctx, u_int8_t *buf, u_int16_t len)
628 1.1 jonathan {
629 1.1 jonathan SHA384_Update(ctx, buf, len);
630 1.1 jonathan return 0;
631 1.1 jonathan }
632 1.1 jonathan
633 1.1 jonathan static int
634 1.1 jonathan SHA512Update_int(void *ctx, u_int8_t *buf, u_int16_t len)
635 1.1 jonathan {
636 1.1 jonathan SHA512_Update(ctx, buf, len);
637 1.1 jonathan return 0;
638 1.1 jonathan }
639 1.1 jonathan
640 1.1 jonathan /*
641 1.1 jonathan * And compression
642 1.1 jonathan */
643 1.1 jonathan
644 1.1 jonathan static u_int32_t
645 1.1 jonathan deflate_compress(data, size, out)
646 1.1 jonathan u_int8_t *data;
647 1.1 jonathan u_int32_t size;
648 1.1 jonathan u_int8_t **out;
649 1.1 jonathan {
650 1.1 jonathan return deflate_global(data, size, 0, out);
651 1.1 jonathan }
652 1.1 jonathan
653 1.1 jonathan static u_int32_t
654 1.1 jonathan deflate_decompress(data, size, out)
655 1.1 jonathan u_int8_t *data;
656 1.1 jonathan u_int32_t size;
657 1.1 jonathan u_int8_t **out;
658 1.1 jonathan {
659 1.1 jonathan return deflate_global(data, size, 1, out);
660 1.1 jonathan }
661