diff options
author | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2023-04-23 15:31:02 +0300 |
---|---|---|
committer | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2023-04-23 21:08:16 +0300 |
commit | 5d18b401f8a780e2465662e88cbac6974033bf3f (patch) | |
tree | 9931ef661b4ddc2fa61ec33513a8e91cf2f889be | |
parent | f3ca9fa4f7e0aee1bb5012c419deb7b927da844d (diff) | |
download | libgcrypt-5d18b401f8a780e2465662e88cbac6974033bf3f.tar.gz |
cipher: restore weak-key error-code after mode specific setkey
* cipher/cipher.c (cipher_setkey): Restore weak-key error-code
in case mode specific setkey returned success for the return code.
--
GnuPG-bug-id: 6451
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
-rw-r--r-- | cipher/cipher.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/cipher/cipher.c b/cipher/cipher.c index f2558371..beb42af9 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -779,6 +779,8 @@ cipher_setkey (gcry_cipher_hd_t c, byte *key, size_t keylen) rc = c->spec->setkey (&c->context.c, key, keylen, &c->bulk); if (!rc || (c->marks.allow_weak_key && rc == GPG_ERR_WEAK_KEY)) { + int is_weak_key = (rc == GPG_ERR_WEAK_KEY); + /* Duplicate initial context. */ memcpy ((void *) ((char *) &c->context.c + c->spec->contextsize), (void *) &c->context.c, @@ -801,7 +803,7 @@ cipher_setkey (gcry_cipher_hd_t c, byte *key, size_t keylen) case GCRY_CIPHER_MODE_GCM_SIV: rc = _gcry_cipher_gcm_siv_setkey (c, keylen); - if (rc) + if (rc && !(c->marks.allow_weak_key && rc == GPG_ERR_WEAK_KEY)) c->marks.key = 0; break; @@ -843,6 +845,11 @@ cipher_setkey (gcry_cipher_hd_t c, byte *key, size_t keylen) default: break; } + + /* Restore "weak key" error-code in case mode specific setkey + * returned success. */ + if (!rc && is_weak_key) + rc = GPG_ERR_WEAK_KEY; } else c->marks.key = 0; |