22 #include <linux/kernel.h>
23 #include <linux/module.h>
24 #include <linux/rtnetlink.h>
25 #include <linux/slab.h>
56 aead_request_complete(req, err);
59 static int crypto_authenc_esn_setkey(
struct crypto_aead *authenc_esn,
const u8 *
key,
62 unsigned int authkeylen;
63 unsigned int enckeylen;
67 struct rtattr *rta = (
void *)key;
84 if (keylen < enckeylen)
90 crypto_ahash_set_flags(auth, crypto_aead_get_flags(authenc_esn) &
93 crypto_aead_set_flags(authenc_esn, crypto_ahash_get_flags(auth) &
100 crypto_ablkcipher_set_flags(enc, crypto_aead_get_flags(authenc_esn) &
102 err = crypto_ablkcipher_setkey(enc, key + authkeylen, enckeylen);
103 crypto_aead_set_flags(authenc_esn, crypto_ablkcipher_get_flags(enc) &
118 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
126 ahash_request_set_crypt(ahreq, areq_ctx->
sg, ahreq->
result,
128 ahash_request_set_callback(ahreq, aead_request_flags(req) &
132 err = crypto_ahash_update(ahreq);
136 ahash_request_set_crypt(ahreq, areq_ctx->
tsg, ahreq->
result,
138 ahash_request_set_callback(ahreq, aead_request_flags(req) &
148 crypto_aead_authsize(authenc_esn), 1);
151 authenc_esn_request_complete(req, err);
158 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
166 ahash_request_set_crypt(ahreq, areq_ctx->
tsg, ahreq->
result,
168 ahash_request_set_callback(ahreq, aead_request_flags(req) &
178 crypto_aead_authsize(authenc_esn), 1);
181 authenc_esn_request_complete(req, err);
189 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
199 crypto_aead_authsize(authenc_esn), 1);
202 aead_request_complete(req, err);
210 unsigned int authsize;
213 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
217 unsigned int cryptlen = req->
cryptlen;
222 ahash_request_set_crypt(ahreq, areq_ctx->
sg, ahreq->
result,
225 ahash_request_set_callback(ahreq,
226 aead_request_flags(req) &
230 err = crypto_ahash_update(ahreq);
234 ahash_request_set_crypt(ahreq, areq_ctx->
tsg, ahreq->
result,
236 ahash_request_set_callback(ahreq, aead_request_flags(req) &
244 authsize = crypto_aead_authsize(authenc_esn);
245 cryptlen -= authsize;
246 ihash = ahreq->
result + authsize;
254 abreq = aead_request_ctx(req);
255 ablkcipher_request_set_tfm(abreq, ctx->
enc);
256 ablkcipher_request_set_callback(abreq, aead_request_flags(req),
257 req->
base.complete, req->
base.data);
258 ablkcipher_request_set_crypt(abreq, req->
src, req->
dst,
261 err = crypto_ablkcipher_decrypt(abreq);
264 authenc_esn_request_complete(req, err);
271 unsigned int authsize;
274 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
278 unsigned int cryptlen = req->
cryptlen;
283 ahash_request_set_crypt(ahreq, areq_ctx->
tsg, ahreq->
result,
285 ahash_request_set_callback(ahreq, aead_request_flags(req) &
293 authsize = crypto_aead_authsize(authenc_esn);
294 cryptlen -= authsize;
295 ihash = ahreq->
result + authsize;
303 abreq = aead_request_ctx(req);
304 ablkcipher_request_set_tfm(abreq, ctx->
enc);
305 ablkcipher_request_set_callback(abreq, aead_request_flags(req),
306 req->
base.complete, req->
base.data);
307 ablkcipher_request_set_crypt(abreq, req->
src, req->
dst,
310 err = crypto_ablkcipher_decrypt(abreq);
313 authenc_esn_request_complete(req, err);
321 unsigned int authsize;
324 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
328 unsigned int cryptlen = req->
cryptlen;
333 authsize = crypto_aead_authsize(authenc_esn);
334 cryptlen -= authsize;
335 ihash = ahreq->
result + authsize;
343 abreq = aead_request_ctx(req);
344 ablkcipher_request_set_tfm(abreq, ctx->
enc);
345 ablkcipher_request_set_callback(abreq, aead_request_flags(req),
346 req->
base.complete, req->
base.data);
347 ablkcipher_request_set_crypt(abreq, req->
src, req->
dst,
350 err = crypto_ablkcipher_decrypt(abreq);
353 authenc_esn_request_complete(req, err);
359 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
367 hash = (
u8 *)
ALIGN((
unsigned long)hash + crypto_ahash_alignmask(auth),
368 crypto_ahash_alignmask(auth) + 1);
370 ahash_request_set_tfm(ahreq, auth);
372 err = crypto_ahash_init(ahreq);
376 ahash_request_set_crypt(ahreq, areq_ctx->
hsg, hash, areq_ctx->
headlen);
377 ahash_request_set_callback(ahreq, aead_request_flags(req) & flags,
380 err = crypto_ahash_update(ahreq);
384 ahash_request_set_crypt(ahreq, areq_ctx->
sg, hash, areq_ctx->
cryptlen);
385 ahash_request_set_callback(ahreq, aead_request_flags(req) & flags,
388 err = crypto_ahash_update(ahreq);
392 ahash_request_set_crypt(ahreq, areq_ctx->
tsg, hash,
394 ahash_request_set_callback(ahreq, aead_request_flags(req) & flags,
407 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
416 unsigned int ivsize = crypto_aead_ivsize(authenc_esn);
417 unsigned int cryptlen = req->
cryptlen;
427 sg_set_buf(cipher, iv, ivsize);
428 scatterwalk_crypto_chain(cipher, dst, vdst == iv + ivsize, 2);
445 sg_set_page(hsg, sg_page(assoc), assoc->
length, assoc->
offset);
446 sg_set_page(hsg + 1, sg_page(assoc2), assoc2->
length, assoc2->
offset);
449 sg_set_page(tsg, sg_page(assoc1), assoc1->
length, assoc1->
offset);
456 areq_ctx->
complete = authenc_esn_geniv_ahash_done;
460 hash = crypto_authenc_esn_ahash(req, flags);
462 return PTR_ERR(hash);
465 crypto_aead_authsize(authenc_esn), 1);
476 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(areq);
479 u8 *iv = (
u8 *)(abreq + 1) +
480 crypto_ablkcipher_reqsize(ctx->
enc);
482 err = crypto_authenc_esn_genicv(areq, iv, 0);
485 authenc_esn_request_complete(areq, err);
488 static int crypto_authenc_esn_encrypt(
struct aead_request *req)
490 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
495 unsigned int cryptlen = req->
cryptlen;
498 u8 *iv = (
u8 *)abreq - crypto_ablkcipher_ivsize(enc);
501 ablkcipher_request_set_tfm(abreq, enc);
502 ablkcipher_request_set_callback(abreq, aead_request_flags(req),
503 crypto_authenc_esn_encrypt_done, req);
504 ablkcipher_request_set_crypt(abreq, req->
src, dst, cryptlen, req->
iv);
506 memcpy(iv, req->
iv, crypto_aead_ivsize(authenc_esn));
508 err = crypto_ablkcipher_encrypt(abreq);
523 err = crypto_authenc_esn_genicv(areq, greq->
giv, 0);
526 authenc_esn_request_complete(areq, err);
531 struct crypto_aead *authenc_esn = aead_givcrypt_reqtfm(req);
538 skcipher_givcrypt_set_tfm(greq, ctx->
enc);
539 skcipher_givcrypt_set_callback(greq, aead_request_flags(areq),
540 crypto_authenc_esn_givencrypt_done, areq);
541 skcipher_givcrypt_set_crypt(greq, areq->
src, areq->
dst, areq->
cryptlen,
543 skcipher_givcrypt_set_giv(greq, iv, req->
seq);
545 err = crypto_skcipher_givencrypt(greq);
552 static int crypto_authenc_esn_verify(
struct aead_request *req)
554 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
558 unsigned int authsize;
560 areq_ctx->
complete = authenc_esn_verify_ahash_done;
565 return PTR_ERR(ohash);
567 authsize = crypto_aead_authsize(authenc_esn);
568 ihash = ohash + authsize;
574 static int crypto_authenc_esn_iverify(
struct aead_request *req,
u8 *iv,
575 unsigned int cryptlen)
577 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
586 unsigned int ivsize = crypto_aead_ivsize(authenc_esn);
595 sg_set_buf(cipher, iv, ivsize);
596 scatterwalk_crypto_chain(cipher, src, vsrc == iv + ivsize, 2);
613 sg_set_page(hsg, sg_page(assoc), assoc->
length, assoc->
offset);
614 sg_set_page(hsg + 1, sg_page(assoc2), assoc2->
length, assoc2->
offset);
617 sg_set_page(tsg, sg_page(assoc1), assoc1->
length, assoc1->
offset);
624 areq_ctx->
complete = authenc_esn_verify_ahash_done;
628 return crypto_authenc_esn_verify(req);
631 static int crypto_authenc_esn_decrypt(
struct aead_request *req)
633 struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
636 unsigned int cryptlen = req->
cryptlen;
637 unsigned int authsize = crypto_aead_authsize(authenc_esn);
641 if (cryptlen < authsize)
643 cryptlen -= authsize;
645 err = crypto_authenc_esn_iverify(req, iv, cryptlen);
649 ablkcipher_request_set_tfm(abreq, ctx->
enc);
650 ablkcipher_request_set_callback(abreq, aead_request_flags(req),
651 req->
base.complete, req->
base.data);
652 ablkcipher_request_set_crypt(abreq, req->
src, req->
dst, cryptlen, iv);
654 return crypto_ablkcipher_decrypt(abreq);
657 static int crypto_authenc_esn_init_tfm(
struct crypto_tfm *tfm)
666 auth = crypto_spawn_ahash(&ictx->
auth);
668 return PTR_ERR(auth);
670 enc = crypto_spawn_skcipher(&ictx->
enc);
678 ctx->
reqoff =
ALIGN(2 * crypto_ahash_digestsize(auth) +
679 crypto_ahash_alignmask(auth),
680 crypto_ahash_alignmask(auth) + 1) +
681 crypto_ablkcipher_ivsize(enc);
686 crypto_ahash_reqsize(auth) +
689 crypto_ablkcipher_reqsize(enc));
694 crypto_free_ahash(auth);
698 static void crypto_authenc_esn_exit_tfm(
struct crypto_tfm *tfm)
702 crypto_free_ahash(ctx->
auth);
703 crypto_free_ablkcipher(ctx->
enc);
714 const char *enc_name;
728 return ERR_CAST(auth);
730 auth_base = &auth->
base;
733 err = PTR_ERR(enc_name);
734 if (IS_ERR(enc_name))
737 inst = kzalloc(
sizeof(*inst) +
sizeof(*ctx),
GFP_KERNEL);
742 ctx = crypto_instance_ctx(inst);
748 crypto_set_skcipher_spawn(&ctx->
enc, inst);
750 crypto_requires_sync(algt->
type,
755 enc = crypto_skcipher_spawn_alg(&ctx->
enc);
776 inst->
alg.cra_aead.ivsize = enc->cra_ablkcipher.ivsize;
781 inst->
alg.cra_init = crypto_authenc_esn_init_tfm;
782 inst->
alg.cra_exit = crypto_authenc_esn_exit_tfm;
784 inst->
alg.cra_aead.setkey = crypto_authenc_esn_setkey;
785 inst->
alg.cra_aead.encrypt = crypto_authenc_esn_encrypt;
786 inst->
alg.cra_aead.decrypt = crypto_authenc_esn_decrypt;
787 inst->
alg.cra_aead.givencrypt = crypto_authenc_esn_givencrypt;
794 crypto_drop_skcipher(&ctx->
enc);
796 crypto_drop_ahash(&ctx->
auth);
808 crypto_drop_skcipher(&ctx->
enc);
809 crypto_drop_ahash(&ctx->
auth);
814 .name =
"authencesn",
815 .alloc = crypto_authenc_esn_alloc,
816 .free = crypto_authenc_esn_free,
820 static int __init crypto_authenc_esn_module_init(
void)
825 static void __exit crypto_authenc_esn_module_exit(
void)