xref: /linux/crypto/aes_ti.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2b5e0b032SArd Biesheuvel /*
3b5e0b032SArd Biesheuvel  * Scalar fixed time AES core transform
4b5e0b032SArd Biesheuvel  *
5b5e0b032SArd Biesheuvel  * Copyright (C) 2017 Linaro Ltd <ard.biesheuvel@linaro.org>
6b5e0b032SArd Biesheuvel  */
7b5e0b032SArd Biesheuvel 
8b5e0b032SArd Biesheuvel #include <crypto/aes.h>
9*14386d47SHerbert Xu #include <crypto/algapi.h>
10b5e0b032SArd Biesheuvel #include <linux/module.h>
11b5e0b032SArd Biesheuvel 
aesti_set_key(struct crypto_tfm * tfm,const u8 * in_key,unsigned int key_len)12b5e0b032SArd Biesheuvel static int aesti_set_key(struct crypto_tfm *tfm, const u8 *in_key,
13b5e0b032SArd Biesheuvel 			 unsigned int key_len)
14b5e0b032SArd Biesheuvel {
15b5e0b032SArd Biesheuvel 	struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
16b5e0b032SArd Biesheuvel 
17e59c1c98SArd Biesheuvel 	return aes_expandkey(ctx, in_key, key_len);
18b5e0b032SArd Biesheuvel }
19b5e0b032SArd Biesheuvel 
aesti_encrypt(struct crypto_tfm * tfm,u8 * out,const u8 * in)20b5e0b032SArd Biesheuvel static void aesti_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
21b5e0b032SArd Biesheuvel {
22b5e0b032SArd Biesheuvel 	const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
230a6a40c2SEric Biggers 	unsigned long flags;
24b5e0b032SArd Biesheuvel 
250a6a40c2SEric Biggers 	/*
260a6a40c2SEric Biggers 	 * Temporarily disable interrupts to avoid races where cachelines are
270a6a40c2SEric Biggers 	 * evicted when the CPU is interrupted to do something else.
280a6a40c2SEric Biggers 	 */
290a6a40c2SEric Biggers 	local_irq_save(flags);
300a6a40c2SEric Biggers 
31e59c1c98SArd Biesheuvel 	aes_encrypt(ctx, out, in);
320a6a40c2SEric Biggers 
330a6a40c2SEric Biggers 	local_irq_restore(flags);
34b5e0b032SArd Biesheuvel }
35b5e0b032SArd Biesheuvel 
aesti_decrypt(struct crypto_tfm * tfm,u8 * out,const u8 * in)36b5e0b032SArd Biesheuvel static void aesti_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
37b5e0b032SArd Biesheuvel {
38b5e0b032SArd Biesheuvel 	const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
390a6a40c2SEric Biggers 	unsigned long flags;
40b5e0b032SArd Biesheuvel 
410a6a40c2SEric Biggers 	/*
420a6a40c2SEric Biggers 	 * Temporarily disable interrupts to avoid races where cachelines are
430a6a40c2SEric Biggers 	 * evicted when the CPU is interrupted to do something else.
440a6a40c2SEric Biggers 	 */
450a6a40c2SEric Biggers 	local_irq_save(flags);
460a6a40c2SEric Biggers 
47e59c1c98SArd Biesheuvel 	aes_decrypt(ctx, out, in);
480a6a40c2SEric Biggers 
490a6a40c2SEric Biggers 	local_irq_restore(flags);
50b5e0b032SArd Biesheuvel }
51b5e0b032SArd Biesheuvel 
52b5e0b032SArd Biesheuvel static struct crypto_alg aes_alg = {
53b5e0b032SArd Biesheuvel 	.cra_name			= "aes",
54b5e0b032SArd Biesheuvel 	.cra_driver_name		= "aes-fixed-time",
55b5e0b032SArd Biesheuvel 	.cra_priority			= 100 + 1,
56b5e0b032SArd Biesheuvel 	.cra_flags			= CRYPTO_ALG_TYPE_CIPHER,
57b5e0b032SArd Biesheuvel 	.cra_blocksize			= AES_BLOCK_SIZE,
58b5e0b032SArd Biesheuvel 	.cra_ctxsize			= sizeof(struct crypto_aes_ctx),
59b5e0b032SArd Biesheuvel 	.cra_module			= THIS_MODULE,
60b5e0b032SArd Biesheuvel 
61b5e0b032SArd Biesheuvel 	.cra_cipher.cia_min_keysize	= AES_MIN_KEY_SIZE,
62b5e0b032SArd Biesheuvel 	.cra_cipher.cia_max_keysize	= AES_MAX_KEY_SIZE,
63b5e0b032SArd Biesheuvel 	.cra_cipher.cia_setkey		= aesti_set_key,
64b5e0b032SArd Biesheuvel 	.cra_cipher.cia_encrypt		= aesti_encrypt,
65b5e0b032SArd Biesheuvel 	.cra_cipher.cia_decrypt		= aesti_decrypt
66b5e0b032SArd Biesheuvel };
67b5e0b032SArd Biesheuvel 
aes_init(void)68b5e0b032SArd Biesheuvel static int __init aes_init(void)
69b5e0b032SArd Biesheuvel {
70b5e0b032SArd Biesheuvel 	return crypto_register_alg(&aes_alg);
71b5e0b032SArd Biesheuvel }
72b5e0b032SArd Biesheuvel 
aes_fini(void)73b5e0b032SArd Biesheuvel static void __exit aes_fini(void)
74b5e0b032SArd Biesheuvel {
75b5e0b032SArd Biesheuvel 	crypto_unregister_alg(&aes_alg);
76b5e0b032SArd Biesheuvel }
77b5e0b032SArd Biesheuvel 
78b5e0b032SArd Biesheuvel module_init(aes_init);
79b5e0b032SArd Biesheuvel module_exit(aes_fini);
80b5e0b032SArd Biesheuvel 
81b5e0b032SArd Biesheuvel MODULE_DESCRIPTION("Generic fixed time AES");
82b5e0b032SArd Biesheuvel MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
83b5e0b032SArd Biesheuvel MODULE_LICENSE("GPL v2");
84