// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Linear symmetric key cipher operations.
 *
 * Generic encrypt/decrypt wrapper for ciphers.
 *
 * Copyright (c) 2023 Herbert Xu <herbert@gondor.apana.org.au>
 */

#include <linux/cryptouser.h>
#include <linux/err.h>
#include <linux/export.h>
#include <linux/kernel.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <net/netlink.h>
#include "skcipher.h"

static inline struct crypto_lskcipher *__crypto_lskcipher_cast(
	struct crypto_tfm *tfm)
{
	return container_of(tfm, struct crypto_lskcipher, base);
}

static inline struct lskcipher_alg *__crypto_lskcipher_alg(
	struct crypto_alg *alg)
{
	return container_of(alg, struct lskcipher_alg, co.base);
}

static int lskcipher_setkey_unaligned(struct crypto_lskcipher *tfm,
				      const u8 *key, unsigned int keylen)
{
	unsigned long alignmask = crypto_lskcipher_alignmask(tfm);
	struct lskcipher_alg *cipher = crypto_lskcipher_alg(tfm);
	u8 *buffer, *alignbuffer;
	unsigned long absize;
	int ret;

	absize = keylen + alignmask;
	buffer = kmalloc(absize, GFP_ATOMIC);
	if (!buffer)
		return -ENOMEM;

	alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
	memcpy(alignbuffer, key, keylen);
	ret = cipher->setkey(tfm, alignbuffer, keylen);
	kfree_sensitive(buffer);
	return ret;
}

int crypto_lskcipher_setkey(struct crypto_lskcipher *tfm, const u8 *key,
			    unsigned int keylen)
{
	unsigned long alignmask = crypto_lskcipher_alignmask(tfm);
	struct lskcipher_alg *cipher = crypto_lskcipher_alg(tfm);

	if (keylen < cipher->co.min_keysize || keylen > cipher->co.max_keysize)
		return -EINVAL;

	if ((unsigned long)key & alignmask)
		return lskcipher_setkey_unaligned(tfm, key, keylen);
	else
		return cipher->setkey(tfm, key, keylen);
}
EXPORT_SYMBOL_GPL(crypto_lskcipher_setkey);

static int crypto_lskcipher_crypt_unaligned(
	struct crypto_lskcipher *tfm, const u8 *src, u8 *dst, unsigned len,
	u8 *iv, int (*crypt)(struct crypto_lskcipher *tfm, const u8 *src,
			     u8 *dst, unsigned len, u8 *iv, u32 flags))
{
	unsigned statesize = crypto_lskcipher_statesize(tfm);
	unsigned ivsize = crypto_lskcipher_ivsize(tfm);
	unsigned bs = crypto_lskcipher_blocksize(tfm);
	unsigned cs = crypto_lskcipher_chunksize(tfm);
	int err;
	u8 *tiv;
	u8 *p;

	BUILD_BUG_ON(MAX_CIPHER_BLOCKSIZE > PAGE_SIZE ||
		     MAX_CIPHER_ALIGNMASK >= PAGE_SIZE);

	tiv = kmalloc(PAGE_SIZE, GFP_ATOMIC);
	if (!tiv)
		return -ENOMEM;

	memcpy(tiv, iv, ivsize + statesize);

	p = kmalloc(PAGE_SIZE, GFP_ATOMIC);
	err = -ENOMEM;
	if (!p)
		goto out;

	while (len >= bs) {
		unsigned chunk = min((unsigned)PAGE_SIZE, len);
		int err;

		if (chunk > cs)
			chunk &= ~(cs - 1);

		memcpy(p, src, chunk);
		err = crypt(tfm, p, p, chunk, tiv, CRYPTO_LSKCIPHER_FLAG_FINAL);
		if (err)
			goto out;

		memcpy(dst, p, chunk);
		src += chunk;
		dst += chunk;
		len -= chunk;
	}

	err = len ? -EINVAL : 0;

out:
	memcpy(iv, tiv, ivsize + statesize);
	kfree_sensitive(p);
	kfree_sensitive(tiv);
	return err;
}

static int crypto_lskcipher_crypt(struct crypto_lskcipher *tfm, const u8 *src,
				  u8 *dst, unsigned len, u8 *iv,
				  int (*crypt)(struct crypto_lskcipher *tfm,
					       const u8 *src, u8 *dst,
					       unsigned len, u8 *iv,
					       u32 flags))
{
	unsigned long alignmask = crypto_lskcipher_alignmask(tfm);

	if (((unsigned long)src | (unsigned long)dst | (unsigned long)iv) &
	    alignmask)
		return crypto_lskcipher_crypt_unaligned(tfm, src, dst, len, iv,
							crypt);

	return crypt(tfm, src, dst, len, iv, CRYPTO_LSKCIPHER_FLAG_FINAL);
}

int crypto_lskcipher_encrypt(struct crypto_lskcipher *tfm, const u8 *src,
			     u8 *dst, unsigned len, u8 *iv)
{
	struct lskcipher_alg *alg = crypto_lskcipher_alg(tfm);

	return crypto_lskcipher_crypt(tfm, src, dst, len, iv, alg->encrypt);
}
EXPORT_SYMBOL_GPL(crypto_lskcipher_encrypt);

int crypto_lskcipher_decrypt(struct crypto_lskcipher *tfm, const u8 *src,
			     u8 *dst, unsigned len, u8 *iv)
{
	struct lskcipher_alg *alg = crypto_lskcipher_alg(tfm);

	return crypto_lskcipher_crypt(tfm, src, dst, len, iv, alg->decrypt);
}
EXPORT_SYMBOL_GPL(crypto_lskcipher_decrypt);

static int crypto_lskcipher_crypt_sg(struct skcipher_request *req,
				     int (*crypt)(struct crypto_lskcipher *tfm,
						  const u8 *src, u8 *dst,
						  unsigned len, u8 *ivs,
						  u32 flags))
{
	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
	struct crypto_lskcipher **ctx = crypto_skcipher_ctx(skcipher);
	u8 *ivs = skcipher_request_ctx(req);
	struct crypto_lskcipher *tfm = *ctx;
	struct skcipher_walk walk;
	unsigned ivsize;
	u32 flags;
	int err;

	ivsize = crypto_lskcipher_ivsize(tfm);
	ivs = PTR_ALIGN(ivs, crypto_skcipher_alignmask(skcipher) + 1);
	memcpy(ivs, req->iv, ivsize);

	flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP;

	if (req->base.flags & CRYPTO_SKCIPHER_REQ_CONT)
		flags |= CRYPTO_LSKCIPHER_FLAG_CONT;

	if (!(req->base.flags & CRYPTO_SKCIPHER_REQ_NOTFINAL))
		flags |= CRYPTO_LSKCIPHER_FLAG_FINAL;

	err = skcipher_walk_virt(&walk, req, false);

	while (walk.nbytes) {
		err = crypt(tfm, walk.src.virt.addr, walk.dst.virt.addr,
			    walk.nbytes, ivs,
			    flags & ~(walk.nbytes == walk.total ?
			    0 : CRYPTO_LSKCIPHER_FLAG_FINAL));
		err = skcipher_walk_done(&walk, err);
		flags |= CRYPTO_LSKCIPHER_FLAG_CONT;
	}

	memcpy(req->iv, ivs, ivsize);

	return err;
}

int crypto_lskcipher_encrypt_sg(struct skcipher_request *req)
{
	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
	struct crypto_lskcipher **ctx = crypto_skcipher_ctx(skcipher);
	struct lskcipher_alg *alg = crypto_lskcipher_alg(*ctx);

	return crypto_lskcipher_crypt_sg(req, alg->encrypt);
}

int crypto_lskcipher_decrypt_sg(struct skcipher_request *req)
{
	struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req);
	struct crypto_lskcipher **ctx = crypto_skcipher_ctx(skcipher);
	struct lskcipher_alg *alg = crypto_lskcipher_alg(*ctx);

	return crypto_lskcipher_crypt_sg(req, alg->decrypt);
}

static void crypto_lskcipher_exit_tfm(struct crypto_tfm *tfm)
{
	struct crypto_lskcipher *skcipher = __crypto_lskcipher_cast(tfm);
	struct lskcipher_alg *alg = crypto_lskcipher_alg(skcipher);

	alg->exit(skcipher);
}

static int crypto_lskcipher_init_tfm(struct crypto_tfm *tfm)
{
	struct crypto_lskcipher *skcipher = __crypto_lskcipher_cast(tfm);
	struct lskcipher_alg *alg = crypto_lskcipher_alg(skcipher);

	if (alg->exit)
		skcipher->base.exit = crypto_lskcipher_exit_tfm;

	if (alg->init)
		return alg->init(skcipher);

	return 0;
}

static void crypto_lskcipher_free_instance(struct crypto_instance *inst)
{
	struct lskcipher_instance *skcipher =
		container_of(inst, struct lskcipher_instance, s.base);

	skcipher->free(skcipher);
}

static void __maybe_unused crypto_lskcipher_show(
	struct seq_file *m, struct crypto_alg *alg)
{
	struct lskcipher_alg *skcipher = __crypto_lskcipher_alg(alg);

	seq_printf(m, "type         : lskcipher\n");
	seq_printf(m, "blocksize    : %u\n", alg->cra_blocksize);
	seq_printf(m, "min keysize  : %u\n", skcipher->co.min_keysize);
	seq_printf(m, "max keysize  : %u\n", skcipher->co.max_keysize);
	seq_printf(m, "ivsize       : %u\n", skcipher->co.ivsize);
	seq_printf(m, "chunksize    : %u\n", skcipher->co.chunksize);
	seq_printf(m, "statesize    : %u\n", skcipher->co.statesize);
}

static int __maybe_unused crypto_lskcipher_report(
	struct sk_buff *skb, struct crypto_alg *alg)
{
	struct lskcipher_alg *skcipher = __crypto_lskcipher_alg(alg);
	struct crypto_report_blkcipher rblkcipher;

	memset(&rblkcipher, 0, sizeof(rblkcipher));

	strscpy(rblkcipher.type, "lskcipher", sizeof(rblkcipher.type));
	strscpy(rblkcipher.geniv, "<none>", sizeof(rblkcipher.geniv));

	rblkcipher.blocksize = alg->cra_blocksize;
	rblkcipher.min_keysize = skcipher->co.min_keysize;
	rblkcipher.max_keysize = skcipher->co.max_keysize;
	rblkcipher.ivsize = skcipher->co.ivsize;

	return nla_put(skb, CRYPTOCFGA_REPORT_BLKCIPHER,
		       sizeof(rblkcipher), &rblkcipher);
}

static const struct crypto_type crypto_lskcipher_type = {
	.extsize = crypto_alg_extsize,
	.init_tfm = crypto_lskcipher_init_tfm,
	.free = crypto_lskcipher_free_instance,
#ifdef CONFIG_PROC_FS
	.show = crypto_lskcipher_show,
#endif
#if IS_ENABLED(CONFIG_CRYPTO_USER)
	.report = crypto_lskcipher_report,
#endif
	.maskclear = ~CRYPTO_ALG_TYPE_MASK,
	.maskset = CRYPTO_ALG_TYPE_MASK,
	.type = CRYPTO_ALG_TYPE_LSKCIPHER,
	.tfmsize = offsetof(struct crypto_lskcipher, base),
	.algsize = offsetof(struct lskcipher_alg, co.base),
};

static void crypto_lskcipher_exit_tfm_sg(struct crypto_tfm *tfm)
{
	struct crypto_lskcipher **ctx = crypto_tfm_ctx(tfm);

	crypto_free_lskcipher(*ctx);
}

int crypto_init_lskcipher_ops_sg(struct crypto_tfm *tfm)
{
	struct crypto_lskcipher **ctx = crypto_tfm_ctx(tfm);
	struct crypto_alg *calg = tfm->__crt_alg;
	struct crypto_lskcipher *skcipher;

	if (!crypto_mod_get(calg))
		return -EAGAIN;

	skcipher = crypto_create_tfm(calg, &crypto_lskcipher_type);
	if (IS_ERR(skcipher)) {
		crypto_mod_put(calg);
		return PTR_ERR(skcipher);
	}

	*ctx = skcipher;
	tfm->exit = crypto_lskcipher_exit_tfm_sg;

	return 0;
}

int crypto_grab_lskcipher(struct crypto_lskcipher_spawn *spawn,
			  struct crypto_instance *inst,
			  const char *name, u32 type, u32 mask)
{
	spawn->base.frontend = &crypto_lskcipher_type;
	return crypto_grab_spawn(&spawn->base, inst, name, type, mask);
}
EXPORT_SYMBOL_GPL(crypto_grab_lskcipher);

struct crypto_lskcipher *crypto_alloc_lskcipher(const char *alg_name,
						u32 type, u32 mask)
{
	return crypto_alloc_tfm(alg_name, &crypto_lskcipher_type, type, mask);
}
EXPORT_SYMBOL_GPL(crypto_alloc_lskcipher);

static int lskcipher_prepare_alg(struct lskcipher_alg *alg)
{
	struct crypto_alg *base = &alg->co.base;
	int err;

	err = skcipher_prepare_alg_common(&alg->co);
	if (err)
		return err;

	if (alg->co.chunksize & (alg->co.chunksize - 1))
		return -EINVAL;

	base->cra_type = &crypto_lskcipher_type;
	base->cra_flags |= CRYPTO_ALG_TYPE_LSKCIPHER;

	return 0;
}

int crypto_register_lskcipher(struct lskcipher_alg *alg)
{
	struct crypto_alg *base = &alg->co.base;
	int err;

	err = lskcipher_prepare_alg(alg);
	if (err)
		return err;

	return crypto_register_alg(base);
}
EXPORT_SYMBOL_GPL(crypto_register_lskcipher);

void crypto_unregister_lskcipher(struct lskcipher_alg *alg)
{
	crypto_unregister_alg(&alg->co.base);
}
EXPORT_SYMBOL_GPL(crypto_unregister_lskcipher);

int crypto_register_lskciphers(struct lskcipher_alg *algs, int count)
{
	int i, ret;

	for (i = 0; i < count; i++) {
		ret = crypto_register_lskcipher(&algs[i]);
		if (ret)
			goto err;
	}

	return 0;

err:
	for (--i; i >= 0; --i)
		crypto_unregister_lskcipher(&algs[i]);

	return ret;
}
EXPORT_SYMBOL_GPL(crypto_register_lskciphers);

void crypto_unregister_lskciphers(struct lskcipher_alg *algs, int count)
{
	int i;

	for (i = count - 1; i >= 0; --i)
		crypto_unregister_lskcipher(&algs[i]);
}
EXPORT_SYMBOL_GPL(crypto_unregister_lskciphers);

int lskcipher_register_instance(struct crypto_template *tmpl,
				struct lskcipher_instance *inst)
{
	int err;

	if (WARN_ON(!inst->free))
		return -EINVAL;

	err = lskcipher_prepare_alg(&inst->alg);
	if (err)
		return err;

	return crypto_register_instance(tmpl, lskcipher_crypto_instance(inst));
}
EXPORT_SYMBOL_GPL(lskcipher_register_instance);

static int lskcipher_setkey_simple(struct crypto_lskcipher *tfm, const u8 *key,
				   unsigned int keylen)
{
	struct crypto_lskcipher *cipher = lskcipher_cipher_simple(tfm);

	crypto_lskcipher_clear_flags(cipher, CRYPTO_TFM_REQ_MASK);
	crypto_lskcipher_set_flags(cipher, crypto_lskcipher_get_flags(tfm) &
				   CRYPTO_TFM_REQ_MASK);
	return crypto_lskcipher_setkey(cipher, key, keylen);
}

static int lskcipher_init_tfm_simple(struct crypto_lskcipher *tfm)
{
	struct lskcipher_instance *inst = lskcipher_alg_instance(tfm);
	struct crypto_lskcipher **ctx = crypto_lskcipher_ctx(tfm);
	struct crypto_lskcipher_spawn *spawn;
	struct crypto_lskcipher *cipher;

	spawn = lskcipher_instance_ctx(inst);
	cipher = crypto_spawn_lskcipher(spawn);
	if (IS_ERR(cipher))
		return PTR_ERR(cipher);

	*ctx = cipher;
	return 0;
}

static void lskcipher_exit_tfm_simple(struct crypto_lskcipher *tfm)
{
	struct crypto_lskcipher **ctx = crypto_lskcipher_ctx(tfm);

	crypto_free_lskcipher(*ctx);
}

static void lskcipher_free_instance_simple(struct lskcipher_instance *inst)
{
	crypto_drop_lskcipher(lskcipher_instance_ctx(inst));
	kfree(inst);
}

/**
 * lskcipher_alloc_instance_simple - allocate instance of simple block cipher
 *
 * Allocate an lskcipher_instance for a simple block cipher mode of operation,
 * e.g. cbc or ecb.  The instance context will have just a single crypto_spawn,
 * that for the underlying cipher.  The {min,max}_keysize, ivsize, blocksize,
 * alignmask, and priority are set from the underlying cipher but can be
 * overridden if needed.  The tfm context defaults to
 * struct crypto_lskcipher *, and default ->setkey(), ->init(), and
 * ->exit() methods are installed.
 *
 * @tmpl: the template being instantiated
 * @tb: the template parameters
 *
 * Return: a pointer to the new instance, or an ERR_PTR().  The caller still
 *	   needs to register the instance.
 */
struct lskcipher_instance *lskcipher_alloc_instance_simple(
	struct crypto_template *tmpl, struct rtattr **tb)
{
	u32 mask;
	struct lskcipher_instance *inst;
	struct crypto_lskcipher_spawn *spawn;
	char ecb_name[CRYPTO_MAX_ALG_NAME];
	struct lskcipher_alg *cipher_alg;
	const char *cipher_name;
	int err;

	err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_LSKCIPHER, &mask);
	if (err)
		return ERR_PTR(err);

	cipher_name = crypto_attr_alg_name(tb[1]);
	if (IS_ERR(cipher_name))
		return ERR_CAST(cipher_name);

	inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL);
	if (!inst)
		return ERR_PTR(-ENOMEM);

	spawn = lskcipher_instance_ctx(inst);
	err = crypto_grab_lskcipher(spawn,
				    lskcipher_crypto_instance(inst),
				    cipher_name, 0, mask);

	ecb_name[0] = 0;
	if (err == -ENOENT && !!memcmp(tmpl->name, "ecb", 4)) {
		err = -ENAMETOOLONG;
		if (snprintf(ecb_name, CRYPTO_MAX_ALG_NAME, "ecb(%s)",
			     cipher_name) >= CRYPTO_MAX_ALG_NAME)
			goto err_free_inst;

		err = crypto_grab_lskcipher(spawn,
					    lskcipher_crypto_instance(inst),
					    ecb_name, 0, mask);
	}

	if (err)
		goto err_free_inst;

	cipher_alg = crypto_lskcipher_spawn_alg(spawn);

	err = crypto_inst_setname(lskcipher_crypto_instance(inst), tmpl->name,
				  &cipher_alg->co.base);
	if (err)
		goto err_free_inst;

	if (ecb_name[0]) {
		int len;

		err = -EINVAL;
		len = strscpy(ecb_name, &cipher_alg->co.base.cra_name[4],
			      sizeof(ecb_name));
		if (len < 2)
			goto err_free_inst;

		if (ecb_name[len - 1] != ')')
			goto err_free_inst;

		ecb_name[len - 1] = 0;

		err = -ENAMETOOLONG;
		if (snprintf(inst->alg.co.base.cra_name, CRYPTO_MAX_ALG_NAME,
			     "%s(%s)", tmpl->name, ecb_name) >=
		    CRYPTO_MAX_ALG_NAME)
			goto err_free_inst;

		if (strcmp(ecb_name, cipher_name) &&
		    snprintf(inst->alg.co.base.cra_driver_name,
			     CRYPTO_MAX_ALG_NAME,
			     "%s(%s)", tmpl->name, cipher_name) >=
		    CRYPTO_MAX_ALG_NAME)
			goto err_free_inst;
	} else {
		/* Don't allow nesting. */
		err = -ELOOP;
		if ((cipher_alg->co.base.cra_flags & CRYPTO_ALG_INSTANCE))
			goto err_free_inst;
	}

	err = -EINVAL;
	if (cipher_alg->co.ivsize)
		goto err_free_inst;

	inst->free = lskcipher_free_instance_simple;

	/* Default algorithm properties, can be overridden */
	inst->alg.co.base.cra_blocksize = cipher_alg->co.base.cra_blocksize;
	inst->alg.co.base.cra_alignmask = cipher_alg->co.base.cra_alignmask;
	inst->alg.co.base.cra_priority = cipher_alg->co.base.cra_priority;
	inst->alg.co.min_keysize = cipher_alg->co.min_keysize;
	inst->alg.co.max_keysize = cipher_alg->co.max_keysize;
	inst->alg.co.ivsize = cipher_alg->co.base.cra_blocksize;
	inst->alg.co.statesize = cipher_alg->co.statesize;

	/* Use struct crypto_lskcipher * by default, can be overridden */
	inst->alg.co.base.cra_ctxsize = sizeof(struct crypto_lskcipher *);
	inst->alg.setkey = lskcipher_setkey_simple;
	inst->alg.init = lskcipher_init_tfm_simple;
	inst->alg.exit = lskcipher_exit_tfm_simple;

	return inst;

err_free_inst:
	lskcipher_free_instance_simple(inst);
	return ERR_PTR(err);
}
EXPORT_SYMBOL_GPL(lskcipher_alloc_instance_simple);
