diff --git a/src/internal.c b/src/internal.c index c3cb2921e..13b62bdaa 100644 --- a/src/internal.c +++ b/src/internal.c @@ -26634,6 +26634,26 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, } } + #ifdef HAVE_SECURE_RENEGOTIATION + /* Check that the DH public key buffer is large + * enough to hold the key. This may occur on a + * renegotiation when the key generated in the + * initial handshake is shorter than the key + * generated in the renegotiation. */ + if (ssl->buffers.serverDH_Pub.length < + ssl->buffers.serverDH_P.length) { + byte* tmp = (byte*)XREALLOC( + ssl->buffers.serverDH_Pub.buffer, + ssl->buffers.serverDH_P.length + + OPAQUE16_LEN, + ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); + if (tmp == NULL) + ERROR_OUT(MEMORY_E, exit_sske); + ssl->buffers.serverDH_Pub.buffer = tmp; + ssl->buffers.serverDH_Pub.length = + ssl->buffers.serverDH_P.length + OPAQUE16_LEN; + } + #endif ret = DhGenKeyPair(ssl, ssl->buffers.serverDH_Key, ssl->buffers.serverDH_Priv.buffer, (word32*)&ssl->buffers.serverDH_Priv.length,