1/* 2 * Glue Code for the asm optimized version of the AES Cipher Algorithm 3 */ 4 5#include <linux/module.h> 6#include <linux/crypto.h> 7#include <crypto/aes.h> 8 9#include "aes_glue.h" 10 11EXPORT_SYMBOL(AES_encrypt); 12EXPORT_SYMBOL(AES_decrypt); 13EXPORT_SYMBOL(private_AES_set_encrypt_key); 14EXPORT_SYMBOL(private_AES_set_decrypt_key); 15 16static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 17{ 18 struct AES_CTX *ctx = crypto_tfm_ctx(tfm); 19 AES_encrypt(src, dst, &ctx->enc_key); 20} 21 22static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 23{ 24 struct AES_CTX *ctx = crypto_tfm_ctx(tfm); 25 AES_decrypt(src, dst, &ctx->dec_key); 26} 27 28static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, 29 unsigned int key_len) 30{ 31 struct AES_CTX *ctx = crypto_tfm_ctx(tfm); 32 33 switch (key_len) { 34 case AES_KEYSIZE_128: 35 key_len = 128; 36 break; 37 case AES_KEYSIZE_192: 38 key_len = 192; 39 break; 40 case AES_KEYSIZE_256: 41 key_len = 256; 42 break; 43 default: 44 tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; 45 return -EINVAL; 46 } 47 48 if (private_AES_set_encrypt_key(in_key, key_len, &ctx->enc_key) == -1) { 49 tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; 50 return -EINVAL; 51 } 52 /* private_AES_set_decrypt_key expects an encryption key as input */ 53 ctx->dec_key = ctx->enc_key; 54 if (private_AES_set_decrypt_key(in_key, key_len, &ctx->dec_key) == -1) { 55 tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; 56 return -EINVAL; 57 } 58 return 0; 59} 60 61static struct crypto_alg aes_alg = { 62 .cra_name = "aes", 63 .cra_driver_name = "aes-asm", 64 .cra_priority = 200, 65 .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 66 .cra_blocksize = AES_BLOCK_SIZE, 67 .cra_ctxsize = sizeof(struct AES_CTX), 68 .cra_module = THIS_MODULE, 69 .cra_list = LIST_HEAD_INIT(aes_alg.cra_list), 70 .cra_u = { 71 .cipher = { 72 .cia_min_keysize = AES_MIN_KEY_SIZE, 73 .cia_max_keysize = AES_MAX_KEY_SIZE, 74 .cia_setkey = aes_set_key, 75 .cia_encrypt = aes_encrypt, 76 .cia_decrypt = aes_decrypt 77 } 78 } 79}; 80 81static int __init aes_init(void) 82{ 83 return crypto_register_alg(&aes_alg); 84} 85 86static void __exit aes_fini(void) 87{ 88 crypto_unregister_alg(&aes_alg); 89} 90 91module_init(aes_init); 92module_exit(aes_fini); 93 94MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm (ASM)"); 95MODULE_LICENSE("GPL"); 96MODULE_ALIAS("aes"); 97MODULE_ALIAS("aes-asm"); 98MODULE_AUTHOR("David McCullough <ucdevel@gmail.com>"); 99