diff options
Diffstat (limited to 'drivers/crypto/padlock-aes.c')
-rw-r--r-- | drivers/crypto/padlock-aes.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c index 5f7e71810489..2f3ad3f7dfea 100644 --- a/drivers/crypto/padlock-aes.c +++ b/drivers/crypto/padlock-aes.c | |||
@@ -44,6 +44,7 @@ | |||
44 | */ | 44 | */ |
45 | 45 | ||
46 | #include <crypto/algapi.h> | 46 | #include <crypto/algapi.h> |
47 | #include <crypto/aes.h> | ||
47 | #include <linux/module.h> | 48 | #include <linux/module.h> |
48 | #include <linux/init.h> | 49 | #include <linux/init.h> |
49 | #include <linux/types.h> | 50 | #include <linux/types.h> |
@@ -53,9 +54,6 @@ | |||
53 | #include <asm/byteorder.h> | 54 | #include <asm/byteorder.h> |
54 | #include "padlock.h" | 55 | #include "padlock.h" |
55 | 56 | ||
56 | #define AES_MIN_KEY_SIZE 16 /* in uint8_t units */ | ||
57 | #define AES_MAX_KEY_SIZE 32 /* ditto */ | ||
58 | #define AES_BLOCK_SIZE 16 /* ditto */ | ||
59 | #define AES_EXTENDED_KEY_SIZE 64 /* in uint32_t units */ | 57 | #define AES_EXTENDED_KEY_SIZE 64 /* in uint32_t units */ |
60 | #define AES_EXTENDED_KEY_SIZE_B (AES_EXTENDED_KEY_SIZE * sizeof(uint32_t)) | 58 | #define AES_EXTENDED_KEY_SIZE_B (AES_EXTENDED_KEY_SIZE * sizeof(uint32_t)) |
61 | 59 | ||
@@ -419,6 +417,11 @@ static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key, | |||
419 | /* ====== Encryption/decryption routines ====== */ | 417 | /* ====== Encryption/decryption routines ====== */ |
420 | 418 | ||
421 | /* These are the real call to PadLock. */ | 419 | /* These are the real call to PadLock. */ |
420 | static inline void padlock_reset_key(void) | ||
421 | { | ||
422 | asm volatile ("pushfl; popfl"); | ||
423 | } | ||
424 | |||
422 | static inline void padlock_xcrypt(const u8 *input, u8 *output, void *key, | 425 | static inline void padlock_xcrypt(const u8 *input, u8 *output, void *key, |
423 | void *control_word) | 426 | void *control_word) |
424 | { | 427 | { |
@@ -439,8 +442,6 @@ static void aes_crypt_copy(const u8 *in, u8 *out, u32 *key, struct cword *cword) | |||
439 | static inline void aes_crypt(const u8 *in, u8 *out, u32 *key, | 442 | static inline void aes_crypt(const u8 *in, u8 *out, u32 *key, |
440 | struct cword *cword) | 443 | struct cword *cword) |
441 | { | 444 | { |
442 | asm volatile ("pushfl; popfl"); | ||
443 | |||
444 | /* padlock_xcrypt requires at least two blocks of data. */ | 445 | /* padlock_xcrypt requires at least two blocks of data. */ |
445 | if (unlikely(!(((unsigned long)in ^ (PAGE_SIZE - AES_BLOCK_SIZE)) & | 446 | if (unlikely(!(((unsigned long)in ^ (PAGE_SIZE - AES_BLOCK_SIZE)) & |
446 | (PAGE_SIZE - 1)))) { | 447 | (PAGE_SIZE - 1)))) { |
@@ -459,7 +460,6 @@ static inline void padlock_xcrypt_ecb(const u8 *input, u8 *output, void *key, | |||
459 | return; | 460 | return; |
460 | } | 461 | } |
461 | 462 | ||
462 | asm volatile ("pushfl; popfl"); /* enforce key reload. */ | ||
463 | asm volatile ("test $1, %%cl;" | 463 | asm volatile ("test $1, %%cl;" |
464 | "je 1f;" | 464 | "je 1f;" |
465 | "lea -1(%%ecx), %%eax;" | 465 | "lea -1(%%ecx), %%eax;" |
@@ -476,8 +476,6 @@ static inline void padlock_xcrypt_ecb(const u8 *input, u8 *output, void *key, | |||
476 | static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void *key, | 476 | static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void *key, |
477 | u8 *iv, void *control_word, u32 count) | 477 | u8 *iv, void *control_word, u32 count) |
478 | { | 478 | { |
479 | /* Enforce key reload. */ | ||
480 | asm volatile ("pushfl; popfl"); | ||
481 | /* rep xcryptcbc */ | 479 | /* rep xcryptcbc */ |
482 | asm volatile (".byte 0xf3,0x0f,0xa7,0xd0" | 480 | asm volatile (".byte 0xf3,0x0f,0xa7,0xd0" |
483 | : "+S" (input), "+D" (output), "+a" (iv) | 481 | : "+S" (input), "+D" (output), "+a" (iv) |
@@ -488,12 +486,14 @@ static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void *key, | |||
488 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | 486 | static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
489 | { | 487 | { |
490 | struct aes_ctx *ctx = aes_ctx(tfm); | 488 | struct aes_ctx *ctx = aes_ctx(tfm); |
489 | padlock_reset_key(); | ||
491 | aes_crypt(in, out, ctx->E, &ctx->cword.encrypt); | 490 | aes_crypt(in, out, ctx->E, &ctx->cword.encrypt); |
492 | } | 491 | } |
493 | 492 | ||
494 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) | 493 | static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) |
495 | { | 494 | { |
496 | struct aes_ctx *ctx = aes_ctx(tfm); | 495 | struct aes_ctx *ctx = aes_ctx(tfm); |
496 | padlock_reset_key(); | ||
497 | aes_crypt(in, out, ctx->D, &ctx->cword.decrypt); | 497 | aes_crypt(in, out, ctx->D, &ctx->cword.decrypt); |
498 | } | 498 | } |
499 | 499 | ||
@@ -526,6 +526,8 @@ static int ecb_aes_encrypt(struct blkcipher_desc *desc, | |||
526 | struct blkcipher_walk walk; | 526 | struct blkcipher_walk walk; |
527 | int err; | 527 | int err; |
528 | 528 | ||
529 | padlock_reset_key(); | ||
530 | |||
529 | blkcipher_walk_init(&walk, dst, src, nbytes); | 531 | blkcipher_walk_init(&walk, dst, src, nbytes); |
530 | err = blkcipher_walk_virt(desc, &walk); | 532 | err = blkcipher_walk_virt(desc, &walk); |
531 | 533 | ||
@@ -548,6 +550,8 @@ static int ecb_aes_decrypt(struct blkcipher_desc *desc, | |||
548 | struct blkcipher_walk walk; | 550 | struct blkcipher_walk walk; |
549 | int err; | 551 | int err; |
550 | 552 | ||
553 | padlock_reset_key(); | ||
554 | |||
551 | blkcipher_walk_init(&walk, dst, src, nbytes); | 555 | blkcipher_walk_init(&walk, dst, src, nbytes); |
552 | err = blkcipher_walk_virt(desc, &walk); | 556 | err = blkcipher_walk_virt(desc, &walk); |
553 | 557 | ||
@@ -592,6 +596,8 @@ static int cbc_aes_encrypt(struct blkcipher_desc *desc, | |||
592 | struct blkcipher_walk walk; | 596 | struct blkcipher_walk walk; |
593 | int err; | 597 | int err; |
594 | 598 | ||
599 | padlock_reset_key(); | ||
600 | |||
595 | blkcipher_walk_init(&walk, dst, src, nbytes); | 601 | blkcipher_walk_init(&walk, dst, src, nbytes); |
596 | err = blkcipher_walk_virt(desc, &walk); | 602 | err = blkcipher_walk_virt(desc, &walk); |
597 | 603 | ||
@@ -616,6 +622,8 @@ static int cbc_aes_decrypt(struct blkcipher_desc *desc, | |||
616 | struct blkcipher_walk walk; | 622 | struct blkcipher_walk walk; |
617 | int err; | 623 | int err; |
618 | 624 | ||
625 | padlock_reset_key(); | ||
626 | |||
619 | blkcipher_walk_init(&walk, dst, src, nbytes); | 627 | blkcipher_walk_init(&walk, dst, src, nbytes); |
620 | err = blkcipher_walk_virt(desc, &walk); | 628 | err = blkcipher_walk_virt(desc, &walk); |
621 | 629 | ||