Ignore:
Timestamp:
Jun 22, 2021, 9:00:19 PM (3 years ago)
Author:
coas-nagasima
Message:

WolfSSLとAzure IoT SDKを更新

Location:
azure_iot_hub_f767zi/trunk/wolfssl-4.7.0
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/src/internal.c

    r457 r464  
    3838 *     certificates. This also allows loading intermediate CA's as trusted
    3939 *     and ignoring no signer failures for CA's up the chain to root.
     40 * WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT:
     41 *     Enable resending the previous DTLS handshake flight only on a network
     42 *     read timeout. By default we resend in two more cases, when we receive:
     43 *     - an out of order last msg of the peer's flight
     44 *     - a duplicate of the first msg from the peer's flight
     45 * WOLFSSL_NO_DEF_TICKET_ENC_CB:
     46 *     No default ticket encryption callback.
     47 *     Server only.
     48 *     Application must set its own callback to use session tickets.
     49 * WOLFSSL_TICKET_ENC_CHACHA20_POLY1305
     50 *     Use ChaCha20-Poly1305 to encrypt/decrypt session tickets in default
     51 *     callback. Default algorithm if none defined and algorithms compiled in.
     52 *     Server only.
     53 * WOLFSSL_TICKET_ENC_AES128_GCM
     54 *     Use AES128-GCM to encrypt/decrypt session tickets in default callback.
     55 *     Server only. Default algorithm if ChaCha20/Poly1305 not compiled in.
     56 * WOLFSSL_TICKET_ENC_AES256_GCM
     57 *     Use AES256-GCM to encrypt/decrypt session tickets in default callback.
     58 *     Server only.
     59 * WOLFSSL_TICKET_DECRYPT_NO_CREATE
     60 *     Default callback will not request creation of new ticket on successful
     61 *     decryption.
     62 *     Server only.
    4063 */
    4164
     
    7396    defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG)
    7497    #ifndef NO_STDIO_FILESYSTEM
    75         #include <stdio.h>
     98        #ifdef FUSION_RTOS
     99            #include <fclstdio.h>
     100        #else
     101            #include <stdio.h>
     102        #endif
    76103    #endif
    77104#endif
     
    125152        static int SendHelloVerifyRequest(WOLFSSL*, const byte*, byte);
    126153    #endif /* WOLFSSL_DTLS */
    127 #endif
     154
     155#endif /* !NO_WOLFSSL_SERVER */
    128156
    129157#endif /* !WOLFSSL_NO_TLS12 */
     158
     159#ifndef NO_WOLFSSL_SERVER
     160    #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
     161        static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx,
     162                                       TicketEncCbCtx* keyCtx);
     163        static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx);
     164        static int DefTicketEncCb(WOLFSSL* ssl,
     165                                  byte key_name[WOLFSSL_TICKET_NAME_SZ],
     166                                  byte iv[WOLFSSL_TICKET_IV_SZ],
     167                                  byte mac[WOLFSSL_TICKET_MAC_SZ],
     168                                  int enc, byte* ticket, int inLen, int* outLen,
     169                                  void* userCtx);
     170    #endif
     171#endif
    130172
    131173#ifdef WOLFSSL_DTLS
     
    162204#if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
    163205static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
    164                     int padSz, int content, int verify);
     206                    int padSz, int content, int verify, int epochOrder);
    165207
    166208#endif
     
    205247static WC_INLINE int IsEncryptionOn(WOLFSSL* ssl, int isSend)
    206248{
    207     (void)isSend;
    208 
    209249    #ifdef WOLFSSL_DTLS
    210250    /* For DTLS, epoch 0 is always not encrypted. */
     
    213253    #endif /* WOLFSSL_DTLS */
    214254
    215 #ifdef WOLFSSL_TLS13
    216     if (isSend)
    217         return ssl->encrypt.setup;
    218     else
    219         return ssl->decrypt.setup;
    220 #else
    221     return ssl->keys.encryptionOn;
    222 #endif
     255    return ssl->keys.encryptionOn &&
     256        (isSend ? ssl->encrypt.setup : ssl->decrypt.setup);
    223257}
    224258
     
    229263static WC_INLINE int IsDtlsNotSctpMode(WOLFSSL* ssl)
    230264{
    231     int result = ssl->options.dtls;
    232 
    233     if (result) {
    234265#ifdef WOLFSSL_SCTP
    235         result = !ssl->options.dtlsSctp;
    236 #endif
    237     }
    238 
    239     return result;
     266    return ssl->options.dtls && !ssl->options.dtlsSctp;
     267#else
     268    return ssl->options.dtls;
     269#endif
    240270}
    241271#endif /* DTLS || !WOLFSSL_NO_TLS12 */
     
    363393    {
    364394        (void)opaque;
    365         return XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
     395        return (void *)XMALLOC(item * size, opaque, DYNAMIC_TYPE_LIBZ);
    366396    }
    367397
     
    641671}
    642672
    643 static int ImportCipherSpecState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
     673static int ImportCipherSpecState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver)
    644674{
    645675    word32 idx = 0;
     
    678708
    679709
    680 static int ImportKeyState(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
     710static int ImportKeyState(WOLFSSL* ssl, const byte* exp, word32 len, byte ver)
    681711{
    682712    word32 idx = 0;
     
    911941    exp[idx++] = options->createTicket;
    912942    exp[idx++] = options->useTicket;
     943    exp[idx++] = options->noTicketTls12;
    913944#ifdef WOLFSSL_TLS13
    914945    if (ver > DTLS_EXPORT_VERSION_3) {
     
    9741005/* copy items from Export struct to Options struct
    9751006 * On success returns size of buffer used on failure returns a negative value */
    976 static int dtls_export_load(WOLFSSL* ssl, byte* exp, word32 len, byte ver)
     1007static int dtls_export_load(WOLFSSL* ssl, const byte* exp, word32 len, byte ver)
    9771008{
    9781009    int idx = 0;
     
    10761107    options->createTicket  = exp[idx++]; /* Server to create new Ticket */
    10771108    options->useTicket     = exp[idx++]; /* Use Ticket not session cache */
     1109    options->noTicketTls12 = exp[idx++]; /* Server won't create new Ticket */
    10781110#ifdef WOLFSSL_TLS13
    10791111    if (ver > DTLS_EXPORT_VERSION_3) {
     
    11561188
    11571189
    1158 static int ImportPeerInfo(WOLFSSL* ssl, byte* buf, word32 len, byte ver)
     1190static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
    11591191{
    11601192    word16 idx = 0;
     
    13581390
    13591391/* On success return amount of buffer consumed */
    1360 int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, byte* buf, word32 sz)
     1392int wolfSSL_dtls_import_state_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
    13611393{
    13621394    word32 idx    = 0;
     
    14251457
    14261458    WOLFSSL_LEAVE("wolfSSL_dtls_import_state_internal", ret);
    1427     return ret;
     1459    return idx;
    14281460}
    14291461
    14301462
    14311463/* On success return amount of buffer consumed */
    1432 int wolfSSL_dtls_import_internal(WOLFSSL* ssl, byte* buf, word32 sz)
     1464int wolfSSL_dtls_import_internal(WOLFSSL* ssl, const byte* buf, word32 sz)
    14331465{
    14341466    word32 idx    = 0;
     
    15511583
    15521584    SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE);
    1553 
     1585    /* make sure is a valid suite used */
     1586    if (wolfSSL_get_cipher(ssl) == NULL) {
     1587        WOLFSSL_MSG("Can not match cipher suite imported");
     1588        return MATCH_SUITE_ERROR;
     1589    }
     1590
     1591#ifndef WOLFSSL_AEAD_ONLY
    15541592    /* set hmac function to use when verifying */
    15551593    if (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 ||
    15561594            ssl->options.dtls == 1) {
    15571595        ssl->hmac = TLS_hmac;
    1558     }
    1559 
    1560     /* make sure is a valid suite used */
    1561     if (wolfSSL_get_cipher(ssl) == NULL) {
    1562         WOLFSSL_MSG("Can not match cipher suite imported");
    1563         return MATCH_SUITE_ERROR;
    15641596    }
    15651597
     
    15701602        return SANITY_CIPHER_E;
    15711603    }
     1604#endif /* !WOLFSSL_AEAD_ONLY */
    15721605
    15731606    return idx;
     
    16591692        return BAD_MUTEX_E;
    16601693    }
     1694
     1695#ifndef NO_CERTS
     1696    ctx->privateKeyDevId = INVALID_DEVID;
     1697#endif
    16611698
    16621699#ifndef NO_DH
     
    17821819
    17831820#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER)
     1821#ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
     1822    ret = TicketEncCbCtx_Init(ctx, &ctx->ticketKeyCtx);
     1823    if (ret != 0) return ret;
     1824    ctx->ticketEncCb = DefTicketEncCb;
     1825    ctx->ticketEncCtx = (void*)&ctx->ticketKeyCtx;
     1826#endif
    17841827    ctx->ticketHint = SESSION_TICKET_HINT_DEFAULT;
    17851828#endif
     
    17911834#ifdef WOLFSSL_EARLY_DATA
    17921835    ctx->maxEarlyDataSz = MAX_EARLY_DATA_SZ;
     1836#endif
     1837
     1838#if defined(WOLFSSL_TLS13) && !defined(HAVE_SUPPORTED_CURVES)
     1839    ctx->noPskDheKe = 1;
    17931840#endif
    17941841
     
    18481895    #ifdef KEEP_OUR_CERT
    18491896        if (ctx->ourCert && ctx->ownOurCert) {
    1850             FreeX509(ctx->ourCert);
    1851             XFREE(ctx->ourCert, ctx->heap, DYNAMIC_TYPE_X509);
     1897            wolfSSL_X509_free(ctx->ourCert);
    18521898            ctx->ourCert = NULL;
    18531899        }
     
    18571903    ctx->cm = NULL;
    18581904    #ifdef OPENSSL_EXTRA
    1859     /* ctx->cm was free'd so cm of x509 store should now be NULL */
    1860         if (ctx->x509_store_pt != NULL) {
    1861             ctx->x509_store_pt->cm = NULL;
    1862         }
    18631905        wolfSSL_X509_STORE_free(ctx->x509_store_pt);
    18641906        while (ctx->ca_names != NULL) {
     
    18701912    #endif
    18711913    #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
    1872         while (ctx->x509Chain != NULL) {
    1873             WOLFSSL_STACK *next = ctx->x509Chain->next;
    1874             wolfSSL_X509_free(ctx->x509Chain->data.x509);
    1875             XFREE(ctx->x509Chain, NULL, DYNAMIC_TYPE_OPENSSL);
    1876             ctx->x509Chain = next;
     1914        if (ctx->x509Chain) {
     1915            wolfSSL_sk_X509_free(ctx->x509Chain);
     1916            ctx->x509Chain = NULL;
    18771917        }
    18781918    #endif
     
    19081948        ctx->alpn_cli_protos = NULL;
    19091949    }
     1950#endif
     1951#ifdef WOLFSSL_STATIC_EPHEMERAL
     1952    #ifndef NO_DH
     1953    if (ctx->staticKE.dhKey)
     1954        FreeDer(&ctx->staticKE.dhKey);
     1955    #endif
     1956    #ifdef HAVE_ECC
     1957    if (ctx->staticKE.ecKey)
     1958        FreeDer(&ctx->staticKE.ecKey);
     1959    #endif
    19101960#endif
    19111961#ifdef WOLFSSL_STATIC_MEMORY
     
    19431993        WOLFSSL_MSG("CTX ref count down to 0, doing full free");
    19441994        SSL_CtxResourceFree(ctx);
     1995#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
     1996    !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)
     1997        TicketEncCbCtx_Free(&ctx->ticketKeyCtx);
     1998#endif
    19451999        wc_FreeMutex(&ctx->countMutex);
    19462000#ifdef WOLFSSL_STATIC_MEMORY
     
    33343388#ifndef NO_CERTS
    33353389
    3336 void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag)
     3390void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, void* heap)
    33373391{
    33383392    (void)dynamicFlag;
     3393    (void)heap;
    33393394
    33403395    if (name != NULL) {
     
    33423397        name->dynamicName = 0;
    33433398        name->sz = 0;
     3399        name->heap = heap;
    33443400#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    3345         XMEMSET(&name->fullName, 0, sizeof(DecodedName));
    3346         XMEMSET(&name->cnEntry,  0, sizeof(WOLFSSL_X509_NAME_ENTRY));
    3347         XMEMSET(&name->extra,    0, sizeof(name->extra));
    3348         name->cnEntry.value = &(name->cnEntry.data); /* point to internal data*/
    3349         name->cnEntry.nid = ASN_COMMON_NAME;
     3401        XMEMSET(name->entry, 0, sizeof(name->entry));
    33503402        name->x509 = NULL;
     3403        name->entrySz = 0;
    33513404#endif /* OPENSSL_EXTRA */
    33523405    }
     
    33543407
    33553408
    3356 void FreeX509Name(WOLFSSL_X509_NAME* name, void* heap)
     3409void FreeX509Name(WOLFSSL_X509_NAME* name)
    33573410{
    33583411    if (name != NULL) {
    33593412        if (name->dynamicName) {
    3360             XFREE(name->name, heap, DYNAMIC_TYPE_SUBJECT_CN);
     3413            XFREE(name->name, name->heap, DYNAMIC_TYPE_SUBJECT_CN);
    33613414            name->name = NULL;
    33623415        }
     
    33643417        {
    33653418            int i;
    3366             if (name->fullName.fullName != NULL) {
    3367                 XFREE(name->fullName.fullName, heap, DYNAMIC_TYPE_X509);
    3368                 name->fullName.fullName = NULL;
    3369             }
    33703419            for (i = 0; i < MAX_NAME_ENTRIES; i++) {
    3371                 /* free ASN1 string data */
    3372                 if (name->extra[i].set && name->extra[i].data.data != NULL) {
    3373                     XFREE(name->extra[i].data.data, heap, DYNAMIC_TYPE_OPENSSL);
     3420                if (name->entry[i].set) {
     3421                    wolfSSL_ASN1_OBJECT_free(name->entry[i].object);
     3422                    wolfSSL_ASN1_STRING_free(name->entry[i].value);
    33743423                }
    33753424            }
    3376             wolfSSL_ASN1_OBJECT_free(&name->cnEntry.object);
    33773425        }
    33783426#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
    33793427    }
    3380     (void)heap;
    33813428}
    33823429
     
    33933440
    33943441    x509->heap = heap;
    3395     InitX509Name(&x509->issuer, 0);
    3396     InitX509Name(&x509->subject, 0);
     3442    InitX509Name(&x509->issuer, 0, heap);
     3443    InitX509Name(&x509->subject, 0, heap);
    33973444    x509->dynamicMemory  = (byte)dynamicFlag;
    33983445    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
     
    34093456        return;
    34103457
    3411     FreeX509Name(&x509->issuer, x509->heap);
    3412     FreeX509Name(&x509->subject, x509->heap);
     3458    FreeX509Name(&x509->issuer);
     3459    FreeX509Name(&x509->subject);
    34133460    if (x509->pubKey.buffer) {
    34143461        XFREE(x509->pubKey.buffer, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY);
     
    34343481            wolfSSL_sk_X509_EXTENSION_free(x509->ext_sk);
    34353482        }
     3483        if (x509->ext_sk_full != NULL) {
     3484            wolfSSL_sk_X509_EXTENSION_free(x509->ext_sk_full);
     3485        }
    34363486        #endif /* OPENSSL_ALL || WOLFSSL_QT */
    34373487        #ifdef OPENSSL_EXTRA
     
    34603510        }
    34613511    #endif /* OPENSSL_ALL */
     3512    #if defined(WOLFSSL_CERT_REQ) && defined(OPENSSL_ALL)
     3513        if (x509->challengePwAttr) {
     3514            wolfSSL_X509_ATTRIBUTE_free(x509->challengePwAttr);
     3515        }
     3516    #endif /* WOLFSSL_CERT_REQ */
    34623517    if (x509->altNames) {
    34633518        FreeAltNames(x509->altNames, x509->heap);
     
    35713626#ifndef NO_RSA
    35723627#ifndef WOLFSSL_NO_TLS12
    3573 #if !defined(NO_WOLFSSL_SERVER) || (!defined(NO_WOLFSSL_CLIENT) && \
    3574                                                !defined(WOLFSSL_NO_CLIENT_AUTH))
     3628#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT)
    35753629static int TypeHash(int hashAlgo)
    35763630{
     
    42574311#endif
    42584312    {
    4259         ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
     4313#if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
     4314    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \
     4315    !defined(HAVE_SELFTEST)
     4316        ret = wc_ecc_set_rng(priv_key, ssl->rng);
     4317        if (ret == 0)
     4318#endif
     4319            ret = wc_ecc_shared_secret(priv_key, pub_key, out, outlen);
    42604320    }
    42614321
     
    42884348
    42894349    /* get key size */
    4290     if (peer == NULL) {
     4350    if (peer == NULL || peer->dp == NULL) {
    42914351        keySz = ssl->eccTempKeySz;
    42924352    }
    42934353    else {
    42944354        keySz = peer->dp->size;
     4355        ecc_curve = peer->dp->id;
    42954356    }
    42964357
     
    52595320    ssl->ctx     = ctx; /* only for passing to calls, options could change */
    52605321    ssl->version = ctx->method->version;
     5322#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
     5323    ssl->options.mask = ctx->mask;
     5324#endif
     5325#ifdef OPENSSL_EXTRA
     5326    if (ssl->version.minor == TLSv1_3_MINOR &&
     5327     (ssl->options.mask & SSL_OP_NO_TLSv1_3) == SSL_OP_NO_TLSv1_3) {
     5328        if (!ctx->method->downgrade) {
     5329            WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.3 set but not "
     5330                        "allowed and downgrading disabled.");
     5331            return VERSION_ERROR;
     5332        }
     5333        WOLFSSL_MSG("\tOption set to not allow TLSv1.3, Downgrading");
     5334        ssl->version.minor = TLSv1_2_MINOR;
     5335    }
     5336    if (ssl->version.minor == TLSv1_2_MINOR &&
     5337     (ssl->options.mask & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
     5338        if (!ctx->method->downgrade) {
     5339            WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.2 set but not "
     5340                        "allowed and downgrading disabled.");
     5341            return VERSION_ERROR;
     5342        }
     5343        WOLFSSL_MSG("\tOption set to not allow TLSv1.2, Downgrading");
     5344        ssl->version.minor = TLSv1_1_MINOR;
     5345    }
     5346    if (ssl->version.minor == TLSv1_1_MINOR &&
     5347     (ssl->options.mask & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
     5348        if (!ctx->method->downgrade) {
     5349            WOLFSSL_MSG("\tInconsistent protocol options. TLS 1.1 set but not "
     5350                        "allowed and downgrading disabled.");
     5351            return VERSION_ERROR;
     5352        }
     5353        WOLFSSL_MSG("\tOption set to not allow TLSv1.1, Downgrading");
     5354        ssl->options.tls1_1 = 0;
     5355        ssl->version.minor = TLSv1_MINOR;
     5356    }
     5357    if (ssl->version.minor == TLSv1_MINOR &&
     5358        (ssl->options.mask & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
     5359        if (!ctx->method->downgrade) {
     5360            WOLFSSL_MSG("\tInconsistent protocol options. TLS 1 set but not "
     5361                        "allowed and downgrading disabled.");
     5362            return VERSION_ERROR;
     5363        }
     5364        WOLFSSL_MSG("\tOption set to not allow TLSv1, Downgrading");
     5365        ssl->options.tls    = 0;
     5366        ssl->options.tls1_1 = 0;
     5367        ssl->version.minor = SSLv3_MINOR;
     5368    }
     5369    if (ssl->version.minor == SSLv3_MINOR &&
     5370        (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
     5371        WOLFSSL_MSG("\tError, option set to not allow SSLv3");
     5372        return VERSION_ERROR;
     5373    }
     5374
     5375    if (ssl->version.minor < ssl->options.minDowngrade) {
     5376        WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
     5377        return VERSION_ERROR;
     5378    }
     5379#endif
    52615380
    52625381#ifdef HAVE_ECC
     
    52695388
    52705389#ifdef OPENSSL_EXTRA
    5271     ssl->options.mask = ctx->mask;
    52725390    ssl->CBIS         = ctx->CBIS;
    52735391#endif
     
    52855403
    52865404#ifndef NO_PSK
    5287     ssl->options.havePSK   = ctx->havePSK;
     5405    ssl->options.havePSK       = ctx->havePSK;
    52885406    ssl->options.client_psk_cb = ctx->client_psk_cb;
    52895407    ssl->options.server_psk_cb = ctx->server_psk_cb;
     5408    ssl->options.psk_ctx       = ctx->psk_ctx;
    52905409#ifdef WOLFSSL_TLS13
    52915410    ssl->options.client_psk_tls13_cb = ctx->client_psk_tls13_cb;
     
    53505469    ssl->buffers.keyType  = ctx->privateKeyType;
    53515470    ssl->buffers.keyId    = ctx->privateKeyId;
     5471    ssl->buffers.keyLabel = ctx->privateKeyLabel;
    53525472    ssl->buffers.keySz    = ctx->privateKeySz;
    53535473    ssl->buffers.keyDevId = ctx->privateKeyDevId;
     
    53915511        }
    53925512    }  /* writeDup check */
     5513
     5514#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
     5515    if (ctx->mask != 0 && wolfSSL_set_options(ssl, ctx->mask) == 0) {
     5516        WOLFSSL_MSG("wolfSSL_set_options error");
     5517        return BAD_FUNC_ARG;
     5518    }
     5519#endif
    53935520
    53945521#ifdef WOLFSSL_SESSION_EXPORT
     
    56875814#endif
    56885815
     5816#if defined(WOLFSSL_OPENVPN) && defined(HAVE_KEYING_MATERIAL)
     5817    /* Save arrays by default for OpenVPN */
     5818    ssl->options.saveArrays = 1;
     5819#endif
    56895820
    56905821    ssl->cipher.ssl = ssl;
     
    56955826    ssl->options.useClientOrder = ctx->useClientOrder;
    56965827    ssl->options.mutualAuth = ctx->mutualAuth;
     5828
     5829#ifdef WOLFSSL_STATIC_EPHEMERAL
     5830    ssl->staticKE = ctx->staticKE;
     5831#endif
    56975832
    56985833#ifdef WOLFSSL_TLS13
     
    58716006
    58726007#ifdef HAVE_SESSION_TICKET
     6008    ssl->options.noTicketTls12 = ctx->noTicketTls12;
    58736009    ssl->session.ticket = ssl->session.staticTicket;
    58746010#endif
     
    60456181
    60466182    /* Allocate memory for key */
    6047     *pKey = XMALLOC(sz, ssl->heap, type);
     6183    *pKey = (void *)XMALLOC(sz, ssl->heap, type);
    60486184    if (*pKey == NULL) {
    60496185        return MEMORY_E;
     
    61926328        ssl->async.freeArgs = NULL;
    61936329    }
     6330    FreeBuildMsgArgs(ssl, &ssl->async.buildArgs);
    61946331#endif
    61956332}
     
    62896426#endif /* WOLFSSL_DTLS */
    62906427#ifdef OPENSSL_EXTRA
     6428#ifndef NO_BIO
    62916429    if (ssl->biord != ssl->biowr)        /* only free write if different */
    62926430        wolfSSL_BIO_free(ssl->biowr);
     
    62946432    ssl->biowr = NULL;
    62956433    ssl->biord = NULL;
     6434#endif
    62966435#endif
    62976436#ifdef HAVE_LIBZ
     
    64246563    }
    64256564#endif
     6565#ifdef WOLFSSL_STATIC_EPHEMERAL
     6566    #ifndef NO_DH
     6567    if (ssl->staticKE.dhKey && ssl->staticKE.dhKey != ssl->ctx->staticKE.dhKey)
     6568        FreeDer(&ssl->staticKE.dhKey);
     6569    #endif
     6570    #ifdef HAVE_ECC
     6571    if (ssl->staticKE.ecKey && ssl->staticKE.ecKey != ssl->ctx->staticKE.ecKey)
     6572        FreeDer(&ssl->staticKE.ecKey);
     6573    #endif
     6574#endif
    64266575
    64276576#ifdef WOLFSSL_STATIC_MEMORY
     
    64716620void FreeHandshakeResources(WOLFSSL* ssl)
    64726621{
     6622    WOLFSSL_ENTER("FreeHandshakeResources");
     6623
     6624#ifdef WOLFSSL_DTLS
     6625    /* DTLS_POOL */
     6626    if (ssl->options.dtls) {
     6627        DtlsMsgPoolReset(ssl);
     6628        DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
     6629        ssl->dtls_rx_msg_list = NULL;
     6630        ssl->dtls_rx_msg_list_sz = 0;
     6631    }
     6632#endif
    64736633
    64746634#ifdef HAVE_SECURE_RENEGOTIATION
     
    65156675        }
    65166676    }
    6517 
    6518 #ifdef WOLFSSL_DTLS
    6519     /* DTLS_POOL */
    6520     if (ssl->options.dtls) {
    6521         DtlsMsgPoolReset(ssl);
    6522         DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap);
    6523         ssl->dtls_rx_msg_list = NULL;
    6524         ssl->dtls_rx_msg_list_sz = 0;
    6525     }
    6526 #endif
    65276677
    65286678#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \
     
    65666716    #ifdef HAVE_ECC
    65676717        dtype = DYNAMIC_TYPE_ECC;
     6718    #elif defined(HAVE_CURVE25519)
     6719        dtype = DYNAMIC_TYPE_CURVE25519;
     6720    #else
     6721        dtype = DYNAMIC_TYPE_CURVE448;
    65686722    #endif
    6569     #ifdef HAVE_CURVE25519
    6570     #ifdef HAVE_ECC
     6723    #if defined(HAVE_ECC) && defined(HAVE_CURVE25519)
    65716724        if (ssl->peerX25519KeyPresent ||
    65726725                              ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE25519)
    6573     #endif /* HAVE_ECC */
    65746726         {
    65756727            dtype = DYNAMIC_TYPE_CURVE25519;
    65766728         }
    6577     #endif /* HAVE_CURVE25519 */
    6578     #ifdef HAVE_CURVE448
    6579     #ifdef HAVE_ECC
     6729    #endif
     6730    #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
     6731                                                          defined(HAVE_CURVE448)
    65806732        if (ssl->peerX448KeyPresent ||
    65816733                                ssl->eccTempKeyPresent == DYNAMIC_TYPE_CURVE448)
    6582     #endif /* HAVE_ECC */
    65836734         {
    65846735            dtype = DYNAMIC_TYPE_CURVE448;
    65856736         }
    6586     #endif /* HAVE_CURVE448 */
     6737    #endif
    65876738        FreeKey(ssl, dtype, (void**)&ssl->eccTempKey);
    65886739        ssl->eccTempKeyPresent = 0;
     
    67016852
    67026853#if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \
     6854    !defined(WOLFSSL_NO_TLS12) || \
    67036855    ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \
    67046856     && defined(HAVE_AEAD))
     
    67306882static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
    67316883{
     6884#ifdef HAVE_SECURE_RENEGOTIATION
     6885    order = DtlsCheckOrder(ssl, order);
     6886#endif
    67326887    if (order == PREV_ORDER) {
    67336888        /* Previous epoch case */
     
    67756930{
    67766931    word32 seq;
     6932#ifdef HAVE_SECURE_RENEGOTIATION
     6933    order = DtlsCheckOrder(ssl, order);
     6934#endif
    67776935
    67786936    if (order == PREV_ORDER) {
     
    68016959
    68026960#if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12)
    6803 static WC_INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
     6961void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
    68046962{
    68056963    word32 seq[2] = {0, 0};
     
    68186976}
    68196977#endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */
    6820 #endif /* !NO_OLD_TLS || WOLFSSL_DTLS ||
     6978#endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 ||
    68216979        *     ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */
    68226980
     
    68336991{
    68346992    DtlsMsg* msg;
     6993    WOLFSSL_ENTER("DtlsMsgNew()");
    68356994
    68366995    (void)heap;
     
    68587017{
    68597018    (void)heap;
     7019    WOLFSSL_ENTER("DtlsMsgDelete()");
    68607020
    68617021    if (item != NULL) {
     
    68767036{
    68777037    DtlsMsg* next;
     7038    WOLFSSL_ENTER("DtlsMsgListDelete()");
    68787039    while (head) {
    68797040        next = head->next;
     
    68837044}
    68847045
     7046/**
     7047 * Drop messages when they are no longer going to be retransmitted
     7048 */
     7049void DtlsTxMsgListClean(WOLFSSL* ssl)
     7050{
     7051    DtlsMsg* head = ssl->dtls_tx_msg_list;
     7052    DtlsMsg* next;
     7053    WOLFSSL_ENTER("DtlsTxMsgListClean()");
     7054    while (head) {
     7055        next = head->next;
     7056        if (VerifyForTxDtlsMsgDelete(ssl, head))
     7057            DtlsMsgDelete(head, ssl->heap);
     7058        else
     7059            /* Stored packets should be in order so break on first failed
     7060             * verify */
     7061            break;
     7062        ssl->dtls_tx_msg_list_sz--;
     7063        /* Reset timer as deleting a node means that state has progressed */
     7064        ssl->dtls_timeout = ssl->dtls_timeout_init;
     7065        head = next;
     7066    }
     7067    ssl->dtls_tx_msg_list = head;
     7068}
    68857069
    68867070/* Create a DTLS Fragment from *begin - end, adjust new *begin and bytesLeft */
     
    68907074    DtlsFrag* newFrag;
    68917075    word32 added = end - *begin + 1;
     7076
     7077    WOLFSSL_ENTER("CreateFragment()");
    68927078
    68937079    (void)heap;
     
    69087094
    69097095
    6910 int DtlsMsgSet(DtlsMsg* msg, word32 seq, const byte* data, byte type,
     7096int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type,
    69117097                                   word32 fragOffset, word32 fragSz, void* heap)
    69127098{
     7099    WOLFSSL_ENTER("DtlsMsgSet()");
    69137100    if (msg != NULL && data != NULL && msg->fragSz <= msg->sz &&
    69147101                                             (fragOffset + fragSz) <= msg->sz) {
     
    69217108
    69227109        msg->seq = seq;
     7110        msg->epoch = epoch;
    69237111        msg->type = type;
    69247112
     
    70097197
    70107198
    7011 DtlsMsg* DtlsMsgFind(DtlsMsg* head, word32 seq)
     7199DtlsMsg* DtlsMsgFind(DtlsMsg* head, word32 epoch, word32 seq)
    70127200{
    7013     while (head != NULL && head->seq != seq) {
     7201    WOLFSSL_ENTER("DtlsMsgFind()");
     7202    while (head != NULL && !(head->epoch == epoch && head->seq == seq)) {
    70147203        head = head->next;
    70157204    }
     
    70187207
    70197208
    7020 void DtlsMsgStore(WOLFSSL* ssl, word32 seq, const byte* data,
     7209void DtlsMsgStore(WOLFSSL* ssl, word32 epoch, word32 seq, const byte* data,
    70217210        word32 dataSz, byte type, word32 fragOffset, word32 fragSz, void* heap)
    70227211{
     
    70397228
    70407229    DtlsMsg* head = ssl->dtls_rx_msg_list;
     7230    WOLFSSL_ENTER("DtlsMsgStore()");
    70417231
    70427232    if (head != NULL) {
    7043         DtlsMsg* cur = DtlsMsgFind(head, seq);
     7233        DtlsMsg* cur = DtlsMsgFind(head, epoch, seq);
    70447234        if (cur == NULL) {
    70457235            cur = DtlsMsgNew(dataSz, heap);
    70467236            if (cur != NULL) {
    7047                 if (DtlsMsgSet(cur, seq, data, type,
    7048                                                 fragOffset, fragSz, heap) < 0) {
     7237                if (DtlsMsgSet(cur, seq, epoch, data, type,
     7238                                               fragOffset, fragSz, heap) < 0) {
    70497239                    DtlsMsgDelete(cur, heap);
    70507240                }
     
    70577247        else {
    70587248            /* If this fails, the data is just dropped. */
    7059             DtlsMsgSet(cur, seq, data, type, fragOffset, fragSz, heap);
     7249            DtlsMsgSet(cur, seq, epoch, data, type, fragOffset,
     7250                    fragSz, heap);
    70607251        }
    70617252    }
    70627253    else {
    70637254        head = DtlsMsgNew(dataSz, heap);
    7064         if (DtlsMsgSet(head, seq, data, type, fragOffset, fragSz, heap) < 0) {
     7255        if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset,
     7256                    fragSz, heap) < 0) {
    70657257            DtlsMsgDelete(head, heap);
    70667258            head = NULL;
     
    70787270DtlsMsg* DtlsMsgInsert(DtlsMsg* head, DtlsMsg* item)
    70797271{
    7080     if (head == NULL || item->seq < head->seq) {
     7272    WOLFSSL_ENTER("DtlsMsgInsert()");
     7273    if (head == NULL || (item->epoch <= head->epoch &&
     7274                         item->seq   <  head->seq)) {
    70817275        item->next = head;
    70827276        head = item;
     
    70897283        DtlsMsg* prev = head;
    70907284        while (cur) {
    7091             if (item->seq < cur->seq) {
     7285            if (item->epoch <= cur->epoch &&
     7286                item->seq   <  cur->seq) {
    70927287                item->next = cur;
    70937288                prev->next = item;
     
    71067301
    71077302
    7108 /* DtlsMsgPoolSave() adds the message to the end of the stored transmit list. */
    7109 int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz)
     7303/**
     7304 * DtlsMsgPoolSave() adds the message to the end of the stored transmit
     7305 * list. Must be called BEFORE BuildMessage or DtlsSEQIncrement or
     7306 * anything else that increments ssl->keys.dtls_handshake_number.
     7307 */
     7308int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz,
     7309                    enum HandShakeType type)
    71107310{
    71117311    DtlsMsg* item;
     
    71267326        XMEMCPY(item->buf, data, dataSz);
    71277327        item->sz = dataSz;
    7128         item->seq = ssl->keys.dtls_epoch;
     7328        item->epoch = ssl->keys.dtls_epoch;
     7329        item->seq = ssl->keys.dtls_handshake_number;
     7330        item->type = type;
    71297331
    71307332        if (cur == NULL)
     
    71497351{
    71507352    int result = -1;
     7353    WOLFSSL_ENTER("DtlsMsgPoolTimeout()");
    71517354    if (ssl->dtls_timeout <  ssl->dtls_timeout_max) {
    71527355        ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER;
     
    71687371        ssl->dtls_tx_msg = NULL;
    71697372        ssl->dtls_tx_msg_list_sz = 0;
    7170         ssl->dtls_timeout = ssl->dtls_timeout_init;
    7171     }
     7373    }
     7374    ssl->dtls_timeout = ssl->dtls_timeout_init;
    71727375}
    71737376
     
    71867389             ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) ||
    71877390            ((ssl->options.side == WOLFSSL_CLIENT_END) &&
    7188              (type == server_hello))));
     7391             (type == hello_request || type == server_hello))));
     7392}
     7393
     7394
     7395/**
     7396 * Verify if message `item` from `ssl->dtls_tx_msg_list` should be deleted
     7397 * depending on the current state of the handshake negotiation.
     7398 */
     7399int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* item)
     7400{
     7401    WOLFSSL_ENTER("VerifyForTxDtlsMsgDelete()");
     7402    if (item->epoch < ssl->keys.dtls_epoch - 1)
     7403        /* Messages not from current or previous epoch can be deleted */
     7404        return 1;
     7405    switch (ssl->options.side) {
     7406    case WOLFSSL_CLIENT_END:
     7407        if (item->type == client_hello &&
     7408                ssl->options.serverState >= SERVER_HELLODONE_COMPLETE)
     7409            return 1; /* client can forget first client_hello if received full
     7410                       * flight of packets from server */
     7411        else
     7412            return 0;
     7413    case WOLFSSL_SERVER_END:
     7414        if (ssl->options.clientState >= CLIENT_HELLO_COMPLETE &&
     7415                item->type == hello_request)
     7416            return 1; /* Server can forget HelloRequest if client sent a valid
     7417                       * ClientHello */
     7418        if (ssl->options.clientState >= CLIENT_FINISHED_COMPLETE &&
     7419                item->type <= server_hello_done)
     7420            return 1; /* server can forget everything up to ServerHelloDone if
     7421                       * a client finished message has been received and
     7422                       * successfully processed */
     7423        else
     7424            return 0;
     7425    default:
     7426        return 0;
     7427    }
    71897428}
    71907429
     
    71967435    int ret = 0;
    71977436    DtlsMsg* pool;
     7437    int epochOrder;
    71987438
    71997439    WOLFSSL_ENTER("DtlsMsgPoolSend()");
     
    72037443    if (pool != NULL) {
    72047444        if ((ssl->options.side == WOLFSSL_SERVER_END &&
    7205              !(ssl->options.acceptState == SERVER_HELLO_DONE ||
     7445             !(ssl->options.acceptState == ACCEPT_BEGIN_RENEG ||
     7446               ssl->options.acceptState == SERVER_HELLO_DONE ||
    72067447               ssl->options.acceptState == ACCEPT_FINISHED_DONE ||
    72077448               ssl->options.acceptState == ACCEPT_THIRD_REPLY_DONE)) ||
     
    72187459
    72197460        while (pool != NULL) {
    7220             if (pool->seq == 0) {
     7461            if (pool->epoch == 0) {
    72217462                DtlsRecordLayerHeader* dtls;
    7222                 int epochOrder;
    72237463
    72247464                dtls = (DtlsRecordLayerHeader*)pool->buf;
     
    72387478                }
    72397479
    7240                 XMEMCPY(ssl->buffers.outputBuffer.buffer,
     7480                XMEMCPY(ssl->buffers.outputBuffer.buffer +
     7481                        ssl->buffers.outputBuffer.idx +
     7482                        ssl->buffers.outputBuffer.length,
    72417483                        pool->buf, pool->sz);
    7242                 ssl->buffers.outputBuffer.idx = 0;
    7243                 ssl->buffers.outputBuffer.length = pool->sz;
    7244             }
    7245             else if (pool->seq == ssl->keys.dtls_epoch) {
     7484                ssl->buffers.outputBuffer.length += pool->sz;
     7485            }
     7486            else {
     7487                /* Handle sending packets from previous epoch */
    72467488                byte*  input;
    72477489                byte*  output;
     
    72517493                inputSz = pool->sz;
    72527494                sendSz = inputSz + MAX_MSG_EXTRA;
     7495
     7496#ifdef HAVE_SECURE_RENEGOTIATION
     7497                /*
     7498                 * CUR_ORDER will use ssl->secure_renegotiation from epoch 2+.
     7499                 * ssl->keys otherwise
     7500                 * PREV_ORDER will always use ssl->keys
     7501                 */
     7502                if (DtlsSCRKeysSet(ssl)) {
     7503                    if (pool->epoch == ssl->secure_renegotiation->tmp_keys.dtls_epoch)
     7504                        epochOrder = CUR_ORDER;
     7505                    else
     7506                        epochOrder = PREV_ORDER;
     7507                }
     7508                else {
     7509                    epochOrder = CUR_ORDER;
     7510                }
     7511#else
     7512                epochOrder = CUR_ORDER;
     7513#endif
     7514
    72537515
    72547516                if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) {
     
    72597521                output = ssl->buffers.outputBuffer.buffer +
    72607522                         ssl->buffers.outputBuffer.length;
    7261                 sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
    7262                                       handshake, 0, 0, 0);
     7523                if (inputSz != ENUM_LEN)
     7524                    sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
     7525                                          handshake, 0, 0, 0, epochOrder);
     7526                else
     7527                    /* inputSz == ENUM_LEN must mean that this is a change cipher
     7528                     * spec message */
     7529                    sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
     7530                                          change_cipher_spec, 0, 0, 0, epochOrder);
     7531
    72637532                if (sendSz < 0) {
    72647533                    WOLFSSL_ERROR(BUILD_MSG_ERROR);
     
    72697538            }
    72707539
    7271             ret = SendBuffered(ssl);
    7272             if (ret < 0) {
    7273                 WOLFSSL_ERROR(ret);
    7274                 return ret;
    7275             }
     7540
     7541            if (!ssl->options.groupMessages)
     7542                ret = SendBuffered(ssl);
    72767543
    72777544            /**
     
    72847551             */
    72857552            if (sendOnlyFirstPacket &&
    7286                 ssl->options.side == WOLFSSL_SERVER_END) {
    7287 
     7553                ssl->options.side == WOLFSSL_SERVER_END)
    72887554                pool = NULL;
    7289             }
    72907555            else
    72917556                pool = pool->next;
    72927557            ssl->dtls_tx_msg = pool;
    72937558        }
     7559
     7560        if (ret == 0 && ssl->options.groupMessages)
     7561            ret = SendBuffered(ssl);
    72947562    }
    72957563
     
    73987666    word32 LowResTimer(void)
    73997667    {
    7400         const uint32_t systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
    7401         uint32_t *systemTickPtr = systemTickPointer();
     7668        const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
     7669        word32 *systemTickPtr = systemTickPointer();
    74027670
    74037671        return (word32) *systemTickPtr/systemTickTimeInHz;
     
    75437811    {
    75447812        return k_uptime_get() / 1000;
     7813    }
     7814
     7815#elif defined(WOLFSSL_LINUXKM)
     7816    #include <linux/time.h>
     7817    #include <linux/ktime.h>
     7818    word32 LowResTimer(void)
     7819    {
     7820        return (word32)ktime_get_real_ns();
    75457821    }
    75467822
     
    75907866#endif /* (HAVE_ED25519 || HAVE_ED448) && !WOLFSSL_NO_CLIENT_AUTH */
    75917867
    7592 #ifndef NO_CERTS
    7593 int HashOutputRaw(WOLFSSL* ssl, const byte* output, int sz)
     7868int HashRaw(WOLFSSL* ssl, const byte* data, int sz)
    75947869{
    75957870    int ret = 0;
    75967871
    7597     (void)output;
     7872    (void)data;
    75987873    (void)sz;
    75997874
    7600     if (ssl->hsHashes == NULL)
     7875    if (ssl->hsHashes == NULL) {
    76017876        return BAD_FUNC_ARG;
    7602 
    7603 #ifdef HAVE_FUZZER
    7604     if (ssl->fuzzerCb)
    7605         ssl->fuzzerCb(ssl, output, sz, FUZZ_HASH, ssl->fuzzerCtx);
    7606 #endif
     7877    }
     7878
    76077879#ifndef NO_OLD_TLS
    76087880    #ifndef NO_SHA
    7609         wc_ShaUpdate(&ssl->hsHashes->hashSha, output, sz);
     7881        wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz);
    76107882    #endif
    76117883    #ifndef NO_MD5
    7612         wc_Md5Update(&ssl->hsHashes->hashMd5, output, sz);
     7884        wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz);
    76137885    #endif
    76147886#endif /* NO_OLD_TLS */
     
    76167888    if (IsAtLeastTLSv1_2(ssl)) {
    76177889    #ifndef NO_SHA256
    7618         ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, output, sz);
     7890        ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz);
    76197891        if (ret != 0)
    76207892            return ret;
    76217893    #endif
    76227894    #ifdef WOLFSSL_SHA384
    7623         ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, output, sz);
     7895        ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz);
    76247896        if (ret != 0)
    76257897            return ret;
    76267898    #endif
    76277899    #ifdef WOLFSSL_SHA512
    7628         ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, output, sz);
     7900        ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz);
    76297901        if (ret != 0)
    76307902            return ret;
     
    76337905               ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
    76347906                (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
    7635         ret = EdDSA_Update(ssl, output, sz);
     7907        ret = EdDSA_Update(ssl, data, sz);
    76367908        if (ret != 0)
    76377909            return ret;
     
    76417913    return ret;
    76427914}
    7643 #endif /* NO_CERTS */
    7644 
    76457915
    76467916/* add output to md5 and sha handshake hashes, exclude record header */
    76477917int HashOutput(WOLFSSL* ssl, const byte* output, int sz, int ivSz)
    76487918{
    7649     int ret = 0;
    76507919    const byte* adj;
    76517920
     
    76667935    }
    76677936#endif
    7668 #ifndef NO_OLD_TLS
    7669     #ifndef NO_SHA
    7670         wc_ShaUpdate(&ssl->hsHashes->hashSha, adj, sz);
    7671     #endif
    7672     #ifndef NO_MD5
    7673         wc_Md5Update(&ssl->hsHashes->hashMd5, adj, sz);
    7674     #endif
    7675 #endif
    7676 
    7677     if (IsAtLeastTLSv1_2(ssl)) {
    7678     #ifndef NO_SHA256
    7679         ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, adj, sz);
    7680         if (ret != 0)
    7681             return ret;
    7682     #endif
    7683     #ifdef WOLFSSL_SHA384
    7684         ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, adj, sz);
    7685         if (ret != 0)
    7686             return ret;
    7687     #endif
    7688     #ifdef WOLFSSL_SHA512
    7689         ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, adj, sz);
    7690         if (ret != 0)
    7691             return ret;
    7692     #endif
    7693     #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
    7694                ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
    7695                 (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
    7696         ret = EdDSA_Update(ssl, adj, sz);
    7697         if (ret != 0)
    7698             return ret;
    7699     #endif
    7700     }
    7701 
    7702     return ret;
     7937
     7938    return HashRaw(ssl, adj, sz);
    77037939}
    77047940
     
    77077943int HashInput(WOLFSSL* ssl, const byte* input, int sz)
    77087944{
    7709     int ret = 0;
    77107945    const byte* adj;
     7946
     7947    if (ssl->hsHashes == NULL) {
     7948        return BAD_FUNC_ARG;
     7949    }
    77117950
    77127951    adj = input - HANDSHAKE_HEADER_SZ;
    77137952    sz += HANDSHAKE_HEADER_SZ;
    7714 
    7715     (void)adj;
    77167953
    77177954#ifdef WOLFSSL_DTLS
     
    77227959#endif
    77237960
    7724     if (ssl->hsHashes == NULL) {
    7725         return BAD_FUNC_ARG;
    7726     }
    7727 
    7728 #ifndef NO_OLD_TLS
    7729     #ifndef NO_SHA
    7730         wc_ShaUpdate(&ssl->hsHashes->hashSha, adj, sz);
    7731     #endif
    7732     #ifndef NO_MD5
    7733         wc_Md5Update(&ssl->hsHashes->hashMd5, adj, sz);
    7734     #endif
    7735 #endif
    7736 
    7737     if (IsAtLeastTLSv1_2(ssl)) {
    7738     #ifndef NO_SHA256
    7739         ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, adj, sz);
    7740         if (ret != 0)
    7741             return ret;
    7742     #endif
    7743     #ifdef WOLFSSL_SHA384
    7744         ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, adj, sz);
    7745         if (ret != 0)
    7746             return ret;
    7747     #endif
    7748     #ifdef WOLFSSL_SHA512
    7749         ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, adj, sz);
    7750         if (ret != 0)
    7751             return ret;
    7752     #endif
    7753     #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \
    7754                ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \
    7755                 (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)))
    7756         ret = EdDSA_Update(ssl, adj, sz);
    7757         if (ret != 0)
    7758             return ret;
    7759     #endif
    7760     }
    7761 
    7762     return ret;
     7961    return HashRaw(ssl, adj, sz);
    77637962}
    77647963
    77657964
    77667965/* add record layer header for message */
    7767 static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl)
     7966static void AddRecordHeader(byte* output, word32 length, byte type, WOLFSSL* ssl, int epochOrder)
    77687967{
    77697968    RecordLayerHeader* rl;
     7969
     7970    (void)epochOrder;
    77707971
    77717972    /* record layer header */
     
    77787979#ifdef WOLFSSL_TLS13
    77797980    if (IsAtLeastTLSv1_3(ssl->version)) {
    7780 #ifdef WOLFSSL_TLS13_DRAFT_18
    7781         rl->pvMinor = TLSv1_MINOR;
    7782 #else
    77837981        rl->pvMinor = TLSv1_2_MINOR;
    7784 #endif
    77857982    }
    77867983    else
     
    78068003        /* dtls record layer header extensions */
    78078004        dtls = (DtlsRecordLayerHeader*)output;
    7808         WriteSEQ(ssl, 0, dtls->sequence_number);
     8005        WriteSEQ(ssl, epochOrder, dtls->sequence_number);
    78098006        c16toa((word16)length, dtls->length);
    78108007#endif
     
    78588055#endif
    78598056
    7860     AddRecordHeader(output, length + lengthAdj, handshake, ssl);
     8057    AddRecordHeader(output, length + lengthAdj, handshake, ssl, CUR_ORDER);
    78618058    AddHandShakeHeader(output + outputAdj, length, 0, length, type, ssl);
    78628059}
     
    78818078#endif
    78828079
    7883     AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl);
     8080    AddRecordHeader(output, fragSz + lengthAdj, handshake, ssl, CUR_ORDER);
    78848081    AddHandShakeHeader(output + outputAdj, length, fragOffset, fragSz, type, ssl);
    78858082}
     
    79048101            case WOLFSSL_CBIO_ERR_GENERAL:        /* general/unknown error */
    79058102                #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)
     8103                #ifndef NO_BIO
    79068104                    if (ssl->biord) {
    79078105                        /* If retry and read flags are set, return WANT_READ */
     
    79118109                        }
    79128110                    }
     8111                #endif
    79138112                #endif
    79148113                return -1;
     
    79538152            #ifdef WOLFSSL_DTLS
    79548153                if (IsDtlsNotSctpMode(ssl) &&
    7955                     !ssl->options.handShakeDone &&
     8154                    ssl->options.handShakeState != HANDSHAKE_DONE &&
    79568155                    DtlsMsgPoolTimeout(ssl) == 0 &&
    79578156                    DtlsMsgPoolSend(ssl, 0) == 0) {
     
    82368435
    82378436
    8238 /* check available size into output buffer, make room if needed */
     8437/* Check available size into output buffer, make room if needed.
     8438 * This function needs to be called before anything gets put
     8439 * into the output buffers since it flushes pending data if it
     8440 * predicts that the msg will exceed MTU. */
    82398441int CheckAvailableSize(WOLFSSL *ssl, int size)
    82408442{
     
    82438445        return BAD_FUNC_ARG;
    82448446    }
     8447
     8448#ifdef WOLFSSL_DTLS
     8449    if (ssl->options.dtls &&
     8450            size + ssl->buffers.outputBuffer.length -
     8451            ssl->buffers.outputBuffer.idx > ssl->dtls_expected_rx) {
     8452        int ret;
     8453        WOLFSSL_MSG("CheckAvailableSize() flushing buffer "
     8454                    "to make room for new message");
     8455        if ((ret = SendBuffered(ssl)) != 0) {
     8456            return ret;
     8457        }
     8458    }
     8459#endif
    82458460
    82468461    if (ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length
     
    82978512
    82988513#ifdef WOLFSSL_DTLS
    8299     if (IsDtlsNotSctpMode(ssl) && !DtlsCheckWindow(ssl)) {
     8514    if (IsDtlsNotSctpMode(ssl)) {
     8515        if (!DtlsCheckWindow(ssl) ||
     8516                (rh->type == application_data && ssl->keys.curEpoch == 0) ||
     8517                (rh->type == alert && ssl->options.handShakeDone &&
     8518                        ssl->keys.curEpoch == 0 && ssl->keys.dtls_epoch != 0)) {
    83008519            WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR);
    83018520            return SEQUENCE_ERROR;
     8521        }
    83028522    }
    83038523#endif
     
    83098529    if (rh->pvMajor != ssl->version.major ||
    83108530        (rh->pvMinor != ssl->version.minor &&
    8311 #ifdef WOLFSSL_TLS13_DRAFT_18
    8312          (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_MINOR)
    8313 #else
    83148531         (!IsAtLeastTLSv1_3(ssl->version) || rh->pvMinor != TLSv1_2_MINOR)
    8315 #endif
    83168532        ))
    83178533#endif
     
    92819497
    92829498
    9283 /* try to find an altName match to domain, return 1 on success */
    9284 int CheckAltNames(DecodedCert* dCert, char* domain)
    9285 {
    9286     int        match = 0;
    9287     DNS_entry* altName = NULL;
    9288 
    9289     WOLFSSL_MSG("Checking AltNames");
    9290 
    9291     if (dCert)
    9292         altName = dCert->altNames;
    9293 
    9294     while (altName) {
    9295         WOLFSSL_MSG("\tindividual AltName check");
    9296 
    9297         if (MatchDomainName(altName->name, altName->len, domain)){
    9298             match = 1;
    9299             break;
    9300         }
    9301 
    9302         altName = altName->next;
    9303     }
    9304 
    9305     return match;
    9306 }
    9307 
    9308 #ifdef OPENSSL_EXTRA
    93099499/* Check that alternative names, if they exists, match the domain.
    93109500 * Fail if there are wild patterns and they didn't match.
     
    93149504 * domain   Domain name to compare against.
    93159505 * checkCN  Whether to check the common name.
    9316  * returns whether there was a problem in matching.
     9506 * returns  1 : match was found.
     9507 *          0 : no match found.
     9508 *         -1 : No matches and wild pattern match failed.
    93179509 */
    9318 static int CheckForAltNames(DecodedCert* dCert, char* domain, int* checkCN)
     9510int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN)
    93199511{
    9320     int        match;
     9512    int match = 0;
    93219513    DNS_entry* altName = NULL;
     9514    char *buf;
     9515    word32 len;
    93229516
    93239517    WOLFSSL_MSG("Checking AltNames");
     
    93269520        altName = dCert->altNames;
    93279521
    9328     *checkCN = altName == NULL;
    9329     match = 0;
     9522    if (checkCN != NULL) {
     9523        *checkCN = (altName == NULL) ? 1 : 0;
     9524    }
     9525
    93309526    while (altName) {
     9527#if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
     9528        char name[WOLFSSL_MAX_IPSTR] = {0};
     9529#endif
     9530
    93319531        WOLFSSL_MSG("\tindividual AltName check");
    93329532
    9333         if (MatchDomainName(altName->name, altName->len, domain)) {
     9533#if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME)
     9534        /* check if alt name is stored as IP addr octet */
     9535        if (altName->type == ASN_IP_TYPE) {
     9536            char tmp[4];
     9537            int i;
     9538            word32 idx = 0;
     9539            for (i = 0; (idx < WOLFSSL_MAX_IPSTR) && (i < altName->len); i++) {
     9540                XMEMSET(tmp, 0, sizeof(tmp));
     9541                XSNPRINTF(tmp, sizeof(tmp), (altName->len <= 4) ? "%u" : "%02X",
     9542                        altName->name[i]);
     9543                idx += (word32)XSTRLEN(tmp);
     9544                XSTRNCAT(name, tmp, (altName->len <= 4) ? 3 : 2);
     9545                if ((idx < WOLFSSL_MAX_IPSTR ) && ((i + 1) < altName->len)) {
     9546                    name[idx++] = (altName->len <= 4) ? '.' : ':';
     9547                }
     9548            }
     9549            if (idx >= WOLFSSL_MAX_IPSTR) {
     9550                idx = WOLFSSL_MAX_IPSTR -1;
     9551            }
     9552            name[idx] = '\0';
     9553            buf = name;
     9554            len = (word32)XSTRLEN(name);
     9555        }
     9556        else
     9557#endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
     9558        {
     9559            buf = altName->name;
     9560            len = altName->len;
     9561        }
     9562
     9563        if (MatchDomainName(buf, len, domain)) {
    93349564            match = 1;
    9335             *checkCN = 0;
     9565            if (checkCN != NULL) {
     9566                *checkCN = 0;
     9567            }
     9568            WOLFSSL_MSG("\tmatch found");
    93369569            break;
    93379570        }
    93389571        /* No matches and wild pattern match failed. */
    9339         else if (altName->name && altName->len >=1 &&
    9340                 altName->name[0] == '*' && match == 0) {
     9572        else if (buf && (len >=1) && (buf[0] == '*')) {
    93419573            match = -1;
     9574            WOLFSSL_MSG("\twildcard match failed");
    93429575        }
    93439576
     
    93459578    }
    93469579
    9347     return match != -1;
     9580    return match;
    93489581}
     9582
    93499583
    93509584/* Check the domain name matches the subject alternative name or the subject
     
    93569590 * returns DOMAIN_NAME_MISMATCH when no match found and 0 on success.
    93579591 */
    9358 int CheckHostName(DecodedCert* dCert, char *domainName, size_t domainNameLen)
     9592int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen)
    93599593{
    93609594    int checkCN;
     9595    int ret = DOMAIN_NAME_MISMATCH;
    93619596
    93629597    /* Assume name is NUL terminated. */
    93639598    (void)domainNameLen;
    93649599
    9365     if (CheckForAltNames(dCert, domainName, &checkCN) == 0) {
    9366         WOLFSSL_MSG("DomainName match on alt names failed too");
    9367         return DOMAIN_NAME_MISMATCH;
    9368     }
     9600    if (CheckForAltNames(dCert, domainName, &checkCN) != 1) {
     9601        WOLFSSL_MSG("DomainName match on alt names failed");
     9602    }
     9603    else {
     9604        ret = 0;
     9605    }
     9606
    93699607    if (checkCN == 1) {
    93709608        if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen,
    9371                             domainName) == 0) {
     9609                            domainName) == 1) {
     9610            ret = 0;
     9611        }
     9612        else {
    93729613            WOLFSSL_MSG("DomainName match on common name failed");
    9373             return DOMAIN_NAME_MISMATCH;
    9374         }
    9375     }
    9376 
    9377     return 0;
     9614        }
     9615    }
     9616
     9617    return ret;
    93789618}
    93799619
    9380 int CheckIPAddr(DecodedCert* dCert, char* ipasc)
     9620int CheckIPAddr(DecodedCert* dCert, const char* ipasc)
    93819621{
    93829622    WOLFSSL_MSG("Checking IPAddr");
     
    93849624    return CheckHostName(dCert, ipasc, (size_t)XSTRLEN(ipasc));
    93859625}
    9386 #endif
     9626
    93879627
    93889628#ifdef SESSION_CERTS
     
    94159655        return BAD_FUNC_ARG;
    94169656
     9657    if (x509->issuer.name == NULL || x509->subject.name == NULL) {
     9658        WOLFSSL_MSG("Either init was not called on X509 or programming error");
     9659        return BAD_FUNC_ARG;
     9660    }
     9661
    94179662    x509->version = dCert->version + 1;
    94189663
     
    94219666    x509->issuer.sz = (int)XSTRLEN(x509->issuer.name) + 1;
    94229667#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    9423     if (dCert->issuerName.fullName != NULL) {
    9424         XMEMCPY(&x509->issuer.fullName,
    9425                                        &dCert->issuerName, sizeof(DecodedName));
    9426         x509->issuer.fullName.fullName = (char*)XMALLOC(
    9427                         dCert->issuerName.fullNameLen, x509->heap,
    9428                         DYNAMIC_TYPE_X509);
    9429         if (x509->issuer.fullName.fullName != NULL)
    9430             XMEMCPY(x509->issuer.fullName.fullName,
    9431                      dCert->issuerName.fullName, dCert->issuerName.fullNameLen);
    9432     }
    9433     x509->issuer.x509 = x509;
     9668    if (dCert->issuerName != NULL) {
     9669        wolfSSL_X509_set_issuer_name(x509,
     9670                (WOLFSSL_X509_NAME*)dCert->issuerName);
     9671        x509->issuer.x509 = x509;
     9672    }
    94349673#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
    94359674
     
    94389677    x509->subject.sz = (int)XSTRLEN(x509->subject.name) + 1;
    94399678#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    9440     if (dCert->subjectName.fullName != NULL) {
    9441         XMEMCPY(&x509->subject.fullName,
    9442                                       &dCert->subjectName, sizeof(DecodedName));
    9443         x509->subject.fullName.fullName = (char*)XMALLOC(
    9444                  dCert->subjectName.fullNameLen, x509->heap, DYNAMIC_TYPE_X509);
    9445         if (x509->subject.fullName.fullName != NULL)
    9446             XMEMCPY(x509->subject.fullName.fullName,
    9447                    dCert->subjectName.fullName, dCert->subjectName.fullNameLen);
    9448     }
    9449     x509->subject.x509 = x509;
     9679    if (dCert->subjectName != NULL) {
     9680        wolfSSL_X509_set_subject_name(x509,
     9681                (WOLFSSL_X509_NAME*)dCert->subjectName);
     9682        x509->subject.x509 = x509;
     9683    }
    94509684#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
    94519685#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
     
    94669700    else
    94679701        x509->subjectCN[0] = '\0';
     9702
     9703#ifdef WOLFSSL_CERT_REQ
     9704    x509->isCSR = dCert->isCSR;
     9705    /* CSR attributes */
     9706    if (dCert->cPwd) {
     9707        if (dCert->cPwdLen < CTC_NAME_SIZE) {
     9708            XMEMCPY(x509->challengePw, dCert->cPwd, dCert->cPwdLen);
     9709            x509->challengePw[dCert->cPwdLen] = '\0';
     9710#ifdef OPENSSL_ALL
     9711            if (x509->challengePwAttr) {
     9712                wolfSSL_X509_ATTRIBUTE_free(x509->challengePwAttr);
     9713            }
     9714            x509->challengePwAttr = wolfSSL_X509_ATTRIBUTE_new();
     9715            if (x509->challengePwAttr) {
     9716                x509->challengePwAttr->value->value.asn1_string =
     9717                        wolfSSL_ASN1_STRING_new();
     9718                if (wolfSSL_ASN1_STRING_set(
     9719                        x509->challengePwAttr->value->value.asn1_string,
     9720                        dCert->cPwd, dCert->cPwdLen) != WOLFSSL_SUCCESS) {
     9721                    ret = MEMORY_E;
     9722                }
     9723                x509->challengePwAttr->value->type = V_ASN1_PRINTABLESTRING;
     9724            }
     9725            else {
     9726                ret = MEMORY_E;
     9727            }
     9728#endif
     9729        }
     9730        else {
     9731            WOLFSSL_MSG("Challenge password too long");
     9732            ret = MEMORY_E;
     9733        }
     9734    }
     9735#endif
    94689736
    94699737#ifdef WOLFSSL_SEP
     
    97299997    int ret = 0;
    97309998    OcspRequest* request;
     9999    WOLFSSL_ENTER("ProcessCSR");
    973110000
    973210001    #ifdef WOLFSSL_SMALL_STACK
    973310002        CertStatus* status;
     10003        OcspEntry* single;
    973410004        OcspResponse* response;
    973510005    #else
    973610006        CertStatus status[1];
     10007        OcspEntry single[1];
    973710008        OcspResponse response[1];
    973810009    #endif
     
    976410035    #ifdef WOLFSSL_SMALL_STACK
    976510036        status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
    9766                                                       DYNAMIC_TYPE_OCSP_STATUS);
     10037                                                    DYNAMIC_TYPE_OCSP_STATUS);
     10038        single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
     10039                                                    DYNAMIC_TYPE_OCSP_ENTRY);
    976710040        response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
    9768                                                      DYNAMIC_TYPE_OCSP_REQUEST);
    9769 
    9770         if (status == NULL || response == NULL) {
     10041                                                    DYNAMIC_TYPE_OCSP_REQUEST);
     10042
     10043        if (status == NULL || single == NULL || response == NULL) {
    977110044            if (status)
    9772                 XFREE(status, NULL, DYNAMIC_TYPE_OCSP_STATUS);
     10045                XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
     10046            if (single)
     10047                XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
    977310048            if (response)
    9774                 XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
     10049                XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
    977510050
    977610051            return MEMORY_ERROR;
     
    977810053    #endif
    977910054
    9780     InitOcspResponse(response, status, input +*inOutIdx, status_length);
     10055    InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap);
    978110056
    978210057    if (OcspResponseDecode(response, ssl->ctx->cm, ssl->heap, 0) != 0)
     
    978610061    else if (response->responseStatus != OCSP_SUCCESSFUL)
    978710062        ret = BAD_CERTIFICATE_STATUS_ERROR;
    9788     else if (response->status->status == CERT_REVOKED)
     10063    else if (response->single->status->status == CERT_REVOKED)
    978910064        ret = OCSP_CERT_REVOKED;
    9790     else if (response->status->status != CERT_GOOD)
     10065    else if (response->single->status->status != CERT_GOOD)
    979110066        ret = BAD_CERTIFICATE_STATUS_ERROR;
     10067
     10068    else {
     10069        XMEMCPY(ssl->ocspProducedDate, response->producedDate, sizeof ssl->ocspProducedDate);
     10070        ssl->ocspProducedDateFormat = response->producedDateFormat;
     10071    }
    979210072
    979310073    *inOutIdx += status_length;
     
    979510075    #ifdef WOLFSSL_SMALL_STACK
    979610076        XFREE(status,   ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
     10077        XFREE(single,   ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
    979710078        XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
    979810079    #endif
    979910080
     10081    WOLFSSL_LEAVE("ProcessCSR", ret);
    980010082    return ret;
    980110083}
     
    987610158    if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) {
    987710159        alertWhy = certificate_expired;
     10160    } else if (ret == ASN_NO_SIGNER_E) {
     10161        alertWhy = unknown_ca;
    987810162    }
    987910163#if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD))
     
    991110195{
    991210196    int verify_ok = 0, use_cb = 0;
    9913     void *heap = (ssl != NULL) ? ssl->heap : cm->heap;
     10197    void *heap;
     10198
     10199    if (cm == NULL) {
     10200        return BAD_FUNC_ARG;
     10201    }
     10202
     10203    heap = (ssl != NULL) ? ssl->heap : cm->heap;
    991410204
    991510205    /* Determine if verify was okay */
     
    994210232        /* If altNames names is present, then subject common name is ignored */
    994310233        if (args->dCert->altNames != NULL) {
    9944             if (CheckAltNames(args->dCert, ssl->param->hostName) == 0 ) {
     10234            if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) {
    994510235                if (ret == 0) {
    994610236                    ret = DOMAIN_NAME_MISMATCH;
     
    999510285        char domain[ASN_NAME_MAX];
    999610286    #endif
     10287    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
     10288        int x509Free = 0;
     10289    #endif
    999710290
    999810291    #ifdef WOLFSSL_SMALL_STACK
     
    1004410337        store->certs = args->certs;
    1004510338        store->totalCerts = args->totalCerts;
    10046     #if defined(HAVE_EX_DATA) || defined(FORTRESS)
     10339    #if (defined(HAVE_EX_DATA) || defined(FORTRESS)) && \
     10340        (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
    1004710341        if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl)
    1004810342                != WOLFSSL_SUCCESS) {
     
    1010110395                if (CopyDecodedToX509(x509, args->dCert) == 0) {
    1010210396                    store->current_cert = x509;
     10397                    x509Free = 1;
    1010310398                }
    1010410399                else {
     
    1011310408    #ifndef NO_WOLFSSL_CM_VERIFY
    1011410409        /* non-zero return code indicates failure override */
    10115         if ((cm != NULL) && (cm->verifyCallback != NULL)) {
     10410        if (cm->verifyCallback != NULL) {
    1011610411            store->userCtx = cm;
    1011710412            if (cm->verifyCallback(verify_ok, store)) {
     
    1016710462        }
    1016810463    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    10169         if (args->certIdx > 0)
     10464        if (x509Free) {
    1017010465            FreeX509(x509);
     10466        }
    1017110467    #endif
    1017210468    #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA)
     
    1056210858
    1056310859            /* allocate buffer for certs */
    10564         #ifdef OPENSSL_EXTRA
    10565             args->certs = (buffer*)XMALLOC(sizeof(buffer) *
    10566                     (ssl->verifyDepth + 1), ssl->heap, DYNAMIC_TYPE_DER);
    10567             if (args->certs == NULL) {
    10568                 ERROR_OUT(MEMORY_E, exit_ppc);
    10569             }
    10570             XMEMSET(args->certs, 0, sizeof(buffer) * (ssl->verifyDepth + 1));
    10571         #else
    1057210860            args->certs = (buffer*)XMALLOC(sizeof(buffer) * MAX_CHAIN_DEPTH,
    1057310861                                            ssl->heap, DYNAMIC_TYPE_DER);
     
    1057610864            }
    1057710865            XMEMSET(args->certs, 0, sizeof(buffer) * MAX_CHAIN_DEPTH);
    10578         #endif /* OPENSSL_EXTRA */
    1057910866
    1058010867            /* Certificate List */
     
    1059710884                word32 certSz;
    1059810885
     10886
    1059910887            #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    10600                 if (args->totalCerts > ssl->verifyDepth) {
     10888                if (args->totalCerts >= MAX_CHAIN_DEPTH) {
    1060110889                    ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
    10602                     ERROR_OUT(MAX_CHAIN_ERROR, exit_ppc);
     10890                    ret = MAX_CHAIN_ERROR;
     10891                    WOLFSSL_MSG("Too many certs for MAX_CHAIN_DEPTH");
     10892                    break; /* break out to avoid reading more certs then buffer
     10893                            * can hold */
    1060310894                }
    1060410895            #else
     
    1063610927                    word16 extSz;
    1063710928
     10929                    if (args->exts == NULL) {
     10930                        ERROR_OUT(BUFFER_ERROR, exit_ppc);
     10931                    }
    1063810932                    if ((args->idx - args->begin) + OPAQUE16_LEN > totalSz) {
    1063910933                        ERROR_OUT(BUFFER_ERROR, exit_ppc);
     
    1066410958            args->certIdx = 0; /* select peer cert (first one) */
    1066510959
    10666             if (args->count == 0 && ssl->options.mutualAuth &&
     10960            if (args->count == 0 && (ssl->options.mutualAuth ||
     10961                 (ssl->options.failNoCert && IsAtLeastTLSv1_3(ssl->version))) &&
    1066710962                                      ssl->options.side == WOLFSSL_SERVER_END) {
    1066810963                ret = NO_PEER_CERT;
     
    1083711132                    }
    1083811133            #endif /* HAVE_OCSP || HAVE_CRL */
    10839 
     11134            #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
     11135                    if (ret == 0 &&
     11136                        /* extend the limit "+1" until reaching
     11137                         * an ultimately trusted issuer.*/
     11138                        args->count > (ssl->verifyDepth + 1)) {
     11139                        ssl->peerVerifyRet = X509_V_ERR_CERT_CHAIN_TOO_LONG;
     11140                        ret = MAX_CHAIN_ERROR;
     11141                    }
     11142            #endif
    1084011143                    /* Do verify callback */
    1084111144                    ret = DoVerifyCallback(ssl->ctx->cm, ssl, ret, args);
     11145                    if (ssl->options.verifyNone &&
     11146                              (ret == CRL_MISSING || ret == CRL_CERT_REVOKED)) {
     11147                        WOLFSSL_MSG("Ignoring CRL problem based on verify setting");
     11148                        ret = ssl->error = 0;
     11149                    }
    1084211150
    1084311151                #ifdef WOLFSSL_ALT_CERT_CHAINS
     
    1085311161                            }
    1085411162
    10855                             ret = 0; /* clear error and continue */
     11163                            ret = 0; /* clear errors and continue */
     11164                            args->verifyErr = 0;
    1085611165                        }
    1085711166
     
    1095111260                #endif /* SESSION_CERTS && WOLFSSL_ALT_CERT_CHAINS */
    1095211261
     11262                    /* Check peer's certificate version number. TLS 1.2 / 1.3
     11263                     * requires the clients certificate be version 3 unless a
     11264                     * different version has been negotiated using RFC 7250 */
     11265                    if ((ret == 0) &&
     11266                            (ssl->options.side == WOLFSSL_SERVER_END)) {
     11267                        if (args->dCert->version != WOLFSSL_X509_V3) {
     11268                            WOLFSSL_MSG("Peers certificate was not version 3!");
     11269                            args->lastErr = ASN_VERSION_E;
     11270                            /* setting last error but not considering it fatal
     11271                             * giving the user a chance to override */
     11272                        }
     11273                    }
     11274
    1095311275                    /* check if fatal error */
    1095411276                    if (args->verifyErr) {
    1095511277                        args->fatal = 1;
    10956                         if (ret == 0) {
    10957                             ret = args->lastErr;
    10958                         }
     11278                        ret = args->lastErr;
    1095911279                    }
    1096011280                    else {
     
    1096411284                else if (ret == ASN_PARSE_E || ret == BUFFER_E) {
    1096511285                    WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR");
     11286                #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \
     11287                                               defined(OPENSSL_EXTRA_X509_SMALL)
     11288                    DoCertFatalAlert(ssl, ret);
     11289                #endif
    1096611290                #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    10967                     SendAlert(ssl, alert_fatal, bad_certificate);
    1096811291                    ssl->peerVerifyRet = X509_V_ERR_CERT_REJECTED;
    1096911292                #endif
     
    1098011303                        /* check if fatal error */
    1098111304                        args->fatal = (args->verifyErr) ? 1 : 0;
     11305                    #if defined(WOLFSSL_EXTRA_ALERTS) || \
     11306                                                     defined(OPENSSL_EXTRA) || \
     11307                                               defined(OPENSSL_EXTRA_X509_SMALL)
     11308                        if (args->fatal)
     11309                            DoCertFatalAlert(ssl, ret);
     11310                    #endif
    1098211311                    }
    1098311312                    else {
    1098411313                        WOLFSSL_MSG("\tNo callback override available, fatal");
    1098511314                        args->fatal = 1;
    10986                     #ifdef OPENSSL_EXTRA
    10987                         SendAlert(ssl, alert_fatal, bad_certificate);
     11315                    #if defined(WOLFSSL_EXTRA_ALERTS) || \
     11316                                                     defined(OPENSSL_EXTRA) || \
     11317                                               defined(OPENSSL_EXTRA_X509_SMALL)
     11318                        DoCertFatalAlert(ssl, ret);
    1098811319                    #endif
    1098911320                    }
     
    1104211373                                                    args->dCert, ssl->heap);
    1104311374                            doLookup = 0;
    11044                         #if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
     11375                        #if defined(WOLFSSL_TLS13)
    1104511376                            if (ssl->options.tls1_3) {
    1104611377                                TLSX* ext = TLSX_Find(ssl->extensions,
     
    1105711388                            }
    1105811389                        #endif
     11390                        }
     11391                        /* Ensure a stapling response was seen */
     11392                        else if (ssl->options.tls1_3 &&
     11393                                                 ssl->ctx->cm->ocspMustStaple) {
     11394                             ret = OCSP_CERT_UNKNOWN;
     11395                             goto exit_ppc;
    1105911396                        }
    1106011397                #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
     
    1111511452                    int copyRet = 0;
    1111611453
     11454                    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
     11455                        if (ssl->options.handShakeDone) {
     11456                            FreeX509(&ssl->peerCert);
     11457                            InitX509(&ssl->peerCert, 0, ssl->heap);
     11458                        }
     11459                        else
     11460                    #endif
    1111711461                    #ifdef HAVE_SECURE_RENEGOTIATION
    1111811462                        if (ssl->secure_renegotiation &&
     
    1112011464                            /* free old peer cert */
    1112111465                            FreeX509(&ssl->peerCert);
     11466                            InitX509(&ssl->peerCert, 0, ssl->heap);
    1112211467                        }
     11468                        else
    1112311469                    #endif
     11470                        {
     11471                        }
    1112411472
    1112511473                    /* set X509 format for peer cert */
     
    1120211550                     * alternative name extension MUST be used." */
    1120311551                    if (args->dCert->altNames) {
    11204                         if (CheckAltNames(args->dCert,
    11205                                 (char*)ssl->buffers.domainName.buffer) == 0 ) {
     11552                        if (CheckForAltNames(args->dCert,
     11553                                (char*)ssl->buffers.domainName.buffer,
     11554                                NULL) != 1) {
    1120611555                            WOLFSSL_MSG("DomainName match on alt names failed");
    1120711556                            /* try to get peer key still */
     
    1122411573                                (char*)ssl->buffers.domainName.buffer) == 0) {
    1122511574                        WOLFSSL_MSG("DomainName match on common name failed");
    11226                         if (CheckAltNames(args->dCert,
    11227                                  (char*)ssl->buffers.domainName.buffer) == 0 ) {
     11575                        if (CheckForAltNames(args->dCert,
     11576                                 (char*)ssl->buffers.domainName.buffer,
     11577                                 NULL) != 1) {
    1122811578                            WOLFSSL_MSG(
    1122911579                                "DomainName match on alt names failed too");
     
    1127911629                    #ifdef HAVE_PK_CALLBACKS
    1128011630                        #ifndef NO_RSA
    11281                             #ifdef HAVE_SECURE_RENEGOTIATION
     11631                            #if defined(HAVE_SECURE_RENEGOTIATION) || \
     11632                                            defined(WOLFSSL_POST_HANDSHAKE_AUTH)
    1128211633                            if (ssl->buffers.peerRsaKey.buffer) {
    1128311634                                XFREE(ssl->buffers.peerRsaKey.buffer,
     
    1135711708                            ssl->peerEccDsaKeyPresent = 1;
    1135811709                    #ifdef HAVE_PK_CALLBACKS
     11710                            if (ssl->buffers.peerEccDsaKey.buffer)
     11711                                XFREE(ssl->buffers.peerEccDsaKey.buffer,
     11712                                      ssl->heap, DYNAMIC_TYPE_ECC);
    1135911713                            ssl->buffers.peerEccDsaKey.buffer =
    1136011714                                   (byte*)XMALLOC(args->dCert->pubKeySize,
     
    1138111735                            WOLFSSL_MSG("Peer ECC key is too small");
    1138211736                        }
     11737
     11738                        /* populate curve oid - if missing */
     11739                        if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
     11740                            ssl->ecdhCurveOID = args->dCert->pkCurveOID;
    1138311741                        break;
    1138411742                    }
     
    1143111789                            WOLFSSL_MSG("Peer ECC key is too small");
    1143211790                        }
     11791
     11792                        /* populate curve oid - if missing */
     11793                        if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
     11794                            ssl->ecdhCurveOID = ECC_X25519_OID;
    1143311795                        break;
    1143411796                    }
     
    1148011842                            WOLFSSL_MSG("Peer ECC key is too small");
    1148111843                        }
     11844
     11845                        /* populate curve oid - if missing */
     11846                        if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0)
     11847                            ssl->ecdhCurveOID = ECC_X448_OID;
    1148211848                        break;
    1148311849                    }
     
    1157311939#endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */
    1157411940
     11941#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) || \
     11942    defined(WOLFSSL_SMALL_STACK)
     11943    if (args)
     11944    {
     11945        FreeProcPeerCertArgs(ssl, args);
     11946    }
     11947#else
    1157511948    FreeProcPeerCertArgs(ssl, args);
     11949#endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP || WOLFSSL_SMALL_STACK */
    1157611950
    1157711951#if defined(WOLFSSL_ASYNC_CRYPT)
     
    1166712041
    1166812042            #ifdef WOLFSSL_SMALL_STACK
    11669                 CertStatus* status;
     12043                CertStatus*   status;
     12044                OcspEntry*    single;
    1167012045                OcspResponse* response;
    1167112046            #else
    11672                 CertStatus status[1];
     12047                CertStatus   status[1];
     12048                OcspEntry    single[1];
    1167312049                OcspResponse response[1];
    1167412050            #endif
     
    1168612062                status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap,
    1168712063                                                       DYNAMIC_TYPE_OCSP_STATUS);
     12064                single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), ssl->heap,
     12065                                                              DYNAMIC_TYPE_OCSP_ENTRY);
    1168812066                response = (OcspResponse*)XMALLOC(sizeof(OcspResponse), ssl->heap,
    11689                                                        DYNAMIC_TYPE_OCSP_REQUEST);
    11690 
    11691                 if (status == NULL || response == NULL) {
     12067                                                             DYNAMIC_TYPE_OCSP_REQUEST);
     12068
     12069                if (status == NULL || single == NULL || response == NULL) {
    1169212070                    if (status)
    1169312071                        XFREE(status, ssl->heap, DYNAMIC_TYPE_OCSP_STATUS);
     12072                    if (single)
     12073                        XFREE(single, ssl->heap, DYNAMIC_TYPE_OCSP_ENTRY);
    1169412074                    if (response)
    1169512075                        XFREE(response, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
     
    1171512095
    1171612096                if (status_length) {
    11717                     InitOcspResponse(response, status, input +*inOutIdx,
    11718                                                                  status_length);
     12097                    InitOcspResponse(response, single, status, input +*inOutIdx,
     12098                                     status_length, ssl->heap);
    1171912099
    1172012100                    if ((OcspResponseDecode(response, ssl->ctx->cm, ssl->heap,
    1172112101                                                                        0) != 0)
    1172212102                    ||  (response->responseStatus != OCSP_SUCCESSFUL)
    11723                     ||  (response->status->status != CERT_GOOD))
     12103                    ||  (response->single->status->status != CERT_GOOD))
    1172412104                        ret = BAD_CERTIFICATE_STATUS_ERROR;
    1172512105
     
    1173512115                            ret = BAD_CERTIFICATE_STATUS_ERROR;
    1173612116                    }
     12117                    FreeOcspResponse(response);
    1173712118
    1173812119                    *inOutIdx   += status_length;
     
    1174712128            #ifdef WOLFSSL_SMALL_STACK
    1174812129                XFREE(status,   NULL, DYNAMIC_TYPE_OCSP_STATUS);
     12130                XFREE(single,   NULL, DYNAMIC_TYPE_OCSP_ENTRY);
    1174912131                XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
    1175012132            #endif
     
    1180512187
    1180612188    if (IsEncryptionOn(ssl, 0)) {
     12189        /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
     12190         * about padding */
    1180712191    #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
    1180812192        if (ssl->options.startedETMRead) {
    1180912193            word32 digestSz = MacSize(ssl);
    11810             if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
     12194            if (size != totalSz &&
     12195                    *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
    1181112196                return BUFFER_E;
    1181212197            *inOutIdx += ssl->keys.padSz + digestSz;
     
    1181612201        {
    1181712202            /* access beyond input + size should be checked against totalSz */
    11818             if (*inOutIdx + ssl->keys.padSz > totalSz)
     12203            if (size != totalSz &&
     12204                    *inOutIdx + ssl->keys.padSz > totalSz)
    1181912205                return BUFFER_E;
    1182012206
     
    1185212238        return BUFFER_ERROR;
    1185312239
    11854     /* check against totalSz */
     12240    /* check against totalSz
     12241     * If size == totalSz then we are in DtlsMsgDrain so no need to worry about
     12242     * padding */
     12243    if (size != totalSz) {
    1185512244    #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
    1185612245        if (ssl->options.startedETMRead) {
     
    1186412253                return BUFFER_E;
    1186512254        }
     12255    }
    1186612256
    1186712257    #ifdef WOLFSSL_CALLBACKS
     
    1189212282    }
    1189312283#endif
     12284#ifdef OPENSSL_ALL
     12285    if (ssl->options.side == WOLFSSL_CLIENT_END)
     12286        XMEMCPY(ssl->serverFinished,
     12287                input + *inOutIdx, TLS_FINISHED_SZ);
     12288    else
     12289        XMEMCPY(ssl->clientFinished,
     12290                input + *inOutIdx, TLS_FINISHED_SZ);
     12291#endif
    1189412292
    1189512293    /* force input exhaustion at ProcessReply consuming padSz */
     
    1193412332#ifdef WOLFSSL_DTLS
    1193512333    if (ssl->options.dtls) {
    11936         DtlsMsgPoolReset(ssl);
     12334        if ((!ssl->options.resuming && ssl->options.side == WOLFSSL_CLIENT_END) ||
     12335             (ssl->options.resuming && ssl->options.side == WOLFSSL_SERVER_END)){
     12336            DtlsMsgPoolReset(ssl);
     12337            ssl->keys.dtls_handshake_number = 0;
     12338            ssl->keys.dtls_expected_peer_handshake_number = 0;
     12339        }
    1193712340    }
    1193812341#endif
     
    1208512488                }
    1208612489#endif
     12490#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
     12491                                     defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
     12492                /* Check that a status request extension was seen as the
     12493                 * CertificateStatus wasn't when an OCSP staple is required.
     12494                 */
     12495                if (
     12496    #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
     12497                     !ssl->status_request &&
     12498    #endif
     12499    #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
     12500                     !ssl->status_request_v2 &&
     12501    #endif
     12502                                                 ssl->ctx->cm->ocspMustStaple) {
     12503                    return OCSP_CERT_UNKNOWN;
     12504                }
     12505                #endif
    1208712506            }
    1208812507
     
    1218012599                return DUPLICATE_MSG_E;
    1218112600            }
     12601#ifdef WOLFSSL_DTLS
     12602            if (ssl->options.dtls) {
     12603                if (ssl->keys.curEpoch == 0) {
     12604                    WOLFSSL_MSG("Finished received with epoch 0");
     12605                    return SEQUENCE_ERROR;
     12606                }
     12607            }
     12608#endif
    1218212609            ssl->msgsReceived.got_finished = 1;
    1218312610
     
    1219412621            if (ssl->msgsReceived.got_change_cipher) {
    1219512622                WOLFSSL_MSG("Duplicate ChangeCipher received");
    12196     #ifdef WOLFSSL_EXTRA_ALERTS
    12197                 SendAlert(ssl, alert_fatal, unexpected_message);
    12198     #endif
    1219912623                return DUPLICATE_MSG_E;
    1220012624            }
     
    1224412668                        ssl->options.havePeerCert) {
    1224512669
    12246                         if (!ssl->options.havePeerVerify) {
     12670                        if (!ssl->options.havePeerVerify ||
     12671                                !ssl->msgsReceived.got_certificate_verify) {
    1224712672                            WOLFSSL_MSG("client didn't send cert verify");
    1224812673                            #ifdef WOLFSSL_DTLS
     
    1229712722#endif
    1229812723
    12299 #if !defined(WOLFSSL_NO_SERVER) && \
     12724#if !defined(NO_WOLFSSL_SERVER) && \
    1230012725    defined(HAVE_SECURE_RENEGOTIATION) && \
    1230112726    defined(HAVE_SERVER_RENEGOTIATION_INFO)
     
    1240412829        WOLFSSL_MSG("processing hello verify request");
    1240512830        ret = DoHelloVerifyRequest(ssl, input,inOutIdx, size);
     12831        if (IsEncryptionOn(ssl, 0)) {
     12832        #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
     12833            if (ssl->options.startedETMRead) {
     12834                word32 digestSz = MacSize(ssl);
     12835                if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
     12836                    return BUFFER_E;
     12837                *inOutIdx += ssl->keys.padSz + digestSz;
     12838            }
     12839            else
     12840        #endif
     12841            {
     12842                /* access beyond input + size should be checked against totalSz
     12843                 */
     12844                if (*inOutIdx + ssl->keys.padSz > totalSz)
     12845                    return BUFFER_E;
     12846
     12847                *inOutIdx += ssl->keys.padSz;
     12848            }
     12849        }
    1240612850        break;
    1240712851
     
    1251112955        }
    1251212956    #endif
     12957        /* If size == totalSz then we are in DtlsMsgDrain so no need to worry
     12958         * about padding */
    1251312959        if (IsEncryptionOn(ssl, 0)) {
    1251412960        #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
    1251512961            if (ssl->options.startedETMRead) {
    1251612962                word32 digestSz = MacSize(ssl);
    12517                 if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
     12963                if (size != totalSz &&
     12964                        *inOutIdx + ssl->keys.padSz + digestSz > totalSz)
    1251812965                    return BUFFER_E;
    1251912966                *inOutIdx += ssl->keys.padSz + digestSz;
     
    1252412971                /* access beyond input + size should be checked against totalSz
    1252512972                 */
    12526                 if (*inOutIdx + ssl->keys.padSz > totalSz)
     12973                if (size != totalSz &&
     12974                        *inOutIdx + ssl->keys.padSz > totalSz)
    1252712975                    return BUFFER_E;
    12528 
    1252912976                *inOutIdx += ssl->keys.padSz;
    1253012977            }
     
    1256513012    #endif
    1256613013    ) {
    12567         ShrinkInputBuffer(ssl, NO_FORCED_FREE);
     13014        if (IsEncryptionOn(ssl, 0)) {
     13015            word32 extra = ssl->keys.padSz;
     13016
     13017        #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
     13018            if (ssl->options.startedETMRead)
     13019                extra += MacSize(ssl);
     13020        #endif
     13021
     13022            if (extra > ssl->buffers.inputBuffer.idx)
     13023                return BUFFER_E;
     13024
     13025            ssl->buffers.inputBuffer.idx -= extra;
     13026            ShrinkInputBuffer(ssl, NO_FORCED_FREE);
     13027            ssl->buffers.inputBuffer.idx += extra;
     13028        }
     13029        else {
     13030            ShrinkInputBuffer(ssl, NO_FORCED_FREE);
     13031        }
    1256813032    }
    1256913033
     
    1277613240#endif
    1277713241    else if (curLT) {
    12778         word32 idx = diff / DTLS_WORD_BITS;
    12779         word32 newDiff = diff % DTLS_WORD_BITS;
     13242        word32 idx;
     13243        word32 newDiff;
     13244        if (diff == 0) {
     13245            WOLFSSL_MSG("DTLS sanity check failed");
     13246            return 0;
     13247        }
     13248        diff--;
     13249        idx = diff / DTLS_WORD_BITS;
     13250        newDiff = diff % DTLS_WORD_BITS;
    1278013251
    1278113252        /* verify idx is valid for window array */
     
    1279713268#ifdef WOLFSSL_MULTICAST
    1279813269static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
    12799                                          word32 second, word32 max)
     13270                                         word32 second, word32 high)
    1280013271{
    1280113272    word32 newCur = 0;
     
    1280513276    else if (cur < second)
    1280613277        newCur = second;
    12807     else if (cur < max)
    12808         newCur = max;
     13278    else if (cur < high)
     13279        newCur = high;
    1280913280
    1281013281    return newCur;
     
    1288013351    if (cur_hi == *next_hi) {
    1288113352        curLT = cur_lo < *next_lo;
    12882         diff = curLT ? *next_lo - cur_lo : cur_lo - *next_lo;
     13353        diff = curLT ? *next_lo - cur_lo - 1 : cur_lo - *next_lo + 1;
    1288313354    }
    1288413355    else {
    1288513356        curLT = cur_hi < *next_hi;
    12886         diff = curLT ? cur_lo - *next_lo : *next_lo - cur_lo;
     13357        diff = curLT ? cur_lo - *next_lo - 1 : *next_lo - cur_lo + 1;
    1288713358    }
    1288813359
     
    1290213373
    1290313374            temp = 0;
    12904             diff++;
    1290513375            idx = diff / DTLS_WORD_BITS;
    1290613376            newDiff = diff % DTLS_WORD_BITS;
     
    1294313413            ret == 0) {
    1294413414        word32 idx = 0;
    12945         ssl->keys.dtls_expected_peer_handshake_number++;
    12946         ret = DoHandShakeMsgType(ssl, item->msg,
    12947                                  &idx, item->type, item->sz, item->sz);
     13415        if ((ret = DoHandShakeMsgType(ssl, item->msg, &idx, item->type,
     13416                                      item->sz, item->sz)) == 0) {
     13417            if (item->type != finished)
     13418                ssl->keys.dtls_expected_peer_handshake_number++;
     13419            DtlsTxMsgListClean(ssl);
     13420        }
    1294813421    #ifdef WOLFSSL_ASYNC_CRYPT
    1294913422        if (ret == WC_PENDING_E) {
    12950             ssl->keys.dtls_expected_peer_handshake_number--;
    1295113423            break;
    1295213424        }
     
    1297013442    word32 fragOffset, fragSz;
    1297113443    int ret = 0;
     13444    int ignoreFinished = 0;
    1297213445
    1297313446    WOLFSSL_ENTER("DoDtlsHandShakeMsg()");
    12974 
    12975     /* process any pending DTLS messages - this flow can happen with async */
    12976     if (ssl->dtls_rx_msg_list != NULL) {
    12977         ret = DtlsMsgDrain(ssl);
    12978         if (ret != 0)
    12979             return ret;
    12980 
    12981         /* if done processing fragment exit with success */
    12982         if (totalSz == *inOutIdx)
    12983             return ret;
    12984     }
    1298513447
    1298613448    /* parse header */
     
    1300313465        WOLFSSL_ERROR(INCOMPLETE_DATA);
    1300413466        return INCOMPLETE_DATA;
     13467    }
     13468
     13469    if (type == finished && ssl->keys.dtls_peer_handshake_number >=
     13470                            ssl->keys.dtls_expected_peer_handshake_number &&
     13471                            ssl->keys.curEpoch == ssl->keys.dtls_epoch) {
     13472        /* finished msg should be ignore from the current epoch
     13473         * if it comes from a previous handshake */
     13474        if (ssl->options.side == WOLFSSL_CLIENT_END) {
     13475            ignoreFinished = ssl->options.connectState < FINISHED_DONE;
     13476        }
     13477        else {
     13478            ignoreFinished = ssl->options.acceptState < ACCEPT_FINISHED_DONE;
     13479        }
    1300513480    }
    1300613481
     
    1301513490     */
    1301613491    if (ssl->keys.dtls_peer_handshake_number >
    13017                                 ssl->keys.dtls_expected_peer_handshake_number) {
     13492            ssl->keys.dtls_expected_peer_handshake_number &&
     13493            /* Only client_hello shouldn't be ignored if the handshake
     13494             * num is greater */
     13495            (type == client_hello ||
     13496                    ssl->options.handShakeState != HANDSHAKE_DONE) &&
     13497            !ignoreFinished) {
    1301813498        /* Current message is out of order. It will get stored in the list.
    1301913499         * Storing also takes care of defragmentation. If the messages is a
     
    1302513505         * the client could be sending multiple new client hello messages
    1302613506         * with newer and newer cookies.) */
     13507        WOLFSSL_MSG("Current message is out of order");
    1302713508        if (type != client_hello) {
    1302813509            if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
    13029                 DtlsMsgStore(ssl, ssl->keys.dtls_peer_handshake_number,
     13510                DtlsMsgStore(ssl, ssl->keys.curEpoch,
     13511                             ssl->keys.dtls_peer_handshake_number,
    1303013512                             input + *inOutIdx, size, type,
    1303113513                             fragOffset, fragSz, ssl->heap);
    1303213514            }
    1303313515            *inOutIdx += fragSz;
     13516            #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
     13517            if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
     13518                word32 digestSz = MacSize(ssl);
     13519                if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
     13520                    return BUFFER_E;
     13521                *inOutIdx += digestSz;
     13522            }
     13523            else
     13524            #endif
     13525            {
     13526                if (*inOutIdx + ssl->keys.padSz > totalSz) {
     13527                    WOLFSSL_ERROR(BUFFER_E);
     13528                    return BUFFER_E;
     13529                }
     13530            }
     13531            *inOutIdx += ssl->keys.padSz;
    1303413532            ret = 0;
     13533            #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
     13534            /* If we receive an out of order last flight msg then retransmit */
     13535            if (type == server_hello_done || type == finished) {
     13536                ret = DtlsMsgPoolSend(ssl, 0);
     13537            }
     13538            #endif
    1303513539        }
    1303613540        else {
     
    1304313547    }
    1304413548    else if (ssl->keys.dtls_peer_handshake_number <
    13045                                 ssl->keys.dtls_expected_peer_handshake_number) {
     13549                ssl->keys.dtls_expected_peer_handshake_number ||
     13550            /* ignore all handshake messages if we are done with the
     13551             * handshake */
     13552            (ssl->keys.dtls_peer_handshake_number >
     13553                ssl->keys.dtls_expected_peer_handshake_number &&
     13554                ssl->options.handShakeState == HANDSHAKE_DONE) ||
     13555            ignoreFinished) {
    1304613556        /* Already saw this message and processed it. It can be ignored. */
     13557        WOLFSSL_MSG("Already saw this message and processed it");
    1304713558        *inOutIdx += fragSz;
    13048         if(type == finished ) {
    1304913559        #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
    13050             if (ssl->options.startedETMRead) {
    13051                 word32 digestSz = MacSize(ssl);
    13052                 if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
    13053                     return BUFFER_E;
    13054                 *inOutIdx += ssl->keys.padSz + digestSz;
    13055             }
    13056             else
     13560        if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
     13561            word32 digestSz = MacSize(ssl);
     13562            if (*inOutIdx + ssl->keys.padSz + digestSz > totalSz)
     13563                return BUFFER_E;
     13564            *inOutIdx += digestSz;
     13565        }
     13566        else
    1305713567        #endif
    13058             {
    13059                 if (*inOutIdx + ssl->keys.padSz > totalSz) {
    13060                     WOLFSSL_ERROR(BUFFER_E);
    13061                     return BUFFER_E;
    13062                 }
    13063                 *inOutIdx += ssl->keys.padSz;
    13064             }
    13065         }
     13568        {
     13569            if (*inOutIdx + ssl->keys.padSz > totalSz) {
     13570                WOLFSSL_ERROR(BUFFER_E);
     13571                return BUFFER_E;
     13572            }
     13573        }
     13574        #ifndef WOLFSSL_DTLS_RESEND_ONLY_TIMEOUT
    1306613575        if (IsDtlsNotSctpMode(ssl) &&
    1306713576            VerifyForDtlsMsgPoolSend(ssl, type, fragOffset)) {
     
    1306913578            ret = DtlsMsgPoolSend(ssl, 0);
    1307013579        }
     13580        #endif
     13581        *inOutIdx += ssl->keys.padSz;
    1307113582    }
    1307213583    else if (fragSz < size) {
     
    1307413585         * be pointing to the message with this fragment in it. Check it to see
    1307513586         * if it is completed. */
     13587        WOLFSSL_MSG("Branch is in order, but fragmented");
    1307613588        if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
    13077             DtlsMsgStore(ssl, ssl->keys.dtls_peer_handshake_number,
     13589            DtlsMsgStore(ssl, ssl->keys.curEpoch,
     13590                         ssl->keys.dtls_peer_handshake_number,
    1307813591                         input + *inOutIdx, size, type,
    1307913592                         fragOffset, fragSz, ssl->heap);
    1308013593        }
    1308113594        *inOutIdx += fragSz;
     13595        *inOutIdx += ssl->keys.padSz;
     13596#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
     13597        if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
     13598            word32 digestSz = MacSize(ssl);
     13599            if (*inOutIdx + digestSz > totalSz)
     13600                return BUFFER_E;
     13601            *inOutIdx += digestSz;
     13602        }
     13603#endif
    1308213604        ret = 0;
    1308313605        if (ssl->dtls_rx_msg_list != NULL &&
     
    1308613608    }
    1308713609    else {
    13088         /* This branch is in order next, and a complete message. */
     13610        /* This branch is in order next, and a complete message. On success
     13611         * clean the tx list. */
     13612#ifdef WOLFSSL_ASYNC_CRYPT
     13613        word32 idx = *inOutIdx;
     13614#endif
     13615        WOLFSSL_MSG("Branch is in order and a complete message");
     13616#ifdef WOLFSSL_ASYNC_CRYPT
     13617        /* In async mode always store the message and process it with
     13618         * DtlsMsgDrain because in case of a WC_PENDING_E it will be
     13619         * easier this way. */
     13620        if (ssl->dtls_rx_msg_list_sz < DTLS_POOL_SZ) {
     13621            DtlsMsgStore(ssl, ssl->keys.curEpoch,
     13622                         ssl->keys.dtls_peer_handshake_number,
     13623                         input + idx, size, type,
     13624                         fragOffset, fragSz, ssl->heap);
     13625        }
     13626        if (idx + fragSz + ssl->keys.padSz > totalSz)
     13627            return BUFFER_E;
     13628        *inOutIdx = idx + fragSz + ssl->keys.padSz;
     13629#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
     13630        if (ssl->options.startedETMRead && ssl->keys.curEpoch != 0) {
     13631            word32 digestSz = MacSize(ssl);
     13632            if (*inOutIdx + digestSz > totalSz)
     13633                return BUFFER_E;
     13634            *inOutIdx += digestSz;
     13635        }
     13636#endif
     13637        ret = DtlsMsgDrain(ssl);
     13638#else
    1308913639        ret = DoHandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz);
    1309013640        if (ret == 0) {
    13091             if (type != client_hello || !IsDtlsNotSctpMode(ssl))
     13641            DtlsTxMsgListClean(ssl);
     13642            if (type != finished)
    1309213643                ssl->keys.dtls_expected_peer_handshake_number++;
    1309313644            if (ssl->dtls_rx_msg_list != NULL) {
     
    1309513646            }
    1309613647        }
     13648#endif
    1309713649    }
    1309813650
     
    1310613658#ifdef HAVE_AEAD
    1310713659
    13108 #if !defined(NO_PUBLIC_GCM_SET_IV) && \
    13109     (((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
    13110     (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2))) || \
    13111     (defined(HAVE_POLY1305) && defined(HAVE_CHACHA)))
     13660#if (!defined(NO_PUBLIC_GCM_SET_IV) && \
     13661    ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \
     13662    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)))) || \
     13663    (defined(HAVE_POLY1305) && defined(HAVE_CHACHA))
    1311213664static WC_INLINE void AeadIncrementExpIV(WOLFSSL* ssl)
    1311313665{
     
    1388214434            c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size,
    1388314435                                    ssl->decrypt.additional + AEAD_LEN_OFFSET);
    13884             XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
    13885                                                             AESGCM_IMP_IV_SZ);
     14436
     14437        #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
     14438            if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl))
     14439                XMEMCPY(ssl->decrypt.nonce,
     14440                        ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV,
     14441                        AESGCM_IMP_IV_SZ);
     14442            else
     14443        #endif
     14444                XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV,
     14445                        AESGCM_IMP_IV_SZ);
    1388614446            XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input,
    1388714447                                                            AESGCM_EXP_IV_SZ);
     
    1400714567        case CIPHER_STATE_DO:
    1400814568        {
     14569        #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
     14570            if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
     14571                /* For epochs >1 the current cipher parameters are located in
     14572                 * ssl->secure_renegotiation->tmp_keys. Previous cipher
     14573                 * parameters and for epoch 1 use ssl->keys */
     14574                if (ssl->keys.curEpoch ==
     14575                        ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
     14576                    if (ssl->decrypt.src != SCR) {
     14577                        ssl->secure_renegotiation->cache_status =
     14578                                SCR_CACHE_NEEDED;
     14579                        if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
     14580                            break;
     14581                    }
     14582                }
     14583                else {
     14584                    if (ssl->decrypt.src != KEYS) {
     14585                        ssl->secure_renegotiation->cache_status =
     14586                                SCR_CACHE_NULL;
     14587                        if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
     14588                            break;
     14589                    }
     14590                }
     14591            }
     14592        #endif
     14593
    1400914594            ret = DecryptDo(ssl, plain, input, sz);
    1401014595
     
    1424214827     * the size to make sure is valid. */
    1424314828    ret = ssl->hmac(ssl, verify, input, pLen - macSz - padLen - 1, padLen,
    14244                                                                     content, 1);
     14829                                                                    content, 1, PEER_ORDER);
    1424514830    good |= MaskMac(input, pLen, ssl->specs.hash_size, verify);
    1424614831
     
    1427514860#ifdef WOLFSSL_EARLY_DATA
    1427614861    if (ssl->options.tls1_3 && ssl->options.handShakeDone == 0) {
    14277         if (ssl->options.side == WOLFSSL_SERVER_END &&
    14278                           ssl->earlyData != no_early_data &&
    14279                           ssl->options.clientState < CLIENT_FINISHED_COMPLETE) {
     14862        int process = 0;
     14863
     14864        if (ssl->options.side == WOLFSSL_SERVER_END) {
    1428014865            ssl->earlyDataSz += ssl->curSize;
    14281             if (ssl->earlyDataSz <= ssl->options.maxEarlyDataSz) {
     14866            if ((ssl->earlyData != no_early_data) &&
     14867                          (ssl->options.clientState == CLIENT_HELLO_COMPLETE)) {
     14868                process = 1;
     14869            }
     14870            if (!process && (ssl->earlyDataSz <= ssl->options.maxEarlyDataSz)) {
    1428214871                WOLFSSL_MSG("Ignoring EarlyData!");
    1428314872                *inOutIdx = ssl->buffers.inputBuffer.length;
    1428414873                return 0;
    1428514874            }
    14286             WOLFSSL_MSG("Too much EarlyData!");
    14287         }
    14288     }
     14875            if (ssl->earlyDataSz > ssl->options.maxEarlyDataSz) {
     14876                WOLFSSL_MSG("Too much EarlyData!");
     14877                process = 0;
     14878            }
     14879        }
     14880        if (!process) {
     14881            WOLFSSL_MSG("Received App data before a handshake completed");
     14882            SendAlert(ssl, alert_fatal, unexpected_message);
     14883            return OUT_OF_ORDER_E;
     14884        }
     14885    }
     14886    else
    1428914887#endif
    1429014888    if (ssl->options.handShakeDone == 0) {
     
    1436014958
    1436114959    *inOutIdx = idx;
     14960#ifdef HAVE_SECURE_RENEGOTIATION
     14961    if (IsSCR(ssl)) {
     14962        /* Reset the processReply state since
     14963         * we finished processing this message. */
     14964        ssl->options.processReply = doProcessInit;
     14965        /* If we are in a secure renegotiation then APP DATA is treated
     14966         * differently */
     14967        return APP_DATA_READY;
     14968    }
     14969#endif
    1436214970    return 0;
    1436314971}
     
    1453315141    }
    1453415142
    14535     ret  = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1);
     15143    ret  = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER);
    1453615144    ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz);
    1453715145    if (ret != 0) {
     
    1458615194            }
    1458715195            PadCheck(dummy, (byte)pad, MAX_PAD_SIZE);  /* timing only */
    14588             ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1, pad,
    14589                                                                     content, 1);
     15196            ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1,
     15197                            pad, content, 1, PEER_ORDER);
    1459015198            if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1,
    1459115199                                digestSz) != 0)
     
    1459615204    }
    1459715205    else if (ssl->specs.cipher_type == stream) {
    14598         ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1);
     15206        ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1,
     15207                        PEER_ORDER);
    1459915208        if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0){
    1460015209            return VERIFY_MAC_ERROR;
     
    1463915248
    1464015249    if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE
     15250    #ifdef HAVE_SECURE_RENEGOTIATION
     15251        && ssl->error != APP_DATA_READY
     15252    #endif
    1464115253    #ifdef WOLFSSL_ASYNC_CRYPT
    1464215254        && ssl->error != WC_PENDING_E
     
    1464915261        return ssl->error;
    1465015262    }
     15263
     15264#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_ASYNC_CRYPT)
     15265    /* process any pending DTLS messages - this flow can happen with async */
     15266    if (ssl->dtls_rx_msg_list != NULL) {
     15267        ret = DtlsMsgDrain(ssl);
     15268        if (ret != 0) {
     15269            WOLFSSL_ERROR(ret);
     15270            return ret;
     15271        }
     15272    }
     15273#endif
    1465115274
    1465215275    for (;;) {
     
    1477015393#endif /* WOLFSSL_DTLS_DROP_STATS */
    1477115394
    14772                 if (IsDtlsNotSctpMode(ssl) && ssl->options.dtlsHsRetain) {
    14773                     ret = DtlsMsgPoolSend(ssl, 0);
    14774                     if (ret != 0)
    14775                         return ret;
    14776                 }
    14777 
    1477815395                continue;
    1477915396            }
     
    1481915436
    1482015437            if (IsEncryptionOn(ssl, 0)) {
     15438#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
    1482115439                int tooLong = 0;
     15440#endif
    1482215441
    1482315442#ifdef WOLFSSL_TLS13
     
    1483215451                    tooLong = ssl->curSize > MAX_TLS_CIPHER_SZ;
    1483315452#endif
     15453#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
    1483415454                if (tooLong) {
    1483515455                    WOLFSSL_MSG("Encrypted data too long");
    14836 #if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
    1483715456                    SendAlert(ssl, alert_fatal, record_overflow);
    14838 #endif
    1483915457                    return BUFFER_ERROR;
    1484015458                }
     15459#endif
    1484115460            }
    1484215461            ssl->keys.padSz = 0;
     
    1488815507        case decryptMessage:
    1488915508
    14890 #if !defined(WOLFSSL_TLS13) || defined(WOLFSSL_TLS13_DRAFT_18)
    14891             if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0)
    14892 #else
    1489315509            if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
    1489415510                                        (!IsAtLeastTLSv1_3(ssl->version) ||
    1489515511                                         ssl->curRL.type != change_cipher_spec))
    14896 #endif
    1489715512            {
    1489815513                bufferStatic* in = &ssl->buffers.inputBuffer;
     
    1493715552                                      in->buffer + in->idx,
    1493815553                                      ssl->curSize - digestSz);
    14939                          ssl->keys.padSz =
    14940                               in->buffer[in->idx + ssl->curSize - digestSz - 1];
    14941                          ssl->keys.padSz += 1;
    14942                          ssl->keys.decryptedCur = 1;
     15554                        if (ret == 0) {
     15555                            ssl->keys.padSz =
     15556                                    in->buffer[in->idx + ssl->curSize -
     15557                                               digestSz - 1];
     15558                            ssl->keys.padSz += 1;
     15559                            ssl->keys.decryptedCur = 1;
     15560                        }
    1494315561                    }
    1494415562                    else
     
    1495715575                    {
    1495815576                #ifdef WOLFSSL_TLS13
    14959                     #if defined(WOLFSSL_TLS13_DRAFT_18) || \
    14960                         defined(WOLFSSL_TLS13_DRAFT_22) || \
    14961                         defined(WOLFSSL_TLS13_DRAFT_23)
    14962                         ret = DecryptTls13(ssl,
    14963                                            in->buffer + in->idx,
    14964                                            in->buffer + in->idx,
    14965                                            ssl->curSize, NULL, 0);
    14966                     #else
    1496715577                        ret = DecryptTls13(ssl,
    1496815578                                        in->buffer + in->idx,
     
    1497015580                                        ssl->curSize,
    1497115581                                        (byte*)&ssl->curRL, RECORD_HEADER_SZ);
    14972                     #endif
    1497315582                #else
    1497415583                        ret = DECRYPT_ERROR;
     
    1504115650        case verifyMessage:
    1504215651
    15043 #if !defined(WOLFSSL_TLS13) || defined(WOLFSSL_TLS13_DRAFT_18)
    15044             if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0)
    15045 #else
    1504615652            if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
    1504715653                                        (!IsAtLeastTLSv1_3(ssl->version) ||
    1504815654                                         ssl->curRL.type != change_cipher_spec))
    15049 #endif
    1505015655            {
    1505115656                if (!atomicUser
     
    1509115696                    word16 i = (word16)(ssl->buffers.inputBuffer.length -
    1509215697                                        ssl->keys.padSz);
     15698
     15699                    /* sanity check on underflow */
     15700                    if (ssl->keys.padSz >= ssl->buffers.inputBuffer.length) {
     15701                        WOLFSSL_ERROR(DECRYPT_ERROR);
     15702                        return DECRYPT_ERROR;
     15703                    }
     15704
    1509315705                    /* Remove padding from end of plain text. */
    1509415706                    for (--i; i > ssl->buffers.inputBuffer.idx; i--) {
     
    1511115723       #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
    1511215724            if (IsEncryptionOn(ssl, 0) && ssl->options.startedETMRead) {
    15113                 if (ssl->buffers.inputBuffer.length - ssl->keys.padSz -
    15114                                               ssl->buffers.inputBuffer.idx -
    15115                                               MacSize(ssl) > MAX_PLAINTEXT_SZ) {
     15725                if ((ssl->buffers.inputBuffer.length -
     15726                        ssl->keys.padSz -
     15727                        MacSize(ssl) -
     15728                        ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ)
     15729#ifdef WOLFSSL_ASYNC_CRYPT
     15730                        && ssl->buffers.inputBuffer.length !=
     15731                                ssl->buffers.inputBuffer.idx
     15732#endif
     15733                                ) {
    1511615734                    WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC");
    1511715735            #if defined(WOLFSSL_EXTRA_ALERTS)
     
    1512315741            else
    1512415742       #endif
    15125             if (ssl->buffers.inputBuffer.length - ssl->keys.padSz -
    15126                               ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ) {
     15743            if (ssl->buffers.inputBuffer.length -
     15744                    ssl->keys.padSz -
     15745                    ssl->buffers.inputBuffer.idx > MAX_PLAINTEXT_SZ
     15746#ifdef WOLFSSL_ASYNC_CRYPT
     15747                        && ssl->buffers.inputBuffer.length !=
     15748                                ssl->buffers.inputBuffer.idx
     15749#endif
     15750                                ) {
    1512715751                WOLFSSL_MSG("Plaintext too long");
    1512815752#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_EXTRA_ALERTS)
     
    1513215756            }
    1513315757
    15134         #ifdef WOLFSSL_DTLS
     15758#ifdef WOLFSSL_DTLS
    1513515759            if (IsDtlsNotSctpMode(ssl)) {
    1513615760                DtlsUpdateWindow(ssl);
    1513715761            }
    15138         #endif /* WOLFSSL_DTLS */
     15762#endif /* WOLFSSL_DTLS */
    1513915763
    1514015764            WOLFSSL_MSG("received record layer msg");
     
    1514215766            switch (ssl->curRL.type) {
    1514315767                case handshake :
     15768                    WOLFSSL_MSG("got HANDSHAKE");
    1514415769                    /* debugging in DoHandShakeMsg */
    1514515770                    if (ssl->options.dtls) {
     
    1515115776#endif
    1515215777                    }
    15153                     else if (!IsAtLeastTLSv1_3(ssl->version)) {
     15778                    else if (!IsAtLeastTLSv1_3(ssl->version)
     15779#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
     15780                            || !TLSv1_3_Capable(ssl)
     15781#endif
     15782                            ) {
    1515415783#ifndef WOLFSSL_NO_TLS12
    1515515784                        ret = DoHandShakeMsg(ssl,
     
    1516315792                    else {
    1516415793#ifdef WOLFSSL_TLS13
     15794                        ssl->msgsReceived.got_change_cipher = 0;
    1516515795                        ret = DoTls13HandShakeMsg(ssl,
    1516615796                                            ssl->buffers.inputBuffer.buffer,
     
    1518215812#endif
    1518315813                    }
    15184                     if (ret != 0) {
     15814                    if (ret != 0
     15815#ifdef WOLFSSL_ASYNC_CRYPT
     15816                    /* In async case, on pending, move onto next message.
     15817                     * Current message should have been DtlsMsgStore'ed and
     15818                     * should be processed with DtlsMsgDrain */
     15819                            && (!ssl->options.dtls
     15820                                || ret != WC_PENDING_E)
     15821#endif
     15822                    ) {
    1518515823                        WOLFSSL_ERROR(ret);
    1518615824                        return ret;
     
    1519815836                                change_cipher_spec,
    1519915837                                ssl->buffers.inputBuffer.buffer +
    15200                                 ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ,
     15838                                ssl->buffers.inputBuffer.idx - RECORD_HEADER_SZ -
     15839                                (ssl->options.dtls ? DTLS_RECORD_EXTRA : 0),
    1520115840                                1 + RECORD_HEADER_SZ, READ_PROTO, ssl->heap);
    1520215841                            #ifdef WOLFSSL_CALLBACKS
     
    1520715846
    1520815847#ifdef WOLFSSL_TLS13
    15209     #ifdef WOLFSSL_TLS13_DRAFT_18
    15210                     if (IsAtLeastTLSv1_3(ssl->version)) {
    15211                         SendAlert(ssl, alert_fatal, illegal_parameter);
    15212                         return UNKNOWN_RECORD_TYPE;
    15213                     }
    15214     #else
    1521515848                    if (IsAtLeastTLSv1_3(ssl->version)) {
    1521615849                        word32 i = ssl->buffers.inputBuffer.idx;
     
    1522515858                        }
    1522615859                        ssl->buffers.inputBuffer.idx++;
     15860                        if (!ssl->msgsReceived.got_change_cipher) {
     15861                            ssl->msgsReceived.got_change_cipher = 1;
     15862                        }
     15863                        else {
     15864                            SendAlert(ssl, alert_fatal, illegal_parameter);
     15865                            return UNKNOWN_RECORD_TYPE;
     15866                        }
    1522715867                        break;
    1522815868                    }
    15229     #endif
    1523015869#endif
    1523115870
    1523215871#ifndef WOLFSSL_NO_TLS12
     15872                    if (ssl->buffers.inputBuffer.buffer[
     15873                            ssl->buffers.inputBuffer.idx] != 1) {
     15874                        WOLFSSL_MSG("ChangeCipher msg wrong value");
     15875                        return LENGTH_ERROR;
     15876                    }
     15877
     15878                    if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
     15879#ifdef HAVE_AEAD
     15880                        if (ssl->specs.cipher_type == aead) {
     15881                            if (ssl->specs.bulk_cipher_algorithm != wolfssl_chacha)
     15882                                ssl->curSize -= AESGCM_EXP_IV_SZ;
     15883                            ssl->buffers.inputBuffer.idx += ssl->specs.aead_mac_size;
     15884                            ssl->curSize -= ssl->specs.aead_mac_size;
     15885                        }
     15886                        else
     15887#endif
     15888                        {
     15889                            ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
     15890                            ssl->curSize -= (word16)ssl->keys.padSz;
     15891                            ssl->curSize -= ssl->specs.iv_size;
     15892                        }
     15893
     15894            #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
     15895                        if (ssl->options.startedETMRead) {
     15896                            word32 digestSz = MacSize(ssl);
     15897                            ssl->buffers.inputBuffer.idx += digestSz;
     15898                            ssl->curSize -= digestSz;
     15899                        }
     15900            #endif
     15901                    }
     15902
     15903                    if (ssl->curSize != 1) {
     15904                        WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
     15905                        return LENGTH_ERROR;
     15906                    }
     15907
     15908                    ssl->buffers.inputBuffer.idx++;
     15909
    1523315910                    ret = SanityCheckMsgReceived(ssl, change_cipher_hs);
    1523415911                    if (ret != 0) {
     
    1524315920                            if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E)
    1524415921                                return ret;
    15245 
    15246                             if (IsDtlsNotSctpMode(ssl)) {
    15247                                 ret = DtlsMsgPoolSend(ssl, 1);
    15248                                 if (ret != 0)
    15249                                     return ret;
    15250                             }
    15251 
    15252                             if (ssl->curSize != 1) {
    15253                                 WOLFSSL_MSG("Malicious or corrupted"
    15254                                             " duplicate ChangeCipher msg");
    15255                                 return LENGTH_ERROR;
    15256                             }
    15257                             ssl->buffers.inputBuffer.idx++;
     15922                            /* Reset error */
     15923                            ret = 0;
    1525815924                            break;
    1525915925                        #endif /* WOLFSSL_DTLS */
     
    1526115927                    }
    1526215928
    15263                     if (IsEncryptionOn(ssl, 0) && ssl->options.handShakeDone) {
    15264                         ssl->buffers.inputBuffer.idx += ssl->keys.padSz;
    15265                         ssl->curSize -= (word16) ssl->buffers.inputBuffer.idx;
    15266             #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
    15267                         if (ssl->options.startedETMRead) {
    15268                             word32 digestSz = MacSize(ssl);
    15269                             ssl->buffers.inputBuffer.idx += digestSz;
    15270                             ssl->curSize -= digestSz;
    15271                         }
    15272             #endif
    15273                     }
    15274 
    15275                     if (ssl->curSize != 1) {
    15276                         WOLFSSL_MSG("Malicious or corrupted ChangeCipher msg");
    15277                         return LENGTH_ERROR;
    15278                     }
    15279 
    15280                     ssl->buffers.inputBuffer.idx++;
    1528115929                    ssl->keys.encryptionOn = 1;
    1528215930
     
    1533215980                    #ifdef WOLFSSL_DTLS
    1533315981                        if (ssl->options.dtls && ssl->options.dtlsHsRetain) {
     15982                        #ifdef HAVE_SECURE_RENEGOTIATION
     15983                            /*
     15984                             * Only free HS resources when not in the process of a
     15985                             * secure renegotiation and we have received APP DATA
     15986                             * from the current epoch
     15987                             */
     15988                            if (!IsSCR(ssl) && (DtlsUseSCRKeys(ssl)
     15989                                    || !DtlsSCRKeysSet(ssl))) {
     15990                                FreeHandshakeResources(ssl);
     15991                                ssl->options.dtlsHsRetain = 0;
     15992                            }
     15993                        #else
    1533415994                            FreeHandshakeResources(ssl);
    1533515995                            ssl->options.dtlsHsRetain = 0;
     15996                        #endif
    1533615997                        }
    1533715998                    #endif
     
    1536716028                    if (type == decrypt_error)
    1536816029                        return FATAL_ERROR;
     16030
     16031                    /* Reset error if we got an alert level in ret */
     16032                    if (ret > 0)
     16033                        ret = 0;
    1536916034                    break;
    1537016035
     
    1537616041            ssl->options.processReply = doProcessInit;
    1537716042
    15378             /* input exhausted? */
    15379             if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length)
    15380                 return 0;
     16043            /* input exhausted */
     16044            if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length
     16045#ifdef WOLFSSL_DTLS
     16046                /* If app data was processed then return now to avoid
     16047                 * dropping any app data. */
     16048                || (ssl->options.dtls && ssl->curRL.type == application_data)
     16049#endif
     16050                )
     16051                return ret;
    1538116052
    1538216053            /* more messages per record */
     
    1541316084                    }
    1541416085                }
    15415 
    15416                 continue;
    1541716086            }
    1541816087            /* more records */
    1541916088            else {
    1542016089                WOLFSSL_MSG("More records in input");
    15421                 ssl->options.processReply = doProcessInit;
    15422                 continue;
    15423             }
    15424 
     16090            }
     16091#ifdef WOLFSSL_ASYNC_CRYPT
     16092            /* We are setup to read next message/record but we had an error
     16093             * (probably WC_PENDING_E) so return that so it can be handled
     16094             * by higher layers. */
     16095            if (ret != 0)
     16096                return ret;
     16097#endif
     16098            continue;
    1542516099        default:
    1542616100            WOLFSSL_MSG("Bad process input state, programming error");
     
    1543216106
    1543316107
     16108#if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) || \
     16109             (defined(WOLFSSL_TLS13) && defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT))
    1543416110int SendChangeCipher(WOLFSSL* ssl)
    1543516111{
     
    1547416150             ssl->buffers.outputBuffer.length;
    1547516151
    15476     AddRecordHeader(output, 1, change_cipher_spec, ssl);
     16152    AddRecordHeader(output, 1, change_cipher_spec, ssl, CUR_ORDER);
    1547716153
    1547816154    output[idx] = 1;             /* turn it on */
     
    1548316159
    1548416160        input[0] = 1;  /* turn it on */
     16161    #ifdef WOLFSSL_DTLS
     16162        if (IsDtlsNotSctpMode(ssl) &&
     16163                (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) {
     16164            return ret;
     16165        }
     16166    #endif
    1548516167        sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
    15486                               change_cipher_spec, 0, 0, 0);
     16168                              change_cipher_spec, 0, 0, 0, CUR_ORDER);
    1548716169        if (sendSz < 0) {
    1548816170            return sendSz;
    1548916171        }
    1549016172    }
    15491 
    1549216173    #ifdef WOLFSSL_DTLS
     16174    else {
    1549316175        if (IsDtlsNotSctpMode(ssl)) {
     16176            if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0)
     16177                return ret;
    1549416178            DtlsSEQIncrement(ssl, CUR_ORDER);
    15495             if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
    15496                 return ret;
    15497         }
     16179        }
     16180    }
    1549816181    #endif
    1549916182    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
     
    1550516188    ssl->buffers.outputBuffer.length += sendSz;
    1550616189
     16190#ifdef WOLFSSL_TLS13
     16191    if (!ssl->options.tls1_3)
     16192#endif
     16193    {
     16194        /* setup encrypt keys */
     16195        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
     16196            return ret;
     16197
     16198    #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
     16199        ssl->options.startedETMWrite = ssl->options.encThenMac;
     16200    #endif
     16201    }
     16202
    1550716203    if (ssl->options.groupMessages)
    1550816204        return 0;
     
    1551716213        return SendBuffered(ssl);
    1551816214}
     16215#endif
    1551916216
    1552016217
    1552116218#if !defined(NO_OLD_TLS) && !defined(WOLFSSL_AEAD_ONLY)
    1552216219static int SSL_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
    15523                     int padLen, int content, int verify)
     16220                    int padLen, int content, int verify, int epochOrder)
    1552416221{
    1552516222    byte   result[WC_MAX_DIGEST_SIZE];
     
    1553416231    byte seq[SEQ_SZ];
    1553516232    byte conLen[ENUM_LEN + LENGTH_SZ];     /* content & length */
    15536     const byte* macSecret = wolfSSL_GetMacSecret(ssl, verify);
     16233    const byte* macSecret = NULL;
    1553716234
    1553816235    (void)padLen;
     
    1554316240#endif
    1554416241
     16242#ifdef WOLFSSL_DTLS
     16243    if (ssl->options.dtls)
     16244        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
     16245    else
     16246        macSecret = wolfSSL_GetMacSecret(ssl, verify);
     16247#else
     16248    macSecret = wolfSSL_GetMacSecret(ssl, verify);
     16249#endif
     16250
    1554516251    XMEMSET(seq, 0, SEQ_SZ);
    1554616252    conLen[0] = (byte)content;
    1554716253    c16toa((word16)sz, &conLen[ENUM_LEN]);
    15548     WriteSEQ(ssl, verify, seq);
     16254    WriteSEQ(ssl, epochOrder, seq);
    1554916255
    1555016256    if (ssl->specs.mac_algorithm == md5_mac) {
     
    1563516341}
    1563616342#endif /* !NO_OLD_TLS && !WOLFSSL_AEAD_ONLY */
    15637 
    15638 
    15639 #ifndef NO_CERTS
    1564016343
    1564116344#if !defined(NO_MD5) && !defined(NO_OLD_TLS)
     
    1578116484}
    1578216485
    15783 #endif /* !NO_CERTS */
    15784 
    1578516486#ifndef WOLFSSL_NO_TLS12
    15786 /* Persistable BuildMessage arguments */
    15787 typedef struct BuildMsgArgs {
    15788     word32 digestSz;
    15789     word32 sz;
    15790     word32 pad;
    15791     word32 idx;
    15792     word32 headerSz;
    15793     word16 size;
    15794     word32 ivSz;      /* TLSv1.1  IV */
    15795     byte*  iv;
    15796 } BuildMsgArgs;
    15797 
    15798 static void FreeBuildMsgArgs(WOLFSSL* ssl, void* pArgs)
     16487void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args)
    1579916488{
    15800     BuildMsgArgs* args = (BuildMsgArgs*)pArgs;
    15801 
    15802     (void)ssl;
    15803     (void)args;
    15804 
    15805     if (args->iv) {
    15806         XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
    15807         args->iv = NULL;
     16489    if (args) {
     16490        if (ssl && args->iv)
     16491            XFREE(args->iv, ssl->heap, DYNAMIC_TYPE_SALT);
     16492        XMEMSET(args, 0, sizeof(BuildMsgArgs));
    1580816493    }
    1580916494}
     
    1581216497/* Build SSL Message, encrypted */
    1581316498int BuildMessage(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
    15814              int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay)
     16499             int inSz, int type, int hashOutput, int sizeOnly, int asyncOkay,
     16500             int epochOrder)
    1581516501{
    1581616502#ifndef WOLFSSL_NO_TLS12
     
    1581916505    BuildMsgArgs  lcl_args;
    1582016506#ifdef WOLFSSL_ASYNC_CRYPT
    15821     args = (BuildMsgArgs*)ssl->async.args;
    15822     typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
    15823     (void)sizeof(args_test);
     16507    args = &ssl->async.buildArgs;
    1582416508#endif
    1582516509#endif
     
    1583016514        return BAD_FUNC_ARG;
    1583116515    }
     16516
     16517    (void)epochOrder;
    1583216518
    1583316519#ifdef WOLFSSL_NO_TLS12
     
    1586716553        args->idx  = RECORD_HEADER_SZ;
    1586816554        args->headerSz = RECORD_HEADER_SZ;
    15869     #ifdef WOLFSSL_ASYNC_CRYPT
    15870         ssl->async.freeArgs = FreeBuildMsgArgs;
    15871     #endif
    1587216555    }
    1587316556
     
    1588316566                ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
    1588416567            }
     16568        #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
     16569            if (ssl->options.dtls && DtlsSCRKeysSet(ssl)) {
     16570                /* For epochs >1 the current cipher parameters are located in
     16571                 * ssl->secure_renegotiation->tmp_keys. Previous cipher
     16572                 * parameters and for epoch 1 use ssl->keys */
     16573                switch (epochOrder) {
     16574                case PREV_ORDER:
     16575                    if (ssl->encrypt.src != KEYS) {
     16576                        ssl->secure_renegotiation->cache_status =
     16577                                SCR_CACHE_NULL;
     16578                        if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
     16579                            ERROR_OUT(ret, exit_buildmsg);
     16580                    }
     16581                    break;
     16582                case CUR_ORDER:
     16583                    if (ssl->keys.dtls_epoch ==
     16584                            ssl->secure_renegotiation->tmp_keys.dtls_epoch) {
     16585                        if (ssl->encrypt.src != SCR) {
     16586                            ssl->secure_renegotiation->cache_status =
     16587                                    SCR_CACHE_NEEDED;
     16588                            if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
     16589                                    != 0)
     16590                                ERROR_OUT(ret, exit_buildmsg);
     16591                        }
     16592                    }
     16593                    else {
     16594                        if (ssl->encrypt.src != KEYS) {
     16595                            ssl->secure_renegotiation->cache_status =
     16596                                    SCR_CACHE_NULL;
     16597                            if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY))
     16598                                    != 0)
     16599                                ERROR_OUT(ret, exit_buildmsg);
     16600                        }
     16601                    }
     16602                    break;
     16603                default:
     16604                    WOLFSSL_MSG("BuildMessage only supports PREV_ORDER and "
     16605                                "CUR_ORDER");
     16606                    ERROR_OUT(BAD_FUNC_ARG, exit_buildmsg);
     16607                }
     16608            }
     16609        #endif
    1588516610
    1588616611            ssl->options.buildMsgState = BUILD_MSG_SIZE;
     
    1597016695
    1597116696            args->size = (word16)(args->sz - args->headerSz);    /* include mac and digest */
    15972             AddRecordHeader(output, args->size, (byte)type, ssl);
     16697            AddRecordHeader(output, args->size, (byte)type, ssl, epochOrder);
    1597316698
    1597416699            /* write to output */
     
    1606516790                    ret = ssl->hmac(ssl, hmac,
    1606616791                                     output + args->headerSz + args->ivSz, inSz,
    16067                                      -1, type, 0);
     16792                                     -1, type, 0, epochOrder);
    1606816793                    XMEMCPY(output + args->idx, hmac, args->digestSz);
    1606916794
     
    1607616801                {
    1607716802                    ret = ssl->hmac(ssl, output + args->idx, output +
    16078                                 args->headerSz + args->ivSz, inSz, -1, type, 0);
     16803                                args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder);
    1607916804                }
    1608016805            }
     
    1608816813        case BUILD_MSG_ENCRYPT:
    1608916814        {
     16815    #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
     16816            /* If we want the PREV_ORDER then modify CUR_ORDER sequence number
     16817             * for all encryption algos that use it for encryption parameters */
     16818            word16 dtls_epoch = 0;
     16819            word16 dtls_sequence_number_hi = 0;
     16820            word32 dtls_sequence_number_lo = 0;
     16821            int swap_seq = ssl->options.dtls && epochOrder == PREV_ORDER &&
     16822                    DtlsUseSCRKeys(ssl);
     16823            if (swap_seq) {
     16824                dtls_epoch = ssl->keys.dtls_epoch;
     16825                dtls_sequence_number_hi = ssl->keys.dtls_sequence_number_hi;
     16826                dtls_sequence_number_lo = ssl->keys.dtls_sequence_number_lo;
     16827                ssl->keys.dtls_epoch--;
     16828                ssl->keys.dtls_sequence_number_hi =
     16829                        ssl->keys.dtls_prev_sequence_number_hi;
     16830                ssl->keys.dtls_sequence_number_lo =
     16831                        ssl->keys.dtls_prev_sequence_number_lo;
     16832            }
     16833    #endif
    1609016834    #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
    1609116835            if (ssl->options.startedETMWrite) {
     
    1610016844                                output + args->headerSz, args->size, asyncOkay);
    1610116845            }
     16846    #if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
     16847            /* Restore sequence numbers */
     16848            if (swap_seq) {
     16849                ssl->keys.dtls_epoch = dtls_epoch;
     16850                ssl->keys.dtls_sequence_number_hi = dtls_sequence_number_hi;
     16851                ssl->keys.dtls_sequence_number_lo = dtls_sequence_number_lo;
     16852            }
     16853    #endif
    1610216854            if (ret != 0)
    1610316855                goto exit_buildmsg;
     
    1612916881                    ret = ssl->hmac(ssl, hmac, output + args->headerSz,
    1613016882                                    args->ivSz + inSz + args->pad + 1, -1, type,
    16131                                     0);
     16883                                    0, epochOrder);
    1613216884                    XMEMCPY(output + args->idx + args->pad + 1, hmac,
    1613316885                                                                args->digestSz);
     
    1614316895                                    output + args->headerSz,
    1614416896                                    args->ivSz + inSz + args->pad + 1, -1, type,
    16145                                     0);
     16897                                    0, epochOrder);
    1614616898                }
    1614716899            }
     
    1616516917    #ifdef WOLFSSL_DTLS
    1616616918        if (ret == 0 && ssl->options.dtls)
    16167             DtlsSEQIncrement(ssl, CUR_ORDER);
     16919            DtlsSEQIncrement(ssl, epochOrder);
    1616816920    #endif
    1616916921
     
    1617416926    /* Final cleanup */
    1617516927    FreeBuildMsgArgs(ssl, args);
    16176 #ifdef WOLFSSL_ASYNC_CRYPT
    16177     ssl->async.freeArgs = NULL;
    16178 #endif
    1617916928
    1618016929    return ret;
     
    1619916948    WOLFSSL_ENTER("SendFinished");
    1620016949
    16201     /* setup encrypt keys */
    16202     if ((ret = SetKeysSide(ssl, ENCRYPT_SIDE_ONLY)) != 0)
    16203         return ret;
    16204 
    16205     #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
    16206         ssl->options.startedETMWrite = ssl->options.encThenMac;
    16207     #endif
    16208 
    1620916950    /* check for available size */
    1621016951    outputSz = sizeof(input) + MAX_MSG_EXTRA;
     
    1624716988    }
    1624816989#endif
     16990#ifdef OPENSSL_ALL
     16991    if (ssl->options.side == WOLFSSL_CLIENT_END)
     16992        XMEMCPY(ssl->clientFinished,
     16993                hashes, TLS_FINISHED_SZ);
     16994    else
     16995        XMEMCPY(ssl->serverFinished,
     16996                hashes, TLS_FINISHED_SZ);
     16997#endif
    1624916998
    1625016999    #ifdef WOLFSSL_DTLS
    1625117000        if (IsDtlsNotSctpMode(ssl)) {
    16252             if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz)) != 0)
     17001            if ((ret = DtlsMsgPoolSave(ssl, input, headerSz + finishedSz, finished)) != 0)
    1625317002                return ret;
    1625417003        }
     
    1625617005
    1625717006    sendSz = BuildMessage(ssl, output, outputSz, input, headerSz + finishedSz,
    16258                                                           handshake, 1, 0, 0);
     17007                                                          handshake, 1, 0, 0, CUR_ORDER);
    1625917008    if (sendSz < 0)
    1626017009        return BUILD_MSG_ERROR;
     
    1629817047
    1629917048    ret = SendBuffered(ssl);
     17049
     17050#ifdef WOLFSSL_DTLS
     17051    if ((!ssl->options.resuming &&
     17052            ssl->options.side == WOLFSSL_SERVER_END) ||
     17053        (ssl->options.resuming &&
     17054            ssl->options.side == WOLFSSL_CLIENT_END)) {
     17055        ssl->keys.dtls_handshake_number = 0;
     17056        ssl->keys.dtls_expected_peer_handshake_number = 0;
     17057    }
     17058#endif
    1630017059
    1630117060    WOLFSSL_LEAVE("SendFinished", ret);
     
    1644317202#endif /* !NO_WOLFSSL_SERVER */
    1644417203
     17204#if (!defined(WOLFSSL_NO_TLS12) && !defined(NO_CERTS)) \
     17205    || (defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER))
     17206static int cipherExtraData(WOLFSSL* ssl)
     17207{
     17208    /* Cipher data that may be added by BuildMessage */
     17209    return ssl->specs.hash_size + ssl->specs.block_size +
     17210            ssl->specs.aead_mac_size + ssl->specs.iv_size +
     17211            ssl->specs.pad_size;
     17212}
     17213#endif
     17214
    1644517215#ifndef WOLFSSL_NO_TLS12
    1644617216
     
    1655417324        }
    1655517325
     17326        if (IsEncryptionOn(ssl, 1))
     17327            sendSz += cipherExtraData(ssl);
     17328
    1655617329        /* check for available size */
    1655717330        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
     
    1656617339                AddFragHeaders(output, fragSz, 0, payloadSz, certificate, ssl);
    1656717340                if (!IsEncryptionOn(ssl, 1))
    16568                     HashOutputRaw(ssl, output + RECORD_HEADER_SZ,
     17341                    HashRaw(ssl, output + RECORD_HEADER_SZ,
    1656917342                                  HANDSHAKE_HEADER_SZ);
    1657017343            }
     
    1657217345            #ifdef WOLFSSL_DTLS
    1657317346                AddHeaders(output, payloadSz, certificate, ssl);
    16574                 if (!IsEncryptionOn(ssl, 1))
    16575                     HashOutputRaw(ssl,
    16576                                   output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
    16577                                   HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
     17347                HashRaw(ssl,
     17348                        output + RECORD_HEADER_SZ + DTLS_RECORD_EXTRA,
     17349                        HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA);
    1657817350                /* Adding the headers increments these, decrement them for
    1657917351                 * actual message header. */
     
    1658617358            /* list total */
    1658717359            c32to24(listSz, output + i);
    16588             if (!IsEncryptionOn(ssl, 1))
    16589                 HashOutputRaw(ssl, output + i, CERT_HEADER_SZ);
     17360            if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
     17361                HashRaw(ssl, output + i, CERT_HEADER_SZ);
    1659017362            i += CERT_HEADER_SZ;
    1659117363            length -= CERT_HEADER_SZ;
     
    1659317365            if (certSz) {
    1659417366                c32to24(certSz, output + i);
    16595                 if (!IsEncryptionOn(ssl, 1))
    16596                     HashOutputRaw(ssl, output + i, CERT_HEADER_SZ);
     17367                if (ssl->options.dtls || !IsEncryptionOn(ssl, 1))
     17368                    HashRaw(ssl, output + i, CERT_HEADER_SZ);
    1659717369                i += CERT_HEADER_SZ;
    1659817370                length -= CERT_HEADER_SZ;
    1659917371                fragSz -= CERT_HEADER_SZ;
    1660017372
    16601                 if (!IsEncryptionOn(ssl, 1)) {
    16602                     HashOutputRaw(ssl, ssl->buffers.certificate->buffer, certSz);
     17373                if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) {
     17374                    HashRaw(ssl, ssl->buffers.certificate->buffer, certSz);
    1660317375                    if (certChainSz)
    16604                         HashOutputRaw(ssl, ssl->buffers.certChain->buffer,
     17376                        HashRaw(ssl, ssl->buffers.certChain->buffer,
    1660517377                                      certChainSz);
    1660617378                }
     
    1660917381        else {
    1661017382            if (!ssl->options.dtls) {
    16611                 AddRecordHeader(output, fragSz, handshake, ssl);
     17383                AddRecordHeader(output, fragSz, handshake, ssl, CUR_ORDER);
    1661217384            }
    1661317385            else {
     
    1664217414        if (IsEncryptionOn(ssl, 1)) {
    1664317415            byte* input = NULL;
    16644             int   inputSz = i - RECORD_HEADER_SZ; /* build msg adds rec hdr */
     17416            int   inputSz = i; /* build msg adds rec hdr */
     17417            int   recordHeaderSz = RECORD_HEADER_SZ;
     17418
     17419            if (ssl->options.dtls)
     17420                recordHeaderSz += DTLS_RECORD_EXTRA;
     17421            inputSz -= recordHeaderSz;
    1664517422
    1664617423            if (inputSz < 0) {
     
    1665417431                if (input == NULL)
    1665517432                    return MEMORY_E;
    16656                 XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
    16657             }
    16658 
     17433                XMEMCPY(input, output + recordHeaderSz, inputSz);
     17434            }
     17435
     17436#ifndef WOLFSSL_DTLS
    1665917437            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
    16660                                                           handshake, 1, 0, 0);
    16661 
    16662             if (inputSz > 0)
    16663                 XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     17438                                                          handshake, 1, 0, 0, CUR_ORDER);
     17439#else
     17440            if (!ssl->options.dtls)
     17441                sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
     17442                                                              handshake, 1, 0, 0, CUR_ORDER);
     17443            else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to
     17444                  * calculate the hash ourselves above */ {
     17445                if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) {
     17446                    XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     17447                    return ret;
     17448                }
     17449                sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
     17450                                                              handshake, 0, 0, 0, CUR_ORDER);
     17451            }
     17452#endif
     17453
     17454            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    1666417455
    1666517456            if (sendSz < 0)
     
    1666717458        }
    1666817459        else {
     17460            sendSz = i;
    1666917461        #ifdef WOLFSSL_DTLS
     17462            if (IsDtlsNotSctpMode(ssl)) {
     17463                if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0)
     17464                    return ret;
     17465            }
    1667017466            if (ssl->options.dtls)
    1667117467                DtlsSEQIncrement(ssl, CUR_ORDER);
    1667217468        #endif
    1667317469        }
    16674 
    16675     #ifdef WOLFSSL_DTLS
    16676         if (IsDtlsNotSctpMode(ssl)) {
    16677             if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
    16678                 return ret;
    16679         }
    16680     #endif
    1668117470
    1668217471    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
     
    1672017509    word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
    1672117510    word32 dnLen = 0;
    16722 #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
     17511#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
    1672317512    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
    1672417513#endif
     
    1673317522        reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz;
    1673417523
    16735 #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
     17524#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
    1673617525    /* Certificate Authorities */
    1673717526    names = ssl->ctx->ca_names;
     
    1676217551    #endif
    1676317552    }
     17553
     17554    if (IsEncryptionOn(ssl, 1))
     17555        sendSz += cipherExtraData(ssl);
     17556
    1676417557    /* check for available size */
    1676517558    if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
     
    1679817591    c16toa((word16)dnLen, &output[i]);  /* auth's */
    1679917592    i += REQ_HEADER_SZ;
    16800 #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
     17593#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)
    1680117594    names = ssl->ctx->ca_names;
    1680217595    while (names != NULL) {
     
    1681517608
    1681617609        if (IsEncryptionOn(ssl, 1)) {
    16817             byte* input;
    16818             int   inputSz = i - RECORD_HEADER_SZ; /* build msg adds rec hdr */
     17610            byte* input = NULL;
     17611            int   inputSz = i; /* build msg adds rec hdr */
     17612            int   recordHeaderSz = RECORD_HEADER_SZ;
     17613
     17614            if (ssl->options.dtls)
     17615                recordHeaderSz += DTLS_RECORD_EXTRA;
     17616            inputSz -= recordHeaderSz;
     17617
     17618            if (inputSz <= 0) {
     17619                WOLFSSL_MSG("Send Cert Req bad inputSz");
     17620                return BUFFER_E;
     17621            }
    1681917622
    1682017623            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     
    1682217625                return MEMORY_E;
    1682317626
    16824             XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
     17627            XMEMCPY(input, output + recordHeaderSz, inputSz);
     17628            #ifdef WOLFSSL_DTLS
     17629            if (IsDtlsNotSctpMode(ssl) &&
     17630                    (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) {
     17631                XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     17632                return ret;
     17633            }
     17634            #endif
    1682517635            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
    16826                                   handshake, 1, 0, 0);
     17636                                  handshake, 1, 0, 0, CUR_ORDER);
    1682717637            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    1682817638
     
    1683017640                return sendSz;
    1683117641        } else {
     17642            sendSz = i;
    1683217643            #ifdef WOLFSSL_DTLS
     17644                if (IsDtlsNotSctpMode(ssl)) {
     17645                    if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0)
     17646                        return ret;
     17647                }
    1683317648                if (ssl->options.dtls)
    1683417649                    DtlsSEQIncrement(ssl, CUR_ORDER);
    16835                 if (IsDtlsNotSctpMode(ssl)) {
    16836                     if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
    16837                         return ret;
    16838                 }
    1683917650            #endif
    1684017651            ret = HashOutput(ssl, output, sendSz, 0);
     
    1691917730        if (IsEncryptionOn(ssl, 1)) {
    1692017731            byte* input;
    16921             int   inputSz = idx - RECORD_HEADER_SZ;
    16922 
     17732            int   inputSz = idx; /* build msg adds rec hdr */
     17733            int   recordHeaderSz = RECORD_HEADER_SZ;
     17734
     17735            if (ssl->options.dtls)
     17736                recordHeaderSz += DTLS_RECORD_EXTRA;
     17737            inputSz -= recordHeaderSz;
    1692317738            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    1692417739            if (input == NULL)
    1692517740                return MEMORY_E;
    1692617741
    16927             XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
    16928             sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
    16929                                                            handshake, 1, 0, 0);
     17742            XMEMCPY(input, output + recordHeaderSz, inputSz);
     17743            #ifdef WOLFSSL_DTLS
     17744                ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status);
     17745            #endif
     17746            if (ret == 0)
     17747                sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
     17748                                      handshake, 1, 0, 0, CUR_ORDER);
    1693017749            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    1693117750
     
    1693517754        else {
    1693617755            #ifdef WOLFSSL_DTLS
    16937                 if (ssl->options.dtls)
     17756                if (ret == 0 && IsDtlsNotSctpMode(ssl))
     17757                    ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status);
     17758                if (ret == 0 && ssl->options.dtls)
    1693817759                    DtlsSEQIncrement(ssl, CUR_ORDER);
    1693917760            #endif
    1694017761            ret = HashOutput(ssl, output, sendSz, 0);
    1694117762        }
    16942 
    16943     #ifdef WOLFSSL_DTLS
    16944         if (ret == 0 && IsDtlsNotSctpMode(ssl))
    16945             ret = DtlsMsgPoolSave(ssl, output, sendSz);
    16946     #endif
    1694717763
    1694817764    #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
     
    1704717863                DecodedCert  cert[1];
    1704817864            #endif
     17865                DerBuffer* chain;
    1704917866
    1705017867            #ifdef WOLFSSL_SMALL_STACK
     
    1706317880                }
    1706417881
    17065                 while (idx + OPAQUE24_LEN < ssl->buffers.certChain->length) {
    17066                     c24to32(ssl->buffers.certChain->buffer + idx, &der.length);
     17882                /* use certChain if available, otherwise use peer certificate */
     17883                chain = ssl->buffers.certChain;
     17884                if (chain == NULL) {
     17885                    chain = ssl->buffers.certificate;
     17886                }
     17887
     17888                while (chain && idx + OPAQUE24_LEN < chain->length) {
     17889                    c24to32(chain->buffer + idx, &der.length);
    1706717890                    idx += OPAQUE24_LEN;
    1706817891
    17069                     der.buffer = ssl->buffers.certChain->buffer + idx;
     17892                    der.buffer = chain->buffer + idx;
    1707017893                    idx += der.length;
    1707117894
    17072                     if (idx > ssl->buffers.certChain->length)
     17895                    if (idx > chain->length)
    1707317896                        break;
    1707417897
     
    1714817971
    1714917972
     17973
     17974#if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
     17975/**
     17976 * Check if the SCR keys are set in ssl->secure_renegotiation->tmp_keys.
     17977 */
     17978int DtlsSCRKeysSet(WOLFSSL* ssl)
     17979{
     17980    return ssl->secure_renegotiation &&
     17981           ssl->secure_renegotiation->tmp_keys.dtls_epoch != 0;
     17982}
     17983
     17984/**
     17985 * ssl->keys contains the current cipher parameters only for epoch 1. For
     17986 * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
     17987 * cipher parameters. This function checks if the message currently being
     17988 * processed should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
     17989 */
     17990int IsDtlsMsgSCRKeys(WOLFSSL* ssl)
     17991{
     17992    return DtlsSCRKeysSet(ssl) &&
     17993           ssl->keys.curEpoch ==
     17994                   ssl->secure_renegotiation->tmp_keys.dtls_epoch;
     17995}
     17996
     17997/**
     17998 * ssl->keys contains the current cipher parameters only for epoch 1. For
     17999 * epochs >1 ssl->secure_renegotiation->tmp_keys contains the current
     18000 * cipher parameters. This function checks if the message currently being
     18001 * built should use ssl->keys or ssl->secure_renegotiation->tmp_keys.
     18002 */
     18003int DtlsUseSCRKeys(WOLFSSL* ssl)
     18004{
     18005    return DtlsSCRKeysSet(ssl) &&
     18006           ssl->secure_renegotiation->tmp_keys.dtls_epoch ==
     18007                   ssl->keys.dtls_epoch;
     18008}
     18009
     18010/**
     18011 * If ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch
     18012 * then PREV_ORDER refers to the current epoch.
     18013 * */
     18014int DtlsCheckOrder(WOLFSSL* ssl, int order)
     18015{
     18016    if (order == PREV_ORDER && ssl->secure_renegotiation &&
     18017            ssl->secure_renegotiation->tmp_keys.dtls_epoch > ssl->keys.dtls_epoch) {
     18018        return CUR_ORDER;
     18019    }
     18020    else {
     18021        return order;
     18022    }
     18023}
     18024#endif /* HAVE_SECURE_RENEGOTIATION && WOLFSSL_DTLS */
     18025
    1715018026/* If secure renegotiation is disabled, this will always return false.
    1715118027 * Otherwise it checks to see if we are currently renegotiating. */
    17152 static WC_INLINE int IsSCR(WOLFSSL* ssl)
     18028int IsSCR(WOLFSSL* ssl)
    1715318029{
    1715418030#ifndef HAVE_SECURE_RENEGOTIATION
     
    1715618032#else /* HAVE_SECURE_RENEGOTIATION */
    1715718033    if (ssl->secure_renegotiation &&
    17158             ssl->secure_renegotiation->enabled &&
    17159             ssl->options.handShakeState != HANDSHAKE_DONE)
     18034            ssl->secure_renegotiation->enabled &&  /* Is SCR enabled? */
     18035            ssl->options.handShakeDone && /* At least one handshake done? */
     18036            ssl->options.handShakeState != HANDSHAKE_DONE) /* Currently handshaking? */
    1716018037        return 1;
    1716118038#endif /* HAVE_SECURE_RENEGOTIATION */
     
    1719718074        if (ssl->options.handShakeState == HANDSHAKE_DONE) {
    1719818075            WOLFSSL_MSG("handshake complete, trying to send early data");
    17199             return BUILD_MSG_ERROR;
     18076            ssl->error = BUILD_MSG_ERROR;
     18077            return WOLFSSL_FATAL_ERROR;
    1720018078        }
    1720118079    #ifdef WOLFSSL_EARLY_DATA_GROUP
     
    1726418142        len = wolfSSL_GetMaxRecordSize(ssl, sz - sent);
    1726518143
    17266 #ifdef WOLFSSL_DTLS
    17267         if (IsDtlsNotSctpMode(ssl)) {
    17268             len = min(len, MAX_UDP_SIZE);
     18144#if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_DTLS_SIZE_CHECK)
     18145        if (ssl->options.dtls && (len < sz - sent)) {
     18146            ssl->error = DTLS_SIZE_ERROR;
     18147            WOLFSSL_ERROR(ssl->error);
     18148            return ssl->error;
    1726918149        }
    1727018150#endif
     
    1729518175        if (!ssl->options.tls1_3) {
    1729618176            sendSz = BuildMessage(ssl, out, outputSz, sendBuffer, buffSz,
    17297                                   application_data, 0, 0, 1);
     18177                                  application_data, 0, 0, 1, CUR_ORDER);
    1729818178        }
    1729918179        else {
     
    1735318233
    1735418234    /* reset error state */
    17355     if (ssl->error == WANT_READ
    17356     #ifdef WOLFSSL_ASYNC_CRYPT
    17357         || ssl->error == WC_PENDING_E
    17358     #endif
    17359     ) {
     18235    if (ssl->error == WANT_READ) {
    1736018236        ssl->error = 0;
    1736118237    }
     
    1737018246#endif /* WOLFSSL_DTLS */
    1737118247
    17372     if (ssl->error != 0 && ssl->error != WANT_WRITE) {
     18248    if (ssl->error != 0 && ssl->error != WANT_WRITE
     18249#ifdef WOLFSSL_ASYNC_CRYPT
     18250            && ssl->error != WC_PENDING_E
     18251#endif
     18252#ifdef HAVE_SECURE_RENEGOTIATION
     18253            && ssl->error != APP_DATA_READY
     18254#endif
     18255    ) {
    1737318256        WOLFSSL_MSG("User calling wolfSSL_read in error state, not allowed");
    1737418257        return ssl->error;
     
    1738018263    else
    1738118264#endif
    17382     if (ssl->options.handShakeState != HANDSHAKE_DONE) {
    17383         int err;
    17384         WOLFSSL_MSG("Handshake not complete, trying to finish");
    17385         if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
    17386         #ifdef WOLFSSL_ASYNC_CRYPT
    17387             /* if async would block return WANT_WRITE */
    17388             if (ssl->error == WC_PENDING_E) {
    17389                 return WOLFSSL_CBIO_ERR_WANT_READ;
    17390             }
    17391         #endif
    17392             return  err;
     18265    {
     18266        int negotiate = 0;
     18267#ifdef HAVE_SECURE_RENEGOTIATION
     18268        if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) {
     18269            if (ssl->options.handShakeState != HANDSHAKE_DONE
     18270                && ssl->buffers.clearOutputBuffer.length == 0)
     18271                negotiate = 1;
     18272        }
     18273        else
     18274#endif
     18275        if (ssl->options.handShakeState != HANDSHAKE_DONE)
     18276            negotiate = 1;
     18277
     18278        if (negotiate) {
     18279            int err;
     18280            WOLFSSL_MSG("Handshake not complete, trying to finish");
     18281            if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
     18282            #ifdef WOLFSSL_ASYNC_CRYPT
     18283                /* if async would block return WANT_WRITE */
     18284                if (ssl->error == WC_PENDING_E) {
     18285                    return WOLFSSL_CBIO_ERR_WANT_READ;
     18286                }
     18287            #endif
     18288                return err;
     18289            }
    1739318290        }
    1739418291    }
     
    1739718294startScr:
    1739818295    if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
    17399         int err;
     18296        int ret;
    1740018297        WOLFSSL_MSG("Need to start scr, server requested");
    17401         if ( (err = wolfSSL_Rehandshake(ssl)) != WOLFSSL_SUCCESS)
    17402             return  err;
     18298        ret = wolfSSL_Rehandshake(ssl);
    1740318299        ssl->secure_renegotiation->startScr = 0;  /* only start once */
     18300        if (ret != WOLFSSL_SUCCESS)
     18301            return ret;
    1740418302    }
    1740518303#endif
     
    1741018308            if (ssl->error == ZERO_RETURN) {
    1741118309                WOLFSSL_MSG("Zero return, no more data coming");
    17412                 return 0;         /* no more data coming */
     18310                return 0; /* no more data coming */
    1741318311            }
    1741418312            if (ssl->error == SOCKET_ERROR_E) {
     
    1741718315                    ssl->error = SOCKET_PEER_CLOSED_E;
    1741818316                    WOLFSSL_ERROR(ssl->error);
    17419                     return 0;     /* peer reset or closed */
     18317                    return 0; /* peer reset or closed */
    1742018318                }
    1742118319            }
     
    1742718325                goto startScr;
    1742818326            }
     18327            if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
     18328                    ssl->options.handShakeState != HANDSHAKE_DONE
     18329                    && ssl->buffers.clearOutputBuffer.length == 0) {
     18330                /* ProcessReply processed a handshake packet and not any APP DATA
     18331                 * so let's move the handshake along */
     18332                int err;
     18333                WOLFSSL_MSG("Handshake not complete, trying to finish");
     18334                if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) {
     18335                #ifdef WOLFSSL_ASYNC_CRYPT
     18336                    /* if async would block return WANT_WRITE */
     18337                    if (ssl->error == WC_PENDING_E) {
     18338                        return WOLFSSL_CBIO_ERR_WANT_READ;
     18339                    }
     18340                #endif
     18341                    return err;
     18342                }
     18343            }
    1742918344        #endif
    17430     }
    17431 
    17432     if (sz < (int)ssl->buffers.clearOutputBuffer.length)
    17433         size = sz;
    17434     else
    17435         size = ssl->buffers.clearOutputBuffer.length;
     18345    #ifdef WOLFSSL_TLS13
     18346        if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.handShakeDone &&
     18347                                         ssl->curRL.type == handshake && peek) {
     18348            WOLFSSL_MSG("Got Handshake Messge in APP data");
     18349            if (ssl->buffers.inputBuffer.length == 0) {
     18350                ssl->error = WOLFSSL_ERROR_WANT_READ;
     18351                return 0;
     18352            }
     18353        }
     18354    #endif
     18355    }
     18356
     18357    size = min(sz, (int)ssl->buffers.clearOutputBuffer.length);
    1743618358
    1743718359    XMEMCPY(output, ssl->buffers.clearOutputBuffer.buffer, size);
     
    1752218444    }
    1752318445
    17524     /* only send encrypted alert if handshake actually complete, otherwise
    17525        other side may not be able to handle it */
    17526     if (IsEncryptionOn(ssl, 1) && (IsAtLeastTLSv1_3(ssl->version) ||
    17527                                                   ssl->options.handShakeDone)) {
     18446    /* send encrypted alert if encryption is on - can be a rehandshake over
     18447     * an existing encrypted channel.
     18448     * TLS 1.3 encrypts handshake packets after the ServerHello
     18449     */
     18450    if (IsEncryptionOn(ssl, 1)) {
    1752818451        sendSz = BuildMessage(ssl, output, outputSz, input, ALERT_SIZE, alert,
    17529                                                                        0, 0, 0);
     18452                                                                       0, 0, 0, CUR_ORDER);
    1753018453    }
    1753118454    else {
    1753218455
    17533         AddRecordHeader(output, ALERT_SIZE, alert, ssl);
     18456        AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER);
    1753418457        output += RECORD_HEADER_SZ;
    1753518458        #ifdef WOLFSSL_DTLS
     
    1800018923        return "TLS1.3 Secret Callback Error";
    1800118924
     18925    case DTLS_SIZE_ERROR:
     18926        return "DTLS trying to send too much in single datagram error";
     18927
     18928    case NO_CERT_ERROR:
     18929        return "TLS1.3 No Certificate Set Error";
     18930
    1800218931    default :
    1800318932        return "unknown error number";
     
    1801318942}
    1801418943
    18015 #ifndef NO_ERROR_STRINGS
    18016     #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    18017         #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u)}
     18944#ifdef NO_CIPHER_SUITE_ALIASES
     18945    #ifndef NO_ERROR_STRINGS
     18946        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
     18947            #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
     18948            #define SUITE_ALIAS(x,z,w,v,u)
     18949        #else
     18950            #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
     18951            #define SUITE_ALIAS(x,z,w,v,u)
     18952        #endif
    1801818953    #else
    18019         #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w)}
     18954        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
     18955            #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
     18956            #define SUITE_ALIAS(x,z,w,v,u)
     18957        #else
     18958            #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
     18959            #define SUITE_ALIAS(x,z,w,v,u)
     18960        #endif
    1802018961    #endif
    18021 #else
    18022     #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    18023         #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u)}
     18962#else /* !NO_CIPHER_SUITE_ALIASES */
     18963
     18964    /* note that the comma is included at the end of the SUITE_ALIAS() macro
     18965     * definitions, to allow aliases to be gated out by the above null macros
     18966     * in the NO_CIPHER_SUITE_ALIASES section.
     18967     */
     18968
     18969    #ifndef NO_ERROR_STRINGS
     18970        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
     18971            defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
     18972            #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
     18973            #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
     18974        #else
     18975            #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
     18976            #define SUITE_ALIAS(x,z,w,v,u) {(x),"",(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
     18977        #endif
    1802418978    #else
    18025         #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w)}
     18979        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
     18980            defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX)
     18981            #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
     18982            #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
     18983        #else
     18984            #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE}
     18985            #define SUITE_ALIAS(x,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS},
     18986        #endif
    1802618987    #endif
    18027 #endif
     18988#endif /* NO_CIPHER_SUITE_ALIASES */
    1802818989
    1802918990static const CipherSuiteInfo cipher_names[] =
     
    1804819009#ifdef BUILD_TLS_AES_128_CCM_8_SHA256
    1804919010    SUITE_INFO("TLS13-AES128-CCM-8-SHA256","TLS_AES_128_CCM_8_SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR),
     19011    SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR)
    1805019012#endif
    1805119013
     
    1815819120#ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
    1815919121    SUITE_INFO("PSK-AES128-CCM-8","TLS_PSK_WITH_AES_128_CCM_8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR),
     19122    SUITE_ALIAS("PSK-AES128-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_128_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
    1816019123#endif
    1816119124
    1816219125#ifdef BUILD_TLS_PSK_WITH_AES_256_CCM_8
    1816319126    SUITE_INFO("PSK-AES256-CCM-8","TLS_PSK_WITH_AES_256_CCM_8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR),
     19127    SUITE_ALIAS("PSK-AES256-CCM8",ECC_BYTE,TLS_PSK_WITH_AES_256_CCM_8,TLSv1_MINOR,SSLv3_MAJOR)
    1816419128#endif
    1816519129
     
    1821419178#ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
    1821519179    SUITE_INFO("AES128-CCM-8","TLS_RSA_WITH_AES_128_CCM_8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
     19180    SUITE_ALIAS("AES128-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
    1821619181#endif
    1821719182
    1821819183#ifdef BUILD_TLS_RSA_WITH_AES_256_CCM_8
    1821919184    SUITE_INFO("AES256-CCM-8","TLS_RSA_WITH_AES_256_CCM_8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
     19185    SUITE_ALIAS("AES256-CCM8",ECC_BYTE,TLS_RSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
    1822019186#endif
    1822119187
     
    1822619192#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
    1822719193    SUITE_INFO("ECDHE-ECDSA-AES128-CCM-8","TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
     19194    SUITE_ALIAS("ECDHE-ECDSA-AES128-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
    1822819195#endif
    1822919196
    1823019197#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8
    1823119198    SUITE_INFO("ECDHE-ECDSA-AES256-CCM-8","TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR),
     19199    SUITE_ALIAS("ECDHE-ECDSA-AES256-CCM8",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, TLSv1_2_MINOR, SSLv3_MAJOR)
    1823219200#endif
    1823319201
     
    1852519493    for (i = 0; i < GetCipherNamesSize(); i++) {
    1852619494        if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
    18527             (cipher_names[i].cipherSuite  == cipherSuite)) {
     19495            (cipher_names[i].cipherSuite  == cipherSuite)
     19496#ifndef NO_CIPHER_SUITE_ALIASES
     19497            && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
     19498#endif
     19499            ) {
    1852819500            nameInternal = cipher_names[i].name;
    1852919501            break;
     
    1854219514    n3 = n[3];
    1854319515    n4 = n[4];
     19516
     19517#ifdef HAVE_NTRU
     19518    if (XSTRNCMP(n0,"NTRU",4) == 0)
     19519        return "NTRU";
     19520#endif
    1854419521
    1854519522    if (XSTRNCMP(n0,"ECDHE",5) == 0 && XSTRNCMP(n1,"PSK",3) == 0)
     
    1857819555    n2 = n[2];
    1857919556
     19557#ifdef HAVE_NTRU
     19558    if (XSTRNCMP(n0,"NTRU",4) == 0)
     19559        return "NTRU";
     19560#endif
     19561
    1858019562    if ((XSTRNCMP(n0,"AES128",6) == 0) || (XSTRNCMP(n0,"AES256",6) == 0)  ||
    1858119563        ((XSTRNCMP(n0,"TLS13",5) == 0) && ((XSTRNCMP(n1,"AES128",6) == 0) ||
     
    1859119573    else if (XSTRNCMP(n1,"ECDSA",5) == 0)
    1859219574        authStr = "ECDSA";
     19575    else if (XSTRNCMP(n0,"ADH",3) == 0)
     19576        authStr = "None";
    1859319577    else
    1859419578        authStr = "unknown";
     
    1864019624             (XSTRNCMP(n2,"CAMELLIA128",11) == 0))
    1864119625        encStr = "CAMELLIA(128)";
    18642     else if ((XSTRNCMP(n0,"RC4",3) == 0) || (XSTRNCMP(n2,"RC4",3) == 0))
     19626    else if ((XSTRNCMP(n0,"RC4",3) == 0) || (XSTRNCMP(n1,"RC4",3) == 0) ||
     19627            (XSTRNCMP(n2,"RC4",3) == 0))
    1864319628        encStr = "RC4";
    18644     else if (((XSTRNCMP(n0,"DES",3) == 0)  || (XSTRNCMP(n2,"DES",3) == 0)) &&
    18645              ((XSTRNCMP(n1,"CBC3",4) == 0) || (XSTRNCMP(n3,"CBC3",4) == 0)))
     19629    else if (((XSTRNCMP(n0,"DES",3) == 0)  || (XSTRNCMP(n1,"DES",3) == 0) ||
     19630              (XSTRNCMP(n2,"DES",3) == 0)) &&
     19631             ((XSTRNCMP(n1,"CBC3",4) == 0) || (XSTRNCMP(n2,"CBC3",4) == 0) ||
     19632              (XSTRNCMP(n3,"CBC3",4) == 0)))
    1864619633        encStr = "3DES";
    1864719634    else if ((XSTRNCMP(n1,"CHACHA20",8) == 0 && XSTRNCMP(n2,"POLY1305",8) == 0) ||
     
    1873319720    for (i = 0; i < GetCipherNamesSize(); i++) {
    1873419721        if ((cipher_names[i].cipherSuite0 == cipherSuite0) &&
    18735             (cipher_names[i].cipherSuite  == cipherSuite)) {
     19722            (cipher_names[i].cipherSuite  == cipherSuite)
     19723#ifndef NO_CIPHER_SUITE_ALIASES
     19724            && (! (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS))
     19725#endif
     19726            ) {
    1873619727            nameIana = cipher_names[i].name_iana;
    1873719728            break;
     
    1876519756
    1876619757int GetCipherSuiteFromName(const char* name, byte* cipherSuite0,
    18767                            byte* cipherSuite)
     19758                           byte* cipherSuite, int* flags)
    1876819759{
    1876919760    int           ret = BAD_FUNC_ARG;
    1877019761    int           i;
    18771     unsigned long len = (unsigned long)XSTRLEN(name);
     19762    unsigned long len;
     19763    const char*   nameDelim;
     19764
     19765    /* Support trailing : */
     19766    nameDelim = XSTRSTR(name, ":");
     19767    if (nameDelim)
     19768        len = (unsigned long)(nameDelim - name);
     19769    else
     19770        len = (unsigned long)XSTRLEN(name);
    1877219771
    1877319772    for (i = 0; i < GetCipherNamesSize(); i++) {
    18774         if (XSTRNCMP(name, cipher_names[i].name, len) == 0) {
     19773        if ((XSTRNCMP(name, cipher_names[i].name, len) == 0) &&
     19774            (cipher_names[i].name[len] == 0)) {
    1877519775            *cipherSuite0 = cipher_names[i].cipherSuite0;
    1877619776            *cipherSuite  = cipher_names[i].cipherSuite;
     19777            *flags = cipher_names[i].flags;
    1877719778            ret = 0;
    1877819779            break;
     
    1891219913
    1891319914#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS)
     19915static int MatchSigAlgo(WOLFSSL* ssl, int sigAlgo)
     19916{
     19917#ifdef HAVE_ED25519
     19918    if (ssl->pkCurveOID == ECC_ED25519_OID) {
     19919        /* Certificate has Ed25519 key, only match with Ed25519 sig alg  */
     19920        return sigAlgo == ed25519_sa_algo;
     19921    }
     19922#endif
     19923#ifdef HAVE_ED448
     19924    if (ssl->pkCurveOID == ECC_ED448_OID) {
     19925        /* Certificate has Ed448 key, only match with Ed448 sig alg  */
     19926        return sigAlgo == ed448_sa_algo;
     19927    }
     19928#endif
     19929#ifdef WC_RSA_PSS
     19930    /* RSA certificate and PSS sig alg. */
     19931    if (ssl->suites->sigAlgo == rsa_sa_algo) {
     19932    #if defined(WOLFSSL_TLS13)
     19933        /* TLS 1.3 only supports RSA-PSS. */
     19934        if (IsAtLeastTLSv1_3(ssl->version))
     19935            return sigAlgo == rsa_pss_sa_algo;
     19936    #endif
     19937        /* TLS 1.2 and below - RSA-PSS allowed. */
     19938        if (sigAlgo == rsa_pss_sa_algo)
     19939            return 1;
     19940    }
     19941#endif
     19942    /* Signature algorithm matches certificate. */
     19943    return sigAlgo == ssl->suites->sigAlgo;
     19944}
     19945
     19946#if defined(HAVE_ECC) && defined(WOLFSSL_TLS13) || \
     19947                                              defined(USE_ECDSA_KEYSZ_HASH_ALGO)
     19948static int CmpEccStrength(int hashAlgo, int curveSz)
     19949{
     19950    int dgstSz = GetMacDigestSize(hashAlgo);
     19951    if (dgstSz <= 0)
     19952        return -1;
     19953    return dgstSz - (curveSz & (~0x3));
     19954}
     19955#endif
     19956
     19957static byte MinHashAlgo(WOLFSSL* ssl)
     19958{
     19959#ifdef WOLFSSL_TLS13
     19960    if (IsAtLeastTLSv1_3(ssl->version)) {
     19961        return sha256_mac;
     19962    }
     19963#endif
     19964#if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1)
     19965    if (IsAtLeastTLSv1_2(ssl)) {
     19966        return sha256_mac;
     19967    }
     19968#endif /* WOLFSSL_NO_TLS12 */
     19969    return sha_mac;
     19970}
     19971
    1891419972int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz)
    1891519973{
    1891619974    word32 i;
    1891719975    int ret = MATCH_SUITE_ERROR;
    18918 
    18919     ssl->suites->sigAlgo = ssl->specs.sig_algo;
     19976    byte minHash;
    1892019977
    1892119978    /* set defaults */
    1892219979    if (IsAtLeastTLSv1_3(ssl->version)) {
    18923         ssl->suites->hashAlgo = sha256_mac;
    1892419980    #ifndef NO_CERTS
     19981        /* TLS 1.3 cipher suites don't have public key algorithms in them.
     19982         * Using the one in the certificate - if any.
     19983         */
    1892519984        ssl->suites->sigAlgo = ssl->buffers.keyType;
    1892619985    #endif
    1892719986    }
    18928 #ifndef WOLFSSL_NO_TLS12
    18929     else if (IsAtLeastTLSv1_2(ssl)) {
    18930     #ifdef WOLFSSL_ALLOW_TLS_SHA1
    18931         ssl->suites->hashAlgo = sha_mac;
    18932     #else
    18933         ssl->suites->hashAlgo = sha256_mac;
    18934     #endif
    18935     }
    18936     else {
    18937         ssl->suites->hashAlgo = sha_mac;
    18938     }
    18939 #endif
    18940 
     19987    else
     19988        ssl->suites->sigAlgo = ssl->specs.sig_algo;
     19989    if (ssl->suites->sigAlgo == 0) {
     19990        /* PSK ciphersuite - get digest to use from cipher suite */
     19991        ssl->suites->hashAlgo = ssl->specs.mac_algorithm;
     19992        return 0;
     19993    }
     19994    ssl->suites->hashAlgo = minHash = MinHashAlgo(ssl);
     19995
     19996    /* No list means go with the defaults. */
    1894119997    if (hashSigAlgoSz == 0)
    1894219998        return 0;
    1894319999
    18944     /* i+1 since peek a byte ahead for type */
     20000    /* i+1 since two bytes used to describe hash and signature algorithm */
    1894520001    for (i = 0; (i+1) < hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) {
    1894620002        byte hashAlgo = 0, sigAlgo = 0;
    1894720003
    1894820004        DecodeSigAlg(&hashSigAlgo[i], &hashAlgo, &sigAlgo);
     20005        /* Keep looking if hash algorithm not strong enough. */
     20006        if (hashAlgo < minHash)
     20007            continue;
     20008        /* Keep looking if signature algorithm isn't supported by cert. */
     20009        if (!MatchSigAlgo(ssl, sigAlgo))
     20010            continue;
     20011
    1894920012    #ifdef HAVE_ED25519
    1895020013        if (ssl->pkCurveOID == ECC_ED25519_OID) {
    18951             if (sigAlgo != ed25519_sa_algo)
    18952                 continue;
    18953             if (sigAlgo == ed25519_sa_algo &&
    18954                                       ssl->suites->sigAlgo == ecc_dsa_sa_algo) {
    18955                 ssl->suites->sigAlgo = sigAlgo;
    18956                 ssl->suites->hashAlgo = sha512_mac;
    18957                 ret = 0;
    18958                 break;
    18959             }
     20014            /* Matched Ed25519 - set chosen and finished. */
     20015            ssl->suites->sigAlgo = sigAlgo;
     20016            ssl->suites->hashAlgo = hashAlgo;
     20017            ret = 0;
     20018            break;
    1896020019        }
    1896120020    #endif
    1896220021    #ifdef HAVE_ED448
    1896320022        if (ssl->pkCurveOID == ECC_ED448_OID) {
    18964             if (sigAlgo != ed448_sa_algo)
     20023            /* Matched Ed448 - set chosen and finished. */
     20024            ssl->suites->sigAlgo = sigAlgo;
     20025            ssl->suites->hashAlgo = hashAlgo;
     20026            ret = 0;
     20027            break;
     20028        }
     20029    #endif
     20030
     20031    #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
     20032        #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot "
     20033               "be used together"
     20034    #endif
     20035
     20036    #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \
     20037                                              defined(WOLFSSL_ECDSA_MATCH_HASH))
     20038        if (sigAlgo == ecc_dsa_sa_algo
     20039        #ifndef WOLFSSL_ECDSA_MATCH_HASH
     20040            && IsAtLeastTLSv1_3(ssl->version)
     20041        #endif
     20042            ) {
     20043            /* Must be exact match. */
     20044            if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0)
    1896520045                continue;
    1896620046
    18967             if (sigAlgo == ed448_sa_algo &&
    18968                                       ssl->suites->sigAlgo == ecc_dsa_sa_algo) {
    18969                 ssl->suites->sigAlgo = sigAlgo;
    18970                 ssl->suites->hashAlgo = sha512_mac;
    18971                 ret = 0;
    18972                 break;
    18973             }
    18974         }
    18975     #endif
    18976     #if defined(WOLFSSL_TLS13) && defined(HAVE_ECC)
    18977         if (IsAtLeastTLSv1_3(ssl->version) && sigAlgo == ssl->suites->sigAlgo &&
    18978                                                    sigAlgo == ecc_dsa_sa_algo) {
    18979 
    18980             int digestSz = GetMacDigestSize(hashAlgo);
    18981             if (digestSz <= 0)
    18982                 continue;
    18983 
    18984             /* TLS 1.3 signature algorithms for ECDSA match hash length with
    18985              * key size.
    18986              */
    18987             if (digestSz != ssl->buffers.keySz)
    18988                 continue;
    18989 
     20047            /* Matched ECDSA exaclty - set chosen and finished. */
    1899020048            ssl->suites->hashAlgo = hashAlgo;
    1899120049            ssl->suites->sigAlgo = sigAlgo;
    1899220050            ret = 0;
    18993             break; /* done selected sig/hash algorithms */
    18994         }
    18995         else
     20051            break;
     20052        }
    1899620053    #endif
     20054
    1899720055    /* For ECDSA the `USE_ECDSA_KEYSZ_HASH_ALGO` build option will choose a hash
    1899820056     * algorithm that matches the ephemeral ECDHE key size or the next highest
     
    1900120059     */
    1900220060    #if defined(HAVE_ECC) && defined(USE_ECDSA_KEYSZ_HASH_ALGO)
    19003         if (sigAlgo == ssl->suites->sigAlgo && sigAlgo == ecc_dsa_sa_algo) {
    19004             int digestSz = GetMacDigestSize(hashAlgo);
    19005             if (digestSz <= 0)
     20061        if (sigAlgo == ecc_dsa_sa_algo) {
     20062            int cmp = CmpEccStrength(hashAlgo, ssl->eccTempKeySz);
     20063
     20064            /* Keep looking if digest not strong enough. */
     20065            if (cmp < 0)
    1900620066                continue;
    1900720067
    19008             /* For ecc_dsa_sa_algo, pick hash algo that is curve size unless
    19009                 algorithm in not compiled in, then choose next highest */
    19010             if (digestSz == ssl->eccTempKeySz) {
     20068            /* Looking for exact match or next highest. */
     20069            if (ret != 0 || hashAlgo <= ssl->suites->hashAlgo) {
    1901120070                ssl->suites->hashAlgo = hashAlgo;
    1901220071                ssl->suites->sigAlgo = sigAlgo;
     
    1901520074            #endif
    1901620075                ret = 0;
    19017                 break; /* done selected sig/hash algorithms */
    19018             }
    19019             /* not strong enough, so keep checking hashSigAlso list */
    19020             if (digestSz < ssl->eccTempKeySz)
     20076            }
     20077
     20078            /* Continue looking if not the same strength. */
     20079            if (cmp > 0)
    1902120080                continue;
    19022 
    19023             /* mark as highest and check remainder of hashSigAlgo list */
    19024             ssl->suites->hashAlgo = hashAlgo;
    19025             ssl->suites->sigAlgo = sigAlgo;
    19026             ret = 0;
    19027         }
    19028         else
     20081            /* Exact match - finished. */
     20082            break;
     20083        }
    1902920084    #endif
    19030     #ifdef WC_RSA_PSS
    19031         if (IsAtLeastTLSv1_3(ssl->version) &&
    19032                                           ssl->suites->sigAlgo == rsa_sa_algo &&
    19033                                           sigAlgo != rsa_pss_sa_algo) {
    19034             continue;
    19035         }
    19036         else if (sigAlgo == ssl->suites->sigAlgo ||
    19037                                         (sigAlgo == rsa_pss_sa_algo &&
    19038                                          (ssl->suites->sigAlgo == rsa_sa_algo)))
    19039     #else
    19040         if (sigAlgo == ssl->suites->sigAlgo)
    19041     #endif
    19042         {
    19043             /* pick highest available between both server and client */
    19044             switch (hashAlgo) {
    19045                 case sha_mac:
    19046             #ifdef WOLFSSL_SHA224
    19047                 case sha224_mac:
     20085
     20086        switch (hashAlgo) {
     20087        #ifndef NO_SHA
     20088            case sha_mac:
     20089        #endif
     20090        #ifdef WOLFSSL_SHA224
     20091            case sha224_mac:
     20092        #endif
     20093        #ifndef NO_SHA256
     20094            case sha256_mac:
     20095        #endif
     20096        #ifdef WOLFSSL_SHA384
     20097            case sha384_mac:
     20098        #endif
     20099        #ifdef WOLFSSL_SHA512
     20100            case sha512_mac:
     20101        #endif
     20102            #ifdef WOLFSSL_STRONGEST_HASH_SIG
     20103            /* Is hash algorithm weaker than chosen/min? */
     20104                if (hashAlgo < ssl->suites->hashAlgo)
     20105                    break;
     20106            #else
     20107                /* Is hash algorithm stonger than last chosen? */
     20108                if (ret == 0 && hashAlgo > ssl->suites->hashAlgo)
     20109                    break;
    1904820110            #endif
    19049             #ifndef NO_SHA256
    19050                 case sha256_mac:
    19051             #endif
    19052             #ifdef WOLFSSL_SHA384
    19053                 case sha384_mac:
    19054             #endif
    19055             #ifdef WOLFSSL_SHA512
    19056                 case sha512_mac:
    19057             #endif
    19058                     /* not strong enough, so keep checking hashSigAlso list */
    19059                     if (hashAlgo < ssl->suites->hashAlgo) {
    19060                         ret = 0;
    19061                         continue;
    19062                     }
    19063                     /* mark as highest and check remainder of hashSigAlgo list */
    19064                     ssl->suites->hashAlgo = hashAlgo;
    19065                     ssl->suites->sigAlgo = sigAlgo;
    19066                     break;
    19067                 default:
    19068                     continue;
    19069             }
    19070             ret = 0;
    19071             break;
    19072         }
    19073 #if defined(WOLFSSL_TLS13)
    19074         else if (ssl->specs.sig_algo == 0 && IsAtLeastTLSv1_3(ssl->version)) {
    19075         }
    19076 #endif
    19077         else if (ssl->specs.sig_algo == 0)
    19078         {
    19079             ssl->suites->hashAlgo = ssl->specs.mac_algorithm;
    19080             ret = 0;
     20111                /* The chosen one - but keep looking. */
     20112                ssl->suites->hashAlgo = hashAlgo;
     20113                ssl->suites->sigAlgo = sigAlgo;
     20114                ret = 0;
     20115                break;
     20116            default:
     20117                /* Support for hash algorithm not compiled in. */
     20118                break;
    1908120119        }
    1908220120    }
     
    1910720145        int sz = GetCipherNamesSize();
    1910820146
    19109         for (i = 0; i < sz; i++)
     20147        for (i = 0; i < sz; i++) {
     20148#ifndef NO_CIPHER_SUITE_ALIASES
     20149            if (cipher_names[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
     20150                continue;
     20151#endif
    1911020152            if (info->ssl->options.cipherSuite ==
    1911120153                                            (byte)cipher_names[i].cipherSuite) {
     
    1911620158                break;
    1911720159            }
     20160        }
    1911820161
    1911920162        /* error max and min are negative numbers */
     
    1927920322#if !defined(NO_CERTS)
    1928020323
     20324#ifdef WOLF_CRYPTO_CB
     20325/* Create a private key for a device.
     20326 *
     20327 * pkey    Key object.
     20328 * data    Data to identify key.
     20329 * length  Length of data.
     20330 * hsType  Type of the key to create.
     20331 * heap    Custom heap to use for mallocs/frees
     20332 * devId   Id for device.
     20333 * return  0 on success.
     20334 * return  NOT_COMPILED_IN if algorithm type not supported.
     20335 * return  MEMORY_E on memory allocation failure.
     20336 * return  other internal error
     20337 */
     20338int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType,
     20339                        int label, int id, void* heap, int devId)
     20340{
     20341    int ret = NOT_COMPILED_IN;
     20342
     20343    if (hsType == DYNAMIC_TYPE_RSA) {
     20344#ifndef NO_RSA
     20345        RsaKey* rsaKey;
     20346
     20347        rsaKey = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA);
     20348        if (rsaKey == NULL) {
     20349            return MEMORY_E;
     20350        }
     20351
     20352        if (label) {
     20353            ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId);
     20354        }
     20355        else if (id) {
     20356            ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId);
     20357        }
     20358        if (ret == 0) {
     20359            *pkey = (void*)rsaKey;
     20360        }
     20361        else {
     20362            XFREE(rsaKey, heap, DYNAMIC_TYPE_RSA);
     20363        }
     20364#endif
     20365    }
     20366    else if (hsType == DYNAMIC_TYPE_ECC) {
     20367#ifdef HAVE_ECC
     20368        ecc_key* ecKey;
     20369
     20370        ecKey = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC);
     20371        if (ecKey == NULL) {
     20372            return MEMORY_E;
     20373        }
     20374
     20375        if (label) {
     20376            ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId);
     20377        }
     20378        else if (id) {
     20379            ret = wc_ecc_init_id(ecKey, data, length, heap, devId);
     20380        }
     20381        if (ret == 0) {
     20382            *pkey = (void*)ecKey;
     20383        }
     20384        else {
     20385            XFREE(ecKey, heap, DYNAMIC_TYPE_ECC);
     20386        }
     20387#endif
     20388    }
     20389
     20390    return ret;
     20391}
     20392#endif
     20393
    1928120394/* Decode the private key - RSA/ECC/Ed25519/Ed448 - and creates a key object.
    1928220395 * The signature type is set as well.
     
    1930920422
    1931020423#ifdef HAVE_PKCS11
    19311     if (ssl->buffers.keyDevId != INVALID_DEVID && ssl->buffers.keyId) {
     20424    if (ssl->buffers.keyDevId != INVALID_DEVID && (ssl->buffers.keyId ||
     20425                                                       ssl->buffers.keyLabel)) {
    1931220426        if (ssl->buffers.keyType == rsa_sa_algo)
    1931320427            ssl->hsType = DYNAMIC_TYPE_RSA;
     
    1932120435        if (ssl->buffers.keyType == rsa_sa_algo) {
    1932220436    #ifndef NO_RSA
    19323             ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
    19324                              ssl->buffers.key->buffer, ssl->buffers.key->length,
    19325                              ssl->heap, ssl->buffers.keyDevId);
     20437            if (ssl->buffers.keyLabel) {
     20438                ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsKey,
     20439                                          (char*)ssl->buffers.key->buffer,
     20440                                          ssl->heap, ssl->buffers.keyDevId);
     20441            }
     20442            else if (ssl->buffers.keyId) {
     20443                ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsKey,
     20444                                       ssl->buffers.key->buffer,
     20445                                       ssl->buffers.key->length, ssl->heap,
     20446                                       ssl->buffers.keyDevId);
     20447            }
    1932620448            if (ret == 0) {
    1932720449                if (ssl->buffers.keySz < ssl->options.minRsaKeySz) {
     
    1933920461        else if (ssl->buffers.keyType == ecc_dsa_sa_algo) {
    1934020462    #ifdef HAVE_ECC
    19341             ret = wc_ecc_init_id((ecc_key*)ssl->hsKey, ssl->buffers.key->buffer,
    19342                                  ssl->buffers.key->length, ssl->heap,
    19343                                  ssl->buffers.keyDevId);
     20463            if (ssl->buffers.keyLabel) {
     20464                ret = wc_ecc_init_label((ecc_key*)ssl->hsKey,
     20465                                        (char*)ssl->buffers.key->buffer,
     20466                                        ssl->heap, ssl->buffers.keyDevId);
     20467            }
     20468            else if (ssl->buffers.keyId) {
     20469                ret = wc_ecc_init_id((ecc_key*)ssl->hsKey,
     20470                                     ssl->buffers.key->buffer,
     20471                                     ssl->buffers.key->length, ssl->heap,
     20472                                     ssl->buffers.keyDevId);
     20473            }
    1934420474            if (ret == 0) {
    1934520475                if (ssl->buffers.keySz < ssl->options.minEccKeySz) {
     
    1953220662
    1953320663#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
     20664
     20665#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12)
     20666    /* returns 1 if able to do TLS 1.3 otherwise 0 */
     20667    int TLSv1_3_Capable(WOLFSSL* ssl)
     20668    {
     20669    #ifndef WOLFSSL_TLS13
     20670        return 0;
     20671    #else
     20672        int ret = 0;
     20673
     20674        if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
     20675            ret = 1;
     20676        }
     20677
     20678        #ifdef OPENSSL_EXTRA
     20679        if ((wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_3)) {
     20680            /* option set at run time to disable TLS 1.3 */
     20681            ret = 0;
     20682        }
     20683        #endif
     20684        return ret;
     20685    #endif
     20686    }
     20687#endif /* WOLFSSL_TLS13 */
    1953420688
    1953520689/* client only parts */
     
    1973120885        if (IsEncryptionOn(ssl, 1)) {
    1973220886            byte* input;
    19733             int   inputSz = idx - RECORD_HEADER_SZ; /* build msg adds rec hdr */
    19734 
     20887            int   inputSz = idx; /* build msg adds rec hdr */
     20888            int   recordHeaderSz = RECORD_HEADER_SZ;
     20889
     20890            if (ssl->options.dtls)
     20891                recordHeaderSz += DTLS_RECORD_EXTRA;
     20892            inputSz -= recordHeaderSz;
    1973520893            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    1973620894            if (input == NULL)
    1973720895                return MEMORY_E;
    1973820896
    19739             XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
     20897            XMEMCPY(input, output + recordHeaderSz, inputSz);
     20898            #ifdef WOLFSSL_DTLS
     20899            if (IsDtlsNotSctpMode(ssl) &&
     20900                    (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) {
     20901                XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     20902                return ret;
     20903            }
     20904            #endif
    1974020905            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
    19741                                   handshake, 1, 0, 0);
     20906                                  handshake, 1, 0, 0, CUR_ORDER);
    1974220907            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    1974320908
     
    1974720912            #ifdef WOLFSSL_DTLS
    1974820913                if (IsDtlsNotSctpMode(ssl)) {
    19749                     if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
     20914                    if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0)
    1975020915                        return ret;
    1975120916                }
     
    2019621361        return ret;
    2019721362    }
    20198 
    20199 #ifdef WOLFSSL_TLS13
    20200     /* returns 1 if able to do TLS 1.3 otherwise 0 */
    20201     static int TLSv1_3_Capable(WOLFSSL* ssl)
    20202     {
    20203     #ifndef WOLFSSL_TLS13
    20204         return 0;
    20205     #else
    20206         int ret = 0;
    20207 
    20208         if (IsAtLeastTLSv1_3(ssl->ctx->method->version)) {
    20209             ret = 1;
    20210         }
    20211 
    20212         #ifdef OPENSSL_EXTRA
    20213         if ((wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_3)) {
    20214             /* option set at run time to disable TLS 1.3 */
    20215             ret = 0;
    20216         }
    20217         #endif
    20218         return ret;
    20219     #endif
    20220     }
    20221 #endif /* WOLFSSL_TLS13 */
    2022221363
    2022321364    int CompleteServerHello(WOLFSSL* ssl)
     
    2024421385    #endif
    2024521386            if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
    20246                              ssl->ctx->method->version.minor == TLSv1_2_MINOR) {
     21387                                ssl->ctx->method->version.minor == TLSv1_2_MINOR
     21388#ifdef OPENSSL_EXTRA
     21389                          && (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0
     21390#endif
     21391            ) {
    2024721392                /* TLS v1.2 capable client not allowed to downgrade when
    2024821393                 * connecting to TLS v1.2 capable server.
     
    2028621431            }
    2028721432        }
    20288     #ifdef WOLFSSL_DTLS
    20289         if (ssl->options.dtls) {
    20290             DtlsMsgPoolReset(ssl);
    20291         }
    20292     #endif
    20293 
    2029421433        return SetCipherSpecs(ssl);
    2029521434    }
    2029621435
    20297 #endif /* WOLFSSL_NO_TLS12 */
     21436#endif /* !WOLFSSL_NO_TLS12 */
    2029821437
    2029921438
     
    2048121620
    2048221621        switch (tlsCurveId) {
    20483     #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
     21622    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
    2048421623        #ifndef NO_ECC_SECP
    2048521624            case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID;
     
    2049221631        #endif /* HAVE_ECC_KOBLITZ */
    2049321632    #endif
    20494     #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
     21633    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
    2049521634        #ifndef NO_ECC_SECP
    2049621635            case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID;
     
    2050021639        #endif /* HAVE_ECC_KOBLITZ */
    2050121640    #endif
    20502     #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
     21641    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
    2050321642        #ifndef NO_ECC_SECP
    2050421643            case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID;
     
    2050821647        #endif /* HAVE_ECC_KOBLITZ */
    2050921648    #endif
    20510         #ifdef HAVE_CURVE25519
     21649        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
    2051121650            case WOLFSSL_ECC_X25519: return ECC_X25519_OID;
    2051221651        #endif
    20513     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
     21652    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
    2051421653        #ifndef NO_ECC_SECP
    2051521654            case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID;
     
    2052221661        #endif /* HAVE_ECC_BRAINPOOL */
    2052321662    #endif
    20524         #ifdef HAVE_CURVE448
     21663        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
    2052521664            case WOLFSSL_ECC_X448: return ECC_X448_OID;
    2052621665        #endif
    20527     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
     21666    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
    2052821667        #ifndef NO_ECC_SECP
    2052921668            case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID;
     
    2053321672        #endif /* HAVE_ECC_BRAINPOOL */
    2053421673    #endif
    20535     #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
     21674    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
    2053621675        #ifdef HAVE_ECC_BRAINPOOL
    2053721676            case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID;
    2053821677        #endif /* HAVE_ECC_BRAINPOOL */
    2053921678    #endif
    20540     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     21679    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
    2054121680        #ifndef NO_ECC_SECP
    2054221681            case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID;
     
    2054821687    }
    2054921688
    20550 #endif /* HAVE_ECC */
     21689#endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */
    2055121690
    2055221691/* Persistable DoServerKeyExchange arguments */
    2055321692typedef struct DskeArgs {
    2055421693    byte*  output; /* not allocated */
    20555 #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
    20556                                                              defined(HAVE_ED448)
     21694#if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
     21695                                                          defined(HAVE_CURVE448)
    2055721696    byte*  verifySig;
    2055821697#endif
    2055921698    word32 idx;
    2056021699    word32 begin;
    20561 #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
    20562                                                              defined(HAVE_ED448)
     21700#if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
     21701                                                          defined(HAVE_CURVE448)
    2056321702    word16 verifySigSz;
    2056421703#endif
     
    2057821717    (void)args;
    2057921718
    20580 #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
    20581                                                              defined(HAVE_ED448)
     21719#if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
     21720                                                          defined(HAVE_CURVE448)
    2058221721    if (args->verifySig) {
    2058321722        XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
     
    2059821737#endif
    2059921738
    20600     ssl->buffers.weOwnDH = 1;
    20601 
    20602     ssl->buffers.serverDH_P.buffer = NULL;
    20603     ssl->buffers.serverDH_G.buffer = NULL;
    20604     ssl->buffers.serverDH_Pub.buffer = NULL;
     21739    if (ssl->buffers.weOwnDH) {
     21740        if (ssl->buffers.serverDH_P.buffer) {
     21741            XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
     21742                    DYNAMIC_TYPE_PUBLIC_KEY);
     21743            ssl->buffers.serverDH_P.buffer = NULL;
     21744        }
     21745
     21746        if (ssl->buffers.serverDH_G.buffer) {
     21747            XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
     21748                    DYNAMIC_TYPE_PUBLIC_KEY);
     21749            ssl->buffers.serverDH_G.buffer = NULL;
     21750        }
     21751
     21752    }
     21753
     21754    if (ssl->buffers.serverDH_Pub.buffer) {
     21755        XFREE(ssl->buffers.serverDH_Pub.buffer, ssl->heap,
     21756                DYNAMIC_TYPE_PUBLIC_KEY);
     21757        ssl->buffers.serverDH_Pub.buffer = NULL;
     21758    }
    2060521759
    2060621760    /* p */
     
    2064421798    /* g */
    2064521799    if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
     21800        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
     21801                DYNAMIC_TYPE_PUBLIC_KEY);
     21802        ssl->buffers.serverDH_P.buffer = NULL;
    2064621803        ERROR_OUT(BUFFER_ERROR, exit_gdpk);
    2064721804    }
     
    2065121808
    2065221809    if ((args->idx - args->begin) + length > size) {
     21810        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
     21811                DYNAMIC_TYPE_PUBLIC_KEY);
     21812        ssl->buffers.serverDH_P.buffer = NULL;
    2065321813        ERROR_OUT(BUFFER_ERROR, exit_gdpk);
     21814    }
     21815
     21816    if (length > ssl->options.maxDhKeySz) {
     21817        WOLFSSL_MSG("Server using a DH key generator that is too big");
     21818        SendAlert(ssl, alert_fatal, handshake_failure);
     21819        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
     21820                DYNAMIC_TYPE_PUBLIC_KEY);
     21821        ssl->buffers.serverDH_P.buffer = NULL;
     21822        ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
    2065421823    }
    2065521824
     
    2066021829    }
    2066121830    else {
     21831        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
     21832                DYNAMIC_TYPE_PUBLIC_KEY);
     21833        ssl->buffers.serverDH_P.buffer = NULL;
    2066221834        ERROR_OUT(MEMORY_ERROR, exit_gdpk);
    2066321835    }
     
    2066921841    /* pub */
    2067021842    if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
     21843        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
     21844                DYNAMIC_TYPE_PUBLIC_KEY);
     21845        ssl->buffers.serverDH_P.buffer = NULL;
     21846        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
     21847                DYNAMIC_TYPE_PUBLIC_KEY);
     21848        ssl->buffers.serverDH_G.buffer = NULL;
    2067121849        ERROR_OUT(BUFFER_ERROR, exit_gdpk);
    2067221850    }
     
    2067621854
    2067721855    if ((args->idx - args->begin) + length > size) {
     21856        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
     21857                DYNAMIC_TYPE_PUBLIC_KEY);
     21858        ssl->buffers.serverDH_P.buffer = NULL;
     21859        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
     21860                DYNAMIC_TYPE_PUBLIC_KEY);
     21861        ssl->buffers.serverDH_G.buffer = NULL;
    2067821862        ERROR_OUT(BUFFER_ERROR, exit_gdpk);
     21863    }
     21864
     21865    if (length > ssl->options.maxDhKeySz) {
     21866        WOLFSSL_MSG("Server using a public DH key that is too big");
     21867        SendAlert(ssl, alert_fatal, handshake_failure);
     21868        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
     21869                DYNAMIC_TYPE_PUBLIC_KEY);
     21870        ssl->buffers.serverDH_P.buffer = NULL;
     21871        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
     21872                DYNAMIC_TYPE_PUBLIC_KEY);
     21873        ssl->buffers.serverDH_G.buffer = NULL;
     21874        ERROR_OUT(DH_KEY_SIZE_E, exit_gdpk);
    2067921875    }
    2068021876
     
    2068521881    }
    2068621882    else {
     21883        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
     21884                DYNAMIC_TYPE_PUBLIC_KEY);
     21885        ssl->buffers.serverDH_P.buffer = NULL;
     21886        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
     21887                DYNAMIC_TYPE_PUBLIC_KEY);
     21888        ssl->buffers.serverDH_G.buffer = NULL;
    2068721889        ERROR_OUT(MEMORY_ERROR, exit_gdpk);
    2068821890    }
     
    2069021892    XMEMCPY(ssl->buffers.serverDH_Pub.buffer, input + args->idx,
    2069121893                                                        length);
     21894    ssl->buffers.weOwnDH = 1;
    2069221895    args->idx += length;
    2069321896
     
    2121622419                case ecc_diffie_hellman_kea:
    2121722420                {
    21218             #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(HAVE_ED25519) \
    21219                                                      && !defined(HAVE_ED448)
     22421            #if defined(NO_DH) && !defined(HAVE_ECC) && \
     22422                            !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
    2122022423                    ERROR_OUT(NOT_COMPILED_IN, exit_dske);
    2122122424            #else
     
    2138922592                case ecc_diffie_hellman_kea:
    2139022593                {
    21391             #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(HAVE_ED25519) \
    21392                                                      && !defined(HAVE_ED448)
     22594            #if defined(NO_DH) && !defined(HAVE_ECC) && \
     22595                            !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
    2139322596                    ERROR_OUT(NOT_COMPILED_IN, exit_dske);
    2139422597            #else
     
    2156322766                case ecc_diffie_hellman_kea:
    2156422767                {
    21565             #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(HAVE_ED25519) \
    21566                                                      && !defined(HAVE_ED448)
     22768            #if defined(NO_DH) && !defined(HAVE_ECC) && \
     22769                            !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
    2156722770                    ERROR_OUT(NOT_COMPILED_IN, exit_dske);
    2156822771            #else
     
    2262423827                    XMEMCPY(args->output, ssl->arrays->client_identity, esSz);
    2262523828                    args->output += esSz;
     23829                    args->length = args->encSz - esSz - OPAQUE16_LEN;
    2262623830                    args->encSz = esSz + OPAQUE16_LEN;
    22627 
    22628                     args->length = 0;
    2262923831
    2263023832                    ret = AllocKey(ssl, DYNAMIC_TYPE_DH,
     
    2329724499
    2329824500            if (IsEncryptionOn(ssl, 1)) {
    23299                 args->inputSz = idx - RECORD_HEADER_SZ; /* buildmsg adds rechdr */
     24501                int recordHeaderSz = RECORD_HEADER_SZ;
     24502
     24503                if (ssl->options.dtls)
     24504                    recordHeaderSz += DTLS_RECORD_EXTRA;
     24505                args->inputSz = idx - recordHeaderSz; /* buildmsg adds rechdr */
    2330024506                args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
    2330124507                                                       DYNAMIC_TYPE_IN_BUFFER);
     
    2330424510                }
    2330524511
    23306                 XMEMCPY(args->input, args->output + RECORD_HEADER_SZ,
     24512                XMEMCPY(args->input, args->output + recordHeaderSz,
    2330724513                                                                args->inputSz);
    2330824514            }
     
    2331624522        {
    2331724523            if (IsEncryptionOn(ssl, 1)) {
     24524            #ifdef WOLFSSL_DTLS
     24525                if (IsDtlsNotSctpMode(ssl) &&
     24526                        (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, client_key_exchange)) != 0) {
     24527                    goto exit_scke;
     24528                }
     24529            #endif
    2331824530                ret = BuildMessage(ssl, args->output, args->sendSz,
    23319                             args->input, args->inputSz, handshake, 1, 0, 0);
     24531                            args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
    2332024532                XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    2332124533                args->input = NULL; /* make sure its not double free'd on cleanup */
     
    2332824540            else {
    2332924541            #ifdef WOLFSSL_DTLS
     24542                if (IsDtlsNotSctpMode(ssl)) {
     24543                    if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, client_key_exchange)) != 0) {
     24544                        goto exit_scke;
     24545                    }
     24546                }
    2333024547                if (ssl->options.dtls)
    2333124548                    DtlsSEQIncrement(ssl, CUR_ORDER);
     
    2333724554                goto exit_scke;
    2333824555            }
    23339 
    23340         #ifdef WOLFSSL_DTLS
    23341             if (IsDtlsNotSctpMode(ssl)) {
    23342                 if ((ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz)) != 0) {
    23343                     goto exit_scke;
    23344                 }
    23345             }
    23346         #endif
    2334724556
    2334824557        #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
     
    2339724606
    2339824607#endif /* !WOLFSSL_NO_TLS12 */
     24608
     24609#ifndef NO_CERTS
     24610
     24611#ifndef WOLFSSL_NO_TLS12
     24612
     24613#ifndef WOLFSSL_NO_CLIENT_AUTH
     24614typedef struct ScvArgs {
     24615    byte*  output; /* not allocated */
     24616#ifndef NO_RSA
     24617    byte*  verifySig;
     24618#endif
     24619    byte*  verify; /* not allocated */
     24620    byte*  input;
     24621    word32 idx;
     24622    word32 extraSz;
     24623    word32 sigSz;
     24624    int    sendSz;
     24625    int    inputSz;
     24626    word16 length;
     24627    byte   sigAlgo;
     24628} ScvArgs;
     24629
     24630static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
     24631{
     24632    ScvArgs* args = (ScvArgs*)pArgs;
     24633
     24634    (void)ssl;
     24635
     24636#ifndef NO_RSA
     24637    if (args->verifySig) {
     24638        XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
     24639        args->verifySig = NULL;
     24640    }
     24641#endif
     24642    if (args->input) {
     24643        XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     24644        args->input = NULL;
     24645    }
     24646}
     24647
     24648/* handle generation of certificate_verify (15) */
     24649int SendCertificateVerify(WOLFSSL* ssl)
     24650{
     24651    int ret = 0;
     24652#ifdef WOLFSSL_ASYNC_CRYPT
     24653    ScvArgs* args = (ScvArgs*)ssl->async.args;
     24654    typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
     24655    (void)sizeof(args_test);
     24656#else
     24657    ScvArgs  args[1];
     24658#endif
     24659
     24660    WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
     24661    WOLFSSL_ENTER("SendCertificateVerify");
     24662
     24663#ifdef WOLFSSL_ASYNC_CRYPT
     24664    /* BuildMessage does its own Pop */
     24665    if (ssl->error != WC_PENDING_E ||
     24666            ssl->options.asyncState != TLS_ASYNC_END)
     24667        ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
     24668    if (ret != WC_NOT_PENDING_E) {
     24669        /* Check for error */
     24670        if (ret < 0)
     24671            goto exit_scv;
     24672    }
     24673    else
     24674#endif
     24675    {
     24676        /* Reset state */
     24677        ret = 0;
     24678        ssl->options.asyncState = TLS_ASYNC_BEGIN;
     24679        XMEMSET(args, 0, sizeof(ScvArgs));
     24680    #ifdef WOLFSSL_ASYNC_CRYPT
     24681        ssl->async.freeArgs = FreeScvArgs;
     24682    #endif
     24683    }
     24684
     24685    switch(ssl->options.asyncState)
     24686    {
     24687        case TLS_ASYNC_BEGIN:
     24688        {
     24689            if (ssl->options.sendVerify == SEND_BLANK_CERT) {
     24690                return 0;  /* sent blank cert, can't verify */
     24691            }
     24692
     24693            args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
     24694            if (IsEncryptionOn(ssl, 1)) {
     24695                args->sendSz += MAX_MSG_EXTRA;
     24696            }
     24697
     24698            /* check for available size */
     24699            if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
     24700                goto exit_scv;
     24701            }
     24702
     24703            /* get output buffer */
     24704            args->output = ssl->buffers.outputBuffer.buffer +
     24705                           ssl->buffers.outputBuffer.length;
     24706
     24707            /* Advance state and proceed */
     24708            ssl->options.asyncState = TLS_ASYNC_BUILD;
     24709        } /* case TLS_ASYNC_BEGIN */
     24710        FALL_THROUGH;
     24711
     24712        case TLS_ASYNC_BUILD:
     24713        {
     24714            ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
     24715            if (ret != 0) {
     24716                goto exit_scv;
     24717            }
     24718
     24719            if (ssl->buffers.key == NULL) {
     24720            #ifdef HAVE_PK_CALLBACKS
     24721                if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
     24722                    args->length = GetPrivateKeySigSize(ssl);
     24723                else
     24724            #endif
     24725                    ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
     24726            }
     24727            else {
     24728                /* Decode private key. */
     24729                ret = DecodePrivateKey(ssl, &args->length);
     24730                if (ret != 0) {
     24731                    goto exit_scv;
     24732                }
     24733            }
     24734
     24735            if (args->length == 0) {
     24736                ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
     24737            }
     24738
     24739            /* idx is used to track verify pointer offset to output */
     24740            args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
     24741            args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
     24742            args->extraSz = 0;  /* tls 1.2 hash/sig */
     24743
     24744            /* build encoded signature buffer */
     24745            ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
     24746            ssl->buffers.sig.buffer = (byte*)XMALLOC(ssl->buffers.sig.length,
     24747                                        ssl->heap, DYNAMIC_TYPE_SIGNATURE);
     24748            if (ssl->buffers.sig.buffer == NULL) {
     24749                ERROR_OUT(MEMORY_E, exit_scv);
     24750            }
     24751
     24752        #ifdef WOLFSSL_DTLS
     24753            if (ssl->options.dtls) {
     24754                args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
     24755                args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
     24756            }
     24757        #endif
     24758
     24759    #ifndef NO_OLD_TLS
     24760        #ifndef NO_SHA
     24761            /* old tls default */
     24762            SetDigest(ssl, sha_mac);
     24763        #endif
     24764    #else
     24765        #ifndef NO_SHA256
     24766            /* new tls default */
     24767            SetDigest(ssl, sha256_mac);
     24768        #endif
     24769    #endif /* !NO_OLD_TLS */
     24770
     24771            if (ssl->hsType == DYNAMIC_TYPE_RSA) {
     24772        #ifdef WC_RSA_PSS
     24773                if (IsAtLeastTLSv1_2(ssl) &&
     24774                                (ssl->pssAlgo & (1 << ssl->suites->hashAlgo))) {
     24775                    args->sigAlgo = rsa_pss_sa_algo;
     24776                }
     24777                else
     24778        #endif
     24779                    args->sigAlgo = rsa_sa_algo;
     24780            }
     24781            else if (ssl->hsType == DYNAMIC_TYPE_ECC)
     24782                args->sigAlgo = ecc_dsa_sa_algo;
     24783            else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
     24784                args->sigAlgo = ed25519_sa_algo;
     24785            else if (ssl->hsType == DYNAMIC_TYPE_ED448)
     24786                args->sigAlgo = ed448_sa_algo;
     24787
     24788            if (IsAtLeastTLSv1_2(ssl)) {
     24789                EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo,
     24790                             args->verify);
     24791                args->extraSz = HASH_SIG_SIZE;
     24792                SetDigest(ssl, ssl->suites->hashAlgo);
     24793            }
     24794        #ifndef NO_OLD_TLS
     24795            else {
     24796                /* if old TLS load MD5 and SHA hash as value to sign */
     24797                XMEMCPY(ssl->buffers.sig.buffer,
     24798                    (byte*)ssl->hsHashes->certHashes.md5, FINISHED_SZ);
     24799            }
     24800        #endif
     24801
     24802        #ifndef NO_RSA
     24803            if (args->sigAlgo == rsa_sa_algo) {
     24804                ssl->buffers.sig.length = FINISHED_SZ;
     24805                args->sigSz = ENCRYPT_LEN;
     24806
     24807                if (IsAtLeastTLSv1_2(ssl)) {
     24808                    ssl->buffers.sig.length = wc_EncodeSignature(
     24809                            ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
     24810                            ssl->buffers.digest.length,
     24811                            TypeHash(ssl->suites->hashAlgo));
     24812                }
     24813
     24814                /* prepend hdr */
     24815                c16toa(args->length, args->verify + args->extraSz);
     24816            }
     24817            #ifdef WC_RSA_PSS
     24818            else if (args->sigAlgo == rsa_pss_sa_algo) {
     24819                XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
     24820                        ssl->buffers.digest.length);
     24821                ssl->buffers.sig.length = ssl->buffers.digest.length;
     24822                args->sigSz = ENCRYPT_LEN;
     24823
     24824                /* prepend hdr */
     24825                c16toa(args->length, args->verify + args->extraSz);
     24826            }
     24827            #endif
     24828        #endif /* !NO_RSA */
     24829        #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
     24830            if (args->sigAlgo == ed25519_sa_algo) {
     24831                ret = Ed25519CheckPubKey(ssl);
     24832                if (ret != 0)
     24833                    goto exit_scv;
     24834            }
     24835        #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
     24836        #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
     24837            if (args->sigAlgo == ed448_sa_algo) {
     24838                ret = Ed448CheckPubKey(ssl);
     24839                if (ret != 0)
     24840                    goto exit_scv;
     24841            }
     24842        #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
     24843
     24844            /* Advance state and proceed */
     24845            ssl->options.asyncState = TLS_ASYNC_DO;
     24846        } /* case TLS_ASYNC_BUILD */
     24847        FALL_THROUGH;
     24848
     24849        case TLS_ASYNC_DO:
     24850        {
     24851        #ifdef HAVE_ECC
     24852           if (ssl->hsType == DYNAMIC_TYPE_ECC) {
     24853                ecc_key* key = (ecc_key*)ssl->hsKey;
     24854
     24855                ret = EccSign(ssl,
     24856                    ssl->buffers.digest.buffer, ssl->buffers.digest.length,
     24857                    ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
     24858                    key,
     24859            #ifdef HAVE_PK_CALLBACKS
     24860                    ssl->buffers.key
     24861            #else
     24862                    NULL
     24863            #endif
     24864                );
     24865            }
     24866        #endif /* HAVE_ECC */
     24867        #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
     24868           if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
     24869                ed25519_key* key = (ed25519_key*)ssl->hsKey;
     24870
     24871                ret = Ed25519Sign(ssl,
     24872                    ssl->hsHashes->messages, ssl->hsHashes->length,
     24873                    ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
     24874                    key,
     24875            #ifdef HAVE_PK_CALLBACKS
     24876                    ssl->buffers.key
     24877            #else
     24878                    NULL
     24879            #endif
     24880                );
     24881            }
     24882        #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
     24883        #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
     24884           if (ssl->hsType == DYNAMIC_TYPE_ED448) {
     24885                ed448_key* key = (ed448_key*)ssl->hsKey;
     24886
     24887                ret = Ed448Sign(ssl,
     24888                    ssl->hsHashes->messages, ssl->hsHashes->length,
     24889                    ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
     24890                    key,
     24891            #ifdef HAVE_PK_CALLBACKS
     24892                    ssl->buffers.key
     24893            #else
     24894                    NULL
     24895            #endif
     24896                );
     24897            }
     24898        #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
     24899        #ifndef NO_RSA
     24900            if (ssl->hsType == DYNAMIC_TYPE_RSA) {
     24901                RsaKey* key = (RsaKey*)ssl->hsKey;
     24902
     24903                /* restore verify pointer */
     24904                args->verify = &args->output[args->idx];
     24905
     24906                ret = RsaSign(ssl,
     24907                    ssl->buffers.sig.buffer, ssl->buffers.sig.length,
     24908                    args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
     24909                    args->sigAlgo, ssl->suites->hashAlgo, key,
     24910                    ssl->buffers.key
     24911                );
     24912            }
     24913        #endif /* !NO_RSA */
     24914
     24915            /* Check for error */
     24916            if (ret != 0) {
     24917                goto exit_scv;
     24918            }
     24919
     24920            /* Advance state and proceed */
     24921            ssl->options.asyncState = TLS_ASYNC_VERIFY;
     24922        } /* case TLS_ASYNC_DO */
     24923        FALL_THROUGH;
     24924
     24925        case TLS_ASYNC_VERIFY:
     24926        {
     24927            /* restore verify pointer */
     24928            args->verify = &args->output[args->idx];
     24929
     24930            switch (ssl->hsType) {
     24931        #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
     24932            #ifdef HAVE_ECC
     24933                case DYNAMIC_TYPE_ECC:
     24934            #endif
     24935            #ifdef HAVE_ED25519
     24936                case DYNAMIC_TYPE_ED25519:
     24937            #endif
     24938            #ifdef HAVE_ED448
     24939                case DYNAMIC_TYPE_ED448:
     24940            #endif
     24941                    args->length = (word16)ssl->buffers.sig.length;
     24942                    /* prepend hdr */
     24943                    c16toa(args->length, args->verify + args->extraSz);
     24944                    XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
     24945                            ssl->buffers.sig.buffer, ssl->buffers.sig.length);
     24946                    break;
     24947        #endif
     24948            #ifndef NO_RSA
     24949                case DYNAMIC_TYPE_RSA:
     24950                {
     24951                    RsaKey* key = (RsaKey*)ssl->hsKey;
     24952
     24953                    if (args->verifySig == NULL) {
     24954                        args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
     24955                                          DYNAMIC_TYPE_SIGNATURE);
     24956                        if (args->verifySig == NULL) {
     24957                            ERROR_OUT(MEMORY_E, exit_scv);
     24958                        }
     24959                        XMEMCPY(args->verifySig, args->verify + args->extraSz +
     24960                                                    VERIFY_HEADER, args->sigSz);
     24961                    }
     24962
     24963                    /* check for signature faults */
     24964                    ret = VerifyRsaSign(ssl,
     24965                        args->verifySig, args->sigSz,
     24966                        ssl->buffers.sig.buffer, ssl->buffers.sig.length,
     24967                        args->sigAlgo, ssl->suites->hashAlgo, key,
     24968                        ssl->buffers.key
     24969                    );
     24970                    break;
     24971                }
     24972            #endif /* !NO_RSA */
     24973                default:
     24974                    break;
     24975            }
     24976
     24977            /* Check for error */
     24978            if (ret != 0) {
     24979                goto exit_scv;
     24980            }
     24981
     24982            /* Advance state and proceed */
     24983            ssl->options.asyncState = TLS_ASYNC_FINALIZE;
     24984        } /* case TLS_ASYNC_VERIFY */
     24985        FALL_THROUGH;
     24986
     24987        case TLS_ASYNC_FINALIZE:
     24988        {
     24989            if (args->output == NULL) {
     24990                ERROR_OUT(BUFFER_ERROR, exit_scv);
     24991            }
     24992            AddHeaders(args->output, (word32)args->length + args->extraSz +
     24993                                        VERIFY_HEADER, certificate_verify, ssl);
     24994
     24995            args->sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ +
     24996                           (word32)args->length + args->extraSz + VERIFY_HEADER;
     24997
     24998        #ifdef WOLFSSL_DTLS
     24999            if (ssl->options.dtls) {
     25000                args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
     25001            }
     25002        #endif
     25003
     25004            if (IsEncryptionOn(ssl, 1)) {
     25005                int recordHeaderSz = RECORD_HEADER_SZ;
     25006
     25007                if (ssl->options.dtls)
     25008                    recordHeaderSz += DTLS_RECORD_EXTRA;
     25009                args->inputSz = args->sendSz - recordHeaderSz;
     25010                                /* build msg adds rec hdr */
     25011                args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
     25012                                                       DYNAMIC_TYPE_IN_BUFFER);
     25013                if (args->input == NULL) {
     25014                    ERROR_OUT(MEMORY_E, exit_scv);
     25015                }
     25016
     25017                XMEMCPY(args->input, args->output + recordHeaderSz,
     25018                                                                args->inputSz);
     25019            }
     25020
     25021            /* Advance state and proceed */
     25022            ssl->options.asyncState = TLS_ASYNC_END;
     25023        } /* case TLS_ASYNC_FINALIZE */
     25024        FALL_THROUGH;
     25025
     25026        case TLS_ASYNC_END:
     25027        {
     25028            if (IsEncryptionOn(ssl, 1)) {
     25029            #ifdef WOLFSSL_DTLS
     25030                if (IsDtlsNotSctpMode(ssl) &&
     25031                        (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, certificate_verify)) != 0) {
     25032                    goto exit_scv;
     25033                }
     25034            #endif
     25035                ret = BuildMessage(ssl, args->output,
     25036                                      MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA,
     25037                                      args->input, args->inputSz, handshake,
     25038                                      1, 0, 1, CUR_ORDER);
     25039            #ifdef WOLFSSL_ASYNC_CRYPT
     25040                if (ret == WC_PENDING_E)
     25041                    goto exit_scv;
     25042            #endif
     25043
     25044                XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     25045                args->input = NULL;  /* make sure its not double free'd on cleanup */
     25046
     25047                if (ret >= 0) {
     25048                    args->sendSz = ret;
     25049                    ret = 0;
     25050                }
     25051            }
     25052            else {
     25053            #ifdef WOLFSSL_DTLS
     25054                if (IsDtlsNotSctpMode(ssl)) {
     25055                    ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz, certificate_verify);
     25056                }
     25057                if (ret == 0 && ssl->options.dtls)
     25058                    DtlsSEQIncrement(ssl, CUR_ORDER);
     25059            #endif
     25060                if (ret == 0)
     25061                    ret = HashOutput(ssl, args->output, args->sendSz, 0);
     25062            }
     25063
     25064            if (ret != 0) {
     25065                goto exit_scv;
     25066            }
     25067
     25068        #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
     25069            if (ssl->hsInfoOn)
     25070                AddPacketName(ssl, "CertificateVerify");
     25071            if (ssl->toInfoOn)
     25072                AddPacketInfo(ssl, "CertificateVerify", handshake,
     25073                            args->output, args->sendSz, WRITE_PROTO, ssl->heap);
     25074        #endif
     25075
     25076            ssl->buffers.outputBuffer.length += args->sendSz;
     25077
     25078            if (!ssl->options.groupMessages) {
     25079                ret = SendBuffered(ssl);
     25080            }
     25081            break;
     25082        }
     25083        default:
     25084            ret = INPUT_CASE_ERROR;
     25085    } /* switch(ssl->options.asyncState) */
     25086
     25087exit_scv:
     25088
     25089    WOLFSSL_LEAVE("SendCertificateVerify", ret);
     25090    WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
     25091
     25092#ifdef WOLFSSL_ASYNC_CRYPT
     25093    /* Handle async operation */
     25094    if (ret == WC_PENDING_E) {
     25095        return ret;
     25096    }
     25097#endif /* WOLFSSL_ASYNC_CRYPT */
     25098
     25099    /* Digest is not allocated, so do this to prevent free */
     25100    ssl->buffers.digest.buffer = NULL;
     25101    ssl->buffers.digest.length = 0;
     25102
     25103    /* Final cleanup */
     25104    FreeScvArgs(ssl, args);
     25105    FreeKeyExchange(ssl);
     25106
     25107    return ret;
     25108}
     25109#endif /* WOLFSSL_NO_CLIENT_AUTH */
     25110
     25111#endif /* WOLFSSL_NO_TLS12 */
     25112
     25113#endif /* NO_CERTS */
     25114
     25115
     25116#ifdef HAVE_SESSION_TICKET
     25117int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
     25118{
     25119    /* Free old dynamic ticket if we already had one */
     25120    if (ssl->session.isDynamic) {
     25121        XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
     25122        ssl->session.ticket = ssl->session.staticTicket;
     25123        ssl->session.isDynamic = 0;
     25124    }
     25125
     25126    if (length > sizeof(ssl->session.staticTicket)) {
     25127        byte* sessionTicket =
     25128                   (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
     25129        if (sessionTicket == NULL)
     25130            return MEMORY_E;
     25131        ssl->session.ticket = sessionTicket;
     25132        ssl->session.isDynamic = 1;
     25133    }
     25134    ssl->session.ticketLen = (word16)length;
     25135
     25136    if (length > 0) {
     25137        XMEMCPY(ssl->session.ticket, ticket, length);
     25138        if (ssl->session_ticket_cb != NULL) {
     25139            ssl->session_ticket_cb(ssl,
     25140                                   ssl->session.ticket, ssl->session.ticketLen,
     25141                                   ssl->session_ticket_ctx);
     25142        }
     25143        /* Create a fake sessionID based on the ticket, this will
     25144         * supersede the existing session cache info. */
     25145        ssl->options.haveSessionId = 1;
     25146#ifdef WOLFSSL_TLS13
     25147        if (ssl->options.tls1_3) {
     25148            XMEMCPY(ssl->session.sessionID,
     25149                                 ssl->session.ticket + length - ID_LEN, ID_LEN);
     25150        }
     25151        else
     25152#endif
     25153            XMEMCPY(ssl->arrays->sessionID,
     25154                                 ssl->session.ticket + length - ID_LEN, ID_LEN);
     25155    }
     25156
     25157    return 0;
     25158}
     25159
     25160#ifndef WOLFSSL_NO_TLS12
     25161
     25162/* handle processing of session_ticket (4) */
     25163static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
     25164    word32 size)
     25165{
     25166    word32 begin = *inOutIdx;
     25167    word32 lifetime;
     25168    word16 length;
     25169    int    ret;
     25170
     25171    if (ssl->expect_session_ticket == 0) {
     25172        WOLFSSL_MSG("Unexpected session ticket");
     25173        return SESSION_TICKET_EXPECT_E;
     25174    }
     25175
     25176    if (OPAQUE32_LEN > size)
     25177        return BUFFER_ERROR;
     25178
     25179    ato32(input + *inOutIdx, &lifetime);
     25180    *inOutIdx += OPAQUE32_LEN;
     25181
     25182    if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
     25183        return BUFFER_ERROR;
     25184
     25185    ato16(input + *inOutIdx, &length);
     25186    *inOutIdx += OPAQUE16_LEN;
     25187
     25188    if ((*inOutIdx - begin) + length > size)
     25189        return BUFFER_ERROR;
     25190
     25191    if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
     25192        return ret;
     25193    *inOutIdx += length;
     25194    if (length > 0) {
     25195        ssl->timeout = lifetime;
     25196#ifndef NO_SESSION_CACHE
     25197        AddSession(ssl);
     25198#endif
     25199    }
     25200
     25201    if (IsEncryptionOn(ssl, 0)) {
     25202        *inOutIdx += ssl->keys.padSz;
     25203    #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
     25204        if (ssl->options.startedETMRead)
     25205            *inOutIdx += MacSize(ssl);
     25206    #endif
     25207    }
     25208
     25209    ssl->expect_session_ticket = 0;
     25210
     25211    return 0;
     25212}
     25213
     25214#endif /* !WOLFSSL_NO_TLS12 */
     25215
     25216#endif /* HAVE_SESSION_TICKET */
     25217
     25218#endif /* NO_WOLFSSL_CLIENT */
    2339925219
    2340025220#ifndef NO_CERTS
     
    2344325263#endif /* HAVE_PK_CALLBACKS */
    2344425264
    23445 #ifndef WOLFSSL_NO_TLS12
    23446 
    23447 #ifndef WOLFSSL_NO_CLIENT_AUTH
    23448 typedef struct ScvArgs {
    23449     byte*  output; /* not allocated */
    23450 #ifndef NO_RSA
    23451     byte*  verifySig;
    23452 #endif
    23453     byte*  verify; /* not allocated */
    23454     byte*  input;
    23455     word32 idx;
    23456     word32 extraSz;
    23457     word32 sigSz;
    23458     int    sendSz;
    23459     int    inputSz;
    23460     word16 length;
    23461     byte   sigAlgo;
    23462 } ScvArgs;
    23463 
    23464 static void FreeScvArgs(WOLFSSL* ssl, void* pArgs)
    23465 {
    23466     ScvArgs* args = (ScvArgs*)pArgs;
    23467 
    23468     (void)ssl;
    23469 
    23470 #ifndef NO_RSA
    23471     if (args->verifySig) {
    23472         XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE);
    23473         args->verifySig = NULL;
    23474     }
    23475 #endif
    23476     if (args->input) {
    23477         XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    23478         args->input = NULL;
    23479     }
    23480 }
    23481 
    23482 /* handle generation of certificate_verify (15) */
    23483 int SendCertificateVerify(WOLFSSL* ssl)
    23484 {
    23485     int ret = 0;
    23486 #ifdef WOLFSSL_ASYNC_CRYPT
    23487     ScvArgs* args = (ScvArgs*)ssl->async.args;
    23488     typedef char args_test[sizeof(ssl->async.args) >= sizeof(*args) ? 1 : -1];
    23489     (void)sizeof(args_test);
    23490 #else
    23491     ScvArgs  args[1];
    23492 #endif
    23493 
    23494     WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND);
    23495     WOLFSSL_ENTER("SendCertificateVerify");
    23496 
    23497 #ifdef WOLFSSL_ASYNC_CRYPT
    23498     ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState);
    23499     if (ret != WC_NOT_PENDING_E) {
    23500         /* Check for error */
    23501         if (ret < 0)
    23502             goto exit_scv;
    23503     }
    23504     else
    23505 #endif
    23506     {
    23507         /* Reset state */
    23508         ret = 0;
    23509         ssl->options.asyncState = TLS_ASYNC_BEGIN;
    23510         XMEMSET(args, 0, sizeof(ScvArgs));
    23511     #ifdef WOLFSSL_ASYNC_CRYPT
    23512         ssl->async.freeArgs = FreeScvArgs;
    23513     #endif
    23514     }
    23515 
    23516     switch(ssl->options.asyncState)
    23517     {
    23518         case TLS_ASYNC_BEGIN:
    23519         {
    23520             if (ssl->options.sendVerify == SEND_BLANK_CERT) {
    23521                 return 0;  /* sent blank cert, can't verify */
    23522             }
    23523 
    23524             args->sendSz = MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA;
    23525             if (IsEncryptionOn(ssl, 1)) {
    23526                 args->sendSz += MAX_MSG_EXTRA;
    23527             }
    23528 
    23529             /* check for available size */
    23530             if ((ret = CheckAvailableSize(ssl, args->sendSz)) != 0) {
    23531                 goto exit_scv;
    23532             }
    23533 
    23534             /* get output buffer */
    23535             args->output = ssl->buffers.outputBuffer.buffer +
    23536                            ssl->buffers.outputBuffer.length;
    23537 
    23538             /* Advance state and proceed */
    23539             ssl->options.asyncState = TLS_ASYNC_BUILD;
    23540         } /* case TLS_ASYNC_BEGIN */
    23541         FALL_THROUGH;
    23542 
    23543         case TLS_ASYNC_BUILD:
    23544         {
    23545             ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
    23546             if (ret != 0) {
    23547                 goto exit_scv;
    23548             }
    23549 
    23550             if (ssl->buffers.key == NULL) {
    23551             #ifdef HAVE_PK_CALLBACKS
    23552                 if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx))
    23553                     args->length = GetPrivateKeySigSize(ssl);
    23554                 else
    23555             #endif
    23556                     ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
    23557             }
    23558             else {
    23559                 /* Decode private key. */
    23560                 ret = DecodePrivateKey(ssl, &args->length);
    23561                 if (ret != 0) {
    23562                     goto exit_scv;
    23563                 }
    23564             }
    23565 
    23566             if (args->length == 0) {
    23567                 ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
    23568             }
    23569 
    23570             /* idx is used to track verify pointer offset to output */
    23571             args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
    23572             args->verify = &args->output[RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ];
    23573             args->extraSz = 0;  /* tls 1.2 hash/sig */
    23574 
    23575             /* build encoded signature buffer */
    23576             ssl->buffers.sig.length = MAX_ENCODED_SIG_SZ;
    23577             ssl->buffers.sig.buffer = (byte*)XMALLOC(ssl->buffers.sig.length,
    23578                                         ssl->heap, DYNAMIC_TYPE_SIGNATURE);
    23579             if (ssl->buffers.sig.buffer == NULL) {
    23580                 ERROR_OUT(MEMORY_E, exit_scv);
    23581             }
    23582 
    23583         #ifdef WOLFSSL_DTLS
    23584             if (ssl->options.dtls) {
    23585                 args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
    23586                 args->verify += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
    23587             }
    23588         #endif
    23589 
    23590     #ifndef NO_OLD_TLS
    23591         #ifndef NO_SHA
    23592             /* old tls default */
    23593             SetDigest(ssl, sha_mac);
    23594         #endif
    23595     #else
    23596         #ifndef NO_SHA256
    23597             /* new tls default */
    23598             SetDigest(ssl, sha256_mac);
    23599         #endif
    23600     #endif /* !NO_OLD_TLS */
    23601 
    23602             if (ssl->hsType == DYNAMIC_TYPE_RSA) {
    23603         #ifdef WC_RSA_PSS
    23604                 if (IsAtLeastTLSv1_2(ssl) &&
    23605                                 (ssl->pssAlgo & (1 << ssl->suites->hashAlgo))) {
    23606                     args->sigAlgo = rsa_pss_sa_algo;
    23607                 }
    23608                 else
    23609         #endif
    23610                     args->sigAlgo = rsa_sa_algo;
    23611             }
    23612             else if (ssl->hsType == DYNAMIC_TYPE_ECC)
    23613                 args->sigAlgo = ecc_dsa_sa_algo;
    23614             else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
    23615                 args->sigAlgo = ed25519_sa_algo;
    23616             else if (ssl->hsType == DYNAMIC_TYPE_ED448)
    23617                 args->sigAlgo = ed448_sa_algo;
    23618 
    23619             if (IsAtLeastTLSv1_2(ssl)) {
    23620                 EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo,
    23621                              args->verify);
    23622                 args->extraSz = HASH_SIG_SIZE;
    23623                 SetDigest(ssl, ssl->suites->hashAlgo);
    23624             }
    23625         #ifndef NO_OLD_TLS
    23626             else {
    23627                 /* if old TLS load MD5 and SHA hash as value to sign */
    23628                 XMEMCPY(ssl->buffers.sig.buffer,
    23629                     (byte*)ssl->hsHashes->certHashes.md5, FINISHED_SZ);
    23630             }
    23631         #endif
    23632 
    23633         #ifndef NO_RSA
    23634             if (args->sigAlgo == rsa_sa_algo) {
    23635                 ssl->buffers.sig.length = FINISHED_SZ;
    23636                 args->sigSz = ENCRYPT_LEN;
    23637 
    23638                 if (IsAtLeastTLSv1_2(ssl)) {
    23639                     ssl->buffers.sig.length = wc_EncodeSignature(
    23640                             ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
    23641                             ssl->buffers.digest.length,
    23642                             TypeHash(ssl->suites->hashAlgo));
    23643                 }
    23644 
    23645                 /* prepend hdr */
    23646                 c16toa(args->length, args->verify + args->extraSz);
    23647             }
    23648             #ifdef WC_RSA_PSS
    23649             else if (args->sigAlgo == rsa_pss_sa_algo) {
    23650                 XMEMCPY(ssl->buffers.sig.buffer, ssl->buffers.digest.buffer,
    23651                         ssl->buffers.digest.length);
    23652                 ssl->buffers.sig.length = ssl->buffers.digest.length;
    23653                 args->sigSz = ENCRYPT_LEN;
    23654 
    23655                 /* prepend hdr */
    23656                 c16toa(args->length, args->verify + args->extraSz);
    23657             }
    23658             #endif
    23659         #endif /* !NO_RSA */
    23660         #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
    23661             if (args->sigAlgo == ed25519_sa_algo) {
    23662                 ret = Ed25519CheckPubKey(ssl);
    23663                 if (ret != 0)
    23664                     goto exit_scv;
    23665             }
    23666         #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
    23667         #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
    23668             if (args->sigAlgo == ed448_sa_algo) {
    23669                 ret = Ed448CheckPubKey(ssl);
    23670                 if (ret != 0)
    23671                     goto exit_scv;
    23672             }
    23673         #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
    23674 
    23675             /* Advance state and proceed */
    23676             ssl->options.asyncState = TLS_ASYNC_DO;
    23677         } /* case TLS_ASYNC_BUILD */
    23678         FALL_THROUGH;
    23679 
    23680         case TLS_ASYNC_DO:
    23681         {
    23682         #ifdef HAVE_ECC
    23683            if (ssl->hsType == DYNAMIC_TYPE_ECC) {
    23684                 ecc_key* key = (ecc_key*)ssl->hsKey;
    23685 
    23686                 ret = EccSign(ssl,
    23687                     ssl->buffers.digest.buffer, ssl->buffers.digest.length,
    23688                     ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
    23689                     key,
    23690             #ifdef HAVE_PK_CALLBACKS
    23691                     ssl->buffers.key
    23692             #else
    23693                     NULL
    23694             #endif
    23695                 );
    23696             }
    23697         #endif /* HAVE_ECC */
    23698         #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)
    23699            if (ssl->hsType == DYNAMIC_TYPE_ED25519) {
    23700                 ed25519_key* key = (ed25519_key*)ssl->hsKey;
    23701 
    23702                 ret = Ed25519Sign(ssl,
    23703                     ssl->hsHashes->messages, ssl->hsHashes->length,
    23704                     ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
    23705                     key,
    23706             #ifdef HAVE_PK_CALLBACKS
    23707                     ssl->buffers.key
    23708             #else
    23709                     NULL
    23710             #endif
    23711                 );
    23712             }
    23713         #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */
    23714         #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH)
    23715            if (ssl->hsType == DYNAMIC_TYPE_ED448) {
    23716                 ed448_key* key = (ed448_key*)ssl->hsKey;
    23717 
    23718                 ret = Ed448Sign(ssl,
    23719                     ssl->hsHashes->messages, ssl->hsHashes->length,
    23720                     ssl->buffers.sig.buffer, (word32*)&ssl->buffers.sig.length,
    23721                     key,
    23722             #ifdef HAVE_PK_CALLBACKS
    23723                     ssl->buffers.key
    23724             #else
    23725                     NULL
    23726             #endif
    23727                 );
    23728             }
    23729         #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */
    23730         #ifndef NO_RSA
    23731             if (ssl->hsType == DYNAMIC_TYPE_RSA) {
    23732                 RsaKey* key = (RsaKey*)ssl->hsKey;
    23733 
    23734                 /* restore verify pointer */
    23735                 args->verify = &args->output[args->idx];
    23736 
    23737                 ret = RsaSign(ssl,
    23738                     ssl->buffers.sig.buffer, ssl->buffers.sig.length,
    23739                     args->verify + args->extraSz + VERIFY_HEADER, &args->sigSz,
    23740                     args->sigAlgo, ssl->suites->hashAlgo, key,
    23741                     ssl->buffers.key
    23742                 );
    23743             }
    23744         #endif /* !NO_RSA */
    23745 
    23746             /* Check for error */
    23747             if (ret != 0) {
    23748                 goto exit_scv;
    23749             }
    23750 
    23751             /* Advance state and proceed */
    23752             ssl->options.asyncState = TLS_ASYNC_VERIFY;
    23753         } /* case TLS_ASYNC_DO */
    23754         FALL_THROUGH;
    23755 
    23756         case TLS_ASYNC_VERIFY:
    23757         {
    23758             /* restore verify pointer */
    23759             args->verify = &args->output[args->idx];
    23760 
    23761             switch (ssl->hsType) {
    23762         #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
    23763             #ifdef HAVE_ECC
    23764                 case DYNAMIC_TYPE_ECC:
    23765             #endif
    23766             #ifdef HAVE_ED25519
    23767                 case DYNAMIC_TYPE_ED25519:
    23768             #endif
    23769             #ifdef HAVE_ED448
    23770                 case DYNAMIC_TYPE_ED448:
    23771             #endif
    23772                     args->length = (word16)ssl->buffers.sig.length;
    23773                     /* prepend hdr */
    23774                     c16toa(args->length, args->verify + args->extraSz);
    23775                     XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER,
    23776                             ssl->buffers.sig.buffer, ssl->buffers.sig.length);
    23777                     break;
    23778         #endif
    23779             #ifndef NO_RSA
    23780                 case DYNAMIC_TYPE_RSA:
    23781                 {
    23782                     RsaKey* key = (RsaKey*)ssl->hsKey;
    23783 
    23784                     if (args->verifySig == NULL) {
    23785                         args->verifySig = (byte*)XMALLOC(args->sigSz, ssl->heap,
    23786                                           DYNAMIC_TYPE_SIGNATURE);
    23787                         if (args->verifySig == NULL) {
    23788                             ERROR_OUT(MEMORY_E, exit_scv);
    23789                         }
    23790                         XMEMCPY(args->verifySig, args->verify + args->extraSz +
    23791                                                     VERIFY_HEADER, args->sigSz);
    23792                     }
    23793 
    23794                     /* check for signature faults */
    23795                     ret = VerifyRsaSign(ssl,
    23796                         args->verifySig, args->sigSz,
    23797                         ssl->buffers.sig.buffer, ssl->buffers.sig.length,
    23798                         args->sigAlgo, ssl->suites->hashAlgo, key,
    23799                         ssl->buffers.key
    23800                     );
    23801                     break;
    23802                 }
    23803             #endif /* !NO_RSA */
    23804                 default:
    23805                     break;
    23806             }
    23807 
    23808             /* Check for error */
    23809             if (ret != 0) {
    23810                 goto exit_scv;
    23811             }
    23812 
    23813             /* Advance state and proceed */
    23814             ssl->options.asyncState = TLS_ASYNC_FINALIZE;
    23815         } /* case TLS_ASYNC_VERIFY */
    23816         FALL_THROUGH;
    23817 
    23818         case TLS_ASYNC_FINALIZE:
    23819         {
    23820             if (args->output == NULL) {
    23821                 ERROR_OUT(BUFFER_ERROR, exit_scv);
    23822             }
    23823             AddHeaders(args->output, (word32)args->length + args->extraSz +
    23824                                         VERIFY_HEADER, certificate_verify, ssl);
    23825 
    23826             args->sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ +
    23827                            (word32)args->length + args->extraSz + VERIFY_HEADER;
    23828 
    23829         #ifdef WOLFSSL_DTLS
    23830             if (ssl->options.dtls) {
    23831                 args->sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
    23832             }
    23833         #endif
    23834 
    23835             if (IsEncryptionOn(ssl, 1)) {
    23836                 args->inputSz = args->sendSz - RECORD_HEADER_SZ;
    23837                                 /* build msg adds rec hdr */
    23838                 args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
    23839                                                        DYNAMIC_TYPE_IN_BUFFER);
    23840                 if (args->input == NULL) {
    23841                     ERROR_OUT(MEMORY_E, exit_scv);
    23842                 }
    23843 
    23844                 XMEMCPY(args->input, args->output + RECORD_HEADER_SZ,
    23845                                                                 args->inputSz);
    23846             }
    23847 
    23848             /* Advance state and proceed */
    23849             ssl->options.asyncState = TLS_ASYNC_END;
    23850         } /* case TLS_ASYNC_FINALIZE */
    23851         FALL_THROUGH;
    23852 
    23853         case TLS_ASYNC_END:
    23854         {
    23855             if (IsEncryptionOn(ssl, 1)) {
    23856                 ret = BuildMessage(ssl, args->output,
    23857                                       MAX_CERT_VERIFY_SZ + MAX_MSG_EXTRA,
    23858                                       args->input, args->inputSz, handshake,
    23859                                       1, 0, 1);
    23860             #ifdef WOLFSSL_ASYNC_CRYPT
    23861                 if (ret == WC_PENDING_E)
    23862                     goto exit_scv;
    23863             #endif
    23864 
    23865                 XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    23866                 args->input = NULL;  /* make sure its not double free'd on cleanup */
    23867 
    23868                 if (ret >= 0) {
    23869                     args->sendSz = ret;
    23870                     ret = 0;
    23871                 }
    23872             }
    23873             else {
    23874             #ifdef WOLFSSL_DTLS
    23875                 if (ssl->options.dtls)
    23876                     DtlsSEQIncrement(ssl, CUR_ORDER);
    23877             #endif
    23878                 ret = HashOutput(ssl, args->output, args->sendSz, 0);
    23879             }
    23880 
    23881             if (ret != 0) {
    23882                 goto exit_scv;
    23883             }
    23884 
    23885         #ifdef WOLFSSL_DTLS
    23886             if (IsDtlsNotSctpMode(ssl)) {
    23887                 ret = DtlsMsgPoolSave(ssl, args->output, args->sendSz);
    23888             }
    23889         #endif
    23890 
    23891 
    23892         #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
    23893             if (ssl->hsInfoOn)
    23894                 AddPacketName(ssl, "CertificateVerify");
    23895             if (ssl->toInfoOn)
    23896                 AddPacketInfo(ssl, "CertificateVerify", handshake,
    23897                             args->output, args->sendSz, WRITE_PROTO, ssl->heap);
    23898         #endif
    23899 
    23900             ssl->buffers.outputBuffer.length += args->sendSz;
    23901 
    23902             if (!ssl->options.groupMessages) {
    23903                 ret = SendBuffered(ssl);
    23904             }
    23905             break;
    23906         }
    23907         default:
    23908             ret = INPUT_CASE_ERROR;
    23909     } /* switch(ssl->options.asyncState) */
    23910 
    23911 exit_scv:
    23912 
    23913     WOLFSSL_LEAVE("SendCertificateVerify", ret);
    23914     WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND);
    23915 
    23916 #ifdef WOLFSSL_ASYNC_CRYPT
    23917     /* Handle async operation */
    23918     if (ret == WC_PENDING_E) {
    23919         return ret;
    23920     }
    23921 #endif /* WOLFSSL_ASYNC_CRYPT */
    23922 
    23923     /* Digest is not allocated, so do this to prevent free */
    23924     ssl->buffers.digest.buffer = NULL;
    23925     ssl->buffers.digest.length = 0;
    23926 
    23927     /* Final cleanup */
    23928     FreeScvArgs(ssl, args);
    23929     FreeKeyExchange(ssl);
    23930 
    23931     return ret;
    23932 }
    23933 #endif /* WOLFSSL_NO_CLIENT_AUTH */
    23934 
    23935 #endif /* WOLFSSL_NO_TLS12 */
    23936 
    2393725265#endif /* NO_CERTS */
    23938 
    23939 
    23940 #ifdef HAVE_SESSION_TICKET
    23941 int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length)
    23942 {
    23943     /* Free old dynamic ticket if we already had one */
    23944     if (ssl->session.isDynamic) {
    23945         XFREE(ssl->session.ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
    23946         ssl->session.ticket = ssl->session.staticTicket;
    23947         ssl->session.isDynamic = 0;
    23948     }
    23949 
    23950     if (length > sizeof(ssl->session.staticTicket)) {
    23951         byte* sessionTicket =
    23952                    (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
    23953         if (sessionTicket == NULL)
    23954             return MEMORY_E;
    23955         ssl->session.ticket = sessionTicket;
    23956         ssl->session.isDynamic = 1;
    23957     }
    23958     ssl->session.ticketLen = (word16)length;
    23959 
    23960     if (length > 0) {
    23961         XMEMCPY(ssl->session.ticket, ticket, length);
    23962         if (ssl->session_ticket_cb != NULL) {
    23963             ssl->session_ticket_cb(ssl,
    23964                                    ssl->session.ticket, ssl->session.ticketLen,
    23965                                    ssl->session_ticket_ctx);
    23966         }
    23967         /* Create a fake sessionID based on the ticket, this will
    23968          * supersede the existing session cache info. */
    23969         ssl->options.haveSessionId = 1;
    23970 #ifdef WOLFSSL_TLS13
    23971         if (ssl->options.tls1_3) {
    23972             XMEMCPY(ssl->session.sessionID,
    23973                                  ssl->session.ticket + length - ID_LEN, ID_LEN);
    23974         }
    23975         else
    23976 #endif
    23977             XMEMCPY(ssl->arrays->sessionID,
    23978                                  ssl->session.ticket + length - ID_LEN, ID_LEN);
    23979     }
    23980 
    23981     return 0;
    23982 }
    23983 
    23984 #ifndef WOLFSSL_NO_TLS12
    23985 
    23986 /* handle processing of session_ticket (4) */
    23987 static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
    23988     word32 size)
    23989 {
    23990     word32 begin = *inOutIdx;
    23991     word32 lifetime;
    23992     word16 length;
    23993     int    ret;
    23994 
    23995     if (ssl->expect_session_ticket == 0) {
    23996         WOLFSSL_MSG("Unexpected session ticket");
    23997         return SESSION_TICKET_EXPECT_E;
    23998     }
    23999 
    24000     if (OPAQUE32_LEN > size)
    24001         return BUFFER_ERROR;
    24002 
    24003     ato32(input + *inOutIdx, &lifetime);
    24004     *inOutIdx += OPAQUE32_LEN;
    24005 
    24006     if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
    24007         return BUFFER_ERROR;
    24008 
    24009     ato16(input + *inOutIdx, &length);
    24010     *inOutIdx += OPAQUE16_LEN;
    24011 
    24012     if ((*inOutIdx - begin) + length > size)
    24013         return BUFFER_ERROR;
    24014 
    24015     if ((ret = SetTicket(ssl, input + *inOutIdx, length)) != 0)
    24016         return ret;
    24017     *inOutIdx += length;
    24018     if (length > 0) {
    24019         ssl->timeout = lifetime;
    24020 #ifndef NO_SESSION_CACHE
    24021         AddSession(ssl);
    24022 #endif
    24023     }
    24024 
    24025     if (IsEncryptionOn(ssl, 0)) {
    24026         *inOutIdx += ssl->keys.padSz;
    24027     #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
    24028         if (ssl->options.startedETMRead)
    24029             *inOutIdx += MacSize(ssl);
    24030     #endif
    24031     }
    24032 
    24033     ssl->expect_session_ticket = 0;
    24034 
    24035     return 0;
    24036 }
    24037 
    24038 #endif /* !WOLFSSL_NO_TLS12 */
    24039 
    24040 #endif /* HAVE_SESSION_TICKET */
    24041 
    24042 #endif /* NO_WOLFSSL_CLIENT */
    2404325266
    2404425267#ifdef HAVE_ECC
     
    2404625269    word16 GetCurveByOID(int oidSum) {
    2404725270        switch(oidSum) {
    24048     #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
     25271    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
    2404925272        #ifndef NO_ECC_SECP
    2405025273            case ECC_SECP160R1_OID:
     
    2406025283        #endif /* HAVE_ECC_KOBLITZ */
    2406125284    #endif
    24062     #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
     25285    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
    2406325286        #ifndef NO_ECC_SECP
    2406425287            case ECC_SECP192R1_OID:
     
    2407025293        #endif /* HAVE_ECC_KOBLITZ */
    2407125294    #endif
    24072     #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
     25295    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
    2407325296        #ifndef NO_ECC_SECP
    2407425297            case ECC_SECP224R1_OID:
     
    2408025303        #endif /* HAVE_ECC_KOBLITZ */
    2408125304    #endif
    24082     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
     25305    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
    2408325306        #ifndef NO_ECC_SECP
    2408425307            case ECC_SECP256R1_OID:
     
    2409425317        #endif /* HAVE_ECC_BRAINPOOL */
    2409525318    #endif
    24096     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
     25319    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
    2409725320        #ifndef NO_ECC_SECP
    2409825321            case ECC_SECP384R1_OID:
     
    2410425327        #endif /* HAVE_ECC_BRAINPOOL */
    2410525328    #endif
    24106     #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
     25329    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
    2410725330        #ifdef HAVE_ECC_BRAINPOOL
    2410825331            case ECC_BRAINPOOLP512R1_OID:
     
    2411025333        #endif /* HAVE_ECC_BRAINPOOL */
    2411125334    #endif
    24112     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     25335    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
    2411325336        #ifndef NO_ECC_SECP
    2411425337            case ECC_SECP521R1_OID:
     
    2419025413        #ifdef WOLFSSL_DTLS
    2419125414        if (ssl->options.dtls) {
    24192             /* Server Hello should use the same sequence number as the
    24193              * Client Hello. */
    24194             ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
    24195             ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
     25415            if (((ssl->keys.dtls_sequence_number_hi == ssl->keys.curSeq_hi &&
     25416                  ssl->keys.dtls_sequence_number_lo < ssl->keys.curSeq_lo) ||
     25417                 (ssl->keys.dtls_sequence_number_hi < ssl->keys.curSeq_hi))) {
     25418                /* Server Hello should use the same sequence number as the
     25419                 * Client Hello if available. */
     25420                ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi;
     25421                ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo;
     25422            }
    2419625423            idx    += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
    2419725424            sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
     
    2423625463            if (ssl->ctx->method->version.major == SSLv3_MAJOR &&
    2423725464                          ssl->ctx->method->version.minor == TLSv1_2_MINOR &&
     25465#ifdef OPENSSL_EXTRA
     25466                          (wolfSSL_get_options(ssl) & SSL_OP_NO_TLSv1_2) == 0 &&
     25467#endif
    2423825468                                                       !IsAtLeastTLSv1_2(ssl)) {
    2423925469                /* TLS v1.2 capable server downgraded. */
     
    2430625536        if (IsEncryptionOn(ssl, 1)) {
    2430725537            byte* input;
    24308             int   inputSz = idx - RECORD_HEADER_SZ; /* build msg adds rec hdr */
    24309 
     25538            int   inputSz = idx; /* build msg adds rec hdr */
     25539            int   recordHeaderSz = RECORD_HEADER_SZ;
     25540
     25541            if (ssl->options.dtls)
     25542                recordHeaderSz += DTLS_RECORD_EXTRA;
     25543            inputSz -= recordHeaderSz;
    2431025544            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    2431125545            if (input == NULL)
    2431225546                return MEMORY_E;
    2431325547
    24314             XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
     25548            XMEMCPY(input, output + recordHeaderSz, inputSz);
     25549            #ifdef WOLFSSL_DTLS
     25550            if (IsDtlsNotSctpMode(ssl) &&
     25551                    (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) {
     25552                XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     25553                return ret;
     25554            }
     25555            #endif
    2431525556            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
    24316                                   handshake, 1, 0, 0);
     25557                                  handshake, 1, 0, 0, CUR_ORDER);
    2431725558            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    2431825559
     
    2432125562        } else {
    2432225563            #ifdef WOLFSSL_DTLS
     25564                if (IsDtlsNotSctpMode(ssl)) {
     25565                    if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0)
     25566                        return ret;
     25567                }
    2432325568                if (ssl->options.dtls)
    2432425569                    DtlsSEQIncrement(ssl, CUR_ORDER);
     
    2434025585        ssl->buffers.outputBuffer.length += sendSz;
    2434125586
    24342     #ifdef WOLFSSL_DTLS
    24343         if (IsDtlsNotSctpMode(ssl)) {
    24344             if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
    24345                 return ret;
    24346         }
    24347     #endif
    24348 
    2434925587        if (ssl->options.groupMessages)
    2435025588            ret = 0;
     
    2437625614        byte*  output; /* not allocated */
    2437725615    #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
    24378                                            (!defined(NO_DH) && !defined(NO_RSA))
     25616                                                                !defined(NO_RSA)
    2437925617        byte*  sigDataBuf;
    2438025618    #endif
     
    2439125629        word32 sigSz;
    2439225630    #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \
    24393                                            (!defined(NO_DH) && !defined(NO_RSA))
     25631                                                                !defined(NO_RSA)
    2439425632        word32 sigDataSz;
    2439525633    #endif
     
    2453425772                                ERROR_OUT(MEMORY_E, exit_sske);
    2453525773                            }
     25774                            ssl->buffers.serverDH_Pub.length =
     25775                                ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
    2453625776                        }
    2453725777
     
    2454425784                                ERROR_OUT(MEMORY_E, exit_sske);
    2454525785                            }
     25786                            ssl->buffers.serverDH_Priv.length =
     25787                                ssl->buffers.serverDH_P.length + OPAQUE16_LEN;
    2454625788                        }
    2454725789
     
    2553526777                    }
    2553626778                #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
    25537                 #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \
    25538                                                              defined(HAVE_ED448)
     26779                #if defined(HAVE_ECC)  || defined(HAVE_CURVE25519) || \
     26780                                                          defined(HAVE_CURVE448)
    2553926781                    case ecc_diffie_hellman_kea:
    2554026782                    {
     
    2585927101                if (IsEncryptionOn(ssl, 1)) {
    2586027102                    args->inputSz = args->length + HANDSHAKE_HEADER_SZ;
    25861                                                      /* buildmsg adds rechdr */
     27103                    if (ssl->options.dtls)
     27104                        args->inputSz += DTLS_HANDSHAKE_EXTRA;
    2586227105                    args->input = (byte*)XMALLOC(args->inputSz, ssl->heap,
    2586327106                                                        DYNAMIC_TYPE_IN_BUFFER);
     
    2587027113                    }
    2587127114
    25872                     XMEMCPY(args->input, args->output + RECORD_HEADER_SZ,
     27115                    if (!ssl->options.dtls)
     27116                        XMEMCPY(args->input, args->output + RECORD_HEADER_SZ,
    2587327117                                                                 args->inputSz);
     27118                    else
     27119                        XMEMCPY(args->input, args->output + DTLS_RECORD_HEADER_SZ,
     27120                                                                 args->inputSz);
     27121
     27122                    #ifdef WOLFSSL_DTLS
     27123                    if (IsDtlsNotSctpMode(ssl) &&
     27124                        (ret = DtlsMsgPoolSave(ssl, args->input, args->inputSz, server_key_exchange))
     27125                            != 0) {
     27126                        goto exit_sske;
     27127                    }
     27128                    #endif
    2587427129                    ret = BuildMessage(ssl, args->output, args->sendSz,
    25875                                 args->input, args->inputSz, handshake, 1, 0, 0);
     27130                                args->input, args->inputSz, handshake, 1, 0, 0, CUR_ORDER);
    2587627131                    XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    2587727132                    args->input = NULL;
     
    2588727142                    if (IsDtlsNotSctpMode(ssl)) {
    2588827143                        if ((ret = DtlsMsgPoolSave(ssl,
    25889                                             args->output, args->sendSz)) != 0) {
     27144                                            args->output, args->sendSz, server_key_exchange)) != 0) {
    2589027145                            goto exit_sske;
    2589127146                        }
     
    2594327198
    2594427199        /* Final cleanup */
     27200        if (args->input != NULL) {
     27201            XFREE(args->input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     27202            args->input = NULL;
     27203        }
    2594527204        FreeSskeArgs(ssl, args);
    2594627205        FreeKeyExchange(ssl);
     
    2609827357#ifdef WOLFSSL_TLS13
    2609927358        if (IsAtLeastTLSv1_3(ssl->version) &&
    26100             ssl->options.side == WOLFSSL_SERVER_END) {
     27359                                      ssl->options.side == WOLFSSL_SERVER_END) {
     27360    #ifdef HAVE_SUPPORTED_CURVES
    2610127361            /* Try to establish a key share. */
    2610227362            int ret = TLSX_KeyShare_Establish(ssl);
     
    2610527365            else if (ret != 0)
    2610627366                return 0;
     27367    #endif
    2610727368        }
    2610827369        else if (first == TLS13_BYTE || (first == ECC_BYTE &&
     
    2628827549        if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
    2628927550            return BUFFER_ERROR;
     27551        /* Make sure the suiteSz is a multiple of 3. (Old Client Hello) */
     27552        if (clSuites.suiteSz % 3 != 0)
     27553            return BUFFER_ERROR;
    2629027554        clSuites.hashSigAlgoSz = 0;
    2629127555
     
    2642727691                SendAlert(ssl, alert_fatal, handshake_failure);
    2642827692            #endif
     27693                #ifdef HAVE_EXT_CACHE
     27694                    wolfSSL_SESSION_free(session);
     27695                #endif
    2642927696                return EXT_MASTER_SECRET_NEEDED_E;
    2643027697            }
     
    2651927786        ssl->chVersion = pv;   /* store */
    2652027787#ifdef WOLFSSL_DTLS
    26521         if (IsDtlsNotSctpMode(ssl)) {
     27788        if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
    2652227789            #if defined(NO_SHA) && defined(NO_SHA256)
    2652327790                #error "DTLS needs either SHA or SHA-256"
     
    2653527802                                ssl->buffers.dtlsCookieSecret.buffer,
    2653627803                                ssl->buffers.dtlsCookieSecret.length);
    26537             if (ret != 0) return ret;
     27804            if (ret != 0) goto out;
    2653827805            ret = wc_HmacUpdate(&cookieHmac,
    2653927806                                (const byte*)ssl->buffers.dtlsCtx.peer.sa,
    2654027807                                ssl->buffers.dtlsCtx.peer.sz);
    26541             if (ret != 0) return ret;
     27808            if (ret != 0) goto out;
    2654227809            ret = wc_HmacUpdate(&cookieHmac, input + i, OPAQUE16_LEN);
    26543             if (ret != 0) return ret;
     27810            if (ret != 0) goto out;
    2654427811        }
    2654527812#endif /* WOLFSSL_DTLS */
     
    2656127828            if (!ssl->options.downgrade) {
    2656227829                WOLFSSL_MSG("Client trying to connect with lesser version");
    26563                 return VERSION_ERROR;
     27830                ret = VERSION_ERROR;
     27831                goto out;
    2656427832            }
    2656527833            if (pv.minor < ssl->options.minDowngrade) {
    2656627834                WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
    26567                 return VERSION_ERROR;
     27835                ret = VERSION_ERROR;
     27836                goto out;
    2656827837            }
    2656927838
     
    2663427903                (ssl->options.mask & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
    2663527904                WOLFSSL_MSG("\tError, option set to not allow SSLv3");
    26636                 return VERSION_ERROR;
     27905                ret = VERSION_ERROR;
     27906                goto out;
    2663727907            }
    2663827908
    2663927909            if (ssl->version.minor < ssl->options.minDowngrade) {
    2664027910                WOLFSSL_MSG("\tversion below minimum allowed, fatal error");
    26641                 return VERSION_ERROR;
     27911                ret = VERSION_ERROR;
     27912                goto out;
    2664227913            }
    2664327914
     
    2666927940        XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
    2667027941#ifdef WOLFSSL_DTLS
    26671         if (IsDtlsNotSctpMode(ssl)) {
     27942        if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
    2667227943            ret = wc_HmacUpdate(&cookieHmac, input + i, RAN_LEN);
    26673             if (ret != 0) return ret;
     27944            if (ret != 0) goto out;
    2667427945        }
    2667527946#endif /* WOLFSSL_DTLS */
     
    2669727968
    2669827969        if (b == ID_LEN || bogusID) {
    26699             if ((i - begin) + b > helloSz)
    26700                 return BUFFER_ERROR;
     27970            if ((i - begin) + b > helloSz) {
     27971                ret = BUFFER_ERROR;
     27972                goto out;
     27973            }
    2670127974
    2670227975            XMEMCPY(ssl->arrays->sessionID, input + i, b);
    2670327976#ifdef WOLFSSL_DTLS
    26704             if (IsDtlsNotSctpMode(ssl)) {
     27977            if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) &&
     27978                    !ssl->options.resuming) {
    2670527979                ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
    26706                 if (ret != 0) return ret;
     27980                if (ret != 0) goto out;
    2670727981            }
    2670827982#endif /* WOLFSSL_DTLS */
     
    2671427988        else if (b) {
    2671527989            WOLFSSL_MSG("Invalid session ID size");
    26716             return BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
     27990            ret = BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */
     27991            goto out;
    2671727992        }
    2671827993
     
    2672127996            if (ssl->options.dtls) {
    2672227997
    26723                 if ((i - begin) + OPAQUE8_LEN > helloSz)
    26724                     return BUFFER_ERROR;
     27998                if ((i - begin) + OPAQUE8_LEN > helloSz) {
     27999                    ret = BUFFER_ERROR;
     28000                    goto out;
     28001                }
    2672528002
    2672628003                peerCookieSz = input[i++];
    2672728004
    2672828005                if (peerCookieSz) {
    26729                     if (peerCookieSz > MAX_COOKIE_LEN)
    26730                         return BUFFER_ERROR;
    26731 
    26732                     if ((i - begin) + peerCookieSz > helloSz)
    26733                         return BUFFER_ERROR;
     28006                    if (peerCookieSz > MAX_COOKIE_LEN) {
     28007                        ret = BUFFER_ERROR;
     28008                        goto out;
     28009                    }
     28010
     28011                    if ((i - begin) + peerCookieSz > helloSz) {
     28012                        ret = BUFFER_ERROR;
     28013                        goto out;
     28014                    }
    2673428015
    2673528016                    XMEMCPY(peerCookie, input + i, peerCookieSz);
     
    2674128022
    2674228023        /* suites */
    26743         if ((i - begin) + OPAQUE16_LEN > helloSz)
    26744             return BUFFER_ERROR;
     28024        if ((i - begin) + OPAQUE16_LEN > helloSz) {
     28025            ret = BUFFER_ERROR;
     28026            goto out;
     28027        }
    2674528028
    2674628029        ato16(&input[i], &clSuites.suiteSz);
    2674728030        i += OPAQUE16_LEN;
    2674828031
     28032        /* Cipher suite lists are always multiples of two in length. */
     28033        if (clSuites.suiteSz % 2 != 0) {
     28034            ret = BUFFER_ERROR;
     28035            goto out;
     28036        }
     28037
    2674928038        /* suites and compression length check */
    26750         if ((i - begin) + clSuites.suiteSz + OPAQUE8_LEN > helloSz)
    26751             return BUFFER_ERROR;
    26752 
    26753         if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ)
    26754             return BUFFER_ERROR;
     28039        if ((i - begin) + clSuites.suiteSz + OPAQUE8_LEN > helloSz) {
     28040            ret = BUFFER_ERROR;
     28041            goto out;
     28042        }
     28043
     28044        if (clSuites.suiteSz > WOLFSSL_MAX_SUITE_SZ) {
     28045            ret = BUFFER_ERROR;
     28046            goto out;
     28047        }
    2675528048
    2675628049        XMEMCPY(clSuites.suites, input + i, clSuites.suiteSz);
     
    2676428057            ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
    2676528058            if (ret != WOLFSSL_SUCCESS)
    26766                 return ret;
     28059                goto out;
    2676728060
    2676828061            extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
     
    2678128074                WOLFSSL_MSG("Client trying to connect with lesser version");
    2678228075                SendAlert(ssl, alert_fatal, inappropriate_fallback);
    26783                 return VERSION_ERROR;
     28076                ret = VERSION_ERROR;
     28077                goto out;
    2678428078            }
    2678528079        }
     
    2678728081
    2678828082#ifdef WOLFSSL_DTLS
    26789         if (IsDtlsNotSctpMode(ssl)) {
     28083        if (IsDtlsNotSctpMode(ssl) && !IsSCR(ssl) && !ssl->options.resuming) {
    2679028084            ret = wc_HmacUpdate(&cookieHmac,
    2679128085                                    input + i - OPAQUE16_LEN,
    2679228086                                    clSuites.suiteSz + OPAQUE16_LEN);
    26793             if (ret != 0) return ret;
     28087            if (ret != 0) goto out;
    2679428088        }
    2679528089#endif /* WOLFSSL_DTLS */
     
    2680028094        b = input[i++];
    2680128095
    26802         if ((i - begin) + b > helloSz)
    26803             return BUFFER_ERROR;
     28096        if ((i - begin) + b > helloSz) {
     28097            ret = BUFFER_ERROR;
     28098            goto out;
     28099        }
    2680428100
    2680528101        if (b == 0) {
     
    2680828104            SendAlert(ssl, alert_fatal, decode_error);
    2680928105#endif
    26810             return COMPRESSION_ERROR;
     28106            ret = COMPRESSION_ERROR;
     28107            goto out;
    2681128108        }
    2681228109
    2681328110#ifdef WOLFSSL_DTLS
    2681428111        if (IsDtlsNotSctpMode(ssl)) {
    26815             byte newCookie[MAX_COOKIE_LEN];
    26816 
    26817             ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
    26818             if (ret != 0) return ret;
    26819             ret = wc_HmacFinal(&cookieHmac, newCookie);
    26820             if (ret != 0) return ret;
    26821 
    26822             /* If a cookie callback is set, call it to overwrite the cookie.
    26823              * This should be deprecated. The code now calculates the cookie
    26824              * using an HMAC as expected. */
    26825             if (ssl->ctx->CBIOCookie != NULL &&
    26826                 ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz,
    26827                                              ssl->IOCB_CookieCtx) != cookieSz) {
    26828                 return COOKIE_ERROR;
    26829             }
    26830 
    26831             /* Check the cookie, see if we progress the state machine. */
    26832             if (peerCookieSz != cookieSz ||
    26833                 XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
    26834 
    26835                 /* Send newCookie to client in a HelloVerifyRequest message
    26836                  * and let the state machine alone. */
    26837                 ssl->msgsReceived.got_client_hello = 0;
    26838                 ssl->keys.dtls_handshake_number = 0;
    26839                 ssl->keys.dtls_expected_peer_handshake_number = 0;
    26840                 *inOutIdx += helloSz;
    26841                 return SendHelloVerifyRequest(ssl, newCookie, cookieSz);
     28112            if (!IsSCR(ssl) && !ssl->options.resuming) {
     28113                byte newCookie[MAX_COOKIE_LEN];
     28114
     28115                ret = wc_HmacUpdate(&cookieHmac, input + i - 1, b + 1);
     28116                if (ret != 0) goto out;
     28117                ret = wc_HmacFinal(&cookieHmac, newCookie);
     28118                if (ret != 0) goto out;
     28119
     28120                /* If a cookie callback is set, call it to overwrite the cookie.
     28121                 * This should be deprecated. The code now calculates the cookie
     28122                 * using an HMAC as expected. */
     28123                if (ssl->ctx->CBIOCookie != NULL &&
     28124                    ssl->ctx->CBIOCookie(ssl, newCookie, cookieSz,
     28125                                                 ssl->IOCB_CookieCtx) != cookieSz) {
     28126                    ret = COOKIE_ERROR;
     28127                    goto out;
     28128                }
     28129
     28130                /* Check the cookie, see if we progress the state machine. */
     28131                if (peerCookieSz != cookieSz ||
     28132                    XMEMCMP(peerCookie, newCookie, cookieSz) != 0) {
     28133
     28134                    /* Send newCookie to client in a HelloVerifyRequest message
     28135                     * and let the state machine alone. */
     28136                    ssl->msgsReceived.got_client_hello = 0;
     28137                    ssl->keys.dtls_handshake_number = 0;
     28138                    ssl->keys.dtls_expected_peer_handshake_number = 0;
     28139                    *inOutIdx += helloSz;
     28140                    ret = SendHelloVerifyRequest(ssl, newCookie, cookieSz);
     28141                    goto out;
     28142                }
    2684228143            }
    2684328144
     
    2684528146             * verify request. */
    2684628147            ret = HashInput(ssl, input + *inOutIdx, helloSz);
    26847             if (ret != 0) return ret;
     28148            if (ret != 0) goto out;
    2684828149        }
    2684928150#endif /* WOLFSSL_DTLS */
     
    2687728178                SendAlert(ssl, alert_fatal, illegal_parameter);
    2687828179#endif
    26879                 return COMPRESSION_ERROR;
     28180                ret = COMPRESSION_ERROR;
     28181                goto out;
    2688028182            }
    2688128183        }
     
    2690028202                /* auto populate extensions supported unless user defined */
    2690128203                if ((ret = TLSX_PopulateExtensions(ssl, 1)) != 0)
    26902                     return ret;
    26903 #endif
    26904 
    26905                 if ((i - begin) + OPAQUE16_LEN > helloSz)
    26906                     return BUFFER_ERROR;
     28204                    goto out;
     28205#endif
     28206
     28207                if ((i - begin) + OPAQUE16_LEN > helloSz) {
     28208                    ret = BUFFER_ERROR;
     28209                    goto out;
     28210                }
    2690728211
    2690828212                ato16(&input[i], &totalExtSz);
    2690928213                i += OPAQUE16_LEN;
    2691028214
    26911                 if ((i - begin) + totalExtSz > helloSz)
    26912                     return BUFFER_ERROR;
     28215                if ((i - begin) + totalExtSz > helloSz) {
     28216                    ret = BUFFER_ERROR;
     28217                    goto out;
     28218                }
    2691328219
    2691428220#ifdef HAVE_TLS_EXTENSIONS
     
    2691628222                if ((ret = TLSX_Parse(ssl, (byte *) input + i, totalExtSz,
    2691728223                                      client_hello, &clSuites)))
    26918                     return ret;
     28224                    goto out;
    2691928225    #ifdef WOLFSSL_TLS13
    2692028226                if (TLSX_Find(ssl->extensions,
     
    2692228228                    WOLFSSL_MSG(
    2692328229                            "Client attempting to connect with higher version");
    26924                     return VERSION_ERROR;
     28230                    ret = VERSION_ERROR;
     28231                    goto out;
    2692528232                }
    2692628233    #endif
    26927     #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
     28234    #ifdef HAVE_SNI
    2692828235                if((ret=SNI_Callback(ssl)))
    26929                     return ret;
     28236                    goto out;
    2693028237                ssl->options.side = WOLFSSL_SERVER_END;
    2693128238    #endif
     
    2693628243                    word16 extId, extSz;
    2693728244
    26938                     if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz)
    26939                         return BUFFER_ERROR;
     28245                    if (OPAQUE16_LEN + OPAQUE16_LEN > totalExtSz) {
     28246                        ret = BUFFER_ERROR;
     28247                        goto out;
     28248                    }
    2694028249
    2694128250                    ato16(&input[i], &extId);
     
    2694428253                    i += OPAQUE16_LEN;
    2694528254
    26946                     if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz)
    26947                         return BUFFER_ERROR;
     28255                    if (OPAQUE16_LEN + OPAQUE16_LEN + extSz > totalExtSz) {
     28256                        ret = BUFFER_ERROR;
     28257                        goto out;
     28258                    }
    2694828259
    2694928260                    if (extId == HELLO_EXT_SIG_ALGO) {
     
    2695328264                        i += OPAQUE16_LEN;
    2695428265
    26955                         if (OPAQUE16_LEN + hashSigAlgoSz > extSz)
    26956                             return BUFFER_ERROR;
     28266                        if (OPAQUE16_LEN + hashSigAlgoSz > extSz) {
     28267                            ret = BUFFER_ERROR;
     28268                            goto out;
     28269                        }
     28270
     28271                        if (hashSigAlgoSz % 2 != 0) {
     28272                            ret = BUFFER_ERROR;
     28273                            goto out;
     28274                        }
    2695728275
    2695828276                        clSuites.hashSigAlgoSz = hashSigAlgoSz;
     
    2699128309            ret = HandleTlsResumption(ssl, bogusID, &clSuites);
    2699228310            if (ret != 0)
    26993                 return ret;
    26994 
    26995             #ifdef HAVE_SECURE_RENEGOTIATION
    26996             if (ssl->secure_renegotiation &&
    26997                     ssl->secure_renegotiation->enabled &&
    26998                     IsEncryptionOn(ssl, 0))
    26999                 ssl->secure_renegotiation->startScr = 1;
    27000             #endif
     28311                goto out;
    2700128312
    2700228313            if (ssl->options.clientState == CLIENT_KEYEXCHANGE_COMPLETE) {
     
    2700428315                WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
    2700528316
    27006                 return ret;
     28317                goto out;
    2700728318            }
    2700828319        }
     
    2701528326            ret = TLSX_SupportedFFDHE_Set(ssl);
    2701628327            if (ret != 0)
    27017                 return ret;
     28328                goto out;
    2701828329        }
    2701928330    #endif
     
    2702828339#endif
    2702928340
    27030 #ifdef HAVE_SECURE_RENEGOTIATION
    27031         if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled &&
    27032                 IsEncryptionOn(ssl, 0)) {
    27033             ssl->secure_renegotiation->startScr = 1;
    27034         }
     28341#ifdef WOLFSSL_DTLS
     28342        if (ret == 0 && ssl->options.dtls)
     28343            DtlsMsgPoolReset(ssl);
    2703528344#endif
    2703628345        WOLFSSL_LEAVE("DoClientHello", ret);
    2703728346        WOLFSSL_END(WC_FUNC_CLIENT_HELLO_DO);
     28347
     28348    out:
     28349
     28350#ifdef WOLFSSL_DTLS
     28351        wc_HmacFree(&cookieHmac);
     28352#endif
    2703828353
    2703928354        return ret;
     
    2748328798            byte* input;
    2748428799            int   inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
     28800            int   recordHeaderSz = RECORD_HEADER_SZ;
     28801
     28802            if (ssl->options.dtls) {
     28803                recordHeaderSz += DTLS_RECORD_EXTRA;
     28804                inputSz += DTLS_HANDSHAKE_EXTRA;
     28805            }
    2748528806
    2748628807            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     
    2748828809                return MEMORY_E;
    2748928810
    27490             XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
     28811            XMEMCPY(input, output + recordHeaderSz, inputSz);
     28812            #ifdef WOLFSSL_DTLS
     28813            if (IsDtlsNotSctpMode(ssl) &&
     28814                    (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) {
     28815                XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     28816                return ret;
     28817            }
     28818            #endif
    2749128819            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
    27492                                   handshake, 1, 0, 0);
     28820                                  handshake, 1, 0, 0, CUR_ORDER);
    2749328821            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    2749428822
     
    2749828826            #ifdef WOLFSSL_DTLS
    2749928827                if (IsDtlsNotSctpMode(ssl)) {
    27500                     if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
     28828                    if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0)
    2750128829                        return ret;
    2750228830                }
     
    2754628874        word32          ageAdd;                /* Obfuscation of age */
    2754728875        word16          namedGroup;            /* Named group used */
    27548     #ifndef WOLFSSL_TLS13_DRAFT_18
    2754928876        TicketNonce     ticketNonce;           /* Ticket nonce */
    27550     #endif
    2755128877    #ifdef WOLFSSL_EARLY_DATA
    2755228878        word32          maxEarlyDataSz;        /* Max size of early data */
     
    2755528881    } InternalTicket;
    2755628882
     28883    /* RFC 5077 defines this for session tickets */
    2755728884    /* fit within SESSION_TICKET_LEN */
    2755828885    typedef struct ExternalTicket {
     
    2760428931            /* Resumption master secret. */
    2760528932            XMEMCPY(it.msecret, ssl->session.masterSecret, SECRET_LEN);
    27606     #ifndef WOLFSSL_TLS13_DRAFT_18
    2760728933            XMEMCPY(&it.ticketNonce, &ssl->session.ticketNonce,
    2760828934                                                           sizeof(TicketNonce));
    27609     #endif
    27610 #endif
    27611         }
    27612 
    27613         /* build external */
    27614         XMEMCPY(et->enc_ticket, &it, sizeof(InternalTicket));
     28935#endif
     28936        }
    2761528937
    2761628938        /* encrypt */
     
    2762028942        }
    2762128943        else {
     28944            /* build external */
     28945            XMEMCPY(et->enc_ticket, &it, sizeof(InternalTicket));
     28946
    2762228947            ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac, 1,
    2762328948                                    et->enc_ticket, sizeof(InternalTicket),
    2762428949                                    &encLen, ssl->ctx->ticketEncCtx);
     28950            if (ret != WOLFSSL_TICKET_RET_OK) {
     28951                ForceZero(et->enc_ticket, sizeof(it));
     28952            }
    2762528953        }
    2762628954        if (ret == WOLFSSL_TICKET_RET_OK) {
    2762728955            if (encLen < (int)sizeof(InternalTicket) ||
    2762828956                encLen > WOLFSSL_TICKET_ENC_SZ) {
     28957                ForceZero(&it, sizeof(it));
     28958                ForceZero(et->enc_ticket, sizeof(it));
    2762928959                WOLFSSL_MSG("Bad user ticket encrypt size");
    2763028960                return BAD_TICKET_KEY_CB_SZ;
     
    2763528965            /* internal ticket can't be the same if encrypted */
    2763628966            if (XMEMCMP(et->enc_ticket, &it, sizeof(InternalTicket)) == 0) {
     28967                ForceZero(&it, sizeof(it));
     28968                ForceZero(et->enc_ticket, sizeof(it));
    2763728969                WOLFSSL_MSG("User ticket encrypt didn't encrypt");
    2763828970                return BAD_TICKET_ENCRYPT;
    2763928971            }
    2764028972
     28973            ForceZero(&it, sizeof(it));
    2764128974            XMEMSET(zeros, 0, sizeof(zeros));
    2764228975
     
    2767629009    {
    2767729010        ExternalTicket* et;
    27678         InternalTicket* it;
     29011        InternalTicket  it;
    2767929012        int             ret;
    2768029013        int             outLen;
     
    2769029023
    2769129024        et = (ExternalTicket*)input;
    27692         it = (InternalTicket*)et->enc_ticket;
    2769329025
    2769429026        /* decrypt */
     
    2771429046        }
    2771529047
     29048        /* copy the decrypted ticket to avoid alignment issues */
     29049        XMEMCPY(&it, et->enc_ticket, sizeof(InternalTicket));
     29050        ForceZero(et->enc_ticket, sizeof(it));
     29051
    2771629052        /* get master secret */
    2771729053        if (ret == WOLFSSL_TICKET_RET_OK || ret == WOLFSSL_TICKET_RET_CREATE) {
    27718             if (ssl->version.minor < it->pv.minor) {
     29054            if (ssl->version.minor < it.pv.minor) {
     29055                ForceZero(&it, sizeof(it));
    2771929056                WOLFSSL_MSG("Ticket has greater version");
    2772029057                return VERSION_ERROR;
    2772129058            }
    27722             else if (ssl->version.minor > it->pv.minor) {
     29059            else if (ssl->version.minor > it.pv.minor) {
     29060                if (IsAtLeastTLSv1_3(it.pv) != IsAtLeastTLSv1_3(ssl->version)) {
     29061                    ForceZero(&it, sizeof(it));
     29062                    WOLFSSL_MSG("Tickets cannot be shared between "
     29063                                               "TLS 1.3 and TLS 1.2 and lower");
     29064                    return VERSION_ERROR;
     29065                }
     29066
    2772329067                if (!ssl->options.downgrade) {
     29068                    ForceZero(&it, sizeof(it));
    2772429069                    WOLFSSL_MSG("Ticket has lesser version");
    2772529070                    return VERSION_ERROR;
     
    2772829073                WOLFSSL_MSG("Downgrading protocol due to ticket");
    2772929074
    27730                 if (it->pv.minor < ssl->options.minDowngrade)
     29075                if (it.pv.minor < ssl->options.minDowngrade) {
     29076                    ForceZero(&it, sizeof(it));
    2773129077                    return VERSION_ERROR;
    27732                 ssl->version.minor = it->pv.minor;
     29078                }
     29079                ssl->version.minor = it.pv.minor;
    2773329080            }
    2773429081
    2773529082
    2773629083            if (!IsAtLeastTLSv1_3(ssl->version)) {
    27737                 XMEMCPY(ssl->arrays->masterSecret, it->msecret, SECRET_LEN);
     29084                XMEMCPY(ssl->arrays->masterSecret, it.msecret, SECRET_LEN);
    2773829085                /* Copy the haveExtendedMasterSecret property from the ticket to
    2773929086                 * the saved session, so the property may be checked later. */
    27740                 ssl->session.haveEMS = it->haveEMS;
     29087                ssl->session.haveEMS = it.haveEMS;
    2774129088            #ifndef NO_RESUME_SUITE_CHECK
    27742                 ssl->session.cipherSuite0 = it->suite[0];
    27743                 ssl->session.cipherSuite = it->suite[1];
     29089                ssl->session.cipherSuite0 = it.suite[0];
     29090                ssl->session.cipherSuite = it.suite[1];
    2774429091            #endif
    2774529092            }
     
    2774729094#ifdef WOLFSSL_TLS13
    2774829095                /* Restore information to renegotiate. */
    27749                 ssl->session.ticketSeen = it->timestamp;
    27750                 ssl->session.ticketAdd = it->ageAdd;
    27751                 ssl->session.cipherSuite0 = it->suite[0];
    27752                 ssl->session.cipherSuite = it->suite[1];
     29096                ssl->session.ticketSeen = it.timestamp;
     29097                ssl->session.ticketAdd = it.ageAdd;
     29098                ssl->session.cipherSuite0 = it.suite[0];
     29099                ssl->session.cipherSuite = it.suite[1];
    2775329100    #ifdef WOLFSSL_EARLY_DATA
    27754                 ssl->session.maxEarlyDataSz = it->maxEarlyDataSz;
     29101                ssl->session.maxEarlyDataSz = it.maxEarlyDataSz;
    2775529102    #endif
    2775629103                /* Resumption master secret. */
    27757                 XMEMCPY(ssl->session.masterSecret, it->msecret, SECRET_LEN);
    27758     #ifndef WOLFSSL_TLS13_DRAFT_18
    27759                 XMEMCPY(&ssl->session.ticketNonce, &it->ticketNonce,
     29104                XMEMCPY(ssl->session.masterSecret, it.msecret, SECRET_LEN);
     29105                XMEMCPY(&ssl->session.ticketNonce, &it.ticketNonce,
    2776029106                                                           sizeof(TicketNonce));
    27761     #endif
    27762                 ssl->session.namedGroup = it->namedGroup;
    27763 #endif
    27764             }
    27765         }
     29107                ssl->session.namedGroup = it.namedGroup;
     29108#endif
     29109            }
     29110        }
     29111
     29112        ForceZero(&it, sizeof(it));
    2776629113
    2776729114        WOLFSSL_LEAVE("DoClientTicket", ret);
     
    2780229149        #endif
    2780329150        }
     29151
     29152        if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone)
     29153            sendSz += cipherExtraData(ssl);
     29154
    2780429155        /* check for available size */
    2780529156        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
     
    2782629177        if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) {
    2782729178            byte* input;
    27828             int   inputSz = idx - RECORD_HEADER_SZ; /* build msg adds rec hdr */
    27829 
     29179            int   inputSz = idx; /* build msg adds rec hdr */
     29180            int   recordHeaderSz = RECORD_HEADER_SZ;
     29181
     29182            if (ssl->options.dtls)
     29183                recordHeaderSz += DTLS_RECORD_EXTRA;
     29184            inputSz -= recordHeaderSz;
    2783029185            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    2783129186            if (input == NULL)
    2783229187                return MEMORY_E;
    2783329188
    27834             XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
     29189            XMEMCPY(input, output + recordHeaderSz, inputSz);
    2783529190            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
    27836                                   handshake, 1, 0, 0);
     29191                                  handshake, 1, 0, 0, CUR_ORDER);
    2783729192            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    2783829193
     
    2784329198            #ifdef WOLFSSL_DTLS
    2784429199            if (ssl->options.dtls) {
    27845                 if ((ret = DtlsMsgPoolSave(ssl, output, sendSz)) != 0)
     29200                if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0)
    2784629201                    return ret;
    2784729202
     
    2785629211        ssl->buffers.outputBuffer.length += sendSz;
    2785729212
    27858         ret = SendBuffered(ssl);
     29213        if (!ssl->options.groupMessages)
     29214            ret = SendBuffered(ssl);
    2785929215
    2786029216        WOLFSSL_LEAVE("SendTicket", ret);
     
    2786329219        return ret;
    2786429220    }
     29221
     29222#ifndef WOLFSSL_NO_DEF_TICKET_ENC_CB
     29223
     29224/* Initialize the context for session ticket encryption.
     29225 *
     29226 * @param [in]  ctx     SSL context.
     29227 * @param [in]  keyCtx  Context for session ticket encryption.
     29228 * @return  0 on success.
     29229 * @return  BAD_MUTEX_E when initializing mutex fails.
     29230 */
     29231static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx)
     29232{
     29233    int ret = 0;
     29234
     29235    XMEMSET(keyCtx, 0, sizeof(*keyCtx));
     29236    keyCtx->ctx = ctx;
     29237
     29238#ifndef SINGLE_THREADED
     29239    ret = wc_InitMutex(&keyCtx->mutex);
     29240#endif
     29241
     29242    return ret;
     29243}
     29244
     29245/* Setup the session ticket encryption context for this.
     29246 *
     29247 * Initialize RNG, generate name, generate primeary key and set primary key
     29248 * expirary.
     29249 *
     29250 * @param [in]  keyCtx  Context for session ticket encryption.
     29251 * @param [in]  heap    Dynamic memory allocation hint.
     29252 * @param [in]  devId   Device identifier.
     29253 * @return  0 on success.
     29254 * @return  Other value when random number generator fails.
     29255 */
     29256static int TicketEncCbCtx_Setup(TicketEncCbCtx* keyCtx, void* heap, int devId)
     29257{
     29258    int ret;
     29259
     29260#ifndef SINGLE_THREADED
     29261    ret = 0;
     29262
     29263    /* Check that key wasn't set up while waiting. */
     29264    if (keyCtx->expirary[0] == 0)
     29265#endif
     29266    {
     29267        ret = wc_InitRng_ex(&keyCtx->rng, heap, devId);
     29268        if (ret == 0) {
     29269            ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->name,
     29270                                       sizeof(keyCtx->name));
     29271        }
     29272        if (ret == 0) {
     29273            /* Mask of the bottom bit - used for index of key. */
     29274            keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1] &= 0xfe;
     29275
     29276            /* Generate initial primary key. */
     29277            ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[0],
     29278                                       WOLFSSL_TICKET_KEY_SZ);
     29279        }
     29280        if (ret == 0) {
     29281            keyCtx->expirary[0] = LowResTimer() + WOLFSSL_TICKET_KEY_LIFETIME;
     29282        }
     29283    }
     29284
     29285    return ret;
     29286}
     29287/* Free the context for session ticket encryption.
     29288 *
     29289 * Zeroize keys and name.
     29290 *
     29291 * @param [in]  keyCtx  Context for session ticket encryption.
     29292 */
     29293static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx)
     29294{
     29295    /* Zeroize sensitive data. */
     29296    ForceZero(keyCtx->name, sizeof(keyCtx->name));
     29297    ForceZero(keyCtx->key[0], sizeof(keyCtx->key[0]));
     29298    ForceZero(keyCtx->key[1], sizeof(keyCtx->key[1]));
     29299
     29300#ifndef SINGLE_THREADED
     29301    wc_FreeMutex(&keyCtx->mutex);
     29302#endif
     29303    wc_FreeRng(&keyCtx->rng);
     29304}
     29305
     29306#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \
     29307    !defined(WOLFSSL_TICKET_ENC_AES128_GCM) && \
     29308    !defined(WOLFSSL_TICKET_ENC_AES256_GCM)
     29309/* Ticket encryption/decryption implementation.
     29310 *
     29311 * @param [in]   key     Key for encryption/decryption.
     29312 * @param [in]   keyLen  Length of key in bytes.
     29313 * @param [in]   iv      IV/Nonce for encryption/decryption.
     29314 * @param [in]   aad     Additional authentication data.
     29315 * @param [in]   aadSz   Length of additional authentication data.
     29316 * @param [in]   in      Data to encrypt/decrypt.
     29317 * @param [in]   inLen   Length of encrypted data.
     29318 * @param [out]  out     Resulting data from encrypt/decrypt.
     29319 * @param [out]  outLen  Size of resulting data.
     29320 * @param [in]   tag     Authentication tag for encrypted data.
     29321 * @param [in]   heap    Dynamic memory allocation data hint.
     29322 * @param [in]   enc     1 when encrypting, 0 when decrypting.
     29323 * @return  0 on success.
     29324 * @return  Other value when encryption/decryption fails.
     29325 */
     29326static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
     29327                        byte* in, int inLen, byte* out, int* outLen, byte* tag,
     29328                        void* heap, int enc)
     29329{
     29330    int ret;
     29331
     29332    (void)keyLen;
     29333    (void)heap;
     29334
     29335    if (enc) {
     29336        ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, aadSz, in, inLen, out,
     29337                                          tag);
     29338    }
     29339    else {
     29340        ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, aadSz, in, inLen, tag,
     29341                                          out);
     29342    }
     29343
     29344    *outLen = inLen;
     29345
     29346    return ret;
     29347}
     29348#elif defined(HAVE_AESGCM)
     29349/* Ticket encryption/decryption implementation.
     29350 *
     29351 * @param [in]   key     Key for encryption/decryption.
     29352 * @param [in]   keyLen  Length of key in bytes.
     29353 * @param [in]   iv      IV/Nonce for encryption/decryption.
     29354 * @param [in]   aad     Additional authentication data.
     29355 * @param [in]   aadSz   Length of additional authentication data.
     29356 * @param [in]   in      Data to encrypt/decrypt.
     29357 * @param [in]   inLen   Length of encrypted data.
     29358 * @param [out]  out     Resulting data from encrypt/decrypt.
     29359 * @param [out]  outLen  Size of resulting data.
     29360 * @param [in]   tag     Authentication tag for encrypted data.
     29361 * @param [in]   heap    Dynamic memory allocation data hint.
     29362 * @param [in]   enc     1 when encrypting, 0 when decrypting.
     29363 * @return  0 on success.
     29364 * @return  MEMORY_E when dynamic memory allocation fails.
     29365 * @return  Other value when encryption/decryption fails.
     29366 */
     29367static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz,
     29368                        byte* in, int inLen, byte* out, int* outLen, byte* tag,
     29369                        void* heap, int enc)
     29370{
     29371    int ret;
     29372#ifdef WOLFSSL_SMALL_STACK
     29373    Aes* aes;
     29374#else
     29375    Aes aes[1];
     29376#endif
     29377
     29378    (void)heap;
     29379
     29380#ifdef WOLFSSL_SMALL_STACK
     29381    aes = (Aes*)XMALLOC(sizeof(Aes), heap, DYNAMIC_TYPE_TMP_BUFFER);
     29382    if (aes == NULL)
     29383        return MEMORY_E;
     29384#endif
     29385
     29386    if (enc) {
     29387        ret = wc_AesInit(aes, NULL, INVALID_DEVID);
     29388        if (ret == 0) {
     29389            ret = wc_AesGcmSetKey(aes, key, keyLen);
     29390        }
     29391        if (ret == 0) {
     29392            ret = wc_AesGcmEncrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
     29393                                   tag, AES_BLOCK_SIZE, aad, aadSz);
     29394        }
     29395        wc_AesFree(aes);
     29396    }
     29397    else {
     29398        ret = wc_AesInit(aes, NULL, INVALID_DEVID);
     29399        if (ret == 0) {
     29400            ret = wc_AesGcmSetKey(aes, key, keyLen);
     29401        }
     29402        if (ret == 0) {
     29403            ret = wc_AesGcmDecrypt(aes, in, out, inLen, iv, GCM_NONCE_MID_SZ,
     29404                                   tag, AES_BLOCK_SIZE, aad, aadSz);
     29405        }
     29406        wc_AesFree(aes);
     29407    }
     29408
     29409#ifdef WOLFSSL_SMALL_STACK
     29410    XFREE(aes, heap, DYNAMIC_TYPE_TMP_BUFFER);
     29411#endif
     29412
     29413    *outLen = inLen;
     29414
     29415    return ret;
     29416}
     29417#else
     29418    #error "No encryption algorithm available for default ticket encryption."
     29419#endif
     29420
     29421/* Choose a key to use for encryption.
     29422 *
     29423 * Generate a new key if the current ones are expired.
     29424 * If the secondary key has not been used and the primary key has expired then
     29425 * generate a new primary key.
     29426 *
     29427 * @param [in]   Ticket encryption callback context.
     29428 * @param [in]   Session ticket lifetime.
     29429 * @param [out]  Index of key to use for encryption.
     29430 * @return  0 on success.
     29431 * @return  Other value when random number generation fails.
     29432 */
     29433static int TicketEncCbCtx_ChooseKey(TicketEncCbCtx* keyCtx, int ticketHint,
     29434                                    int* keyIdx)
     29435{
     29436    int ret = 0;
     29437
     29438    /* Get new current time as lock may have taken some time. */
     29439    word32 now = LowResTimer();
     29440
     29441    /* Check expirary of primary key for encrypt. */
     29442    if (keyCtx->expirary[0] >= now + ticketHint) {
     29443        *keyIdx = 0;
     29444    }
     29445    /* Check expirary of primary key for encrypt. */
     29446    else if (keyCtx->expirary[1] >= now + ticketHint) {
     29447        *keyIdx = 1;
     29448    }
     29449    /* No key available to use. */
     29450    else {
     29451        int genKey;
     29452
     29453        /* Generate which ever key is expired for decrypt - primary first. */
     29454        if (keyCtx->expirary[0] < now) {
     29455            genKey = 0;
     29456        }
     29457        else if (keyCtx->expirary[1] < now) {
     29458            genKey = 1;
     29459        }
     29460        /* Timeouts and expirary should not allow this to happen. */
     29461        else {
     29462            return BAD_STATE_E;
     29463        }
     29464
     29465        /* Generate the required key */
     29466        ret = wc_RNG_GenerateBlock(&keyCtx->rng, keyCtx->key[genKey],
     29467                                   WOLFSSL_TICKET_KEY_SZ);
     29468        if (ret == 0) {
     29469            keyCtx->expirary[genKey] = now + WOLFSSL_TICKET_KEY_LIFETIME;
     29470            *keyIdx = genKey;
     29471        }
     29472    }
     29473
     29474    return ret;
     29475}
     29476
     29477/* Default Session Ticket encryption/decryption callback.
     29478 *
     29479 * Use ChaCha20-Poly1305 or AES-GCM to encrypt/decrypt the ticket.
     29480 * Two keys are used:
     29481 *  - When the first expires for encryption, then use the other.
     29482 *  - Don't encrypt with key if the ticket lifetime will go beyond expirary.
     29483 *  - Generate a new primary key when primary key expired for decrypt and
     29484 *    no secondary key is activate for encryption.
     29485 *  - Generate a new secondary key when expired and needed.
     29486 *  - Calculate expirary starting from first encrypted ticket.
     29487 *  - Key name has last bit set to indicate index of key.
     29488 * Keys expire for decryption after ticket key lifetime from the first encrypted
     29489 * ticket.
     29490 * Keys can only be use for encryption while the ticket hint does not exceed
     29491 * the key lifetime.
     29492 * Lifetime of a key must be greater than the lifetime of a ticket. This means
     29493 * that if one ticket is only valid for decryption, then the other will be
     29494 * valid for encryption.
     29495 * AAD = key_name | iv | ticket len (16-bits network order)
     29496 *
     29497 * @param [in]      ssl       SSL connection.
     29498 * @param [in,out]  key_name  Name of key from client.
     29499 *                            Encrypt: name of key returned.
     29500 *                            Decrypt: name from ticket message to check.
     29501 * @param [in]      iv        IV to use in encryption/decryption.
     29502 * @param [in]      mac       MAC for authentication of encrypted data.
     29503 * @param [in]      enc       1 when encrypting ticket, 0 when decrypting.
     29504 * @param [in,out]  ticket    Encrypted/decrypted session ticket bytes.
     29505 * @param [in]      inLen     Length of incoming ticket.
     29506 * @param [out]     outLen    Length of outgoing ticket.
     29507 * @param [in]      userCtx   Context for encryption/decryption of ticket.
     29508 * @return  WOLFSSL_TICKET_RET_OK when successful.
     29509 * @return  WOLFSSL_TICKET_RET_CREATE when successful and a new ticket is to
     29510 *          be created for TLS 1.2 and below.
     29511 * @return  WOLFSSL_TICKET_RET_REJECT when failed to produce valid encrypted or
     29512 *          decrypted ticket.
     29513 * @return  WOLFSSL_TICKET_RET_FATAL when key name does not match.
     29514 */
     29515static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
     29516                          byte iv[WOLFSSL_TICKET_IV_SZ],
     29517                          byte mac[WOLFSSL_TICKET_MAC_SZ],
     29518                          int enc, byte* ticket, int inLen, int* outLen,
     29519                          void* userCtx)
     29520{
     29521    int ret;
     29522    TicketEncCbCtx* keyCtx = (TicketEncCbCtx*)userCtx;
     29523    WOLFSSL_CTX* ctx = keyCtx->ctx;
     29524    word16 sLen = XHTONS(inLen);
     29525    byte aad[WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen)];
     29526    int  aadSz = WOLFSSL_TICKET_NAME_SZ + WOLFSSL_TICKET_IV_SZ + sizeof(sLen);
     29527    byte* p = aad;
     29528    int keyIdx = 0;
     29529
     29530    /* Check we have setup the RNG, name and primary key. */
     29531    if (keyCtx->expirary[0] == 0) {
     29532#ifndef SINGLE_THREADED
     29533        /* Lock around access to expirary and key - stop initial key being
     29534         * generated twice at the same time. */
     29535        if (wc_LockMutex(&keyCtx->mutex) != 0) {
     29536            WOLFSSL_MSG("Couldn't lock key context mutex");
     29537            return WOLFSSL_TICKET_RET_REJECT;
     29538        }
     29539#endif
     29540        /* Sets expirary of primary key in setup. */
     29541        ret = TicketEncCbCtx_Setup(keyCtx, ssl->ctx->heap, ssl->ctx->devId);
     29542#ifndef SINGLE_THREADED
     29543        wc_UnLockMutex(&keyCtx->mutex);
     29544#endif
     29545        if (ret != 0)
     29546            return ret;
     29547    }
     29548
     29549    if (enc) {
     29550        /* Return the name of the key - missing key index. */
     29551        XMEMCPY(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
     29552
     29553        /* Generate a new IV into buffer to be returned.
     29554         * Don't use the RNG in keyCtx as it's for generating private data. */
     29555        ret = wc_RNG_GenerateBlock(ssl->rng, iv, WOLFSSL_TICKET_IV_SZ);
     29556        if (ret != 0) {
     29557            return WOLFSSL_TICKET_RET_REJECT;
     29558        }
     29559    }
     29560    else {
     29561        /* Mask of last bit that is the key index. */
     29562        byte lastByte = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0xfe;
     29563
     29564        /* For decryption, see if we know this key - check all but last byte. */
     29565        if (XMEMCMP(key_name, keyCtx->name, WOLFSSL_TICKET_NAME_SZ - 1) != 0) {
     29566            return WOLFSSL_TICKET_RET_FATAL;
     29567        }
     29568        /* Ensure last byte without index bit matches too. */
     29569        if (lastByte != keyCtx->name[WOLFSSL_TICKET_NAME_SZ - 1]) {
     29570            return WOLFSSL_TICKET_RET_FATAL;
     29571        }
     29572    }
     29573
     29574    /* Build AAD from: key name, iv, and length of ticket. */
     29575    XMEMCPY(p, keyCtx->name, WOLFSSL_TICKET_NAME_SZ);
     29576    p += WOLFSSL_TICKET_NAME_SZ;
     29577    XMEMCPY(p, iv, WOLFSSL_TICKET_IV_SZ);
     29578    p += WOLFSSL_TICKET_IV_SZ;
     29579    XMEMCPY(p, &sLen, sizeof(sLen));
     29580
     29581    /* Encrypt ticket. */
     29582    if (enc) {
     29583        word32 now;
     29584
     29585        now = LowResTimer();
     29586        /* As long as encryption expirary isn't imminent - no lock. */
     29587        if (keyCtx->expirary[0] > now + ctx->ticketHint) {
     29588            keyIdx = 0;
     29589        }
     29590        else if (keyCtx->expirary[1] > now + ctx->ticketHint) {
     29591            keyIdx = 1;
     29592        }
     29593        else {
     29594#ifndef SINGLE_THREADED
     29595            /* Lock around access to expirary and key - stop key being generated
     29596             * twice at the same time. */
     29597            if (wc_LockMutex(&keyCtx->mutex) != 0) {
     29598                WOLFSSL_MSG("Couldn't lock key context mutex");
     29599                return WOLFSSL_TICKET_RET_REJECT;
     29600            }
     29601#endif
     29602            ret = TicketEncCbCtx_ChooseKey(keyCtx, ctx->ticketHint, &keyIdx);
     29603#ifndef SINGLE_THREADED
     29604            wc_UnLockMutex(&keyCtx->mutex);
     29605#endif
     29606            if (ret != 0) {
     29607                return WOLFSSL_TICKET_RET_REJECT;
     29608            }
     29609        }
     29610        /* Set the name of the key to the index chosen. */
     29611        key_name[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
     29612        /* Update AAD too. */
     29613        aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
     29614
     29615        /* Encrypt ticket data. */
     29616        ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
     29617                           aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
     29618                           1);
     29619        if (ret != 0) return WOLFSSL_TICKET_RET_REJECT;
     29620    }
     29621    /* Decrypt ticket. */
     29622    else {
     29623        /* Get index of key from name. */
     29624        keyIdx = key_name[WOLFSSL_TICKET_NAME_SZ - 1] & 0x1;
     29625        /* Update AAD with index. */
     29626        aad[WOLFSSL_TICKET_NAME_SZ - 1] |= keyIdx;
     29627
     29628        /* Check expirary */
     29629        if (keyCtx->expirary[keyIdx] <= LowResTimer()) {
     29630            return WOLFSSL_TICKET_RET_REJECT;
     29631        }
     29632
     29633        /* Decrypt ticket data. */
     29634        ret = TicketEncDec(keyCtx->key[keyIdx], WOLFSSL_TICKET_KEY_SZ, iv, aad,
     29635                           aadSz, ticket, inLen, ticket, outLen, mac, ssl->heap,
     29636                           0);
     29637        if (ret != 0) {
     29638            return WOLFSSL_TICKET_RET_REJECT;
     29639        }
     29640    }
     29641
     29642#ifndef WOLFSSL_TICKET_DECRYPT_NO_CREATE
     29643    if (!IsAtLeastTLSv1_3(ssl->version) && !enc)
     29644        return WOLFSSL_TICKET_RET_CREATE;
     29645#endif
     29646    return WOLFSSL_TICKET_RET_OK;
     29647}
     29648
     29649#endif /* !WOLFSSL_NO_DEF_TICKET_ENC_CB */
    2786529650
    2786629651#endif /* HAVE_SESSION_TICKET */
     
    2788529670            sendSz += MAX_MSG_EXTRA;
    2788629671
     29672        if (ssl->options.dtls)
     29673            sendSz += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA;
     29674
    2788729675        /* check for available size */
    2788829676        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
     
    2789829686            byte* input;
    2789929687            int   inputSz = HANDSHAKE_HEADER_SZ; /* build msg adds rec hdr */
     29688            int   recordHeaderSz = RECORD_HEADER_SZ;
     29689
     29690            if (ssl->options.dtls) {
     29691                recordHeaderSz += DTLS_RECORD_EXTRA;
     29692                inputSz += DTLS_HANDSHAKE_EXTRA;
     29693            }
    2790029694
    2790129695            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     
    2790329697                return MEMORY_E;
    2790429698
    27905             XMEMCPY(input, output + RECORD_HEADER_SZ, inputSz);
     29699            XMEMCPY(input, output + recordHeaderSz, inputSz);
     29700            #ifdef WOLFSSL_DTLS
     29701            if (IsDtlsNotSctpMode(ssl) &&
     29702                    (ret = DtlsMsgPoolSave(ssl, input, inputSz, hello_request)) != 0) {
     29703                XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     29704                return ret;
     29705            }
     29706            #endif
    2790629707            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
    27907                                   handshake, 0, 0, 0);
     29708                                  handshake, 0, 0, 0, CUR_ORDER);
    2790829709            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
    2790929710
     
    2793529736        int   ret;
    2793629737
     29738        /* are we in scr */
     29739        if (IsEncryptionOn(ssl, 1)) {
     29740            sendSz += MAX_MSG_EXTRA;
     29741        }
     29742
    2793729743        /* check for available size */
    2793829744        if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
     
    2797029776                          sendSz, WRITE_PROTO, ssl->heap);
    2797129777#endif
     29778
     29779        /* are we in scr */
     29780        if (IsEncryptionOn(ssl, 1)) {
     29781            byte* input;
     29782            int   inputSz = HANDSHAKE_HEADER_SZ + length; /* build msg adds rec hdr */
     29783            int   recordHeaderSz = RECORD_HEADER_SZ;
     29784
     29785            if (ssl->options.dtls) {
     29786                recordHeaderSz += DTLS_RECORD_EXTRA;
     29787                inputSz += DTLS_HANDSHAKE_EXTRA;
     29788            }
     29789
     29790            input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     29791            if (input == NULL)
     29792                return MEMORY_E;
     29793
     29794            XMEMCPY(input, output + recordHeaderSz, inputSz);
     29795            sendSz = BuildMessage(ssl, output, sendSz, input, inputSz,
     29796                                  handshake, 0, 0, 0, CUR_ORDER);
     29797            XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER);
     29798
     29799            if (sendSz < 0)
     29800                return sendSz;
     29801        }
    2797229802
    2797329803        ssl->buffers.outputBuffer.length += sendSz;
     
    2805429884                }
    2805529885
    28056             #ifndef NO_CERTS
     29886            #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
    2805729887                if (ssl->options.verifyPeer && ssl->options.failNoCert) {
    2805829888                    if (!ssl->options.havePeerCert) {
     
    2806929899                    }
    2807029900                }
    28071             #endif /* !NO_CERTS */
     29901            #endif /* !NO_CERTS && !WOLFSSL_NO_CLIENT_AUTH */
    2807229902
    2807329903            #if defined(WOLFSSL_CALLBACKS)
     
    2825430084                        if (ssl->arrays->psk_keySz == 0 ||
    2825530085                                ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
     30086                            #if defined(WOLFSSL_EXTRA_ALERTS) || \
     30087                                defined(WOLFSSL_PSK_IDENTITY_ALERT)
     30088                                SendAlert(ssl, alert_fatal,
     30089                                        unknown_psk_identity);
     30090                            #endif
    2825630091                            ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
    2825730092                        }
     
    2850730342
    2850830343                        ssl->peerEccKeyPresent = 1;
     30344
     30345                    #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE)
     30346                        /* client_hello may have sent FFEDH2048, which sets namedGroup,
     30347                            but that is not being used, so clear it */
     30348                        /* resolves issue with server side wolfSSL_get_curve_name */
     30349                        ssl->namedGroup = 0;
     30350                    #endif
    2850930351                #endif /* HAVE_ECC */
    2851030352
     
    2912730969                        if (ssl->arrays->psk_keySz == 0 ||
    2912830970                                ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
     30971                            #if defined(WOLFSSL_EXTRA_ALERTS) || \
     30972                                defined(WOLFSSL_PSK_IDENTITY_ALERT)
     30973                                SendAlert(ssl, alert_fatal,
     30974                                        unknown_psk_identity);
     30975                            #endif
    2912930976                            ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
    2913030977                        }
     
    2924231089
    2924331090                ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE;
    29244             #ifndef NO_CERTS
     31091            #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
    2924531092                if (ssl->options.verifyPeer) {
    2924631093                    ret = BuildCertHashes(ssl, &ssl->hsHashes->certHashes);
     
    2928331130#endif /* !WOLFSSL_NO_TLS12 */
    2928431131
    29285 #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
    29286     defined(WOLFSSL_HAPROXY)
     31132#ifdef HAVE_SNI
    2928731133    int SNI_Callback(WOLFSSL* ssl)
    2928831134    {
     
    2930031146        return 0;
    2930131147    }
    29302 #endif /* OPENSSL_ALL || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
     31148#endif /* HAVE_SNI */
    2930331149
    2930431150#endif /* NO_WOLFSSL_SERVER */
     
    2941231258#endif /* HAVE_MAX_FRAGMENT */
    2941331259#ifdef WOLFSSL_DTLS
    29414     if ((ssl->options.dtls) && (maxFragment > MAX_UDP_SIZE)) {
    29415         maxFragment = MAX_UDP_SIZE;
     31260    if (IsDtlsNotSctpMode(ssl)) {
     31261        if (maxFragment > MAX_UDP_SIZE) {
     31262            maxFragment = MAX_UDP_SIZE;
     31263        }
     31264    #if defined(WOLFSSL_DTLS_MTU)
     31265        if (maxFragment >
     31266                        ssl->dtlsMtuSz - RECORD_HEADER_SZ - DTLS_RECORD_EXTRA) {
     31267            maxFragment = ssl->dtlsMtuSz - RECORD_HEADER_SZ - DTLS_RECORD_EXTRA;
     31268        }
     31269    #endif
    2941631270    }
    2941731271#endif
Note: See TracChangeset for help on using the changeset viewer.