cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

aes_ti.c (2028B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Scalar fixed time AES core transform
      4 *
      5 * Copyright (C) 2017 Linaro Ltd <ard.biesheuvel@linaro.org>
      6 */
      7
      8#include <crypto/aes.h>
      9#include <linux/crypto.h>
     10#include <linux/module.h>
     11
     12static int aesti_set_key(struct crypto_tfm *tfm, const u8 *in_key,
     13			 unsigned int key_len)
     14{
     15	struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
     16
     17	return aes_expandkey(ctx, in_key, key_len);
     18}
     19
     20static void aesti_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
     21{
     22	const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
     23	unsigned long flags;
     24
     25	/*
     26	 * Temporarily disable interrupts to avoid races where cachelines are
     27	 * evicted when the CPU is interrupted to do something else.
     28	 */
     29	local_irq_save(flags);
     30
     31	aes_encrypt(ctx, out, in);
     32
     33	local_irq_restore(flags);
     34}
     35
     36static void aesti_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
     37{
     38	const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
     39	unsigned long flags;
     40
     41	/*
     42	 * Temporarily disable interrupts to avoid races where cachelines are
     43	 * evicted when the CPU is interrupted to do something else.
     44	 */
     45	local_irq_save(flags);
     46
     47	aes_decrypt(ctx, out, in);
     48
     49	local_irq_restore(flags);
     50}
     51
     52static struct crypto_alg aes_alg = {
     53	.cra_name			= "aes",
     54	.cra_driver_name		= "aes-fixed-time",
     55	.cra_priority			= 100 + 1,
     56	.cra_flags			= CRYPTO_ALG_TYPE_CIPHER,
     57	.cra_blocksize			= AES_BLOCK_SIZE,
     58	.cra_ctxsize			= sizeof(struct crypto_aes_ctx),
     59	.cra_module			= THIS_MODULE,
     60
     61	.cra_cipher.cia_min_keysize	= AES_MIN_KEY_SIZE,
     62	.cra_cipher.cia_max_keysize	= AES_MAX_KEY_SIZE,
     63	.cra_cipher.cia_setkey		= aesti_set_key,
     64	.cra_cipher.cia_encrypt		= aesti_encrypt,
     65	.cra_cipher.cia_decrypt		= aesti_decrypt
     66};
     67
     68static int __init aes_init(void)
     69{
     70	return crypto_register_alg(&aes_alg);
     71}
     72
     73static void __exit aes_fini(void)
     74{
     75	crypto_unregister_alg(&aes_alg);
     76}
     77
     78module_init(aes_init);
     79module_exit(aes_fini);
     80
     81MODULE_DESCRIPTION("Generic fixed time AES");
     82MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel@linaro.org>");
     83MODULE_LICENSE("GPL v2");