diff --git a/src/libstrongswan/plugins/aesni/aesni_ccm.c b/src/libstrongswan/plugins/aesni/aesni_ccm.c index 86aad97ed..c0b48f35a 100644 --- a/src/libstrongswan/plugins/aesni/aesni_ccm.c +++ b/src/libstrongswan/plugins/aesni/aesni_ccm.c @@ -760,6 +760,7 @@ METHOD(aead_t, decrypt, bool, chunk_t *plain) { u_char *out, icv[this->icv_size]; + bool valid; if (!this->key || iv.len != IV_SIZE || encr.len < this->icv_size) { @@ -772,10 +773,14 @@ METHOD(aead_t, decrypt, bool, *plain = chunk_alloc(encr.len); out = plain->ptr; } - this->decrypt(this, encr.len, encr.ptr, out, iv.ptr, assoc.len, assoc.ptr, icv); - return memeq_const(icv, encr.ptr + encr.len, this->icv_size); + valid = memeq_const(icv, encr.ptr + encr.len, this->icv_size); + if (!valid && plain) + { + chunk_free(plain); + } + return valid; } METHOD(aead_t, get_block_size, size_t, diff --git a/src/libstrongswan/plugins/aesni/aesni_gcm.c b/src/libstrongswan/plugins/aesni/aesni_gcm.c index 45620cd55..5f48c22f4 100644 --- a/src/libstrongswan/plugins/aesni/aesni_gcm.c +++ b/src/libstrongswan/plugins/aesni/aesni_gcm.c @@ -1268,6 +1268,7 @@ METHOD(aead_t, decrypt, bool, chunk_t *plain) { u_char *out, icv[this->icv_size]; + bool valid; if (!this->key || iv.len != IV_SIZE || encr.len < this->icv_size) { @@ -1282,7 +1283,12 @@ METHOD(aead_t, decrypt, bool, } this->decrypt(this, encr.len, encr.ptr, out, iv.ptr, assoc.len, assoc.ptr, icv); - return memeq_const(icv, encr.ptr + encr.len, this->icv_size); + valid = memeq_const(icv, encr.ptr + encr.len, this->icv_size); + if (!valid && plain) + { + chunk_free(plain); + } + return valid; } METHOD(aead_t, get_block_size, size_t,