summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2021-04-02 09:49:06 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2021-04-02 10:14:02 +0900
commit840713de1a685920b6b1e1379902d545eccc74cf (patch)
treeba26ee123c1afd7a85738b78da92198bc65d963c
parentaaa30381eac3cdb49a21e279b2d89ef6e695a138 (diff)
downloadlibgcrypt-840713de1a685920b6b1e1379902d545eccc74cf.tar.gz
cipher: Return GPG_ERR_INV_KEYLEN when wrong key length.
* cipher/idea.c (do_setkey): Return GPG_ERR_INV_KEYLEN. * cipher/rfc2268.c (setkey_core): Likewise. * cipher/serpent.c (serpent_setkey_internal): Likewise. (serpent_setkey): Likewise. -- Reported-by: Guido Vranken <guidovranken@gmail.com> Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
-rw-r--r--cipher/idea.c4
-rw-r--r--cipher/rfc2268.c3
-rw-r--r--cipher/serpent.c8
3 files changed, 12 insertions, 3 deletions
diff --git a/cipher/idea.c b/cipher/idea.c
index 0a810818..7f706660 100644
--- a/cipher/idea.c
+++ b/cipher/idea.c
@@ -251,7 +251,9 @@ do_setkey( IDEA_context *c, const byte *key, unsigned int keylen )
if( selftest_failed )
return GPG_ERR_SELFTEST_FAILED;
- assert(keylen == 16);
+ if (keylen != 16)
+ return GPG_ERR_INV_KEYLEN;
+
c->have_dk = 0;
expand_key( key, c->ek );
invert_key( c->ek, c->dk );
diff --git a/cipher/rfc2268.c b/cipher/rfc2268.c
index f018b640..b093f022 100644
--- a/cipher/rfc2268.c
+++ b/cipher/rfc2268.c
@@ -228,6 +228,9 @@ setkey_core (void *context, const unsigned char *key, unsigned int keylen, int w
if (keylen < 40 / 8) /* We want at least 40 bits. */
return GPG_ERR_INV_KEYLEN;
+ if (keylen > 128)
+ return GPG_ERR_INV_KEYLEN;
+
S = (unsigned char *) ctx->S;
for (i = 0; i < keylen; i++)
diff --git a/cipher/serpent.c b/cipher/serpent.c
index 3c5eed2c..d2f7f16e 100644
--- a/cipher/serpent.c
+++ b/cipher/serpent.c
@@ -732,12 +732,15 @@ serpent_subkeys_generate (serpent_key_t key, serpent_subkeys_t subkeys)
}
/* Initialize CONTEXT with the key KEY of KEY_LENGTH bits. */
-static void
+static gcry_err_code_t
serpent_setkey_internal (serpent_context_t *context,
const byte *key, unsigned int key_length)
{
serpent_key_t key_prepared;
+ if (key_length > 32)
+ return GPG_ERR_INV_KEYLEN;
+
serpent_key_prepare (key, key_length, key_prepared);
serpent_subkeys_generate (key_prepared, context->keys);
@@ -758,6 +761,7 @@ serpent_setkey_internal (serpent_context_t *context,
#endif
wipememory (key_prepared, sizeof(key_prepared));
+ return 0;
}
/* Initialize CTX with the key KEY of KEY_LENGTH bytes. */
@@ -791,7 +795,7 @@ serpent_setkey (void *ctx,
if (serpent_test_ret)
ret = GPG_ERR_SELFTEST_FAILED;
else
- serpent_setkey_internal (context, key, key_length);
+ ret = serpent_setkey_internal (context, key, key_length);
return ret;
}