diff --git a/src/internal.c b/src/internal.c index f8adda15f..e3e545c2a 100644 --- a/src/internal.c +++ b/src/internal.c @@ -15912,12 +15912,12 @@ static void LogAlert(int type) } /* process alert, return level */ -static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type, - word32 totalSz) +static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type) { byte level; byte code; - word32 dataSz = totalSz - *inOutIdx; + word32 dataSz = (word32)ssl->curSize; + int ivExtra = 0; #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) if (ssl->hsInfoOn) @@ -15929,6 +15929,19 @@ static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type, READ_PROTO, ssl->heap); #endif +#ifndef WOLFSSL_AEAD_ONLY + if (ssl->specs.cipher_type == block) { + if (ssl->options.tls1_1) + ivExtra = ssl->specs.block_size; + } + else +#endif + if (ssl->specs.cipher_type == aead) { + if (CipherHasExpIV(ssl)) + ivExtra = AESGCM_EXP_IV_SZ; + } + dataSz -= ivExtra; + if (IsEncryptionOn(ssl, 0)) { dataSz -= ssl->keys.padSz; #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) @@ -16984,8 +16997,7 @@ int ProcessReplyEx(WOLFSSL* ssl, int allowSocketErr) case alert: WOLFSSL_MSG("got ALERT!"); ret = DoAlert(ssl, ssl->buffers.inputBuffer.buffer, - &ssl->buffers.inputBuffer.idx, &type, - ssl->buffers.inputBuffer.length); + &ssl->buffers.inputBuffer.idx, &type); if (ret == alert_fatal) return FATAL_ERROR; else if (ret < 0)