forked from pool/gnutls
91 lines
2.8 KiB
Diff
91 lines
2.8 KiB
Diff
|
From 96c632161c8f25ecc1aa55d01c6d5e8aec450792 Mon Sep 17 00:00:00 2001
|
||
|
From: Nikos Mavrogiannopoulos <nmav@gnutls.org>
|
||
|
Date: Thu, 11 Aug 2011 18:48:44 +0200
|
||
|
Subject: [PATCH 3/6] Force alignment for AES-NI to the runtime rather than on the structures.
|
||
|
Corrects issue on some systems (reported by Andreas Radke).
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
|
||
|
Signed-off-by: Cristian Rodríguez <crrodriguez@opensuse.org>
|
||
|
---
|
||
|
lib/accelerated/intel/aes-x86.c | 11 +++++++----
|
||
|
lib/accelerated/intel/aes-x86.h | 11 +++--------
|
||
|
2 files changed, 10 insertions(+), 12 deletions(-)
|
||
|
|
||
|
diff --git a/lib/accelerated/intel/aes-x86.c b/lib/accelerated/intel/aes-x86.c
|
||
|
index 53b3bde..970e613 100644
|
||
|
--- a/lib/accelerated/intel/aes-x86.c
|
||
|
+++ b/lib/accelerated/intel/aes-x86.c
|
||
|
@@ -39,6 +39,9 @@ struct aes_ctx
|
||
|
uint8_t iv[16];
|
||
|
};
|
||
|
|
||
|
+#define ALIGN16(x) \
|
||
|
+ ((void *)(((unsigned long)(x)+0x0f)&~(0x0f)))
|
||
|
+
|
||
|
static int
|
||
|
aes_cipher_init (gnutls_cipher_algorithm_t algorithm, void **_ctx)
|
||
|
{
|
||
|
@@ -68,11 +71,11 @@ aes_cipher_setkey (void *_ctx, const void *userkey, size_t keysize)
|
||
|
struct aes_ctx *ctx = _ctx;
|
||
|
int ret;
|
||
|
|
||
|
- ret = aesni_set_encrypt_key (userkey, keysize * 8, &ctx->expanded_key);
|
||
|
+ ret = aesni_set_encrypt_key (userkey, keysize * 8, ALIGN16(&ctx->expanded_key));
|
||
|
if (ret != 0)
|
||
|
return gnutls_assert_val (GNUTLS_E_ENCRYPTION_FAILED);
|
||
|
|
||
|
- ret = aesni_set_decrypt_key (userkey, keysize * 8, &ctx->expanded_key_dec);
|
||
|
+ ret = aesni_set_decrypt_key (userkey, keysize * 8, ALIGN16(&ctx->expanded_key_dec));
|
||
|
if (ret != 0)
|
||
|
return gnutls_assert_val (GNUTLS_E_ENCRYPTION_FAILED);
|
||
|
|
||
|
@@ -94,7 +97,7 @@ aes_encrypt (void *_ctx, const void *src, size_t src_size,
|
||
|
{
|
||
|
struct aes_ctx *ctx = _ctx;
|
||
|
|
||
|
- aesni_cbc_encrypt (src, dst, src_size, &ctx->expanded_key, ctx->iv, 1);
|
||
|
+ aesni_cbc_encrypt (src, dst, src_size, ALIGN16(&ctx->expanded_key), ctx->iv, 1);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@@ -104,7 +107,7 @@ aes_decrypt (void *_ctx, const void *src, size_t src_size,
|
||
|
{
|
||
|
struct aes_ctx *ctx = _ctx;
|
||
|
|
||
|
- aesni_cbc_encrypt (src, dst, src_size, &ctx->expanded_key_dec, ctx->iv, 0);
|
||
|
+ aesni_cbc_encrypt (src, dst, src_size, ALIGN16(&ctx->expanded_key_dec), ctx->iv, 0);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
diff --git a/lib/accelerated/intel/aes-x86.h b/lib/accelerated/intel/aes-x86.h
|
||
|
index 8f49ff3..a4cac1d 100644
|
||
|
--- a/lib/accelerated/intel/aes-x86.h
|
||
|
+++ b/lib/accelerated/intel/aes-x86.h
|
||
|
@@ -5,17 +5,12 @@
|
||
|
|
||
|
void register_x86_crypto (void);
|
||
|
|
||
|
-#ifdef __GNUC__
|
||
|
-# define ALIGN16 __attribute__ ((aligned (16)))
|
||
|
-#else
|
||
|
-# define ALIGN16
|
||
|
-#endif
|
||
|
-
|
||
|
+#define AES_KEY_ALIGN_SIZE 4
|
||
|
#define AES_MAXNR 14
|
||
|
typedef struct
|
||
|
{
|
||
|
- uint32_t ALIGN16 rd_key[4 * (AES_MAXNR + 1)];
|
||
|
- int rounds;
|
||
|
+ uint32_t rd_key[4 * (AES_MAXNR + 1)+AES_KEY_ALIGN_SIZE];
|
||
|
+ int rounds; /* unused... */
|
||
|
} AES_KEY;
|
||
|
|
||
|
void aesni_ecb_encrypt (const unsigned char *in, unsigned char *out,
|
||
|
--
|
||
|
1.7.4.1
|
||
|
|