^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * authencesn.c - AEAD wrapper for IPsec with extended sequence numbers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * derived from authenc.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2010 secunet Security Networks AG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2010 Steffen Klassert <steffen.klassert@secunet.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (c) 2015 Herbert Xu <herbert@gondor.apana.org.au>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <crypto/internal/aead.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <crypto/internal/hash.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <crypto/internal/skcipher.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <crypto/authenc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <crypto/null.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <crypto/scatterwalk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/rtnetlink.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/spinlock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) struct authenc_esn_instance_ctx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct crypto_ahash_spawn auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct crypto_skcipher_spawn enc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct crypto_authenc_esn_ctx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) unsigned int reqoff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct crypto_ahash *auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct crypto_skcipher *enc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct crypto_sync_skcipher *null;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) struct authenc_esn_request_ctx {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct scatterlist src[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct scatterlist dst[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) char tail[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) static void authenc_esn_request_complete(struct aead_request *req, int err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) if (err != -EINPROGRESS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) aead_request_complete(req, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) static int crypto_authenc_esn_setauthsize(struct crypto_aead *authenc_esn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) unsigned int authsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) if (authsize > 0 && authsize < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) static int crypto_authenc_esn_setkey(struct crypto_aead *authenc_esn, const u8 *key,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) unsigned int keylen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct crypto_authenc_esn_ctx *ctx = crypto_aead_ctx(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct crypto_ahash *auth = ctx->auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct crypto_skcipher *enc = ctx->enc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct crypto_authenc_keys keys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) int err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) crypto_ahash_clear_flags(auth, CRYPTO_TFM_REQ_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) crypto_ahash_set_flags(auth, crypto_aead_get_flags(authenc_esn) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) CRYPTO_TFM_REQ_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) err = crypto_ahash_setkey(auth, keys.authkey, keys.authkeylen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) crypto_skcipher_clear_flags(enc, CRYPTO_TFM_REQ_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) crypto_skcipher_set_flags(enc, crypto_aead_get_flags(authenc_esn) &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) CRYPTO_TFM_REQ_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) err = crypto_skcipher_setkey(enc, keys.enckey, keys.enckeylen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) memzero_explicit(&keys, sizeof(keys));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) static int crypto_authenc_esn_genicv_tail(struct aead_request *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) unsigned int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) struct crypto_authenc_esn_ctx *ctx = crypto_aead_ctx(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) struct authenc_esn_request_ctx *areq_ctx = aead_request_ctx(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) struct crypto_ahash *auth = ctx->auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) u8 *hash = PTR_ALIGN((u8 *)areq_ctx->tail,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) crypto_ahash_alignmask(auth) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) unsigned int authsize = crypto_aead_authsize(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) unsigned int assoclen = req->assoclen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) unsigned int cryptlen = req->cryptlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct scatterlist *dst = req->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) u32 tmp[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) /* Move high-order bits of sequence number back. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) scatterwalk_map_and_copy(tmp, dst, 4, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) scatterwalk_map_and_copy(tmp, dst, 0, 8, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) scatterwalk_map_and_copy(hash, dst, assoclen + cryptlen, authsize, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) static void authenc_esn_geniv_ahash_done(struct crypto_async_request *areq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) struct aead_request *req = areq->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) err = err ?: crypto_authenc_esn_genicv_tail(req, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) aead_request_complete(req, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) static int crypto_authenc_esn_genicv(struct aead_request *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) unsigned int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) struct authenc_esn_request_ctx *areq_ctx = aead_request_ctx(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct crypto_authenc_esn_ctx *ctx = crypto_aead_ctx(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct crypto_ahash *auth = ctx->auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) u8 *hash = PTR_ALIGN((u8 *)areq_ctx->tail,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) crypto_ahash_alignmask(auth) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) struct ahash_request *ahreq = (void *)(areq_ctx->tail + ctx->reqoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) unsigned int authsize = crypto_aead_authsize(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) unsigned int assoclen = req->assoclen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) unsigned int cryptlen = req->cryptlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) struct scatterlist *dst = req->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) u32 tmp[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) if (!authsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* Move high-order bits of sequence number to the end. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) scatterwalk_map_and_copy(tmp, dst, 0, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) scatterwalk_map_and_copy(tmp, dst, 4, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) sg_init_table(areq_ctx->dst, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) dst = scatterwalk_ffwd(areq_ctx->dst, dst, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) ahash_request_set_tfm(ahreq, auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) ahash_request_set_crypt(ahreq, dst, hash, assoclen + cryptlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ahash_request_set_callback(ahreq, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) authenc_esn_geniv_ahash_done, req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) return crypto_ahash_digest(ahreq) ?:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) crypto_authenc_esn_genicv_tail(req, aead_request_flags(req));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static void crypto_authenc_esn_encrypt_done(struct crypto_async_request *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) int err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) struct aead_request *areq = req->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) err = crypto_authenc_esn_genicv(areq, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) authenc_esn_request_complete(areq, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) static int crypto_authenc_esn_copy(struct aead_request *req, unsigned int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) struct crypto_authenc_esn_ctx *ctx = crypto_aead_ctx(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) SYNC_SKCIPHER_REQUEST_ON_STACK(skreq, ctx->null);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) skcipher_request_set_sync_tfm(skreq, ctx->null);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) skcipher_request_set_callback(skreq, aead_request_flags(req),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) skcipher_request_set_crypt(skreq, req->src, req->dst, len, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) return crypto_skcipher_encrypt(skreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) static int crypto_authenc_esn_encrypt(struct aead_request *req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) struct authenc_esn_request_ctx *areq_ctx = aead_request_ctx(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) struct crypto_authenc_esn_ctx *ctx = crypto_aead_ctx(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct skcipher_request *skreq = (void *)(areq_ctx->tail +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) ctx->reqoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct crypto_skcipher *enc = ctx->enc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) unsigned int assoclen = req->assoclen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) unsigned int cryptlen = req->cryptlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) struct scatterlist *src, *dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) sg_init_table(areq_ctx->src, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) src = scatterwalk_ffwd(areq_ctx->src, req->src, assoclen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) dst = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) if (req->src != req->dst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) err = crypto_authenc_esn_copy(req, assoclen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) sg_init_table(areq_ctx->dst, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) dst = scatterwalk_ffwd(areq_ctx->dst, req->dst, assoclen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) skcipher_request_set_tfm(skreq, enc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) skcipher_request_set_callback(skreq, aead_request_flags(req),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) crypto_authenc_esn_encrypt_done, req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) skcipher_request_set_crypt(skreq, src, dst, cryptlen, req->iv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) err = crypto_skcipher_encrypt(skreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) return crypto_authenc_esn_genicv(req, aead_request_flags(req));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) static int crypto_authenc_esn_decrypt_tail(struct aead_request *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) unsigned int flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) unsigned int authsize = crypto_aead_authsize(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) struct authenc_esn_request_ctx *areq_ctx = aead_request_ctx(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct crypto_authenc_esn_ctx *ctx = crypto_aead_ctx(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) struct skcipher_request *skreq = (void *)(areq_ctx->tail +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) ctx->reqoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) struct crypto_ahash *auth = ctx->auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) u8 *ohash = PTR_ALIGN((u8 *)areq_ctx->tail,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) crypto_ahash_alignmask(auth) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) unsigned int cryptlen = req->cryptlen - authsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) unsigned int assoclen = req->assoclen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) struct scatterlist *dst = req->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) u8 *ihash = ohash + crypto_ahash_digestsize(auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) u32 tmp[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (!authsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) goto decrypt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) /* Move high-order bits of sequence number back. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) scatterwalk_map_and_copy(tmp, dst, 4, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) scatterwalk_map_and_copy(tmp, dst, 0, 8, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if (crypto_memneq(ihash, ohash, authsize))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) return -EBADMSG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) decrypt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) sg_init_table(areq_ctx->dst, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) dst = scatterwalk_ffwd(areq_ctx->dst, dst, assoclen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) skcipher_request_set_tfm(skreq, ctx->enc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) skcipher_request_set_callback(skreq, flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) req->base.complete, req->base.data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) skcipher_request_set_crypt(skreq, dst, dst, cryptlen, req->iv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) return crypto_skcipher_decrypt(skreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) static void authenc_esn_verify_ahash_done(struct crypto_async_request *areq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) int err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) struct aead_request *req = areq->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) err = err ?: crypto_authenc_esn_decrypt_tail(req, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) authenc_esn_request_complete(req, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) static int crypto_authenc_esn_decrypt(struct aead_request *req)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) struct crypto_aead *authenc_esn = crypto_aead_reqtfm(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) struct authenc_esn_request_ctx *areq_ctx = aead_request_ctx(req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) struct crypto_authenc_esn_ctx *ctx = crypto_aead_ctx(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) struct ahash_request *ahreq = (void *)(areq_ctx->tail + ctx->reqoff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) unsigned int authsize = crypto_aead_authsize(authenc_esn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) struct crypto_ahash *auth = ctx->auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) u8 *ohash = PTR_ALIGN((u8 *)areq_ctx->tail,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) crypto_ahash_alignmask(auth) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) unsigned int assoclen = req->assoclen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) unsigned int cryptlen = req->cryptlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) u8 *ihash = ohash + crypto_ahash_digestsize(auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) struct scatterlist *dst = req->dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) u32 tmp[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) cryptlen -= authsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) if (req->src != dst) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) err = crypto_authenc_esn_copy(req, assoclen + cryptlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) scatterwalk_map_and_copy(ihash, req->src, assoclen + cryptlen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) authsize, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) if (!authsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) goto tail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) /* Move high-order bits of sequence number to the end. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) scatterwalk_map_and_copy(tmp, dst, 0, 8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) scatterwalk_map_and_copy(tmp, dst, 4, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) sg_init_table(areq_ctx->dst, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) dst = scatterwalk_ffwd(areq_ctx->dst, dst, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) ahash_request_set_tfm(ahreq, auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) ahash_request_set_crypt(ahreq, dst, ohash, assoclen + cryptlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) ahash_request_set_callback(ahreq, aead_request_flags(req),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) authenc_esn_verify_ahash_done, req);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) err = crypto_ahash_digest(ahreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) tail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) return crypto_authenc_esn_decrypt_tail(req, aead_request_flags(req));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) static int crypto_authenc_esn_init_tfm(struct crypto_aead *tfm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) struct aead_instance *inst = aead_alg_instance(tfm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) struct authenc_esn_instance_ctx *ictx = aead_instance_ctx(inst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) struct crypto_authenc_esn_ctx *ctx = crypto_aead_ctx(tfm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) struct crypto_ahash *auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) struct crypto_skcipher *enc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) struct crypto_sync_skcipher *null;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) auth = crypto_spawn_ahash(&ictx->auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (IS_ERR(auth))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) return PTR_ERR(auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) enc = crypto_spawn_skcipher(&ictx->enc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) err = PTR_ERR(enc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) if (IS_ERR(enc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) goto err_free_ahash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) null = crypto_get_default_null_skcipher();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) err = PTR_ERR(null);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) if (IS_ERR(null))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) goto err_free_skcipher;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) ctx->auth = auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) ctx->enc = enc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) ctx->null = null;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) ctx->reqoff = ALIGN(2 * crypto_ahash_digestsize(auth),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) crypto_ahash_alignmask(auth) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) crypto_aead_set_reqsize(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) tfm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) sizeof(struct authenc_esn_request_ctx) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) ctx->reqoff +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) max_t(unsigned int,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) crypto_ahash_reqsize(auth) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) sizeof(struct ahash_request),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) sizeof(struct skcipher_request) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) crypto_skcipher_reqsize(enc)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) err_free_skcipher:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) crypto_free_skcipher(enc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) err_free_ahash:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) crypto_free_ahash(auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) static void crypto_authenc_esn_exit_tfm(struct crypto_aead *tfm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) struct crypto_authenc_esn_ctx *ctx = crypto_aead_ctx(tfm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) crypto_free_ahash(ctx->auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) crypto_free_skcipher(ctx->enc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) crypto_put_default_null_skcipher();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) static void crypto_authenc_esn_free(struct aead_instance *inst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct authenc_esn_instance_ctx *ctx = aead_instance_ctx(inst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) crypto_drop_skcipher(&ctx->enc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) crypto_drop_ahash(&ctx->auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) kfree(inst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) static int crypto_authenc_esn_create(struct crypto_template *tmpl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) struct rtattr **tb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) u32 mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) struct aead_instance *inst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) struct authenc_esn_instance_ctx *ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) struct hash_alg_common *auth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) struct crypto_alg *auth_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) struct skcipher_alg *enc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_AEAD, &mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) inst = kzalloc(sizeof(*inst) + sizeof(*ctx), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) if (!inst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) ctx = aead_instance_ctx(inst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) err = crypto_grab_ahash(&ctx->auth, aead_crypto_instance(inst),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) crypto_attr_alg_name(tb[1]), 0, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) goto err_free_inst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) auth = crypto_spawn_ahash_alg(&ctx->auth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) auth_base = &auth->base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) err = crypto_grab_skcipher(&ctx->enc, aead_crypto_instance(inst),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) crypto_attr_alg_name(tb[2]), 0, mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) goto err_free_inst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) enc = crypto_spawn_skcipher_alg(&ctx->enc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) err = -ENAMETOOLONG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) if (snprintf(inst->alg.base.cra_name, CRYPTO_MAX_ALG_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) "authencesn(%s,%s)", auth_base->cra_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) enc->base.cra_name) >= CRYPTO_MAX_ALG_NAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) goto err_free_inst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) if (snprintf(inst->alg.base.cra_driver_name, CRYPTO_MAX_ALG_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) "authencesn(%s,%s)", auth_base->cra_driver_name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) enc->base.cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) goto err_free_inst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) inst->alg.base.cra_priority = enc->base.cra_priority * 10 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) auth_base->cra_priority;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) inst->alg.base.cra_blocksize = enc->base.cra_blocksize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) inst->alg.base.cra_alignmask = auth_base->cra_alignmask |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) enc->base.cra_alignmask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) inst->alg.base.cra_ctxsize = sizeof(struct crypto_authenc_esn_ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) inst->alg.ivsize = crypto_skcipher_alg_ivsize(enc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) inst->alg.chunksize = crypto_skcipher_alg_chunksize(enc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) inst->alg.maxauthsize = auth->digestsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) inst->alg.init = crypto_authenc_esn_init_tfm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) inst->alg.exit = crypto_authenc_esn_exit_tfm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) inst->alg.setkey = crypto_authenc_esn_setkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) inst->alg.setauthsize = crypto_authenc_esn_setauthsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) inst->alg.encrypt = crypto_authenc_esn_encrypt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) inst->alg.decrypt = crypto_authenc_esn_decrypt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) inst->free = crypto_authenc_esn_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) err = aead_register_instance(tmpl, inst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) err_free_inst:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) crypto_authenc_esn_free(inst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) static struct crypto_template crypto_authenc_esn_tmpl = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) .name = "authencesn",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) .create = crypto_authenc_esn_create,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) .module = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) static int __init crypto_authenc_esn_module_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) return crypto_register_template(&crypto_authenc_esn_tmpl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) static void __exit crypto_authenc_esn_module_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) crypto_unregister_template(&crypto_authenc_esn_tmpl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) subsys_initcall(crypto_authenc_esn_module_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) module_exit(crypto_authenc_esn_module_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) MODULE_AUTHOR("Steffen Klassert <steffen.klassert@secunet.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) MODULE_DESCRIPTION("AEAD wrapper for IPsec with extended sequence numbers");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) MODULE_ALIAS_CRYPTO("authencesn");