xref: /openbmc/linux/arch/x86/crypto/cast5_avx_glue.c (revision 674d40ab)
11a59d1b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
24d6d6a2cSJohannes Goetzfried /*
3a97673a1SIngo Molnar  * Glue Code for the AVX assembler implementation of the Cast5 Cipher
44d6d6a2cSJohannes Goetzfried  *
54d6d6a2cSJohannes Goetzfried  * Copyright (C) 2012 Johannes Goetzfried
64d6d6a2cSJohannes Goetzfried  *     <Johannes.Goetzfried@informatik.stud.uni-erlangen.de>
74d6d6a2cSJohannes Goetzfried  */
84d6d6a2cSJohannes Goetzfried 
94d6d6a2cSJohannes Goetzfried #include <crypto/algapi.h>
104d6d6a2cSJohannes Goetzfried #include <crypto/cast5.h>
111e63183aSEric Biggers #include <crypto/internal/simd.h>
121e63183aSEric Biggers #include <linux/crypto.h>
131e63183aSEric Biggers #include <linux/err.h>
141e63183aSEric Biggers #include <linux/module.h>
151e63183aSEric Biggers #include <linux/types.h>
164d6d6a2cSJohannes Goetzfried 
17*674d40abSArd Biesheuvel #include "ecb_cbc_helpers.h"
18*674d40abSArd Biesheuvel 
194d6d6a2cSJohannes Goetzfried #define CAST5_PARALLEL_BLOCKS 16
204d6d6a2cSJohannes Goetzfried 
21c12ab20bSJussi Kivilinna asmlinkage void cast5_ecb_enc_16way(struct cast5_ctx *ctx, u8 *dst,
224d6d6a2cSJohannes Goetzfried 				    const u8 *src);
23c12ab20bSJussi Kivilinna asmlinkage void cast5_ecb_dec_16way(struct cast5_ctx *ctx, u8 *dst,
24c12ab20bSJussi Kivilinna 				    const u8 *src);
25c12ab20bSJussi Kivilinna asmlinkage void cast5_cbc_dec_16way(struct cast5_ctx *ctx, u8 *dst,
26c12ab20bSJussi Kivilinna 				    const u8 *src);
274d6d6a2cSJohannes Goetzfried 
cast5_setkey_skcipher(struct crypto_skcipher * tfm,const u8 * key,unsigned int keylen)281e63183aSEric Biggers static int cast5_setkey_skcipher(struct crypto_skcipher *tfm, const u8 *key,
291e63183aSEric Biggers 				 unsigned int keylen)
304d6d6a2cSJohannes Goetzfried {
311e63183aSEric Biggers 	return cast5_setkey(&tfm->base, key, keylen);
321e63183aSEric Biggers }
331e63183aSEric Biggers 
ecb_encrypt(struct skcipher_request * req)341e63183aSEric Biggers static int ecb_encrypt(struct skcipher_request *req)
354d6d6a2cSJohannes Goetzfried {
36*674d40abSArd Biesheuvel 	ECB_WALK_START(req, CAST5_BLOCK_SIZE, CAST5_PARALLEL_BLOCKS);
37*674d40abSArd Biesheuvel 	ECB_BLOCK(CAST5_PARALLEL_BLOCKS, cast5_ecb_enc_16way);
38*674d40abSArd Biesheuvel 	ECB_BLOCK(1, __cast5_encrypt);
39*674d40abSArd Biesheuvel 	ECB_WALK_END();
404d6d6a2cSJohannes Goetzfried }
414d6d6a2cSJohannes Goetzfried 
ecb_decrypt(struct skcipher_request * req)421e63183aSEric Biggers static int ecb_decrypt(struct skcipher_request *req)
434d6d6a2cSJohannes Goetzfried {
44*674d40abSArd Biesheuvel 	ECB_WALK_START(req, CAST5_BLOCK_SIZE, CAST5_PARALLEL_BLOCKS);
45*674d40abSArd Biesheuvel 	ECB_BLOCK(CAST5_PARALLEL_BLOCKS, cast5_ecb_dec_16way);
46*674d40abSArd Biesheuvel 	ECB_BLOCK(1, __cast5_decrypt);
47*674d40abSArd Biesheuvel 	ECB_WALK_END();
484d6d6a2cSJohannes Goetzfried }
494d6d6a2cSJohannes Goetzfried 
cbc_encrypt(struct skcipher_request * req)501e63183aSEric Biggers static int cbc_encrypt(struct skcipher_request *req)
514d6d6a2cSJohannes Goetzfried {
52*674d40abSArd Biesheuvel 	CBC_WALK_START(req, CAST5_BLOCK_SIZE, -1);
53*674d40abSArd Biesheuvel 	CBC_ENC_BLOCK(__cast5_encrypt);
54*674d40abSArd Biesheuvel 	CBC_WALK_END();
554d6d6a2cSJohannes Goetzfried }
564d6d6a2cSJohannes Goetzfried 
cbc_decrypt(struct skcipher_request * req)571e63183aSEric Biggers static int cbc_decrypt(struct skcipher_request *req)
584d6d6a2cSJohannes Goetzfried {
59*674d40abSArd Biesheuvel 	CBC_WALK_START(req, CAST5_BLOCK_SIZE, CAST5_PARALLEL_BLOCKS);
60*674d40abSArd Biesheuvel 	CBC_DEC_BLOCK(CAST5_PARALLEL_BLOCKS, cast5_cbc_dec_16way);
61*674d40abSArd Biesheuvel 	CBC_DEC_BLOCK(1, __cast5_decrypt);
62*674d40abSArd Biesheuvel 	CBC_WALK_END();
634d6d6a2cSJohannes Goetzfried }
644d6d6a2cSJohannes Goetzfried 
651e63183aSEric Biggers static struct skcipher_alg cast5_algs[] = {
661e63183aSEric Biggers 	{
671e63183aSEric Biggers 		.base.cra_name		= "__ecb(cast5)",
681e63183aSEric Biggers 		.base.cra_driver_name	= "__ecb-cast5-avx",
691e63183aSEric Biggers 		.base.cra_priority	= 200,
701e63183aSEric Biggers 		.base.cra_flags		= CRYPTO_ALG_INTERNAL,
711e63183aSEric Biggers 		.base.cra_blocksize	= CAST5_BLOCK_SIZE,
721e63183aSEric Biggers 		.base.cra_ctxsize	= sizeof(struct cast5_ctx),
731e63183aSEric Biggers 		.base.cra_module	= THIS_MODULE,
744d6d6a2cSJohannes Goetzfried 		.min_keysize		= CAST5_MIN_KEY_SIZE,
754d6d6a2cSJohannes Goetzfried 		.max_keysize		= CAST5_MAX_KEY_SIZE,
761e63183aSEric Biggers 		.setkey			= cast5_setkey_skcipher,
774d6d6a2cSJohannes Goetzfried 		.encrypt		= ecb_encrypt,
784d6d6a2cSJohannes Goetzfried 		.decrypt		= ecb_decrypt,
794d6d6a2cSJohannes Goetzfried 	}, {
801e63183aSEric Biggers 		.base.cra_name		= "__cbc(cast5)",
811e63183aSEric Biggers 		.base.cra_driver_name	= "__cbc-cast5-avx",
821e63183aSEric Biggers 		.base.cra_priority	= 200,
831e63183aSEric Biggers 		.base.cra_flags		= CRYPTO_ALG_INTERNAL,
841e63183aSEric Biggers 		.base.cra_blocksize	= CAST5_BLOCK_SIZE,
851e63183aSEric Biggers 		.base.cra_ctxsize	= sizeof(struct cast5_ctx),
861e63183aSEric Biggers 		.base.cra_module	= THIS_MODULE,
874d6d6a2cSJohannes Goetzfried 		.min_keysize		= CAST5_MIN_KEY_SIZE,
884d6d6a2cSJohannes Goetzfried 		.max_keysize		= CAST5_MAX_KEY_SIZE,
891e63183aSEric Biggers 		.ivsize			= CAST5_BLOCK_SIZE,
901e63183aSEric Biggers 		.setkey			= cast5_setkey_skcipher,
914d6d6a2cSJohannes Goetzfried 		.encrypt		= cbc_encrypt,
924d6d6a2cSJohannes Goetzfried 		.decrypt		= cbc_decrypt,
931e63183aSEric Biggers 	}
941e63183aSEric Biggers };
951e63183aSEric Biggers 
961e63183aSEric Biggers static struct simd_skcipher_alg *cast5_simd_algs[ARRAY_SIZE(cast5_algs)];
974d6d6a2cSJohannes Goetzfried 
cast5_init(void)984d6d6a2cSJohannes Goetzfried static int __init cast5_init(void)
994d6d6a2cSJohannes Goetzfried {
100d5d34d98SIngo Molnar 	const char *feature_name;
1014d6d6a2cSJohannes Goetzfried 
102d91cab78SDave Hansen 	if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM,
103d91cab78SDave Hansen 				&feature_name)) {
104d5d34d98SIngo Molnar 		pr_info("CPU feature '%s' is not supported.\n", feature_name);
1054d6d6a2cSJohannes Goetzfried 		return -ENODEV;
1064d6d6a2cSJohannes Goetzfried 	}
1074d6d6a2cSJohannes Goetzfried 
1081e63183aSEric Biggers 	return simd_register_skciphers_compat(cast5_algs,
1091e63183aSEric Biggers 					      ARRAY_SIZE(cast5_algs),
1101e63183aSEric Biggers 					      cast5_simd_algs);
1114d6d6a2cSJohannes Goetzfried }
1124d6d6a2cSJohannes Goetzfried 
cast5_exit(void)1134d6d6a2cSJohannes Goetzfried static void __exit cast5_exit(void)
1144d6d6a2cSJohannes Goetzfried {
1151e63183aSEric Biggers 	simd_unregister_skciphers(cast5_algs, ARRAY_SIZE(cast5_algs),
1161e63183aSEric Biggers 				  cast5_simd_algs);
1174d6d6a2cSJohannes Goetzfried }
1184d6d6a2cSJohannes Goetzfried 
1194d6d6a2cSJohannes Goetzfried module_init(cast5_init);
1204d6d6a2cSJohannes Goetzfried module_exit(cast5_exit);
1214d6d6a2cSJohannes Goetzfried 
1224d6d6a2cSJohannes Goetzfried MODULE_DESCRIPTION("Cast5 Cipher Algorithm, AVX optimized");
1234d6d6a2cSJohannes Goetzfried MODULE_LICENSE("GPL");
1245d26a105SKees Cook MODULE_ALIAS_CRYPTO("cast5");
125