2 * AEAD: Authenticated Encryption with Associated Data
4 * This file provides API support for AEAD algorithms.
6 * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au>
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
15 #include <crypto/internal/geniv.h>
16 #include <crypto/scatterwalk.h>
17 #include <linux/err.h>
18 #include <linux/init.h>
19 #include <linux/kernel.h>
20 #include <linux/module.h>
21 #include <linux/rtnetlink.h>
22 #include <linux/sched.h>
23 #include <linux/slab.h>
24 #include <linux/seq_file.h>
25 #include <linux/cryptouser.h>
26 #include <net/netlink.h>
30 struct compat_request_ctx
{
31 struct scatterlist src
[2];
32 struct scatterlist dst
[2];
33 struct scatterlist ivbuf
[2];
34 struct scatterlist
*ivsg
;
35 struct aead_givcrypt_request subreq
;
38 static int aead_null_givencrypt(struct aead_givcrypt_request
*req
);
39 static int aead_null_givdecrypt(struct aead_givcrypt_request
*req
);
41 static int setkey_unaligned(struct crypto_aead
*tfm
, const u8
*key
,
44 unsigned long alignmask
= crypto_aead_alignmask(tfm
);
46 u8
*buffer
, *alignbuffer
;
49 absize
= keylen
+ alignmask
;
50 buffer
= kmalloc(absize
, GFP_ATOMIC
);
54 alignbuffer
= (u8
*)ALIGN((unsigned long)buffer
, alignmask
+ 1);
55 memcpy(alignbuffer
, key
, keylen
);
56 ret
= tfm
->setkey(tfm
, alignbuffer
, keylen
);
57 memset(alignbuffer
, 0, keylen
);
62 int crypto_aead_setkey(struct crypto_aead
*tfm
,
63 const u8
*key
, unsigned int keylen
)
65 unsigned long alignmask
= crypto_aead_alignmask(tfm
);
69 if ((unsigned long)key
& alignmask
)
70 return setkey_unaligned(tfm
, key
, keylen
);
72 return tfm
->setkey(tfm
, key
, keylen
);
74 EXPORT_SYMBOL_GPL(crypto_aead_setkey
);
76 int crypto_aead_setauthsize(struct crypto_aead
*tfm
, unsigned int authsize
)
80 if (authsize
> crypto_aead_maxauthsize(tfm
))
83 if (tfm
->setauthsize
) {
84 err
= tfm
->setauthsize(tfm
->child
, authsize
);
89 tfm
->child
->authsize
= authsize
;
90 tfm
->authsize
= authsize
;
93 EXPORT_SYMBOL_GPL(crypto_aead_setauthsize
);
95 struct aead_old_request
{
96 struct scatterlist srcbuf
[2];
97 struct scatterlist dstbuf
[2];
98 struct aead_request subreq
;
101 unsigned int crypto_aead_reqsize(struct crypto_aead
*tfm
)
103 return tfm
->reqsize
+ sizeof(struct aead_old_request
);
105 EXPORT_SYMBOL_GPL(crypto_aead_reqsize
);
107 static int old_crypt(struct aead_request
*req
,
108 int (*crypt
)(struct aead_request
*req
))
110 struct aead_old_request
*nreq
= aead_request_ctx(req
);
111 struct crypto_aead
*aead
= crypto_aead_reqtfm(req
);
112 struct scatterlist
*src
, *dst
;
117 src
= scatterwalk_ffwd(nreq
->srcbuf
, req
->src
, req
->assoclen
);
118 dst
= req
->src
== req
->dst
?
119 src
: scatterwalk_ffwd(nreq
->dstbuf
, req
->dst
, req
->assoclen
);
121 aead_request_set_tfm(&nreq
->subreq
, aead
);
122 aead_request_set_callback(&nreq
->subreq
, aead_request_flags(req
),
123 req
->base
.complete
, req
->base
.data
);
124 aead_request_set_crypt(&nreq
->subreq
, src
, dst
, req
->cryptlen
,
126 aead_request_set_assoc(&nreq
->subreq
, req
->src
, req
->assoclen
);
128 return crypt(&nreq
->subreq
);
131 static int old_encrypt(struct aead_request
*req
)
133 struct crypto_aead
*aead
= crypto_aead_reqtfm(req
);
134 struct old_aead_alg
*alg
= crypto_old_aead_alg(aead
);
136 return old_crypt(req
, alg
->encrypt
);
139 static int old_decrypt(struct aead_request
*req
)
141 struct crypto_aead
*aead
= crypto_aead_reqtfm(req
);
142 struct old_aead_alg
*alg
= crypto_old_aead_alg(aead
);
144 return old_crypt(req
, alg
->decrypt
);
147 static int no_givcrypt(struct aead_givcrypt_request
*req
)
152 static int crypto_old_aead_init_tfm(struct crypto_tfm
*tfm
)
154 struct old_aead_alg
*alg
= &tfm
->__crt_alg
->cra_aead
;
155 struct crypto_aead
*crt
= __crypto_aead_cast(tfm
);
157 if (max(alg
->maxauthsize
, alg
->ivsize
) > PAGE_SIZE
/ 8)
160 crt
->setkey
= alg
->setkey
;
161 crt
->setauthsize
= alg
->setauthsize
;
162 crt
->encrypt
= old_encrypt
;
163 crt
->decrypt
= old_decrypt
;
165 crt
->givencrypt
= alg
->givencrypt
?: no_givcrypt
;
166 crt
->givdecrypt
= alg
->givdecrypt
?: no_givcrypt
;
168 crt
->givencrypt
= aead_null_givencrypt
;
169 crt
->givdecrypt
= aead_null_givdecrypt
;
171 crt
->child
= __crypto_aead_cast(tfm
);
172 crt
->authsize
= alg
->maxauthsize
;
177 static void crypto_aead_exit_tfm(struct crypto_tfm
*tfm
)
179 struct crypto_aead
*aead
= __crypto_aead_cast(tfm
);
180 struct aead_alg
*alg
= crypto_aead_alg(aead
);
185 static int crypto_aead_init_tfm(struct crypto_tfm
*tfm
)
187 struct crypto_aead
*aead
= __crypto_aead_cast(tfm
);
188 struct aead_alg
*alg
= crypto_aead_alg(aead
);
190 if (crypto_old_aead_alg(aead
)->encrypt
)
191 return crypto_old_aead_init_tfm(tfm
);
193 aead
->setkey
= alg
->setkey
;
194 aead
->setauthsize
= alg
->setauthsize
;
195 aead
->encrypt
= alg
->encrypt
;
196 aead
->decrypt
= alg
->decrypt
;
197 aead
->child
= __crypto_aead_cast(tfm
);
198 aead
->authsize
= alg
->maxauthsize
;
201 aead
->base
.exit
= crypto_aead_exit_tfm
;
204 return alg
->init(aead
);
210 static int crypto_old_aead_report(struct sk_buff
*skb
, struct crypto_alg
*alg
)
212 struct crypto_report_aead raead
;
213 struct old_aead_alg
*aead
= &alg
->cra_aead
;
215 strncpy(raead
.type
, "aead", sizeof(raead
.type
));
216 strncpy(raead
.geniv
, aead
->geniv
?: "<built-in>", sizeof(raead
.geniv
));
218 raead
.blocksize
= alg
->cra_blocksize
;
219 raead
.maxauthsize
= aead
->maxauthsize
;
220 raead
.ivsize
= aead
->ivsize
;
222 if (nla_put(skb
, CRYPTOCFGA_REPORT_AEAD
,
223 sizeof(struct crypto_report_aead
), &raead
))
224 goto nla_put_failure
;
231 static int crypto_old_aead_report(struct sk_buff
*skb
, struct crypto_alg
*alg
)
237 static void crypto_old_aead_show(struct seq_file
*m
, struct crypto_alg
*alg
)
238 __attribute__ ((unused
));
239 static void crypto_old_aead_show(struct seq_file
*m
, struct crypto_alg
*alg
)
241 struct old_aead_alg
*aead
= &alg
->cra_aead
;
243 seq_printf(m
, "type : aead\n");
244 seq_printf(m
, "async : %s\n", alg
->cra_flags
& CRYPTO_ALG_ASYNC
?
246 seq_printf(m
, "blocksize : %u\n", alg
->cra_blocksize
);
247 seq_printf(m
, "ivsize : %u\n", aead
->ivsize
);
248 seq_printf(m
, "maxauthsize : %u\n", aead
->maxauthsize
);
249 seq_printf(m
, "geniv : %s\n", aead
->geniv
?: "<built-in>");
252 const struct crypto_type crypto_aead_type
= {
253 .extsize
= crypto_alg_extsize
,
254 .init_tfm
= crypto_aead_init_tfm
,
255 #ifdef CONFIG_PROC_FS
256 .show
= crypto_old_aead_show
,
258 .report
= crypto_old_aead_report
,
259 .lookup
= crypto_lookup_aead
,
260 .maskclear
= ~(CRYPTO_ALG_TYPE_MASK
| CRYPTO_ALG_GENIV
),
261 .maskset
= CRYPTO_ALG_TYPE_MASK
,
262 .type
= CRYPTO_ALG_TYPE_AEAD
,
263 .tfmsize
= offsetof(struct crypto_aead
, base
),
265 EXPORT_SYMBOL_GPL(crypto_aead_type
);
268 static int crypto_aead_report(struct sk_buff
*skb
, struct crypto_alg
*alg
)
270 struct crypto_report_aead raead
;
271 struct aead_alg
*aead
= container_of(alg
, struct aead_alg
, base
);
273 strncpy(raead
.type
, "aead", sizeof(raead
.type
));
274 strncpy(raead
.geniv
, "<none>", sizeof(raead
.geniv
));
276 raead
.blocksize
= alg
->cra_blocksize
;
277 raead
.maxauthsize
= aead
->maxauthsize
;
278 raead
.ivsize
= aead
->ivsize
;
280 if (nla_put(skb
, CRYPTOCFGA_REPORT_AEAD
,
281 sizeof(struct crypto_report_aead
), &raead
))
282 goto nla_put_failure
;
289 static int crypto_aead_report(struct sk_buff
*skb
, struct crypto_alg
*alg
)
295 static void crypto_aead_show(struct seq_file
*m
, struct crypto_alg
*alg
)
296 __attribute__ ((unused
));
297 static void crypto_aead_show(struct seq_file
*m
, struct crypto_alg
*alg
)
299 struct aead_alg
*aead
= container_of(alg
, struct aead_alg
, base
);
301 seq_printf(m
, "type : aead\n");
302 seq_printf(m
, "async : %s\n", alg
->cra_flags
& CRYPTO_ALG_ASYNC
?
304 seq_printf(m
, "blocksize : %u\n", alg
->cra_blocksize
);
305 seq_printf(m
, "ivsize : %u\n", aead
->ivsize
);
306 seq_printf(m
, "maxauthsize : %u\n", aead
->maxauthsize
);
307 seq_printf(m
, "geniv : <none>\n");
310 static const struct crypto_type crypto_new_aead_type
= {
311 .extsize
= crypto_alg_extsize
,
312 .init_tfm
= crypto_aead_init_tfm
,
313 #ifdef CONFIG_PROC_FS
314 .show
= crypto_aead_show
,
316 .report
= crypto_aead_report
,
317 .maskclear
= ~CRYPTO_ALG_TYPE_MASK
,
318 .maskset
= CRYPTO_ALG_TYPE_MASK
,
319 .type
= CRYPTO_ALG_TYPE_AEAD
,
320 .tfmsize
= offsetof(struct crypto_aead
, base
),
323 static int aead_null_givencrypt(struct aead_givcrypt_request
*req
)
325 return crypto_aead_encrypt(&req
->areq
);
328 static int aead_null_givdecrypt(struct aead_givcrypt_request
*req
)
330 return crypto_aead_decrypt(&req
->areq
);
334 static int crypto_nivaead_report(struct sk_buff
*skb
, struct crypto_alg
*alg
)
336 struct crypto_report_aead raead
;
337 struct old_aead_alg
*aead
= &alg
->cra_aead
;
339 strncpy(raead
.type
, "nivaead", sizeof(raead
.type
));
340 strncpy(raead
.geniv
, aead
->geniv
, sizeof(raead
.geniv
));
342 raead
.blocksize
= alg
->cra_blocksize
;
343 raead
.maxauthsize
= aead
->maxauthsize
;
344 raead
.ivsize
= aead
->ivsize
;
346 if (nla_put(skb
, CRYPTOCFGA_REPORT_AEAD
,
347 sizeof(struct crypto_report_aead
), &raead
))
348 goto nla_put_failure
;
355 static int crypto_nivaead_report(struct sk_buff
*skb
, struct crypto_alg
*alg
)
362 static void crypto_nivaead_show(struct seq_file
*m
, struct crypto_alg
*alg
)
363 __attribute__ ((unused
));
364 static void crypto_nivaead_show(struct seq_file
*m
, struct crypto_alg
*alg
)
366 struct old_aead_alg
*aead
= &alg
->cra_aead
;
368 seq_printf(m
, "type : nivaead\n");
369 seq_printf(m
, "async : %s\n", alg
->cra_flags
& CRYPTO_ALG_ASYNC
?
371 seq_printf(m
, "blocksize : %u\n", alg
->cra_blocksize
);
372 seq_printf(m
, "ivsize : %u\n", aead
->ivsize
);
373 seq_printf(m
, "maxauthsize : %u\n", aead
->maxauthsize
);
374 seq_printf(m
, "geniv : %s\n", aead
->geniv
);
377 const struct crypto_type crypto_nivaead_type
= {
378 .extsize
= crypto_alg_extsize
,
379 .init_tfm
= crypto_aead_init_tfm
,
380 #ifdef CONFIG_PROC_FS
381 .show
= crypto_nivaead_show
,
383 .report
= crypto_nivaead_report
,
384 .maskclear
= ~(CRYPTO_ALG_TYPE_MASK
| CRYPTO_ALG_GENIV
),
385 .maskset
= CRYPTO_ALG_TYPE_MASK
| CRYPTO_ALG_GENIV
,
386 .type
= CRYPTO_ALG_TYPE_AEAD
,
387 .tfmsize
= offsetof(struct crypto_aead
, base
),
389 EXPORT_SYMBOL_GPL(crypto_nivaead_type
);
391 static int crypto_grab_nivaead(struct crypto_aead_spawn
*spawn
,
392 const char *name
, u32 type
, u32 mask
)
394 spawn
->base
.frontend
= &crypto_nivaead_type
;
395 return crypto_grab_spawn(&spawn
->base
, name
, type
, mask
);
398 static int aead_geniv_setkey(struct crypto_aead
*tfm
,
399 const u8
*key
, unsigned int keylen
)
401 struct aead_geniv_ctx
*ctx
= crypto_aead_ctx(tfm
);
403 return crypto_aead_setkey(ctx
->child
, key
, keylen
);
406 static int aead_geniv_setauthsize(struct crypto_aead
*tfm
,
407 unsigned int authsize
)
409 struct aead_geniv_ctx
*ctx
= crypto_aead_ctx(tfm
);
411 return crypto_aead_setauthsize(ctx
->child
, authsize
);
414 static void compat_encrypt_complete2(struct aead_request
*req
, int err
)
416 struct compat_request_ctx
*rctx
= aead_request_ctx(req
);
417 struct aead_givcrypt_request
*subreq
= &rctx
->subreq
;
418 struct crypto_aead
*geniv
;
420 if (err
== -EINPROGRESS
)
426 geniv
= crypto_aead_reqtfm(req
);
427 scatterwalk_map_and_copy(subreq
->giv
, rctx
->ivsg
, 0,
428 crypto_aead_ivsize(geniv
), 1);
434 static void compat_encrypt_complete(struct crypto_async_request
*base
, int err
)
436 struct aead_request
*req
= base
->data
;
438 compat_encrypt_complete2(req
, err
);
439 aead_request_complete(req
, err
);
442 static int compat_encrypt(struct aead_request
*req
)
444 struct crypto_aead
*geniv
= crypto_aead_reqtfm(req
);
445 struct aead_geniv_ctx
*ctx
= crypto_aead_ctx(geniv
);
446 struct compat_request_ctx
*rctx
= aead_request_ctx(req
);
447 struct aead_givcrypt_request
*subreq
= &rctx
->subreq
;
448 unsigned int ivsize
= crypto_aead_ivsize(geniv
);
449 struct scatterlist
*src
, *dst
;
450 crypto_completion_t
compl;
456 if (req
->cryptlen
< ivsize
)
459 compl = req
->base
.complete
;
460 data
= req
->base
.data
;
462 rctx
->ivsg
= scatterwalk_ffwd(rctx
->ivbuf
, req
->dst
, req
->assoclen
);
463 info
= PageHighMem(sg_page(rctx
->ivsg
)) ? NULL
: sg_virt(rctx
->ivsg
);
466 info
= kmalloc(ivsize
, req
->base
.flags
&
467 CRYPTO_TFM_REQ_MAY_SLEEP
? GFP_KERNEL
:
472 compl = compat_encrypt_complete
;
476 memcpy(&seq
, req
->iv
+ ivsize
- sizeof(seq
), sizeof(seq
));
478 src
= scatterwalk_ffwd(rctx
->src
, req
->src
, req
->assoclen
+ ivsize
);
479 dst
= req
->src
== req
->dst
?
480 src
: scatterwalk_ffwd(rctx
->dst
, rctx
->ivsg
, ivsize
);
482 aead_givcrypt_set_tfm(subreq
, ctx
->child
);
483 aead_givcrypt_set_callback(subreq
, req
->base
.flags
,
484 req
->base
.complete
, req
->base
.data
);
485 aead_givcrypt_set_crypt(subreq
, src
, dst
,
486 req
->cryptlen
- ivsize
, req
->iv
);
487 aead_givcrypt_set_assoc(subreq
, req
->src
, req
->assoclen
);
488 aead_givcrypt_set_giv(subreq
, info
, be64_to_cpu(seq
));
490 err
= crypto_aead_givencrypt(subreq
);
491 if (unlikely(PageHighMem(sg_page(rctx
->ivsg
))))
492 compat_encrypt_complete2(req
, err
);
496 static int compat_decrypt(struct aead_request
*req
)
498 struct crypto_aead
*geniv
= crypto_aead_reqtfm(req
);
499 struct aead_geniv_ctx
*ctx
= crypto_aead_ctx(geniv
);
500 struct compat_request_ctx
*rctx
= aead_request_ctx(req
);
501 struct aead_request
*subreq
= &rctx
->subreq
.areq
;
502 unsigned int ivsize
= crypto_aead_ivsize(geniv
);
503 struct scatterlist
*src
, *dst
;
504 crypto_completion_t
compl;
507 if (req
->cryptlen
< ivsize
)
510 aead_request_set_tfm(subreq
, ctx
->child
);
512 compl = req
->base
.complete
;
513 data
= req
->base
.data
;
515 src
= scatterwalk_ffwd(rctx
->src
, req
->src
, req
->assoclen
+ ivsize
);
516 dst
= req
->src
== req
->dst
?
517 src
: scatterwalk_ffwd(rctx
->dst
, req
->dst
,
518 req
->assoclen
+ ivsize
);
520 aead_request_set_callback(subreq
, req
->base
.flags
, compl, data
);
521 aead_request_set_crypt(subreq
, src
, dst
,
522 req
->cryptlen
- ivsize
, req
->iv
);
523 aead_request_set_assoc(subreq
, req
->src
, req
->assoclen
);
525 scatterwalk_map_and_copy(req
->iv
, req
->src
, req
->assoclen
, ivsize
, 0);
527 return crypto_aead_decrypt(subreq
);
530 static int compat_encrypt_first(struct aead_request
*req
)
532 struct crypto_aead
*geniv
= crypto_aead_reqtfm(req
);
533 struct aead_geniv_ctx
*ctx
= crypto_aead_ctx(geniv
);
536 spin_lock_bh(&ctx
->lock
);
537 if (geniv
->encrypt
!= compat_encrypt_first
)
540 geniv
->encrypt
= compat_encrypt
;
543 spin_unlock_bh(&ctx
->lock
);
548 return compat_encrypt(req
);
551 static int aead_geniv_init_compat(struct crypto_tfm
*tfm
)
553 struct crypto_aead
*geniv
= __crypto_aead_cast(tfm
);
554 struct aead_geniv_ctx
*ctx
= crypto_aead_ctx(geniv
);
557 spin_lock_init(&ctx
->lock
);
559 crypto_aead_set_reqsize(geniv
, sizeof(struct compat_request_ctx
));
561 err
= aead_geniv_init(tfm
);
563 ctx
->child
= geniv
->child
;
564 geniv
->child
= geniv
;
569 static void aead_geniv_exit_compat(struct crypto_tfm
*tfm
)
571 struct crypto_aead
*geniv
= __crypto_aead_cast(tfm
);
572 struct aead_geniv_ctx
*ctx
= crypto_aead_ctx(geniv
);
574 crypto_free_aead(ctx
->child
);
577 struct aead_instance
*aead_geniv_alloc(struct crypto_template
*tmpl
,
578 struct rtattr
**tb
, u32 type
, u32 mask
)
581 struct crypto_aead_spawn
*spawn
;
582 struct crypto_attr_type
*algt
;
583 struct aead_instance
*inst
;
584 struct aead_alg
*alg
;
586 unsigned int maxauthsize
;
589 algt
= crypto_get_attr_type(tb
);
591 return ERR_CAST(algt
);
593 if ((algt
->type
^ (CRYPTO_ALG_TYPE_AEAD
| CRYPTO_ALG_GENIV
)) &
595 return ERR_PTR(-EINVAL
);
597 name
= crypto_attr_alg_name(tb
[1]);
599 return ERR_CAST(name
);
601 inst
= kzalloc(sizeof(*inst
) + sizeof(*spawn
), GFP_KERNEL
);
603 return ERR_PTR(-ENOMEM
);
605 spawn
= aead_instance_ctx(inst
);
607 /* Ignore async algorithms if necessary. */
608 mask
|= crypto_requires_sync(algt
->type
, algt
->mask
);
610 crypto_set_aead_spawn(spawn
, aead_crypto_instance(inst
));
611 err
= (algt
->mask
& CRYPTO_ALG_GENIV
) ?
612 crypto_grab_nivaead(spawn
, name
, type
, mask
) :
613 crypto_grab_aead(spawn
, name
, type
, mask
);
617 alg
= crypto_spawn_aead_alg(spawn
);
619 ivsize
= crypto_aead_alg_ivsize(alg
);
620 maxauthsize
= crypto_aead_alg_maxauthsize(alg
);
623 if (ivsize
< sizeof(u64
))
627 * This is only true if we're constructing an algorithm with its
628 * default IV generator. For the default generator we elide the
629 * template name and double-check the IV generator.
631 if (algt
->mask
& CRYPTO_ALG_GENIV
) {
632 if (!alg
->base
.cra_aead
.encrypt
)
634 if (strcmp(tmpl
->name
, alg
->base
.cra_aead
.geniv
))
637 memcpy(inst
->alg
.base
.cra_name
, alg
->base
.cra_name
,
638 CRYPTO_MAX_ALG_NAME
);
639 memcpy(inst
->alg
.base
.cra_driver_name
,
640 alg
->base
.cra_driver_name
, CRYPTO_MAX_ALG_NAME
);
642 inst
->alg
.base
.cra_flags
= CRYPTO_ALG_TYPE_AEAD
|
644 inst
->alg
.base
.cra_flags
|= alg
->base
.cra_flags
&
646 inst
->alg
.base
.cra_priority
= alg
->base
.cra_priority
;
647 inst
->alg
.base
.cra_blocksize
= alg
->base
.cra_blocksize
;
648 inst
->alg
.base
.cra_alignmask
= alg
->base
.cra_alignmask
;
649 inst
->alg
.base
.cra_type
= &crypto_aead_type
;
651 inst
->alg
.base
.cra_aead
.ivsize
= ivsize
;
652 inst
->alg
.base
.cra_aead
.maxauthsize
= maxauthsize
;
654 inst
->alg
.base
.cra_aead
.setkey
= alg
->base
.cra_aead
.setkey
;
655 inst
->alg
.base
.cra_aead
.setauthsize
=
656 alg
->base
.cra_aead
.setauthsize
;
657 inst
->alg
.base
.cra_aead
.encrypt
= alg
->base
.cra_aead
.encrypt
;
658 inst
->alg
.base
.cra_aead
.decrypt
= alg
->base
.cra_aead
.decrypt
;
664 if (snprintf(inst
->alg
.base
.cra_name
, CRYPTO_MAX_ALG_NAME
,
665 "%s(%s)", tmpl
->name
, alg
->base
.cra_name
) >=
668 if (snprintf(inst
->alg
.base
.cra_driver_name
, CRYPTO_MAX_ALG_NAME
,
669 "%s(%s)", tmpl
->name
, alg
->base
.cra_driver_name
) >=
673 inst
->alg
.base
.cra_flags
= alg
->base
.cra_flags
& CRYPTO_ALG_ASYNC
;
674 inst
->alg
.base
.cra_priority
= alg
->base
.cra_priority
;
675 inst
->alg
.base
.cra_blocksize
= alg
->base
.cra_blocksize
;
676 inst
->alg
.base
.cra_alignmask
= alg
->base
.cra_alignmask
;
677 inst
->alg
.base
.cra_ctxsize
= sizeof(struct aead_geniv_ctx
);
679 inst
->alg
.setkey
= aead_geniv_setkey
;
680 inst
->alg
.setauthsize
= aead_geniv_setauthsize
;
682 inst
->alg
.ivsize
= ivsize
;
683 inst
->alg
.maxauthsize
= maxauthsize
;
685 inst
->alg
.encrypt
= compat_encrypt_first
;
686 inst
->alg
.decrypt
= compat_decrypt
;
688 inst
->alg
.base
.cra_init
= aead_geniv_init_compat
;
689 inst
->alg
.base
.cra_exit
= aead_geniv_exit_compat
;
695 crypto_drop_aead(spawn
);
701 EXPORT_SYMBOL_GPL(aead_geniv_alloc
);
703 void aead_geniv_free(struct aead_instance
*inst
)
705 crypto_drop_aead(aead_instance_ctx(inst
));
708 EXPORT_SYMBOL_GPL(aead_geniv_free
);
710 int aead_geniv_init(struct crypto_tfm
*tfm
)
712 struct crypto_instance
*inst
= (void *)tfm
->__crt_alg
;
713 struct crypto_aead
*child
;
714 struct crypto_aead
*aead
;
716 aead
= __crypto_aead_cast(tfm
);
718 child
= crypto_spawn_aead(crypto_instance_ctx(inst
));
720 return PTR_ERR(child
);
723 aead
->reqsize
+= crypto_aead_reqsize(child
);
727 EXPORT_SYMBOL_GPL(aead_geniv_init
);
729 void aead_geniv_exit(struct crypto_tfm
*tfm
)
731 crypto_free_aead(__crypto_aead_cast(tfm
)->child
);
733 EXPORT_SYMBOL_GPL(aead_geniv_exit
);
735 static int crypto_nivaead_default(struct crypto_alg
*alg
, u32 type
, u32 mask
)
737 struct rtattr
*tb
[3];
740 struct crypto_attr_type data
;
744 struct crypto_attr_alg data
;
746 struct crypto_template
*tmpl
;
747 struct crypto_instance
*inst
;
748 struct crypto_alg
*larval
;
752 larval
= crypto_larval_lookup(alg
->cra_driver_name
,
753 CRYPTO_ALG_TYPE_AEAD
| CRYPTO_ALG_GENIV
,
754 CRYPTO_ALG_TYPE_MASK
| CRYPTO_ALG_GENIV
);
755 err
= PTR_ERR(larval
);
760 if (!crypto_is_larval(larval
))
763 ptype
.attr
.rta_len
= sizeof(ptype
);
764 ptype
.attr
.rta_type
= CRYPTOA_TYPE
;
765 ptype
.data
.type
= type
| CRYPTO_ALG_GENIV
;
766 /* GENIV tells the template that we're making a default geniv. */
767 ptype
.data
.mask
= mask
| CRYPTO_ALG_GENIV
;
770 palg
.attr
.rta_len
= sizeof(palg
);
771 palg
.attr
.rta_type
= CRYPTOA_ALG
;
772 /* Must use the exact name to locate ourselves. */
773 memcpy(palg
.data
.name
, alg
->cra_driver_name
, CRYPTO_MAX_ALG_NAME
);
778 geniv
= alg
->cra_aead
.geniv
;
780 tmpl
= crypto_lookup_template(geniv
);
786 err
= tmpl
->create(tmpl
, tb
);
792 inst
= tmpl
->alloc(tb
);
797 err
= crypto_register_instance(tmpl
, inst
);
804 /* Redo the lookup to use the instance we just registered. */
808 crypto_tmpl_put(tmpl
);
810 crypto_larval_kill(larval
);
812 crypto_mod_put(larval
);
818 struct crypto_alg
*crypto_lookup_aead(const char *name
, u32 type
, u32 mask
)
820 struct crypto_alg
*alg
;
822 alg
= crypto_alg_mod_lookup(name
, type
, mask
);
826 if (alg
->cra_type
== &crypto_aead_type
)
829 if (!alg
->cra_aead
.ivsize
)
833 alg
= crypto_alg_mod_lookup(name
, type
| CRYPTO_ALG_TESTED
,
834 mask
& ~CRYPTO_ALG_TESTED
);
838 if (alg
->cra_type
== &crypto_aead_type
) {
839 if (~alg
->cra_flags
& (type
^ ~mask
) & CRYPTO_ALG_TESTED
) {
841 alg
= ERR_PTR(-ENOENT
);
846 BUG_ON(!alg
->cra_aead
.ivsize
);
848 return ERR_PTR(crypto_nivaead_default(alg
, type
, mask
));
850 EXPORT_SYMBOL_GPL(crypto_lookup_aead
);
852 int crypto_grab_aead(struct crypto_aead_spawn
*spawn
, const char *name
,
855 spawn
->base
.frontend
= &crypto_aead_type
;
856 return crypto_grab_spawn(&spawn
->base
, name
, type
, mask
);
858 EXPORT_SYMBOL_GPL(crypto_grab_aead
);
860 struct crypto_aead
*crypto_alloc_aead(const char *alg_name
, u32 type
, u32 mask
)
862 return crypto_alloc_tfm(alg_name
, &crypto_aead_type
, type
, mask
);
864 EXPORT_SYMBOL_GPL(crypto_alloc_aead
);
866 static int aead_prepare_alg(struct aead_alg
*alg
)
868 struct crypto_alg
*base
= &alg
->base
;
870 if (max(alg
->maxauthsize
, alg
->ivsize
) > PAGE_SIZE
/ 8)
873 base
->cra_type
= &crypto_new_aead_type
;
874 base
->cra_flags
&= ~CRYPTO_ALG_TYPE_MASK
;
875 base
->cra_flags
|= CRYPTO_ALG_TYPE_AEAD
;
880 int crypto_register_aead(struct aead_alg
*alg
)
882 struct crypto_alg
*base
= &alg
->base
;
885 err
= aead_prepare_alg(alg
);
889 return crypto_register_alg(base
);
891 EXPORT_SYMBOL_GPL(crypto_register_aead
);
893 void crypto_unregister_aead(struct aead_alg
*alg
)
895 crypto_unregister_alg(&alg
->base
);
897 EXPORT_SYMBOL_GPL(crypto_unregister_aead
);
899 int crypto_register_aeads(struct aead_alg
*algs
, int count
)
903 for (i
= 0; i
< count
; i
++) {
904 ret
= crypto_register_aead(&algs
[i
]);
912 for (--i
; i
>= 0; --i
)
913 crypto_unregister_aead(&algs
[i
]);
917 EXPORT_SYMBOL_GPL(crypto_register_aeads
);
919 void crypto_unregister_aeads(struct aead_alg
*algs
, int count
)
923 for (i
= count
- 1; i
>= 0; --i
)
924 crypto_unregister_aead(&algs
[i
]);
926 EXPORT_SYMBOL_GPL(crypto_unregister_aeads
);
928 int aead_register_instance(struct crypto_template
*tmpl
,
929 struct aead_instance
*inst
)
933 err
= aead_prepare_alg(&inst
->alg
);
937 return crypto_register_instance(tmpl
, aead_crypto_instance(inst
));
939 EXPORT_SYMBOL_GPL(aead_register_instance
);
941 MODULE_LICENSE("GPL");
942 MODULE_DESCRIPTION("Authenticated Encryption with Associated Data (AEAD)");