aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64/crypto/aes-glue.c
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2014-11-03 11:50:01 -0500
committerWill Deacon <will.deacon@arm.com>2014-11-06 12:25:28 -0500
commit12ac3efe74f888a13cb4df88b38bb01e8034dea8 (patch)
tree081f49d1ba791aeffbb6aec6285c560bc67b3ed3 /arch/arm64/crypto/aes-glue.c
parent286fb1cc32b11c18da3573a8c8c37a4f9da16e30 (diff)
arm64/crypto: use crypto instructions to generate AES key schedule
This patch implements the AES key schedule generation using ARMv8 Crypto Instructions. It replaces the table based C implementation in aes_generic.ko, which means we can drop the dependency on that module. Tested-by: Steve Capper <steve.capper@linaro.org> Acked-by: Steve Capper <steve.capper@linaro.org> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64/crypto/aes-glue.c')
-rw-r--r--arch/arm64/crypto/aes-glue.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/arch/arm64/crypto/aes-glue.c b/arch/arm64/crypto/aes-glue.c
index 79cd911ef88c..801aae32841f 100644
--- a/arch/arm64/crypto/aes-glue.c
+++ b/arch/arm64/crypto/aes-glue.c
@@ -16,9 +16,13 @@
16#include <linux/module.h> 16#include <linux/module.h>
17#include <linux/cpufeature.h> 17#include <linux/cpufeature.h>
18 18
19#include "aes-ce-setkey.h"
20
19#ifdef USE_V8_CRYPTO_EXTENSIONS 21#ifdef USE_V8_CRYPTO_EXTENSIONS
20#define MODE "ce" 22#define MODE "ce"
21#define PRIO 300 23#define PRIO 300
24#define aes_setkey ce_aes_setkey
25#define aes_expandkey ce_aes_expandkey
22#define aes_ecb_encrypt ce_aes_ecb_encrypt 26#define aes_ecb_encrypt ce_aes_ecb_encrypt
23#define aes_ecb_decrypt ce_aes_ecb_decrypt 27#define aes_ecb_decrypt ce_aes_ecb_decrypt
24#define aes_cbc_encrypt ce_aes_cbc_encrypt 28#define aes_cbc_encrypt ce_aes_cbc_encrypt
@@ -30,6 +34,8 @@ MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS using ARMv8 Crypto Extensions");
30#else 34#else
31#define MODE "neon" 35#define MODE "neon"
32#define PRIO 200 36#define PRIO 200
37#define aes_setkey crypto_aes_set_key
38#define aes_expandkey crypto_aes_expand_key
33#define aes_ecb_encrypt neon_aes_ecb_encrypt 39#define aes_ecb_encrypt neon_aes_ecb_encrypt
34#define aes_ecb_decrypt neon_aes_ecb_decrypt 40#define aes_ecb_decrypt neon_aes_ecb_decrypt
35#define aes_cbc_encrypt neon_aes_cbc_encrypt 41#define aes_cbc_encrypt neon_aes_cbc_encrypt
@@ -79,10 +85,10 @@ static int xts_set_key(struct crypto_tfm *tfm, const u8 *in_key,
79 struct crypto_aes_xts_ctx *ctx = crypto_tfm_ctx(tfm); 85 struct crypto_aes_xts_ctx *ctx = crypto_tfm_ctx(tfm);
80 int ret; 86 int ret;
81 87
82 ret = crypto_aes_expand_key(&ctx->key1, in_key, key_len / 2); 88 ret = aes_expandkey(&ctx->key1, in_key, key_len / 2);
83 if (!ret) 89 if (!ret)
84 ret = crypto_aes_expand_key(&ctx->key2, &in_key[key_len / 2], 90 ret = aes_expandkey(&ctx->key2, &in_key[key_len / 2],
85 key_len / 2); 91 key_len / 2);
86 if (!ret) 92 if (!ret)
87 return 0; 93 return 0;
88 94
@@ -288,7 +294,7 @@ static struct crypto_alg aes_algs[] = { {
288 .min_keysize = AES_MIN_KEY_SIZE, 294 .min_keysize = AES_MIN_KEY_SIZE,
289 .max_keysize = AES_MAX_KEY_SIZE, 295 .max_keysize = AES_MAX_KEY_SIZE,
290 .ivsize = AES_BLOCK_SIZE, 296 .ivsize = AES_BLOCK_SIZE,
291 .setkey = crypto_aes_set_key, 297 .setkey = aes_setkey,
292 .encrypt = ecb_encrypt, 298 .encrypt = ecb_encrypt,
293 .decrypt = ecb_decrypt, 299 .decrypt = ecb_decrypt,
294 }, 300 },
@@ -306,7 +312,7 @@ static struct crypto_alg aes_algs[] = { {
306 .min_keysize = AES_MIN_KEY_SIZE, 312 .min_keysize = AES_MIN_KEY_SIZE,
307 .max_keysize = AES_MAX_KEY_SIZE, 313 .max_keysize = AES_MAX_KEY_SIZE,
308 .ivsize = AES_BLOCK_SIZE, 314 .ivsize = AES_BLOCK_SIZE,
309 .setkey = crypto_aes_set_key, 315 .setkey = aes_setkey,
310 .encrypt = cbc_encrypt, 316 .encrypt = cbc_encrypt,
311 .decrypt = cbc_decrypt, 317 .decrypt = cbc_decrypt,
312 }, 318 },
@@ -324,7 +330,7 @@ static struct crypto_alg aes_algs[] = { {
324 .min_keysize = AES_MIN_KEY_SIZE, 330 .min_keysize = AES_MIN_KEY_SIZE,
325 .max_keysize = AES_MAX_KEY_SIZE, 331 .max_keysize = AES_MAX_KEY_SIZE,
326 .ivsize = AES_BLOCK_SIZE, 332 .ivsize = AES_BLOCK_SIZE,
327 .setkey = crypto_aes_set_key, 333 .setkey = aes_setkey,
328 .encrypt = ctr_encrypt, 334 .encrypt = ctr_encrypt,
329 .decrypt = ctr_encrypt, 335 .decrypt = ctr_encrypt,
330 }, 336 },