@@ -39034,12 +39034,10 @@ static int AddPSKtoPreMasterSecret(WOLFSSL* ssl)
3903439034 }
3903539035#endif
3903639036
39037- /* Calculate actual internal ticket size */
39037+ internalTicketSz = (int)WOLFSSL_INTERNAL_TICKET_BASE_SZ;
3903839038#if defined(OPENSSL_ALL) && defined(KEEP_PEER_CERT) && \
3903939039 !defined(NO_CERT_IN_TICKET)
39040- internalTicketSz = (int)(WOLFSSL_INTERNAL_TICKET_BASE_SZ + peerCertSz);
39041- #else
39042- internalTicketSz = (int)WOLFSSL_INTERNAL_TICKET_BASE_SZ;
39040+ internalTicketSz += peerCertSz;
3904339041#endif
3904439042 /* MAC is placed after the encrypted data */
3904539043 mac = et->enc_ticket + WOLFSSL_TICKET_ENC_SZ;
@@ -39326,6 +39324,48 @@ static int AddPSKtoPreMasterSecret(WOLFSSL* ssl)
3932639324 }
3932739325#endif /* WOLFSSL_SLT13 */
3932839326
39327+ #if defined(OPENSSL_ALL) && defined(KEEP_PEER_CERT) && \
39328+ !defined(NO_CERT_IN_TICKET)
39329+ static void RestorePeerCertFromTicket(WOLFSSL* ssl, InternalTicket* it)
39330+ {
39331+ word16 peerCertLen = 0;
39332+ ato16(it->peerCertLen, &peerCertLen);
39333+
39334+ if (peerCertLen > 0 && peerCertLen <= MAX_TICKET_PEER_CERT_SZ) {
39335+ #ifdef SESSION_CERTS
39336+ /* Clear existing chain and add the peer certificate */
39337+ ssl->session->chain.count = 0;
39338+ AddSessionCertToChain(&ssl->session->chain,
39339+ it->peerCert, peerCertLen);
39340+ #endif
39341+ /* Also decode into ssl->peerCert for direct access */
39342+ {
39343+ int ret;
39344+ DecodedCert* dCert;
39345+
39346+ dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
39347+ DYNAMIC_TYPE_DCERT);
39348+ if (dCert != NULL) {
39349+ InitDecodedCert(dCert, it->peerCert, peerCertLen, ssl->heap);
39350+ ret = ParseCertRelative(dCert, CERT_TYPE, 0, NULL, NULL);
39351+ if (ret == 0) {
39352+ FreeX509(&ssl->peerCert);
39353+ InitX509(&ssl->peerCert, 0, ssl->heap);
39354+ ret = CopyDecodedToX509(&ssl->peerCert, dCert);
39355+ if (ret != 0) {
39356+ /* Failed to copy - clear peerCert */
39357+ FreeX509(&ssl->peerCert);
39358+ InitX509(&ssl->peerCert, 0, ssl->heap);
39359+ }
39360+ }
39361+ FreeDecodedCert(dCert);
39362+ XFREE(dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
39363+ }
39364+ }
39365+ }
39366+ }
39367+ #endif /* OPENSSL_ALL && KEEP_PEER_CERT && !NO_CERT_IN_TICKET */
39368+
3932939369 void DoClientTicketFinalize(WOLFSSL* ssl, InternalTicket* it,
3933039370 const WOLFSSL_SESSION* sess)
3933139371 {
@@ -39416,44 +39456,7 @@ static int AddPSKtoPreMasterSecret(WOLFSSL* ssl)
3941639456
3941739457#if defined(OPENSSL_ALL) && defined(KEEP_PEER_CERT) && \
3941839458 !defined(NO_CERT_IN_TICKET)
39419- /* Restore peer certificate from ticket to session chain and peerCert */
39420- {
39421- word16 peerCertLen = 0;
39422- ato16(it->peerCertLen, &peerCertLen);
39423-
39424- if (peerCertLen > 0 && peerCertLen <= MAX_TICKET_PEER_CERT_SZ) {
39425- #ifdef SESSION_CERTS
39426- /* Clear existing chain and add the peer certificate */
39427- ssl->session->chain.count = 0;
39428- AddSessionCertToChain(&ssl->session->chain,
39429- it->peerCert, peerCertLen);
39430- #endif
39431- /* Also decode into ssl->peerCert for direct access */
39432- {
39433- int ret;
39434- DecodedCert* dCert;
39435-
39436- dCert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
39437- DYNAMIC_TYPE_DCERT);
39438- if (dCert != NULL) {
39439- InitDecodedCert(dCert, it->peerCert, peerCertLen, ssl->heap);
39440- ret = ParseCertRelative(dCert, CERT_TYPE, 0, NULL, NULL);
39441- if (ret == 0) {
39442- FreeX509(&ssl->peerCert);
39443- InitX509(&ssl->peerCert, 0, ssl->heap);
39444- ret = CopyDecodedToX509(&ssl->peerCert, dCert);
39445- if (ret != 0) {
39446- /* Failed to copy - clear peerCert */
39447- FreeX509(&ssl->peerCert);
39448- InitX509(&ssl->peerCert, 0, ssl->heap);
39449- }
39450- }
39451- FreeDecodedCert(dCert);
39452- XFREE(dCert, ssl->heap, DYNAMIC_TYPE_DCERT);
39453- }
39454- }
39455- }
39456- }
39459+ RestorePeerCertFromTicket(ssl, it);
3945739460#endif
3945839461
3945939462 ssl->version.minor = it->pv.minor;
0 commit comments