1*a2484474SEric Biggers // SPDX-License-Identifier: GPL-2.0-or-later 2*a2484474SEric Biggers /* 3*a2484474SEric Biggers * Crypto API support for AES block cipher 4*a2484474SEric Biggers * 5*a2484474SEric Biggers * Copyright 2026 Google LLC 6*a2484474SEric Biggers */ 7*a2484474SEric Biggers 8*a2484474SEric Biggers #include <crypto/aes.h> 9*a2484474SEric Biggers #include <crypto/algapi.h> 10*a2484474SEric Biggers #include <linux/module.h> 11*a2484474SEric Biggers 12*a2484474SEric Biggers static_assert(__alignof__(struct aes_key) <= CRYPTO_MINALIGN); 13*a2484474SEric Biggers 14*a2484474SEric Biggers static int crypto_aes_setkey(struct crypto_tfm *tfm, const u8 *in_key, 15*a2484474SEric Biggers unsigned int key_len) 16*a2484474SEric Biggers { 17*a2484474SEric Biggers struct aes_key *key = crypto_tfm_ctx(tfm); 18*a2484474SEric Biggers 19*a2484474SEric Biggers return aes_preparekey(key, in_key, key_len); 20*a2484474SEric Biggers } 21*a2484474SEric Biggers 22*a2484474SEric Biggers static void crypto_aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) 23*a2484474SEric Biggers { 24*a2484474SEric Biggers const struct aes_key *key = crypto_tfm_ctx(tfm); 25*a2484474SEric Biggers 26*a2484474SEric Biggers aes_encrypt(key, out, in); 27*a2484474SEric Biggers } 28*a2484474SEric Biggers 29*a2484474SEric Biggers static void crypto_aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) 30*a2484474SEric Biggers { 31*a2484474SEric Biggers const struct aes_key *key = crypto_tfm_ctx(tfm); 32*a2484474SEric Biggers 33*a2484474SEric Biggers aes_decrypt(key, out, in); 34*a2484474SEric Biggers } 35*a2484474SEric Biggers 36*a2484474SEric Biggers static struct crypto_alg alg = { 37*a2484474SEric Biggers .cra_name = "aes", 38*a2484474SEric Biggers .cra_driver_name = "aes-lib", 39*a2484474SEric Biggers .cra_priority = 100, 40*a2484474SEric Biggers .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 41*a2484474SEric Biggers .cra_blocksize = AES_BLOCK_SIZE, 42*a2484474SEric Biggers .cra_ctxsize = sizeof(struct aes_key), 43*a2484474SEric Biggers .cra_module = THIS_MODULE, 44*a2484474SEric Biggers .cra_u = { .cipher = { .cia_min_keysize = AES_MIN_KEY_SIZE, 45*a2484474SEric Biggers .cia_max_keysize = AES_MAX_KEY_SIZE, 46*a2484474SEric Biggers .cia_setkey = crypto_aes_setkey, 47*a2484474SEric Biggers .cia_encrypt = crypto_aes_encrypt, 48*a2484474SEric Biggers .cia_decrypt = crypto_aes_decrypt } } 49*a2484474SEric Biggers }; 50*a2484474SEric Biggers 51*a2484474SEric Biggers static int __init crypto_aes_mod_init(void) 52*a2484474SEric Biggers { 53*a2484474SEric Biggers return crypto_register_alg(&alg); 54*a2484474SEric Biggers } 55*a2484474SEric Biggers module_init(crypto_aes_mod_init); 56*a2484474SEric Biggers 57*a2484474SEric Biggers static void __exit crypto_aes_mod_exit(void) 58*a2484474SEric Biggers { 59*a2484474SEric Biggers crypto_unregister_alg(&alg); 60*a2484474SEric Biggers } 61*a2484474SEric Biggers module_exit(crypto_aes_mod_exit); 62*a2484474SEric Biggers 63*a2484474SEric Biggers MODULE_DESCRIPTION("Crypto API support for AES block cipher"); 64*a2484474SEric Biggers MODULE_LICENSE("GPL"); 65*a2484474SEric Biggers MODULE_ALIAS_CRYPTO("aes"); 66*a2484474SEric Biggers MODULE_ALIAS_CRYPTO("aes-lib"); 67