summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2018-02-07 09:24:18 +0100
committerNikos Mavrogiannopoulos <nmav@redhat.com>2018-02-09 11:56:41 +0100
commit1d102683affb1dbca3d2f1ae87ad88b2754832bf (patch)
treed86524a9aca73940ece3aec436106bdcccc41e76
parent23ab9cea554c314fb2488a89825bb8a8858b82c4 (diff)
downloadgnutls-1d102683affb1dbca3d2f1ae87ad88b2754832bf.tar.gz
accelerated: make explicit key size check to all accelerated ciphers
That is, do not rely on checks done on asm level, as they vary and may change over updates. Also handle consistently invalid key sizes by returning an error, and eliminate calls to abort(). Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-rw-r--r--lib/accelerated/aarch64/aes-aarch64.h4
-rw-r--r--lib/accelerated/aarch64/aes-cbc-aarch64.c2
-rw-r--r--lib/accelerated/aarch64/aes-ccm-aarch64.c3
-rw-r--r--lib/accelerated/aarch64/aes-gcm-aarch64.c2
-rw-r--r--lib/accelerated/cryptodev-gcm.c2
-rw-r--r--lib/accelerated/cryptodev.c2
-rw-r--r--lib/accelerated/x86/aes-cbc-x86-aesni.c2
-rw-r--r--lib/accelerated/x86/aes-cbc-x86-ssse3.c3
-rw-r--r--lib/accelerated/x86/aes-gcm-padlock.c3
-rw-r--r--lib/accelerated/x86/aes-gcm-x86-aesni.c3
-rw-r--r--lib/accelerated/x86/aes-gcm-x86-pclmul-avx.c2
-rw-r--r--lib/accelerated/x86/aes-gcm-x86-pclmul.c2
-rw-r--r--lib/accelerated/x86/aes-gcm-x86-ssse3.c3
-rw-r--r--lib/accelerated/x86/aes-padlock.c2
-rw-r--r--lib/accelerated/x86/aes-x86.h4
-rw-r--r--lib/accelerated/x86/x86-common.h4
16 files changed, 37 insertions, 6 deletions
diff --git a/lib/accelerated/aarch64/aes-aarch64.h b/lib/accelerated/aarch64/aes-aarch64.h
index 55b815173c..f596f4aac6 100644
--- a/lib/accelerated/aarch64/aes-aarch64.h
+++ b/lib/accelerated/aarch64/aes-aarch64.h
@@ -16,6 +16,10 @@ typedef struct {
uint32_t rounds;
} AES_KEY;
+#define CHECK_AES_KEYSIZE(s) \
+ if (s != 16 && s != 24 && s != 32) \
+ return GNUTLS_E_INVALID_REQUEST
+
int aes_v8_set_encrypt_key(const unsigned char *userKey, int bits, AES_KEY *key);
int aes_v8_set_decrypt_key(const unsigned char *userKey, int bits, AES_KEY *key);
void aes_v8_cbc_encrypt(const unsigned char *in, unsigned char *out,
diff --git a/lib/accelerated/aarch64/aes-cbc-aarch64.c b/lib/accelerated/aarch64/aes-cbc-aarch64.c
index 649145999f..ae111a396b 100644
--- a/lib/accelerated/aarch64/aes-cbc-aarch64.c
+++ b/lib/accelerated/aarch64/aes-cbc-aarch64.c
@@ -65,6 +65,8 @@ aes_aarch64_cipher_setkey(void *_ctx, const void *userkey, size_t keysize)
struct aes_ctx *ctx = _ctx;
int ret;
+ CHECK_AES_KEYSIZE(keysize);
+
if (ctx->enc)
ret =
aes_v8_set_encrypt_key(userkey, keysize * 8,
diff --git a/lib/accelerated/aarch64/aes-ccm-aarch64.c b/lib/accelerated/aarch64/aes-ccm-aarch64.c
index 590ee6b6ab..006867fb84 100644
--- a/lib/accelerated/aarch64/aes-ccm-aarch64.c
+++ b/lib/accelerated/aarch64/aes-ccm-aarch64.c
@@ -81,6 +81,9 @@ static int
aes_ccm_cipher_setkey(void *_ctx, const void *key, size_t length)
{
struct ccm_aarch64_aes_ctx *ctx = _ctx;
+
+ CHECK_AES_KEYSIZE(length);
+
aes_v8_set_encrypt_key(key, length*8, &ctx->key);
return 0;
diff --git a/lib/accelerated/aarch64/aes-gcm-aarch64.c b/lib/accelerated/aarch64/aes-gcm-aarch64.c
index 677f213f12..e76470fa21 100644
--- a/lib/accelerated/aarch64/aes-gcm-aarch64.c
+++ b/lib/accelerated/aarch64/aes-gcm-aarch64.c
@@ -99,6 +99,8 @@ aes_gcm_cipher_setkey(void *_ctx, const void *userkey, size_t keysize)
struct aes_gcm_ctx *ctx = _ctx;
int ret;
+ CHECK_AES_KEYSIZE(keysize);
+
ret =
aes_v8_set_encrypt_key(userkey, keysize * 8,
ALIGN16(&ctx->expanded_key));
diff --git a/lib/accelerated/cryptodev-gcm.c b/lib/accelerated/cryptodev-gcm.c
index e992b63b47..cea48a21b6 100644
--- a/lib/accelerated/cryptodev-gcm.c
+++ b/lib/accelerated/cryptodev-gcm.c
@@ -99,6 +99,8 @@ aes_gcm_cipher_setkey(void *_ctx, const void *userkey, size_t keysize)
{
struct cryptodev_gcm_ctx *ctx = _ctx;
+ CHECK_AES_KEYSIZE(keysize);
+
ctx->sess.keylen = keysize;
ctx->sess.key = (void *) userkey;
diff --git a/lib/accelerated/cryptodev.c b/lib/accelerated/cryptodev.c
index 03a5d66360..9d04171be4 100644
--- a/lib/accelerated/cryptodev.c
+++ b/lib/accelerated/cryptodev.c
@@ -90,6 +90,8 @@ cryptodev_cipher_setkey(void *_ctx, const void *key, size_t keysize)
{
struct cryptodev_ctx *ctx = _ctx;
+ CHECK_AES_KEYSIZE(keysize);
+
ctx->sess.keylen = keysize;
ctx->sess.key = (void *) key;
diff --git a/lib/accelerated/x86/aes-cbc-x86-aesni.c b/lib/accelerated/x86/aes-cbc-x86-aesni.c
index b935db9723..9b42cdece9 100644
--- a/lib/accelerated/x86/aes-cbc-x86-aesni.c
+++ b/lib/accelerated/x86/aes-cbc-x86-aesni.c
@@ -65,6 +65,8 @@ aes_cipher_setkey(void *_ctx, const void *userkey, size_t keysize)
struct aes_ctx *ctx = _ctx;
int ret;
+ CHECK_AES_KEYSIZE(keysize);
+
if (ctx->enc)
ret =
aesni_set_encrypt_key(userkey, keysize * 8,
diff --git a/lib/accelerated/x86/aes-cbc-x86-ssse3.c b/lib/accelerated/x86/aes-cbc-x86-ssse3.c
index 2bbdeffe1e..9b6120b2aa 100644
--- a/lib/accelerated/x86/aes-cbc-x86-ssse3.c
+++ b/lib/accelerated/x86/aes-cbc-x86-ssse3.c
@@ -65,8 +65,7 @@ aes_ssse3_cipher_setkey(void *_ctx, const void *userkey, size_t keysize)
struct aes_ctx *ctx = _ctx;
int ret;
- if (keysize != 16 && keysize != 24 && keysize != 32)
- return GNUTLS_E_INVALID_REQUEST;
+ CHECK_AES_KEYSIZE(keysize);
if (ctx->enc)
ret =
diff --git a/lib/accelerated/x86/aes-gcm-padlock.c b/lib/accelerated/x86/aes-gcm-padlock.c
index 51b02a8d5c..a6c5d50eb9 100644
--- a/lib/accelerated/x86/aes-gcm-padlock.c
+++ b/lib/accelerated/x86/aes-gcm-padlock.c
@@ -113,7 +113,8 @@ aes_gcm_cipher_setkey(void *_ctx, const void *key, size_t keysize)
} else if (keysize == 32) {
GCM_SET_KEY(ctx, padlock_aes256_set_encrypt_key, padlock_aes_encrypt,
key);
- } else abort();
+ } else
+ return GNUTLS_E_INVALID_REQUEST;
return 0;
}
diff --git a/lib/accelerated/x86/aes-gcm-x86-aesni.c b/lib/accelerated/x86/aes-gcm-x86-aesni.c
index 7c6e4b1e58..f361e70d59 100644
--- a/lib/accelerated/x86/aes-gcm-x86-aesni.c
+++ b/lib/accelerated/x86/aes-gcm-x86-aesni.c
@@ -97,7 +97,8 @@ aes_gcm_cipher_setkey(void *_ctx, const void *key, size_t length)
} else if (length == 32) {
GCM_SET_KEY(ctx, x86_aes256_set_encrypt_key, x86_aes_encrypt,
key);
- } else abort();
+ } else
+ return GNUTLS_E_INVALID_REQUEST;
return 0;
}
diff --git a/lib/accelerated/x86/aes-gcm-x86-pclmul-avx.c b/lib/accelerated/x86/aes-gcm-x86-pclmul-avx.c
index 4b469dead9..59cb7e8e77 100644
--- a/lib/accelerated/x86/aes-gcm-x86-pclmul-avx.c
+++ b/lib/accelerated/x86/aes-gcm-x86-pclmul-avx.c
@@ -97,6 +97,8 @@ aes_gcm_cipher_setkey(void *_ctx, const void *userkey, size_t keysize)
struct aes_gcm_ctx *ctx = _ctx;
int ret;
+ CHECK_AES_KEYSIZE(keysize);
+
ret =
aesni_set_encrypt_key(userkey, keysize * 8,
ALIGN16(&ctx->expanded_key));
diff --git a/lib/accelerated/x86/aes-gcm-x86-pclmul.c b/lib/accelerated/x86/aes-gcm-x86-pclmul.c
index 40d4769803..4411e540e4 100644
--- a/lib/accelerated/x86/aes-gcm-x86-pclmul.c
+++ b/lib/accelerated/x86/aes-gcm-x86-pclmul.c
@@ -96,6 +96,8 @@ aes_gcm_cipher_setkey(void *_ctx, const void *userkey, size_t keysize)
struct aes_gcm_ctx *ctx = _ctx;
int ret;
+ CHECK_AES_KEYSIZE(keysize);
+
ret =
aesni_set_encrypt_key(userkey, keysize * 8,
ALIGN16(&ctx->expanded_key));
diff --git a/lib/accelerated/x86/aes-gcm-x86-ssse3.c b/lib/accelerated/x86/aes-gcm-x86-ssse3.c
index 52759f9b63..875dbc8968 100644
--- a/lib/accelerated/x86/aes-gcm-x86-ssse3.c
+++ b/lib/accelerated/x86/aes-gcm-x86-ssse3.c
@@ -102,7 +102,8 @@ aes_gcm_cipher_setkey(void *_ctx, const void *key, size_t keysize)
} else if (keysize == 32) {
GCM_SET_KEY(ctx, x86_aes_256_set_encrypt_key, x86_aes_encrypt,
key);
- } else abort();
+ } else
+ return GNUTLS_E_INVALID_REQUEST;
return 0;
}
diff --git a/lib/accelerated/x86/aes-padlock.c b/lib/accelerated/x86/aes-padlock.c
index ceda0faa5f..488fed5f5d 100644
--- a/lib/accelerated/x86/aes-padlock.c
+++ b/lib/accelerated/x86/aes-padlock.c
@@ -100,7 +100,7 @@ padlock_aes_cipher_setkey(void *_ctx, const void *userkey, size_t keysize)
break;
#endif
default:
- return gnutls_assert_val(GNUTLS_E_ENCRYPTION_FAILED);
+ return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
}
padlock_reload_key();
diff --git a/lib/accelerated/x86/aes-x86.h b/lib/accelerated/x86/aes-x86.h
index 703521856b..2fcd890980 100644
--- a/lib/accelerated/x86/aes-x86.h
+++ b/lib/accelerated/x86/aes-x86.h
@@ -18,6 +18,10 @@ typedef struct {
uint32_t rounds;
} AES_KEY;
+#define CHECK_AES_KEYSIZE(s) \
+ if (s != 16 && s != 24 && s != 32) \
+ return GNUTLS_E_INVALID_REQUEST
+
void aesni_ecb_encrypt(const unsigned char *in, unsigned char *out,
size_t len, const AES_KEY * key, int enc);
diff --git a/lib/accelerated/x86/x86-common.h b/lib/accelerated/x86/x86-common.h
index 221d733a11..9beb9d85a5 100644
--- a/lib/accelerated/x86/x86-common.h
+++ b/lib/accelerated/x86/x86-common.h
@@ -35,6 +35,10 @@ unsigned int gnutls_have_cpuid(void);
#endif
+#define CHECK_AES_KEYSIZE(s) \
+ if (s != 16 && s != 24 && s != 32) \
+ return GNUTLS_E_INVALID_REQUEST
+
#define NN_HASH(name, update_func, digest_func, NAME) { \
#name, \
sizeof(struct name##_ctx), \