2 * Authenc: Simple AEAD wrapper for IPsec
4 * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)
13 #include <crypto/aead.h>
14 #include <crypto/internal/hash.h>
15 #include <crypto/internal/skcipher.h>
16 #include <crypto/authenc.h>
17 #include <crypto/scatterwalk.h>
18 #include <linux/err.h>
19 #include <linux/init.h>
20 #include <linux/kernel.h>
21 #include <linux/module.h>
22 #include <linux/rtnetlink.h>
23 #include <linux/slab.h>
24 #include <linux/spinlock.h>
26 typedef u8
*(*authenc_ahash_t
)(struct aead_request
*req
, unsigned int flags
);
28 struct authenc_instance_ctx
{
29 struct crypto_ahash_spawn auth
;
30 struct crypto_skcipher_spawn enc
;
33 struct crypto_authenc_ctx
{
35 struct crypto_ahash
*auth
;
36 struct crypto_ablkcipher
*enc
;
39 struct authenc_request_ctx
{
40 unsigned int cryptlen
;
41 struct scatterlist
*sg
;
42 struct scatterlist asg
[2];
43 struct scatterlist cipher
[2];
44 crypto_completion_t complete
;
45 crypto_completion_t update_complete
;
49 static void authenc_request_complete(struct aead_request
*req
, int err
)
51 if (err
!= -EINPROGRESS
)
52 aead_request_complete(req
, err
);
55 static int crypto_authenc_setkey(struct crypto_aead
*authenc
, const u8
*key
,
58 unsigned int authkeylen
;
59 unsigned int enckeylen
;
60 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
61 struct crypto_ahash
*auth
= ctx
->auth
;
62 struct crypto_ablkcipher
*enc
= ctx
->enc
;
63 struct rtattr
*rta
= (void *)key
;
64 struct crypto_authenc_key_param
*param
;
67 if (!RTA_OK(rta
, keylen
))
69 if (rta
->rta_type
!= CRYPTO_AUTHENC_KEYA_PARAM
)
71 if (RTA_PAYLOAD(rta
) < sizeof(*param
))
74 param
= RTA_DATA(rta
);
75 enckeylen
= be32_to_cpu(param
->enckeylen
);
77 key
+= RTA_ALIGN(rta
->rta_len
);
78 keylen
-= RTA_ALIGN(rta
->rta_len
);
80 if (keylen
< enckeylen
)
83 authkeylen
= keylen
- enckeylen
;
85 crypto_ahash_clear_flags(auth
, CRYPTO_TFM_REQ_MASK
);
86 crypto_ahash_set_flags(auth
, crypto_aead_get_flags(authenc
) &
88 err
= crypto_ahash_setkey(auth
, key
, authkeylen
);
89 crypto_aead_set_flags(authenc
, crypto_ahash_get_flags(auth
) &
95 crypto_ablkcipher_clear_flags(enc
, CRYPTO_TFM_REQ_MASK
);
96 crypto_ablkcipher_set_flags(enc
, crypto_aead_get_flags(authenc
) &
98 err
= crypto_ablkcipher_setkey(enc
, key
+ authkeylen
, enckeylen
);
99 crypto_aead_set_flags(authenc
, crypto_ablkcipher_get_flags(enc
) &
100 CRYPTO_TFM_RES_MASK
);
106 crypto_aead_set_flags(authenc
, CRYPTO_TFM_RES_BAD_KEY_LEN
);
110 static void authenc_chain(struct scatterlist
*head
, struct scatterlist
*sg
,
114 head
->length
+= sg
->length
;
115 sg
= scatterwalk_sg_next(sg
);
119 scatterwalk_sg_chain(head
, 2, sg
);
124 static void authenc_geniv_ahash_update_done(struct crypto_async_request
*areq
,
127 struct aead_request
*req
= areq
->data
;
128 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
129 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
130 struct authenc_request_ctx
*areq_ctx
= aead_request_ctx(req
);
131 struct ahash_request
*ahreq
= (void *)(areq_ctx
->tail
+ ctx
->reqoff
);
136 ahash_request_set_crypt(ahreq
, areq_ctx
->sg
, ahreq
->result
,
138 ahash_request_set_callback(ahreq
, aead_request_flags(req
) &
139 CRYPTO_TFM_REQ_MAY_SLEEP
,
140 areq_ctx
->complete
, req
);
142 err
= crypto_ahash_finup(ahreq
);
146 scatterwalk_map_and_copy(ahreq
->result
, areq_ctx
->sg
,
148 crypto_aead_authsize(authenc
), 1);
151 authenc_request_complete(req
, err
);
154 static void authenc_geniv_ahash_done(struct crypto_async_request
*areq
, int err
)
156 struct aead_request
*req
= areq
->data
;
157 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
158 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
159 struct authenc_request_ctx
*areq_ctx
= aead_request_ctx(req
);
160 struct ahash_request
*ahreq
= (void *)(areq_ctx
->tail
+ ctx
->reqoff
);
165 scatterwalk_map_and_copy(ahreq
->result
, areq_ctx
->sg
,
167 crypto_aead_authsize(authenc
), 1);
170 aead_request_complete(req
, err
);
173 static void authenc_verify_ahash_update_done(struct crypto_async_request
*areq
,
177 unsigned int authsize
;
178 struct ablkcipher_request
*abreq
;
179 struct aead_request
*req
= areq
->data
;
180 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
181 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
182 struct authenc_request_ctx
*areq_ctx
= aead_request_ctx(req
);
183 struct ahash_request
*ahreq
= (void *)(areq_ctx
->tail
+ ctx
->reqoff
);
184 unsigned int cryptlen
= req
->cryptlen
;
189 ahash_request_set_crypt(ahreq
, areq_ctx
->sg
, ahreq
->result
,
191 ahash_request_set_callback(ahreq
, aead_request_flags(req
) &
192 CRYPTO_TFM_REQ_MAY_SLEEP
,
193 areq_ctx
->complete
, req
);
195 err
= crypto_ahash_finup(ahreq
);
199 authsize
= crypto_aead_authsize(authenc
);
200 cryptlen
-= authsize
;
201 ihash
= ahreq
->result
+ authsize
;
202 scatterwalk_map_and_copy(ihash
, areq_ctx
->sg
, areq_ctx
->cryptlen
,
205 err
= memcmp(ihash
, ahreq
->result
, authsize
) ? -EBADMSG
: 0;
209 abreq
= aead_request_ctx(req
);
210 ablkcipher_request_set_tfm(abreq
, ctx
->enc
);
211 ablkcipher_request_set_callback(abreq
, aead_request_flags(req
),
212 req
->base
.complete
, req
->base
.data
);
213 ablkcipher_request_set_crypt(abreq
, req
->src
, req
->dst
,
216 err
= crypto_ablkcipher_decrypt(abreq
);
219 authenc_request_complete(req
, err
);
222 static void authenc_verify_ahash_done(struct crypto_async_request
*areq
,
226 unsigned int authsize
;
227 struct ablkcipher_request
*abreq
;
228 struct aead_request
*req
= areq
->data
;
229 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
230 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
231 struct authenc_request_ctx
*areq_ctx
= aead_request_ctx(req
);
232 struct ahash_request
*ahreq
= (void *)(areq_ctx
->tail
+ ctx
->reqoff
);
233 unsigned int cryptlen
= req
->cryptlen
;
238 authsize
= crypto_aead_authsize(authenc
);
239 cryptlen
-= authsize
;
240 ihash
= ahreq
->result
+ authsize
;
241 scatterwalk_map_and_copy(ihash
, areq_ctx
->sg
, areq_ctx
->cryptlen
,
244 err
= memcmp(ihash
, ahreq
->result
, authsize
) ? -EBADMSG
: 0;
248 abreq
= aead_request_ctx(req
);
249 ablkcipher_request_set_tfm(abreq
, ctx
->enc
);
250 ablkcipher_request_set_callback(abreq
, aead_request_flags(req
),
251 req
->base
.complete
, req
->base
.data
);
252 ablkcipher_request_set_crypt(abreq
, req
->src
, req
->dst
,
255 err
= crypto_ablkcipher_decrypt(abreq
);
258 authenc_request_complete(req
, err
);
261 static u8
*crypto_authenc_ahash_fb(struct aead_request
*req
, unsigned int flags
)
263 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
264 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
265 struct crypto_ahash
*auth
= ctx
->auth
;
266 struct authenc_request_ctx
*areq_ctx
= aead_request_ctx(req
);
267 struct ahash_request
*ahreq
= (void *)(areq_ctx
->tail
+ ctx
->reqoff
);
268 u8
*hash
= areq_ctx
->tail
;
271 hash
= (u8
*)ALIGN((unsigned long)hash
+ crypto_ahash_alignmask(auth
),
272 crypto_ahash_alignmask(auth
) + 1);
274 ahash_request_set_tfm(ahreq
, auth
);
276 err
= crypto_ahash_init(ahreq
);
280 ahash_request_set_crypt(ahreq
, req
->assoc
, hash
, req
->assoclen
);
281 ahash_request_set_callback(ahreq
, aead_request_flags(req
) & flags
,
282 areq_ctx
->update_complete
, req
);
284 err
= crypto_ahash_update(ahreq
);
288 ahash_request_set_crypt(ahreq
, areq_ctx
->sg
, hash
,
290 ahash_request_set_callback(ahreq
, aead_request_flags(req
) & flags
,
291 areq_ctx
->complete
, req
);
293 err
= crypto_ahash_finup(ahreq
);
300 static u8
*crypto_authenc_ahash(struct aead_request
*req
, unsigned int flags
)
302 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
303 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
304 struct crypto_ahash
*auth
= ctx
->auth
;
305 struct authenc_request_ctx
*areq_ctx
= aead_request_ctx(req
);
306 struct ahash_request
*ahreq
= (void *)(areq_ctx
->tail
+ ctx
->reqoff
);
307 u8
*hash
= areq_ctx
->tail
;
310 hash
= (u8
*)ALIGN((unsigned long)hash
+ crypto_ahash_alignmask(auth
),
311 crypto_ahash_alignmask(auth
) + 1);
313 ahash_request_set_tfm(ahreq
, auth
);
314 ahash_request_set_crypt(ahreq
, areq_ctx
->sg
, hash
,
316 ahash_request_set_callback(ahreq
, aead_request_flags(req
) & flags
,
317 areq_ctx
->complete
, req
);
319 err
= crypto_ahash_digest(ahreq
);
326 static int crypto_authenc_genicv(struct aead_request
*req
, u8
*iv
,
329 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
330 struct authenc_request_ctx
*areq_ctx
= aead_request_ctx(req
);
331 struct scatterlist
*dst
= req
->dst
;
332 struct scatterlist
*assoc
= req
->assoc
;
333 struct scatterlist
*cipher
= areq_ctx
->cipher
;
334 struct scatterlist
*asg
= areq_ctx
->asg
;
335 unsigned int ivsize
= crypto_aead_ivsize(authenc
);
336 unsigned int cryptlen
= req
->cryptlen
;
337 authenc_ahash_t authenc_ahash_fn
= crypto_authenc_ahash_fb
;
343 vdst
= PageHighMem(dstp
) ? NULL
: page_address(dstp
) + dst
->offset
;
346 sg_init_table(cipher
, 2);
347 sg_set_buf(cipher
, iv
, ivsize
);
348 authenc_chain(cipher
, dst
, vdst
== iv
+ ivsize
);
353 if (sg_is_last(assoc
)) {
354 authenc_ahash_fn
= crypto_authenc_ahash
;
355 sg_init_table(asg
, 2);
356 sg_set_page(asg
, sg_page(assoc
), assoc
->length
, assoc
->offset
);
357 authenc_chain(asg
, dst
, 0);
359 cryptlen
+= req
->assoclen
;
362 areq_ctx
->cryptlen
= cryptlen
;
365 areq_ctx
->complete
= authenc_geniv_ahash_done
;
366 areq_ctx
->update_complete
= authenc_geniv_ahash_update_done
;
368 hash
= authenc_ahash_fn(req
, flags
);
370 return PTR_ERR(hash
);
372 scatterwalk_map_and_copy(hash
, dst
, cryptlen
,
373 crypto_aead_authsize(authenc
), 1);
377 static void crypto_authenc_encrypt_done(struct crypto_async_request
*req
,
380 struct aead_request
*areq
= req
->data
;
383 struct crypto_aead
*authenc
= crypto_aead_reqtfm(areq
);
384 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
385 struct ablkcipher_request
*abreq
= aead_request_ctx(areq
);
386 u8
*iv
= (u8
*)(abreq
+ 1) +
387 crypto_ablkcipher_reqsize(ctx
->enc
);
389 err
= crypto_authenc_genicv(areq
, iv
, 0);
392 authenc_request_complete(areq
, err
);
395 static int crypto_authenc_encrypt(struct aead_request
*req
)
397 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
398 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
399 struct authenc_request_ctx
*areq_ctx
= aead_request_ctx(req
);
400 struct crypto_ablkcipher
*enc
= ctx
->enc
;
401 struct scatterlist
*dst
= req
->dst
;
402 unsigned int cryptlen
= req
->cryptlen
;
403 struct ablkcipher_request
*abreq
= (void *)(areq_ctx
->tail
405 u8
*iv
= (u8
*)abreq
- crypto_ablkcipher_ivsize(enc
);
408 ablkcipher_request_set_tfm(abreq
, enc
);
409 ablkcipher_request_set_callback(abreq
, aead_request_flags(req
),
410 crypto_authenc_encrypt_done
, req
);
411 ablkcipher_request_set_crypt(abreq
, req
->src
, dst
, cryptlen
, req
->iv
);
413 memcpy(iv
, req
->iv
, crypto_aead_ivsize(authenc
));
415 err
= crypto_ablkcipher_encrypt(abreq
);
419 return crypto_authenc_genicv(req
, iv
, CRYPTO_TFM_REQ_MAY_SLEEP
);
422 static void crypto_authenc_givencrypt_done(struct crypto_async_request
*req
,
425 struct aead_request
*areq
= req
->data
;
428 struct skcipher_givcrypt_request
*greq
= aead_request_ctx(areq
);
430 err
= crypto_authenc_genicv(areq
, greq
->giv
, 0);
433 authenc_request_complete(areq
, err
);
436 static int crypto_authenc_givencrypt(struct aead_givcrypt_request
*req
)
438 struct crypto_aead
*authenc
= aead_givcrypt_reqtfm(req
);
439 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
440 struct aead_request
*areq
= &req
->areq
;
441 struct skcipher_givcrypt_request
*greq
= aead_request_ctx(areq
);
445 skcipher_givcrypt_set_tfm(greq
, ctx
->enc
);
446 skcipher_givcrypt_set_callback(greq
, aead_request_flags(areq
),
447 crypto_authenc_givencrypt_done
, areq
);
448 skcipher_givcrypt_set_crypt(greq
, areq
->src
, areq
->dst
, areq
->cryptlen
,
450 skcipher_givcrypt_set_giv(greq
, iv
, req
->seq
);
452 err
= crypto_skcipher_givencrypt(greq
);
456 return crypto_authenc_genicv(areq
, iv
, CRYPTO_TFM_REQ_MAY_SLEEP
);
459 static int crypto_authenc_verify(struct aead_request
*req
,
460 authenc_ahash_t authenc_ahash_fn
)
462 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
463 struct authenc_request_ctx
*areq_ctx
= aead_request_ctx(req
);
466 unsigned int authsize
;
468 areq_ctx
->complete
= authenc_verify_ahash_done
;
469 areq_ctx
->update_complete
= authenc_verify_ahash_update_done
;
471 ohash
= authenc_ahash_fn(req
, CRYPTO_TFM_REQ_MAY_SLEEP
);
473 return PTR_ERR(ohash
);
475 authsize
= crypto_aead_authsize(authenc
);
476 ihash
= ohash
+ authsize
;
477 scatterwalk_map_and_copy(ihash
, areq_ctx
->sg
, areq_ctx
->cryptlen
,
479 return memcmp(ihash
, ohash
, authsize
) ? -EBADMSG
: 0;
482 static int crypto_authenc_iverify(struct aead_request
*req
, u8
*iv
,
483 unsigned int cryptlen
)
485 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
486 struct authenc_request_ctx
*areq_ctx
= aead_request_ctx(req
);
487 struct scatterlist
*src
= req
->src
;
488 struct scatterlist
*assoc
= req
->assoc
;
489 struct scatterlist
*cipher
= areq_ctx
->cipher
;
490 struct scatterlist
*asg
= areq_ctx
->asg
;
491 unsigned int ivsize
= crypto_aead_ivsize(authenc
);
492 authenc_ahash_t authenc_ahash_fn
= crypto_authenc_ahash_fb
;
497 vsrc
= PageHighMem(srcp
) ? NULL
: page_address(srcp
) + src
->offset
;
500 sg_init_table(cipher
, 2);
501 sg_set_buf(cipher
, iv
, ivsize
);
502 authenc_chain(cipher
, src
, vsrc
== iv
+ ivsize
);
507 if (sg_is_last(assoc
)) {
508 authenc_ahash_fn
= crypto_authenc_ahash
;
509 sg_init_table(asg
, 2);
510 sg_set_page(asg
, sg_page(assoc
), assoc
->length
, assoc
->offset
);
511 authenc_chain(asg
, src
, 0);
513 cryptlen
+= req
->assoclen
;
516 areq_ctx
->cryptlen
= cryptlen
;
519 return crypto_authenc_verify(req
, authenc_ahash_fn
);
522 static int crypto_authenc_decrypt(struct aead_request
*req
)
524 struct crypto_aead
*authenc
= crypto_aead_reqtfm(req
);
525 struct crypto_authenc_ctx
*ctx
= crypto_aead_ctx(authenc
);
526 struct ablkcipher_request
*abreq
= aead_request_ctx(req
);
527 unsigned int cryptlen
= req
->cryptlen
;
528 unsigned int authsize
= crypto_aead_authsize(authenc
);
532 if (cryptlen
< authsize
)
534 cryptlen
-= authsize
;
536 err
= crypto_authenc_iverify(req
, iv
, cryptlen
);
540 ablkcipher_request_set_tfm(abreq
, ctx
->enc
);
541 ablkcipher_request_set_callback(abreq
, aead_request_flags(req
),
542 req
->base
.complete
, req
->base
.data
);
543 ablkcipher_request_set_crypt(abreq
, req
->src
, req
->dst
, cryptlen
, iv
);
545 return crypto_ablkcipher_decrypt(abreq
);
548 static int crypto_authenc_init_tfm(struct crypto_tfm
*tfm
)
550 struct crypto_instance
*inst
= crypto_tfm_alg_instance(tfm
);
551 struct authenc_instance_ctx
*ictx
= crypto_instance_ctx(inst
);
552 struct crypto_authenc_ctx
*ctx
= crypto_tfm_ctx(tfm
);
553 struct crypto_ahash
*auth
;
554 struct crypto_ablkcipher
*enc
;
557 auth
= crypto_spawn_ahash(&ictx
->auth
);
559 return PTR_ERR(auth
);
561 enc
= crypto_spawn_skcipher(&ictx
->enc
);
569 ctx
->reqoff
= ALIGN(2 * crypto_ahash_digestsize(auth
) +
570 crypto_ahash_alignmask(auth
),
571 crypto_ahash_alignmask(auth
) + 1) +
572 crypto_ablkcipher_ivsize(enc
);
574 tfm
->crt_aead
.reqsize
= sizeof(struct authenc_request_ctx
) +
577 crypto_ahash_reqsize(auth
) +
578 sizeof(struct ahash_request
),
579 sizeof(struct skcipher_givcrypt_request
) +
580 crypto_ablkcipher_reqsize(enc
));
585 crypto_free_ahash(auth
);
589 static void crypto_authenc_exit_tfm(struct crypto_tfm
*tfm
)
591 struct crypto_authenc_ctx
*ctx
= crypto_tfm_ctx(tfm
);
593 crypto_free_ahash(ctx
->auth
);
594 crypto_free_ablkcipher(ctx
->enc
);
597 static struct crypto_instance
*crypto_authenc_alloc(struct rtattr
**tb
)
599 struct crypto_attr_type
*algt
;
600 struct crypto_instance
*inst
;
601 struct hash_alg_common
*auth
;
602 struct crypto_alg
*auth_base
;
603 struct crypto_alg
*enc
;
604 struct authenc_instance_ctx
*ctx
;
605 const char *enc_name
;
608 algt
= crypto_get_attr_type(tb
);
613 if ((algt
->type
^ CRYPTO_ALG_TYPE_AEAD
) & algt
->mask
)
614 return ERR_PTR(-EINVAL
);
616 auth
= ahash_attr_alg(tb
[1], CRYPTO_ALG_TYPE_HASH
,
617 CRYPTO_ALG_TYPE_AHASH_MASK
);
619 return ERR_CAST(auth
);
621 auth_base
= &auth
->base
;
623 enc_name
= crypto_attr_alg_name(tb
[2]);
624 err
= PTR_ERR(enc_name
);
625 if (IS_ERR(enc_name
))
628 inst
= kzalloc(sizeof(*inst
) + sizeof(*ctx
), GFP_KERNEL
);
633 ctx
= crypto_instance_ctx(inst
);
635 err
= crypto_init_ahash_spawn(&ctx
->auth
, auth
, inst
);
639 crypto_set_skcipher_spawn(&ctx
->enc
, inst
);
640 err
= crypto_grab_skcipher(&ctx
->enc
, enc_name
, 0,
641 crypto_requires_sync(algt
->type
,
646 enc
= crypto_skcipher_spawn_alg(&ctx
->enc
);
649 if (snprintf(inst
->alg
.cra_name
, CRYPTO_MAX_ALG_NAME
,
650 "authenc(%s,%s)", auth_base
->cra_name
, enc
->cra_name
) >=
654 if (snprintf(inst
->alg
.cra_driver_name
, CRYPTO_MAX_ALG_NAME
,
655 "authenc(%s,%s)", auth_base
->cra_driver_name
,
656 enc
->cra_driver_name
) >= CRYPTO_MAX_ALG_NAME
)
659 inst
->alg
.cra_flags
= CRYPTO_ALG_TYPE_AEAD
;
660 inst
->alg
.cra_flags
|= enc
->cra_flags
& CRYPTO_ALG_ASYNC
;
661 inst
->alg
.cra_priority
= enc
->cra_priority
*
662 10 + auth_base
->cra_priority
;
663 inst
->alg
.cra_blocksize
= enc
->cra_blocksize
;
664 inst
->alg
.cra_alignmask
= auth_base
->cra_alignmask
| enc
->cra_alignmask
;
665 inst
->alg
.cra_type
= &crypto_aead_type
;
667 inst
->alg
.cra_aead
.ivsize
= enc
->cra_ablkcipher
.ivsize
;
668 inst
->alg
.cra_aead
.maxauthsize
= auth
->digestsize
;
670 inst
->alg
.cra_ctxsize
= sizeof(struct crypto_authenc_ctx
);
672 inst
->alg
.cra_init
= crypto_authenc_init_tfm
;
673 inst
->alg
.cra_exit
= crypto_authenc_exit_tfm
;
675 inst
->alg
.cra_aead
.setkey
= crypto_authenc_setkey
;
676 inst
->alg
.cra_aead
.encrypt
= crypto_authenc_encrypt
;
677 inst
->alg
.cra_aead
.decrypt
= crypto_authenc_decrypt
;
678 inst
->alg
.cra_aead
.givencrypt
= crypto_authenc_givencrypt
;
681 crypto_mod_put(auth_base
);
685 crypto_drop_skcipher(&ctx
->enc
);
687 crypto_drop_ahash(&ctx
->auth
);
695 static void crypto_authenc_free(struct crypto_instance
*inst
)
697 struct authenc_instance_ctx
*ctx
= crypto_instance_ctx(inst
);
699 crypto_drop_skcipher(&ctx
->enc
);
700 crypto_drop_ahash(&ctx
->auth
);
704 static struct crypto_template crypto_authenc_tmpl
= {
706 .alloc
= crypto_authenc_alloc
,
707 .free
= crypto_authenc_free
,
708 .module
= THIS_MODULE
,
711 static int __init
crypto_authenc_module_init(void)
713 return crypto_register_template(&crypto_authenc_tmpl
);
716 static void __exit
crypto_authenc_module_exit(void)
718 crypto_unregister_template(&crypto_authenc_tmpl
);
721 module_init(crypto_authenc_module_init
);
722 module_exit(crypto_authenc_module_exit
);
724 MODULE_LICENSE("GPL");
725 MODULE_DESCRIPTION("Simple AEAD wrapper for IPsec");