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