diff options
author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2014-11-03 11:50:01 -0500 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2014-11-06 12:25:28 -0500 |
commit | 12ac3efe74f888a13cb4df88b38bb01e8034dea8 (patch) | |
tree | 081f49d1ba791aeffbb6aec6285c560bc67b3ed3 /arch/arm64/crypto/aes-glue.c | |
parent | 286fb1cc32b11c18da3573a8c8c37a4f9da16e30 (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.c | 18 |
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 | }, |