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:
10 edited
1 moved

Legend:

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

    r457 r464  
    160160static int wolfSSL_BIO_MD_read(WOLFSSL_BIO* bio, void* buf, int sz)
    161161{
    162     int ret = sz;
    163 
    164162    if (wolfSSL_EVP_MD_CTX_type((WOLFSSL_EVP_MD_CTX*)bio->ptr) == NID_hmac) {
    165163        if (wolfSSL_EVP_DigestSignUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, buf,
    166164                        sz) != WOLFSSL_SUCCESS)
    167165        {
    168             ret = WOLFSSL_FATAL_ERROR;
     166            return WOLFSSL_FATAL_ERROR;
    169167        }
    170168    }
    171169    else {
    172         if (wolfSSL_EVP_DigestUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, buf, ret)
     170        if (wolfSSL_EVP_DigestUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, buf, sz)
    173171                != WOLFSSL_SUCCESS) {
    174             ret = WOLFSSL_FATAL_ERROR;
    175         }
    176     }
    177     return ret;
     172            return WOLFSSL_FATAL_ERROR;
     173        }
     174    }
     175    return sz;
    178176}
    179177#endif /* WOLFCRYPT_ONLY */
     
    232230    #ifndef NO_FILESYSTEM
    233231        if (bio && bio->type == WOLFSSL_BIO_FILE) {
    234             ret = (int)XFREAD(buf, 1, len, (XFILE)bio->ptr);
     232            if (bio->ptr)
     233                ret = (int)XFREAD(buf, 1, len, (XFILE)bio->ptr);
     234        #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR)\
     235            && !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2)
     236            else
     237                ret = (int)XREAD(bio->num, buf, len);
     238        #endif
    235239        }
    236240    #endif
     
    574578
    575579        /* write bios */
    576         if (bio && bio->type == WOLFSSL_BIO_BIO) {
     580        if (bio->type == WOLFSSL_BIO_BIO) {
    577581            ret = wolfSSL_BIO_BIO_write(bio, data, len);
    578582        }
    579583
    580         if (bio && bio->type == WOLFSSL_BIO_MEMORY) {
     584        if (bio->type == WOLFSSL_BIO_MEMORY) {
    581585            ret = wolfSSL_BIO_MEMORY_write(bio, data, len);
    582586        }
     
    584588    #ifndef NO_FILESYSTEM
    585589        if (bio && bio->type == WOLFSSL_BIO_FILE) {
    586             ret = (int)XFWRITE(data, 1, len, (XFILE)bio->ptr);
     590            if (bio->ptr)
     591                ret = (int)XFWRITE(data, 1, len, (XFILE)bio->ptr);
     592        #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR)\
     593            && !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2)
     594            else
     595                ret = (int)XWRITE(bio->num, data, len);
     596        #endif
    587597        }
    588598    #endif
    589599
    590600    #ifndef WOLFCRYPT_ONLY
    591         if (bio && bio->type == WOLFSSL_BIO_SSL) {
     601        if (bio->type == WOLFSSL_BIO_SSL) {
    592602            /* already got eof, again is error */
    593603            if (front->eof) {
     
    599609        }
    600610
    601         if (bio && bio->type == WOLFSSL_BIO_MD) {
     611        if (bio->type == WOLFSSL_BIO_MD) {
    602612            if (bio->next != NULL) { /* data passing through MD BIO */
    603613                ret = wolfSSL_BIO_MD_write(bio, data, len);
     
    608618        /* advance to the next bio in list */
    609619        bio = bio->next;
    610     }
    611 
    612     if (frmt != NULL) {
    613         XFREE(frmt, front->heap, DYNAMIC_TYPE_TMP_BUFFER);
    614620    }
    615621
     
    619625                                 WOLFSSL_BIO_CB_WRITE | WOLFSSL_BIO_CB_RETURN,
    620626                                 (const char*)data, 0, 0, ret);
     627    }
     628
     629    if (frmt != NULL) {
     630        XFREE(frmt, front->heap, DYNAMIC_TYPE_TMP_BUFFER);
    621631    }
    622632
     
    943953    }
    944954
    945     if (bio->type == WOLFSSL_BIO_MD) {
    946         /* MD is a wrapper only get next bio */
     955    if (bio->type == WOLFSSL_BIO_MD ||
     956            bio->type == WOLFSSL_BIO_BASE64) {
     957        /* these are wrappers only, get next bio */
    947958        while (bio->next != NULL) {
    948959            bio = bio->next;
    949             if (bio->type != WOLFSSL_BIO_MD) {
     960            if (bio->type == WOLFSSL_BIO_MD ||
     961                    bio->type == WOLFSSL_BIO_BASE64) {
    950962                break;
    951963            }
     
    13081320                const WOLFSSL_EVP_MD* md =
    13091321                    wolfSSL_EVP_MD_CTX_md((WOLFSSL_EVP_MD_CTX*)bio->ptr);
     1322                wolfSSL_EVP_MD_CTX_cleanup((WOLFSSL_EVP_MD_CTX*)bio->ptr);
    13101323                wolfSSL_EVP_MD_CTX_init((WOLFSSL_EVP_MD_CTX*)bio->ptr);
    13111324                wolfSSL_EVP_DigestInit((WOLFSSL_EVP_MD_CTX*)bio->ptr, md);
     
    13221335
    13231336#ifndef NO_FILESYSTEM
     1337/**
     1338 * Creates a new file BIO object
     1339 * @param fd file descriptor for to use for the new object
     1340 * @param close_flag BIO_NOCLOSE or BIO_CLOSE
     1341 * @return New BIO object or NULL on failure
     1342 */
     1343WOLFSSL_BIO *wolfSSL_BIO_new_fd(int fd, int close_flag)
     1344{
     1345    WOLFSSL_BIO* bio;
     1346
     1347    bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
     1348    if (!bio) {
     1349        WOLFSSL_MSG("wolfSSL_BIO_new error");
     1350        return NULL;
     1351    }
     1352
     1353    if (wolfSSL_BIO_set_fd(bio, fd, close_flag) != WOLFSSL_SUCCESS) {
     1354        wolfSSL_BIO_free(bio);
     1355        WOLFSSL_MSG("wolfSSL_BIO_set_fp error");
     1356        return NULL;
     1357    }
     1358
     1359    return bio;
     1360}
     1361
    13241362long wolfSSL_BIO_set_fp(WOLFSSL_BIO *bio, XFILE fp, int c)
    13251363{
     
    15281566long wolfSSL_BIO_set_nbio(WOLFSSL_BIO* bio, long on)
    15291567{
     1568    int ret = 0;
    15301569    #ifndef WOLFSSL_DTLS
    15311570    (void)on;
     
    15391578                int flag = XFCNTL(bio->num, F_GETFL, 0);
    15401579                if (on)
    1541                     XFCNTL(bio->num, F_SETFL, flag | O_NONBLOCK);
     1580                    ret = XFCNTL(bio->num, F_SETFL, flag | O_NONBLOCK);
    15421581                else
    1543                     XFCNTL(bio->num, F_SETFL, flag & ~O_NONBLOCK);
     1582                    ret = XFCNTL(bio->num, F_SETFL, flag & ~O_NONBLOCK);
    15441583            }
    15451584        #endif
     
    15551594            break;
    15561595    }
    1557 
    1558     return 1;
     1596    if (ret != -1)
     1597        return 1;
     1598    else
     1599        return 0;
    15591600}
    15601601
     
    16781719int wolfSSL_BIO_get_mem_data(WOLFSSL_BIO* bio, void* p)
    16791720{
     1721    WOLFSSL_BIO* mem_bio;
    16801722    WOLFSSL_ENTER("wolfSSL_BIO_get_mem_data");
    16811723
     
    16831725        return WOLFSSL_FATAL_ERROR;
    16841726
     1727    mem_bio = bio;
     1728    /* Return pointer from last memory BIO in chain */
     1729    while (bio->next) {
     1730        bio = bio->next;
     1731        if (bio->type == WOLFSSL_BIO_MEMORY)
     1732            mem_bio = bio;
     1733    }
     1734
    16851735    if (p) {
    1686         *(byte**)p = (byte*)bio->ptr;
    1687     }
    1688 
    1689     return bio->num;
     1736        *(byte**)p = (byte*)mem_bio->ptr;
     1737    }
     1738
     1739    return mem_bio->num;
    16901740}
    16911741
  • azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/src/crl.c

    r457 r464  
    3535#include <wolfssl/error-ssl.h>
    3636
    37 #include <string.h>
     37#ifndef WOLFSSL_LINUXKM
     38    #include <string.h>
     39#endif
    3840
    3941#ifdef HAVE_CRL_MONITOR
     
    491493
    492494#if defined(OPENSSL_EXTRA) && defined(HAVE_CRL)
     495/* helper function to create a new dynamic WOLFSSL_X509_CRL structure */
     496static WOLFSSL_X509_CRL* wolfSSL_X509_crl_new(WOLFSSL_CERT_MANAGER* cm)
     497{
     498    WOLFSSL_X509_CRL* ret;
     499
     500    ret = (WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), cm->heap,
     501                DYNAMIC_TYPE_CRL);
     502    if (ret != NULL) {
     503        if (InitCRL(ret, cm) < 0) {
     504            WOLFSSL_MSG("Unable to initialize new CRL structure");
     505            XFREE(ret, cm->heap, DYNAMIC_TYPE_CRL);
     506            ret = NULL;
     507        }
     508    }
     509    return ret;
     510}
     511
     512
     513/* returns head of copied list that was alloc'd */
     514static RevokedCert *DupRevokedCertList(RevokedCert* in, void* heap)
     515{
     516    RevokedCert* head = NULL;
     517    RevokedCert* current = in;
     518    RevokedCert* prev = NULL;
     519    while (current) {
     520        RevokedCert* tmp = (RevokedCert*)XMALLOC(sizeof(RevokedCert), heap,
     521                DYNAMIC_TYPE_REVOKED);
     522        if (tmp != NULL) {
     523            XMEMCPY(tmp->serialNumber, current->serialNumber,
     524                    EXTERNAL_SERIAL_SIZE);
     525            tmp->serialSz = current->serialSz;
     526            tmp->next = NULL;
     527            if (prev != NULL)
     528                prev->next = tmp;
     529            if (head == NULL)
     530                head = tmp;
     531            prev = tmp;
     532        }
     533        else {
     534            WOLFSSL_MSG("Failed to allocate new RevokedCert structure");
     535            /* free up any existing list */
     536            while (head != NULL) {
     537                current = head;
     538                head = head->next;
     539                XFREE(current, heap, DYNAMIC_TYPE_REVOKED);
     540            }
     541            return NULL;
     542        }
     543        current = current->next;
     544    }
     545
     546    (void)heap;
     547    return head;
     548}
     549
     550
     551/* returns a deep copy of ent on success and null on fail */
     552static CRL_Entry* DupCRL_Entry(const CRL_Entry* ent, void* heap)
     553{
     554    CRL_Entry *dupl;
     555
     556    dupl = (CRL_Entry*)XMALLOC(sizeof(CRL_Entry), heap, DYNAMIC_TYPE_CRL_ENTRY);
     557    if (dupl == NULL) {
     558        WOLFSSL_MSG("alloc CRL Entry failed");
     559        return NULL;
     560    }
     561    XMEMSET(dupl, 0, sizeof(CRL_Entry));
     562
     563    XMEMCPY(dupl->issuerHash, ent->issuerHash, CRL_DIGEST_SIZE);
     564    XMEMCPY(dupl->lastDate, ent->lastDate, MAX_DATE_SIZE);
     565    XMEMCPY(dupl->nextDate, ent->nextDate, MAX_DATE_SIZE);
     566    dupl->lastDateFormat = ent->lastDateFormat;
     567    dupl->nextDateFormat = ent->nextDateFormat;
     568    dupl->certs = DupRevokedCertList(ent->certs, heap);
     569
     570    dupl->totalCerts = ent->totalCerts;
     571    dupl->verified = ent->verified;
     572
     573    if (!ent->verified) {
     574        dupl->tbsSz = ent->tbsSz;
     575        dupl->signatureSz = ent->signatureSz;
     576        dupl->signatureOID = ent->signatureOID;
     577        dupl->toBeSigned = (byte*)XMALLOC(dupl->tbsSz, heap,
     578                                          DYNAMIC_TYPE_CRL_ENTRY);
     579        if (dupl->toBeSigned == NULL) {
     580            FreeCRL_Entry(dupl, heap);
     581            XFREE(dupl, heap, DYNAMIC_TYPE_CRL_ENTRY);
     582            return NULL;
     583        }
     584
     585        dupl->signature = (byte*)XMALLOC(dupl->signatureSz, heap,
     586                                         DYNAMIC_TYPE_CRL_ENTRY);
     587        if (dupl->signature == NULL) {
     588            FreeCRL_Entry(dupl, heap);
     589            XFREE(dupl, heap, DYNAMIC_TYPE_CRL_ENTRY);
     590            return NULL;
     591        }
     592        XMEMCPY(dupl->toBeSigned, ent->toBeSigned, dupl->tbsSz);
     593        XMEMCPY(dupl->signature, ent->signature, dupl->signatureSz);
     594    #ifndef NO_SKID
     595        dupl->extAuthKeyIdSet = ent->extAuthKeyIdSet;
     596        if (dupl->extAuthKeyIdSet)
     597            XMEMCPY(dupl->extAuthKeyId, ent->extAuthKeyId, KEYID_SIZE);
     598    #endif
     599    }
     600    else {
     601        dupl->toBeSigned = NULL;
     602        dupl->tbsSz = 0;
     603        dupl->signature = NULL;
     604        dupl->signatureSz = 0;
     605    }
     606
     607    return dupl;
     608}
     609
     610
     611/* returns the head of a deep copy of the list on success and null on fail */
     612static CRL_Entry* DupCRL_list(CRL_Entry* crl, void* heap)
     613{
     614    CRL_Entry* current;
     615    CRL_Entry* head = NULL;
     616    CRL_Entry* prev = NULL;
     617
     618    current = crl;
     619    while (current != NULL) {
     620        CRL_Entry* tmp = DupCRL_Entry(current, heap);
     621        if (tmp != NULL) {
     622            tmp->next = NULL;
     623            if (head == NULL)
     624                head = tmp;
     625            if (prev != NULL)
     626                prev->next = tmp;
     627            prev = tmp;
     628        }
     629        else {
     630            WOLFSSL_MSG("Failed to allocate new CRL_Entry structure");
     631            /* free up any existing list */
     632            while (head != NULL) {
     633                current = head;
     634                head = head->next;
     635                FreeCRL_Entry(current, heap);
     636            }
     637
     638            return NULL;
     639        }
     640        current = current->next;
     641    }
     642    return head;
     643}
     644
     645
     646/* Duplicates everything except the parent cm pointed to.
     647 * Expects that Init has already been done to 'dupl'
     648 * return 0 on success */
     649static int DupX509_CRL(WOLFSSL_X509_CRL *dupl, const WOLFSSL_X509_CRL* crl)
     650{
     651    if (dupl == NULL || crl == NULL) {
     652        return BAD_FUNC_ARG;
     653    }
     654
     655    if (crl->monitors[0].path) {
     656        int pathSz = (int)XSTRLEN(crl->monitors[0].path) + 1;
     657        dupl->monitors[0].path = (char*)XMALLOC(pathSz, dupl->heap,
     658                DYNAMIC_TYPE_CRL_MONITOR);
     659        if (dupl->monitors[0].path != NULL) {
     660            XSTRNCPY(dupl->monitors[0].path, crl->monitors[0].path, pathSz);
     661        }
     662        else {
     663            return MEMORY_E;
     664        }
     665    }
     666
     667    if (crl->monitors[1].path) {
     668        int pathSz = (int)XSTRLEN(crl->monitors[1].path) + 1;
     669        dupl->monitors[1].path = (char*)XMALLOC(pathSz, dupl->heap,
     670                DYNAMIC_TYPE_CRL_MONITOR);
     671        if (dupl->monitors[1].path != NULL) {
     672            XSTRNCPY(dupl->monitors[1].path, crl->monitors[1].path, pathSz);
     673        }
     674        else {
     675            if (dupl->monitors[0].path != NULL) {
     676                XFREE(dupl->monitors[0].path, dupl->heap,
     677                        DYNAMIC_TYPE_CRL_MONITOR);
     678            }
     679            return MEMORY_E;
     680        }
     681    }
     682
     683    dupl->crlList = DupCRL_list(crl->crlList, dupl->heap);
     684#ifdef HAVE_CRL_IO
     685    dupl->crlIOCb = crl->crlIOCb;
     686#endif
     687
     688    return 0;
     689}
     690
     691/* returns WOLFSSL_SUCCESS on success. Does not take ownership of newcrl */
    493692int wolfSSL_X509_STORE_add_crl(WOLFSSL_X509_STORE *store, WOLFSSL_X509_CRL *newcrl)
    494693{
    495694    CRL_Entry   *crle;
    496     WOLFSSL_CRL *crl;
     695    WOLFSSL_X509_CRL *crl;
    497696
    498697    WOLFSSL_ENTER("wolfSSL_X509_STORE_add_crl");
    499     if (store == NULL || newcrl == NULL)
     698    if (store == NULL || newcrl == NULL || store->cm == NULL)
    500699        return BAD_FUNC_ARG;
    501700
    502     crl = store->crl;
    503     crle = newcrl->crlList;
    504 
    505     if (wc_LockMutex(&crl->crlLock) != 0)
    506     {
    507         WOLFSSL_MSG("wc_LockMutex failed");
    508         return BAD_MUTEX_E;
    509     }
    510     crle->next = crl->crlList;
    511     crl->crlList = crle;
    512     newcrl->crlList = NULL;
    513     wc_UnLockMutex(&crl->crlLock);
     701    if (store->cm->crl == NULL) {
     702        crl = wolfSSL_X509_crl_new(store->cm);
     703        if (DupX509_CRL(crl, newcrl) != 0) {
     704            FreeCRL(crl, 1);
     705            return WOLFSSL_FAILURE;
     706        }
     707        store->crl = store->cm->crl = crl;
     708        if (wolfSSL_CertManagerEnableCRL(store->cm, WOLFSSL_CRL_CHECKALL)
     709                != WOLFSSL_SUCCESS) {
     710            WOLFSSL_MSG("wolfSSL_CertManagerEnableCRL error");
     711            return WOLFSSL_FAILURE;
     712        }
     713        return WOLFSSL_SUCCESS;
     714    }
     715
     716    /* find tail of current list and add new list */
     717    crl  = store->cm->crl;
     718    crle = crl->crlList;
     719    if (newcrl->crlList != NULL) {
     720        CRL_Entry *tail = crle;
     721        CRL_Entry *toAdd;
     722
     723        if (wc_LockMutex(&crl->crlLock) != 0)
     724        {
     725            WOLFSSL_MSG("wc_LockMutex failed");
     726            return BAD_MUTEX_E;
     727        }
     728
     729        toAdd = DupCRL_list(newcrl->crlList, crl->heap);
     730        if (tail == NULL) {
     731            crl->crlList = toAdd;
     732        }
     733        else {
     734            while (tail->next != NULL) tail = tail->next;
     735            tail->next = toAdd;
     736        }
     737        wc_UnLockMutex(&crl->crlLock);
     738    }
     739
     740    if (wolfSSL_CertManagerEnableCRL(store->cm, WOLFSSL_CRL_CHECKALL)
     741            != WOLFSSL_SUCCESS) {
     742        WOLFSSL_MSG("wolfSSL_CertManagerEnableCRL error");
     743        return WOLFSSL_FAILURE;
     744    }
    514745
    515746    WOLFSSL_LEAVE("wolfSSL_X509_STORE_add_crl", WOLFSSL_SUCCESS);
     
    8821113
    8831114        if (FD_ISSET(crl->mfd, &readfds)) {
     1115            word64 r64;
     1116            int    rlen;
     1117
    8841118            WOLFSSL_MSG("got custom shutdown event, breaking out");
     1119
     1120            /* read out the bytes written to the event to clean up */
     1121            rlen = (int) read(crl->mfd, &r64, sizeof(r64));
     1122            if (rlen < 0) {
     1123                WOLFSSL_MSG("read custom event failure");
     1124            }
     1125
    8851126            break;
    8861127        }
     
    9611202#else /* HAVE_CRL_MONITOR */
    9621203
    963 #ifndef NO_FILESYSTEM
     1204#if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR)
    9641205
    9651206static int StartMonitorCRL(WOLFSSL_CRL* crl)
     
    9731214}
    9741215
    975 #endif /* NO_FILESYSTEM */
     1216#endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */
    9761217
    9771218#endif  /* HAVE_CRL_MONITOR */
  • 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
  • azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/src/keys.c

    r457 r464  
    10751075        ssl->specs.pad_size              = PAD_SHA;
    10761076        ssl->specs.static_ecdh           = 0;
    1077         ssl->specs.key_size              = WC_SHA256_DIGEST_SIZE / 2;
     1077        ssl->specs.key_size              = WC_SHA256_DIGEST_SIZE;
    10781078        ssl->specs.block_size            = 0;
    10791079        ssl->specs.iv_size               = HMAC_NONCE_SZ;
     
    10931093        ssl->specs.pad_size              = PAD_SHA;
    10941094        ssl->specs.static_ecdh           = 0;
    1095         ssl->specs.key_size              = WC_SHA384_DIGEST_SIZE / 2;
     1095        ssl->specs.key_size              = WC_SHA384_DIGEST_SIZE;
    10961096        ssl->specs.block_size            = 0;
    10971097        ssl->specs.iv_size               = HMAC_NONCE_SZ;
     
    29102910            }
    29112911
     2912            if (enc) {
     2913                if (wc_HmacInit(enc->hmac, heap, devId) != 0) {
     2914                    WOLFSSL_MSG("HmacInit failed in SetKeys");
     2915                    XFREE(enc->hmac, heap, DYNAMIC_TYPE_CIPHER);
     2916                    enc->hmac = NULL;
     2917                    return ASYNC_INIT_E;
     2918                }
     2919            }
     2920
    29122921            if (dec && dec->hmac == NULL) {
    29132922                dec->hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap,
     
    29172926            }
    29182927
    2919             if (enc) {
    2920                 if (wc_HmacInit(enc->hmac, heap, devId) != 0) {
    2921                     WOLFSSL_MSG("HmacInit failed in SetKeys");
    2922                     return ASYNC_INIT_E;
    2923                 }
    2924             }
    29252928            if (dec) {
    29262929                if (wc_HmacInit(dec->hmac, heap, devId) != 0) {
    29272930                    WOLFSSL_MSG("HmacInit failed in SetKeys");
     2931                    XFREE(dec->hmac, heap, DYNAMIC_TYPE_CIPHER);
     2932                    dec->hmac = NULL;
    29282933                    return ASYNC_INIT_E;
    29292934                }
     
    29322937            if (side == WOLFSSL_CLIENT_END) {
    29332938                if (enc) {
     2939                    XMEMCPY(keys->aead_enc_imp_IV, keys->client_write_IV,
     2940                            HMAC_NONCE_SZ);
    29342941                    hmacRet = wc_HmacSetKey(enc->hmac, hashType,
    29352942                                       keys->client_write_key, specs->key_size);
     
    29372944                }
    29382945                if (dec) {
     2946                    XMEMCPY(keys->aead_dec_imp_IV, keys->server_write_IV,
     2947                            HMAC_NONCE_SZ);
    29392948                    hmacRet = wc_HmacSetKey(dec->hmac, hashType,
    29402949                                       keys->server_write_key, specs->key_size);
     
    29442953            else {
    29452954                if (enc) {
     2955                    XMEMCPY(keys->aead_enc_imp_IV, keys->server_write_IV,
     2956                            HMAC_NONCE_SZ);
    29462957                    hmacRet = wc_HmacSetKey(enc->hmac, hashType,
    29472958                                       keys->server_write_key, specs->key_size);
     
    29492960                }
    29502961                if (dec) {
     2962                    XMEMCPY(keys->aead_dec_imp_IV, keys->client_write_IV,
     2963                            HMAC_NONCE_SZ);
    29512964                    hmacRet = wc_HmacSetKey(dec->hmac, hashType,
    29522965                                       keys->client_write_key, specs->key_size);
     
    30593072    if (ssl->secure_renegotiation && ssl->secure_renegotiation->cache_status) {
    30603073        keys = &ssl->secure_renegotiation->tmp_keys;
    3061         copy = 1;
     3074#ifdef WOLFSSL_DTLS
     3075        /* For DTLS, copy is done in StoreKeys */
     3076        if (!ssl->options.dtls)
     3077#endif
     3078            copy = 1;
    30623079    }
    30633080#endif /* HAVE_SECURE_RENEGOTIATION */
     
    31343151
    31353152#ifdef HAVE_SECURE_RENEGOTIATION
     3153#ifdef WOLFSSL_DTLS
     3154    if (ret == 0 && ssl->options.dtls) {
     3155        if (wc_encrypt)
     3156            wc_encrypt->src = keys == &ssl->keys ? KEYS : SCR;
     3157        if (wc_decrypt)
     3158            wc_decrypt->src = keys == &ssl->keys ? KEYS : SCR;
     3159    }
     3160#endif
     3161
    31363162    if (copy) {
    31373163        int clientCopy = 0;
     
    32103236    int sz, i = 0;
    32113237    Keys* keys = &ssl->keys;
     3238#ifdef WOLFSSL_DTLS
     3239    /* In case of DTLS, ssl->keys is updated here */
     3240    int scr_copy = 0;
     3241#endif
    32123242
    32133243#ifdef HAVE_SECURE_RENEGOTIATION
    3214     if (ssl->secure_renegotiation && ssl->secure_renegotiation->cache_status ==
    3215                                                             SCR_CACHE_NEEDED) {
     3244    if (ssl->secure_renegotiation &&
     3245            ssl->secure_renegotiation->cache_status == SCR_CACHE_NEEDED) {
    32163246        keys = &ssl->secure_renegotiation->tmp_keys;
     3247#ifdef WOLFSSL_DTLS
     3248        if (ssl->options.dtls) {
     3249            /* epoch is incremented after StoreKeys is called */
     3250            ssl->secure_renegotiation->tmp_keys.dtls_epoch = ssl->keys.dtls_epoch + 1;
     3251            /* we only need to copy keys on second and future renegotiations */
     3252            if (ssl->keys.dtls_epoch > 1)
     3253                scr_copy = 1;
     3254            ssl->encrypt.src = KEYS_NOT_SET;
     3255            ssl->decrypt.src = KEYS_NOT_SET;
     3256        }
     3257#endif
    32173258        CacheStatusPP(ssl->secure_renegotiation);
    32183259    }
     
    32253266            sz = ssl->specs.hash_size;
    32263267    #ifndef WOLFSSL_AEAD_ONLY
     3268
     3269    #ifdef WOLFSSL_DTLS
     3270            if (scr_copy) {
     3271                XMEMCPY(ssl->keys.client_write_MAC_secret,
     3272                        keys->client_write_MAC_secret, sz);
     3273                XMEMCPY(ssl->keys.server_write_MAC_secret,
     3274                        keys->server_write_MAC_secret, sz);
     3275            }
     3276    #endif
    32273277            XMEMCPY(keys->client_write_MAC_secret,&keyData[i], sz);
    32283278            XMEMCPY(keys->server_write_MAC_secret,&keyData[i], sz);
     
    32313281        }
    32323282        sz = ssl->specs.key_size;
     3283    #ifdef WOLFSSL_DTLS
     3284        if (scr_copy) {
     3285            XMEMCPY(ssl->keys.client_write_key,
     3286                    keys->client_write_key, sz);
     3287            XMEMCPY(ssl->keys.server_write_key,
     3288                    keys->server_write_key, sz);
     3289        }
     3290    #endif
    32333291        XMEMCPY(keys->client_write_key, &keyData[i], sz);
    32343292        XMEMCPY(keys->server_write_key, &keyData[i], sz);
     
    32363294
    32373295        sz = ssl->specs.iv_size;
     3296    #ifdef WOLFSSL_DTLS
     3297        if (scr_copy) {
     3298            XMEMCPY(ssl->keys.client_write_IV,
     3299                    keys->client_write_IV, sz);
     3300            XMEMCPY(ssl->keys.server_write_IV,
     3301                    keys->server_write_IV, sz);
     3302        }
     3303    #endif
    32383304        XMEMCPY(keys->client_write_IV, &keyData[i], sz);
    32393305        XMEMCPY(keys->server_write_IV, &keyData[i], sz);
     
    32423308        if (ssl->specs.cipher_type == aead) {
    32433309            /* Initialize the AES-GCM/CCM explicit IV to a zero. */
     3310        #ifdef WOLFSSL_DTLS
     3311            if (scr_copy) {
     3312                XMEMCPY(ssl->keys.aead_exp_IV,
     3313                        keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
     3314            }
     3315        #endif
    32443316            XMEMSET(keys->aead_exp_IV, 0, AEAD_MAX_EXP_SZ);
    32453317        }
     
    32543326        if (side & PROVISION_CLIENT) {
    32553327    #ifndef WOLFSSL_AEAD_ONLY
     3328        #ifdef WOLFSSL_DTLS
     3329            if (scr_copy)
     3330                XMEMCPY(ssl->keys.client_write_MAC_secret,
     3331                        keys->client_write_MAC_secret, sz);
     3332        #endif
    32563333            XMEMCPY(keys->client_write_MAC_secret,&keyData[i], sz);
    32573334    #endif
     
    32603337        if (side & PROVISION_SERVER) {
    32613338    #ifndef WOLFSSL_AEAD_ONLY
     3339        #ifdef WOLFSSL_DTLS
     3340            if (scr_copy)
     3341                XMEMCPY(ssl->keys.server_write_MAC_secret,
     3342                        keys->server_write_MAC_secret, sz);
     3343        #endif
    32623344            XMEMCPY(keys->server_write_MAC_secret,&keyData[i], sz);
    32633345    #endif
     
    32673349    sz = ssl->specs.key_size;
    32683350    if (side & PROVISION_CLIENT) {
     3351    #ifdef WOLFSSL_DTLS
     3352        if (scr_copy)
     3353            XMEMCPY(ssl->keys.client_write_key,
     3354                    keys->client_write_key, sz);
     3355    #endif
    32693356        XMEMCPY(keys->client_write_key, &keyData[i], sz);
    32703357        i += sz;
    32713358    }
    32723359    if (side & PROVISION_SERVER) {
     3360    #ifdef WOLFSSL_DTLS
     3361        if (scr_copy)
     3362            XMEMCPY(ssl->keys.server_write_key,
     3363                    keys->server_write_key, sz);
     3364    #endif
    32733365        XMEMCPY(keys->server_write_key, &keyData[i], sz);
    32743366        i += sz;
     
    32773369    sz = ssl->specs.iv_size;
    32783370    if (side & PROVISION_CLIENT) {
     3371    #ifdef WOLFSSL_DTLS
     3372        if (scr_copy)
     3373            XMEMCPY(ssl->keys.client_write_IV,
     3374                    keys->client_write_IV, sz);
     3375    #endif
    32793376        XMEMCPY(keys->client_write_IV, &keyData[i], sz);
    32803377        i += sz;
    32813378    }
    3282     if (side & PROVISION_SERVER)
     3379    if (side & PROVISION_SERVER) {
     3380    #ifdef WOLFSSL_DTLS
     3381        if (scr_copy)
     3382            XMEMCPY(ssl->keys.server_write_IV,
     3383                    keys->server_write_IV, sz);
     3384    #endif
    32833385        XMEMCPY(keys->server_write_IV, &keyData[i], sz);
     3386    }
    32843387
    32853388#ifdef HAVE_AEAD
    32863389    if (ssl->specs.cipher_type == aead) {
    32873390        /* Initialize the AES-GCM/CCM explicit IV to a zero. */
     3391    #ifdef WOLFSSL_DTLS
     3392        if (scr_copy)
     3393            XMEMMOVE(ssl->keys.aead_exp_IV,
     3394                    keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
     3395    #endif
    32883396        XMEMSET(keys->aead_exp_IV, 0, AEAD_MAX_EXP_SZ);
    32893397    }
     
    33423450    }
    33433451#endif
    3344 
     3452    XMEMSET(shaOutput, 0, WC_SHA_DIGEST_SIZE);
    33453453    ret = wc_InitMd5(md5);
    33463454    if (ret == 0) {
     
    34723580    }
    34733581#endif
     3582    XMEMSET(shaOutput, 0, WC_SHA_DIGEST_SIZE);
    34743583
    34753584    ret = wc_InitMd5(md5);
  • azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/src/ocsp.c

    r457 r464  
    7676    CertStatus *status, *next;
    7777
     78    if (entry == NULL)
     79        return;
     80
    7881    WOLFSSL_ENTER("FreeOcspEntry");
    7982
     
    8386        if (status->rawOcspResponse)
    8487            XFREE(status->rawOcspResponse, heap, DYNAMIC_TYPE_OCSP_STATUS);
     88
     89#ifdef OPENSSL_EXTRA
     90        if (status->serialInt) {
     91            if (status->serialInt->isDynamic) {
     92                XFREE(status->serialInt->data, NULL, DYNAMIC_TYPE_OPENSSL);
     93            }
     94            XFREE(status->serialInt, NULL, DYNAMIC_TYPE_OPENSSL);
     95        }
     96        status->serialInt = NULL;
     97#endif
    8598
    8699        XFREE(status, heap, DYNAMIC_TYPE_OCSP_STATUS);
     
    273286#ifdef WOLFSSL_SMALL_STACK
    274287    CertStatus*   newStatus;
     288    OcspEntry*    newSingle;
    275289    OcspResponse* ocspResponse;
    276290#else
    277291    CertStatus    newStatus[1];
     292    OcspEntry     newSingle[1];
    278293    OcspResponse  ocspResponse[1];
    279294#endif
     
    283298#ifdef WOLFSSL_SMALL_STACK
    284299    newStatus = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL,
    285                                                        DYNAMIC_TYPE_TMP_BUFFER);
     300                                                       DYNAMIC_TYPE_OCSP_STATUS);
     301    newSingle = (OcspEntry*)XMALLOC(sizeof(OcspEntry), NULL,
     302                                                       DYNAMIC_TYPE_OCSP_ENTRY);
    286303    ocspResponse = (OcspResponse*)XMALLOC(sizeof(OcspResponse), NULL,
    287                                                        DYNAMIC_TYPE_TMP_BUFFER);
    288 
    289     if (newStatus == NULL || ocspResponse == NULL) {
    290         if (newStatus) XFREE(newStatus, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    291         if (ocspResponse) XFREE(ocspResponse, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     304                                                       DYNAMIC_TYPE_OCSP_REQUEST);
     305
     306    if (newStatus == NULL || newSingle == NULL || ocspResponse == NULL) {
     307        if (newStatus) XFREE(newStatus, NULL, DYNAMIC_TYPE_OCSP_STATUS);
     308        if (newSingle) XFREE(newSingle, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
     309        if (ocspResponse) XFREE(ocspResponse, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
    292310
    293311        WOLFSSL_LEAVE("CheckCertOCSP", MEMORY_ERROR);
     
    295313    }
    296314#endif
    297     XMEMSET(newStatus, 0, sizeof(CertStatus));
    298 
    299     InitOcspResponse(ocspResponse, newStatus, response, responseSz);
     315    InitOcspResponse(ocspResponse, newSingle, newStatus, response, responseSz,
     316                     ocsp->cm->heap);
     317
    300318    ret = OcspResponseDecode(ocspResponse, ocsp->cm, ocsp->cm->heap, 0);
    301319    if (ret != 0) {
     
    326344    }
    327345
    328     ret = xstat2err(ocspResponse->status->status);
     346    ret = xstat2err(ocspResponse->single->status->status);
    329347    if (ret == 0) {
    330348        validated = 1;
     
    343361
    344362        /* Replace existing certificate entry with updated */
    345         newStatus->next = status->next;
    346         XMEMCPY(status, newStatus, sizeof(CertStatus));
     363        newSingle->status->next = status->next;
     364        XMEMCPY(status, newSingle->status, sizeof(CertStatus));
    347365    }
    348366    else {
     
    351369                                      ocsp->cm->heap, DYNAMIC_TYPE_OCSP_STATUS);
    352370        if (status != NULL) {
    353             XMEMCPY(status, newStatus, sizeof(CertStatus));
     371            XMEMCPY(status, newSingle->status, sizeof(CertStatus));
    354372            status->next  = entry->status;
    355373            entry->status = status;
     
    380398
    381399#ifdef WOLFSSL_SMALL_STACK
    382     XFREE(newStatus,    NULL, DYNAMIC_TYPE_TMP_BUFFER);
    383     XFREE(ocspResponse, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     400    XFREE(newStatus,    NULL, DYNAMIC_TYPE_OCSP_STATUS);
     401    XFREE(newSingle,    NULL, DYNAMIC_TYPE_OCSP_ENTRY);
     402    XFREE(ocspResponse, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
    384403#endif
    385404    return ret;
     
    454473    else {
    455474        /* cert doesn't have extAuthInfo, assuming CERT_GOOD */
     475        WOLFSSL_MSG("Cert has no OCSP URL, assuming CERT_GOOD");
    456476        return 0;
    457477    }
     
    493513
    494514#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
    495     defined(WOLFSSL_APACHE_HTTPD)
     515    defined(WOLFSSL_APACHE_HTTPD) || defined(HAVE_LIGHTY)
    496516
    497517int wolfSSL_OCSP_resp_find_status(WOLFSSL_OCSP_BASICRESP *bs,
     
    500520    WOLFSSL_ASN1_TIME** nextupd)
    501521{
     522    WOLFSSL_OCSP_SINGLERESP* single;
     523
    502524    if (bs == NULL || id == NULL)
    503525        return WOLFSSL_FAILURE;
    504526
    505     /* Only supporting one certificate status in asn.c. */
    506     if (CompareOcspReqResp(id, bs) != 0)
     527    single = bs->single;
     528    while (single != NULL) {
     529        if ((XMEMCMP(single->status->serial, id->status->serial, single->status->serialSz) == 0)
     530         && (XMEMCMP(single->issuerHash, id->issuerHash, OCSP_DIGEST_SIZE) == 0)
     531         && (XMEMCMP(single->issuerKeyHash, id->issuerKeyHash, OCSP_DIGEST_SIZE) == 0)) {
     532            break;
     533        }
     534        single = single->next;
     535    }
     536
     537    if (single == NULL)
    507538        return WOLFSSL_FAILURE;
    508539
    509540    if (status != NULL)
    510         *status = bs->status->status;
     541        *status = single->status->status;
    511542    if (thisupd != NULL)
    512         *thisupd = &bs->status->thisDateParsed;
     543        *thisupd = &single->status->thisDateParsed;
    513544    if (nextupd != NULL)
    514         *nextupd = &bs->status->nextDateParsed;
    515 
    516     /* TODO: Not needed for Nginx. */
     545        *nextupd = &single->status->nextDateParsed;
     546
     547    /* TODO: Not needed for Nginx or httpd */
    517548    if (reason != NULL)
    518549        *reason = 0;
     
    550581void wolfSSL_OCSP_CERTID_free(WOLFSSL_OCSP_CERTID* certId)
    551582{
    552     FreeOcspRequest(certId);
     583    FreeOcspEntry(certId, NULL);
    553584    XFREE(certId, NULL, DYNAMIC_TYPE_OPENSSL);
    554585}
     
    559590{
    560591    WOLFSSL_OCSP_CERTID* certId;
     592    CertStatus* certStatus;
    561593    DecodedCert cert;
    562594    WOLFSSL_CERT_MANAGER* cm;
     
    581613    certId = (WOLFSSL_OCSP_CERTID*)XMALLOC(sizeof(WOLFSSL_OCSP_CERTID), NULL,
    582614                                           DYNAMIC_TYPE_OPENSSL);
    583     if (certId != NULL) {
    584         InitDecodedCert(&cert, subject->derCert->buffer,
    585                         subject->derCert->length, NULL);
    586         if (ParseCertRelative(&cert, CERT_TYPE, VERIFY_OCSP, cm) != 0) {
     615    certStatus = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL,
     616                                           DYNAMIC_TYPE_OPENSSL);
     617
     618    if (certId == NULL || certStatus == NULL) {
     619        if (certId)
    587620            XFREE(certId, NULL, DYNAMIC_TYPE_OPENSSL);
    588             certId = NULL;
    589         }
    590         else {
    591             ret = InitOcspRequest(certId, &cert, 0, NULL);
    592             if (ret != 0) {
    593                 XFREE(certId, NULL, DYNAMIC_TYPE_OPENSSL);
    594                 certId = NULL;
    595             }
    596         }
    597         FreeDecodedCert(&cert);
    598     }
     621        if (certStatus)
     622            XFREE(certStatus, NULL, DYNAMIC_TYPE_OPENSSL);
     623
     624        return NULL;
     625    }
     626
     627    XMEMSET(certId, 0, sizeof(WOLFSSL_OCSP_CERTID));
     628    XMEMSET(certStatus, 0, sizeof(CertStatus));
     629
     630    certId->status = certStatus;
     631
     632    InitDecodedCert(&cert, subject->derCert->buffer,
     633                    subject->derCert->length, NULL);
     634    if (ParseCertRelative(&cert, CERT_TYPE, VERIFY_OCSP, cm) != 0) {
     635        XFREE(certId, NULL, DYNAMIC_TYPE_OPENSSL);
     636        certId = NULL;
     637    }
     638    else {
     639        XMEMCPY(certId->issuerHash, cert.issuerHash, OCSP_DIGEST_SIZE);
     640        XMEMCPY(certId->issuerKeyHash, cert.issuerKeyHash, OCSP_DIGEST_SIZE);
     641        XMEMCPY(certId->status->serial, cert.serial, cert.serialSz);
     642        certId->status->serialSz = cert.serialSz;
     643    }
     644    FreeDecodedCert(&cert);
    599645
    600646    wolfSSL_CertManagerFree(cm);
     
    636682void wolfSSL_OCSP_RESPONSE_free(OcspResponse* response)
    637683{
    638     if (response->status != NULL)
    639         XFREE(response->status, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     684    if (response == NULL)
     685        return;
     686
     687    if (response->single != NULL) {
     688        FreeOcspEntry(response->single, NULL);
     689        XFREE(response->single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
     690    }
     691
    640692    if (response->source != NULL)
    641693        XFREE(response->source, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    642     XFREE(response, NULL, DYNAMIC_TYPE_OPENSSL);
    643 }
    644 
     694
     695    XFREE(response, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
     696}
     697
     698#ifndef NO_BIO
    645699OcspResponse* wolfSSL_d2i_OCSP_RESPONSE_bio(WOLFSSL_BIO* bio,
    646700    OcspResponse** response)
     
    707761    return ret;
    708762}
     763#endif /* !NO_BIO */
    709764
    710765OcspResponse* wolfSSL_d2i_OCSP_RESPONSE(OcspResponse** response,
     
    722777    if (resp == NULL) {
    723778        resp = (OcspResponse*)XMALLOC(sizeof(OcspResponse), NULL,
    724                                       DYNAMIC_TYPE_OPENSSL);
     779                                      DYNAMIC_TYPE_OCSP_REQUEST);
    725780        if (resp == NULL)
    726781            return NULL;
     
    730785    resp->source = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    731786    if (resp->source == NULL) {
    732         XFREE(resp, NULL, DYNAMIC_TYPE_OPENSSL);
     787        XFREE(resp, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
    733788        return NULL;
    734789    }
    735     resp->status = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL,
    736                                                        DYNAMIC_TYPE_TMP_BUFFER);
    737     if (resp->status == NULL) {
     790    resp->single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), NULL,
     791                                      DYNAMIC_TYPE_OCSP_ENTRY);
     792    if (resp->single == NULL) {
    738793        XFREE(resp->source, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    739         XFREE(resp, NULL, DYNAMIC_TYPE_OPENSSL);
     794        XFREE(resp, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
    740795        return NULL;
    741796    }
     797    XMEMSET(resp->single, 0, sizeof(OcspEntry));
     798    resp->single->status = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL,
     799                                      DYNAMIC_TYPE_OCSP_STATUS);
     800    if (resp->single->status == NULL) {
     801        XFREE(resp->source, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     802        XFREE(resp, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
     803        XFREE(resp->single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
     804        return NULL;
     805    }
     806    XMEMSET(resp->single->status, 0, sizeof(CertStatus));
    742807
    743808    XMEMCPY(resp->source, *data, len);
     
    795860
    796861    bs = (WOLFSSL_OCSP_BASICRESP*)XMALLOC(sizeof(WOLFSSL_OCSP_BASICRESP), NULL,
    797                                           DYNAMIC_TYPE_OPENSSL);
     862                                          DYNAMIC_TYPE_OCSP_REQUEST);
    798863    if (bs == NULL)
    799864        return NULL;
    800865
    801866    XMEMCPY(bs, response, sizeof(OcspResponse));
    802     bs->status = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL,
    803                                       DYNAMIC_TYPE_TMP_BUFFER);
     867    bs->single = (OcspEntry*)XMALLOC(sizeof(OcspEntry), NULL,
     868                                    DYNAMIC_TYPE_OCSP_ENTRY);
    804869    bs->source = (byte*)XMALLOC(bs->maxIdx, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    805     if (bs->status == NULL || bs->source == NULL) {
    806         if (bs->status) XFREE(bs->status, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     870    if (bs->single == NULL || bs->source == NULL) {
     871        if (bs->single) XFREE(bs->single, NULL, DYNAMIC_TYPE_OCSP_ENTRY);
    807872        if (bs->source) XFREE(bs->source, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    808873        wolfSSL_OCSP_RESPONSE_free(bs);
     
    810875    }
    811876    else {
    812         XMEMCPY(bs->status, response->status, sizeof(CertStatus));
     877        XMEMCPY(bs->single, response->single, sizeof(OcspEntry));
    813878        XMEMCPY(bs->source, response->source, response->maxIdx);
    814879    }
     
    851916        return NULL;
    852917
    853     FreeOcspRequest(req);
    854     XMEMCPY(req, cid, sizeof(OcspRequest));
    855 
    856     if (cid->serial != NULL) {
    857         req->serial = (byte*)XMALLOC(cid->serialSz, NULL,
    858                                      DYNAMIC_TYPE_OCSP_REQUEST);
    859         req->url = (byte*)XMALLOC(cid->urlSz, NULL, DYNAMIC_TYPE_OCSP_REQUEST);
    860         if (req->serial == NULL || req->url == NULL) {
    861             FreeOcspRequest(req);
    862             return NULL;
    863         }
    864 
    865         XMEMCPY(req->serial, cid->serial, cid->serialSz);
    866         XMEMCPY(req->url, cid->url, cid->urlSz);
    867     }
    868 
    869     wolfSSL_OCSP_REQUEST_free(cid);
     918    XMEMCPY(req->issuerHash, cid->issuerHash, KEYID_SIZE);
     919    XMEMCPY(req->issuerKeyHash, cid->issuerKeyHash, KEYID_SIZE);
     920    XMEMCPY(req->serial, cid->status->serial, cid->status->serialSz);
     921    req->serialSz = cid->status->serialSz;
    870922
    871923    return req;
     
    876928    WOLFSSL_OCSP_CERTID* certId;
    877929
    878     if (id == NULL) {
     930    if (id == NULL)
    879931        return NULL;
    880     }
    881932
    882933    certId = (WOLFSSL_OCSP_CERTID*)XMALLOC(sizeof(WOLFSSL_OCSP_CERTID),
    883         id->heap, DYNAMIC_TYPE_OPENSSL);
     934        NULL, DYNAMIC_TYPE_OPENSSL);
    884935    if (certId) {
    885936        XMEMCPY(certId, id, sizeof(WOLFSSL_OCSP_CERTID));
     
    890941
    891942#if defined(OPENSSL_ALL) || defined(APACHE_HTTPD)
     943#ifndef NO_BIO
    892944int wolfSSL_i2d_OCSP_REQUEST_bio(WOLFSSL_BIO* out,
    893945        WOLFSSL_OCSP_REQUEST *req)
     
    923975    return WOLFSSL_FAILURE;
    924976}
     977#endif /* !NO_BIO */
     978
     979int wolfSSL_i2d_OCSP_CERTID(WOLFSSL_OCSP_CERTID* id, unsigned char** data)
     980{
     981    if (id == NULL || data == NULL)
     982        return WOLFSSL_FAILURE;
     983
     984    if (*data != NULL) {
     985        XMEMCPY(*data, id->rawCertId, id->rawCertIdSize);
     986        *data = *data + id->rawCertIdSize;
     987    }
     988    else {
     989        *data = (unsigned char*)XMALLOC(id->rawCertIdSize, NULL, DYNAMIC_TYPE_OPENSSL);
     990        if (*data == NULL) {
     991            return WOLFSSL_FAILURE;
     992        }
     993        XMEMCPY(*data, id->rawCertId, id->rawCertIdSize);
     994    }
     995
     996    return id->rawCertIdSize;
     997}
     998
     999const WOLFSSL_OCSP_CERTID* wolfSSL_OCSP_SINGLERESP_get0_id(const WOLFSSL_OCSP_SINGLERESP *single)
     1000{
     1001    return single;
     1002}
     1003
     1004int wolfSSL_OCSP_single_get0_status(WOLFSSL_OCSP_SINGLERESP *single,
     1005                                    int *reason,
     1006                                    WOLFSSL_ASN1_TIME **revtime,
     1007                                    WOLFSSL_ASN1_TIME **thisupd,
     1008                                    WOLFSSL_ASN1_TIME **nextupd)
     1009{
     1010    if (single == NULL)
     1011        return WOLFSSL_FAILURE;
     1012
     1013    if (thisupd != NULL)
     1014        *thisupd = &single->status->thisDateParsed;
     1015    if (nextupd != NULL)
     1016        *nextupd = &single->status->nextDateParsed;
     1017
     1018    if (reason != NULL)
     1019        *reason = 0;
     1020    if (revtime != NULL)
     1021        *revtime = NULL;
     1022
     1023    return single->status->status;
     1024}
     1025
     1026int wolfSSL_OCSP_resp_count(WOLFSSL_OCSP_BASICRESP *bs)
     1027{
     1028    WOLFSSL_OCSP_SINGLERESP* single;
     1029    int count = 0;
     1030
     1031    if (bs == NULL)
     1032        return WOLFSSL_FAILURE;
     1033
     1034    single = bs->single;
     1035    while(single != NULL)
     1036    {
     1037        ++count;
     1038        single = single->next;
     1039    }
     1040
     1041    return count;
     1042}
     1043
     1044WOLFSSL_OCSP_SINGLERESP* wolfSSL_OCSP_resp_get0(WOLFSSL_OCSP_BASICRESP *bs, int idx)
     1045{
     1046    WOLFSSL_OCSP_SINGLERESP* single;
     1047    int currIdx = 0;
     1048
     1049    if (bs == NULL)
     1050        return NULL;
     1051
     1052    single = bs->single;
     1053    while(single != NULL && currIdx != idx)
     1054    {
     1055        single = single->next;
     1056        ++currIdx;
     1057    }
     1058
     1059    return single;
     1060}
     1061
    9251062#endif /* OPENSSL_ALL || APACHE_HTTPD */
    9261063
     
    9801117            return 0;
    9811118
    982         if (cid->serialSz > (WOLFSSL_ASN1_INTEGER_MAX - 2)) {
     1119        if (cid->status->serialSz > (WOLFSSL_ASN1_INTEGER_MAX - 2)) {
    9831120            /* allocate data buffer, +2 for type and length */
    984             ser->data = (unsigned char*)XMALLOC(cid->serialSz + 2, NULL,
     1121            ser->data = (unsigned char*)XMALLOC(cid->status->serialSz + 2, NULL,
    9851122                DYNAMIC_TYPE_OPENSSL);
    9861123            if (ser->data == NULL) {
     
    9881125                return 0;
    9891126            }
    990             ser->dataMax = cid->serialSz + 2;
     1127            ser->dataMax = cid->status->serialSz + 2;
    9911128            ser->isDynamic = 1;
    9921129        } else {
     
    9981135        #ifdef WOLFSSL_QT
    9991136            /* Serial number starts at 0 index of ser->data */
    1000             XMEMCPY(&ser->data[i], cid->serial, cid->serialSz);
    1001             ser->length = cid->serialSz;
     1137            XMEMCPY(&ser->data[i], cid->status->serial, cid->status->serialSz);
     1138            ser->length = cid->status->serialSz;
    10021139        #else
    10031140            ser->data[i++] = ASN_INTEGER;
    1004             i += SetLength(cid->serialSz, ser->data + i);
    1005             XMEMCPY(&ser->data[i], cid->serial, cid->serialSz);
     1141            i += SetLength(cid->status->serialSz, ser->data + i);
     1142            XMEMCPY(&ser->data[i], cid->status->serial, cid->status->serialSz);
    10061143        #endif
    10071144
    1008         cid->serialInt = ser;
    1009         *serial = cid->serialInt;
     1145        cid->status->serialInt = ser;
     1146        *serial = ser;
    10101147    }
    10111148
  • azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/src/sniffer.c

    r457 r464  
    2626
    2727#include <wolfssl/wolfcrypt/settings.h>
    28 
    29 #ifndef WOLFCRYPT_ONLY
     28#include <wolfssl/wolfcrypt/wc_port.h>
     29
     30/* xctime */
     31#ifndef XCTIME
     32   #define XCTIME ctime
     33#endif
     34
     35/* only in this file, to avoid confusing future ports leave
     36 * these defines here. Do not move to wc_port.h */
     37#ifdef USER_CUSTOM_SNIFFX
     38    /* To be implemented in user_settings.h */
     39#elif defined(FUSION_RTOS)
     40    #include <fcl_network.h>
     41    #define XINET_NTOA FNS_INET_NTOA
     42    #define XINET_ATON FNS_INET_ATON
     43    #define XINET_PTON(a,b,c,d) FNS_INET_PTON((a),(b),(c),(d),NULL)
     44    #define XINET_NTOP(a,b,c,d) FNS_INET_NTOP((a),(b),(c),(d),NULL)
     45    #define XINET_ADDR FNS_INET_ADDR
     46    #define XHTONS FNS_HTONS
     47    #define XNTOHS FNS_NTOHS
     48    #define XHTONL FNS_HTONL
     49    #define XNTOHL FNS_NTOHL
     50    #define XINADDR_NONE FNS_INADDR_NONE
     51#else
     52    /* default */
     53    #define XINET_NTOA inet_ntoa
     54    #define XINET_ATON inet_aton
     55    #define XINET_PTON(a,b,c) inet_pton((a),(b),(c))
     56    #define XINET_NTOP inet_ntop
     57    #define XINET_ADDR inet_addr
     58    #define XHTONS htons
     59    #define XNTOHS ntohs
     60    #define XHTONL htonl
     61    #define XNTOHL ntohl
     62    #define XINADDR_NONE INADDR_NONE
     63#endif
     64
     65#if !defined(WOLFCRYPT_ONLY) && !defined(NO_FILESYSTEM)
    3066#ifdef WOLFSSL_SNIFFER
    3167
     
    3369#include <time.h>
    3470
    35 #ifndef _WIN32
    36   #include <arpa/inet.h>
     71#ifdef FUSION_RTOS
     72    #include <fns_inet.h>
     73    #ifdef TCP_PROTOCOL
     74        #undef TCP_PROTOCOL
     75    #endif
    3776#else
    38   #include <WS2tcpip.h>
     77    #ifndef _WIN32
     78        #include <arpa/inet.h>
     79    #else
     80        #include <WS2tcpip.h>
     81    #endif
    3982#endif
    4083
     
    4588#endif
    4689
    47 #include <wolfssl/openssl/ssl.h>
    4890#include <wolfssl/internal.h>
    4991#include <wolfssl/error-ssl.h>
     
    91133    HASH_SIZE          = 499, /* Session Hash Table Rows */
    92134    PSEUDO_HDR_SZ      = 12,  /* TCP Pseudo Header size in bytes */
    93     FATAL_ERROR_STATE  =  1,  /* SnifferSession fatal error state */
     135    FATAL_ERROR_STATE  = 1,   /* SnifferSession fatal error state */
    94136    TICKET_HINT_LEN    = 4,   /* Session Ticket Hint length */
    95     EXT_TYPE_SZ        = 2,   /* Extension length */
     137    TICKET_HINT_AGE_LEN= 4,   /* Session Ticket Age add length */       
     138    EXT_TYPE_SZ        = 2,   /* Extension type length */
    96139    MAX_INPUT_SZ       = MAX_RECORD_SIZE + COMP_EXTRA + MAX_MSG_EXTRA +
    97140                         MTU_EXTRA,  /* Max input sz of reassembly */
    98     EXT_MASTER_SECRET  = 0x17, /* Extended Master Secret Extension ID */
    99     TICKET_EXT_ID      = 0x23 /* Session Ticket Extension ID */
     141
     142    /* TLS Extensions */
     143    EXT_SERVER_NAME                = 0x0000, /* a.k.a. SNI  */
     144    EXT_MAX_FRAGMENT_LENGTH        = 0x0001,
     145    EXT_TRUSTED_CA_KEYS            = 0x0003,
     146    EXT_TRUNCATED_HMAC             = 0x0004,
     147    EXT_STATUS_REQUEST             = 0x0005, /* a.k.a. OCSP stapling   */
     148    EXT_SUPPORTED_GROUPS           = 0x000a, /* a.k.a. Supported Curves */
     149    EXT_EC_POINT_FORMATS           = 0x000b,
     150    EXT_SIGNATURE_ALGORITHMS       = 0x000d,
     151    EXT_APPLICATION_LAYER_PROTOCOL = 0x0010, /* a.k.a. ALPN */
     152    EXT_STATUS_REQUEST_V2          = 0x0011, /* a.k.a. OCSP stapling v2 */
     153    EXT_ENCRYPT_THEN_MAC           = 0x0016, /* RFC 7366 */
     154    EXT_MASTER_SECRET              = 0x0017, /* Extended Master Secret Extension ID */
     155    EXT_TICKET_ID                  = 0x0023, /* Session Ticket Extension ID */
     156    EXT_PRE_SHARED_KEY             = 0x0029,
     157    EXT_EARLY_DATA                 = 0x002a,
     158    EXT_SUPPORTED_VERSIONS         = 0x002b,
     159    EXT_COOKIE                     = 0x002c,
     160    EXT_PSK_KEY_EXCHANGE_MODES     = 0x002d,
     161    EXT_POST_HANDSHAKE_AUTH        = 0x0031,
     162    EXT_SIGNATURE_ALGORITHMS_CERT  = 0x0032,
     163    EXT_KEY_SHARE                  = 0x0033,
     164    EXT_RENEGOTIATION_INFO         = 0xff01
    100165};
    101166
     
    139204
    140205static WOLFSSL_GLOBAL int TraceOn = 0;         /* Trace is off by default */
    141 static WOLFSSL_GLOBAL FILE* TraceFile = 0;
     206static WOLFSSL_GLOBAL XFILE TraceFile = 0;
    142207
    143208
     
    276341    "No data destination Error",
    277342    "Store data callback failed",
    278     "Loading chain input"
     343    "Loading chain input",
     344    "Got encrypted extension",
     345    "Got Hello Retry Request",
    279346};
    280347
     
    319386    byte*            key;                        /* DER private key */
    320387    word32           keySz;                      /* size of DER private key */
     388    int              isEphemeralKey;
    321389    struct NamedKey* next;                       /* for list */
    322390} NamedKey;
     
    336404/* Sniffer Server holds info for each server/port monitored */
    337405typedef struct SnifferServer {
    338     SSL_CTX*       ctx;                          /* SSL context */
     406    WOLFSSL_CTX*   ctx;                          /* SSL context */
    339407    char           address[MAX_SERVER_ADDRESS];  /* passed in server address */
    340408    IpAddrInfo     server;                       /* network order address */
     
    365433    byte           expectEms;       /* expect extended master secret */
    366434#endif
     435    byte           gotFinished;     /* processed finished */
    367436} Flags;
    368437
    369438
    370439/* Out of Order FIN capture */
    371 typedef struct FinCaputre {
     440typedef struct FinCapture {
    372441    word32 cliFinSeq;               /* client relative sequence FIN  0 is no */
    373442    word32 srvFinSeq;               /* server relative sequence FIN, 0 is no */
    374443    byte   cliCounted;              /* did we count yet, detects duplicates */
    375444    byte   srvCounted;              /* did we count yet, detects duplicates */
    376 } FinCaputre;
     445} FinCapture;
    377446
    378447
     
    385454    wc_Md5 hashMd5;
    386455#endif
    387 #endif
     456#endif /* !NO_OLD_TLS */
    388457#ifndef NO_SHA256
    389458    wc_Sha256 hashSha256;
     
    393462#endif
    394463} HsHashes;
     464
     465typedef struct KeyShareInfo {
     466    word16      named_group;
     467    int         key_len;
     468    const byte* key;
     469
     470    /* additional info */
     471    int         dh_key_bits;
     472    int         curve_id;
     473} KeyShareInfo;
    395474
    396475
     
    398477typedef struct SnifferSession {
    399478    SnifferServer* context;         /* server context */
    400     SSL*           sslServer;       /* SSL server side decode */
    401     SSL*           sslClient;       /* SSL client side decode */
     479    WOLFSSL*       sslServer;       /* SSL server side decode */
     480    WOLFSSL*       sslClient;       /* SSL client side decode */
    402481    IpAddrInfo     server;          /* server address in network byte order */
    403482    IpAddrInfo     client;          /* client address in network byte order */
     
    408487    word32         cliExpected;     /* client expected sequence (relative) */
    409488    word32         srvExpected;     /* server expected sequence (relative) */
    410     FinCaputre     finCaputre;      /* retain out of order FIN s */
     489    FinCapture     finCapture;      /* retain out of order FIN s */
    411490    Flags          flags;           /* session flags */
    412     time_t         lastUsed;          /* last used ticks */
     491    time_t         lastUsed;        /* last used ticks */
    413492    word32         keySz;           /* size of the private key */
    414493    PacketBuffer*  cliReassemblyList; /* client out of order packets */
     
    416495    word32         cliReassemblyMemory; /* client packet memory used */
    417496    word32         srvReassemblyMemory; /* server packet memory used */
    418     struct SnifferSession* next;      /* for hash table list */
    419     byte*          ticketID;          /* mac ID of session ticket */
     497    struct SnifferSession* next;    /* for hash table list */
     498    byte*          ticketID;        /* mac ID of session ticket */
     499#ifdef HAVE_MAX_FRAGMENT
     500    byte*          tlsFragBuf;
     501    word32         tlsFragOffset;
     502    word32         tlsFragSize;
     503#endif
    420504#ifdef HAVE_SNI
    421505    const char*    sni;             /* server name indication */
    422506#endif
    423507#ifdef HAVE_EXTENDED_MASTER
    424     HsHashes*       hash;
     508    HsHashes*      hash;
     509#endif
     510#ifdef WOLFSSL_TLS13
     511    byte*          cliKeyShare;
     512    word32         cliKeyShareSz;
     513    KeyShareInfo   srvKs;
     514    KeyShareInfo   cliKs;
    425515#endif
    426516} SnifferSession;
     
    559649        wc_FreeMutex(&srv->namedKeysMutex);
    560650#endif
    561         SSL_CTX_free(srv->ctx);
     651        wolfSSL_CTX_free(srv->ctx);
    562652    }
    563653    XFREE(srv, NULL, DYNAMIC_TYPE_SNIFFER_SERVER);
     
    595685{
    596686    if (session) {
    597         SSL_free(session->sslClient);
    598         SSL_free(session->sslServer);
     687        wolfSSL_free(session->sslClient);
     688        wolfSSL_free(session->sslServer);
    599689
    600690        FreePacketList(session->cliReassemblyList);
     
    604694#ifdef HAVE_EXTENDED_MASTER
    605695        XFREE(session->hash, NULL, DYNAMIC_TYPE_HASHES);
     696#endif
     697#ifdef WOLFSSL_TLS13
     698        if (session->cliKeyShare)
     699            XFREE(session->cliKeyShare, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     700#endif
     701#ifdef HAVE_MAX_FRAGMENT
     702        if (session->tlsFragBuf) {
     703            XFREE(session->tlsFragBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     704            session->tlsFragBuf = NULL;
     705        }
    606706#endif
    607707    }
     
    622722    wc_LockMutex(&SessionMutex);
    623723
    624     srv = ServerList;
    625     while (srv) {
    626         removeServer = srv;
    627         srv = srv->next;
    628         FreeSnifferServer(removeServer);
    629     }
    630 
     724    /* Free sessions (wolfSSL objects) first */
    631725    for (i = 0; i < HASH_SIZE; i++) {
    632726        session = SessionTable[i];
     
    637731        }
    638732    }
     733    SessionCount = 0;
     734
     735    /* Then server (wolfSSL_CTX) */
     736    srv = ServerList;
     737    while (srv) {
     738        removeServer = srv;
     739        srv = srv->next;
     740        FreeSnifferServer(removeServer);
     741    }
     742    ServerList = NULL;   
    639743
    640744    wc_UnLockMutex(&SessionMutex);
     
    656760    if (TraceFile) {
    657761        TraceOn = 0;
    658         fclose(TraceFile);
     762        XFCLOSE(TraceFile);
    659763        TraceFile = NULL;
    660764    }
     
    678782#endif
    679783#ifndef NO_MD5
    680     if (ret == 0) {
     784    if (ret == 0)
    681785        ret = wc_InitMd5(&hash->hashMd5);
    682     }
    683 #endif
    684 #endif
     786#endif
     787#endif /* !NO_OLD_TLS */
    685788#ifndef NO_SHA256
    686789    if (ret == 0)
     
    694797    return ret;
    695798}
    696 
    697799
    698800static int HashUpdate(HsHashes* hash, const byte* input, int sz)
     
    709811#endif
    710812#ifndef NO_MD5
    711     if (ret == 0) {
     813    if (ret == 0)
    712814        ret = wc_Md5Update(&hash->hashMd5, input, sz);
    713     }
    714 #endif
    715 #endif
     815#endif
     816#endif /* !NO_OLD_TLS */
    716817#ifndef NO_SHA256
    717818    if (ret == 0)
     
    726827}
    727828
    728 
    729829static int HashCopy(HS_Hashes* d, HsHashes* s)
    730830{
    731831#ifndef NO_OLD_TLS
    732832#ifndef NO_SHA
    733         XMEMCPY(&d->hashSha, &s->hashSha, sizeof(wc_Sha));
     833    XMEMCPY(&d->hashSha, &s->hashSha, sizeof(wc_Sha));
    734834#endif
    735835#ifndef NO_MD5
    736         XMEMCPY(&d->hashMd5, &s->hashMd5, sizeof(wc_Md5));
    737 #endif
    738 #endif
    739 
     836    XMEMCPY(&d->hashMd5, &s->hashMd5, sizeof(wc_Md5));
     837#endif
     838#endif /* !NO_OLD_TLS */
    740839#ifndef NO_SHA256
    741         XMEMCPY(&d->hashSha256, &s->hashSha256, sizeof(wc_Sha256));
     840    XMEMCPY(&d->hashSha256, &s->hashSha256, sizeof(wc_Sha256));
    742841#endif
    743842#ifdef WOLFSSL_SHA384
    744         XMEMCPY(&d->hashSha384, &s->hashSha384, sizeof(wc_Sha384));
     843    XMEMCPY(&d->hashSha384, &s->hashSha384, sizeof(wc_Sha384));
    745844#endif
    746845
     
    766865
    767866/* Initialize FIN Capture */
    768 static void InitFinCapture(FinCaputre* cap)
    769 {
    770     XMEMSET(cap, 0, sizeof(FinCaputre));
     867static void InitFinCapture(FinCapture* cap)
     868{
     869    XMEMSET(cap, 0, sizeof(FinCapture));
    771870}
    772871
     
    777876    XMEMSET(session, 0, sizeof(SnifferSession));
    778877    InitFlags(&session->flags);
    779     InitFinCapture(&session->finCaputre);
     878    InitFinCapture(&session->finCapture);
    780879}
    781880
     
    900999        char myBuffer[MAX_ERROR_LEN];
    9011000        GetError(idx, myBuffer);
    902         fprintf(TraceFile, "\t%s\n", myBuffer);
     1001        XFPRINTF(TraceFile, "\t%s\n", myBuffer);
    9031002#ifdef DEBUG_SNIFFER
    904         fprintf(stderr,    "\t%s\n", myBuffer);
     1003        XFPRINTF(stderr,    "\t%s\n", myBuffer);
    9051004#endif
    9061005    }
     
    9121011{
    9131012    if (TraceOn) {
    914         time_t ticks = time(NULL);
    915         fprintf(TraceFile, "\n%s", ctime(&ticks));
     1013        time_t ticks = XTIME(NULL);
     1014        XFPRINTF(TraceFile, "\n%s", XCTIME(&ticks));
    9161015    }
    9171016}
     
    9221021{
    9231022    if (TraceOn) {
    924         fprintf(TraceFile, "\tTrying to install a new Sniffer Server with\n");
    925         fprintf(TraceFile, "\tserver: %s, port: %d, keyFile: %s\n", srv, port,
     1023        XFPRINTF(TraceFile, "\tTrying to install a new Sniffer Server with\n");
     1024        XFPRINTF(TraceFile, "\tserver: %s, port: %d, keyFile: %s\n", srv, port,
    9261025                                                                    keyFile);
    9271026    }
     
    9361035{
    9371036    if (TraceOn) {
    938         fprintf(TraceFile, "\tTrying to install a new Sniffer Server with\n");
    939         fprintf(TraceFile, "\tname: %s, server: %s, port: %d, keyFile: %s\n",
    940                                                       name, srv, port, keyFile);
     1037        XFPRINTF(TraceFile, "\tTrying to install a new Sniffer Server with\n");
     1038        XFPRINTF(TraceFile, "\tname: %s, server: %s, port: %d, keyFile: %s\n",
     1039                name ? name : "",
     1040                srv ? srv : "",
     1041                port,
     1042                keyFile ? keyFile : "");
    9411043    }
    9421044}
     
    9501052    if (TraceOn) {
    9511053        static word32 packetNumber = 0;
    952         fprintf(TraceFile, "\tGot a Packet to decode, packet %u\n",
     1054        XFPRINTF(TraceFile, "\tGot a Packet to decode, packet %u\n",
    9531055                ++packetNumber);
    9541056    }
     
    9591061static const char* IpToS(int version, void* src, char* dst)
    9601062{
    961     return inet_ntop(version, src, dst, TRACE_MSG_SZ);
     1063    return XINET_NTOP(version, src, dst, TRACE_MSG_SZ);
    9621064}
    9631065
     
    9691071        char src[TRACE_MSG_SZ];
    9701072        char dst[TRACE_MSG_SZ];
    971         fprintf(TraceFile, "\tdst:%s src:%s\n",
     1073        XFPRINTF(TraceFile, "\tdst:%s src:%s\n",
    9721074                IpToS(AF_INET, &iphdr->dst, dst),
    9731075                IpToS(AF_INET, &iphdr->src, src));
     
    9821084        char src[TRACE_MSG_SZ];
    9831085        char dst[TRACE_MSG_SZ];
    984         fprintf(TraceFile, "\tdst: %s src: %s\n",
     1086        XFPRINTF(TraceFile, "\tdst: %s src: %s\n",
    9851087                IpToS(AF_INET6, iphdr->dst, dst),
    9861088                IpToS(AF_INET6, iphdr->src, src));
     
    9931095{
    9941096    if (TraceOn) {
    995         fprintf(TraceFile, "\tdstPort:%u srcPort:%u\n", ntohs(tcphdr->dstPort),
    996                 ntohs(tcphdr->srcPort));
     1097        XFPRINTF(TraceFile, "\tdstPort:%u srcPort:%u\n", XNTOHS(tcphdr->dstPort),
     1098                XNTOHS(tcphdr->srcPort));
    9971099    }
    9981100}
     
    10031105{
    10041106    if (TraceOn) {
    1005         fprintf(TraceFile, "\tSequence:%u, payload length:%d\n", seq, len);
     1107        XFPRINTF(TraceFile, "\tSequence:%u, payload length:%d\n", seq, len);
    10061108    }
    10071109}
     
    10121114{
    10131115    if (TraceOn) {
    1014         fprintf(TraceFile, "\tAck:%u Expected:%u\n", ack, expected);
     1116        XFPRINTF(TraceFile, "\tAck:%u Expected:%u\n", ack, expected);
    10151117    }
    10161118}
     
    10211123{
    10221124    if (TraceOn) {
    1023         fprintf(TraceFile, "\tExpected sequence:%u, received sequence:%u\n",
     1125        XFPRINTF(TraceFile, "\tExpected sequence:%u, received sequence:%u\n",
    10241126                expected, got);
    10251127    }
     
    10311133{
    10321134    if (TraceOn) {
    1033         fprintf(TraceFile, "\tServer SYN, Sequence Start:%u\n", seq);
     1135        XFPRINTF(TraceFile, "\tServer SYN, Sequence Start:%u\n", seq);
    10341136    }
    10351137}
     
    10401142{
    10411143    if (TraceOn) {
    1042         fprintf(TraceFile, "\tClient SYN, Sequence Start:%u\n", seq);
     1144        XFPRINTF(TraceFile, "\tClient SYN, Sequence Start:%u\n", seq);
    10431145    }
    10441146}
     
    10491151{
    10501152    if (TraceOn) {
    1051         fprintf(TraceFile, "\tClient FIN capture:%u, current SEQ:%u\n",
     1153        XFPRINTF(TraceFile, "\tClient FIN capture:%u, current SEQ:%u\n",
    10521154                finSeq, relSeq);
    10531155    }
     
    10591161{
    10601162    if (TraceOn) {
    1061         fprintf(TraceFile, "\tServer FIN capture:%u, current SEQ:%u\n",
     1163        XFPRINTF(TraceFile, "\tServer FIN capture:%u, current SEQ:%u\n",
    10621164                finSeq, relSeq);
    10631165    }
     
    10691171{
    10701172    if (TraceOn) {
    1071         fprintf(TraceFile, "\t%d bytes of SSL App data processed\n", bytes);
     1173        XFPRINTF(TraceFile, "\t%d bytes of SSL App data processed\n", bytes);
    10721174    }
    10731175}
     
    10781180{
    10791181    if (TraceOn) {
    1080         fprintf(TraceFile,
     1182        XFPRINTF(TraceFile,
    10811183                "\t%d bytes added to %d existing bytes in User Buffer\n",
    10821184                newBytes, existingBytes);
     
    10891191{
    10901192    if (TraceOn) {
    1091         fprintf(TraceFile, "\tFound a stale session\n");
     1193        XFPRINTF(TraceFile, "\tFound a stale session\n");
    10921194    }
    10931195}
     
    10981200{
    10991201    if (TraceOn) {
    1100         fprintf(TraceFile, "\tTrying to find Stale Sessions\n");
     1202        XFPRINTF(TraceFile, "\tTrying to find Stale Sessions\n");
    11011203    }
    11021204}
     
    11071209{
    11081210    if (TraceOn) {
    1109         fprintf(TraceFile, "\tRemoved it\n");
     1211        XFPRINTF(TraceFile, "\tRemoved it\n");
    11101212    }
    11111213}
     
    11171219    if (TraceOn) {
    11181220        if (sslInfo != NULL && sslInfo->isValid) {
    1119             fprintf(TraceFile,
     1221            XFPRINTF(TraceFile,
    11201222                    "\tver:(%u %u) suiteId:(%02x %02x) suiteName:(%s) "
    11211223                    #ifdef HAVE_SNI
     
    11431245{
    11441246    if (TraceOn) {
    1145         fprintf(TraceFile, "\tAdding %d to %s\n", add, name);
     1247        XFPRINTF(TraceFile, "\tAdding %d to %s\n", add, name);
    11461248    }
    11471249}
     
    13101412{
    13111413    SnifferSession* session;
    1312     time_t          currTime = time(NULL);
     1414    time_t          currTime = XTIME(NULL);
    13131415    word32          row = SessionHash(ipInfo, tcpInfo);
    13141416
     
    13581460
    13591461static int LoadKeyFile(byte** keyBuf, word32* keyBufSz,
    1360                 const char* keyFile, int typeKey,
     1462                const char* keyFile, int keySz, int typeKey,
    13611463                const char* password)
    13621464{
     
    13641466    long fileSz = 0;
    13651467    XFILE file;
    1366     int ret;
     1468    int ret = -1;
    13671469
    13681470    if (keyBuf == NULL || keyBufSz == NULL || keyFile == NULL) {
     
    13701472    }
    13711473
    1372     file = XFOPEN(keyFile, "rb");
    1373     if (file == XBADFILE) return -1;
    1374     if(XFSEEK(file, 0, XSEEK_END) != 0) {
     1474    if (keySz == 0) {
     1475        /* load from file */
     1476        file = XFOPEN(keyFile, "rb");
     1477        if (file == XBADFILE) return -1;
     1478        if(XFSEEK(file, 0, XSEEK_END) != 0) {
     1479            XFCLOSE(file);
     1480            return -1;
     1481        }
     1482        fileSz = XFTELL(file);
     1483        if (fileSz > MAX_WOLFSSL_FILE_SIZE || fileSz < 0) {
     1484            XFCLOSE(file);
     1485            return -1;
     1486        }
     1487        XREWIND(file);
     1488
     1489        loadBuf = (byte*)XMALLOC(fileSz, NULL, DYNAMIC_TYPE_FILE);
     1490        if (loadBuf == NULL) {
     1491            XFCLOSE(file);
     1492            return -1;
     1493        }
     1494
     1495        ret = (int)XFREAD(loadBuf, 1, fileSz, file);
    13751496        XFCLOSE(file);
    1376         return -1;
    1377     }
    1378     fileSz = XFTELL(file);
    1379     if (fileSz > MAX_WOLFSSL_FILE_SIZE || fileSz < 0) {
    1380         XFCLOSE(file);
    1381         return -1;
    1382     }
    1383     XREWIND(file);
    1384 
    1385     loadBuf = (byte*)XMALLOC(fileSz, NULL, DYNAMIC_TYPE_FILE);
    1386     if (loadBuf == NULL) {
    1387         XFCLOSE(file);
    1388         return -1;
    1389     }
    1390 
    1391     ret = (int)XFREAD(loadBuf, 1, fileSz, file);
    1392     XFCLOSE(file);
    1393 
    1394     if (ret != fileSz) {
    1395         XFREE(loadBuf, NULL, DYNAMIC_TYPE_FILE);
    1396         return -1;
     1497
     1498        if (ret != fileSz) {
     1499            XFREE(loadBuf, NULL, DYNAMIC_TYPE_FILE);
     1500            return -1;
     1501        }
     1502    }
     1503    else {
     1504        /* use buffer directly */
     1505        loadBuf = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_FILE);
     1506        if (loadBuf == NULL) {
     1507            return -1;
     1508        }
     1509        fileSz = keySz;
     1510        XMEMCPY(loadBuf, keyFile, fileSz);       
    13971511    }
    13981512
     
    14501564    }
    14511565    InitSnifferServer(sniffer);
    1452     sniffer->ctx = SSL_CTX_new(TLSv1_2_client_method());
     1566    sniffer->ctx = wolfSSL_CTX_new(SSLv23_client_method());
    14531567    if (!sniffer->ctx) {
    14541568        SetError(MEMORY_STR, error, NULL, 0);
     
    14691583
    14701584static int SetNamedPrivateKey(const char* name, const char* address, int port,
    1471             const char* keyFile, int typeKey, const char* password, char* error)
     1585    const char* keyFile, int keySz, int typeKey, const char* password,
     1586    char* error, int isEphemeralKey)
    14721587{
    14731588    SnifferServer* sniffer;
     
    14981613        XSTRNCPY(namedKey->name, name, namedKey->nameSz);
    14991614        namedKey->name[MAX_SERVER_NAME-1] = '\0';
    1500 
     1615        namedKey->isEphemeralKey = isEphemeralKey;
    15011616        ret = LoadKeyFile(&namedKey->key, &namedKey->keySz,
    1502                           keyFile, type, password);
     1617                          keyFile, keySz, type, password);
    15031618        if (ret < 0) {
    15041619            SetError(KEY_FILE_STR, error, NULL, 0);
     
    15101625
    15111626    serverIp.version = IPV4;
    1512     serverIp.ip4 = inet_addr(address);
    1513     if (serverIp.ip4 == INADDR_NONE) {
    1514         if (inet_pton(AF_INET6, address, serverIp.ip6) == 1) {
     1627    serverIp.ip4 = XINET_ADDR(address);
     1628    if (serverIp.ip4 == XINADDR_NONE) {
     1629    #ifdef FUSION_RTOS
     1630        if (XINET_PTON(AF_INET6, address, serverIp.ip6,
     1631                       sizeof(serverIp.ip4)) == 1) {
     1632    #else
     1633        if (XINET_PTON(AF_INET6, address, serverIp.ip6) == 1) {
     1634    #endif
    15151635            serverIp.version = IPV6;
    15161636        }
     
    15401660        sniffer->port = port;
    15411661
    1542         sniffer->ctx = SSL_CTX_new(TLSv1_2_client_method());
     1662        sniffer->ctx = wolfSSL_CTX_new(SSLv23_client_method());
    15431663        if (!sniffer->ctx) {
    15441664            SetError(MEMORY_STR, error, NULL, 0);
     
    15541674        if (password) {
    15551675    #ifdef WOLFSSL_ENCRYPTED_KEYS
    1556             SSL_CTX_set_default_passwd_cb(sniffer->ctx, SetPassword);
    1557             SSL_CTX_set_default_passwd_cb_userdata(
     1676            wolfSSL_CTX_set_default_passwd_cb(sniffer->ctx, SetPassword);
     1677            wolfSSL_CTX_set_default_passwd_cb_userdata(
    15581678                                                 sniffer->ctx, (void*)password);
    15591679    #endif
    15601680        }
    1561         ret = SSL_CTX_use_PrivateKey_file(sniffer->ctx, keyFile, type);
     1681
     1682    #ifdef WOLFSSL_STATIC_EPHEMERAL
     1683        if (isEphemeralKey) {
     1684            /* auto detect key type with WC_PK_TYPE_NONE */
     1685            /* keySz == 0 mean load file */
     1686            ret = wolfSSL_CTX_set_ephemeral_key(sniffer->ctx, WC_PK_TYPE_NONE,
     1687                keyFile, 0, type);
     1688            if (ret == 0)
     1689                ret = WOLFSSL_SUCCESS;
     1690        }
     1691        else
     1692    #endif
     1693        {
     1694            if (keySz == 0) {
     1695                ret = wolfSSL_CTX_use_PrivateKey_file(sniffer->ctx, keyFile, type);
     1696            }
     1697            else {
     1698                ret = wolfSSL_CTX_use_PrivateKey_buffer(sniffer->ctx,
     1699                                            (const byte*)keyFile, keySz, type);
     1700            }
     1701        }
    15621702        if (ret != WOLFSSL_SUCCESS) {
    15631703            SetError(KEY_FILE_STR, error, NULL, 0);
     
    15891729
    15901730#ifdef HAVE_SNI
    1591 
    15921731/* Sets the private key for a specific name, server and port  */
    15931732/* returns 0 on success, -1 on error */
     
    16031742
    16041743    wc_LockMutex(&ServerListMutex);
    1605     ret = SetNamedPrivateKey(name, address, port, keyFile,
    1606                              typeKey, password, error);
     1744    ret = SetNamedPrivateKey(name, address, port, keyFile, 0,
     1745                             typeKey, password, error, 0);
    16071746    wc_UnLockMutex(&ServerListMutex);
    16081747
     
    16131752}
    16141753
    1615 #endif
    1616 
     1754int ssl_SetNamedPrivateKeyBuffer(const char* name,
     1755                                 const char* address, int port,
     1756                                 const char* keyBuf, int keySz, int typeKey,
     1757                                 const char* password, char* error)
     1758{
     1759    int ret;
     1760
     1761    TraceHeader();
     1762    TraceSetNamedServer(name, address, port, NULL);
     1763
     1764    wc_LockMutex(&ServerListMutex);
     1765    ret = SetNamedPrivateKey(name, address, port, keyBuf, keySz,
     1766                             typeKey, password, error, 0);
     1767    wc_UnLockMutex(&ServerListMutex);
     1768
     1769    if (ret == 0)
     1770        Trace(NEW_SERVER_STR);
     1771
     1772    return ret;
     1773}
     1774#endif /* HAVE_SNI */
    16171775
    16181776/* Sets the private key for a specific server and port  */
    16191777/* returns 0 on success, -1 on error */
    1620 int ssl_SetPrivateKey(const char* address, int port, const char* keyFile,
    1621                       int typeKey, const char* password, char* error)
     1778int ssl_SetPrivateKey(const char* address, int port,
     1779                      const char* keyFile, int typeKey,
     1780                      const char* password, char* error)
    16221781{
    16231782    int ret;
     
    16271786
    16281787    wc_LockMutex(&ServerListMutex);
    1629     ret = SetNamedPrivateKey(NULL, address, port, keyFile,
    1630                              typeKey, password, error);
     1788    ret = SetNamedPrivateKey(NULL, address, port, keyFile, 0,
     1789                             typeKey, password, error, 0);
    16311790    wc_UnLockMutex(&ServerListMutex);
    16321791
     
    16371796}
    16381797
     1798int ssl_SetPrivateKeyBuffer(const char* address, int port,
     1799                            const char* keyBuf, int keySz, int typeKey,
     1800                            const char* password, char* error)
     1801{
     1802    int ret;
     1803
     1804    TraceHeader();
     1805    TraceSetServer(address, port, "from buffer");
     1806
     1807    wc_LockMutex(&ServerListMutex);
     1808    ret = SetNamedPrivateKey(NULL, address, port, keyBuf, keySz,
     1809                             typeKey, password, error, 0);
     1810    wc_UnLockMutex(&ServerListMutex);
     1811
     1812    if (ret == 0)
     1813        Trace(NEW_SERVER_STR);
     1814
     1815    return ret;
     1816}
     1817
     1818#ifdef WOLFSSL_STATIC_EPHEMERAL
     1819#ifdef HAVE_SNI
     1820/* Sets the ephemeral key for a specific name, server and port  */
     1821/* returns 0 on success, -1 on error */
     1822int ssl_SetNamedEphemeralKey(const char* name,
     1823                             const char* address, int port,
     1824                             const char* keyFile, int typeKey,
     1825                             const char* password, char* error)
     1826{
     1827    int ret;
     1828   
     1829    TraceHeader();
     1830    TraceSetNamedServer(name, address, port, keyFile);
     1831   
     1832    wc_LockMutex(&ServerListMutex);
     1833    ret = SetNamedPrivateKey(name, address, port, keyFile, 0,
     1834                             typeKey, password, error, 1);
     1835    wc_UnLockMutex(&ServerListMutex);
     1836   
     1837    if (ret == 0)
     1838        Trace(NEW_SERVER_STR);
     1839   
     1840    return ret;
     1841}
     1842
     1843int ssl_SetNamedEphemeralKeyBuffer(const char* name,
     1844                                   const char* address, int port,
     1845                                   const char* keyBuf, int keySz, int typeKey,
     1846                                   const char* password, char* error)
     1847{
     1848    int ret;
     1849   
     1850    TraceHeader();
     1851    TraceSetNamedServer(name, address, port, NULL);
     1852   
     1853    wc_LockMutex(&ServerListMutex);
     1854    ret = SetNamedPrivateKey(name, address, port, keyBuf, keySz,
     1855                             typeKey, password, error, 1);
     1856    wc_UnLockMutex(&ServerListMutex);
     1857   
     1858    if (ret == 0)
     1859        Trace(NEW_SERVER_STR);
     1860   
     1861    return ret;
     1862}
     1863#endif /* HAVE_SNI */
     1864
     1865/* Sets the ephemeral key for a specific server and port  */
     1866/* returns 0 on success, -1 on error */
     1867int ssl_SetEphemeralKey(const char* address, int port,
     1868                        const char* keyFile, int typeKey,
     1869                        const char* password, char* error)
     1870{
     1871    int ret;
     1872   
     1873    TraceHeader();
     1874    TraceSetServer(address, port, keyFile);
     1875   
     1876    wc_LockMutex(&ServerListMutex);
     1877    ret = SetNamedPrivateKey(NULL, address, port, keyFile, 0,
     1878                             typeKey, password, error, 1);
     1879    wc_UnLockMutex(&ServerListMutex);
     1880   
     1881    if (ret == 0)
     1882        Trace(NEW_SERVER_STR);
     1883   
     1884    return ret;
     1885}
     1886
     1887int ssl_SetEphemeralKeyBuffer(const char* address, int port,
     1888                              const char* keyBuf, int keySz, int typeKey,
     1889                              const char* password, char* error)
     1890{
     1891    int ret;
     1892   
     1893    TraceHeader();
     1894    TraceSetServer(address, port, "from buffer");
     1895   
     1896    wc_LockMutex(&ServerListMutex);
     1897    ret = SetNamedPrivateKey(NULL, address, port, keyBuf, keySz,
     1898                             typeKey, password, error, 1);
     1899    wc_UnLockMutex(&ServerListMutex);
     1900   
     1901    if (ret == 0)
     1902        Trace(NEW_SERVER_STR);
     1903   
     1904    return ret;
     1905}
     1906#endif /* WOLFSSL_STATIC_EPHEMERAL */
    16391907
    16401908/* Check IP Header for IPV6, TCP, and a registered server address */
     
    16771945
    16781946    info->length = exthdrsz;
    1679     info->total = ntohs(iphdr->length) + info->length;
    1680         /* IPv6 doesn't include its own header size in the length like v4. */
     1947    info->total = XNTOHS(iphdr->length) + info->length;
     1948    /* IPv6 doesn't include its own header size in the length like v4. */
    16811949    info->src.version = IPV6;
    16821950    XMEMCPY(info->src.ip6, iphdr->src, sizeof(info->src.ip6));
     
    16931961static int CheckIpHdr(IpHdr* iphdr, IpInfo* info, int length, char* error)
    16941962{
    1695     int    version = IP_V(iphdr);
     1963    int version = IP_V(iphdr);
    16961964
    16971965    if (version == IPV6)
     
    17191987
    17201988    info->length  = IP_HL(iphdr);
    1721     info->total   = ntohs(iphdr->length);
     1989    info->total   = XNTOHS(iphdr->length);
    17221990    info->src.version = IPV4;
    17231991    info->src.ip4 = iphdr->src;
     
    17382006    TraceTcp(tcphdr);
    17392007    Trace(TCP_CHECK_STR);
    1740     info->srcPort   = ntohs(tcphdr->srcPort);
    1741     info->dstPort   = ntohs(tcphdr->dstPort);
     2008    info->srcPort   = XNTOHS(tcphdr->srcPort);
     2009    info->dstPort   = XNTOHS(tcphdr->dstPort);
    17422010    info->length    = TCP_LEN(tcphdr);
    1743     info->sequence  = ntohl(tcphdr->sequence);
     2011    info->sequence  = XNTOHL(tcphdr->sequence);
    17442012    info->fin       = tcphdr->flags & TCP_FIN;
    17452013    info->rst       = tcphdr->flags & TCP_RST;
     
    17472015    info->ack       = tcphdr->flags & TCP_ACK;
    17482016    if (info->ack)
    1749         info->ackNumber = ntohl(tcphdr->ack);
     2017        info->ackNumber = XNTOHL(tcphdr->ack);
    17502018
    17512019#ifndef WOLFSSL_SNIFFER_WATCH
     
    18022070            }
    18032071            sslInfo->keySize = session->keySz;
    1804             #ifdef HAVE_SNI
     2072        #ifdef HAVE_SNI
    18052073            if (NULL != session->sni) {
    18062074                XSTRNCPY((char*)sslInfo->serverNameIndication,
     
    18092077                         [sizeof(sslInfo->serverNameIndication) - 1] = '\0';
    18102078            }
    1811             #endif
     2079        #endif
    18122080            TraceSessionInfo(sslInfo);
    18132081        }
     
    18262094}
    18272095
    1828 
    1829 /* Process Client Key Exchange, RSA or static ECDH */
    1830 static int ProcessClientKeyExchange(const byte* input, int* sslBytes,
    1831                                     SnifferSession* session, char* error)
     2096#ifdef SHOW_SECRETS
     2097static void PrintSecret(const char* desc, const byte* buf, int sz)
     2098{
     2099    int i;
     2100    printf("%s: ", desc);
     2101    for (i = 0; i < sz; i++) {
     2102        printf("%02x", buf[i]);
     2103    }
     2104    printf("\n");
     2105}
     2106
     2107static void ShowTlsSecrets(SnifferSession* session)
     2108{
     2109    PrintSecret("server master secret", session->sslServer->arrays->masterSecret, SECRET_LEN);
     2110    PrintSecret("client master secret", session->sslClient->arrays->masterSecret, SECRET_LEN);
     2111    printf("server suite = %d\n", session->sslServer->options.cipherSuite);
     2112    printf("client suite = %d\n", session->sslClient->options.cipherSuite);
     2113}
     2114#endif /* SHOW_SECRETS */
     2115
     2116
     2117/* Process Keys */
     2118
     2119/* contains static ephemeral keys */
     2120typedef struct {
     2121#ifndef NO_DH
     2122    DerBuffer* dhKey;
     2123#endif
     2124#ifdef HAVE_ECC
     2125    DerBuffer* ecKey;
     2126#endif
     2127#if !defined(NO_RSA) && defined(WOLFSSL_STATIC_RSA)
     2128    DerBuffer* rsaKey;
     2129#endif
     2130} KeyBuffers_t;
     2131
     2132static int SetupKeys(const byte* input, int* sslBytes, SnifferSession* session,
     2133    char* error, KeyShareInfo* ksInfo, KeyBuffers_t* keys)
    18322134{
    18332135    word32 idx = 0;
    1834     int tryEcc = 0;
    18352136    int ret;
    1836 
    1837     if (session->sslServer->buffers.key == NULL ||
    1838         session->sslServer->buffers.key->buffer == NULL ||
    1839         session->sslServer->buffers.key->length == 0) {
    1840 
    1841         SetError(RSA_KEY_MISSING_STR, error, session, FATAL_ERROR_STATE);
    1842         return -1;
    1843     }
    1844 
    1845     {
     2137    DerBuffer* keyBuf;
     2138#ifdef HAVE_ECC
     2139    int useEccCurveId = ECC_CURVE_DEF;
     2140    if (ksInfo && ksInfo->curve_id != 0)
     2141        useEccCurveId = ksInfo->curve_id;
     2142#endif
     2143
     2144#ifndef NO_RSA
     2145    /* Static RSA */
     2146    if (ksInfo == NULL && keys->rsaKey) {
    18462147        RsaKey key;
    18472148        int length;
    18482149
     2150        keyBuf = keys->rsaKey;
     2151
    18492152        ret = wc_InitRsaKey(&key, 0);
    18502153        if (ret == 0) {
    1851             ret = wc_RsaPrivateKeyDecode(
    1852                     session->sslServer->buffers.key->buffer,
    1853                     &idx, &key, session->sslServer->buffers.key->length);
     2154            ret = wc_RsaPrivateKeyDecode(keyBuf->buffer, &idx, &key, keyBuf->length);
    18542155            if (ret != 0) {
    1855                 tryEcc = 1;
    1856                 #ifndef HAVE_ECC
    1857                     SetError(RSA_DECODE_STR, error, session, FATAL_ERROR_STATE);
    1858                 #else
    1859                     /* If we can do ECC, this isn't fatal. Not loading an ECC
    1860                      * key will be fatal, though. */
    1861                     SetError(RSA_DECODE_STR, error, session, 0);
    1862                 #endif
    1863             }
     2156            #ifndef HAVE_ECC
     2157                SetError(RSA_DECODE_STR, error, session, FATAL_ERROR_STATE);
     2158            #else
     2159                /* If we can do ECC, this isn't fatal. Not loading an ECC
     2160                    * key will be fatal, though. */
     2161                SetError(RSA_DECODE_STR, error, session, 0);
     2162                if (keys->ecKey == NULL)
     2163                    keys->ecKey = session->sslServer->buffers.key; /* try ECC */
     2164            #endif
     2165            }
     2166        #ifdef HAVE_ECC
     2167            else {
     2168                useEccCurveId = -1; /* don't try loading ECC */
     2169            }
     2170        #endif
    18642171        }
    18652172
     
    19092216        wc_FreeRsaKey(&key);
    19102217    }
    1911 
    1912     if (tryEcc) {
     2218#endif /* !NO_RSA */
     2219
     2220#if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)
     2221    /* Static DH Key */
     2222    if (ksInfo && ksInfo->dh_key_bits != 0 && keys->dhKey) {
     2223        DhKey dhKey;
     2224        const DhParams* params;
     2225        word32 privKeySz;
     2226        byte privKey[52]; /* max for TLS */
     2227       
     2228        keyBuf = keys->dhKey;
     2229
     2230        /* get DH params */
     2231        switch (ksInfo->named_group) {
     2232        #ifdef HAVE_FFDHE_2048
     2233            case WOLFSSL_FFDHE_2048:
     2234                params = wc_Dh_ffdhe2048_Get();
     2235                privKeySz = 29;
     2236                break;
     2237        #endif
     2238        #ifdef HAVE_FFDHE_3072
     2239            case WOLFSSL_FFDHE_3072:
     2240                params = wc_Dh_ffdhe3072_Get();
     2241                privKeySz = 34;
     2242                break;
     2243        #endif
     2244        #ifdef HAVE_FFDHE_4096
     2245            case WOLFSSL_FFDHE_4096:
     2246                params = wc_Dh_ffdhe4096_Get();
     2247                privKeySz = 39;
     2248                break;
     2249        #endif
     2250        #ifdef HAVE_FFDHE_6144
     2251            case WOLFSSL_FFDHE_6144:
     2252                params = wc_Dh_ffdhe6144_Get();
     2253                privKeySz = 46;
     2254                break;
     2255        #endif
     2256        #ifdef HAVE_FFDHE_8192
     2257            case WOLFSSL_FFDHE_8192:
     2258                params = wc_Dh_ffdhe8192_Get();
     2259                privKeySz = 52;
     2260                break;
     2261        #endif
     2262            default:
     2263                return BAD_FUNC_ARG;
     2264        }
     2265
     2266        ret = wc_InitDhKey(&dhKey);
     2267        if (ret == 0) {
     2268            ret = wc_DhSetKey(&dhKey,
     2269                (byte*)params->p, params->p_len,
     2270                (byte*)params->g, params->g_len);
     2271            if (ret == 0) {
     2272                ret = wc_DhKeyDecode(keyBuf->buffer, &idx, &dhKey,
     2273                    keyBuf->length);
     2274            }
     2275            if (ret == 0) {
     2276                ret = wc_DhExportKeyPair(&dhKey, privKey, &privKeySz, NULL,
     2277                    NULL);
     2278            }
     2279
     2280            /* Derive secret from private key and peer's public key */
     2281            do {
     2282            #ifdef WOLFSSL_ASYNC_CRYPT
     2283                ret = wc_AsyncWait(ret, &dhPriv.asyncDev,
     2284                        WC_ASYNC_FLAG_CALL_AGAIN);
     2285            #endif
     2286                if (ret >= 0) {
     2287                    ret = wc_DhAgree(&dhKey,
     2288                        session->sslServer->arrays->preMasterSecret,
     2289                        &session->sslServer->arrays->preMasterSz,
     2290                        privKey, privKeySz,
     2291                        input, *sslBytes);
     2292                }
     2293            } while (ret == WC_PENDING_E);
     2294
     2295            wc_FreeDhKey(&dhKey);
     2296       
     2297            /* left-padded with zeros up to the size of the prime */
     2298            if (params->p_len > session->sslServer->arrays->preMasterSz) {
     2299                word32 diff = params->p_len - session->sslServer->arrays->preMasterSz;
     2300                XMEMMOVE(session->sslServer->arrays->preMasterSecret + diff,
     2301                        session->sslServer->arrays->preMasterSecret,
     2302                        session->sslServer->arrays->preMasterSz);
     2303                XMEMSET(session->sslServer->arrays->preMasterSecret, 0, diff);
     2304                session->sslServer->arrays->preMasterSz = params->p_len;
     2305            }
     2306        }
     2307    }
     2308#endif /* !NO_DH && WOLFSSL_DH_EXTRA */
     2309
    19132310#ifdef HAVE_ECC
     2311    /* Static ECC Key */
     2312    if (useEccCurveId >= ECC_CURVE_DEF && keys->ecKey) {
    19142313        ecc_key key;
    19152314        ecc_key pubKey;
    19162315        int length, keyInit = 0, pubKeyInit = 0;
    19172316
     2317        keyBuf = keys->ecKey;
    19182318        idx = 0;
    19192319        ret = wc_ecc_init(&key);
     
    19222322            ret = wc_ecc_init(&pubKey);
    19232323        }
     2324
     2325    #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
     2326        (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \
     2327        !defined(HAVE_SELFTEST)
     2328        if (ret == 0) {
     2329            ret = wc_ecc_set_rng(&key, session->sslServer->rng);
     2330        }
     2331    #endif
     2332
    19242333        if (ret == 0) {
    19252334            pubKeyInit = 1;
    1926             ret = wc_EccPrivateKeyDecode(
    1927                     session->sslServer->buffers.key->buffer,
    1928                     &idx, &key, session->sslServer->buffers.key->length);
     2335            ret = wc_EccPrivateKeyDecode(keyBuf->buffer, &idx, &key, keyBuf->length);
    19292336            if (ret != 0) {
    19302337                SetError(ECC_DECODE_STR, error, session, FATAL_ERROR_STATE);
     
    19362343            /* The length should be 2 times the key size (x and y), plus 1
    19372344             * for the type byte. */
    1938             if (IsTLS(session->sslServer)) {
     2345            if (!IsAtLeastTLSv1_3(session->sslServer->version)) {
    19392346                input += 1; /* Don't include the TLS length for the key. */
    19402347            }
    19412348
    1942             if (length + 1 > *sslBytes) {
    1943                 SetError(PARTIAL_INPUT_STR,
    1944                         error, session, FATAL_ERROR_STATE);
     2349            if (length > *sslBytes) {
     2350                SetError(PARTIAL_INPUT_STR, error, session, FATAL_ERROR_STATE);
    19452351                ret = -1;
    19462352            }
     2353
     2354            /* if curve not provided in key share data, then use private key curve */
     2355            if (useEccCurveId == ECC_CURVE_DEF && key.dp) {
     2356                useEccCurveId = key.dp->id;
     2357            }
    19472358        }
    19482359
    19492360        if (ret == 0) {
    1950             ret = wc_ecc_import_x963_ex(input, length, &pubKey, ECC_CURVE_DEF);
     2361            ret = wc_ecc_import_x963_ex(input, length, &pubKey, useEccCurveId);
    19512362            if (ret != 0) {
    19522363                SetError(ECC_PUB_DECODE_STR, error, session, FATAL_ERROR_STATE);
     
    19832394        if (pubKeyInit)
    19842395            wc_ecc_free(&pubKey);
    1985 #endif
    1986     }
     2396    }
     2397#endif /* HAVE_ECC */
    19872398
    19882399    /* store for client side as well */
     
    19932404        session->sslServer->arrays->preMasterSz;
    19942405
    1995     #ifdef SHOW_SECRETS
    1996     {
    1997         word32 i;
    1998         printf("pre master secret: ");
    1999         for (i = 0; i < session->sslServer->arrays->preMasterSz; i++)
    2000             printf("%02x", session->sslServer->arrays->preMasterSecret[i]);
    2001         printf("\n");
    2002     }
    2003     #endif
     2406#ifdef SHOW_SECRETS
     2407    PrintSecret("pre master secret",
     2408                session->sslServer->arrays->preMasterSecret,
     2409                session->sslServer->arrays->preMasterSz);
     2410#endif
    20042411
    20052412    if (SetCipherSpecs(session->sslServer) != 0) {
     
    20132420    }
    20142421
    2015     ret  = MakeMasterSecret(session->sslServer);
    2016     ret += MakeMasterSecret(session->sslClient);
    2017     ret += SetKeysSide(session->sslServer, ENCRYPT_AND_DECRYPT_SIDE);
    2018     ret += SetKeysSide(session->sslClient, ENCRYPT_AND_DECRYPT_SIDE);
    2019 
     2422#ifdef WOLFSSL_TLS13
     2423    /* TLS v1.3 derive handshake key */
     2424    if (IsAtLeastTLSv1_3(session->sslServer->version)) {
     2425        ret  = DeriveEarlySecret(session->sslServer);
     2426        ret += DeriveEarlySecret(session->sslClient);
     2427        ret += DeriveHandshakeSecret(session->sslServer);
     2428        ret += DeriveHandshakeSecret(session->sslClient);
     2429        ret += DeriveTls13Keys(session->sslServer, handshake_key, ENCRYPT_AND_DECRYPT_SIDE, 1);
     2430        ret += DeriveTls13Keys(session->sslClient, handshake_key, ENCRYPT_AND_DECRYPT_SIDE, 1);
     2431    #ifdef WOLFSSL_EARLY_DATA
     2432        ret += SetKeysSide(session->sslServer, DECRYPT_SIDE_ONLY);
     2433        ret += SetKeysSide(session->sslClient, DECRYPT_SIDE_ONLY);
     2434    #else
     2435        ret += SetKeysSide(session->sslServer, ENCRYPT_AND_DECRYPT_SIDE);
     2436        ret += SetKeysSide(session->sslClient, ENCRYPT_AND_DECRYPT_SIDE);
     2437    #endif
     2438    }
     2439    else
     2440#endif
     2441    {
     2442        ret  = MakeMasterSecret(session->sslServer);
     2443        ret += MakeMasterSecret(session->sslClient);
     2444        ret += SetKeysSide(session->sslServer, ENCRYPT_AND_DECRYPT_SIDE);
     2445        ret += SetKeysSide(session->sslClient, ENCRYPT_AND_DECRYPT_SIDE);
     2446    }
    20202447    if (ret != 0) {
    20212448        SetError(BAD_DERIVE_STR, error, session, FATAL_ERROR_STATE);
     
    20242451
    20252452#ifdef SHOW_SECRETS
    2026     {
    2027         int i;
    2028         printf("server master secret: ");
    2029         for (i = 0; i < SECRET_LEN; i++)
    2030             printf("%02x", session->sslServer->arrays->masterSecret[i]);
    2031         printf("\n");
    2032 
    2033         printf("client master secret: ");
    2034         for (i = 0; i < SECRET_LEN; i++)
    2035             printf("%02x", session->sslClient->arrays->masterSecret[i]);
    2036         printf("\n");
    2037 
    2038         printf("server suite = %d\n", session->sslServer->options.cipherSuite);
    2039         printf("client suite = %d\n", session->sslClient->options.cipherSuite);
    2040     }
     2453    #ifdef WOLFSSL_TLS13
     2454    if (!IsAtLeastTLSv1_3(session->sslServer->version))
     2455    #endif
     2456        ShowTlsSecrets(session);
    20412457#endif
    20422458
     
    20462462}
    20472463
     2464/* Process Client Key Exchange, static RSA  */
     2465static int ProcessClientKeyExchange(const byte* input, int* sslBytes,
     2466                            SnifferSession* session, char* error)
     2467{
     2468    KeyBuffers_t keys;
     2469
     2470    if (session->sslServer->buffers.key == NULL ||
     2471        session->sslServer->buffers.key->buffer == NULL ||
     2472        session->sslServer->buffers.key->length == 0) {
     2473
     2474        SetError(RSA_KEY_MISSING_STR, error, session, FATAL_ERROR_STATE);
     2475        return -1;
     2476    }
     2477
     2478    XMEMSET(&keys, 0, sizeof(keys));
     2479#ifdef WOLFSSL_STATIC_EPHEMERAL
     2480    #ifndef NO_DH
     2481    keys.dhKey = session->sslServer->staticKE.dhKey;
     2482    #endif
     2483    #ifdef HAVE_ECC
     2484    keys.ecKey = session->sslServer->staticKE.ecKey;
     2485    #endif
     2486#endif
     2487    keys.rsaKey = session->sslServer->buffers.key;
     2488    return SetupKeys(input, sslBytes, session, error, NULL, &keys);
     2489}
     2490
     2491#ifdef WOLFSSL_TLS13
     2492static int ProcessKeyShare(KeyShareInfo* info, const byte* input, int len,
     2493    word16 filter_group)
     2494{
     2495    int index = 0;
     2496    while (index < len) {
     2497        /* clear info (reset dh_key_bits and curve_id) */
     2498        XMEMSET(info, 0, sizeof(KeyShareInfo));
     2499
     2500        /* Named group and public key */
     2501        info->named_group = (word16)((input[index] << 8) | input[index+1]);
     2502        index += OPAQUE16_LEN;
     2503        info->key_len = 0;
     2504        info->key = NULL;
     2505        /* If key was provided... (a hello_retry_request will not send a key) */
     2506        if (index + 2 <= len) {
     2507            info->key_len = (word16)((input[index] << 8) | input[index+1]);
     2508            index += OPAQUE16_LEN;
     2509            if (info->key_len == 0 || info->key_len > len - index) {
     2510                return -1;
     2511            }
     2512            info->key = &input[index];
     2513            index += info->key_len;
     2514        }
     2515
     2516        switch (info->named_group) {
     2517    #ifndef NO_DH
     2518        #ifdef HAVE_FFDHE_2048
     2519            case WOLFSSL_FFDHE_2048:
     2520                info->dh_key_bits = 2048;
     2521                break;
     2522        #endif
     2523        #ifdef HAVE_FFDHE_3072
     2524            case WOLFSSL_FFDHE_3072:
     2525                info->dh_key_bits = 3072;
     2526                break;
     2527        #endif
     2528        #ifdef HAVE_FFDHE_4096
     2529            case WOLFSSL_FFDHE_4096:
     2530                info->dh_key_bits = 4096;
     2531                break;
     2532        #endif
     2533        #ifdef HAVE_FFDHE_6144
     2534            case WOLFSSL_FFDHE_6144:
     2535                info->dh_key_bits = 6144;
     2536                break;
     2537        #endif
     2538        #ifdef HAVE_FFDHE_8192
     2539            case WOLFSSL_FFDHE_8192:
     2540                info->dh_key_bits = 8192;
     2541                break;
     2542        #endif
     2543    #endif /* !NO_DH */
     2544    #ifdef HAVE_ECC
     2545        #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
     2546            #ifndef NO_ECC_SECP
     2547            case WOLFSSL_ECC_SECP256R1:
     2548                info->curve_id = ECC_SECP256R1;
     2549                break;
     2550            #endif /* !NO_ECC_SECP */
     2551        #endif
     2552        #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
     2553            #ifndef NO_ECC_SECP
     2554            case WOLFSSL_ECC_SECP384R1:
     2555                info->curve_id = ECC_SECP384R1;
     2556                break;
     2557            #endif /* !NO_ECC_SECP */
     2558        #endif
     2559        #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     2560            #ifndef NO_ECC_SECP
     2561            case WOLFSSL_ECC_SECP521R1:
     2562                info->curve_id = ECC_SECP521R1;
     2563                break;
     2564            #endif /* !NO_ECC_SECP */
     2565        #endif
     2566    #endif /* HAVE_ECC */
     2567        #ifdef HAVE_CURVE25519
     2568            case WOLFSSL_ECC_X25519:
     2569                info->curve_id = ECC_X25519;
     2570                break;
     2571        #endif
     2572        #ifdef HAVE_X448
     2573            case WOLFSSL_ECC_X448:
     2574                info->curve_id = ECC_X448;
     2575                break;
     2576        #endif
     2577            default:
     2578                /* do not throw error here, keep iterating the client key share */
     2579                break;
     2580        }
     2581
     2582        if (filter_group == 0 || filter_group == info->named_group) {
     2583            return 0;
     2584        }
     2585    }
     2586    return NO_PEER_KEY; /* unsupported key type */
     2587}
     2588
     2589static int ProcessServerKeyShare(SnifferSession* session, const byte* input, int len,
     2590    char* error)
     2591{
     2592    int ret;
     2593
     2594    if (session->cliKeyShare == NULL || session->cliKeyShareSz == 0) {
     2595        /* session->cliKeyShareSz could not be provided yet if the client_hello
     2596            did not send a key share to force a hello_retry_request */
     2597        return 0;
     2598    }
     2599
     2600    /* Get server_hello key share (and key) */
     2601    ret = ProcessKeyShare(&session->srvKs, input, len, 0);
     2602    if (ret == 0 && session->srvKs.key_len > 0) {
     2603        /* Get client_hello key share */
     2604        ret = ProcessKeyShare(&session->cliKs, session->cliKeyShare,
     2605            session->cliKeyShareSz, session->srvKs.named_group);
     2606    }
     2607    if (ret != 0) {
     2608        SetError(SERVER_HELLO_INPUT_STR, error, session, FATAL_ERROR_STATE);
     2609        return -1;
     2610    }
     2611
     2612    return ret;
     2613}
     2614#endif /* WOLFSSL_TLS13 */
    20482615
    20492616/* Process Session Ticket */
     
    20532620    word16 len;
    20542621
    2055     /* make sure can read through hint and len */
    2056     if (TICKET_HINT_LEN + LENGTH_SZ > *sslBytes) {
     2622#ifdef WOLFSSL_TLS13
     2623    WOLFSSL* ssl;
     2624
     2625    if (session->flags.side == WOLFSSL_SERVER_END)
     2626        ssl = session->sslServer;
     2627    else
     2628        ssl = session->sslClient;
     2629#endif
     2630
     2631    /* make sure can read through hint len */
     2632    if (TICKET_HINT_LEN > *sslBytes) {
    20572633        SetError(BAD_INPUT_STR, error, session, FATAL_ERROR_STATE);
    20582634        return -1;
    20592635    }
    2060 
    2061     input     += TICKET_HINT_LEN;  /* skip over hint */
     2636    input     += TICKET_HINT_LEN; /* skip over hint len */
    20622637    *sslBytes -= TICKET_HINT_LEN;
    20632638
    2064     len = (word16)((input[0] << 8) | input[1]);
    2065     input     += LENGTH_SZ;
    2066     *sslBytes -= LENGTH_SZ;
    2067 
    2068     /* make sure can read through ticket */
    2069     if (len > *sslBytes || len < ID_LEN) {
     2639#ifdef WOLFSSL_TLS13
     2640    /* TLS v1.3 has hint age and nonce */
     2641    if (IsAtLeastTLSv1_3(ssl->version)) {
     2642        /* make sure can read through hint age and nonce len */
     2643        if (TICKET_HINT_AGE_LEN + 1 > *sslBytes) {
     2644            SetError(BAD_INPUT_STR, error, session, FATAL_ERROR_STATE);
     2645            return -1;
     2646        }
     2647        input     += TICKET_HINT_AGE_LEN; /* skip over hint age */
     2648        *sslBytes -= TICKET_HINT_AGE_LEN;
     2649
     2650        /* ticket nonce */
     2651        len = input[0];
     2652        if (len > MAX_TICKET_NONCE_SZ) {
     2653            SetError(BAD_INPUT_STR, error, session, FATAL_ERROR_STATE);
     2654            return -1;
     2655        }
     2656        input += OPAQUE8_LEN;
     2657        *sslBytes -= OPAQUE8_LEN;
     2658    #ifdef HAVE_SESSION_TICKET
     2659        /* store nonce in server for DeriveResumptionPSK */
     2660        session->sslServer->session.ticketNonce.len = len;
     2661        if (len > 0)
     2662            XMEMCPY(&session->sslServer->session.ticketNonce.data, input, len);
     2663    #endif
     2664        input += len;
     2665        *sslBytes -= len;
     2666    }
     2667#endif
     2668
     2669    /* make sure can read through len */
     2670    if (OPAQUE16_LEN > *sslBytes) {
    20702671        SetError(BAD_INPUT_STR, error, session, FATAL_ERROR_STATE);
    20712672        return -1;
    20722673    }
    20732674
    2074     /* store session with macID as sessionID */
    2075     session->sslServer->options.haveSessionId = 1;
    2076     XMEMCPY(session->sslServer->arrays->sessionID, input + len - ID_LEN,ID_LEN);
     2675    len = (word16)((input[0] << 8) | input[1]);
     2676    input     += OPAQUE16_LEN;
     2677    *sslBytes -= OPAQUE16_LEN;
     2678
     2679    /* make sure can read through ticket */
     2680    if (len > *sslBytes) {
     2681        SetError(BAD_INPUT_STR, error, session, FATAL_ERROR_STATE);
     2682        return -1;
     2683    }
     2684
     2685#ifdef WOLFSSL_TLS13
     2686    /* TLS v1.3 has hint age and nonce */
     2687    if (IsAtLeastTLSv1_3(ssl->version)) {
     2688    #ifdef HAVE_SESSION_TICKET
     2689        if (SetTicket(ssl, input, len) != 0) {
     2690            SetError(BAD_INPUT_STR, error, session, FATAL_ERROR_STATE);
     2691            return -1;
     2692        }
     2693        /* set haveSessionId to use the wolfSession cache */
     2694        ssl->options.haveSessionId = 1;
     2695
     2696        /* Use the wolf Session cache to retain resumption secret */
     2697        if (session->flags.cached == 0) {
     2698            WOLFSSL_SESSION* sess = GetSession(ssl, NULL, 0);
     2699            if (sess == NULL) {
     2700                AddSession(ssl); /* don't re add */
     2701            #ifdef WOLFSSL_SNIFFER_STATS
     2702                INC_STAT(SnifferStats.sslResumptionInserts);
     2703            #endif
     2704            }
     2705            session->flags.cached = 1;
     2706        }
     2707    #endif /* HAVE_SESSION_TICKET */
     2708    }
     2709    else
     2710#endif /* WOLFSSL_TLS13 */
     2711    {
     2712        /* capture last part of sessionID as macID (32 bytes) */
     2713        if (len < ID_LEN) {
     2714            SetError(BAD_INPUT_STR, error, session, FATAL_ERROR_STATE);
     2715            return -1;
     2716        }
     2717        /* store session with macID as sessionID */
     2718        session->sslServer->options.haveSessionId = 1;
     2719        XMEMCPY(session->sslServer->arrays->sessionID,
     2720            input + len - ID_LEN, ID_LEN);
     2721    }
    20772722
    20782723    return 0;
    20792724}
    20802725
     2726static int DoResume(SnifferSession* session, char* error)
     2727{
     2728    int ret = 0;
     2729    WOLFSSL_SESSION* resume;
     2730
     2731#ifdef WOLFSSL_TLS13
     2732    if (IsAtLeastTLSv1_3(session->sslServer->version)) {
     2733        resume = GetSession(session->sslServer,
     2734                            session->sslServer->session.masterSecret, 0);
     2735    }
     2736    else
     2737#endif
     2738    {
     2739        resume = GetSession(session->sslServer,
     2740                            session->sslServer->arrays->masterSecret, 0);
     2741    }
     2742    if (resume == NULL) {
     2743        /* a session id without resume is okay with hello_retry_request */
     2744    #ifdef WOLFSSL_SNIFFER_STATS
     2745        INC_STAT(SnifferStats.sslStandardConns);
     2746    #endif
     2747        return 0;
     2748    }
     2749
     2750    /* make sure client has master secret too */
     2751#ifdef WOLFSSL_TLS13
     2752    if (IsAtLeastTLSv1_3(session->sslServer->version)) {
     2753        XMEMCPY(session->sslClient->session.masterSecret,
     2754                session->sslServer->session.masterSecret, SECRET_LEN);
     2755    }
     2756    else
     2757#endif
     2758    {
     2759        XMEMCPY(session->sslClient->arrays->masterSecret,
     2760                session->sslServer->arrays->masterSecret, SECRET_LEN);
     2761    }
     2762    session->flags.resuming = 1;
     2763
     2764    Trace(SERVER_DID_RESUMPTION_STR);
     2765#ifdef WOLFSSL_SNIFFER_STATS
     2766    INC_STAT(SnifferStats.sslResumedConns);
     2767    INC_STAT(SnifferStats.sslResumptionValid);
     2768#endif
     2769    if (SetCipherSpecs(session->sslServer) != 0) {
     2770        SetError(BAD_CIPHER_SPEC_STR, error, session, FATAL_ERROR_STATE);
     2771        return -1;
     2772    }
     2773
     2774    if (SetCipherSpecs(session->sslClient) != 0) {
     2775        SetError(BAD_CIPHER_SPEC_STR, error, session, FATAL_ERROR_STATE);
     2776        return -1;
     2777    }
     2778
     2779#ifdef WOLFSSL_TLS13
     2780    if (IsAtLeastTLSv1_3(session->sslServer->version)) {
     2781    #ifdef HAVE_SESSION_TICKET
     2782        /* Resumption PSK is resumption master secret. */
     2783        session->sslServer->arrays->psk_keySz = session->sslServer->specs.hash_size;
     2784        session->sslClient->arrays->psk_keySz = session->sslClient->specs.hash_size;
     2785        ret  = DeriveResumptionPSK(session->sslServer, session->sslServer->session.ticketNonce.data,
     2786            session->sslServer->session.ticketNonce.len, session->sslServer->arrays->psk_key);
     2787        /* Copy resumption PSK to client */
     2788        XMEMCPY(session->sslClient->arrays->psk_key,
     2789            session->sslServer->arrays->psk_key,
     2790            session->sslServer->arrays->psk_keySz);
     2791    #endif
     2792        /* handshake key setup below and traffic keys done in SetupKeys */
     2793    }
     2794    else
     2795#endif
     2796    {
     2797        if (IsTLS(session->sslServer)) {
     2798            ret =  DeriveTlsKeys(session->sslServer);
     2799            ret += DeriveTlsKeys(session->sslClient);
     2800        }
     2801        else {
     2802#ifndef NO_OLD_TLS
     2803            ret =  DeriveKeys(session->sslServer);
     2804            ret += DeriveKeys(session->sslClient);
     2805#endif
     2806        }
     2807        ret += SetKeysSide(session->sslServer, ENCRYPT_AND_DECRYPT_SIDE);
     2808        ret += SetKeysSide(session->sslClient, ENCRYPT_AND_DECRYPT_SIDE);
     2809    }
     2810
     2811    if (ret != 0) {
     2812        SetError(BAD_DERIVE_STR, error, session, FATAL_ERROR_STATE);
     2813        return -1;
     2814    }
     2815
     2816    return ret;
     2817}
    20812818
    20822819/* Process Server Hello */
     
    20842821                              SnifferSession* session, char* error)
    20852822{
     2823    int             ret = 0;
    20862824    ProtocolVersion pv;
    20872825    byte            b, b0;
    20882826    int             toRead = VERSION_SZ + RAN_LEN + ENUM_LEN;
    2089     int             doResume     = 0;
     2827    int             doResume = 0;
     2828    const byte*     inputHello = input;
    20902829    int             initialBytes = *sslBytes;
    20912830
    20922831    (void)msgSz;
    2093     (void)initialBytes;
    20942832
    20952833    /* make sure we didn't miss ClientHello */
    2096     if (session->flags.clientHello == 0) {
    2097         SetError(MISSED_CLIENT_HELLO_STR, error, session, FATAL_ERROR_STATE);
    2098         return -1;
     2834    if (session->flags.clientHello == 0 || session->sslClient->arrays == NULL) {
     2835        SetError(MISSED_CLIENT_HELLO_STR, error, session, 0);
     2836        return 0; /* do not throw error, just ignore packet */
    20992837    }
    21002838
     
    21112849    session->sslServer->version = pv;
    21122850    session->sslClient->version = pv;
     2851    if (pv.minor >= TLSv1_MINOR) {
     2852        session->sslServer->options.tls = 1;
     2853        session->sslClient->options.tls = 1;
     2854    }
    21132855
    21142856    XMEMCPY(session->sslServer->arrays->serverRandom, input, RAN_LEN);
    21152857    XMEMCPY(session->sslClient->arrays->serverRandom, input, RAN_LEN);
    2116     input    += RAN_LEN;
     2858    input     += RAN_LEN;
    21172859    *sslBytes -= RAN_LEN;
    21182860
     
    21262868    }
    21272869    if (b) {
     2870    #ifdef WOLFSSL_TLS13
     2871        XMEMCPY(session->sslServer->session.sessionID, input, ID_LEN);
     2872    #endif
    21282873        XMEMCPY(session->sslServer->arrays->sessionID, input, ID_LEN);
    21292874        session->sslServer->options.haveSessionId = 1;
     
    21692914    }
    21702915
    2171 #ifdef HAVE_EXTENDED_MASTER
    21722916    /* extensions */
    21732917    if ((initialBytes - *sslBytes) < msgSz) {
     
    21902934
    21912935        while (len >= EXT_TYPE_SZ + LENGTH_SZ) {
    2192             byte   extType[EXT_TYPE_SZ];
     2936            word16 extType;
    21932937            word16 extLen;
    21942938
    2195             extType[0] = input[0];
    2196             extType[1] = input[1];
     2939            extType    = (word16)((input[0] << 8) | input[1]);
    21972940            input     += EXT_TYPE_SZ;
    21982941            *sslBytes -= EXT_TYPE_SZ;
    21992942
    2200             extLen = (word16)((input[0] << 8) | input[1]);
     2943            extLen     = (word16)((input[0] << 8) | input[1]);
    22012944            input     += LENGTH_SZ;
    22022945            *sslBytes -= LENGTH_SZ;
     
    22092952            }
    22102953
    2211             if (extType[0] == 0x00 && extType[1] == EXT_MASTER_SECRET) {
     2954            switch (extType) {
     2955        #ifdef WOLFSSL_TLS13
     2956            case EXT_KEY_SHARE:
     2957                ret = ProcessServerKeyShare(session, input, extLen, error);
     2958                if (ret != 0) {
     2959                    SetError(SERVER_HELLO_INPUT_STR, error, session,
     2960                        FATAL_ERROR_STATE);
     2961                    return -1;
     2962                }
     2963                break;
     2964        #endif
     2965        #ifdef HAVE_SESSION_TICKET
     2966            case EXT_PRE_SHARED_KEY:
     2967                /* indicates we want to use resumption */
     2968                session->sslServer->options.resuming = 1;
     2969                session->sslClient->options.resuming = 1;
     2970            #ifdef WOLFSSL_TLS13
     2971                /* default nonce to len = 1, data = 0 */
     2972                session->sslServer->session.ticketNonce.len = 1;
     2973                session->sslServer->session.ticketNonce.data[0] = 0;
     2974                session->sslClient->session.ticketNonce.len = 1;
     2975                session->sslClient->session.ticketNonce.data[0] = 0;
     2976            #endif
     2977                break;
     2978        #endif
     2979        #ifdef HAVE_MAX_FRAGMENT
     2980            case EXT_MAX_FRAGMENT_LENGTH:
     2981            {
     2982                word16 max_fragment = MAX_RECORD_SIZE;
     2983                switch (input[0]) {
     2984                    case WOLFSSL_MFL_2_8 : max_fragment =  256; break;
     2985                    case WOLFSSL_MFL_2_9 : max_fragment =  512; break;
     2986                    case WOLFSSL_MFL_2_10: max_fragment = 1024; break;
     2987                    case WOLFSSL_MFL_2_11: max_fragment = 2048; break;
     2988                    case WOLFSSL_MFL_2_12: max_fragment = 4096; break;
     2989                    case WOLFSSL_MFL_2_13: max_fragment = 8192; break;
     2990                    default: break;
     2991                }
     2992                session->sslServer->max_fragment = max_fragment;
     2993                session->sslClient->max_fragment = max_fragment;
     2994                break;
     2995            }
     2996        #endif
     2997            case EXT_SUPPORTED_VERSIONS:
     2998                session->sslServer->version.major = input[0];
     2999                session->sslServer->version.minor = input[1];
     3000                session->sslClient->version.major = input[0];
     3001                session->sslClient->version.minor = input[1];
     3002                if (IsAtLeastTLSv1_3(session->sslServer->version)) {
     3003                    /* The server side handshake encryption is on for future packets */
     3004                    session->flags.serverCipherOn = 1;
     3005                }
     3006                break;
     3007            case EXT_MASTER_SECRET:
     3008            #ifdef HAVE_EXTENDED_MASTER
    22123009                session->flags.expectEms = 1;
     3010            #endif
     3011                break;
    22133012            }
    22143013
     
    22193018    }
    22203019
     3020#ifdef HAVE_EXTENDED_MASTER
    22213021    if (!session->flags.expectEms) {
    22223022        XFREE(session->hash, NULL, DYNAMIC_TYPE_HASHES);
     
    22273027    if (session->sslServer->options.haveSessionId) {
    22283028        if (XMEMCMP(session->sslServer->arrays->sessionID,
    2229                     session->sslClient->arrays->sessionID, ID_LEN) == 0)
     3029                session->sslClient->arrays->sessionID, ID_LEN) == 0) {
    22303030            doResume = 1;
    2231     }
     3031        }   
     3032    }       
    22323033    else if (session->sslClient->options.haveSessionId == 0 &&
    22333034             session->sslServer->options.haveSessionId == 0 &&
    2234              session->ticketID)
     3035             session->ticketID) {
    22353036        doResume = 1;
     3037    }
    22363038
    22373039    if (session->ticketID && doResume) {
     
    22423044    }
    22433045
    2244     if (doResume ) {
    2245         int ret = 0;
    2246         SSL_SESSION* resume = GetSession(session->sslServer,
    2247                                   session->sslServer->arrays->masterSecret, 0);
    2248         if (resume == NULL) {
    2249 #ifdef WOLFSSL_SNIFFER_STATS
    2250             INC_STAT(SnifferStats.sslResumeMisses);
    2251 #endif
    2252             SetError(BAD_SESSION_RESUME_STR, error, session, FATAL_ERROR_STATE);
    2253             return -1;
    2254         }
    2255         /* make sure client has master secret too */
    2256         XMEMCPY(session->sslClient->arrays->masterSecret,
    2257                session->sslServer->arrays->masterSecret, SECRET_LEN);
    2258         session->flags.resuming = 1;
    2259 
    2260         Trace(SERVER_DID_RESUMPTION_STR);
    2261 #ifdef WOLFSSL_SNIFFER_STATS
    2262         INC_STAT(SnifferStats.sslResumedConns);
    2263         INC_STAT(SnifferStats.sslResumptionValid);
    2264 #endif
    2265         if (SetCipherSpecs(session->sslServer) != 0) {
    2266             SetError(BAD_CIPHER_SPEC_STR, error, session, FATAL_ERROR_STATE);
    2267             return -1;
    2268         }
    2269 
    2270         if (SetCipherSpecs(session->sslClient) != 0) {
    2271             SetError(BAD_CIPHER_SPEC_STR, error, session, FATAL_ERROR_STATE);
    2272             return -1;
    2273         }
    2274 
    2275         if (session->sslServer->options.tls) {
    2276             ret =  DeriveTlsKeys(session->sslServer);
    2277             ret += DeriveTlsKeys(session->sslClient);
    2278         }
    2279         else {
    2280             ret =  DeriveKeys(session->sslServer);
    2281             ret += DeriveKeys(session->sslClient);
    2282         }
    2283         ret += SetKeysSide(session->sslServer, ENCRYPT_AND_DECRYPT_SIDE);
    2284         ret += SetKeysSide(session->sslClient, ENCRYPT_AND_DECRYPT_SIDE);
    2285 
     3046#ifdef WOLFSSL_TLS13
     3047    /* Is TLS v1.3 hello_retry_request? */
     3048    if (IsAtLeastTLSv1_3(session->sslServer->version) && session->srvKs.key_len == 0) {
     3049        Trace(GOT_HELLO_RETRY_REQ_STR);
     3050
     3051        /* do not compute keys yet */
     3052        session->flags.serverCipherOn = 0;
     3053
     3054        /* make sure the mac and digest size are set */
     3055        SetCipherSpecs(session->sslServer);
     3056        SetCipherSpecs(session->sslClient);
     3057
     3058        /* reset hashes */
     3059        RestartHandshakeHash(session->sslServer);
     3060        RestartHandshakeHash(session->sslClient);
     3061
     3062        doResume = 0;
     3063    }
     3064#endif
     3065
     3066    /* hash server_hello */
     3067    HashRaw(session->sslServer, inputHello - HANDSHAKE_HEADER_SZ,
     3068        initialBytes + HANDSHAKE_HEADER_SZ);
     3069    HashRaw(session->sslClient, inputHello - HANDSHAKE_HEADER_SZ,
     3070        initialBytes + HANDSHAKE_HEADER_SZ);
     3071
     3072    if (doResume) {
     3073        ret = DoResume(session, error);
    22863074        if (ret != 0) {
    2287             SetError(BAD_DERIVE_STR, error, session, FATAL_ERROR_STATE);
    2288             return -1;
     3075            return ret;
    22893076        }
    22903077    }
     
    22943081#endif
    22953082    }
     3083
    22963084#ifdef SHOW_SECRETS
    2297     {
    2298         int i;
    2299         printf("cipher suite = 0x%02x\n",
    2300                session->sslServer->options.cipherSuite);
    2301         printf("server random: ");
    2302         for (i = 0; i < RAN_LEN; i++)
    2303             printf("%02x", session->sslServer->arrays->serverRandom[i]);
    2304         printf("\n");
    2305     }
    2306 #endif
     3085    printf("cipher suite = 0x%02x\n", session->sslServer->options.cipherSuite);
     3086    PrintSecret("server random", session->sslServer->arrays->serverRandom, RAN_LEN);
     3087#endif
     3088
     3089#ifdef WOLFSSL_TLS13
     3090    /* Setup handshake keys */
     3091    if (IsAtLeastTLSv1_3(session->sslServer->version) && session->srvKs.key_len > 0) {
     3092        KeyBuffers_t keys;
     3093        XMEMSET(&keys, 0, sizeof(keys));
     3094        keys.rsaKey = session->sslServer->buffers.key;
     3095    #ifdef WOLFSSL_STATIC_EPHEMERAL
     3096        #ifndef NO_DH
     3097        keys.dhKey = session->sslServer->staticKE.dhKey;
     3098        #endif
     3099        #ifdef HAVE_ECC
     3100        keys.ecKey = session->sslServer->staticKE.ecKey;
     3101        #endif
     3102    #endif
     3103        ret = SetupKeys(session->cliKs.key, &session->cliKs.key_len,
     3104            session, error, &session->cliKs, &keys);
     3105        if (ret != 0) {
     3106            SetError(SERVER_HELLO_INPUT_STR, error, session, FATAL_ERROR_STATE);
     3107            return ret;
     3108        }
     3109
     3110        if (session->flags.side == WOLFSSL_SERVER_END)
     3111            session->flags.serverCipherOn = 1;
     3112        else
     3113            session->flags.clientCipherOn = 1;
     3114    }
     3115#endif
     3116
    23073117    return 0;
    23083118}
     
    23133123                              SnifferSession* session, char* error)
    23143124{
     3125    int ret = 0;
    23153126    byte   bLen;
    23163127    word16 len;
    23173128    int    toRead = VERSION_SZ + RAN_LEN + ENUM_LEN;
     3129    const byte* inputHello = input;
     3130    int inputHelloSz = *sslBytes;
     3131    WOLFSSL* ssl = session->sslServer;
     3132    int didHash = 0;
    23183133
    23193134#ifdef HAVE_SNI
     
    23213136        byte name[MAX_SERVER_NAME];
    23223137        word32 nameSz = sizeof(name);
    2323         int ret;
    23243138
    23253139        ret = wolfSSL_SNI_GetFromBuffer(
     
    23393153                if (nameSz == namedKey->nameSz &&
    23403154                           XSTRNCMP((char*)name, namedKey->name, nameSz) == 0) {
    2341                     if (wolfSSL_use_PrivateKey_buffer(session->sslServer,
    2342                                             namedKey->key, namedKey->keySz,
    2343                                             WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) {
     3155                #ifdef WOLFSSL_STATIC_EPHEMERAL
     3156                    if (namedKey->isEphemeralKey) {
     3157                        /* auto detect key type with WC_PK_TYPE_NONE */
     3158                        ret = wolfSSL_set_ephemeral_key(ssl,
     3159                            WC_PK_TYPE_NONE, (const char*)namedKey->key,
     3160                            namedKey->keySz, WOLFSSL_FILETYPE_ASN1);
     3161                        if (ret == 0)
     3162                            ret = WOLFSSL_SUCCESS;
     3163                    }
     3164                    else
     3165                #endif
     3166                    {
     3167                        ret = wolfSSL_use_PrivateKey_buffer(ssl,
     3168                            namedKey->key, namedKey->keySz,
     3169                            WOLFSSL_FILETYPE_ASN1);
     3170                    }
     3171                    if (ret != WOLFSSL_SUCCESS) {
    23443172                        wc_UnLockMutex(&session->context->namedKeysMutex);
    23453173                        SetError(CLIENT_HELLO_LATE_KEY_STR, error, session,
     
    23553183            wc_UnLockMutex(&session->context->namedKeysMutex);
    23563184        }
     3185        /* SSLv3 does not support the SNI TLS Extension and may return SNI_UNSUPPORTED */
     3186        if (ret > 0 || ret == SNI_UNSUPPORTED) {
     3187            /* make sure WOLFSSL_SUCCESS is converted to zero error code */
     3188            ret = 0;
     3189        }
    23573190    }
    23583191#endif
     
    23853218        }
    23863219        Trace(CLIENT_RESUME_TRY_STR);
     3220#ifdef WOLFSSL_TLS13
     3221        XMEMCPY(session->sslClient->session.sessionID, input, ID_LEN);
     3222#endif
    23873223        XMEMCPY(session->sslClient->arrays->sessionID, input, ID_LEN);
    23883224        session->sslClient->options.haveSessionId = 1;
    23893225    }
     3226
    23903227#ifdef SHOW_SECRETS
    2391     {
    2392         int i;
    2393         printf("client random: ");
    2394         for (i = 0; i < RAN_LEN; i++)
    2395             printf("%02x", session->sslServer->arrays->clientRandom[i]);
    2396         printf("\n");
    2397     }
     3228    PrintSecret("client random", ssl->arrays->clientRandom, RAN_LEN);
    23983229#endif
    23993230
     
    24503281
    24513282    while (len >= EXT_TYPE_SZ + LENGTH_SZ) {
    2452         byte   extType[EXT_TYPE_SZ];
     3283        word16 extType;
    24533284        word16 extLen;
    24543285
    2455         extType[0] = input[0];
    2456         extType[1] = input[1];
     3286        extType    = (word16)((input[0] << 8) | input[1]);
    24573287        input     += EXT_TYPE_SZ;
    24583288        *sslBytes -= EXT_TYPE_SZ;
    24593289
    2460         extLen = (word16)((input[0] << 8) | input[1]);
     3290        extLen     = (word16)((input[0] << 8) | input[1]);
    24613291        input     += LENGTH_SZ;
    24623292        *sslBytes -= LENGTH_SZ;
     
    24683298        }
    24693299
    2470         if (extType[0] == 0x00 && extType[1] == TICKET_EXT_ID) {
    2471 
     3300        switch (extType) {
     3301    #ifdef WOLFSSL_TLS13
     3302        case EXT_KEY_SHARE:
     3303        {
     3304            word16 ksLen = (word16)((input[0] << 8) | input[1]);
     3305            if (ksLen + OPAQUE16_LEN > extLen) {
     3306                SetError(CLIENT_HELLO_INPUT_STR, error, session, FATAL_ERROR_STATE);
     3307                return -1;
     3308            }
     3309            /* cache key share data till server_hello */
     3310            session->cliKeyShareSz = ksLen;
     3311            session->cliKeyShare = (byte*)XMALLOC(ksLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     3312            if (session->cliKeyShare == NULL) {
     3313                SetError(MEMORY_STR, error, session, FATAL_ERROR_STATE);
     3314                break;
     3315            }
     3316            XMEMCPY(session->cliKeyShare, &input[2], ksLen);
     3317            break;
     3318        }
     3319        #ifdef HAVE_SESSION_TICKET
     3320        case EXT_PRE_SHARED_KEY:
     3321        {
     3322            word16 idsLen, idLen, bindersLen, idx = 0;
     3323            word32 ticketAge;
     3324            const byte *identity, *binders;
     3325
     3326            idsLen = (word16)((input[idx] << 8) | input[idx+1]);
     3327            if (idsLen + OPAQUE16_LEN + idx > extLen) {
     3328                SetError(CLIENT_HELLO_INPUT_STR, error, session, FATAL_ERROR_STATE);
     3329                return -1;
     3330            }
     3331            idx += OPAQUE16_LEN;
     3332
     3333            /* PSK identity */
     3334            idLen = (word16)((input[idx] << 8) | input[idx+1]);
     3335            if (idLen + OPAQUE16_LEN + idx > extLen) {
     3336                SetError(CLIENT_HELLO_INPUT_STR, error, session, FATAL_ERROR_STATE);
     3337                return -1;
     3338            }
     3339            idx += OPAQUE16_LEN;
     3340            identity = &input[idx];
     3341            idx += idLen;
     3342
     3343            /* Obfuscated Ticket Age 32-bits */
     3344            ticketAge = (word32)((input[idx] << 24) | (input[idx+1] << 16) |
     3345                                 (input[idx+2] << 8) | input[idx+3]);
     3346            (void)ticketAge; /* not used */
     3347            idx += OPAQUE32_LEN;
     3348
     3349            /* binders - all binders */
     3350            bindersLen = (word16)((input[idx] << 8) | input[idx+1]);
     3351            if (bindersLen + OPAQUE16_LEN + idx > extLen) {
     3352                SetError(CLIENT_HELLO_INPUT_STR, error, session, FATAL_ERROR_STATE);
     3353                return -1;
     3354            }
     3355            idx += OPAQUE16_LEN;
     3356            binders = &input[idx];
     3357            bindersLen += OPAQUE16_LEN; /* includes 2 bytes for total len */
     3358            (void)binders; /* not used */
     3359
     3360            /* Hash data up to binders for deriving binders in PSK extension. */
     3361            HashRaw(session->sslServer, inputHello - HANDSHAKE_HEADER_SZ,
     3362                inputHelloSz - bindersLen + HANDSHAKE_HEADER_SZ);
     3363            HashRaw(session->sslClient, inputHello - HANDSHAKE_HEADER_SZ,
     3364                inputHelloSz - bindersLen + HANDSHAKE_HEADER_SZ);
     3365
     3366            /* call to decrypt session ticket */
     3367            if (DoClientTicket(ssl, identity, idLen) != 0) {
     3368                /* we aren't decrypting the resumption, since we know the master secret */
     3369                /* ignore errors */
     3370            }
     3371            ssl->options.resuming  = 1;
     3372
     3373            /* Hash the rest of the ClientHello. */
     3374            HashRaw(session->sslServer, inputHello + inputHelloSz - bindersLen, bindersLen);
     3375            HashRaw(session->sslClient, inputHello + inputHelloSz - bindersLen, bindersLen);
     3376            didHash = 1;
     3377            break;
     3378        }
     3379        #endif /* HAVE_SESSION_TICKET */
     3380    #endif /* WOLFSSL_TLS13 */
     3381        case EXT_SUPPORTED_VERSIONS:
     3382            break;
     3383        case EXT_TICKET_ID:
    24723384            /* make sure can read through ticket if there is a non blank one */
    24733385            if (extLen && extLen < ID_LEN) {
     
    24763388                return -1;
    24773389            }
    2478 
    24793390            if (extLen) {
    2480                 if (session->ticketID == 0) {
     3391                if (session->ticketID == NULL) {
    24813392                    session->ticketID = (byte*)XMALLOC(ID_LEN,
    24823393                            NULL, DYNAMIC_TYPE_SNIFFER_TICKET_ID);
     
    24893400                XMEMCPY(session->ticketID, input + extLen - ID_LEN, ID_LEN);
    24903401            }
     3402            break;
    24913403        }
    24923404
     
    24963408    }
    24973409
    2498     return 0;
     3410    if (!didHash) {
     3411        HashRaw(session->sslServer, inputHello - HANDSHAKE_HEADER_SZ,
     3412            inputHelloSz + HANDSHAKE_HEADER_SZ);
     3413        HashRaw(session->sslClient, inputHello - HANDSHAKE_HEADER_SZ,
     3414            inputHelloSz + HANDSHAKE_HEADER_SZ);
     3415    }
     3416
     3417    (void)ssl;
     3418
     3419    return ret;
    24993420}
    25003421
    25013422
    25023423#ifdef WOLFSSL_SNIFFER_WATCH
     3424
     3425static int KeyWatchCall(SnifferSession* session, const byte* data, int dataSz,
     3426    char* error)
     3427{
     3428    int ret;
     3429    Sha256 sha;
     3430    byte digest[SHA256_DIGEST_SIZE];
     3431
     3432    if (WatchCb == NULL) {
     3433        SetError(WATCH_CB_MISSING_STR, error, session, FATAL_ERROR_STATE);
     3434        return -1;
     3435    }
     3436
     3437    ret = wc_InitSha256(&sha);
     3438    if (ret == 0)
     3439        ret = wc_Sha256Update(&sha, data, dataSz);
     3440    if (ret == 0)
     3441        ret = wc_Sha256Final(&sha, digest);
     3442    if (ret != 0) {
     3443        SetError(WATCH_HASH_STR, error, session, FATAL_ERROR_STATE);
     3444        return -1;
     3445    }
     3446
     3447    ret = WatchCb((void*)session, digest, sizeof(digest),
     3448            data, dataSz, WatchCbCtx, error);
     3449    if (ret != 0) {
     3450#ifdef WOLFSSL_SNIFFER_STATS
     3451        INC_STAT(SnifferStats.sslKeysUnmatched);
     3452#endif
     3453        SetError(WATCH_FAIL_STR, error, session, FATAL_ERROR_STATE);
     3454        ret = -1;
     3455    }
     3456    else {
     3457#ifdef WOLFSSL_SNIFFER_STATS
     3458        INC_STAT(SnifferStats.sslKeyMatches);
     3459#endif
     3460    }
     3461    return ret;
     3462}
    25033463
    25043464/* Process Certificate */
     
    25063466        SnifferSession* session, char* error)
    25073467{
    2508     Sha256 sha;
    2509     const byte* certChain;
    25103468    word32 certChainSz;
    25113469    word32 certSz;
    2512     int ret;
    2513     byte digest[SHA256_DIGEST_SIZE];
    25143470
    25153471    /* If the receiver is the server, this is the client certificate message,
     
    25183474        return 0;
    25193475
    2520     if (WatchCb == NULL) {
    2521         SetError(WATCH_CB_MISSING_STR, error, session, FATAL_ERROR_STATE);
    2522         return -1;
    2523     }
    2524 
    25253476    if (*sslBytes < CERT_HEADER_SZ) {
    25263477        SetError(BAD_CERT_MSG_STR, error, session, FATAL_ERROR_STATE);
    25273478        return -1;
    25283479    }
     3480
     3481#ifdef WOLFSSL_TLS13
     3482    if (IsAtLeastTLSv1_3(session->sslServer->version)) {
     3483        /* skip 1 byte (Request context len) */
     3484        input += OPAQUE8_LEN;
     3485        *sslBytes -= OPAQUE8_LEN;
     3486    }
     3487#endif
     3488
    25293489    ato24(input, &certChainSz);
    25303490    *sslBytes -= CERT_HEADER_SZ;
     
    25353495        return -1;
    25363496    }
    2537     certChain = input;
    25383497
    25393498    ato24(input, &certSz);
     
    25463505    *sslBytes -= certChainSz;
    25473506
    2548     ret = wc_InitSha256(&sha);
    2549     if (ret == 0)
    2550         ret = wc_Sha256Update(&sha, input, certSz);
    2551     if (ret == 0)
    2552         ret = wc_Sha256Final(&sha, digest);
    2553     if (ret != 0) {
    2554         SetError(WATCH_HASH_STR, error, session, FATAL_ERROR_STATE);
    2555         return -1;
    2556     }
    2557 
    2558     ret = WatchCb((void*)session, digest, sizeof(digest),
    2559             certChain, certChainSz, WatchCbCtx, error);
    2560     if (ret != 0) {
    2561 #ifdef WOLFSSL_SNIFFER_STATS
    2562         INC_STAT(SnifferStats.sslKeysUnmatched);
    2563 #endif
    2564         SetError(WATCH_FAIL_STR, error, session, FATAL_ERROR_STATE);
    2565         return -1;
    2566     }
    2567     else {
    2568 #ifdef WOLFSSL_SNIFFER_STATS
    2569         INC_STAT(SnifferStats.sslKeyMatches);
    2570 #endif
    2571     }
    2572 
    2573     return 0;
     3507    return KeyWatchCall(session, input, certSz, error);
    25743508}
    25753509
     
    25813515                           SnifferSession* session, char* error)
    25823516{
    2583     SSL*  ssl;
     3517    WOLFSSL* ssl;
    25843518    word32 inOutIdx = 0;
    25853519    int    ret;
     
    25903524        ssl = session->sslClient;
    25913525
    2592     ret = DoFinished(ssl, input, &inOutIdx, (word32) size, (word32) *sslBytes,
    2593                                                                          SNIFF);
     3526#ifdef WOLFSSL_TLS13
     3527    if (IsAtLeastTLSv1_3(ssl->version)) {
     3528        ret = DoTls13Finished(ssl, input, &inOutIdx, (word32)size,
     3529            (word32)*sslBytes, SNIFF);
     3530
     3531        ssl->options.handShakeState = HANDSHAKE_DONE;
     3532        ssl->options.handShakeDone  = 1;
     3533    }
     3534    else
     3535#endif
     3536    {
     3537        ret = DoFinished(ssl, input, &inOutIdx, (word32)size,
     3538            (word32)*sslBytes, SNIFF);
     3539    }
    25943540    *sslBytes -= (int)inOutIdx;
    25953541
     
    26123558    }
    26133559
     3560#ifdef WOLFSSL_TLS13
     3561    /* Derive TLS v1.3 traffic keys */
     3562    if (IsAtLeastTLSv1_3(ssl->version)) {
     3563        if (!session->flags.gotFinished) {
     3564            /* When either side gets "finished" derive master secret and keys */
     3565            ret  = DeriveMasterSecret(session->sslServer);
     3566            ret += DeriveMasterSecret(session->sslClient);
     3567        #ifdef WOLFSSL_EARLY_DATA
     3568            ret += DeriveTls13Keys(session->sslServer, traffic_key, ENCRYPT_AND_DECRYPT_SIDE, ssl->earlyData == no_early_data);
     3569            ret += DeriveTls13Keys(session->sslClient, traffic_key, ENCRYPT_AND_DECRYPT_SIDE, ssl->earlyData == no_early_data);
     3570        #else
     3571            ret += DeriveTls13Keys(session->sslServer, traffic_key, ENCRYPT_AND_DECRYPT_SIDE, 1);
     3572            ret += DeriveTls13Keys(session->sslClient, traffic_key, ENCRYPT_AND_DECRYPT_SIDE, 1);
     3573        #endif
     3574
     3575            if (ret != 0) {
     3576                SetError(BAD_FINISHED_MSG, error, session, FATAL_ERROR_STATE);
     3577                return -1;
     3578            }
     3579
     3580            session->flags.gotFinished = 1;
     3581        #ifdef SHOW_SECRETS
     3582            ShowTlsSecrets(session);   
     3583        #endif
     3584        }
     3585
     3586        if (session->flags.side == WOLFSSL_SERVER_END) {
     3587            /* finished from client to server */
     3588            ret  = SetKeysSide(session->sslServer, DECRYPT_SIDE_ONLY);
     3589            ret += SetKeysSide(session->sslClient, ENCRYPT_SIDE_ONLY);
     3590
     3591        #ifdef HAVE_SESSION_TICKET
     3592            /* derive resumption secret for next session - on finished (from client) */
     3593            ret += DeriveResumptionSecret(session->sslClient, session->sslClient->session.masterSecret);
     3594
     3595            /* copy resumption secret to server */
     3596            XMEMCPY(session->sslServer->session.masterSecret,
     3597                session->sslClient->session.masterSecret, SECRET_LEN);
     3598            #ifdef SHOW_SECRETS
     3599            PrintSecret("resumption secret", session->sslClient->session.masterSecret, SECRET_LEN);
     3600            #endif
     3601        #endif
     3602        }
     3603        else {
     3604            /* finished from server to client */
     3605            ret  = SetKeysSide(session->sslServer, ENCRYPT_SIDE_ONLY);
     3606            ret += SetKeysSide(session->sslClient, DECRYPT_SIDE_ONLY);
     3607        }
     3608
     3609        if (ret != 0) {
     3610            SetError(BAD_FINISHED_MSG, error, session, FATAL_ERROR_STATE);
     3611            return -1;
     3612        }
     3613    }
     3614#endif
     3615
    26143616    /* If receiving a finished message from one side, free the resources
    26153617     * from the other side's tracker. */
     
    26253627/* Process HandShake input */
    26263628static int DoHandShake(const byte* input, int* sslBytes,
    2627                        SnifferSession* session, char* error)
     3629                       SnifferSession* session, char* error, word16 rhSize)
    26283630{
    26293631    byte type;
    26303632    int  size;
    26313633    int  ret = 0;
    2632     int  startBytes;
     3634    WOLFSSL* ssl;
     3635    int startBytes;
     3636
     3637    (void)rhSize;
     3638
     3639#ifdef HAVE_MAX_FRAGMENT
     3640    if (session->tlsFragBuf) {
     3641        XMEMCPY(session->tlsFragBuf + session->tlsFragOffset, input, rhSize);
     3642        session->tlsFragOffset += rhSize;
     3643        *sslBytes -= rhSize;
     3644
     3645        if (session->tlsFragOffset < session->tlsFragSize) {
     3646            return 0;
     3647        }
     3648
     3649        /* reassembled complete fragment */
     3650        input = session->tlsFragBuf;
     3651        *sslBytes = session->tlsFragSize;
     3652        rhSize = session->tlsFragSize;
     3653    }
     3654#endif
    26333655
    26343656    if (*sslBytes < HANDSHAKE_HEADER_SZ) {
     
    26493671    }
    26503672
    2651     /* A session's arrays are released when the handshake is completed. */
    2652     if (session->sslServer->arrays == NULL &&
    2653         session->sslClient->arrays == NULL) {
    2654 
    2655         SetError(NO_SECURE_RENEGOTIATION, error, session, FATAL_ERROR_STATE);
    2656         return -1;
    2657     }
    2658 
     3673    if (session->flags.side == WOLFSSL_SERVER_END)
     3674        ssl = session->sslServer;
     3675    else
     3676        ssl = session->sslClient;
     3677
     3678#ifdef HAVE_SECURE_RENEGOTIATION
     3679    if (!IsAtLeastTLSv1_3(ssl->version)) {
     3680        /* A session's arrays are released when the handshake is completed. */
     3681        if (session->sslServer->arrays == NULL &&
     3682            session->sslClient->arrays == NULL) {
     3683
     3684            SetError(NO_SECURE_RENEGOTIATION, error, session, FATAL_ERROR_STATE);
     3685            return -1;
     3686        }
     3687    }
     3688#endif
     3689
     3690#ifdef HAVE_MAX_FRAGMENT
     3691    if (rhSize < size) {
     3692        /* partial fragment, let's reassemble */
     3693        if (session->tlsFragBuf == NULL) {
     3694            session->tlsFragOffset = 0;
     3695            session->tlsFragSize = size + HANDSHAKE_HEADER_SZ;
     3696            session->tlsFragBuf = (byte*)XMALLOC(session->tlsFragSize, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     3697            if (session->tlsFragBuf == NULL) {
     3698                SetError(MEMORY_STR, error, NULL, 0);
     3699                return 0;
     3700            }
     3701
     3702            /* include the handshake header */
     3703            input -= HANDSHAKE_HEADER_SZ;
     3704            *sslBytes += HANDSHAKE_HEADER_SZ;
     3705        }
     3706
     3707        XMEMCPY(session->tlsFragBuf + session->tlsFragOffset, input, rhSize);
     3708        session->tlsFragOffset += rhSize;
     3709        *sslBytes -= rhSize;
     3710        return 0;
     3711    }
     3712#endif
     3713
     3714#ifdef WOLFSSL_TLS13
     3715    if (type != client_hello && type != server_hello) {
     3716        /* For resumption the hash is before / after client_hello PSK binder */
     3717        /* hash the packet including header */
     3718        /* TLS v1.3 requires the hash for the handshake and transfer key derivation */
     3719        /* we hash even for non TLS v1.3, since we don't know if its actually
     3720            TLS v1.3 till later at EXT_SUPPORTED_VERSIONS in server_hello */
     3721        /* hello retry request restarts hash prior to server_hello hash calc */
     3722        HashRaw(session->sslServer, input - HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ);
     3723        HashRaw(session->sslClient, input - HANDSHAKE_HEADER_SZ, size + HANDSHAKE_HEADER_SZ);
     3724    }
     3725#endif
    26593726#ifdef HAVE_EXTENDED_MASTER
    26603727    if (session->hash) {
     
    26623729            SetError(EXTENDED_MASTER_HASH_STR, error,
    26633730                     session, FATAL_ERROR_STATE);
    2664             return -1;
     3731            ret = -1;
     3732            goto exit;
    26653733        }
    26663734    }
     
    26943762            ret = -1;
    26953763            break;
     3764        case encrypted_extensions:
     3765            Trace(GOT_ENC_EXT_STR);
     3766            ssl->msgsReceived.got_encrypted_extensions = 1;
     3767            break;
    26963768        case certificate:
    26973769            Trace(GOT_CERT_STR);
     
    27533825        default:
    27543826            SetError(GOT_UNKNOWN_HANDSHAKE_STR, error, session, 0);
    2755             return -1;
    2756     }
     3827            ret = -1;
     3828            break;
     3829    }
     3830
     3831#ifdef HAVE_EXTENDED_MASTER
     3832exit:
     3833#endif
     3834#ifdef HAVE_MAX_FRAGMENT
     3835    if (session->tlsFragBuf) {
     3836        XFREE(session->tlsFragBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     3837        session->tlsFragBuf = NULL;
     3838    }
     3839#endif
    27573840
    27583841    *sslBytes = startBytes - size;  /* actual bytes of full process */
     
    27633846
    27643847/* Decrypt input into plain output, 0 on success */
    2765 static int Decrypt(SSL* ssl, byte* output, const byte* input, word32 sz)
     3848static int Decrypt(WOLFSSL* ssl, byte* output, const byte* input, word32 sz)
    27663849{
    27673850    int ret = 0;
     
    28143897        #endif
    28153898
    2816         #ifdef HAVE_AESGCM
     3899        #if defined(HAVE_AESGCM) || defined(HAVE_AESCCM)
    28173900        case wolfssl_aes_gcm:
    2818             if (sz >= (word32)(AESGCM_EXP_IV_SZ + ssl->specs.aead_mac_size))
    2819             {
    2820                 /* scratch buffer, sniffer ignores auth tag*/
     3901        case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */
     3902            if (sz >= (word32)(AESGCM_EXP_IV_SZ + ssl->specs.aead_mac_size)) {
     3903                /* scratch buffer, sniffer ignores auth tag */
     3904                wc_AesAuthEncryptFunc aes_auth_fn;
    28213905                byte authTag[WOLFSSL_MIN_AUTH_TAG_SZ];
    2822 
    28233906                byte nonce[AESGCM_NONCE_SZ];
    28243907                XMEMCPY(nonce, ssl->keys.aead_dec_imp_IV, AESGCM_IMP_IV_SZ);
    28253908                XMEMCPY(nonce + AESGCM_IMP_IV_SZ, input, AESGCM_EXP_IV_SZ);
    28263909
    2827                 if (wc_AesGcmEncrypt(ssl->decrypt.aes,
     3910                /* use encrypt because we don't care about authtag */
     3911            #if defined(BUILD_AESGCM) && defined(HAVE_AESCCM)
     3912                aes_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm)
     3913                                ? wc_AesGcmEncrypt : wc_AesCcmEncrypt;
     3914            #elif defined(BUILD_AESGCM)
     3915                aes_auth_fn = wc_AesGcmEncrypt;
     3916            #else
     3917                aes_auth_fn = wc_AesCcmEncrypt;
     3918            #endif
     3919                if (aes_auth_fn(ssl->decrypt.aes,
    28283920                            output,
    28293921                            input + AESGCM_EXP_IV_SZ,
     
    28423934            }
    28433935            break;
    2844          #endif
     3936        #endif
    28453937
    28463938        #ifdef HAVE_NULL_CIPHER
     
    28613953
    28623954/* Decrypt input message into output, adjust output steam if needed */
    2863 static const byte* DecryptMessage(SSL* ssl, const byte* input, word32 sz,
    2864                                   byte* output, int* error, int* advance)
     3955static const byte* DecryptMessage(WOLFSSL* ssl, const byte* input, word32 sz,
     3956                byte* output, int* error, int* advance, RecordLayerHeader* rh)
    28653957{
    28663958    int ivExtra = 0;
    2867 
    2868     int ret = Decrypt(ssl, output, input, sz);
     3959    int ret;
     3960   
     3961#ifdef WOLFSSL_TLS13
     3962    if (IsAtLeastTLSv1_3(ssl->version)) {
     3963        ret = DecryptTls13(ssl, output, input, sz, (byte*)rh, RECORD_HEADER_SZ);
     3964    }
     3965    else
     3966#endif
     3967    {
     3968        ret = Decrypt(ssl, output, input, sz);
     3969    }
    28693970    if (ret != 0) {
    28703971        *error = ret;
     
    28733974    ssl->keys.encryptSz = sz;
    28743975    if (ssl->options.tls1_1 && ssl->specs.cipher_type == block) {
    2875         output += ssl->specs.block_size;     /* go past TLSv1.1 IV */
     3976        output += ssl->specs.block_size; /* go past TLSv1.1 IV */
    28763977        ivExtra = ssl->specs.block_size;
    28773978        *advance = ssl->specs.block_size;
     
    28873988    if (ssl->specs.cipher_type == block)
    28883989        ssl->keys.padSz += *(output + sz - ivExtra - 1) + 1;
     3990
     3991#ifdef WOLFSSL_TLS13
     3992    if (IsAtLeastTLSv1_3(ssl->version)) {
     3993        word16 i = (word16)(sz - ssl->keys.padSz);
     3994        /* Remove padding from end of plain text. */
     3995        for (--i; i > 0; i--) {
     3996            if (output[i] != 0)
     3997                break;
     3998        }
     3999        /* Get the real content type from the end of the data. */
     4000        rh->type = output[i];
     4001        ssl->keys.padSz = sz - i;
     4002    }
     4003#endif
     4004    (void)rh;
    28894005
    28904006    return output;
     
    29434059        while (session) {
    29444060            SnifferSession* next = session->next;
    2945             if (time(NULL) >= session->lastUsed + WOLFSSL_SNIFFER_TIMEOUT) {
     4061            if (XTIME(NULL) >= session->lastUsed + WOLFSSL_SNIFFER_TIMEOUT) {
    29464062                TraceStaleSession();
    29474063                RemoveSession(session, NULL, NULL, i);
     
    29924108    session->cliSeqStart = tcpInfo->sequence;
    29934109    session->cliExpected = 1;  /* relative */
    2994     session->lastUsed= time(NULL);
     4110    session->lastUsed= XTIME(NULL);
    29954111    session->keySz = 0;
    29964112#ifdef HAVE_SNI
     
    30054121    }
    30064122
    3007     session->sslServer = SSL_new(session->context->ctx);
     4123    session->sslServer = wolfSSL_new(session->context->ctx);
    30084124    if (session->sslServer == NULL) {
    30094125        SetError(BAD_NEW_SSL_STR, error, session, FATAL_ERROR_STATE);
     
    30114127        return 0;
    30124128    }
    3013     session->sslClient = SSL_new(session->context->ctx);
     4129    session->sslClient = wolfSSL_new(session->context->ctx);
    30144130    if (session->sslClient == NULL) {
    3015         SSL_free(session->sslServer);
     4131        wolfSSL_free(session->sslServer);
    30164132        session->sslServer = 0;
    30174133
     
    31524268                  int length, const byte** sslFrame, int* sslBytes, char* error)
    31534269{
     4270    IpHdr* iphdr = (IpHdr*)packet;
     4271    int version;
     4272
    31544273    TraceHeader();
    31554274    TracePacket();
     
    31604279        return -1;
    31614280    }
     4281
     4282    version = IP_V(iphdr);
     4283    if (version != IPV6 && version != IPV4) {
     4284        /* Is this VLAN IEEE 802.1Q Frame? TPID = 0x8100 */
     4285        if (packet[2] == 0x81 && packet[3] == 0x00) {
     4286            /* trim VLAN header and try again */
     4287            packet += 8;
     4288            length -= 8;
     4289        }
     4290    }
     4291
    31624292    if (CheckIpHdr((IpHdr*)packet, ipInfo, length, error) != 0)
    31634293        return -1;
     
    31774307        return -1;
    31784308    }
     4309   
    31794310    /* We only care about the data in the TCP/IP record. There may be extra
    31804311     * data after the IP record for the FCS for Ethernet. */
     
    33724503{
    33734504    if (session->flags.side == WOLFSSL_SERVER_END) {
    3374         if (session->finCaputre.cliCounted == 0)
    3375             session->finCaputre.cliFinSeq = sequence;
     4505        if (session->finCapture.cliCounted == 0)
     4506            session->finCapture.cliFinSeq = sequence;
    33764507    }
    33774508    else {
    3378         if (session->finCaputre.srvCounted == 0)
    3379             session->finCaputre.srvFinSeq = sequence;
     4509        if (session->finCapture.srvCounted == 0)
     4510            session->finCapture.srvFinSeq = sequence;
    33804511    }
    33814512    return 1;
     
    35134644                                    &session->cliReassemblyMemory :
    35144645                                    &session->srvReassemblyMemory;
    3515     SSL*                 ssl = (session->flags.side == WOLFSSL_SERVER_END) ?
     4646    WOLFSSL*             ssl = (session->flags.side == WOLFSSL_SERVER_END) ?
    35164647                                    session->sslServer :
    35174648                                    session->sslClient;
     
    35894720    word32*   expected = (session->flags.side == WOLFSSL_SERVER_END) ?
    35904721                                &session->srvExpected : &session->cliExpected;
     4722    word32    seqStart = (session->flags.side == WOLFSSL_SERVER_END) ?
     4723                                session->srvSeqStart : session->cliSeqStart;
    35914724    PacketBuffer* list = (session->flags.side == WOLFSSL_SERVER_END) ?
    35924725                                session->srvReassemblyList :
     
    35964729                                &session->flags.cliSkipPartial;
    35974730
     4731    if (tcpInfo->ackNumber < seqStart) {
     4732        return -1; /* do not fix sequence - could be ack on unseen seq */
     4733    }
    35984734    *skipPartial = 1;
     4735   
    35994736    if (list != NULL)
    36004737        *expected = list->begin;
    3601     else {
    3602         word32 seqStart = (session->flags.side == WOLFSSL_SERVER_END) ?
    3603                                 session->srvSeqStart : session->cliSeqStart;
    3604         word32     real = tcpInfo->ackNumber - seqStart;
    3605 
    3606         *expected = real;
    3607     }
     4738    else
     4739        *expected = tcpInfo->ackNumber - seqStart;
     4740
    36084741
    36094742    return 1;
     
    36464779                        &session->flags.srvAckFault;
    36474780
    3648     /* init SEQ from server to client */
    3649     if (tcpInfo->syn && tcpInfo->ack) {
     4781    /* init SEQ from server to client - if not ack fault */
     4782    if (tcpInfo->syn && tcpInfo->ack && !*ackFault) {
    36504783        session->srvSeqStart = tcpInfo->sequence;
    36514784        session->srvExpected = 1;
     
    36944827{
    36954828    word32 length;
    3696     SSL* ssl = ((*session)->flags.side == WOLFSSL_SERVER_END) ?
     4829    WOLFSSL* ssl = ((*session)->flags.side == WOLFSSL_SERVER_END) ?
    36974830                                  (*session)->sslServer : (*session)->sslClient;
    36984831    byte  skipPartial = ((*session)->flags.side == WOLFSSL_SERVER_END) ?
     
    37584891
    37594892        Trace(CHAIN_INPUT_STR);
    3760         headerSz = (word32)*sslFrame - (word32)chain[0].iov_base;
     4893        headerSz = (word32)((const byte*)*sslFrame - (const byte*)chain[0].iov_base);
    37614894        remainder = *sslBytes;
    37624895
     
    38334966                                  &session->cliExpected : &session->srvExpected;
    38344967    /* buffer is on receiving end */
    3835     word32*        length = (session->flags.side == WOLFSSL_SERVER_END) ?
     4968    word32*          length = (session->flags.side == WOLFSSL_SERVER_END) ?
    38364969                               &session->sslServer->buffers.inputBuffer.length :
    38374970                               &session->sslClient->buffers.inputBuffer.length;
     
    38394972                               &session->sslServer->buffers.inputBuffer.buffer :
    38404973                               &session->sslClient->buffers.inputBuffer.buffer;
    3841     word32*       bufferSize = (session->flags.side == WOLFSSL_SERVER_END) ?
     4974    word32*      bufferSize = (session->flags.side == WOLFSSL_SERVER_END) ?
    38424975                           &session->sslServer->buffers.inputBuffer.bufferSize :
    38434976                           &session->sslClient->buffers.inputBuffer.bufferSize;
    3844     SSL*               ssl  = (session->flags.side == WOLFSSL_SERVER_END) ?
     4977    WOLFSSL*           ssl  = (session->flags.side == WOLFSSL_SERVER_END) ?
    38454978                            session->sslServer : session->sslClient;
    38464979    word32*     reassemblyMemory = (session->flags.side == WOLFSSL_SERVER_END) ?
     
    39045037    int               notEnough;        /* notEnough bytes yet flag */
    39055038    int               decrypted = 0;    /* was current msg decrypted */
    3906     SSL*              ssl = (session->flags.side == WOLFSSL_SERVER_END) ?
    3907                                         session->sslServer : session->sslClient;
     5039    WOLFSSL*          ssl = (session->flags.side == WOLFSSL_SERVER_END) ?
     5040                            session->sslServer : session->sslClient;
    39085041doMessage:
    39095042    notEnough = 0;
     
    39515084                                               session->flags.clientCipherOn)) {
    39525085        int ivAdvance = 0;  /* TLSv1.1 advance amount */
     5086
     5087        /* change_cipher_spec is not encrypted */
     5088        if (rh.type == change_cipher_spec) {
     5089            goto doPart;
     5090        }
    39535091        if (ssl->decrypt.setup != 1) {
    39545092            SetError(DECRYPT_KEYS_NOT_SETUP, error, session, FATAL_ERROR_STATE);
     
    39595097            return -1;
    39605098        }
     5099
    39615100        sslFrame = DecryptMessage(ssl, sslFrame, rhSize,
    39625101                                  ssl->buffers.outputBuffer.buffer, &errCode,
    3963                                   &ivAdvance);
     5102                                  &ivAdvance, &rh);
    39645103        recordEnd = sslFrame - ivAdvance + rhSize;  /* sslFrame moved so
    39655104                                                       should recordEnd */
     
    39925131
    39935132                Trace(GOT_HANDSHAKE_STR);
    3994                 ret = DoHandShake(sslFrame, &sslBytes, session, error);
    3995                 if (ret != 0) {
     5133                ret = DoHandShake(sslFrame, &sslBytes, session, error, rhSize);
     5134                if (ret != 0 || sslBytes > startIdx) {
    39965135                    if (session->flags.fatalError == 0)
    39975136                        SetError(BAD_HANDSHAKE_STR, error, session,
     
    40085147            break;
    40095148        case change_cipher_spec:
    4010             if (session->flags.side == WOLFSSL_SERVER_END)
    4011                 session->flags.serverCipherOn = 1;
     5149            if (session->flags.side == WOLFSSL_SERVER_END) {
     5150            #ifdef WOLFSSL_TLS13
     5151                if (IsAtLeastTLSv1_3(session->sslServer->version) && session->srvKs.key_len == 0) {
     5152                    session->flags.serverCipherOn = 0;
     5153                }
     5154                else
     5155            #endif
     5156                {
     5157                    session->flags.serverCipherOn = 1;
     5158                }
     5159            }
    40125160            else
    40135161                session->flags.clientCipherOn = 1;
     
    41465294{
    41475295    int ret = 0;
    4148     if (session->finCaputre.cliFinSeq && session->finCaputre.cliFinSeq <=
     5296    if (session->finCapture.cliFinSeq && session->finCapture.cliFinSeq <=
    41495297                                         session->cliExpected) {
    4150         if (session->finCaputre.cliCounted == 0) {
     5298        if (session->finCapture.cliCounted == 0) {
    41515299            session->flags.finCount += 1;
    4152             session->finCaputre.cliCounted = 1;
    4153             TraceClientFin(session->finCaputre.cliFinSeq, session->cliExpected);
    4154         }
    4155     }
    4156 
    4157     if (session->finCaputre.srvFinSeq && session->finCaputre.srvFinSeq <=
     5300            session->finCapture.cliCounted = 1;
     5301            TraceClientFin(session->finCapture.cliFinSeq, session->cliExpected);
     5302        }
     5303    }
     5304
     5305    if (session->finCapture.srvFinSeq && session->finCapture.srvFinSeq <=
    41585306                                         session->srvExpected) {
    4159         if (session->finCaputre.srvCounted == 0) {
     5307        if (session->finCapture.srvCounted == 0) {
    41605308            session->flags.finCount += 1;
    4161             session->finCaputre.srvCounted = 1;
    4162             TraceServerFin(session->finCaputre.srvFinSeq, session->srvExpected);
     5309            session->finCapture.srvCounted = 1;
     5310            TraceServerFin(session->finCapture.srvFinSeq, session->srvExpected);
    41635311        }
    41645312    }
     
    45815729                                          WOLFSSL_FILETYPE_ASN1;
    45825730
    4583     ret = LoadKeyFile(&keyBuf, &keyBufSz, keyFile, keyType, password);
     5731    ret = LoadKeyFile(&keyBuf, &keyBufSz, keyFile, 0, keyType, password);
    45845732    if (ret < 0) {
    45855733        SetError(KEY_FILE_STR, error, NULL, 0);
  • azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/src/ssl.c

    r457 r464  
    3535    defined(OPENSSL_EXTRA_X509_SMALL)
    3636
    37 #ifdef HAVE_ERRNO_H
    38     #include <errno.h>
    39 #endif
    40 
    4137#include <wolfssl/internal.h>
    4238#include <wolfssl/error-ssl.h>
     
    4945#endif
    5046
     47#ifdef HAVE_ERRNO_H
     48    #include <errno.h>
     49#endif
     50
    5151
    5252#if !defined(WOLFSSL_ALLOW_NO_SUITES) && !defined(WOLFCRYPT_ONLY)
    5353    #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(WOLFSSL_STATIC_RSA) \
    5454                && !defined(WOLFSSL_STATIC_DH) && !defined(WOLFSSL_STATIC_PSK) \
    55                 && !defined(HAVE_ED25519) && !defined(HAVE_ED448)
     55                && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448)
    5656        #error "No cipher suites defined because DH disabled, ECC disabled, and no static suites defined. Please see top of README"
    5757    #endif
     
    9696    #include <wolfssl/openssl/rc4.h>
    9797    #include <wolfssl/openssl/stack.h>
    98     #include <wolfssl/openssl/x509v3.h>
    9998    #include <wolfssl/openssl/x509_vfy.h>
    10099    /* openssl headers end, wolfssl internal headers next */
     
    102101    #include <wolfssl/wolfcrypt/random.h>
    103102    #include <wolfssl/wolfcrypt/des3.h>
     103    #include <wolfssl/wolfcrypt/ecc.h>
    104104    #include <wolfssl/wolfcrypt/md4.h>
    105105    #include <wolfssl/wolfcrypt/md5.h>
     
    111111    #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL)
    112112        #include <wolfssl/openssl/ocsp.h>
     113        #include <wolfssl/openssl/lhash.h>
     114        #include <wolfssl/openssl/txt_db.h>
    113115    #endif /* WITH_STUNNEL */
    114116    #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)
     
    126128    #endif /* OPENSSL_ALL && HAVE_PKCS7 */
    127129#endif
     130
    128131#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
     132    #include <wolfssl/openssl/x509v3.h>
    129133    int SetIndividualInternal(WOLFSSL_BIGNUM* bn, mp_int* mpi);
    130134    int SetIndividualExternal(WOLFSSL_BIGNUM** bn, mp_int* mpi);
    131135    int oid2nid(word32 oid, int grp);
     136    word32 nid2oid(int nid, int grp);
    132137#endif
    133138
     
    143148#define WOLFSSL_EVP_INCLUDED
    144149#include "wolfcrypt/src/evp.c"
     150
     151#ifndef WOLFCRYPT_ONLY
    145152
    146153#ifdef OPENSSL_EXTRA
     
    148155static WOLFSSL_BIGNUM* bn_one = NULL;
    149156#endif
    150 
    151 #ifndef WOLFCRYPT_ONLY
    152157
    153158#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
     
    190195#ifdef WOLFSSL_SESSION_EXPORT
    191196#ifdef WOLFSSL_DTLS
    192 int wolfSSL_dtls_import(WOLFSSL* ssl, unsigned char* buf, unsigned int sz)
     197int wolfSSL_dtls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz)
    193198{
    194199    WOLFSSL_ENTER("wolfSSL_session_import");
     
    402407                           && !defined(NO_SHA256) && !defined(WC_NO_RNG)
    403408        else {
    404             ctx->srp = (Srp*) XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
     409            ctx->srp = (Srp*)XMALLOC(sizeof(Srp), heap, DYNAMIC_TYPE_SRP);
    405410            if (ctx->srp == NULL){
    406411                WOLFSSL_MSG("Init CTX failed");
     
    439444{
    440445    int refCount = SSL_CTX_RefCount(ctx, 1);
    441     return ((refCount > 1) ? 1 : 0);
     446    return ((refCount > 1) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE);
    442447}
    443448#endif
     
    450455#if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \
    451456&& !defined(NO_SHA256) && !defined(WC_NO_RNG)
    452         if (ctx->srp != NULL){
     457        if (ctx->srp != NULL) {
    453458            if (ctx->srp_password != NULL){
    454459                XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
     
    903908    /* Add each member to the buffer delimited by a : */
    904909    for (i = 0; i < ciphersSz; i++) {
     910#ifndef NO_CIPHER_SUITE_ALIASES
     911        if (ciphers[i].flags & WOLFSSL_CIPHER_SUITE_FLAG_NAMEALIAS)
     912            continue;
     913#endif
    905914        cipherNameSz = (int)XSTRLEN(ciphers[i].name_iana);
    906915        if (cipherNameSz + 1 < len) {
     
    11651174#ifdef WOLFSSL_DTLS
    11661175static WC_INLINE word32 UpdateHighwaterMark(word32 cur, word32 first,
    1167                                          word32 second, word32 max)
     1176                                         word32 second, word32 high)
    11681177{
    11691178    word32 newCur = 0;
     
    11731182    else if (cur < second)
    11741183        newCur = second;
    1175     else if (cur < max)
    1176         newCur = max;
     1184    else if (cur < high)
     1185        newCur = high;
    11771186
    11781187    return newCur;
     
    15001509int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method,
    15011510                                   unsigned char* buf, unsigned int sz,
    1502                                    int flag, int max)
     1511                                   int flag, int maxSz)
    15031512{
    15041513    WOLFSSL_HEAP*      heap;
     
    15591568    /* determine what max applies too */
    15601569    if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) {
    1561         heap->maxIO = max;
     1570        heap->maxIO = maxSz;
    15621571    }
    15631572    else { /* general memory used in handshakes */
    1564         heap->maxHa = max;
     1573        heap->maxHa = maxSz;
    15651574    }
    15661575
    15671576    heap->flag |= flag;
    15681577
    1569     (void)max;
     1578    (void)maxSz;
    15701579    (void)method;
    15711580
     
    16481657        return INPUT_SIZE_E;
    16491658
    1650     return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0);
     1659    return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
    16511660}
    16521661
     
    16791688}
    16801689
    1681 #endif /* !NO_RSA */
     1690#endif /* HAVE_ECC */
    16821691
    16831692#ifndef NO_RSA
     
    19851994    #ifdef OPENSSL_EXTRA
    19861995    if (ssl->CBIS != NULL) {
    1987         ssl->CBIS(ssl, SSL_CB_WRITE, SSL_SUCCESS);
     1996        ssl->CBIS(ssl, SSL_CB_WRITE, WOLFSSL_SUCCESS);
    19881997        ssl->cbmode = SSL_CB_WRITE;
    19891998    }
     
    20252034        if (ssl->options.dtlsSctp)
    20262035#endif
    2027 #if defined(WOLLSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
     2036#if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU)
    20282037            ssl->dtls_expected_rx = max(ssl->dtls_expected_rx, ssl->dtlsMtuSz);
    20292038#endif
     
    20772086    #ifdef OPENSSL_EXTRA
    20782087    if (ssl->CBIS != NULL) {
    2079         ssl->CBIS(ssl, SSL_CB_READ, SSL_SUCCESS);
     2088        ssl->CBIS(ssl, SSL_CB_READ, WOLFSSL_SUCCESS);
    20802089        ssl->cbmode = SSL_CB_READ;
    20812090    }
     
    23682377
    23692378/* Elliptic Curves */
    2370 #if defined(HAVE_SUPPORTED_CURVES) && !defined(NO_WOLFSSL_CLIENT)
    2371 
    2372 int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
    2373 {
    2374     if (ssl == NULL)
    2375         return BAD_FUNC_ARG;
    2376 
     2379#if defined(HAVE_SUPPORTED_CURVES)
     2380
     2381static int isValidCurveGroup(word16 name)
     2382{
    23772383    switch (name) {
    23782384        case WOLFSSL_ECC_SECP160K1:
     
    23982404        case WOLFSSL_FFDHE_6144:
    23992405        case WOLFSSL_FFDHE_8192:
    2400             break;
     2406            return 1;
    24012407
    24022408        default:
    2403             return BAD_FUNC_ARG;
    2404     }
     2409            return 0;
     2410    }
     2411}
     2412
     2413int wolfSSL_UseSupportedCurve(WOLFSSL* ssl, word16 name)
     2414{
     2415    if (ssl == NULL || !isValidCurveGroup(name))
     2416        return BAD_FUNC_ARG;
    24052417
    24062418    ssl->options.userCurves = 1;
     
    24122424int wolfSSL_CTX_UseSupportedCurve(WOLFSSL_CTX* ctx, word16 name)
    24132425{
    2414     if (ctx == NULL)
     2426    if (ctx == NULL || !isValidCurveGroup(name))
    24152427        return BAD_FUNC_ARG;
    24162428
    2417     switch (name) {
    2418         case WOLFSSL_ECC_SECP160K1:
    2419         case WOLFSSL_ECC_SECP160R1:
    2420         case WOLFSSL_ECC_SECP160R2:
    2421         case WOLFSSL_ECC_SECP192K1:
    2422         case WOLFSSL_ECC_SECP192R1:
    2423         case WOLFSSL_ECC_SECP224K1:
    2424         case WOLFSSL_ECC_SECP224R1:
    2425         case WOLFSSL_ECC_SECP256K1:
    2426         case WOLFSSL_ECC_SECP256R1:
    2427         case WOLFSSL_ECC_SECP384R1:
    2428         case WOLFSSL_ECC_SECP521R1:
    2429         case WOLFSSL_ECC_BRAINPOOLP256R1:
    2430         case WOLFSSL_ECC_BRAINPOOLP384R1:
    2431         case WOLFSSL_ECC_BRAINPOOLP512R1:
    2432         case WOLFSSL_ECC_X25519:
    2433         case WOLFSSL_ECC_X448:
    2434         case WOLFSSL_FFDHE_2048:
    2435         case WOLFSSL_FFDHE_3072:
    2436         case WOLFSSL_FFDHE_4096:
    2437         case WOLFSSL_FFDHE_6144:
    2438         case WOLFSSL_FFDHE_8192:
    2439             break;
    2440 
    2441         default:
    2442             return BAD_FUNC_ARG;
    2443     }
    2444 
    24452429    ctx->userCurves = 1;
    24462430
     
    24482432}
    24492433
    2450 #endif /* HAVE_SUPPORTED_CURVES && !NO_WOLFSSL_CLIENT */
     2434#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13)
     2435int  wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups,
     2436                                        int count)
     2437{
     2438    int i;
     2439    int _groups[WOLFSSL_MAX_GROUP_COUNT];
     2440    WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
     2441    if (count == 0) {
     2442        WOLFSSL_MSG("Group count is zero");
     2443        return WOLFSSL_FAILURE;
     2444    }
     2445    for (i = 0; i < count; i++) {
     2446        if (isValidCurveGroup((word16)groups[i])) {
     2447            _groups[i] = groups[i];
     2448        }
     2449#ifdef HAVE_ECC
     2450        else {
     2451            /* groups may be populated with curve NIDs */
     2452            int oid = nid2oid(groups[i], oidCurveType);
     2453            int name = (int)GetCurveByOID(oid);
     2454            if (name == 0) {
     2455                WOLFSSL_MSG("Invalid group name");
     2456                return WOLFSSL_FAILURE;
     2457            }
     2458            _groups[i] = name;
     2459        }
     2460#else
     2461        else {
     2462            WOLFSSL_MSG("Invalid group name");
     2463            return WOLFSSL_FAILURE;
     2464        }
     2465#endif
     2466    }
     2467    return wolfSSL_CTX_set_groups(ctx, _groups, count) == WOLFSSL_SUCCESS ?
     2468            WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
     2469}
     2470
     2471int  wolfSSL_set1_groups(WOLFSSL* ssl, int* groups, int count)
     2472{
     2473    int i;
     2474    int _groups[WOLFSSL_MAX_GROUP_COUNT];
     2475    WOLFSSL_ENTER("wolfSSL_CTX_set1_groups");
     2476    if (count == 0) {
     2477        WOLFSSL_MSG("Group count is zero");
     2478        return WOLFSSL_FAILURE;
     2479    }
     2480    for (i = 0; i < count; i++) {
     2481        if (isValidCurveGroup((word16)groups[i])) {
     2482            _groups[i] = groups[i];
     2483        }
     2484#ifdef HAVE_ECC
     2485        else {
     2486            /* groups may be populated with curve NIDs */
     2487            int oid = nid2oid(groups[i], oidCurveType);
     2488            int name = (int)GetCurveByOID(oid);
     2489            if (name == 0) {
     2490                WOLFSSL_MSG("Invalid group name");
     2491                return WOLFSSL_FAILURE;
     2492            }
     2493            _groups[i] = name;
     2494        }
     2495#else
     2496        else {
     2497            WOLFSSL_MSG("Invalid group name");
     2498            return WOLFSSL_FAILURE;
     2499        }
     2500#endif
     2501    }
     2502    return wolfSSL_set_groups(ssl, _groups, count) == WOLFSSL_SUCCESS ?
     2503            WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
     2504}
     2505#endif /* OPENSSL_EXTRA && WOLFSSL_TLS13 */
     2506#endif /* HAVE_SUPPORTED_CURVES */
    24512507
    24522508/* QSH quantum safe handshake */
     
    25092565                    word32 protocol_name_listSz, byte options)
    25102566{
    2511     char    *list, *ptr, *token[WOLFSSL_MAX_ALPN_NUMBER]={NULL};
     2567    char    *list, *ptr, *token[WOLFSSL_MAX_ALPN_NUMBER+1]={NULL};
    25122568    word16  len;
    25132569    int     idx = 0;
     
    26642720
    26652721        if (ssl->options.handShakeState != HANDSHAKE_DONE) {
    2666             WOLFSSL_MSG("Can't renegotiate until previous handshake complete");
    2667             return SECURE_RENEGOTIATION_E;
     2722            if (!ssl->options.handShakeDone) {
     2723                WOLFSSL_MSG("Can't renegotiate until initial "
     2724                            "handshake complete");
     2725                return SECURE_RENEGOTIATION_E;
     2726            }
     2727            else {
     2728                WOLFSSL_MSG("Renegotiation already started. "
     2729                            "Moving it forward.");
     2730                ret = wolfSSL_negotiate(ssl);
     2731                if (ret == WOLFSSL_SUCCESS)
     2732                    ssl->secure_rene_count++;
     2733                return ret;
     2734            }
    26682735        }
    26692736
     
    27072774    }
    27082775    ret = wolfSSL_negotiate(ssl);
    2709     ssl->secure_rene_count++;
     2776    if (ret == WOLFSSL_SUCCESS)
     2777        ssl->secure_rene_count++;
    27102778    return ret;
    27112779}
     
    27692837#endif /* HAVE_SECURE_RENEGOTIATION */
    27702838
     2839#if defined(HAVE_SESSION_TICKET)
    27712840/* Session Ticket */
    2772 #if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SESSION_TICKET)
     2841
     2842#if !defined(NO_WOLFSSL_SERVER)
     2843int wolfSSL_CTX_NoTicketTLSv12(WOLFSSL_CTX* ctx)
     2844{
     2845    if (ctx == NULL)
     2846        return BAD_FUNC_ARG;
     2847
     2848    ctx->noTicketTls12 = 1;
     2849
     2850    return WOLFSSL_SUCCESS;
     2851}
     2852
     2853int wolfSSL_NoTicketTLSv12(WOLFSSL* ssl)
     2854{
     2855    if (ssl == NULL)
     2856        return BAD_FUNC_ARG;
     2857
     2858    ssl->options.noTicketTls12 = 1;
     2859
     2860    return WOLFSSL_SUCCESS;
     2861}
     2862
    27732863/* WOLFSSL_SUCCESS on ok */
    27742864int wolfSSL_CTX_set_TicketEncCb(WOLFSSL_CTX* ctx, SessionTicketEncCb cb)
     
    28042894}
    28052895
    2806 #endif /* !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_SESSION_TICKET) */
    2807 
    2808 /* Session Ticket */
    2809 #if !defined(NO_WOLFSSL_CLIENT) && defined(HAVE_SESSION_TICKET)
     2896#endif /* !NO_WOLFSSL_SERVER */
     2897
     2898#if !defined(NO_WOLFSSL_CLIENT)
    28102899int wolfSSL_UseSessionTicket(WOLFSSL* ssl)
    28112900{
     
    28882977    return WOLFSSL_SUCCESS;
    28892978}
    2890 #endif
     2979#endif /* !NO_WOLFSSL_CLIENT */
     2980
     2981#endif /* HAVE_SESSION_TICKET */
    28912982
    28922983
     
    30233114    }
    30243115
    3025 #ifdef OPENSSL_EXTRA
     3116#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    30263117    /* reset WOLFSSL structure state for possible re-use */
    30273118    if (ret == WOLFSSL_SUCCESS) {
     
    31213212char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data)
    31223213{
    3123     static wcchar msg = "Please supply a buffer for error string";
     3214    static char tmp[WOLFSSL_MAX_ERROR_SZ] = {0};
    31243215
    31253216    WOLFSSL_ENTER("ERR_error_string");
     
    31283219        return data;
    31293220    }
    3130 
    3131     return (char*)msg;
     3221    else {
     3222        SetErrorString((int)errNumber, tmp);
     3223        return tmp;
     3224    }
    31323225}
    31333226
     
    32283321    return 0;
    32293322}
     3323
     3324#ifdef WOLFSSL_DTLS
     3325const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
     3326{
     3327#ifndef WOLFSSL_AEAD_ONLY
     3328    Keys* keys = NULL;
     3329
     3330    (void)epochOrder;
     3331
     3332    if (ssl == NULL)
     3333        return NULL;
     3334
     3335#ifdef HAVE_SECURE_RENEGOTIATION
     3336    switch (epochOrder) {
     3337    case PEER_ORDER:
     3338        if (IsDtlsMsgSCRKeys(ssl))
     3339            keys = &ssl->secure_renegotiation->tmp_keys;
     3340        else
     3341            keys = &ssl->keys;
     3342        break;
     3343    case PREV_ORDER:
     3344        keys = &ssl->keys;
     3345        break;
     3346    case CUR_ORDER:
     3347        if (DtlsUseSCRKeys(ssl))
     3348            keys = &ssl->secure_renegotiation->tmp_keys;
     3349        else
     3350            keys = &ssl->keys;
     3351        break;
     3352    default:
     3353        WOLFSSL_MSG("Unknown epoch order");
     3354        return NULL;
     3355    }
     3356#else
     3357    keys = &ssl->keys;
     3358#endif
     3359
     3360    if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
     3361         (ssl->options.side == WOLFSSL_SERVER_END &&  verify) )
     3362        return keys->client_write_MAC_secret;
     3363    else
     3364        return keys->server_write_MAC_secret;
     3365#else
     3366    (void)ssl;
     3367    (void)verify;
     3368    (void)epochOrder;
     3369
     3370    return NULL;
     3371#endif
     3372}
     3373#endif /* WOLFSSL_DTLS */
    32303374
    32313375const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
     
    35273671    if (cm) {
    35283672        XMEMSET(cm, 0, sizeof(WOLFSSL_CERT_MANAGER));
     3673        cm->refCount = 1;
    35293674
    35303675        if (wc_InitMutex(&cm->caLock) != 0) {
     3676            WOLFSSL_MSG("Bad mutex init");
     3677            wolfSSL_CertManagerFree(cm);
     3678            return NULL;
     3679        }
     3680        if (wc_InitMutex(&cm->refMutex) != 0) {
    35313681            WOLFSSL_MSG("Bad mutex init");
    35323682            wolfSSL_CertManagerFree(cm);
     
    35643714void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm)
    35653715{
     3716    int doFree = 0;
    35663717    WOLFSSL_ENTER("wolfSSL_CertManagerFree");
    35673718
    35683719    if (cm) {
    3569         #ifdef HAVE_CRL
    3570             if (cm->crl)
    3571                 FreeCRL(cm->crl, 1);
    3572         #endif
    3573         #ifdef HAVE_OCSP
    3574             if (cm->ocsp)
    3575                 FreeOCSP(cm->ocsp, 1);
    3576             XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
    3577         #if !defined(NO_WOLFSSL_SERVER) && \
    3578             (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
    3579              defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
    3580             if (cm->ocsp_stapling)
    3581                 FreeOCSP(cm->ocsp_stapling, 1);
    3582         #endif
    3583         #endif
    3584         FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
    3585         wc_FreeMutex(&cm->caLock);
    3586 
    3587         #ifdef WOLFSSL_TRUST_PEER_CERT
    3588         FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
    3589         wc_FreeMutex(&cm->tpLock);
    3590         #endif
    3591 
    3592         XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER);
    3593     }
    3594 
     3720        if (wc_LockMutex(&cm->refMutex) != 0) {
     3721            WOLFSSL_MSG("Couldn't lock cm mutex");
     3722        }
     3723        cm->refCount--;
     3724        if (cm->refCount == 0)
     3725            doFree = 1;
     3726        wc_UnLockMutex(&cm->refMutex);
     3727        if (doFree) {
     3728            #ifdef HAVE_CRL
     3729                if (cm->crl)
     3730                    FreeCRL(cm->crl, 1);
     3731            #endif
     3732            #ifdef HAVE_OCSP
     3733                if (cm->ocsp)
     3734                    FreeOCSP(cm->ocsp, 1);
     3735                XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL);
     3736            #if !defined(NO_WOLFSSL_SERVER) && \
     3737                (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \
     3738                 defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2))
     3739                if (cm->ocsp_stapling)
     3740                    FreeOCSP(cm->ocsp_stapling, 1);
     3741            #endif
     3742            #endif
     3743            FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap);
     3744            wc_FreeMutex(&cm->caLock);
     3745
     3746            #ifdef WOLFSSL_TRUST_PEER_CERT
     3747            FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap);
     3748            wc_FreeMutex(&cm->tpLock);
     3749            #endif
     3750            if (wc_FreeMutex(&cm->refMutex) != 0) {
     3751                WOLFSSL_MSG("Couldn't free refMutex mutex");
     3752            }
     3753            XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER);
     3754        }
     3755    }
     3756
     3757}
     3758
     3759int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm)
     3760{
     3761    if (cm) {
     3762        if (wc_LockMutex(&cm->refMutex) != 0) {
     3763            WOLFSSL_MSG("Failed to lock cm mutex");
     3764        }
     3765        cm->refCount++;
     3766        wc_UnLockMutex(&cm->refMutex);
     3767
     3768        return WOLFSSL_SUCCESS;
     3769    }
     3770
     3771    return WOLFSSL_FAILURE;
    35953772}
    35963773
     
    36573834            if (CopyDecodedToX509(x509, dCert) == 0) {
    36583835
    3659                 if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
     3836                if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
    36603837                    WOLFSSL_MSG("Unable to load x509 into stack");
    36613838                    FreeX509(x509);
     
    37563933        if (CopyDecodedToX509(x509, dCert) == 0) {
    37573934
    3758             if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
     3935            if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
    37593936                WOLFSSL_MSG("Unable to load x509 into stack");
    37603937                wolfSSL_X509_free(x509);
     
    38414018    WOLFSSL_ENTER("wolfSSL_ERR_print_errors_fp");
    38424019    SetErrorString(err, data);
    3843     fprintf(fp, "%s", data);
     4020    XFPRINTF(fp, "%s", data);
    38444021}
    38454022
     
    39884165
    39894166/* Function to get version as WOLFSSL_ enum value for wolfSSL_SetVersion */
    3990 int wolfSSL_GetVersion(WOLFSSL* ssl)
     4167int wolfSSL_GetVersion(const WOLFSSL* ssl)
    39914168{
    39924169    if (ssl == NULL)
     
    40894266{
    40904267    return ((word32)hashID[0] << 24) | ((word32)hashID[1] << 16) |
    4091         (hashID[2] <<  8) | hashID[3];
     4268           ((word32)hashID[2] <<  8) |  (word32)hashID[3];
    40924269}
    40934270
     
    42544431    Signer* ret = NULL;
    42554432    Signer* signers;
    4256     word32  row = HashSigner(hash);
    4257 
    4258     if (cm == NULL)
     4433    word32  row = 0;
     4434
     4435    if (cm == NULL || hash == NULL)
    42594436        return NULL;
     4437
     4438    row = HashSigner(hash);
    42604439
    42614440    if (wc_LockMutex(&cm->caLock) != 0)
     
    43744553        /* add trusted peer signature */
    43754554        peerCert->sigLen = cert->sigLength;
    4376         peerCert->sig = XMALLOC(cert->sigLength, cm->heap,
     4555        peerCert->sig = (byte *)XMALLOC(cert->sigLength, cm->heap,
    43774556                                                        DYNAMIC_TYPE_SIGNATURE);
    43784557        if (peerCert->sig == NULL) {
     
    47334912#endif /* NO_SESSION_CACHE */
    47344913
     4914#if defined(OPENSSL_EXTRA) || \
     4915    (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA))
     4916static WC_RNG globalRNG;
     4917static int initGlobalRNG = 0;
     4918static wolfSSL_Mutex globalRNGMutex;
     4919#endif
     4920
    47354921WOLFSSL_ABI
    47364922int wolfSSL_Init(void)
     
    47444930            return WC_INIT_E;
    47454931        }
     4932
     4933#if defined(OPENSSL_EXTRA) || \
     4934    (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA))
     4935        if (wc_InitMutex(&globalRNGMutex) != 0) {
     4936            WOLFSSL_MSG("Bad Init Mutex rng");
     4937            return BAD_MUTEX_E;
     4938        }
     4939#endif
    47464940
    47474941#ifdef OPENSSL_EXTRA
     
    49605154            return MEMORY_E;
    49615155    #endif
    4962 
     5156       
    49635157        ret = wc_InitRsaKey_ex(key, heap, devId);
    49645158        if (ret == 0) {
     
    53415535                FreeDer(&ssl->buffers.certificate);
    53425536            #ifdef KEEP_OUR_CERT
    5343                 FreeX509(ssl->ourCert);
    5344                 if (ssl->ourCert) {
    5345                     XFREE(ssl->ourCert, ssl->heap, DYNAMIC_TYPE_X509);
    5346                     ssl->ourCert = NULL;
    5347                 }
     5537                wolfSSL_X509_free(ssl->ourCert);
     5538                ssl->ourCert = NULL;
    53485539            #endif
    53495540            }
     
    53585549        #ifdef KEEP_OUR_CERT
    53595550            if (ctx->ourCert) {
    5360                 if (ctx->ownOurCert) {
    5361                     FreeX509(ctx->ourCert);
    5362                     XFREE(ctx->ourCert, ctx->heap, DYNAMIC_TYPE_X509);
    5363                 }
     5551                if (ctx->ownOurCert)
     5552                    wolfSSL_X509_free(ctx->ourCert);
    53645553                ctx->ourCert = NULL;
    53655554            }
     
    54485637        if (ret != 0)
    54495638            return ret;
    5450         if (keyFormat == 0)
     5639        if (keyFormat == 0) {
     5640#ifdef OPENSSL_EXTRA
     5641            /* Reaching this point probably means that the
     5642             * decryption password is wrong */
     5643            if (info->passwd_cb)
     5644                EVPerr(0, EVP_R_BAD_DECRYPT);
     5645#endif
    54515646            return WOLFSSL_BAD_FILE;
     5647        }
    54525648
    54535649        (void)devId;
     
    54595655        DecodedCert  cert[1];
    54605656    #endif
    5461     #ifdef HAVE_PK_CALLBACKS
     5657    #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
    54625658        int keyType = 0;
    54635659    #endif
     
    55675763        #ifndef NO_RSA
    55685764            case RSAk:
    5569             #ifdef HAVE_PK_CALLBACKS
     5765            #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
    55705766                keyType = rsa_sa_algo;
    5571             #endif
    5572             #ifdef HAVE_PKCS11
    5573                 if (ctx) {
    5574                     ctx->privateKeyType = rsa_sa_algo;
    5575                 }
    5576                 else {
    5577                     ssl->buffers.keyType = rsa_sa_algo;
    5578                 }
    55795767            #endif
    55805768                /* Determine RSA key size by parsing public key */
     
    56035791        #ifdef HAVE_ECC
    56045792            case ECDSAk:
    5605             #ifdef HAVE_PK_CALLBACKS
     5793            #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
    56065794                keyType = ecc_dsa_sa_algo;
    5607             #endif
    5608             #ifdef HAVE_PKCS11
    5609                 if (ctx) {
    5610                     ctx->privateKeyType = ecc_dsa_sa_algo;
    5611                 }
    5612                 else {
    5613                     ssl->buffers.keyType = ecc_dsa_sa_algo;
    5614                 }
    56155795            #endif
    56165796                /* Determine ECC key size based on curve */
     
    56365816        #ifdef HAVE_ED25519
    56375817            case ED25519k:
    5638             #ifdef HAVE_PK_CALLBACKS
     5818            #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
    56395819                keyType = ed25519_sa_algo;
    5640             #endif
    5641             #ifdef HAVE_PKCS11
    5642                 if (ctx) {
    5643                     ctx->privateKeyType = ed25519_sa_algo;
    5644                 }
    5645                 else {
    5646                     ssl->buffers.keyType = ed25519_sa_algo;
    5647                 }
    56485820            #endif
    56495821                /* ED25519 is fixed key size */
     
    56675839        #ifdef HAVE_ED448
    56685840            case ED448k:
    5669             #ifdef HAVE_PK_CALLBACKS
     5841            #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
    56705842                keyType = ed448_sa_algo;
    5671             #endif
    5672             #ifdef HAVE_PKCS11
    5673                 if (ctx) {
    5674                     ctx->privateKeyType = ed448_sa_algo;
    5675                 }
    5676                 else {
    5677                     ssl->buffers.keyType = ed448_sa_algo;
    5678                 }
    56795843            #endif
    56805844                /* ED448 is fixed key size */
     
    57025866        }
    57035867
    5704     #ifdef HAVE_PK_CALLBACKS
    5705         if (ssl && ssl->buffers.keyType == 0) {
     5868    #if defined(HAVE_PKCS11) || defined(HAVE_PK_CALLBACKS)
     5869        if (ssl
     5870        #ifdef HAVE_PK_CALLBACKS
     5871                && ssl->buffers.keyType == 0
     5872        #endif
     5873            ) {
    57065874            ssl->buffers.keyType = keyType;
    57075875            ssl->buffers.keySz = keySz;
    57085876        }
    5709         else if (ctx && ctx->privateKeyType == 0) {
     5877        else if (ctx
     5878        #ifdef HAVE_PK_CALLBACKS
     5879                     && ctx->privateKeyType == 0
     5880        #endif
     5881            ) {
    57105882            ctx->privateKeyType = keyType;
    57115883            ctx->privateKeySz = keySz;
     
    57245896
    57255897    if (done == 1) {
    5726     #ifndef NO_WOLFSSL_CM_VERIFY
     5898    #if !defined(NO_WOLFSSL_CM_VERIFY) && (!defined(NO_WOLFSSL_CLIENT) || \
     5899                                           !defined(WOLFSSL_NO_CLIENT_AUTH))
    57275900        if ((type == CA_TYPE) || (type == CERT_TYPE)) {
    57285901            /* Call to over-ride status */
     
    60136186#endif /* NO_WOLFSSL_CM_VERIFY */
    60146187
     6188#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
    60156189/* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
    60166190int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const byte* buff,
     
    61196293    return CM_VerifyBuffer_ex(cm, buff, sz, format, 0);
    61206294}
     6295#endif /* !NO_WOLFSSL_CLIENT || !WOLFSSL_NO_CLIENT_AUTH */
     6296
    61216297/* turn on OCSP if off and compiled in, set options */
    61226298int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, int options)
     
    62366412}
    62376413
     6414/* require OCSP stapling response */
     6415int wolfSSL_CertManagerEnableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
     6416{
     6417    int ret;
     6418
     6419    WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPMustStaple");
     6420
     6421    if (cm == NULL)
     6422        return BAD_FUNC_ARG;
     6423
     6424#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
     6425 || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
     6426    #ifndef NO_WOLFSSL_CLIENT
     6427        cm->ocspMustStaple = 1;
     6428    #endif
     6429    ret = WOLFSSL_SUCCESS;
     6430#else
     6431    ret = NOT_COMPILED_IN;
     6432#endif
     6433
     6434    return ret;
     6435}
     6436
     6437int wolfSSL_CertManagerDisableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm)
     6438{
     6439    int ret;
     6440
     6441    WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPMustStaple");
     6442
     6443    if (cm == NULL)
     6444        return BAD_FUNC_ARG;
     6445
     6446#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
     6447 || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
     6448    #ifndef NO_WOLFSSL_CLIENT
     6449        cm->ocspMustStaple = 0;
     6450    #endif
     6451    ret = WOLFSSL_SUCCESS;
     6452#else
     6453    ret = NOT_COMPILED_IN;
     6454#endif
     6455    return ret;
     6456}
     6457
    62386458#ifdef HAVE_OCSP
    62396459/* check CRL if enabled, WOLFSSL_SUCCESS  */
     
    62566476
    62576477#ifdef WOLFSSL_SMALL_STACK
    6258     cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
     6478    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, DYNAMIC_TYPE_DCERT);
    62596479    if (cert == NULL)
    62606480        return MEMORY_E;
     
    62726492    FreeDecodedCert(cert);
    62736493#ifdef WOLFSSL_SMALL_STACK
    6274     XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
     6494    XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT);
    62756495#endif
    62766496
     
    64536673    if (ctx)
    64546674        return wolfSSL_CertManagerDisableOCSPStapling(ctx->cm);
     6675    else
     6676        return BAD_FUNC_ARG;
     6677}
     6678
     6679int wolfSSL_CTX_EnableOCSPMustStaple(WOLFSSL_CTX* ctx)
     6680{
     6681    WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSPMustStaple");
     6682    if (ctx)
     6683        return wolfSSL_CertManagerEnableOCSPMustStaple(ctx->cm);
     6684    else
     6685        return BAD_FUNC_ARG;
     6686}
     6687
     6688int wolfSSL_CTX_DisableOCSPMustStaple(WOLFSSL_CTX* ctx)
     6689{
     6690    WOLFSSL_ENTER("wolfSSL_CTX_DisableOCSPMustStaple");
     6691    if (ctx)
     6692        return wolfSSL_CertManagerDisableOCSPMustStaple(ctx->cm);
    64556693    else
    64566694        return BAD_FUNC_ARG;
     
    65176755    }
    65186756
    6519     if ( (ret = (int)XFREAD(myBuffer, 1, sz, file)) != sz)
     6757    if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
    65206758        ret = WOLFSSL_BAD_FILE;
    65216759    else {
     
    66936931
    66946932
     6933#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
    66956934/* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */
    66966935int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* fname,
     
    67346973    }
    67356974
    6736     if ( (ret = (int)XFREAD(myBuffer, 1, sz, file)) != sz)
     6975    if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
    67376976        ret = WOLFSSL_BAD_FILE;
    67386977    else
     
    67456984    return ret;
    67466985}
    6747 
     6986#endif
    67486987
    67496988/* like load verify locations, 1 for success, < 0 for error */
     
    67797018    return ret;
    67807019}
     7020
     7021
     7022#endif /* NO_FILESYSTEM */
     7023
     7024#ifdef HAVE_CRL
     7025
     7026/* check CRL if enabled, WOLFSSL_SUCCESS  */
     7027int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
     7028{
     7029    int ret = 0;
     7030#ifdef WOLFSSL_SMALL_STACK
     7031    DecodedCert* cert = NULL;
     7032#else
     7033    DecodedCert  cert[1];
     7034#endif
     7035
     7036    WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL");
     7037
     7038    if (cm == NULL)
     7039        return BAD_FUNC_ARG;
     7040
     7041    if (cm->crlEnabled == 0)
     7042        return WOLFSSL_SUCCESS;
     7043
     7044#ifdef WOLFSSL_SMALL_STACK
     7045    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
     7046    if (cert == NULL)
     7047        return MEMORY_E;
     7048#endif
     7049
     7050    InitDecodedCert(cert, der, sz, NULL);
     7051
     7052    if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm)) != 0) {
     7053        WOLFSSL_MSG("ParseCert failed");
     7054    }
     7055    else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) {
     7056        WOLFSSL_MSG("CheckCertCRL failed");
     7057    }
     7058
     7059    FreeDecodedCert(cert);
     7060#ifdef WOLFSSL_SMALL_STACK
     7061    XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
     7062#endif
     7063
     7064    return ret == 0 ? WOLFSSL_SUCCESS : ret;
     7065}
     7066
     7067
     7068int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb)
     7069{
     7070    WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb");
     7071    if (cm == NULL)
     7072        return BAD_FUNC_ARG;
     7073
     7074    cm->cbMissingCRL = cb;
     7075
     7076    return WOLFSSL_SUCCESS;
     7077}
     7078
     7079#ifdef HAVE_CRL_IO
     7080int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb)
     7081{
     7082    if (cm == NULL)
     7083        return BAD_FUNC_ARG;
     7084
     7085    cm->crl->crlIOCb = cb;
     7086
     7087    return WOLFSSL_SUCCESS;
     7088}
     7089#endif
     7090
     7091#ifndef NO_FILESYSTEM
     7092int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path,
     7093                              int type, int monitor)
     7094{
     7095    WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL");
     7096    if (cm == NULL)
     7097        return BAD_FUNC_ARG;
     7098
     7099    if (cm->crl == NULL) {
     7100        if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
     7101            WOLFSSL_MSG("Enable CRL failed");
     7102            return WOLFSSL_FATAL_ERROR;
     7103        }
     7104    }
     7105
     7106    return LoadCRL(cm->crl, path, type, monitor);
     7107}
     7108#endif
     7109
     7110int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
     7111{
     7112    WOLFSSL_ENTER("wolfSSL_EnableCRL");
     7113    if (ssl)
     7114        return wolfSSL_CertManagerEnableCRL(ssl->ctx->cm, options);
     7115    else
     7116        return BAD_FUNC_ARG;
     7117}
     7118
     7119
     7120int wolfSSL_DisableCRL(WOLFSSL* ssl)
     7121{
     7122    WOLFSSL_ENTER("wolfSSL_DisableCRL");
     7123    if (ssl)
     7124        return wolfSSL_CertManagerDisableCRL(ssl->ctx->cm);
     7125    else
     7126        return BAD_FUNC_ARG;
     7127}
     7128
     7129#ifndef NO_FILESYSTEM
     7130int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
     7131{
     7132    WOLFSSL_ENTER("wolfSSL_LoadCRL");
     7133    if (ssl)
     7134        return wolfSSL_CertManagerLoadCRL(ssl->ctx->cm, path, type, monitor);
     7135    else
     7136        return BAD_FUNC_ARG;
     7137}
     7138#endif
     7139
     7140
     7141int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
     7142{
     7143    WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
     7144    if (ssl)
     7145        return wolfSSL_CertManagerSetCRL_Cb(ssl->ctx->cm, cb);
     7146    else
     7147        return BAD_FUNC_ARG;
     7148}
     7149
     7150#ifdef HAVE_CRL_IO
     7151int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
     7152{
     7153    WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
     7154    if (ssl)
     7155        return wolfSSL_CertManagerSetCRL_IOCb(ssl->ctx->cm, cb);
     7156    else
     7157        return BAD_FUNC_ARG;
     7158}
     7159#endif
     7160
     7161int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
     7162{
     7163    WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
     7164    if (ctx)
     7165        return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
     7166    else
     7167        return BAD_FUNC_ARG;
     7168}
     7169
     7170
     7171int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
     7172{
     7173    WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
     7174    if (ctx)
     7175        return wolfSSL_CertManagerDisableCRL(ctx->cm);
     7176    else
     7177        return BAD_FUNC_ARG;
     7178}
     7179
     7180
     7181#ifndef NO_FILESYSTEM
     7182int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
     7183                        int type, int monitor)
     7184{
     7185    WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
     7186    if (ctx)
     7187        return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
     7188    else
     7189        return BAD_FUNC_ARG;
     7190}
     7191#endif
     7192
     7193
     7194int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
     7195{
     7196    WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
     7197    if (ctx)
     7198        return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
     7199    else
     7200        return BAD_FUNC_ARG;
     7201}
     7202
     7203#ifdef HAVE_CRL_IO
     7204int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
     7205{
     7206    WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
     7207    if (ctx)
     7208        return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
     7209    else
     7210        return BAD_FUNC_ARG;
     7211}
     7212#endif
     7213
     7214
     7215#endif /* HAVE_CRL */
     7216
     7217
     7218#ifndef NO_FILESYSTEM
     7219
     7220
     7221#ifdef WOLFSSL_DER_LOAD
     7222
     7223/* Add format parameter to allow DER load of CA files */
     7224int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
     7225                                          int format)
     7226{
     7227    WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
     7228    if (ctx == NULL || file == NULL)
     7229        return WOLFSSL_FAILURE;
     7230
     7231    if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
     7232                    GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
     7233        return WOLFSSL_SUCCESS;
     7234    }
     7235
     7236    return WOLFSSL_FAILURE;
     7237}
     7238
     7239#endif /* WOLFSSL_DER_LOAD */
     7240
     7241
     7242
     7243WOLFSSL_ABI
     7244int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
     7245                                     int format)
     7246{
     7247    WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
     7248
     7249    if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
     7250                    GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
     7251        return WOLFSSL_SUCCESS;
     7252    }
     7253
     7254    return WOLFSSL_FAILURE;
     7255}
     7256
     7257
     7258WOLFSSL_ABI
     7259int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
     7260                                    int format)
     7261{
     7262    WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
     7263
     7264    if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
     7265                    GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
     7266        return WOLFSSL_SUCCESS;
     7267    }
     7268
     7269    return WOLFSSL_FAILURE;
     7270}
     7271
     7272
     7273#endif /* NO_FILESYSTEM */
     7274
     7275
     7276/* Sets the max chain depth when verifying a certificate chain. Default depth
     7277 * is set to MAX_CHAIN_DEPTH.
     7278 *
     7279 * ctx   WOLFSSL_CTX structure to set depth in
     7280 * depth max depth
     7281 */
     7282void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
     7283    WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
     7284
     7285    if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
     7286        WOLFSSL_MSG("Bad depth argument, too large or less than 0");
     7287        return;
     7288    }
     7289
     7290    ctx->verifyDepth = (byte)depth;
     7291}
     7292
     7293
     7294/* get cert chaining depth using ssl struct */
     7295long wolfSSL_get_verify_depth(WOLFSSL* ssl)
     7296{
     7297    if(ssl == NULL) {
     7298        return BAD_FUNC_ARG;
     7299    }
     7300#ifndef OPENSSL_EXTRA
     7301    return MAX_CHAIN_DEPTH;
     7302#else
     7303    return ssl->options.verifyDepth;
     7304#endif
     7305}
     7306
     7307
     7308/* get cert chaining depth using ctx struct */
     7309long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
     7310{
     7311    if (ctx == NULL) {
     7312        return BAD_FUNC_ARG;
     7313    }
     7314#ifndef OPENSSL_EXTRA
     7315    return MAX_CHAIN_DEPTH;
     7316#else
     7317    return ctx->verifyDepth;
     7318#endif
     7319}
     7320
     7321
     7322#ifndef NO_FILESYSTEM
     7323
     7324
     7325WOLFSSL_ABI
     7326int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
     7327{
     7328    /* process up to MAX_CHAIN_DEPTH plus subject cert */
     7329    WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
     7330
     7331    if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
     7332                    GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
     7333        return WOLFSSL_SUCCESS;
     7334    }
     7335
     7336   return WOLFSSL_FAILURE;
     7337}
     7338
     7339
     7340int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
     7341                                                  const char* file, int format)
     7342{
     7343    /* process up to MAX_CHAIN_DEPTH plus subject cert */
     7344    WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
     7345
     7346    if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
     7347                    GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
     7348        return WOLFSSL_SUCCESS;
     7349    }
     7350
     7351   return WOLFSSL_FAILURE;
     7352}
     7353
     7354
     7355#ifndef NO_DH
     7356
     7357/* server Diffie-Hellman parameters */
     7358static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
     7359                                        const char* fname, int format)
     7360{
     7361#ifdef WOLFSSL_SMALL_STACK
     7362    byte   staticBuffer[1]; /* force heap usage */
     7363#else
     7364    byte   staticBuffer[FILE_BUFFER_SIZE];
     7365#endif
     7366    byte*  myBuffer = staticBuffer;
     7367    int    dynamic = 0;
     7368    int    ret;
     7369    long   sz = 0;
     7370    XFILE  file;
     7371
     7372    if (ctx == NULL || fname == NULL)
     7373        return BAD_FUNC_ARG;
     7374
     7375    file = XFOPEN(fname, "rb");
     7376    if (file == XBADFILE) return WOLFSSL_BAD_FILE;
     7377    if(XFSEEK(file, 0, XSEEK_END) != 0) {
     7378        XFCLOSE(file);
     7379        return WOLFSSL_BAD_FILE;
     7380    }
     7381    sz = XFTELL(file);
     7382    XREWIND(file);
     7383
     7384    if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
     7385        WOLFSSL_MSG("SetTmpDH file size error");
     7386        XFCLOSE(file);
     7387        return WOLFSSL_BAD_FILE;
     7388    }
     7389
     7390    if (sz > (long)sizeof(staticBuffer)) {
     7391        WOLFSSL_MSG("Getting dynamic buffer");
     7392        myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
     7393        if (myBuffer == NULL) {
     7394            XFCLOSE(file);
     7395            return WOLFSSL_BAD_FILE;
     7396        }
     7397        dynamic = 1;
     7398    }
     7399
     7400    if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz)
     7401        ret = WOLFSSL_BAD_FILE;
     7402    else {
     7403        if (ssl)
     7404            ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
     7405        else
     7406            ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
     7407    }
     7408
     7409    XFCLOSE(file);
     7410    if (dynamic)
     7411        XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
     7412
     7413    return ret;
     7414}
     7415
     7416/* server Diffie-Hellman parameters */
     7417int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
     7418{
     7419    if (ssl == NULL)
     7420        return BAD_FUNC_ARG;
     7421
     7422    return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
     7423}
     7424
     7425
     7426/* server Diffie-Hellman parameters */
     7427int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
     7428{
     7429    return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
     7430}
     7431
     7432#endif /* NO_DH */
     7433
     7434#endif /* NO_FILESYSTEM */
    67817435
    67827436#ifndef NO_CHECK_PRIVATE_KEY
     
    67997453    WOLFSSL_ENTER("wolfSSL_CTX_check_private_key");
    68007454
    6801     if (ctx == NULL) {
     7455    if (ctx == NULL || ctx->certificate == NULL) {
    68027456        return WOLFSSL_FAILURE;
    68037457    }
     
    68237477    size = ctx->privateKey->length;
    68247478    buff = ctx->privateKey->buffer;
    6825     ret  = wc_CheckPrivateKey(buff, size, der);
     7479#ifdef WOLF_CRYPTO_CB
     7480    if (ctx->privateKeyDevId != INVALID_DEVID) {
     7481        int type = 0;
     7482        void *pkey = NULL;
     7483
     7484        if (der->keyOID == RSAk) {
     7485            type = DYNAMIC_TYPE_RSA;
     7486        }
     7487        else if (der->keyOID == ECDSAk) {
     7488            type = DYNAMIC_TYPE_ECC;
     7489        }
     7490        ret = CreateDevPrivateKey(&pkey, buff, size, type, ctx->privateKeyLabel,
     7491                                  ctx->privateKeyId, ctx->heap,
     7492                                  ctx->privateKeyDevId);
     7493        if (ret == 0 && der->keyOID == RSAk) {
     7494            ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey, der->publicKey,
     7495                                              der->pubKeySize);
     7496            wc_FreeRsaKey((RsaKey*)pkey);
     7497        }
     7498        else if (ret == 0 && der->keyOID == ECDSAk) {
     7499            ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey, der->publicKey,
     7500                                              der->pubKeySize);
     7501            wc_ecc_free((ecc_key*)pkey);
     7502        }
     7503        if (pkey != NULL) {
     7504            XFREE(pkey, ctx->heap, type);
     7505        }
     7506        if (ret == 0) {
     7507            ret = WOLFSSL_SUCCESS;
     7508        }
     7509        else {
     7510            ret = WOLFSSL_FAILURE;
     7511        }
     7512    }
     7513    else
     7514#endif
     7515    {
     7516        ret = wc_CheckPrivateKeyCert(buff, size, der);
     7517        if (ret == 1) {
     7518            ret = WOLFSSL_SUCCESS;
     7519        }
     7520        else {
     7521            ret = WOLFSSL_FAILURE;
     7522        }
     7523    }
    68267524    FreeDecodedCert(der);
    68277525#ifdef WOLFSSL_SMALL_STACK
     
    68297527#endif
    68307528
    6831     if (ret == 1) {
    6832         return WOLFSSL_SUCCESS;
    6833     }
    6834     else {
    6835         return WOLFSSL_FAILURE;
    6836     }
     7529    return ret;
    68377530#else
    68387531    WOLFSSL_MSG("NO_CERTS is defined, can not check private key");
     
    68427535#endif /* !NO_CHECK_PRIVATE_KEY */
    68437536
    6844 
    6845 #ifdef HAVE_CRL
    6846 
    6847 /* check CRL if enabled, WOLFSSL_SUCCESS  */
    6848 int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz)
    6849 {
    6850     int ret = 0;
    6851 #ifdef WOLFSSL_SMALL_STACK
    6852     DecodedCert* cert = NULL;
    6853 #else
    6854     DecodedCert  cert[1];
    6855 #endif
    6856 
    6857     WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL");
    6858 
    6859     if (cm == NULL)
    6860         return BAD_FUNC_ARG;
    6861 
    6862     if (cm->crlEnabled == 0)
    6863         return WOLFSSL_SUCCESS;
    6864 
    6865 #ifdef WOLFSSL_SMALL_STACK
    6866     cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT);
    6867     if (cert == NULL)
    6868         return MEMORY_E;
    6869 #endif
    6870 
    6871     InitDecodedCert(cert, der, sz, NULL);
    6872 
    6873     if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm)) != 0) {
    6874         WOLFSSL_MSG("ParseCert failed");
    6875     }
    6876     else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) {
    6877         WOLFSSL_MSG("CheckCertCRL failed");
    6878     }
    6879 
    6880     FreeDecodedCert(cert);
    6881 #ifdef WOLFSSL_SMALL_STACK
    6882     XFREE(cert, NULL, DYNAMIC_TYPE_DCERT);
    6883 #endif
    6884 
    6885     return ret == 0 ? WOLFSSL_SUCCESS : ret;
    6886 }
    6887 
    6888 
    6889 int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb)
    6890 {
    6891     WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb");
    6892     if (cm == NULL)
    6893         return BAD_FUNC_ARG;
    6894 
    6895     cm->cbMissingCRL = cb;
    6896 
    6897     return WOLFSSL_SUCCESS;
    6898 }
    6899 
    6900 #ifdef HAVE_CRL_IO
    6901 int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb)
    6902 {
    6903     if (cm == NULL)
    6904         return BAD_FUNC_ARG;
    6905 
    6906     cm->crl->crlIOCb = cb;
    6907 
    6908     return WOLFSSL_SUCCESS;
    6909 }
    6910 #endif
    6911 
    6912 int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path,
    6913                               int type, int monitor)
    6914 {
    6915     WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL");
    6916     if (cm == NULL)
    6917         return BAD_FUNC_ARG;
    6918 
    6919     if (cm->crl == NULL) {
    6920         if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) {
    6921             WOLFSSL_MSG("Enable CRL failed");
    6922             return WOLFSSL_FATAL_ERROR;
    6923         }
    6924     }
    6925 
    6926     return LoadCRL(cm->crl, path, type, monitor);
    6927 }
    6928 
    6929 int wolfSSL_EnableCRL(WOLFSSL* ssl, int options)
    6930 {
    6931     WOLFSSL_ENTER("wolfSSL_EnableCRL");
    6932     if (ssl)
    6933         return wolfSSL_CertManagerEnableCRL(ssl->ctx->cm, options);
    6934     else
    6935         return BAD_FUNC_ARG;
    6936 }
    6937 
    6938 
    6939 int wolfSSL_DisableCRL(WOLFSSL* ssl)
    6940 {
    6941     WOLFSSL_ENTER("wolfSSL_DisableCRL");
    6942     if (ssl)
    6943         return wolfSSL_CertManagerDisableCRL(ssl->ctx->cm);
    6944     else
    6945         return BAD_FUNC_ARG;
    6946 }
    6947 
    6948 int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor)
    6949 {
    6950     WOLFSSL_ENTER("wolfSSL_LoadCRL");
    6951     if (ssl)
    6952         return wolfSSL_CertManagerLoadCRL(ssl->ctx->cm, path, type, monitor);
    6953     else
    6954         return BAD_FUNC_ARG;
    6955 }
    6956 
    6957 
    6958 int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
    6959 {
    6960     WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
    6961     if (ssl)
    6962         return wolfSSL_CertManagerSetCRL_Cb(ssl->ctx->cm, cb);
    6963     else
    6964         return BAD_FUNC_ARG;
    6965 }
    6966 
    6967 #ifdef HAVE_CRL_IO
    6968 int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
    6969 {
    6970     WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
    6971     if (ssl)
    6972         return wolfSSL_CertManagerSetCRL_IOCb(ssl->ctx->cm, cb);
    6973     else
    6974         return BAD_FUNC_ARG;
    6975 }
    6976 #endif
    6977 
    6978 int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options)
    6979 {
    6980     WOLFSSL_ENTER("wolfSSL_CTX_EnableCRL");
    6981     if (ctx)
    6982         return wolfSSL_CertManagerEnableCRL(ctx->cm, options);
    6983     else
    6984         return BAD_FUNC_ARG;
    6985 }
    6986 
    6987 
    6988 int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx)
    6989 {
    6990     WOLFSSL_ENTER("wolfSSL_CTX_DisableCRL");
    6991     if (ctx)
    6992         return wolfSSL_CertManagerDisableCRL(ctx->cm);
    6993     else
    6994         return BAD_FUNC_ARG;
    6995 }
    6996 
    6997 
    6998 int wolfSSL_CTX_LoadCRL(WOLFSSL_CTX* ctx, const char* path,
    6999                         int type, int monitor)
    7000 {
    7001     WOLFSSL_ENTER("wolfSSL_CTX_LoadCRL");
    7002     if (ctx)
    7003         return wolfSSL_CertManagerLoadCRL(ctx->cm, path, type, monitor);
    7004     else
    7005         return BAD_FUNC_ARG;
    7006 }
    7007 
    7008 
    7009 int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
    7010 {
    7011     WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_Cb");
    7012     if (ctx)
    7013         return wolfSSL_CertManagerSetCRL_Cb(ctx->cm, cb);
    7014     else
    7015         return BAD_FUNC_ARG;
    7016 }
    7017 
    7018 #ifdef HAVE_CRL_IO
    7019 int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
    7020 {
    7021     WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_IOCb");
    7022     if (ctx)
    7023         return wolfSSL_CertManagerSetCRL_IOCb(ctx->cm, cb);
    7024     else
    7025         return BAD_FUNC_ARG;
    7026 }
    7027 #endif
    7028 
    7029 
    7030 #endif /* HAVE_CRL */
    7031 
    7032 
    7033 #ifdef WOLFSSL_DER_LOAD
    7034 
    7035 /* Add format parameter to allow DER load of CA files */
    7036 int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file,
    7037                                           int format)
    7038 {
    7039     WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations");
    7040     if (ctx == NULL || file == NULL)
    7041         return WOLFSSL_FAILURE;
    7042 
    7043     if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL,
    7044                     GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
    7045         return WOLFSSL_SUCCESS;
    7046     }
    7047 
    7048     return WOLFSSL_FAILURE;
    7049 }
    7050 
    7051 #endif /* WOLFSSL_DER_LOAD */
    7052 
    7053 
    7054 
    7055 WOLFSSL_ABI
    7056 int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file,
    7057                                      int format)
    7058 {
    7059     WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file");
    7060 
    7061     if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL,
    7062                     GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
    7063         return WOLFSSL_SUCCESS;
    7064     }
    7065 
    7066     return WOLFSSL_FAILURE;
    7067 }
    7068 
    7069 
    7070 WOLFSSL_ABI
    7071 int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file,
    7072                                     int format)
    7073 {
    7074     WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file");
    7075 
    7076     if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL,
    7077                     GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
    7078         return WOLFSSL_SUCCESS;
    7079     }
    7080 
    7081     return WOLFSSL_FAILURE;
    7082 }
    7083 
    7084 
    7085 /* Sets the max chain depth when verifying a certificate chain. Default depth
    7086  * is set to MAX_CHAIN_DEPTH.
    7087  *
    7088  * ctx   WOLFSSL_CTX structure to set depth in
    7089  * depth max depth
    7090  */
    7091 void wolfSSL_CTX_set_verify_depth(WOLFSSL_CTX *ctx, int depth) {
    7092     WOLFSSL_ENTER("wolfSSL_CTX_set_verify_depth");
    7093 
    7094     if (ctx == NULL || depth < 0 || depth > MAX_CHAIN_DEPTH) {
    7095         WOLFSSL_MSG("Bad depth argument, too large or less than 0");
    7096         return;
    7097     }
    7098 
    7099     ctx->verifyDepth = (byte)depth;
    7100 }
    7101 
    7102 
    7103 /* get cert chaining depth using ssl struct */
    7104 long wolfSSL_get_verify_depth(WOLFSSL* ssl)
    7105 {
    7106     if(ssl == NULL) {
    7107         return BAD_FUNC_ARG;
    7108     }
    7109 #ifndef OPENSSL_EXTRA
    7110     return MAX_CHAIN_DEPTH;
    7111 #else
    7112     return ssl->options.verifyDepth;
    7113 #endif
    7114 }
    7115 
    7116 
    7117 /* get cert chaining depth using ctx struct */
    7118 long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx)
    7119 {
    7120     if (ctx == NULL) {
    7121         return BAD_FUNC_ARG;
    7122     }
    7123 #ifndef OPENSSL_EXTRA
    7124     return MAX_CHAIN_DEPTH;
    7125 #else
    7126     return ctx->verifyDepth;
    7127 #endif
    7128 }
    7129 
    7130 
    7131 WOLFSSL_ABI
    7132 int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file)
    7133 {
    7134     /* process up to MAX_CHAIN_DEPTH plus subject cert */
    7135     WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file");
    7136 
    7137     if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL,
    7138                     GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
    7139         return WOLFSSL_SUCCESS;
    7140     }
    7141 
    7142    return WOLFSSL_FAILURE;
    7143 }
    7144 
    7145 
    7146 int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx,
    7147                                                   const char* file, int format)
    7148 {
    7149     /* process up to MAX_CHAIN_DEPTH plus subject cert */
    7150     WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format");
    7151 
    7152     if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL,
    7153                     GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) {
    7154         return WOLFSSL_SUCCESS;
    7155     }
    7156 
    7157    return WOLFSSL_FAILURE;
    7158 }
    7159 
    7160 
    7161 #ifndef NO_DH
    7162 
    7163 /* server Diffie-Hellman parameters */
    7164 static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
    7165                                         const char* fname, int format)
    7166 {
    7167 #ifdef WOLFSSL_SMALL_STACK
    7168     byte   staticBuffer[1]; /* force heap usage */
    7169 #else
    7170     byte   staticBuffer[FILE_BUFFER_SIZE];
    7171 #endif
    7172     byte*  myBuffer = staticBuffer;
    7173     int    dynamic = 0;
    7174     int    ret;
    7175     long   sz = 0;
    7176     XFILE  file;
    7177 
    7178     if (ctx == NULL || fname == NULL)
    7179         return BAD_FUNC_ARG;
    7180 
    7181     file = XFOPEN(fname, "rb");
    7182     if (file == XBADFILE) return WOLFSSL_BAD_FILE;
    7183     if(XFSEEK(file, 0, XSEEK_END) != 0) {
    7184         XFCLOSE(file);
    7185         return WOLFSSL_BAD_FILE;
    7186     }
    7187     sz = XFTELL(file);
    7188     XREWIND(file);
    7189 
    7190     if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) {
    7191         WOLFSSL_MSG("SetTmpDH file size error");
    7192         XFCLOSE(file);
    7193         return WOLFSSL_BAD_FILE;
    7194     }
    7195 
    7196     if (sz > (long)sizeof(staticBuffer)) {
    7197         WOLFSSL_MSG("Getting dynamic buffer");
    7198         myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE);
    7199         if (myBuffer == NULL) {
    7200             XFCLOSE(file);
    7201             return WOLFSSL_BAD_FILE;
    7202         }
    7203         dynamic = 1;
    7204     }
    7205 
    7206     if ( (ret = (int)XFREAD(myBuffer, 1, sz, file)) != sz)
    7207         ret = WOLFSSL_BAD_FILE;
    7208     else {
    7209         if (ssl)
    7210             ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format);
    7211         else
    7212             ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format);
    7213     }
    7214 
    7215     XFCLOSE(file);
    7216     if (dynamic)
    7217         XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE);
    7218 
    7219     return ret;
    7220 }
    7221 
    7222 /* server Diffie-Hellman parameters */
    7223 int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format)
    7224 {
    7225     if (ssl == NULL)
    7226         return BAD_FUNC_ARG;
    7227 
    7228     return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format);
    7229 }
    7230 
    7231 
    7232 /* server Diffie-Hellman parameters */
    7233 int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format)
    7234 {
    7235     return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format);
    7236 }
    7237 
    7238 #endif /* NO_DH */
    7239 
    7240 #endif /* NO_FILESYSTEM */
    7241 
    72427537#ifdef OPENSSL_EXTRA
     7538
     7539#ifndef NO_BIO
    72437540/* put SSL type in extra for now, not very common */
    72447541
     
    73277624    (void)out;
    73287625
    7329     memSz = wolfSSL_BIO_pending(bio);
     7626    memSz = wolfSSL_BIO_get_len(bio);
    73307627    if (memSz <= 0) {
    73317628        return NULL;
     
    73477644    return pkey;
    73487645}
     7646
     7647#endif /* !NO_BIO */
    73497648
    73507649
     
    74147713                return pkey;
    74157714            }
     7715            else {
     7716                WOLFSSL_MSG("RSA wolfSSL_EVP_PKEY_new error");
     7717            }
    74167718        }
    74177719        wc_FreeRsaKey(&rsa);
     
    74587760                return pkey;
    74597761            }
     7762            else {
     7763                WOLFSSL_MSG("ECC wolfSSL_EVP_PKEY_new error");
     7764            }
    74607765        }
    74617766        wc_ecc_free(&ecc);
     
    75057810                return pkey;
    75067811            }
     7812            else {
     7813                WOLFSSL_MSG("DSA wolfSSL_EVP_PKEY_new error");
     7814            }
    75077815        }
    75087816        wc_FreeDsaKey(&dsa);
     
    75117819
    75127820    #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL))
     7821    #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \
     7822        (HAVE_FIPS_VERSION > 2))
    75137823    {
    75147824        DhKey dh;
     
    75517861                return pkey;
    75527862            }
     7863            else {
     7864                WOLFSSL_MSG("DH wolfSSL_EVP_PKEY_new error");
     7865            }
    75537866        }
    75547867        wc_FreeDhKey(&dh);
    75557868    }
     7869    #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
    75567870    #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */
    75577871
     7872    if (pkey == NULL) {
     7873        WOLFSSL_MSG("wolfSSL_d2i_PUBKEY couldn't determine key type");
     7874    }
     7875
    75587876    return pkey;
     7877}
     7878
     7879/* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
     7880static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
     7881{
     7882    unsigned char* pt;
     7883    int sz;
     7884
     7885    if (!key || !key->pkey_sz)
     7886        return WOLFSSL_FATAL_ERROR;
     7887
     7888    sz = key->pkey_sz;
     7889    if (der) {
     7890        pt = (unsigned char*)key->pkey.ptr;
     7891        if (*der) {
     7892            /* since this function signature has no size value passed in it is
     7893             * assumed that the user has allocated a large enough buffer */
     7894            XMEMCPY(*der, pt, sz);
     7895            *der += sz;
     7896        }
     7897        else {
     7898            *der = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
     7899            if (*der == NULL) {
     7900                return WOLFSSL_FATAL_ERROR;
     7901            }
     7902            XMEMCPY(*der, pt, sz);
     7903        }
     7904    }
     7905    return sz;
     7906}
     7907
     7908int wolfSSL_i2d_PUBKEY(const WOLFSSL_EVP_PKEY *key, unsigned char **der)
     7909{
     7910    return wolfSSL_EVP_PKEY_get_der(key, der);
    75597911}
    75607912
     
    76387990            if (wolfSSL_RSA_LoadDer_ex(local->rsa,
    76397991                      (const unsigned char*)local->pkey.ptr, local->pkey_sz,
    7640                       WOLFSSL_RSA_LOAD_PRIVATE) != SSL_SUCCESS) {
     7992                      WOLFSSL_RSA_LOAD_PRIVATE) != WOLFSSL_SUCCESS) {
    76417993                wolfSSL_EVP_PKEY_free(local);
    76427994                return NULL;
     
    76548006            if (wolfSSL_EC_KEY_LoadDer(local->ecc,
    76558007                      (const unsigned char*)local->pkey.ptr, local->pkey_sz)
    7656                       != SSL_SUCCESS) {
     8008                      != WOLFSSL_SUCCESS) {
    76578009                wolfSSL_EVP_PKEY_free(local);
    76588010                return NULL;
     
    76608012            break;
    76618013#endif /* HAVE_ECC */
    7662 #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
     8014#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)
    76638015#ifndef NO_DSA
    76648016        case EVP_PKEY_DSA:
     
    76718023            if (wolfSSL_DSA_LoadDer(local->dsa,
    76728024                    (const unsigned char*)local->pkey.ptr, local->pkey_sz)
    7673                     != SSL_SUCCESS) {
     8025                    != WOLFSSL_SUCCESS) {
    76748026                wolfSSL_EVP_PKEY_free(local);
    76758027                return NULL;
     
    76788030#endif /* NO_DSA */
    76798031#ifndef NO_DH
     8032#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
    76808033        case EVP_PKEY_DH:
    76818034            local->ownDh = 1;
     
    76878040            if (wolfSSL_DH_LoadDer(local->dh,
    76888041                      (const unsigned char*)local->pkey.ptr, local->pkey_sz)
    7689                       != SSL_SUCCESS) {
     8042                      != WOLFSSL_SUCCESS) {
    76908043                wolfSSL_EVP_PKEY_free(local);
    76918044                return NULL;
    76928045            }
    76938046            break;
     8047#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
    76948048#endif /* HAVE_DH */
    7695 #endif /* WOLFSSL_QT || OPENSSL_ALL */
     8049#endif /* WOLFSSL_QT || OPENSSL_ALL || WOLFSSL_OPENSSH */
    76968050        default:
    76978051            WOLFSSL_MSG("Unsupported key type");
     
    77458099    size = ssl->buffers.key->length;
    77468100    buff = ssl->buffers.key->buffer;
    7747     ret  = wc_CheckPrivateKey(buff, size, &der);
     8101#ifdef WOLF_CRYPTO_CB
     8102    if (ssl->buffers.keyDevId != INVALID_DEVID) {
     8103        int type = 0;
     8104        void *pkey = NULL;
     8105
     8106        if (der.keyOID == RSAk) {
     8107            type = DYNAMIC_TYPE_RSA;
     8108        }
     8109        else if (der.keyOID == ECDSAk) {
     8110            type = DYNAMIC_TYPE_ECC;
     8111        }
     8112        ret = CreateDevPrivateKey(&pkey, buff, size, type,
     8113                                  ssl->buffers.keyLabel,
     8114                                  ssl->buffers.keyId, ssl->heap,
     8115                                  ssl->buffers.keyDevId);
     8116        if (ret == 0 && der.keyOID == RSAk) {
     8117            ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey, der.publicKey,
     8118                                              der.pubKeySize);
     8119            if (ret == 0)
     8120                ret = 1;
     8121            wc_FreeRsaKey((RsaKey*)pkey);
     8122        }
     8123        else if (ret == 0 && der.keyOID == ECDSAk) {
     8124            ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey, der.publicKey,
     8125                                              der.pubKeySize);
     8126            if (ret == 0)
     8127                ret = 1;
     8128            wc_ecc_free((ecc_key*)pkey);
     8129        }
     8130        if (pkey != NULL) {
     8131            XFREE(pkey, ssl->heap, type);
     8132        }
     8133    }
     8134    else
     8135#endif
     8136        ret  = wc_CheckPrivateKeyCert(buff, size, &der);
    77488137    FreeDecodedCert(&der);
    77498138    return ret;
     
    77768165    InitDecodedCert(&cert, rawCert, (word32)outSz, 0);
    77778166
    7778     if (ParseCert(&cert, CA_TYPE, NO_VERIFY, NULL) < 0) {
     8167    if (ParseCert(&cert,
     8168#ifdef WOLFSSL_CERT_REQ
     8169            passedCert->isCSR ? CERTREQ_TYPE :
     8170#endif
     8171                    CA_TYPE,
     8172            NO_VERIFY, NULL) < 0) {
    77798173        WOLFSSL_MSG("\tCertificate parsing failed");
    77808174        return WOLFSSL_FAILURE;
     
    77908184    }
    77918185
    7792     if (input[idx++] != ASN_EXTENSIONS) {
    7793         WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
    7794         FreeDecodedCert(&cert);
    7795         return WOLFSSL_FAILURE;
    7796     }
    7797 
    7798     if (GetLength(input, &idx, &length, sz) < 0) {
    7799         WOLFSSL_MSG("\tfail: invalid length");
    7800         FreeDecodedCert(&cert);
    7801         return WOLFSSL_FAILURE;
     8186#ifdef WOLFSSL_CERT_REQ
     8187    if (!passedCert->isCSR)
     8188#endif
     8189    {
     8190        if (input[idx++] != ASN_EXTENSIONS) {
     8191            WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
     8192            FreeDecodedCert(&cert);
     8193            return WOLFSSL_FAILURE;
     8194        }
     8195
     8196        if (GetLength(input, &idx, &length, sz) < 0) {
     8197            WOLFSSL_MSG("\tfail: invalid length");
     8198            FreeDecodedCert(&cert);
     8199            return WOLFSSL_FAILURE;
     8200        }
    78028201    }
    78038202
     
    78248223WOLFSSL_X509_EXTENSION* wolfSSL_X509_EXTENSION_new(void)
    78258224{
     8225    WOLFSSL_X509_EXTENSION* newExt;
     8226
    78268227    WOLFSSL_ENTER("wolfSSL_X509_EXTENSION_new");
    78278228
    7828     WOLFSSL_X509_EXTENSION* newExt;
    78298229    newExt = (WOLFSSL_X509_EXTENSION*)XMALLOC(sizeof(WOLFSSL_X509_EXTENSION),
    78308230              NULL, DYNAMIC_TYPE_X509_EXT);
     
    79658365
    79668366    return WOLFSSL_SUCCESS;
     8367}
     8368
     8369static WOLFSSL_STACK* generateExtStack(const WOLFSSL_X509 *x)
     8370{
     8371    int numOfExt, i;
     8372    WOLFSSL_X509 *x509 = (WOLFSSL_X509*)x;
     8373    WOLFSSL_STACK* ret;
     8374    WOLFSSL_STACK* tmp;
     8375
     8376    if (!x509) {
     8377        WOLFSSL_MSG("Bad parameter");
     8378        return NULL;
     8379    }
     8380
     8381    /* Save x509->ext_sk */
     8382    tmp = x509->ext_sk;
     8383    x509->ext_sk = NULL;
     8384    numOfExt = wolfSSL_X509_get_ext_count(x509);
     8385
     8386    for (i = 0; i < numOfExt; i++) {
     8387        /* Build the extension stack */
     8388        (void)wolfSSL_X509_set_ext(x509, i);
     8389    }
     8390
     8391    /* Restore */
     8392    ret = x509->ext_sk;
     8393    x509->ext_sk = tmp;
     8394    return ret;
     8395}
     8396
     8397/**
     8398 * @param x Certificate to extract extensions from
     8399 * @return STACK_OF(X509_EXTENSION)*
     8400 */
     8401const WOLFSSL_STACK *wolfSSL_X509_get0_extensions(const WOLFSSL_X509 *x)
     8402{
     8403    int numOfExt;
     8404    WOLFSSL_X509 *x509 = (WOLFSSL_X509*)x;
     8405    WOLFSSL_ENTER("wolfSSL_X509_get0_extensions");
     8406
     8407    if (!x509) {
     8408        WOLFSSL_MSG("Bad parameter");
     8409        return NULL;
     8410    }
     8411
     8412    numOfExt = wolfSSL_X509_get_ext_count(x509);
     8413
     8414    if (numOfExt != wolfSSL_sk_num(x509->ext_sk_full)) {
     8415        wolfSSL_sk_free(x509->ext_sk_full);
     8416        x509->ext_sk_full = generateExtStack(x);
     8417    }
     8418
     8419    return x509->ext_sk_full;
     8420}
     8421
     8422/**
     8423 * Caller is responsible for freeing the returned stack.
     8424 */
     8425const WOLFSSL_STACK *wolfSSL_X509_REQ_get_extensions(const WOLFSSL_X509 *x)
     8426{
     8427    return generateExtStack(x);
    79678428}
    79688429
     
    79918452   ext = wolfSSL_X509_set_ext((WOLFSSL_X509*) x509, loc);
    79928453   return ext;
     8454}
     8455
     8456int wolfSSL_X509_get_ext_by_OBJ(const WOLFSSL_X509 *x,
     8457        const WOLFSSL_ASN1_OBJECT *obj, int lastpos)
     8458{
     8459    const WOLF_STACK_OF(WOLFSSL_X509_EXTENSION) *sk;
     8460
     8461    if (!x || !obj) {
     8462        WOLFSSL_MSG("Bad parameter");
     8463        return -1;
     8464    }
     8465
     8466    sk = wolfSSL_X509_get0_extensions(x);
     8467    if (!sk) {
     8468        WOLFSSL_MSG("No extensions");
     8469        return -1;
     8470    }
     8471    lastpos++;
     8472    if (lastpos < 0)
     8473        lastpos = 0;
     8474    for (; lastpos < wolfSSL_sk_num(sk); lastpos++)
     8475        if (wolfSSL_OBJ_cmp((WOLFSSL_ASN1_OBJECT*)wolfSSL_sk_value(sk,
     8476                        lastpos), obj) == 0)
     8477            return lastpos;
     8478    return -1;
    79938479}
    79948480
     
    80378523    InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
    80388524
    8039     if (ParseCert(&cert, CA_TYPE, NO_VERIFY, NULL) < 0) {
     8525    if (ParseCert(&cert,
     8526#ifdef WOLFSSL_CERT_REQ
     8527            x509->isCSR ? CERTREQ_TYPE :
     8528#endif
     8529                    CA_TYPE,
     8530            NO_VERIFY, NULL) < 0) {
    80408531        WOLFSSL_MSG("\tCertificate parsing failed");
    80418532        wolfSSL_X509_EXTENSION_free(ext);
     
    80538544    }
    80548545
    8055     if (input[idx++] != ASN_EXTENSIONS) {
    8056         WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
    8057         wolfSSL_X509_EXTENSION_free(ext);
    8058         FreeDecodedCert(&cert);
    8059         return NULL;
    8060     }
    8061 
    8062     if (GetLength(input, &idx, &length, sz) < 0) {
    8063         WOLFSSL_MSG("\tfail: invalid length");
    8064         wolfSSL_X509_EXTENSION_free(ext);
    8065         FreeDecodedCert(&cert);
    8066         return NULL;
     8546#ifdef WOLFSSL_CERT_REQ
     8547    if (!x509->isCSR)
     8548#endif
     8549    {
     8550        if (input[idx++] != ASN_EXTENSIONS) {
     8551            WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
     8552            wolfSSL_X509_EXTENSION_free(ext);
     8553            FreeDecodedCert(&cert);
     8554            return NULL;
     8555        }
     8556
     8557        if (GetLength(input, &idx, &length, sz) < 0) {
     8558            WOLFSSL_MSG("\tfail: invalid length");
     8559            wolfSSL_X509_EXTENSION_free(ext);
     8560            FreeDecodedCert(&cert);
     8561            return NULL;
     8562        }
    80678563    }
    80688564
     
    82818777                    break;
    82828778
    8283                 sk = (WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)*)XMALLOC(
    8284                           sizeof(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)), NULL,
    8285                                                          DYNAMIC_TYPE_ASN1);
     8779                sk = (WOLFSSL_GENERAL_NAMES*)XMALLOC(
     8780                          sizeof(WOLFSSL_GENERAL_NAMES), NULL,
     8781                          DYNAMIC_TYPE_ASN1);
    82868782                if (sk == NULL) {
    82878783                    return NULL;
    82888784                }
    8289                 XMEMSET(sk, 0, sizeof(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)));
     8785                XMEMSET(sk, 0, sizeof(WOLFSSL_GENERAL_NAMES));
    82908786                sk->type = STACK_TYPE_GEN_NAME;
    82918787
     
    83748870                        wolfSSL_X509_EXTENSION_free(ext);
    83758871                        FreeDecodedCert(&cert);
     8872                        XFREE(oidBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    83768873                        return NULL;
    83778874                    }
     
    84338930}
    84348931
     8932/**
     8933 * @param str String to copy
     8934 * @param buf Output buffer. If this contains a pointer then it is free'd
     8935 *            with the DYNAMIC_TYPE_X509_EXT hint.
     8936 * @param len Output length
     8937 * @return WOLFSSL_SUCCESS on sucess and WOLFSSL_FAILURE on error
     8938 */
     8939static int asn1_string_copy_to_buffer(WOLFSSL_ASN1_STRING* str, byte** buf,
     8940        word32* len, void* heap) {
     8941    if (!str || !buf || !len) {
     8942        return WOLFSSL_FAILURE;
     8943    }
     8944    if (str->data && str->length > 0) {
     8945        if (*buf)
     8946            XFREE(*buf, heap, DYNAMIC_TYPE_X509_EXT);
     8947        *len = 0;
     8948        *buf = (byte*)XMALLOC(str->length, heap,
     8949                DYNAMIC_TYPE_X509_EXT);
     8950        if (!*buf) {
     8951            WOLFSSL_MSG("malloc error");
     8952            return WOLFSSL_FAILURE;
     8953        }
     8954        *len = str->length;
     8955        XMEMCPY(*buf, str->data, str->length);
     8956    }
     8957
     8958    (void)heap;
     8959    return WOLFSSL_SUCCESS;
     8960}
     8961
     8962int wolfSSL_X509_add_ext(WOLFSSL_X509 *x509, WOLFSSL_X509_EXTENSION *ext, int loc)
     8963{
     8964    WOLFSSL_ENTER("wolfSSL_X509_add_ext");
     8965
     8966    if (!x509 || !ext || !ext->obj || loc >= 0) {
     8967        WOLFSSL_MSG("Bad parameter");
     8968        return WOLFSSL_FAILURE;
     8969    }
     8970
     8971    switch (ext->obj->type) {
     8972    case NID_authority_key_identifier:
     8973        if (asn1_string_copy_to_buffer(&ext->value, &x509->authKeyId,
     8974                &x509->authKeyIdSz, x509->heap) != WOLFSSL_SUCCESS) {
     8975            WOLFSSL_MSG("asn1_string_copy_to_buffer error");
     8976            return WOLFSSL_FAILURE;
     8977        }
     8978        x509->authKeyIdCrit = ext->crit;
     8979        break;
     8980    case NID_subject_key_identifier:
     8981        if (asn1_string_copy_to_buffer(&ext->value, &x509->subjKeyId,
     8982                &x509->subjKeyIdSz, x509->heap) != WOLFSSL_SUCCESS) {
     8983            WOLFSSL_MSG("asn1_string_copy_to_buffer error");
     8984            return WOLFSSL_FAILURE;
     8985        }
     8986        x509->subjKeyIdCrit = ext->crit;
     8987        break;
     8988    case NID_subject_alt_name:
     8989    {
     8990        WOLFSSL_GENERAL_NAMES* gns = ext->ext_sk;
     8991        while (gns) {
     8992            WOLFSSL_GENERAL_NAME* gn = gns->data.gn;
     8993            if (!gn || !gn->d.ia5 ||
     8994                wolfSSL_X509_add_altname_ex(x509, gn->d.ia5->data,
     8995                    gn->d.ia5->length, gn->type) != WOLFSSL_SUCCESS) {
     8996                WOLFSSL_MSG("Subject alternative name missing extension");
     8997                return WOLFSSL_FAILURE;
     8998            }
     8999            gns = gns->next;
     9000        }
     9001        x509->subjAltNameSet = 1;
     9002        x509->subjAltNameCrit = ext->crit;
     9003        break;
     9004    }
     9005    case NID_key_usage:
     9006        if (ext && ext->value.data &&
     9007                ext->value.length == sizeof(word16)) {
     9008            x509->keyUsage = *(word16*)ext->value.data;
     9009            x509->keyUsageCrit = ext->crit;
     9010            x509->keyUsageSet = 1;
     9011        }
     9012        break;
     9013    case NID_basic_constraints:
     9014        if (ext->obj) {
     9015            x509->isCa = ext->obj->ca;
     9016            x509->basicConstCrit = ext->crit;
     9017            if (ext->obj->pathlen)
     9018                x509->pathLength = ext->obj->pathlen->length;
     9019            x509->basicConstSet = 1;
     9020        }
     9021        break;
     9022    default:
     9023        WOLFSSL_MSG("Unsupported extension to add");
     9024        return WOLFSSL_FAILURE;
     9025    }
     9026
     9027    return WOLFSSL_SUCCESS;
     9028}
     9029
     9030#ifndef NO_BIO
    84359031/* Return 0 on success and 1 on failure. Copies ext data to bio, using indent
    84369032 *  to pad the output. flag is ignored. */
     
    84439039    const int sz = CTC_NAME_SIZE*2;
    84449040    int rc = WOLFSSL_FAILURE;
    8445     char tmp[CTC_NAME_SIZE*2];
     9041    char tmp[CTC_NAME_SIZE*2] = {0};
    84469042    WOLFSSL_ENTER("wolfSSL_X509V3_EXT_print");
    84479043
     
    84589054
    84599055    str = wolfSSL_X509_EXTENSION_get_data(ext);
    8460     if (obj == NULL) {
     9056    if (str == NULL) {
    84619057        WOLFSSL_MSG("Error getting ASN1_STRING from X509_EXTENSION");
    84629058        return rc;
     
    85379133    return rc;
    85389134}
     9135#endif /* !NO_BIO */
     9136
     9137#ifndef NO_WOLFSSL_STUB
     9138int wolfSSL_X509V3_EXT_add_nconf(WOLFSSL_CONF *conf, WOLFSSL_X509V3_CTX *ctx,
     9139        const char *section, WOLFSSL_X509 *cert)
     9140{
     9141    WOLFSSL_ENTER("wolfSSL_X509V3_EXT_add_nconf");
     9142    WOLFSSL_STUB("wolfSSL_X509V3_EXT_add_nconf");
     9143    (void)conf;
     9144    (void)ctx;
     9145    (void)section;
     9146    (void)cert;
     9147    return WOLFSSL_SUCCESS;
     9148}
     9149#endif
    85399150
    85409151/* Returns crit flag in X509_EXTENSION object */
     
    85719182        return NULL;
    85729183    }
    8573     /* Initialize all methods to NULL */
    8574     method.d2i = NULL;
    8575     method.i2v = NULL;
    8576     method.i2s = NULL;
    8577     method.i2r = NULL;
     9184    /* Initialize method to 0 */
     9185    XMEMSET(&method, 0, sizeof(struct WOLFSSL_v3_ext_method));
    85789186
    85799187    nid = ex->obj->nid;
     
    85829190        return NULL;
    85839191    }
    8584 
     9192    XMEMSET(&method, 0, sizeof(WOLFSSL_v3_ext_method));
    85859193    switch (nid) {
    85869194        case NID_basic_constraints:
     
    85889196        case NID_subject_key_identifier:
    85899197            method.i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
     9198            break;
     9199        case NID_subject_alt_name:
     9200            WOLFSSL_MSG("i2v function not yet implemented for Subject Alternative Name");
    85909201            break;
    85919202        case NID_key_usage:
     
    86669277            WOLFSSL_MSG("basicConstraints");
    86679278            /* Allocate new BASIC_CONSTRAINTS structure */
    8668             bc = (WOLFSSL_BASIC_CONSTRAINTS*)
    8669                   XMALLOC(sizeof(WOLFSSL_BASIC_CONSTRAINTS), NULL,
    8670                   DYNAMIC_TYPE_X509_EXT);
     9279            bc = wolfSSL_BASIC_CONSTRAINTS_new();
    86719280            if (bc == NULL) {
    86729281                WOLFSSL_MSG("Failed to malloc basic constraints");
     
    86799288                if (bc->pathlen == NULL) {
    86809289                    WOLFSSL_MSG("Failed to duplicate ASN1_INTEGER");
    8681                     XFREE(bc, NULL, DYNAMIC_TYPE_X509_EXT);
     9290                    wolfSSL_BASIC_CONSTRAINTS_free(bc);
    86829291                    return NULL;
    86839292                }
     
    89329541    InitDecodedCert( &cert, rawCert, (word32)outSz, 0);
    89339542
    8934     if (ParseCert(&cert, CA_TYPE, NO_VERIFY, NULL) < 0) {
     9543    if (ParseCert(&cert,
     9544#ifdef WOLFSSL_CERT_REQ
     9545            x509->isCSR ? CERTREQ_TYPE :
     9546#endif
     9547            CA_TYPE,
     9548            NO_VERIFY, NULL) < 0) {
    89359549        WOLFSSL_MSG("\tCertificate parsing failed");
    89369550        return WOLFSSL_FATAL_ERROR;
     
    89469560    }
    89479561
    8948     if (input[idx++] != ASN_EXTENSIONS) {
    8949         WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
    8950         FreeDecodedCert(&cert);
    8951         return WOLFSSL_FATAL_ERROR;
    8952     }
    8953 
    8954     if (GetLength(input, &idx, &length, sz) < 0) {
    8955         WOLFSSL_MSG("\tfail: invalid length");
    8956         FreeDecodedCert(&cert);
    8957         return WOLFSSL_FATAL_ERROR;
     9562#ifdef WOLFSSL_CERT_REQ
     9563    if (!x509->isCSR)
     9564#endif
     9565    {
     9566        if (input[idx++] != ASN_EXTENSIONS) {
     9567            WOLFSSL_MSG("\tfail: should be an EXTENSIONS");
     9568            FreeDecodedCert(&cert);
     9569            return WOLFSSL_FATAL_ERROR;
     9570        }
     9571
     9572        if (GetLength(input, &idx, &length, sz) < 0) {
     9573            WOLFSSL_MSG("\tfail: invalid length");
     9574            FreeDecodedCert(&cert);
     9575            return WOLFSSL_FATAL_ERROR;
     9576        }
    89589577    }
    89599578
     
    90039622
    90049623#endif /* OPENSSL_ALL */
     9624
     9625#endif /* !NO_CERTS */
     9626#endif /* OPENSSL_EXTRA */
     9627
     9628#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    90059629
    90069630WOLFSSL_ASN1_BIT_STRING* wolfSSL_ASN1_BIT_STRING_new(void)
     
    90599683    WOLFSSL_ASN1_OBJECT* obj = NULL;
    90609684    WOLFSSL_GENERAL_NAME* gn = NULL;
     9685    WOLFSSL_BASIC_CONSTRAINTS* bc = NULL;
    90619686
    90629687    WOLFSSL_ENTER("wolfSSL_X509_get_ext_d2i");
     
    90739698        case BASIC_CA_OID:
    90749699            if (x509->basicConstSet) {
    9075                 obj = wolfSSL_ASN1_OBJECT_new();
    9076                 if (obj == NULL) {
    9077                     WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
     9700                WOLFSSL_ASN1_INTEGER* a;
     9701
     9702                bc = wolfSSL_BASIC_CONSTRAINTS_new();
     9703                if (!bc) {
     9704                    WOLFSSL_MSG("wolfSSL_BASIC_CONSTRAINTS_new error");
    90789705                    return NULL;
    90799706                }
     9707
     9708                a = wolfSSL_ASN1_INTEGER_new();
     9709                if (!a) {
     9710                    WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
     9711                    wolfSSL_BASIC_CONSTRAINTS_free(bc);
     9712                    return NULL;
     9713                }
     9714                a->length = x509->pathLength;
     9715
     9716#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
     9717        defined(WOLFSSL_APACHE_HTTPD)
     9718                bc->ca = x509->isCa;
     9719#endif
     9720                bc->pathlen = a;
    90809721                if (c != NULL) {
    90819722                    *c = x509->basicConstCrit;
    90829723                }
    9083                 obj->type = BASIC_CA_OID;
    9084                 obj->grp  = oidCertExtType;
    9085                 obj->nid  = nid;
    9086                 obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
    9087             #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \
    9088                     defined(WOLFSSL_APACHE_HTTPD)
    9089                 obj->ca = x509->isCa;
    9090             #endif
    90919724            }
    90929725            else {
    90939726                WOLFSSL_MSG("No Basic Constraint set");
    90949727            }
    9095             return obj;
     9728            return bc;
    90969729
    90979730        case ALT_NAMES_OID:
     
    90999732            DNS_entry* dns = NULL;
    91009733            /* Malloc GENERAL_NAME stack */
    9101             sk = (WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)*)XMALLOC(
    9102                         sizeof(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)), NULL,
     9734            sk = (WOLFSSL_GENERAL_NAMES*)XMALLOC(
     9735                        sizeof(WOLFSSL_GENERAL_NAMES), NULL,
    91039736                                                         DYNAMIC_TYPE_ASN1);
    91049737            if (sk == NULL) {
    91059738                return NULL;
    91069739            }
    9107             XMEMSET(sk, 0, sizeof(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)));
     9740            XMEMSET(sk, 0, sizeof(WOLFSSL_GENERAL_NAMES));
    91089741            sk->type = STACK_TYPE_GEN_NAME;
    91099742
     
    91409773
    91419774                    dns = dns->next;
    9142                     /* last dns in list add at end of function */
    9143                     if (dns != NULL) {
    9144                         if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
    9145                                                           WOLFSSL_SUCCESS) {
    9146                             WOLFSSL_MSG("Error pushing ASN1 object onto stack");
    9147                             wolfSSL_GENERAL_NAME_free(gn);
    9148                             wolfSSL_sk_free(sk);
    9149                             sk = NULL;
    9150                         }
     9775                    if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) !=
     9776                                                      WOLFSSL_SUCCESS) {
     9777                        WOLFSSL_MSG("Error pushing ASN1 object onto stack");
     9778                        wolfSSL_GENERAL_NAME_free(gn);
     9779                        wolfSSL_sk_free(sk);
     9780                        sk = NULL;
    91519781                    }
     9782                    /* null so that it doesn't get pushed again after switch */
     9783                    gn = NULL;
    91529784                }
    91539785            }
     
    91739805                obj->obj   = x509->CRLInfo;
    91749806                obj->objSz = x509->CRLInfoSz;
    9175                 obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
    9176                 obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
    91779807            }
    91789808            else {
     
    91959825                obj->obj   = x509->authInfo;
    91969826                obj->objSz = x509->authInfoSz;
    9197                 obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
    9198                 obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
    91999827            }
    92009828            else {
     
    92059833        case AUTH_KEY_OID:
    92069834            if (x509->authKeyIdSet) {
     9835                WOLFSSL_AUTHORITY_KEYID* akey = wolfSSL_AUTHORITY_KEYID_new();
     9836                if (!akey) {
     9837                    WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
     9838                    return NULL;
     9839                }
     9840
    92079841                if (c != NULL) {
    92089842                    *c = x509->authKeyIdCrit;
     
    92119845                if (obj == NULL) {
    92129846                    WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
     9847                    wolfSSL_AUTHORITY_KEYID_free(akey);
    92139848                    return NULL;
    92149849                }
     
    92179852                obj->obj   = x509->authKeyId;
    92189853                obj->objSz = x509->authKeyIdSz;
    9219                 obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
    9220                 obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
     9854                akey->issuer = obj;
     9855                return akey;
    92219856            }
    92229857            else {
     
    92399874                obj->obj   = x509->subjKeyId;
    92409875                obj->objSz = x509->subjKeyIdSz;
    9241                 obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
    9242                 obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
    92439876            }
    92449877            else {
     
    92789911                    obj->obj   = (byte*)(x509->certPolicies[i]);
    92799912                    obj->objSz = MAX_CERTPOL_SZ;
    9280                     obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
    9281                     obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
    92829913                    if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj)
    92839914                                                           != WOLFSSL_SUCCESS) {
     
    92989929                obj->obj   = (byte*)(x509->certPolicies[i]);
    92999930                obj->objSz = MAX_CERTPOL_SZ;
    9300                 obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
    9301                 obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
    93029931            }
    93039932            else {
     
    93169945                obj->type  = CERT_POLICY_OID;
    93179946                obj->grp   = oidCertExtType;
    9318                 obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
    93199947            }
    93209948            else {
     
    93289956        case KEY_USAGE_OID:
    93299957        {
    9330             WOLFSSL_ASN1_BIT_STRING* bit_str = NULL;
     9958            WOLFSSL_ASN1_STRING* asn1str = NULL;
    93319959            if (x509->keyUsageSet) {
    93329960                if (c != NULL) {
     
    93349962                }
    93359963
    9336                 bit_str = wolfSSL_ASN1_BIT_STRING_new();
    9337                 if (bit_str == NULL) {
    9338                     WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_BIT_STRING struct");
     9964                asn1str = wolfSSL_ASN1_STRING_new();
     9965                if (asn1str == NULL) {
     9966                    WOLFSSL_MSG("Failed to malloc ASN1_STRING");
    93399967                    return NULL;
    93409968                }
    93419969
    9342                 bit_str->type = KEY_USAGE_OID;
    9343                 bit_str->flags = 0;
    9344                 bit_str->length = sizeof(word16);
    9345                 bit_str->data = (byte*)XMALLOC(bit_str->length, NULL, DYNAMIC_TYPE_OPENSSL);
    9346                 if (bit_str->data == NULL) {
    9347                     wolfSSL_ASN1_BIT_STRING_free(bit_str);
     9970                if (wolfSSL_ASN1_STRING_set(asn1str, &x509->keyUsage,
     9971                        sizeof(word16)) != WOLFSSL_SUCCESS) {
     9972                    WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
     9973                    wolfSSL_ASN1_STRING_free(asn1str);
    93489974                    return NULL;
    93499975                }
    9350                 XMEMCPY(bit_str->data, &x509->keyUsage, bit_str->length);
     9976
     9977                asn1str->type = KEY_USAGE_OID;
    93519978            }
    93529979            else {
     
    93549981            }
    93559982            /* don't add stack of and return bit string directly */
    9356             return bit_str;
     9983            return asn1str;
    93579984        }
    93589985        case INHIBIT_ANY_OID:
     
    937910006                obj->obj   = x509->extKeyUsageSrc;
    938010007                obj->objSz = x509->extKeyUsageSz;
    9381                 obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
    9382                 obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA;
    938310008            }
    938410009            else {
     
    942610051        }
    942710052    }
    9428     if (obj && wolfSSL_sk_ASN1_OBJECT_push(sk, obj) == WOLFSSL_SUCCESS) {
    9429         /* obj pushed successfully on stack */
    9430     }
    9431     else if (gn && wolfSSL_sk_GENERAL_NAME_push(sk, gn) == WOLFSSL_SUCCESS) {
    9432         /* gn pushed successfully on stack */
    9433     }
    9434     else {
    9435         /* Nothing to push or push failed */
    9436         WOLFSSL_MSG("Error pushing ASN1_OBJECT or GENERAL_NAME object onto stack "
    9437                     "or nothing to push.");
    9438         goto err;
    9439     }
     10053    if (obj) {
     10054        if (wolfSSL_sk_ASN1_OBJECT_push(sk, obj) != WOLFSSL_SUCCESS) {
     10055            WOLFSSL_MSG("Error pushing ASN1_OBJECT object onto "
     10056                        "stack.");
     10057            goto err;
     10058        }
     10059    }
     10060    else if (gn) {
     10061        if (wolfSSL_sk_GENERAL_NAME_push(sk, gn) != WOLFSSL_SUCCESS) {
     10062            WOLFSSL_MSG("Error pushing GENERAL_NAME object onto "
     10063                        "stack.");
     10064            goto err;
     10065        }
     10066    }
     10067
    944010068    ret = sk;
    944110069
     
    945210080    }
    945310081    if (sk) {
    9454         wolfSSL_sk_ASN1_OBJECT_free(sk);
     10082        wolfSSL_sk_free(sk);
    945510083    }
    945610084    return NULL;
    945710085}
    9458 
    9459 
    9460 int wolfSSL_X509_add_altname(WOLFSSL_X509* x509, const char* name, int type)
     10086#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     10087
     10088#ifdef OPENSSL_EXTRA
     10089#ifndef NO_CERTS
     10090int wolfSSL_X509_add_altname_ex(WOLFSSL_X509* x509, const char* name,
     10091        word32 nameSz, int type)
    946110092{
    946210093    DNS_entry* newAltName = NULL;
    946310094    char* nameCopy = NULL;
    9464     word32 nameSz;
    946510095
    946610096    if (x509 == NULL)
    946710097        return WOLFSSL_FAILURE;
    946810098
    9469     if (name == NULL)
    9470         return WOLFSSL_SUCCESS;
    9471 
    9472     nameSz = (word32)XSTRLEN(name);
    9473     if (nameSz == 0)
     10099    if ((name == NULL) || (nameSz == 0))
    947410100        return WOLFSSL_SUCCESS;
    947510101
     
    948510111    }
    948610112
    9487     XMEMCPY(nameCopy, name, nameSz + 1);
     10113    XMEMCPY(nameCopy, name, nameSz);
     10114
     10115    nameCopy[nameSz] = '\0';
    948810116
    948910117    newAltName->next = x509->altNames;
     
    949610124}
    949710125
     10126int wolfSSL_X509_add_altname(WOLFSSL_X509* x509, const char* name, int type)
     10127{
     10128    word32 nameSz;
     10129
     10130    if (name == NULL)
     10131        return WOLFSSL_SUCCESS;
     10132
     10133    nameSz = (word32)XSTRLEN(name);
     10134    if (nameSz == 0)
     10135        return WOLFSSL_SUCCESS;
     10136
     10137    if (type == ASN_IP_TYPE) {
     10138        WOLFSSL_MSG("Type not supported, use wolfSSL_X509_add_altname_ex");
     10139        return WOLFSSL_FAILURE;
     10140    }
     10141
     10142    return wolfSSL_X509_add_altname_ex(x509, name, nameSz, type);
     10143}
    949810144
    949910145#ifndef NO_WOLFSSL_STUB
    9500 int wolfSSL_X509_add_ext(WOLFSSL_X509 *x509, WOLFSSL_X509_EXTENSION *ext, int loc)
    9501 {
    9502     WOLFSSL_STUB("wolfSSL_X509_add_ext");
     10146WOLFSSL_X509_EXTENSION *wolfSSL_X509_delete_ext(WOLFSSL_X509 *x509, int loc)
     10147{
     10148    WOLFSSL_STUB("wolfSSL_X509_delete_ext");
    950310149    (void)x509;
    9504     (void)ext;
    950510150    (void)loc;
    9506     return WOLFSSL_FAILURE;
     10151    return NULL;
    950710152}
    950810153
     
    953310178#endif /* !NO_WOLFSSL_STUB */
    953410179
     10180#if defined(OPENSSL_ALL)
     10181static void wolfSSL_X509V3_EXT_METHOD_populate(WOLFSSL_v3_ext_method *method,
     10182                                               int nid)
     10183{
     10184    if (!method)
     10185        return;
     10186
     10187    WOLFSSL_ENTER("wolfSSL_X509V3_EXT_METHOD_populate");
     10188    switch (nid) {
     10189    case NID_subject_key_identifier:
     10190        method->i2s = (X509V3_EXT_I2S)wolfSSL_i2s_ASN1_STRING;
     10191        FALL_THROUGH;
     10192    case NID_authority_key_identifier:
     10193    case NID_key_usage:
     10194    case NID_certificate_policies:
     10195    case NID_policy_mappings:
     10196    case NID_subject_alt_name:
     10197    case NID_issuer_alt_name:
     10198    case NID_basic_constraints:
     10199    case NID_name_constraints:
     10200    case NID_policy_constraints:
     10201    case NID_ext_key_usage:
     10202    case NID_crl_distribution_points:
     10203    case NID_inhibit_any_policy:
     10204    case NID_info_access:
     10205        WOLFSSL_MSG("Nothing to populate for current NID");
     10206        break;
     10207    default:
     10208        WOLFSSL_MSG("Unknown or unsupported NID");
     10209        break;
     10210    }
     10211
     10212    return;
     10213}
     10214
     10215/**
     10216 * @param nid One of the NID_* constants defined in asn.h
     10217 * @param crit
     10218 * @param data This data is copied to the returned extension.
     10219 * @return
     10220 */
     10221WOLFSSL_X509_EXTENSION *wolfSSL_X509V3_EXT_i2d(int nid, int crit,
     10222                                               void *data)
     10223{
     10224    WOLFSSL_X509_EXTENSION *ext = NULL;
     10225    WOLFSSL_ASN1_STRING* asn1str = NULL;
     10226
     10227    WOLFSSL_ENTER("wolfSSL_X509V3_EXT_i2d");
     10228
     10229    if (!data) {
     10230        return NULL;
     10231    }
     10232
     10233    if (!(ext = wolfSSL_X509_EXTENSION_new())) {
     10234        return NULL;
     10235    }
     10236
     10237    wolfSSL_X509V3_EXT_METHOD_populate(&ext->ext_method, nid);
     10238
     10239    switch (nid) {
     10240    case NID_subject_key_identifier:
     10241        /* WOLFSSL_ASN1_STRING */
     10242    case NID_key_usage:
     10243        /* WOLFSSL_ASN1_STRING */
     10244    {
     10245        asn1str = (WOLFSSL_ASN1_STRING*)data;
     10246        ext->value = *asn1str;
     10247        if (asn1str->isDynamic) {
     10248            ext->value.data = (char*)XMALLOC(asn1str->length, NULL,
     10249                                             DYNAMIC_TYPE_OPENSSL);
     10250            if (!ext->value.data) {
     10251                WOLFSSL_MSG("malloc failed");
     10252                /* Zero so that no existing memory is freed */
     10253                XMEMSET(&ext->value, 0, sizeof(WOLFSSL_ASN1_STRING));
     10254                goto err_cleanup;
     10255            }
     10256            XMEMCPY(ext->value.data, asn1str->data, asn1str->length);
     10257        }
     10258        else {
     10259            ext->value.data = ext->value.strData;
     10260        }
     10261        break;
     10262    }
     10263    case NID_subject_alt_name:
     10264        /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
     10265    case NID_issuer_alt_name:
     10266        /* typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES */
     10267    case NID_ext_key_usage:
     10268        /* typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE */
     10269    case NID_info_access:
     10270        /* typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS */
     10271    {
     10272        WOLFSSL_STACK* sk = (WOLFSSL_STACK*)data;
     10273
     10274        if (ext->ext_sk) {
     10275            wolfSSL_sk_free(ext->ext_sk);
     10276        }
     10277
     10278        if (!(ext->ext_sk = wolfSSL_sk_dup(sk))) {
     10279            WOLFSSL_MSG("wolfSSL_sk_dup failed");
     10280            goto err_cleanup;
     10281        }
     10282        break;
     10283    }
     10284    case NID_basic_constraints:
     10285    {
     10286        /* WOLFSSL_BASIC_CONSTRAINTS */
     10287        WOLFSSL_BASIC_CONSTRAINTS* bc = (WOLFSSL_BASIC_CONSTRAINTS*)data;
     10288
     10289        if (!(ext->obj = wolfSSL_ASN1_OBJECT_new())) {
     10290            WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new failed");
     10291            goto err_cleanup;
     10292        }
     10293
     10294        ext->obj->ca = bc->ca;
     10295        if (bc->pathlen) {
     10296            ext->obj->pathlen = wolfSSL_ASN1_INTEGER_dup(bc->pathlen);
     10297            if (!ext->obj->pathlen) {
     10298                WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_dup failed");
     10299                goto err_cleanup;
     10300            }
     10301        }
     10302        break;
     10303    }
     10304    case NID_authority_key_identifier:
     10305    {
     10306        /* AUTHORITY_KEYID */
     10307        WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)data;
     10308
     10309        if (akey->keyid) {
     10310            if (wolfSSL_ASN1_STRING_set(&ext->value, akey->keyid->data,
     10311                                    akey->keyid->length) != WOLFSSL_SUCCESS) {
     10312                WOLFSSL_MSG("wolfSSL_ASN1_STRING_set failed");
     10313                goto err_cleanup;
     10314            }
     10315            ext->value.type = akey->keyid->type;
     10316        }
     10317        else if (akey->issuer) {
     10318            ext->obj = wolfSSL_ASN1_OBJECT_dup(akey->issuer);
     10319            if (!ext->obj) {
     10320                WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup failed");
     10321                goto err_cleanup;
     10322            }
     10323        }
     10324        else {
     10325            WOLFSSL_MSG("NID_authority_key_identifier empty data");
     10326            goto err_cleanup;
     10327        }
     10328        break;
     10329    }
     10330    case NID_inhibit_any_policy:
     10331        /* ASN1_INTEGER */
     10332    case NID_certificate_policies:
     10333        /* STACK_OF(POLICYINFO) */
     10334    case NID_policy_mappings:
     10335        /* STACK_OF(POLICY_MAPPING) */
     10336    case NID_name_constraints:
     10337        /* NAME_CONSTRAINTS */
     10338    case NID_policy_constraints:
     10339        /* POLICY_CONSTRAINTS */
     10340    case NID_crl_distribution_points:
     10341        /* typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS */
     10342    default:
     10343        WOLFSSL_MSG("Unknown or unsupported NID");
     10344        break;
     10345    }
     10346
     10347    ext->crit = crit;
     10348
     10349    return ext;
     10350err_cleanup:
     10351    if (ext) {
     10352        wolfSSL_X509_EXTENSION_free(ext);
     10353    }
     10354    if (asn1str) {
     10355        wolfSSL_ASN1_STRING_free(asn1str);
     10356    }
     10357    return NULL;
     10358}
     10359
    953510360/* Returns pointer to ASN1_OBJECT from an X509_EXTENSION object */
    953610361WOLFSSL_ASN1_OBJECT* wolfSSL_X509_EXTENSION_get_object \
     
    954210367    return ext->obj;
    954310368}
     10369#endif /* OPENSSL_ALL */
    954410370
    954510371/* Returns pointer to ASN1_STRING in X509_EXTENSION object */
     
    974910575#ifdef HAVE_ECC
    975010576
    9751 /* Set Temp CTX EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */
     10577/* Set Temp CTX EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
    975210578int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz)
    975310579{
     
    975510581        return BAD_FUNC_ARG;
    975610582
     10583    /* if 0 then get from loaded private key */
    975710584    if (sz == 0) {
    975810585        /* applies only to ECDSA */
     
    977810605
    977910606
    9780 /* Set Temp SSL EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */
     10607/* Set Temp SSL EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */
    978110608int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz)
    978210609{
    9783     if (ssl == NULL || sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
     10610    if (ssl == NULL)
     10611        return BAD_FUNC_ARG;
     10612
     10613    /* check size */
     10614    if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE)
    978410615        return BAD_FUNC_ARG;
    978510616
     
    988610717        return;
    988710718
    9888     if (mode & WOLFSSL_VERIFY_PEER) {
    9889         ctx->verifyPeer = 1;
    9890         ctx->verifyNone = 0;  /* in case previously set */
    9891     }
     10719    ctx->verifyPeer     = 0;
     10720    ctx->verifyNone     = 0;
     10721    ctx->failNoCert     = 0;
     10722    ctx->failNoCertxPSK = 0;
    989210723
    989310724    if (mode == WOLFSSL_VERIFY_NONE) {
    989410725        ctx->verifyNone = 1;
    9895         ctx->verifyPeer = 0;  /* in case previously set */
    9896     }
    9897 
    9898     if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
    9899         ctx->failNoCert = 1;
    9900     }
    9901 
    9902     if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
    9903         ctx->failNoCert    = 0; /* fail on all is set to fail on PSK */
    9904         ctx->failNoCertxPSK = 1;
     10726    }
     10727    else {
     10728        if (mode & WOLFSSL_VERIFY_PEER) {
     10729            ctx->verifyPeer = 1;
     10730        }
     10731        if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
     10732            ctx->failNoCertxPSK = 1;
     10733        }
     10734        if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
     10735            ctx->failNoCert = 1;
     10736        }
    990510737    }
    990610738
     
    992810760        return;
    992910761
    9930     if (mode & WOLFSSL_VERIFY_PEER) {
    9931         ssl->options.verifyPeer = 1;
    9932         ssl->options.verifyNone = 0;  /* in case previously set */
    9933     }
     10762    ssl->options.verifyPeer     = 0;
     10763    ssl->options.verifyNone     = 0;
     10764    ssl->options.failNoCert     = 0;
     10765    ssl->options.failNoCertxPSK = 0;
    993410766
    993510767    if (mode == WOLFSSL_VERIFY_NONE) {
    993610768        ssl->options.verifyNone = 1;
    9937         ssl->options.verifyPeer = 0;  /* in case previously set */
    9938     }
    9939 
    9940     if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT)
    9941         ssl->options.failNoCert = 1;
    9942 
    9943     if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
    9944         ssl->options.failNoCert    = 0; /* fail on all is set to fail on PSK */
    9945         ssl->options.failNoCertxPSK = 1;
     10769    }
     10770    else {
     10771        if (mode & WOLFSSL_VERIFY_PEER) {
     10772            ssl->options.verifyPeer = 1;
     10773        }
     10774        if (mode & WOLFSSL_VERIFY_FAIL_EXCEPT_PSK) {
     10775            ssl->options.failNoCertxPSK = 1;
     10776        }
     10777        if (mode & WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
     10778            ssl->options.failNoCert = 1;
     10779        }
    994610780    }
    994710781
     
    996410798}
    996510799
     10800#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
     10801    defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
     10802/* For TLS v1.3 send handshake messages after handshake completes. */
     10803/* Returns 1=WOLFSSL_SUCCESS or 0=WOLFSSL_FAILURE */
     10804int wolfSSL_verify_client_post_handshake(WOLFSSL* ssl)
     10805{
     10806    int ret = wolfSSL_request_certificate(ssl);
     10807    return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
     10808}
     10809
     10810int wolfSSL_CTX_set_post_handshake_auth(WOLFSSL_CTX* ctx, int val)
     10811{
     10812    int ret = wolfSSL_CTX_allow_post_handshake_auth(ctx);
     10813    if (ret == 0) {
     10814        ctx->postHandshakeAuth = (val != 0);
     10815    }
     10816    return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
     10817}
     10818int wolfSSL_set_post_handshake_auth(WOLFSSL* ssl, int val)
     10819{
     10820    int ret = wolfSSL_allow_post_handshake_auth(ssl);
     10821    if (ret == 0) {
     10822        ssl->options.postHandshakeAuth = (val != 0);
     10823    }
     10824    return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
     10825}
     10826#endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_TLS13 && WOLFSSL_POST_HANDSHAKE_AUTH */
     10827
    996610828/* store user ctx for verify callback */
    996710829void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx)
     
    1009310955            if (SetSession(ssl, session) != WOLFSSL_SUCCESS) {
    1009410956    #ifdef HAVE_EXT_CACHE
    10095                 wolfSSL_SESSION_free(session);
     10957                FreeSession(session, 0);
    1009610958    #endif
    1009710959                WOLFSSL_MSG("SetSession failed");
     
    1010910971    #ifdef HAVE_EXT_CACHE
    1011010972    else
    10111         wolfSSL_SESSION_free(session);
     10973        FreeSession(session, 0);
    1011210974    #endif
    1011310975
     
    1106511927}
    1106611928
     11929#ifdef HAVE_KEYING_MATERIAL
     11930
     11931#define TLS_PRF_LABEL_CLIENT_FINISHED     "client finished"
     11932#define TLS_PRF_LABEL_SERVER_FINISHED     "server finished"
     11933#define TLS_PRF_LABEL_MASTER_SECRET       "master secret"
     11934#define TLS_PRF_LABEL_EXT_MASTER_SECRET   "extended master secret"
     11935#define TLS_PRF_LABEL_KEY_EXPANSION       "key expansion"
     11936
     11937static const struct ForbiddenLabels {
     11938    const char* label;
     11939    size_t labelLen;
     11940} forbiddenLabels[] = {
     11941    {TLS_PRF_LABEL_CLIENT_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_CLIENT_FINISHED)},
     11942    {TLS_PRF_LABEL_SERVER_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_SERVER_FINISHED)},
     11943    {TLS_PRF_LABEL_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_MASTER_SECRET)},
     11944    {TLS_PRF_LABEL_EXT_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_EXT_MASTER_SECRET)},
     11945    {TLS_PRF_LABEL_KEY_EXPANSION, XSTR_SIZEOF(TLS_PRF_LABEL_KEY_EXPANSION)},
     11946    {NULL, 0},
     11947};
     11948
     11949/**
     11950 * Implement RFC 5705
     11951 * TLS 1.3 uses a different exporter definition (section 7.5 of RFC 8446)
     11952 * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
     11953 */
     11954int wolfSSL_export_keying_material(WOLFSSL *ssl,
     11955        unsigned char *out, size_t outLen,
     11956        const char *label, size_t labelLen,
     11957        const unsigned char *context, size_t contextLen,
     11958        int use_context)
     11959{
     11960    byte*  seed = NULL;
     11961    word32 seedLen;
     11962    const struct ForbiddenLabels* fl;
     11963
     11964    WOLFSSL_ENTER("wolfSSL_export_keying_material");
     11965
     11966    if (ssl == NULL || out == NULL || label == NULL ||
     11967            (use_context && contextLen && context == NULL)) {
     11968        WOLFSSL_MSG("Bad argument");
     11969        return WOLFSSL_FAILURE;
     11970    }
     11971
     11972    /* clientRandom + serverRandom
     11973     * OR
     11974     * clientRandom + serverRandom + ctx len encoding + ctx */
     11975    seedLen = !use_context ? (word32)SEED_LEN :
     11976                             (word32)SEED_LEN + 2 + (word32)contextLen;
     11977
     11978    if (ssl->options.saveArrays == 0 || ssl->arrays == NULL) {
     11979        WOLFSSL_MSG("To export keying material wolfSSL needs to keep handshake "
     11980                    "data. Call wolfSSL_KeepArrays before attempting to "
     11981                    "export keyig material.");
     11982        return WOLFSSL_FAILURE;
     11983    }
     11984
     11985    /* check forbidden labels */
     11986    for (fl = &forbiddenLabels[0]; fl->label != NULL; fl++) {
     11987        if (labelLen >= fl->labelLen &&
     11988                XMEMCMP(label, fl->label, fl->labelLen) == 0) {
     11989            WOLFSSL_MSG("Forbidden label");
     11990            return WOLFSSL_FAILURE;
     11991        }
     11992    }
     11993
     11994#ifdef WOLFSSL_TLS13
     11995    if (IsAtLeastTLSv1_3(ssl->version)) {
     11996        /* Path for TLS 1.3 */
     11997        if (!use_context) {
     11998            contextLen = 0;
     11999            context = (byte*)""; /* Give valid pointer for 0 length memcpy */
     12000        }
     12001
     12002        if (Tls13_Exporter(ssl, out, (word32)outLen, label, labelLen,
     12003                context, contextLen) != 0) {
     12004            WOLFSSL_MSG("Tls13_Exporter error");
     12005            return WOLFSSL_FAILURE;
     12006        }
     12007        return WOLFSSL_SUCCESS;
     12008    }
     12009#endif
     12010
     12011    /* Path for <=TLS 1.2 */
     12012    seed = (byte*)XMALLOC(seedLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     12013    if (seed == NULL) {
     12014        WOLFSSL_MSG("malloc error");
     12015        return WOLFSSL_FAILURE;
     12016    }
     12017
     12018    XMEMCPY(seed,           ssl->arrays->clientRandom, RAN_LEN);
     12019    XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
     12020
     12021    if (use_context) {
     12022        /* Encode len in big endian */
     12023        seed[SEED_LEN    ] = (contextLen >> 8) & 0xFF;
     12024        seed[SEED_LEN + 1] = (contextLen) & 0xFF;
     12025        if (contextLen) {
     12026            /* 0 length context is allowed */
     12027            XMEMCPY(seed + SEED_LEN + 2, context, contextLen);
     12028        }
     12029    }
     12030
     12031    if (wc_PRF_TLS(out, (word32)outLen, ssl->arrays->masterSecret, SECRET_LEN,
     12032            (byte*)label, (word32)labelLen, seed, seedLen, IsAtLeastTLSv1_2(ssl),
     12033            ssl->specs.mac_algorithm, ssl->heap, ssl->devId) != 0) {
     12034        WOLFSSL_MSG("wc_PRF_TLS error");
     12035        XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     12036        return WOLFSSL_FAILURE;
     12037    }
     12038
     12039    XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     12040    return WOLFSSL_SUCCESS;
     12041}
     12042#endif /* HAVE_KEYING_MATERIAL */
    1106712043
    1106812044int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl)
     
    1119212168        return WOLFSSL_FATAL_ERROR;
    1119312169
    11194     if (!ssl->options.handShakeDone &&
     12170    if ((IsSCR(ssl) || !ssl->options.handShakeDone) &&
    1119512171        (DtlsMsgPoolTimeout(ssl) < 0 || DtlsMsgPoolSend(ssl, 0) < 0)) {
    1119612172
     
    1134412320    #endif
    1134512321
    11346     #ifdef WOLFSSL_ALLOW_SSLV3
     12322    #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
    1134712323    WOLFSSL_METHOD* wolfSSLv3_client_method(void)
    1134812324    {
     
    1136012336        return method;
    1136112337    }
    11362     #endif /* WOLFSSL_ALLOW_SSLV3 */
     12338    #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
    1136312339
    1136412340
     
    1144412420    #ifdef OPENSSL_EXTRA
    1144512421        if (ssl->CBIS != NULL) {
    11446             ssl->CBIS(ssl, SSL_ST_CONNECT, SSL_SUCCESS);
     12422            ssl->CBIS(ssl, SSL_ST_CONNECT, WOLFSSL_SUCCESS);
    1144712423            ssl->cbmode = SSL_CB_WRITE;
    1144812424        }
     
    1147312449        if (ssl->buffers.outputBuffer.length > 0
    1147412450        #ifdef WOLFSSL_ASYNC_CRYPT
    11475             /* do not send buffered or advance state if last error was an 
     12451            /* do not send buffered or advance state if last error was an
    1147612452                async pending operation */
    1147712453            && ssl->error != WC_PENDING_E
     
    1163512611            FALL_THROUGH;
    1163612612
     12613    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
    1163712614        case FIRST_REPLY_SECOND :
    1163812615            #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CLIENT_AUTH)
     
    1168212659
    1168312660        case SECOND_REPLY_DONE:
    11684 #ifndef NO_HANDSHAKE_DONE_CB
     12661        #ifndef NO_HANDSHAKE_DONE_CB
    1168512662            if (ssl->hsDoneCb) {
    1168612663                int cbret = ssl->hsDoneCb(ssl, ssl->hsDoneCtx);
     
    1169112668                }
    1169212669            }
    11693 #endif /* NO_HANDSHAKE_DONE_CB */
     12670        #endif /* NO_HANDSHAKE_DONE_CB */
    1169412671
    1169512672            if (!ssl->options.dtls) {
     
    1169812675                }
    1169912676            }
    11700 #ifdef WOLFSSL_DTLS
     12677        #ifdef WOLFSSL_DTLS
    1170112678            else {
    1170212679                ssl->options.dtlsHsRetain = 1;
    1170312680            }
    11704 #endif /* WOLFSSL_DTLS */
     12681        #endif /* WOLFSSL_DTLS */
     12682
     12683        #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
     12684            /* This may be necessary in async so that we don't try to
     12685             * renegotiate again */
     12686            if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
     12687                ssl->secure_renegotiation->startScr = 0;
     12688            }
     12689        #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
    1170512690
    1170612691            WOLFSSL_LEAVE("SSL_connect()", WOLFSSL_SUCCESS);
    1170712692            return WOLFSSL_SUCCESS;
     12693    #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS */
    1170812694
    1170912695        default:
     
    1171112697            return WOLFSSL_FATAL_ERROR; /* unknown connect state */
    1171212698        }
    11713     #endif /* !WOLFSSL_NO_TLS12 */
     12699    #endif /* !WOLFSSL_NO_TLS12 || !NO_OLD_TLS || !WOLFSSL_TLS13 */
    1171412700    }
    1171512701
     
    1172812714    #endif
    1172912715
    11730     #ifdef WOLFSSL_ALLOW_SSLV3
     12716    #if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
    1173112717    WOLFSSL_METHOD* wolfSSLv3_server_method(void)
    1173212718    {
     
    1174612732        return method;
    1174712733    }
    11748     #endif /* WOLFSSL_ALLOW_SSLV3 */
     12734    #endif /* WOLFSSL_ALLOW_SSLV3 && !NO_OLD_TLS */
    1174912735
    1175012736    WOLFSSL_METHOD* wolfSSLv23_server_method(void)
     
    1178512771
    1178612772
     12773    WOLFSSL_ABI
    1178712774    int wolfSSL_accept(WOLFSSL* ssl)
    1178812775    {
     
    1187712864        if (ssl->buffers.outputBuffer.length > 0
    1187812865        #ifdef WOLFSSL_ASYNC_CRYPT
    11879             /* do not send buffered or advance state if last error was an 
     12866            /* do not send buffered or advance state if last error was an
    1188012867                async pending operation */
    1188112868            && ssl->error != WC_PENDING_E
     
    1202013007        case ACCEPT_SECOND_REPLY_DONE :
    1202113008#ifdef HAVE_SESSION_TICKET
    12022             if (ssl->options.createTicket) {
     13009            if (ssl->options.createTicket && !ssl->options.noTicketTls12) {
    1202313010                if ( (ssl->error = SendTicket(ssl)) != 0) {
    1202413011                    WOLFSSL_ERROR(ssl->error);
     
    1208413071            }
    1208513072#endif /* WOLFSSL_DTLS */
     13073
     13074#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
     13075            /* This may be necessary in async so that we don't try to
     13076             * renegotiate again */
     13077            if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
     13078                ssl->secure_renegotiation->startScr = 0;
     13079            }
     13080#endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
    1208613081
    1208713082#ifdef WOLFSSL_SESSION_EXPORT
     
    1242313418
    1242413419        current = &SessionCache[row].Sessions[idx];
    12425         if (XMEMCMP(current->sessionID, id, ID_LEN) == 0) {
     13420        if (XMEMCMP(current->sessionID, id, ID_LEN) == 0 &&
     13421                current->side == ssl->options.side) {
    1242613422            WOLFSSL_MSG("Found a session match");
    1242713423            if (LowResTimer() < (current->bornOn + current->timeout)) {
     
    1250813504    copyInto->ticketSeen     = copyFrom->ticketSeen;
    1250913505    copyInto->ticketAdd      = copyFrom->ticketAdd;
    12510 #ifndef WOLFSSL_TLS13_DRAFT_18
     13506    copyInto->side           = copyFrom->side;
    1251113507    XMEMCPY(&copyInto->ticketNonce, &copyFrom->ticketNonce,
    1251213508                                                           sizeof(TicketNonce));
    12513 #endif
    1251413509#ifdef WOLFSSL_EARLY_DATA
    1251513510    copyInto->maxEarlyDataSz = copyFrom->maxEarlyDataSz;
     
    1261913614    word32 idx = 0;
    1262013615    int    error = 0;
     13616    const byte* id = NULL;
    1262113617#ifdef HAVE_SESSION_TICKET
    1262213618    byte*  tmpBuff = NULL;
     
    1262613622    int i;
    1262713623    int overwrite = 0;
     13624#ifdef HAVE_EXT_CACHE
     13625    int cbRet = 0;
     13626#endif
    1262813627
    1262913628    if (ssl->options.sessionCacheOff)
     
    1263813637#endif
    1263913638
     13639#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
     13640    if (ssl->options.tls1_3)
     13641        id = ssl->session.sessionID;
     13642    else
     13643#endif
     13644    if (ssl->arrays)
     13645        id = ssl->arrays->sessionID;
     13646    if (id == NULL) {
     13647        return BAD_FUNC_ARG;
     13648    }
     13649
    1264013650#ifdef HAVE_SESSION_TICKET
    1264113651    ticLen = ssl->session.ticketLen;
    1264213652    /* Alloc Memory here so if Malloc fails can exit outside of lock */
    12643     if(ticLen > SESSION_TICKET_LEN) {
     13653    if (ticLen > SESSION_TICKET_LEN) {
    1264413654        tmpBuff = (byte*)XMALLOC(ticLen, ssl->heap,
    1264513655                DYNAMIC_TYPE_SESSION_TICK);
     
    1265213662    if (ssl->options.internalCacheOff) {
    1265313663        /* Create a new session object to be stored. */
    12654         session = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), NULL,
    12655                                             DYNAMIC_TYPE_OPENSSL);
     13664        session = wolfSSL_SESSION_new();
    1265613665        if (session == NULL) {
    1265713666#ifdef HAVE_SESSION_TICKET
     
    1266013669            return MEMORY_E;
    1266113670        }
    12662         XMEMSET(session, 0, sizeof(WOLFSSL_SESSION));
    12663         session->isAlloced = 1;
    1266413671    }
    1266513672    else
     
    1266813675        /* Use the session object in the cache for external cache if required.
    1266913676         */
    12670 #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
    12671         if (ssl->options.tls1_3) {
    12672             row = HashSession(ssl->session.sessionID, ID_LEN, &error) %
    12673                     SESSION_ROWS;
    12674         }
    12675         else
    12676 #endif
    12677         {
    12678             row = HashSession(ssl->arrays->sessionID, ID_LEN, &error) %
    12679                     SESSION_ROWS;
    12680         }
     13677        row = HashSession(id, ID_LEN, &error) % SESSION_ROWS;
    1268113678        if (error != 0) {
    1268213679            WOLFSSL_MSG("Hash session failed");
     
    1269513692
    1269613693        for (i=0; i<SESSIONS_PER_ROW; i++) {
    12697             if (ssl->options.tls1_3) {
    12698                 if (XMEMCMP(ssl->session.sessionID, SessionCache[row].Sessions[i].sessionID, ID_LEN) == 0) {
    12699                     WOLFSSL_MSG("Session already exists. Overwriting.");
    12700                     overwrite = 1;
    12701                     idx = i;
    12702                     break;
    12703                 }
    12704             }
    12705             else {
    12706                 if (XMEMCMP(ssl->arrays->sessionID, SessionCache[row].Sessions[i].sessionID, ID_LEN) == 0) {
    12707                     WOLFSSL_MSG("Session already exists. Overwriting.");
    12708                     overwrite = 1;
    12709                     idx = i;
    12710                     break;
    12711                 }
     13694            if (XMEMCMP(id, SessionCache[row].Sessions[i].sessionID, ID_LEN) == 0 &&
     13695                    SessionCache[row].Sessions[i].side == ssl->options.side) {
     13696                WOLFSSL_MSG("Session already exists. Overwriting.");
     13697                overwrite = 1;
     13698                idx = i;
     13699                break;
    1271213700            }
    1271313701        }
     
    1272213710    }
    1272313711
    12724     if (!ssl->options.tls1_3)
     13712    session->side = (byte)ssl->options.side;
     13713
     13714#ifdef WOLFSSL_TLS13
     13715    if (ssl->options.tls1_3) {
     13716        XMEMCPY(session->masterSecret, ssl->session.masterSecret, SECRET_LEN);
     13717        session->sessionIDSz = ID_LEN;
     13718    }
     13719    else
     13720#endif
     13721    {
    1272513722        XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN);
    12726     else
    12727         XMEMCPY(session->masterSecret, ssl->session.masterSecret, SECRET_LEN);
     13723        session->sessionIDSz = ssl->arrays->sessionIDSz;
     13724    }
     13725    XMEMCPY(session->sessionID, id, ID_LEN);
    1272813726    session->haveEMS = ssl->options.haveEMS;
    12729 #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
    12730     if (ssl->options.tls1_3) {
    12731         XMEMCPY(session->sessionID, ssl->session.sessionID, ID_LEN);
    12732         session->sessionIDSz = ID_LEN;
    12733     }
    12734     else
    12735 #endif
    12736     {
    12737         XMEMCPY(session->sessionID, ssl->arrays->sessionID, ID_LEN);
    12738         session->sessionIDSz = ssl->arrays->sessionIDSz;
    12739     }
    1274013727
    1274113728#ifdef OPENSSL_EXTRA
     
    1275813745    if (error == 0) {
    1275913746        /* Cleanup cache row's old Dynamic buff if exists */
    12760         if(session->isDynamic) {
     13747        if (session->isDynamic) {
    1276113748            XFREE(session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK);
    1276213749            session->ticket = NULL;
     
    1282013807        session->ticketSeen     = ssl->session.ticketSeen;
    1282113808        session->ticketAdd      = ssl->session.ticketAdd;
    12822 #ifndef WOLFSSL_TLS13_DRAFT_18
    1282313809        XMEMCPY(&session->ticketNonce, &ssl->session.ticketNonce,
    1282413810                                                           sizeof(TicketNonce));
    12825 #endif
    1282613811    #ifdef WOLFSSL_EARLY_DATA
    1282713812        session->maxEarlyDataSz = ssl->session.maxEarlyDataSz;
     
    1290613891#ifdef HAVE_EXT_CACHE
    1290713892    if (error == 0 && ssl->ctx->new_sess_cb != NULL)
    12908         ssl->ctx->new_sess_cb(ssl, session);
    12909     if (ssl->options.internalCacheOff)
    12910         wolfSSL_SESSION_free(session);
     13893        cbRet = ssl->ctx->new_sess_cb(ssl, session);
     13894    if (ssl->options.internalCacheOff && cbRet == 0)
     13895        FreeSession(session, 1);
    1291113896#endif
    1291213897
     
    1345314438    }
    1345414439
    13455 
    1345614440    void wolfSSL_set_psk_client_callback(WOLFSSL* ssl,wc_psk_client_callback cb)
    1345714441    {
     
    1347914463    }
    1348014464
    13481 
    1348214465    void wolfSSL_CTX_set_psk_server_callback(WOLFSSL_CTX* ctx,
    1348314466                                         wc_psk_server_callback cb)
     
    1348914472        ctx->server_psk_cb = cb;
    1349014473    }
    13491 
    1349214474
    1349314475    void wolfSSL_set_psk_server_callback(WOLFSSL* ssl,wc_psk_server_callback cb)
     
    1351514497    }
    1351614498
    13517 
    1351814499    const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
    1351914500    {
     
    1353614517        return ssl->arrays->client_identity;
    1353714518    }
    13538 
    1353914519
    1354014520    int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint)
     
    1355414534    }
    1355514535
    13556 
    1355714536    int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint)
    1355814537    {
     
    1357214551    }
    1357314552
     14553    void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl)
     14554    {
     14555        return ssl ? ssl->options.psk_ctx : NULL;
     14556    }
     14557    void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx)
     14558    {
     14559        return ctx ? ctx->psk_ctx : NULL;
     14560    }
     14561    int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx)
     14562    {
     14563        if (ssl == NULL)
     14564            return WOLFSSL_FAILURE;
     14565        ssl->options.psk_ctx = psk_ctx;
     14566        return WOLFSSL_SUCCESS;
     14567    }
     14568    int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx)
     14569    {
     14570        if (ctx == NULL)
     14571            return WOLFSSL_FAILURE;
     14572        ctx->psk_ctx = psk_ctx;
     14573        return WOLFSSL_SUCCESS;
     14574    }
    1357414575#endif /* NO_PSK */
    1357514576
     
    1360114602    {
    1360214603        int verify;
     14604        int ret = WOLFSSL_FAILURE;
    1360314605
    1360414606        WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex");
     
    1360914611
    1361014612        if (format == WOLFSSL_FILETYPE_PEM)
    13611             return ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
     14613            ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL,
    1361214614                                      verify);
    1361314615        else
    13614             return ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
     14616            ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL,
    1361514617                                 userChain, verify);
     14618        WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret);
     14619        return ret;
    1361614620    }
    1361714621
     
    1365914663                                 const unsigned char* in, long sz, int format)
    1366014664    {
     14665        int ret = WOLFSSL_FAILURE;
     14666
    1366114667        WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer");
    13662         return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
     14668        ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0,
    1366314669                             GET_VERIFY_SETTING_CTX(ctx));
     14670        WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret);
     14671        return ret;
    1366414672    }
    1366514673
     
    1366814676                                 const unsigned char* in, long sz, int format)
    1366914677    {
     14678        int ret = WOLFSSL_FAILURE;
     14679
    1367014680        WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer");
    13671         return ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
     14681        ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL,
    1367214682                             0, GET_VERIFY_SETTING_CTX(ctx));
     14683        WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret);
     14684        return ret;
    1367314685    }
    1367414686
     
    1367614688    int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id,
    1367714689                                      long sz, int devId, long keySz)
     14690    {
     14691        int ret = wolfSSL_CTX_use_PrivateKey_Id(ctx, id, sz, devId);
     14692
     14693        if (ret == WOLFSSL_SUCCESS)
     14694            ctx->privateKeySz = (word32)keySz;
     14695
     14696        return ret;
     14697    }
     14698
     14699    int wolfSSL_CTX_use_PrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id,
     14700                                      long sz, int devId)
    1367814701    {
    1367914702        int ret = WOLFSSL_FAILURE;
     
    1368414707            XMEMCPY(ctx->privateKey->buffer, id, sz);
    1368514708            ctx->privateKeyId = 1;
    13686             ctx->privateKeySz = (word32)keySz;
     14709            if (devId != INVALID_DEVID)
     14710                ctx->privateKeyDevId = devId;
     14711            else
     14712                ctx->privateKeyDevId = ctx->devId;
     14713
     14714            ret = WOLFSSL_SUCCESS;
     14715        }
     14716
     14717        return ret;
     14718    }
     14719
     14720    int wolfSSL_CTX_use_PrivateKey_Label(WOLFSSL_CTX* ctx, const char* label,
     14721                                         int devId)
     14722    {
     14723        int ret = WOLFSSL_FAILURE;
     14724        word32 sz = (word32)XSTRLEN(label) + 1;
     14725
     14726        FreeDer(&ctx->privateKey);
     14727        if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE,
     14728                                                              ctx->heap) == 0) {
     14729            XMEMCPY(ctx->privateKey->buffer, label, sz);
     14730            ctx->privateKeyLabel = 1;
    1368714731            if (devId != INVALID_DEVID)
    1368814732                ctx->privateKeyDevId = devId;
     
    1383914883    }
    1384014884
    13841 #ifdef HAVE_PKCS11
     14885#ifdef WOLF_CRYPTO_CB
    1384214886    int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id,
    1384314887                                  long sz, int devId, long keySz)
     14888    {
     14889        int ret = wolfSSL_use_PrivateKey_Id(ssl, id, sz, devId);
     14890
     14891        if (ret == WOLFSSL_SUCCESS)
     14892            ssl->buffers.keySz = (word32)keySz;
     14893
     14894        return ret;
     14895    }
     14896
     14897    int wolfSSL_use_PrivateKey_Id(WOLFSSL* ssl, const unsigned char* id,
     14898                                  long sz, int devId)
    1384414899    {
    1384514900        int ret = WOLFSSL_FAILURE;
     
    1385214907            ssl->buffers.weOwnKey = 1;
    1385314908            ssl->buffers.keyId = 1;
    13854             ssl->buffers.keySz = (word32)keySz;
     14909            if (devId != INVALID_DEVID)
     14910                ssl->buffers.keyDevId = devId;
     14911            else
     14912                ssl->buffers.keyDevId = ssl->devId;
     14913
     14914            ret = WOLFSSL_SUCCESS;
     14915        }
     14916
     14917        return ret;
     14918    }
     14919
     14920    int wolfSSL_use_PrivateKey_Label(WOLFSSL* ssl, const char* label, int devId)
     14921    {
     14922        int ret = WOLFSSL_FAILURE;
     14923        word32 sz = (word32)XSTRLEN(label) + 1;
     14924
     14925        if (ssl->buffers.weOwnKey)
     14926            FreeDer(&ssl->buffers.key);
     14927        if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE,
     14928                                                            ssl->heap) == 0) {
     14929            XMEMCPY(ssl->buffers.key->buffer, label, sz);
     14930            ssl->buffers.weOwnKey = 1;
     14931            ssl->buffers.keyLabel = 1;
    1385514932            if (devId != INVALID_DEVID)
    1385614933                ssl->buffers.keyDevId = devId;
     
    1389714974            FreeDer(&ssl->buffers.certificate);
    1389814975            #ifdef KEEP_OUR_CERT
    13899                 FreeX509(ssl->ourCert);
    13900                 if (ssl->ourCert) {
    13901                     XFREE(ssl->ourCert, ssl->heap, DYNAMIC_TYPE_X509);
    13902                     ssl->ourCert = NULL;
    13903                 }
     14976            wolfSSL_X509_free(ssl->ourCert);
     14977            ssl->ourCert = NULL;
    1390414978            #endif
    1390514979            ssl->buffers.weOwnCert = 0;
     
    1399915073#endif
    1400015074
    14001 #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
     15075#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    1400215076    void wolfSSL_CTX_set_quiet_shutdown(WOLFSSL_CTX* ctx, int mode)
    1400315077    {
     
    1401415088            ssl->options.quietShutdown = 1;
    1401515089    }
    14016 #endif
     15090#endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
    1401715091
    1401815092#ifdef OPENSSL_EXTRA
     15093#ifndef NO_BIO
    1401915094    void wolfSSL_set_bio(WOLFSSL* ssl, WOLFSSL_BIO* rd, WOLFSSL_BIO* wr)
    1402015095    {
     
    1407015145        }
    1407115146    }
    14072 #endif
     15147#endif /* !NO_BIO */
     15148#endif /* OPENSSL_EXTRA */
    1407315149
    1407415150#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_WEBSERVER)
     
    1416715243
    1416815244#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
     15245#ifndef NO_BIO
    1416915246    #if !defined(NO_RSA) && !defined(NO_CERTS)
    1417015247    WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname)
     
    1418415261        WOLFSSL_ENTER("wolfSSL_load_client_CA_file");
    1418515262
    14186         bio = wolfSSL_BIO_new_file(fname, "r");
     15263        bio = wolfSSL_BIO_new_file(fname, "rb");
    1418715264        if (bio == NULL)
    1418815265            return NULL;
     
    1420115278            /* Need a persistent copy of the subject name. */
    1420215279            node->data.name = wolfSSL_X509_NAME_dup(subjectName);
    14203             /*
    14204              * Original cert will be freed so make sure not to try to access
    14205              * it in the future.
    14206              */
    14207             node->data.name->x509 = NULL;
     15280            if (node->data.name != NULL) {
     15281                /*
     15282                * Original cert will be freed so make sure not to try to access
     15283                * it in the future.
     15284                */
     15285                node->data.name->x509 = NULL;
     15286            }
    1420815287
    1420915288            /* Put node on the front of the list. */
     
    1423715316    }
    1423815317    #endif
    14239 #endif
     15318#endif /* !NO_BIO */
     15319#endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
    1424015320
    1424115321#ifdef OPENSSL_EXTRA
     
    1428515365        node->next = ctx->ca_names;
    1428615366        ctx->ca_names = node;
    14287         return SSL_SUCCESS;
     15367        return WOLFSSL_SUCCESS;
    1428815368    }
    1428915369    #endif
     
    1432315403        int r = 0;
    1432415404        SrpSide srp_side = SRP_CLIENT_SIDE;
    14325         WC_RNG rng;
    1432615405        byte salt[SRP_SALT_SIZE];
    1432715406
     
    1433915418        }
    1434015419
    14341         if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0){
    14342             WOLFSSL_MSG("Init CTX failed");
     15420        if (wc_SrpInit(ctx->srp, SRP_TYPE_SHA256, srp_side) < 0) {
     15421            WOLFSSL_MSG("Init SRP CTX failed");
    1434315422            XFREE(ctx->srp, ctx->heap, DYNAMIC_TYPE_SRP);
    14344             wolfSSL_CTX_free(ctx);
     15423            ctx->srp = NULL;
    1434515424            return SSL_FAILURE;
    1434615425        }
     
    1435415433        /* if wolfSSL_CTX_set_srp_password has already been called, */
    1435515434        /* execute wc_SrpSetPassword here */
    14356         if (ctx->srp_password != NULL){
     15435        if (ctx->srp_password != NULL) {
     15436            WC_RNG rng;
    1435715437            if (wc_InitRng(&rng) < 0){
    1435815438                WOLFSSL_MSG("wc_InitRng failed");
     
    1436015440            }
    1436115441            XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
    14362             if (wc_RNG_GenerateBlock(&rng, salt,
    14363                                      sizeof(salt)/sizeof(salt[0])) <  0){
     15442            r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
     15443            wc_FreeRng(&rng);
     15444            if (r <  0) {
     15445                WOLFSSL_MSG("wc_RNG_GenerateBlock failed");   
     15446                return SSL_FAILURE;
     15447            }
     15448
     15449            if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
     15450                                srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
     15451                                salt, sizeof(salt)/sizeof(salt[0])) < 0) {
     15452                WOLFSSL_MSG("wc_SrpSetParam failed");
     15453                return SSL_FAILURE;
     15454            }
     15455            r = wc_SrpSetPassword(ctx->srp,
     15456                     (const byte*)ctx->srp_password,
     15457                     (word32)XSTRLEN((char *)ctx->srp_password));
     15458            if (r < 0) {
     15459                WOLFSSL_MSG("fail to set srp password.");
     15460                return SSL_FAILURE;
     15461            }
     15462           
     15463            XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
     15464            ctx->srp_password = NULL;
     15465        }
     15466
     15467        return WOLFSSL_SUCCESS;
     15468    }
     15469
     15470    int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
     15471    {
     15472        int r;
     15473        byte salt[SRP_SALT_SIZE];
     15474
     15475        WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
     15476        if (ctx == NULL || ctx->srp == NULL || password == NULL)
     15477            return SSL_FAILURE;
     15478
     15479        if (ctx->srp->user != NULL) {
     15480            WC_RNG rng;
     15481            if (wc_InitRng(&rng) < 0) {
     15482                WOLFSSL_MSG("wc_InitRng failed");
     15483                return SSL_FAILURE;
     15484            }
     15485            XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
     15486            r = wc_RNG_GenerateBlock(&rng, salt, sizeof(salt)/sizeof(salt[0]));
     15487            wc_FreeRng(&rng);
     15488            if (r <  0) {
    1436415489                WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
    14365                 wc_FreeRng(&rng);
    1436615490                return SSL_FAILURE;
    1436715491            }
     
    1437315497                return SSL_FAILURE;
    1437415498            }
    14375             r = wc_SrpSetPassword(ctx->srp,
    14376                      (const byte*)ctx->srp_password,
    14377                      (word32)XSTRLEN((char *)ctx->srp_password));
    14378             if (r < 0) {
    14379                 WOLFSSL_MSG("fail to set srp password.");
    14380                 return SSL_FAILURE;
    14381             }
    14382             wc_FreeRng(&rng);
    14383             XFREE(ctx->srp_password, ctx->heap, DYNAMIC_TYPE_SRP);
    14384             ctx->srp_password = NULL;
    14385         }
    14386 
    14387         return SSL_SUCCESS;
    14388     }
    14389 
    14390     int wolfSSL_CTX_set_srp_password(WOLFSSL_CTX* ctx, char* password)
    14391     {
    14392         int r;
    14393         WC_RNG rng;
    14394         byte salt[SRP_SALT_SIZE];
    14395 
    14396         WOLFSSL_ENTER("wolfSSL_CTX_set_srp_password");
    14397         if (ctx == NULL || ctx->srp == NULL || password == NULL)
    14398             return SSL_FAILURE;
    14399 
    14400         if (ctx->srp->user != NULL){
    14401             if (wc_InitRng(&rng) < 0){
    14402                 WOLFSSL_MSG("wc_InitRng failed");
    14403                 return SSL_FAILURE;
    14404             }
    14405             XMEMSET(salt, 0, sizeof(salt)/sizeof(salt[0]));
    14406             if (wc_RNG_GenerateBlock(&rng, salt,
    14407                                      sizeof(salt)/sizeof(salt[0])) <  0){
    14408                 WOLFSSL_MSG("wc_RNG_GenerateBlock failed");
    14409                 wc_FreeRng(&rng);
    14410                 return SSL_FAILURE;
    14411             }
    14412             if (wc_SrpSetParams(ctx->srp, srp_N, sizeof(srp_N)/sizeof(srp_N[0]),
    14413                                 srp_g, sizeof(srp_g)/sizeof(srp_g[0]),
    14414                                 salt, sizeof(salt)/sizeof(salt[0])) < 0){
    14415                 WOLFSSL_MSG("wc_SrpSetParam failed");
    14416                 wc_FreeRng(&rng);
    14417                 return SSL_FAILURE;
    14418             }
    1441915499            r = wc_SrpSetPassword(ctx->srp, (const byte*)password,
    1442015500                                  (word32)XSTRLEN(password));
     
    1444315523            XMEMCPY(ctx->srp_password, password, XSTRLEN(password) + 1);
    1444415524        }
    14445         return SSL_SUCCESS;
     15525        return WOLFSSL_SUCCESS;
     15526    }
     15527
     15528    /**
     15529     * The modulus passed to wc_SrpSetParams in ssl.c is constant so check
     15530     * that the requested strength is less than or equal to the size of the
     15531     * static modulus size.
     15532     * @param ctx Not used
     15533     * @param strength Minimum number of bits for the modulus
     15534     * @return 1 if strength is less than or equal to static modulus
     15535     *         0 if strength is greater than static modulus
     15536     */
     15537    int  wolfSSL_CTX_set_srp_strength(WOLFSSL_CTX *ctx, int strength)
     15538    {
     15539        (void)ctx;
     15540        WOLFSSL_ENTER("wolfSSL_CTX_set_srp_strength");
     15541        if (strength > (int)(sizeof(srp_N)*8)) {
     15542            WOLFSSL_MSG("Bad Parameter");
     15543            return WOLFSSL_FAILURE;
     15544        }
     15545        return WOLFSSL_SUCCESS;
     15546    }
     15547
     15548    char* wolfSSL_get_srp_username(WOLFSSL *ssl)
     15549    {
     15550        if (ssl && ssl->ctx && ssl->ctx->srp) {
     15551            return (char*) ssl->ctx->srp->user;
     15552        }
     15553        return NULL;
    1444615554    }
    1444715555    #endif /* WOLFCRYPT_HAVE_SRP && !NO_SHA256 && !WC_NO_RNG */
     
    1445715565    }
    1445815566
     15567#endif /* OPENSSL_EXTRA */
     15568
     15569#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    1445915570
    1446015571    /* store keys returns WOLFSSL_SUCCESS or -1 on error */
     
    1447715588    }
    1447815589
    14479 #endif /* OPENSSL_EXTRA */
    14480 
    14481 #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
    1448215590    void wolfSSL_set_accept_state(WOLFSSL* ssl)
    1448315591    {
     
    1451515623    }
    1451615624
    14517 #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA */
     15625#endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */
    1451815626
    1451915627    /* return true if connection established */
     
    1456415672#endif
    1456515673
    14566 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
    14567 
    1456815674    static long wolf_set_options(long old_op, long op);
    1456915675    long wolfSSL_CTX_set_options(WOLFSSL_CTX* ctx, long opt)
     
    1457815684        return ctx->mask;
    1457915685    }
    14580 
    14581 #endif
    1458215686
    1458315687#ifdef OPENSSL_EXTRA
     
    1461215716        return WOLFSSL_SUCCESS;
    1461315717    }
    14614 
    14615 #ifndef NO_CERTS
    14616 
     15718#endif /* OPENSSL_EXTRA */
     15719
     15720#if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
    1461715721    WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx)
    1461815722    {
     
    1462615730    void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str)
    1462715731    {
    14628         if (ctx == NULL || str == NULL) {
     15732        if (ctx == NULL || str == NULL || ctx->cm == str->cm) {
    1462915733            return;
    1463015734        }
    1463115735
     15736        if (wolfSSL_CertManager_up_ref(str->cm) != WOLFSSL_SUCCESS) {
     15737            WOLFSSL_MSG("wolfSSL_CertManager_up_ref error");
     15738            return;
     15739        }
    1463215740        /* free cert manager if have one */
    1463315741        if (ctx->cm != NULL) {
     
    1463515743        }
    1463615744        ctx->cm               = str->cm;
     15745        ctx->x509_store.cm    = str->cm;
    1463715746
    1463815747        /* free existing store if it exists */
    14639         if (ctx->x509_store_pt != NULL) {
    14640             /* cert manager was free'd a little earlier in this function */
    14641             ctx->x509_store_pt->cm = NULL;
    14642         }
    1464315748        wolfSSL_X509_STORE_free(ctx->x509_store_pt);
    1464415749        ctx->x509_store.cache = str->cache;
     
    1467415779        return WOLFSSL_FATAL_ERROR;
    1467515780    }
    14676 
     15781#endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
     15782
     15783#ifdef OPENSSL_EXTRA
     15784#ifndef NO_CERTS
    1467715785    void wolfSSL_X509_STORE_CTX_set_verify_cb(WOLFSSL_X509_STORE_CTX *ctx,
    1467815786                                  WOLFSSL_X509_STORE_CTX_verify_cb verify_cb)
     
    1469315801        }
    1469415802    }
    14695 #endif
    14696 
    14697 
     15803#endif /* WOLFSSL_QT || OPENSSL_ALL */
    1469815804#endif /* !NO_CERTS */
    1469915805
     15806#ifndef NO_BIO
    1470015807    WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void)
    1470115808    {
     
    1473615843        /* wolfSSL has internal buffer, compatibility only */
    1473715844        WOLFSSL_ENTER("BIO_set_write_buffer_size");
     15845        WOLFSSL_MSG("Buffer resize failed");
    1473815846        WOLFSSL_STUB("BIO_set_write_buffer_size");
    1473915847        (void)bio;
    14740         return size;
     15848        (void) size;
     15849
     15850        /* Even though this is only a STUB at the moment many user applications
     15851         * may attempt to use this. OpenSSL documentation specifies the return
     15852         * "return 1 if the buffer was successfully resized or 0 for failure."
     15853         * since wolfSSL does not resize the buffer will always return failure
     15854         * by default due to memory concerns until this stub is promoted to
     15855         * a non-stub function */
     15856        return WOLFSSL_FAILURE; /* 0, no resize happened */
    1474115857    }
    1474215858    #endif
     
    1480115917    }
    1480215918
     15919    /**
     15920     * Create new socket BIO object. This is a pure TCP connection with
     15921     * no SSL or TLS protection.
     15922     * @param str IP address to connect to
     15923     * @return New BIO object or NULL on failure
     15924     */
     15925    WOLFSSL_BIO *wolfSSL_BIO_new_connect(const char *str)
     15926    {
     15927        WOLFSSL_BIO *bio;
     15928        WOLFSSL_ENTER("wolfSSL_BIO_new_connect");
     15929        bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket());
     15930        if (bio) {
     15931            bio->ip = str;
     15932            bio->type  = WOLFSSL_BIO_SOCKET;
     15933        }
     15934        return bio;
     15935    }
     15936
     15937    /**
     15938     * Set the port to connect to in the BIO object
     15939     * @param b BIO object
     15940     * @param port destination port
     15941     * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
     15942     */
     15943    long wolfSSL_BIO_set_conn_port(WOLFSSL_BIO *b, char* port)
     15944    {
     15945        int p;
     15946        WOLFSSL_ENTER("wolfSSL_BIO_set_conn_port");
     15947
     15948        if (!b || !port) {
     15949            WOLFSSL_ENTER("Bad parameter");
     15950            return WOLFSSL_FAILURE;
     15951        }
     15952
     15953        p = XATOI(port);
     15954        if (!p || p < 0) {
     15955            WOLFSSL_ENTER("Port parsing error");
     15956            return WOLFSSL_FAILURE;
     15957        }
     15958
     15959        b->port = (word16)p;
     15960        return WOLFSSL_SUCCESS;
     15961    }
     15962
     15963#ifdef HAVE_HTTP_CLIENT
     15964    /**
     15965     * Attempt to connect to the destination address and port
     15966     * @param b BIO object
     15967     * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
     15968     */
     15969    long wolfSSL_BIO_do_connect(WOLFSSL_BIO *b)
     15970    {
     15971        SOCKET_T sfd = SOCKET_INVALID;
     15972        WOLFSSL_ENTER("wolfSSL_BIO_do_connect");
     15973
     15974        if (!b) {
     15975            WOLFSSL_ENTER("Bad parameter");
     15976            return WOLFSSL_FAILURE;
     15977        }
     15978
     15979        while (b && b->type != WOLFSSL_BIO_SOCKET)
     15980            b = b->next;
     15981
     15982        if (!b) {
     15983            WOLFSSL_ENTER("No socket BIO in chain");
     15984            return WOLFSSL_FAILURE;
     15985        }
     15986
     15987        if (wolfIO_TcpConnect(&sfd, b->ip, b->port, 0) < 0 ) {
     15988            WOLFSSL_ENTER("wolfIO_TcpConnect error");
     15989            return WOLFSSL_FAILURE;
     15990        }
     15991
     15992        b->num = sfd;
     15993        b->shutdown = BIO_CLOSE;
     15994        return WOLFSSL_SUCCESS;
     15995    }
     15996#endif /* HAVE_HTTP_CLIENT */
    1480315997
    1480415998    int wolfSSL_BIO_eof(WOLFSSL_BIO* b)
     
    1486816062            bio->method = method;
    1486916063            bio->shutdown = BIO_CLOSE; /* default to close things */
     16064            bio->num = -1; /* Default to invalid socket */
    1487016065            bio->init = 1;
    1487116066            if (method->type != WOLFSSL_BIO_FILE &&
     
    1490316098        WOLFSSL_BIO* bio = NULL;
    1490416099
    14905         if (buf == NULL || len < 0) {
     16100        if (buf == NULL) {
    1490616101            return bio;
    1490716102        }
     
    1491216107        }
    1491316108
     16109        if (len < 0) {
     16110            len = (int)XSTRLEN((const char*)buf);
     16111        }
    1491416112        bio->num = bio->wrSz = len;
    1491516113        bio->ptr = (byte*)XMALLOC(len, 0, DYNAMIC_TYPE_OPENSSL);
     
    1496516163                if (bio->type == WOLFSSL_BIO_SOCKET && bio->num)
    1496616164                    CloseSocket(bio->num);
    14967             #endif
     16165             #endif
    1496816166            }
    1496916167
     
    1497316171                    XFCLOSE((XFILE)bio->ptr);
    1497416172                }
     16173            #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR)\
     16174                && !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2)
     16175                else if (bio->num != -1) {
     16176                    XCLOSE(bio->num);
     16177                }
     16178            #endif
    1497516179            }
    1497616180        #endif
     
    1503116235        return top;
    1503216236    }
     16237#endif /* !NO_BIO */
    1503316238#endif /* OPENSSL_EXTRA */
    1503416239
     
    1514116346
    1514216347#if (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE))
     16348#ifndef NO_BIO
    1514316349    /* print out and clear all errors */
    1514416350    void wolfSSL_ERR_print_errors(WOLFSSL_BIO* bio)
     
    1516716373        }
    1516816374        } while (ret >= 0);
    15169     }
     16375        wolfSSL_BIO_write(bio, "", 1);
     16376    }
     16377#endif /* !NO_BIO */
    1517016378#endif /* OPENSSL_EXTRA || DEBUG_WOLFSSL_VERBOSE */
    1517116379
    1517216380#endif /* OPENSSL_EXTRA || HAVE_WEBSERVER */
    1517316381
    15174 #ifdef OPENSSL_EXTRA
    15175 
     16382#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    1517616383#if !defined(NO_WOLFSSL_SERVER)
    1517716384size_t wolfSSL_get_server_random(const WOLFSSL *ssl, unsigned char *out,
     
    1520416411    return size;
    1520516412}
    15206 
    15207 
     16413#endif /* !NO_WOLFSSL_SERVER */
     16414#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     16415
     16416#ifdef OPENSSL_EXTRA
     16417#if !defined(NO_WOLFSSL_SERVER)
    1520816418/* Used to get the peer ephemeral public key sent during the connection
    1520916419 * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called
     
    1526116471#endif /* !NO_WOLFSSL_SERVER */
    1526216472
     16473static int sanityCheckProtoVersion(WOLFSSL_CTX* ctx)
     16474{
     16475    if ((ctx->mask & WOLFSSL_OP_NO_SSLv3) &&
     16476            (ctx->mask & WOLFSSL_OP_NO_TLSv1) &&
     16477            (ctx->mask & WOLFSSL_OP_NO_TLSv1_1) &&
     16478            (ctx->mask & WOLFSSL_OP_NO_TLSv1_2) &&
     16479            (ctx->mask & WOLFSSL_OP_NO_TLSv1_3)) {
     16480        WOLFSSL_MSG("All TLS versions disabled");
     16481        return WOLFSSL_FAILURE;
     16482    }
     16483    return WOLFSSL_SUCCESS;
     16484}
     16485
    1526316486int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
    1526416487{
     
    1526616489
    1526716490    if (ctx == NULL) {
    15268         return BAD_FUNC_ARG;
     16491        return WOLFSSL_FAILURE;
    1526916492    }
    1527016493
     
    1530816531#endif
    1530916532        default:
    15310             return BAD_FUNC_ARG;
    15311     }
    15312 
    15313     return WOLFSSL_SUCCESS;
     16533            WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
     16534            return WOLFSSL_FAILURE;
     16535    }
     16536
     16537    switch (version) {
     16538#ifndef NO_TLS
     16539    case TLS1_3_VERSION:
     16540        wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
     16541        FALL_THROUGH;
     16542    case TLS1_2_VERSION:
     16543        wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
     16544        FALL_THROUGH;
     16545    case TLS1_1_VERSION:
     16546        wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
     16547        FALL_THROUGH;
     16548    case TLS1_VERSION:
     16549        wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_SSLv3);
     16550        break;
     16551#endif
     16552#if defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)
     16553    case SSL3_VERSION:
     16554    case SSL2_VERSION:
     16555        /* Nothing to do here */
     16556#endif
     16557        break;
     16558#ifdef WOLFSSL_DTLS
     16559#ifndef NO_OLD_TLS
     16560    case DTLS1_VERSION:
     16561#endif
     16562    case DTLS1_2_VERSION:
     16563        break;
     16564#endif
     16565    default:
     16566        WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
     16567        return WOLFSSL_FAILURE;
     16568    }
     16569
     16570    return sanityCheckProtoVersion(ctx);
    1531416571}
    1531516572
     
    1531816575    WOLFSSL_ENTER("wolfSSL_CTX_set_max_proto_version");
    1531916576
    15320     /* supported only at compile-time only */
    15321     (void)ctx;
    15322     (void)ver;
    15323     return WOLFSSL_SUCCESS;
    15324 }
    15325 
    15326 
     16577    if (!ctx || !ctx->method) {
     16578        WOLFSSL_MSG("Bad parameter");
     16579        return WOLFSSL_FAILURE;
     16580    }
     16581
     16582    switch (ver) {
     16583    case SSL2_VERSION:
     16584        WOLFSSL_MSG("wolfSSL does not support SSLv2");
     16585        return WOLFSSL_FAILURE;
     16586#if (defined(WOLFSSL_ALLOW_SSLV3) && !defined(NO_OLD_TLS)) || !defined(NO_TLS)
     16587    case SSL3_VERSION:
     16588        wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1);
     16589        FALL_THROUGH;
     16590    case TLS1_VERSION:
     16591        wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_1);
     16592        FALL_THROUGH;
     16593    case TLS1_1_VERSION:
     16594        wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_2);
     16595        FALL_THROUGH;
     16596    case TLS1_2_VERSION:
     16597        wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TLSv1_3);
     16598        FALL_THROUGH;
     16599    case TLS1_3_VERSION:
     16600        /* Nothing to do here */
     16601        break;
     16602#endif
     16603#ifdef WOLFSSL_DTLS
     16604#ifndef NO_OLD_TLS
     16605    case DTLS1_VERSION:
     16606#endif
     16607    case DTLS1_2_VERSION:
     16608        break;
     16609#endif
     16610    default:
     16611        WOLFSSL_MSG("Unrecognized protocol version or not compiled in");
     16612        return WOLFSSL_FAILURE;
     16613    }
     16614
     16615    return sanityCheckProtoVersion(ctx);
     16616}
     16617
     16618#endif /* OPENSSL_EXTRA */
     16619
     16620#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    1532716621#if !defined(NO_WOLFSSL_CLIENT)
    1532816622/* Return the amount of random bytes copied over or error case.
     
    1536316657}
    1536416658#endif /* !NO_WOLFSSL_CLIENT */
    15365 
    15366 
     16659#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     16660
     16661#ifdef OPENSSL_EXTRA
    1536716662    unsigned long wolfSSLeay(void)
    1536816663    {
     
    1577517070
    1577617071        WOLFSSL_ENTER("SHA3_256_Init");
    15777         ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, 0);
     17072        ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID);
    1577817073
    1577917074        /* return 1 on success, 0 otherwise */
     
    1646517760
    1646617761        /* OpenSSL compat, no ret */
    16467         wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, !enc);
     17762        if (wc_Des_SetKey(&myDes, (const byte*)schedule,
     17763                         (const byte*)ivec, !enc) != 0) {
     17764            WOLFSSL_MSG("wc_Des_SetKey return error.");
     17765            return;
     17766        }
     17767
    1646817768        lb_sz = length%DES_BLOCK_SIZE;
    1646917769        blk   = length/DES_BLOCK_SIZE;
     
    1650917809    }
    1651017810
     17811#endif /* OPENSSL_EXTRA */
     17812
     17813#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    1651117814    int wolfSSL_clear(WOLFSSL* ssl)
    1651217815    {
     
    1652517828        ssl->options.handShakeState  = NULL_STATE;
    1652617829        ssl->options.handShakeDone = 0;
    16527         /* ssl->options.processReply = doProcessInit; */
     17830        ssl->options.processReply = 0; /* doProcessInit */
    1652817831
    1652917832        ssl->keys.encryptionOn = 0;
     
    1659017893    }
    1659117894
    16592     long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
    16593     {
    16594         word32 tmptime;
    16595         if (!ses || t < 0)
    16596             return BAD_FUNC_ARG;
    16597 
    16598         tmptime = t & 0xFFFFFFFF;
    16599 
    16600         ses->timeout = tmptime;
    16601 
    16602         return WOLFSSL_SUCCESS;
    16603     }
    16604 
    16605 #endif
     17895#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
    1660617896
    1660717897#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
     
    1667217962     * sid_ctx_len length of sid_ctx buffer
    1667317963     *
    16674      * Returns SSL_SUCCESS in success case and SSL_FAILURE when failing
     17964     * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
    1667517965     */
    1667617966    int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx,
     
    1668717977        ctx->sessionCtxSz = (byte)sid_ctx_len;
    1668817978
    16689         return SSL_SUCCESS;
     17979        return WOLFSSL_SUCCESS;
    1669017980    }
    1669117981
     
    1669917989     * len  length of sid_ctx buffer
    1670017990     *
    16701      * Returns SSL_SUCCESS in success case and SSL_FAILURE when failing
     17991     * Returns WOLFSSL_SUCCESS in success case and SSL_FAILURE when failing
    1670217992     */
    1670317993    int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id,
     
    1671218002        ssl->sessionCtxSz = (byte)len;
    1671318003
    16714         return SSL_SUCCESS;
     18004        return WOLFSSL_SUCCESS;
    1671518005    }
    1671618006
     
    1714618436        entry = wolfSSL_X509_NAME_get_entry(name, i);
    1714718437        if (entry == NULL) {
    17148             WOLFSSL_MSG("X509_NAME_get_entry failed");
     18438            WOLFSSL_MSG("wolfSSL_X509_NAME_get_entry failed");
    1714918439            return NULL;
    1715018440        }
     
    1715218442                                                                   sizeof(buf));
    1715318443        if (nameSz < 0) {
    17154             WOLFSSL_MSG("X509_NAME_get_text_by_NID failed");
     18444            WOLFSSL_MSG("wolfSSL_X509_NAME_get_text_by_NID failed");
    1715518445            return NULL;
    1715618446        }
     
    1722618516{
    1722718517    WOLFSSL_X509* newX509 = NULL;
     18518    WOLFSSL_ENTER("wolfSSL_d2i_X509");
     18519
     18520    if (in == NULL) {
     18521        WOLFSSL_MSG("NULL input for wolfSSL_d2i_X509");
     18522        return NULL;
     18523    }
    1722818524
    1722918525    newX509 = wolfSSL_X509_d2i(x509, *in, len);
     
    1723418530}
    1723518531
    17236 
    17237 WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len)
     18532static WOLFSSL_X509* d2i_X509orX509REQ(WOLFSSL_X509** x509,
     18533                                        const byte* in, int len, int req)
    1723818534{
    1723918535    WOLFSSL_X509 *newX509 = NULL;
     18536    int type = req ? CERTREQ_TYPE : CERT_TYPE;
    1724018537
    1724118538    WOLFSSL_ENTER("wolfSSL_X509_d2i");
    1724218539
    17243     if (in != NULL && len != 0) {
     18540    if (in != NULL && len != 0
     18541    #ifndef WOLFSSL_CERT_REQ
     18542            && req == 0
     18543    #else
     18544            && (req == 0 || req == 1)
     18545    #endif
     18546            ) {
    1724418547    #ifdef WOLFSSL_SMALL_STACK
    1724518548        DecodedCert* cert;
     
    1725618559
    1725718560        InitDecodedCert(cert, (byte*)in, len, NULL);
    17258         if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0) {
     18561    #ifdef WOLFSSL_CERT_REQ
     18562        cert->isCSR = req;
     18563    #endif
     18564        if (ParseCertRelative(cert, type, 0, NULL) == 0) {
    1725918565            newX509 = wolfSSL_X509_new();
    1726018566            if (newX509 != NULL) {
     
    1727618582    return newX509;
    1727718583}
     18584
     18585int wolfSSL_X509_get_isCA(WOLFSSL_X509* x509)
     18586{
     18587    int isCA = 0;
     18588
     18589    WOLFSSL_ENTER("wolfSSL_X509_get_isCA");
     18590
     18591    if (x509 != NULL)
     18592        isCA = x509->isCa;
     18593
     18594    WOLFSSL_LEAVE("wolfSSL_X509_get_isCA", isCA);
     18595
     18596    return isCA;
     18597}
     18598
     18599WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len)
     18600{
     18601    return d2i_X509orX509REQ(x509, in, len, 0);
     18602}
     18603
     18604#ifdef WOLFSSL_CERT_REQ
     18605WOLFSSL_X509* wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509,
     18606        const unsigned char* in, int len)
     18607{
     18608    return d2i_X509orX509REQ(x509, in, len, 1);
     18609}
     18610#endif
    1727818611#endif /* KEEP_PEER_CERT || SESSION_CERTS || OPENSSL_EXTRA ||
    1727918612          OPENSSL_EXTRA_X509_SMALL */
    1728018613
    17281 
    17282 
    17283 #if defined(OPENSSL_ALL) || defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || \
    17284     defined(SESSION_CERTS)
    17285     /* return the next, if any, altname from the peer cert */
    17286     WOLFSSL_ABI
    17287     char* wolfSSL_X509_get_next_altname(WOLFSSL_X509* cert)
    17288     {
    17289         char* ret = NULL;
    17290         WOLFSSL_ENTER("wolfSSL_X509_get_next_altname");
    17291 
    17292         /* don't have any to work with */
    17293         if (cert == NULL || cert->altNames == NULL)
    17294             return NULL;
    17295 
    17296         /* already went through them */
    17297         if (cert->altNamesNext == NULL)
    17298             return NULL;
    17299 
    17300         ret = cert->altNamesNext->name;
    17301         cert->altNamesNext = cert->altNamesNext->next;
    17302 
    17303         return ret;
    17304     }
    17305 
    17306     int wolfSSL_X509_get_isCA(WOLFSSL_X509* x509)
    17307     {
    17308         int isCA = 0;
    17309 
    17310         WOLFSSL_ENTER("wolfSSL_X509_get_isCA");
    17311 
    17312         if (x509 != NULL)
    17313             isCA = x509->isCa;
    17314 
    17315         WOLFSSL_LEAVE("wolfSSL_X509_get_isCA", isCA);
    17316 
    17317         return isCA;
    17318     }
    17319 
    17320     int wolfSSL_X509_get_signature(WOLFSSL_X509* x509,
    17321                                                  unsigned char* buf, int* bufSz)
    17322     {
    17323         WOLFSSL_ENTER("wolfSSL_X509_get_signature");
    17324         if (x509 == NULL || bufSz == NULL || (*bufSz < (int)x509->sig.length &&
    17325                     buf != NULL))
     18614#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
     18615/* returns the number of entries in the WOLFSSL_X509_NAME */
     18616int wolfSSL_X509_NAME_entry_count(WOLFSSL_X509_NAME* name)
     18617{
     18618    int count = 0;
     18619
     18620    WOLFSSL_ENTER("wolfSSL_X509_NAME_entry_count");
     18621
     18622    if (name != NULL)
     18623        count = name->entrySz;
     18624
     18625    WOLFSSL_LEAVE("wolfSSL_X509_NAME_entry_count", count);
     18626    return count;
     18627}
     18628#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
     18629
     18630#if defined(OPENSSL_EXTRA) || \
     18631    defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
     18632
     18633/* return the next, if any, altname from the peer cert */
     18634WOLFSSL_ABI
     18635char* wolfSSL_X509_get_next_altname(WOLFSSL_X509* cert)
     18636{
     18637    char* ret = NULL;
     18638    WOLFSSL_ENTER("wolfSSL_X509_get_next_altname");
     18639
     18640    /* don't have any to work with */
     18641    if (cert == NULL || cert->altNames == NULL)
     18642        return NULL;
     18643
     18644    /* already went through them */
     18645    if (cert->altNamesNext == NULL)
     18646        return NULL;
     18647
     18648    ret = cert->altNamesNext->name;
     18649    cert->altNamesNext = cert->altNamesNext->next;
     18650
     18651    return ret;
     18652}
     18653
     18654int wolfSSL_X509_get_signature(WOLFSSL_X509* x509,
     18655                                                unsigned char* buf, int* bufSz)
     18656{
     18657    WOLFSSL_ENTER("wolfSSL_X509_get_signature");
     18658    if (x509 == NULL || bufSz == NULL || (*bufSz < (int)x509->sig.length &&
     18659                buf != NULL))
     18660        return WOLFSSL_FATAL_ERROR;
     18661
     18662    if (buf != NULL)
     18663        XMEMCPY(buf, x509->sig.buffer, x509->sig.length);
     18664    *bufSz = x509->sig.length;
     18665
     18666    return WOLFSSL_SUCCESS;
     18667}
     18668
     18669
     18670/* Getter function that copies over the DER public key buffer to "buf" and
     18671    * sets the size in bufSz. If "buf" is NULL then just bufSz is set to needed
     18672    * buffer size. "bufSz" passed in should initially be set by the user to be
     18673    * the size of "buf". This gets checked to make sure the buffer is large
     18674    * enough to hold the public key.
     18675    *
     18676    * Note: this is the X.509 form of key with "header" info.
     18677    * return WOLFSSL_SUCCESS on success
     18678    */
     18679int wolfSSL_X509_get_pubkey_buffer(WOLFSSL_X509* x509,
     18680                                            unsigned char* buf, int* bufSz)
     18681{
     18682#ifdef WOLFSSL_SMALL_STACK
     18683    DecodedCert* cert;
     18684#else
     18685    DecodedCert cert[1];
     18686#endif
     18687    word32 idx;
     18688    const byte*  der;
     18689    int length = 0;
     18690    int    ret, derSz = 0;
     18691    int badDate = 0;
     18692    const byte* pubKeyX509 = NULL;
     18693    int   pubKeyX509Sz = 0;
     18694
     18695    WOLFSSL_ENTER("wolfSSL_X509_get_pubkey_buffer");
     18696    if (x509 == NULL || bufSz == NULL) {
     18697        WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BAD_FUNC_ARG);
     18698        return WOLFSSL_FATAL_ERROR;
     18699    }
     18700
     18701
     18702#ifdef WOLFSSL_SMALL_STACK
     18703    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert),
     18704                                    x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
     18705    if (cert == NULL) {
     18706        WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", MEMORY_E);
     18707        return WOLFSSL_FATAL_ERROR;
     18708    }
     18709#endif
     18710
     18711    der = wolfSSL_X509_get_der(x509, &derSz);
     18712    InitDecodedCert(cert, der, derSz, NULL);
     18713    ret = wc_GetPubX509(cert, 0, &badDate);
     18714    if (ret >= 0) {
     18715        idx = cert->srcIdx;
     18716        pubKeyX509 = cert->source + cert->srcIdx;
     18717        ret = GetSequence(cert->source, &cert->srcIdx, &length,
     18718                cert->maxIdx);
     18719        pubKeyX509Sz = length + (cert->srcIdx - idx);
     18720    }
     18721
     18722    FreeDecodedCert(cert);
     18723#ifdef WOLFSSL_SMALL_STACK
     18724    XFREE(cert, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
     18725#endif
     18726
     18727    if (ret < 0) {
     18728        WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", ret);
     18729        return WOLFSSL_FATAL_ERROR;
     18730    }
     18731
     18732    if (buf != NULL) {
     18733        if (pubKeyX509Sz > *bufSz) {
     18734            WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BUFFER_E);
    1732618735            return WOLFSSL_FATAL_ERROR;
    17327 
    17328         if (buf != NULL)
    17329             XMEMCPY(buf, x509->sig.buffer, x509->sig.length);
    17330         *bufSz = x509->sig.length;
    17331 
    17332         return WOLFSSL_SUCCESS;
    17333     }
    17334 
    17335 
    17336     /* Getter function that copies over the DER public key buffer to "buf" and
    17337      * sets the size in bufSz. If "buf" is NULL then just bufSz is set to needed
    17338      * buffer size. "bufSz" passed in should initially be set by the user to be
    17339      * the size of "buf". This gets checked to make sure the buffer is large
    17340      * enough to hold the public key.
    17341      *
    17342      * Note: this is the X.509 form of key with "header" info.
    17343      * return WOLFSSL_SUCCESS on success
    17344      */
    17345     int wolfSSL_X509_get_pubkey_buffer(WOLFSSL_X509* x509,
    17346                                                 unsigned char* buf, int* bufSz)
    17347     {
    17348     #ifdef WOLFSSL_SMALL_STACK
    17349         DecodedCert* cert;
    17350     #else
    17351         DecodedCert cert[1];
    17352     #endif
    17353         word32 idx;
    17354         const byte*  der;
    17355         int length = 0;
    17356         int    ret, derSz = 0;
    17357         int badDate = 0;
    17358         const byte* pubKeyX509 = NULL;
    17359         int   pubKeyX509Sz = 0;
    17360 
    17361         WOLFSSL_ENTER("wolfSSL_X509_get_pubkey_buffer");
    17362         if (x509 == NULL || bufSz == NULL) {
    17363             WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BAD_FUNC_ARG);
    17364             return WOLFSSL_FATAL_ERROR;
    17365         }
    17366 
    17367 
    17368     #ifdef WOLFSSL_SMALL_STACK
    17369         cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert),
    17370                                        x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
    17371         if (cert == NULL) {
    17372             WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", MEMORY_E);
    17373             return WOLFSSL_FATAL_ERROR;
    17374         }
    17375     #endif
    17376 
    17377         der = wolfSSL_X509_get_der(x509, &derSz);
    17378         InitDecodedCert(cert, der, derSz, NULL);
    17379         ret = wc_GetPubX509(cert, 0, &badDate);
    17380         if (ret >= 0) {
    17381             idx = cert->srcIdx;
    17382             pubKeyX509 = cert->source + cert->srcIdx;
    17383             ret = GetSequence(cert->source, &cert->srcIdx, &length,
    17384                     cert->maxIdx);
    17385             pubKeyX509Sz = length + (cert->srcIdx - idx);
    17386         }
    17387 
    17388         FreeDecodedCert(cert);
    17389     #ifdef WOLFSSL_SMALL_STACK
    17390         XFREE(cert, x509->heap, DYNAMIC_TYPE_TMP_BUFFER);
    17391     #endif
    17392 
    17393         if (ret < 0) {
    17394             WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", ret);
    17395             return WOLFSSL_FATAL_ERROR;
    17396         }
    17397 
    17398         if (buf != NULL) {
    17399             if (pubKeyX509Sz > *bufSz) {
    17400                 WOLFSSL_LEAVE("wolfSSL_X509_get_pubkey_buffer", BUFFER_E);
    17401                 return WOLFSSL_FATAL_ERROR;
    17402             }
    17403             XMEMCPY(buf, pubKeyX509, pubKeyX509Sz);
    17404         }
    17405         *bufSz = pubKeyX509Sz;
    17406 
    17407         return WOLFSSL_SUCCESS;
    17408     }
    17409 
    17410 
    17411     /* Getter function for the public key OID value
    17412      * return public key OID stored in WOLFSSL_X509 structure */
    17413     int wolfSSL_X509_get_pubkey_type(WOLFSSL_X509* x509)
    17414     {
    17415         if (x509 == NULL)
    17416             return WOLFSSL_FAILURE;
    17417         return x509->pubKeyOID;
    17418     }
    17419 
    17420     /* write X509 serial number in unsigned binary to buffer
    17421        buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases
    17422        return WOLFSSL_SUCCESS on success */
    17423     int wolfSSL_X509_get_serial_number(WOLFSSL_X509* x509,
    17424                                        byte* in, int* inOutSz)
    17425     {
    17426         WOLFSSL_ENTER("wolfSSL_X509_get_serial_number");
    17427         if (x509 == NULL || in == NULL ||
    17428                                    inOutSz == NULL || *inOutSz < x509->serialSz)
    17429             return BAD_FUNC_ARG;
    17430 
     18736        }
     18737        XMEMCPY(buf, pubKeyX509, pubKeyX509Sz);
     18738    }
     18739    *bufSz = pubKeyX509Sz;
     18740
     18741    return WOLFSSL_SUCCESS;
     18742}
     18743
     18744
     18745/* Getter function for the public key OID value
     18746    * return public key OID stored in WOLFSSL_X509 structure */
     18747int wolfSSL_X509_get_pubkey_type(WOLFSSL_X509* x509)
     18748{
     18749    if (x509 == NULL)
     18750        return WOLFSSL_FAILURE;
     18751    return x509->pubKeyOID;
     18752}
     18753
     18754#endif /* OPENSSL_EXTRA || KEEP_OUR_CERT || KEEP_PEER_CERT || SESSION_CERTS */
     18755
     18756#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
     18757    defined(KEEP_OUR_CERT) || defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
     18758
     18759/* write X509 serial number in unsigned binary to buffer
     18760    buffer needs to be at least EXTERNAL_SERIAL_SIZE (32) for all cases
     18761    return WOLFSSL_SUCCESS on success */
     18762int wolfSSL_X509_get_serial_number(WOLFSSL_X509* x509,
     18763                                    byte* in, int* inOutSz)
     18764{
     18765    WOLFSSL_ENTER("wolfSSL_X509_get_serial_number");
     18766    if (x509 == NULL || inOutSz == NULL) {
     18767        WOLFSSL_MSG("Null argument passed in");
     18768        return BAD_FUNC_ARG;
     18769    }
     18770
     18771    if (in != NULL) {
     18772        if (*inOutSz < x509->serialSz) {
     18773            WOLFSSL_MSG("Serial buffer too small");
     18774            return BUFFER_E;
     18775        }
    1743118776        XMEMCPY(in, x509->serial, x509->serialSz);
    17432         *inOutSz = x509->serialSz;
    17433 
    17434         return WOLFSSL_SUCCESS;
    17435     }
    17436 
    17437     /* not an openssl compatibility function - getting for derCert */
    17438     const byte* wolfSSL_X509_get_der(WOLFSSL_X509* x509, int* outSz)
    17439     {
    17440         WOLFSSL_ENTER("wolfSSL_X509_get_der");
    17441 
    17442         if (x509 == NULL || x509->derCert == NULL || outSz == NULL)
    17443             return NULL;
    17444 
    17445         *outSz = (int)x509->derCert->length;
    17446         return x509->derCert->buffer;
    17447     }
    17448 
    17449     /* used by JSSE (not a standard compatibility function) */
    17450     /* this is not thread safe */
    17451     WOLFSSL_ABI
    17452     const byte* wolfSSL_X509_notBefore(WOLFSSL_X509* x509)
    17453     {
    17454         static byte notBeforeData[CTC_DATE_SIZE]; /* temp buffer for date */
    17455         WOLFSSL_ENTER("wolfSSL_X509_notBefore");
    17456 
    17457         if (x509 == NULL)
    17458             return NULL;
    17459 
    17460         XMEMSET(notBeforeData, 0, sizeof(notBeforeData));
    17461         notBeforeData[0] = (byte)x509->notBefore.type;
    17462         notBeforeData[1] = (byte)x509->notBefore.length;
    17463         XMEMCPY(&notBeforeData[2], x509->notBefore.data, x509->notBefore.length);
    17464 
    17465         return notBeforeData;
    17466     }
    17467     /* used by JSSE (not a standard compatibility function) */
    17468     /* this is not thread safe */
    17469     WOLFSSL_ABI
    17470     const byte* wolfSSL_X509_notAfter(WOLFSSL_X509* x509)
    17471     {
    17472         static byte notAfterData[CTC_DATE_SIZE]; /* temp buffer for date */
    17473         WOLFSSL_ENTER("wolfSSL_X509_notAfter");
    17474 
    17475         if (x509 == NULL)
    17476             return NULL;
    17477 
    17478         XMEMSET(notAfterData, 0, sizeof(notAfterData));
    17479         notAfterData[0] = (byte)x509->notAfter.type;
    17480         notAfterData[1] = (byte)x509->notAfter.length;
    17481         XMEMCPY(&notAfterData[2], x509->notAfter.data, x509->notAfter.length);
    17482 
    17483         return notAfterData;
    17484     }
    17485 
    17486     #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_STUB)
    17487     WOLFSSL_ASN1_TIME* wolfSSL_X509_gmtime_adj(WOLFSSL_ASN1_TIME *s, long adj)
    17488     {
    17489         (void) s;
    17490         (void) adj;
    17491         WOLFSSL_STUB("wolfSSL_X509_gmtime_adj");
     18777    }
     18778    *inOutSz = x509->serialSz;
     18779
     18780    return WOLFSSL_SUCCESS;
     18781}
     18782
     18783/* not an openssl compatibility function - getting for derCert */
     18784const byte* wolfSSL_X509_get_der(WOLFSSL_X509* x509, int* outSz)
     18785{
     18786    WOLFSSL_ENTER("wolfSSL_X509_get_der");
     18787
     18788    if (x509 == NULL || x509->derCert == NULL || outSz == NULL)
    1749218789        return NULL;
    17493     }
    17494     #endif
    17495 
    17496     /* get the buffer to be signed (tbs) from the WOLFSSL_X509 certificate
    17497      *
    17498      * outSz : gets set to the size of the buffer
    17499      * returns a pointer to the internal buffer at the location of TBS on
    17500      *         on success and NULL on failure.
    17501      */
    17502     const unsigned char* wolfSSL_X509_get_tbs(WOLFSSL_X509* x509, int* outSz)
    17503     {
    17504         int sz = 0, len;
    17505         unsigned int idx = 0, tmpIdx;
    17506         const unsigned char* der = NULL;
    17507         const unsigned char* tbs = NULL;
    17508 
    17509         if (x509 == NULL || outSz == NULL) {
    17510             return NULL;
    17511         }
    17512 
    17513         der = wolfSSL_X509_get_der(x509, &sz);
    17514         if (der == NULL) {
    17515             return NULL;
    17516         }
    17517 
    17518         if (GetSequence(der, &idx, &len, sz) < 0) {
    17519             return NULL;
    17520         }
    17521         tbs = der + idx;
    17522         tmpIdx = idx;
    17523         if (GetSequence(der, &idx, &len, sz) < 0) {
    17524             return NULL;
    17525         }
    17526         *outSz = len + (idx - tmpIdx);
    17527         return tbs;
    17528     }
    17529 
    17530     int wolfSSL_X509_version(WOLFSSL_X509* x509)
    17531     {
    17532         WOLFSSL_ENTER("wolfSSL_X509_version");
    17533 
    17534         if (x509 == NULL)
    17535             return 0;
    17536 
    17537         return x509->version;
    17538     }
     18790
     18791    *outSz = (int)x509->derCert->length;
     18792    return x509->derCert->buffer;
     18793}
     18794
     18795#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || KEEP_OUR_CERT || KEEP_PEER_CERT || SESSION_CERTS */
     18796
     18797#ifdef OPENSSL_EXTRA
     18798
     18799/* used by JSSE (not a standard compatibility function) */
     18800WOLFSSL_ABI
     18801const byte* wolfSSL_X509_notBefore(WOLFSSL_X509* x509)
     18802{
     18803    WOLFSSL_ENTER("wolfSSL_X509_notBefore");
     18804
     18805    if (x509 == NULL)
     18806        return NULL;
     18807
     18808    XMEMSET(x509->notBeforeData, 0, sizeof(x509->notBeforeData));
     18809    x509->notBeforeData[0] = (byte)x509->notBefore.type;
     18810    x509->notBeforeData[1] = (byte)x509->notBefore.length;
     18811    XMEMCPY(&x509->notBeforeData[2], x509->notBefore.data, x509->notBefore.length);
     18812
     18813    return x509->notBeforeData;
     18814}
     18815
     18816/* used by JSSE (not a standard compatibility function) */
     18817WOLFSSL_ABI
     18818const byte* wolfSSL_X509_notAfter(WOLFSSL_X509* x509)
     18819{
     18820    WOLFSSL_ENTER("wolfSSL_X509_notAfter");
     18821
     18822    if (x509 == NULL)
     18823        return NULL;
     18824
     18825    XMEMSET(x509->notAfterData, 0, sizeof(x509->notAfterData));
     18826    x509->notAfterData[0] = (byte)x509->notAfter.type;
     18827    x509->notAfterData[1] = (byte)x509->notAfter.length;
     18828    XMEMCPY(&x509->notAfterData[2], x509->notAfter.data, x509->notAfter.length);
     18829
     18830    return x509->notAfterData;
     18831}
     18832
     18833
     18834#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_STUB)
     18835WOLFSSL_ASN1_TIME* wolfSSL_X509_gmtime_adj(WOLFSSL_ASN1_TIME *s, long adj)
     18836{
     18837    (void) s;
     18838    (void) adj;
     18839    WOLFSSL_STUB("wolfSSL_X509_gmtime_adj");
     18840    return NULL;
     18841}
     18842#endif
     18843
     18844/* get the buffer to be signed (tbs) from the WOLFSSL_X509 certificate
     18845    *
     18846    * outSz : gets set to the size of the buffer
     18847    * returns a pointer to the internal buffer at the location of TBS on
     18848    *         on success and NULL on failure.
     18849    */
     18850const unsigned char* wolfSSL_X509_get_tbs(WOLFSSL_X509* x509, int* outSz)
     18851{
     18852    int sz = 0, len;
     18853    unsigned int idx = 0, tmpIdx;
     18854    const unsigned char* der = NULL;
     18855    const unsigned char* tbs = NULL;
     18856
     18857    if (x509 == NULL || outSz == NULL) {
     18858        return NULL;
     18859    }
     18860
     18861    der = wolfSSL_X509_get_der(x509, &sz);
     18862    if (der == NULL) {
     18863        return NULL;
     18864    }
     18865
     18866    if (GetSequence(der, &idx, &len, sz) < 0) {
     18867        return NULL;
     18868    }
     18869    tbs = der + idx;
     18870    tmpIdx = idx;
     18871    if (GetSequence(der, &idx, &len, sz) < 0) {
     18872        return NULL;
     18873    }
     18874    *outSz = len + (idx - tmpIdx);
     18875    return tbs;
     18876}
     18877
     18878int wolfSSL_X509_version(WOLFSSL_X509* x509)
     18879{
     18880    WOLFSSL_ENTER("wolfSSL_X509_version");
     18881
     18882    if (x509 == NULL)
     18883        return 0;
     18884
     18885    return x509->version;
     18886}
    1753918887
    1754018888#ifdef WOLFSSL_SEP
     
    1762818976
    1762918977#endif /* WOLFSSL_SEP */
     18978#endif /* OPENSSL_EXTRA */
    1763018979
    1763118980/* require OPENSSL_EXTRA since wolfSSL_X509_free is wrapped by OPENSSL_EXTRA */
     
    1765719006int wolfSSL_sk_X509_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk, WOLFSSL_X509* x509)
    1765819007{
    17659     WOLFSSL_STACK* node;
    1766019008    WOLFSSL_ENTER("wolfSSL_sk_X509_push");
    1766119009
     
    1766419012    }
    1766519013
    17666     /* no previous values in stack */
    17667     if (sk->data.x509 == NULL) {
    17668         sk->data.x509 = x509;
    17669         sk->num += 1;
    17670         return WOLFSSL_SUCCESS;
    17671     }
    17672 
    17673     /* stack already has value(s) create a new node and add more */
    17674     node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
    17675                                                              DYNAMIC_TYPE_X509);
    17676     if (node == NULL) {
    17677         WOLFSSL_MSG("Memory error");
    17678         return WOLFSSL_FAILURE;
    17679     }
    17680     XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
    17681 
    17682     /* push new x509 onto head of stack */
    17683     node->data.x509 = sk->data.x509;
    17684     node->next      = sk->next;
    17685     node->type      = sk->type;
    17686     sk->next        = node;
    17687     sk->data.x509   = x509;
    17688     sk->num        += 1;
    17689 
    17690     return WOLFSSL_SUCCESS;
     19014    return wolfSSL_sk_push(sk, x509);
    1769119015}
    1769219016
     
    1775319077#endif
    1775419078
    17755 
     19079#endif /* !NO_CERTS && OPENSSL_EXTRA */
     19080
     19081#if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
    1775619082/* Free's all nodes in X509 stack. This is different then wolfSSL_sk_X509_free
    1775719083 * in that it allows for choosing the function to use when freeing an X509s.
     
    1780419130}
    1780519131
    17806 #endif /* NO_CERTS && OPENSSL_EXTRA */
    17807 
    17808 #if defined(OPENSSL_ALL) || defined (WOLFSSL_QT)
     19132#endif /* !NO_CERTS && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
     19133
     19134#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    1780919135/* return 1 on success 0 on fail */
    1781019136int wolfSSL_sk_ACCESS_DESCRIPTION_push(WOLF_STACK_OF(ACCESS_DESCRIPTION)* sk,
    1781119137                                              WOLFSSL_ACCESS_DESCRIPTION* access)
    1781219138{
    17813     WOLFSSL_STACK* node;
    17814 
    1781519139    WOLFSSL_ENTER("wolfSSL_sk_ACCESS_DESCRIPTION_push");
    1781619140
    17817     if (sk == NULL || access == NULL) {
    17818         return WOLFSSL_FAILURE;
    17819     }
    17820 
    17821     /* no previous values in stack */
    17822     if (sk->data.access == NULL) {
    17823         sk->data.access = access;
    17824         sk->num += 1;
    17825         return WOLFSSL_SUCCESS;
    17826     }
    17827 
    17828     /* stack already has value(s) create a new node and add more */
    17829     node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
    17830                                    DYNAMIC_TYPE_ASN1);
    17831     if (node == NULL) {
    17832         WOLFSSL_MSG("Memory error");
    17833         return WOLFSSL_FAILURE;
    17834     }
    17835     XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
    17836 
    17837     /* push new obj onto head of stack */
    17838     node->data.access  = sk->data.access;
    17839     node->next         = sk->next;
    17840     node->type         = sk->type;
    17841     sk->next           = node;
    17842     sk->data.access    = access;
    17843     sk->num            += 1;
    17844 
    17845     return WOLFSSL_SUCCESS;
     19141    return wolfSSL_sk_push(sk, access);
    1784619142}
    1784719143
     
    1791319209    /* access = NULL, don't try to access or double free it */
    1791419210}
    17915 #endif
    17916 
    17917 #ifdef OPENSSL_EXTRA
     19211#endif /* OPENSSL_ALL || WOLFSSL_QT */
     19212
     19213#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    1791819214
    1791919215/* create a generic wolfSSL stack node
     
    1796719263int wolfSSL_sk_push(WOLFSSL_STACK* sk, const void *data)
    1796819264{
    17969     int ret = WOLFSSL_FAILURE;
     19265    WOLFSSL_STACK* node;
     19266#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
     19267    WOLFSSL_CIPHER ciph;
     19268#endif
    1797019269    WOLFSSL_ENTER("wolfSSL_sk_push");
    1797119270
     19271    if (!sk) {
     19272        return WOLFSSL_FAILURE;
     19273    }
     19274
     19275    /* Check if empty data */
    1797219276    switch (sk->type) {
    17973     #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    17974         case STACK_TYPE_X509:
    17975             ret = wolfSSL_sk_X509_push(sk, (WOLFSSL_X509*) data);
     19277#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
     19278        case STACK_TYPE_CIPHER:
     19279            /* check if entire struct is zero */
     19280            XMEMSET(&ciph, 0, sizeof(WOLFSSL_CIPHER));
     19281            if (XMEMCMP(&sk->data.cipher, &ciph,
     19282                    sizeof(WOLFSSL_CIPHER)) == 0) {
     19283                sk->data.cipher = *(WOLFSSL_CIPHER*)data;
     19284                sk->num = 1;
     19285                if (sk->hash_fn) {
     19286                    sk->hash = sk->hash_fn(&sk->data.cipher);
     19287                }
     19288                return WOLFSSL_SUCCESS;
     19289            }
    1797619290            break;
    17977         #ifndef NO_WOLFSSL_STUB
     19291#endif
     19292        default:
     19293            /* All other types are pointers */
     19294            if (!sk->data.generic) {
     19295                sk->data.generic = (void*)data;
     19296                sk->num = 1;
     19297#ifdef OPENSSL_ALL
     19298                if (sk->hash_fn) {
     19299                    sk->hash = sk->hash_fn(sk->data.generic);
     19300                }
     19301#endif
     19302                return WOLFSSL_SUCCESS;
     19303            }
     19304            break;
     19305    }
     19306
     19307    /* stack already has value(s) create a new node and add more */
     19308    node = wolfSSL_sk_new_node(sk->heap);
     19309    if (!node) {
     19310        WOLFSSL_MSG("Memory error");
     19311        return WOLFSSL_FAILURE;
     19312    }
     19313
     19314    /* push new x509 onto head of stack */
     19315    node->next      = sk->next;
     19316    node->type      = sk->type;
     19317    sk->next        = node;
     19318    sk->num        += 1;
     19319
     19320#ifdef OPENSSL_ALL
     19321    node->comp = sk->comp;
     19322    node->hash_fn = sk->hash_fn;
     19323    node->hash = sk->hash;
     19324    sk->hash = 0;
     19325#endif
     19326    switch (sk->type) {
     19327#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    1797819328        case STACK_TYPE_CIPHER:
    17979             ret = wolfSSL_sk_CIPHER_push(sk, (WOLFSSL_CIPHER*) data);
     19329            node->data.cipher = sk->data.cipher;
     19330            sk->data.cipher = *(WOLFSSL_CIPHER*)data;
     19331            if (sk->hash_fn) {
     19332                sk->hash = sk->hash_fn(&sk->data.cipher);
     19333            }
    1798019334            break;
    17981         #endif
    17982         case STACK_TYPE_GEN_NAME:
    17983             ret = wolfSSL_sk_ASN1_OBJECT_push(sk, (WOLFSSL_ASN1_OBJECT*) data);
     19335#endif
     19336        default:
     19337            /* All other types are pointers */
     19338            node->data.generic = sk->data.generic;
     19339            sk->data.generic = (void*)data;
     19340#ifdef OPENSSL_ALL
     19341            if (sk->hash_fn) {
     19342                sk->hash = sk->hash_fn(sk->data.generic);
     19343            }
     19344#endif
    1798419345            break;
    17985         case STACK_TYPE_ACCESS_DESCRIPTION:
    17986             ret = wolfSSL_sk_ACCESS_DESCRIPTION_push(sk,
    17987                                             (WOLFSSL_ACCESS_DESCRIPTION*) data);
    17988             break;
    17989         case STACK_TYPE_NULL:
    17990             ret = wolfSSL_sk_GENERIC_push(sk, (void*) data);
    17991             break;
    17992         case STACK_TYPE_OBJ:
    17993             ret = wolfSSL_sk_ASN1_OBJECT_push(sk, (WOLFSSL_ASN1_OBJECT*) data);
    17994             break;
    17995     #endif
    17996         default:
    17997             ret = wolfSSL_sk_ASN1_OBJECT_push(sk, (WOLFSSL_ASN1_OBJECT*) data);
    17998             break;
    17999     }
    18000 
    18001     return ret;
     19346    }
     19347
     19348    return WOLFSSL_SUCCESS;
    1800219349}
    1800319350
     
    1802419371}
    1802519372
     19373static WOLFSSL_GENERAL_NAME* wolfSSL_GENERAL_NAME_dup(WOLFSSL_GENERAL_NAME* gn)
     19374{
     19375    WOLFSSL_GENERAL_NAME* dupl = NULL;
     19376
     19377    WOLFSSL_ENTER("wolfSSL_GENERAL_NAME_dup");
     19378
     19379    if (!gn) {
     19380        WOLFSSL_MSG("Bad parameter");
     19381        return NULL;
     19382    }
     19383
     19384    if (!(dupl = wolfSSL_GENERAL_NAME_new())) {
     19385        WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
     19386        return NULL;
     19387    }
     19388
     19389    switch (gn->type) {
     19390    /* WOLFSSL_ASN1_STRING types */
     19391    case GEN_DNS:
     19392        if (!(dupl->d.dNSName = wolfSSL_ASN1_STRING_dup(gn->d.dNSName))) {
     19393            WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
     19394            goto error;
     19395        }
     19396        break;
     19397    case GEN_IPADD:
     19398        if (!(dupl->d.iPAddress = wolfSSL_ASN1_STRING_dup(gn->d.iPAddress))) {
     19399            WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
     19400            goto error;
     19401        }
     19402        break;
     19403    case GEN_EMAIL:
     19404        if (!(dupl->d.rfc822Name = wolfSSL_ASN1_STRING_dup(gn->d.rfc822Name))) {
     19405            WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
     19406            goto error;
     19407        }
     19408        break;
     19409    case GEN_URI:
     19410        if (!(dupl->d.uniformResourceIdentifier =
     19411                wolfSSL_ASN1_STRING_dup(gn->d.uniformResourceIdentifier))) {
     19412            WOLFSSL_MSG("wolfSSL_ASN1_STRING_dup error");
     19413            goto error;
     19414        }
     19415        break;
     19416    case GEN_OTHERNAME:
     19417    case GEN_X400:
     19418    case GEN_DIRNAME:
     19419    case GEN_EDIPARTY:
     19420    case GEN_RID:
     19421    default:
     19422        WOLFSSL_MSG("Unrecognized or unsupported GENERAL_NAME type");
     19423        goto error;
     19424    }
     19425
     19426    return dupl;
     19427error:
     19428    if (dupl) {
     19429        wolfSSL_GENERAL_NAME_free(dupl);
     19430    }
     19431    return NULL;
     19432}
     19433
     19434
    1802619435/* return 1 on success 0 on fail */
    18027 int wolfSSL_sk_GENERAL_NAME_push(WOLF_STACK_OF(WOLFSSL_GENERAL_NAME)* sk,
    18028                                                       WOLFSSL_GENERAL_NAME* gn)
     19436int wolfSSL_sk_GENERAL_NAME_push(WOLFSSL_GENERAL_NAMES* sk,
     19437                                 WOLFSSL_GENERAL_NAME* gn)
    1802919438{
    1803019439    WOLFSSL_STACK* node;
     
    1806119470    return WOLFSSL_SUCCESS;
    1806219471}
     19472
     19473#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     19474
     19475#ifdef OPENSSL_EXTRA
    1806319476
    1806419477/* Returns the general name at index i from the stack
     
    1810119514}
    1810219515
     19516#endif /* OPENSSL_EXTRA */
     19517
     19518#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
     19519
    1810319520/* Frees all nodes in a GENERAL NAME stack
    1810419521 *
     
    1814619563    wolfSSL_sk_GENERAL_NAME_pop_free(sk, NULL);
    1814719564}
    18148 
    18149 
     19565#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     19566
     19567#ifdef OPENSSL_EXTRA
    1815019568/* returns the number of nodes in stack on success and WOLFSSL_FATAL_ERROR
    1815119569 * on fail */
     
    1820319621    return NULL;
    1820419622}
    18205 
     19623#endif /* OPENSSL_EXTRA */
     19624
     19625#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    1820619626/* Frees GENERAL_NAME objects.
    1820719627*/
     
    1823319653    }
    1823419654}
    18235 
     19655#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     19656
     19657#ifdef OPENSSL_EXTRA
    1823619658void wolfSSL_GENERAL_NAMES_free(WOLFSSL_GENERAL_NAMES *gens)
    1823719659{
    18238     WOLFSSL_STACK* node;
    18239 
    1824019660    WOLFSSL_ENTER("wolfSSL_GENERAL_NAMES_free");
    1824119661
     
    1824419664    }
    1824519665
     19666    wolfSSL_sk_free(gens);
     19667}
     19668
     19669#if defined(OPENSSL_ALL)
     19670
     19671void *wolfSSL_lh_retrieve(WOLFSSL_STACK *sk, void *data)
     19672{
     19673    unsigned long hash;
     19674
     19675    WOLFSSL_ENTER("wolfSSL_lh_retrieve");
     19676
     19677    if (!sk || !data) {
     19678        WOLFSSL_MSG("Bad parameters");
     19679        return NULL;
     19680    }
     19681
     19682    if (!sk->hash_fn) {
     19683        WOLFSSL_MSG("No hash function defined");
     19684        return NULL;
     19685    }
     19686
     19687    hash = sk->hash_fn(data);
     19688
     19689    while (sk) {
     19690        /* Calc hash if not done so yet */
     19691        if (!sk->hash) {
     19692            switch (sk->type) {
     19693                case STACK_TYPE_CIPHER:
     19694                    sk->hash = sk->hash_fn(&sk->data.cipher);
     19695                    break;
     19696                default:
     19697                    sk->hash = sk->hash_fn(sk->data.generic);
     19698                    break;
     19699            }
     19700        }
     19701        if (sk->hash == hash) {
     19702            switch (sk->type) {
     19703                case STACK_TYPE_CIPHER:
     19704                    return &sk->data.cipher;
     19705                default:
     19706                    return sk->data.generic;
     19707            }
     19708        }
     19709        sk = sk->next;
     19710    }
     19711
     19712    return NULL;
     19713}
     19714
     19715/**
     19716 * This is the same hashing algo for WOLFSSL_CONF_VALUE as OpenSSL
     19717 */
     19718static unsigned long wolfSSL_CONF_VALUE_hash(const WOLFSSL_CONF_VALUE *val)
     19719{
     19720    if (val)
     19721        return (wolfSSL_LH_strhash(val->section) << 2) ^
     19722                wolfSSL_LH_strhash(val->name);
     19723    else
     19724        return 0;
     19725}
     19726
     19727static int wolfssl_conf_value_cmp(const WOLFSSL_CONF_VALUE *a,
     19728                                  const WOLFSSL_CONF_VALUE *b)
     19729{
     19730    int cmp_val;
     19731
     19732    if (!a || !b) {
     19733        return WOLFSSL_FATAL_ERROR;
     19734    }
     19735
     19736    if (a->section != b->section) {
     19737        if ((cmp_val = XSTRCMP(a->section, b->section)) != 0) {
     19738            return cmp_val;
     19739        }
     19740    }
     19741
     19742    if (a->name && b->name) {
     19743        return XSTRCMP(a->name, b->name);
     19744    }
     19745    else if (a->name == b->name) {
     19746        return 0;
     19747    }
     19748    else {
     19749        return a->name ? 1 : -1;
     19750    }
     19751}
     19752
     19753/* Use MD5 for hashing as OpenSSL uses a hash algorithm that is
     19754 * "not as good as MD5, but still good" so using MD5 should
     19755 * be good enough for this application. The produced hashes don't
     19756 * need to line up between OpenSSL and wolfSSL. The hashes are for
     19757 * internal indexing only */
     19758unsigned long wolfSSL_LH_strhash(const char *str)
     19759{
     19760    unsigned long ret = 0;
     19761    int strLen;
     19762    byte digest[WC_MD5_DIGEST_SIZE];
     19763    WOLFSSL_ENTER("wolfSSL_LH_strhash");
     19764
     19765    if (!str)
     19766        return 0;
     19767
     19768#ifndef NO_MD5
     19769    strLen = (int)XSTRLEN(str);
     19770    if (wc_Md5Hash((const byte*)str, strLen, digest) != 0) {
     19771        WOLFSSL_MSG("wc_Md5Hash error");
     19772        return 0;
     19773    }
     19774    /* Take first 4 bytes in small endian as unsigned long */
     19775    ret  =  (unsigned int)digest[0];
     19776    ret |= ((unsigned int)digest[1] << 8 );
     19777    ret |= ((unsigned int)digest[2] << 16);
     19778    ret |= ((unsigned int)digest[3] << 24);
     19779#else
     19780    WOLFSSL_MSG("No md5 available for wolfSSL_LH_strhash");
     19781#endif
     19782    return ret;
     19783}
     19784
     19785WOLFSSL_CONF_VALUE *wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(
     19786        WOLF_LHASH_OF(WOLFSSL_CONF_VALUE) *sk, WOLFSSL_CONF_VALUE *data)
     19787{
     19788    WOLFSSL_ENTER("wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve");
     19789
     19790    if (!sk || !data) {
     19791        WOLFSSL_MSG("Bad parameter");
     19792        return NULL;
     19793    }
     19794
     19795    return (WOLFSSL_CONF_VALUE*)wolfSSL_lh_retrieve(sk, data);
     19796}
     19797
     19798int wolfSSL_CONF_modules_load(const WOLFSSL_CONF *cnf, const char *appname,
     19799                      unsigned long flags)
     19800{
     19801    WOLFSSL_ENTER("wolfSSL_CONF_modules_load");
     19802    WOLFSSL_MSG("All wolfSSL modules are already compiled in. "
     19803                "wolfSSL_CONF_modules_load doesn't load anything new.");
     19804    (void)cnf;
     19805    (void)appname;
     19806    (void)flags;
     19807    return WOLFSSL_SUCCESS;
     19808}
     19809
     19810WOLFSSL_CONF_VALUE *wolfSSL_CONF_VALUE_new(void)
     19811{
     19812    WOLFSSL_CONF_VALUE* ret;
     19813
     19814    WOLFSSL_ENTER("wolfSSL_CONF_new");
     19815
     19816    ret = (WOLFSSL_CONF_VALUE*)XMALLOC(sizeof(WOLFSSL_CONF_VALUE),
     19817            NULL, DYNAMIC_TYPE_OPENSSL);
     19818    if (ret)
     19819        XMEMSET(ret, 0, sizeof(WOLFSSL_CONF_VALUE));
     19820    return ret;
     19821}
     19822
     19823int wolfSSL_CONF_add_string(WOLFSSL_CONF *conf,
     19824        WOLFSSL_CONF_VALUE *section, WOLFSSL_CONF_VALUE *value)
     19825{
     19826    WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
     19827
     19828    if (!conf || !section || !value) {
     19829        WOLFSSL_MSG("Bad parameter");
     19830        return WOLFSSL_FAILURE;
     19831    }
     19832
     19833    sk = (WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *)section->value;
     19834    value->section = section->section;
     19835
     19836    if (wolfSSL_sk_CONF_VALUE_push(sk, value) != WOLFSSL_SUCCESS) {
     19837        WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
     19838        return WOLFSSL_FAILURE;
     19839    }
     19840    if (wolfSSL_sk_CONF_VALUE_push(conf->data, value) != WOLFSSL_SUCCESS) {
     19841        WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
     19842        return WOLFSSL_FAILURE;
     19843    }
     19844
     19845    return WOLFSSL_SUCCESS;
     19846}
     19847
     19848WOLFSSL_CONF_VALUE *wolfSSL_CONF_new_section(WOLFSSL_CONF *conf,
     19849        const char *section)
     19850{
     19851    WOLFSSL_CONF_VALUE* ret = NULL;
     19852    WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
     19853    int slen;
     19854
     19855    WOLFSSL_ENTER("wolfSSL_CONF_new_section");
     19856
     19857    if (!conf || !section) {
     19858        WOLFSSL_MSG("Bad parameter");
     19859        return NULL;
     19860    }
     19861
     19862    slen = (int)XSTRLEN(section);
     19863
     19864    if (!(ret = wolfSSL_CONF_VALUE_new())) {
     19865        WOLFSSL_MSG("wolfSSL_CONF_new error");
     19866        goto error;
     19867    }
     19868
     19869    if (!(ret->section = (char*)XMALLOC(slen+1, NULL, DYNAMIC_TYPE_OPENSSL))) {
     19870        WOLFSSL_MSG("section malloc error");
     19871        goto error;
     19872    }
     19873    XMEMCPY(ret->section, section, slen+1);
     19874
     19875    if (!(sk = wolfSSL_sk_CONF_VALUE_new(NULL))) {
     19876        WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_new error");
     19877        goto error;
     19878    }
     19879
     19880    ret->value = (char*)sk;
     19881
     19882    if (wolfSSL_sk_CONF_VALUE_push(conf->data, ret) != WOLFSSL_SUCCESS) {
     19883        WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error");
     19884        goto error;
     19885    }
     19886
     19887    return ret;
     19888error:
     19889    if (ret) {
     19890        /* NULL so that wolfSSL_X509V3_conf_free doesn't attempt to free it */
     19891        ret->value = NULL;
     19892        wolfSSL_X509V3_conf_free(ret);
     19893    }
     19894    if (sk) {
     19895        wolfSSL_sk_CONF_VALUE_free(sk);
     19896    }
     19897    return NULL;
     19898}
     19899
     19900WOLFSSL_CONF_VALUE *wolfSSL_CONF_get_section(WOLFSSL_CONF *conf,
     19901        const char *section)
     19902{
     19903    WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
     19904
     19905    WOLFSSL_ENTER("wolfSSL_CONF_get_section");
     19906
     19907    if (!conf || !section) {
     19908        WOLFSSL_MSG("Bad parameter");
     19909        return NULL;
     19910    }
     19911
     19912    sk = conf->data;
     19913
     19914    while (sk) {
     19915        WOLFSSL_CONF_VALUE* val = sk->data.conf;
     19916        if (val) {
     19917            if (!val->name && XSTRCMP(section, val->section) == 0) {
     19918                return val;
     19919            }
     19920        }
     19921        sk = sk->next;
     19922    }
     19923
     19924    return NULL;
     19925}
     19926
     19927WOLFSSL_CONF *wolfSSL_NCONF_new(void *meth)
     19928{
     19929    WOLFSSL_CONF* ret;
     19930    WOLFSSL_ENTER("wolfSSL_NCONF_new");
     19931
     19932    if (meth) {
     19933        WOLFSSL_MSG("wolfSSL does not support CONF_METHOD");
     19934    }
     19935
     19936    ret = (WOLFSSL_CONF*)XMALLOC(sizeof(WOLFSSL_CONF), NULL, DYNAMIC_TYPE_OPENSSL);
     19937    if (ret) {
     19938        XMEMSET(ret, 0, sizeof(WOLFSSL_CONF));
     19939        ret->data = wolfSSL_sk_CONF_VALUE_new(NULL);
     19940        if (!ret->data) {
     19941            wolfSSL_NCONF_free(ret);
     19942            return NULL;
     19943        }
     19944    }
     19945    return ret;
     19946}
     19947
     19948char *wolfSSL_NCONF_get_string(const WOLFSSL_CONF *conf,
     19949        const char *group, const char *name)
     19950{
     19951    WOLFSSL_CONF_VALUE find_val;
     19952    WOLFSSL_CONF_VALUE *val;
     19953    WOLFSSL_ENTER("wolfSSL_NCONF_get_string");
     19954
     19955    if (!conf) {
     19956#ifdef HAVE_SECURE_GETENV
     19957        return secure_getenv(name);
     19958#else
     19959        WOLFSSL_MSG("Missing secure_getenv");
     19960        return NULL;
     19961#endif
     19962    }
     19963
     19964    find_val.name = (char *)name;
     19965    if (group) {
     19966        find_val.section = (char *)group;
     19967        val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
     19968        if (val)
     19969            return val->value;
     19970        if (XSTRCMP(group, "ENV") == 0) {
     19971#ifdef HAVE_SECURE_GETENV
     19972            return secure_getenv(name);
     19973#else
     19974        WOLFSSL_MSG("Missing secure_getenv");
     19975            return NULL;
     19976#endif
     19977        }
     19978    }
     19979
     19980    find_val.section = (char *)"default";
     19981    val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
     19982    if (val)
     19983        return val->value;
     19984    else
     19985        return NULL;
     19986}
     19987
     19988int wolfSSL_NCONF_get_number(const CONF *conf, const char *group,
     19989        const char *name, long *result)
     19990{
     19991    char *str;
     19992    WOLFSSL_ENTER("wolfSSL_NCONF_get_number");
     19993
     19994    if (!conf || !name || !result) {
     19995        WOLFSSL_MSG("Bad parameter");
     19996        return WOLFSSL_FAILURE;
     19997    }
     19998
     19999    if (!(str = wolfSSL_NCONF_get_string(conf, group, name))) {
     20000        WOLFSSL_MSG("wolfSSL_NCONF_get_string error");
     20001        return WOLFSSL_FAILURE;
     20002    }
     20003
     20004    *result = atol(str);
     20005    return WOLFSSL_SUCCESS;
     20006}
     20007
     20008/**
     20009 * The WOLFSSL_CONF->value member is treated as a
     20010 * WOLFSSL_STACK_OF(WOLFSSL_CONF_VALUE) which becomes
     20011 * the return value.
     20012 * @param conf
     20013 * @param section
     20014 * @return WOLFSSL_STACK_OF(WOLFSSL_CONF_VALUE)
     20015 */
     20016WOLFSSL_STACK *wolfSSL_NCONF_get_section(
     20017        const WOLFSSL_CONF *conf, const char *section)
     20018{
     20019    WOLFSSL_CONF_VALUE *val;
     20020    WOLFSSL_CONF_VALUE find_val;
     20021
     20022    WOLFSSL_ENTER("wolfSSL_NCONF_get_section");
     20023
     20024    if (!conf || !section) {
     20025        WOLFSSL_MSG("Bad parameter");
     20026        return NULL;
     20027    }
     20028
     20029    find_val.name = NULL;
     20030    find_val.section = (char*)section;
     20031    val = wolfSSL_lh_WOLFSSL_CONF_VALUE_retrieve(conf->data, &find_val);
     20032    if (val)
     20033        return (WOLFSSL_STACK*)val->value;
     20034    else
     20035        return NULL;
     20036}
     20037
     20038static WOLFSSL_CONF_VALUE *wolfSSL_CONF_VALUE_new_values(char* section,
     20039        char* name, char* value)
     20040{
     20041    WOLFSSL_CONF_VALUE* ret;
     20042    int len;
     20043
     20044    WOLFSSL_ENTER("wolfSSL_CONF_VALUE_new_values");
     20045
     20046    if (!(ret = wolfSSL_CONF_VALUE_new())) {
     20047        WOLFSSL_MSG("wolfSSL_CONF_VALUE_new error");
     20048        return NULL;
     20049    }
     20050
     20051    if (section) {
     20052        len = (int)XSTRLEN(section);
     20053        ret->section = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
     20054        if (!ret->section) {
     20055            WOLFSSL_MSG("malloc error");
     20056            wolfSSL_X509V3_conf_free(ret);
     20057            return NULL;
     20058        }
     20059        XMEMCPY(ret->section, section, len+1);
     20060    }
     20061
     20062    if (name) {
     20063        len = (int)XSTRLEN(name);
     20064        ret->name = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
     20065        if (!ret->name) {
     20066            WOLFSSL_MSG("malloc error");
     20067            wolfSSL_X509V3_conf_free(ret);
     20068            return NULL;
     20069        }
     20070        XMEMCPY(ret->name, name, len+1);
     20071    }
     20072
     20073    if (value) {
     20074        len = (int)XSTRLEN(value);
     20075        ret->value = (char*)XMALLOC(len+1, NULL, DYNAMIC_TYPE_OPENSSL);
     20076        if (!ret->value) {
     20077            WOLFSSL_MSG("malloc error");
     20078            wolfSSL_X509V3_conf_free(ret);
     20079            return NULL;
     20080        }
     20081        XMEMCPY(ret->value, value, len+1);
     20082    }
     20083
     20084    return ret;
     20085}
     20086
     20087static char* expandValue(WOLFSSL_CONF *conf, const char* section,
     20088        char *str)
     20089{
     20090    int strLen = (int)XSTRLEN(str);
     20091    char* ret = NULL;
     20092
     20093    /* Check to see if there is anything to expand */
     20094    if (XSTRNSTR(str, "$", strLen)) {
     20095        int idx = 0;
     20096        char* strIdx = str;
     20097        ret = (char*)XMALLOC(strLen + 1, NULL, DYNAMIC_TYPE_OPENSSL);
     20098        if (!ret) {
     20099            WOLFSSL_MSG("malloc error");
     20100            return str;
     20101        }
     20102
     20103        while (*strIdx) {
     20104            if (*strIdx == '$') {
     20105                /* Expand variable */
     20106                char* startIdx = ++strIdx;
     20107                char* endIdx;
     20108                const char* s = section;
     20109                const char* value;
     20110                char prevValue;
     20111
     20112                if (*startIdx == '{') {
     20113                    /* First read the section.
     20114                     * format: ${section_name::var_name} */
     20115                    s = ++startIdx;
     20116                    while (*strIdx && *strIdx != ':') strIdx++;
     20117                    if (!*strIdx || s == strIdx || strIdx[1] != ':') {
     20118                        WOLFSSL_MSG("invalid section name in "
     20119                                    "variable expansion");
     20120                        goto expand_cleanup;
     20121                    }
     20122                    *strIdx = '\0';
     20123                    strIdx += 2;
     20124                    startIdx = strIdx;
     20125                }
     20126                while (*strIdx && (XISALNUM(*strIdx) || *strIdx == '_'))
     20127                    strIdx++;
     20128                endIdx = strIdx;
     20129                if (startIdx == endIdx) {
     20130                    WOLFSSL_MSG("invalid variable name in config");
     20131                    goto expand_cleanup;
     20132                }
     20133                if (s != section) {
     20134                    /* We are expecting a trailing '}' */
     20135                    if (*strIdx != '}') {
     20136                        WOLFSSL_MSG("Missing '}' in variable");
     20137                        goto expand_cleanup;
     20138                    }
     20139                    strIdx++;
     20140                }
     20141                /* Save char value at the end of the name so that we can place
     20142                 * a null char there. */
     20143                prevValue = *endIdx;
     20144                *endIdx = '\0';
     20145                value = wolfSSL_NCONF_get_string(conf, s, startIdx);
     20146                *endIdx = prevValue;
     20147                /* Skip copy if no value or zero-length value */
     20148                if (value && *value) {
     20149                    int valueLen = (int)XSTRLEN(value);
     20150                    char* newRet;
     20151                    /* This will allocate slightly more memory than necessary
     20152                     * but better be safe */
     20153                    strLen += valueLen;
     20154                    newRet = (char*)XREALLOC(ret, strLen + 1, NULL,
     20155                            DYNAMIC_TYPE_OPENSSL);
     20156                    if (!newRet) {
     20157                        WOLFSSL_MSG("realloc error");
     20158                        goto expand_cleanup;
     20159                    }
     20160                    ret = newRet;
     20161                    XMEMCPY(ret + idx, value, valueLen);
     20162                    idx += valueLen;
     20163                }
     20164            }
     20165            else {
     20166                ret[idx++] = *strIdx++;
     20167            }
     20168        }
     20169        ret[idx] = '\0';
     20170    }
     20171
     20172    return ret ? ret : str;
     20173
     20174expand_cleanup:
     20175    if (ret)
     20176        XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
     20177    return NULL;
     20178}
     20179
     20180#define SKIP_WHITESPACE(idx, max_idx) \
     20181    while (idx < max_idx && (*idx == ' ' || *idx == '\t')) \
     20182        {idx++;}
     20183int wolfSSL_NCONF_load(WOLFSSL_CONF *conf, const char *file, long *eline)
     20184{
     20185    int ret = WOLFSSL_FAILURE;
     20186    WOLFSSL_BIO *in = NULL;
     20187    char* buf = NULL;
     20188    char* idx = NULL;
     20189    char* bufEnd = NULL;
     20190    CONF_VALUE* section = NULL;
     20191    long line = 0;
     20192    int bufLen = 0;
     20193
     20194    if (!conf || !file) {
     20195        WOLFSSL_MSG("Bad parameter");
     20196        return WOLFSSL_FAILURE;
     20197    }
     20198
     20199    /* Open file */
     20200    if (!(in = wolfSSL_BIO_new_file(file, "rb"))) {
     20201        WOLFSSL_MSG("wolfSSL_BIO_new_file error");
     20202        return WOLFSSL_FAILURE;
     20203    }
     20204
     20205    /* Read file */
     20206    bufLen = wolfSSL_BIO_get_len(in);
     20207    if (bufLen <= 0) {
     20208        WOLFSSL_MSG("wolfSSL_BIO_get_len error");
     20209        goto cleanup;
     20210    }
     20211    if (!(buf = (char*)XMALLOC(bufLen + 1, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
     20212        WOLFSSL_MSG("malloc error");
     20213        goto cleanup;
     20214    }
     20215    if (wolfSSL_BIO_read(in, buf, bufLen) != bufLen) {
     20216        WOLFSSL_MSG("wolfSSL_BIO_read error");
     20217        goto cleanup;
     20218    }
     20219
     20220    if (!(section = wolfSSL_CONF_new_section(conf, "default"))) {
     20221        WOLFSSL_MSG("wolfSSL_CONF_new_section error");
     20222        goto cleanup;
     20223    }
     20224
     20225    /* LETS START READING SOME CONFIGS */
     20226    idx = buf;
     20227    bufEnd = buf + bufLen;
     20228    while (idx < bufEnd) {
     20229        char* lineEnd = XSTRNSTR(idx, "\n", (unsigned int)(bufEnd - idx));
     20230        char* maxIdx;
     20231        if (!lineEnd)
     20232            lineEnd = bufEnd; /* Last line in file */
     20233        maxIdx = XSTRNSTR(idx, "#", (unsigned int)(lineEnd - idx));
     20234        if (!maxIdx)
     20235            maxIdx = lineEnd;
     20236        line++;
     20237        SKIP_WHITESPACE(idx, maxIdx);
     20238        if (idx == maxIdx) {
     20239            /* Empty line */
     20240            idx = lineEnd + 1;
     20241            continue;
     20242        }
     20243
     20244        if (*idx == '[') {
     20245            /* New section. Spaces not allowed in section name. */
     20246            char* sectionName;
     20247            int sectionNameLen;
     20248
     20249            if (idx < maxIdx)
     20250                idx++;
     20251            else {
     20252                WOLFSSL_MSG("Invalid section definition.");
     20253                goto cleanup;
     20254            }
     20255
     20256            SKIP_WHITESPACE(idx, maxIdx);
     20257            sectionName = idx;
     20258            /* Find end of section name */
     20259            while (idx < maxIdx && *idx != ' ' && *idx != ']')
     20260                idx++;
     20261            sectionNameLen = (int)(idx - sectionName);
     20262            SKIP_WHITESPACE(idx, maxIdx);
     20263
     20264            if (*idx != ']') {
     20265                WOLFSSL_MSG("Section definition error. "
     20266                            "Closing brace not found.");
     20267                goto cleanup;
     20268            }
     20269
     20270            sectionName[sectionNameLen] = '\0';
     20271            if (!(section = wolfSSL_CONF_get_section(conf, sectionName)))
     20272                section = wolfSSL_CONF_new_section(conf, sectionName);
     20273        }
     20274        else {
     20275            char* name;
     20276            int   nameLen;
     20277            char* value;
     20278            char* exValue; /* expanded value */
     20279            int   valueLen;
     20280            WOLFSSL_CONF_VALUE* newVal = NULL;
     20281
     20282            SKIP_WHITESPACE(idx, maxIdx);
     20283            name = idx;
     20284            /* Find end of name */
     20285            while (idx < maxIdx && *idx != ' ' && *idx != '=')
     20286                idx++;
     20287            nameLen = (int)(idx - name);
     20288            SKIP_WHITESPACE(idx, maxIdx);
     20289            if (*idx != '=') {
     20290                WOLFSSL_MSG("Missing equals sign");
     20291                goto cleanup;
     20292            }
     20293            idx++;
     20294            SKIP_WHITESPACE(idx, maxIdx);
     20295            value = idx;
     20296            /* Find end of value */
     20297            idx = maxIdx-1;
     20298            while (idx >= value && (*idx == ' ' || *idx == '\t'))
     20299                idx--;
     20300            valueLen = (int)(idx - value + 1);
     20301
     20302            /* Sanity checks */
     20303            if (nameLen <= 0 || valueLen <= 0) {
     20304                WOLFSSL_MSG("Sanity checks failed");
     20305                goto cleanup;
     20306            }
     20307            name[nameLen] = '\0';
     20308            value[valueLen] = '\0';
     20309
     20310            if (!(exValue = expandValue(conf, section->section, value))) {
     20311                WOLFSSL_MSG("Variable expansion failed");
     20312                goto cleanup;
     20313            }
     20314
     20315            if (!(newVal = wolfSSL_CONF_VALUE_new_values(NULL,
     20316                    name, exValue))) {
     20317                WOLFSSL_MSG("wolfSSL_CONF_VALUE_new_values error");
     20318                if (exValue != value)
     20319                    XFREE(exValue, NULL, DYNAMIC_TYPE_OPENSSL);
     20320                goto cleanup;
     20321            }
     20322
     20323            if (exValue != value)
     20324                XFREE(exValue, NULL, DYNAMIC_TYPE_OPENSSL);
     20325
     20326            if (wolfSSL_CONF_add_string(conf, section, newVal) !=
     20327                    WOLFSSL_SUCCESS) {
     20328                WOLFSSL_MSG("wolfSSL_CONF_add_string error");
     20329                goto cleanup;
     20330            }
     20331        }
     20332        idx = lineEnd + 1;
     20333    }
     20334
     20335    ret = WOLFSSL_SUCCESS;
     20336cleanup:
     20337    if (in)
     20338        wolfSSL_BIO_free(in);
     20339    if (buf)
     20340        XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     20341    if (eline)
     20342        *eline = line;
     20343    return ret;
     20344}
     20345
     20346
     20347void wolfSSL_NCONF_free(WOLFSSL_CONF *conf)
     20348{
     20349    WOLFSSL_ENTER("wolfSSL_NCONF_free");
     20350    if (conf) {
     20351        wolfSSL_sk_CONF_VALUE_free(conf->data);
     20352        XFREE(conf, NULL, DYNAMIC_TYPE_OPENSSL);
     20353    }
     20354}
     20355
     20356void wolfSSL_X509V3_conf_free(WOLFSSL_CONF_VALUE *val)
     20357{
     20358    WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *sk = NULL;
     20359
     20360    if (val) {
     20361        if (val->name) {
     20362            /* Not a section. Don't free section as it is a shared pointer. */
     20363            XFREE(val->name, NULL, DYNAMIC_TYPE_OPENSSL);
     20364            if (val->value)
     20365                XFREE(val->value, NULL, DYNAMIC_TYPE_OPENSSL);
     20366        }
     20367        else {
     20368            /* Section so val->value is a stack */
     20369            if (val->section)
     20370                XFREE(val->section, NULL, DYNAMIC_TYPE_OPENSSL);
     20371            /* Only free the stack structures. The contained conf values
     20372             * will be freed in wolfSSL_NCONF_free */
     20373            sk = (WOLF_STACK_OF(WOLFSSL_CONF_VALUE)*)val->value;
     20374            while (sk) {
     20375                WOLF_STACK_OF(WOLFSSL_CONF_VALUE) *tmp = sk->next;
     20376                XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
     20377                sk = tmp;
     20378            }
     20379        }
     20380        XFREE(val, NULL, DYNAMIC_TYPE_OPENSSL);
     20381    }
     20382}
     20383
     20384WOLFSSL_STACK *wolfSSL_sk_CONF_VALUE_new(wolf_sk_compare_cb compFunc)
     20385{
     20386    WOLFSSL_STACK* ret;
     20387    WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_new");
     20388    ret = wolfSSL_sk_new_node(NULL);
     20389    if (!ret)
     20390        return NULL;
     20391    ret->comp = compFunc ? compFunc : (wolf_sk_compare_cb)wolfssl_conf_value_cmp;
     20392    ret->hash_fn = (wolf_sk_hash_cb)wolfSSL_CONF_VALUE_hash;
     20393    ret->type = STACK_TYPE_CONF_VALUE;
     20394    return ret;
     20395}
     20396
     20397/* Free the structure for WOLFSSL_CONF_VALUE stack
     20398 *
     20399 * sk  stack to free nodes in
     20400 */
     20401void wolfSSL_sk_CONF_VALUE_free(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk)
     20402{
     20403    WOLFSSL_STACK* tmp;
     20404    WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_free");
     20405
     20406    if (sk == NULL)
     20407        return;
     20408
    1824620409    /* parse through stack freeing each node */
    18247     node = gens->next;
    18248     while (gens->num > 1) {
    18249         WOLFSSL_STACK* tmp = node;
    18250         node = node->next;
    18251 
    18252         wolfSSL_ASN1_OBJECT_free(tmp->data.obj);
    18253         XFREE(tmp, NULL, DYNAMIC_TYPE_ASN1);
    18254         gens->num -= 1;
    18255     }
    18256 
    18257     /* free head of stack */
    18258     if (gens->num == 1) {
    18259         wolfSSL_ASN1_OBJECT_free(gens->data.obj);
    18260     }
    18261     XFREE(gens, NULL, DYNAMIC_TYPE_ASN1);
    18262 }
    18263 
    18264 #if defined(OPENSSL_ALL)
     20410    while (sk) {
     20411        tmp = sk->next;
     20412        wolfSSL_X509V3_conf_free(sk->data.conf);
     20413        XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
     20414        sk = tmp;
     20415    }
     20416}
     20417
     20418int wolfSSL_sk_CONF_VALUE_num(const WOLFSSL_STACK *sk)
     20419{
     20420    WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_num");
     20421    if (sk)
     20422        return wolfSSL_sk_num(sk);
     20423    return 0;
     20424}
     20425
     20426WOLFSSL_CONF_VALUE *wolfSSL_sk_CONF_VALUE_value(const WOLFSSL_STACK *sk, int i)
     20427{
     20428    WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_value");
     20429    if (sk)
     20430        return (WOLFSSL_CONF_VALUE*)wolfSSL_sk_value(sk, i);
     20431    return NULL;
     20432}
     20433
     20434/* return 1 on success 0 on fail */
     20435int wolfSSL_sk_CONF_VALUE_push(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk,
     20436        WOLFSSL_CONF_VALUE* val)
     20437{
     20438    WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_push");
     20439
     20440    if (sk == NULL || val == NULL) {
     20441        return WOLFSSL_FAILURE;
     20442    }
     20443
     20444    return wolfSSL_sk_push(sk, val);
     20445}
     20446
    1826520447WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* wolfSSL_sk_X509_EXTENSION_new_null(void)
    1826620448{
     
    1850720689}
    1850820690
     20691#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
    1850920692/* Converts DER encoded DH parameters to a WOLFSSL_DH structure.
    1851020693 *
     
    1855520738    return newDH;
    1855620739}
     20740#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
    1855720741
    1855820742/* Converts internal WOLFSSL_DH structure to DER encoded DH.
     
    1860520789#endif /* OPENSSL_EXTRA */
    1860620790
    18607 #ifndef NO_FILESYSTEM
    18608 
    18609 #ifndef NO_STDIO_FILESYSTEM
     20791#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
    1861020792
    1861120793WOLFSSL_X509* wolfSSL_X509_d2i_fp(WOLFSSL_X509** x509, XFILE file)
     
    1864520827}
    1864620828
    18647 #endif /* NO_STDIO_FILESYSTEM */
    18648 
     20829#endif /* OPENSSL_EXTRA && !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */
     20830
     20831#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
     20832    defined(KEEP_PEER_CERT) || defined(SESSION_CERTS)
     20833   
     20834#ifndef NO_FILESYSTEM
    1864920835WOLFSSL_ABI
    1865020836WOLFSSL_X509* wolfSSL_X509_load_certificate_file(const char* fname, int format)
     
    1871120897    return x509;
    1871220898}
    18713 
    18714 #endif /* NO_FILESYSTEM */
    18715 
    18716 
    18717 WOLFSSL_X509* wolfSSL_X509_load_certificate_buffer(
    18718     const unsigned char* buf, int sz, int format)
    18719 {
     20899#endif /* !NO_FILESYSTEM */
     20900
     20901static WOLFSSL_X509* loadX509orX509REQFromBuffer(
     20902    const unsigned char* buf, int sz, int format, int type)
     20903{
     20904
    1872020905    int ret;
    1872120906    WOLFSSL_X509* x509 = NULL;
     
    1872620911    if (format == WOLFSSL_FILETYPE_PEM) {
    1872720912    #ifdef WOLFSSL_PEM_TO_DER
    18728         if (PemToDer(buf, sz, CERT_TYPE, &der, NULL, NULL, NULL) != 0) {
     20913        if (PemToDer(buf, sz, type, &der, NULL, NULL, NULL) != 0) {
    1872920914            FreeDer(&der);
    1873020915        }
     
    1873420919    }
    1873520920    else {
    18736         ret = AllocDer(&der, (word32)sz, CERT_TYPE, NULL);
     20921        ret = AllocDer(&der, (word32)sz, type, NULL);
    1873720922        if (ret == 0) {
    1873820923            XMEMCPY(der->buffer, buf, sz);
     
    1875620941        {
    1875720942            InitDecodedCert(cert, der->buffer, der->length, NULL);
    18758             if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0) {
     20943            if (ParseCertRelative(cert, type, 0, NULL) == 0) {
    1875920944                x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL,
    1876020945                                                             DYNAMIC_TYPE_X509);
     
    1877920964    return x509;
    1878020965}
     20966
     20967WOLFSSL_X509* wolfSSL_X509_load_certificate_buffer(
     20968    const unsigned char* buf, int sz, int format)
     20969{
     20970    return loadX509orX509REQFromBuffer(buf, sz,
     20971            format, CERT_TYPE);
     20972}
     20973
     20974#ifdef WOLFSSL_CERT_REQ
     20975WOLFSSL_X509* wolfSSL_X509_REQ_load_certificate_buffer(
     20976    const unsigned char* buf, int sz, int format)
     20977{
     20978    return loadX509orX509REQFromBuffer(buf, sz,
     20979            format, CERTREQ_TYPE);
     20980}
     20981#endif
    1878120982
    1878220983#endif /* KEEP_PEER_CERT || SESSION_CERTS */
     
    1882621027    return NULL;
    1882721028}
     21029
     21030WOLFSSL_X509* wolfSSL_CTX_get0_certificate(WOLFSSL_CTX* ctx)
     21031{
     21032    if (ctx) {
     21033        if (ctx->ourCert == NULL) {
     21034            if (ctx->certificate == NULL) {
     21035                WOLFSSL_MSG("Ctx Certificate buffer not set!");
     21036                return NULL;
     21037            }
     21038            #ifndef WOLFSSL_X509_STORE_CERTS
     21039            ctx->ourCert = wolfSSL_X509_d2i(NULL,
     21040                                           ctx->certificate->buffer,
     21041                                           ctx->certificate->length);
     21042            #endif
     21043            ctx->ownOurCert = 1;
     21044        }
     21045        return ctx->ourCert;
     21046    }
     21047    return NULL;
     21048}
    1882821049#endif /* OPENSSL_EXTRA && KEEP_OUR_CERT */
    1882921050#endif /* NO_CERTS */
    1883021051
    1883121052
    18832 #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    18833 #ifndef NO_ASN
     21053#if !defined(NO_ASN) && (defined(OPENSSL_EXTRA) || \
     21054        defined(OPENSSL_EXTRA_X509_SMALL))
    1883421055void wolfSSL_ASN1_OBJECT_free(WOLFSSL_ASN1_OBJECT* obj)
    1883521056{
     
    1885321074    }
    1885421075}
    18855 #endif /* NO_ASN */
    18856 #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
    18857 
    18858 #ifdef OPENSSL_EXTRA
    18859 #ifndef NO_ASN
     21076
    1886021077WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_new(void)
    1886121078{
     
    1887721094}
    1887821095
     21096WOLFSSL_ASN1_OBJECT* wolfSSL_ASN1_OBJECT_dup(WOLFSSL_ASN1_OBJECT* obj)
     21097{
     21098    WOLFSSL_ASN1_OBJECT* dupl = NULL;
     21099
     21100    WOLFSSL_ENTER("wolfSSL_ASN1_OBJECT_dup");
     21101
     21102    if (!obj) {
     21103        WOLFSSL_MSG("Bad parameter");
     21104        return NULL;
     21105    }
     21106    dupl = wolfSSL_ASN1_OBJECT_new();
     21107    if (!dupl) {
     21108        WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
     21109        return NULL;
     21110    }
     21111    /* Copy data */
     21112    XMEMCPY(dupl->sName, obj->sName, WOLFSSL_MAX_SNAME);
     21113    dupl->type = obj->type;
     21114    dupl->grp = obj->grp;
     21115    dupl->nid = obj->nid;
     21116    dupl->objSz = obj->objSz;
     21117    if (obj->obj) {
     21118        dupl->obj = (const unsigned char*)XMALLOC(
     21119                obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
     21120        if (!dupl->obj) {
     21121            WOLFSSL_MSG("ASN1 obj malloc error");
     21122            wolfSSL_ASN1_OBJECT_free(dupl);
     21123            return NULL;
     21124        }
     21125        XMEMCPY((byte*)dupl->obj, obj->obj, obj->objSz);
     21126        dupl->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
     21127    }
     21128    return dupl;
     21129}
     21130#endif /* !NO_ASN && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
     21131
     21132#ifndef NO_ASN
     21133#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    1887921134/* Creates and returns a new WOLFSSL_CIPHER stack. */
    1888021135WOLFSSL_STACK* wolfSSL_sk_new_asn1_obj(void)
     
    1889521150                                              WOLFSSL_ASN1_OBJECT* obj)
    1889621151{
    18897     WOLFSSL_STACK* node;
    18898 
    1889921152    WOLFSSL_ENTER("wolfSSL_sk_ASN1_OBJECT_push");
    1890021153
     
    1890321156    }
    1890421157
    18905     /* no previous values in stack */
    18906     if (sk->data.obj == NULL) {
    18907         sk->data.obj = obj;
    18908         sk->num += 1;
    18909         return WOLFSSL_SUCCESS;
    18910     }
    18911 
    18912     /* stack already has value(s) create a new node and add more */
    18913     node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
    18914                                                              DYNAMIC_TYPE_ASN1);
    18915     if (node == NULL) {
    18916         WOLFSSL_MSG("Memory error");
    18917         return WOLFSSL_FAILURE;
    18918     }
    18919     XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
    18920 
    18921     /* push new obj onto head of stack */
    18922     node->data.obj  = sk->data.obj;
    18923     node->next      = sk->next;
    18924     node->type      = sk->type;
    18925     sk->next        = node;
    18926     sk->data.obj    = obj;
    18927     sk->num        += 1;
    18928 
    18929     return WOLFSSL_SUCCESS;
     21158    return wolfSSL_sk_push(sk, obj);
    1893021159}
    1893121160
     
    1901521244}
    1901621245
     21246#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     21247#endif /* !NO_ASN */
     21248
     21249#ifdef OPENSSL_EXTRA
     21250#ifndef NO_ASN
     21251
    1901721252int wolfSSL_ASN1_STRING_to_UTF8(unsigned char **out, WOLFSSL_ASN1_STRING *in)
    1901821253{
     
    1904521280}
    1904621281
     21282int wolfSSL_ASN1_UNIVERSALSTRING_to_string(WOLFSSL_ASN1_STRING *s)
     21283{
     21284    char *idx;
     21285    char *copy;
     21286    WOLFSSL_ENTER("wolfSSL_ASN1_UNIVERSALSTRING_to_string");
     21287
     21288    if (!s) {
     21289        WOLFSSL_MSG("Bad parameter");
     21290        return WOLFSSL_FAILURE;
     21291    }
     21292
     21293    if (s->type != V_ASN1_UNIVERSALSTRING) {
     21294        WOLFSSL_MSG("Input is not a universal string");
     21295        return WOLFSSL_FAILURE;
     21296    }
     21297
     21298    if ((s->length % 4) != 0) {
     21299        WOLFSSL_MSG("Input string must be divisible by 4");
     21300        return WOLFSSL_FAILURE;
     21301    }
     21302
     21303    for (idx = s->data; idx < s->data + s->length; idx += 4)
     21304        if ((idx[0] != '\0') || (idx[1] != '\0') || (idx[2] != '\0'))
     21305            break;
     21306
     21307    if (idx != s->data + s->length) {
     21308        WOLFSSL_MSG("Wrong string format");
     21309        return WOLFSSL_FAILURE;
     21310    }
     21311
     21312    for (copy = idx = s->data; idx < s->data + s->length; idx += 4)
     21313        *copy++ = idx[3];
     21314    *copy = '\0';
     21315    s->length /= 4;
     21316    s->type = V_ASN1_PRINTABLESTRING;
     21317    return WOLFSSL_SUCCESS;
     21318}
     21319
    1904721320/* Returns string representation of ASN1_STRING */
    1904821321char* wolfSSL_i2s_ASN1_STRING(WOLFSSL_v3_ext_method *method,
     
    1908921362}
    1909021363#endif /* NO_ASN */
    19091 
     21364#endif /* OPENSSL_EXTRA */
     21365
     21366#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    1909221367void wolfSSL_set_connect_state(WOLFSSL* ssl)
    1909321368{
     
    1911621391    }
    1911721392}
    19118 #endif /* OPENSSL_EXTRA */
     21393#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
    1911921394
    1912021395
     
    1914421419
    1914521420#if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
     21421
     21422/* return a new malloc'd session with default settings on success */
     21423static WOLFSSL_SESSION* NewSession(void)
     21424{
     21425    WOLFSSL_SESSION* ret = NULL;
     21426
     21427    ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), NULL,
     21428            DYNAMIC_TYPE_OPENSSL);
     21429    if (ret != NULL) {
     21430        XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION));
     21431        ret->isAlloced = 1;
     21432    }
     21433    return ret;
     21434}
     21435
     21436WOLFSSL_SESSION* wolfSSL_SESSION_new(void)
     21437{
     21438    WOLFSSL_SESSION* ret = NewSession();
     21439
     21440#ifdef OPENSSL_EXTRA
     21441    if (ret != NULL) {
     21442        if (wc_InitMutex(&ret->refMutex) != 0) {
     21443            WOLFSSL_MSG("Error setting up session reference mutex");
     21444            XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
     21445            return NULL;
     21446        }
     21447        ret->refCount = 1;
     21448    }
     21449#endif
     21450
     21451    return ret;
     21452}
     21453
     21454/* add one to session reference count
     21455 * return WOFLSSL_SUCCESS on success and WOLFSSL_FAILURE on error */
     21456int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session)
     21457{
     21458    if (session == NULL)
     21459        return WOLFSSL_FAILURE;
     21460
     21461#ifdef OPENSSL_EXTRA
     21462    if (wc_LockMutex(&session->refMutex) != 0) {
     21463        WOLFSSL_MSG("Failed to lock session mutex");
     21464    }
     21465    session->refCount++;
     21466    wc_UnLockMutex(&session->refMutex);
     21467#endif
     21468    return WOLFSSL_SUCCESS;
     21469}
     21470
     21471
    1914621472WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session)
    1914721473{
     
    1916021486#endif
    1916121487
    19162     copy = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), NULL,
    19163             DYNAMIC_TYPE_OPENSSL);
     21488    copy = NewSession();
    1916421489    if (copy != NULL) {
    1916521490        XMEMCPY(copy, session, sizeof(WOLFSSL_SESSION));
    1916621491        copy->isAlloced = 1;
     21492#ifdef OPENSSL_EXTRA
     21493        if (wc_InitMutex(&copy->refMutex) != 0) {
     21494            WOLFSSL_MSG("Error setting up session reference mutex");
     21495            XFREE(copy, NULL, DYNAMIC_TYPE_OPENSSL);
     21496            return NULL;
     21497        }
     21498        copy->refCount = 1;
     21499#endif
    1916721500#ifdef HAVE_SESSION_TICKET
    1916821501        if (session->isDynamic) {
     
    1918721520}
    1918821521
    19189 void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
     21522void FreeSession(WOLFSSL_SESSION* session, int isAlloced)
    1919021523{
    1919121524    if (session == NULL)
     
    1919521528    if (session->peer) {
    1919621529        wolfSSL_X509_free(session->peer);
    19197     }
    19198 #endif
    19199 
    19200 #ifdef HAVE_EXT_CACHE
    19201     if (session->isAlloced) {
     21530        session->peer = NULL;
     21531    }
     21532#endif
     21533
     21534#ifdef OPENSSL_EXTRA
     21535    /* refCount will always be 1 or more if created externally.
     21536     * Internal cache sessions don't initialize a refMutex. */
     21537    if (session->refCount > 0) {
     21538        if (wc_LockMutex(&session->refMutex) != 0) {
     21539            WOLFSSL_MSG("Failed to lock session mutex");
     21540        }
     21541        if (session->refCount > 1) {
     21542            session->refCount--;
     21543            wc_UnLockMutex(&session->refMutex);
     21544            return;
     21545        }
     21546        wc_UnLockMutex(&session->refMutex);
     21547    }
     21548#endif
     21549#if defined(HAVE_EXT_CACHE) || defined(OPENSSL_EXTRA)
     21550    if (isAlloced) {
    1920221551    #ifdef HAVE_SESSION_TICKET
    1920321552        if (session->isDynamic)
     
    1920921558    /* No need to free since cache is static */
    1921021559    (void)session;
    19211 #endif
    19212 }
    19213 #endif
     21560    (void)isAlloced;
     21561#endif
     21562}
     21563
     21564void wolfSSL_SESSION_free(WOLFSSL_SESSION* session)
     21565{
     21566    if (session == NULL)
     21567        return;
     21568   
     21569#if defined(HAVE_EXT_CACHE) || defined(OPENSSL_EXTRA)
     21570    FreeSession(session, session->isAlloced);
     21571#else
     21572    FreeSession(session, 0);
     21573#endif
     21574}
     21575#endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */
    1921421576
    1921521577
    1921621578/* helper function that takes in a protocol version struct and returns string */
    19217 static const char* wolfSSL_internal_get_version(ProtocolVersion* version)
     21579static const char* wolfSSL_internal_get_version(const ProtocolVersion* version)
    1921821580{
    1921921581    WOLFSSL_ENTER("wolfSSL_get_version");
     
    1922521587    if (version->major == SSLv3_MAJOR) {
    1922621588        switch (version->minor) {
    19227         #ifndef NO_OLD_TLS
    19228             #ifdef WOLFSSL_ALLOW_SSLV3
    1922921589            case SSLv3_MINOR :
    1923021590                return "SSLv3";
    19231             #endif
    19232             #ifdef WOLFSSL_ALLOW_TLSV10
    1923321591            case TLSv1_MINOR :
    1923421592                return "TLSv1";
    19235             #endif
    1923621593            case TLSv1_1_MINOR :
    1923721594                return "TLSv1.1";
    19238         #endif
    1923921595            case TLSv1_2_MINOR :
    1924021596                return "TLSv1.2";
    19241         #ifdef WOLFSSL_TLS13
    1924221597            case TLSv1_3_MINOR :
    19243             #ifdef WOLFSSL_TLS13_DRAFT
    19244                 #ifdef WOLFSSL_TLS13_DRAFT_18
    19245                     return "TLSv1.3 (Draft 18)";
    19246                 #elif defined(WOLFSSL_TLS13_DRAFT_22)
    19247                     return "TLSv1.3 (Draft 22)";
    19248                 #elif defined(WOLFSSL_TLS13_DRAFT_23)
    19249                     return "TLSv1.3 (Draft 23)";
    19250                 #elif defined(WOLFSSL_TLS13_DRAFT_26)
    19251                     return "TLSv1.3 (Draft 26)";
    19252                 #else
    19253                     return "TLSv1.3 (Draft 28)";
    19254                 #endif
    19255             #else
    1925621598                return "TLSv1.3";
    19257             #endif
    19258         #endif
    1925921599            default:
    1926021600                return "unknown";
     
    1927721617
    1927821618
    19279 const char* wolfSSL_get_version(WOLFSSL* ssl)
     21619const char* wolfSSL_get_version(const WOLFSSL* ssl)
    1928021620{
    1928121621    if (ssl == NULL) {
     
    1929321633    return LIBWOLFSSL_VERSION_STRING;
    1929421634}
     21635
     21636#ifdef OPENSSL_EXTRA
     21637const char* wolfSSL_OpenSSL_version(void)
     21638{
     21639    return "wolfSSL " LIBWOLFSSL_VERSION_STRING;
     21640}
     21641#endif
    1929521642
    1929621643
     
    1939421741}
    1939521742
     21743int wolfSSL_get_cipher_suite_from_name(const char* name, byte* cipherSuite0,
     21744                                       byte* cipherSuite, int *flags) {
     21745    if ((name == NULL) ||
     21746        (cipherSuite0 == NULL) ||
     21747        (cipherSuite == NULL) ||
     21748        (flags == NULL))
     21749        return BAD_FUNC_ARG;
     21750    return GetCipherSuiteFromName(name, cipherSuite0, cipherSuite, flags);
     21751}
     21752
    1939621753
    1939721754#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
     
    1941021767}
    1941121768
    19412 #ifndef NO_WOLFSSL_STUB
    19413 /* Keep as stubs for now */
    1941421769/* return 1 on success 0 on fail */
    1941521770int wolfSSL_sk_CIPHER_push(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk,
    1941621771                                                      WOLFSSL_CIPHER* cipher)
    1941721772{
    19418     WOLFSSL_STUB("wolfSSL_sk_CIPHER_push");
    19419     (void)sk;
    19420     (void)cipher;
    19421     return 0;
    19422 }
    19423 
    19424 
     21773    return wolfSSL_sk_push(sk, cipher);
     21774}
     21775
     21776#ifndef NO_WOLFSSL_STUB
    1942521777WOLFSSL_CIPHER* wolfSSL_sk_CIPHER_pop(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk)
    1942621778{
     
    1948821840    /* free head of stack */
    1948921841    XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
     21842}
     21843
     21844/**
     21845 * This function reads a tab delimetered CSV input and returns
     21846 * a populated WOLFSSL_TXT_DB structure.
     21847 * @param in Tab delimetered CSV input
     21848 * @param num Number of fields in each row.
     21849 * @return
     21850 */
     21851WOLFSSL_TXT_DB *wolfSSL_TXT_DB_read(WOLFSSL_BIO *in, int num)
     21852{
     21853    WOLFSSL_TXT_DB *ret = NULL;
     21854    char *buf = NULL;
     21855    char *bufEnd = NULL;
     21856    char *idx = NULL;
     21857    char* lineEnd = NULL;
     21858    int bufSz;
     21859    int failed = 1;
     21860    /* Space in front of str reserved for field pointers + \0 */
     21861    int fieldsSz = (num + 1) * sizeof(char *);
     21862    WOLFSSL_ENTER("wolfSSL_TXT_DB_read");
     21863
     21864    if (!in || num <= 0 || num > WOLFSSL_TXT_DB_MAX_FIELDS) {
     21865        WOLFSSL_MSG("Bad parameter or too many fields");
     21866        return NULL;
     21867    }
     21868
     21869    if (!(ret = (WOLFSSL_TXT_DB*)XMALLOC(sizeof(WOLFSSL_TXT_DB), NULL,
     21870            DYNAMIC_TYPE_OPENSSL))) {
     21871        WOLFSSL_MSG("malloc error");
     21872        goto error;
     21873    }
     21874    XMEMSET (ret, 0, sizeof(WOLFSSL_TXT_DB));
     21875    ret->num_fields = num;
     21876
     21877    if (!(ret->data = wolfSSL_sk_WOLFSSL_STRING_new())) {
     21878        WOLFSSL_MSG("wolfSSL_sk_WOLFSSL_STRING_new error");
     21879        goto error;
     21880    }
     21881
     21882    bufSz = wolfSSL_BIO_get_len(in);
     21883    if (bufSz <= 0 ||
     21884            !(buf = (char*)XMALLOC(bufSz+1, NULL,
     21885                    DYNAMIC_TYPE_TMP_BUFFER))) {
     21886        WOLFSSL_MSG("malloc error or no data in BIO");
     21887        goto error;
     21888    }
     21889
     21890    if (wolfSSL_BIO_read(in, buf, bufSz) != bufSz) {
     21891        WOLFSSL_MSG("malloc error or no data in BIO");
     21892        goto error;
     21893    }
     21894
     21895    buf[bufSz] = '\0';
     21896    idx = buf;
     21897    for (bufEnd = buf + bufSz; idx < bufEnd; idx = lineEnd + 1) {
     21898        char* strBuf = NULL;
     21899        char** fieldPtr = NULL;
     21900        int fieldPtrIdx = 0;
     21901        char* fieldCheckIdx = NULL;
     21902        lineEnd = XSTRNSTR(idx, "\n", (unsigned int)(bufEnd - idx));
     21903        if (!lineEnd)
     21904            lineEnd = bufEnd;
     21905        if (idx == lineEnd) /* empty line */
     21906            continue;
     21907        if (*idx == '#')
     21908            continue;
     21909        *lineEnd = '\0';
     21910        strBuf = (char*)XMALLOC(fieldsSz + lineEnd - idx + 1, NULL,
     21911                                DYNAMIC_TYPE_OPENSSL);
     21912        if (!strBuf) {
     21913            WOLFSSL_MSG("malloc error");
     21914            goto error;
     21915        }
     21916        XMEMCPY(strBuf + fieldsSz, idx, lineEnd - idx + 1); /* + 1 for NULL */
     21917        XMEMSET(strBuf, 0, fieldsSz);
     21918        /* Check for appropriate number of fields */
     21919        fieldPtr = (char**)strBuf;
     21920        fieldCheckIdx = strBuf + fieldsSz;
     21921        fieldPtr[fieldPtrIdx++] = fieldCheckIdx;
     21922        while (*fieldCheckIdx != '\0') {
     21923            /* Handle escaped tabs */
     21924            if (*fieldCheckIdx == '\t' && fieldCheckIdx[-1] != '\\') {
     21925                fieldPtr[fieldPtrIdx++] = fieldCheckIdx + 1;
     21926                *fieldCheckIdx = '\0';
     21927                if (fieldPtrIdx > num) {
     21928                    WOLFSSL_MSG("too many fields");
     21929                    XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
     21930                    goto error;
     21931                }
     21932            }
     21933            fieldCheckIdx++;
     21934        }
     21935        if (fieldPtrIdx != num) {
     21936            WOLFSSL_MSG("wrong number of fields");
     21937            XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
     21938            goto error;
     21939        }
     21940        if (wolfSSL_sk_push(ret->data, strBuf) != WOLFSSL_SUCCESS) {
     21941            WOLFSSL_MSG("wolfSSL_sk_push error");
     21942            XFREE(strBuf, NULL, DYNAMIC_TYPE_OPENSSL);
     21943            goto error;
     21944        }
     21945    }
     21946
     21947    failed = 0;
     21948error:
     21949    if (failed && ret) {
     21950        XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL);
     21951        ret = NULL;
     21952    }
     21953    if (buf) {
     21954        XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     21955    }
     21956    return ret;
     21957}
     21958
     21959long wolfSSL_TXT_DB_write(WOLFSSL_BIO *out, WOLFSSL_TXT_DB *db)
     21960{
     21961    const WOLF_STACK_OF(WOLFSSL_STRING)* data;
     21962    long totalLen = 0;
     21963    char buf[512]; /* Should be more than enough for a single row */
     21964    char* bufEnd = buf + sizeof(buf);
     21965    int sz;
     21966    int i;
     21967
     21968    WOLFSSL_ENTER("wolfSSL_TXT_DB_write");
     21969
     21970    if (!out || !db || !db->num_fields) {
     21971        WOLFSSL_MSG("Bad parameter");
     21972        return WOLFSSL_FAILURE;
     21973    }
     21974
     21975    data = db->data;
     21976    while (data) {
     21977        char** fields = (char**)data->data.string;
     21978        char* idx = buf;
     21979
     21980        if (!fields) {
     21981            WOLFSSL_MSG("Missing row");
     21982            return WOLFSSL_FAILURE;
     21983        }
     21984
     21985        for (i = 0; i < db->num_fields; i++) {
     21986            const char* fieldValue = fields[i];
     21987            if (!fieldValue) {
     21988                fieldValue = "";
     21989            }
     21990
     21991            /* Copy over field escaping tabs */
     21992            while (*fieldValue != '\0') {
     21993                if (idx+1 < bufEnd) {
     21994                    if (*fieldValue == '\t')
     21995                        *idx++ = '\\';
     21996                    *idx++ = *fieldValue++;
     21997                }
     21998                else {
     21999                    WOLFSSL_MSG("Data row is too big");
     22000                    return WOLFSSL_FAILURE;
     22001                }
     22002            }
     22003            if (idx < bufEnd) {
     22004                *idx++ = '\t';
     22005            }
     22006            else {
     22007                WOLFSSL_MSG("Data row is too big");
     22008                return WOLFSSL_FAILURE;
     22009            }
     22010        }
     22011        idx[-1] = '\n';
     22012        sz = (int)(idx - buf);
     22013
     22014        if (wolfSSL_BIO_write(out, buf, sz) != sz) {
     22015            WOLFSSL_MSG("wolfSSL_BIO_write error");
     22016            return WOLFSSL_FAILURE;
     22017        }
     22018        totalLen += sz;
     22019
     22020        data = data->next;
     22021    }
     22022
     22023    return totalLen;
     22024}
     22025
     22026int wolfSSL_TXT_DB_insert(WOLFSSL_TXT_DB *db, WOLFSSL_STRING *row)
     22027{
     22028    WOLFSSL_ENTER("wolfSSL_TXT_DB_insert");
     22029
     22030    if (!db || !row || !db->data) {
     22031        WOLFSSL_MSG("Bad parameter");
     22032        return WOLFSSL_FAILURE;
     22033    }
     22034
     22035    if (wolfSSL_sk_push(db->data, row) != WOLFSSL_SUCCESS) {
     22036        WOLFSSL_MSG("wolfSSL_sk_push error");
     22037        return WOLFSSL_FAILURE;
     22038    }
     22039
     22040    return WOLFSSL_SUCCESS;
     22041}
     22042
     22043void wolfSSL_TXT_DB_free(WOLFSSL_TXT_DB *db)
     22044{
     22045    WOLFSSL_ENTER("wolfSSL_TXT_DB_free");
     22046    if (db) {
     22047        if (db->data) {
     22048            wolfSSL_sk_free(db->data);
     22049        }
     22050        XFREE(db, NULL, DYNAMIC_TYPE_OPENSSL);
     22051    }
     22052}
     22053
     22054int wolfSSL_TXT_DB_create_index(WOLFSSL_TXT_DB *db, int field,
     22055        void* qual, wolf_sk_hash_cb hash, wolf_sk_compare_cb cmp)
     22056{
     22057    WOLFSSL_ENTER("wolfSSL_TXT_DB_create_index");
     22058    (void)qual;
     22059
     22060    if (!db || !hash || !cmp || field >= db->num_fields || field < 0) {
     22061        WOLFSSL_MSG("Bad parameter");
     22062        return WOLFSSL_FAILURE;
     22063    }
     22064
     22065    db->hash_fn[field] = hash;
     22066    db->comp[field] = cmp;
     22067
     22068    return WOLFSSL_SUCCESS;
     22069}
     22070
     22071WOLFSSL_STRING *wolfSSL_TXT_DB_get_by_index(WOLFSSL_TXT_DB *db, int idx,
     22072        WOLFSSL_STRING *value)
     22073{
     22074    WOLFSSL_ENTER("wolfSSL_TXT_DB_get_by_index");
     22075
     22076    if (!db || !db->data || idx < 0 || idx >= db->num_fields) {
     22077        WOLFSSL_MSG("Bad parameter");
     22078        return NULL;
     22079    }
     22080
     22081    if (!db->hash_fn[idx] || !db->comp[idx]) {
     22082        WOLFSSL_MSG("Missing hash or cmp functions");
     22083        return NULL;
     22084    }
     22085
     22086    /* If first data struct has correct hash and cmp function then
     22087     * assume others do too */
     22088    if (db->data->hash_fn != db->hash_fn[idx] ||
     22089            db->data->comp != db->comp[idx]) {
     22090        /* Set the hash and comp functions */
     22091        WOLF_STACK_OF(WOLFSSL_STRING)* data = db->data;
     22092        while (data) {
     22093            if (data->comp != db->comp[idx] ||
     22094                    data->hash_fn != db->hash_fn[idx]) {
     22095                data->comp = db->comp[idx];
     22096                data->hash_fn = db->hash_fn[idx];
     22097                data->hash = 0;
     22098            }
     22099            data= data->next;
     22100        }
     22101    }
     22102    return (WOLFSSL_STRING*) wolfSSL_lh_retrieve(db->data, value);
    1949022103}
    1949122104#endif
     
    1958522198{
    1958622199    WOLFSSL_ENTER("wolfSSL_X509_get_subject_name");
    19587     if (cert && cert->subject.sz != 0)
     22200    if (cert)
    1958822201        return &cert->subject;
    1958922202    return NULL;
    1959022203}
    1959122204
    19592 #if defined(OPENSSL_EXTRA) && !defined(NO_SHA)
     22205#if defined(OPENSSL_EXTRA) && (!defined(NO_SHA) || !defined(NO_SHA256))
    1959322206/******************************************************************************
    1959422207* wolfSSL_X509_subject_name_hash - compute the hash digest of the raw subject name
     22208* This function prefers SHA-1 (if available) for compatibility
    1959522209*
    1959622210* RETURNS:
     
    1960222216unsigned long wolfSSL_X509_subject_name_hash(const WOLFSSL_X509* x509)
    1960322217{
    19604     word32 ret = 0;
    19605     int retHash;
     22218    unsigned long ret = 0;
     22219    int retHash = NOT_COMPILED_IN;
    1960622220    WOLFSSL_X509_NAME *subjectName = NULL;
    19607 
    19608 #ifdef WOLFSSL_PIC32MZ_HASH
    19609         byte digest[PIC32_DIGEST_SIZE];
    19610 #else
    19611         byte digest[WC_SHA_DIGEST_SIZE];
    19612 #endif
    19613 
    19614     if (x509 == NULL){
    19615         return WOLFSSL_FAILURE;
     22221    byte digest[WC_MAX_DIGEST_SIZE];
     22222
     22223    if (x509 == NULL) {
     22224        return ret;
    1961622225    }
    1961722226
    1961822227    subjectName = wolfSSL_X509_get_subject_name((WOLFSSL_X509*)x509);
    19619 
    19620     if (subjectName != NULL){
     22228    if (subjectName != NULL) {
     22229    #ifndef NO_SHA
    1962122230        retHash = wc_ShaHash((const byte*)subjectName->name,
    1962222231                             (word32)subjectName->sz, digest);
    19623 
    19624         if(retHash != 0){
    19625             WOLFSSL_MSG("Hash of X509 subjectName has failed");
    19626             return WOLFSSL_FAILURE;
    19627         }
    19628         ret = MakeWordFromHash(digest);
    19629     }
    19630 
    19631     return (unsigned long)ret;
    19632 }
    19633 #endif
     22232    #elif !defined(NO_SHA256)
     22233        retHash = wc_Sha256Hash((const byte*)subjectName->name,
     22234                                (word32)subjectName->sz, digest);
     22235    #endif
     22236        if (retHash == 0) {
     22237            ret = (unsigned long)MakeWordFromHash(digest);
     22238        }
     22239    }
     22240
     22241    return ret;
     22242}
     22243
     22244unsigned long wolfSSL_X509_issuer_name_hash(const WOLFSSL_X509* x509)
     22245{
     22246    unsigned long ret = 0;
     22247    int retHash = NOT_COMPILED_IN;
     22248    WOLFSSL_X509_NAME *issuerName = NULL;
     22249    byte digest[WC_MAX_DIGEST_SIZE];
     22250
     22251    if (x509 == NULL) {
     22252        return ret;
     22253    }
     22254
     22255    issuerName = wolfSSL_X509_get_issuer_name((WOLFSSL_X509*)x509);
     22256    if (issuerName != NULL) {
     22257    #ifndef NO_SHA
     22258        retHash = wc_ShaHash((const byte*)issuerName->name,
     22259                             (word32)issuerName->sz, digest);
     22260    #elif !defined(NO_SHA256)
     22261        retHash = wc_Sha256Hash((const byte*)issuerName->name,
     22262                                (word32)issuerName->sz, digest);
     22263    #endif
     22264        if (retHash == 0) {
     22265            ret = (unsigned long)MakeWordFromHash(digest);
     22266        }
     22267    }
     22268    return ret;
     22269}
     22270#endif /* OPENSSL_EXTRA && (!NO_SHA || !NO_SHA256) */
    1963422271
    1963522272WOLFSSL_ABI
     
    1965722294#if defined(OPENSSL_EXTRA_X509_SMALL)
    1965822295
     22296/* Searches for the first ENTRY of type NID
     22297 * idx is the location to start searching from, the value at when the entry was
     22298 *     found is stored into idx
     22299 * returns a pointer to the entry on success and null on fail */
     22300static WOLFSSL_X509_NAME_ENTRY* GetEntryByNID(WOLFSSL_X509_NAME* name, int nid,
     22301        int* idx)
     22302{
     22303    int i;
     22304    WOLFSSL_X509_NAME_ENTRY* ret = NULL;
     22305
     22306    /* and index of less than 0 is assumed to be starting from 0 */
     22307    if (*idx < 0) {
     22308        *idx = 0;
     22309    }
     22310
     22311    for (i = *idx; i < MAX_NAME_ENTRIES; i++) {
     22312        if (name->entry[i].nid == nid) {
     22313            ret = &name->entry[i];
     22314            *idx = i;
     22315            break;
     22316        }
     22317    }
     22318    return ret;
     22319}
     22320
     22321
    1965922322/* Used to get a string from the WOLFSSL_X509_NAME structure that
    19660  * corresponds with the NID value passed in.
     22323 * corresponds with the NID value passed in. This finds the first entry with
     22324 * matching NID value, if searching for the case where there is multiple
     22325 * entries with the same NID value than other functions should be used
     22326 * (i.e. wolfSSL_X509_NAME_get_index_by_NID, wolfSSL_X509_NAME_get_entry)
    1966122327 *
    1966222328 * name structure to get string from
     
    1967422340                                      int nid, char* buf, int len)
    1967522341{
    19676     char *text = NULL;
     22342    WOLFSSL_X509_NAME_ENTRY* e;
     22343    unsigned char *text = NULL;
    1967722344    int textSz = 0;
     22345    int idx    = 0;
    1967822346
    1967922347    WOLFSSL_ENTER("wolfSSL_X509_NAME_get_text_by_NID");
    1968022348
    19681     switch (nid) {
    19682         case ASN_COMMON_NAME:
    19683             text = name->fullName.fullName + name->fullName.cnIdx;
    19684             textSz = name->fullName.cnLen;
    19685             break;
    19686         case ASN_SUR_NAME:
    19687             text = name->fullName.fullName + name->fullName.snIdx;
    19688             textSz = name->fullName.snLen;
    19689             break;
    19690         case ASN_SERIAL_NUMBER:
    19691             text = name->fullName.fullName + name->fullName.serialIdx;
    19692             textSz = name->fullName.serialLen;
    19693             break;
    19694         case ASN_COUNTRY_NAME:
    19695             text = name->fullName.fullName + name->fullName.cIdx;
    19696             textSz = name->fullName.cLen;
    19697             break;
    19698         case ASN_LOCALITY_NAME:
    19699             text = name->fullName.fullName + name->fullName.lIdx;
    19700             textSz = name->fullName.lLen;
    19701             break;
    19702         case ASN_STATE_NAME:
    19703             text = name->fullName.fullName + name->fullName.stIdx;
    19704             textSz = name->fullName.stLen;
    19705             break;
    19706         case ASN_ORG_NAME:
    19707             text = name->fullName.fullName + name->fullName.oIdx;
    19708             textSz = name->fullName.oLen;
    19709             break;
    19710         case ASN_ORGUNIT_NAME:
    19711             text = name->fullName.fullName + name->fullName.ouIdx;
    19712             textSz = name->fullName.ouLen;
    19713             break;
    19714         case ASN_DOMAIN_COMPONENT:
    19715             text = name->fullName.fullName + name->fullName.dcIdx[0];
    19716             textSz = name->fullName.dcLen[0];
    19717             break;
    19718         case NID_emailAddress:
    19719             text = name->fullName.fullName + name->fullName.emailIdx;
    19720             textSz = name->fullName.emailLen;
    19721             break;
    19722     #ifdef WOLFSSL_CERT_EXT
    19723         case ASN_BUS_CAT:
    19724             text = name->fullName.fullName + name->fullName.bcIdx;
    19725             textSz = name->fullName.bcLen;
    19726             break;
    19727     #endif
    19728         default:
    19729             WOLFSSL_MSG("Entry type not found");
    19730             return WOLFSSL_FATAL_ERROR;
     22349    if (name == NULL) {
     22350        WOLFSSL_MSG("NULL argument passed in");
     22351        return WOLFSSL_FATAL_ERROR;
     22352    }
     22353
     22354    e = GetEntryByNID(name, nid, &idx);
     22355    if (e == NULL) {
     22356        WOLFSSL_MSG("Entry type not found");
     22357        return WOLFSSL_FATAL_ERROR;
     22358    }
     22359    text   = wolfSSL_ASN1_STRING_data(e->value);
     22360    textSz = wolfSSL_ASN1_STRING_length(e->value);
     22361
     22362    if (text == NULL) {
     22363        WOLFSSL_MSG("Unable to get entry text");
     22364        return WOLFSSL_FATAL_ERROR;
    1973122365    }
    1973222366
    1973322367    /* if buf is NULL return size of buffer needed (minus null char) */
    1973422368    if (buf == NULL) {
     22369        WOLFSSL_MSG("Buffer is NULL, returning buffer size only");
    1973522370        return textSz;
    1973622371    }
     
    1979522430                if (wolfSSL_RSA_LoadDer_ex(key->rsa,
    1979622431                            (const unsigned char*)key->pkey.ptr, key->pkey_sz,
    19797                             WOLFSSL_RSA_LOAD_PUBLIC) != SSL_SUCCESS) {
     22432                            WOLFSSL_RSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
    1979822433                    wolfSSL_EVP_PKEY_free(key);
    1979922434                    return NULL;
     
    1982322458                }
    1982422459
    19825                 if (SetECKeyExternal(key->ecc) != SSL_SUCCESS) {
     22460                if (SetECKeyExternal(key->ecc) != WOLFSSL_SUCCESS) {
    1982622461                    WOLFSSL_MSG("SetECKeyExternal failed");
    1982722462                    wolfSSL_EVP_PKEY_free(key);
     
    1984422479                if (wolfSSL_DSA_LoadDer_ex(key->dsa,
    1984522480                            (const unsigned char*)key->pkey.ptr, key->pkey_sz, \
    19846                             WOLFSSL_DSA_LOAD_PUBLIC) != SSL_SUCCESS) {
     22481                            WOLFSSL_DSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
    1984722482                    wolfSSL_DSA_free(key->dsa);
    1984822483                    key->dsa = NULL;
     
    1986122496/* End of smaller subset of X509 compatibility functions. Avoid increasing the
    1986222497 * size of this subset and its memory usage */
    19863 #endif /* OPENSSL_EXTRA_X509_SMALL */
     22498#endif /* OPENSSL_EXTRA_X509_SMALL || KEEP_PEER_CERT || SESSION_CERTS */
    1986422499
    1986522500#if defined(OPENSSL_ALL)
    1986622501/* Takes two WOLFSSL_X509* certificates and performs a Sha hash of each, if the
    19867    * has values are the same, then it will do an XMEMCMP to confirm they are
     22502   * hash values are the same, then it will do an XMEMCMP to confirm they are
    1986822503   * identical. Returns a 0 when certificates match, returns a negative number
    1986922504   * when certificates are not a match.
     
    1987322508        const byte* derA;
    1987422509        const byte* derB;
    19875         int retHashA;
    19876         int retHashB;
    1987722510        int outSzA = 0;
    1987822511        int outSzB = 0;
    1987922512
    19880         #ifdef WOLFSSL_PIC32MZ_HASH
    19881             byte digestA[PIC32_DIGEST_SIZE];
    19882             byte digestB[PIC32_DIGEST_SIZE];
    19883         #else
    19884             byte digestA[WC_SHA_DIGEST_SIZE];
    19885             byte digestB[WC_SHA_DIGEST_SIZE];
    19886         #endif
    19887 
    1988822513        if (a == NULL || b == NULL){
    1988922514            return BAD_FUNC_ARG;
     
    1989122516
    1989222517        derA = wolfSSL_X509_get_der((WOLFSSL_X509*)a, &outSzA);
    19893         if(derA == NULL){
     22518        if (derA == NULL){
    1989422519            WOLFSSL_MSG("wolfSSL_X509_get_der - certificate A has failed");
    1989522520            return WOLFSSL_FATAL_ERROR;
    1989622521        }
    1989722522        derB = wolfSSL_X509_get_der((WOLFSSL_X509*)b, &outSzB);
    19898         if(derB == NULL){
     22523        if (derB == NULL){
    1989922524            WOLFSSL_MSG("wolfSSL_X509_get_der - certificate B has failed");
    1990022525            return WOLFSSL_FATAL_ERROR;
    1990122526        }
    1990222527
    19903         retHashA = wc_ShaHash(derA, (word32)outSzA, digestA);
    19904         if(retHashA != 0){
    19905             WOLFSSL_MSG("Hash of certificate A has failed");
    19906             return WOLFSSL_FATAL_ERROR;
    19907         }
    19908         retHashB = wc_ShaHash(derB, (word32)outSzB, digestB);
    19909         if(retHashB != 0){
    19910             WOLFSSL_MSG("Hash of certificate B has failed");
    19911             return WOLFSSL_FATAL_ERROR;
    19912         }
    19913 
    19914         if (outSzA == outSzB){
    19915             #ifdef WOLFSSL_PIC32MZ_HASH
    19916             if(XMEMCMP(digestA, digestB, PIC32_DIGEST_SIZE) != 0){
    19917                 return WOLFSSL_FATAL_ERROR;
    19918             }
    19919             #else
    19920             if(XMEMCMP(digestA, digestB, WC_SHA_DIGEST_SIZE) != 0){
    19921                 return WOLFSSL_FATAL_ERROR;
    19922             }
    19923             #endif
    19924             else{
    19925                 WOLFSSL_LEAVE("wolfSSL_X509_cmp", 0);
    19926                 return 0;
    19927             }
    19928         }
    19929         else{
     22528        if (outSzA != outSzB || XMEMCMP(derA, derB, outSzA) != 0) {
    1993022529            WOLFSSL_LEAVE("wolfSSL_X509_cmp", WOLFSSL_FATAL_ERROR);
    1993122530            return WOLFSSL_FATAL_ERROR;
    1993222531        }
    19933     }
    19934 #endif
    19935 
    19936 #if defined(OPENSSL_EXTRA)
    19937 #if !defined(NO_CERTS)
     22532
     22533        WOLFSSL_LEAVE("wolfSSL_X509_cmp", 0);
     22534        return 0;
     22535    }
     22536#endif /* OPENSSL_ALL */
     22537
     22538#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS)
    1993822539    int wolfSSL_X509_ext_isSet_by_NID(WOLFSSL_X509* x509, int nid)
    1993922540    {
     
    2009222693        return id;
    2009322694    }
    20094 
    20095 
    20096     int wolfSSL_X509_NAME_entry_count(WOLFSSL_X509_NAME* name)
    20097     {
    20098         int count = 0;
    20099 
    20100         WOLFSSL_ENTER("wolfSSL_X509_NAME_entry_count");
    20101 
    20102         if (name != NULL)
    20103             count = name->fullName.locSz;
    20104 
    20105         WOLFSSL_LEAVE("wolfSSL_X509_NAME_entry_count", count);
    20106         return count;
    20107     }
    20108 
    20109 
    20110 
     22695#endif /* !NO_CERTS && OPENSSL_EXTRA */
     22696
     22697#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
     22698    defined(OPENSSL_EXTRA_X509_SMALL)
     22699
     22700    /* Looks up the index of the first entry encountered with matching NID
     22701     * The search starts from index 'pos'
     22702     * returns a negative value on failure and positive index value on success*/
    2011122703    int wolfSSL_X509_NAME_get_index_by_NID(WOLFSSL_X509_NAME* name,
    2011222704                                          int nid, int pos)
     
    2011622708        WOLFSSL_ENTER("wolfSSL_X509_NAME_get_index_by_NID");
    2011722709
    20118         if (name == NULL || pos >= DN_NAMES_MAX + DOMAIN_COMPONENT_MAX) {
     22710        if (name == NULL) {
    2011922711            return BAD_FUNC_ARG;
    20120         }
    20121 
    20122         if (value == NID_emailAddress) {
    20123             value = ASN_EMAIL_NAME;
    2012422712        }
    2012522713
     
    2012922717        }
    2013022718
    20131         for (;i < name->fullName.locSz &&
    20132                 i < DN_NAMES_MAX + DOMAIN_COMPONENT_MAX; i++) {
    20133             if (name->fullName.loc[i] == value) {
     22719        for (;i < name->entrySz && i < MAX_NAME_ENTRIES; i++) {
     22720            if (name->entry[i].nid == value) {
    2013422721                return i;
    2013522722            }
     
    2016922756    }
    2017022757
     22758    /**
     22759     * Used to duplicate a passed in WOLFSSL_ASN1_STRING*
     22760     * @param asn1 WOLFSSL_ASN1_STRING* to be duplicated
     22761     * @return WOLFSSL_ASN1_STRING* the duplicate struct or NULL on error
     22762     */
     22763    WOLFSSL_ASN1_STRING* wolfSSL_ASN1_STRING_dup(WOLFSSL_ASN1_STRING* asn1)
     22764    {
     22765        WOLFSSL_ASN1_STRING* dupl = NULL;
     22766
     22767        WOLFSSL_ENTER("wolfSSL_ASN1_STRING_dup");
     22768        if (!asn1) {
     22769            WOLFSSL_MSG("Bad parameter");
     22770            return NULL;
     22771        }
     22772
     22773        dupl = wolfSSL_ASN1_STRING_new();
     22774        if (!dupl) {
     22775            WOLFSSL_MSG("wolfSSL_ASN1_STRING_new error");
     22776            return NULL;
     22777        }
     22778
     22779        dupl->type = asn1->type;
     22780        dupl->flags = asn1->flags;
     22781
     22782        if (wolfSSL_ASN1_STRING_set(dupl, asn1->data, asn1->length)
     22783                != WOLFSSL_SUCCESS) {
     22784            WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
     22785            wolfSSL_ASN1_STRING_free(dupl);
     22786            return NULL;
     22787        }
     22788
     22789        return dupl;
     22790    }
     22791
    2017122792
    2017222793    /* used to free a WOLFSSL_ASN1_STRING structure */
     
    2018322804    }
    2018422805
     22806    int wolfSSL_ASN1_STRING_cmp(const WOLFSSL_ASN1_STRING *a, const WOLFSSL_ASN1_STRING *b)
     22807    {
     22808        int i;
     22809        WOLFSSL_ENTER("wolfSSL_ASN1_STRING_cmp");
     22810
     22811        if (!a || !b) {
     22812            return WOLFSSL_FATAL_ERROR;
     22813        }
     22814
     22815        if (a->length != b->length) {
     22816            return a->length - b->length;
     22817        }
     22818
     22819        if ((i = XMEMCMP(a->data, b->data, a->length)) != 0) {
     22820            return i;
     22821        }
     22822
     22823        return a->type - b->type;
     22824    }
     22825#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     22826
     22827#if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || \
     22828    defined(OPENSSL_EXTRA_X509_SMALL))
    2018522829
    2018622830    /* Creates a new WOLFSSL_ASN1_STRING structure given the input type.
     
    2022422868    }
    2022522869
     22870#endif /* !NO_CERTS && OPENSSL_EXTRA */
     22871
     22872#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
     22873    defined(OPENSSL_EXTRA_X509_SMALL)
    2022622874    /* if dataSz is negative then use XSTRLEN to find length of data
    2022722875     * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */
     
    2023922887
    2024022888        if (dataSz < 0) {
    20241             sz = (int)XSTRLEN((const char*)data) + 1; /* +1 for null */
     22889            sz = (int)XSTRLEN((const char*)data);
    2024222890        }
    2024322891        else {
     
    2025522903        }
    2025622904
    20257         if (sz > CTC_NAME_SIZE) {
     22905        if (sz + 1 > CTC_NAME_SIZE) { /* account for null char */
    2025822906            /* create new data buffer and copy over */
    20259             asn1->data = (char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
     22907            asn1->data = (char*)XMALLOC(sz + 1, NULL, DYNAMIC_TYPE_OPENSSL);
    2026022908            if (asn1->data == NULL) {
    2026122909                return WOLFSSL_FAILURE;
     
    2027622924        return WOLFSSL_SUCCESS;
    2027722925    }
    20278 
     22926#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     22927
     22928#ifndef NO_CERTS
     22929#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    2027922930
    2028022931    unsigned char* wolfSSL_ASN1_STRING_data(WOLFSSL_ASN1_STRING* asn)
     
    2030222953        }
    2030322954    }
    20304 
     22955#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
     22956
     22957#ifdef OPENSSL_EXTRA
    2030522958#ifndef NO_WOLFSSL_STUB
    2030622959    WOLFSSL_ASN1_STRING* wolfSSL_d2i_DISPLAYTEXT(WOLFSSL_ASN1_STRING **asn,
     
    2031522968#endif
    2031622969
     22970#ifndef NO_BIO
    2031722971#ifdef XSNPRINTF /* a snprintf function needs to be available */
    2031822972    /* Writes the human readable form of x509 to bio.
     
    2032822982        WOLFSSL_ENTER("wolfSSL_X509_print_ex");
    2032922983
    20330     #ifndef NO_WOLFSSL_STUB
    2033122984        /* flags currently not supported */
    2033222985        (void)nmflags;
    2033322986        (void)cflag;
    20334     #endif
    2033522987
    2033622988        if (bio == NULL || x509 == NULL) {
     
    2100323655    }
    2100423656
     23657#ifndef NO_FILESYSTEM
     23658    int wolfSSL_X509_print_fp(XFILE fp, WOLFSSL_X509 *x509)
     23659    {
     23660        WOLFSSL_BIO* bio;
     23661        int ret;
     23662
     23663        WOLFSSL_ENTER("wolfSSL_X509_print_fp");
     23664
     23665        if (!fp || !x509) {
     23666            WOLFSSL_MSG("Bad parameter");
     23667            return WOLFSSL_FAILURE;
     23668        }
     23669
     23670        if (!(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file()))) {
     23671            WOLFSSL_MSG("wolfSSL_BIO_new wolfSSL_BIO_s_file error");
     23672            return WOLFSSL_FAILURE;
     23673        }
     23674
     23675        if (wolfSSL_BIO_set_fp(bio, fp, BIO_NOCLOSE) != WOLFSSL_SUCCESS) {
     23676            WOLFSSL_MSG("wolfSSL_BIO_set_fp error");
     23677            return WOLFSSL_FAILURE;
     23678        }
     23679
     23680        ret = wolfSSL_X509_print(bio, x509);
     23681
     23682        wolfSSL_BIO_free(bio);
     23683
     23684        return ret;
     23685    }
     23686#endif /* NO_FILESYSTEM */
     23687
    2100523688#endif /* XSNPRINTF */
    21006 
    21007 #endif /* NO_CERTS */
    21008 
     23689#endif /* !NO_BIO */
     23690
     23691    int wolfSSL_X509_signature_print(WOLFSSL_BIO *bp,
     23692            const WOLFSSL_X509_ALGOR *sigalg, const WOLFSSL_ASN1_STRING *sig)
     23693    {
     23694        (void)sig;
     23695
     23696        WOLFSSL_ENTER("wolfSSL_X509_signature_print");
     23697
     23698        if (!bp || !sigalg) {
     23699            WOLFSSL_MSG("Bad parameter");
     23700            return WOLFSSL_FAILURE;
     23701        }
     23702
     23703        if (wolfSSL_BIO_puts(bp, "    Signature Algorithm: ") <= 0) {
     23704            WOLFSSL_MSG("wolfSSL_BIO_puts error");
     23705            return WOLFSSL_FAILURE;
     23706        }
     23707
     23708        if (wolfSSL_i2a_ASN1_OBJECT(bp, sigalg->algorithm) <= 0) {
     23709            WOLFSSL_MSG("wolfSSL_i2a_ASN1_OBJECT error");
     23710            return WOLFSSL_FAILURE;
     23711        }
     23712
     23713        return WOLFSSL_SUCCESS;
     23714    }
     23715
     23716#ifndef NO_WOLFSSL_STUB
     23717    void wolfSSL_X509_get0_signature(const WOLFSSL_ASN1_BIT_STRING **psig,
     23718            const WOLFSSL_X509_ALGOR **palg, const WOLFSSL_X509 *x509)
     23719    {
     23720        (void)psig;
     23721        (void)palg;
     23722        (void)x509;
     23723        WOLFSSL_STUB("wolfSSL_X509_get0_signature");
     23724    }
     23725#endif
     23726
     23727#endif /* OPENSSL_EXTRA */
     23728
     23729#endif /* !NO_CERTS */
     23730
     23731#ifdef OPENSSL_EXTRA
    2100923732#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    2101023733/* Creates cipher->description based on cipher->offset
     
    2103923762
    2104023763    offset = cipher->offset;
     23764    if (offset >= (unsigned long)GetCipherNamesSize())
     23765        return WOLFSSL_FAILURE;
    2104123766    pv.major = cipher_names[offset].major;
    2104223767    pv.minor = cipher_names[offset].minor;
     
    2112623851    return WOLFSSL_SUCCESS;
    2112723852}
    21128 #endif
     23853#endif /* OPENSSL_ALL || WOLFSSL_QT */
    2112923854
    2113023855char* wolfSSL_CIPHER_description(const WOLFSSL_CIPHER* cipher, char* in,
     
    2144424169
    2144524170
     24171#ifndef NO_BIO
     24172
    2144624173/* Removes a WOLFSSL_BIO struct from the WOLFSSL_BIO linked list.
    2144724174 *
     
    2152624253{
    2152724254    WOLFSSL_ENTER("wolfSSL_BIO_set_ex_data");
    21528     #ifdef HAVE_EX_DATA
     24255#ifdef HAVE_EX_DATA
    2152924256    if (bio != NULL && idx < MAX_EX_DATA) {
    2153024257        return wolfSSL_CRYPTO_set_ex_data(&bio->ex_data, idx, data);
    2153124258    }
    21532     #else
     24259#else
    2153324260    (void)bio;
    2153424261    (void)idx;
    2153524262    (void)data;
    21536     #endif
     24263#endif
    2153724264    return WOLFSSL_FAILURE;
    2153824265}
     
    2154824275{
    2154924276    WOLFSSL_ENTER("wolfSSL_BIO_get_ex_data");
    21550     #ifdef HAVE_EX_DATA
     24277#ifdef HAVE_EX_DATA
    2155124278    if (bio != NULL && idx < MAX_EX_DATA && idx >= 0) {
    2155224279        return wolfSSL_CRYPTO_get_ex_data(&bio->ex_data, idx);
    2155324280    }
    21554     #else
     24281#else
    2155524282    (void)bio;
    2155624283    (void)idx;
    21557     #endif
     24284#endif
    2155824285    return NULL;
    2155924286}
     24287
     24288#endif /* !NO_BIO */
    2156024289
    2156124290#ifndef NO_WOLFSSL_STUB
     
    2163224361#endif
    2163324362
    21634 
     24363#endif /* OPENSSL_EXTRA */
     24364
     24365#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    2163524366const char* wolfSSL_X509_verify_cert_error_string(long err)
    2163624367{
    2163724368    return wolfSSL_ERR_reason_error_string(err);
    2163824369}
    21639 
     24370#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     24371
     24372#ifdef OPENSSL_EXTRA
    2164024373
    2164124374#ifndef NO_WOLFSSL_STUB
     
    2166924402        return BAD_FUNC_ARG;
    2167024403
    21671     fp = XFOPEN(file, "r");
     24404    fp = XFOPEN(file, "rb");
    2167224405    if (fp == XBADFILE)
    2167324406        return BAD_FUNC_ARG;
     
    2176924502
    2177024503
     24504int wolfSSL_X509_LOOKUP_ctrl(WOLFSSL_X509_LOOKUP *ctx, int cmd,
     24505        const char *argc, long argl, char **ret)
     24506{
     24507    /* control commands:
     24508     * X509_L_FILE_LOAD, X509_L_ADD_DIR, X509_L_ADD_STORE, X509_L_LOAD_STORE
     24509     */
     24510
     24511    /* returns -1 if the X509_LOOKUP doesn't have an associated X509_LOOKUP_METHOD */
     24512
     24513
     24514
     24515    if (ctx != NULL) {
     24516        switch (cmd) {
     24517        case WOLFSSL_X509_L_FILE_LOAD:
     24518        case WOLFSSL_X509_L_ADD_DIR:
     24519        case WOLFSSL_X509_L_ADD_STORE:
     24520        case WOLFSSL_X509_L_LOAD_STORE:
     24521            return WOLFSSL_SUCCESS;
     24522
     24523        default:
     24524            break;
     24525        }
     24526
     24527    }
     24528
     24529    (void)argc; (void)argl; (void)ret;
     24530
     24531    return WOLFSSL_FAILURE;
     24532}
     24533
     24534
    2177124535WOLFSSL_X509_LOOKUP* wolfSSL_X509_STORE_add_lookup(WOLFSSL_X509_STORE* store,
    2177224536                                               WOLFSSL_X509_LOOKUP_METHOD* m)
     
    2178324547}
    2178424548
     24549#if !defined(NO_CERTS) && defined(WOLFSSL_CERT_GEN)
     24550static int wolfssl_x509_make_der(WOLFSSL_X509* x509, int req,
     24551        unsigned char* der, int* derSz, int includeSig);
     24552#endif
    2178524553
    2178624554#ifndef NO_CERTS
     24555#ifdef WOLFSSL_CERT_GEN
     24556#ifndef NO_BIO
     24557/* Converts the X509 to DER format and outputs it into bio.
     24558 *
     24559 * bio  is the structure to hold output DER
     24560 * x509 certificate to create DER from
     24561 * req  if set then a CSR is generated
     24562 *
     24563 * returns WOLFSSL_SUCCESS on success
     24564 */
     24565static int loadX509orX509REQFromBio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509, int req)
     24566{
     24567    int ret = WOLFSSL_FAILURE;
     24568    /* Get large buffer to hold cert der */
     24569    int derSz = X509_BUFFER_SZ;
     24570#ifdef WOLFSSL_SMALL_STACK
     24571    byte* der;
     24572#else
     24573    byte der[X509_BUFFER_SZ];
     24574#endif
     24575    WOLFSSL_ENTER("wolfSSL_i2d_X509_bio");
     24576
     24577    if (bio == NULL || x509 == NULL) {
     24578        return WOLFSSL_FAILURE;
     24579    }
     24580
     24581#ifdef WOLFSSL_SMALL_STACK
     24582    der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     24583    if (!der) {
     24584        WOLFSSL_MSG("malloc failed");
     24585        return WOLFSSL_FAILURE;
     24586    }
     24587#endif
     24588
     24589    if (wolfssl_x509_make_der(x509, req, der, &derSz, 1) != WOLFSSL_SUCCESS) {
     24590        goto cleanup;
     24591    }
     24592
     24593    if (wolfSSL_BIO_write(bio, der, derSz) != derSz) {
     24594        goto cleanup;
     24595    }
     24596
     24597    ret = WOLFSSL_SUCCESS;
     24598cleanup:
     24599    #ifdef WOLFSSL_SMALL_STACK
     24600    XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     24601    #endif
     24602
     24603    return ret;
     24604}
     24605#endif /* !NO_BIO */
     24606
    2178724607/* Converts the X509 to DER format and outputs it into bio.
    2178824608 *
     
    2179424614int wolfSSL_i2d_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
    2179524615{
    21796     WOLFSSL_ENTER("wolfSSL_i2d_X509_bio");
    21797 
    21798     if (bio == NULL || x509 == NULL) {
    21799         return WOLFSSL_FAILURE;
    21800     }
    21801 
    21802     if (x509->derCert != NULL) {
    21803         word32 len = x509->derCert->length;
    21804         byte*  der = x509->derCert->buffer;
    21805 
    21806         if (wolfSSL_BIO_write(bio, der, len) == (int)len) {
    21807             return SSL_SUCCESS;
    21808         }
    21809     }
    21810 
    21811     return WOLFSSL_FAILURE;
    21812 }
    21813 
     24616    return loadX509orX509REQFromBio(bio, x509, 0);
     24617}
     24618
     24619#ifdef WOLFSSL_CERT_REQ
     24620int wolfSSL_i2d_X509_REQ_bio(WOLFSSL_BIO* bio, WOLFSSL_X509* x509)
     24621{
     24622    return loadX509orX509REQFromBio(bio, x509, 1);
     24623}
     24624#endif /* WOLFSSL_CERT_REQ */
     24625#endif /* WOLFSSL_CERT_GEN */
    2181424626
    2181524627/* Converts an internal structure to a DER buffer
     
    2185424666}
    2185524667
    21856 
    21857 /* Converts the DER from bio and creates a WOLFSSL_X509 structure from it.
    21858  *
    21859  * bio  is the structure holding DER
    21860  * x509 certificate to create from DER. Can be NULL
    21861  *
    21862  * returns pointer to WOLFSSL_X509 structure on success and NULL on fail
     24668#ifndef NO_BIO
     24669/**
     24670 * Converts the DER from bio and creates a WOLFSSL_X509 structure from it.
     24671 * @param bio  is the structure holding DER
     24672 * @param x509 certificate to create from DER. Can be NULL
     24673 * @param req  1 for a CSR and 0 for a x509 cert
     24674 * @return pointer to WOLFSSL_X509 structure on success and NULL on fail
    2186324675 */
    21864 WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
     24676static WOLFSSL_X509* d2i_X509orX509REQ_bio(WOLFSSL_BIO* bio,
     24677                                            WOLFSSL_X509** x509, int req)
    2186524678{
    2186624679    WOLFSSL_X509* localX509 = NULL;
    21867     unsigned char* mem  = NULL;
    21868     int    ret;
    21869     word32 size;
     24680    byte* mem  = NULL;
     24681    int    size;
    2187024682
    2187124683    WOLFSSL_ENTER("wolfSSL_d2i_X509_bio");
     
    2187624688    }
    2187724689
    21878     ret = wolfSSL_BIO_get_mem_data(bio, &mem);
    21879     if (mem == NULL || ret <= 0) {
    21880         WOLFSSL_MSG("Failed to get data from bio struct");
     24690    size = wolfSSL_BIO_get_len(bio);
     24691    if (size == 0) {
     24692        WOLFSSL_MSG("wolfSSL_BIO_get_len error. Possibly no pending data.");
    2188124693        return NULL;
    2188224694    }
    21883     size = ret;
    21884 
    21885     localX509 = wolfSSL_X509_d2i(NULL, mem, size);
     24695
     24696    if (!(mem = (byte*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL))) {
     24697        WOLFSSL_MSG("malloc error");
     24698        return NULL;
     24699    }
     24700
     24701    if ((size = wolfSSL_BIO_read(bio, mem, size)) == 0) {
     24702        WOLFSSL_MSG("wolfSSL_BIO_read error");
     24703        XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
     24704        return NULL;
     24705    }
     24706
     24707    if (req) {
     24708#ifdef WOLFSSL_CERT_REQ
     24709        localX509 = wolfSSL_X509_REQ_d2i(NULL, mem, size);
     24710#else
     24711        WOLFSSL_MSG("CSR not compiled in");
     24712#endif
     24713    }
     24714    else {
     24715        localX509 = wolfSSL_X509_d2i(NULL, mem, size);
     24716    }
    2188624717    if (localX509 == NULL) {
     24718        WOLFSSL_MSG("wolfSSL_X509_d2i error");
     24719        XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
    2188724720        return NULL;
    2188824721    }
     
    2189224725    }
    2189324726
     24727    XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL);
    2189424728    return localX509;
    2189524729}
    21896 
     24730#endif /* !NO_BIO */
     24731
     24732WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
     24733{
     24734    return d2i_X509orX509REQ_bio(bio, x509, 0);
     24735}
     24736
     24737#ifdef WOLFSSL_CERT_REQ
     24738WOLFSSL_X509* wolfSSL_d2i_X509_REQ_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509)
     24739{
     24740    return d2i_X509orX509REQ_bio(bio, x509, 1);
     24741}
     24742#endif
    2189724743
    2189824744#if !defined(NO_ASN) && !defined(NO_PWDBASED)
     24745#ifndef NO_BIO
    2189924746WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12)
    2190024747{
     
    2196524812        if ((certSz > 0) && (certDer != NULL)) {
    2196624813            if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) {
    21967                 ret = SSL_SUCCESS;
     24814                ret = WOLFSSL_SUCCESS;
    2196824815            }
    2196924816        }
     
    2197624823    return ret;
    2197724824}
    21978 
    21979 /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */
    21980 static int wolfSSL_EVP_PKEY_get_der(WOLFSSL_EVP_PKEY* key, unsigned char** der)
    21981 {
    21982     if (!key)
    21983         return WOLFSSL_FAILURE;
    21984     if (der)
    21985         *der = (unsigned char*)key->pkey.ptr;
    21986     return key->pkey_sz;
    21987 }
     24825#endif /* !NO_BIO */
    2198824826
    2198924827/* Copies unencrypted DER key buffer into "der". If "der" is null then the size
    21990  * of buffer needed is returned
     24828 * of buffer needed is returned. If *der == NULL then it allocates a buffer.
    2199124829 * NOTE: This also advances the "der" pointer to be at the end of buffer.
    2199224830 *
    2199324831 * Returns size of key buffer on success
    2199424832 */
    21995 int wolfSSL_i2d_PrivateKey(WOLFSSL_EVP_PKEY* key, unsigned char** der)
    21996 {
    21997     if (key == NULL) {
    21998         return WOLFSSL_FATAL_ERROR;
    21999     }
    22000 
    22001     if (key->pkey_sz <= 0 || !key->pkey.ptr) {
    22002         return WOLFSSL_FATAL_ERROR;
    22003     }
    22004 
    22005     if (der != NULL) {
    22006         /* since this function signature has no size value passed in it is
    22007          * assumed that the user has allocated a large enough buffer */
    22008         XMEMCPY(*der, key->pkey.ptr, key->pkey_sz);
    22009         *der += key->pkey_sz;
    22010     }
    22011     return key->pkey_sz;
     24833int wolfSSL_i2d_PrivateKey(const WOLFSSL_EVP_PKEY* key, unsigned char** der)
     24834{
     24835    return wolfSSL_EVP_PKEY_get_der(key, der);
    2201224836}
    2201324837
     
    2203524859    WC_DerCertList* list = NULL;
    2203624860    word32 passSz;
    22037     byte* keyDer;
     24861    byte* keyDer = NULL;
    2203824862    word32 keyDerSz;
    2203924863    byte* certDer;
    2204024864    int certDerSz;
    2204124865
    22042     int ret;
    22043 
    2204424866    WOLFSSL_ENTER("wolfSSL_PKCS12_create()");
    2204524867
     
    2205024872    passSz = (word32)XSTRLEN(pass);
    2205124873
    22052     if ((ret = wolfSSL_EVP_PKEY_get_der(pkey, &keyDer)) < 0) {
    22053         WOLFSSL_LEAVE("wolfSSL_PKCS12_create", ret);
    22054         return NULL;
    22055     }
    22056     keyDerSz = ret;
     24874    keyDer = (byte*)pkey->pkey.ptr;
     24875    keyDerSz = pkey->pkey_sz;
    2205724876
    2205824877    certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz);
     
    2219125010            }
    2219225011            else {
    22193                 if ((ret = CopyDecodedToX509(x509, &DeCert)) != 0) {
     25012                if (CopyDecodedToX509(x509, &DeCert) != 0) {
    2219425013                    WOLFSSL_MSG("Failed to copy decoded cert");
    2219525014                    FreeDecodedCert(&DeCert);
     
    2226225081            WOLFSSL_MSG("Issue with parsing certificate");
    2226325082        }
    22264         if ((ret = CopyDecodedToX509(*cert, &DeCert)) != 0) {
     25083        if (CopyDecodedToX509(*cert, &DeCert) != 0) {
    2226525084            WOLFSSL_MSG("Failed to copy decoded cert");
    2226625085            FreeDecodedCert(&DeCert);
     
    2231525134                        return WOLFSSL_FAILURE;
    2231625135                    }
    22317                     if ((ret = wolfSSL_RSA_LoadDer_ex((*pkey)->rsa, pk, pkSz,
    22318                                     WOLFSSL_RSA_LOAD_PRIVATE)) != SSL_SUCCESS) {
     25136                    if (wolfSSL_RSA_LoadDer_ex((*pkey)->rsa, pk, pkSz,
     25137                                    WOLFSSL_RSA_LOAD_PRIVATE) != SSL_SUCCESS) {
    2231925138                        WOLFSSL_MSG("issue loading RSA key");
    2232025139                        wolfSSL_X509_free(*cert); *cert = NULL;
     
    2239125210    return WOLFSSL_SUCCESS;
    2239225211}
    22393 #endif /* !defined(NO_ASN) && !defined(NO_PWDBASED) */
     25212
     25213int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw,
     25214        int pswLen)
     25215{
     25216    WOLFSSL_ENTER("wolfSSL_PKCS12_verify_mac");
     25217
     25218    if (!pkcs12) {
     25219        return WOLFSSL_FAILURE;
     25220    }
     25221
     25222    return wc_PKCS12_verify_ex(pkcs12, (const byte*)psw, pswLen) == 0 ?
     25223            WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
     25224}
     25225#endif /* !NO_ASN && !NO_PWDBASED */
    2239425226
    2239525227
     
    2242425256
    2242525257        XMEMSET(sk, 0, sizeof(WOLFSSL_STACK));
    22426         ctx->chain = sk;
    2242725258
    2242825259        for (i = 0; i < c->count && i < MAX_CHAIN_DEPTH; i++) {
     
    2243525266            }
    2243625267
    22437             if (wolfSSL_sk_X509_push(sk, x509) != SSL_SUCCESS) {
     25268            if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) {
    2243825269                WOLFSSL_MSG("Unable to load x509 into stack");
    2243925270                wolfSSL_sk_X509_free(sk);
     
    2245525286                    if (issuer != NULL && wolfSSL_X509_NAME_cmp(&x509->issuer,
    2245625287                                &x509->subject) != 0) {
    22457                         if (wolfSSL_sk_X509_push(sk, issuer) != SSL_SUCCESS) {
     25288                        if (wolfSSL_sk_X509_push(sk, issuer) != WOLFSSL_SUCCESS) {
    2245825289                            WOLFSSL_MSG("Unable to load CA x509 into stack");
    2245925290                            wolfSSL_sk_X509_free(sk);
     
    2247425305        }
    2247525306#endif
    22476 
     25307        ctx->chain = sk;
    2247725308    }
    2247825309#endif /* SESSION_CERTS */
     
    2248025311    return ctx->chain;
    2248125312}
    22482 
    22483 /* make shallow copy of the stack, data pointers are copied by reference */
    22484 WOLFSSL_STACK* wolfSSL_sk_X509_dup(WOLFSSL_STACK* sk)
    22485 {
    22486     unsigned long i;
    22487     WOLFSSL_STACK* dup = NULL;
    22488     WOLFSSL_STACK* node = NULL;
    22489     WOLFSSL_STACK *dIdx = NULL, *sIdx = sk;
    22490 
    22491     if (sk == NULL) {
    22492         return NULL;
    22493     }
    22494 
    22495     for (i = 0; i < sk->num; i++) {
    22496 
    22497         node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL,
    22498                                          DYNAMIC_TYPE_X509);
    22499         if (node == NULL) {
    22500             if (i != 0) {
    22501                 wolfSSL_sk_free(dup);
    22502             }
    22503             WOLFSSL_MSG("Memory error");
    22504             return NULL;
    22505         }
    22506         XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
    22507 
    22508         /* copy sk node to new node, data by reference */
    22509         node->data.x509 = sIdx->data.x509;
    22510         node->num = sIdx->num;
    22511 
    22512         /* insert node into list, progress idx */
    22513         if (i == 0) {
    22514             dup = node;
    22515         } else {
    22516             dIdx->next = node;
    22517         }
    22518 
    22519         dIdx = node;
    22520         sIdx = sIdx->next;
    22521     }
    22522 
    22523     return dup;
    22524 }
    22525 
    2252625313
    2252725314/* like X509_STORE_CTX_get_chain(), but return a copy with data reference
     
    2252925316WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain(WOLFSSL_X509_STORE_CTX* ctx)
    2253025317{
    22531     unsigned long i;
    2253225318    WOLFSSL_STACK* ref;
    22533     WOLFSSL_STACK* dup;
    2253425319
    2253525320    if (ctx == NULL) {
     
    2254425329
    2254525330    /* create duplicate of ctx chain */
    22546     dup = wolfSSL_sk_X509_dup(ref);
    22547     if (dup == NULL) {
    22548         return NULL;
    22549     }
    22550 
    22551     /* increase ref counts of inner data X509 */
    22552     ref = dup;
    22553     for (i = 0; i < dup->num && ref != NULL; i++) {
    22554         if (wc_LockMutex(&ref->data.x509->refMutex) != 0) {
    22555             WOLFSSL_MSG("Failed to lock x509 mutex");
    22556         }
    22557         ref->data.x509->refCount++;
    22558         wc_UnLockMutex(&ref->data.x509->refMutex);
    22559         ref = ref->next;
    22560     }
    22561 
    22562     return dup;
    22563 }
    22564 
     25331    return wolfSSL_sk_dup(ref);
     25332}
     25333
     25334#ifndef NO_WOLFSSL_STUB
     25335WOLFSSL_X509_STORE_CTX *wolfSSL_X509_STORE_CTX_get0_parent_ctx(
     25336                                                   WOLFSSL_X509_STORE_CTX *ctx)
     25337{
     25338    (void)ctx;
     25339    WOLFSSL_STUB("wolfSSL_X509_STORE_CTX_get0_parent_ctx");
     25340    return NULL;
     25341}
     25342#endif
    2256525343
    2256625344int wolfSSL_X509_STORE_add_cert(WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509)
     
    2259125369    return result;
    2259225370}
    22593 
     25371#endif /* !NO_CERTS */
     25372#endif /* OPENSSL_EXTRA */
     25373
     25374#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    2259425375WOLFSSL_X509_STORE* wolfSSL_X509_STORE_new(void)
    2259525376{
     
    2260825389
    2260925390#ifdef HAVE_CRL
    22610     store->crl = NULL;
    22611     if ((store->crl = (WOLFSSL_X509_CRL *)XMALLOC(sizeof(WOLFSSL_X509_CRL),
    22612                                         NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL)
    22613         goto err_exit;
    22614     if (InitCRL(store->crl, NULL) < 0)
    22615         goto err_exit;
    22616 #endif
    22617 
    22618 #ifdef OPENSSL_EXTRA
     25391    store->crl = store->cm->crl;
     25392#endif
     25393
     25394#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    2261925395    if ((store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
    2262025396                           sizeof(WOLFSSL_X509_VERIFY_PARAM),
    22621                            NULL,DYNAMIC_TYPE_OPENSSL)) == NULL)
     25397                           NULL, DYNAMIC_TYPE_OPENSSL)) == NULL) {
    2262225398        goto err_exit;
     25399    }
    2262325400
    2262425401#endif
     
    2263525412}
    2263625413
    22637 
    2263825414void wolfSSL_X509_STORE_free(WOLFSSL_X509_STORE* store)
    2263925415{
    2264025416    if (store != NULL && store->isDynamic) {
    22641         if (store->cm != NULL)
     25417        if (store->cm != NULL) {
    2264225418            wolfSSL_CertManagerFree(store->cm);
    22643 #ifdef HAVE_CRL
    22644         if (store->crl != NULL)
    22645             wolfSSL_X509_CRL_free(store->crl);
    22646 #endif
     25419            store->cm = NULL;
     25420        }
     25421#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
     25422        if (store->param != NULL) {
     25423            XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL);
     25424            store->param = NULL;
     25425        }
     25426#endif
     25427        XFREE(store, NULL, DYNAMIC_TYPE_X509_STORE);
     25428    }
     25429}
     25430
     25431#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     25432
    2264725433#ifdef OPENSSL_EXTRA
    22648         if (store->param != NULL)
    22649             XFREE(store->param, NULL, DYNAMIC_TYPE_OPENSSL);
    22650 #endif
    22651         XFREE(store, NULL, DYNAMIC_TYPE_X509_STORE);
    22652     }
    22653 }
    22654 
    22655 
     25434#ifndef NO_CERTS
    2265625435int wolfSSL_X509_STORE_set_flags(WOLFSSL_X509_STORE* store, unsigned long flag)
    2265725436{
     
    2266625445        ret = wolfSSL_CertManagerEnableCRL(store->cm, (int)flag);
    2266725446    }
    22668 
    22669     (void)store;
    22670     (void)flag;
    2267125447
    2267225448    return ret;
     
    2276325539        }
    2276425540#endif
    22765         return SSL_SUCCESS;
     25541        return WOLFSSL_SUCCESS;
    2276625542    }
    2276725543    return WOLFSSL_FATAL_ERROR;
     
    2276925545
    2277025546
     25547/* free's extra data */
    2277125548void wolfSSL_X509_STORE_CTX_free(WOLFSSL_X509_STORE_CTX* ctx)
    2277225549{
    2277325550    WOLFSSL_ENTER("X509_STORE_CTX_free");
    2277425551    if (ctx != NULL) {
    22775     #if !defined(OPENSSL_ALL) && !defined(WOLFSSL_QT)
    22776         if (ctx->store != NULL)
    22777             wolfSSL_X509_STORE_free(ctx->store);
    22778         #ifndef WOLFSSL_KEEP_STORE_CERTS
    22779         if (ctx->current_cert != NULL)
    22780             wolfSSL_FreeX509(ctx->current_cert);
    22781         #endif
    22782     #endif /* !OPENSSL_ALL && !WOLFSSL_QT */
     25552    #ifdef OPENSSL_EXTRA
     25553        if (ctx->param != NULL){
     25554            XFREE(ctx->param,NULL,DYNAMIC_TYPE_OPENSSL);
     25555            ctx->param = NULL;
     25556        }
     25557    #endif
     25558        XFREE(ctx, NULL, DYNAMIC_TYPE_X509_CTX);
     25559    }
     25560}
     25561
     25562
     25563void wolfSSL_X509_STORE_CTX_cleanup(WOLFSSL_X509_STORE_CTX* ctx)
     25564{
     25565    if (ctx != NULL) {
    2278325566#ifdef OPENSSL_EXTRA
    2278425567        if (ctx->param != NULL){
    2278525568            XFREE(ctx->param,NULL,DYNAMIC_TYPE_OPENSSL);
    22786         }
    22787 #endif
    22788         XFREE(ctx, NULL, DYNAMIC_TYPE_X509_CTX);
    22789     }
    22790 }
    22791 
    22792 
    22793 void wolfSSL_X509_STORE_CTX_cleanup(WOLFSSL_X509_STORE_CTX* ctx)
    22794 {
    22795     (void)ctx;
    22796     /* Do nothing */
    22797 }
    22798 
    22799 #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
     25569            ctx->param = NULL;
     25570        }
     25571#endif
     25572        wolfSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL);
     25573    }
     25574}
     25575
     25576
     25577void wolfSSL_X509_STORE_CTX_trusted_stack(WOLFSSL_X509_STORE_CTX *ctx, WOLF_STACK_OF(WOLFSSL_X509) *sk)
     25578{
     25579    if (ctx != NULL) {
     25580        ctx->chain = sk;
     25581    }
     25582}
     25583
     25584
    2280025585/* Returns corresponding X509 error from internal ASN error <e> */
    2280125586static int GetX509Error(int e)
     
    2282325608    }
    2282425609}
    22825 #endif
    2282625610
    2282725611/* Verifies certificate chain using WOLFSSL_X509_STORE_CTX
     
    2283125615{
    2283225616    int ret = 0;
    22833 #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    2283425617    int depth = 0;
    2283525618    int error;
    2283625619    byte *afterDate, *beforeDate;
    22837 #endif
     25620
    2283825621    WOLFSSL_ENTER("wolfSSL_X509_verify_cert");
    2283925622
     
    2284525628                    WOLFSSL_FILETYPE_ASN1);
    2284625629
    22847 #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    2284825630        /* If there was an error, process it and add it to CTX */
    2284925631        if (ret < 0) {
     
    2285625638            wolfSSL_X509_STORE_CTX_set_error(ctx, error);
    2285725639            wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
    22858             ctx->store->verify_cb(0, ctx);
     25640        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
     25641            if (ctx->store && ctx->store->verify_cb)
     25642                ctx->store->verify_cb(0, ctx);
     25643        #endif
    2285925644        }
    2286025645
     
    2286725652        beforeDate = ctx->current_cert->notBefore.data;
    2286825653
    22869         if (ValidateDate(afterDate, ctx->current_cert->notAfter.type,
     25654        if (XVALIDATE_DATE(afterDate, (byte)ctx->current_cert->notAfter.type,
    2287025655                                                                   AFTER) < 1) {
    2287125656            error = X509_V_ERR_CERT_HAS_EXPIRED;
    2287225657        }
    22873         else if (ValidateDate(beforeDate, ctx->current_cert->notBefore.type,
    22874                                                                   BEFORE) < 1) {
     25658        else if (XVALIDATE_DATE(beforeDate,
     25659                    (byte)ctx->current_cert->notBefore.type, BEFORE) < 1) {
    2287525660            error = X509_V_ERR_CERT_NOT_YET_VALID;
    2287625661        }
     
    2287925664            wolfSSL_X509_STORE_CTX_set_error(ctx, error);
    2288025665            wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth);
     25666        #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    2288125667            if (ctx->store && ctx->store->verify_cb)
    2288225668                ctx->store->verify_cb(0, ctx);
    22883         }
    22884 #endif /* OPENSSL_ALL || WOLFSSL_QT */
    22885         return ret;
     25669        #endif
     25670        }
     25671
     25672        /* OpenSSL returns 0 when a chain can't be built */
     25673        if (ret == ASN_NO_SIGNER_E)
     25674            return WOLFSSL_FAILURE;
     25675        else
     25676            return ret;
    2288625677    }
    2288725678    return WOLFSSL_FATAL_ERROR;
    2288825679}
    22889 
    2289025680
    2289125681/* Use the public key to verify the signature. Note: this only verifies
    2289225682 * the certificate signature.
    2289325683 * returns WOLFSSL_SUCCESS on successful signature verification */
    22894 int wolfSSL_X509_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
     25684static int verifyX509orX509REQ(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey, int req)
    2289525685{
    2289625686    int ret;
     
    2289925689    int type;
    2290025690
     25691    (void)req;
     25692
    2290125693    if (x509 == NULL || pkey == NULL) {
    2290225694        return WOLFSSL_FATAL_ERROR;
     
    2292725719    }
    2292825720
    22929     ret = CheckCertSignaturePubKey(der, derSz, x509->heap,
    22930             (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
     25721#ifdef WOLFSSL_CERT_REQ
     25722    if (req)
     25723        ret = CheckCSRSignaturePubKey(der, derSz, x509->heap,
     25724                (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
     25725    else
     25726#endif
     25727        ret = CheckCertSignaturePubKey(der, derSz, x509->heap,
     25728                (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type);
    2293125729    if (ret == 0) {
    2293225730        return WOLFSSL_SUCCESS;
     
    2293425732    return WOLFSSL_FAILURE;
    2293525733}
    22936 #endif /* NO_CERTS */
     25734
     25735int wolfSSL_X509_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
     25736{
     25737    return verifyX509orX509REQ(x509, pkey, 0);
     25738}
     25739
     25740#ifdef WOLFSSL_CERT_REQ
     25741int wolfSSL_X509_REQ_verify(WOLFSSL_X509* x509, WOLFSSL_EVP_PKEY* pkey)
     25742{
     25743    return verifyX509orX509REQ(x509, pkey, 1);
     25744}
     25745#endif /* WOLFSSL_CERT_REQ */
     25746#endif /* !NO_CERTS */
    2293725747
    2293825748#if !defined(NO_FILESYSTEM)
     
    2305125861        WOLFSSL_MSG("Bad argument value");
    2305225862    } else {
    23053         newcrl = (WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL,
    23054                 DYNAMIC_TYPE_TMP_BUFFER);
     25863        newcrl =(WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), NULL,
     25864                DYNAMIC_TYPE_CRL);
    2305525865        if (newcrl == NULL){
    2305625866            WOLFSSL_MSG("New CRL allocation failed");
     
    2308025890    return newcrl;
    2308125891}
    23082 
     25892#endif /* HAVE_CRL */
     25893#endif /* OPENSSL_EXTRA */
     25894
     25895#if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL))
    2308325896void wolfSSL_X509_CRL_free(WOLFSSL_X509_CRL *crl)
    2308425897{
    2308525898    WOLFSSL_ENTER("wolfSSL_X509_CRL_free");
    2308625899
    23087     FreeCRL(crl, 1);
    23088     return;
    23089 }
    23090 #endif /* HAVE_CRL */
    23091 
     25900    if (crl)
     25901        FreeCRL(crl, 1);
     25902}
     25903#endif /* HAVE_CRL && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */
     25904
     25905#ifdef OPENSSL_EXTRA
    2309225906#ifndef NO_WOLFSSL_STUB
    2309325907WOLFSSL_ASN1_TIME* wolfSSL_X509_CRL_get_lastUpdate(WOLFSSL_X509_CRL* crl)
     
    2318025994}
    2318125995#endif
     25996
     25997
     25998WOLFSSL_X509_VERIFY_PARAM* wolfSSL_X509_VERIFY_PARAM_new(void)
     25999{
     26000    WOLFSSL_X509_VERIFY_PARAM *param = NULL;
     26001    param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC(
     26002            sizeof(WOLFSSL_X509_VERIFY_PARAM), NULL, DYNAMIC_TYPE_OPENSSL);
     26003    if (param != NULL)
     26004        XMEMSET(param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM ));
     26005
     26006    return(param);
     26007}
     26008
     26009
     26010void wolfSSL_X509_VERIFY_PARAM_free(WOLFSSL_X509_VERIFY_PARAM *param)
     26011{
     26012    if (param != NULL)
     26013        XFREE(param, NULL, DYNAMIC_TYPE_OPENSSL);
     26014}
     26015
     26016
     26017/* Sets flags by OR'ing with existing value. */
     26018int wolfSSL_X509_VERIFY_PARAM_set_flags(WOLFSSL_X509_VERIFY_PARAM *param,
     26019        unsigned long flags)
     26020{
     26021    int ret = WOLFSSL_FAILURE;
     26022
     26023    if (param != NULL) {
     26024        param->flags |= flags;
     26025        ret = WOLFSSL_SUCCESS;
     26026    }
     26027
     26028    return ret;
     26029}
     26030
     26031
     26032int wolfSSL_X509_VERIFY_PARAM_get_flags(WOLFSSL_X509_VERIFY_PARAM *param)
     26033{
     26034    int ret = 0;
     26035
     26036    if (param != NULL) {
     26037        ret = (int)param->flags;
     26038    }
     26039
     26040    return ret;
     26041}
     26042
     26043
     26044int wolfSSL_X509_VERIFY_PARAM_clear_flags(WOLFSSL_X509_VERIFY_PARAM *param,
     26045        unsigned long flags)
     26046{
     26047    int ret = WOLFSSL_FAILURE;
     26048
     26049    if (param != NULL) {
     26050        param->flags &= ~flags;
     26051        ret = WOLFSSL_SUCCESS;
     26052    }
     26053
     26054    return ret;
     26055}
     26056
     26057
    2318226058/******************************************************************************
    2318326059* wolfSSL_X509_VERIFY_PARAM_set1_host - sets the DNS hostname to name
     
    2336926245#endif /* !NO_ASN_TIME */
    2337026246
    23371 #if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) && !defined(USER_TIME) && \
    23372     !defined(TIME_OVERRIDES)
     26247#if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) && \
     26248    !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
    2337326249WOLFSSL_ASN1_TIME *wolfSSL_X509_time_adj_ex(WOLFSSL_ASN1_TIME *asnTime,
    2337426250    int offset_day, long offset_sec, time_t *in_tm)
     
    2341526291#endif
    2341626292
     26293#endif /* OPENSSL_EXTRA */
     26294
     26295#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    2341726296/* Used to create a new WOLFSSL_ASN1_INTEGER structure.
    2341826297 * returns a pointer to new structure on success and NULL on failure
     
    2345426333WOLFSSL_ASN1_INTEGER* wolfSSL_ASN1_INTEGER_dup(const WOLFSSL_ASN1_INTEGER* src)
    2345526334{
    23456     WOLFSSL_ASN1_INTEGER* dup;
     26335    WOLFSSL_ASN1_INTEGER* copy;
    2345726336    WOLFSSL_ENTER("wolfSSL_ASN1_INTEGER_dup");
    2345826337    if (!src)
    2345926338        return NULL;
    2346026339
    23461     dup = wolfSSL_ASN1_INTEGER_new();
    23462 
    23463     if (dup == NULL)
     26340    copy = wolfSSL_ASN1_INTEGER_new();
     26341
     26342    if (copy == NULL)
    2346426343        return NULL;
    2346526344
    23466     dup->negative  = src->negative;
    23467     dup->dataMax   = src->dataMax;
    23468     dup->isDynamic = src->isDynamic;
     26345    copy->negative  = src->negative;
     26346    copy->dataMax   = src->dataMax;
     26347    copy->isDynamic = src->isDynamic;
    2346926348#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    23470     dup->length    = src->length;
    23471 #endif
    23472     XSTRNCPY((char*)dup->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX);
    23473 
    23474     if (dup->isDynamic && src->data && dup->dataMax) {
    23475         dup->data = (unsigned char*)
     26349    copy->length    = src->length;
     26350#endif
     26351    XSTRNCPY((char*)copy->intData,(const char*)src->intData,WOLFSSL_ASN1_INTEGER_MAX);
     26352
     26353    if (copy->isDynamic && src->data && copy->dataMax) {
     26354        copy->data = (unsigned char*)
    2347626355            XMALLOC(src->dataMax,NULL,DYNAMIC_TYPE_OPENSSL);
    23477         if (dup->data == NULL) {
    23478             wolfSSL_ASN1_INTEGER_free(dup);
     26356        if (copy->data == NULL) {
     26357            wolfSSL_ASN1_INTEGER_free(copy);
    2347926358            return NULL;
    2348026359        }
    23481         XMEMCPY(dup->data,src->data,dup->dataMax);
    23482     }
    23483     return dup;
     26360        XMEMCPY(copy->data, src->data, copy->dataMax);
     26361    }
     26362    return copy;
    2348426363}
    2348526364
     
    2358926468}
    2359026469
    23591 #endif /* OPENSSL_EXTRA */
     26470#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
    2359226471
    2359326472#if defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \
    2359426473    defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
    2359526474#ifndef NO_ASN_TIME
     26475#ifndef NO_BIO
    2359626476int wolfSSL_ASN1_TIME_print(WOLFSSL_BIO* bio, const WOLFSSL_ASN1_TIME* asnTime)
    2359726477{
     
    2360926489                sizeof(buf)) == NULL) {
    2361026490        XMEMSET(buf, 0, MAX_TIME_STRING_SZ);
    23611         XMEMCPY(buf, "Bad time value", 14);
     26491        XSTRNCPY(buf, "Bad time value", sizeof(buf)-1);
    2361226492        ret = WOLFSSL_FAILURE;
    2361326493    }
     
    2362026500    return ret;
    2362126501}
     26502#endif /* !NO_BIO */
    2362226503
    2362326504char* wolfSSL_ASN1_TIME_to_string(WOLFSSL_ASN1_TIME* t, char* buf, int len)
     
    2366826549#endif
    2366926550
     26551#endif /* OPENSSL_EXTRA */
     26552
     26553#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    2367026554/* get X509_STORE_CTX ex_data, max idx is MAX_EX_DATA */
    2367126555void* wolfSSL_X509_STORE_CTX_get_ex_data(WOLFSSL_X509_STORE_CTX* ctx, int idx)
    2367226556{
    2367326557    WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_get_ex_data");
    23674     #if defined(HAVE_EX_DATA) || defined(FORTRESS)
     26558#if defined(HAVE_EX_DATA) || defined(FORTRESS)
    2367526559    if (ctx != NULL) {
    2367626560        return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
    2367726561    }
    23678     #else
     26562#else
    2367926563    (void)ctx;
    2368026564    (void)idx;
    23681     #endif
     26565#endif
    2368226566    return NULL;
    2368326567}
    23684 
     26568#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     26569
     26570#ifdef OPENSSL_EXTRA
    2368526571
    2368626572/* set X509_STORE_CTX ex_data, max idx is MAX_EX_DATA. Return WOLFSSL_SUCCESS
     
    2369026576{
    2369126577    WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_set_ex_data");
    23692     #if defined(HAVE_EX_DATA) || defined(FORTRESS)
     26578#if defined(HAVE_EX_DATA) || defined(FORTRESS)
    2369326579    if (ctx != NULL)
    2369426580    {
    2369526581        return wolfSSL_CRYPTO_set_ex_data(&ctx->ex_data, idx, data);
    2369626582    }
    23697     #else
     26583#else
    2369826584    (void)ctx;
    2369926585    (void)idx;
    2370026586    (void)data;
    23701     #endif
     26587#endif
    2370226588    return WOLFSSL_FAILURE;
    2370326589}
     
    2373326619}
    2373426620
    23735 
     26621#endif /* OPENSSL_EXTRA */
     26622
     26623#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    2373626624/* Gets an index to store SSL structure at.
    2373726625 *
     
    2374526633    return 0;
    2374626634}
    23747 
    23748 
     26635#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     26636
     26637#ifdef OPENSSL_EXTRA
    2374926638/* Set an error stat in the X509 STORE CTX
    2375026639 *
     
    2379926688int wolfSSL_ERR_GET_LIB(unsigned long err)
    2380026689{
    23801     switch (err) {
     26690    unsigned long value;
     26691
     26692    value = (err & 0xFFFFFFL);
     26693    switch (value) {
    2380226694    case PEM_R_NO_START_LINE:
    2380326695    case PEM_R_PROBLEMS_GETTING_PASSWORD:
     
    2452327415#endif /* OPENSSL_EXTRA */
    2452427416
    24525 #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)
    2452627417static long wolf_set_options(long old_op, long op)
    2452727418{
     
    2454627437#endif
    2454727438
    24548     if ((op & SSL_OP_NO_TLSv1_2) == SSL_OP_NO_TLSv1_2) {
     27439    if ((op & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) {
    2454927440        WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_2");
    2455027441    }
    2455127442
    24552     if ((op & SSL_OP_NO_TLSv1_1) == SSL_OP_NO_TLSv1_1) {
     27443    if ((op & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) {
    2455327444        WOLFSSL_MSG("\tSSL_OP_NO_TLSv1_1");
    2455427445    }
    2455527446
    24556     if ((op & SSL_OP_NO_TLSv1) == SSL_OP_NO_TLSv1) {
     27447    if ((op & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) {
    2455727448        WOLFSSL_MSG("\tSSL_OP_NO_TLSv1");
    2455827449    }
    2455927450
    24560     if ((op & SSL_OP_NO_SSLv3) == SSL_OP_NO_SSLv3) {
     27451    if ((op & WOLFSSL_OP_NO_SSLv3) == WOLFSSL_OP_NO_SSLv3) {
    2456127452        WOLFSSL_MSG("\tSSL_OP_NO_SSLv3");
    2456227453    }
     
    2457627467    return old_op | op;
    2457727468}
    24578 #endif
    24579 
    24580 #ifdef OPENSSL_EXTRA
     27469
     27470#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    2458127471long wolfSSL_set_options(WOLFSSL* ssl, long op)
    2458227472{
     
    2463227522#endif
    2463327523
    24634     InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
    24635                        ssl->options.haveDH, ssl->options.haveNTRU,
    24636                        ssl->options.haveECDSAsig, ssl->options.haveECC,
    24637                        ssl->options.haveStaticECC, ssl->options.side);
     27524    if (ssl->suites != NULL && ssl->options.side != WOLFSSL_NEITHER_END)
     27525        InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
     27526                           ssl->options.haveDH, ssl->options.haveNTRU,
     27527                           ssl->options.haveECDSAsig, ssl->options.haveECC,
     27528                           ssl->options.haveStaticECC, ssl->options.side);
    2463827529
    2463927530    return ssl->options.mask;
     
    2464827539    return ssl->options.mask;
    2464927540}
     27541
     27542#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     27543
     27544#if defined(HAVE_SECURE_RENEGOTIATION) \
     27545        || defined(HAVE_SERVER_RENEGOTIATION_INFO)
     27546/* clears the counter for number of renegotiations done
     27547 * returns the current count before it is cleared */
     27548long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
     27549{
     27550    long total;
     27551
     27552    WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
     27553    if (s == NULL)
     27554        return 0;
     27555
     27556    total = s->secure_rene_count;
     27557    s->secure_rene_count = 0;
     27558    return total;
     27559}
     27560
     27561
     27562/* return the number of renegotiations since wolfSSL_new */
     27563long wolfSSL_total_renegotiations(WOLFSSL *s)
     27564{
     27565    WOLFSSL_ENTER("wolfSSL_total_renegotiations");
     27566    return wolfSSL_num_renegotiations(s);
     27567}
     27568
     27569
     27570/* return the number of renegotiations since wolfSSL_new */
     27571long wolfSSL_num_renegotiations(WOLFSSL* s)
     27572{
     27573    if (s == NULL) {
     27574        return 0;
     27575    }
     27576
     27577    return s->secure_rene_count;
     27578}
     27579
     27580
     27581/* Is there a renegotiation currently in progress? */
     27582int  wolfSSL_SSL_renegotiate_pending(WOLFSSL *s)
     27583{
     27584    return s && s->options.handShakeDone &&
     27585            s->options.handShakeState != HANDSHAKE_DONE ? 1 : 0;
     27586}
     27587#endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
     27588
     27589#ifdef OPENSSL_EXTRA
    2465027590
    2465127591long wolfSSL_clear_options(WOLFSSL* ssl, long opt)
     
    2465927599
    2466027600
    24661 #if defined(HAVE_SECURE_RENEGOTIATION) \
    24662         || defined(HAVE_SERVER_RENEGOTIATION_INFO)
    24663 /* clears the counter for number of renegotiations done
    24664  * returns the current count before it is cleared */
    24665 long wolfSSL_clear_num_renegotiations(WOLFSSL *s)
    24666 {
    24667     long total;
    24668 
    24669     WOLFSSL_ENTER("wolfSSL_clear_num_renegotiations");
    24670     if (s == NULL)
    24671         return 0;
    24672 
    24673     total = s->secure_rene_count;
    24674     s->secure_rene_count = 0;
    24675     return total;
    24676 }
    24677 
    24678 
    24679 /* return the number of renegotiations since wolfSSL_new */
    24680 long wolfSSL_total_renegotiations(WOLFSSL *s)
    24681 {
    24682     WOLFSSL_ENTER("wolfSSL_total_renegotiations");
    24683     return wolfSSL_num_renegotiations(s);
    24684 }
    24685 
    24686 
    24687 /* return the number of renegotiations since wolfSSL_new */
    24688 long wolfSSL_num_renegotiations(WOLFSSL* s)
    24689 {
    24690     if (s == NULL) {
    24691         return 0;
    24692     }
    24693 
    24694     return s->secure_rene_count;
    24695 }
    24696 #endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
    24697 
    2469827601#ifndef NO_DH
    2469927602long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh)
     
    2475227655
    2475327656#if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
    24754 const unsigned char *SSL_SESSION_get0_id_context(const SSL_SESSION *sess, unsigned int *sid_ctx_length)
    24755 {
    24756     const byte *c = wolfSSL_SESSION_get_id((SSL_SESSION *)sess, sid_ctx_length);
     27657const unsigned char *SSL_SESSION_get0_id_context(const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length)
     27658{
     27659    const byte *c = wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length);
    2475727660    return c;
    2475827661}
     
    2496627869    switch (type) {
    2496727870        case V_ASN1_OBJECT:
    24968             a->value.object = value;
     27871            a->value.object = (WOLFSSL_ASN1_OBJECT*)value;
    2496927872            break;
    2497027873        case V_ASN1_UTCTIME:
    24971             a->value.utctime = value;
     27874            a->value.utctime = (WOLFSSL_ASN1_TIME*)value;
    2497227875            break;
    2497327876        case V_ASN1_GENERALIZEDTIME:
    24974             a->value.generalizedtime = value;
     27877            a->value.generalizedtime = (WOLFSSL_ASN1_TIME*)value;
    2497527878            break;
    2497627879        default:
     
    2501427917                wolfSSL_ASN1_TIME_free(at->value.generalizedtime);
    2501527918                break;
     27919            case V_ASN1_UTF8STRING:
     27920            case V_ASN1_PRINTABLESTRING:
     27921            case V_ASN1_T61STRING:
     27922            case V_ASN1_IA5STRING:
     27923            case V_ASN1_UNIVERSALSTRING:
     27924                wolfSSL_ASN1_STRING_free(at->value.asn1_string);
     27925                break;
    2501627926            default:
    2501727927                WOLFSSL_MSG("Unknown or unsupported ASN1_TYPE");
     
    2510428014        *ppkalg = pub->algor->algorithm;
    2510528015    if (pk)
    25106         wolfSSL_EVP_PKEY_get_der(pub->pkey, (unsigned char **)pk);
     28016        *pk = (unsigned char*)pub->pkey->pkey.ptr;
    2510728017    if (ppklen)
    25108         *ppklen = wolfSSL_EVP_PKEY_get_der(pub->pkey, NULL);
     28018        *ppklen = pub->pkey->pkey_sz;
    2510928019
    2511028020    return WOLFSSL_SUCCESS;
     
    2511528025{
    2511628026    WOLFSSL_ENTER("wolfSSL_X509_PUBKEY_get");
    25117     if(key == NULL || key->pkey == NULL){
     28027    if (key == NULL || key->pkey == NULL) {
    2511828028        WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_FUNC_ARG);
     28029        return NULL;
     28030    }
     28031    if (wolfSSL_EVP_PKEY_up_ref(key->pkey) != WOLFSSL_SUCCESS) {
     28032        WOLFSSL_LEAVE("wolfSSL_X509_PUBKEY_get", BAD_MUTEX_E);
    2511928033        return NULL;
    2512028034    }
     
    2520328117#endif
    2520428118
     28119WOLFSSL_ASN1_OBJECT *wolfSSL_d2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
     28120                                             const unsigned char **der,
     28121                                             long length)
     28122{
     28123    const unsigned char *d;
     28124    long len;
     28125    int tag, cls;
     28126    WOLFSSL_ASN1_OBJECT* ret = NULL;
     28127
     28128    WOLFSSL_ENTER("wolfSSL_d2i_ASN1_OBJECT");
     28129
     28130    if (!der || !*der || length <= 0) {
     28131        WOLFSSL_MSG("Bad parameter");
     28132        return NULL;
     28133    }
     28134
     28135    d = *der;
     28136
     28137    if (wolfSSL_ASN1_get_object(&d, &len, &tag, &cls, length) & 0x80) {
     28138        WOLFSSL_MSG("wolfSSL_ASN1_get_object error");
     28139        return NULL;
     28140    }
     28141    /* d now points to value */
     28142
     28143    if (tag != ASN_OBJECT_ID) {
     28144        WOLFSSL_MSG("Not an ASN object");
     28145        return NULL;
     28146    }
     28147
     28148    ret = wolfSSL_c2i_ASN1_OBJECT(a, &d, len);
     28149    if (ret)
     28150        *der = d;
     28151    return ret;
     28152}
     28153
     28154/**
     28155 * Parse an ASN1 encoded input and output information about the parsed object
     28156 * @param in    ASN1 encoded data. *in is moved to the value of the ASN1 object
     28157 * @param len   Length of parsed ASN1 object
     28158 * @param tag   Tag value of parsed ASN1 object
     28159 * @param cls   Class of parsed ASN1 object
     28160 * @param inLen Length of *in buffer
     28161 * @return int  Depends on which bits are set in the returned int:
     28162 *              0x80 an error occurred during parsing
     28163 *              0x20 parsed object is constructed
     28164 *              0x01 the parsed object length is infinite
     28165 */
     28166int wolfSSL_ASN1_get_object(const unsigned char **in, long *len, int *tag,
     28167                            int *cls, long inLen)
     28168{
     28169    word32 inOutIdx = 0;
     28170    int l;
     28171    byte t;
     28172    int ret = 0x80;
     28173
     28174    WOLFSSL_ENTER("wolfSSL_ASN1_get_object");
     28175
     28176    if (!in || !*in || !len || !tag || !cls || inLen == 0) {
     28177        WOLFSSL_MSG("Bad parameter");
     28178        return ret;
     28179    }
     28180
     28181    if (GetASNTag(*in, &inOutIdx, &t, (word32)inLen) != 0) {
     28182        WOLFSSL_MSG("GetASNTag error");
     28183        return ret;
     28184    }
     28185
     28186    if (GetLength(*in, &inOutIdx, &l, (word32)inLen) < 0) {
     28187        WOLFSSL_MSG("GetLength error");
     28188        return ret;
     28189    }
     28190
     28191    *tag = t & 0x1F; /* Tag number is 5 lsb */
     28192    *cls = t & 0xC0; /* Class is 2 msb */
     28193    *len = l;
     28194    ret = t & ASN_CONSTRUCTED;
     28195
     28196    if (l > (int)(inLen - inOutIdx)) {
     28197        /* Still return other values but indicate error in msb */
     28198        ret |= 0x80;
     28199    }
     28200
     28201    *in += inOutIdx;
     28202    return ret;
     28203}
     28204
     28205WOLFSSL_ASN1_OBJECT *wolfSSL_c2i_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT **a,
     28206        const unsigned char **pp, long len)
     28207{
     28208    WOLFSSL_ASN1_OBJECT* ret = NULL;
     28209
     28210    WOLFSSL_ENTER("wolfSSL_c2i_ASN1_OBJECT");
     28211
     28212    if (!pp || !*pp || len <= 0) {
     28213        WOLFSSL_MSG("Bad parameter");
     28214        return NULL;
     28215    }
     28216
     28217    if (!(ret = wolfSSL_ASN1_OBJECT_new())) {
     28218        WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new error");
     28219        return NULL;
     28220    }
     28221
     28222    ret->obj = (const unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_ASN1);
     28223    if (!ret->obj) {
     28224        WOLFSSL_MSG("error allocating asn data memory");
     28225        wolfSSL_ASN1_OBJECT_free(ret);
     28226        return NULL;
     28227    }
     28228
     28229    XMEMCPY((byte*)ret->obj, *pp, len);
     28230    ret->objSz = (unsigned int)len;
     28231    ret->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
     28232
     28233    *pp += len;
     28234
     28235    if (a)
     28236        *a = ret;
     28237    return ret;
     28238}
     28239
     28240#ifndef NO_BIO
    2520528241/* Return number of bytes written to BIO on success. 0 on failure. */
    2520628242WOLFSSL_API int wolfSSL_i2a_ASN1_OBJECT(WOLFSSL_BIO *bp,
     
    2524428280    return WOLFSSL_FAILURE;
    2524528281}
     28282#endif /* !NO_BIO */
     28283
     28284/* Returns object data for an ASN1_OBJECT */
     28285/* If pp is NULL then only the size is returned */
     28286/* If pp has pointer to pointer then its used directly */
     28287/* If pp has pointer to pointer that is NULL then new variable is allocated */
     28288/* Failure returns WOLFSSL_FAILURE (0) */
     28289int wolfSSL_i2d_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT *a, unsigned char **pp)
     28290{
     28291    byte *p;
     28292
     28293    WOLFSSL_ENTER("wolfSSL_i2d_ASN1_OBJECT");
     28294
     28295    if (!a || !a->obj) {
     28296        WOLFSSL_MSG("Bad parameters");
     28297        return WOLFSSL_FAILURE;
     28298    }
     28299
     28300    if (!pp)
     28301        return a->objSz;
     28302
     28303    if (*pp)
     28304        p = *pp;
     28305    else {
     28306        p = (byte*)XMALLOC(a->objSz, NULL, DYNAMIC_TYPE_OPENSSL);
     28307        if (!p) {
     28308            WOLFSSL_MSG("Bad malloc");
     28309            return WOLFSSL_FAILURE;
     28310        }
     28311    }
     28312
     28313    XMEMCPY(p, a->obj, a->objSz);
     28314    *pp = p + a->objSz;
     28315    return a->objSz;
     28316}
    2524628317
    2524728318#if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)
    25248 #ifndef NO_WOLFSSL_STUB
    25249 /*** TBD ***/
    25250 WOLFSSL_API size_t SSL_get_finished(const WOLFSSL *s, void *buf, size_t count)
    25251 {
    25252     (void)s;
    25253     (void)buf;
    25254     (void)count;
    25255     WOLFSSL_STUB("SSL_get_finished");
    25256     return WOLFSSL_FAILURE;
    25257 }
    25258 #endif
    25259 
    25260 #ifndef NO_WOLFSSL_STUB
    25261 /*** TBD ***/
    25262 WOLFSSL_API size_t SSL_get_peer_finished(const WOLFSSL *s, void *buf, size_t count)
    25263 {
    25264     (void)s;
    25265     (void)buf;
    25266     (void)count;
    25267     WOLFSSL_STUB("SSL_get_peer_finished");
    25268     return WOLFSSL_FAILURE;
    25269 }
    25270 #endif
     28319WOLFSSL_API size_t wolfSSL_get_finished(const WOLFSSL *ssl, void *buf, size_t count)
     28320{
     28321    WOLFSSL_ENTER("SSL_get_finished");
     28322
     28323    if (!ssl || !buf || count < TLS_FINISHED_SZ) {
     28324        WOLFSSL_MSG("Bad parameter");
     28325        return WOLFSSL_FAILURE;
     28326    }
     28327
     28328    if (ssl->options.side == WOLFSSL_SERVER_END)
     28329        XMEMCPY(buf, ssl->serverFinished,
     28330                TLS_FINISHED_SZ);
     28331    else
     28332        XMEMCPY(buf, ssl->clientFinished,
     28333                TLS_FINISHED_SZ);
     28334    return TLS_FINISHED_SZ;
     28335}
     28336
     28337WOLFSSL_API size_t wolfSSL_get_peer_finished(const WOLFSSL *ssl, void *buf, size_t count)
     28338{
     28339    WOLFSSL_ENTER("SSL_get_peer_finished");
     28340
     28341    if (!ssl || !buf || count < TLS_FINISHED_SZ) {
     28342        WOLFSSL_MSG("Bad parameter");
     28343        return WOLFSSL_FAILURE;
     28344    }
     28345
     28346    if (ssl->options.side == WOLFSSL_CLIENT_END)
     28347        XMEMCPY(buf, ssl->serverFinished,
     28348                TLS_FINISHED_SZ);
     28349    else
     28350        XMEMCPY(buf, ssl->clientFinished,
     28351                TLS_FINISHED_SZ);
     28352    return TLS_FINISHED_SZ;
     28353}
    2527128354#endif /* WOLFSSL_HAPROXY */
    2527228355
     
    2537528458            if (readCtx == NULL) {
    2537628459                WOLFSSL_MSG("Memory error");
     28460                wolfSSL_CTX_free(ctx);
    2537728461                return WOLFSSL_FAILURE;
    2537828462            }
     
    2541728501#endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */
    2541828502
    25419 #ifndef NO_WOLFSSL_STUB
    25420 /*** TBD ***/
    25421 WOLFSSL_API WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(void *ciphers, int idx)
    25422 {
    25423     (void)ciphers;
    25424     (void)idx;
    25425     WOLFSSL_STUB("wolfSSL_sk_SSL_CIPHER_value");
    25426     return NULL;
    25427 }
    25428 #endif
     28503WOLFSSL_API WOLFSSL_CIPHER* wolfSSL_sk_SSL_CIPHER_value(WOLFSSL_STACK* sk, int i)
     28504{
     28505    WOLFSSL_ENTER("wolfSSL_sk_SSL_CIPHER_value");
     28506    return (WOLFSSL_CIPHER*)wolfSSL_sk_value(sk, i);
     28507}
    2542928508
    2543028509WOLFSSL_API void ERR_load_SSL_strings(void)
     
    2559428673
    2559528674#ifdef WOLFSSL_SESSION_STATS
    25596     if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != SSL_SUCCESS) {
     28675    if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != WOLFSSL_SUCCESS) {
    2559728676        WOLFSSL_MSG("Error getting session stats");
    2559828677    }
     
    2567228751        }
    2567328752        c32to24(derSz, chain + idx);
    25674         idx += OPAQUE24_LEN,
     28753        idx += OPAQUE24_LEN;
    2567528754        XMEMCPY(chain + idx, der, derSz);
    2567628755        idx += derSz;
     
    2630829387#endif
    2630929388
     29389#ifndef NO_BIO
     29390
    2631029391#if !defined(NO_FILESYSTEM) && defined (OPENSSL_EXTRA)
    2631129392/* returns amount printed on success, negative in fail case */
     
    2632329404                return -1;
    2632429405            }
    26325             ret = vfprintf((XFILE)bio->ptr, format, args);
     29406            ret = XVFPRINTF((XFILE)bio->ptr, format, args);
    2632629407            break;
    2632729408
    2632829409        case WOLFSSL_BIO_MEMORY:
    26329     #if defined(OPENSSL_EXTRA) && !defined(_WIN32)
     29410    /* In Visual Studio versions prior to Visual Studio 2013, the va_* symbols
     29411       aren't defined. If using Visual Studio 2013 or later, define
     29412       HAVE_VA_COPY. */
     29413    #if defined(OPENSSL_EXTRA) && (!defined(_WIN32) || defined(HAVE_VA_COPY))
    2633029414        case WOLFSSL_BIO_SSL:
    2633129415            {
     
    2633429418                va_list copy;
    2633529419
    26336                 va_copy(copy, args);
    26337                 count = vsnprintf(NULL, 0, format, args);
     29420                #ifdef FUSION_RTOS
     29421                   copy = args;    /* hack, depends on internal implementation
     29422                                    * of va_list in VisualDSP++ */
     29423                #else
     29424                    va_copy(copy, args);
     29425                #endif
     29426                count = XVSNPRINTF(NULL, 0, format, args);
    2633829427                if (count >= 0)
    2633929428                {
     
    2634229431                    if (pt != NULL)
    2634329432                    {
    26344                         count = vsnprintf(pt, count + 1, format, copy);
     29433                        count = XVSNPRINTF(pt, count + 1, format, copy);
    2634529434                        if (count >= 0)
    2634629435                        {
     
    2637729466}
    2637829467
    26379 #endif /* !defined(NO_FILESYSTEM) && defined (OPENSSL_EXTRA) */
     29468#endif /* !NO_FILESYSTEM && OPENSSL_EXTRA */
    2638029469
    2638129470#if !defined(NO_FILESYSTEM) && defined(__clang__)
     
    2639829487
    2639929488        if (!buf) {
    26400             return fputs("\tNULL", (XFILE)bio->ptr);
    26401         }
    26402 
    26403         sprintf(line, "\t");
     29489            return XFPUTS("\tNULL", (XFILE)bio->ptr);
     29490        }
     29491
     29492        XSPRINTF(line, "\t");
    2640429493        for (i = 0; i < LINE_LEN; i++) {
    2640529494            if (i < length)
    26406                 sprintf(line + 1 + i * 3,"%02x ", buf[i]);
     29495                XSPRINTF(line + 1 + i * 3,"%02x ", buf[i]);
    2640729496            else
    26408                 sprintf(line + 1 + i * 3, "   ");
    26409         }
    26410         sprintf(line + 1 + LINE_LEN * 3, "| ");
     29497                XSPRINTF(line + 1 + i * 3, "   ");
     29498        }
     29499        XSPRINTF(line + 1 + LINE_LEN * 3, "| ");
    2641129500        for (i = 0; i < LINE_LEN; i++) {
    2641229501            if (i < length) {
    26413                 sprintf(line + 3 + LINE_LEN * 3 + i,
     29502                XSPRINTF(line + 3 + LINE_LEN * 3 + i,
    2641429503                     "%c", 31 < buf[i] && buf[i] < 127 ? buf[i] : '.');
    2641529504            }
    2641629505        }
    26417         ret += fputs(line, (XFILE)bio->ptr);
     29506        ret += XFPUTS(line, (XFILE)bio->ptr);
    2641829507
    2641929508        if (length > LINE_LEN)
     
    2644229531    return wolfSSL_ASN1_TIME_print(bio, a);
    2644329532}
     29533
     29534#endif /* !NO_BIO */
    2644429535
    2644529536/* Checks the ASN1 syntax of "a"
     
    2647229563}
    2647329564
    26474 WOLFSSL_API WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t)
     29565WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_set(WOLFSSL_ASN1_TIME *s, time_t t)
    2647529566{
    2647629567    WOLFSSL_STUB("wolfSSL_ASN1_TIME_set");
     
    2647929570    return s;
    2648029571}
     29572
     29573int wolfSSL_ASN1_TIME_set_string(WOLFSSL_ASN1_TIME *s, const char *str)
     29574{
     29575    int slen;
     29576    WOLFSSL_ENTER("wolfSSL_ASN1_TIME_set_string");
     29577
     29578    if (!str) {
     29579        WOLFSSL_MSG("Bad parameter");
     29580        return WOLFSSL_FAILURE;
     29581    }
     29582    slen = (int)XSTRLEN(str)+1;
     29583    if (slen > CTC_DATE_SIZE) {
     29584        WOLFSSL_MSG("Date string too long");
     29585        return WOLFSSL_FAILURE;
     29586    }
     29587    if (s) {
     29588        XMEMCPY(s->data, str, slen);
     29589        s->length = slen;
     29590        s->type = slen == ASN_UTC_TIME_SIZE ? ASN_UTC_TIME : ASN_GENERALIZED_TIME;
     29591    }
     29592    return WOLFSSL_SUCCESS;
     29593}
    2648129594#endif /* !NO_WOLFSSL_STUB */
     29595
     29596#ifndef NO_BIO
    2648229597
    2648329598/* Return the month as a string.
     
    2652729642    return 0;
    2652829643}
     29644#endif /* !NO_BIO */
    2652929645
    2653029646void wolfSSL_ASN1_GENERALIZEDTIME_free(WOLFSSL_ASN1_TIME* asn1Time)
     
    2653629652}
    2653729653
    26538 int wolfSSL_sk_num(WOLFSSL_STACK* sk)
     29654#endif /* OPENSSL_EXTRA */
     29655
     29656#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
     29657int wolfSSL_sk_num(const WOLFSSL_STACK* sk)
    2653929658{
    2654029659    WOLFSSL_ENTER("wolfSSL_sk_num");
     
    2654429663}
    2654529664
    26546 void* wolfSSL_sk_value(WOLFSSL_STACK* sk, int i)
    26547 {
    26548 #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    26549     int offset = i;
    26550 #endif
     29665void* wolfSSL_sk_value(const WOLFSSL_STACK* sk, int i)
     29666{
    2655129667    WOLFSSL_ENTER("wolfSSL_sk_value");
    2655229668
     
    2656029676            return (void*)sk->data.x509;
    2656129677        case STACK_TYPE_CIPHER:
    26562         #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
    26563             sk->data.cipher.offset = offset;
    26564         #endif
    2656529678            return (void*)&sk->data.cipher;
    2656629679        case STACK_TYPE_GEN_NAME:
     
    2657229685        case STACK_TYPE_X509_EXT:
    2657329686            return (void*)sk->data.ext;
     29687    #ifdef OPENSSL_EXTRA
    2657429688        case STACK_TYPE_CONF_VALUE:
    26575             return (void*)sk->data.conf->value;
     29689            return (void*)sk->data.conf;
     29690    #endif
    2657629691        case STACK_TYPE_NULL:
    2657729692        default:
    2657829693            return (void*)sk->data.generic;
    2657929694    }
     29695}
     29696
     29697/* copies over data of "in" to "out" */
     29698static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
     29699{
     29700    if (in == NULL || out == NULL)
     29701        return;
     29702
     29703    *out = *in;
     29704}
     29705
     29706WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk)
     29707{
     29708
     29709    WOLFSSL_STACK* ret = NULL;
     29710    WOLFSSL_STACK* last = NULL;
     29711
     29712    WOLFSSL_ENTER("wolfSSL_sk_dup");
     29713
     29714    while (sk) {
     29715        WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap);
     29716
     29717        if (!cur) {
     29718            WOLFSSL_MSG("wolfSSL_sk_new_node error");
     29719            goto error;
     29720        }
     29721
     29722        if (!ret) {
     29723            /* Set first node */
     29724            ret = cur;
     29725        }
     29726
     29727        if (last) {
     29728            last->next = cur;
     29729        }
     29730
     29731        XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK));
     29732
     29733        /* We will allocate new memory for this */
     29734        XMEMSET(&cur->data, 0, sizeof(cur->data));
     29735        cur->next = NULL;
     29736
     29737        switch (sk->type) {
     29738            case STACK_TYPE_X509:
     29739                cur->data.x509 = wolfSSL_X509_dup(sk->data.x509);
     29740                if (!cur->data.x509) {
     29741                    WOLFSSL_MSG("wolfSSL_X509_dup error");
     29742                    goto error;
     29743                }
     29744                break;
     29745            case STACK_TYPE_CIPHER:
     29746                wolfSSL_CIPHER_copy(&sk->data.cipher, &cur->data.cipher);
     29747                break;
     29748            case STACK_TYPE_GEN_NAME:
     29749                cur->data.gn = wolfSSL_GENERAL_NAME_dup(sk->data.gn);
     29750                if (!cur->data.gn) {
     29751                    WOLFSSL_MSG("wolfSSL_GENERAL_NAME_new error");
     29752                    goto error;
     29753                }
     29754                break;
     29755            case STACK_TYPE_OBJ:
     29756                cur->data.obj = wolfSSL_ASN1_OBJECT_dup(sk->data.obj);
     29757                if (!cur->data.obj) {
     29758                    WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_dup error");
     29759                    goto error;
     29760                }
     29761                break;
     29762            case STACK_TYPE_ACCESS_DESCRIPTION:
     29763            case STACK_TYPE_X509_EXT:
     29764            case STACK_TYPE_CONF_VALUE:
     29765            case STACK_TYPE_NULL:
     29766            default:
     29767                WOLFSSL_MSG("Unsupported stack type");
     29768                goto error;
     29769        }
     29770
     29771        sk = sk->next;
     29772        last = cur;
     29773    }
     29774    return ret;
     29775
     29776error:
     29777    if (ret) {
     29778        wolfSSL_sk_GENERAL_NAME_free(ret);
     29779    }
     29780    return NULL;
    2658029781}
    2658129782
     
    2661029811            wolfSSL_sk_ASN1_OBJECT_free(sk);
    2661129812            break;
     29813        #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
     29814            defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
     29815        case STACK_TYPE_STRING:
     29816            wolfSSL_sk_WOLFSSL_STRING_free(sk);
     29817            break;
     29818        #endif
    2661229819        #ifdef OPENSSL_ALL
    2661329820        case STACK_TYPE_X509_INFO:
     
    2662629833    }
    2662729834}
     29835
    2662829836/* Frees each node in the stack and frees the stack.
    2662929837 * Does not free any internal members of the stack nodes.
     
    2665729865int wolfSSL_sk_GENERIC_push(WOLFSSL_STACK* sk, void* generic)
    2665829866{
    26659     WOLFSSL_STACK* node;
    26660 
    2666129867    WOLFSSL_ENTER("wolfSSL_sk_GENERIC_push");
    2666229868
    26663     if (sk == NULL || generic == NULL) {
    26664         return WOLFSSL_FAILURE;
    26665     }
    26666 
    26667     /* no previous values in stack */
    26668     if (sk->data.generic == NULL) {
    26669         sk->data.generic = generic;
    26670         sk->num += 1;
    26671         return WOLFSSL_SUCCESS;
    26672     }
    26673 
    26674     /* stack already has value(s) create a new node and add more */
    26675     node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK),NULL,DYNAMIC_TYPE_SSL);
    26676     if (node == NULL) {
    26677         WOLFSSL_MSG("Memory error");
    26678         return WOLFSSL_FAILURE;
    26679     }
    26680     XMEMSET(node, 0, sizeof(WOLFSSL_STACK));
    26681 
    26682     /* push new node onto head of stack */
    26683     node->type         = sk->type;
    26684     node->data.generic = sk->data.generic;
    26685     node->next         = sk->next;
    26686     sk->next           = node;
    26687     sk->data.generic   = generic;
    26688     sk->num           += 1;
    26689 
    26690     return WOLFSSL_SUCCESS;
     29869    return wolfSSL_sk_push(sk, generic);
    2669129870}
    2669229871void wolfSSL_sk_GENERIC_free(WOLFSSL_STACK* sk)
     
    2669429873    wolfSSL_sk_GENERIC_pop_free(sk, NULL);
    2669529874}
    26696 
     29875#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     29876
     29877#ifdef OPENSSL_EXTRA
    2669729878
    2669829879/* Free all nodes in a stack */
     
    2674729928    }
    2674829929}
    26749 
    26750 #if defined(OPENSSL_ALL)
    26751 /* Free the structure for WOLFSSL_CONF_VALUE stack
    26752  *
    26753  * sk  stack to free nodes in
    26754  */
    26755 void wolfSSL_sk_CONF_VALUE_free(WOLF_STACK_OF(WOLFSSL_CONF_VALUE)* sk)
    26756 {
    26757     WOLFSSL_STACK* node;
    26758     WOLFSSL_STACK* tmp;
    26759     WOLFSSL_ENTER("wolfSSL_sk_CONF_VALUE_free");
    26760 
    26761     if (sk == NULL)
    26762         return;
    26763 
    26764     /* parse through stack freeing each node */
    26765     node = sk->next;
    26766     while (node) {
    26767         tmp  = node;
    26768         node = node->next;
    26769         XFREE(tmp, NULL, DYNAMIC_TYPE_OPENSSL);
    26770     }
    26771 
    26772     /* free head of stack */
    26773     XFREE(sk, NULL, DYNAMIC_TYPE_ASN1);
    26774 }
    26775 #endif
    26776 
     29930#endif /* OPENSSL_EXTRA */
     29931
     29932#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
    2677729933/* Creates and returns a new null stack. */
    2677829934WOLFSSL_STACK* wolfSSL_sk_new_null(void)
     
    2679429950}
    2679529951
     29952WOLFSSL_BASIC_CONSTRAINTS* wolfSSL_BASIC_CONSTRAINTS_new(void)
     29953{
     29954    WOLFSSL_BASIC_CONSTRAINTS* bc;
     29955    bc = (WOLFSSL_BASIC_CONSTRAINTS*)
     29956          XMALLOC(sizeof(WOLFSSL_BASIC_CONSTRAINTS), NULL,
     29957          DYNAMIC_TYPE_X509_EXT);
     29958    if (bc == NULL) {
     29959        WOLFSSL_MSG("Failed to malloc basic constraints");
     29960        return NULL;
     29961    }
     29962    XMEMSET(bc, 0, sizeof(WOLFSSL_BASIC_CONSTRAINTS));
     29963    return bc;
     29964}
     29965
    2679629966/* frees the wolfSSL_BASIC_CONSTRAINTS object */
    2679729967void wolfSSL_BASIC_CONSTRAINTS_free(WOLFSSL_BASIC_CONSTRAINTS *bc)
     
    2680829978}
    2680929979
     29980WOLFSSL_AUTHORITY_KEYID* wolfSSL_AUTHORITY_KEYID_new(void)
     29981{
     29982    WOLFSSL_AUTHORITY_KEYID* akey = (WOLFSSL_AUTHORITY_KEYID*)XMALLOC(
     29983          sizeof(WOLFSSL_AUTHORITY_KEYID), NULL, DYNAMIC_TYPE_OPENSSL);
     29984    if (!akey) {
     29985        WOLFSSL_MSG("Issue creating WOLFSSL_AUTHORITY_KEYID struct");
     29986        return NULL;
     29987    }
     29988    XMEMSET(akey, 0, sizeof(WOLFSSL_AUTHORITY_KEYID));
     29989    return akey;
     29990}
     29991
    2681029992/* frees the wolfSSL_AUTHORITY_KEYID object */
    2681129993void wolfSSL_AUTHORITY_KEYID_free(WOLFSSL_AUTHORITY_KEYID *id)
     
    2683530017}
    2683630018
    26837 #endif /* OPENSSL_EXTRA */
    26838 
    26839 #if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE)
     30019#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     30020
     30021#if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
     30022        defined(HAVE_EXT_CACHE))
    2684030023/* stunnel 4.28 needs
    2684130024 *
     
    2688130064#endif
    2688230065}
    26883 #endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */
    26884 
    26885 #ifdef OPENSSL_EXTRA
     30066
    2688630067
    2688730068/*
     
    2690630087    }
    2690730088
    26908     /* bornOn | timeout | sessionID len | sessionID | masterSecret | haveEMS */
    26909     size += OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN + sess->sessionIDSz +
    26910             SECRET_LEN + OPAQUE8_LEN;
     30089    /* side | bornOn | timeout | sessionID len | sessionID | masterSecret |
     30090     * haveEMS  */
     30091    size += OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN +
     30092            sess->sessionIDSz + SECRET_LEN + OPAQUE8_LEN;
    2691130093#ifdef SESSION_CERTS
    2691230094    /* Peer chain */
     
    2694130123    /* ticketSeen | ticketAdd */
    2694230124    size += OPAQUE32_LEN + OPAQUE32_LEN;
    26943 #ifndef WOLFSSL_TLS13_DRAFT_18
    2694430125    /* ticketNonce */
    2694530126    size += OPAQUE8_LEN + sess->ticketNonce.len;
    26946 #endif
    2694730127#endif
    2694830128#ifdef WOLFSSL_EARLY_DATA
     
    2696230142        data = *p;
    2696330143
     30144        data[idx++] = sess->side;
    2696430145        c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN;
    2696530146        c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN;
     
    2700930190    c32toa(sess->ticketAdd, data + idx);
    2701030191    idx += OPAQUE32_LEN;
    27011 #ifndef WOLFSSL_TLS13_DRAFT_18
    2701230192    data[idx++] = sess->ticketNonce.len;
    2701330193    XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len);
    2701430194    idx += sess->ticketNonce.len;
    27015 #endif
    2701630195#endif
    2701730196#ifdef WOLFSSL_EARLY_DATA
     
    2707130250
    2707230251    if (s == NULL) {
    27073         s = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), NULL,
    27074                                       DYNAMIC_TYPE_OPENSSL);
     30252        s = wolfSSL_SESSION_new();
    2707530253        if (s == NULL)
    2707630254            return NULL;
    27077         XMEMSET(s, 0, sizeof(WOLFSSL_SESSION));
    27078         s->isAlloced = 1;
    2707930255#ifdef HAVE_SESSION_TICKET
    2708030256        s->isDynamic = 0;
     
    2708530261    data = (byte*)*p;
    2708630262
    27087     /* bornOn | timeout | sessionID len */
    27088     if (i < OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
     30263    /* side | bornOn | timeout | sessionID len */
     30264    if (i < OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) {
    2708930265        ret = BUFFER_ERROR;
    2709030266        goto end;
    2709130267    }
     30268    s->side = data[idx++];
    2709230269    ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN;
    2709330270    ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN;
     
    2719430371    ato32(data + idx, &s->ticketAdd);
    2719530372    idx += OPAQUE32_LEN;
    27196 #ifndef WOLFSSL_TLS13_DRAFT_18
    2719730373    if (i - idx < OPAQUE8_LEN) {
    2719830374        ret = BUFFER_ERROR;
     
    2720730383    XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len);
    2720830384    idx += s->ticketNonce.len;
    27209 #endif
    2721030385#endif
    2721130386#ifdef WOLFSSL_EARLY_DATA
     
    2725630431
    2725730432end:
    27258     if (ret != 0 && (sess == NULL || *sess != s))
     30433    if (ret != 0 && (sess == NULL || *sess != s)) {
    2725930434        wolfSSL_SESSION_free(s);
     30435        s = NULL;
     30436    }
    2726030437#endif
    2726130438    return s;
    2726230439}
    27263 
    2726430440
    2726530441long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess)
     
    2728230458}
    2728330459
    27284 
    27285 #endif /* OPENSSL_EXTRA */
     30460long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t)
     30461{
     30462    word32 tmptime;
     30463    if (!ses || t < 0)
     30464        return BAD_FUNC_ARG;
     30465
     30466    tmptime = t & 0xFFFFFFFF;
     30467
     30468    ses->timeout = tmptime;
     30469
     30470    return WOLFSSL_SUCCESS;
     30471}
     30472
     30473#endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
    2728630474
    2728730475
     
    2736730555#endif
    2736830556#endif /* OPENSSL_EXTRA */
    27369 #endif /* !WOLFCRYPT_ONLY */
    2737030557#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    2737130558const WOLFSSL_ObjectInfo wolfssl_object_info[] = {
     
    2744130628    { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName,
    2744230629            oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"},
     30630#ifdef WOLFSSL_CERT_REQ
     30631    { NID_pkcs9_challengePassword, CHALLENGE_PASSWORD_OID,
     30632            oidCsrAttrType, "challengePassword", "challengePassword"},
     30633#endif
    2744330634#endif
    2744430635#ifdef OPENSSL_EXTRA /* OPENSSL_EXTRA_X509_SMALL only needs the above */
     
    2747030661        #ifndef NO_SHA
    2747130662        { CTC_SHAwDSA, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"},
     30663        { CTC_SHA256wDSA, CTC_SHA256wDSA, oidSigType, "dsa_with_SHA256",
     30664                                                        "dsa_with_SHA256"},
    2747230665        #endif
    2747330666    #endif /* NO_DSA */
     
    2754030733        { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"},
    2754130734    #endif
     30735    #ifdef HAVE_ED448
     30736        { NID_ED448, ED448k,  oidKeyType, "ED448", "ED448"},
     30737    #endif
     30738    #ifdef HAVE_ED25519
     30739        { NID_ED25519, ED25519k,  oidKeyType, "ED25519", "ED25519"},
     30740    #endif
    2754230741
    2754330742        /* oidCurveType */
     
    2767630875const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ;
    2767730876#endif
    27678 #if defined(OPENSSL_EXTRA) || \
    27679     (defined(OPENSSL_EXTRA_X509_SMALL) && !defined(NO_RSA))
    27680 static WC_RNG globalRNG;
    27681 static int initGlobalRNG = 0;
    27682 #endif
    2768330877#if defined(OPENSSL_EXTRA) && \
    2768430878    !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA)
     
    2772830922}
    2772930923#endif
    27730 #ifndef WOLFCRYPT_ONLY
    2773130924
    2773230925#ifdef OPENSSL_EXTRA
    2773330926
    27734 /* Not thread safe! Can be called multiple times.
    27735  * Checks if the global RNG has been created. If not then one is created.
     30927/* Checks if the global RNG has been created. If not then one is created.
    2773630928 *
    27737  * Returns SSL_SUCCESS when no error is encountered.
     30929 * Returns WOLFSSL_SUCCESS when no error is encountered.
    2773830930 */
    2773930931static int wolfSSL_RAND_Init(void)
    2774030932{
     30933    if (wc_LockMutex(&globalRNGMutex) != 0) {
     30934        WOLFSSL_MSG("Bad Lock Mutex rng");
     30935        return 0;
     30936    }
    2774130937    if (initGlobalRNG == 0) {
    2774230938        if (wc_InitRng(&globalRNG) < 0) {
    2774330939            WOLFSSL_MSG("wolfSSL Init Global RNG failed");
     30940            wc_UnLockMutex(&globalRNGMutex);
    2774430941            return 0;
    2774530942        }
     
    2774730944    }
    2774830945
    27749     return SSL_SUCCESS;
    27750 }
    27751 
    27752 
    27753 /* SSL_SUCCESS on ok */
     30946    wc_UnLockMutex(&globalRNGMutex);
     30947    return WOLFSSL_SUCCESS;
     30948}
     30949
     30950
     30951/* WOLFSSL_SUCCESS on ok */
    2775430952int wolfSSL_RAND_seed(const void* seed, int len)
    2775530953{
     
    2786031058        bytes = 1024; /* default size of buf */
    2786131059
    27862         if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != SSL_SUCCESS) {
     31060        if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
    2786331061            WOLFSSL_MSG("No RNG to use");
    2786431062        #ifdef WOLFSSL_SMALL_STACK
     
    2790431102
    2790531103/* This collects entropy from the path nm and seeds the global PRNG with it.
    27906  * Makes a call to wolfSSL_RAND_Init which is not thread safe.
    2790731104 *
    2790831105 * nm is the file path to the egd server
     
    2801731214
    2801831215    if (bytes > 0 && ret == WOLFSSL_SUCCESS) {
    28019         wolfSSL_RAND_Init(); /* call to check global RNG is created */
    28020         if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
     31216        /* call to check global RNG is created */
     31217        if (wolfSSL_RAND_Init() != SSL_SUCCESS) {
     31218            WOLFSSL_MSG("Error with initializing global RNG structure");
     31219            ret = WOLFSSL_FATAL_ERROR;
     31220        }
     31221        else if (wc_RNG_DRBG_Reseed(&globalRNG, (const byte*) buf, bytes)
    2802131222                != 0) {
    2802231223            WOLFSSL_MSG("Error with reseeding DRBG structure");
     
    2802431225        }
    2802531226        #ifdef SHOW_SECRETS
    28026         { /* print out entropy found */
     31227        else { /* print out entropy found only when no error occured */
    2802731228            word32 i;
    2802831229            printf("EGD Entropy = ");
     
    2806231263    WOLFSSL_ENTER("wolfSSL_RAND_Cleanup()");
    2806331264
     31265    if (wc_LockMutex(&globalRNGMutex) != 0) {
     31266        WOLFSSL_MSG("Bad Lock Mutex rng");
     31267        return;
     31268    }
    2806431269    if (initGlobalRNG != 0) {
    2806531270        wc_FreeRng(&globalRNG);
    2806631271        initGlobalRNG = 0;
    2806731272    }
     31273    wc_UnLockMutex(&globalRNGMutex);
    2806831274}
    2806931275
     
    2807531281
    2807631282
    28077 /* SSL_SUCCESS on ok */
     31283/* WOLFSSL_SUCCESS on ok */
    2807831284int wolfSSL_RAND_bytes(unsigned char* buf, int num)
    2807931285{
     
    2808631292    WC_RNG  tmpRNG[1];
    2808731293#endif
     31294    int used_global = 0;
     31295    int blockCount = 0;
    2808831296
    2808931297    WOLFSSL_ENTER("wolfSSL_RAND_bytes");
     
    2809531303#endif
    2809631304
    28097     if (initGlobalRNG)
     31305    if (initGlobalRNG) {
     31306        if (wc_LockMutex(&globalRNGMutex) != 0) {
     31307            WOLFSSL_MSG("Bad Lock Mutex rng");
     31308            return ret;
     31309        }
     31310
    2809831311        rng = &globalRNG;
     31312        used_global = 1;
     31313    }
    2809931314    else if(wc_InitRng(tmpRNG) == 0) {
    2810031315        rng = tmpRNG;
     
    2810231317    }
    2810331318    if (rng) {
    28104         if (wc_RNG_GenerateBlock(rng, buf, num) != 0)
     31319        /* handles size grater than RNG_MAX_BLOCK_LEN */
     31320        blockCount = num / RNG_MAX_BLOCK_LEN;
     31321       
     31322        while(blockCount--) {
     31323            if((ret = wc_RNG_GenerateBlock(rng, buf, RNG_MAX_BLOCK_LEN) != 0)){
     31324                WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
     31325                break;
     31326            }
     31327            num -= RNG_MAX_BLOCK_LEN;
     31328            buf += RNG_MAX_BLOCK_LEN;
     31329        }
     31330       
     31331        if (ret == 0 && num)
     31332            ret = wc_RNG_GenerateBlock(rng, buf, num);
     31333       
     31334        if (ret != 0)
    2810531335            WOLFSSL_MSG("Bad wc_RNG_GenerateBlock");
    2810631336        else
    2810731337            ret = WOLFSSL_SUCCESS;
     31338    }
     31339
     31340    if (used_global == 1) {
     31341        wc_UnLockMutex(&globalRNGMutex);
    2810831342    }
    2810931343
     
    2814931383    WOLFSSL_ASN1_INTEGER* a;
    2815031384    int len;
     31385    const int extraTagSz = MAX_LENGTH_SZ + 1;
     31386    byte intTag[MAX_LENGTH_SZ + 1];
     31387    int idx = 0;
    2815131388    WOLFSSL_ENTER("wolfSSL_BN_to_ASN1_INTEGER");
    2815231389
     
    2817331410
    2817431411        /* allocate buffer */
    28175         if (len > (int)sizeof(a->intData)) {
     31412        if (len + extraTagSz > (int)sizeof(a->intData)) {
    2817631413            /* create new data buffer and copy over */
    28177             a->data = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
     31414            a->data = (byte*)XMALLOC(len + extraTagSz, NULL,
     31415                    DYNAMIC_TYPE_OPENSSL);
    2817831416            if (a->data == NULL) {
    2817931417                if (a != ai)
     
    2818731425            a->data = a->intData;
    2818831426        }
    28189         a->length = len;
    2819031427
    2819131428        /* populate data */
     
    2819731434        }
    2819831435        a->length = len;
     31436
     31437        /* Write ASN tag */
     31438        idx = SetASNInt(a->length, a->data[0], intTag);
     31439        XMEMMOVE(a->data + idx, a->data, a->length);
     31440        XMEMCPY(a->data, intTag, idx);
     31441        a->dataMax = a->length += idx;
    2819931442    }
    2820031443
     
    2820331446
    2820431447#ifdef OPENSSL_ALL
    28205 void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *template)
     31448void *wolfSSL_ASN1_item_new(const WOLFSSL_ASN1_ITEM *tpl)
    2820631449{
    2820731450    void *ret = NULL;
     
    2820931452    size_t i;
    2821031453    WOLFSSL_ENTER("wolfSSL_ASN1_item_new");
    28211     if (!template) {
     31454    if (!tpl) {
    2821231455        return NULL;
    2821331456    }
    28214     if (!(ret = XMALLOC(template->size, NULL, DYNAMIC_TYPE_OPENSSL))) {
     31457    if (!(ret = (void *)XMALLOC(tpl->size, NULL, DYNAMIC_TYPE_OPENSSL))) {
    2821531458        return NULL;
    2821631459    }
    28217     XMEMSET(ret, 0, template->size);
    28218     for (member = template->members, i = 0; i < template->mcount;
     31460    XMEMSET(ret, 0, tpl->size);
     31461    for (member = tpl->members, i = 0; i < tpl->mcount;
    2821931462            member++, i++) {
    2822031463        switch (member->type) {
     
    2824431487    return ret;
    2824531488error:
    28246     wolfSSL_ASN1_item_free(ret, template);
     31489    wolfSSL_ASN1_item_free(ret, tpl);
    2824731490    return NULL;
    2824831491}
    2824931492
    28250 void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *template)
     31493void wolfSSL_ASN1_item_free(void *val, const WOLFSSL_ASN1_ITEM *tpl)
    2825131494{
    2825231495    const WOLFSSL_ASN1_TEMPLATE *member = NULL;
     
    2825431497    WOLFSSL_ENTER("wolfSSL_ASN1_item_free");
    2825531498    if (val) {
    28256         for (member = template->members, i = 0; i < template->mcount;
     31499        for (member = tpl->members, i = 0; i < tpl->mcount;
    2825731500                member++, i++) {
    2825831501            switch (member->type) {
     
    2834231585
    2834331586int wolfSSL_ASN1_item_i2d(const void *src, byte **dest,
    28344                           const WOLFSSL_ASN1_ITEM *template)
     31587                          const WOLFSSL_ASN1_ITEM *tpl)
    2834531588{
    2834631589    int len = 0;
     
    2834931592    WOLFSSL_ENTER("wolfSSL_ASN1_item_i2d");
    2835031593
    28351     if (!src || !template) {
     31594    if (!src || !tpl) {
    2835231595        WOLFSSL_LEAVE("wolfSSL_ASN1_item_i2d", WOLFSSL_FAILURE);
    2835331596        return WOLFSSL_FAILURE;
     
    2835531598
    2835631599    if (dest && !*dest) {
    28357         len = wolfSSL_ASN1_item_i2d(src, NULL, template);
     31600        len = wolfSSL_ASN1_item_i2d(src, NULL, tpl);
    2835831601        if (!len) {
    2835931602            goto error;
     
    2836631609    }
    2836731610
    28368     switch (template->type) {
     31611    switch (tpl->type) {
    2836931612        case ASN_SEQUENCE:
    2837031613        {
    28371             int seq_len = i2dProcessMembers(src, NULL, template->members,
    28372                                          template->mcount);
     31614            int seq_len = i2dProcessMembers(src, NULL, tpl->members,
     31615                                         tpl->mcount);
    2837331616            if (!seq_len) {
    2837431617                goto error;
     
    2837631619            len += SetSequence(seq_len, bufLenOrNull(buf, len));
    2837731620            if (buf &&
    28378                     i2dProcessMembers(src, bufLenOrNull(buf, len), template->members,
    28379                                    template->mcount) != seq_len) {
     31621                    i2dProcessMembers(src, bufLenOrNull(buf, len), tpl->members,
     31622                                   tpl->mcount) != seq_len) {
    2838031623                WOLFSSL_MSG("Inconsistent sequence length");
    2838131624                goto error;
     
    2842431667    DhKey*     key;
    2842531668
    28426     WOLFSSL_MSG("wolfSSL_DH_new");
     31669    WOLFSSL_ENTER("wolfSSL_DH_new");
    2842731670
    2842831671    key = (DhKey*) XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH);
     
    2844831691    }
    2844931692    external->internal = key;
     31693    external->priv_key = wolfSSL_BN_new();
     31694    external->pub_key = wolfSSL_BN_new();
    2845031695
    2845131696    return external;
    2845231697}
    2845331698
    28454 
    2845531699void wolfSSL_DH_free(WOLFSSL_DH* dh)
    2845631700{
    28457     WOLFSSL_MSG("wolfSSL_DH_free");
     31701    WOLFSSL_ENTER("wolfSSL_DH_free");
    2845831702
    2845931703    if (dh) {
     
    2847931723    int            pSz = 1024;
    2848031724    int            gSz = 1024;
    28481 #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
     31725#ifdef WOLFSSL_DH_EXTRA
    2848231726    int            privSz = 256; /* Up to 2048-bit */
    2848331727    int            pubSz  = 256;
     
    2848631730    unsigned char* p   = NULL;
    2848731731    unsigned char* g   = NULL;
    28488     #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
     31732    #ifdef WOLFSSL_DH_EXTRA
    2848931733        unsigned char* priv_key = NULL;
    2849031734        unsigned char* pub_key = NULL;
     
    2849331737    unsigned char  p[1024];
    2849431738    unsigned char  g[1024];
    28495     #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
     31739    #ifdef WOLFSSL_DH_EXTRA
    2849631740        unsigned char priv_key[256];
    2849731741        unsigned char pub_key[256];
     
    2850731751    else if (wolfSSL_BN_bn2bin(dh->g, NULL) > gSz)
    2850831752        WOLFSSL_MSG("Bad g internal size");
    28509     #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
     31753#ifdef WOLFSSL_DH_EXTRA
    2851031754    else if (wolfSSL_BN_bn2bin(dh->priv_key, NULL) > privSz)
    2851131755        WOLFSSL_MSG("Bad private key internal size");
    2851231756    else if (wolfSSL_BN_bn2bin(dh->pub_key, NULL) > privSz)
    2851331757        WOLFSSL_MSG("Bad public key internal size");
    28514     #endif
     31758#endif
    2851531759    else {
    2851631760    #ifdef WOLFSSL_SMALL_STACK
    2851731761        p = (unsigned char*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
    2851831762        g = (unsigned char*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
    28519 
    28520     #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
    28521         priv_key = (unsigned char*)XMALLOC(privSz,NULL,DYNAMIC_TYPE_PRIVATE_KEY);
    28522         pub_key  = (unsigned char*)XMALLOC(pubSz,NULL,DYNAMIC_TYPE_PUBLIC_KEY);
    28523     #endif
     31763        #ifdef WOLFSSL_DH_EXTRA
     31764            priv_key = (unsigned char*)XMALLOC(privSz, NULL,
     31765                DYNAMIC_TYPE_PRIVATE_KEY);
     31766            pub_key  = (unsigned char*)XMALLOC(pubSz, NULL,
     31767                DYNAMIC_TYPE_PUBLIC_KEY);
     31768        #endif
    2852431769
    2852531770        if (p == NULL || g == NULL) {
     
    2853031775    #endif /* WOLFSSL_SMALL_STACK */
    2853131776
    28532     #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
     31777    #ifdef WOLFSSL_DH_EXTRA
    2853331778        privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv_key);
    2853431779        pubSz  = wolfSSL_BN_bn2bin(dh->pub_key,  pub_key);
     
    2854031785        }
    2854131786        if (privSz > 0 || pubSz > 0) {
    28542             ret = wc_DhSetFullKeys((DhKey*)dh->internal,priv_key,privSz,
    28543                                     pub_key,pubSz);
    28544             if (ret == WOLFSSL_FAILURE) {
     31787            ret = wc_DhImportKeyPair((DhKey*)dh->internal, priv_key, privSz,
     31788                                     pub_key, pubSz);
     31789            if (ret == 0) {
     31790                ret = WOLFSSL_SUCCESS;
     31791            }
     31792            else {
    2854531793                WOLFSSL_MSG("Failed setting private or public key.");
    28546             }
    28547         }
    28548     #endif /* WOLFSSL_QT || OPENSSL_ALL */
     31794                ret = WOLFSSL_FAILURE;
     31795            }
     31796        }
     31797    #endif /* WOLFSSL_DH_EXTRA */
    2854931798
    2855031799        pSz = wolfSSL_BN_bn2bin(dh->p, p);
     
    2856331812        XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
    2856431813        XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY);
    28565         #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
     31814        #ifdef WOLFSSL_DH_EXTRA
    2856631815            XFREE(priv_key, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
    2856731816            XFREE(pub_key,  NULL, DYNAMIC_TYPE_PUBLIC_KEY);
     
    2857031819    }
    2857131820
    28572 
    2857331821    return ret;
    2857431822}
    2857531823
    28576 #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH))
     31824#if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) \
     31825    || defined(WOLFSSL_OPENSSH))
     31826
     31827#ifdef WOLFSSL_DH_EXTRA
     31828WOLFSSL_DH* wolfSSL_DH_dup(WOLFSSL_DH* dh)
     31829{
     31830    WOLFSSL_DH* ret = NULL;
     31831
     31832    WOLFSSL_ENTER("wolfSSL_DH_dup");
     31833
     31834    if (!dh) {
     31835        WOLFSSL_MSG("Bad parameter");
     31836        return NULL;
     31837    }
     31838
     31839    if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS){
     31840        WOLFSSL_MSG("Bad DH set internal");
     31841        return NULL;
     31842    }
     31843
     31844    if (!(ret = wolfSSL_DH_new())) {
     31845        WOLFSSL_MSG("wolfSSL_DH_new error");
     31846        return NULL;
     31847    }
     31848
     31849    if (wc_DhKeyCopy((DhKey*)dh->internal, (DhKey*)ret->internal) != MP_OKAY) {
     31850        WOLFSSL_MSG("wc_DhKeyCopy error");
     31851        wolfSSL_DH_free(ret);
     31852        return NULL;
     31853    }
     31854    ret->inSet = 1;
     31855
     31856    if (SetDhExternal(ret) != WOLFSSL_SUCCESS) {
     31857        WOLFSSL_MSG("SetDhExternal error");
     31858        wolfSSL_DH_free(ret);
     31859        return NULL;
     31860    }
     31861
     31862    return ret;
     31863}
     31864#endif /* WOLFSSL_DH_EXTRA */
     31865
    2857731866/* Set the members of DhKey into WOLFSSL_DH
    2857831867 * DhKey was populated from wc_DhKeyDecode
     
    2859931888    }
    2860031889
     31890#ifdef WOLFSSL_DH_EXTRA
    2860131891    if (SetIndividualExternal(&dh->priv_key, &key->priv) != WOLFSSL_SUCCESS) {
    2860231892        WOLFSSL_MSG("No DH Private Key");
     
    2860831898        return WOLFSSL_FATAL_ERROR;
    2860931899    }
     31900#endif /* WOLFSSL_DH_EXTRA */
    2861031901
    2861131902    dh->exSet = 1;
     
    2864831939    WOLFSSL_ENTER("wolfSSL_DH_768_prime");
    2864931940
    28650     if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
     31941    if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
    2865131942        WOLFSSL_MSG("Error converting DH 768 prime to big number");
    2865231943        return NULL;
     
    2867831969    WOLFSSL_ENTER("wolfSSL_DH_1024_prime");
    2867931970
    28680     if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
     31971    if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
    2868131972        WOLFSSL_MSG("Error converting DH 1024 prime to big number");
    2868231973        return NULL;
     
    2871232003    WOLFSSL_ENTER("wolfSSL_DH_1536_prime");
    2871332004
    28714     if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
     32005    if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
    2871532006        WOLFSSL_MSG("Error converting DH 1536 prime to big number");
    2871632007        return NULL;
     
    2875032041    WOLFSSL_ENTER("wolfSSL_DH_2048_prime");
    2875132042
    28752     if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
     32043    if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
    2875332044        WOLFSSL_MSG("Error converting DH 2048 prime to big number");
    2875432045        return NULL;
     
    2879632087    WOLFSSL_ENTER("wolfSSL_DH_3072_prime");
    2879732088
    28798     if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
     32089    if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
    2879932090        WOLFSSL_MSG("Error converting DH 3072 prime to big number");
    2880032091        return NULL;
     
    2885032141    WOLFSSL_ENTER("wolfSSL_DH_4096_prime");
    2885132142
    28852     if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
     32143    if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
    2885332144        WOLFSSL_MSG("Error converting DH 4096 prime to big number");
    2885432145        return NULL;
     
    2892032211    WOLFSSL_ENTER("wolfSSL_DH_6144_prime");
    2892132212
    28922     if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
     32213    if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
    2892332214        WOLFSSL_MSG("Error converting DH 6144 prime to big number");
    2892432215        return NULL;
     
    2900732298    WOLFSSL_ENTER("wolfSSL_DH_8192_prime");
    2900832299
    29009     if (wolfSSL_BN_hex2bn(&bn, prm) != SSL_SUCCESS) {
     32300    if (wolfSSL_BN_hex2bn(&bn, prm) != WOLFSSL_SUCCESS) {
    2901032301        WOLFSSL_MSG("Error converting DH 8192 prime to big number");
    2901132302        return NULL;
     
    2901532306}
    2901632307
     32308#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
    2901732309/* return code compliant with OpenSSL :
    2901832310 *   1 if success, 0 if error
     
    2906632358            privSz = pubSz;
    2906732359        }
    29068         pub   = (unsigned char*)XMALLOC(pubSz,  NULL, DYNAMIC_TYPE_PUBLIC_KEY);
    29069         priv  = (unsigned char*)XMALLOC(privSz, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
     32360        if (pubSz > 0) {
     32361            pub = (unsigned char*)XMALLOC(pubSz,
     32362                    NULL, DYNAMIC_TYPE_PUBLIC_KEY);
     32363        }
     32364        if (privSz > 0) {
     32365            priv = (unsigned char*)XMALLOC(privSz,
     32366                    NULL, DYNAMIC_TYPE_PRIVATE_KEY);
     32367        }
    2907032368        if (pub == NULL || priv == NULL) {
    2907132369            WOLFSSL_MSG("Unable to malloc memory");
     
    2915832456        privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv);
    2915932457        pubSz  = wolfSSL_BN_bn2bin(otherPub, pub);
    29160         if (dh->inSet == 0 && SetDhInternal(dh) != SSL_SUCCESS){
    29161                 WOLFSSL_MSG("Bad DH set internal");
     32458        if (dh->inSet == 0 && SetDhInternal(dh) != WOLFSSL_SUCCESS){
     32459            WOLFSSL_MSG("Bad DH set internal");
    2916232460        }
    2916332461        if (privSz <= 0 || pubSz <= 0)
     
    2917432472    XFREE(priv, NULL, DYNAMIC_TYPE_PRIVATE_KEY);
    2917532473#endif
     32474
     32475    WOLFSSL_LEAVE("wolfSSL_DH_compute_key", ret);
    2917632476
    2917732477    return ret;
     
    2920932509    wolfSSL_BN_free(dh->q);
    2921032510    wolfSSL_BN_free(dh->g);
    29211     wolfSSL_BN_free(dh->pub_key);
    29212     wolfSSL_BN_free(dh->priv_key);
    2921332511
    2921432512    dh->p = p;
     
    2922932527}
    2923032528#endif /* v1.1.0 or later */
     32529#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
    2923132530
    2923232531#endif /* NO_DH */
    29233 
    29234 
    29235 #ifndef NO_DSA
     32532#endif /* OPENSSL_EXTRA */
     32533
     32534#if !defined(NO_DSA) && \
     32535    (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
    2923632536static void InitwolfSSL_DSA(WOLFSSL_DSA* dsa)
    2923732537{
     
    2930632606}
    2930732607
    29308 #endif /* NO_DSA */
    29309 #endif /* OPENSSL_EXTRA */
    29310 
    29311 #ifdef OPENSSL_EXTRA
    29312 
    29313 #ifndef NO_DSA
    2931432608/* wolfSSL -> OpenSSL */
    2931532609int SetDsaExternal(WOLFSSL_DSA* dsa)
     
    2935432648    return WOLFSSL_SUCCESS;
    2935532649}
    29356 
     32650#endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
     32651
     32652
     32653#if !defined(NO_DSA) && defined(OPENSSL_EXTRA)
    2935732654/* Openssl -> WolfSSL */
    2935832655int SetDsaInternal(WOLFSSL_DSA* dsa)
     
    2941032707    return WOLFSSL_SUCCESS;
    2941132708}
    29412 #endif /* NO_DSA */
    29413 #endif /* OPENSSL_EXTRA */
     32709#endif /* !NO_DSA && OPENSSL_EXTRA */
    2941432710
    2941532711
    2941632712#ifdef OPENSSL_EXTRA
    2941732713#if !defined(NO_RSA)
     32714
     32715/* return wolfSSL native error codes. */
     32716static int wolfSSL_RSA_generate_key_native(WOLFSSL_RSA* rsa, int bits, WOLFSSL_BIGNUM* bn,
     32717                                void* cb)
     32718{
     32719    int ret;
     32720
     32721    (void)cb;
     32722    (void)bn;
     32723    (void)bits;
     32724
     32725    WOLFSSL_ENTER("wolfSSL_RSA_generate_key_native");
     32726
     32727    if (rsa == NULL || rsa->internal == NULL) {
     32728        /* bit size checked during make key call */
     32729        WOLFSSL_MSG("bad arguments");
     32730        return BAD_FUNC_ARG;
     32731    }
     32732
     32733#ifdef WOLFSSL_KEY_GEN
     32734    {
     32735    #ifdef WOLFSSL_SMALL_STACK
     32736        WC_RNG* rng;
     32737    #else
     32738        WC_RNG  rng[1];
     32739    #endif
     32740
     32741    #ifdef WOLFSSL_SMALL_STACK
     32742        rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
     32743        if (rng == NULL)
     32744            return MEMORY_E;
     32745    #endif
     32746
     32747        if ((ret = wc_InitRng(rng)) < 0)
     32748            WOLFSSL_MSG("RNG init failed");
     32749        else if ((ret = wc_MakeRsaKey((RsaKey*)rsa->internal, bits,
     32750                    wolfSSL_BN_get_word(bn), rng)) != MP_OKAY)
     32751            WOLFSSL_MSG("wc_MakeRsaKey failed");
     32752        else if ((ret = SetRsaExternal(rsa)) != WOLFSSL_SUCCESS)
     32753            WOLFSSL_MSG("SetRsaExternal failed");
     32754        else {
     32755            rsa->inSet = 1;
     32756            ret = WOLFSSL_ERROR_NONE;
     32757        }
     32758
     32759        wc_FreeRng(rng);
     32760    #ifdef WOLFSSL_SMALL_STACK
     32761        XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
     32762    #endif
     32763    }
     32764#else
     32765    WOLFSSL_MSG("No Key Gen built in");
     32766    ret = NOT_COMPILED_IN;
     32767#endif
     32768    return ret;
     32769}
     32770
    2941832771/* Generates a RSA key of length len
    2941932772 *
     
    2945032803    }
    2945132804
    29452     if (wolfSSL_BN_set_word(bn, (WOLFSSL_BN_ULONG)e) != SSL_SUCCESS) {
     32805    if (wolfSSL_BN_set_word(bn, e) != WOLFSSL_SUCCESS) {
    2945332806        WOLFSSL_MSG("Error using e value");
    2945432807        wolfSSL_BN_free(bn);
     
    2946132814    }
    2946232815    else {
    29463         if (wolfSSL_RSA_generate_key_ex(rsa, len, bn, NULL) != SSL_SUCCESS){
    29464             wolfSSL_RSA_free(rsa);
    29465             rsa = NULL;
     32816        for (;;) {
     32817            int gen_ret = wolfSSL_RSA_generate_key_native(rsa, len, bn, NULL);
     32818            if (gen_ret == WOLFSSL_ERROR_NONE)
     32819                break;
     32820#ifdef HAVE_FIPS
     32821            else if (gen_ret == PRIME_GEN_E)
     32822                continue;
     32823#endif
     32824            else {
     32825                wolfSSL_RSA_free(rsa);
     32826                rsa = NULL;
     32827                break;
     32828            }
    2946632829        }
    2946732830    }
     
    2947032833    return rsa;
    2947132834}
    29472 
    2947332835
    2947432836/* return compliant with OpenSSL
     
    2947832840                                void* cb)
    2947932841{
    29480     int ret = WOLFSSL_FAILURE;
    29481 
    29482     (void)cb;
    29483     (void)bn;
    29484     (void)bits;
    29485 
    29486     WOLFSSL_ENTER("wolfSSL_RSA_generate_key_ex");
    29487 
    29488     if (rsa == NULL || rsa->internal == NULL) {
    29489         /* bit size checked during make key call */
    29490         WOLFSSL_MSG("bad arguments");
    29491         return WOLFSSL_FAILURE;
    29492     }
    29493 
    29494 #ifdef WOLFSSL_KEY_GEN
    29495     {
    29496     #ifdef WOLFSSL_SMALL_STACK
    29497         WC_RNG* rng;
    29498     #else
    29499         WC_RNG  rng[1];
    29500     #endif
    29501 
    29502     #ifdef WOLFSSL_SMALL_STACK
    29503         rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
    29504         if (rng == NULL)
     32842    for (;;) {
     32843        int gen_ret = wolfSSL_RSA_generate_key_native(rsa, bits, bn, cb);
     32844        if (gen_ret == WOLFSSL_ERROR_NONE)
     32845            return WOLFSSL_SUCCESS;
     32846#ifdef HAVE_FIPS
     32847        else if (gen_ret == PRIME_GEN_E)
     32848            continue;
     32849#endif
     32850        else
    2950532851            return WOLFSSL_FAILURE;
    29506     #endif
    29507 
    29508         if (wc_InitRng(rng) < 0)
    29509             WOLFSSL_MSG("RNG init failed");
    29510         else if (wc_MakeRsaKey((RsaKey*)rsa->internal, bits,
    29511                     wolfSSL_BN_get_word(bn), rng) != MP_OKAY)
    29512             WOLFSSL_MSG("wc_MakeRsaKey failed");
    29513         else if (SetRsaExternal(rsa) != WOLFSSL_SUCCESS)
    29514             WOLFSSL_MSG("SetRsaExternal failed");
    29515         else {
    29516             rsa->inSet = 1;
    29517             ret = WOLFSSL_SUCCESS;
    29518         }
    29519 
    29520         wc_FreeRng(rng);
    29521     #ifdef WOLFSSL_SMALL_STACK
    29522         XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
    29523     #endif
    29524     }
    29525 #else
    29526     WOLFSSL_MSG("No Key Gen built in");
    29527 #endif
    29528     return ret;
     32852    }
    2952932853}
    2953032854#endif /* NO_RSA */
     
    2962232946
    2962332947    if (wolfSSL_DSA_generate_parameters_ex(dsa, bits, seed, seedLen,
    29624                                   counterRet, hRet, NULL) != SSL_SUCCESS) {
     32948                                  counterRet, hRet, NULL) != WOLFSSL_SUCCESS) {
    2962532949        wolfSSL_DSA_free(dsa);
    2962632950        return NULL;
     
    2986333187}
    2986433188
     33189
     33190int wolfSSL_DSA_bits(const WOLFSSL_DSA *d)
     33191{
     33192    if (!d)
     33193        return WOLFSSL_FAILURE;
     33194    if (!d->exSet && SetDsaExternal((WOLFSSL_DSA*)d) != WOLFSSL_SUCCESS)
     33195        return WOLFSSL_FAILURE;
     33196    return wolfSSL_BN_num_bits(d->p);
     33197}
     33198
    2986533199#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
    2986633200int wolfSSL_DSA_do_verify_ex(const unsigned char* digest, int digest_len,
     
    2992433258
    2992533259#ifdef DEBUG_SIGN
    29926 static void show(const char *title, const unsigned char *out, unsigned int outlen)
     33260static void DEBUG_SIGN_msg(const char *title, const unsigned char *out, unsigned int outlen)
    2992733261{
    2992833262    const unsigned char *pt;
     
    2993433268}
    2993533269#else
    29936 #define show(a,b,c)
    29937 #endif
    29938 
    29939 /* return SSL_SUCCESS on ok, 0 otherwise */
    29940 int wolfSSL_RSA_sign(int type, const unsigned char* m,
    29941                            unsigned int mLen, unsigned char* sigRet,
    29942                            unsigned int* sigLen, WOLFSSL_RSA* rsa)
    29943 {
    29944     return wolfSSL_RSA_sign_ex(type, m, mLen, sigRet, sigLen, rsa, 1);
    29945 }
    29946 
    29947 int wolfSSL_RSA_sign_ex(int type, const unsigned char* m,
    29948                            unsigned int mLen, unsigned char* sigRet,
    29949                            unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag)
    29950 {
    29951     word32  outLen;
    29952     word32  signSz;
    29953     int     initTmpRng = 0;
    29954     WC_RNG* rng        = NULL;
    29955     int     ret        = 0;
    29956 #ifdef WOLFSSL_SMALL_STACK
    29957     WC_RNG* tmpRNG     = NULL;
    29958     byte*   encodedSig = NULL;
    29959 #else
    29960     WC_RNG  tmpRNG[1];
    29961     byte    encodedSig[MAX_ENCODED_SIG_SZ];
    29962 #endif
    29963 
    29964     WOLFSSL_ENTER("wolfSSL_RSA_sign");
    29965 
    29966     if (m == NULL || sigRet == NULL || sigLen == NULL || rsa == NULL) {
    29967         WOLFSSL_MSG("Bad function arguments");
    29968         return 0;
    29969     }
    29970     show("Message to Sign", m, mLen);
    29971 
     33270#define DEBUG_SIGN_msg(a,b,c)
     33271#endif
     33272
     33273static int nid2HashSum(int type) {
    2997233274    switch (type) {
    2997333275    #ifdef WOLFSSL_MD2
     
    3000533307            return 0;
    3000633308    }
    30007 
    30008     if (rsa->inSet == 0)
    30009     {
     33309    return type;
     33310}
     33311
     33312/* return WOLFSSL_SUCCESS on ok, 0 otherwise */
     33313int wolfSSL_RSA_sign(int type, const unsigned char* m,
     33314                           unsigned int mLen, unsigned char* sigRet,
     33315                           unsigned int* sigLen, WOLFSSL_RSA* rsa)
     33316{
     33317    return wolfSSL_RSA_sign_ex(type, m, mLen, sigRet, sigLen, rsa, 1);
     33318}
     33319
     33320int wolfSSL_RSA_sign_ex(int type, const unsigned char* m,
     33321                           unsigned int mLen, unsigned char* sigRet,
     33322                           unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag)
     33323{
     33324    return wolfSSL_RSA_sign_generic_padding(type, m, mLen, sigRet, sigLen,
     33325            rsa, flag, RSA_PKCS1_PADDING);
     33326}
     33327
     33328/**
     33329 * Sign a message with the chosen message digest, padding, and RSA key.
     33330 * @param type      Hash NID
     33331 * @param m         Message to sign. Most likely this will be the digest of
     33332 *                  the message to sign
     33333 * @param mLen      Length of message to sign
     33334 * @param sigRet    Output buffer
     33335 * @param sigLen    On Input: length of sigRet buffer
     33336 *                  On Output: length of data written to sigRet
     33337 * @param rsa       RSA key used to sign the input
     33338 * @param flag      1: Output the signature
     33339 *                  0: Output the value that the unpadded signature should be
     33340 *                     compared to. Note: for RSA_PKCS1_PSS_PADDING the
     33341 *                     wc_RsaPSS_CheckPadding_ex function should be used to check
     33342 *                     the output of a *Verify* function.
     33343 * @param padding   Padding to use. Only RSA_PKCS1_PSS_PADDING and
     33344 *                  RSA_PKCS1_PADDING are currently supported for signing.
     33345 * @return          WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error
     33346 */
     33347int wolfSSL_RSA_sign_generic_padding(int type, const unsigned char* m,
     33348                           unsigned int mLen, unsigned char* sigRet,
     33349                           unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag,
     33350                           int padding)
     33351{
     33352    word32  outLen;
     33353    word32  signSz;
     33354    int     initTmpRng = 0;
     33355    WC_RNG* rng        = NULL;
     33356    int     ret        = 0;
     33357#ifdef WOLFSSL_SMALL_STACK
     33358    WC_RNG* tmpRNG     = NULL;
     33359    byte*   encodedSig = NULL;
     33360#else
     33361    WC_RNG  tmpRNG[1];
     33362    byte    encodedSig[MAX_ENCODED_SIG_SZ];
     33363#endif
     33364
     33365    WOLFSSL_ENTER("wolfSSL_RSA_sign_generic_padding");
     33366
     33367    if (m == NULL || sigRet == NULL || sigLen == NULL || rsa == NULL) {
     33368        WOLFSSL_MSG("Bad function arguments");
     33369        return WOLFSSL_FAILURE;
     33370    }
     33371    DEBUG_SIGN_msg("Message to Sign", m, mLen);
     33372
     33373    if (rsa->inSet == 0) {
    3001033374        WOLFSSL_MSG("No RSA internal set, do it");
    3001133375
    3001233376        if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
    3001333377            WOLFSSL_MSG("SetRsaInternal failed");
    30014             return 0;
    30015         }
    30016     }
     33378            return WOLFSSL_FAILURE;
     33379        }
     33380    }
     33381
     33382    type = nid2HashSum(type);
    3001733383
    3001833384    outLen = (word32)wolfSSL_BN_num_bytes(rsa->n);
     
    3002133387    tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
    3002233388    if (tmpRNG == NULL)
    30023         return 0;
     33389        return WOLFSSL_FAILURE;
    3002433390
    3002533391    encodedSig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ, NULL,
     
    3002733393    if (encodedSig == NULL) {
    3002833394        XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG);
    30029         return 0;
    30030     }
    30031 #endif
    30032 
    30033     if (outLen == 0)
     33395        return WOLFSSL_FAILURE;
     33396    }
     33397#endif
     33398
     33399    if (outLen == 0) {
    3003433400        WOLFSSL_MSG("Bad RSA size");
     33401    }
    3003533402    else if (wc_InitRng(tmpRNG) == 0) {
    3003633403        rng = tmpRNG;
     
    3004733414
    3004833415    if (rng) {
    30049 
    30050         signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
    30051         if (signSz == 0) {
    30052             WOLFSSL_MSG("Bad Encode Signature");
    30053         }
    30054         else {
    30055             show("Encoded Message", encodedSig, signSz);
    30056             if (flag != 0) {
     33416        if (flag != 0) {
     33417            switch (padding) {
     33418#ifdef WC_RSA_NO_PADDING
     33419            case RSA_NO_PADDING:
     33420                WOLFSSL_MSG("RSA_NO_PADDING not supported for signing");
     33421                ret = BAD_FUNC_ARG;
     33422                break;
     33423#endif
     33424#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && defined(WC_RSA_PSS)
     33425            case RSA_PKCS1_PSS_PADDING:
     33426            {
     33427                enum wc_HashType hType = wc_OidGetHash(type);
     33428#ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
     33429                WOLFSSL_MSG("Using RSA-PSS with hash length salt. "
     33430                            "OpenSSL uses max length by default.");
     33431#endif
     33432                ret = wc_RsaPSS_Sign_ex(m, mLen, sigRet, outLen,
     33433                        hType, wc_hash2mgf(hType),
     33434#ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
     33435                        RSA_PSS_SALT_LEN_DEFAULT,
     33436#else
     33437                        RSA_PSS_SALT_LEN_DISCOVER,
     33438#endif
     33439                        (RsaKey*)rsa->internal, rng);
     33440                break;
     33441            }
     33442#endif
     33443#ifndef WC_NO_RSA_OAEP
     33444            case RSA_PKCS1_OAEP_PADDING:
     33445            {
     33446                WOLFSSL_MSG("RSA_PKCS1_OAEP_PADDING not supported for signing");
     33447                ret = BAD_FUNC_ARG;
     33448                break;
     33449            }
     33450#endif
     33451            case RSA_PKCS1_PADDING:
     33452                signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
     33453                if (signSz == 0) {
     33454                    WOLFSSL_MSG("Bad Encode Signature");
     33455                }
     33456                DEBUG_SIGN_msg("Encoded Message", encodedSig, signSz);
    3005733457                ret = wc_RsaSSL_Sign(encodedSig, signSz, sigRet, outLen,
    3005833458                                (RsaKey*)rsa->internal, rng);
    30059                 if (ret <= 0) {
    30060                     WOLFSSL_MSG("Bad Rsa Sign");
    30061                     ret = 0;
     33459                break;
     33460            default:
     33461                WOLFSSL_MSG("Unsupported padding");
     33462                ret = BAD_FUNC_ARG;
     33463                break;
     33464            }
     33465            if (ret <= 0) {
     33466                WOLFSSL_MSG("Bad Rsa Sign");
     33467                ret = 0;
     33468            }
     33469            else {
     33470                *sigLen = (unsigned int)ret;
     33471                ret = WOLFSSL_SUCCESS;
     33472                DEBUG_SIGN_msg("Signature", sigRet, *sigLen);
     33473            }
     33474        } else {
     33475            switch (padding) {
     33476            case RSA_NO_PADDING:
     33477            case RSA_PKCS1_PSS_PADDING:
     33478            case RSA_PKCS1_OAEP_PADDING:
     33479                ret = WOLFSSL_SUCCESS;
     33480                XMEMCPY(sigRet, m, mLen);
     33481                *sigLen = mLen;
     33482                break;
     33483            case RSA_PKCS1_PADDING:
     33484            default:
     33485                signSz = wc_EncodeSignature(encodedSig, m, mLen, type);
     33486                if (signSz == 0) {
     33487                    WOLFSSL_MSG("Bad Encode Signature");
    3006233488                }
    30063                 else {
    30064                     *sigLen = (unsigned int)ret;
    30065                     ret = SSL_SUCCESS;
    30066                     show("Signature", sigRet, *sigLen);
    30067                 }
    30068             } else {
    30069                 ret = SSL_SUCCESS;
     33489                ret = WOLFSSL_SUCCESS;
    3007033490                XMEMCPY(sigRet, encodedSig, signSz);
    3007133491                *sigLen = signSz;
    30072             }
    30073         }
    30074 
     33492                break;
     33493            }
     33494        }
    3007533495    }
    3007633496
     
    3008333503#endif
    3008433504
    30085     if (ret == WOLFSSL_SUCCESS)
    30086         WOLFSSL_MSG("wolfSSL_RSA_sign success");
     33505    if (ret == WOLFSSL_SUCCESS) {
     33506        WOLFSSL_MSG("wolfSSL_RSA_sign_generic_padding success");
     33507    }
    3008733508    else {
    30088         WOLFSSL_MSG("wolfSSL_RSA_sign failed");
     33509        WOLFSSL_LEAVE("wolfSSL_RSA_sign_generic_padding", ret);
     33510        WOLFSSL_MSG("wolfSSL_RSA_sign_generic_padding failed. "
     33511                    "Returning WOLFSSL_FAILURE.");
     33512        ret = WOLFSSL_FAILURE;
    3008933513    }
    3009033514    return ret;
    3009133515}
    30092 
    3009333516
    3009433517/* returns WOLFSSL_SUCCESS on successful verify and WOLFSSL_FAILURE on fail */
     
    3009733520                               unsigned int sigLen, WOLFSSL_RSA* rsa)
    3009833521{
    30099     int     ret;
    30100     unsigned char *sigRet ;
    30101     unsigned char *sigDec ;
    30102     unsigned int   len;
     33522    return wolfSSL_RSA_verify_ex(type, m, mLen, sig, sigLen, rsa, RSA_PKCS1_PADDING);
     33523}
     33524
     33525/* returns WOLFSSL_SUCCESS on successful verify and WOLFSSL_FAILURE on fail */
     33526int wolfSSL_RSA_verify_ex(int type, const unsigned char* m,
     33527                               unsigned int mLen, const unsigned char* sig,
     33528                               unsigned int sigLen, WOLFSSL_RSA* rsa,
     33529                               int padding) {
     33530    int     ret = WOLFSSL_FAILURE;
     33531    unsigned char *sigRet = NULL;
     33532    unsigned char *sigDec = NULL;
     33533    unsigned int   len = 0;
     33534    int verLen;
     33535#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
     33536    int hSum = nid2HashSum(type);
     33537    enum wc_HashType hType;
     33538#endif
    3010333539
    3010433540    WOLFSSL_ENTER("wolfSSL_RSA_verify");
     
    3010733543        return WOLFSSL_FAILURE;
    3010833544    }
    30109 
    30110     sigRet = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    30111     if (sigRet == NULL) {
    30112         WOLFSSL_MSG("Memory failure");
    30113         return WOLFSSL_FAILURE;
    30114     }
    3011533545    sigDec = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    3011633546    if (sigDec == NULL) {
    3011733547        WOLFSSL_MSG("Memory failure");
     33548        goto cleanup;
     33549    }
     33550    if (padding != RSA_PKCS1_PSS_PADDING) {
     33551        sigRet = (unsigned char *)XMALLOC(sigLen, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     33552        if (sigRet == NULL) {
     33553            WOLFSSL_MSG("Memory failure");
     33554            goto cleanup;
     33555        }
     33556        /* get non-encrypted signature to be compared with decrypted signature */
     33557        if (wolfSSL_RSA_sign_generic_padding(type, m, mLen, sigRet, &len, rsa,
     33558                0, padding) <= 0) {
     33559            WOLFSSL_MSG("Message Digest Error");
     33560            goto cleanup;
     33561        }
     33562        DEBUG_SIGN_msg("Encoded Message", sigRet, len);
     33563    }
     33564    else {
     33565        DEBUG_SIGN_msg("Encoded Message", m, mLen);
     33566    }
     33567    /* decrypt signature */
     33568#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
     33569    hType = wc_OidGetHash(hSum);
     33570    if ((verLen = wc_RsaSSL_Verify_ex2(sig, sigLen, (unsigned char *)sigDec,
     33571            sigLen, (RsaKey*)rsa->internal, padding, hType)) <= 0) {
     33572        WOLFSSL_MSG("RSA Decrypt error");
     33573        goto cleanup;
     33574    }
     33575#else
     33576    verLen = wc_RsaSSL_Verify(sig, sigLen, (unsigned char *)sigDec, sigLen,
     33577        (RsaKey*)rsa->internal);
     33578#endif
     33579    DEBUG_SIGN_msg("Decrypted Signature", sigDec, ret);
     33580#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && defined(WC_RSA_PSS)
     33581    if (padding == RSA_PKCS1_PSS_PADDING) {
     33582        if (wc_RsaPSS_CheckPadding_ex(m, mLen, sigDec, verLen,
     33583                hType,
     33584#ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
     33585                RSA_PSS_SALT_LEN_DEFAULT,
     33586#else
     33587                RSA_PSS_SALT_LEN_DISCOVER,
     33588#endif
     33589                mp_count_bits(&((RsaKey*)rsa->internal)->n)) != 0) {
     33590            WOLFSSL_MSG("wc_RsaPSS_CheckPadding_ex error");
     33591            goto cleanup;
     33592        }
     33593    }
     33594    else
     33595#endif /* !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
     33596    if ((int)len != verLen || XMEMCMP(sigRet, sigDec, verLen) != 0) {
     33597        WOLFSSL_MSG("wolfSSL_RSA_verify_ex failed");
     33598        goto cleanup;
     33599    }
     33600
     33601    WOLFSSL_MSG("wolfSSL_RSA_verify_ex success");
     33602    ret = WOLFSSL_SUCCESS;
     33603cleanup:
     33604    if (sigRet)
    3011833605        XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    30119         return WOLFSSL_FAILURE;
    30120     }
    30121     /* get non-encrypted signature to be compared with decrypted signature */
    30122     ret = wolfSSL_RSA_sign_ex(type, m, mLen, sigRet, &len, rsa, 0);
    30123     if (ret <= 0) {
    30124         WOLFSSL_MSG("Message Digest Error");
    30125         XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     33606    if (sigDec)
    3012633607        XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    30127         return WOLFSSL_FAILURE;
    30128     }
    30129     show("Encoded Message", sigRet, len);
    30130     /* decrypt signature */
    30131     ret = wc_RsaSSL_Verify(sig, sigLen, (unsigned char *)sigDec, sigLen,
    30132         (RsaKey*)rsa->internal);
    30133     if (ret <= 0) {
    30134         WOLFSSL_MSG("RSA Decrypt error");
    30135         XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    30136         XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    30137         return WOLFSSL_FAILURE;
    30138     }
    30139     show("Decrypted Signature", sigDec, ret);
    30140 
    30141     if ((int)len == ret && XMEMCMP(sigRet, sigDec, ret) == 0) {
    30142         WOLFSSL_MSG("wolfSSL_RSA_verify success");
    30143         XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    30144         XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    30145         return WOLFSSL_SUCCESS;
    30146     }
    30147     else {
    30148         WOLFSSL_MSG("wolfSSL_RSA_verify failed");
    30149         XFREE(sigRet, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    30150         XFREE(sigDec, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    30151         return WOLFSSL_FAILURE;
    30152     }
     33608    return ret;
    3015333609}
    3015433610
     
    3022533681WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void)
    3022633682{
    30227     return (WOLFSSL_HMAC_CTX*)XMALLOC(sizeof(WOLFSSL_HMAC_CTX), NULL,
    30228         DYNAMIC_TYPE_OPENSSL);
     33683    WOLFSSL_HMAC_CTX* hmac_ctx = (WOLFSSL_HMAC_CTX*)XMALLOC(
     33684        sizeof(WOLFSSL_HMAC_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
     33685    if (hmac_ctx != NULL) {
     33686        XMEMSET(hmac_ctx, 0, sizeof(WOLFSSL_HMAC_CTX));
     33687    }
     33688    return hmac_ctx;
    3022933689}
    3023033690
     
    3025833718{
    3025933719    void* heap;
     33720    int ret;
    3026033721
    3026133722#ifndef HAVE_FIPS
     
    3027233733    #ifndef NO_MD5
    3027333734        case WC_MD5:
    30274             wc_Md5Copy(&src->hash.md5, &des->hash.md5);
     33735            ret = wc_Md5Copy(&src->hash.md5, &des->hash.md5);
    3027533736            break;
    3027633737    #endif /* !NO_MD5 */
     
    3027833739    #ifndef NO_SHA
    3027933740        case WC_SHA:
    30280             wc_ShaCopy(&src->hash.sha, &des->hash.sha);
     33741            ret = wc_ShaCopy(&src->hash.sha, &des->hash.sha);
    3028133742            break;
    3028233743    #endif /* !NO_SHA */
     
    3028433745    #ifdef WOLFSSL_SHA224
    3028533746        case WC_SHA224:
    30286             wc_Sha224Copy(&src->hash.sha224, &des->hash.sha224);
     33747            ret = wc_Sha224Copy(&src->hash.sha224, &des->hash.sha224);
    3028733748            break;
    3028833749    #endif /* WOLFSSL_SHA224 */
     
    3029033751    #ifndef NO_SHA256
    3029133752        case WC_SHA256:
    30292             wc_Sha256Copy(&src->hash.sha256, &des->hash.sha256);
     33753            ret = wc_Sha256Copy(&src->hash.sha256, &des->hash.sha256);
    3029333754            break;
    3029433755    #endif /* !NO_SHA256 */
     
    3029633757    #ifdef WOLFSSL_SHA384
    3029733758        case WC_SHA384:
    30298             wc_Sha384Copy(&src->hash.sha384, &des->hash.sha384);
     33759            ret = wc_Sha384Copy(&src->hash.sha384, &des->hash.sha384);
    3029933760            break;
    3030033761    #endif /* WOLFSSL_SHA384 */
    3030133762    #ifdef WOLFSSL_SHA512
    3030233763        case WC_SHA512:
    30303             wc_Sha512Copy(&src->hash.sha512, &des->hash.sha512);
     33764            ret = wc_Sha512Copy(&src->hash.sha512, &des->hash.sha512);
    3030433765            break;
    3030533766    #endif /* WOLFSSL_SHA512 */
     33767#ifdef WOLFSSL_SHA3
     33768    #ifndef WOLFSSL_NOSHA3_224
     33769        case WC_SHA3_224:
     33770            ret = wc_Sha3_224_Copy(&src->hash.sha3, &des->hash.sha3);
     33771            break;
     33772    #endif /* WOLFSSL_NO_SHA3_224 */
     33773    #ifndef WOLFSSL_NOSHA3_256
     33774        case WC_SHA3_256:
     33775            ret = wc_Sha3_256_Copy(&src->hash.sha3, &des->hash.sha3);
     33776            break;
     33777    #endif /* WOLFSSL_NO_SHA3_256 */
     33778    #ifndef WOLFSSL_NOSHA3_384
     33779        case WC_SHA3_384:
     33780            ret = wc_Sha3_384_Copy(&src->hash.sha3, &des->hash.sha3);
     33781            break;
     33782    #endif /* WOLFSSL_NO_SHA3_384 */
     33783    #ifndef WOLFSSL_NOSHA3_512
     33784        case WC_SHA3_512:
     33785            ret = wc_Sha3_512_Copy(&src->hash.sha3, &des->hash.sha3);
     33786            break;
     33787    #endif /* WOLFSSL_NO_SHA3_512 */
     33788#endif /* WOLFSSL_SHA3 */
    3030633789
    3030733790        default:
    3030833791            return WOLFSSL_FAILURE;
    3030933792    }
     33793
     33794    if (ret != 0)
     33795        return WOLFSSL_FAILURE;
    3031033796
    3031133797    XMEMCPY((byte*)des->ipad, (byte*)src->ipad, WC_HMAC_BLOCK_SIZE);
     
    3043833924    int hmac_error = 0;
    3043933925    void* heap = NULL;
     33926    int inited;
    3044033927
    3044133928    WOLFSSL_MSG("wolfSSL_HMAC_Init");
     
    3048733974        }
    3048833975        else
     33976#endif
     33977#ifdef WOLFSSL_SHA3
     33978    #ifndef WOLFSSL_NOSHA3_224
     33979        if (XSTRNCMP(type, "SHA3_224", 8) == 0) {
     33980            WOLFSSL_MSG("sha3_224 hmac");
     33981            ctx->type = WC_SHA3_224;
     33982        }
     33983        else
     33984    #endif
     33985    #ifndef WOLFSSL_NOSHA3_256
     33986        if (XSTRNCMP(type, "SHA3_256", 8) == 0) {
     33987            WOLFSSL_MSG("sha3_256 hmac");
     33988            ctx->type = WC_SHA3_256;
     33989        }
     33990        else
     33991    #endif
     33992        if (XSTRNCMP(type, "SHA3_384", 8) == 0) {
     33993            WOLFSSL_MSG("sha3_384 hmac");
     33994            ctx->type = WC_SHA3_384;
     33995        }
     33996        else
     33997    #ifndef WOLFSSL_NOSHA3_512
     33998        if (XSTRNCMP(type, "SHA3_512", 8) == 0) {
     33999            WOLFSSL_MSG("sha3_512 hmac");
     34000            ctx->type = WC_SHA3_512;
     34001        }
     34002        else
     34003    #endif
    3048934004#endif
    3049034005
     
    3050334018    }
    3050434019
    30505     if (key && keylen) {
     34020    /* Check if init has been called before */
     34021    inited = (ctx->hmac.macType != WC_HASH_TYPE_NONE);
     34022    /* Free if needed */
     34023    if (inited) {
     34024        wc_HmacFree(&ctx->hmac);
     34025    }
     34026    if (key != NULL) {
    3050634027        WOLFSSL_MSG("keying hmac");
    3050734028
     
    3051934040        }
    3052034041        /* OpenSSL compat, no error */
    30521     } else if(ctx->type >= 0) { /* MD5 == 0 */
     34042    }
     34043    else if (!inited) {
     34044        return WOLFSSL_FAILURE;
     34045    }
     34046    else if (ctx->type >= 0) { /* MD5 == 0 */
    3052234047        WOLFSSL_MSG("recover hmac");
    30523         wc_HmacFree(&ctx->hmac);
    3052434048        if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) {
    3052534049            ctx->hmac.macType = (byte)ctx->type;
     
    3062634150            #endif
    3062734151
     34152        #ifdef WOLFSSL_SHA3
     34153            #ifndef WOLFSSL_NOSHA3_224
     34154            case WC_SHA3_224:
     34155                *len = WC_SHA3_224_DIGEST_SIZE;
     34156                break;
     34157            #endif
     34158            #ifndef WOLFSSL_NOSHA3_256
     34159            case WC_SHA3_256:
     34160                *len = WC_SHA3_256_DIGEST_SIZE;
     34161                break;
     34162            #endif
     34163            #ifndef WOLFSSL_NOSHA3_384
     34164            case WC_SHA3_384:
     34165                *len = WC_SHA3_384_DIGEST_SIZE;
     34166                break;
     34167            #endif
     34168            #ifndef WOLFSSL_NOSHA3_512
     34169            case WC_SHA3_512:
     34170                *len = WC_SHA3_512_DIGEST_SIZE;
     34171                break;
     34172            #endif
     34173        #endif
     34174
    3062834175            default:
    3062934176                WOLFSSL_MSG("bad hmac type");
     
    3064034187    WOLFSSL_MSG("wolfSSL_HMAC_cleanup");
    3064134188
    30642     if (ctx)
     34189    if (ctx) {
    3064334190        wc_HmacFree(&ctx->hmac);
    30644 
    30645     return SSL_SUCCESS;
    30646 }
    30647 
     34191    }
     34192
     34193    return WOLFSSL_SUCCESS;
     34194}
     34195
     34196void wolfSSL_HMAC_CTX_cleanup(WOLFSSL_HMAC_CTX* ctx)
     34197{
     34198    if (ctx) {
     34199        wolfSSL_HMAC_cleanup(ctx);
     34200    }
     34201}
    3064834202
    3064934203void wolfSSL_HMAC_CTX_free(WOLFSSL_HMAC_CTX* ctx)
    3065034204{
    30651     if (!ctx) {
    30652         return;
    30653     }
    30654     wolfSSL_HMAC_cleanup(ctx);
    30655     XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
     34205    if (ctx) {
     34206        wolfSSL_HMAC_CTX_cleanup(ctx);
     34207        XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL);
     34208    }
    3065634209}
    3065734210
     
    3072434277void *wolfSSL_OPENSSL_malloc(size_t a)
    3072534278{
    30726   return XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
     34279    return (void *)XMALLOC(a, NULL, DYNAMIC_TYPE_OPENSSL);
     34280}
     34281
     34282int wolfSSL_OPENSSL_init_ssl(word64 opts, const OPENSSL_INIT_SETTINGS *settings)
     34283{
     34284    (void)opts;
     34285    (void)settings;
     34286    return wolfSSL_library_init();
     34287}
     34288
     34289int wolfSSL_OPENSSL_init_crypto(word64 opts, const OPENSSL_INIT_SETTINGS* settings)
     34290{
     34291    (void)opts;
     34292    (void)settings;
     34293    return wolfSSL_library_init();
    3072734294}
    3072834295
     
    3073034297
    3073134298static int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher,
    30732                          unsigned char* passwd, int passwdSz, byte **cipherInfo)
     34299                         unsigned char* passwd, int passwdSz, byte **cipherInfo,
     34300                         int maxDerSz)
    3073334301{
    3073434302    int ret, paddingSz;
     
    3078334351    if (paddingSz == 0)
    3078434352        paddingSz = info->ivSz;
     34353    if (maxDerSz < *derSz + paddingSz) {
     34354        WOLFSSL_MSG("not enough DER buffer allocated");
     34355#ifdef WOLFSSL_SMALL_STACK
     34356        XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO);
     34357#endif
     34358        return WOLFSSL_FAILURE;
     34359    }
    3078534360    XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz);
    3078634361    (*derSz) += paddingSz;
     
    3089834473#endif
    3089934474
    30900 #if defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN)
     34475#ifndef NO_BIO
    3090134476#if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && !defined(NO_RSA)
    30902 
    3090334477/* Takes a WOLFSSL_RSA key and writes it out to a WOLFSSL_BIO
    3090434478 *
     
    3094634520        }
    3094734521
     34522        if (derBuf == NULL) {
     34523            WOLFSSL_MSG("wolfSSL_RSA_To_Der failed to get buffer");
     34524            return WOLFSSL_FAILURE;
     34525        }
     34526
    3094834527        pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
    3094934528                DYNAMIC_TYPE_TMP_BUFFER);
     
    3100134580    }
    3100234581
     34582    if (derBuf == NULL) {
     34583        WOLFSSL_MSG("wolfSSL_RSA_To_Der failed to get buffer");
     34584        return WOLFSSL_FAILURE;
     34585    }
     34586
    3100334587    pkey->pkey.ptr = (char*)XMALLOC(derSz, bio->heap,
    3100434588            DYNAMIC_TYPE_TMP_BUFFER);
     
    3118334767    return WOLFSSL_SUCCESS;
    3118434768}
    31185 #endif /* defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN) */
     34769#endif /* !NO_BIO */
    3118634770
    3118734771#if (defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA)) && \
     
    3122834812    if (passwd != NULL && passwdSz > 0 && cipher != NULL) {
    3122934813        int ret;
     34814        int blockSz = wolfSSL_EVP_CIPHER_block_size(cipher);
     34815        byte *tmpBuf;
     34816
     34817        /* Add space for padding */
     34818        if (!(tmpBuf = (byte*)XREALLOC(derBuf, derSz + blockSz, NULL,
     34819                DYNAMIC_TYPE_TMP_BUFFER))) {
     34820            WOLFSSL_MSG("Extending DER buffer failed");
     34821            XFREE(derBuf, NULL, DYNAMIC_TYPE_DER);
     34822            return WOLFSSL_FAILURE;
     34823        }
     34824        derBuf = tmpBuf;
    3123034825
    3123134826        ret = EncryptDerKey(derBuf, &derSz, cipher,
    31232                             passwd, passwdSz, &cipherInfo);
     34827                            passwd, passwdSz, &cipherInfo, derSz + blockSz);
    3123334828        if (ret != WOLFSSL_SUCCESS) {
    3123434829            WOLFSSL_MSG("EncryptDerKey failed");
     
    3145935054    /* set group (OID, nid and idx) */
    3146035055    eckey->group->curve_oid = ecc_sets[key->idx].oidSum;
    31461     eckey->group->curve_nid = ecc_sets[key->idx].id;
     35056    eckey->group->curve_nid = EccEnumToNID(ecc_sets[key->idx].id);
    3146235057    eckey->group->curve_idx = key->idx;
    3146335058
     
    3162735222    WOLFSSL_EC_KEY *key;
    3162835223    int x;
    31629     int eccEnum;
     35224    int eccEnum = NIDToEccEnum(nid);
    3163035225
    3163135226    WOLFSSL_ENTER("wolfSSL_EC_KEY_new_by_curve_name");
    31632 
    31633     /* If NID passed in is OpenSSL type, convert it to ecc_curve_id enum */
    31634     eccEnum = NIDToEccEnum(nid);
    31635     if (eccEnum == -1)
    31636         eccEnum = nid;
    3163735227
    3163835228    key = wolfSSL_EC_KEY_new();
     
    3164335233
    3164435234    /* set the nid of the curve */
    31645     key->group->curve_nid = eccEnum;
    31646 
    31647     /* search and set the corresponding internal curve idx */
    31648     for (x = 0; ecc_sets[x].size != 0; x++)
    31649         if (ecc_sets[x].id == key->group->curve_nid) {
    31650             key->group->curve_idx = x;
    31651             key->group->curve_oid = ecc_sets[x].oidSum;
    31652             break;
    31653         }
     35235    key->group->curve_nid = nid;
     35236
     35237    if (eccEnum != -1) {
     35238        /* search and set the corresponding internal curve idx */
     35239        for (x = 0; ecc_sets[x].size != 0; x++)
     35240            if (ecc_sets[x].id == eccEnum) {
     35241                key->group->curve_idx = x;
     35242                key->group->curve_oid = ecc_sets[x].oidSum;
     35243                break;
     35244            }
     35245    }
    3165435246
    3165535247    return key;
     
    3166735259}
    3166835260
    31669 #ifdef WOLFSSL_TLS13
     35261#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
    3167035262static int populate_groups(int* groups, int max_count, char *list)
    3167135263{
     
    3172335315    }
    3172435316
    31725     return wolfSSL_CTX_set_groups(ctx, groups, count) == WOLFSSL_SUCCESS ?
    31726             WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
     35317    return wolfSSL_CTX_set1_groups(ctx, groups, count);
    3172735318}
    3172835319
     
    3174135332    }
    3174235333
    31743     return wolfSSL_set_groups(ssl, groups, count) == WOLFSSL_SUCCESS ?
    31744             WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
     35334    return wolfSSL_set1_groups(ssl, groups, count);
    3174535335}
    3174635336#endif /* WOLFSSL_TLS13 */
     
    3184835438{
    3184935439    int     initTmpRng = 0;
     35440    int     eccEnum;
    3185035441    WC_RNG* rng = NULL;
    3185135442#ifdef WOLFSSL_SMALL_STACK
     
    3188935480    }
    3189035481
    31891     if (wc_ecc_make_key_ex(rng, 0, (ecc_key*)key->internal,
    31892                                         key->group->curve_nid) != MP_OKAY) {
     35482    /* NIDToEccEnum returns -1 for invalid NID so if key->group->curve_nid
     35483     * is 0 then pass ECC_CURVE_DEF as arg */
     35484    eccEnum = key->group->curve_nid ?
     35485            NIDToEccEnum(key->group->curve_nid) : ECC_CURVE_DEF;
     35486    if (wc_ecc_make_key_ex(rng, 0, (ecc_key*)key->internal, eccEnum) != MP_OKAY) {
    3189335487        WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key wc_ecc_make_key failed");
    3189435488#ifdef WOLFSSL_SMALL_STACK
     
    3220135795}
    3220235796
     35797WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_dup(const WOLFSSL_EC_GROUP *src)
     35798{
     35799    if (!src)
     35800        return NULL;
     35801    return wolfSSL_EC_GROUP_new_by_curve_name(src->curve_nid);
     35802}
     35803
    3220335804#endif /* HAVE_ECC */
    3220435805#endif /* OPENSSL_EXTRA */
     
    3225135852    /* If NID passed in is OpenSSL type, convert it to ecc_curve_id enum */
    3225235853    eccEnum = NIDToEccEnum(nid);
    32253     if (eccEnum == -1)
    32254         eccEnum = nid;
    32255 
    3225635854
    3225735855    /* curve group */
     
    3226535863
    3226635864    /* set the nid of the curve */
    32267     g->curve_nid = eccEnum;
    32268 
    32269     if (eccEnum > ECC_CURVE_DEF) {
     35865    g->curve_nid = nid;
     35866
     35867    if (eccEnum != -1) {
    3227035868        /* search and set the corresponding internal curve idx */
    3227135869        for (x = 0; ecc_sets[x].size != 0; x++)
    32272             if (ecc_sets[x].id == g->curve_nid) {
     35870            if (ecc_sets[x].id == eccEnum) {
    3227335871                g->curve_idx = x;
    3227435872                g->curve_oid = ecc_sets[x].oidSum;
     
    3251836116}
    3251936117
     36118#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
    3252036119/* return code compliant with OpenSSL :
    3252136120 *   1 if success, 0 if error
     
    3262136220}
    3262236221
     36222
    3262336223int wolfSSL_EC_POINT_oct2point(const WOLFSSL_EC_GROUP *group,
    3262436224                               WOLFSSL_EC_POINT *p, const unsigned char *buf,
     
    3264836248    }
    3264936249
     36250#ifdef HAVE_COMP_KEY
    3265036251    /* Default to compressed form if not set */
    3265136252    form = in->form == POINT_CONVERSION_UNCOMPRESSED ?
    3265236253            POINT_CONVERSION_UNCOMPRESSED:
    3265336254            POINT_CONVERSION_COMPRESSED;
     36255#else
     36256    form = POINT_CONVERSION_UNCOMPRESSED;
     36257#endif
    3265436258
    3265536259    len = wolfSSL_EC_POINT_point2oct(in->group, in->pub_key, form,
     
    3268436288}
    3268536289
     36290#ifdef HAVE_ECC_KEY_IMPORT
     36291WOLFSSL_EC_KEY *wolfSSL_d2i_ECPrivateKey(WOLFSSL_EC_KEY **key, const unsigned char **in,
     36292                                         long len)
     36293{
     36294    WOLFSSL_EC_KEY *eckey = NULL;
     36295    WOLFSSL_ENTER("wolfSSL_d2i_ECPrivateKey");
     36296
     36297    if (!in || !*in || len <= 0) {
     36298        WOLFSSL_MSG("wolfSSL_d2i_ECPrivateKey Bad arguments");
     36299        return NULL;
     36300    }
     36301
     36302    if (!(eckey = wolfSSL_EC_KEY_new())) {
     36303        WOLFSSL_MSG("wolfSSL_EC_KEY_new error");
     36304        return NULL;
     36305    }
     36306
     36307    if (wc_ecc_import_private_key(*in, (word32)len, NULL, 0,
     36308            (ecc_key*)eckey->internal) != MP_OKAY) {
     36309        WOLFSSL_MSG("wc_ecc_import_private_key error");
     36310        goto error;
     36311    }
     36312
     36313    eckey->inSet = 1;
     36314
     36315    if (SetECKeyExternal(eckey) != WOLFSSL_SUCCESS) {
     36316        WOLFSSL_MSG("SetECKeyExternal error");
     36317        goto error;
     36318    }
     36319
     36320    if (key) {
     36321        *key = eckey;
     36322    }
     36323
     36324    return eckey;
     36325
     36326error:
     36327    wolfSSL_EC_KEY_free(eckey);
     36328    return NULL;
     36329}
     36330#endif /* HAVE_ECC_KEY_IMPORT */
     36331
     36332int wolfSSL_i2d_ECPrivateKey(const WOLFSSL_EC_KEY *in, unsigned char **out)
     36333{
     36334    int len;
     36335    byte* buf = NULL;
     36336    WOLFSSL_ENTER("wolfSSL_i2d_ECPrivateKey");
     36337
     36338    if (!in) {
     36339        WOLFSSL_MSG("wolfSSL_i2d_ECPrivateKey Bad arguments");
     36340        return WOLFSSL_FAILURE;
     36341    }
     36342
     36343    if (!in->inSet && SetECKeyInternal((WOLFSSL_EC_KEY*)in) != WOLFSSL_SUCCESS) {
     36344        WOLFSSL_MSG("SetECKeyInternal error");
     36345        return WOLFSSL_FAILURE;
     36346    }
     36347
     36348    if ((len = wc_ecc_size((ecc_key*)in->internal)) <= 0) {
     36349        WOLFSSL_MSG("wc_ecc_size error");
     36350        return WOLFSSL_FAILURE;
     36351    }
     36352
     36353    if (out) {
     36354        if (!(buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER))) {
     36355            WOLFSSL_MSG("tmp buffer malloc error");
     36356            return WOLFSSL_FAILURE;
     36357        }
     36358
     36359        if (wc_ecc_export_private_only((ecc_key*)in->internal, buf,
     36360                (word32*)&len) != MP_OKAY) {
     36361            WOLFSSL_MSG("wc_ecc_export_private_only error");
     36362            XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     36363            return WOLFSSL_FAILURE;
     36364        }
     36365
     36366        if (*out) {
     36367            XMEMCPY(*out, buf, len);
     36368            XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     36369        }
     36370        else {
     36371            *out = buf;
     36372        }
     36373    }
     36374
     36375    return len;
     36376}
     36377
    3268636378void wolfSSL_EC_KEY_set_conv_form(WOLFSSL_EC_KEY *eckey, char form)
    3268736379{
    32688     if (eckey && (form == POINT_CONVERSION_COMPRESSED ||
    32689                   form == POINT_CONVERSION_UNCOMPRESSED)) {
     36380    if (eckey && (form == POINT_CONVERSION_UNCOMPRESSED
     36381#ifdef HAVE_COMP_KEY
     36382                  || form == POINT_CONVERSION_COMPRESSED
     36383#endif
     36384                  )) {
    3269036385        eckey->form = form;
     36386    } else {
     36387        WOLFSSL_MSG("Incorrect form or HAVE_COMP_KEY not compiled in");
    3269136388    }
    3269236389}
     
    3272836425    return ret;
    3272936426}
     36427#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
     36428
     36429#ifdef USE_ECC_B_PARAM
     36430int wolfSSL_EC_POINT_is_on_curve(const WOLFSSL_EC_GROUP *group,
     36431                                 const WOLFSSL_EC_POINT *point,
     36432                                 WOLFSSL_BN_CTX *ctx)
     36433{
     36434    (void)ctx;
     36435    WOLFSSL_ENTER("wolfSSL_EC_POINT_is_on_curve");
     36436
     36437    if (!group || !point) {
     36438        WOLFSSL_MSG("Invalid arguments");
     36439        return WOLFSSL_FAILURE;
     36440    }
     36441
     36442    if (!point->inSet && SetECPointInternal((WOLFSSL_EC_POINT*)point)) {
     36443        WOLFSSL_MSG("SetECPointInternal error");
     36444        return WOLFSSL_FAILURE;
     36445    }
     36446
     36447    return wc_ecc_point_is_on_curve((ecc_point*)point->internal, group->curve_idx)
     36448            == MP_OKAY ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
     36449}
     36450#endif /* USE_ECC_B_PARAM */
    3273036451
    3273136452WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group)
     
    3285936580}
    3286036581
    32861 #if !defined(WOLFSSL_ATECC508A) && !defined(HAVE_SELFTEST)
     36582#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \
     36583    !defined(HAVE_SELFTEST)
     36584#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
     36585int wolfSSL_EC_POINT_add(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r,
     36586                         const WOLFSSL_EC_POINT *p1,
     36587                         const WOLFSSL_EC_POINT *p2, WOLFSSL_BN_CTX *ctx)
     36588{
     36589    mp_int a, prime, mu;
     36590    mp_digit mp = 0;
     36591    ecc_point* montP1 = NULL;
     36592    ecc_point* montP2 = NULL;
     36593    ecc_point* eccP1;
     36594    ecc_point* eccP2;
     36595    int ret = WOLFSSL_FAILURE;
     36596
     36597    (void)ctx;
     36598
     36599    if (!group || !r || !p1 || !p2) {
     36600        WOLFSSL_MSG("wolfSSL_EC_POINT_add error");
     36601        return WOLFSSL_FAILURE;
     36602    }
     36603
     36604    if (setupPoint(r) != WOLFSSL_SUCCESS ||
     36605        setupPoint(p1) != WOLFSSL_SUCCESS ||
     36606        setupPoint(p2) != WOLFSSL_SUCCESS) {
     36607        WOLFSSL_MSG("setupPoint error");
     36608        return WOLFSSL_FAILURE;
     36609    }
     36610
     36611    /* read the curve prime and a */
     36612    if (mp_init_multi(&prime, &a, &mu, NULL, NULL, NULL) != MP_OKAY) {
     36613        WOLFSSL_MSG("mp_init_multi error");
     36614        goto cleanup;
     36615    }
     36616
     36617    if (mp_read_radix(&a, ecc_sets[group->curve_idx].Af, MP_RADIX_HEX)
     36618            != MP_OKAY) {
     36619        WOLFSSL_MSG("mp_read_radix a error");
     36620        goto cleanup;
     36621    }
     36622
     36623    if (mp_read_radix(&prime, ecc_sets[group->curve_idx].prime, MP_RADIX_HEX)
     36624            != MP_OKAY) {
     36625        WOLFSSL_MSG("mp_read_radix prime error");
     36626        goto cleanup;
     36627    }
     36628
     36629    if (mp_montgomery_setup(&prime, &mp) != MP_OKAY) {
     36630        WOLFSSL_MSG("mp_montgomery_setup nqm error");
     36631        goto cleanup;
     36632    }
     36633
     36634    eccP1 = (ecc_point*)p1->internal;
     36635    eccP2 = (ecc_point*)p2->internal;
     36636
     36637    if (!(montP1 = wc_ecc_new_point_h(NULL)) ||
     36638            !(montP2 = wc_ecc_new_point_h(NULL))) {
     36639        WOLFSSL_MSG("wc_ecc_new_point_h nqm error");
     36640        goto cleanup;
     36641    }
     36642
     36643    if ((mp_montgomery_calc_normalization(&mu, &prime)) != MP_OKAY) {
     36644        WOLFSSL_MSG("mp_montgomery_calc_normalization error");
     36645        goto cleanup;
     36646    }
     36647
     36648    /* Convert to Montgomery form */
     36649    if (mp_cmp_d(&mu, 1) == MP_EQ) {
     36650        if (wc_ecc_copy_point(eccP1, montP1) != MP_OKAY ||
     36651                wc_ecc_copy_point(eccP2, montP2) != MP_OKAY) {
     36652            WOLFSSL_MSG("wc_ecc_copy_point error");
     36653            goto cleanup;
     36654        }
     36655    } else {
     36656        if (mp_mulmod(eccP1->x, &mu, &prime, montP1->x) != MP_OKAY ||
     36657                mp_mulmod(eccP1->y, &mu, &prime, montP1->y) != MP_OKAY ||
     36658                mp_mulmod(eccP1->z, &mu, &prime, montP1->z) != MP_OKAY) {
     36659            WOLFSSL_MSG("mp_mulmod error");
     36660            goto cleanup;
     36661        }
     36662        if (mp_mulmod(eccP2->x, &mu, &prime, montP2->x) != MP_OKAY ||
     36663                mp_mulmod(eccP2->y, &mu, &prime, montP2->y) != MP_OKAY ||
     36664                mp_mulmod(eccP2->z, &mu, &prime, montP2->z) != MP_OKAY) {
     36665            WOLFSSL_MSG("mp_mulmod error");
     36666            goto cleanup;
     36667        }
     36668    }
     36669
     36670    if (ecc_projective_add_point(montP1, montP2, (ecc_point*)r->internal,
     36671            &a, &prime, mp) != MP_OKAY) {
     36672        WOLFSSL_MSG("ecc_projective_add_point error");
     36673        goto cleanup;
     36674    }
     36675
     36676    if (ecc_map((ecc_point*)r->internal, &prime, mp) != MP_OKAY) {
     36677        WOLFSSL_MSG("ecc_map error");
     36678        goto cleanup;
     36679    }
     36680
     36681    ret = WOLFSSL_SUCCESS;
     36682cleanup:
     36683    mp_clear(&a);
     36684    mp_clear(&prime);
     36685    mp_clear(&mu);
     36686    wc_ecc_del_point_h(montP1, NULL);
     36687    wc_ecc_del_point_h(montP2, NULL);
     36688    return ret;
     36689}
     36690
    3286236691/* Calculate the value: generator * n + q * m
    3286336692 * return code compliant with OpenSSL :
     
    3294036769        }
    3294136770        /* r = generator * n */
    32942         if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 1)
     36771        if (wc_ecc_mulmod((mp_int*)n->internal, result, result, &a, &prime, 0)
    3294336772                != MP_OKAY) {
    3294436773            WOLFSSL_MSG("wc_ecc_mulmod nqm error");
     
    3294736776        /* tmp = q * m */
    3294836777        if (wc_ecc_mulmod((mp_int*)m->internal, (ecc_point*)q->internal,
    32949                 tmp, &a, &prime, 1) != MP_OKAY) {
     36778                tmp, &a, &prime, 0) != MP_OKAY) {
    3295036779            WOLFSSL_MSG("wc_ecc_mulmod nqm error");
    3295136780            goto cleanup;
     
    3299936828    return ret;
    3300036829}
     36830#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
    3300136831#endif /* !defined(WOLFSSL_ATECC508A) && defined(ECC_SHAMIR) &&
    3300236832        * !defined(HAVE_SELFTEST) */
     36833
     36834/* (x, y) -> (x, -y) */
     36835int wolfSSL_EC_POINT_invert(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *a,
     36836                            WOLFSSL_BN_CTX *ctx)
     36837{
     36838    ecc_point* p;
     36839    mp_int prime;
     36840
     36841    (void)ctx;
     36842
     36843    WOLFSSL_ENTER("wolfSSL_EC_POINT_invert");
     36844
     36845    if (!group || !a || !a->internal || setupPoint(a) != WOLFSSL_SUCCESS) {
     36846        return WOLFSSL_FAILURE;
     36847    }
     36848
     36849    p = (ecc_point*)a->internal;
     36850
     36851    /* read the curve prime and a */
     36852    if (mp_init_multi(&prime, NULL, NULL, NULL, NULL, NULL) != MP_OKAY) {
     36853        WOLFSSL_MSG("mp_init_multi error");
     36854        return WOLFSSL_FAILURE;
     36855    }
     36856
     36857    if (mp_sub(&prime, p->y, p->y) != MP_OKAY) {
     36858        WOLFSSL_MSG("mp_sub error");
     36859        return WOLFSSL_FAILURE;
     36860    }
     36861
     36862    if (SetECPointExternal(a) != WOLFSSL_SUCCESS) {
     36863        WOLFSSL_MSG("SetECPointExternal error");
     36864        return WOLFSSL_FAILURE;
     36865    }
     36866
     36867    return WOLFSSL_SUCCESS;
     36868}
    3300336869
    3300436870void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *p)
     
    3312236988/* End EC_POINT */
    3312336989
     36990#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
    3312436991size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r, size_t nitems)
    3312536992{
     
    3314137008    }
    3314237009
    33143     return ecc_sets_count;
    33144 }
     37010    return min_nitems;
     37011}
     37012#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
    3314537013
    3314637014/* Start ECDSA_SIG */
     
    3339237260{
    3339337261    word32 len;
    33394     (void)KDF;
    33395 
     37262    ecc_key* key;
     37263    int ret;
     37264#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
     37265    && !defined(HAVE_FIPS)
     37266    int setGlobalRNG = 0;
     37267#endif
    3339637268    (void)KDF;
    3339737269
     
    3341637288
    3341737289    len = (word32)outlen;
    33418 
    33419     if (wc_ecc_shared_secret_ssh((ecc_key*)ecdh->internal,
    33420                                  (ecc_point*)pub_key->internal,
    33421                                  (byte *)out, &len) != MP_OKAY) {
     37290    key = (ecc_key*)ecdh->internal;
     37291
     37292#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
     37293    && !defined(HAVE_FIPS)
     37294    if (key->rng == NULL) {
     37295        if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) {
     37296            WOLFSSL_MSG("No RNG to use");
     37297            return WOLFSSL_FATAL_ERROR;
     37298        }
     37299        key->rng = &globalRNG;
     37300        setGlobalRNG = 1;
     37301    }
     37302#endif
     37303    ret = wc_ecc_shared_secret_ssh(key, (ecc_point*)pub_key->internal,
     37304            (byte *)out, &len);
     37305#if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \
     37306    && !defined(HAVE_FIPS)
     37307    if (setGlobalRNG)
     37308        key->rng = NULL;
     37309#endif
     37310    if (ret != MP_OKAY) {
    3342237311        WOLFSSL_MSG("wc_ecc_shared_secret failed");
    3342337312        return WOLFSSL_FATAL_ERROR;
     
    3344337332}
    3344437333#endif
     37334
     37335#ifndef NO_BIO
    3344537336
    3344637337/* Uses the same format of input as wolfSSL_PEM_read_bio_PrivateKey but expects
     
    3351237403    return local;
    3351337404}
     37405#endif /* !NO_BIO */
    3351437406#endif /* NO_FILESYSTEM */
    3351537407
    3351637408#if defined(WOLFSSL_KEY_GEN)
     37409#ifndef NO_BIO
    3351737410/* Takes a public WOLFSSL_EC_KEY and writes it out to WOLFSSL_BIO
    3351837411 * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE
     
    3365337546}
    3365437547
     37548#endif /* !NO_BIO */
     37549
    3365537550/* return code compliant with OpenSSL :
    3365637551 *   1 if success, 0 if error
     
    3370937604
    3371037605        ret = EncryptDerKey(derBuf, &derSz, cipher,
    33711                             passwd, passwdSz, &cipherInfo);
     37606                            passwd, passwdSz, &cipherInfo, der_max_len);
    3371237607        if (ret != WOLFSSL_SUCCESS) {
    3371337608            WOLFSSL_MSG("EncryptDerKey failed");
     
    3382337718
    3382437719#if defined(WOLFSSL_KEY_GEN)
     37720#ifndef NO_BIO
    3382537721
    3382637722/* Takes a DSA Privatekey and writes it out to a WOLFSSL_BIO
     
    3396237858}
    3396337859#endif /* HAVE_SELFTEST */
     37860#endif /* !NO_BIO */
    3396437861
    3396537862/* return code compliant with OpenSSL :
     
    3401937916
    3402037917        ret = EncryptDerKey(derBuf, &derSz, cipher,
    34021                             passwd, passwdSz, &cipherInfo);
     37918                            passwd, passwdSz, &cipherInfo, der_max_len);
    3402237919        if (ret != WOLFSSL_SUCCESS) {
    3402337920            WOLFSSL_MSG("EncryptDerKey failed");
     
    3414538042
    3414638043#endif /* #ifndef NO_DSA */
     38044
     38045#ifndef NO_BIO
    3414738046
    3414838047static int pem_read_bio_key(WOLFSSL_BIO* bio, pem_password_cb* cb, void* pass,
     
    3450038399#endif /* HAVE_ECC */
    3450138400
     38401#endif /* !NO_BIO */
     38402
    3450238403#if !defined(NO_FILESYSTEM)
    3450338404WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, EVP_PKEY **x,
     
    3451738418#ifndef NO_RSA
    3451838419
     38420#ifndef NO_BIO
    3451938421#if defined(XSNPRINTF) && !defined(HAVE_FAST_RSA)
    3452038422/* snprintf() must be available */
     
    3453738439    int i = 0;
    3453838440    mp_int *rsaElem = NULL;
    34539     char rsaStr[][20] = { "Modulus:",
     38441    const char *rsaStr[] = {
     38442                          "Modulus:",
    3454038443                          "PublicExponent:",
    3454138444                          "PrivateExponent:",
     
    3468838591
    3468938592#endif /* XSNPRINTF */
     38593#endif /* !NO_BIO */
    3469038594
    3469138595#if !defined(NO_FILESYSTEM)
     
    3489838802#if defined(WC_RSA_PSS) && (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \
    3489938803        defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX))
    34900 static int hash2mgf(enum wc_HashType hType)
    34901 {
    34902     switch (hType) {
    34903 #ifndef NO_SHA
    34904     case WC_HASH_TYPE_SHA:
    34905         return WC_MGF1SHA1;
    34906 #endif
    34907 #ifndef NO_SHA256
    34908 #ifdef WOLFSSL_SHA224
    34909     case WC_HASH_TYPE_SHA224:
    34910         return WC_MGF1SHA224;
    34911 #endif
    34912     case WC_HASH_TYPE_SHA256:
    34913         return WC_MGF1SHA256;
    34914 #endif
    34915 #ifdef WOLFSSL_SHA384
    34916     case WC_HASH_TYPE_SHA384:
    34917         return WC_MGF1SHA384;
    34918 #endif
    34919 #ifdef WOLFSSL_SHA512
    34920     case WC_HASH_TYPE_SHA512:
    34921         return WC_MGF1SHA512;
    34922 #endif
    34923     case WC_HASH_TYPE_NONE:
    34924     case WC_HASH_TYPE_MD2:
    34925     case WC_HASH_TYPE_MD4:
    34926     case WC_HASH_TYPE_MD5:
    34927     case WC_HASH_TYPE_MD5_SHA:
    34928     case WC_HASH_TYPE_SHA3_224:
    34929     case WC_HASH_TYPE_SHA3_256:
    34930     case WC_HASH_TYPE_SHA3_384:
    34931     case WC_HASH_TYPE_SHA3_512:
    34932     case WC_HASH_TYPE_BLAKE2B:
    34933     case WC_HASH_TYPE_BLAKE2S:
    34934     default:
    34935         WOLFSSL_MSG("Unrecognized or unsupported hash function");
    34936         return WC_MGF1NONE;
    34937     }
    34938 }
    34939 
     38804#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
    3494038805/*
    3494138806 *                                +-----------+
     
    3500338868    }
    3500438869
    35005    if ((mgf = hash2mgf(hashType)) == WC_MGF1NONE) {
    35006        WOLFSSL_MSG("hash2mgf error");
     38870   if ((mgf = wc_hash2mgf(hashType)) == WC_MGF1NONE) {
     38871       WOLFSSL_MSG("wc_hash2mgf error");
    3500738872       goto cleanup;
    3500838873   }
     
    3503538900    }
    3503638901
    35037     if (wc_RsaPad_ex(mHash, wolfSSL_EVP_MD_size(hashAlg), EM, emLen,
     38902    if (wc_RsaPad_ex(mHash, hashLen, EM, emLen,
    3503838903                     RSA_BLOCK_TYPE_1, rng, WC_RSA_PSS_PAD,
    35039                      wolfSSL_EVP_md2macType(hashAlg), mgf, NULL, 0, saltLen,
     38904                     hashType, mgf, NULL, 0, saltLen,
    3504038905                     wolfSSL_BN_num_bits(rsa->n), NULL) != MP_OKAY) {
    3504138906        WOLFSSL_MSG("wc_RsaPad_ex error");
     
    3511038975    }
    3511138976
    35112     if ((mgf = hash2mgf(hashType)) == WC_MGF1NONE) {
    35113         WOLFSSL_MSG("hash2mgf error");
     38977    if ((mgf = wc_hash2mgf(hashType)) == WC_MGF1NONE) {
     38978        WOLFSSL_MSG("wc_hash2mgf error");
    3511438979        return WOLFSSL_FAILURE;
    3511538980    }
     
    3514739012    return WOLFSSL_SUCCESS;
    3514839013}
    35149 #endif
     39014#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
     39015#endif /* WC_RSA_PSS && (OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY
     39016        *                || WOLFSSL_NGINX)
     39017        */
    3515039018
    3515139019#if defined(OPENSSL_EXTRA)
     
    3525639124    if (wolfSSL_RSA_LoadDer_ex(local,
    3525739125                derBuf, derSz,
    35258                 WOLFSSL_RSA_LOAD_PUBLIC) != SSL_SUCCESS) {
     39126                WOLFSSL_RSA_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
    3525939127        wolfSSL_RSA_free(local);
    3526039128        local = NULL;
     
    3532239190#endif /* NO_RSA */
    3532339191
    35324 #ifdef OPENSSL_EXTRA
    35325 #ifndef NO_DSA
     39192#if !defined(NO_DSA) && \
     39193    (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL))
    3532639194/* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
    3532739195int wolfSSL_DSA_LoadDer(WOLFSSL_DSA* dsa, const unsigned char* derBuf, int derSz)
     
    3539339261    return WOLFSSL_SUCCESS;
    3539439262}
    35395 #endif /* !NO_DSA */
    35396 
     39263#endif /* !NO_DSA && (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */
     39264
     39265#ifdef OPENSSL_EXTRA
    3539739266#ifdef HAVE_ECC
    3539839267/* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
     
    3544839317#if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH))
    3544939318/* return WOLFSSL_SUCCESS if success, WOLFSSL_FATAL_ERROR if error */
     39319#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
    3545039320int wolfSSL_DH_LoadDer(WOLFSSL_DH* dh, const unsigned char* derBuf, int derSz)
    3545139321{
     
    3546339333        return WOLFSSL_FATAL_ERROR;
    3546439334    }
     39335    dh->inSet = 1;
    3546539336
    3546639337    if (SetDhExternal(dh) != WOLFSSL_SUCCESS) {
     
    3547139342    return WOLFSSL_SUCCESS;
    3547239343}
     39344#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
    3547339345#endif /* ! NO_DH && WOLFSSL_QT || OPENSSL_ALL */
    3547439346
     
    3548839360        wc_UnLockMutex(&rsa->refMutex);
    3548939361
    35490         return 1;
    35491     }
    35492 
    35493     return 0;
     39362        return WOLFSSL_SUCCESS;
     39363    }
     39364
     39365    return WOLFSSL_FAILURE;
    3549439366}
    3549539367
     
    3550439376        wc_UnLockMutex(&x509->refMutex);
    3550539377
    35506         return 1;
    35507     }
    35508 
    35509     return 0;
     39378        return WOLFSSL_SUCCESS;
     39379    }
     39380
     39381    return WOLFSSL_FAILURE;
    3551039382}
    3551139383
     
    3612439996#endif
    3612539997
    36126 #ifdef OPENSSL_EXTRA
    36127     #ifndef NO_CERTS
     39998#if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
     39999    !defined(WOLFCRYPT_ONLY)
     40000#ifndef NO_CERTS
    3612840001    void wolfSSL_X509_NAME_free(WOLFSSL_X509_NAME *name)
    3612940002    {
    3613040003        WOLFSSL_ENTER("wolfSSL_X509_NAME_free");
    36131         FreeX509Name(name, NULL);
     40004        FreeX509Name(name);
    3613240005        XFREE(name, NULL, DYNAMIC_TYPE_X509);
    3613340006    }
     
    3614740020                DYNAMIC_TYPE_X509);
    3614840021        if (name != NULL) {
    36149             InitX509Name(name, 1);
     40022            InitX509Name(name, 1, NULL);
    3615040023        }
    3615140024        return name;
     
    3615640029    WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME *name)
    3615740030    {
    36158         WOLFSSL_X509_NAME* dup = NULL;
     40031        WOLFSSL_X509_NAME* copy = NULL;
    3615940032
    3616040033        WOLFSSL_ENTER("wolfSSL_X509_NAME_dup");
     
    3616540038        }
    3616640039
    36167         if (!(dup = wolfSSL_X509_NAME_new())) {
     40040        if (!(copy = wolfSSL_X509_NAME_new())) {
    3616840041            return NULL;
    3616940042        }
    3617040043
    3617140044        /* copy contents */
    36172         XMEMCPY(dup, name, sizeof(WOLFSSL_X509_NAME));
    36173         InitX509Name(dup, 1);
    36174         dup->sz = name->sz;
    36175 
    36176         /* handle dynamic portions */
    36177         if (name->dynamicName) {
    36178             if (!(dup->name = (char*)XMALLOC(name->sz, 0,
    36179                                              DYNAMIC_TYPE_OPENSSL))) {
    36180                 goto err;
    36181             }
    36182         }
    36183         XMEMCPY(dup->name, name->name, name->sz);
    36184     #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
    36185         !defined(NO_ASN)
    36186         if (!(dup->fullName.fullName = (char*)XMALLOC(name->fullName.fullNameLen,
    36187                                                    0, DYNAMIC_TYPE_OPENSSL))) {
    36188             goto err;
    36189         }
    36190         XMEMCPY(dup->fullName.fullName, name->fullName.fullName,
    36191             name->fullName.fullNameLen);
    36192     #endif
    36193 
    36194         return dup;
    36195 
    36196     err:
    36197         if (dup) {
    36198             if (dup->dynamicName && dup->name) {
    36199                 XFREE(dup->name, 0, DYNAMIC_TYPE_OPENSSL);
    36200                 dup->name = NULL;
    36201             }
    36202         #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
    36203             !defined(NO_ASN)
    36204             if (dup->fullName.fullName &&
    36205                 dup->fullName.fullName != name->fullName.fullName) {
    36206                 XFREE(dup->fullName.fullName, 0, DYNAMIC_TYPE_OPENSSL);
    36207                 dup->fullName.fullName = NULL;
    36208             }
    36209         #endif
    36210             wolfSSL_X509_NAME_free(dup);
    36211         }
    36212         return NULL;
    36213     }
    36214 
    36215 #if defined(WOLFSSL_CERT_GEN)
    36216     /* helper function for CopyX509NameToCertName()
    36217      *
    36218      * returns WOLFSSL_SUCCESS on success
    36219      */
    36220     static int CopyX509NameEntry(char* out, int mx, char* in, int inLen)
     40045        InitX509Name(copy, 1, name->heap);
     40046        if (wolfSSL_X509_NAME_copy(name, copy) != WOLFSSL_SUCCESS) {
     40047            wolfSSL_X509_NAME_free(copy);
     40048            return NULL;
     40049        }
     40050
     40051        return copy;
     40052    }
     40053
     40054#ifdef WOLFSSL_CERT_GEN
     40055
     40056#if defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)
     40057    /* Helper function to copy cert name from a WOLFSSL_X509_NAME structure to
     40058    * a Cert structure.
     40059    *
     40060    * returns length of DER on success and a negative error value on failure
     40061    */
     40062    static int CopyX509NameToCert(WOLFSSL_X509_NAME* n, byte* out)
    3622140063    {
    36222         if (inLen > mx) {
    36223             WOLFSSL_MSG("Name too long");
    36224             XMEMCPY(out, in, mx);
    36225         }
    36226         else {
    36227             XMEMCPY(out, in, inLen);
    36228             out[inLen] = '\0';
    36229         }
    36230 
    36231         /* make sure is null terminated */
    36232         out[mx-1] = '\0';
    36233 
    36234         return WOLFSSL_SUCCESS;
    36235     }
    36236 
    36237 
    36238     /* Helper function to copy cert name from a WOLFSSL_X509_NAME structure to
    36239      * a CertName structure.
    36240      *
    36241      * returns WOLFSSL_SUCCESS on success and a negative error value on failure
    36242      */
    36243     static int CopyX509NameToCertName(WOLFSSL_X509_NAME* n, CertName* cName)
    36244     {
    36245         DecodedName* dn = NULL;
    36246 
    36247         if (n == NULL || cName == NULL) {
    36248             return BAD_FUNC_ARG;
    36249         }
    36250 
    36251         dn = &(n->fullName);
    36252 
    36253         /* initialize cert name */
    36254         cName->country[0] = '\0';
    36255         cName->countryEnc = CTC_PRINTABLE;
    36256         cName->state[0] = '\0';
    36257         cName->stateEnc = CTC_UTF8;
    36258         cName->locality[0] = '\0';
    36259         cName->localityEnc = CTC_UTF8;
    36260         cName->sur[0] = '\0';
    36261         cName->surEnc = CTC_UTF8;
    36262         cName->org[0] = '\0';
    36263         cName->orgEnc = CTC_UTF8;
    36264         cName->unit[0] = '\0';
    36265         cName->unitEnc = CTC_UTF8;
    36266         cName->commonName[0] = '\0';
    36267         cName->commonNameEnc = CTC_UTF8;
    36268         cName->serialDev[0] = '\0';
    36269         cName->serialDevEnc = CTC_PRINTABLE;
    36270     #ifdef WOLFSSL_CERT_EXT
    36271         cName->busCat[0] = '\0';
    36272         cName->busCatEnc = CTC_UTF8;
    36273         cName->joiC[0] = '\0';
    36274         cName->joiCEnc = CTC_PRINTABLE;
    36275         cName->joiSt[0] = '\0';
    36276         cName->joiStEnc = CTC_PRINTABLE;
    36277     #endif
    36278         cName->email[0] = '\0';
    36279 
    36280 
    36281         /* ASN_COUNTRY_NAME */
    36282         WOLFSSL_MSG("Copy Country Name");
    36283         if (CopyX509NameEntry(cName->country, CTC_NAME_SIZE, dn->fullName + dn->cIdx,
    36284                     dn->cLen) != SSL_SUCCESS) {
    36285             return BUFFER_E;
    36286         }
    36287 
    36288         /* ASN_ORGUNIT_NAME */
    36289         WOLFSSL_MSG("Copy Org Unit Name");
    36290         if (CopyX509NameEntry(cName->unit, CTC_NAME_SIZE, dn->fullName + dn->ouIdx,
    36291                     dn->ouLen) != SSL_SUCCESS) {
    36292             return BUFFER_E;
    36293         }
    36294 
    36295         /* ASN_ORG_NAME */
    36296         WOLFSSL_MSG("Copy Org Name");
    36297         if (CopyX509NameEntry(cName->org, CTC_NAME_SIZE, dn->fullName + dn->oIdx,
    36298                     dn->oLen) != SSL_SUCCESS) {
    36299             return BUFFER_E;
    36300         }
    36301 
    36302         /* ASN_STATE_NAME */
    36303         WOLFSSL_MSG("Copy State Name");
    36304         if (CopyX509NameEntry(cName->state, CTC_NAME_SIZE, dn->fullName + dn->stIdx,
    36305                     dn->stLen) != SSL_SUCCESS) {
    36306             return BUFFER_E;
    36307         }
    36308 
    36309         /* ASN_LOCALITY_NAME */
    36310         WOLFSSL_MSG("Copy Locality Name");
    36311         if (CopyX509NameEntry(cName->locality, CTC_NAME_SIZE,
    36312                     dn->fullName + dn->lIdx, dn->lLen)
    36313                     != SSL_SUCCESS) {
    36314             return BUFFER_E;
    36315         }
    36316 
    36317         /* ASN_SUR_NAME */
    36318         WOLFSSL_MSG("Copy Sur Name");
    36319         if (CopyX509NameEntry(cName->sur, CTC_NAME_SIZE, dn->fullName + dn->snIdx,
    36320                     dn->snLen) != SSL_SUCCESS) {
    36321             return BUFFER_E;
    36322         }
    36323 
    36324         /* ASN_COMMON_NAME */
    36325         WOLFSSL_MSG("Copy Common Name");
    36326         if (CopyX509NameEntry(cName->commonName, CTC_NAME_SIZE,
    36327                     dn->fullName + dn->cnIdx, dn->cnLen)
    36328                     != SSL_SUCCESS) {
    36329             return BUFFER_E;
    36330         }
    36331 
    36332         /* ASN_SERIAL_NUMBER */
    36333         WOLFSSL_MSG("Copy Serial Number of Device");
    36334         if (CopyX509NameEntry(cName->serialDev, CTC_NAME_SIZE,
    36335                     dn->fullName + dn->serialIdx, dn->serialLen)
    36336                     != SSL_SUCCESS) {
    36337             return BUFFER_E;
    36338         }
    36339 
    36340     #ifdef WOLFSSL_CERT_EXT
    36341         /* ASN_BUS_CAT */
    36342         WOLFSSL_MSG("Copy Business Category");
    36343         if (CopyX509NameEntry(cName->busCat, CTC_NAME_SIZE,
    36344                     dn->fullName + dn->bcIdx, dn->bcLen)
    36345                     != SSL_SUCCESS) {
    36346             return BUFFER_E;
    36347         }
    36348 
    36349         /* JoI Country */
    36350         WOLFSSL_MSG("Copy Jurisdiction of Incorporation Country");
    36351         if (CopyX509NameEntry(cName->joiC, CTC_NAME_SIZE,
    36352                     dn->fullName + dn->jcIdx, dn->jcLen)
    36353                     != SSL_SUCCESS) {
    36354             return BUFFER_E;
    36355         }
    36356 
    36357         /* JoI State */
    36358         WOLFSSL_MSG("Copy Jurisdiction of Incorporation State");
    36359         if (CopyX509NameEntry(cName->joiSt, CTC_NAME_SIZE,
    36360                     dn->fullName + dn->jsIdx, dn->jsLen)
    36361                     != SSL_SUCCESS) {
    36362             return BUFFER_E;
    36363         }
    36364     #endif
    36365 
    36366         WOLFSSL_MSG("Copy Email");
    36367         if (CopyX509NameEntry(cName->email, CTC_NAME_SIZE,
    36368                     dn->fullName + dn->emailIdx, dn->emailLen)
    36369                     != SSL_SUCCESS) {
    36370             return BUFFER_E;
    36371         }
    36372 
    36373         return WOLFSSL_SUCCESS;
    36374     }
     40064        unsigned char* der = NULL;
     40065        int length = BAD_FUNC_ARG, ret;
     40066        word32 idx = 0;
     40067
     40068        ret = wolfSSL_i2d_X509_NAME(n, &der);
     40069        if (ret > (int)sizeof(CertName) || ret < 0) {
     40070            WOLFSSL_MSG("Name conversion error");
     40071            ret = MEMORY_E;
     40072        }
     40073
     40074        if (ret > 0) {
     40075            /* strip off sequence, this gets added on certificate creation */
     40076            ret = GetSequence(der, &idx, &length, ret);
     40077        }
     40078
     40079        if (ret > 0) {
     40080            XMEMCPY(out, der + idx, length);
     40081        }
     40082
     40083        if (der != NULL)
     40084            XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL);
     40085
     40086        return length;
     40087    }
     40088#endif
    3637540089
    3637640090#ifdef WOLFSSL_CERT_REQ
     
    3638240096            return WOLFSSL_FAILURE;
    3638340097
    36384         ret = CopyX509NameToCertName(&req->subject, &cert->subject);
     40098
     40099        ret = CopyX509NameToCert(&req->subject, cert->sbjRaw);
     40100        if (ret < 0) {
     40101            WOLFSSL_MSG("REQ subject conversion error");
     40102            ret = MEMORY_E;
     40103        }
     40104        else {
     40105            ret = WOLFSSL_SUCCESS;
     40106        }
     40107
    3638540108        if (ret == WOLFSSL_SUCCESS) {
    3638640109            cert->version = req->version;
    3638740110            cert->isCA = req->isCa;
    36388 #ifdef WOLFSSL_CERT_EXT
     40111    #ifdef WOLFSSL_CERT_EXT
    3638940112            if (req->subjKeyIdSz != 0) {
    3639040113                XMEMCPY(cert->skid, req->subjKeyId, req->subjKeyIdSz);
     
    3639440117                cert->keyUsage = req->keyUsage;
    3639540118            /* Extended Key Usage not supported. */
    36396 #endif
     40119    #endif
     40120    #ifdef WOLFSSL_CERT_REQ
     40121            XMEMCPY(cert->challengePw, req->challengePw, CTC_NAME_SIZE);
     40122            cert->challengePwPrintableString = req->challengePw[0] != 0;
     40123    #endif
     40124    #ifdef WOLFSSL_ALT_NAMES
     40125            cert->altNamesSz = FlattenAltNames(cert->altNames,
     40126                    sizeof(cert->altNames), req->altNames);
     40127    #endif /* WOLFSSL_ALT_NAMES */
    3639740128        }
    3639840129
    3639940130        return ret;
    3640040131    }
    36401 #endif
     40132#endif /* WOLFSSL_CERT_REQ */
     40133
     40134#ifdef WOLFSSL_ALT_NAMES
     40135    /* converts WOLFSSL_AN1_TIME to Cert form, returns positive size on
     40136     * success */
     40137    static int CertDateFromX509(byte* out, int outSz, WOLFSSL_ASN1_TIME* t)
     40138    {
     40139        int sz, i;
     40140
     40141        if (t->length + 1 >= outSz) {
     40142            return BUFFER_E;
     40143        }
     40144
     40145        out[0] = t->type;
     40146        sz = SetLength(t->length, out + 1) + 1;  /* gen tag */
     40147        for (i = 0; i < t->length; i++) {
     40148            out[sz + i] = t->data[i];
     40149        }
     40150        return t->length + sz;
     40151    }
     40152#endif /* WOLFSSL_ALT_NAMES */
    3640240153
    3640340154    /* convert a WOLFSSL_X509 to a Cert structure for writing out */
     
    3642140172    #ifdef WOLFSSL_ALT_NAMES
    3642240173        if (x509->notBefore.length > 0) {
    36423             if ((x509->notBefore.length + 2) < CTC_DATE_SIZE) {
    36424                 cert->beforeDate[0] = x509->notBefore.type;
    36425                 cert->beforeDate[1] = x509->notBefore.length;
    36426                 XMEMCPY(&cert->beforeDate[2], x509->notBefore.data,
    36427                         x509->notBefore.length);
    36428                 cert->beforeDateSz = x509->notBefore.length + 2;
    36429             }
    36430             else {
    36431                 WOLFSSL_MSG("Not before date too large");
     40174            cert->beforeDateSz = CertDateFromX509(cert->beforeDate,
     40175                        CTC_DATE_SIZE, &x509->notBefore);
     40176            if (cert->beforeDateSz <= 0){
     40177                WOLFSSL_MSG("Not before date error");
    3643240178                return WOLFSSL_FAILURE;
    3643340179            }
     
    3643640182            cert->beforeDateSz = 0;
    3643740183        }
     40184
    3643840185        if (x509->notAfter.length > 0) {
    36439             if ((x509->notAfter.length + 2) < CTC_DATE_SIZE) {
    36440                 cert->afterDate[0] = x509->notAfter.type;
    36441                 cert->afterDate[1] = x509->notAfter.length;
    36442                 XMEMCPY(&cert->afterDate[2], x509->notAfter.data,
    36443                         x509->notAfter.length);
    36444                 cert->afterDateSz = x509->notAfter.length + 2;
    36445             }
    36446             else {
    36447                 WOLFSSL_MSG("Not after date too large");
     40186            cert->afterDateSz = CertDateFromX509(cert->afterDate,
     40187                        CTC_DATE_SIZE, &x509->notAfter);
     40188            if (cert->afterDateSz <= 0){
     40189                WOLFSSL_MSG("Not after date error");
    3644840190                return WOLFSSL_FAILURE;
    3644940191            }
     
    3645540197        cert->altNamesSz = FlattenAltNames(cert->altNames,
    3645640198                sizeof(cert->altNames), x509->altNames);
    36457 
    3645840199    #endif /* WOLFSSL_ALT_NAMES */
    3645940200
     
    3650240243    #endif
    3650340244
    36504         if (x509->serialSz <= CTC_SERIAL_SIZE) {
    36505             XMEMCPY(cert->serial, x509->serial, x509->serialSz);
    36506         }
    36507         else {
    36508             WOLFSSL_MSG("Serial size error");
     40245        /* set serial number */
     40246        if (x509->serialSz > 0) {
     40247        #if defined(OPENSSL_EXTRA)
     40248            byte serial[EXTERNAL_SERIAL_SIZE];
     40249            int  serialSz = EXTERNAL_SERIAL_SIZE;
     40250
     40251            ret = wolfSSL_X509_get_serial_number(x509, serial, &serialSz);
     40252            if (ret != WOLFSSL_SUCCESS) {
     40253                WOLFSSL_MSG("Serial size error");
     40254                return WOLFSSL_FAILURE;
     40255            }
     40256            XMEMCPY(cert->serial, serial, serialSz);
     40257            cert->serialSz = serialSz;
     40258        #else
     40259            WOLFSSL_MSG("Getting X509 serial number not supported");
    3650940260            return WOLFSSL_FAILURE;
     40261        #endif
    3651040262        }
    3651140263
     
    3651340265        if (x509->issuerSet)
    3651440266            cert->selfSigned = 0;
    36515         if ((ret = CopyX509NameToCertName(&(x509->issuer), &(cert->issuer)))
    36516             != WOLFSSL_SUCCESS) {
    36517             WOLFSSL_MSG("Error copying over issuer names");
    36518             WOLFSSL_LEAVE("wolfSSL_X509_to_Cert()", ret);
    36519             return WOLFSSL_FAILURE;
    36520         }
    36521         if ((ret = CopyX509NameToCertName(&(x509->subject), &(cert->subject)))
    36522             != WOLFSSL_SUCCESS) {
    36523             WOLFSSL_MSG("Error copying over subject names");
    36524             WOLFSSL_LEAVE("wolfSSL_X509_to_Cert()", ret);
    36525             return WOLFSSL_FAILURE;
    36526         }
     40267
     40268    #if defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)
     40269        ret = CopyX509NameToCert(&x509->subject, cert->sbjRaw);
     40270        if (ret < 0) {
     40271            WOLFSSL_MSG("Subject conversion error");
     40272            return MEMORY_E;
     40273        }
     40274        if (cert->selfSigned) {
     40275            XMEMCPY(cert->issRaw, cert->sbjRaw, sizeof(CertName));
     40276        }
     40277        else {
     40278            ret = CopyX509NameToCert(&x509->issuer, cert->issRaw);
     40279            if (ret < 0) {
     40280                WOLFSSL_MSG("Issuer conversion error");
     40281                return MEMORY_E;
     40282            }
     40283        }
     40284    #endif
    3652740285
    3652840286        cert->heap = x509->heap;
    3652940287
     40288        (void)ret;
    3653040289        return WOLFSSL_SUCCESS;
    3653140290    }
     
    3654040299        int sigType = WOLFSSL_FAILURE;
    3654140300
     40301    #if !defined(NO_PWDBASED) && defined(OPENSSL_EXTRA)
    3654240302        /* Convert key type and hash algorithm to a signature algorithm */
    36543         if (wolfSSL_EVP_get_hashinfo(md, &hashType, NULL) == WOLFSSL_FAILURE)
     40303        if (wolfSSL_EVP_get_hashinfo(md, &hashType, NULL) == WOLFSSL_FAILURE) {
    3654440304            return WOLFSSL_FAILURE;
     40305        }
     40306    #else
     40307        (void)md;
     40308        WOLFSSL_MSG("Cannot get hashinfo when NO_PWDBASED is defined");
     40309        return WOLFSSL_FAILURE;
     40310    #endif /* !defined(NO_PWDBASED) */
    3654540311
    3654640312
     
    3659940365     * return WOLFSSL_SUCCESS on success
    3660040366     */
    36601     static int wolfSSL_X509_make_der(WOLFSSL_X509* x509, int req,
    36602             unsigned char* der, int* derSz)
     40367    static int wolfssl_x509_make_der(WOLFSSL_X509* x509, int req,
     40368            unsigned char* der, int* derSz, int includeSig)
    3660340369    {
    36604         int ret;
     40370        int ret = WOLFSSL_FAILURE;
     40371        int totalLen;
    3660540372        Cert cert;
    3660640373        void* key = NULL;
     
    3661140378    #ifdef HAVE_ECC
    3661240379        ecc_key ecc;
     40380    #endif
     40381    #ifndef NO_DSA
     40382        DsaKey dsa;
    3661340383    #endif
    3661440384        WC_RNG rng;
     
    3666940439        }
    3667040440    #endif
    36671         if (key == NULL)
     40441    #ifndef NO_DSA
     40442        if (x509->pubKeyOID == DSAk) {
     40443            type = DSA_TYPE;
     40444            ret = wc_InitDsaKey(&dsa);
     40445            if (ret != 0)
     40446                return ret;
     40447            ret = wc_DsaPublicKeyDecode(x509->pubKey.buffer, &idx, &dsa,
     40448                                                           x509->pubKey.length);
     40449            if (ret != 0) {
     40450                wc_FreeDsaKey(&dsa);
     40451                return ret;
     40452            }
     40453            key = (void*)&dsa;
     40454        }
     40455    #endif
     40456        if (key == NULL) {
     40457            WOLFSSL_MSG("No public key found for certificate");
    3667240458            return WOLFSSL_FAILURE;
     40459        }
    3667340460
    3667440461        /* Make the body of the certificate request. */
     
    3668740474            wc_FreeRng(&rng);
    3668840475        }
    36689         if (ret < 0) {
    36690             return ret;
    36691         }
    36692 
     40476        if (ret <= 0) {
     40477            ret = WOLFSSL_FAILURE;
     40478            goto cleanup;
     40479        }
     40480
     40481        if ((x509->serialSz == 0) &&
     40482                (cert.serialSz <= EXTERNAL_SERIAL_SIZE) &&
     40483                (cert.serialSz > 0)) {
     40484        #if defined(OPENSSL_EXTRA)
     40485            WOLFSSL_ASN1_INTEGER *i = wolfSSL_ASN1_INTEGER_new();
     40486
     40487            if (i == NULL) {
     40488                WOLFSSL_MSG("wolfSSL_ASN1_INTEGER_new error");
     40489                ret = WOLFSSL_FAILURE;
     40490                goto cleanup;
     40491            }
     40492            else {
     40493                i->length = cert.serialSz + 2;
     40494                i->data[0] = ASN_INTEGER;
     40495                i->data[1] = cert.serialSz;
     40496                XMEMCPY(i->data + 2, cert.serial, cert.serialSz);
     40497                if (wolfSSL_X509_set_serialNumber(x509, i) != WOLFSSL_SUCCESS) {
     40498                    WOLFSSL_MSG("Issue setting generated serial number");
     40499                    wolfSSL_ASN1_INTEGER_free(i);
     40500                    ret = WOLFSSL_FAILURE;
     40501                    goto cleanup;
     40502                }
     40503                wolfSSL_ASN1_INTEGER_free(i);
     40504            }
     40505        #else
     40506            WOLFSSL_MSG("ASN1_INTEGER API not in build");
     40507
     40508            ret = WOLFSSL_FAILURE;
     40509            goto cleanup;
     40510        #endif /* OPENSSL_EXTRA */
     40511        }
     40512
     40513        if (includeSig) {
     40514            if (!x509->sig.buffer) {
     40515                WOLFSSL_MSG("No signature buffer");
     40516                ret = WOLFSSL_FAILURE;
     40517                goto cleanup;
     40518            }
     40519            totalLen = AddSignature(NULL, ret, NULL, x509->sig.length,
     40520                                  x509->sigOID);
     40521            if (totalLen > *derSz) {
     40522                WOLFSSL_MSG("Output der buffer too short");
     40523                ret = WOLFSSL_FAILURE;
     40524                goto cleanup;
     40525            }
     40526            ret = AddSignature(der, ret, x509->sig.buffer,
     40527                               x509->sig.length, x509->sigOID);
     40528        }
     40529
     40530        *derSz = ret;
     40531        ret = WOLFSSL_SUCCESS;
     40532cleanup:
    3669340533        /* Dispose of the public key object. */
    3669440534    #ifndef NO_RSA
     
    3670040540            wc_ecc_free(&ecc);
    3670140541    #endif
    36702         *derSz = ret;
    36703 
    36704         return WOLFSSL_SUCCESS;
     40542
     40543        return ret;
    3670540544    }
    3670640545
     
    3672340562        WC_RNG rng;
    3672440563
     40564        (void)req;
     40565
    3672540566        sigType = wolfSSL_sigTypeFromPKEY(md, pkey);
    3672640567        if (sigType == WOLFSSL_FAILURE)
     
    3674240583    #endif
    3674340584
    36744         /* Sign the certificate request body. */
     40585        /* Sign the certificate (request) body. */
    3674540586        ret = wc_InitRng(&rng);
    3674640587        if (ret != 0)
     
    3675040591        if (ret < 0)
    3675140592            return ret;
     40593        derSz = ret;
     40594
     40595        /* Extract signature from buffer */
     40596        {
     40597            word32 idx = 0;
     40598            int    len = 0;
     40599
     40600            /* Read top level sequence */
     40601            if (GetSequence(der, &idx, &len, derSz) < 0) {
     40602                WOLFSSL_MSG("GetSequence error");
     40603                return WOLFSSL_FATAL_ERROR;
     40604            }
     40605            /* Move idx to signature */
     40606            idx += certBodySz;
     40607            /* Read signature algo sequence */
     40608            if (GetSequence(der, &idx, &len, derSz) < 0) {
     40609                WOLFSSL_MSG("GetSequence error");
     40610                return WOLFSSL_FATAL_ERROR;
     40611            }
     40612            idx += len;
     40613            /* Read signature bit string */
     40614            if (CheckBitString(der, &idx, &len, derSz, 0, NULL) != 0) {
     40615                WOLFSSL_MSG("CheckBitString error");
     40616                return WOLFSSL_FATAL_ERROR;
     40617            }
     40618            /* Sanity check */
     40619            if (idx + len != (word32)derSz) {
     40620                WOLFSSL_MSG("unexpected asn1 structure");
     40621                return WOLFSSL_FATAL_ERROR;
     40622            }
     40623            x509->sig.length = 0;
     40624            if (x509->sig.buffer)
     40625                XFREE(x509->sig.buffer, x509->heap, DYNAMIC_TYPE_SIGNATURE);
     40626            x509->sig.buffer = (byte*)XMALLOC(len, x509->heap,
     40627                                              DYNAMIC_TYPE_SIGNATURE);
     40628            if (!x509->sig.buffer) {
     40629                WOLFSSL_MSG("malloc error");
     40630                return WOLFSSL_FATAL_ERROR;
     40631            }
     40632            XMEMCPY(x509->sig.buffer, der + idx, len);
     40633            x509->sig.length = len;
     40634        }
    3675240635
    3675340636        /* Put in the new certificate encoding into the x509 object. */
    3675440637        FreeDer(&x509->derCert);
    3675540638        type = CERT_TYPE;
    36756     #ifdef WOLFSSL_REQ_CERT
     40639    #ifdef WOLFSSL_CERT_REQ
    3675740640        if (req) {
    3675840641            type = CERTREQ_TYPE;
    3675940642        }
    3676040643    #endif
    36761 
    36762         if (AllocDer(&x509->derCert, ret, type, NULL) != 0)
     40644        if (AllocDer(&x509->derCert, derSz, type, NULL) != 0)
    3676340645            return WOLFSSL_FATAL_ERROR;
    36764         XMEMCPY(x509->derCert->buffer, der, ret);
    36765         x509->derCert->length = ret;
    36766 
    36767         (void)req;
     40646        XMEMCPY(x509->derCert->buffer, der, derSz);
     40647        x509->derCert->length = derSz;
     40648
    3676840649        return ret;
    3676940650    }
    3677040651
     40652
     40653    #ifndef WC_MAX_X509_GEN
     40654        /* able to override max size until dynamic buffer created */
     40655        #define WC_MAX_X509_GEN 4096
     40656    #endif
    3677140657
    3677240658    /* returns the size of signature on success */
     
    3677540661    {
    3677640662        int  ret;
    36777         byte der[4096]; /* @TODO dynamic set based on expected cert size */
    36778         int  derSz = sizeof(der);
     40663        /* @TODO dynamic set based on expected cert size */
     40664        byte *der = (byte *)XMALLOC(WC_MAX_X509_GEN, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     40665        int  derSz = WC_MAX_X509_GEN;
    3677940666
    3678040667        WOLFSSL_ENTER("wolfSSL_X509_sign");
    3678140668
    36782         if (x509 == NULL || pkey == NULL || md == NULL)
    36783             return WOLFSSL_FAILURE;
     40669        if (x509 == NULL || pkey == NULL || md == NULL) {
     40670            ret = WOLFSSL_FAILURE;
     40671            goto out;
     40672        }
    3678440673
    3678540674        x509->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
    36786         if ((ret = wolfSSL_X509_make_der(x509, 0, der, &derSz)) !=
     40675        if ((ret = wolfssl_x509_make_der(x509, 0, der, &derSz, 0)) !=
    3678740676                WOLFSSL_SUCCESS) {
    3678840677            WOLFSSL_MSG("Unable to make DER for X509");
    3678940678            WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
    36790             return WOLFSSL_FAILURE;
    36791         }
    36792 
    36793         ret = wolfSSL_X509_resign_cert(x509, 0, der, sizeof(der), derSz,
     40679            (void)ret;
     40680            ret = WOLFSSL_FAILURE;
     40681            goto out;
     40682        }
     40683
     40684        ret = wolfSSL_X509_resign_cert(x509, 0, der, WC_MAX_X509_GEN, derSz,
    3679440685                (WOLFSSL_EVP_MD*)md, pkey);
    3679540686        if (ret <= 0) {
    3679640687            WOLFSSL_LEAVE("wolfSSL_X509_sign", ret);
     40688            ret = WOLFSSL_FAILURE;
     40689            goto out;
     40690        }
     40691
     40692    out:
     40693        if (der)
     40694            XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     40695
     40696        return ret;
     40697    }
     40698
     40699#if defined(OPENSSL_EXTRA)
     40700    int wolfSSL_X509_sign_ctx(WOLFSSL_X509 *x509, WOLFSSL_EVP_MD_CTX *ctx)
     40701    {
     40702        WOLFSSL_ENTER("wolfSSL_X509_sign_ctx");
     40703
     40704        if (!x509 || !ctx || !ctx->pctx || !ctx->pctx->pkey) {
     40705            WOLFSSL_MSG("Bad parameter");
    3679740706            return WOLFSSL_FAILURE;
    3679840707        }
    3679940708
    36800         return ret;
    36801     }
    36802 
    36803 
    36804     /* Converts the x509 name structure into DER format.
    36805      *
    36806      * out  pointer to either a pre setup buffer or a pointer to null for
    36807      *      creating a dynamic buffer. In the case that a pre-existing buffer is
    36808      *      used out will be incremented the size of the DER buffer on success.
    36809      *
    36810      * returns the size of the buffer on success, or negative value with failure
    36811      */
    36812     int wolfSSL_i2d_X509_NAME(WOLFSSL_X509_NAME* name, unsigned char** out)
     40709        return wolfSSL_X509_sign(x509, ctx->pctx->pkey, wolfSSL_EVP_MD_CTX_md(ctx));
     40710    }
     40711#endif /* OPENSSL_EXTRA */
     40712#endif /* WOLFSSL_CERT_GEN */
     40713#if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)
     40714
     40715    WOLFSSL_X509_NAME *wolfSSL_d2i_X509_NAME(WOLFSSL_X509_NAME **name,
     40716                                             unsigned char **in, long length)
    3681340717    {
    36814         CertName cName;
    36815         unsigned char buf[256]; /* ASN_MAX_NAME */
    36816         int sz;
    36817         WOLFSSL_ENTER("wolfSSL_i2d_X509_NAME");
    36818 
    36819         if (out == NULL || name == NULL) {
    36820             return BAD_FUNC_ARG;
    36821         }
    36822         XMEMSET(&cName, 0, sizeof(CertName));
    36823 
    36824         if (CopyX509NameToCertName(name, &cName) != SSL_SUCCESS) {
    36825             WOLFSSL_MSG("Error converting x509 name to internal CertName");
    36826             return SSL_FATAL_ERROR;
    36827         }
    36828 
    36829         sz = SetName(buf, sizeof(buf), &cName);
    36830         if (sz < 0) {
    36831             return sz;
    36832         }
    36833 
    36834         /* using buffer passed in */
    36835         if (*out != NULL) {
    36836             XMEMCPY(*out, buf, sz);
    36837             *out += sz;
    36838         }
    36839         else {
    36840             *out = (unsigned char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL);
    36841             if (*out == NULL) {
    36842                 return MEMORY_E;
    36843             }
    36844             XMEMCPY(*out, buf, sz);
    36845         }
    36846 
    36847         return sz;
    36848     }
    36849 #endif /* WOLFSSL_CERT_GEN */
     40718        WOLFSSL_X509_NAME* tmp = NULL;
     40719        DecodedCert cert;
     40720
     40721        WOLFSSL_ENTER("wolfSSL_d2i_X509_NAME");
     40722
     40723        if (!in || !*in || length <= 0) {
     40724            WOLFSSL_MSG("Bad argument");
     40725            return NULL;
     40726        }
     40727
     40728        /* Set the X509_NAME buffer as the input data for cert.
     40729         * in is NOT a full certificate. Just the name. */
     40730        InitDecodedCert(&cert, *in, (word32)length, NULL);
     40731
     40732        /* Parse the X509 subject name */
     40733        if (GetName(&cert, SUBJECT, (int)length) != 0) {
     40734            WOLFSSL_MSG("WOLFSSL_X509_NAME parse error");
     40735            goto cleanup;
     40736        }
     40737
     40738        if (!(tmp = wolfSSL_X509_NAME_new())) {
     40739            WOLFSSL_MSG("wolfSSL_X509_NAME_new error");
     40740            goto cleanup;
     40741        }
     40742
     40743        if (wolfSSL_X509_NAME_copy((WOLFSSL_X509_NAME*)cert.subjectName,
     40744                    tmp) != WOLFSSL_SUCCESS) {
     40745            wolfSSL_X509_NAME_free(tmp);
     40746            tmp = NULL;
     40747            goto cleanup;
     40748        }
     40749
     40750        if (name)
     40751            *name = tmp;
     40752cleanup:
     40753        FreeDecodedCert(&cert);
     40754        return tmp;
     40755    }
    3685040756
    3685140757
     
    3688840794    }
    3688940795
    36890 
    36891     WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
    36892                                                  pem_password_cb *cb, void *u)
     40796#ifndef NO_BIO
     40797
     40798    static WOLFSSL_X509 *loadX509orX509REQFromPemBio(WOLFSSL_BIO *bp,
     40799            WOLFSSL_X509 **x, pem_password_cb *cb, void *u, int type)
    3689340800    {
    3689440801        WOLFSSL_X509* x509 = NULL;
     
    3689640803        unsigned char* pem = NULL;
    3689740804        int pemSz;
    36898         long  i = 0, l;
     40805        long  i = 0, l, footerSz;
    3689940806        const char* footer = NULL;
    3690040807
    36901         WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509");
    36902 
    36903         if (bp == NULL) {
     40808        WOLFSSL_ENTER("loadX509orX509REQFromPemBio");
     40809
     40810        if (bp == NULL || (type != CERT_TYPE && type != CERTREQ_TYPE)) {
    3690440811            WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_X509", BAD_FUNC_ARG);
    3690540812            return NULL;
     
    3691940826
    3692040827        i = 0;
    36921         if (wc_PemGetHeaderFooter(CERT_TYPE, NULL, &footer) != 0) {
     40828        if (wc_PemGetHeaderFooter(type, NULL, &footer) != 0) {
    3692240829            XFREE(pem, 0, DYNAMIC_TYPE_PEM);
    3692340830            return NULL;
    3692440831        }
     40832        footerSz = (long)XSTRLEN(footer);
    3692540833
    3692640834        /* TODO: Inefficient
    36927          * reading in one byte at a time until see "END CERTIFICATE"
     40835         * reading in one byte at a time until see the footer
    3692840836         */
    3692940837        while ((l = wolfSSL_BIO_read(bp, (char *)&pem[i], 1)) == 1) {
    3693040838            i++;
    36931             if (i > 26 && XMEMCMP((char *)&pem[i-26], footer, 25) == 0) {
    36932                 if (pem[i-1] == '\r') {
    36933                     /* found \r , Windows line ending is \r\n so try to read one
    36934                      * more byte for \n, ignoring return value */
    36935                     (void)wolfSSL_BIO_read(bp, (char *)&pem[i++], 1);
     40839            if (i > footerSz && XMEMCMP((char *)&pem[i-footerSz], footer,
     40840                    footerSz) == 0) {
     40841                if (wolfSSL_BIO_read(bp, (char *)&pem[i], 1) == 1) {
     40842                    /* attempt to read newline following footer */
     40843                    i++;
     40844                    if (pem[i-1] == '\r') {
     40845                        /* found \r , Windows line ending is \r\n so try to read one
     40846                         * more byte for \n, ignoring return value */
     40847                        (void)wolfSSL_BIO_read(bp, (char *)&pem[i++], 1);
     40848                    }
    3693640849                }
    3693740850                break;
     
    3694340856    #endif
    3694440857        pemSz = (int)i;
    36945         x509 = wolfSSL_X509_load_certificate_buffer(pem, pemSz,
    36946                                                               WOLFSSL_FILETYPE_PEM);
     40858    #ifdef WOLFSSL_CERT_REQ
     40859        if (type == CERTREQ_TYPE)
     40860            x509 = wolfSSL_X509_REQ_load_certificate_buffer(pem, pemSz,
     40861                                                        WOLFSSL_FILETYPE_PEM);
     40862        else
     40863    #endif
     40864            x509 = wolfSSL_X509_load_certificate_buffer(pem, pemSz,
     40865                                                        WOLFSSL_FILETYPE_PEM);
    3694740866
    3694840867        if (x != NULL) {
     
    3696040879        return x509;
    3696140880    }
     40881
     40882
     40883    WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
     40884                                                 pem_password_cb *cb, void *u)
     40885    {
     40886        return loadX509orX509REQFromPemBio(bp, x, cb, u, CERT_TYPE);
     40887    }
     40888
     40889#ifdef WOLFSSL_CERT_REQ
     40890    WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 **x,
     40891                                                 pem_password_cb *cb, void *u)
     40892    {
     40893        return loadX509orX509REQFromPemBio(bp, x, cb, u, CERTREQ_TYPE);
     40894    }
     40895#endif
    3696240896
    3696340897    WOLFSSL_X509_CRL *wolfSSL_PEM_read_bio_X509_CRL(WOLFSSL_BIO *bp,
     
    3701340947#endif
    3701440948    }
     40949
     40950#endif /* !NO_BIO */
    3701540951
    3701640952#if !defined(NO_FILESYSTEM)
     
    3711741053#endif
    3711841054
     41055#ifdef WOLFSSL_CERT_GEN
     41056#ifndef NO_BIO
    3711941057    int wolfSSL_PEM_write_X509(XFILE fp, WOLFSSL_X509* x)
    3712041058    {
     
    3714141079        return ret;
    3714241080    }
     41081#endif /* !NO_BIO */
     41082#endif /* WOLFSSL_CERT_GEN */
    3714341083#endif /* !NO_FILESYSTEM */
    3714441084
     
    3715241092    #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0"
    3715341093    #define PEM_HDR_FIN_EOL_SZ     6
     41094
     41095#ifndef NO_BIO
    3715441096
    3715541097    int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header,
     
    3743941381    }
    3744041382#endif
     41383#endif /* !NO_BIO */
    3744141384
    3744241385    int wolfSSL_PEM_get_EVP_CIPHER_INFO(char* header, EncryptedInfo* cipher)
     
    3748041423    }
    3748141424
     41425#ifndef NO_BIO
    3748241426    /*
    3748341427     * bp : bio to read X509 from
     
    3749841442        return wolfSSL_PEM_read_bio_X509(bp, x, cb, u);
    3749941443    }
    37500 
    37501 
     41444#endif /* !NO_BIO */
     41445
     41446
     41447#endif /* OPENSSL_EXTRA || OPENSSL_ALL */
    3750241448#ifdef OPENSSL_ALL
     41449
     41450#ifndef NO_BIO
    3750341451    /* create and return a new WOLFSSL_X509_PKEY structure or NULL on failure */
    3750441452    static WOLFSSL_X509_PKEY* wolfSSL_X509_PKEY_new(void* heap)
     
    3753141479        return WOLFSSL_SUCCESS;
    3753241480    }
     41481#endif /* !NO_BIO */
    3753341482
    3753441483
     
    3753841487        if (xPkey != NULL) {
    3753941488            wolfSSL_EVP_PKEY_free(xPkey->dec_pkey);
    37540         }
    37541         XFREE(xPkey, xPkey->heap, DYNAMIC_TYPE_KEY);
    37542     }
    37543 
     41489            XFREE(xPkey, xPkey->heap, DYNAMIC_TYPE_KEY);
     41490        }
     41491    }
     41492
     41493
     41494#ifndef NO_BIO
    3754441495
    3754541496    /* Takes control of x509 on success
     
    3758141532    }
    3758241533
     41534    /**
     41535     * This read one structure from bio and returns the read structure
     41536     * in the appropriate output parameter (x509, crl, x_pkey). The
     41537     * output parameters must be set to NULL.
     41538     * @param bio    Input for reading structures
     41539     * @param cb     Password callback
     41540     * @param x509   Output
     41541     * @param crl    Output
     41542     * @param x_pkey Output
     41543     * @return WOLFSSL_SUCCESSS on success and WOLFSSL_FAILURE otherwise
     41544     */
     41545    static int wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(
     41546            WOLFSSL_BIO* bio, pem_password_cb* cb,
     41547            WOLFSSL_X509** x509, WOLFSSL_X509_CRL** crl, WOLFSSL_X509_PKEY** x_pkey)
     41548    {
     41549
     41550#if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)
     41551        char* pem = NULL;
     41552        long  i = pem_struct_min_sz, l;
     41553        const char* header = NULL;
     41554        const char* headerEnd = NULL;
     41555        const char* footer = NULL;
     41556        const char* footerEnd = NULL;
     41557        DerBuffer* der = NULL;
     41558
     41559        (void)cb;
     41560
     41561        if (!bio || !x509 || *x509 || !crl || *crl || !x_pkey || *x_pkey) {
     41562            WOLFSSL_MSG("Bad input parameter or output parameters "
     41563                        "not set to a NULL value.");
     41564            return WOLFSSL_FAILURE;
     41565        }
     41566
     41567        if ((l = wolfSSL_BIO_get_len(bio)) <= 0) {
     41568    #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
     41569            /* No certificate in buffer */
     41570            WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
     41571    #endif
     41572            return WOLFSSL_FAILURE;
     41573        }
     41574
     41575        pem = (char*)XMALLOC(l, 0, DYNAMIC_TYPE_PEM);
     41576        if (pem == NULL)
     41577            return WOLFSSL_FAILURE;
     41578
     41579        if (wolfSSL_BIO_read(bio, &pem[0], pem_struct_min_sz) !=
     41580                pem_struct_min_sz) {
     41581            goto err;
     41582        }
     41583
     41584        /* Read the header and footer */
     41585        while (wolfSSL_BIO_read(bio, &pem[i], 1) == 1) {
     41586            i++;
     41587            if (!header)
     41588                header = XSTRNSTR(pem, "-----BEGIN ", (unsigned int)i);
     41589            else if (header) {
     41590                if (!headerEnd) {
     41591                    headerEnd = XSTRNSTR(header + XSTR_SIZEOF("-----BEGIN "),
     41592                            "-----",
     41593                            (unsigned int)
     41594                            (i - (header + XSTR_SIZEOF("-----BEGIN ") - pem)));
     41595                    if (headerEnd) {
     41596                        headerEnd += XSTR_SIZEOF("-----");
     41597                        /* Read in the newline */
     41598                        (void)wolfSSL_BIO_read(bio, &pem[i], 1);
     41599                        i++;
     41600                        if (*headerEnd != '\n' && *headerEnd != '\r') {
     41601                            WOLFSSL_MSG("Missing newline after header");
     41602                            goto err;
     41603                        }
     41604                    }
     41605                }
     41606                else if (!footer) {
     41607                    footer = XSTRNSTR(headerEnd, "-----END ",
     41608                            (unsigned int)(i - (headerEnd - pem)));
     41609                }
     41610                else if (!footerEnd) {
     41611                    footerEnd = XSTRNSTR(footer + XSTR_SIZEOF("-----"),
     41612                            "-----", (unsigned int)(i -
     41613                                (footer + XSTR_SIZEOF("-----") - pem)));
     41614                    if (footerEnd) {
     41615                        footerEnd += XSTR_SIZEOF("-----");
     41616                        /* Now check that footer matches header */
     41617                        if (XMEMCMP(header + XSTR_SIZEOF("-----BEGIN "),
     41618                                    footer + XSTR_SIZEOF("-----END "),
     41619                            headerEnd - (header + XSTR_SIZEOF("-----BEGIN ")))
     41620                                != 0) {
     41621                            WOLFSSL_MSG("Header and footer don't match");
     41622                            goto err;
     41623                        }
     41624                        /* header and footer match */
     41625                        break;
     41626                    }
     41627                }
     41628                else {
     41629                    break;
     41630                }
     41631            }
     41632        }
     41633        if (!footerEnd) {
     41634            /* Only check footerEnd since it is set last */
     41635            WOLFSSL_ERROR(ASN_NO_PEM_HEADER);
     41636            goto err;
     41637        }
     41638        else {
     41639            if (headerEnd - header ==
     41640                    XSTR_SIZEOF("-----BEGIN CERTIFICATE-----") &&
     41641                    XMEMCMP(header, "-----BEGIN CERTIFICATE-----",
     41642                            XSTR_SIZEOF("-----BEGIN CERTIFICATE-----")) == 0) {
     41643                /* We have a certificate */
     41644                WOLFSSL_MSG("Parsing x509 cert");
     41645                *x509 = wolfSSL_X509_load_certificate_buffer(
     41646                        (const unsigned char*) header,
     41647                        (int)(footerEnd - header), WOLFSSL_FILETYPE_PEM);
     41648                if (!*x509) {
     41649                    WOLFSSL_MSG("wolfSSL_X509_load_certificate_buffer error");
     41650                    goto err;
     41651                }
     41652            }
     41653#ifdef HAVE_CRL
     41654            else if (headerEnd - header ==
     41655                    XSTR_SIZEOF("-----BEGIN X509 CRL-----") &&
     41656                    XMEMCMP(header, "-----BEGIN X509 CRL-----",
     41657                            XSTR_SIZEOF("-----BEGIN X509 CRL-----")) == 0) {
     41658                /* We have a crl */
     41659                WOLFSSL_MSG("Parsing crl");
     41660                if((PemToDer((const unsigned char*) header, footerEnd - header,
     41661                        CRL_TYPE, &der, NULL, NULL, NULL)) < 0) {
     41662                    WOLFSSL_MSG("PemToDer error");
     41663                    goto err;
     41664                }
     41665                *crl = wolfSSL_d2i_X509_CRL(NULL, der->buffer, der->length);
     41666                if (!*crl) {
     41667                    WOLFSSL_MSG("wolfSSL_d2i_X509_CRL error");
     41668                    goto err;
     41669                }
     41670            }
     41671#endif
     41672            else {
     41673                /* TODO support WOLFSSL_X509_PKEY as well */
     41674                WOLFSSL_MSG("Unsupported PEM structure");
     41675                goto err;
     41676            }
     41677        }
     41678
     41679        XFREE(pem, 0, DYNAMIC_TYPE_PEM);
     41680        return WOLFSSL_SUCCESS;
     41681err:
     41682        if (pem)
     41683            XFREE(pem, 0, DYNAMIC_TYPE_PEM);
     41684        if (der)
     41685            FreeDer(&der);
     41686        return WOLFSSL_FAILURE;
     41687#endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */
     41688    }
    3758341689
    3758441690    /*
     
    3759441700        pem_password_cb* cb, void* u)
    3759541701    {
    37596         WOLF_STACK_OF(WOLFSSL_X509_INFO)* localSk;
    37597         WOLFSSL_X509* x509 = NULL;
     41702        WOLF_STACK_OF(WOLFSSL_X509_INFO)* localSk = NULL;
    3759841703        int ret = WOLFSSL_SUCCESS;
    3759941704
     41705        (void)u;
     41706
    3760041707        WOLFSSL_ENTER("wolfSSL_PEM_X509_INFO_read_bio");
    3760141708
    37602         /* attempt to used passed in stack or create a new one */
    37603         if (sk != NULL) {
    37604             localSk = sk;
    37605         }
    37606         else {
    37607             localSk = wolfSSL_sk_X509_INFO_new_null();
    37608         }
    37609         if (localSk == NULL) {
    37610             WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", MEMORY_E);
    37611             return NULL;
    37612         }
    37613 
    3761441709        /* parse through BIO and push new info's found onto stack */
    37615         do {
    37616             x509 = wolfSSL_PEM_read_bio_X509(bio, NULL, cb, u);
    37617             if (x509 != NULL) {
     41710        while (1) {
     41711            WOLFSSL_X509      *x509 = NULL;
     41712            WOLFSSL_X509_CRL  *crl  = NULL;
     41713            WOLFSSL_X509_PKEY *x_pkey = NULL;
     41714
     41715            if (wolfSSL_PEM_X509_X509_CRL_X509_PKEY_read_bio(bio, cb,
     41716                    &x509, &crl, &x_pkey) == WOLFSSL_SUCCESS) {
    3761841717                WOLFSSL_X509_INFO* current;
    3761941718
     
    3762141720                if (current == NULL) {
    3762241721                    WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", MEMORY_E);
     41722                    wolfSSL_sk_free(localSk);
    3762341723                    return NULL;
    3762441724                }
    37625                 ret = wolfSSL_X509_INFO_set(current, x509);
    37626                 if (ret  != WOLFSSL_SUCCESS) {
    37627                     wolfSSL_X509_free(x509);
     41725                if (x509) {
     41726                    ret = wolfSSL_X509_INFO_set(current, x509);
     41727                }
     41728                else if (crl) {
     41729                    current->crl = crl;
     41730                    ret = WOLFSSL_SUCCESS;
     41731                }
     41732                else if (x_pkey) {
     41733                    current->x_pkey = x_pkey;
     41734                    ret = WOLFSSL_SUCCESS;
    3762841735                }
    3762941736                else {
     41737                    WOLFSSL_MSG("No output parameters set");
     41738                    WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", WOLFSSL_FAILURE);
     41739                    wolfSSL_sk_free(localSk);
     41740                    wolfSSL_X509_INFO_free(current);
     41741                    return NULL;
     41742                }
     41743                if (ret != WOLFSSL_SUCCESS) {
     41744                    wolfSSL_X509_free(x509);
     41745#ifdef HAVE_CRL
     41746                    wolfSSL_X509_CRL_free(crl);
     41747#endif
     41748                    wolfSSL_X509_PKEY_free(x_pkey);
     41749                }
     41750                else {
     41751                    if (!localSk) {
     41752                        /* attempt to used passed in stack
     41753                         * or create a new one */
     41754                        if (sk != NULL) {
     41755                            localSk = sk;
     41756                        }
     41757                        else {
     41758                            localSk = wolfSSL_sk_X509_INFO_new_null();
     41759                        }
     41760                        if (localSk == NULL) {
     41761                            WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio",
     41762                                    MEMORY_E);
     41763                            return NULL;
     41764                        }
     41765                    }
    3763041766                    wolfSSL_sk_X509_INFO_push(localSk, current);
    3763141767                }
    3763241768            }
    37633         } while (x509 != NULL && ret == WOLFSSL_SUCCESS);
     41769            else {
     41770                break;
     41771            }
     41772        }
    3763441773        WOLFSSL_LEAVE("wolfSSL_PEM_X509_INFO_read_bio", ret);
    3763541774        return localSk;
    3763641775    }
     41776#endif /* !NO_BIO */
    3763741777#endif /* OPENSSL_ALL */
    3763841778
     
    3764141781        WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_free");
    3764241782        if (ne != NULL) {
    37643             if (ne->value != NULL && ne->value != &(ne->data)) {
     41783            wolfSSL_ASN1_OBJECT_free(ne->object);
     41784            if (ne->value != NULL) {
    3764441785                wolfSSL_ASN1_STRING_free(ne->value);
    3764541786            }
     
    3765741798        if (ne != NULL) {
    3765841799            XMEMSET(ne, 0, sizeof(WOLFSSL_X509_NAME_ENTRY));
    37659             ne->value = &(ne->data);
    3766041800        }
    3766141801
     
    3769641836            }
    3769741837            ne->nid = nid;
     41838            ne->object = wolfSSL_OBJ_nid2obj_ex(nid, ne->object);
    3769841839            ne->value = wolfSSL_ASN1_STRING_type_new(type);
    3769941840            if (ne->value != NULL) {
     
    3770741848
    3770841849
     41850    /* Creates a new entry given the NID, type, and data
     41851     * "dataSz" is number of bytes in data, if set to -1 then XSTRLEN is used
     41852     * "out" can be used to store the new entry data in an existing structure
     41853     *       if NULL then a new WOLFSSL_X509_NAME_ENTRY structure is created
     41854     * returns a pointer to WOLFSSL_X509_NAME_ENTRY on success and NULL on fail
     41855     */
    3770941856    WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_create_by_NID(
    3771041857            WOLFSSL_X509_NAME_ENTRY** out, int nid, int type,
     
    3771541862        WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_create_by_NID()");
    3771641863
    37717         ne = wolfSSL_X509_NAME_ENTRY_new();
    37718         if (ne == NULL) {
     41864        if (!data) {
     41865            WOLFSSL_MSG("Bad parameter");
    3771941866            return NULL;
    3772041867        }
    3772141868
     41869        if (out == NULL || *out == NULL) {
     41870            ne = wolfSSL_X509_NAME_ENTRY_new();
     41871            if (ne == NULL) {
     41872                return NULL;
     41873            }
     41874            if (out != NULL) {
     41875                *out = ne;
     41876            }
     41877        }
     41878        else {
     41879            ne = *out;
     41880        }
     41881
    3772241882        ne->nid = nid;
     41883        ne->object = wolfSSL_OBJ_nid2obj_ex(nid, ne->object);
    3772341884        ne->value = wolfSSL_ASN1_STRING_type_new(type);
    37724         wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz);
    37725         ne->set = 1;
    37726 
    37727         if (out != NULL) {
    37728             *out = ne;
     41885        if (ne->value != NULL) {
     41886            wolfSSL_ASN1_STRING_set(ne->value, (const void*)data, dataSz);
     41887            ne->set = 1;
    3772941888        }
    3773041889
     
    3773241891    }
    3773341892
    37734     static int RebuildFullNameAdd(DecodedName* dName, char* data)
     41893    /* add all entry of type "nid" to the buffer "fullName" and advance "idx"
     41894     * since number of entries is small, a brute force search is used here
     41895     * returns the number of entries added
     41896     */
     41897    static int AddAllEntry(WOLFSSL_X509_NAME* name, char* fullName,
     41898            int fullNameSz, int* idx)
    3773541899    {
    37736         int totalLen = 0;
    3773741900        int i;
     41901        int ret = 0;
     41902
     41903        for (i = 0; i < MAX_NAME_ENTRIES; i++) {
     41904            if (name->entry[i].set) {
     41905                WOLFSSL_X509_NAME_ENTRY* e;
     41906                WOLFSSL_ASN1_OBJECT* obj;
     41907
     41908                int sz;
     41909                unsigned char* data;
     41910
     41911                e = &name->entry[i];
     41912                obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
     41913                if (obj == NULL) {
     41914                    return BAD_FUNC_ARG;
     41915                }
     41916
     41917                XMEMCPY(fullName + *idx, "/", 1); *idx = *idx + 1;
     41918                sz = (int)XSTRLEN(obj->sName);
     41919                XMEMCPY(fullName + *idx, obj->sName, sz);
     41920                *idx += sz;
     41921                XMEMCPY(fullName + *idx, "=", 1); *idx = *idx + 1;
     41922
     41923                data = wolfSSL_ASN1_STRING_data(e->value);
     41924                if (data != NULL) {
     41925                    sz = (int)XSTRLEN((const char*)data);
     41926                    XMEMCPY(fullName + *idx, data, sz);
     41927                    *idx += sz;
     41928                }
     41929
     41930                ret++;
     41931            }
     41932        }
     41933        (void)fullNameSz;
     41934        return ret;
     41935    }
     41936
     41937
     41938    /* Converts a list of entries in WOLFSSL_X509_NAME struct into a string
     41939     * returns 0 on success */
     41940    static int RebuildFullName(WOLFSSL_X509_NAME* name)
     41941    {
     41942        int totalLen = 0, i, idx, entryCount = 0;
    3773841943        char* fullName;
    37739         int idx;
    37740 
    37741         if (dName->cnLen != 0)
    37742             totalLen += dName->cnLen + 4;
    37743         if (dName->snLen != 0)
    37744             totalLen += dName->snLen + 4;
    37745         if (dName->cLen != 0)
    37746             totalLen += dName->cLen + 3;
    37747         if (dName->lLen != 0)
    37748             totalLen += dName->lLen + 3;
    37749         if (dName->stLen != 0)
    37750             totalLen += dName->stLen + 4;
    37751         if (dName->oLen != 0)
    37752             totalLen += dName->oLen + 3;
    37753         if (dName->ouLen != 0)
    37754             totalLen += dName->ouLen + 4;
    37755         if (dName->emailLen != 0)
    37756             totalLen += dName->emailLen + 14;
    37757         if (dName->uidLen != 0)
    37758             totalLen += dName->uidLen + 5;
    37759         if (dName->serialLen != 0)
    37760             totalLen += dName->serialLen + 14;
    37761         if (dName->dcNum != 0) {
    37762             for (i = 0; i < dName->dcNum; i++)
    37763                 totalLen += dName->dcLen[i] + 4;
    37764         }
    37765 
    37766         fullName = (char*)XMALLOC(totalLen + 1, NULL, DYNAMIC_TYPE_X509);
     41944
     41945        if (name == NULL)
     41946            return BAD_FUNC_ARG;
     41947
     41948        for (i = 0; i < MAX_NAME_ENTRIES; i++) {
     41949            if (name->entry[i].set) {
     41950                WOLFSSL_X509_NAME_ENTRY* e;
     41951                WOLFSSL_ASN1_OBJECT* obj;
     41952
     41953                e = &name->entry[i];
     41954                obj = wolfSSL_X509_NAME_ENTRY_get_object(e);
     41955                if (obj == NULL)
     41956                    return BAD_FUNC_ARG;
     41957
     41958                totalLen += (int)XSTRLEN(obj->sName) + 2;/*+2 for '/' and '=' */
     41959                totalLen += wolfSSL_ASN1_STRING_length(e->value);
     41960            }
     41961        }
     41962
     41963        fullName = (char*)XMALLOC(totalLen + 1, name->heap, DYNAMIC_TYPE_X509);
    3776741964        if (fullName == NULL)
    3776841965            return MEMORY_E;
    3776941966
    3777041967        idx = 0;
    37771         dName->entryCount = 0;
    37772         if (dName->cnLen != 0) {
    37773             dName->entryCount++;
    37774             XMEMCPY(fullName + idx, WOLFSSL_COMMON_NAME, 4);
    37775             idx += 4;
    37776             if (dName->cnIdx == -1)
    37777                 XMEMCPY(fullName + idx, data, dName->cnLen);
    37778             else {
    37779                 XMEMCPY(fullName + idx, dName->fullName + dName->cnIdx,
    37780                                                                   dName->cnLen);
    37781             }
    37782             dName->cnIdx = idx;
    37783             idx += dName->cnLen;
    37784         }
    37785         if (dName->snLen != 0) {
    37786             dName->entryCount++;
    37787             XMEMCPY(fullName + idx, WOLFSSL_SUR_NAME, 4);
    37788             idx += 4;
    37789             if (dName->snIdx == -1)
    37790                 XMEMCPY(fullName + idx, data, dName->snLen);
    37791             else {
    37792                 XMEMCPY(fullName + idx, dName->fullName + dName->snIdx,
    37793                                                                   dName->snLen);
    37794             }
    37795             dName->snIdx = idx;
    37796             idx += dName->snLen;
    37797         }
    37798         if (dName->cLen != 0) {
    37799             dName->entryCount++;
    37800             XMEMCPY(fullName + idx, WOLFSSL_COUNTRY_NAME, 3);
    37801             idx += 3;
    37802             if (dName->cIdx == -1)
    37803                 XMEMCPY(fullName + idx, data, dName->cLen);
    37804             else {
    37805                 XMEMCPY(fullName + idx, dName->fullName + dName->cIdx,
    37806                                                                    dName->cLen);
    37807             }
    37808             dName->cIdx = idx;
    37809             idx += dName->cLen;
    37810         }
    37811         if (dName->lLen != 0) {
    37812             dName->entryCount++;
    37813             XMEMCPY(fullName + idx, WOLFSSL_LOCALITY_NAME, 3);
    37814             idx += 3;
    37815             if (dName->lIdx == -1)
    37816                 XMEMCPY(fullName + idx, data, dName->lLen);
    37817             else {
    37818                 XMEMCPY(fullName + idx, dName->fullName + dName->lIdx,
    37819                                                                    dName->lLen);
    37820             }
    37821             dName->lIdx = idx;
    37822             idx += dName->lLen;
    37823         }
    37824         if (dName->stLen != 0) {
    37825             dName->entryCount++;
    37826             XMEMCPY(fullName + idx, WOLFSSL_STATE_NAME, 4);
    37827             idx += 4;
    37828             if (dName->stIdx == -1)
    37829                 XMEMCPY(fullName + idx, data, dName->stLen);
    37830             else {
    37831                 XMEMCPY(fullName + idx, dName->fullName + dName->stIdx,
    37832                                                                   dName->stLen);
    37833             }
    37834             dName->stIdx = idx;
    37835             idx += dName->stLen;
    37836         }
    37837         if (dName->oLen != 0) {
    37838             dName->entryCount++;
    37839             XMEMCPY(fullName + idx, WOLFSSL_ORG_NAME, 3);
    37840             idx += 3;
    37841             if (dName->oIdx == -1)
    37842                 XMEMCPY(fullName + idx, data, dName->oLen);
    37843             else {
    37844                 XMEMCPY(fullName + idx, dName->fullName + dName->oIdx,
    37845                                                                    dName->oLen);
    37846             }
    37847             dName->oIdx = idx;
    37848             idx += dName->oLen;
    37849         }
    37850         if (dName->ouLen != 0) {
    37851             dName->entryCount++;
    37852             XMEMCPY(fullName + idx, WOLFSSL_ORGUNIT_NAME, 4);
    37853             idx += 4;
    37854             if (dName->ouIdx == -1)
    37855                 XMEMCPY(fullName + idx, data, dName->ouLen);
    37856             else {
    37857                 XMEMCPY(fullName + idx, dName->fullName + dName->ouIdx,
    37858                                                                   dName->ouLen);
    37859             }
    37860             dName->ouIdx = idx;
    37861             idx += dName->ouLen;
    37862         }
    37863         if (dName->emailLen != 0) {
    37864             dName->entryCount++;
    37865             XMEMCPY(fullName + idx, "/emailAddress=", 14);
    37866             idx += 14;
    37867             if (dName->emailIdx == -1)
    37868                 XMEMCPY(fullName + idx, data, dName->emailLen);
    37869             else {
    37870                 XMEMCPY(fullName + idx, dName->fullName + dName->emailIdx,
    37871                                                                dName->emailLen);
    37872             }
    37873             dName->emailIdx = idx;
    37874             idx += dName->emailLen;
    37875         }
    37876         if (dName->dcNum != 0) {
    37877             for (i = 0; i < dName->dcNum; i++) {
    37878                 dName->entryCount++;
    37879                 XMEMCPY(fullName + idx, WOLFSSL_DOMAIN_COMPONENT, 4);
    37880                 idx += 4;
    37881                 XMEMCPY(fullName + idx, dName->fullName + dName->dcIdx[i],
    37882                                                                dName->dcLen[i]);
    37883                 dName->dcIdx[i] = idx;
    37884                 idx += dName->dcLen[i];
    37885             }
    37886         }
    37887         if (dName->uidLen != 0) {
    37888             dName->entryCount++;
    37889             XMEMCPY(fullName + idx, "/UID=", 5);
    37890             idx += 5;
    37891             if (dName->uidIdx == -1)
    37892                 XMEMCPY(fullName + idx, data, dName->uidLen);
    37893             else {
    37894                 XMEMCPY(fullName + idx, dName->fullName + dName->uidIdx,
    37895                                                                  dName->uidLen);
    37896             }
    37897             dName->uidIdx = idx;
    37898             idx += dName->uidLen;
    37899         }
    37900         if (dName->serialLen != 0) {
    37901             dName->entryCount++;
    37902             XMEMCPY(fullName + idx, WOLFSSL_SERIAL_NUMBER, 14);
    37903             idx += 14;
    37904             if (dName->serialIdx == -1)
    37905                 XMEMCPY(fullName + idx, data, dName->serialLen);
    37906             else {
    37907                 XMEMCPY(fullName + idx, dName->fullName + dName->serialIdx,
    37908                                                               dName->serialLen);
    37909             }
    37910             dName->serialIdx = idx;
    37911             idx += dName->serialLen;
    37912         }
    37913 
    37914         if (dName->fullName != NULL)
    37915             XFREE(dName->fullName, NULL, DYNAMIC_TYPE_X509);
    37916         dName->fullName = fullName;
    37917         dName->fullNameLen = idx + 1;
     41968        entryCount = AddAllEntry(name, fullName, totalLen, &idx);
     41969        if (entryCount < 0) {
     41970            XFREE(fullName, name->heap, DYNAMIC_TYPE_X509);
     41971            return entryCount;
     41972        }
     41973
     41974        if (name->dynamicName) {
     41975            XFREE(name->name, name->heap, DYNAMIC_TYPE_X509);
     41976        }
     41977        fullName[idx] = '\0';
     41978        name->name = fullName;
     41979        name->dynamicName = 1;
     41980        name->sz = idx + 1; /* size includes null terminator */
     41981        name->entrySz = entryCount;
    3791841982
    3791941983        return 0;
     
    3792641990            WOLFSSL_X509_NAME_ENTRY* entry, int idx, int set)
    3792741991    {
     41992        WOLFSSL_X509_NAME_ENTRY* current = NULL;
    3792841993        int i;
    37929         int fullName = 1;
    3793041994
    3793141995        WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry()");
    3793241996
    37933         switch (entry->nid) {
    37934             case ASN_COMMON_NAME:
    37935                 name->fullName.cnIdx = -1;
    37936                 name->fullName.cnLen = entry->value->length;
    37937                 name->fullName.cnNid = entry->nid;
    37938                 break;
    37939             case ASN_SUR_NAME:
    37940                 name->fullName.snIdx = -1;
    37941                 name->fullName.snLen = entry->value->length;
    37942                 name->fullName.snNid = entry->nid;
    37943                 break;
    37944             case ASN_SERIAL_NUMBER:
    37945                 name->fullName.serialIdx = -1;
    37946                 name->fullName.serialLen = entry->value->length;
    37947                 name->fullName.serialNid = entry->nid;
    37948                 break;
    37949             case ASN_COUNTRY_NAME:
    37950                 name->fullName.cIdx = -1;
    37951                 name->fullName.cLen = entry->value->length;
    37952                 name->fullName.cNid = entry->nid;
    37953                 break;
    37954             case ASN_LOCALITY_NAME:
    37955                 name->fullName.lIdx = -1;
    37956                 name->fullName.lLen = entry->value->length;
    37957                 name->fullName.lNid = entry->nid;
    37958                 break;
    37959             case ASN_STATE_NAME:
    37960                 name->fullName.stIdx = -1;
    37961                 name->fullName.stLen = entry->value->length;
    37962                 name->fullName.stNid = entry->nid;
    37963                 break;
    37964             case ASN_ORG_NAME:
    37965                 name->fullName.oIdx = -1;
    37966                 name->fullName.oLen = entry->value->length;
    37967                 name->fullName.oNid = entry->nid;
    37968                 break;
    37969             case ASN_ORGUNIT_NAME:
    37970                 name->fullName.ouIdx = -1;
    37971                 name->fullName.ouLen = entry->value->length;
    37972                 name->fullName.ouNid = entry->nid;
    37973                 break;
    37974             case NID_emailAddress:
    37975                 name->fullName.emailIdx = -1;
    37976                 name->fullName.emailLen = entry->value->length;
    37977                 name->fullName.emailNid = entry->nid;
    37978                 break;
    37979             case ASN_USER_ID:
    37980                 name->fullName.uidIdx = -1;
    37981                 name->fullName.uidLen = entry->value->length;
    37982                 name->fullName.uidNid = entry->nid;
    37983                 break;
    37984             case ASN_DOMAIN_COMPONENT:
    37985                 name->fullName.dcIdx[0] = -1;
    37986                 name->fullName.dcLen[0] = entry->value->length;
    37987                 break;
    37988             default:
    37989                 fullName = 0;
    37990                 break;
    37991         }
    37992 
    37993         if (fullName) {
    37994             int nid = entry->nid;
    37995 
    37996             if (nid == NID_emailAddress) {
    37997                 nid = (int)ASN_EMAIL_NAME;
    37998             }
    37999 
    38000             if (idx >= DN_NAMES_MAX + DOMAIN_COMPONENT_MAX) {
     41997        if (name == NULL || entry == NULL || entry->value == NULL) {
     41998            WOLFSSL_MSG("NULL argument passed in");
     41999            return WOLFSSL_FAILURE;
     42000        }
     42001
     42002        if (idx >= 0) {
     42003            /* place in specific index */
     42004
     42005            if (idx >= MAX_NAME_ENTRIES) {
     42006                WOLFSSL_MSG("Error index to insert entry is larger than array");
    3800142007                return WOLFSSL_FAILURE;
    3800242008            }
    38003 
    38004             if (idx >= 0) {
    38005                 name->fullName.loc[idx] = nid;
    38006                 if (idx == name->fullName.locSz) {
    38007                     name->fullName.locSz += 1;
    38008                 }
    38009             }
    38010 
    38011             /* place at end */
    38012             if (idx < 0 && name->fullName.locSz + 1
    38013                     < DN_NAMES_MAX + DOMAIN_COMPONENT_MAX) {
    38014                 name->fullName.loc[name->fullName.locSz] = nid;
    38015                 name->fullName.locSz += 1;
    38016             }
    38017 
    38018             if (RebuildFullNameAdd(&name->fullName, entry->value->data) != 0)
    38019                 return WOLFSSL_FAILURE;
     42009            i = idx;
    3802042010        }
    3802142011        else {
     42012            /* iterate through and find first open spot */
    3802242013            for (i = 0; i < MAX_NAME_ENTRIES; i++) {
    38023                 if (name->extra[i].set != 1) { /* not set so overwritten */
    38024                     WOLFSSL_X509_NAME_ENTRY* current = &(name->extra[i]);
    38025                     WOLFSSL_ASN1_STRING*     str;
    38026 
     42014                if (name->entry[i].set != 1) { /* not set so overwritten */
    3802742015                    WOLFSSL_MSG("Found place for name entry");
    38028 
    38029                     XMEMCPY(current, entry, sizeof(WOLFSSL_X509_NAME_ENTRY));
    38030                     str = entry->value;
    38031                     XMEMCPY(&(current->data), str, sizeof(WOLFSSL_ASN1_STRING));
    38032                     current->value = &(current->data);
    38033                     current->data.data = (char*)XMALLOC(str->length,
    38034                            name->x509->heap, DYNAMIC_TYPE_OPENSSL);
    38035 
    38036                     if (current->data.data == NULL) {
    38037                         return SSL_FAILURE;
    38038                     }
    38039                     XMEMCPY(current->data.data, str->data, str->length);
    38040 
    38041                     /* make sure is null terminated */
    38042                     current->data.data[str->length - 1] = '\0';
    38043 
    38044                     current->set = 1; /* make sure now listed as set */
    3804542016                    break;
    3804642017                }
     
    3804942020            if (i == MAX_NAME_ENTRIES) {
    3805042021                WOLFSSL_MSG("No spot found for name entry");
    38051                 return SSL_FAILURE;
    38052             }
    38053         }
    38054 
    38055         (void)idx;
     42022                return WOLFSSL_FAILURE;
     42023            }
     42024        }
     42025
     42026        current = &(name->entry[i]);
     42027        if (current->set == 0)
     42028            name->entrySz++;
     42029        if (wolfSSL_X509_NAME_ENTRY_create_by_NID(&current,
     42030                                entry->nid,
     42031                                wolfSSL_ASN1_STRING_type(entry->value),
     42032                                wolfSSL_ASN1_STRING_data(entry->value),
     42033                                wolfSSL_ASN1_STRING_length(entry->value))
     42034                                == NULL) {
     42035            WOLFSSL_MSG("Issue adding the name entry");
     42036            if (current->set == 0)
     42037                name->entrySz--;
     42038            return WOLFSSL_FAILURE;
     42039        }
     42040
     42041        if (RebuildFullName(name) != 0)
     42042            return WOLFSSL_FAILURE;
     42043
    3805642044        (void)set;
    38057         return SSL_SUCCESS;
     42045        return WOLFSSL_SUCCESS;
    3805842046    }
    3805942047
     
    3807342061            return WOLFSSL_FAILURE;
    3807442062
    38075         if ((nid = wolfSSL_OBJ_txt2nid(field)) == NID_undef)
     42063        if ((nid = wolfSSL_OBJ_txt2nid(field)) == NID_undef) {
     42064            WOLFSSL_MSG("Unable convert text to NID");
    3807642065            return WOLFSSL_FAILURE;
     42066        }
    3807742067
    3807842068        entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL,
     
    3809342083        int ret;
    3809442084        WOLFSSL_X509_NAME_ENTRY* entry;
    38095         entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes, len);
     42085        WOLFSSL_ENTER("wolfSSL_X509_NAME_add_entry_by_NID");
     42086        entry = wolfSSL_X509_NAME_ENTRY_create_by_NID(NULL, nid, type, bytes,
     42087                len);
    3809642088        if (entry == NULL)
    3809742089            return WOLFSSL_FAILURE;
     
    3810042092        return ret;
    3810142093    }
    38102     #endif /* !NO_CERTS */
    38103 
     42094
     42095    WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_delete_entry(
     42096            WOLFSSL_X509_NAME *name, int loc)
     42097    {
     42098        WOLFSSL_X509_NAME_ENTRY* ret;
     42099        WOLFSSL_ENTER("wolfSSL_X509_NAME_delete_entry");
     42100
     42101        if (!name) {
     42102            WOLFSSL_MSG("Bad parameter");
     42103            return NULL;
     42104        }
     42105
     42106        ret = wolfSSL_X509_NAME_get_entry(name, loc);
     42107        if (!ret) {
     42108            WOLFSSL_MSG("loc entry not found");
     42109            return NULL;
     42110        }
     42111        name->entry[loc].set = 0;
     42112        return ret;
     42113    }
     42114
     42115#endif /* !NO_CERTS */
    3810442116
    3810542117    /* NID variables are dependent on compatibility header files currently
     
    3816942181                return NULL;
    3817042182            }
    38171             obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
    38172         } else {
    38173             obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC;
    3817442183        }
    3817542184        obj->type    = id;
     
    3818542194        XMEMCPY(objBuf + objSz, oid, oidSz);
    3818642195        objSz     += oidSz;
    38187         obj->objSz = objSz;
    38188         if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
     42196
     42197        if (obj->objSz == 0 || objSz != obj->objSz) {
     42198            obj->objSz = objSz;
     42199            if(((obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) ||
    3818942200                                                           (obj->obj == NULL)) {
    38190             obj->obj = (byte*)XREALLOC((byte*)obj->obj, obj->objSz, NULL,
    38191                                                              DYNAMIC_TYPE_ASN1);
    38192             if (obj->obj == NULL) {
    38193                 wolfSSL_ASN1_OBJECT_free(obj);
    38194                 return NULL;
    38195             }
    38196             obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
    38197         } else {
    38198             obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
     42201                if (obj->obj != NULL)
     42202                    XFREE((byte*)obj->obj, NULL, DYNAMIC_TYPE_ASN1);
     42203                obj->obj = (byte*)XMALLOC(obj->objSz, NULL, DYNAMIC_TYPE_ASN1);
     42204                if (obj->obj == NULL) {
     42205                    wolfSSL_ASN1_OBJECT_free(obj);
     42206                    return NULL;
     42207                }
     42208                obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
     42209            }
     42210            else {
     42211                obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ;
     42212            }
    3819942213        }
    3820042214        XMEMCPY((byte*)obj->obj, objBuf, obj->objSz);
     
    3827942293
    3828042294        }
    38281         else { /* return short name */
    38282             if (XSTRLEN(a->sName) + 1 < (word32)bufLen - 1) {
    38283                 bufSz = (int)XSTRLEN(a->sName);
     42295        else { /* return long name unless using x509small, then return short name */
     42296#if defined(OPENSSL_EXTRA_X509_SMALL) && !defined(OPENSSL_EXTRA)
     42297            const char* name = a->sName;
     42298#else
     42299            const char* name = wolfSSL_OBJ_nid2ln(wolfSSL_OBJ_obj2nid(a));
     42300#endif
     42301
     42302            if (XSTRLEN(name) + 1 < (word32)bufLen - 1) {
     42303                bufSz = (int)XSTRLEN(name);
    3828442304            }
    3828542305            else {
     
    3828742307            }
    3828842308            if (bufSz) {
    38289                 XMEMCPY(buf, a->sName, bufSz);
     42309                XMEMCPY(buf, name, bufSz);
    3829042310            }
    3829142311            else if (wolfSSL_OBJ_obj2txt(buf, bufLen, a, 1)) {
     
    3831142331        return bufSz;
    3831242332    }
    38313 #endif /* OPENSSL_EXTRA */
     42333#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
    3831442334
    3831542335#if defined(OPENSSL_EXTRA) && !defined(NO_ASN)
    38316     /* DN_Tags to strings */
    38317     static const struct DN_Tag_Strings {
    38318         enum DN_Tags tag;
    38319         const char* str;
    38320     } dn_tag_strings[] = {
    38321            { ASN_COMMON_NAME,      "CN" },
    38322            { ASN_SUR_NAME,         "SN" },
    38323            { ASN_SERIAL_NUMBER,    "serialNumber" },
    38324            { ASN_COUNTRY_NAME,     "C" },
    38325            { ASN_LOCALITY_NAME,    "L" },
    38326            { ASN_STATE_NAME,       "ST" },
    38327            { ASN_ORG_NAME,         "O"},
    38328            { ASN_ORGUNIT_NAME,     "OU"},
    38329            { ASN_BUS_CAT,          "businessCategory"},
    38330            { ASN_EMAIL_NAME,       "emailAddress"},
    38331            { ASN_USER_ID,          "UID"},
    38332            { ASN_DOMAIN_COMPONENT, "DC"},
    38333            { ASN_DN_NULL,          NULL }
    38334     };
    38335 
    3833642336    int wolfSSL_X509_NAME_get_index_by_OBJ(WOLFSSL_X509_NAME *name,
    3833742337                                           const WOLFSSL_ASN1_OBJECT *obj,
    3833842338                                           int idx) {
    38339         const struct DN_Tag_Strings* dn;
    38340         enum DN_Tags tag = ASN_DN_NULL;
    38341 
    38342         if (!name || idx >= name->fullName.locSz ||
     42339        if (!name || idx >= MAX_NAME_ENTRIES ||
    3834342340                !obj || !obj->obj) {
    3834442341            return -1;
     
    3834642343
    3834742344        if (idx < 0) {
    38348             idx = 0;
    38349         }
    38350         for (dn = dn_tag_strings; dn->str != NULL; dn++) {
    38351             /* Find the DN_Tags number for the name */
    38352             if (XSTRNCMP((const char*) obj->sName, dn->str, obj->objSz - 1) == 0) {
    38353                 tag = dn->tag;
    38354                 break;
    38355             }
    38356         }
    38357         if (!tag) {
    38358             /* Unable to identify desired name */
    38359             return -1;
    38360         }
    38361         for (idx++; idx < name->fullName.locSz; idx++) {
     42345            idx = -1;
     42346        }
     42347
     42348        for (idx++; idx < MAX_NAME_ENTRIES; idx++) {
    3836242349            /* Find index of desired name */
    38363             if ((enum DN_Tags)name->fullName.loc[idx] == tag) {
    38364                 return idx;
     42350            if (name->entry[idx].set) {
     42351                if (XSTRLEN(obj->sName) == XSTRLEN(name->entry[idx].object->sName) &&
     42352                    XSTRNCMP((const char*) obj->sName,
     42353                        name->entry[idx].object->sName, obj->objSz - 1) == 0) {
     42354                    return idx;
     42355                }
    3836542356            }
    3836642357        }
     
    3836842359    }
    3836942360#endif
     42361
     42362#endif /* !WOLFCRYPT_ONLY */
    3837042363
    3837142364#if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
     
    3839042383    {
    3839142384        static byte dig[WC_SHA_DIGEST_SIZE];
     42385        byte* ret = md;
    3839242386        wc_Sha sha;
    3839342387
     
    3840442398        }
    3840542399
    38406         if (wc_ShaFinal(&sha, dig) != 0) {
     42400        if (md == NULL) {
     42401            WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA1 IS NOT "
     42402                        "THREAD SAFE WHEN md == NULL");
     42403            ret = dig;
     42404        }
     42405        if (wc_ShaFinal(&sha, ret) != 0) {
    3840742406            WOLFSSL_MSG("SHA1 Final failed");
     42407            wc_ShaFree(&sha);
    3840842408            return NULL;
    3840942409        }
    38410 
    3841142410        wc_ShaFree(&sha);
    3841242411
    38413         if (md != NULL) {
    38414             XMEMCPY(md, dig, WC_SHA_DIGEST_SIZE);
    38415             return md;
    38416         }
    38417         else {
    38418             return (unsigned char*)dig;
    38419         }
     42412        return ret;
    3842042413    }
    3842142414#endif /* ! NO_SHA */
     
    3843742430    {
    3843842431        static byte dig[WC_SHA256_DIGEST_SIZE];
     42432        byte* ret = md;
    3843942433        wc_Sha256 sha;
    3844042434
     
    3845142445        }
    3845242446
    38453         if (wc_Sha256Final(&sha, dig) != 0) {
     42447        if (md == NULL) {
     42448            WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA256 IS NOT "
     42449                        "THREAD SAFE WHEN md == NULL");
     42450            ret = dig;
     42451        }
     42452        if (wc_Sha256Final(&sha, ret) != 0) {
    3845442453            WOLFSSL_MSG("SHA256 Final failed");
     42454            wc_Sha256Free(&sha);
    3845542455            return NULL;
    3845642456        }
    38457 
    3845842457        wc_Sha256Free(&sha);
    3845942458
    38460         if (md != NULL) {
    38461             XMEMCPY(md, dig, WC_SHA256_DIGEST_SIZE);
    38462             return md;
    38463         }
    38464         else {
    38465             return (unsigned char*)dig;
    38466         }
     42459        return ret;
    3846742460    }
    3846842461#endif /* ! NO_SHA256 */
     
    3848442477     {
    3848542478         static byte dig[WC_SHA384_DIGEST_SIZE];
     42479         byte* ret = md;
    3848642480         wc_Sha384 sha;
    3848742481
     
    3849842492         }
    3849942493
    38500          if (wc_Sha384Final(&sha, dig) != 0) {
     42494         if (md == NULL) {
     42495             WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA384 IS NOT "
     42496                         "THREAD SAFE WHEN md == NULL");
     42497             ret = dig;
     42498         }
     42499         if (wc_Sha384Final(&sha, ret) != 0) {
    3850142500             WOLFSSL_MSG("SHA384 Final failed");
     42501             wc_Sha384Free(&sha);
    3850242502             return NULL;
    3850342503         }
    38504 
    3850542504         wc_Sha384Free(&sha);
    3850642505
    38507          if (md != NULL) {
    38508              XMEMCPY(md, dig, WC_SHA384_DIGEST_SIZE);
    38509              return md;
    38510          }
    38511          else {
    38512              return (unsigned char*)dig;
    38513          }
     42506         return ret;
    3851442507     }
    3851542508#endif /* WOLFSSL_SHA384  */
     
    3853242525     {
    3853342526         static byte dig[WC_SHA512_DIGEST_SIZE];
     42527         byte* ret = md;
    3853442528         wc_Sha512 sha;
    3853542529
     
    3854642540         }
    3854742541
    38548          if (wc_Sha512Final(&sha, dig) != 0) {
     42542         if (md == NULL) {
     42543             WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA512 IS NOT "
     42544                         "THREAD SAFE WHEN md == NULL");
     42545             ret = dig;
     42546         }
     42547         if (wc_Sha512Final(&sha, ret) != 0) {
    3854942548             WOLFSSL_MSG("SHA512 Final failed");
     42549             wc_Sha512Free(&sha);
    3855042550             return NULL;
    3855142551         }
    38552 
    3855342552         wc_Sha512Free(&sha);
    3855442553
    38555          if (md != NULL) {
    38556              XMEMCPY(md, dig, WC_SHA512_DIGEST_SIZE);
    38557              return md;
    38558          }
    38559          else {
    38560              return (unsigned char*)dig;
    38561          }
     42554         return ret;
    3856242555     }
    38563 #endif /* defined(WOLFSSL_SHA512) */
     42556#endif /* WOLFSSL_SHA512 */
    3856442557#endif /* OPENSSL_EXTRA */
    3856542558
     
    3857542568
    3857642569        WOLFSSL_ENTER("wolfSSL_CTX_use_certificate");
     42570        if (!ctx || !x || !x->derCert) {
     42571            WOLFSSL_MSG("Bad parameter");
     42572            return WOLFSSL_FAILURE;
     42573        }
    3857742574
    3857842575        FreeDer(&ctx->certificate); /* Make sure previous is free'd */
     
    3858042577                       ctx->heap);
    3858142578        if (ret != 0)
    38582             return 0;
     42579            return WOLFSSL_FAILURE;
    3858342580
    3858442581        XMEMCPY(ctx->certificate->buffer, x->derCert->buffer,
     
    3858642583#ifdef KEEP_OUR_CERT
    3858742584        if (ctx->ourCert != NULL && ctx->ownOurCert) {
    38588             FreeX509(ctx->ourCert);
    38589             XFREE(ctx->ourCert, ctx->heap, DYNAMIC_TYPE_X509);
     42585            wolfSSL_X509_free(ctx->ourCert);
    3859042586        }
    3859142587        #ifndef WOLFSSL_X509_STORE_CERTS
    3859242588        ctx->ourCert = x;
     42589        if (wolfSSL_X509_up_ref(x) != 1) {
     42590            return WOLFSSL_FAILURE;
     42591        }
    3859342592        #else
    3859442593        ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length);
    3859542594        if(ctx->ourCert == NULL){
    38596             return 0;
     42595            return WOLFSSL_FAILURE;
    3859742596        }
    3859842597        #endif
    3859942598
    38600         ctx->ownOurCert = 0;
     42599        /* We own the cert because either we up its reference counter
     42600         * or we create our own copy of the cert object. */
     42601        ctx->ownOurCert = 1;
    3860142602#endif
    3860242603
     
    3863642637    }
    3863742638
     42639#ifndef NO_BIO
    3863842640    int wolfSSL_BIO_read_filename(WOLFSSL_BIO *b, const char *name) {
    3863942641    #ifndef NO_FILESYSTEM
     
    3864742649        }
    3864842650
    38649         fp = XFOPEN(name, "r");
     42651        fp = XFOPEN(name, "rb");
    3865042652        if (fp == XBADFILE)
    3865142653            return WOLFSSL_BAD_FILE;
     
    3866442666    #endif
    3866542667    }
     42668#endif
    3866642669
    3866742670    /* Return the corresponding short name for the nid <n>.
     
    3870142704        word32 oid = 0;
    3870242705        word32 idx = 0;
     42706        int ret;
    3870342707
    3870442708        WOLFSSL_ENTER("wolfSSL_OBJ_obj2nid");
     
    3871842722        if (o->nid > 0)
    3871942723            return o->nid;
    38720         if (GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz) < 0) {
    38721             WOLFSSL_MSG("Issue getting OID of object");
    38722             return -1;
     42724        if ((ret = GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz)) < 0) {
     42725            if (ret == ASN_OBJECT_ID_E) {
     42726                /* Put ASN object tag in front and try again */
     42727                int len = SetObjectId(o->objSz, NULL) + o->objSz;
     42728                byte* buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     42729                if (!buf) {
     42730                    WOLFSSL_MSG("malloc error");
     42731                    return -1;
     42732                }
     42733                idx = SetObjectId(o->objSz, buf);
     42734                XMEMCPY(buf + idx, o->obj, o->objSz);
     42735                idx = 0;
     42736                ret = GetObjectId(buf, &idx, &oid, o->grp, len);
     42737                XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     42738                if (ret < 0) {
     42739                    WOLFSSL_MSG("Issue getting OID of object");
     42740                    return -1;
     42741                }
     42742            }
     42743            else {
     42744                WOLFSSL_MSG("Issue getting OID of object");
     42745                return -1;
     42746            }
    3872342747        }
    3872442748
     
    3877742801        WOLFSSL_ENTER("wolfSSL_OBJ_cmp");
    3877842802
    38779         if (a != NULL && b != NULL &&
    38780             a->obj != NULL && b->obj != NULL &&
    38781             a->objSz == b->objSz) {
    38782             return XMEMCMP(a->obj, b->obj, a->objSz);
     42803        if (a && b && a->obj && b->obj) {
     42804            if (a->objSz == b->objSz) {
     42805                return XMEMCMP(a->obj, b->obj, a->objSz);
     42806            }
     42807            else if (a->type == EXT_KEY_USAGE_OID ||
     42808                     b->type == EXT_KEY_USAGE_OID) {
     42809                /* Special case for EXT_KEY_USAGE_OID so that
     42810                 * cmp will be treated as a substring search */
     42811                /* Used in libest to check for id-kp-cmcRA in
     42812                 * EXT_KEY_USAGE extension */
     42813                unsigned int idx;
     42814                const byte* s; /* shorter */
     42815                unsigned int sLen;
     42816                const byte* l; /* longer */
     42817                unsigned int lLen;
     42818                if (a->objSz > b->objSz) {
     42819                    s = b->obj; sLen = b->objSz;
     42820                    l = a->obj; lLen = a->objSz;
     42821                }
     42822                else {
     42823                    s = a->obj; sLen = a->objSz;
     42824                    l = b->obj; lLen = b->objSz;
     42825                }
     42826                for (idx = 0; idx <= lLen - sLen; idx++) {
     42827                    if (XMEMCMP(l + idx, s, sLen) == 0) {
     42828                        /* Found substring */
     42829                        return 0;
     42830                    }
     42831                }
     42832            }
    3878342833        }
    3878442834
    3878542835        return WOLFSSL_FATAL_ERROR;
    3878642836    }
    38787 
     42837#endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL,
     42838          WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */
     42839#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
     42840    defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
     42841    defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
     42842    defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
    3878842843    /* Gets the NID value that is related to the OID string passed in. Example
    3878942844     * string would be "2.5.29.14" for subject key ID.
     
    3883142886            /* try as a short name */
    3883242887            len = (int)XSTRLEN(s);
    38833             if (XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
     42888            if ((int)XSTRLEN(wolfssl_object_info[i].sName) == len &&
     42889                XSTRNCMP(wolfssl_object_info[i].sName, s, len) == 0) {
    3883442890                return wolfssl_object_info[i].nid;
    3883542891            }
    3883642892
    3883742893            /* try as a long name */
    38838             if (XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
     42894            if ((int)XSTRLEN(wolfssl_object_info[i].lName) == len &&
     42895                XSTRNCMP(wolfssl_object_info[i].lName, s, len) == 0) {
    3883942896                return wolfssl_object_info[i].nid;
    3884042897            }
     
    3884342900        return NID_undef;
    3884442901    }
     42902#endif
     42903#if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \
     42904    defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \
     42905    defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \
     42906    defined(WOLFSSL_HAPROXY)
    3884542907
    3884642908    /* Creates new ASN1_OBJECT from short name, long name, or text
     
    3885842920        unsigned int outSz = MAX_OID_SZ;
    3885942921        unsigned char out[MAX_OID_SZ];
    38860         unsigned int sum = 0;
     42922        WOLFSSL_ASN1_OBJECT* obj;
    3886142923
    3886242924        WOLFSSL_ENTER("wolfSSL_OBJ_txt2obj");
     
    3886742929        /* If s is numerical value, try to sum oid */
    3886842930        ret = EncodePolicyOID(out, &outSz, s, NULL);
    38869         if (ret == 0) {
    38870             for (i = 0; i < (int)outSz; i++) {
    38871                 sum += out[i];
    38872             }
     42931        if (ret == 0 && outSz > 0) {
     42932            /* If numerical encode succeeded then just
     42933             * create object from that because sums are
     42934             * not unique and can cause confusion. */
     42935            obj = wolfSSL_ASN1_OBJECT_new();
     42936            if (obj == NULL) {
     42937                WOLFSSL_MSG("Issue creating WOLFSSL_ASN1_OBJECT struct");
     42938                return NULL;
     42939            }
     42940            obj->dynamic |= WOLFSSL_ASN1_DYNAMIC;
     42941            obj->obj = (byte*)XMALLOC(1 + MAX_LENGTH_SZ + outSz, NULL,
     42942                    DYNAMIC_TYPE_ASN1);
     42943            if (obj->obj == NULL) {
     42944                wolfSSL_ASN1_OBJECT_free(obj);
     42945                return NULL;
     42946            }
     42947            obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ;
     42948            i = SetObjectId(outSz, (byte*)obj->obj);
     42949            XMEMCPY((byte*)obj->obj + i, out, outSz);
     42950            obj->objSz = i + outSz;
     42951            return obj;
    3887342952        }
    3887442953
     
    3888042959            /* Short name, long name, and numerical value are interpreted */
    3888142960            if (no_name == 0 && ((XSTRNCMP(s, wolfssl_object_info[i].sName, len) == 0) ||
    38882                                  (XSTRNCMP(s, wolfssl_object_info[i].lName, len) == 0) ||
    38883                                  (wolfssl_object_info[i].id == (int)sum)))
    38884                     nid = wolfssl_object_info[i].nid;
    38885             /* Only numerical value is interpreted */
    38886             else if (no_name == 1 && wolfssl_object_info[i].id == (int)sum)
     42961                                 (XSTRNCMP(s, wolfssl_object_info[i].lName, len) == 0)))
    3888742962                    nid = wolfssl_object_info[i].nid;
    3888842963        }
     
    3891642991    void wolfSSL_set_verify_depth(WOLFSSL *ssl, int depth)
    3891742992    {
    38918     #if !defined(OPENSSL_EXTRA) && !defined(NO_WOLFSSL_STUB)
    38919         (void)ssl;
    38920         (void)depth;
    38921         WOLFSSL_STUB("wolfSSL_set_verify_depth");
    38922     #else
     42993    #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    3892342994        WOLFSSL_ENTER("wolfSSL_set_verify_depth");
    3892442995        ssl->options.verifyDepth = (byte)depth;
     
    3892642997    }
    3892742998
    38928 
    38929     WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne) {
     42999#endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
     43000    HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
     43001#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
     43002    defined(HAVE_LIGHTY) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \
     43003    defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
     43004    defined(HAVE_POCO_LIB) || defined(WOLFSSL_HAPROXY)
     43005    WOLFSSL_ASN1_OBJECT * wolfSSL_X509_NAME_ENTRY_get_object(WOLFSSL_X509_NAME_ENTRY *ne)
     43006    {
     43007        WOLFSSL_ASN1_OBJECT* obj = NULL;
     43008
    3893043009        WOLFSSL_ENTER("wolfSSL_X509_NAME_ENTRY_get_object");
    3893143010        if (ne == NULL) return NULL;
    38932         if (wolfSSL_OBJ_nid2obj_ex(ne->nid, &ne->object) != NULL) {
    38933             ne->object.nid = ne->nid;
    38934             return &ne->object;
     43011        obj = wolfSSL_OBJ_nid2obj_ex(ne->nid, ne->object);
     43012        if (obj != NULL) {
     43013            obj->nid = ne->nid;
     43014            return obj;
    3893543015        }
    3893643016        return NULL;
     
    3893843018
    3893943019
    38940     /* looks up the DN given the location "loc". "loc" is the number indicating
    38941      * the order that the DN was parsed as, 0 is first DN parsed.
    38942      *
    38943      * returns the setup WOLFSSL_X509_NAME pointer on success and NULL on fail
    38944      */
    38945     static WOLFSSL_X509_NAME* wolfSSL_nameByLoc(WOLFSSL_X509_NAME *name, int loc)
    38946     {
    38947         char* pt = NULL;
    38948         int sz = 0;
    38949 
    38950         switch (name->fullName.loc[loc])
    38951         {
    38952         case ASN_COMMON_NAME:
    38953             sz = name->fullName.cnLen;
    38954             pt = &name->fullName.fullName[name->fullName.cnIdx];
    38955             name->cnEntry.nid           = name->fullName.cnNid;
    38956             break;
    38957         case ASN_COUNTRY_NAME:
    38958             sz = name->fullName.cLen;
    38959             pt = &name->fullName.fullName[name->fullName.cIdx];
    38960             name->cnEntry.nid           = name->fullName.cNid;
    38961             break;
    38962         case ASN_LOCALITY_NAME:
    38963             sz = name->fullName.lLen;
    38964             pt = &name->fullName.fullName[name->fullName.lIdx];
    38965             name->cnEntry.nid           = name->fullName.lNid;
    38966             break;
    38967         case ASN_STATE_NAME:
    38968             sz = name->fullName.stLen;
    38969             pt = &name->fullName.fullName[name->fullName.stIdx];
    38970             name->cnEntry.nid           = name->fullName.stNid;
    38971             break;
    38972         case ASN_ORG_NAME:
    38973             sz = name->fullName.oLen;
    38974             pt = &name->fullName.fullName[name->fullName.oIdx];
    38975             name->cnEntry.nid           = name->fullName.oNid;
    38976             break;
    38977         case ASN_ORGUNIT_NAME:
    38978             sz = name->fullName.ouLen;
    38979             pt = &name->fullName.fullName[name->fullName.ouIdx];
    38980             name->cnEntry.nid           = name->fullName.ouNid;
    38981             break;
    38982         case ASN_EMAIL_NAME:
    38983             sz = name->fullName.emailLen;
    38984             pt = &name->fullName.fullName[name->fullName.emailIdx];
    38985             name->cnEntry.nid           = name->fullName.emailNid;
    38986             break;
    38987         case ASN_SUR_NAME:
    38988             sz = name->fullName.snLen;
    38989             pt = &name->fullName.fullName[name->fullName.snIdx];
    38990             name->cnEntry.nid           = name->fullName.snNid;
    38991             break;
    38992         case ASN_USER_ID:
    38993             sz = name->fullName.uidLen;
    38994             pt = &name->fullName.fullName[name->fullName.uidIdx];
    38995             name->cnEntry.nid           = name->fullName.uidNid;
    38996             break;
    38997         case ASN_SERIAL_NUMBER:
    38998             sz = name->fullName.serialLen;
    38999             pt = &name->fullName.fullName[name->fullName.serialIdx];
    39000             name->cnEntry.nid           = name->fullName.serialNid;
    39001             break;
    39002 #ifdef WOLFSSL_CERT_EXT
    39003         case ASN_BUS_CAT:
    39004             sz = name->fullName.bcLen;
    39005             pt = &name->fullName.fullName[name->fullName.bcIdx];
    39006             break;
    39007 #endif
    39008 
    39009         case ASN_DOMAIN_COMPONENT:
    39010             /* get index of DC i.e. first or second or ... case */
    39011             {
    39012                 int idx = 0, i;
    39013                 for (i = 0; i < loc; i++) {
    39014                     if (name->fullName.loc[i] == ASN_DOMAIN_COMPONENT) {
    39015                         idx++;
    39016                     }
    39017                 }
    39018 
    39019                 /* check that index is not larger than max buffer size or larger
    39020                  * than the number of domain components parsed */
    39021                 if (idx >= DOMAIN_COMPONENT_MAX || idx > name->fullName.dcNum) {
    39022                     WOLFSSL_MSG("Index was larger then domain buffer");
    39023                     return NULL;
    39024                 }
    39025                 pt = &name->fullName.fullName[name->fullName.dcIdx[idx]],
    39026                 sz = name->fullName.dcLen[idx];
    39027                 name->cnEntry.nid         = ASN_DOMAIN_COMPONENT;
    39028                 name->cnEntry.data.type   = CTC_UTF8;
    39029             }
    39030             break;
    39031 
    39032         default:
    39033             return NULL;
    39034         }
    39035 
    39036         /* -1 to leave room for trailing terminator 0 */
    39037         if (sz == 0 || sz >= CTC_NAME_SIZE - 1)
    39038             return NULL;
    39039         if (wolfSSL_ASN1_STRING_set(name->cnEntry.value, pt, sz) !=
    39040                 WOLFSSL_SUCCESS) {
    39041             WOLFSSL_MSG("Error setting local ASN1 string data");
    39042             return NULL;
    39043         }
    39044         name->cnEntry.value->type   = CTC_UTF8;
    39045         name->cnEntry.set           = 1;
    39046         return name;
    39047     }
    39048 
    39049 
     43020#endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
     43021    HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
     43022
     43023#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \
     43024    defined(OPENSSL_EXTRA_X509_SMALL)
     43025
     43026    /* returns a pointer to the internal entry at location 'loc' on success,
     43027     * a null pointer is returned in fail cases */
    3905043028    WOLFSSL_X509_NAME_ENTRY *wolfSSL_X509_NAME_get_entry(
    3905143029                                             WOLFSSL_X509_NAME *name, int loc)
     
    3905743035        }
    3905843036
    39059         if (loc < 0) {
     43037        if (loc < 0 || loc >= MAX_NAME_ENTRIES) {
    3906043038            WOLFSSL_MSG("Bad argument");
    3906143039            return NULL;
    3906243040        }
    3906343041
    39064         if (loc <= DN_NAMES_MAX + name->fullName.dcNum) {
    39065             if (wolfSSL_nameByLoc(name, loc) != NULL)
    39066                 return &name->cnEntry;
    39067         }
    39068         /* DC component */
    39069         if (name->fullName.dcMode) {
    39070             if (name->fullName.fullName != NULL){
    39071                 if (loc == name->fullName.dcNum){
    39072                     name->cnEntry.data.data
    39073                         = &name->fullName.fullName[name->fullName.cIdx];
    39074                     name->cnEntry.data.length = name->fullName.cLen;
    39075                     name->cnEntry.nid         = ASN_COUNTRY_NAME;
    39076                 } else {
    39077                     name->cnEntry.data.data
    39078                         = &name->fullName.fullName[name->fullName.dcIdx[loc]];
    39079                     name->cnEntry.data.length = name->fullName.dcLen[loc];
    39080                     name->cnEntry.nid         = ASN_DOMAIN_COMPONENT;
    39081                 }
    39082             }
    39083             name->cnEntry.data.type = CTC_UTF8;
    39084         /* common name index case */
    39085         } else if (loc == name->fullName.cnIdx && name->x509 != NULL) {
    39086             /* get CN shortcut from x509 since it has null terminator */
    39087             name->cnEntry.data.data   = name->x509->subjectCN;
    39088             name->cnEntry.data.length = name->fullName.cnLen;
    39089             name->cnEntry.data.type   = CTC_UTF8;
    39090             name->cnEntry.nid         = ASN_COMMON_NAME;
    39091             name->cnEntry.set         = 1;
    39092         } else {
    39093             WOLFSSL_MSG("loc passed in is not in range of parsed DN's");
     43042        if (name->entry[loc].set) {
     43043            return &name->entry[loc];
     43044        }
     43045        else {
    3909443046            return NULL;
    3909543047        }
    39096         return &name->cnEntry;
    39097     }
    39098 
    39099     #ifndef NO_WOLFSSL_STUB
     43048    }
     43049#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     43050
     43051#ifdef OPENSSL_EXTRA
     43052
    3910043053    int wolfSSL_X509_check_private_key(WOLFSSL_X509 *x509, WOLFSSL_EVP_PKEY *key)
    3910143054    {
    39102         (void) x509;
    39103         (void) key;
    3910443055        WOLFSSL_ENTER("wolfSSL_X509_check_private_key");
    39105         WOLFSSL_STUB("X509_check_private_key");
    39106 
    39107         return WOLFSSL_SUCCESS;
    39108     }
    39109 
    39110     WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list(
    39111         WOLF_STACK_OF(WOLFSSL_X509_NAME) *sk)
    39112     {
    39113         (void) sk;
    39114         WOLFSSL_ENTER("wolfSSL_dup_CA_list");
    39115         WOLFSSL_STUB("SSL_dup_CA_list");
    39116 
    39117         return NULL;
    39118     }
    39119 
    39120     #endif
    39121 
    39122 #endif /* OPENSSL_ALL || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE ||
    39123     HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */
    39124 #endif /* OPENSSL_EXTRA */
    39125 
    39126 #ifndef WOLFCRYPT_ONLY
    39127 
    39128 #ifdef OPENSSL_EXTRA
     43056
     43057        if (!x509 || !key) {
     43058            WOLFSSL_MSG("Bad parameter");
     43059            return WOLFSSL_FAILURE;
     43060        }
     43061
     43062        return wc_CheckPrivateKey((byte*)key->pkey.ptr, key->pkey_sz,
     43063                x509->pubKey.buffer, x509->pubKey.length,
     43064                (enum Key_Sum)x509->pubKeyOID) == 1 ?
     43065                        WOLFSSL_SUCCESS : WOLFSSL_FAILURE;
     43066    }
    3912943067
    3913043068/* wolfSSL uses negative values for error states. This function returns an
     
    3917943117#endif /* !NO_CERTS */
    3918043118
    39181 
    39182 #if defined(HAVE_EX_DATA) || defined(FORTRESS)
     43119#endif /* OPENSSL_EXTRA */
     43120
     43121#if ((defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && defined(HAVE_EX_DATA)) || \
     43122    defined(FORTRESS) || \
     43123    defined(WOLFSSL_WPAS_SMALL)
    3918343124void* wolfSSL_CTX_get_ex_data(const WOLFSSL_CTX* ctx, int idx)
    3918443125{
    3918543126    WOLFSSL_ENTER("wolfSSL_CTX_get_ex_data");
    39186     #ifdef HAVE_EX_DATA
     43127#ifdef HAVE_EX_DATA
    3918743128    if(ctx != NULL) {
    3918843129        return wolfSSL_CRYPTO_get_ex_data(&ctx->ex_data, idx);
    3918943130    }
    39190     #else
     43131#else
    3919143132    (void)ctx;
    3919243133    (void)idx;
    39193     #endif
     43134#endif
    3919443135    return NULL;
    3919543136}
     
    3924743188    return WOLFSSL_FAILURE;
    3924843189}
    39249 #endif
    39250 
     43190
     43191#endif /* ((OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) && HAVE_EX_DATA) || FORTRESS || WOLFSSL_WPAS_SMALL */
     43192
     43193#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    3925143194
    3925243195/* Returns char* to app data stored in ex[0].
     
    3926843211 * arg data to be stored
    3926943212 *
    39270  * Returns SSL_SUCCESS on success and SSL_FAILURE on failure
     43213 * Returns WOLFSSL_SUCCESS on success and SSL_FAILURE on failure
    3927143214 */
    3927243215int wolfSSL_set_app_data(WOLFSSL *ssl, void* arg) {
     
    3927643219}
    3927743220
     43221#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
     43222
     43223#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
     43224    defined(WOLFSSL_WPAS_SMALL)
    3927843225
    3927943226int wolfSSL_set_ex_data(WOLFSSL* ssl, int idx, void* data)
     
    3929443241}
    3929543242
    39296 
    39297 
    3929843243void* wolfSSL_get_ex_data(const WOLFSSL* ssl, int idx)
    3929943244{
     
    3931143256}
    3931243257
     43258#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
     43259
     43260#ifdef OPENSSL_EXTRA
     43261
    3931343262#ifndef NO_DSA
     43263#ifndef NO_BIO
    3931443264WOLFSSL_DSA *wolfSSL_PEM_read_bio_DSAparams(WOLFSSL_BIO *bp, WOLFSSL_DSA **x,
    3931543265        pem_password_cb *cb, void *u)
     
    3934243292    }
    3934343293
    39344     if ((ret = PemToDer(buf, (long)bufSz, DSA_PARAM_TYPE, &pDer, NULL, NULL,
    39345                     NULL)) < 0 ) {
     43294    if (PemToDer(buf, (long)bufSz, DSA_PARAM_TYPE, &pDer, NULL, NULL,
     43295                    NULL) < 0 ) {
    3934643296        WOLFSSL_MSG("Issue converting from PEM to DER");
    3934743297        return NULL;
    3934843298    }
    3934943299
    39350     if ((ret = GetSequence(pDer->buffer, &idx, &length, pDer->length)) < 0) {
     43300    if (GetSequence(pDer->buffer, &idx, &length, pDer->length) < 0) {
    3935143301        WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_DSAparams", ret);
    3935243302        FreeDer(&pDer);
     
    3940643356    return dsa;
    3940743357}
     43358#endif /* !NO_BIO */
    3940843359#endif /* NO_DSA */
    3940943360#endif /* OPENSSL_EXTRA */
    39410 #endif /* WOLFCRYPT_ONLY */
    3941143361
    3941243362#if defined(OPENSSL_EXTRA)
     
    3948143431/* End Functions for openssl/buffer.h */
    3948243432
     43433size_t wolfSSL_strlcpy(char *dst, const char *src, size_t dstSize)
     43434{
     43435    size_t i;
     43436
     43437    if (!dstSize || !dst || !src)
     43438        return 0;
     43439
     43440    /* Always have to leave a space for NULL */
     43441    for (i = 0; i < (dstSize - 1) && *src != '\0'; i++) {
     43442        *dst++ = *src++;
     43443    }
     43444    *dst = '\0';
     43445
     43446    return i; /* return length without NULL */
     43447}
     43448
     43449size_t wolfSSL_strlcat(char *dst, const char *src, size_t dstSize)
     43450{
     43451    size_t dstLen;
     43452
     43453    if (!dstSize)
     43454        return 0;
     43455
     43456    dstLen = XSTRLEN(dst);
     43457
     43458    if (dstSize < dstLen)
     43459        return dstLen + XSTRLEN(src);
     43460
     43461    return dstLen + wolfSSL_strlcpy(dst + dstLen, src, dstSize - dstLen);
     43462
     43463}
    3948343464#endif /* OPENSSL_EXTRA */
    3948443465
     
    3948743468    || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA)
    3948843469
     43470#ifndef NO_BIO
    3948943471WOLFSSL_BIO *wolfSSL_BIO_new_file(const char *filename, const char *mode)
    3949043472{
     
    3954143523}
    3954243524#endif
     43525#endif /* !NO_BIO */
    3954343526
    3954443527
    3954543528#ifndef NO_DH
     43529#ifndef NO_BIO
    3954643530WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x,
    3954743531        pem_password_cb *cb, void *u)
     
    3967343657#endif
    3967443658}
     43659#endif /* !NO_BIO */
    3967543660
    3967643661#ifndef NO_FILESYSTEM
     
    3975843743}
    3975943744
     43745#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))
    3976043746int wc_DhPubKeyToDer(DhKey*  key, byte* out, word32* outSz)
    3976143747{
     
    4002344009    return WOLFSSL_SUCCESS;
    4002444010}
     44011#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */
    4002544012#endif /* WOLFSSL_QT || OPENSSL_ALL */
    4002644013#endif /* !NO_FILESYSTEM */
    4002744014#endif /* !NO_DH */
     44015
     44016#ifndef NO_BIO
    4002844017
    4002944018#ifdef WOLFSSL_CERT_GEN
     
    4012644115    return WOLFSSL_SUCCESS;
    4012744116}
    40128 #endif /* WOLFSSL_CERT_GEN */
    4012944117
    4013044118int wolfSSL_PEM_write_bio_X509(WOLFSSL_BIO *bio, WOLFSSL_X509 *cert)
    4013144119{
    40132     byte* pem;
     44120    byte* pem = NULL;
    4013344121    int   pemSz = 0;
    40134     const unsigned char* der;
    40135     int derSz;
     44122    /* Get large buffer to hold cert der */
     44123    int derSz = X509_BUFFER_SZ;
     44124#ifdef WOLFSSL_SMALL_STACK
     44125    byte* der;
     44126#else
     44127    byte der[X509_BUFFER_SZ];
     44128#endif
    4013644129    int ret;
    4013744130
     
    4014344136    }
    4014444137
    40145     der = wolfSSL_X509_get_der(cert, &derSz);
    40146     if (der == NULL) {
     44138#ifdef WOLFSSL_SMALL_STACK
     44139    der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     44140    if (!der) {
     44141        WOLFSSL_MSG("malloc failed");
    4014744142        return WOLFSSL_FAILURE;
     44143    }
     44144#endif
     44145
     44146    if (wolfssl_x509_make_der(cert, 0, der, &derSz, 1) != WOLFSSL_SUCCESS) {
     44147        goto error;
    4014844148    }
    4014944149
     
    4015144151    pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE);
    4015244152    if (pemSz < 0) {
    40153         return WOLFSSL_FAILURE;
     44153        goto error;
    4015444154    }
    4015544155
     
    4015744157    pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    4015844158    if (pem == NULL) {
    40159         return WOLFSSL_FAILURE;
     44159        goto error;
    4016044160    }
    4016144161    if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) {
    40162         XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    40163         return WOLFSSL_FAILURE;
     44162        goto error;
    4016444163    }
    4016544164
     
    4017044169    if (ret <= 0) return WOLFSSL_FAILURE;
    4017144170    return WOLFSSL_SUCCESS;
    40172 }
    40173 
     44171
     44172error:
     44173    #ifdef WOLFSSL_SMALL_STACK
     44174    XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     44175    #endif
     44176    if (pem)
     44177        XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     44178    return WOLFSSL_FAILURE;
     44179}
     44180#endif /* WOLFSSL_CERT_GEN */
     44181
     44182#endif /* !NO_BIO */
    4017444183
    4017544184#if defined(OPENSSL_EXTRA) && !defined(NO_DH)
     
    4024544254    switch (cmd) {
    4024644255        #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
     44256        #ifdef HAVE_SNI
    4024744257        case SSL_CTRL_SET_TLSEXT_HOSTNAME:
    4024844258            WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME.");
    40249         #ifdef HAVE_SNI
    4025044259            if (pt == NULL) {
    4025144260                WOLFSSL_MSG("Passed in NULL Host Name.");
     
    4025344262            }
    4025444263            return wolfSSL_set_tlsext_host_name(ssl, (const char*) pt);
    40255         #else
    40256             WOLFSSL_MSG("SNI not enabled.");
    40257             break;
    4025844264        #endif /* HAVE_SNI */
    4025944265        #endif /* WOLFSSL_NGINX || WOLFSSL_QT || OPENSSL_ALL */
     
    4031444320        wolfSSL_sk_X509_free(ctx->x509Chain);
    4031544321        ctx->x509Chain = sk;
    40316         if (sk) {
     44322        if (sk && opt == 1) {
     44323            /* up all refs when opt == 1 */
    4031744324            for (i = 0; i < wolfSSL_sk_X509_num(sk); i++) {
    4031844325                x509 = wolfSSL_sk_X509_value(sk, i);
    40319                 /* On successful setting of new chain up all refs */
    4032044326                if (wolfSSL_X509_up_ref(x509) != 1) {
    4032144327                    WOLFSSL_MSG("Error increasing reference count");
     
    4042844434}
    4042944435
     44436#ifndef NO_BIO
     44437
    4043044438/* Creates a new bio pair.
    4043144439Returns WOLFSSL_SUCCESS if no error, WOLFSSL_FAILURE otherwise.*/
     
    4045544463    }
    4045644464    if (ret && writebuf1) {
    40457         if (!(ret = wolfSSL_BIO_set_write_buf_size(bio1, writebuf1))) {
     44465        if (!(ret = wolfSSL_BIO_set_write_buf_size(bio1, (long)writebuf1))) {
    4045844466            WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
    4045944467        }
    4046044468    }
    4046144469    if (ret && writebuf2) {
    40462         if (!(ret = wolfSSL_BIO_set_write_buf_size(bio2, writebuf2))) {
     44470        if (!(ret = wolfSSL_BIO_set_write_buf_size(bio2, (long)writebuf2))) {
    4046344471            WOLFSSL_MSG("wolfSSL_BIO_set_write_buf() failure");
    4046444472        }
     
    4049044498    int bioMemSz = 0;
    4049144499    WOLFSSL_RSA* key = NULL;
    40492     unsigned char maxKeyBuf[4096];
     44500    unsigned char *maxKeyBuf = NULL;
    4049344501    unsigned char* bufPtr = NULL;
    4049444502    unsigned char* extraBioMem = NULL;
     
    4050544513    (void)out;
    4050644514
    40507     bioMemSz = wolfSSL_BIO_pending(bio);
     44515    bioMemSz = wolfSSL_BIO_get_len(bio);
    4050844516    if (bioMemSz <= 0) {
    40509         WOLFSSL_MSG("wolfSSL_BIO_pending() failure");
     44517        WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
    4051044518        return NULL;
    4051144519    }
     
    4051744525    }
    4051844526
     44527    maxKeyBuf = (unsigned char*)XMALLOC(4096, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
     44528    if (maxKeyBuf == NULL) {
     44529        WOLFSSL_MSG("Malloc failure");
     44530        XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
     44531        return NULL;
     44532    }
    4051944533    bufPtr = maxKeyBuf;
    4052044534    if (wolfSSL_BIO_read(bio, (unsigned char*)bioMem, (int)bioMemSz) == bioMemSz) {
     
    4053944553                XFREE((unsigned char*)bioMem, bio->heap,
    4054044554                                                       DYNAMIC_TYPE_TMP_BUFFER);
     44555                XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
    4054144556                return NULL;
    4054244557            }
     
    4054844563
    4054944564            wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
    40550             if (wolfSSL_BIO_pending(bio) <= 0) {
     44565            if (wolfSSL_BIO_get_len(bio) <= 0) {
    4055144566                WOLFSSL_MSG("Failed to write memory to bio");
    4055244567                XFREE((unsigned char*)extraBioMem, bio->heap,
     
    4055444569                XFREE((unsigned char*)bioMem, bio->heap,
    4055544570                                                       DYNAMIC_TYPE_TMP_BUFFER);
     44571                XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
    4055644572                return NULL;
    4055744573            }
     
    4056544581    }
    4056644582    XFREE((unsigned char*)bioMem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
     44583    XFREE((unsigned char*)maxKeyBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER);
    4056744584    return key;
    4056844585}
    4056944586#endif
     44587
     44588#endif /* !NO_BIO */
    4057044589
    4057144590
     
    4059544614    int ret;
    4059644615    int derSize;
    40597     unsigned char maxDerBuf[4096];
     44616    unsigned char *maxDerBuf;
    4059844617    unsigned char* key = NULL;
    4059944618
     
    4060344622        WOLFSSL_MSG("one or more inputs were NULL");
    4060444623        return BAD_FUNC_ARG;
     44624    }
     44625    maxDerBuf = (unsigned char*)XMALLOC(4096, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     44626    if (maxDerBuf == NULL) {
     44627        WOLFSSL_MSG("Malloc failure");
     44628        return MEMORY_E;
    4060544629    }
    4060644630    key = maxDerBuf;
     
    4060844632    if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) {
    4060944633        WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure");
     44634        XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    4061044635        return WOLFSSL_FAILURE;
    4061144636    }
     
    4061444639    if (ret != WOLFSSL_SUCCESS) {
    4061544640        WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure");
     44641        XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    4061644642        return WOLFSSL_FAILURE;
    4061744643    }
     44644    XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
    4061844645    return ret;
    4061944646}
     
    4062144648
    4062244649
     44650#ifndef NO_BIO
    4062344651/* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure.
    4062444652Returns pointer to private EVP_PKEY struct upon success, NULL if there
     
    4064244670    (void)out;
    4064344671
    40644     memSz = wolfSSL_BIO_pending(bio);
     44672    memSz = wolfSSL_BIO_get_len(bio);
    4064544673    if (memSz <= 0) {
    40646         WOLFSSL_MSG("wolfSSL_BIO_pending() failure");
     44674        WOLFSSL_MSG("wolfSSL_BIO_get_len() failure");
    4064744675        return NULL;
    4064844676    }
     
    4068244710
    4068344711            wolfSSL_BIO_write(bio, extraBioMem, extraBioMemSz);
    40684             if (wolfSSL_BIO_pending(bio) <= 0) {
     44712            if (wolfSSL_BIO_get_len(bio) <= 0) {
    4068544713                WOLFSSL_MSG("Failed to write memory to bio");
    4068644714                XFREE((unsigned char*)extraBioMem, bio->heap,
     
    4070044728    return key;
    4070144729}
     44730#endif /* !NO_BIO */
    4070244731
    4070344732
     
    4081544844    (void)fp;
    4081644845}
    40817 #endif
    40818 
     44846#endif /* !NO_FILESYSTEM */
     44847
     44848#endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX ||
     44849    HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */
     44850
     44851
     44852#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || defined(FORTRESS)
    4081944853int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data)
    4082044854{
     
    4083144865    return WOLFSSL_FAILURE;
    4083244866}
     44867
     44868void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
     44869{
     44870    WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
     44871#ifdef HAVE_EX_DATA
     44872    if (session != NULL) {
     44873        return wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
     44874    }
     44875#else
     44876    (void)session;
     44877    (void)idx;
     44878#endif
     44879    return NULL;
     44880}
     44881#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || FORTRESS */
     44882
     44883#if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \
     44884                             defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \
     44885                             defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH)))
    4083344886
    4083444887
     
    4084844901    }
    4084944902    return WOLFSSL_FAILURE;
    40850 }
    40851 
    40852 
    40853 void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx)
    40854 {
    40855     WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data");
    40856 #ifdef HAVE_EX_DATA
    40857     if (session != NULL) {
    40858         return wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx);
    40859     }
    40860 #else
    40861     (void)session;
    40862     (void)idx;
    40863 #endif
    40864     return NULL;
    4086544903}
    4086644904
     
    4104645084}
    4104745085
    41048 
    41049 /* copies over data of "in" to "out" */
    41050 static void wolfSSL_CIPHER_copy(WOLFSSL_CIPHER* in, WOLFSSL_CIPHER* out)
    41051 {
    41052     if (in == NULL || out == NULL)
    41053         return;
    41054 
    41055     out->cipherSuite  = in->cipherSuite;
    41056     out->cipherSuite0 = in->cipherSuite0;
    41057 }
    41058 
    41059 
    41060 /* create duplicate of stack and return the new stack
    41061  * returns null on failure */
    41062 WOLF_STACK_OF(WOLFSSL_CIPHER)* wolfSSL_sk_SSL_CIPHER_dup(
    41063         WOLF_STACK_OF(WOLFSSL_CIPHER)* in)
    41064 {
    41065     WOLFSSL_STACK* current;
    41066     WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
    41067     int i, sz;
    41068 
    41069     sz = wolfSSL_sk_SSL_CIPHER_num(in);
    41070     current = in;
    41071     for (i = 0; i < sz && current != NULL; i++) {
    41072         WOLFSSL_STACK* add = wolfSSL_sk_new_node(in->heap);
    41073         if (add != NULL) {
    41074             add->type = STACK_TYPE_CIPHER;
    41075             wolfSSL_CIPHER_copy(&(current->data.cipher), &(add->data.cipher));
    41076             add->num = i+1;
    41077             add->next = ret;
    41078             ret = add;
    41079             current = current->next;
    41080         }
    41081     }
    41082     return ret;
    41083 }
    41084 
    4108545086/* nothing to do yet */
    4108645087static void wolfSSL_CIPHER_free(WOLFSSL_CIPHER* in)
     
    4114145142        sk->data.info = node->data.info;
    4114245143        sk->next = node->next;
    41143         XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL);
     45144        wolfSSL_sk_free_node(node);
    4114445145    }
    4114545146    else { /* last x509 in stack */
     
    4125445255    return sk;
    4125545256}
     45257
     45258
     45259/* Creates a duplicate of WOLF_STACK_OF(WOLFSSL_X509_NAME).
     45260 * Returns a new WOLF_STACK_OF(WOLFSSL_X509_NAME) or NULL on failure */
     45261WOLF_STACK_OF(WOLFSSL_X509_NAME) *wolfSSL_dup_CA_list(
     45262    WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk)
     45263{
     45264    int i;
     45265    const int num = wolfSSL_sk_X509_NAME_num(sk);
     45266    WOLF_STACK_OF(WOLFSSL_X509_NAME) *copy;
     45267    WOLFSSL_X509_NAME *name;
     45268
     45269    WOLFSSL_ENTER("wolfSSL_dup_CA_list");
     45270
     45271    copy = wolfSSL_sk_X509_NAME_new(NULL);
     45272    if (copy == NULL) {
     45273        WOLFSSL_MSG("Memory error");
     45274        return NULL;
     45275    }
     45276
     45277    for (i = 0; i < num; i++) {
     45278        name = wolfSSL_X509_NAME_dup(wolfSSL_sk_X509_NAME_value(sk, i));
     45279        if (name == NULL || 0 != wolfSSL_sk_X509_NAME_push(copy, name)) {
     45280            WOLFSSL_MSG("Memory error");
     45281            wolfSSL_sk_X509_NAME_pop_free(copy, wolfSSL_X509_NAME_free);
     45282            return NULL;
     45283        }
     45284    }
     45285
     45286    return copy;
     45287}
     45288
    4125645289
    4125745290int wolfSSL_sk_X509_NAME_push(WOLF_STACK_OF(WOLFSSL_X509_NAME)* sk,
     
    4145045483    XFREE(sk, sk->heap, DYNAMIC_TYPE_OPENSSL);
    4145145484}
     45485
     45486#ifndef NO_BIO
    4145245487
    4145345488#if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
     
    4150845543#if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX)
    4150945544    int count = 0, len = 0, totalSz = 0, tmpSz = 0;
    41510     char tmp[ASN_NAME_MAX];
     45545    char tmp[ASN_NAME_MAX+1];
    4151145546    char fullName[ASN_NAME_MAX];
    4151245547    const char *buf = NULL;
     
    4155045585                /* tmpSz+1 for last null char */
    4155145586                XSNPRINTF(tmp, tmpSz+1, "%s=%s,", buf, str->data);
    41552                 XSTRNCAT(fullName, tmp, tmpSz);
     45587                XSTRNCAT(fullName, tmp, tmpSz+1);
    4155345588            }
    4155445589            else {
     
    4157545610    return WOLFSSL_SUCCESS;
    4157645611}
     45612#endif /* !NO_BIO */
     45613
     45614#ifndef NO_FILESYSTEM
     45615int wolfSSL_X509_NAME_print_ex_fp(XFILE file, WOLFSSL_X509_NAME* name,
     45616        int indent, unsigned long flags)
     45617{
     45618    WOLFSSL_BIO* bio;
     45619    int ret;
     45620
     45621    WOLFSSL_ENTER("wolfSSL_X509_NAME_print_ex_fp");
     45622
     45623    if (!(bio = wolfSSL_BIO_new_fp(file, BIO_NOCLOSE))) {
     45624        WOLFSSL_MSG("wolfSSL_BIO_new_fp error");
     45625        return WOLFSSL_FAILURE;
     45626    }
     45627
     45628    ret = wolfSSL_X509_NAME_print_ex(bio, name, indent, flags);
     45629
     45630    wolfSSL_BIO_free(bio);
     45631
     45632    return ret;
     45633}
     45634#endif
    4157745635
    4157845636#ifndef NO_WOLFSSL_STUB
     
    4168245740
    4168345741
     45742#ifdef HAVE_SNI
     45743
    4168445744void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb)
    4168545745{
     
    4171045770}
    4171145771
     45772#endif /* HAVE_SNI */
     45773
     45774
     45775#ifndef NO_BIO
    4171245776void wolfSSL_ERR_load_BIO_strings(void) {
    4171345777    WOLFSSL_ENTER("ERR_load_BIO_strings");
    4171445778    /* do nothing */
    4171545779}
     45780#endif
    4171645781
    4171745782#ifndef NO_WOLFSSL_STUB
     
    4178245847#if defined(OPENSSL_EXTRA)
    4178345848
     45849int wolfSSL_CRYPTO_memcmp(const void *a, const void *b, size_t size)
     45850{
     45851    if (!a || !b)
     45852        return 0;
     45853    return ConstantCompare((const byte*)a, (const byte*)b, (int)size);
     45854}
     45855
    4178445856int wolfSSL_sk_X509_num(const WOLF_STACK_OF(WOLFSSL_X509) *s)
    4178545857{
     
    4183745909#if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \
    4183845910    !defined(NO_FILESYSTEM)
     45911
     45912#ifndef NO_BIO
    4183945913
    4184045914#if defined(SESSION_CERTS) || \
     
    4199646070#endif
    4199746071
     46072#if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \
     46073        defined(HAVE_EXT_CACHE))
    4199846074    if (wolfSSL_BIO_printf(bp, "    Start Time: %ld\n",
    4199946075                wolfSSL_SESSION_get_time(x)) <= 0)
     
    4200346079            wolfSSL_SESSION_get_timeout(x)) <= 0)
    4200446080        return WOLFSSL_FAILURE;
     46081#endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */
    4200546082
    4200646083    /* @TODO verify return code print */
     
    4201246089    return WOLFSSL_SUCCESS;
    4201346090}
     46091
     46092#endif /* !NO_BIO */
    4201446093#endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */
    4201546094
     
    4201946098    || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX)
    4202046099
    42021 int wolfSSL_CTX_get_verify_mode(WOLFSSL_CTX* ctx)
     46100/* TODO: Doesn't currently track SSL_VERIFY_CLIENT_ONCE */
     46101int wolfSSL_get_verify_mode(const WOLFSSL* ssl) {
     46102    int mode = 0;
     46103    WOLFSSL_ENTER("wolfSSL_get_verify_mode");
     46104
     46105    if (!ssl) {
     46106        return WOLFSSL_FAILURE;
     46107    }
     46108
     46109    if (ssl->options.verifyNone) {
     46110        mode = WOLFSSL_VERIFY_NONE;
     46111    }
     46112    else {
     46113        if (ssl->options.verifyPeer) {
     46114            mode |= WOLFSSL_VERIFY_PEER;
     46115        }
     46116        if (ssl->options.failNoCert) {
     46117            mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
     46118        }
     46119        if (ssl->options.failNoCertxPSK) {
     46120            mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
     46121        }
     46122    }
     46123
     46124    WOLFSSL_LEAVE("wolfSSL_get_verify_mode", mode);
     46125    return mode;
     46126}
     46127
     46128int wolfSSL_CTX_get_verify_mode(const WOLFSSL_CTX* ctx)
    4202246129{
    4202346130    int mode = 0;
    4202446131    WOLFSSL_ENTER("wolfSSL_CTX_get_verify_mode");
    4202546132
    42026     if(!ctx)
    42027         return WOLFSSL_FATAL_ERROR;
    42028 
    42029     if (ctx->verifyPeer)
    42030         mode |= WOLFSSL_VERIFY_PEER;
    42031     else if (ctx->verifyNone)
    42032         mode |= WOLFSSL_VERIFY_NONE;
    42033 
    42034     if (ctx->failNoCert)
    42035         mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
    42036 
    42037     if (ctx->failNoCertxPSK)
    42038         mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
     46133    if (!ctx) {
     46134        return WOLFSSL_FAILURE;
     46135    }
     46136
     46137    if (ctx->verifyNone) {
     46138        mode = WOLFSSL_VERIFY_NONE;
     46139    }
     46140    else {
     46141        if (ctx->verifyPeer) {
     46142            mode |= WOLFSSL_VERIFY_PEER;
     46143        }
     46144        if (ctx->failNoCert) {
     46145            mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT;
     46146        }
     46147        if (ctx->failNoCertxPSK) {
     46148            mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK;
     46149        }
     46150    }
    4203946151
    4204046152    WOLFSSL_LEAVE("wolfSSL_CTX_get_verify_mode", mode);
     
    4264146753    }
    4264246754
    42643     if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY)
     46755    if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY)
    4264446756        WOLFSSL_MSG("wc_curve448_shared_secret_ex failed");
    4264546757    else
     
    4269346805
    4269446806    if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check,
    42695                                    &key)) != MP_OKAY) {
     46807                                   &key, NULL, 0)) != MP_OKAY) {
    4269646808        WOLFSSL_MSG("wc_ed448_verify_msg failed");
    4269746809    }
     
    4278846900
    4278946901        while (1) {
    42790             if ((ret = wc_PeekErrorNode(-1, file, NULL, line)) < 0) {
     46902            ret = wc_PeekErrorNode(-1, file, NULL, line);
     46903            if (ret == BAD_MUTEX_E || ret == BAD_FUNC_ARG || ret == BAD_STATE_E) {
    4279146904                WOLFSSL_MSG("Issue peeking at error node in queue");
    4279246905                return 0;
     
    4279946912            if (ret == -ASN_NO_PEM_HEADER)
    4280046913                return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE;
    42801             if (ret != WANT_READ && ret != WANT_WRITE &&
    42802                     ret != ZERO_RETURN && ret != WOLFSSL_ERROR_ZERO_RETURN &&
    42803                     ret != SOCKET_PEER_CLOSED_E && ret != SOCKET_ERROR_E)
     46914            if (ret != -WANT_READ && ret != -WANT_WRITE &&
     46915                    ret != -ZERO_RETURN && ret != -WOLFSSL_ERROR_ZERO_RETURN &&
     46916                    ret != -SOCKET_PEER_CLOSED_E && ret != -SOCKET_ERROR_E)
    4280446917                break;
    4280546918
     
    4281646929
    4281746930#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
     46931
     46932
     46933/* Is the specified cipher suite a fake one used an an extension proxy? */
     46934static WC_INLINE int SCSV_Check(byte suite0, byte suite)
     46935{
     46936    (void)suite0;
     46937    (void)suite;
     46938#ifdef HAVE_RENEGOTIATION_INDICATION
     46939    if (suite0 == CIPHER_BYTE && suite == TLS_EMPTY_RENEGOTIATION_INFO_SCSV)
     46940        return 1;
     46941#endif
     46942#ifdef BUILD_TLS_QSH
     46943    /* This isn't defined as a SCSV, but it acts like one. */
     46944    if (suite0 == QSH_BYTE && suite == TLS_QSH)
     46945        return 1;
     46946#endif
     46947    return 0;
     46948}
     46949
     46950static WC_INLINE int sslCipherMinMaxCheck(const WOLFSSL *ssl, byte suite0,
     46951        byte suite)
     46952{
     46953    const CipherSuiteInfo* cipher_names = GetCipherNames();
     46954    int cipherSz = GetCipherNamesSize();
     46955    int i;
     46956    for (i = 0; i < cipherSz; i++)
     46957        if (cipher_names[i].cipherSuite0 == suite0 &&
     46958                cipher_names[i].cipherSuite == suite)
     46959            break;
     46960    if (i == cipherSz)
     46961        return 1;
     46962    /* Check min version */
     46963    if (cipher_names[i].minor < ssl->options.minDowngrade) {
     46964        if (ssl->options.minDowngrade <= TLSv1_2_MINOR &&
     46965                cipher_names[i].minor >= TLSv1_MINOR)
     46966            /* 1.0 ciphersuites are in general available in 1.1 and
     46967             * 1.1 ciphersuites are in general available in 1.2 */
     46968            return 0;
     46969        return 1;
     46970    }
     46971    /* Check max version */
     46972    switch (cipher_names[i].minor) {
     46973    case SSLv3_MINOR :
     46974        return ssl->options.mask & WOLFSSL_OP_NO_SSLv3;
     46975    case TLSv1_MINOR :
     46976        return ssl->options.mask & WOLFSSL_OP_NO_TLSv1;
     46977    case TLSv1_1_MINOR :
     46978        return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1;
     46979    case TLSv1_2_MINOR :
     46980        return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2;
     46981    case TLSv1_3_MINOR :
     46982        return ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3;
     46983    default:
     46984        WOLFSSL_MSG("Unrecognized minor version");
     46985        return 1;
     46986    }
     46987}
    4281846988
    4281946989/* returns a pointer to internal cipher suite list. Should not be free'd by
     
    4282446994    WOLF_STACK_OF(WOLFSSL_CIPHER)* ret = NULL;
    4282546995    Suites* suites;
     46996#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
     46997    const CipherSuiteInfo* cipher_names = GetCipherNames();
     46998    int cipherSz = GetCipherNamesSize();
     46999#endif
    4282647000
    4282747001    WOLFSSL_ENTER("wolfSSL_get_ciphers_compat");
     
    4283147005
    4283247006    if (ssl->suites != NULL) {
     47007        if (ssl->suites->suiteSz == 0 &&
     47008                InitSSL_Suites((WOLFSSL*)ssl) != WOLFSSL_SUCCESS) {
     47009            WOLFSSL_MSG("Suite initialization failure");
     47010            return NULL;
     47011        }
    4283347012        suites = ssl->suites;
    4283447013    }
     
    4284047019    if (suites->stack == NULL) {
    4284147020        int i;
     47021#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
     47022        int j;
     47023#endif
    4284247024        for (i = 0; i < suites->suiteSz; i+=2) {
    42843             WOLFSSL_STACK* add = wolfSSL_sk_new_node(ssl->heap);
     47025            WOLFSSL_STACK* add;
     47026
     47027            /* A couple of suites are placeholders for special options,
     47028             * skip those. */
     47029            if (SCSV_Check(suites->suites[i], suites->suites[i+1])
     47030                    || sslCipherMinMaxCheck(ssl, suites->suites[i],
     47031                                            suites->suites[i+1])) {
     47032                continue;
     47033            }
     47034
     47035            add = wolfSSL_sk_new_node(ssl->heap);
    4284447036            if (add != NULL) {
    4284547037                add->type = STACK_TYPE_CIPHER;
    4284647038                add->data.cipher.cipherSuite0 = suites->suites[i];
    4284747039                add->data.cipher.cipherSuite  = suites->suites[i+1];
     47040                add->data.cipher.ssl          = ssl;
     47041#if defined(OPENSSL_ALL) || defined(WOLFSSL_QT)
     47042                for (j = 0; j < cipherSz; j++) {
     47043                    if (cipher_names[j].cipherSuite0 ==
     47044                            add->data.cipher.cipherSuite0 &&
     47045                            cipher_names[j].cipherSuite ==
     47046                                    add->data.cipher.cipherSuite) {
     47047                        add->data.cipher.offset = j;
     47048                        break;
     47049                    }
     47050                }
     47051#endif
    4284847052                #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL)
    4284947053                /* in_stack is checked in wolfSSL_CIPHER_description */
    42850                 add->data.cipher.in_stack = 1;
     47054                add->data.cipher.in_stack     = 1;
    4285147055                #endif
    4285247056
     
    4287747081#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
    4287847082    || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
     47083
    4287947084int wolfSSL_X509_get_ex_new_index(int idx, void *arg, void *a, void *b, void *c)
    4288047085{
     
    4289047095    return x509_idx++;
    4289147096}
    42892 
     47097#endif
     47098
     47099#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \
     47100    defined(WOLFSSL_WPAS_SMALL)
    4289347101#if defined(HAVE_EX_DATA) || defined(FORTRESS)
    4289447102void* wolfSSL_CRYPTO_get_ex_data(const WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx)
     
    4292147129    return WOLFSSL_FAILURE;
    4292247130}
    42923 #endif /* defined(HAVE_EX_DATA) || defined(FORTRESS) */
     47131#endif /* HAVE_EX_DATA || FORTRESS */
    4292447132
    4292547133void *wolfSSL_X509_get_ex_data(X509 *x509, int idx)
    4292647134{
    4292747135    WOLFSSL_ENTER("wolfSSL_X509_get_ex_data");
    42928     #ifdef HAVE_EX_DATA
     47136#ifdef HAVE_EX_DATA
    4292947137    if (x509 != NULL) {
    4293047138        return wolfSSL_CRYPTO_get_ex_data(&x509->ex_data, idx);
    4293147139    }
    42932     #else
     47140#else
    4293347141    (void)x509;
    4293447142    (void)idx;
    42935     #endif
     47143#endif
    4293647144    return NULL;
    4293747145}
     
    4294047148{
    4294147149    WOLFSSL_ENTER("wolfSSL_X509_set_ex_data");
    42942     #ifdef HAVE_EX_DATA
     47150#ifdef HAVE_EX_DATA
    4294347151    if (x509 != NULL)
    4294447152    {
    4294547153        return wolfSSL_CRYPTO_set_ex_data(&x509->ex_data, idx, data);
    4294647154    }
    42947     #else
     47155#else
    4294847156    (void)x509;
    4294947157    (void)idx;
    4295047158    (void)data;
    42951     #endif
     47159#endif
    4295247160    return WOLFSSL_FAILURE;
    4295347161}
     47162#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || WOLFSSL_WPAS_SMALL */
     47163
     47164
     47165#ifndef NO_ASN
     47166int wolfSSL_X509_check_host(WOLFSSL_X509 *x, const char *chk, size_t chklen,
     47167                    unsigned int flags, char **peername)
     47168{
     47169    int         ret;
     47170    DecodedCert dCert;
     47171
     47172    WOLFSSL_ENTER("wolfSSL_X509_check_host");
     47173
     47174    /* flags and peername not needed for Nginx. */
     47175    (void)flags;
     47176    (void)peername;
     47177
     47178    if ((x == NULL) || (chk == NULL)) {
     47179        WOLFSSL_MSG("Invalid parameter");
     47180        return WOLFSSL_FAILURE;
     47181    }
     47182
     47183    if (flags == WOLFSSL_NO_WILDCARDS) {
     47184        WOLFSSL_MSG("X509_CHECK_FLAG_NO_WILDCARDS not yet implemented");
     47185        return WOLFSSL_FAILURE;
     47186    }
     47187
     47188    InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
     47189    ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
     47190    if (ret != 0) {
     47191        FreeDecodedCert(&dCert);
     47192        return WOLFSSL_FAILURE;
     47193    }
     47194
     47195    ret = CheckHostName(&dCert, (char *)chk, chklen);
     47196    FreeDecodedCert(&dCert);
     47197    if (ret != 0)
     47198        return WOLFSSL_FAILURE;
     47199    return WOLFSSL_SUCCESS;
     47200}
     47201
     47202
     47203int wolfSSL_X509_check_ip_asc(WOLFSSL_X509 *x, const char *ipasc,
     47204        unsigned int flags)
     47205{
     47206    int ret = WOLFSSL_FAILURE;
     47207    DecodedCert dCert;
     47208
     47209    WOLFSSL_ENTER("wolfSSL_X509_check_ip_asc");
     47210
     47211    /* flags not yet implemented */
     47212    (void)flags;
     47213
     47214    if ((x == NULL) || (x->derCert == NULL) || (ipasc == NULL)) {
     47215        WOLFSSL_MSG("Invalid parameter");
     47216    }
     47217    else {
     47218        ret = WOLFSSL_SUCCESS;
     47219    }
     47220
     47221    if (ret == WOLFSSL_SUCCESS) {
     47222        InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
     47223        ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
     47224        if (ret != 0) {
     47225            ret = WOLFSSL_FAILURE;
     47226        }
     47227        else {
     47228            ret = CheckIPAddr(&dCert, ipasc);
     47229            if (ret != 0) {
     47230                ret = WOLFSSL_FAILURE;
     47231            }
     47232            else {
     47233                ret = WOLFSSL_SUCCESS;
     47234            }
     47235        }
     47236        FreeDecodedCert(&dCert);
     47237    }
     47238
     47239    return ret;
     47240}
     47241#endif
     47242
     47243#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \
     47244    || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY)
    4295447245
    4295547246int wolfSSL_X509_NAME_digest(const WOLFSSL_X509_NAME *name,
     
    4296247253
    4296347254#if !defined(NO_FILESYSTEM) && !defined(NO_PWDBASED)
    42964     return wolfSSL_EVP_Digest((unsigned char*)name->fullName.fullName,
    42965                               name->fullName.fullNameLen, md, len, type, NULL);
     47255    return wolfSSL_EVP_Digest((unsigned char*)name->name,
     47256                              name->sz, md, len, type, NULL);
    4296647257#else
    4296747258    (void)md;
     
    4303047321}
    4303147322
     47323#ifndef NO_BIO
    4303247324BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s)
    4303347325{
     
    4313047422#endif /* NO_SESSION_CACHE */
    4313147423
    43132 int wolfSSL_X509_check_host(X509 *x, const char *chk, size_t chklen,
    43133                     unsigned int flags, char **peername)
    43134 {
    43135     int         ret;
    43136     DecodedCert dCert;
    43137 
    43138     WOLFSSL_ENTER("wolfSSL_X509_check_host");
    43139 
    43140     /* flags and peername not needed for Nginx. */
    43141     (void)flags;
    43142     (void)peername;
    43143 
    43144     if (flags == WOLFSSL_NO_WILDCARDS) {
    43145         WOLFSSL_MSG("X509_CHECK_FLAG_NO_WILDCARDS not yet implemented");
     47424int wolfSSL_a2i_ASN1_INTEGER(WOLFSSL_BIO *bio, WOLFSSL_ASN1_INTEGER *asn1,
     47425        char *buf, int size)
     47426{
     47427    int readNextLine;
     47428    int lineLen;
     47429    int len;
     47430    byte isNumCheck;
     47431    word32 outLen;
     47432    const int extraTagSz = MAX_LENGTH_SZ + 1;
     47433    byte intTag[MAX_LENGTH_SZ + 1];
     47434    int idx = 0;
     47435
     47436    WOLFSSL_ENTER("wolfSSL_a2i_ASN1_INTEGER");
     47437
     47438    if (!bio || !asn1 || !buf || size <= 0) {
     47439        WOLFSSL_MSG("Bad parameter");
    4314647440        return WOLFSSL_FAILURE;
    4314747441    }
    4314847442
    43149     InitDecodedCert(&dCert, x->derCert->buffer, x->derCert->length, NULL);
    43150     ret = ParseCertRelative(&dCert, CERT_TYPE, 0, NULL);
    43151     if (ret != 0) {
    43152         FreeDecodedCert(&dCert);
    43153         return WOLFSSL_FAILURE;
    43154     }
    43155 
    43156     ret = CheckHostName(&dCert, (char *)chk, chklen);
    43157     FreeDecodedCert(&dCert);
    43158     if (ret != 0)
    43159         return WOLFSSL_FAILURE;
     47443    /* Reset asn1 */
     47444    if (asn1->isDynamic && asn1->data) {
     47445        XFREE(asn1->data, NULL, DYNAMIC_TYPE_OPENSSL);
     47446        asn1->isDynamic = 0;
     47447    }
     47448    XMEMSET(asn1->intData, 0, sizeof(WOLFSSL_ASN1_INTEGER));
     47449    asn1->data = asn1->intData;
     47450    asn1->length = 0;
     47451    asn1->negative = 0;
     47452    asn1->type = V_ASN1_INTEGER;
     47453
     47454    lineLen = wolfSSL_BIO_gets(bio, buf, size);
     47455    do {
     47456        readNextLine = 0;
     47457        if (lineLen <= 0) {
     47458            WOLFSSL_MSG("wolfSSL_BIO_gets error");
     47459            return WOLFSSL_FAILURE;
     47460        }
     47461        while (lineLen && (buf[lineLen-1] == '\n' || buf[lineLen-1] == '\r'))
     47462            lineLen--;
     47463        if (buf[lineLen-1] == '\\')
     47464            readNextLine = 1;
     47465        /* Ignore none-hex chars at the end of the line */
     47466        outLen = 1;
     47467        while (lineLen && Base16_Decode((byte*)buf + lineLen - 1, 1,
     47468                &isNumCheck, &outLen) == ASN_INPUT_E)
     47469            lineLen--;
     47470        if (!lineLen || lineLen % 2) {
     47471            WOLFSSL_MSG("Invalid line length");
     47472            return WOLFSSL_FAILURE;
     47473        }
     47474        len = asn1->length + (lineLen/2);
     47475        /* Check if it will fit in static memory and
     47476         * save space for the ASN tag in front */
     47477        if (len > (int)(sizeof(asn1->intData) - extraTagSz)) {
     47478            /* Allocate mem for data */
     47479            if (asn1->isDynamic) {
     47480                byte* tmp = (byte*)XREALLOC(asn1->data, len + extraTagSz, NULL,
     47481                        DYNAMIC_TYPE_OPENSSL);
     47482                if (!tmp) {
     47483                    WOLFSSL_MSG("realloc error");
     47484                    return WOLFSSL_FAILURE;
     47485                }
     47486                asn1->data = tmp;
     47487            }
     47488            else {
     47489                asn1->data = (byte*)XMALLOC(len + extraTagSz, NULL,
     47490                        DYNAMIC_TYPE_OPENSSL);
     47491                if (!asn1->data) {
     47492                    WOLFSSL_MSG("malloc error");
     47493                    return WOLFSSL_FAILURE;
     47494                }
     47495                XMEMCPY(asn1->data, asn1->intData, asn1->length);
     47496            }
     47497        }
     47498        len = lineLen/2;
     47499        if (Base16_Decode((byte*)buf, lineLen, asn1->data + asn1->length,
     47500                (word32*)&len) != 0) {
     47501            WOLFSSL_MSG("Base16_Decode error");
     47502            return WOLFSSL_FAILURE;
     47503        }
     47504        asn1->length += len;
     47505    } while (readNextLine);
     47506
     47507    /* Write ASN tag */
     47508    idx = SetASNInt(asn1->length, asn1->data[0], intTag);
     47509    XMEMMOVE(asn1->data + idx, asn1->data, asn1->length);
     47510    XMEMCPY(asn1->data, intTag, idx);
     47511    asn1->dataMax = asn1->length += idx;
     47512
    4316047513    return WOLFSSL_SUCCESS;
    4316147514}
     
    4316347516int wolfSSL_i2a_ASN1_INTEGER(BIO *bp, const WOLFSSL_ASN1_INTEGER *a)
    4316447517{
    43165     static char num[16] = { '0', '1', '2', '3', '4', '5', '6', '7',
    43166                             '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    43167     int    i;
    43168     word32 j;
    43169     word32 len = 0;
     47518    word32 idx = 1;
     47519    int len = 0;
     47520    byte buf[512];
     47521    word32 bufLen = 512;
    4317047522
    4317147523    WOLFSSL_ENTER("wolfSSL_i2a_ASN1_INTEGER");
     
    4317547527
    4317647528    /* Skip ASN.1 INTEGER (type) byte. */
    43177     i = 1;
    43178     /* When indefinite length, can't determine length with data available. */
    43179     if (a->data[i] == 0x80)
     47529    if (a->data[idx] == 0x80 || /* Indefinite length, can't determine length */
     47530            GetLength(a->data, &idx, &len, a->length) < 0) {
    4318047531        return 0;
    43181     /* One length byte if less than 0x80. */
    43182     if (a->data[i] < 0x80)
    43183         len = a->data[i++];
    43184     /* Multiple length byte if greater than 0x80. */
    43185     else if (a->data[i] > 0x80) {
    43186         switch (a->data[i++] - 0x80) {
    43187             case 4:
    43188                 len |= a->data[i++] << 24;
    43189                 FALL_THROUGH;
    43190             case 3:
    43191                 len |= a->data[i++] << 16;
    43192                 FALL_THROUGH;
    43193             case 2:
    43194                 len |= a->data[i++] <<  8;
    43195                 FALL_THROUGH;
    43196             case 1:
    43197                 len |= a->data[i++];
    43198                 break;
    43199             default:
    43200                 /* Not supporting greater than 4 bytes of length. */
    43201                 return 0;
    43202         }
    4320347532    }
    4320447533
     
    4320947538    }
    4321047539
    43211     /* Don't do negative - just write out every byte. */
    43212     for (j = 0; j < len; i++,j++) {
    43213         wolfSSL_BIO_write(bp, &num[a->data[i] >> 4], 1);
    43214         wolfSSL_BIO_write(bp, &num[a->data[i] & 0xf], 1);
    43215     }
    43216 
    43217     /* Two nibbles written for each byte. */
    43218     return len * 2;
    43219 }
     47540    if (Base16_Encode(a->data + idx, len, buf, &bufLen) != 0 ||
     47541            bufLen <= 0) {
     47542        return 0;
     47543    }
     47544
     47545    return wolfSSL_BIO_write(bp, buf, bufLen - 1); /* Don't write out NULL char */
     47546}
     47547#endif /* !NO_BIO */
    4322047548
    4322147549
     
    4334447672    return WOLFSSL_SUCCESS;
    4334547673}
     47674
    4334647675#endif /* HAVE_SESSION_TICKET */
    4334747676
    4334847677#endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY ||
    4334947678    OPENSSL_EXTRA || HAVE_LIGHTY */
     47679
     47680#if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \
     47681    !defined(NO_WOLFSSL_SERVER)
     47682/* Serialize the session ticket encryption keys.
     47683 *
     47684 * @param [in]  ctx     SSL/TLS context object.
     47685 * @param [in]  keys    Buffer to hold session ticket keys.
     47686 * @param [in]  keylen  Length of buffer.
     47687 * @return  WOLFSSL_SUCCESS on success.
     47688 * @return  WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
     47689 *          correct length.
     47690 */
     47691long wolfSSL_CTX_get_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
     47692     unsigned char *keys, int keylen)
     47693{
     47694    if (ctx == NULL || keys == NULL) {
     47695        return WOLFSSL_FAILURE;
     47696    }
     47697    if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
     47698        return WOLFSSL_FAILURE;
     47699    }
     47700
     47701    XMEMCPY(keys, ctx->ticketKeyCtx.name, WOLFSSL_TICKET_NAME_SZ);
     47702    keys += WOLFSSL_TICKET_NAME_SZ;
     47703    XMEMCPY(keys, ctx->ticketKeyCtx.key[0], WOLFSSL_TICKET_KEY_SZ);
     47704    keys += WOLFSSL_TICKET_KEY_SZ;
     47705    XMEMCPY(keys, ctx->ticketKeyCtx.key[1], WOLFSSL_TICKET_KEY_SZ);
     47706    keys += WOLFSSL_TICKET_KEY_SZ;
     47707    c32toa(ctx->ticketKeyCtx.expirary[0], keys);
     47708    keys += OPAQUE32_LEN;
     47709    c32toa(ctx->ticketKeyCtx.expirary[1], keys);
     47710
     47711    return WOLFSSL_SUCCESS;
     47712}
     47713
     47714/* Deserialize the session ticket encryption keys.
     47715 *
     47716 * @param [in]  ctx     SSL/TLS context object.
     47717 * @param [in]  keys    Session ticket keys.
     47718 * @param [in]  keylen  Length of data.
     47719 * @return  WOLFSSL_SUCCESS on success.
     47720 * @return  WOLFSSL_FAILURE when ctx is NULL, keys is NULL or keylen is not the
     47721 *          correct length.
     47722 */
     47723long wolfSSL_CTX_set_tlsext_ticket_keys(WOLFSSL_CTX *ctx,
     47724     unsigned char *keys, int keylen)
     47725{
     47726    if (ctx == NULL || keys == NULL) {
     47727        return WOLFSSL_FAILURE;
     47728    }
     47729    if (keylen != WOLFSSL_TICKET_KEYS_SZ) {
     47730        return WOLFSSL_FAILURE;
     47731    }
     47732
     47733    XMEMCPY(ctx->ticketKeyCtx.name, keys, WOLFSSL_TICKET_NAME_SZ);
     47734    keys += WOLFSSL_TICKET_NAME_SZ;
     47735    XMEMCPY(ctx->ticketKeyCtx.key[0], keys, WOLFSSL_TICKET_KEY_SZ);
     47736    keys += WOLFSSL_TICKET_KEY_SZ;
     47737    XMEMCPY(ctx->ticketKeyCtx.key[1], keys, WOLFSSL_TICKET_KEY_SZ);
     47738    keys += WOLFSSL_TICKET_KEY_SZ;
     47739    ato32(keys, &ctx->ticketKeyCtx.expirary[0]);
     47740    keys += OPAQUE32_LEN;
     47741    ato32(keys, &ctx->ticketKeyCtx.expirary[1]);
     47742
     47743    return WOLFSSL_SUCCESS;
     47744}
     47745#endif
    4335047746
    4335147747#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
     
    4337447770}
    4337547771#endif /* OCSP */
    43376 #endif /* OPENSSL_ALL / WOLFSSL_NGINX  / WOLFSSL_HAPROXY */
     47772#endif /* OPENSSL_ALL || WOLFSSL_NGINX  || WOLFSSL_HAPROXY */
     47773
     47774#if defined(HAVE_OCSP) && !defined(NO_ASN_TIME)
     47775int wolfSSL_get_ocsp_producedDate(
     47776    WOLFSSL *ssl,
     47777    byte *producedDate,
     47778    size_t producedDate_space,
     47779    int *producedDateFormat)
     47780{
     47781    if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
     47782        (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
     47783        return BAD_FUNC_ARG;
     47784
     47785    if ((producedDate == NULL) || (producedDateFormat == NULL))
     47786        return BAD_FUNC_ARG;
     47787
     47788    if (XSTRLEN((char *)ssl->ocspProducedDate) >= producedDate_space)
     47789        return BUFFER_E;
     47790
     47791    XSTRNCPY((char *)producedDate, (const char *)ssl->ocspProducedDate, producedDate_space);
     47792    *producedDateFormat = ssl->ocspProducedDateFormat;
     47793
     47794    return 0;
     47795}
     47796
     47797int wolfSSL_get_ocsp_producedDate_tm(WOLFSSL *ssl, struct tm *produced_tm) {
     47798    int idx = 0;
     47799
     47800    if ((ssl->ocspProducedDateFormat != ASN_UTC_TIME) &&
     47801        (ssl->ocspProducedDateFormat != ASN_GENERALIZED_TIME))
     47802        return BAD_FUNC_ARG;
     47803
     47804    if (produced_tm == NULL)
     47805        return BAD_FUNC_ARG;
     47806
     47807    if (ExtractDate(ssl->ocspProducedDate, ssl->ocspProducedDateFormat, produced_tm, &idx))
     47808        return 0;
     47809    else
     47810        return ASN_PARSE_E;
     47811}
     47812#endif
     47813
    4337747814
    4337847815#if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \
     
    4359548032}
    4359648033
    43597 WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
    43598 {
    43599     return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length);
    43600 }
    43601 
    43602 char* wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
     48034WOLF_STACK_OF(WOLFSSL_STRING)* wolfSSL_sk_WOLFSSL_STRING_new(void)
     48035{
     48036    WOLF_STACK_OF(WOLFSSL_STRING)* ret = wolfSSL_sk_new_node(NULL);
     48037
     48038    if (ret) {
     48039        ret->type = STACK_TYPE_STRING;
     48040    }
     48041
     48042    return ret;
     48043}
     48044
     48045void wolfSSL_sk_WOLFSSL_STRING_free(WOLF_STACK_OF(WOLFSSL_STRING)* sk)
     48046{
     48047    WOLFSSL_STACK* tmp;
     48048    WOLFSSL_ENTER("wolfSSL_sk_WOLFSSL_STRING_free");
     48049
     48050    if (sk == NULL)
     48051        return;
     48052
     48053    /* parse through stack freeing each node */
     48054    while (sk) {
     48055        tmp = sk->next;
     48056        XFREE(sk->data.string, NULL, DYNAMIC_TYPE_OPENSSL);
     48057        XFREE(sk, NULL, DYNAMIC_TYPE_OPENSSL);
     48058        sk = tmp;
     48059    }
     48060}
     48061
     48062WOLFSSL_STRING wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings,
    4360348063    int idx)
    4360448064{
     
    4360948069    return strings->data.string;
    4361048070}
     48071
     48072int wolfSSL_sk_WOLFSSL_STRING_num(WOLF_STACK_OF(WOLFSSL_STRING)* strings)
     48073{
     48074    if (strings)
     48075        return (int)strings->num;
     48076    return 0;
     48077}
    4361148078#endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA || OPENSSL_ALL */
    4361248079
    43613 #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
     48080#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)
     48081WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509 *x)
     48082{
     48083    WOLFSSL_ENTER("wolfSSL_X509_dup");
     48084
     48085    if (x == NULL) {
     48086        WOLFSSL_MSG("Error: NULL certificate passed in");
     48087        return NULL;
     48088    }
     48089
     48090    return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length);
     48091}
     48092#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
     48093
     48094#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \
     48095    defined(WOLFSSL_HAPROXY) || defined(HAVE_LIGHTY)
    4361448096#ifdef HAVE_ALPN
    4361548097void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, const unsigned char **data,
     
    4382248304 * cb  callback to use
    4382348305 *
    43824  * return SSL_SUCCESS on success and SSL_FAILURE with error case
     48306 * return WOLFSSL_SUCCESS on success and SSL_FAILURE with error case
    4382548307 */
    4382648308int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb)
     
    4383748319
    4383848320    ssl->protoMsgCb = cb;
    43839     return SSL_SUCCESS;
     48321    return WOLFSSL_SUCCESS;
    4384048322}
    4384148323#ifndef NO_WOLFSSL_STUB
     
    4387348355    }
    4387448356    return XMEMCPY(ret, data, siz);
     48357}
     48358
     48359void wolfSSL_OPENSSL_cleanse(void *ptr, size_t len)
     48360{
     48361    if (ptr)
     48362        ForceZero(ptr, (word32)len);
    4387548363}
    4387648364
     
    4389048378    ctx->alpn_cli_protos_len = p_len;
    4389148379
    43892     return SSL_SUCCESS;
     48380    return WOLFSSL_SUCCESS;
    4389348381}
    4389448382
    4389548383
    4389648384#ifdef HAVE_ALPN
     48385#ifndef NO_BIO
    4389748386/* Sets the ALPN extension protos
    4389848387 *
     
    4395248441    return WOLFSSL_SUCCESS;
    4395348442}
     48443#endif /* !NO_BIO */
    4395448444#endif /* HAVE_ALPN */
    4395548445#endif
    4395648446
    43957 #endif /* WOLFCRYPT_ONLY */
    43958 
    4395948447#if defined(OPENSSL_EXTRA)
    4396048448
     48449#ifndef NO_BIO
    4396148450#define WOLFSSL_BIO_INCLUDED
    4396248451#include "src/bio.c"
     48452#endif
     48453
     48454word32 nid2oid(int nid, int grp)
     48455{
     48456    /* get OID type */
     48457    switch (grp) {
     48458        /* oidHashType */
     48459        case oidHashType:
     48460            switch (nid) {
     48461            #ifdef WOLFSSL_MD2
     48462                case NID_md2:
     48463                    return MD2h;
     48464            #endif
     48465            #ifndef NO_MD5
     48466                case NID_md5:
     48467                    return MD5h;
     48468            #endif
     48469            #ifndef NO_SHA
     48470                case NID_sha1:
     48471                    return SHAh;
     48472            #endif
     48473                case NID_sha224:
     48474                    return SHA224h;
     48475            #ifndef NO_SHA256
     48476                case NID_sha256:
     48477                    return SHA256h;
     48478            #endif
     48479            #ifdef WOLFSSL_SHA384
     48480                case NID_sha384:
     48481                    return SHA384h;
     48482            #endif
     48483            #ifdef WOLFSSL_SHA512
     48484                case NID_sha512:
     48485                    return SHA512h;
     48486            #endif
     48487            }
     48488            break;
     48489
     48490        /*  oidSigType */
     48491        case oidSigType:
     48492            switch (nid) {
     48493            #ifndef NO_DSA
     48494                case CTC_SHAwDSA:
     48495                    return CTC_SHAwDSA;
     48496            #endif /* NO_DSA */
     48497            #ifndef NO_RSA
     48498                case CTC_MD2wRSA:
     48499                    return CTC_MD2wRSA;
     48500                case CTC_MD5wRSA:
     48501                    return CTC_MD5wRSA;
     48502                case CTC_SHAwRSA:
     48503                    return CTC_SHAwRSA;
     48504                case CTC_SHA224wRSA:
     48505                    return CTC_SHA224wRSA;
     48506                case CTC_SHA256wRSA:
     48507                    return CTC_SHA256wRSA;
     48508                case CTC_SHA384wRSA:
     48509                    return CTC_SHA384wRSA;
     48510                case CTC_SHA512wRSA:
     48511                    return CTC_SHA512wRSA;
     48512            #endif /* NO_RSA */
     48513            #ifdef HAVE_ECC
     48514                case CTC_SHAwECDSA:
     48515                    return CTC_SHAwECDSA;
     48516                case CTC_SHA224wECDSA:
     48517                    return CTC_SHA224wECDSA;
     48518                case CTC_SHA256wECDSA:
     48519                    return CTC_SHA256wECDSA;
     48520                case CTC_SHA384wECDSA:
     48521                    return CTC_SHA384wECDSA;
     48522                case CTC_SHA512wECDSA:
     48523                    return CTC_SHA512wECDSA;
     48524            #endif /* HAVE_ECC */
     48525            }
     48526            break;
     48527
     48528        /* oidKeyType */
     48529        case oidKeyType:
     48530            switch (nid) {
     48531            #ifndef NO_DSA
     48532                case DSAk:
     48533                    return DSAk;
     48534            #endif /* NO_DSA */
     48535            #ifndef NO_RSA
     48536                case RSAk:
     48537                    return RSAk;
     48538            #endif /* NO_RSA */
     48539            #ifdef HAVE_NTRU
     48540                case NTRUk:
     48541                    return NTRUk;
     48542            #endif /* HAVE_NTRU */
     48543            #ifdef HAVE_ECC
     48544                case ECDSAk:
     48545                    return ECDSAk;
     48546            #endif /* HAVE_ECC */
     48547            }
     48548            break;
     48549
     48550
     48551    #ifdef HAVE_ECC
     48552        case oidCurveType:
     48553            switch (nid) {
     48554            case NID_X9_62_prime192v1:
     48555                return ECC_SECP192R1_OID;
     48556            case NID_X9_62_prime192v2:
     48557                return ECC_PRIME192V2_OID;
     48558            case NID_X9_62_prime192v3:
     48559                return ECC_PRIME192V3_OID;
     48560            case NID_X9_62_prime239v1:
     48561                return ECC_PRIME239V1_OID;
     48562            case NID_X9_62_prime239v2:
     48563                return ECC_PRIME239V2_OID;
     48564            case NID_X9_62_prime239v3:
     48565                return ECC_PRIME239V3_OID;
     48566            case NID_X9_62_prime256v1:
     48567                return ECC_SECP256R1_OID;
     48568            case NID_secp112r1:
     48569                return ECC_SECP112R1_OID;
     48570            case NID_secp112r2:
     48571                return ECC_SECP112R2_OID;
     48572            case NID_secp128r1:
     48573                return ECC_SECP128R1_OID;
     48574            case NID_secp128r2:
     48575                return ECC_SECP128R2_OID;
     48576            case NID_secp160r1:
     48577                return ECC_SECP160R1_OID;
     48578            case NID_secp160r2:
     48579                return ECC_SECP160R2_OID;
     48580            case NID_secp224r1:
     48581                return ECC_SECP224R1_OID;
     48582            case NID_secp384r1:
     48583                return ECC_SECP384R1_OID;
     48584            case NID_secp521r1:
     48585                return ECC_SECP521R1_OID;
     48586            case NID_secp160k1:
     48587                return ECC_SECP160K1_OID;
     48588            case NID_secp192k1:
     48589                return ECC_SECP192K1_OID;
     48590            case NID_secp224k1:
     48591                return ECC_SECP224K1_OID;
     48592            case NID_secp256k1:
     48593                return ECC_SECP256K1_OID;
     48594            case NID_brainpoolP160r1:
     48595                return ECC_BRAINPOOLP160R1_OID;
     48596            case NID_brainpoolP192r1:
     48597                return ECC_BRAINPOOLP192R1_OID;
     48598            case NID_brainpoolP224r1:
     48599                return ECC_BRAINPOOLP224R1_OID;
     48600            case NID_brainpoolP256r1:
     48601                return ECC_BRAINPOOLP256R1_OID;
     48602            case NID_brainpoolP320r1:
     48603                return ECC_BRAINPOOLP320R1_OID;
     48604            case NID_brainpoolP384r1:
     48605                return ECC_BRAINPOOLP384R1_OID;
     48606            case NID_brainpoolP512r1:
     48607                return ECC_BRAINPOOLP512R1_OID;
     48608            }
     48609            break;
     48610    #endif /* HAVE_ECC */
     48611
     48612        /* oidBlkType */
     48613        case oidBlkType:
     48614            switch (nid) {
     48615            #ifdef WOLFSSL_AES_128
     48616                case AES128CBCb:
     48617                    return AES128CBCb;
     48618            #endif
     48619            #ifdef WOLFSSL_AES_192
     48620                case AES192CBCb:
     48621                    return AES192CBCb;
     48622            #endif
     48623            #ifdef WOLFSSL_AES_256
     48624                case AES256CBCb:
     48625                    return AES256CBCb;
     48626            #endif
     48627            #ifndef NO_DES3
     48628                case NID_des:
     48629                    return DESb;
     48630                case NID_des3:
     48631                    return DES3b;
     48632            #endif
     48633            }
     48634            break;
     48635
     48636    #ifdef HAVE_OCSP
     48637        case oidOcspType:
     48638            switch (nid) {
     48639                case NID_id_pkix_OCSP_basic:
     48640                    return OCSP_BASIC_OID;
     48641                case OCSP_NONCE_OID:
     48642                    return OCSP_NONCE_OID;
     48643            }
     48644            break;
     48645    #endif /* HAVE_OCSP */
     48646
     48647        /* oidCertExtType */
     48648        case oidCertExtType:
     48649            switch (nid) {
     48650                case BASIC_CA_OID:
     48651                    return BASIC_CA_OID;
     48652                case ALT_NAMES_OID:
     48653                    return ALT_NAMES_OID;
     48654                case CRL_DIST_OID:
     48655                    return CRL_DIST_OID;
     48656                case AUTH_INFO_OID:
     48657                    return AUTH_INFO_OID;
     48658                case AUTH_KEY_OID:
     48659                    return AUTH_KEY_OID;
     48660                case SUBJ_KEY_OID:
     48661                    return SUBJ_KEY_OID;
     48662                case INHIBIT_ANY_OID:
     48663                    return INHIBIT_ANY_OID;
     48664                case NID_key_usage:
     48665                    return KEY_USAGE_OID;
     48666                case NID_name_constraints:
     48667                    return NAME_CONS_OID;
     48668                case NID_certificate_policies:
     48669                    return CERT_POLICY_OID;
     48670            }
     48671            break;
     48672
     48673        /* oidCertAuthInfoType */
     48674        case oidCertAuthInfoType:
     48675            switch (nid) {
     48676                case AIA_OCSP_OID:
     48677                    return AIA_OCSP_OID;
     48678                case AIA_CA_ISSUER_OID:
     48679                    return AIA_CA_ISSUER_OID;
     48680            }
     48681            break;
     48682
     48683        /* oidCertPolicyType */
     48684        case oidCertPolicyType:
     48685            switch (nid) {
     48686                case NID_any_policy:
     48687                    return CP_ANY_OID;
     48688            }
     48689            break;
     48690
     48691        /* oidCertAltNameType */
     48692        case oidCertAltNameType:
     48693            switch (nid) {
     48694                case NID_hw_name_oid:
     48695                    return HW_NAME_OID;
     48696            }
     48697            break;
     48698
     48699        /* oidCertKeyUseType */
     48700        case oidCertKeyUseType:
     48701            switch (nid) {
     48702                case NID_anyExtendedKeyUsage:
     48703                    return EKU_ANY_OID;
     48704                case EKU_SERVER_AUTH_OID:
     48705                    return EKU_SERVER_AUTH_OID;
     48706                case EKU_CLIENT_AUTH_OID:
     48707                    return EKU_CLIENT_AUTH_OID;
     48708                case EKU_OCSP_SIGN_OID:
     48709                    return EKU_OCSP_SIGN_OID;
     48710            }
     48711            break;
     48712
     48713        /* oidKdfType */
     48714        case oidKdfType:
     48715            switch (nid) {
     48716                case PBKDF2_OID:
     48717                    return PBKDF2_OID;
     48718            }
     48719            break;
     48720
     48721        /* oidPBEType */
     48722        case oidPBEType:
     48723            switch (nid) {
     48724                case PBE_SHA1_RC4_128:
     48725                    return PBE_SHA1_RC4_128;
     48726                case PBE_SHA1_DES:
     48727                    return PBE_SHA1_DES;
     48728                case PBE_SHA1_DES3:
     48729                    return PBE_SHA1_DES3;
     48730            }
     48731            break;
     48732
     48733        /* oidKeyWrapType */
     48734        case oidKeyWrapType:
     48735            switch (nid) {
     48736            #ifdef WOLFSSL_AES_128
     48737                case AES128_WRAP:
     48738                    return AES128_WRAP;
     48739            #endif
     48740            #ifdef WOLFSSL_AES_192
     48741                case AES192_WRAP:
     48742                    return AES192_WRAP;
     48743            #endif
     48744            #ifdef WOLFSSL_AES_256
     48745                case AES256_WRAP:
     48746                    return AES256_WRAP;
     48747            #endif
     48748            }
     48749            break;
     48750
     48751        /* oidCmsKeyAgreeType */
     48752        case oidCmsKeyAgreeType:
     48753            switch (nid) {
     48754                #ifndef NO_SHA
     48755                case dhSinglePass_stdDH_sha1kdf_scheme:
     48756                    return dhSinglePass_stdDH_sha1kdf_scheme;
     48757                #endif
     48758                #ifdef WOLFSSL_SHA224
     48759                case dhSinglePass_stdDH_sha224kdf_scheme:
     48760                    return dhSinglePass_stdDH_sha224kdf_scheme;
     48761                #endif
     48762                #ifndef NO_SHA256
     48763                case dhSinglePass_stdDH_sha256kdf_scheme:
     48764                    return dhSinglePass_stdDH_sha256kdf_scheme;
     48765                #endif
     48766                #ifdef WOLFSSL_SHA384
     48767                case dhSinglePass_stdDH_sha384kdf_scheme:
     48768                    return dhSinglePass_stdDH_sha384kdf_scheme;
     48769                #endif
     48770                #ifdef WOLFSSL_SHA512
     48771                case dhSinglePass_stdDH_sha512kdf_scheme:
     48772                    return dhSinglePass_stdDH_sha512kdf_scheme;
     48773                #endif
     48774            }
     48775            break;
     48776
     48777        default:
     48778            WOLFSSL_MSG("NID not in table");
     48779            /* MSVC warns without the cast */
     48780            return (word32)-1;
     48781    }
     48782
     48783    /* MSVC warns without the cast */
     48784    return (word32)-1;
     48785}
    4396348786
    4396448787int oid2nid(word32 oid, int grp)
    4396548788{
     48789    size_t i;
    4396648790    /* get OID type */
    4396748791    switch (grp) {
     
    4400448828                case CTC_SHAwDSA:
    4400548829                    return CTC_SHAwDSA;
     48830                case CTC_SHA256wDSA:
     48831                    return CTC_SHA256wDSA;
    4400648832            #endif /* NO_DSA */
    4400748833            #ifndef NO_RSA
     
    4428549111            break;
    4428649112
     49113#ifdef WOLFSSL_CERT_REQ
     49114        case oidCsrAttrType:
     49115            switch (oid) {
     49116                case CHALLENGE_PASSWORD_OID:
     49117                    return NID_pkcs9_challengePassword;
     49118                case SERIAL_NUMBER_OID:
     49119                    return NID_serialNumber;
     49120            }
     49121            break;
     49122#endif
     49123
    4428749124        default:
    4428849125            WOLFSSL_MSG("NID not in table");
    44289             return -1;
     49126    }
     49127    /* If not found in above switch then try the table */
     49128    for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) {
     49129        if (wolfssl_object_info[i].id == (int)oid) {
     49130            return wolfssl_object_info[i].nid;
     49131        }
    4429049132    }
    4429149133
     
    4430749149    }
    4430849150
    44309     if (mpi == NULL || (mp_init(mpi) != MP_OKAY)) {
     49151    if (mpi == NULL) {
    4431049152        WOLFSSL_MSG("mpi NULL error");
    4431149153        return WOLFSSL_FATAL_ERROR;
     
    4433849180    if (ret != 0) {
    4433949181    #ifdef WOLFSSL_QT
    44340         mp_init(&mpi); /* must init mpi */
     49182        ret = mp_init(&mpi); /* must init mpi */
     49183        if (ret != MP_OKAY) {
     49184            return NULL;
     49185        }
    4434149186        /* Serial number in QT starts at index 0 of data */
    4434249187        if (mp_read_unsigned_bin(&mpi, (byte*)ai->data, ai->length) != 0) {
     
    4448649331
    4448749332
    44488 /* SSL_SUCCESS on ok */
     49333/* WOLFSSL_SUCCESS on ok */
    4448949334#ifndef NO_WOLFSSL_STUB
    4449049335int wolfSSL_RSA_blinding_on(WOLFSSL_RSA* rsa, WOLFSSL_BN_CTX* bn)
     
    4455049395    if (rsa->inSet == 0)
    4455149396    {
    44552         if (SetRsaInternal(rsa) != SSL_SUCCESS) {
     49397        if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
    4455349398            WOLFSSL_MSG("SetRsaInternal failed");
    4455449399            return 0;
     
    4464249487    if (rsa->inSet == 0)
    4464349488    {
    44644         if (SetRsaInternal(rsa) != SSL_SUCCESS) {
     49489        if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
    4464549490            WOLFSSL_MSG("SetRsaInternal failed");
    4464649491            return 0;
     
    4467649521}
    4467749522
    44678 #if !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
     49523#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
     49524    (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2))
    4467949525int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from,
    4468049526                          unsigned char* to, WOLFSSL_RSA* rsa, int padding)
     
    4472849574    return tlen;
    4472949575}
    44730 #endif /* !defined(_WIN32) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
     49576#endif /* !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) */
    4473149577
    4473249578/* RSA private encrypt calls wc_RsaSSL_Sign. Similar function set up as RSA
     
    4476549611        WOLFSSL_MSG("Setting internal RSA structure");
    4476649612
    44767         if (SetRsaInternal(rsa) != SSL_SUCCESS) {
     49613        if (SetRsaInternal(rsa) != WOLFSSL_SUCCESS) {
    4476849614            WOLFSSL_MSG("SetRsaInternal failed");
    4476949615            return 0;
     
    4492149767    if ((ret = mp_mulmod((mp_int*)a->internal,(mp_int*)p->internal,
    4492249768               (mp_int*)m->internal, (mp_int*)r->internal)) == MP_OKAY) {
    44923         return SSL_SUCCESS;
     49769        return WOLFSSL_SUCCESS;
    4492449770    }
    4492549771
     
    4493049776}
    4493149777
    44932 #ifdef OPENSSL_EXTRA
    4493349778const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void)
    4493449779{
     
    4494849793    return bn_one;
    4494949794}
    44950 #endif
    4495149795
    4495249796/* return compliant with OpenSSL
     
    4503149875int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
    4503249876{
    45033     WOLFSSL_ENTER("wolfSSL_BN_is_word");
     49877    WOLFSSL_MSG("wolfSSL_BN_is_word");
    4503449878
    4503549879    if (bn == NULL || bn->internal == NULL) {
     
    4503849882    }
    4503949883
    45040     if (mp_isword((mp_int*)bn->internal, w) == MP_YES) {
    45041          return WOLFSSL_SUCCESS;
     49884    if (w <= MP_MASK) {
     49885        if (mp_isword((mp_int*)bn->internal, (mp_digit)w) == MP_YES) {
     49886            return WOLFSSL_SUCCESS;
     49887        }
     49888    } else {
     49889        int ret;
     49890        mp_int w_mp;
     49891        if (mp_init(&w_mp) != MP_OKAY)
     49892            return WOLFSSL_FAILURE;
     49893        if (mp_set_int(&w_mp, w) != MP_OKAY)
     49894            return WOLFSSL_FAILURE;
     49895        ret = mp_cmp((mp_int *)bn->internal, &w_mp);
     49896        mp_free(&w_mp);
     49897        if (ret == MP_EQ)
     49898            return WOLFSSL_SUCCESS;
    4504249899    }
    4504349900
     
    4547350330 *   1 if success, 0 else
    4547450331 */
    45475 int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, WOLFSSL_BN_ULONG w)
     50332int wolfSSL_BN_set_word(WOLFSSL_BIGNUM* bn, unsigned long w)
    4547650333{
    4547750334    WOLFSSL_MSG("wolfSSL_BN_set_word");
     
    4549050347}
    4549150348
     50349static WOLFSSL_BN_ULONG wolfSSL_BN_get_word_1(mp_int *mp) {
     50350#if DIGIT_BIT == (SIZEOF_LONG * 8)
     50351    return (WOLFSSL_BN_ULONG)mp->dp[0];
     50352#else
     50353    WOLFSSL_BN_ULONG ret = 0UL;
     50354    int digit_i;
     50355
     50356    for (digit_i = 0; digit_i < mp->used; ++digit_i) {
     50357        ret <<= (WOLFSSL_BN_ULONG)DIGIT_BIT;
     50358        ret |= (WOLFSSL_BN_ULONG)mp->dp[digit_i];
     50359    }
     50360
     50361    return ret;
     50362#endif
     50363}
    4549250364
    4549350365/* Returns the big number as an unsigned long if possible.
     
    4549750369 * Returns value or 0xFFFFFFFFL if bigger than unsigned long.
    4549850370 */
    45499 unsigned long wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
    45500 {
    45501     mp_int* mp;
    45502 
     50371WOLFSSL_BN_ULONG wolfSSL_BN_get_word(const WOLFSSL_BIGNUM* bn)
     50372{
    4550350373    WOLFSSL_MSG("wolfSSL_BN_get_word");
    4550450374
     
    4551250382        return 0xFFFFFFFFL;
    4551350383    }
    45514     mp = (mp_int*)bn->internal;
    45515 
    45516     return (unsigned long)(mp->dp[0]);
     50384
     50385    return wolfSSL_BN_get_word_1((mp_int*)bn->internal);
    4551750386}
    4551850387
     
    4562750496    }
    4562850497
    45629     if (mp_add_d((mp_int*)bn->internal, w, (mp_int*)bn->internal) != MP_OKAY) {
    45630         WOLFSSL_MSG("mp_add_d error");
    45631         return WOLFSSL_FAILURE;
     50498    if (w <= MP_MASK) {
     50499        if (mp_add_d((mp_int*)bn->internal, (mp_digit)w, (mp_int*)bn->internal) != MP_OKAY) {
     50500            WOLFSSL_MSG("mp_add_d error");
     50501            return WOLFSSL_FAILURE;
     50502        }
     50503    } else {
     50504        int ret;
     50505        mp_int w_mp;
     50506        if (mp_init(&w_mp) != MP_OKAY)
     50507            return WOLFSSL_FAILURE;
     50508        if (mp_set_int(&w_mp, w) != MP_OKAY)
     50509            return WOLFSSL_FAILURE;
     50510        ret = mp_add((mp_int *)bn->internal, &w_mp, (mp_int *)bn->internal);
     50511        mp_free(&w_mp);
     50512        if (ret != MP_OKAY) {
     50513            WOLFSSL_MSG("mp_add error");
     50514            return WOLFSSL_FAILURE;
     50515        }
    4563250516    }
    4563350517
     
    4576450648    }
    4576550649
    45766     if (mp_mod_d((mp_int*)bn->internal, w, &ret) != MP_OKAY) {
    45767         WOLFSSL_MSG("mp_add_d error");
    45768         return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
     50650    if (w <= MP_MASK) {
     50651        mp_digit bn_ret;
     50652        if (mp_mod_d((mp_int*)bn->internal, (WOLFSSL_BN_ULONG)w, &bn_ret) != MP_OKAY) {
     50653            WOLFSSL_MSG("mp_add_d error");
     50654            return (WOLFSSL_BN_ULONG)WOLFSSL_FATAL_ERROR;
     50655        }
     50656        ret = (WOLFSSL_BN_ULONG)bn_ret;
     50657    } else {
     50658        int mp_ret;
     50659        mp_int w_mp, r_mp;
     50660        if (mp_init(&w_mp) != MP_OKAY)
     50661            return (unsigned long)WOLFSSL_FAILURE;
     50662        if (mp_init(&r_mp) != MP_OKAY)
     50663            return (unsigned long)WOLFSSL_FAILURE;
     50664        if (mp_set_int(&w_mp, w) != MP_OKAY)
     50665            return (unsigned long)WOLFSSL_FAILURE;
     50666        mp_ret = mp_mod((mp_int *)bn->internal, &w_mp, &r_mp);
     50667        ret = wolfSSL_BN_get_word_1(&r_mp);
     50668        mp_free(&r_mp);
     50669        mp_free(&w_mp);
     50670        if (mp_ret != MP_OKAY) {
     50671            WOLFSSL_MSG("mp_mod error");
     50672            return (WOLFSSL_BN_ULONG)WOLFSSL_FAILURE;
     50673        }
    4576950674    }
    4577050675
     
    4578950694        return NULL;
    4579050695    }
    45791     len += 1; /* add one for null terminator */
    4579250696
    4579350697    buf = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL);
     
    4582650730    }
    4582750731
    45828     fprintf(fp, "%s", buf);
     50732    XFPRINTF(fp, "%s", buf);
    4582950733    XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL);
    4583050734
     
    4590850812#endif  /* OPENSSL_EXTRA */
    4590950813#if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) && !defined(NO_ASN)
     50814#ifndef NO_BIO
    4591050815static int unprintable_char(char c)
    4591150816{
     
    4594050845    return str->length;
    4594150846}
     50847#endif /* !NO_BIO */
    4594250848#endif /* (WOLFSSL_QT || OPENSSL_ALL) && !NO_ASN */
    4594350849
     
    4597750883}
    4597850884
     50885#ifndef NO_BIO
    4597950886static int check_esc_char(char c, char *esc)
    4598050887{
     
    4610751014    return WOLFSSL_FAILURE;
    4610851015}
     51016#endif /* !NO_BIO */
    4610951017
    4611051018#if !defined(NO_ASN_TIME) && !defined(USER_TIME) && !defined(TIME_OVERRIDES)
    46111 WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void)
    46112 {
    46113     WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*)
    46114             XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL);
    46115     if (!ret)
    46116         return NULL;
    46117     XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME));
    46118     return ret;
    46119 }
    46120 
    46121 void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t)
    46122 {
    46123     if (t) {
    46124         XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL);
    46125     }
    46126 }
     51019
    4612751020
    4612851021WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
     
    4621051103
    4621151104#ifndef NO_ASN_TIME
     51105
     51106WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_new(void)
     51107{
     51108    WOLFSSL_ASN1_TIME* ret = (WOLFSSL_ASN1_TIME*)
     51109            XMALLOC(sizeof(WOLFSSL_ASN1_TIME), NULL, DYNAMIC_TYPE_OPENSSL);
     51110    if (!ret)
     51111        return NULL;
     51112    XMEMSET(ret, 0, sizeof(WOLFSSL_ASN1_TIME));
     51113    return ret;
     51114}
     51115
     51116void wolfSSL_ASN1_TIME_free(WOLFSSL_ASN1_TIME* t)
     51117{
     51118    if (t) {
     51119        XFREE(t, NULL, DYNAMIC_TYPE_OPENSSL);
     51120    }
     51121}
    4621251122/* not a compatibility function - length getter for opaque type */
    4621351123int wolfSSL_ASN1_TIME_get_length(WOLFSSL_ASN1_TIME *t)
     
    4638851298}
    4638951299#endif /* !NO_CERTS */
    46390 
     51300#endif /* OPENSSL_EXTRA */
     51301
     51302#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)
    4639151303long wolfSSL_X509_get_version(const WOLFSSL_X509 *x509)
    4639251304{
     
    4640551317    return 0L;
    4640651318}
    46407 
    46408 
     51319#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */
     51320
     51321#if defined(OPENSSL_EXTRA)
    4640951322int wolfSSL_X509_get_signature_nid(const WOLFSSL_X509 *x)
    4641051323{
     
    4642851341    if (rsa->inSet == 0)
    4642951342    {
    46430         if (SetRsaInternal((WOLFSSL_RSA*)rsa) != SSL_SUCCESS) {
     51343        if (SetRsaInternal((WOLFSSL_RSA*)rsa) != WOLFSSL_SUCCESS) {
    4643151344            WOLFSSL_MSG("SetRsaInternal failed");
    4643251345            return 0;
     
    4680251715    }
    4680351716
    46804     if (ret != 0 && pkcs7 != NULL)
     51717    if (ret != 0 && pkcs7 != NULL) {
    4680551718        XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7);
     51719        pkcs7 = NULL;
     51720    }
    4680651721
    4680751722    return (PKCS7*)pkcs7;
     
    4683851753            XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7);
    4683951754        wc_PKCS7_Free(&p7->pkcs7);
     51755        if (p7->certs)
     51756            wolfSSL_sk_free(p7->certs);
    4684051757        XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7);
    4684151758    }
    4684251759}
     51760
    4684351761void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7)
    4684451762{
     
    4684651764    return;
    4684751765}
     51766
    4684851767PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len)
     51768{
     51769    return wolfSSL_d2i_PKCS7_ex(p7, in, len, NULL, 0);
     51770}
     51771
     51772/*****************************************************************************
     51773* wolfSSL_d2i_PKCS7_ex - Converts the given unsigned char buffer of size len
     51774* into a PKCS7 object.  Optionally, accepts a byte buffer of content which
     51775* is stored as the PKCS7 object's content, to support detached signatures.
     51776* @param content The content which is signed, in case the signature is
     51777*                detached.  Ignored if NULL.
     51778* @param contentSz The size of the passed in content.
     51779*
     51780* RETURNS:
     51781* returns pointer to a PKCS7 structure on success, otherwise returns NULL
     51782*/
     51783PKCS7* wolfSSL_d2i_PKCS7_ex(PKCS7** p7, const unsigned char** in, int len,
     51784                            byte* content, word32 contentSz)
    4684951785{
    4685051786    WOLFSSL_PKCS7* pkcs7 = NULL;
    4685151787    word32 idx = 0;
    4685251788
    46853     if (in == NULL)
     51789    WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex");
     51790
     51791    if (in == NULL || *in == NULL)
    4685451792        return NULL;
    4685551793
     
    4686951807    }
    4687051808    XMEMCPY(pkcs7->data, *in, pkcs7->len);
    46871     *in += pkcs7->len;
     51809
     51810    if (content != NULL) {
     51811        pkcs7->pkcs7.content = content;
     51812        pkcs7->pkcs7.contentSz = contentSz;
     51813    }
     51814    if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) != 0) {
     51815        wolfSSL_PKCS7_free((PKCS7*)pkcs7);
     51816        return NULL;
     51817    }
    4687251818
    4687351819    if (p7 != NULL)
    4687451820        *p7 = (PKCS7*)pkcs7;
     51821    *in += pkcs7->len;
    4687551822    return (PKCS7*)pkcs7;
    4687651823}
    4687751824
     51825#ifndef NO_BIO
     51826
    4687851827PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
    4687951828{
    4688051829    WOLFSSL_PKCS7* pkcs7;
     51830    int ret;
     51831
     51832    WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_bio");
    4688151833
    4688251834    if (bio == NULL)
     
    4688651838        return NULL;
    4688751839
    46888     pkcs7->len = wolfSSL_BIO_pending(bio);
     51840    pkcs7->len = wolfSSL_BIO_get_len(bio);
    4688951841    pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7);
    4689051842    if (pkcs7->data == NULL) {
     
    4689351845    }
    4689451846
    46895     if (wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len) != pkcs7->len) {
     51847    if ((ret = wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len)) <= 0) {
    4689651848        wolfSSL_PKCS7_free((PKCS7*)pkcs7);
     51849        return NULL;
     51850    }
     51851    /* pkcs7->len may change if using b64 for example */
     51852    pkcs7->len = ret;
     51853
     51854    if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) != 0) {
    4689751855        return NULL;
    4689851856    }
     
    4690151859        *p7 = (PKCS7*)pkcs7;
    4690251860    return (PKCS7*)pkcs7;
     51861}
     51862
     51863int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7)
     51864{
     51865    byte* output = NULL;
     51866    int len;
     51867    WC_RNG rng;
     51868    int ret = WOLFSSL_FAILURE;
     51869    WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio");
     51870
     51871    if (!bio || !p7) {
     51872        WOLFSSL_MSG("Bad parameter");
     51873        return WOLFSSL_FAILURE;
     51874    }
     51875
     51876    if (!p7->rng) {
     51877        if (wc_InitRng(&rng) != 0) {
     51878            WOLFSSL_MSG("wc_InitRng error");
     51879            return WOLFSSL_FAILURE;
     51880        }
     51881        p7->rng = &rng;
     51882    }
     51883
     51884    if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) {
     51885        WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
     51886        goto cleanup;
     51887    }
     51888
     51889    output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     51890    if (!output) {
     51891        WOLFSSL_MSG("malloc error");
     51892        goto cleanup;
     51893    }
     51894
     51895    if ((len = wc_PKCS7_EncodeSignedData(p7, output, len)) < 0) {
     51896        WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error");
     51897        goto cleanup;
     51898    }
     51899
     51900    if (wolfSSL_BIO_write(bio, output, len) <= 0) {
     51901        WOLFSSL_MSG("wolfSSL_BIO_write error");
     51902        goto cleanup;
     51903    }
     51904
     51905    ret = WOLFSSL_SUCCESS;
     51906cleanup:
     51907    if (p7->rng == &rng) {
     51908        wc_FreeRng(&rng);
     51909        p7->rng = NULL;
     51910    }
     51911    if (output) {
     51912        XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     51913    }
     51914    return ret;
    4690351915}
    4690451916
     
    4691151923    int memSz = 0;
    4691251924    WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
     51925
     51926    WOLFSSL_ENTER("wolfSSL_PKCS7_verify");
    4691351927
    4691451928    if (pkcs7 == NULL)
     
    4693051944    (void)store;
    4693151945
    46932     ret = wc_PKCS7_VerifySignedData_ex(&p7->pkcs7, NULL, 0, p7->data, p7->len,
    46933                                                                        NULL, 0);
     51946    ret = wc_PKCS7_VerifySignedData(&p7->pkcs7, p7->data, p7->len);
    4693451947    if (ret != 0)
    4693551948        return WOLFSSL_FAILURE;
     
    4694451957
    4694551958    return WOLFSSL_SUCCESS;
     51959}
     51960
     51961/**
     51962 * This API was added as a helper function for libest. It
     51963 * encodes a stack of certificates to pkcs7 format.
     51964 * @param pkcs7 PKCS7 parameter object
     51965 * @param certs WOLFSSL_STACK_OF(WOLFSSL_X509)*
     51966 * @param out   Output bio
     51967 * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure
     51968 */
     51969int wolfSSL_PKCS7_encode_certs(PKCS7* pkcs7, WOLFSSL_STACK* certs,
     51970                               WOLFSSL_BIO* out)
     51971{
     51972    int ret;
     51973    WOLFSSL_PKCS7* p7;
     51974    WOLFSSL_ENTER("wolfSSL_PKCS7_encode_certs");
     51975
     51976    if (!pkcs7 || !certs || !out) {
     51977        WOLFSSL_MSG("Bad parameter");
     51978        return WOLFSSL_FAILURE;
     51979    }
     51980
     51981    p7 = (WOLFSSL_PKCS7*)pkcs7;
     51982
     51983    /* take ownership of certs */
     51984    p7->certs = certs;
     51985
     51986    if (pkcs7->certList) {
     51987        WOLFSSL_MSG("wolfSSL_PKCS7_encode_certs called multiple times on same "
     51988                    "struct");
     51989        return WOLFSSL_FAILURE;
     51990    }
     51991
     51992    if (certs) {
     51993        /* Save some of the values */
     51994        int hashOID = pkcs7->hashOID;
     51995        byte version = pkcs7->version;
     51996
     51997        if (!certs->data.x509 || !certs->data.x509->derCert) {
     51998            WOLFSSL_MSG("Missing cert");
     51999            return WOLFSSL_FAILURE;
     52000        }
     52001
     52002        if (wc_PKCS7_InitWithCert(pkcs7, certs->data.x509->derCert->buffer,
     52003                certs->data.x509->derCert->length) != 0) {
     52004            WOLFSSL_MSG("wc_PKCS7_InitWithCert error");
     52005            return WOLFSSL_FAILURE;
     52006        }
     52007        certs = certs->next;
     52008
     52009        pkcs7->hashOID = hashOID;
     52010        pkcs7->version = version;
     52011    }
     52012
     52013    /* Add the certs to the PKCS7 struct */
     52014    while (certs) {
     52015        if (!certs->data.x509 || !certs->data.x509->derCert) {
     52016            WOLFSSL_MSG("Missing cert");
     52017            return WOLFSSL_FAILURE;
     52018        }
     52019        if (wc_PKCS7_AddCertificate(pkcs7, certs->data.x509->derCert->buffer,
     52020                certs->data.x509->derCert->length) != 0) {
     52021            WOLFSSL_MSG("wc_PKCS7_AddCertificate error");
     52022            return WOLFSSL_FAILURE;
     52023        }
     52024        certs = certs->next;
     52025    }
     52026
     52027    if (wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID) != 0) {
     52028        WOLFSSL_MSG("wc_PKCS7_SetSignerIdentifierType error");
     52029        return WOLFSSL_FAILURE;
     52030    }
     52031
     52032    ret = wolfSSL_i2d_PKCS7_bio(out, pkcs7);
     52033
     52034    return ret;
     52035}
     52036#endif /* !NO_BIO */
     52037
     52038/**
     52039 * This API was added as a helper function for libest. It
     52040 * extracts a stack of certificates from the pkcs7 object.
     52041 * @param pkcs7 PKCS7 parameter object
     52042 * @return WOLFSSL_STACK_OF(WOLFSSL_X509)*
     52043 */
     52044WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7)
     52045{
     52046    int i;
     52047    WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7;
     52048    WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL;
     52049
     52050    WOLFSSL_ENTER("wolfSSL_PKCS7_to_stack");
     52051
     52052    if (!p7) {
     52053        WOLFSSL_MSG("Bad parameter");
     52054        return NULL;
     52055    }
     52056
     52057    if (p7->certs)
     52058        return p7->certs;
     52059
     52060    for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) {
     52061        WOLFSSL_X509* x509 = wolfSSL_X509_d2i(NULL, p7->pkcs7.cert[i],
     52062                                              p7->pkcs7.certSz[i]);
     52063        if (!ret)
     52064            ret = wolfSSL_sk_X509_new();
     52065        if (x509) {
     52066            if (wolfSSL_sk_X509_push(ret, x509) != WOLFSSL_SUCCESS) {
     52067                wolfSSL_X509_free(x509);
     52068                WOLFSSL_MSG("wolfSSL_sk_X509_push error");
     52069                goto error;
     52070            }
     52071        }
     52072        else {
     52073            WOLFSSL_MSG("wolfSSL_X509_d2i error");
     52074            goto error;
     52075        }
     52076    }
     52077
     52078    /* Save stack to free later */
     52079    if (p7->certs)
     52080        wolfSSL_sk_free(p7->certs);
     52081    p7->certs = ret;
     52082
     52083    return ret;
     52084error:
     52085    if (ret) {
     52086        wolfSSL_sk_free(ret);
     52087    }
     52088    return NULL;
    4694652089}
    4694752090
     
    4698552128}
    4698652129
     52130#ifndef NO_BIO
    4698752131/******************************************************************************
    4698852132* wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO
     
    4710752251    return WOLFSSL_FAILURE;
    4710852252}
     52253
     52254#ifdef HAVE_SMIME
     52255/*****************************************************************************
     52256* wolfSSL_SMIME_read_PKCS7 - Reads the given S/MIME message and parses it into
     52257* a PKCS7 object. In case of a multipart message, stores the signed data in
     52258* bcont.
     52259*
     52260* RETURNS:
     52261* returns pointer to a PKCS7 structure on success, otherwise returns NULL
     52262*/
     52263WOLFSSL_API PKCS7* wolfSSL_SMIME_read_PKCS7(WOLFSSL_BIO* in,
     52264                                            WOLFSSL_BIO** bcont)
     52265{
     52266    MimeHdr* allHdrs = NULL;
     52267    MimeHdr* curHdr = NULL;
     52268    MimeParam* curParam = NULL;
     52269    int inLen = 0;
     52270    byte* bcontMem = NULL;
     52271    int bcontMemSz = 0;
     52272    int sectionLen = 0;
     52273    int ret = -1;
     52274    char* section = NULL;
     52275    PKCS7* pkcs7 = NULL;
     52276    word32 outLen = 0;
     52277    byte* out = NULL;
     52278    byte* outHead = NULL;
     52279
     52280    int lineLen = 0;
     52281    int remainLen = 0;
     52282    byte isEnd = 0;
     52283    size_t boundLen = 0;
     52284    char* boundary = NULL;
     52285
     52286    static const char* kContType = "Content-Type";
     52287    static const char* kCTE = "Content-Transfer-Encoding";
     52288    static const char* kMultSigned = "multipart/signed";
     52289    static const char* kAppPkcsSign = "application/pkcs7-signature";
     52290    static const char* kAppXPkcsSign = "application/x-pkcs7-signature";
     52291    static const char* kAppPkcs7Mime = "application/pkcs7-mime";
     52292    static const char* kAppXPkcs7Mime = "application/x-pkcs7-mime";
     52293
     52294
     52295    if (in == NULL || bcont == NULL) {
     52296        goto error;
     52297    }
     52298    inLen = wolfSSL_BIO_get_len(in);
     52299    if (inLen <= 0) {
     52300        goto error;
     52301    }
     52302    remainLen = wolfSSL_BIO_get_len(in);
     52303    if (remainLen <= 0) {
     52304        goto error;
     52305    }
     52306
     52307    section = (char*)XMALLOC((remainLen+1)*sizeof(char), NULL,
     52308                             DYNAMIC_TYPE_PKCS7);
     52309    if (section == NULL) {
     52310        goto error;
     52311    }
     52312    lineLen = wolfSSL_BIO_gets(in, section, remainLen);
     52313    if (lineLen <= 0) {
     52314        goto error;
     52315    }
     52316    while(isEnd == 0 && remainLen > 0) {
     52317        sectionLen += lineLen;
     52318        remainLen -= lineLen;
     52319        lineLen = wolfSSL_BIO_gets(in, &section[sectionLen], remainLen);
     52320        if (lineLen <= 0) {
     52321            goto error;
     52322        }
     52323        /* Line with just newline signals end of headers. */
     52324        if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
     52325                                     "\r\n", 2)) ||
     52326            (lineLen==1 && (section[sectionLen] == '\r' ||
     52327                            section[sectionLen] == '\n'))) {
     52328            isEnd = 1;
     52329        }
     52330    }
     52331    section[sectionLen] = '\0';
     52332    ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
     52333    if (ret < 0) {
     52334        WOLFSSL_MSG("Parsing MIME headers failed.\n");
     52335        goto error;
     52336    }
     52337    isEnd = 0;
     52338    section[0] = '\0';
     52339    sectionLen = 0;
     52340
     52341    curHdr = wc_MIME_find_header_name(kContType, allHdrs);
     52342    if (curHdr && !XSTRNCMP(curHdr->body, kMultSigned,
     52343                            XSTR_SIZEOF(kMultSigned))) {
     52344        curParam = wc_MIME_find_param_attr("protocol", curHdr->params);
     52345        if (curParam && (!XSTRNCMP(curParam->value, kAppPkcsSign,
     52346                                   XSTR_SIZEOF(kAppPkcsSign)) ||
     52347                         !XSTRNCMP(curParam->value, kAppXPkcsSign,
     52348                                   XSTR_SIZEOF(kAppXPkcsSign)))) {
     52349            curParam = wc_MIME_find_param_attr("boundary", curHdr->params);
     52350            if (curParam == NULL) {
     52351                goto error;
     52352            }
     52353
     52354            boundLen = XSTRLEN(curParam->value) + 2;
     52355            boundary = (char*)XMALLOC((boundLen+1)*sizeof(char), NULL,
     52356                                      DYNAMIC_TYPE_PKCS7);
     52357            if (boundary == NULL) {
     52358                goto error;
     52359            }
     52360            XMEMSET(boundary, 0, (word32)((boundLen+1)*sizeof(char)));
     52361            boundary[0] = boundary[1] = '-';
     52362            XSTRNCPY(&boundary[2], curParam->value, boundLen-2);
     52363
     52364            /* Parse up to first boundary, ignore everything here. */
     52365            lineLen = wolfSSL_BIO_gets(in, section, remainLen);
     52366            if (lineLen <= 0) {
     52367                goto error;
     52368            }
     52369            while(XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
     52370                  remainLen > 0) {
     52371                sectionLen += lineLen;
     52372                remainLen -= lineLen;
     52373                lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
     52374                                           remainLen);
     52375                if (lineLen <= 0) {
     52376                    goto error;
     52377                }
     52378            }
     52379
     52380            section[0] = '\0';
     52381            sectionLen = 0;
     52382            lineLen = wolfSSL_BIO_gets(in, section, remainLen);
     52383            while(XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
     52384                           remainLen > 0) {
     52385                sectionLen += lineLen;
     52386                remainLen -= lineLen;
     52387                lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
     52388                                           remainLen);
     52389                if (lineLen <= 0) {
     52390                    goto error;
     52391                }
     52392            }
     52393            sectionLen--;
     52394            /* Strip the final trailing newline.  Support \r, \n or \r\n. */
     52395            if (section[sectionLen] == '\n') {
     52396                sectionLen--;
     52397                if (section[sectionLen] == '\r') {
     52398                    sectionLen--;
     52399                }
     52400            }
     52401            else if (section[sectionLen] == '\r') {
     52402                sectionLen--;
     52403            }
     52404            section[sectionLen+1] = '\0';
     52405
     52406            *bcont = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
     52407            ret = wolfSSL_BIO_write(*bcont, section, (int)XSTRLEN(section));
     52408            if (ret != (int)XSTRLEN(section)) {
     52409                goto error;
     52410            }
     52411            if ((bcontMemSz = wolfSSL_BIO_get_mem_data(*bcont, &bcontMem)) < 0) {
     52412                goto error;
     52413            }
     52414
     52415
     52416            wc_MIME_free_hdrs(allHdrs);
     52417            section[0] = '\0';
     52418            sectionLen = 0;
     52419            lineLen = wolfSSL_BIO_gets(in, section, remainLen);
     52420            if (lineLen <= 0) {
     52421                goto error;
     52422            }
     52423            while(isEnd == 0 && remainLen > 0) {
     52424                sectionLen += lineLen;
     52425                remainLen -= lineLen;
     52426                lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
     52427                                           remainLen);
     52428                if (lineLen <= 0) {
     52429                    goto error;
     52430                }
     52431                /* Line with just newline signals end of headers. */
     52432                if ((lineLen==2 && !XSTRNCMP(&section[sectionLen],
     52433                                             "\r\n", 2)) ||
     52434                    (lineLen==1 && (section[sectionLen] == '\r' ||
     52435                                    section[sectionLen] == '\n'))) {
     52436                    isEnd = 1;
     52437                }
     52438            }
     52439            section[sectionLen] = '\0';
     52440            ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs);
     52441            if (ret < 0) {
     52442                WOLFSSL_MSG("Parsing MIME headers failed.\n");
     52443                goto error;
     52444            }
     52445            curHdr = wc_MIME_find_header_name(kContType, allHdrs);
     52446            if (curHdr == NULL || (XSTRNCMP(curHdr->body, kAppPkcsSign,
     52447                                   XSTR_SIZEOF(kAppPkcsSign)) &&
     52448                                   XSTRNCMP(curHdr->body, kAppXPkcsSign,
     52449                                   XSTR_SIZEOF(kAppXPkcsSign)))) {
     52450                WOLFSSL_MSG("S/MIME headers not found inside "
     52451                            "multipart message.\n");
     52452                goto error;
     52453            }
     52454
     52455            section[0] = '\0';
     52456            sectionLen = 0;
     52457            lineLen = wolfSSL_BIO_gets(in, section, remainLen);
     52458            while(XSTRNCMP(&section[sectionLen], boundary, boundLen) &&
     52459                  remainLen > 0) {
     52460                sectionLen += lineLen;
     52461                remainLen -= lineLen;
     52462                lineLen = wolfSSL_BIO_gets(in, &section[sectionLen],
     52463                                           remainLen);
     52464                if (lineLen <= 0) {
     52465                    goto error;
     52466                }
     52467            }
     52468
     52469            XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
     52470        }
     52471    }
     52472    else if (curHdr && (!XSTRNCMP(curHdr->body, kAppPkcs7Mime,
     52473                                  XSTR_SIZEOF(kAppPkcs7Mime)) ||
     52474                        !XSTRNCMP(curHdr->body, kAppXPkcs7Mime,
     52475                                  XSTR_SIZEOF(kAppXPkcs7Mime)))) {
     52476        sectionLen = wolfSSL_BIO_get_len(in);
     52477        if (sectionLen <= 0) {
     52478            goto error;
     52479        }
     52480        ret = wolfSSL_BIO_read(in, section, sectionLen);
     52481        if (ret < 0 || ret != sectionLen) {
     52482            WOLFSSL_MSG("Error reading input BIO.\n");
     52483            goto error;
     52484        }
     52485    }
     52486    else {
     52487        WOLFSSL_MSG("S/MIME headers not found.\n");
     52488        goto error;
     52489    }
     52490
     52491    curHdr = wc_MIME_find_header_name(kCTE, allHdrs);
     52492    if (curHdr == NULL) {
     52493        WOLFSSL_MSG("Content-Transfer-Encoding header not found, "
     52494                    "assuming base64 encoding.");
     52495    }
     52496    else if (XSTRNCMP(curHdr->body, "base64", XSTRLEN("base64"))) {
     52497        WOLFSSL_MSG("S/MIME encodings other than base64 are not "
     52498                    "currently supported.\n");
     52499        goto error;
     52500    }
     52501
     52502    if (section == NULL || sectionLen <= 0) {
     52503        goto error;
     52504    }
     52505    outLen = ((sectionLen*3+3)/4)+1;
     52506    out = (byte*)XMALLOC(outLen*sizeof(byte), NULL, DYNAMIC_TYPE_PKCS7);
     52507    outHead = out;
     52508    if (outHead == NULL) {
     52509        goto error;
     52510    }
     52511    /* Strip trailing newlines. */
     52512    while ((section[sectionLen-1] == '\r' || section[sectionLen-1] == '\n') &&
     52513           sectionLen > 0) {
     52514        sectionLen--;
     52515    }
     52516    section[sectionLen] = '\0';
     52517    ret = Base64_Decode((const byte*)section, sectionLen, out, &outLen);
     52518    if (ret < 0) {
     52519        WOLFSSL_MSG("Error base64 decoding S/MIME message.\n");
     52520        goto error;
     52521    }
     52522    pkcs7 = wolfSSL_d2i_PKCS7_ex(NULL, (const unsigned char**)&out, outLen,
     52523                                 bcontMem, bcontMemSz);
     52524
     52525
     52526    wc_MIME_free_hdrs(allHdrs);
     52527    XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
     52528    XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
     52529
     52530
     52531    return pkcs7;
     52532
     52533error:
     52534    wc_MIME_free_hdrs(allHdrs);
     52535    XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7);
     52536    XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7);
     52537    XFREE(section, NULL, DYNAMIC_TYPE_PKCS7);
     52538    wolfSSL_BIO_free(*bcont);
     52539
     52540    return NULL;
     52541}
     52542#endif /* HAVE_SMIME */
     52543#endif /* !NO_BIO */
    4710952544#endif /* OPENSSL_ALL && HAVE_PKCS7 */
    4711052545
     
    4712452559
    4712552560#ifdef OPENSSL_ALL
     52561#ifndef NO_BIO
    4712652562int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio,
    4712752563                                          WOLFSSL_EVP_PKEY* pkey,
     
    4719252628    if (ret == 0 && enc == NULL) {
    4719352629        type = PKCS8_PRIVATEKEY_TYPE;
     52630    #ifdef HAVE_ECC
    4719452631        if (pkey->type == EVP_PKEY_EC) {
    4719552632            algId = ECDSAk;
     
    4719752634                                                                        &oidSz);
    4719852635        }
    47199         else {
     52636        else
     52637    #endif
     52638        {
    4720052639            algId = RSAk;
    4720152640            curveOid = NULL;
     
    4737752816    return key;
    4737852817}
     52818
     52819#endif /* !NO_BIO */
    4737952820
    4738052821/* Detect which type of key it is before decoding. */
     
    4743952880#endif
    4744052881
    47441 #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
    47442     defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ)
    47443 int wolfSSL_X509_set_subject_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
     52882#if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \
     52883    !defined(WOLFCRYPT_ONLY)
     52884/* unlike wolfSSL_X509_NAME_dup this does not malloc a duplicate, only deep
     52885 * copy. "to" is expected to be a fresh blank name, if not pointers could be
     52886 * lost */
     52887int wolfSSL_X509_NAME_copy(WOLFSSL_X509_NAME* from, WOLFSSL_X509_NAME* to)
    4744452888{
    4744552889    int i;
    4744652890    WOLFSSL_X509_NAME_ENTRY* ne;
    4744752891
     52892    WOLFSSL_ENTER("wolfSSL_X509_NAME_copy");
     52893
     52894    if (from == NULL || to == NULL) {
     52895        WOLFSSL_MSG("NULL parameter");
     52896        return BAD_FUNC_ARG;
     52897    }
     52898
     52899    if (from->dynamicName) {
     52900        to->name = (char*)XMALLOC(from->sz, to->heap, DYNAMIC_TYPE_SUBJECT_CN);
     52901        if (to->name == NULL)
     52902            return WOLFSSL_FAILURE;
     52903        to->dynamicName = 1;
     52904    }
     52905    XMEMCPY(to->name, from->name, from->sz);
     52906    to->sz = from->sz;
     52907
     52908    for (i = 0; i < MAX_NAME_ENTRIES; i++) {
     52909        ne = wolfSSL_X509_NAME_get_entry(from, i);
     52910        if (ne != NULL)
     52911            wolfSSL_X509_NAME_add_entry(to, ne, i, 1);
     52912    }
     52913    to->entrySz = from->entrySz;
     52914    return WOLFSSL_SUCCESS;
     52915}
     52916
     52917
     52918/* copies over information from "name" to the "cert" subject name
     52919 * returns WOLFSSL_SUCCESS on success */
     52920int wolfSSL_X509_set_subject_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
     52921{
    4744852922    WOLFSSL_ENTER("X509_set_subject_name");
    4744952923    if (cert == NULL || name == NULL)
    4745052924        return WOLFSSL_FAILURE;
    4745152925
    47452     FreeX509Name(&cert->subject, cert->heap);
    47453     InitX509Name(&cert->subject, 0);
    47454     if (name->dynamicName) {
    47455         cert->subject.name = (char*)XMALLOC(name->sz, cert->heap,
    47456                                                        DYNAMIC_TYPE_SUBJECT_CN);
    47457         if (cert->subject.name == NULL)
    47458             return WOLFSSL_FAILURE;
    47459     }
    47460     XMEMCPY(cert->subject.name, name->name, name->sz);
    47461     cert->subject.sz = name->sz;
    47462 
    47463     for (i = 0; i < 10; i++) {
    47464         ne = wolfSSL_X509_NAME_get_entry(name, i);
    47465         if (ne != NULL)
    47466             wolfSSL_X509_NAME_add_entry(&cert->subject, ne, i, 1);
    47467     }
     52926    FreeX509Name(&cert->subject);
     52927    InitX509Name(&cert->subject, 0, cert->heap);
     52928
     52929    if (wolfSSL_X509_NAME_copy(name, &cert->subject) != WOLFSSL_SUCCESS) {
     52930        FreeX509Name(&cert->subject);
     52931        return WOLFSSL_FAILURE;
     52932    }
     52933
    4746852934    cert->subject.x509 = cert;
    47469     cert->subject.name = cert->subject.fullName.fullName;
    47470     cert->subject.sz = cert->subject.fullName.fullNameLen;
    47471 
    4747252935    return WOLFSSL_SUCCESS;
    4747352936}
    4747452937
     52938
     52939/* copies over information from "name" to the "cert" issuer name
     52940 * returns WOLFSSL_SUCCESS on success */
    4747552941int wolfSSL_X509_set_issuer_name(WOLFSSL_X509 *cert, WOLFSSL_X509_NAME *name)
    4747652942{
    47477     int i;
    47478     WOLFSSL_X509_NAME_ENTRY* ne;
    47479 
    4748052943    WOLFSSL_ENTER("X509_set_issuer_name");
    4748152944    if (cert == NULL || name == NULL)
    4748252945        return WOLFSSL_FAILURE;
    4748352946
    47484     FreeX509Name(&cert->issuer, cert->heap);
    47485     InitX509Name(&cert->issuer, 0);
    47486     if (name->dynamicName) {
    47487         cert->issuer.name = (char*)XMALLOC(name->sz, cert->heap,
    47488                                                        DYNAMIC_TYPE_SUBJECT_CN);
    47489         if (cert->issuer.name == NULL)
    47490             return WOLFSSL_FAILURE;
    47491     }
    47492     XMEMCPY(cert->issuer.name, name->name, name->sz);
    47493     cert->issuer.sz = name->sz;
    47494 
    47495     for (i = 0; i < 10; i++) {
    47496         ne = wolfSSL_X509_NAME_get_entry(name, i);
    47497         if (ne != NULL)
    47498             wolfSSL_X509_NAME_add_entry(&cert->issuer, ne, i, 1);
    47499     }
     52947    FreeX509Name(&cert->issuer);
     52948    InitX509Name(&cert->issuer, 0, cert->heap);
     52949
     52950    if (wolfSSL_X509_NAME_copy(name, &cert->issuer) != WOLFSSL_SUCCESS) {
     52951        FreeX509Name(&cert->issuer);
     52952        return WOLFSSL_FAILURE;
     52953    }
     52954
    4750052955    cert->issuer.x509 = cert;
    47501     cert->issuer.name = cert->issuer.fullName.fullName;
    47502     cert->issuer.sz = cert->issuer.fullName.fullNameLen;
    4750352956    cert->issuerSet = 1;
    4750452957
    4750552958    return WOLFSSL_SUCCESS;
    4750652959}
     52960
    4750752961
    4750852962int wolfSSL_X509_set_notAfter(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t)
     
    4751252966    }
    4751352967
    47514     XMEMCPY(&x509->notAfter, t, sizeof(WOLFSSL_ASN1_TIME));
     52968    x509->notAfter.type = t->type;
     52969    x509->notAfter.length = t->length;
     52970
     52971    XMEMCPY(x509->notAfter.data, t->data, CTC_DATE_SIZE);
    4751552972
    4751652973    return WOLFSSL_SUCCESS;
     
    4752352980    }
    4752452981
    47525     XMEMCPY(&x509->notBefore, t, sizeof(WOLFSSL_ASN1_TIME));
     52982    x509->notBefore.type = t->type;
     52983    x509->notBefore.length = t->length;
     52984
     52985    XMEMCPY(x509->notBefore.data, t->data, CTC_DATE_SIZE);
    4752652986
    4752752987    return WOLFSSL_SUCCESS;
     
    4753152991{
    4753252992    WOLFSSL_ENTER("wolfSSL_X509_set_serialNumber");
    47533     if (!x509 || !s || s->dataMax >= EXTERNAL_SERIAL_SIZE)
     52993    if (!x509 || !s || s->length >= EXTERNAL_SERIAL_SIZE)
    4753452994        return WOLFSSL_FAILURE;
    4753552995
    47536     if (s->isDynamic)
    47537         XSTRNCPY((char*)x509->serial,(char*)s->data,s->dataMax);
    47538     else
    47539         XSTRNCPY((char*)x509->serial,(char*)s->intData,s->dataMax);
    47540 
    47541     x509->serial[s->dataMax] = 0;
    47542     x509->serialSz = s->dataMax;
     52996    /* WOLFSSL_ASN1_INTEGER has type | size | data */
     52997    if (s->length < 3) {
     52998        return WOLFSSL_FAILURE;
     52999    }
     53000    XMEMCPY(x509->serial, s->data + 2, s->length - 2);
     53001    x509->serialSz = s->length - 2;
     53002    x509->serial[s->length] = 0;
    4754353003
    4754453004    return WOLFSSL_SUCCESS;
     
    4754853008int wolfSSL_X509_set_pubkey(WOLFSSL_X509 *cert, WOLFSSL_EVP_PKEY *pkey)
    4754953009{
    47550     byte* p;
     53010    byte* p = NULL;
    4755153011    WOLFSSL_ENTER("wolfSSL_X509_set_pubkey");
    4755253012
     
    4755453014        return WOLFSSL_FAILURE;
    4755553015
    47556     if (pkey->type == EVP_PKEY_RSA)
    47557         cert->pubKeyOID = RSAk;
    47558     else if (pkey->type == EVP_PKEY_EC)
     53016    if (pkey->type == EVP_PKEY_RSA
     53017#ifndef NO_DSA
     53018            || pkey->type == EVP_PKEY_DSA
     53019#endif /* !NO_DSA */
     53020            ) {
     53021        p = (byte*)XMALLOC(pkey->pkey_sz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
     53022        if (p == NULL)
     53023            return WOLFSSL_FAILURE;
     53024
     53025        if (cert->pubKey.buffer != NULL)
     53026            XFREE(cert->pubKey.buffer, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
     53027        cert->pubKey.buffer = p;
     53028        XMEMCPY(cert->pubKey.buffer, pkey->pkey.ptr, pkey->pkey_sz);
     53029        cert->pubKey.length = pkey->pkey_sz;
     53030#ifndef NO_DSA
     53031        if (pkey->type == EVP_PKEY_DSA)
     53032            cert->pubKeyOID = DSAk;
     53033        else
     53034#endif /* !NO_DSA */
     53035            cert->pubKeyOID = RSAk;
     53036    }
     53037#ifdef HAVE_ECC
     53038    else if (pkey->type == EVP_PKEY_EC) {
     53039        /* Generate since pkey->pkey.ptr may contain private key */
     53040        ecc_key* ecc;
     53041        int derSz;
     53042
     53043        if (pkey->ecc == NULL || pkey->ecc->internal == NULL)
     53044            return WOLFSSL_FAILURE;
     53045
     53046        ecc = (ecc_key*)pkey->ecc->internal;
     53047        derSz = wc_EccPublicKeyDerSize(ecc, 1);
     53048        if (derSz <= 0)
     53049            return WOLFSSL_FAILURE;
     53050
     53051        p = (byte*)XMALLOC(derSz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
     53052        if (p == NULL)
     53053            return WOLFSSL_FAILURE;
     53054
     53055        if ((derSz = wc_EccPublicKeyToDer(ecc, p, derSz, 1)) <= 0) {
     53056            XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
     53057            return WOLFSSL_FAILURE;
     53058        }
     53059        cert->pubKey.buffer = p;
     53060        cert->pubKey.length = derSz;
    4755953061        cert->pubKeyOID = ECDSAk;
     53062    }
     53063#endif /* HAVE_ECC */
    4756053064    else
    4756153065        return WOLFSSL_FAILURE;
    47562 
    47563     p = (byte*)XMALLOC(pkey->pkey_sz, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
    47564     if (p == NULL)
    47565         return WOLFSSL_FAILURE;
    47566 
    47567     if (cert->pubKey.buffer != NULL)
    47568         XFREE(cert->pubKey.buffer, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY);
    47569     cert->pubKey.buffer = p;
    47570     XMEMCPY(cert->pubKey.buffer, pkey->pkey.ptr, pkey->pkey_sz);
    47571     cert->pubKey.length = pkey->pkey_sz;
    4757253066
    4757353067    return WOLFSSL_SUCCESS;
     
    4758553079}
    4758653080
    47587 #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_CERT_GEN && WOLFSSL_CERT_REQ */
    47588 
    47589 #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \
     53081#endif /* (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) && WOLFSSL_CERT_GEN */
     53082
     53083#if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \
    4759053084    defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ)
    4759153085
     
    4759953093        return;
    4760053094
     53095    if (!ctx->x509) {
     53096        ctx->x509 = wolfSSL_X509_new();
     53097        if (!ctx->x509)
     53098            return;
     53099    }
     53100
    4760153101    /* Set parameters in ctx as long as ret == WOLFSSL_SUCCESS */
    4760253102    if (issuer)
     
    4762553125int wolfSSL_i2d_X509_REQ(WOLFSSL_X509* req, unsigned char** out)
    4762653126{
    47627     const unsigned char* der;
    4762853127    int derSz = 0;
     53128    int ret = WOLFSSL_FAILURE;
     53129    WOLFSSL_BIO* bio = NULL;
    4762953130    WOLFSSL_ENTER("wolfSSL_i2d_X509_REQ");
    4763053131
     
    4763353134    }
    4763453135
    47635     der = wolfSSL_X509_get_der(req, &derSz);
    47636     if (der == NULL) {
    47637         return MEMORY_E;
    47638     }
     53136    if (!(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem()))) {
     53137        return WOLFSSL_FAILURE;
     53138    }
     53139
     53140    if (wolfSSL_i2d_X509_REQ_bio(bio, req) != WOLFSSL_SUCCESS) {
     53141        WOLFSSL_MSG("wolfSSL_i2d_X509_REQ_bio error");
     53142        goto cleanup;
     53143    }
     53144
     53145    derSz = wolfSSL_BIO_get_len(bio);
    4763953146
    4764053147    if (*out == NULL) {
    4764153148        *out = (unsigned char*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_OPENSSL);
    47642         if (*out == NULL) {
    47643             return MEMORY_E;
    47644         }
    47645     }
    47646 
    47647     XMEMCPY(*out, der, derSz);
    47648 
    47649     return derSz;
     53149        if (!*out) {
     53150            WOLFSSL_MSG("malloc error");
     53151            ret = MEMORY_E;
     53152            goto cleanup;
     53153        }
     53154    }
     53155
     53156    if (wolfSSL_BIO_read(bio, *out, derSz) != derSz) {
     53157        WOLFSSL_MSG("wolfSSL_BIO_read error");
     53158        goto cleanup;
     53159    }
     53160
     53161    ret = derSz;
     53162cleanup:
     53163    wolfSSL_BIO_free(bio);
     53164
     53165    return ret;
    4765053166}
    4765153167
     
    4767153187    /* Create a Cert that has the certificate request fields. */
    4767253188    req->sigOID = wolfSSL_sigTypeFromPKEY((WOLFSSL_EVP_MD*)md, pkey);
    47673     if (wolfSSL_X509_make_der(req, 1, der, &derSz) != WOLFSSL_SUCCESS) {
     53189    if (wolfssl_x509_make_der(req, 1, der, &derSz, 0) != WOLFSSL_SUCCESS) {
    4767453190        return WOLFSSL_FAILURE;
    4767553191    }
     
    4768253198}
    4768353199
    47684 
    47685 #ifndef NO_WOLFSSL_STUB
     53200int wolfSSL_X509_REQ_sign_ctx(WOLFSSL_X509 *req,
     53201                              WOLFSSL_EVP_MD_CTX* md_ctx)
     53202{
     53203    if (md_ctx && md_ctx->pctx)
     53204        return wolfSSL_X509_REQ_sign(req, md_ctx->pctx->pkey,
     53205                wolfSSL_EVP_MD_CTX_md(md_ctx));
     53206    else
     53207        return WOLFSSL_FAILURE;
     53208}
     53209
     53210static int regenX509REQDerBuffer(WOLFSSL_X509* x509)
     53211{
     53212    int derSz = X509_BUFFER_SZ;
     53213    int ret = WOLFSSL_FAILURE;
     53214#ifdef WOLFSSL_SMALL_STACK
     53215    byte* der;
     53216    der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     53217    if (!der) {
     53218        WOLFSSL_MSG("malloc failed");
     53219        return WOLFSSL_FAILURE;
     53220    }
     53221#else
     53222    byte der[X509_BUFFER_SZ];
     53223#endif
     53224
     53225    if (wolfssl_x509_make_der(x509, 1, der, &derSz, 0) == WOLFSSL_SUCCESS) {
     53226        FreeDer(&x509->derCert);
     53227        if (AllocDer(&x509->derCert, derSz, CERT_TYPE, x509->heap) == 0) {
     53228            XMEMCPY(x509->derCert->buffer, der, derSz);
     53229            ret = WOLFSSL_SUCCESS;
     53230        }
     53231        else {
     53232            WOLFSSL_MSG("Failed to allocate DER buffer for X509");
     53233        }
     53234    }
     53235    else {
     53236        WOLFSSL_MSG("Unable to make DER for X509 REQ");
     53237    }
     53238#ifdef WOLFSSL_SMALL_STACK
     53239    XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER);
     53240#endif
     53241    return ret;
     53242}
     53243
    4768653244int wolfSSL_X509_REQ_add_extensions(WOLFSSL_X509* req,
    47687         WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* ext)
    47688 {
     53245        WOLF_STACK_OF(WOLFSSL_X509_EXTENSION)* ext_sk)
     53246{
     53247    if (!req || !ext_sk) {
     53248        WOLFSSL_MSG("Bad parameter");
     53249        return WOLFSSL_FAILURE;
     53250    }
     53251
     53252    while (ext_sk) {
     53253        WOLFSSL_X509_EXTENSION* ext = ext_sk->data.ext;
     53254
     53255        if (wolfSSL_X509_add_ext(req, ext, -1) != WOLFSSL_SUCCESS) {
     53256            WOLFSSL_MSG("wolfSSL_X509_add_ext error");
     53257            return WOLFSSL_FAILURE;
     53258        }
     53259
     53260        ext_sk = ext_sk->next;
     53261    }
     53262
     53263    return regenX509REQDerBuffer(req);
     53264}
     53265
     53266int wolfSSL_X509_REQ_add1_attr_by_txt(WOLFSSL_X509 *req,
     53267                              const char *attrname, int type,
     53268                              const unsigned char *bytes, int len)
     53269{
     53270    WOLFSSL_ENTER("wolfSSL_X509_REQ_add1_attr_by_txt");
     53271
     53272#ifdef HAVE_LIBEST
     53273    if (!req || !attrname || !bytes || type != MBSTRING_ASC) {
     53274        WOLFSSL_MSG("Bad parameter");
     53275        return WOLFSSL_FAILURE;
     53276    }
     53277
     53278    if (len < 0) {
     53279        len = (int)XSTRLEN((char*)bytes);
     53280    }
     53281
     53282    /* For now just pretend that we support this for libest testing */
     53283    if (len == XSTR_SIZEOF("1.3.6.1.1.1.1.22") &&
     53284            XMEMCMP("1.3.6.1.1.1.1.22", bytes, len) == 0) {
     53285        /* MAC Address */
     53286    }
     53287    else if (len == XSTR_SIZEOF("1.2.840.10045.2.1") &&
     53288            XMEMCMP("1.2.840.10045.2.1", bytes, len) == 0) {
     53289        /* ecPublicKey */
     53290    }
     53291    else if (len == XSTR_SIZEOF("1.2.840.10045.4.3.3") &&
     53292            XMEMCMP("1.2.840.10045.4.3.3", bytes, len) == 0) {
     53293        /* ecdsa-with-SHA384 */
     53294    }
     53295    else {
     53296        return WOLFSSL_FAILURE;
     53297    }
     53298
     53299    /* return error if not built for libest */
     53300    return WOLFSSL_SUCCESS;
     53301#else
    4768953302    (void)req;
    47690     (void)ext;
    47691     return WOLFSSL_FATAL_ERROR;
    47692 }
    47693 #endif
     53303    (void)attrname;
     53304    (void)type;
     53305    (void)bytes;
     53306    (void)len;
     53307    return WOLFSSL_FAILURE;
     53308#endif
     53309}
     53310
     53311int wolfSSL_X509_REQ_add1_attr_by_NID(WOLFSSL_X509 *req,
     53312                                      int nid, int type,
     53313                                      const unsigned char *bytes,
     53314                                      int len)
     53315{
     53316    WOLFSSL_ENTER("wolfSSL_X509_REQ_add1_attr_by_NID");
     53317
     53318    if (!req || !bytes || type != MBSTRING_ASC) {
     53319        WOLFSSL_MSG("Bad parameter");
     53320        return WOLFSSL_FAILURE;
     53321    }
     53322
     53323    switch (nid) {
     53324    case NID_pkcs9_challengePassword:
     53325        if (len < 0)
     53326            len = (int)XSTRLEN((char*)bytes);
     53327        if (len < CTC_NAME_SIZE) {
     53328            XMEMCPY(req->challengePw, bytes, len);
     53329            req->challengePw[len] = '\0';
     53330        }
     53331        else {
     53332            WOLFSSL_MSG("Challenge password too long");
     53333            return WOLFSSL_FAILURE;
     53334        }
     53335        if (req->challengePwAttr) {
     53336            wolfSSL_X509_ATTRIBUTE_free(req->challengePwAttr);
     53337        }
     53338        req->challengePwAttr = wolfSSL_X509_ATTRIBUTE_new();
     53339        if (req->challengePwAttr) {
     53340            req->challengePwAttr->value->value.asn1_string =
     53341                    wolfSSL_ASN1_STRING_new();
     53342            if (wolfSSL_ASN1_STRING_set(
     53343                    req->challengePwAttr->value->value.asn1_string,
     53344                    bytes, len) != WOLFSSL_SUCCESS) {
     53345                WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error");
     53346                return WOLFSSL_FAILURE;
     53347            }
     53348            req->challengePwAttr->value->type = V_ASN1_PRINTABLESTRING;
     53349        }
     53350        else {
     53351            WOLFSSL_MSG("wolfSSL_X509_ATTRIBUTE_new error");
     53352            return WOLFSSL_FAILURE;
     53353        }
     53354        break;
     53355    case NID_serialNumber:
     53356        if (len < 0)
     53357            len = (int)XSTRLEN((char*)bytes);
     53358        if (len + 1 > EXTERNAL_SERIAL_SIZE) {
     53359            WOLFSSL_MSG("SerialNumber too long");
     53360            return WOLFSSL_FAILURE;
     53361        }
     53362        XMEMCPY(req->serial, bytes, len);
     53363        req->serialSz = len;
     53364        break;
     53365    default:
     53366        WOLFSSL_MSG("Unsupported attribute");
     53367        return WOLFSSL_FAILURE;
     53368    }
     53369    return WOLFSSL_SUCCESS;
     53370}
     53371
     53372
     53373/* Return NID as the attr index */
     53374int wolfSSL_X509_REQ_get_attr_by_NID(const WOLFSSL_X509 *req,
     53375        int nid, int lastpos)
     53376{
     53377    WOLFSSL_ENTER("wolfSSL_X509_REQ_get_attr_by_NID");
     53378
     53379    /* Since we only support 1 attr per attr type then a lastpos of >= 0
     53380     * indicates that one was already returned */
     53381    if (!req || lastpos >= 0) {
     53382        WOLFSSL_MSG("Bad parameter");
     53383        return WOLFSSL_FATAL_ERROR;
     53384    }
     53385
     53386    switch (nid) {
     53387    case NID_pkcs9_challengePassword:
     53388        return req->challengePwAttr ? nid : WOLFSSL_FATAL_ERROR;
     53389    default:
     53390        WOLFSSL_MSG("Unsupported attribute");
     53391        return WOLFSSL_FATAL_ERROR;
     53392    }
     53393}
     53394
     53395/**
     53396 * @param req X509_REQ containing attribute
     53397 * @param loc NID of the attribute to return
     53398 */
     53399WOLFSSL_X509_ATTRIBUTE *wolfSSL_X509_REQ_get_attr(
     53400        const WOLFSSL_X509 *req, int loc)
     53401{
     53402    WOLFSSL_ENTER("wolfSSL_X509_REQ_get_attr");
     53403
     53404    if (!req) {
     53405        WOLFSSL_MSG("Bad parameter");
     53406        return NULL;
     53407    }
     53408
     53409    switch (loc) {
     53410    case NID_pkcs9_challengePassword:
     53411        return req->challengePwAttr;
     53412    default:
     53413        WOLFSSL_MSG("Unsupported attribute");
     53414        return NULL;
     53415    }
     53416}
     53417
     53418WOLFSSL_X509_ATTRIBUTE* wolfSSL_X509_ATTRIBUTE_new(void)
     53419{
     53420    WOLFSSL_X509_ATTRIBUTE* ret;
     53421    WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_new");
     53422    ret = (WOLFSSL_X509_ATTRIBUTE*)XMALLOC(sizeof(WOLFSSL_X509_ATTRIBUTE),
     53423            NULL, DYNAMIC_TYPE_OPENSSL);
     53424    if (!ret) {
     53425        WOLFSSL_MSG("malloc error");
     53426        return NULL;
     53427    }
     53428    XMEMSET(ret, 0, sizeof(WOLFSSL_X509_ATTRIBUTE));
     53429    ret->object = wolfSSL_ASN1_OBJECT_new();
     53430    ret->value = wolfSSL_ASN1_TYPE_new();
     53431    /* Don't allocate ret->set since WOLFSSL_ASN1_TYPE
     53432     * is not supported as a stack type */
     53433    if (!ret->object || !ret->value) {
     53434        WOLFSSL_MSG("wolfSSL_ASN1_OBJECT_new or wolfSSL_ASN1_TYPE_new error");
     53435        wolfSSL_X509_ATTRIBUTE_free(ret);
     53436        return NULL;
     53437    }
     53438    return ret;
     53439}
     53440
     53441void wolfSSL_X509_ATTRIBUTE_free(WOLFSSL_X509_ATTRIBUTE* attr)
     53442{
     53443    WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_free");
     53444    if (attr) {
     53445        if (attr->object) {
     53446            wolfSSL_ASN1_OBJECT_free(attr->object);
     53447        }
     53448        if (attr->value) {
     53449            wolfSSL_ASN1_TYPE_free(attr->value);
     53450        }
     53451        if (attr->set) {
     53452            wolfSSL_sk_free(attr->set);
     53453        }
     53454        XFREE(attr, NULL, DYNAMIC_TYPE_OPENSSL);
     53455    }
     53456}
     53457
     53458WOLFSSL_ASN1_TYPE *wolfSSL_X509_ATTRIBUTE_get0_type(
     53459        WOLFSSL_X509_ATTRIBUTE *attr, int idx)
     53460{
     53461    WOLFSSL_ENTER("wolfSSL_X509_ATTRIBUTE_get0_type");
     53462
     53463    if (!attr || idx != 0) {
     53464        WOLFSSL_MSG("Bad parameter");
     53465        return NULL;
     53466    }
     53467
     53468    return attr->value;
     53469}
     53470
     53471WOLFSSL_X509 *wolfSSL_X509_to_X509_REQ(WOLFSSL_X509 *x,
     53472        WOLFSSL_EVP_PKEY *pkey, const WOLFSSL_EVP_MD *md)
     53473{
     53474    WOLFSSL_ENTER("wolfSSL_X509_to_X509_REQ");
     53475    (void)pkey;
     53476    (void)md;
     53477    return wolfSSL_X509_dup(x);
     53478}
    4769453479
    4769553480int wolfSSL_X509_REQ_set_subject_name(WOLFSSL_X509 *req,
     
    4770353488    return wolfSSL_X509_set_pubkey(req, pkey);
    4770453489}
    47705 #endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_CERT_GEN && WOLFSSL_CERT_REQ */
    47706 
    47707 
     53490#endif /* OPENSSL_ALL && !NO_CERTS && WOLFSSL_CERT_GEN && WOLFSSL_CERT_REQ */
     53491
     53492#ifdef WOLFSSL_STATIC_EPHEMERAL
     53493static int SetStaticEphemeralKey(StaticKeyExchangeInfo_t* staticKE, int keyAlgo,
     53494    const char* key, unsigned int keySz, int format, void* heap, WOLFSSL_CTX* ctx)
     53495{
     53496    int ret = 0;
     53497    DerBuffer* der = NULL;
     53498    byte* keyBuf = NULL;
     53499#ifndef NO_FILESYSTEM
     53500    const char* keyFile = NULL;
     53501#endif
     53502
     53503    /* allow empty key to free buffer */
     53504    if (staticKE == NULL || (key == NULL && keySz > 0)) {
     53505        return BAD_FUNC_ARG;
     53506    }
     53507
     53508    WOLFSSL_ENTER("SetStaticEphemeralKey");
     53509
     53510    /* if key is already set free it */
     53511#ifndef NO_DH
     53512    if (keyAlgo == WC_PK_TYPE_DH && staticKE->dhKey &&
     53513            (ctx == NULL || staticKE->dhKey != ctx->staticKE.dhKey))
     53514        FreeDer(&staticKE->dhKey);
     53515#endif
     53516#ifdef HAVE_ECC
     53517    if (keyAlgo == WC_PK_TYPE_ECDH && staticKE->ecKey &&
     53518            (ctx == NULL || staticKE->ecKey != ctx->staticKE.ecKey))
     53519        FreeDer(&staticKE->ecKey);
     53520#endif
     53521
     53522    /* check if just free'ing key */
     53523    if (key == NULL && keySz == 0) {
     53524        return 0;
     53525    }
     53526
     53527#ifndef NO_FILESYSTEM
     53528    /* load file from filesystem */
     53529    if (key && keySz == 0) {
     53530        size_t keyBufSz = 0;
     53531        keyFile = (const char*)key;
     53532        ret = wc_FileLoad(keyFile, &keyBuf, &keyBufSz, heap);
     53533        if (ret != 0) {
     53534            return ret;
     53535        }
     53536        keySz = (unsigned int)keyBufSz;
     53537    }
     53538    else
     53539#endif
     53540    {
     53541        /* use as key buffer directly */
     53542        keyBuf = (byte*)key;
     53543    }
     53544
     53545    if (format == WOLFSSL_FILETYPE_PEM) {
     53546    #ifdef WOLFSSL_PEM_TO_DER
     53547        int keyFormat = 0;
     53548        ret = PemToDer(keyBuf, keySz, PRIVATEKEY_TYPE, &der,
     53549            heap, NULL, &keyFormat);
     53550        /* auto detect key type */
     53551        if (ret == 0 && keyAlgo == 0) {
     53552            if (keyFormat == ECDSAk)
     53553                keyAlgo = WC_PK_TYPE_ECDH;
     53554            else
     53555                keyAlgo = WC_PK_TYPE_DH;
     53556        }
     53557    #else
     53558        ret = NOT_COMPILED_IN;
     53559    #endif
     53560    }
     53561    else {
     53562        ret = AllocDer(&der, keySz, PRIVATEKEY_TYPE, heap);
     53563        if (ret == 0) {
     53564            XMEMCPY(der->buffer, keyBuf, keySz);
     53565        }
     53566    }
     53567
     53568    switch (keyAlgo) {
     53569    #ifndef NO_DH
     53570        case WC_PK_TYPE_DH:
     53571            staticKE->dhKey = der;
     53572            break;
     53573    #endif
     53574    #ifdef HAVE_ECC
     53575        case WC_PK_TYPE_ECDH:
     53576            staticKE->ecKey = der;
     53577            break;
     53578    #endif
     53579        default:
     53580            /* not supported */
     53581            ret = NOT_COMPILED_IN;
     53582            FreeDer(&der);
     53583            break;
     53584    }
     53585
     53586#ifndef NO_FILESYSTEM
     53587    if (keyFile && keyBuf) {
     53588        XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER);
     53589    }
     53590#endif
     53591
     53592    WOLFSSL_LEAVE("SetStaticEphemeralKey", ret);
     53593
     53594    return ret;
     53595}
     53596
     53597int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo,
     53598    const char* key, unsigned int keySz, int format)
     53599{
     53600    if (ctx == NULL) {
     53601        return BAD_FUNC_ARG;
     53602    }
     53603
     53604    return SetStaticEphemeralKey(&ctx->staticKE, keyAlgo, key, keySz, format,
     53605        ctx->heap, NULL);
     53606}
     53607
     53608int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo,
     53609    const char* key, unsigned int keySz, int format)
     53610{
     53611    if (ssl == NULL) {
     53612        return BAD_FUNC_ARG;
     53613    }
     53614
     53615    return SetStaticEphemeralKey(&ssl->staticKE, keyAlgo, key, keySz, format,
     53616        ssl->heap, ssl->ctx);
     53617}
     53618
     53619#endif /* WOLFSSL_STATIC_EPHEMERAL */
     53620
     53621#endif /* !WOLFCRYPT_ONLY */
  • azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/src/tls.c

    r457 r464  
    6060#endif /* HAVE_QSH */
    6161
    62 #if (!defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
    63         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)) || \
    64     (defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES))
     62#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
    6563static int TLSX_KeyShare_IsSupported(int namedGroup);
    6664#endif
    6765
    68 #if ((!defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
    69         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)) || \
    70     (defined(WOLFSSL_TLS13) && !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) \
    71         && !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)) || \
    72     ((defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
    73         defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES))) && \
    74      defined(HAVE_TLS_EXTENSIONS)
     66#ifdef HAVE_SUPPORTED_CURVES
    7567static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions);
    7668#endif
     
    135127
    136128#ifdef WOLFSSL_RENESAS_TSIP_TLS
     129   
     130    #if (WOLFSSL_RENESAS_TSIP_VER >=109)
     131
     132    int tsip_generateMasterSecretEx(
     133            byte        cipherSuiteFirst,
     134            byte        cipherSuite,
     135            const byte* pr,                 /* pre-master    */
     136            const byte* cr,                 /* client random */
     137            const byte* sr,                 /* server random */
     138            byte*       ms);
     139
     140    #elif (WOLFSSL_RENESAS_TSIP_VER >=106)
     141   
     142    int tsip_generateMasterSecret(
     143            const byte* pre,
     144            const byte* cr,
     145            const byte* sr,
     146            byte*       ms);
     147   
     148    #endif     
     149
    137150    int tsip_useable(const WOLFSSL *ssl);
    138     int tsip_generateMasterSecret(const byte *pre,
    139                                 const byte *cr,const byte *sr,
    140                                 byte *ms/* out */);
    141151    int tsip_generateSeesionKey(WOLFSSL *ssl);
    142     int tsip_generateVerifyData(const byte *ms, const byte *side,
    143                                 const byte *handshake_hash,
    144                                 byte *hashes /* out */);
    145 #endif
     152    int tsip_generateVerifyData(
     153            const byte* ms,
     154            const byte* side,
     155            const byte* handshake_hash,
     156            byte*       hashes);
     157
     158#endif /*WOLFSSL_RENESAS_TSIP_TLS*/
    146159
    147160int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
     
    535548    !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
    536549        if (tsip_useable(ssl)) {
     550           
     551            #if (WOLFSSL_RENESAS_TSIP_VER>=109)
     552
     553            ret = tsip_generateMasterSecretEx(
     554                            ssl->options.cipherSuite0,
     555                            ssl->options.cipherSuite,               
     556                            &ssl->arrays->preMasterSecret[VERSION_SZ],
     557                            ssl->arrays->clientRandom,
     558                            ssl->arrays->serverRandom,
     559                            ssl->arrays->tsip_masterSecret);
     560           
     561            #elif (WOLFSSL_RENESAS_TSIP_VER>=106)
     562
    537563            ret = tsip_generateMasterSecret(
    538564                            &ssl->arrays->preMasterSecret[VERSION_SZ],
     
    540566                            ssl->arrays->serverRandom,
    541567                            ssl->arrays->tsip_masterSecret);
     568
     569            #else
     570
     571            ret = NOT_COMPILED_IN;
     572
     573            #endif
    542574        } else
    543575#endif
     
    642674    return ret;
    643675}
    644 
    645 
    646 static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
    647 {
    648     if (verify) {
    649         seq[0] = ssl->keys.peer_sequence_number_hi;
    650         seq[1] = ssl->keys.peer_sequence_number_lo++;
    651         if (seq[1] > ssl->keys.peer_sequence_number_lo) {
    652             /* handle rollover */
    653             ssl->keys.peer_sequence_number_hi++;
    654         }
    655     }
    656     else {
    657         seq[0] = ssl->keys.sequence_number_hi;
    658         seq[1] = ssl->keys.sequence_number_lo++;
    659         if (seq[1] > ssl->keys.sequence_number_lo) {
    660             /* handle rollover */
    661             ssl->keys.sequence_number_hi++;
    662         }
    663     }
    664 }
    665 
    666 
    667 #ifdef WOLFSSL_DTLS
    668 static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
    669 {
    670     if (order == PREV_ORDER) {
    671         /* Previous epoch case */
    672         seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
    673                  (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
    674         seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
    675     }
    676     else if (order == PEER_ORDER) {
    677         seq[0] = ((word32)ssl->keys.curEpoch << 16) |
    678                  (ssl->keys.curSeq_hi & 0xFFFF);
    679         seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
    680     }
    681     else {
    682         seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
    683                  (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
    684         seq[1] = ssl->keys.dtls_sequence_number_lo;
    685     }
    686 }
    687 #endif /* WOLFSSL_DTLS */
    688 
    689 
    690 static WC_INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
    691 {
    692     word32 seq[2] = {0, 0};
    693 
    694     if (!ssl->options.dtls) {
    695         GetSEQIncrement(ssl, verifyOrder, seq);
    696     }
    697     else {
    698 #ifdef WOLFSSL_DTLS
    699         DtlsGetSEQ(ssl, verifyOrder, seq);
    700 #endif
    701     }
    702 
    703     c32toa(seq[0], out);
    704     c32toa(seq[1], out + OPAQUE32_LEN);
    705 }
    706 
    707 
    708 /*** end copy ***/
    709676
    710677
     
    11701137
    11711138int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
    1172              int content, int verify)
     1139             int content, int verify, int epochOrder)
    11731140{
    11741141    Hmac   hmac;
    11751142    byte   myInner[WOLFSSL_TLS_HMAC_INNER_SZ];
    11761143    int    ret = 0;
     1144    const byte* macSecret = NULL;
     1145    word32 hashSz = 0;
     1146
     1147    if (ssl == NULL)
     1148        return BAD_FUNC_ARG;
     1149
    11771150#ifdef HAVE_TRUNCATED_HMAC
    1178     word32 hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
     1151    hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
    11791152                                        : ssl->specs.hash_size;
    11801153#else
    1181     word32 hashSz = ssl->specs.hash_size;
    1182 #endif
    1183 
    1184     if (ssl == NULL)
    1185         return BAD_FUNC_ARG;
     1154    hashSz = ssl->specs.hash_size;
     1155#endif
    11861156
    11871157#ifdef HAVE_FUZZER
     
    11981168#endif
    11991169
    1200     wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
     1170    if (!ssl->options.dtls)
     1171        wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
     1172    else
     1173        wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, epochOrder);
    12011174#if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
    12021175    !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
     
    12181191        return ret;
    12191192
     1193
     1194#ifdef WOLFSSL_DTLS
     1195    if (ssl->options.dtls)
     1196        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
     1197    else
     1198        macSecret = wolfSSL_GetMacSecret(ssl, verify);
     1199#else
     1200    macSecret = wolfSSL_GetMacSecret(ssl, verify);
     1201#endif
    12201202    ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
    1221                                               wolfSSL_GetMacSecret(ssl, verify),
     1203                                              macSecret,
    12221204                                              ssl->specs.hash_size);
     1205
    12231206    if (ret == 0) {
    12241207        /* Constant time verification required. */
     
    13751358}
    13761359
     1360#ifdef WOLFSSL_TLS13
     1361
     1362/**
     1363 * Creates a new extension and prepend it to the provided list.
     1364 * Checks for duplicate extensions, keeps the newest.
     1365 */
     1366static int TLSX_Prepend(TLSX** list, TLSX_Type type, void* data, void* heap)
     1367{
     1368    TLSX* extension = TLSX_New(type, data, heap);
     1369    TLSX* curr = *list;
     1370
     1371    if (extension == NULL)
     1372        return MEMORY_E;
     1373
     1374    /* remove duplicate extensions, there should be only one of each type. */
     1375    while (curr && curr->next) {
     1376        if (curr->next->type == type) {
     1377            TLSX *next = curr->next;
     1378
     1379            curr->next = next->next;
     1380            next->next = NULL;
     1381
     1382            TLSX_FreeAll(next, heap);
     1383        }
     1384        curr = curr->next;
     1385    }
     1386
     1387    if (curr)
     1388        curr->next = extension;
     1389    else
     1390        *list = extension;
     1391
     1392    return 0;
     1393}
     1394
     1395#endif /* WOLFSSL_TLS13 */
     1396
    13771397#ifndef NO_WOLFSSL_CLIENT
    13781398
     
    29612981{
    29622982    int ret;
     2983#if !defined(NO_WOLFSSL_SERVER)
     2984    byte status_type;
     2985    word16 size = 0;
     2986#if defined(WOLFSSL_TLS13)
     2987    DecodedCert* cert;
     2988#endif
     2989#endif
     2990
     2991#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) \
     2992    && defined(WOLFSSL_TLS13)
     2993    OcspRequest* request;
     2994    TLSX* extension;
     2995    CertificateStatusRequest* csr;
     2996#endif
     2997
     2998#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
     2999 || !defined(NO_WOLFSSL_SERVER)
     3000    word32 offset = 0;
     3001#endif
     3002
     3003#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
     3004    word32 resp_length;
     3005#endif
    29633006
    29643007    /* shut up compiler warnings */
     
    29673010    if (!isRequest) {
    29683011#ifndef NO_WOLFSSL_CLIENT
    2969         TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
    2970         CertificateStatusRequest* csr = extension ?
    2971                               (CertificateStatusRequest*)extension->data : NULL;
     3012        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
     3013        csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
    29723014
    29733015        if (!csr) {
     
    29903032                    /* propagate nonce */
    29913033                    if (csr->request.ocsp.nonceSz) {
    2992                         OcspRequest* request =
    2993                              (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
     3034                        request =
     3035                            (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
    29943036
    29953037                        if (request) {
     
    30073049    #ifdef WOLFSSL_TLS13
    30083050        if (ssl->options.tls1_3) {
    3009             word32       resp_length;
    3010             word32       offset = 0;
    3011 
    30123051            /* Get the new extension potentially created above. */
    30133052            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
     
    30273066                    ret = BUFFER_ERROR;
    30283067            }
    3029         #if !defined(NO_WOLFSSL_SERVER)
    30303068            if (ret == 0) {
    30313069                csr->response.buffer = input + offset;
    30323070                csr->response.length = resp_length;
    30333071            }
    3034         #endif
    30353072
    30363073            return ret;
     
    30463083    else {
    30473084#ifndef NO_WOLFSSL_SERVER
    3048         byte   status_type;
    3049         word16 offset = 0;
    3050         word16 size = 0;
    3051 
    30523085        if (length == 0)
    30533086            return 0;
    3054         if (length < ENUM_LEN)
    3055             return BUFFER_ERROR;
    30563087
    30573088        status_type = input[offset++];
     
    30613092
    30623093                /* skip responder_id_list */
    3063                 if (length - offset < OPAQUE16_LEN)
     3094                if ((int)(length - offset) < OPAQUE16_LEN)
    30643095                    return BUFFER_ERROR;
    30653096
     
    30683099
    30693100                /* skip request_extensions */
    3070                 if (length - offset < OPAQUE16_LEN)
     3101                if ((int)(length - offset) < OPAQUE16_LEN)
    30713102                    return BUFFER_ERROR;
    30723103
     
    31003131            return ret; /* throw error */
    31013132
    3102     #if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
     3133    #if defined(WOLFSSL_TLS13)
    31033134        if (ssl->options.tls1_3) {
    3104             OcspRequest* request;
    3105             TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
    3106             CertificateStatusRequest* csr = extension ?
     3135            cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
     3136                                         DYNAMIC_TYPE_DCERT);
     3137            if (cert == NULL) {
     3138                return MEMORY_E;
     3139            }
     3140            InitDecodedCert(cert, ssl->buffers.certificate->buffer,
     3141                            ssl->buffers.certificate->length, ssl->heap);
     3142            ret = ParseCert(cert, CERT_TYPE, 1, ssl->ctx->cm);
     3143            if (ret != 0 ) {
     3144                XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
     3145                return ret;
     3146            }
     3147            ret = TLSX_CSR_InitRequest(ssl->extensions, cert, ssl->heap);
     3148            if (ret != 0 ) {
     3149                XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
     3150                return ret;
     3151            }
     3152            XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
     3153
     3154            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
     3155            csr = extension ?
    31073156                (CertificateStatusRequest*)extension->data : NULL;
    31083157            if (csr == NULL)
     
    34543503
    34553504        while (length > offset) {
    3456             if (length - offset < ENUM_LEN + OPAQUE16_LEN)
     3505            if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
    34573506                return BUFFER_ERROR;
    34583507
     
    34693518                case WOLFSSL_CSR2_OCSP_MULTI:
    34703519                    /* skip responder_id_list */
    3471                     if (length - offset < OPAQUE16_LEN)
     3520                    if ((int)(length - offset) < OPAQUE16_LEN)
    34723521                        return BUFFER_ERROR;
    34733522
     
    34783527                    offset += OPAQUE16_LEN + size;
    34793528                    /* skip request_extensions */
    3480                     if (length - offset < OPAQUE16_LEN)
     3529                    if ((int)(length - offset) < OPAQUE16_LEN)
    34813530                        return BUFFER_ERROR;
    34823531
     
    35073556            #endif
    35083557
    3509             /* accept the first good status_type and return */
    3510             ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
     3558            /* TLS 1.3 servers MUST NOT act upon presence or information in
     3559             * this extension (RFC 8448 Section 4.4.2.1).
     3560             */
     3561            if (!IsAtLeastTLSv1_3(ssl->version)) {
     3562                /* accept the first good status_type and return */
     3563                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
    35113564                                         status_type, 0, ssl->heap, ssl->devId);
    3512             if (ret != WOLFSSL_SUCCESS)
    3513                 return ret; /* throw error */
    3514 
    3515             TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
    3516             ssl->status_request_v2 = status_type;
     3565                if (ret != WOLFSSL_SUCCESS)
     3566                    return ret; /* throw error */
     3567
     3568                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
     3569                ssl->status_request_v2 = status_type;
     3570            }
    35173571
    35183572            return 0;
     
    37083762#error Elliptic Curves Extension requires Elliptic Curve Cryptography. \
    37093763       Use --enable-ecc in the configure script or define HAVE_ECC. \
    3710        Alternatively use FFDHE for DH ciperhsuites.
     3764       Alternatively use FFDHE for DH ciphersuites.
    37113765#endif
    37123766
     
    38543908        #endif
    38553909        }
    3856         else {
    3857         #ifdef HAVE_FFDHE
    3858             return;
    3859         #endif
    3860         }
    3861     }
    3862 
     3910    }
     3911 #ifdef HAVE_FFDHE
     3912        return;
     3913 #endif
    38633914    /* turns semaphore on to avoid sending this extension. */
    38643915    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
    38653916}
    38663917
    3867 #endif
     3918#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
    38683919
    38693920#ifndef NO_WOLFSSL_SERVER
     
    38973948}
    38983949
    3899 #endif
     3950#endif /* !NO_WOLFSSL_SERVER */
     3951
    39003952#ifndef NO_WOLFSSL_CLIENT
    39013953
     
    40564108
    40574109    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
     4110    if (ext == NULL) {
     4111        WOLFSSL_MSG("Could not find supported groups extension");
     4112        return 0;
     4113    }
     4114
    40584115    curve = (SupportedCurve*)ext->data;
    40594116    name = curve->name;
     
    40814138}
    40824139
    4083 #endif
     4140#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
    40844141
    40854142#if defined(HAVE_FFDHE) && !defined(WOLFSSL_NO_TLS12)
     
    41304187
    41314188
    4132     if ((ret = TLSX_PopulateSupportedGroups(ssl, &priority)) != WOLFSSL_SUCCESS)
     4189    if ((ret = TLSX_PopulateSupportedGroups(ssl, &priority)) != WOLFSSL_SUCCESS) {
     4190        TLSX_FreeAll(priority, ssl->heap);
    41334191        return ret;
     4192    }
    41344193    ret = 0;
    41354194
     
    42314290}
    42324291
    4233 #endif
     4292#endif /* HAVE_SUPPORTED_CURVES */
    42344293
    42354294#ifndef NO_WOLFSSL_SERVER
     
    42624321    SupportedCurve* curve     = NULL;
    42634322    word32          oid       = 0;
     4323#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_ED25519) || \
     4324                              defined(HAVE_CURVE448) || defined(HAVE_ED448) || \
     4325                                (!defined(NO_RSA) && defined(WOLFSSL_STATIC_DH))
    42644326    word32          pkOid     = 0;
     4327#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 || (!NO_RSA && STATIC_DH) */
    42654328    word32          defOid    = 0;
    42664329    word32          defSz     = 80; /* Maximum known curve size is 66. */
     
    42744337
    42754338    (void)oid;
    4276 
     4339    (void)pkOid;
     4340
     4341    if (first == CHACHA_BYTE) {
     4342        switch (second) {
     4343            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
     4344            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
     4345            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
     4346            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
     4347                return 1; /* no suite restriction */
     4348            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
     4349            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
     4350            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
     4351                break;
     4352        }
     4353    }
    42774354    if (first == ECC_BYTE || first == CHACHA_BYTE)
    42784355        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
     
    42964373        switch (curve->name) {
    42974374#ifdef HAVE_ECC
    4298     #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
     4375    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
    42994376        #ifndef NO_ECC_SECP
    43004377            case WOLFSSL_ECC_SECP160R1:
     
    43154392                break;
    43164393        #endif /* HAVE_ECC_KOBLITZ */
    4317     #endif
    4318     #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
     4394        #endif
     4395    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
    43194396        #ifndef NO_ECC_SECP
    43204397            case WOLFSSL_ECC_SECP192R1:
     
    43304407        #endif /* HAVE_ECC_KOBLITZ */
    43314408    #endif
    4332     #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
     4409    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
    43334410        #ifndef NO_ECC_SECP
    43344411            case WOLFSSL_ECC_SECP224R1:
     
    43444421        #endif /* HAVE_ECC_KOBLITZ */
    43454422    #endif
    4346     #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
     4423    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
    43474424        #ifndef NO_ECC_SECP
    43484425            case WOLFSSL_ECC_SECP256R1:
     
    43534430    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
    43544431#endif
    4355         #ifdef HAVE_CURVE25519
     4432        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
    43564433            case WOLFSSL_ECC_X25519:
    43574434                oid = ECC_X25519_OID;
     
    43654442        #endif /* HAVE_CURVE25519 */
    43664443#ifdef HAVE_ECC
    4367     #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
     4444    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
    43684445        #ifdef HAVE_ECC_KOBLITZ
    43694446            case WOLFSSL_ECC_SECP256K1:
     
    43794456        #endif /* HAVE_ECC_BRAINPOOL */
    43804457    #endif
    4381 #endif
    4382         #ifdef HAVE_CURVE448
     4458    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
     4459        #ifndef NO_ECC_SECP
     4460            case WOLFSSL_ECC_SECP384R1:
     4461                pkOid = oid = ECC_SECP384R1_OID;
     4462                octets = 48;
     4463                break;
     4464        #endif /* !NO_ECC_SECP */
     4465        #ifdef HAVE_ECC_BRAINPOOL
     4466            case WOLFSSL_ECC_BRAINPOOLP384R1:
     4467                pkOid = oid = ECC_BRAINPOOLP384R1_OID;
     4468                octets = 48;
     4469                break;
     4470        #endif /* HAVE_ECC_BRAINPOOL */
     4471    #endif
     4472#endif
     4473        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
    43834474            case WOLFSSL_ECC_X448:
    43844475                oid = ECC_X448_OID;
     
    43924483        #endif /* HAVE_CURVE448 */
    43934484#ifdef HAVE_ECC
    4394     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
    4395         #ifndef NO_ECC_SECP
    4396             case WOLFSSL_ECC_SECP384R1:
    4397                 pkOid = oid = ECC_SECP384R1_OID;
    4398                 octets = 48;
    4399                 break;
    4400         #endif /* !NO_ECC_SECP */
    4401         #ifdef HAVE_ECC_BRAINPOOL
    4402             case WOLFSSL_ECC_BRAINPOOLP384R1:
    4403                 pkOid = oid = ECC_BRAINPOOLP384R1_OID;
    4404                 octets = 48;
    4405                 break;
    4406         #endif /* HAVE_ECC_BRAINPOOL */
    4407     #endif
    4408     #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
     4485    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
    44094486        #ifdef HAVE_ECC_BRAINPOOL
    44104487            case WOLFSSL_ECC_BRAINPOOLP512R1:
     
    44144491        #endif /* HAVE_ECC_BRAINPOOL */
    44154492    #endif
    4416     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     4493    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
    44174494        #ifndef NO_ECC_SECP
    44184495            case WOLFSSL_ECC_SECP521R1:
     
    44564533        if (first == ECC_BYTE) {
    44574534            switch (second) {
     4535#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
    44584536                /* ECDHE_ECDSA */
    44594537                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
     
    44724550                break;
    44734551
    4474 #ifdef WOLFSSL_STATIC_DH
     4552    #ifdef WOLFSSL_STATIC_DH
    44754553                /* ECDH_ECDSA */
    44764554                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
     
    44934571                    key |= ssl->pkCurveOID == oid;
    44944572                break;
    4495 #endif /* WOLFSSL_STATIC_DH */
     4573    #endif /* WOLFSSL_STATIC_DH */
     4574#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
    44964575#ifndef NO_RSA
    44974576                /* ECDHE_RSA */
     
    45094588                break;
    45104589
    4511 #ifdef WOLFSSL_STATIC_DH
     4590    #ifdef WOLFSSL_STATIC_DH
    45124591                /* ECDH_RSA */
    45134592                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
     
    45304609                    key |= ssl->pkCurveOID == pkOid;
    45314610                break;
    4532 #endif /* WOLFSSL_STATIC_DH */
     4611    #endif /* WOLFSSL_STATIC_DH */
    45334612#endif
    45344613                default:
     
    45524631        if (first == CHACHA_BYTE) {
    45534632            switch (second) {
     4633#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
    45544634                /* ECDHE_ECDSA */
    45554635                case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
     
    45594639                    ephmSuite = 1;
    45604640                break;
     4641#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
    45614642#ifndef NO_RSA
    45624643                /* ECDHE_RSA */
     
    48164897        #endif
    48174898        }
    4818         else {
     4899        else if (ssl->secure_renegotiation != NULL) {
    48194900        #ifndef NO_WOLFSSL_CLIENT
    48204901            if (!ssl->secure_renegotiation->enabled) {
     
    49825063        }
    49835064
    4984         if (length == 0) {
     5065        if (length > SESSION_TICKET_LEN) {
     5066            ret = BAD_TICKET_MSG_SZ;
     5067        } else if (IsAtLeastTLSv1_3(ssl->version)) {
     5068            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
     5069            ssl->options.rejectTicket = 1;
     5070            ret = 0;  /* not fatal */
     5071        } else if (ssl->options.noTicketTls12) {
     5072            /* ignore ticket request */
     5073        } else if (length == 0) {
    49855074            /* blank ticket */
    49865075            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
    49875076            if (ret == WOLFSSL_SUCCESS) {
    49885077                ret = 0;
    4989                 TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);  /* send blank ticket */
     5078                /* send blank ticket */
     5079                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
    49905080                ssl->options.createTicket = 1;  /* will send ticket msg */
    49915081                ssl->options.useTicket    = 1;
     
    50155105                ssl->options.rejectTicket = 1;
    50165106                ret = 0;  /* not fatal */
     5107            } else if (ret == VERSION_ERROR) {
     5108                WOLFSSL_MSG("Process client ticket rejected, bad TLS version");
     5109                ssl->options.rejectTicket = 1;
     5110                ret = 0;  /* not fatal */
    50175111            } else if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) {
    50185112                WOLFSSL_MSG("Process client ticket fatal error, not using");
     
    58765970        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
    58775971    }
    5878 #ifndef WOLFSSL_TLS13_DRAFT_18
    58795972    else if (msgType == server_hello || msgType == hello_retry_request)
    58805973        *pSz += OPAQUE16_LEN;
    5881 #endif
    58825974    else
    58835975        return SANITY_MSG_E;
     
    59576049        *pSz += (word16)(OPAQUE8_LEN + *cnt);
    59586050    }
    5959 #ifndef WOLFSSL_TLS13_DRAFT_18
    59606051    else if (msgType == server_hello || msgType == hello_retry_request) {
    5961     #ifdef WOLFSSL_TLS13_DRAFT
    5962         if (ssl->version.major == SSLv3_MAJOR &&
    5963                                           ssl->version.minor == TLSv1_3_MINOR) {
    5964             output[0] = TLS_DRAFT_MAJOR;
    5965             output[1] = TLS_DRAFT_MINOR;
    5966         }
    5967         else
    5968     #endif
    5969         {
    5970             output[0] = ssl->version.major;
    5971             output[1] = ssl->version.minor;
    5972         }
     6052        output[0] = ssl->version.major;
     6053        output[1] = ssl->version.minor;
    59736054
    59746055        *pSz += OPAQUE16_LEN;
    59756056    }
    5976 #endif
    59776057    else
    59786058        return SANITY_MSG_E;
     
    59986078    int newMinor = 0;
    59996079    int set = 0;
     6080    int ret;
    60006081
    60016082    if (msgType == client_hello) {
     
    60506131                if (!ssl->options.tls1_3) {
    60516132                    ssl->options.tls1_3 = 1;
    6052                     TLSX_Push(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, ssl,
    6053                               ssl->heap);
    6054 #ifndef WOLFSSL_TLS13_DRAFT_18
     6133                    ret = TLSX_Prepend(&ssl->extensions,
     6134                              TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
     6135                    if (ret != 0) {
     6136                        return ret;
     6137                    }
    60556138                    TLSX_SetResponse(ssl, TLSX_SUPPORTED_VERSIONS);
    6056 #endif
    60576139                }
    60586140                if (minor > newMinor) {
     
    60756157        }
    60766158    }
    6077 #ifndef WOLFSSL_TLS13_DRAFT_18
    60786159    else if (msgType == server_hello || msgType == hello_retry_request) {
    60796160        /* Must contain one version. */
     
    60846165        minor = input[OPAQUE8_LEN];
    60856166
    6086     #ifdef WOLFSSL_TLS13_DRAFT
    6087         if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
    6088             major = SSLv3_MAJOR;
    6089             minor = TLSv1_3_MINOR;
    6090         }
    6091     #endif
    6092 
    60936167        if (major != pv.major)
    60946168            return VERSION_ERROR;
     
    61206194        }
    61216195    }
    6122 #endif
    61236196    else
    61246197        return SANITY_MSG_E;
     
    61556228#endif /* WOLFSSL_TLS13 */
    61566229
    6157 #if defined(WOLFSSL_TLS13)
     6230#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
    61586231
    61596232/******************************************************************************/
     
    63026375        XMEMCPY(&cookie->data + len, mac, macSz);
    63036376
     6377    if (extension->data != NULL)
     6378        XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
     6379
    63046380    extension->data = (void*)cookie;
    63056381    extension->resp = (byte)resp;
     
    63216397
    63226398#endif
    6323 #if !defined(WOLFSSL_NO_SIGALG)
     6399#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    63246400/******************************************************************************/
    63256401/* Signature Algorithms                                                       */
     
    64186494        return BUFFER_ERROR;
    64196495
     6496    /* Sig Algo list size must be even. */
     6497    if (suites->hashSigAlgoSz % 2 != 0)
     6498        return BUFFER_ERROR;
     6499
    64206500    /* truncate hashSigAlgo list if too long */
    64216501    suites->hashSigAlgoSz = len;
     
    64536533/******************************************************************************/
    64546534
    6455 #ifdef WOLFSSL_TLS13
    6456 #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     6535#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    64576536/* Return the size of the SignatureAlgorithms extension's data.
    64586537 *
     
    65416620#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
    65426621#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
    6543 #endif /* !WOLFSSL_TLS13_DRAFT_18 && !WOLFSSL_TLS13_DRAFT_22 */
    65446622#endif /* WOLFSSL_TLS13 */
    65456623
     
    65496627/******************************************************************************/
    65506628
    6551 #ifdef WOLFSSL_TLS13
     6629#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
    65526630/* Create a key share entry using named Diffie-Hellman parameters group.
    65536631 * Generates a key pair.
     
    66236701    }
    66246702
    6625     /* Allocate space for the public key. */
     6703    /* Allocate space for the public key */
    66266704    dataSz = params->p_len;
    66276705    keyData = (byte*)XMALLOC(dataSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
     
    66306708        goto end;
    66316709    }
    6632     /* Allocate space for the private key. */
     6710    /* Allocate space for the private key */
    66336711    key = (byte*)XMALLOC(keySz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
    66346712    if (key == NULL) {
     
    66446722        goto end;
    66456723
    6646     /* Generate a new key pair. */
    6647     ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, (byte*)key, &keySz, keyData,
    6648                                &dataSz);
    6649 #ifdef WOLFSSL_ASYNC_CRYPT
    6650     /* TODO: Make this function non-blocking */
    6651     if (ret == WC_PENDING_E) {
    6652         ret = wc_AsyncWait(ret, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
    6653     }
    6654 #endif
     6724#if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
     6725    if (ssl->staticKE.dhKey) {
     6726        DerBuffer* keyDer = ssl->staticKE.dhKey;
     6727        word32 idx = 0;
     6728        WOLFSSL_MSG("Using static DH key");
     6729        ret = wc_DhKeyDecode(keyDer->buffer, &idx, dhKey, keyDer->length);
     6730        if (ret == 0) {
     6731            ret = wc_DhExportKeyPair(dhKey, (byte*)key, &keySz, keyData, &dataSz);
     6732        }
     6733    }
     6734    else
     6735#endif
     6736    {
     6737        /* Generate a new key pair */
     6738        ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, (byte*)key, &keySz, keyData,
     6739                                &dataSz);
     6740    #ifdef WOLFSSL_ASYNC_CRYPT
     6741        /* TODO: Make this function non-blocking */
     6742        if (ret == WC_PENDING_E) {
     6743            ret = wc_AsyncWait(ret, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
     6744        }
     6745    #endif
     6746    }
    66556747    if (ret != 0)
    66566748        goto end;
    66576749
    66586750    if (params->p_len != dataSz) {
    6659         /* Pad the front of the key data with zeros. */
     6751        /* Zero pad the front of the public key to match prime "p" size */
    66606752        XMEMMOVE(keyData + params->p_len - dataSz, keyData, dataSz);
    66616753        XMEMSET(keyData, 0, params->p_len - dataSz);
     
    68656957    /* Translate named group to a curve id. */
    68666958    switch (kse->group) {
    6867     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
     6959    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
    68686960        #ifndef NO_ECC_SECP
    68696961        case WOLFSSL_ECC_SECP256R1:
     
    68746966        #endif /* !NO_ECC_SECP */
    68756967    #endif
    6876     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
     6968    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
    68776969        #ifndef NO_ECC_SECP
    68786970        case WOLFSSL_ECC_SECP384R1:
     
    68836975        #endif /* !NO_ECC_SECP */
    68846976    #endif
    6885     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     6977    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
    68866978        #ifndef NO_ECC_SECP
    68876979        case WOLFSSL_ECC_SECP521R1:
     
    68926984        #endif /* !NO_ECC_SECP */
    68936985    #endif
    6894     #ifdef HAVE_X448
     6986    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
    68956987        case WOLFSSL_ECC_X448:
    68966988            curveId = ECC_X448;
     
    69157007    if (ret != 0)
    69167008        goto end;
    6917     ret = wc_ecc_make_key_ex(ssl->rng, keySize, eccKey, curveId);
    6918 #ifdef WOLFSSL_ASYNC_CRYPT
    6919     /* TODO: Make this function non-blocking */
    6920     if (ret == WC_PENDING_E) {
    6921         ret = wc_AsyncWait(ret, &eccKey->asyncDev, WC_ASYNC_FLAG_NONE);
    6922     }
    6923 #endif
     7009
     7010#ifdef WOLFSSL_STATIC_EPHEMERAL
     7011    if (ssl->staticKE.ecKey) {
     7012        DerBuffer* keyDer = ssl->staticKE.ecKey;
     7013        word32 idx = 0;
     7014        WOLFSSL_MSG("Using static ECDH key");
     7015        ret = wc_EccPrivateKeyDecode(keyDer->buffer, &idx, eccKey, keyDer->length);
     7016    }
     7017    else
     7018#endif
     7019    {
     7020        /* Generate ephemeral ECC key */
     7021        ret = wc_ecc_make_key_ex(ssl->rng, keySize, eccKey, curveId);
     7022    #ifdef WOLFSSL_ASYNC_CRYPT
     7023        /* TODO: Make this function non-blocking */
     7024        if (ret == WC_PENDING_E) {
     7025            ret = wc_AsyncWait(ret, &eccKey->asyncDev, WC_ASYNC_FLAG_NONE);
     7026        }
     7027    #endif
     7028    }
    69247029    if (ret != 0)
    69257030        goto end;
     
    74107515    /* find supported curve */
    74117516    switch (keyShareEntry->group) {
    7412     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
     7517    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
    74137518        #ifndef NO_ECC_SECP
    74147519        case WOLFSSL_ECC_SECP256R1:
     
    74177522        #endif /* !NO_ECC_SECP */
    74187523    #endif
    7419     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
     7524    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
    74207525        #ifndef NO_ECC_SECP
    74217526        case WOLFSSL_ECC_SECP384R1:
     
    74247529        #endif /* !NO_ECC_SECP */
    74257530    #endif
    7426     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     7531    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
    74277532        #ifndef NO_ECC_SECP
    74287533        case WOLFSSL_ECC_SECP521R1:
     
    74317536        #endif /* !NO_ECC_SECP */
    74327537    #endif
    7433     #ifdef HAVE_X448
     7538    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
    74347539        case WOLFSSL_ECC_X448:
    74357540            curveId = ECC_X448;
     
    74527557    }
    74537558    ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
     7559
     7560#if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
     7561    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \
     7562    !defined(HAVE_SELFTEST)
     7563    ret = wc_ecc_set_rng(keyShareKey, ssl->rng);
     7564    if (ret != 0) {
     7565        return ret;
     7566    }
     7567#endif
    74547568
    74557569    do {
     
    78978011            break;
    78988012    #endif
    7899     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
     8013    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
    79008014        #ifndef NO_ECC_SECP
    79018015        case WOLFSSL_ECC_SECP256R1:
     
    79038017        #endif /* !NO_ECC_SECP */
    79048018    #endif
    7905     #ifdef HAVE_CURVE25519
     8019    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
    79068020        case WOLFSSL_ECC_X25519:
    79078021            break;
    79088022    #endif
    7909     #ifdef HAVE_CURVE448
     8023    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
    79108024        case WOLFSSL_ECC_X448:
    79118025            break;
    79128026    #endif
    7913     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
     8027    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
    79148028        #ifndef NO_ECC_SECP
    79158029        case WOLFSSL_ECC_SECP384R1:
     
    79178031        #endif /* !NO_ECC_SECP */
    79188032    #endif
    7919     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     8033    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
    79208034        #ifndef NO_ECC_SECP
    79218035        case WOLFSSL_ECC_SECP521R1:
     
    79448058    if (ssl->numGroups == 0) {
    79458059#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
    7946     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
     8060    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
    79478061        #ifndef NO_ECC_SECP
    79488062            ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP256R1;
     
    79518065#endif
    79528066    #ifndef HAVE_FIPS
    7953         #if defined(HAVE_CURVE25519)
     8067        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
    79548068            ssl->group[ssl->numGroups++] = WOLFSSL_ECC_X25519;
    79558069        #endif
    79568070    #endif
    79578071    #ifndef HAVE_FIPS
    7958         #if defined(HAVE_CURVE448)
     8072        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
    79598073            ssl->group[ssl->numGroups++] = WOLFSSL_ECC_X448;
    79608074        #endif
    79618075    #endif
    79628076#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
    7963     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
     8077    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
    79648078        #ifndef NO_ECC_SECP
    79658079            ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP384R1;
    79668080        #endif
    79678081    #endif
    7968     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     8082    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
    79698083        #ifndef NO_ECC_SECP
    79708084            ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP521R1;
     
    80918205            return BAD_KEY_SHARE_DATA;
    80928206
    8093     #ifdef OPENSSL_EXTRA
    80948207        if ((clientKSE->group & NAMED_DH_MASK) == 0) {
     8208            /* Check max value supported. */
     8209            if (clientKSE->group > WOLFSSL_ECC_MAX) {
     8210                continue;
     8211            }
     8212        #ifdef OPENSSL_EXTRA
    80958213            /* Check if server supports group. */
    8096             if (ssl->ctx->disabledCurves & (1 << clientKSE->group))
     8214            if (ssl->ctx->disabledCurves & ((word32)1 << clientKSE->group))
    80978215                continue;
    8098         }
    8099     #endif
     8216        #endif
     8217        }
    81008218        if (!TLSX_KeyShare_IsSupported(clientKSE->group))
    81018219            continue;
     
    84058523
    84068524        /* Length of identities and of binders. */
    8407         if (length - idx < OPAQUE16_LEN + OPAQUE16_LEN)
     8525        if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
    84088526            return BUFFER_E;
    84098527
     
    89559073 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
    89569074 *
    8957  * max      The maximum early data size.
     9075 * maxSz    The maximum early data size.
    89589076 * output   The buffer to write into.
    89599077 * msgType  The type of the message this extension is being written into.
    89609078 * returns the number of bytes written into the buffer.
    89619079 */
    8962 static int TLSX_EarlyData_Write(word32 max, byte* output, byte msgType,
     9080static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
    89639081                                word16* pSz)
    89649082{
     
    89669084        return 0;
    89679085    else if (msgType == session_ticket) {
    8968         c32toa(max, output);
     9086        c32toa(maxSz, output);
    89699087        *pSz += OPAQUE32_LEN;
    89709088        return 0;
     
    90239141/* Use the data to create a new Early Data object in the extensions.
    90249142 *
    9025  * ssl  The SSL/TLS object.
    9026  * max  The maximum early data size.
     9143 * ssl    The SSL/TLS object.
     9144 * maxSz  The maximum early data size.
    90279145 * returns 0 on success and other values indicate failure.
    90289146 */
    9029 int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 max)
     9147int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz)
    90309148{
    90319149    int   ret = 0;
     
    90469164
    90479165    extension->resp = 1;
    9048     extension->val  = max;
     9166    extension->val  = maxSz;
    90499167
    90509168    return 0;
     
    91069224        switch (extension->type) {
    91079225
     9226#ifdef HAVE_SNI
    91089227            case TLSX_SERVER_NAME:
    91099228                SNI_FREE_ALL((SNI*)extension->data, heap);
    91109229                break;
     9230#endif
    91119231
    91129232            case TLSX_TRUSTED_CA_KEYS:
     
    91189238                break;
    91199239
     9240            case TLSX_EXTENDED_MASTER_SECRET:
    91209241            case TLSX_TRUNCATED_HMAC:
    91219242                /* Nothing to do. */
     
    91549275                ALPN_FREE_ALL((ALPN*)extension->data, heap);
    91559276                break;
    9156 #if !defined(WOLFSSL_NO_SIGALG)
     9277#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    91579278            case TLSX_SIGNATURE_ALGORITHMS:
    91589279                break;
     
    91669287                break;
    91679288
     9289    #ifdef WOLFSSL_SEND_HRR_COOKIE
    91689290            case TLSX_COOKIE:
    91699291                CKE_FREE_ALL((Cookie*)extension->data, heap);
    91709292                break;
     9293    #endif
    91719294
    91729295    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     
    91899312    #endif
    91909313
    9191     #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     9314    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    91929315            case TLSX_SIGNATURE_ALGORITHMS_CERT:
    91939316                break;
     
    92359358        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
    92369359
    9237 
    92389360        switch (extension->type) {
    92399361
     9362#ifdef HAVE_SNI
    92409363            case TLSX_SERVER_NAME:
    92419364                /* SNI only sends the name on the request. */
     
    92439366                    length += SNI_GET_SIZE((SNI*)extension->data);
    92449367                break;
     9368#endif
    92459369
    92469370            case TLSX_TRUSTED_CA_KEYS:
     
    92549378                break;
    92559379
     9380            case TLSX_EXTENDED_MASTER_SECRET:
    92569381            case TLSX_TRUNCATED_HMAC:
    92579382                /* always empty. */
     
    92949419                length += ALPN_GET_SIZE((ALPN*)extension->data);
    92959420                break;
    9296 #if !defined(WOLFSSL_NO_SIGALG)
     9421#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    92979422            case TLSX_SIGNATURE_ALGORITHMS:
    92989423                length += SA_GET_SIZE(extension->data);
     
    93099434                break;
    93109435
     9436    #ifdef WOLFSSL_SEND_HRR_COOKIE
    93119437            case TLSX_COOKIE:
    93129438                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &length);
    93139439                break;
     9440    #endif
    93149441
    93159442    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     
    93369463    #endif
    93379464
    9338     #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     9465    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    93399466            case TLSX_SIGNATURE_ALGORITHMS_CERT:
    93409467                length += SAC_GET_SIZE(extension->data);
     
    93879514        /* extension data should be written internally. */
    93889515        switch (extension->type) {
     9516#ifdef HAVE_SNI
    93899517            case TLSX_SERVER_NAME:
    93909518                if (isRequest) {
     
    93939521                }
    93949522                break;
     9523#endif
    93959524
    93969525            case TLSX_TRUSTED_CA_KEYS:
     
    94049533                WOLFSSL_MSG("Max Fragment Length extension to write");
    94059534                offset += MFL_WRITE((byte*)extension->data, output + offset);
     9535                break;
     9536
     9537            case TLSX_EXTENDED_MASTER_SECRET:
     9538                WOLFSSL_MSG("Extended Master Secret");
     9539                /* always empty. */
    94069540                break;
    94079541
     
    94619595                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
    94629596                break;
    9463 #if !defined(WOLFSSL_NO_SIGALG)
     9597#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    94649598            case TLSX_SIGNATURE_ALGORITHMS:
    94659599                WOLFSSL_MSG("Signature Algorithms extension to write");
     
    94799613                break;
    94809614
     9615    #ifdef WOLFSSL_SEND_HRR_COOKIE
    94819616            case TLSX_COOKIE:
    94829617                WOLFSSL_MSG("Cookie extension to write");
     
    94849619                                msgType, &offset);
    94859620                break;
     9621    #endif
    94869622
    94879623    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     
    95149650    #endif
    95159651
    9516     #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     9652    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    95179653            case TLSX_SIGNATURE_ALGORITHMS_CERT:
    95189654                WOLFSSL_MSG("Signature Algorithms extension to write");
     
    97339869#endif /* HAVE_QSH */
    97349870
    9735 #if (!defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
    9736         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)) || \
    9737     (defined(WOLFSSL_TLS13) && !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) \
    9738         && !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)) || \
    9739     ((defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
    9740         defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES))
     9871#ifdef HAVE_SUPPORTED_CURVES
    97419872
    97429873/* Populates the default supported groups / curves */
     
    97459876    int ret = WOLFSSL_SUCCESS;
    97469877#ifdef WOLFSSL_TLS13
    9747     int i;
    9748 
    97499878#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    97509879    if (ssl->options.resuming && ssl->session.namedGroup != 0) {
     
    97559884
    97569885    if (ssl->numGroups != 0) {
     9886        int i;
    97579887        for (i = 0; i < ssl->numGroups; i++) {
    97589888            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap);
     
    97649894#endif /* WOLFSSL_TLS13 */
    97659895
    9766 #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
     9896#if defined(HAVE_ECC)
    97679897        /* list in order by strength, since not all servers choose by strength */
    9768         #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     9898        #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
    97699899            #ifndef NO_ECC_SECP
    97709900                ret = TLSX_UseSupportedCurve(extensions,
     
    97739903            #endif
    97749904        #endif
    9775         #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
     9905        #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
    97769906            #ifdef HAVE_ECC_BRAINPOOL
    97779907                ret = TLSX_UseSupportedCurve(extensions,
     
    97809910            #endif
    97819911        #endif
    9782         #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
     9912        #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
    97839913            #ifndef NO_ECC_SECP
    97849914                ret = TLSX_UseSupportedCurve(extensions,
     
    97929922            #endif
    97939923        #endif
    9794 #endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */
     9924#endif /* HAVE_ECC */
    97959925
    97969926        #ifndef HAVE_FIPS
    9797             #if defined(HAVE_CURVE448)
     9927            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
    97989928                ret = TLSX_UseSupportedCurve(extensions,
    97999929                                                   WOLFSSL_ECC_X448, ssl->heap);
     
    98039933
    98049934#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
    9805         #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
     9935        #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
    98069936            #ifndef NO_ECC_SECP
    98079937                ret = TLSX_UseSupportedCurve(extensions,
     
    98209950            #endif
    98219951        #endif
    9822 #endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */
     9952#endif /* HAVE_ECC */
    98239953
    98249954        #ifndef HAVE_FIPS
    9825             #if defined(HAVE_CURVE25519)
     9955            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
    98269956                ret = TLSX_UseSupportedCurve(extensions,
    98279957                                                 WOLFSSL_ECC_X25519, ssl->heap);
     
    98319961
    98329962#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
    9833         #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
     9963        #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
    98349964            #ifndef NO_ECC_SECP
    98359965                ret = TLSX_UseSupportedCurve(extensions,
     
    98459975
    98469976    #ifndef HAVE_FIPS
    9847         #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
     9977        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
    98489978            #ifndef NO_ECC_SECP
    98499979                ret = TLSX_UseSupportedCurve(extensions,
     
    98579987            #endif
    98589988        #endif
    9859         #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
     9989        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
    98609990            #ifndef NO_ECC_SECP
    98619991                ret = TLSX_UseSupportedCurve(extensions,
     
    987510005        #endif
    987610006    #endif /* HAVE_FIPS */
    9877 #endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */
    9878 
    9879                 /* Add FFDHE supported groups. */
     10007#endif /* HAVE_ECC */
     10008
     10009            /* Add FFDHE supported groups. */
    988010010        #ifdef HAVE_FFDHE_8192
    988110011            if (8192/8 >= ssl->options.minDhKeySz &&
     
    993010060}
    993110061
    9932 #endif
     10062#endif /* HAVE_SUPPORTED_CURVES */
     10063
     10064#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
     10065
     10066static const word16 preferredGroup[] = {
     10067#if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
     10068    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256
     10069    WOLFSSL_ECC_SECP256R1,
     10070#endif
     10071#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
     10072    WOLFSSL_ECC_X25519,
     10073#endif
     10074#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
     10075    WOLFSSL_ECC_X448,
     10076#endif
     10077#if defined(HAVE_ECC) && (!defined(NO_ECC384) || \
     10078    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384
     10079    WOLFSSL_ECC_SECP384R1,
     10080#endif
     10081#if defined(HAVE_ECC) && (!defined(NO_ECC521) || \
     10082    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
     10083    WOLFSSL_ECC_SECP521R1,
     10084#endif
     10085#if defined(HAVE_FFDHE_2048)
     10086    WOLFSSL_FFDHE_2048,
     10087#endif
     10088#if defined(HAVE_FFDHE_3072)
     10089    WOLFSSL_FFDHE_3072,
     10090#endif
     10091#if defined(HAVE_FFDHE_4096)
     10092    WOLFSSL_FFDHE_4096,
     10093#endif
     10094#if defined(HAVE_FFDHE_6144)
     10095    WOLFSSL_FFDHE_6144,
     10096#endif
     10097#if defined(HAVE_FFDHE_8192)
     10098    WOLFSSL_FFDHE_8192,
     10099#endif
     10100};
     10101#define PREFERRED_GROUP_SZ (sizeof(preferredGroup) / sizeof(*preferredGroup))
     10102
     10103#endif /* WOLFSSL_TLS13 && HAVE_SUPPORTED_CURVES */
    993310104
    993410105int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
     
    1005210223    } /* is not server */
    1005310224
    10054 #if !defined(WOLFSSL_NO_SIGALG)
     10225#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    1005510226    WOLFSSL_MSG("Adding signature algorithms extension");
    1005610227    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
     
    1006110232    ret = 0;
    1006210233#endif
    10063     #ifdef WOLFSSL_TLS13
     10234#ifdef WOLFSSL_TLS13
    1006410235        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
    1006510236            /* Add mandatory TLS v1.3 extension: supported version */
     
    1007910250            ret = 0;
    1008010251        }
    10081     #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
    10082 
    10083         #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     10252    #endif /* !(HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
     10253 
     10254        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    1008410255            if (ssl->certHashSigAlgoSz > 0) {
    1008510256                WOLFSSL_MSG("Adding signature algorithms cert extension");
     
    1008910260                }
    1009010261            }
    10091         #endif /* !WOLFSSL_TLS13_DRAFT_18 && !WOLFSSL_TLS13_DRAFT_22 */
    10092 
     10262        #endif
     10263
     10264        #if defined(HAVE_SUPPORTED_CURVES)
    1009310265            if (TLSX_Find(ssl->extensions, TLSX_KEY_SHARE) == NULL) {
    1009410266                word16 namedGroup;
    1009510267
    10096         #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     10268            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    1009710269                if (ssl->options.resuming && ssl->session.namedGroup != 0)
    1009810270                    namedGroup = ssl->session.namedGroup;
    1009910271                else
    10100         #endif
    10101                 {
    10102         #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
    10103                               defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP)
    10104                     namedGroup = WOLFSSL_ECC_SECP256R1;
    10105         #elif defined(HAVE_CURVE25519)
    10106                     namedGroup = WOLFSSL_ECC_X25519;
    10107         #elif defined(HAVE_CURVE448)
    10108                     namedGroup = WOLFSSL_ECC_X448;
    10109         #elif defined(HAVE_ECC) && (!defined(NO_ECC384) || \
    10110                               defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP)
    10111                     namedGroup = WOLFSSL_ECC_SECP384R1;
    10112         #elif defined(HAVE_ECC) && (!defined(NO_ECC521) || \
    10113                               defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP)
    10114                     namedGroup = WOLFSSL_ECC_SECP521R1;
    10115         #elif defined(HAVE_FFDHE_2048)
    10116                     namedGroup = WOLFSSL_FFDHE_2048;
    10117         #elif defined(HAVE_FFDHE_3072)
    10118                     namedGroup = WOLFSSL_FFDHE_3072;
    10119         #elif defined(HAVE_FFDHE_4096)
    10120                     namedGroup = WOLFSSL_FFDHE_4096;
    10121         #elif defined(HAVE_FFDHE_6144)
    10122                     namedGroup = WOLFSSL_FFDHE_6144;
    10123         #elif defined(HAVE_FFDHE_8192)
    10124                     namedGroup = WOLFSSL_FFDHE_8192;
    10125         #else
     10272            #endif
     10273                if (PREFERRED_GROUP_SZ == 0) {
     10274                    WOLFSSL_MSG("No groups in preference list");
    1012610275                    return KEY_SHARE_ERROR;
    10127         #endif
     10276                }
     10277                else if (ssl->numGroups > 0) {
     10278                    int set = 0;
     10279                    int i, j;
     10280
     10281                    /* Default to first group in supported list. */
     10282                    namedGroup = ssl->group[0];
     10283                    /* Try to find preferred in supported list. */
     10284                    for (i = 0; i < (int)PREFERRED_GROUP_SZ && !set; i++) {
     10285                        for (j = 0; j < ssl->numGroups; j++) {
     10286                            if (preferredGroup[i] == ssl->group[j]) {
     10287                                /* Most preferred that is supported. */
     10288                                namedGroup = ssl->group[j];
     10289                                set = 1;
     10290                                break;
     10291                            }
     10292                        }
     10293                    }
     10294                }
     10295                else {
     10296                    /* Choose the most preferred group. */
     10297                    namedGroup = preferredGroup[0];
    1012810298                }
    1012910299                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL);
     
    1013110301                    return ret;
    1013210302            }
     10303        #endif
    1013310304
    1013410305        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     
    1017110342                byte cipherSuite0 = TLS13_BYTE;
    1017210343                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
     10344                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
    1017310345                const char* cipherName = NULL;
    1017410346
     
    1017910351                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
    1018010352                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
    10181                                                            &cipherSuite) != 0) {
     10353                                               &cipherSuite, &cipherSuiteFlags) != 0) {
    1018210354                        return PSK_KEY_ERROR;
    1018310355                    }
     
    1019310365                }
    1019410366                ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
    10195                 /* TODO: Callback should be able to change ciphersuite. */
    1019610367                ssl->options.cipherSuite0 = cipherSuite0;
    1019710368                ssl->options.cipherSuite  = cipherSuite;
     10369                (void)cipherSuiteFlags;
    1019810370                ret = SetCipherSpecs(ssl);
    1019910371                if (ret != 0)
     
    1023710409        }
    1023810410
    10239     #endif
     10411#endif
    1024010412
    1024110413    (void)isServer;
     
    1026410436        QSH_VALIDATE_REQUEST(ssl, semaphore);
    1026510437        WOLF_STK_VALIDATE_REQUEST(ssl);
    10266 #if !defined(WOLFSSL_NO_SIGALG)
     10438#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    1026710439        if (ssl->suites->hashSigAlgoSz == 0)
    1026810440            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
     
    1027110443        if (!IsAtLeastTLSv1_2(ssl))
    1027210444            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
     10445    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
    1027310446        if (!IsAtLeastTLSv1_3(ssl->version)) {
    1027410447            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
    10275     #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     10448        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    1027610449            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
    1027710450            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
     10451        #endif
     10452        #ifdef WOLFSSL_EARLY_DATA
     10453            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
     10454        #endif
     10455        #ifdef WOLFSSL_SEND_HRR_COOKIE
     10456            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
     10457        #endif
     10458        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
     10459            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
     10460        #endif
     10461        }
    1027810462    #endif
    10279     #ifdef WOLFSSL_EARLY_DATA
    10280             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
    10281     #endif
    10282             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
    10283     #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
    10284             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
    10285     #endif
    10286         }
    1028710463#endif
    1028810464    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
     
    1029910475    #ifndef NO_CERTS
    1030010476    else if (msgType == certificate_request) {
     10477        /* Don't send out any extension except those that are turned off. */
    1030110478        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    10302 #if !defined(WOLFSSL_NO_SIGALG)
     10479#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    1030310480        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
    1030410481#endif
     
    1035310530        WOLF_STK_VALIDATE_REQUEST(ssl);
    1035410531        QSH_VALIDATE_REQUEST(ssl, semaphore);
    10355 #if !defined(WOLFSSL_NO_SIGALG)
     10532#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    1035610533        if (ssl->suites->hashSigAlgoSz == 0)
    1035710534            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
     
    1036010537        if (!IsAtLeastTLSv1_2(ssl))
    1036110538            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
     10539    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
    1036210540        if (!IsAtLeastTLSv1_3(ssl->version)) {
    1036310541            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
    10364     #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     10542        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    1036510543            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
     10544        #endif
     10545        #ifdef WOLFSSL_EARLY_DATA
     10546            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
     10547        #endif
     10548        #ifdef WOLFSSL_SEND_HRR_COOKIE
     10549            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
     10550        #endif
     10551        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
     10552            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
     10553        #endif
     10554        }
    1036610555    #endif
    10367     #ifdef WOLFSSL_EARLY_DATA
    10368             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
    10369     #endif
    10370             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
    10371     #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
    10372             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
    10373     #endif
    10374         }
    1037510556    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    1037610557        /* Must write Pre-shared Key extension at the end in TLS v1.3.
     
    1039310574    #ifndef NO_CERTS
    1039410575    else if (msgType == certificate_request) {
     10576        /* Don't send out any extension except those that are turned off. */
    1039510577        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    10396 #if !defined(WOLFSSL_NO_SIGALG)
     10578#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    1039710579        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
    1039810580#endif
     
    1046710649                if (IsAtLeastTLSv1_3(ssl->version)) {
    1046810650                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    10469         #ifndef WOLFSSL_TLS13_DRAFT_18
    1047010651                    TURN_OFF(semaphore,
    1047110652                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
    10472         #endif
     10653            #ifdef HAVE_SUPPORTED_CURVES
    1047310654                    if (!ssl->options.noPskDheKe)
    1047410655                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     10656            #endif
    1047510657        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    1047610658                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
    1047710659        #endif
    1047810660                }
     10661        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
    1047910662                else {
     10663            #ifdef HAVE_SUPPORTED_CURVES
    1048010664                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
    10481         #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     10665            #endif
     10666            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    1048210667                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
     10668            #endif
     10669                }
    1048310670        #endif
    10484                 }
    1048510671    #endif
    1048610672            break;
     
    1048910675        case hello_retry_request:
    1049010676            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    10491         #ifndef WOLFSSL_TLS13_DRAFT_18
    1049210677                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
    10493         #endif
     10678        #ifdef HAVE_SUPPORTED_CURVES
    1049410679            if (!ssl->options.noPskDheKe)
    1049510680                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     10681        #endif
     10682        #ifdef WOLFSSL_SEND_HRR_COOKIE
    1049610683            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
     10684        #endif
    1049710685            break;
    1049810686    #endif
     
    1050010688    #ifdef WOLFSSL_TLS13
    1050110689        case encrypted_extensions:
     10690            /* Send out all extension except those that are turned on. */
     10691        #ifdef HAVE_ECC
    1050210692            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
     10693        #endif
    1050310694            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
     10695        #ifdef HAVE_SESSION_TICKET
    1050410696            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
     10697        #endif
     10698        #ifdef HAVE_SUPPORTED_CURVES
    1050510699            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     10700        #endif
    1050610701        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    1050710702            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
     
    1050910704        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
    1051010705            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
     10706        #endif
     10707        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
     10708            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
    1051110709        #endif
    1051210710        #if defined(HAVE_SECURE_RENEGOTIATION)
     
    1052910727    #ifndef NO_CERTS
    1053010728        case certificate:
     10729            /* Don't send out any extension except those that are turned off. */
    1053110730            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    1053210731            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
     
    1058710786                if (IsAtLeastTLSv1_3(ssl->version)) {
    1058810787                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    10589         #ifndef WOLFSSL_TLS13_DRAFT_18
    1059010788                    TURN_OFF(semaphore,
    1059110789                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
    10592         #endif
     10790            #ifdef HAVE_SUPPORTED_CURVES
    1059310791                    if (!ssl->options.noPskDheKe)
    1059410792                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
    10595         #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     10793            #endif
     10794            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    1059610795                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
     10796            #endif
     10797                }
     10798        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
     10799                else {
     10800            #ifdef HAVE_SUPPORTED_CURVES
     10801                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     10802            #endif
     10803            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     10804                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
     10805            #endif
     10806                }
    1059710807        #endif
    10598                 }
    10599                 else {
    10600                     TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
    10601         #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    10602                     TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
    10603         #endif
    10604                 }
    1060510808    #endif
    1060610809                break;
     
    1060910812            case hello_retry_request:
    1061010813                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    10611         #ifndef WOLFSSL_TLS13_DRAFT_18
    1061210814                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
    10613         #endif
     10815        #ifdef HAVE_SUPPORTED_CURVES
    1061410816                if (!ssl->options.noPskDheKe)
    1061510817                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     10818        #endif
    1061610819                /* Cookie is written below as last extension. */
    1061710820                break;
     
    1062010823    #ifdef WOLFSSL_TLS13
    1062110824            case encrypted_extensions:
     10825                /* Send out all extension except those that are turned on. */
     10826        #ifdef HAVE_ECC
    1062210827                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
     10828        #endif
    1062310829                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
     10830        #ifdef HAVE_SESSION_TICKET
    1062410831                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
     10832        #endif
     10833        #ifdef HAVE_SUPPORTED_CURVES
    1062510834                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     10835        #endif
    1062610836        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    1062710837                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
     
    1063010840                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
    1063110841        #endif
     10842        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
     10843            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
     10844        #endif
    1063210845        #if defined(HAVE_SECURE_RENEGOTIATION)
    1063310846            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
     
    1064910862        #ifndef NO_CERTS
    1065010863            case certificate:
     10864                /* Don't send out any extension except those that are turned
     10865                 * off. */
    1065110866                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    1065210867                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
     
    1066610881            return ret;
    1066710882
    10668 #ifdef WOLFSSL_TLS13
     10883#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
    1066910884        if (msgType == hello_retry_request) {
    1067010885            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
     
    1078511000
    1078611001        switch (type) {
     11002#ifdef HAVE_SNI
    1078711003            case TLSX_SERVER_NAME:
    1078811004                WOLFSSL_MSG("SNI extension received");
     
    1079111007            #endif
    1079211008
    10793 #ifdef WOLFSSL_TLS13
     11009#if defined(WOLFSSL_TLS13) && defined(HAVE_SNI)
    1079411010                if (IsAtLeastTLSv1_3(ssl->version) &&
    1079511011                        msgType != client_hello &&
     
    1080511021                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
    1080611022                break;
     11023#endif
    1080711024
    1080811025            case TLSX_TRUSTED_CA_KEYS:
     
    1081211029            #endif
    1081311030
    10814 #ifdef WOLFSSL_TLS13
     11031#if defined(WOLFSSL_TLS13) && defined(HAVE_TRUSTED_CA)
    1081511032                if (IsAtLeastTLSv1_3(ssl->version) &&
    1081611033                        msgType != client_hello &&
     
    1082811045            #endif
    1082911046
    10830 #ifdef WOLFSSL_TLS13
     11047#if defined(WOLFSSL_TLS13) && defined(HAVE_MAX_FRAGMENT)
    1083111048                if (IsAtLeastTLSv1_3(ssl->version) &&
    1083211049                        msgType != client_hello &&
     
    1084811065            #endif
    1084911066
    10850 #ifdef WOLFSSL_TLS13
     11067#if defined(WOLFSSL_TLS13) && defined(HAVE_TRUNCATED_HMAC)
    1085111068                if (IsAtLeastTLSv1_3(ssl->version))
    1085211069                    break;
     
    1086111078            #endif
    1086211079
    10863 #ifdef WOLFSSL_TLS13
     11080#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
    1086411081                if (IsAtLeastTLSv1_3(ssl->version) &&
    1086511082                        msgType != client_hello &&
     
    1088211099            #endif
    1088311100
    10884 #ifdef WOLFSSL_TLS13
     11101#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
    1088511102                if (IsAtLeastTLSv1_3(ssl->version))
    1088611103                    break;
     
    1089511112            #endif
    1089611113
    10897  #ifdef WOLFSSL_TLS13
     11114#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST)
    1089811115                if (IsAtLeastTLSv1_3(ssl->version) &&
    1089911116                        msgType != client_hello &&
     
    1091211129            #endif
    1091311130
    10914 #ifdef WOLFSSL_TLS13
     11131#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
    1091511132                if (IsAtLeastTLSv1_3(ssl->version) &&
    1091611133                        msgType != client_hello &&
     
    1093011147            #endif
    1093111148
    10932 #ifdef WOLFSSL_TLS13
     11149#if defined(WOLFSSL_TLS13)
    1093311150                if (IsAtLeastTLSv1_3(ssl->version))
    1093411151                    break;
     
    1095111168            #endif
    1095211169
    10953 #ifdef WOLFSSL_TLS13
     11170#if defined(WOLFSSL_TLS13) && defined(HAVE_SECURE_RENEGOTIATION)
    1095411171                if (IsAtLeastTLSv1_3(ssl->version))
    1095511172                    break;
     
    1096411181            #endif
    1096511182
    10966 #ifdef WOLFSSL_TLS13
     11183#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
    1096711184                if (IsAtLeastTLSv1_3(ssl->version) &&
    1096811185                        msgType != client_hello) {
     
    1097911196            #endif
    1098011197
    10981 #ifdef WOLFSSL_TLS13
     11198#if defined(WOLFSSL_TLS13) && defined(HAVE_QSH)
    1098211199                if (IsAtLeastTLSv1_3(ssl->version))
    1098311200                    break;
     
    1099311210            #endif
    1099411211
    10995 #ifdef WOLFSSL_TLS13
     11212#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
    1099611213                if (IsAtLeastTLSv1_3(ssl->version) &&
    1099711214                        msgType != client_hello &&
     
    1100711224                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
    1100811225                break;
    11009 #if !defined(WOLFSSL_NO_SIGALG)
     11226#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    1101011227            case TLSX_SIGNATURE_ALGORITHMS:
    1101111228                WOLFSSL_MSG("Signature Algorithms extension received");
     
    1101611233                if (!IsAtLeastTLSv1_2(ssl))
    1101711234                    break;
    11018 #ifdef WOLFSSL_TLS13
     11235            #ifdef WOLFSSL_TLS13
    1101911236                if (IsAtLeastTLSv1_3(ssl->version) &&
    1102011237                        msgType != client_hello &&
     
    1102211239                    return EXT_NOT_ALLOWED;
    1102311240                }
    11024 #endif
     11241            #endif
    1102511242                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
    1102611243                break;
     
    1104811265                break;
    1104911266
     11267    #ifdef WOLFSSL_SEND_HRR_COOKIE
    1105011268            case TLSX_COOKIE:
    1105111269                WOLFSSL_MSG("Cookie extension received");
     
    1106411282                ret = CKE_PARSE(ssl, input + offset, size, msgType);
    1106511283                break;
     11284    #endif
    1106611285
    1106711286    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     
    1113811357    #endif
    1113911358
    11140     #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     11359    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
    1114111360            case TLSX_SIGNATURE_ALGORITHMS_CERT:
    1114211361                WOLFSSL_MSG("Signature Algorithms extension received");
     
    1116711386            #endif
    1116811387
     11388    #ifdef HAVE_SUPPORTED_CURVES
    1116911389                if (!IsAtLeastTLSv1_3(ssl->version))
    1117011390                    break;
     
    1117411394                    return EXT_NOT_ALLOWED;
    1117511395                }
     11396    #endif
     11397
    1117611398                ret = KS_PARSE(ssl, input + offset, size, msgType);
    1117711399                break;
     
    1163211854
    1163311855#ifndef WOLFSSL_NO_TLS12
     11856    WOLFSSL_ABI
    1163411857    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
    1163511858    {
     
    1165611879     * returns the method data for a TLS v1.3 server.
    1165711880     */
     11881    WOLFSSL_ABI
    1165811882    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
    1165911883    {
  • azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/src/tls13.c

    r457 r464  
    3030 * NO_PSK
    3131 *    Do not enable Pre-Shared Keys.
    32  * TLS13_SUPPORTS_EXPORTERS
    33  *    Guard to compile out any code for exporter keys.
    34  *    Feature not supported yet.
     32 * HAVE_KEYING_MATERIAL
     33 *    Enables exporting keying material based on section 7.5 of RFC 8446.
    3534 * WOLFSSL_ASYNC_CRYPT
    3635 *    Enables the use of asynchronous cryptographic operations.
     
    5655 * WOLFSSL_TLS13
    5756 *    Enable TLS 1.3 protocol implementation.
    58  * WOLFSSL_TLS13_DRAFT_18
    59  *    Conform with Draft 18 of the TLS v1.3 specification.
    60  * WOLFSSL_TLS13_DRAFT_22
    61  *    Conform with Draft 22 of the TLS v1.3 specification.
    62  * WOLFSSL_TLS13_DRAFT_23
    63  *    Conform with Draft 23 of the TLS v1.3 specification.
    6457 * WOLFSSL_TLS13_MIDDLEBOX_COMPAT
    6558 *    Enable middlebox compatibility in the TLS 1.3 handshake.
     
    119112
    120113#ifndef HAVE_HKDF
    121     #error The build option HAVE_HKDF is required for TLS 1.3
     114    #ifndef _MSC_VER
     115        #error "The build option HAVE_HKDF is required for TLS 1.3"
     116    #else
     117        #pragma message("error: The build option HAVE_HKDF is required for TLS 1.3")
     118    #endif
    122119#endif
    123120
     
    264261}
    265262
    266 #ifdef WOLFSSL_TLS13_DRAFT_18
    267 /* Size of the TLS v1.3 label use when deriving keys. */
    268 #define TLS13_PROTOCOL_LABEL_SZ    9
    269 /* The protocol label for TLS v1.3. */
    270 static const byte tls13ProtocolLabel[TLS13_PROTOCOL_LABEL_SZ + 1] = "TLS 1.3, ";
    271 #else
    272263/* Size of the TLS v1.3 label use when deriving keys. */
    273264#define TLS13_PROTOCOL_LABEL_SZ    6
    274265/* The protocol label for TLS v1.3. */
    275266static const byte tls13ProtocolLabel[TLS13_PROTOCOL_LABEL_SZ + 1] = "tls13 ";
    276 #endif
    277 
    278 #if !defined(WOLFSSL_TLS13_DRAFT_18) || defined(HAVE_SESSION_TICKET) || \
    279                                         !defined(NO_PSK)
     267
    280268/* Derive a key from a message.
    281269 *
     
    370358                             hash, hashSz, digestAlg);
    371359}
    372 #endif
    373360
    374361/* Derive a key.
     
    442429
    443430#ifndef NO_PSK
    444 #ifdef WOLFSSL_TLS13_DRAFT_18
    445 /* The length of the binder key label. */
    446 #define BINDER_KEY_LABEL_SZ         23
    447 /* The binder key label. */
    448 static const byte binderKeyLabel[BINDER_KEY_LABEL_SZ + 1] =
    449     "external psk binder key";
    450 #else
    451431/* The length of the binder key label. */
    452432#define BINDER_KEY_LABEL_SZ         10
     
    454434static const byte binderKeyLabel[BINDER_KEY_LABEL_SZ + 1] =
    455435    "ext binder";
    456 #endif
     436
    457437/* Derive the binder key.
    458438 *
     
    464444{
    465445    WOLFSSL_MSG("Derive Binder Key");
     446    if (ssl == NULL || ssl->arrays == NULL) {
     447        return BAD_FUNC_ARG;
     448    }
    466449    return DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
    467450                        binderKeyLabel, BINDER_KEY_LABEL_SZ,
     
    471454
    472455#ifdef HAVE_SESSION_TICKET
    473 #ifdef WOLFSSL_TLS13_DRAFT_18
    474 /* The length of the binder key resume label. */
    475 #define BINDER_KEY_RESUME_LABEL_SZ  25
    476 /* The binder key resume label. */
    477 static const byte binderKeyResumeLabel[BINDER_KEY_RESUME_LABEL_SZ + 1] =
    478     "resumption psk binder key";
    479 #else
     456
    480457/* The length of the binder key resume label. */
    481458#define BINDER_KEY_RESUME_LABEL_SZ  10
     
    483460static const byte binderKeyResumeLabel[BINDER_KEY_RESUME_LABEL_SZ + 1] =
    484461    "res binder";
    485 #endif
     462
    486463/* Derive the binder resumption key.
    487464 *
     
    493470{
    494471    WOLFSSL_MSG("Derive Binder Key - Resumption");
     472    if (ssl == NULL || ssl->arrays == NULL) {
     473        return BAD_FUNC_ARG;
     474    }
    495475    return DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
    496476                        binderKeyResumeLabel, BINDER_KEY_RESUME_LABEL_SZ,
     
    500480
    501481#ifdef WOLFSSL_EARLY_DATA
    502 #ifdef WOLFSSL_TLS13_DRAFT_18
    503 /* The length of the early traffic label. */
    504 #define EARLY_TRAFFIC_LABEL_SZ      27
    505 /* The early traffic label. */
    506 static const byte earlyTrafficLabel[EARLY_TRAFFIC_LABEL_SZ + 1] =
    507     "client early traffic secret";
    508 #else
     482
    509483/* The length of the early traffic label. */
    510484#define EARLY_TRAFFIC_LABEL_SZ      11
     
    512486static const byte earlyTrafficLabel[EARLY_TRAFFIC_LABEL_SZ + 1] =
    513487    "c e traffic";
    514 #endif
     488
    515489/* Derive the early traffic key.
    516490 *
     
    523497    int ret;
    524498    WOLFSSL_MSG("Derive Early Traffic Secret");
     499    if (ssl == NULL || ssl->arrays == NULL) {
     500        return BAD_FUNC_ARG;
     501    }
    525502    ret = DeriveKey(ssl, key, -1, ssl->arrays->secret,
    526503                    earlyTrafficLabel, EARLY_TRAFFIC_LABEL_SZ,
     
    538515}
    539516
    540 #ifdef TLS13_SUPPORTS_EXPORTERS
    541 #ifdef WOLFSSL_TLS13_DRAFT_18
    542 /* The length of the early exporter label. */
    543 #define EARLY_EXPORTER_LABEL_SZ     28
    544 /* The early exporter label. */
    545 static const byte earlyExporterLabel[EARLY_EXPORTER_LABEL_SZ + 1] =
    546     "early exporter master secret";
    547 #else
     517#ifdef HAVE_KEYING_MATERIAL
    548518/* The length of the early exporter label. */
    549519#define EARLY_EXPORTER_LABEL_SZ     12
     
    551521static const byte earlyExporterLabel[EARLY_EXPORTER_LABEL_SZ + 1] =
    552522    "e exp master";
    553 #endif
     523
    554524/* Derive the early exporter key.
    555525 *
     
    562532    int ret;
    563533    WOLFSSL_MSG("Derive Early Exporter Secret");
     534    if (ssl == NULL || ssl->arrays == NULL) {
     535        return BAD_FUNC_ARG;
     536    }
    564537    ret = DeriveKey(ssl, key, -1, ssl->arrays->secret,
    565538                    earlyExporterLabel, EARLY_EXPORTER_LABEL_SZ,
     
    579552#endif
    580553
    581 #ifdef WOLFSSL_TLS13_DRAFT_18
    582 /* The length of the client handshake label. */
    583 #define CLIENT_HANDSHAKE_LABEL_SZ   31
    584 /* The client handshake label. */
    585 static const byte clientHandshakeLabel[CLIENT_HANDSHAKE_LABEL_SZ + 1] =
    586     "client handshake traffic secret";
    587 #else
    588554/* The length of the client handshake label. */
    589555#define CLIENT_HANDSHAKE_LABEL_SZ   12
     
    591557static const byte clientHandshakeLabel[CLIENT_HANDSHAKE_LABEL_SZ + 1] =
    592558    "c hs traffic";
    593 #endif
     559
    594560/* Derive the client handshake key.
    595561 *
     
    602568    int ret;
    603569    WOLFSSL_MSG("Derive Client Handshake Secret");
     570    if (ssl == NULL || ssl->arrays == NULL) {
     571        return BAD_FUNC_ARG;
     572    }
    604573    ret = DeriveKey(ssl, key, -1, ssl->arrays->preMasterSecret,
    605574                    clientHandshakeLabel, CLIENT_HANDSHAKE_LABEL_SZ,
     
    617586}
    618587
    619 #ifdef WOLFSSL_TLS13_DRAFT_18
    620 /* The length of the server handshake label. */
    621 #define SERVER_HANDSHAKE_LABEL_SZ   31
    622 /* The server handshake label. */
    623 static const byte serverHandshakeLabel[SERVER_HANDSHAKE_LABEL_SZ + 1] =
    624     "server handshake traffic secret";
    625 #else
    626588/* The length of the server handshake label. */
    627589#define SERVER_HANDSHAKE_LABEL_SZ   12
     
    629591static const byte serverHandshakeLabel[SERVER_HANDSHAKE_LABEL_SZ + 1] =
    630592    "s hs traffic";
    631 #endif
     593
    632594/* Derive the server handshake key.
    633595 *
     
    640602    int ret;
    641603    WOLFSSL_MSG("Derive Server Handshake Secret");
     604    if (ssl == NULL || ssl->arrays == NULL) {
     605        return BAD_FUNC_ARG;
     606    }
    642607    ret = DeriveKey(ssl, key, -1, ssl->arrays->preMasterSecret,
    643608                    serverHandshakeLabel, SERVER_HANDSHAKE_LABEL_SZ,
     
    655620}
    656621
    657 #ifdef WOLFSSL_TLS13_DRAFT_18
    658 /* The length of the client application traffic label. */
    659 #define CLIENT_APP_LABEL_SZ         33
    660 /* The client application traffic label. */
    661 static const byte clientAppLabel[CLIENT_APP_LABEL_SZ + 1] =
    662     "client application traffic secret";
    663 #else
    664622/* The length of the client application traffic label. */
    665623#define CLIENT_APP_LABEL_SZ         12
     
    667625static const byte clientAppLabel[CLIENT_APP_LABEL_SZ + 1] =
    668626    "c ap traffic";
    669 #endif
     627
    670628/* Derive the client application traffic key.
    671629 *
     
    678636    int ret;
    679637    WOLFSSL_MSG("Derive Client Traffic Secret");
     638    if (ssl == NULL || ssl->arrays == NULL) {
     639        return BAD_FUNC_ARG;
     640    }
    680641    ret = DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
    681642                    clientAppLabel, CLIENT_APP_LABEL_SZ,
     
    693654}
    694655
    695 #ifdef WOLFSSL_TLS13_DRAFT_18
    696 /* The length of the server application traffic label. */
    697 #define SERVER_APP_LABEL_SZ         33
    698 /* The  server application traffic label. */
    699 static const byte serverAppLabel[SERVER_APP_LABEL_SZ + 1] =
    700     "server application traffic secret";
    701 #else
    702656/* The length of the server application traffic label. */
    703657#define SERVER_APP_LABEL_SZ         12
     
    705659static const byte serverAppLabel[SERVER_APP_LABEL_SZ + 1] =
    706660    "s ap traffic";
    707 #endif
     661
    708662/* Derive the server application traffic key.
    709663 *
     
    716670    int ret;
    717671    WOLFSSL_MSG("Derive Server Traffic Secret");
     672    if (ssl == NULL || ssl->arrays == NULL) {
     673        return BAD_FUNC_ARG;
     674    }
    718675    ret = DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
    719676                    serverAppLabel, SERVER_APP_LABEL_SZ,
     
    731688}
    732689
    733 #ifdef TLS13_SUPPORTS_EXPORTERS
    734 #ifdef WOLFSSL_TLS13_DRAFT_18
    735 /* The length of the exporter master secret label. */
    736 #define EXPORTER_MASTER_LABEL_SZ    22
    737 /* The exporter master secret label. */
    738 static const byte exporterMasterLabel[EXPORTER_MASTER_LABEL_SZ + 1] =
    739     "exporter master secret";
    740 #else
     690#ifdef HAVE_KEYING_MATERIAL
    741691/* The length of the exporter master secret label. */
    742692#define EXPORTER_MASTER_LABEL_SZ    10
     
    744694static const byte exporterMasterLabel[EXPORTER_MASTER_LABEL_SZ + 1] =
    745695    "exp master";
    746 #endif
     696
    747697/* Derive the exporter secret.
    748698 *
     
    754704{
    755705    int ret;
    756     WOLFSSL_MSG("Derive Exporter Secret");
     706    WOLFSSL_ENTER("Derive Exporter Secret");
     707    if (ssl == NULL || ssl->arrays == NULL) {
     708        return BAD_FUNC_ARG;
     709    }
    757710    ret = DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
    758711                    exporterMasterLabel, EXPORTER_MASTER_LABEL_SZ,
     
    769722    return ret;
    770723}
     724
     725/* The length of the exporter label. */
     726#define EXPORTER_LABEL_SZ    8
     727/* The exporter label. */
     728static const byte exporterLabel[EXPORTER_LABEL_SZ + 1] =
     729    "exporter";
     730/* Hash("") */
     731#ifndef NO_SHA256
     732static const byte emptySHA256Hash[] = {
     733    0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC, 0x1C, 0x14, 0x9A, 0xFB, 0xF4, 0xC8,
     734    0x99, 0x6F, 0xB9, 0x24, 0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C,
     735    0xA4, 0x95, 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55
     736};
     737#endif
     738#ifdef WOLFSSL_SHA384
     739static const byte emptySHA384Hash[] = {
     740    0x38, 0xB0, 0x60, 0xA7, 0x51, 0xAC, 0x96, 0x38, 0x4C, 0xD9, 0x32, 0x7E,
     741    0xB1, 0xB1, 0xE3, 0x6A, 0x21, 0xFD, 0xB7, 0x11, 0x14, 0xBE, 0x07, 0x43,
     742    0x4C, 0x0C, 0xC7, 0xBF, 0x63, 0xF6, 0xE1, 0xDA, 0x27, 0x4E, 0xDE, 0xBF,
     743    0xE7, 0x6F, 0x65, 0xFB, 0xD5, 0x1A, 0xD2, 0xF1, 0x48, 0x98, 0xB9, 0x5B
     744};
     745#endif
     746#ifdef WOLFSSL_TLS13_SHA512
     747static const byte emptySHA512Hash[] = {
     748    0xCF, 0x83, 0xE1, 0x35, 0x7E, 0xEF, 0xB8, 0xBD, 0xF1, 0x54, 0x28, 0x50,
     749    0xD6, 0x6D, 0x80, 0x07, 0xD6, 0x20, 0xE4, 0x05, 0x0B, 0x57, 0x15, 0xDC,
     750    0x83, 0xF4, 0xA9, 0x21, 0xD3, 0x6C, 0xE9, 0xCE, 0x47, 0xD0, 0xD1, 0x3C,
     751    0x5D, 0x85, 0xF2, 0xB0, 0xFF, 0x83, 0x18, 0xD2, 0x87, 0x7E, 0xEC, 0x2F,
     752    0x63, 0xB9, 0x31, 0xBD, 0x47, 0x41, 0x7A, 0x81, 0xA5, 0x38, 0x32, 0x7A,
     753    0xF9, 0x27, 0xDA, 0x3E
     754};
     755#endif
     756/**
     757 * Implement section 7.5 of RFC 8446
     758 * @return  0 on success
     759 *         <0 on failure
     760 */
     761int Tls13_Exporter(WOLFSSL* ssl, unsigned char *out, size_t outLen,
     762        const char *label, size_t labelLen,
     763        const unsigned char *context, size_t contextLen)
     764{
     765    int                 ret;
     766    enum wc_HashType    hashType = WC_HASH_TYPE_NONE;
     767    int                 hashLen = 0;
     768    byte                hashOut[WC_MAX_DIGEST_SIZE];
     769    const byte*         emptyHash = NULL;
     770    byte                firstExpand[WC_MAX_DIGEST_SIZE];
     771    const byte*         protocol = tls13ProtocolLabel;
     772    word32              protocolLen = TLS13_PROTOCOL_LABEL_SZ;
     773
     774    if (ssl->version.minor != TLSv1_3_MINOR)
     775        return VERSION_ERROR;
     776
     777    switch (ssl->specs.mac_algorithm) {
     778        #ifndef NO_SHA256
     779        case sha256_mac:
     780            hashType  = WC_HASH_TYPE_SHA256;
     781            hashLen   = WC_SHA256_DIGEST_SIZE;
     782            emptyHash = emptySHA256Hash;
     783            break;
     784        #endif
     785
     786        #ifdef WOLFSSL_SHA384
     787        case sha384_mac:
     788            hashType  = WC_HASH_TYPE_SHA384;
     789            hashLen   = WC_SHA384_DIGEST_SIZE;
     790            emptyHash = emptySHA384Hash;
     791            break;
     792        #endif
     793
     794        #ifdef WOLFSSL_TLS13_SHA512
     795        case sha512_mac:
     796            hashType  = WC_HASH_TYPE_SHA512;
     797            hashLen   = WC_SHA512_DIGEST_SIZE;
     798            emptyHash = emptySHA512Hash;
     799            break;
     800        #endif
     801    }
     802
     803    /* Derive-Secret(Secret, label, "") */
     804    ret = HKDF_Expand_Label(firstExpand, hashLen,
     805            ssl->arrays->exporterSecret, hashLen,
     806            protocol, protocolLen, (byte*)label, (word32)labelLen,
     807            emptyHash, hashLen, hashType);
     808    if (ret != 0)
     809        return ret;
     810
     811    /* Hash(context_value) */
     812    ret = wc_Hash(hashType, context, (word32)contextLen, hashOut, WC_MAX_DIGEST_SIZE);
     813    if (ret != 0)
     814        return ret;
     815
     816    ret = HKDF_Expand_Label(out, (word32)outLen, firstExpand, hashLen,
     817            protocol, protocolLen, exporterLabel, EXPORTER_LABEL_SZ,
     818            hashOut, hashLen, hashType);
     819
     820    return ret;
     821}
    771822#endif
    772823
    773824#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    774 #ifdef WOLFSSL_TLS13_DRAFT_18
    775 /* The length of the resumption master secret label. */
    776 #define RESUME_MASTER_LABEL_SZ      24
    777 /* The resumption master secret label. */
    778 static const byte resumeMasterLabel[RESUME_MASTER_LABEL_SZ + 1] =
    779     "resumption master secret";
    780 #else
    781825/* The length of the resumption master secret label. */
    782826#define RESUME_MASTER_LABEL_SZ      10
     
    784828static const byte resumeMasterLabel[RESUME_MASTER_LABEL_SZ + 1] =
    785829    "res master";
    786 #endif
     830
    787831/* Derive the resumption secret.
    788832 *
     
    791835 * returns 0 on success, otherwise failure.
    792836 */
    793 static int DeriveResumptionSecret(WOLFSSL* ssl, byte* key)
    794 {
     837int DeriveResumptionSecret(WOLFSSL* ssl, byte* key)
     838{
     839    byte* masterSecret;
     840
    795841    WOLFSSL_MSG("Derive Resumption Secret");
    796     return DeriveKey(ssl, key, -1, ssl->arrays->masterSecret,
    797                      resumeMasterLabel, RESUME_MASTER_LABEL_SZ,
    798                      ssl->specs.mac_algorithm, 1);
     842    if (ssl == NULL) {
     843        return BAD_FUNC_ARG;
     844    }
     845    if (ssl->arrays != NULL) {
     846        masterSecret = ssl->arrays->masterSecret;
     847    }
     848    else {
     849        masterSecret = ssl->session.masterSecret;
     850    }
     851    return DeriveKey(ssl, key, -1, masterSecret, resumeMasterLabel,
     852                     RESUME_MASTER_LABEL_SZ, ssl->specs.mac_algorithm, 1);
    799853}
    800854#endif
     
    818872}
    819873
    820 #ifdef WOLFSSL_TLS13_DRAFT_18
    821 /* The length of the application traffic label. */
    822 #define APP_TRAFFIC_LABEL_SZ        26
    823 /* The application traffic label. */
    824 static const byte appTrafficLabel[APP_TRAFFIC_LABEL_SZ + 1] =
    825     "application traffic secret";
    826 #else
    827874/* The length of the application traffic label. */
    828875#define APP_TRAFFIC_LABEL_SZ        11
     
    830877static const byte appTrafficLabel[APP_TRAFFIC_LABEL_SZ + 1] =
    831878    "traffic upd";
    832 #endif
     879
    833880/* Update the traffic secret.
    834881 *
     
    849896 * ssl  The SSL/TLS object.
    850897 */
    851 static int DeriveEarlySecret(WOLFSSL* ssl)
     898int DeriveEarlySecret(WOLFSSL* ssl)
    852899{
    853900    WOLFSSL_MSG("Derive Early Secret");
     901    if (ssl == NULL || ssl->arrays == NULL) {
     902        return BAD_FUNC_ARG;
     903    }
    854904#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    855905    return Tls13_HKDF_Extract(ssl->arrays->secret, NULL, 0,
     
    862912}
    863913
    864 #ifndef WOLFSSL_TLS13_DRAFT_18
    865914/* The length of the derived label. */
    866915#define DERIVED_LABEL_SZ        7
     
    868917static const byte derivedLabel[DERIVED_LABEL_SZ + 1] =
    869918    "derived";
    870 #endif
     919
    871920/* Derive the handshake secret using HKDF Extract.
    872921 *
    873922 * ssl  The SSL/TLS object.
    874923 */
    875 static int DeriveHandshakeSecret(WOLFSSL* ssl)
    876 {
    877 #ifdef WOLFSSL_TLS13_DRAFT_18
    878     WOLFSSL_MSG("Derive Handshake Secret");
    879     return Tls13_HKDF_Extract(ssl->arrays->preMasterSecret,
    880             ssl->arrays->secret, ssl->specs.hash_size,
    881             ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
    882             ssl->specs.mac_algorithm);
    883 #else
     924int DeriveHandshakeSecret(WOLFSSL* ssl)
     925{
    884926    byte key[WC_MAX_DIGEST_SIZE];
    885927    int ret;
    886 
    887928    WOLFSSL_MSG("Derive Handshake Secret");
    888 
     929    if (ssl == NULL || ssl->arrays == NULL) {
     930        return BAD_FUNC_ARG;
     931    }
    889932    ret = DeriveKeyMsg(ssl, key, -1, ssl->arrays->secret,
    890933                        derivedLabel, DERIVED_LABEL_SZ,
     
    897940            ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
    898941            ssl->specs.mac_algorithm);
    899 #endif
    900942}
    901943
     
    904946 * ssl  The SSL/TLS object.
    905947 */
    906 static int DeriveMasterSecret(WOLFSSL* ssl)
    907 {
    908 #ifdef WOLFSSL_TLS13_DRAFT_18
    909     WOLFSSL_MSG("Derive Master Secret");
    910     return Tls13_HKDF_Extract(ssl->arrays->masterSecret,
    911             ssl->arrays->preMasterSecret, ssl->specs.hash_size,
    912             ssl->arrays->masterSecret, 0, ssl->specs.mac_algorithm);
    913 #else
     948int DeriveMasterSecret(WOLFSSL* ssl)
     949{
    914950    byte key[WC_MAX_DIGEST_SIZE];
    915951    int ret;
    916 
    917952    WOLFSSL_MSG("Derive Master Secret");
    918 
     953    if (ssl == NULL || ssl->arrays == NULL) {
     954        return BAD_FUNC_ARG;
     955    }
    919956    ret = DeriveKeyMsg(ssl, key, -1, ssl->arrays->preMasterSecret,
    920957                        derivedLabel, DERIVED_LABEL_SZ,
     
    923960        return ret;
    924961
    925     return Tls13_HKDF_Extract(ssl->arrays->masterSecret,
     962    ret = Tls13_HKDF_Extract(ssl->arrays->masterSecret,
    926963            key, ssl->specs.hash_size,
    927964            ssl->arrays->masterSecret, 0, ssl->specs.mac_algorithm);
    928 #endif
    929 }
    930 
    931 #ifndef WOLFSSL_TLS13_DRAFT_18
     965
     966#ifdef HAVE_KEYING_MATERIAL
     967    if (ret != 0)
     968        return ret;
     969    /* Calculate exporter secret only when saving arrays */
     970    if (ssl->options.saveArrays)
     971        ret = DeriveExporterSecret(ssl, ssl->arrays->exporterSecret);
     972#endif
     973
     974    return ret;
     975}
     976
    932977#if defined(HAVE_SESSION_TICKET)
    933978/* Length of the resumption label. */
     
    943988 * returns 0 on success, otherwise failure.
    944989 */
    945 static int DeriveResumptionPSK(WOLFSSL* ssl, byte* nonce, byte nonceLen,
    946                                byte* secret)
     990int DeriveResumptionPSK(WOLFSSL* ssl, byte* nonce, byte nonceLen, byte* secret)
    947991{
    948992    int         digestAlg;
     
    9821026}
    9831027#endif /* HAVE_SESSION_TICKET */
    984 #endif /* WOLFSSL_TLS13_DRAFT_18 */
    9851028
    9861029
     
    9991042    int  hashSz = WC_SHA256_DIGEST_SIZE;
    10001043    int  ret = BAD_FUNC_ARG;
     1044
     1045    if (ssl == NULL || key == NULL || hash == NULL) {
     1046        return BAD_FUNC_ARG;
     1047    }
    10011048
    10021049    /* Get the hash of the previous handshake messages. */
     
    10711118 * returns 0 on success, otherwise failure.
    10721119 */
    1073 static int DeriveTls13Keys(WOLFSSL* ssl, int secret, int side, int store)
     1120int DeriveTls13Keys(WOLFSSL* ssl, int secret, int side, int store)
    10741121{
    10751122    int   ret = BAD_FUNC_ARG; /* Assume failure */
     
    12821329    word32 TimeNowInMilliseconds(void)
    12831330    {
    1284         const uint32_t systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
    1285         uint32_t *systemTickPtr = systemTickPointer();
     1331        const word32 systemTickTimeInHz = 1000000 / systemTickInMicroseconds();
     1332        word32 *systemTickPtr = systemTickPointer();
    12861333
    12871334        return (word32) (*systemTickPtr/systemTickTimeInHz) * 1000;
     
    14071454        return (word32)(uTaskerSystemTick / (TICK_RESOLUTION / 1000));
    14081455    }
     1456#elif defined(WOLFSSL_LINUXKM)
     1457    /* The time in milliseconds.
     1458     * Used for tickets to represent difference between when first seen and when
     1459     * sending.
     1460     *
     1461     * returns the time in milliseconds as a 32-bit value.
     1462     */
     1463    word32 TimeNowInMilliseconds(void)
     1464    {
     1465    #if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
     1466        return (word32)(ktime_get_real_ns() / (s64)1000000);
     1467    #else
     1468        return (word32)(ktime_get_real_ns() / (ktime_t)1000000);
     1469    #endif
     1470    }
     1471#elif defined(FUSION_RTOS)
     1472    /* The time in milliseconds.
     1473     * Used for tickets to represent difference between when first seen and when
     1474     * sending.
     1475     *
     1476     * returns the time in milliseconds as a 32-bit value.
     1477     */
     1478    word32 TimeNowInMilliseconds(void)
     1479    {
     1480        struct timeval now;
     1481        if (FCL_GETTIMEOFDAY(&now, 0) < 0)
     1482            return (word32)GETTIME_ERROR; /* TODO: return 0 for failure */
     1483
     1484        /* Convert to milliseconds number. */
     1485        return (word32)(now.tv_sec * 1000 + now.tv_usec / 1000);
     1486    }
     1487
    14091488#else
    14101489    /* The time in milliseconds.
     
    14191498
    14201499        if (gettimeofday(&now, 0) < 0)
    1421             return GETTIME_ERROR;
     1500            return (word32)GETTIME_ERROR; /* TODO: return 0 for failure */
     1501
    14221502        /* Convert to milliseconds number. */
    14231503        return (word32)(now.tv_sec * 1000 + now.tv_usec / 1000);
     
    14261506#endif /* HAVE_SESSION_TICKET || !NO_PSK */
    14271507
    1428 
    1429 #if !defined(NO_WOLFSSL_SERVER) && (defined(HAVE_SESSION_TICKET) || \
    1430                                     !defined(NO_PSK))
    1431 /* Add input to all handshake hashes.
    1432  *
    1433  * ssl    The SSL/TLS object.
    1434  * input  The data to hash.
    1435  * sz     The size of the data to hash.
    1436  * returns 0 on success, otherwise failure.
    1437  */
    1438 static int HashInputRaw(WOLFSSL* ssl, const byte* input, int sz)
    1439 {
    1440     int ret = BAD_FUNC_ARG;
    1441 
    1442 #ifndef NO_SHA256
    1443     ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, input, sz);
    1444     if (ret != 0)
    1445         return ret;
    1446 #endif
    1447 #ifdef WOLFSSL_SHA384
    1448     ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, input, sz);
    1449     if (ret != 0)
    1450         return ret;
    1451 #endif
    1452 #ifdef WOLFSSL_TLS13_SHA512
    1453     ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, input, sz);
    1454     if (ret != 0)
    1455         return ret;
    1456 #endif
    1457 
    1458     return ret;
    1459 }
    1460 #endif
    14611508
    14621509/* Extract the handshake header information.
     
    15021549    rl->type    = type;
    15031550    rl->pvMajor = ssl->version.major;
    1504 #ifdef WOLFSSL_TLS13_DRAFT_18
    1505     rl->pvMinor = TLSv1_MINOR;
    1506 #else
    15071551    /* NOTE: May be TLSv1_MINOR when sending first ClientHello. */
    15081552    rl->pvMinor = TLSv1_2_MINOR;
    1509 #endif
    15101553    c16toa((word16)length, rl->length);
    15111554}
     
    15841627 * out          The buffer to write into.
    15851628 */
    1586 static WC_INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
     1629static WC_INLINE void WriteSEQTls13(WOLFSSL* ssl, int verifyOrder, byte* out)
    15871630{
    15881631    word32 seq[2] = {0, 0};
     
    16201663
    16211664    /* The nonce is the IV with the sequence XORed into the last bytes. */
    1622     WriteSEQ(ssl, order, nonce + AEAD_NONCE_SZ - SEQ_SZ);
     1665    WriteSEQTls13(ssl, order, nonce + AEAD_NONCE_SZ - SEQ_SZ);
    16231666    for (i = 0; i < AEAD_NONCE_SZ - SEQ_SZ; i++)
    16241667        nonce[i] = iv[i];
     
    16281671
    16291672#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
    1630 /* Encrypt with ChaCha20 and create authenication tag with Poly1305.
     1673/* Encrypt with ChaCha20 and create authentication tag with Poly1305.
    16311674 *
    16321675 * ssl     The SSL/TLS object.
     
    16831726
    16841727#ifdef HAVE_NULL_CIPHER
    1685 /* Create authenication tag and copy data over input.
     1728/* Create authentication tag and copy data over input.
    16861729 *
    16871730 * ssl     The SSL/TLS object.
     
    17651808            WOLFSSL_MSG("Data to encrypt");
    17661809            WOLFSSL_BUFFER(input, dataSz);
    1767 #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) && \
    1768                                         !defined(WOLFSSL_TLS13_DRAFT_23)
    17691810            WOLFSSL_MSG("Additional Authentication Data");
    17701811            WOLFSSL_BUFFER(aad, aadSz);
    1771 #endif
    17721812        #endif
    17731813
     
    19121952
    19131953#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305)
    1914 /* Decrypt with ChaCha20 and check authenication tag with Poly1305.
     1954/* Decrypt with ChaCha20 and check authentication tag with Poly1305.
    19151955 *
    19161956 * ssl     The SSL/TLS object.
     
    20682108            WOLFSSL_MSG("Data to decrypt");
    20692109            WOLFSSL_BUFFER(input, dataSz);
    2070 #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22) && \
    2071                                         !defined(WOLFSSL_TLS13_DRAFT_23)
    20722110            WOLFSSL_MSG("Additional Authentication Data");
    20732111            WOLFSSL_BUFFER(aad, aadSz);
    2074 #endif
    20752112            WOLFSSL_MSG("Authentication tag");
    20762113            WOLFSSL_BUFFER(input + dataSz, macSz);
     
    23512388        #endif
    23522389            {
    2353 #if defined(WOLFSSL_TLS13_DRAFT_18) || defined(WOLFSSL_TLS13_DRAFT_22) || \
    2354                                        defined(WOLFSSL_TLS13_DRAFT_23)
    2355                 output += args->headerSz;
    2356                 ret = EncryptTls13(ssl, output, output, args->size, NULL, 0,
    2357                                                                      asyncOkay);
    2358 #else
    23592390                const byte* aad = output;
    23602391                output += args->headerSz;
    23612392                ret = EncryptTls13(ssl, output, output, args->size, aad,
    23622393                                   RECORD_HEADER_SZ, asyncOkay);
    2363 #endif
    23642394            }
    23652395            break;
     
    24152445#endif
    24162446
    2417 #ifndef WOLFSSL_TLS13_DRAFT_18
    24182447#if defined(WOLFSSL_SEND_HRR_COOKIE) && !defined(NO_WOLFSSL_SERVER)
    24192448/* Create Cookie extension using the hash of the first ClientHello.
     
    24622491 * returns 0 on success, otherwise failure.
    24632492 */
    2464 static int RestartHandshakeHash(WOLFSSL* ssl)
     2493int RestartHandshakeHash(WOLFSSL* ssl)
    24652494{
    24662495    int    ret;
     
    25262555    if (ret != 0)
    25272556        return ret;
    2528     ret = HashOutputRaw(ssl, header, sizeof(header));
     2557    ret = HashRaw(ssl, header, sizeof(header));
    25292558    if (ret != 0)
    25302559        return ret;
    2531     return HashOutputRaw(ssl, hash, hashSz);
     2560    return HashRaw(ssl, hash, hashSz);
    25322561}
    25332562
     
    25412570    0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C
    25422571};
    2543 #endif /* WOLFSSL_TLS13_DRAFT_18 */
     2572
    25442573
    25452574#ifndef NO_WOLFSSL_CLIENT
     
    25782607        /* Resumption PSK is master secret. */
    25792608        ssl->arrays->psk_keySz = ssl->specs.hash_size;
    2580 #ifdef WOLFSSL_TLS13_DRAFT_18
    2581         XMEMCPY(ssl->arrays->psk_key, ssl->session.masterSecret,
    2582                 ssl->arrays->psk_keySz);
    2583 #else
    25842609        if ((ret = DeriveResumptionPSK(ssl, ssl->session.ticketNonce.data,
    25852610                    ssl->session.ticketNonce.len, ssl->arrays->psk_key)) != 0) {
    25862611            return ret;
    25872612        }
    2588 #endif
    25892613    }
    25902614#endif
     
    25942618        const char* cipherName = NULL;
    25952619        byte cipherSuite0 = TLS13_BYTE, cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
     2620        int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
    25962621
    25972622        /* Get the pre-shared key. */
     
    26022627                    &cipherName);
    26032628            if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
    2604                                                            &cipherSuite) != 0) {
     2629                                       &cipherSuite, &cipherSuiteFlags) != 0) {
    26052630                return PSK_KEY_ERROR;
    26062631            }
     
    26202645            return PSK_KEY_ERROR;
    26212646        }
     2647        (void)cipherSuiteFlags;
    26222648    #else
    26232649        /* PSK information loaded during setting of default TLS extensions. */
     
    26262652#endif
    26272653
    2628     if (ssl->options.noPskDheKe)
     2654    if (ssl->options.noPskDheKe) {
    26292655        ssl->arrays->preMasterSz = 0;
     2656    }
    26302657
    26312658    /* Derive the early secret using the PSK. */
     
    27072734
    27082735    /* Hash binders to complete the hash of the ClientHello. */
    2709     ret = HashOutputRaw(ssl, output + idx, len);
     2736    ret = HashRaw(ssl, output + idx, len);
    27102737    if (ret < 0)
    27112738        return ret;
     
    27782805    length = VERSION_SZ + RAN_LEN + ENUM_LEN + ssl->suites->suiteSz +
    27792806             SUITE_LEN + COMP_LEN + ENUM_LEN;
    2780 #ifndef WOLFSSL_TLS13_DRAFT_18
    27812807    #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
    27822808    length += ID_LEN;
     
    27852811        length += ssl->session.sessionIDSz;
    27862812    #endif
    2787 #endif
    27882813
    27892814    /* Auto populate extensions supported unless user defined. */
     
    28462871    idx += RAN_LEN;
    28472872
    2848 #ifdef WOLFSSL_TLS13_DRAFT_18
    2849     /* TLS v1.3 does not use session id - 0 length. */
    2850     output[idx++] = 0;
    2851 #else
    28522873    if (ssl->session.sessionIDSz > 0) {
    28532874        /* Session resumption for old versions of protocol. */
     
    28662887    #endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */
    28672888    }
    2868 #endif /* WOLFSSL_TLS13_DRAFT_18 */
    28692889
    28702890    /* Cipher suites */
     
    29212941}
    29222942
    2923 #ifdef WOLFSSL_TLS13_DRAFT_18
    2924 /* handle rocessing of TLS 1.3 hello_retry_request (6) */
    2925 /* Parse and handle a HelloRetryRequest message.
    2926  * Only a client will receive this message.
    2927  *
    2928  * ssl       The SSL/TLS object.
    2929  * input     The message buffer.
    2930  * inOutIdx  On entry, the index into the message buffer of
    2931  *           HelloRetryRequest.
    2932  *           On exit, the index of byte after the HelloRetryRequest message.
    2933  * totalSz   The length of the current handshake message.
    2934  * returns 0 on success and otherwise failure.
    2935  */
    2936 static int DoTls13HelloRetryRequest(WOLFSSL* ssl, const byte* input,
    2937                                     word32* inOutIdx, word32 totalSz)
    2938 {
    2939     int             ret;
    2940     word32          begin = *inOutIdx;
    2941     word32          i = begin;
    2942     word16          totalExtSz;
    2943     ProtocolVersion pv;
    2944 
    2945     WOLFSSL_ENTER("DoTls13HelloRetryRequest");
    2946 
    2947 #ifdef WOLFSSL_CALLBACKS
    2948     if (ssl->hsInfoOn) AddPacketName(ssl, "HelloRetryRequest");
    2949     if (ssl->toInfoOn) AddLateName("HelloRetryRequest", &ssl->timeoutInfo);
    2950 #endif
    2951 
    2952     /* Version info and length field of extension data. */
    2953     if (totalSz < i - begin + OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
    2954         return BUFFER_ERROR;
    2955 
    2956     /* Protocol version. */
    2957     XMEMCPY(&pv, input + i, OPAQUE16_LEN);
    2958     i += OPAQUE16_LEN;
    2959     ret = CheckVersion(ssl, pv);
    2960     if (ret != 0)
    2961         return ret;
    2962 
    2963     /* Length of extension data. */
    2964     ato16(&input[i], &totalExtSz);
    2965     i += OPAQUE16_LEN;
    2966     if (totalExtSz == 0) {
    2967         WOLFSSL_MSG("HelloRetryRequest must contain extensions");
    2968         return MISSING_HANDSHAKE_DATA;
    2969     }
    2970 
    2971     /* Extension data. */
    2972     if (i - begin + totalExtSz > totalSz)
    2973         return BUFFER_ERROR;
    2974     if ((ret = TLSX_Parse(ssl, (byte *)(input + i), totalExtSz,
    2975                           hello_retry_request, NULL)) != 0)
    2976         return ret;
    2977     /* The KeyShare extension parsing fails when not valid. */
    2978 
    2979     /* Move index to byte after message. */
    2980     *inOutIdx = i + totalExtSz;
    2981 
    2982     ssl->options.tls1_3 = 1;
    2983     ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE;
    2984 
    2985     WOLFSSL_LEAVE("DoTls13HelloRetryRequest", ret);
    2986 
    2987     return ret;
    2988 }
    2989 #endif
    2990 
    2991 
    29922943/* handle processing of TLS 1.3 server_hello (2) and hello_retry_request (6) */
    29932944/* Handle the ServerHello message from the server.
     
    30082959    word32          begin = i;
    30092960    int             ret;
    3010 #ifndef WOLFSSL_TLS13_DRAFT_18
    30112961    byte            sessIdSz;
    30122962    const byte*     sessId;
    30132963    byte            b;
    30142964    int             foundVersion;
    3015 #endif
    30162965    word16          totalExtSz;
    30172966#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     
    30232972    WOLFSSL_ENTER("DoTls13ServerHello");
    30242973
     2974    if (ssl->arrays == NULL)
     2975        return BAD_FUNC_ARG;
     2976
    30252977#ifdef WOLFSSL_CALLBACKS
    30262978    if (ssl->hsInfoOn) AddPacketName(ssl, "ServerHello");
     
    30282980#endif
    30292981
     2982    if (ssl == NULL || ssl->arrays == NULL)
     2983        return BAD_FUNC_ARG;
     2984
    30302985    /* Protocol version length check. */
    30312986    if (OPAQUE16_LEN > helloSz)
     
    30352990    XMEMCPY(&pv, input + i, OPAQUE16_LEN);
    30362991    i += OPAQUE16_LEN;
    3037 #ifdef WOLFSSL_TLS13_DRAFT_18
    3038     ret = CheckVersion(ssl, pv);
    3039     if (ret != 0)
    3040         return ret;
    3041     if (!IsAtLeastTLSv1_3(pv) && pv.major != TLS_DRAFT_MAJOR) {
    3042 #ifndef WOLFSSL_NO_TLS12
    3043         if (ssl->options.downgrade) {
    3044             ssl->version = pv;
    3045             return DoServerHello(ssl, input, inOutIdx, helloSz);
    3046         }
    3047 #endif
    3048 
    3049         WOLFSSL_MSG("Client using higher version, fatal error");
    3050         return VERSION_ERROR;
    3051     }
    3052 #else
     2992
    30532993#ifndef WOLFSSL_NO_TLS12
    30542994    if (pv.major == ssl->version.major  && pv.minor < TLSv1_2_MINOR &&
     
    30623002    if (pv.major != ssl->version.major || pv.minor != TLSv1_2_MINOR)
    30633003        return VERSION_ERROR;
    3064 #endif
    3065 
    3066 #ifdef WOLFSSL_TLS13_DRAFT_18
    3067     /* Random length check */
    3068     if ((i - begin) + RAN_LEN > helloSz)
    3069         return BUFFER_ERROR;
    3070 #else
     3004
    30713005    /* Random and session id length check */
    30723006    if ((i - begin) + RAN_LEN + ENUM_LEN > helloSz)
    30733007        return BUFFER_ERROR;
    30743008
    3075     if (XMEMCMP(input + i, helloRetryRequestRandom, RAN_LEN) == 0)
     3009    if (XMEMCMP(input + i, helloRetryRequestRandom, RAN_LEN) == 0) {
    30763010        *extMsgType = hello_retry_request;
    3077 #endif
     3011        /* A HelloRetryRequest comes in as an ServerHello for MiddleBox compat.
     3012         * Found message to be a HelloRetryRequest.
     3013         * Don't allow more than one HelloRetryRequest or ServerHello.
     3014         */
     3015        if (ssl->msgsReceived.got_hello_retry_request == 1) {
     3016            return DUPLICATE_MSG_E;
     3017        }
     3018        /* Update counts to reflect change of message type. */
     3019        ssl->msgsReceived.got_hello_retry_request++;
     3020        ssl->msgsReceived.got_server_hello--;
     3021    }
    30783022
    30793023    /* Server random - keep for debugging. */
     
    30813025    i += RAN_LEN;
    30823026
    3083 #ifndef WOLFSSL_TLS13_DRAFT_18
    30843027    /* Session id */
    30853028    sessIdSz = input[i++];
     
    30883031    sessId = input + i;
    30893032    i += sessIdSz;
    3090 #endif /* WOLFSSL_TLS13_DRAFT_18 */
     3033
    30913034    ssl->options.haveSessionId = 1;
    30923035
    3093 #ifdef WOLFSSL_TLS13_DRAFT_18
    3094     /* Ciphersuite check */
    3095     if ((i - begin) + OPAQUE16_LEN + OPAQUE16_LEN > helloSz)
    3096         return BUFFER_ERROR;
    3097 #else
    30983036    /* Ciphersuite and compression check */
    30993037    if ((i - begin) + OPAQUE16_LEN + OPAQUE8_LEN > helloSz)
    31003038        return BUFFER_ERROR;
    3101 #endif
    31023039
    31033040    /* Set the cipher suite from the message. */
     
    31053042    ssl->options.cipherSuite  = input[i++];
    31063043
    3107 #ifndef WOLFSSL_TLS13_DRAFT_18
    31083044    /* Compression */
    31093045    b = input[i++];
     
    31123048        return INVALID_PARAMETER;
    31133049    }
    3114 #endif
    3115 
    3116 #ifndef WOLFSSL_TLS13_DRAFT_18
     3050
    31173051    if ((i - begin) + OPAQUE16_LEN > helloSz) {
    31183052        if (!ssl->options.downgrade)
     
    31233057        ssl->options.haveEMS = 0;
    31243058    }
    3125     if ((i - begin) < helloSz)
    3126 #endif
    3127     {
     3059    if ((i - begin) < helloSz) {
    31283060        /* Get extension length and length check. */
    31293061        if ((i - begin) + OPAQUE16_LEN > helloSz)
     
    31343066            return BUFFER_ERROR;
    31353067
    3136 #ifndef WOLFSSL_TLS13_DRAFT_18
    31373068        /* Need to negotiate version first. */
    31383069        if ((ret = TLSX_ParseVersion(ssl, (byte*)input + i, totalExtSz,
     
    31513082            ssl->version.minor = pv.minor;
    31523083        }
    3153 #endif
    31543084
    31553085        /* Parse and handle extensions. */
     
    31763106#endif /* HAVE_SECRET_CALLBACK */
    31773107
    3178 #ifndef WOLFSSL_TLS13_DRAFT_18
    31793108    /* Version only negotiated in extensions for TLS v1.3.
    31803109     * Only now do we know how to deal with session id.
     
    32083137    }
    32093138
    3210     #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
     3139#ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT
    32113140    if (sessIdSz == 0)
    32123141        return INVALID_PARAMETER;
     
    32193148    else if (XMEMCMP(ssl->arrays->clientRandom, sessId, sessIdSz) != 0)
    32203149        return INVALID_PARAMETER;
    3221     #else
     3150#else
    32223151    if (sessIdSz != ssl->session.sessionIDSz || (sessIdSz > 0 &&
    32233152                  XMEMCMP(ssl->session.sessionID, sessId, sessIdSz) != 0)) {
     
    32253154        return INVALID_PARAMETER;
    32263155    }
    3227     #endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */
    3228 #endif
     3156#endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */
    32293157
    32303158    ret = SetCipherSpecs(ssl);
     
    32463174
    32473175#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    3248 #ifndef WOLFSSL_TLS13_DRAFT_18
    3249     if (*extMsgType == server_hello)
    3250 #endif
    3251     {
     3176    if (*extMsgType == server_hello) {
    32523177        ext = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
    32533178        if (ext != NULL)
     
    32653190#endif
    32663191
    3267 #ifdef WOLFSSL_TLS13_DRAFT_18
    3268     ssl->keys.encryptionOn = 1;
    3269 #else
    32703192    if (*extMsgType == server_hello) {
    32713193        ssl->keys.encryptionOn = 1;
     
    32783200        ret = RestartHandshakeHash(ssl);
    32793201    }
    3280 #endif
    32813202
    32823203    WOLFSSL_LEAVE("DoTls13ServerHello", ret);
     
    33583279}
    33593280
     3281#ifndef NO_CERTS
    33603282/* handle processing TLS v1.3 certificate_request (13) */
    33613283/* Handle a TLS v1.3 CertificateRequest message.
     
    33763298    word32      begin = *inOutIdx;
    33773299    int         ret = 0;
    3378 #ifndef WOLFSSL_TLS13_DRAFT_18
    33793300    Suites      peerSuites;
    3380 #endif
    33813301#ifdef WOLFSSL_POST_HANDSHAKE_AUTH
    33823302    CertReqCtx* certReqCtx;
     
    33863306    WOLFSSL_ENTER("DoTls13CertificateRequest");
    33873307
    3388 #ifndef WOLFSSL_TLS13_DRAFT_18
    33893308    XMEMSET(&peerSuites, 0, sizeof(Suites));
    3390 #endif
     3309
    33913310#ifdef WOLFSSL_CALLBACKS
    33923311    if (ssl->hsInfoOn) AddPacketName(ssl, "CertificateRequest");
     
    34203339    *inOutIdx += len;
    34213340
    3422 #ifdef WOLFSSL_TLS13_DRAFT_18
    3423     /* Signature and hash algorithms. */
    3424     if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
    3425         return BUFFER_ERROR;
    3426     ato16(input + *inOutIdx, &len);
    3427     *inOutIdx += OPAQUE16_LEN;
    3428     if ((*inOutIdx - begin) + len > size)
    3429         return BUFFER_ERROR;
    3430     if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 &&
    3431                  ssl->buffers.certificate && ssl->buffers.certificate->buffer &&
    3432                  ssl->buffers.key && ssl->buffers.key->buffer) {
    3433         return INVALID_PARAMETER;
    3434     }
    3435     *inOutIdx += len;
    3436 
    3437     /* Length of certificate authority data. */
    3438     if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
    3439         return BUFFER_ERROR;
    3440     ato16(input + *inOutIdx, &len);
    3441     *inOutIdx += OPAQUE16_LEN;
    3442     if ((*inOutIdx - begin) + len > size)
    3443         return BUFFER_ERROR;
    3444 
    3445     /* Certificate authorities. */
    3446     while (len) {
    3447         word16 dnSz;
    3448 
    3449         if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
    3450             return BUFFER_ERROR;
    3451 
    3452         ato16(input + *inOutIdx, &dnSz);
    3453         *inOutIdx += OPAQUE16_LEN;
    3454 
    3455         if ((*inOutIdx - begin) + dnSz > size)
    3456             return BUFFER_ERROR;
    3457 
    3458         *inOutIdx += dnSz;
    3459         len -= OPAQUE16_LEN + dnSz;
    3460     }
    3461 
    3462     /* Certificate extensions */
    3463     if ((*inOutIdx - begin) + OPAQUE16_LEN > size)
    3464         return BUFFER_ERROR;
    3465     ato16(input + *inOutIdx, &len);
    3466     *inOutIdx += OPAQUE16_LEN;
    3467     if ((*inOutIdx - begin) + len > size)
    3468         return BUFFER_ERROR;
    3469     *inOutIdx += len;
    3470 #else
    34713341    /* TODO: Add support for more extensions:
    34723342     *   signed_certificate_timestamp, certificate_authorities, oid_filters.
     
    34863356    }
    34873357    *inOutIdx += len;
    3488 #endif
    34893358
    34903359    if (ssl->buffers.certificate && ssl->buffers.certificate->buffer &&
     
    34943363        #endif
    34953364    )) {
    3496 #ifndef WOLFSSL_TLS13_DRAFT_18
    34973365        if (PickHashSigAlgo(ssl, peerSuites.hashSigAlgo,
    34983366                                               peerSuites.hashSigAlgoSz) != 0) {
    34993367            return INVALID_PARAMETER;
    35003368        }
    3501 #endif
    35023369        ssl->options.sendVerify = SEND_CERT;
    35033370    }
    35043371    else {
     3372#ifndef WOLFSSL_NO_CLIENT_CERT_ERROR
    35053373        ssl->options.sendVerify = SEND_BLANK_CERT;
     3374#else
     3375        WOLFSSL_MSG("Certificate required but none set on client");
     3376        SendAlert(ssl, alert_fatal, illegal_parameter);
     3377        return NO_CERT_ERROR;
     3378#endif
    35063379    }
    35073380
     
    35143387    return ret;
    35153388}
    3516 
     3389#endif /* !NO_CERTS */
    35173390#endif /* !NO_WOLFSSL_CLIENT */
    35183391
     
    35763449    byte          cipherSuite0 = TLS13_BYTE;
    35773450    byte          cipherSuite  = WOLFSSL_DEF_PSK_CIPHER;
     3451    int           cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
    35783452#endif
    35793453
     
    36253499    #ifdef HAVE_SESSION_TICKET
    36263500        /* Decode the identity. */
    3627         if ((ret = DoClientTicket(ssl, current->identity, current->identityLen))
     3501        if (DoClientTicket(ssl, current->identity, current->identityLen)
    36283502                                                     == WOLFSSL_TICKET_RET_OK) {
    36293503            word32 now;
     
    36423516                /* Invalid difference, fallback to full handshake. */
    36433517                ssl->options.resuming = 0;
    3644                 break;
     3518                /* Hash the rest of the ClientHello. */
     3519                return HashRaw(ssl, input + helloSz - bindersLen, bindersLen);
    36453520            }
    36463521
     
    36673542            /* Resumption PSK is resumption master secret. */
    36683543            ssl->arrays->psk_keySz = ssl->specs.hash_size;
    3669         #ifdef WOLFSSL_TLS13_DRAFT_18
    3670             XMEMCPY(ssl->arrays->psk_key, ssl->session.masterSecret,
    3671                     ssl->arrays->psk_keySz);
    3672         #else
    36733544            if ((ret = DeriveResumptionPSK(ssl, ssl->session.ticketNonce.data,
    36743545                    ssl->session.ticketNonce.len, ssl->arrays->psk_key)) != 0) {
    36753546                return ret;
    36763547            }
    3677         #endif
    36783548
    36793549            /* Derive the early secret using the PSK. */
     
    36943564                             MAX_PSK_KEY_LEN, &cipherName)) != 0 &&
    36953565             GetCipherSuiteFromName(cipherName, &cipherSuite0,
    3696                                                           &cipherSuite) == 0) ||
     3566                                    &cipherSuite, &cipherSuiteFlags) == 0) ||
    36973567            (ssl->options.server_psk_cb != NULL &&
    36983568             (ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
     
    37053575            suite[0] = cipherSuite0;
    37063576            suite[1] = cipherSuite;
     3577            (void)cipherSuiteFlags;
    37073578            if (!FindSuiteSSL(ssl, suite)) {
    37083579                current = current->next;
     
    37123583            /* Default to ciphersuite if cb doesn't specify. */
    37133584            ssl->options.resuming = 0;
     3585            /* Don't send certificate request when using PSK. */
     3586            ssl->options.verifyPeer = 0;
    37143587
    37153588            /* PSK age is always zero. */
     
    37653638
    37663639    /* Hash the rest of the ClientHello. */
    3767     ret = HashInputRaw(ssl, input + helloSz - bindersLen, bindersLen);
     3640    ret = HashRaw(ssl, input + helloSz - bindersLen, bindersLen);
    37683641    if (ret != 0)
    37693642        return ret;
     
    38073680    modes = ext->val;
    38083681
     3682#ifdef HAVE_SUPPORTED_CURVES
    38093683    ext = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
    38103684    /* Use (EC)DHE for forward-security if possible. */
     
    38263700        ext->resp = 1;
    38273701    }
    3828     else {
     3702    else
     3703#endif
     3704    {
    38293705        if ((modes & (1 << PSK_KE)) == 0)
    38303706            return PSK_KEY_ERROR;
     
    38413717#endif
    38423718
    3843 #if !defined(WOLFSSL_TLS13_DRAFT_18) && defined(WOLFSSL_SEND_HRR_COOKIE)
     3719#if defined(WOLFSSL_SEND_HRR_COOKIE)
    38443720/* Check that the Cookie data's integrity.
    38453721 *
     
    38923768/* Length of the Cookie Extension excluding cookie data */
    38933769#define HRR_COOKIE_HDR_SZ  (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
    3894 #ifdef WOLFSSL_TLS13_DRAFT_18
    3895 /* PV | CipherSuite | Ext Len */
    3896 #define HRR_BODY_SZ        (OPAQUE16_LEN + OPAQUE16_LEN + OPAQUE16_LEN)
    3897 /* HH | PV | CipherSuite | Ext Len | Key Share | Cookie */
    3898 #define MAX_HRR_SZ   (HANDSHAKE_HEADER_SZ   + \
    3899                         HRR_BODY_SZ         + \
    3900                           HRR_KEY_SHARE_SZ  + \
    3901                           HRR_COOKIE_HDR_SZ)
    3902 #else
    39033770/* PV | Random | Session Id | CipherSuite | Compression | Ext Len */
    39043771#define HRR_BODY_SZ        (VERSION_SZ + RAN_LEN + ENUM_LEN + ID_LEN + \
     
    39103777                          HRR_VERSIONS_SZ   + \
    39113778                          HRR_COOKIE_HDR_SZ)
    3912 #endif
     3779
    39133780
    39143781/* Restart the handshake hash from the cookie value.
     
    39423809    if ((ret = InitHandshakeHashes(ssl)) != 0)
    39433810        return ret;
    3944     if ((ret = HashOutputRaw(ssl, header, sizeof(header))) != 0)
    3945         return ret;
    3946     if ((ret = HashOutputRaw(ssl, cookieData + idx, hashSz)) != 0)
     3811    if ((ret = HashRaw(ssl, header, sizeof(header))) != 0)
     3812        return ret;
     3813    if ((ret = HashRaw(ssl, cookieData + idx, hashSz)) != 0)
    39473814        return ret;
    39483815
    39493816    /* Reconstruct the HelloRetryMessage for handshake hash. */
    3950 #ifdef WOLFSSL_TLS13_DRAFT_18
    3951     length = HRR_BODY_SZ + HRR_COOKIE_HDR_SZ + cookie->len;
    3952 #else
    39533817    length = HRR_BODY_SZ - ID_LEN + ssl->session.sessionIDSz +
    39543818             HRR_COOKIE_HDR_SZ + cookie->len;
    39553819    length += HRR_VERSIONS_SZ;
    3956 #endif
    39573820    if (cookieDataSz > hashSz + OPAQUE16_LEN) {
    39583821        keyShareExt = 1;
    39593822        length += HRR_KEY_SHARE_SZ;
    39603823    }
    3961 #ifdef WOLFSSL_TLS13_DRAFT_18
    3962     AddTls13HandShakeHeader(hrr, length, 0, 0, hello_retry_request, ssl);
    3963 
    3964     idx += hashSz;
    3965     hrrIdx = HANDSHAKE_HEADER_SZ;
    3966     /* The negotiated protocol version. */
    3967     hrr[hrrIdx++] = TLS_DRAFT_MAJOR;
    3968     hrr[hrrIdx++] = TLS_DRAFT_MINOR;
    3969     /* Cipher Suite */
    3970     hrr[hrrIdx++] = cookieData[idx++];
    3971     hrr[hrrIdx++] = cookieData[idx++];
    3972 
    3973     /* Extensions' length */
    3974     length -= HRR_BODY_SZ;
    3975     c16toa(length, hrr + hrrIdx);
    3976     hrrIdx += 2;
    3977 #else
     3824
    39783825    AddTls13HandShakeHeader(hrr, length, 0, 0, server_hello, ssl);
    39793826
     
    40073854    hrrIdx += 2;
    40083855
    4009 #endif
    40103856    /* Optional KeyShare Extension */
    40113857    if (keyShareExt) {
     
    40173863        hrr[hrrIdx++] = cookieData[idx++];
    40183864    }
    4019 #ifndef WOLFSSL_TLS13_DRAFT_18
    40203865    c16toa(TLSX_SUPPORTED_VERSIONS, hrr + hrrIdx);
    40213866    hrrIdx += 2;
     
    40293874        hrr[hrrIdx++] = ssl->version.minor;
    40303875    #endif
    4031 #endif
     3876
    40323877    /* Mandatory Cookie Extension */
    40333878    c16toa(TLSX_COOKIE, hrr + hrrIdx);
     
    40453890#endif
    40463891
    4047     if ((ret = HashOutputRaw(ssl, hrr, hrrIdx)) != 0)
    4048         return ret;
    4049     return HashOutputRaw(ssl, cookieData, cookie->len);
     3892    if ((ret = HashRaw(ssl, hrr, hrrIdx)) != 0)
     3893        return ret;
     3894    return HashRaw(ssl, cookieData, cookie->len);
    40503895}
    40513896#endif
     
    42054050    }
    42064051
     4052    /* From here on we are a TLS 1.3 ClientHello. */
     4053
    42074054    /* Client random */
    42084055    XMEMCPY(ssl->arrays->clientRandom, input + i, RAN_LEN);
     
    42144061#endif
    42154062
    4216 #ifdef WOLFSSL_TLS13_DRAFT_18
    4217     /* Session id - empty in TLS v1.3 */
    4218     sessIdSz = input[i++];
    4219     if (sessIdSz > 0 && !ssl->options.downgrade) {
    4220         WOLFSSL_MSG("Client sent session id - not supported");
    4221         return BUFFER_ERROR;
    4222     }
    4223 #else
    42244063    sessIdSz = input[i++];
    42254064    if (sessIdSz != ID_LEN && sessIdSz != 0)
    42264065        return INVALID_PARAMETER;
    4227 #endif
    42284066
    42294067    if (sessIdSz + i > helloSz) {
     
    42514089    clSuites.hashSigAlgoSz = 0;
    42524090
    4253 #ifdef HAVE_SERVER_RENEGOTIATION_INFO
    4254     ret = FindSuite(&clSuites, 0, TLS_EMPTY_RENEGOTIATION_INFO_SCSV);
    4255     if (ret == SUITES_ERROR)
    4256         return BUFFER_ERROR;
    4257     if (ret >= 0) {
    4258         TLSX* extension;
    4259 
    4260         /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */
    4261         ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap);
    4262         if (ret != WOLFSSL_SUCCESS)
    4263             return ret;
    4264 
    4265         extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO);
    4266         if (extension) {
    4267             ssl->secure_renegotiation = (SecureRenegotiation*)extension->data;
    4268             ssl->secure_renegotiation->enabled = 1;
    4269         }
    4270     }
    4271 #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
    4272 
    42734091    /* Compression */
    42744092    b = input[i++];
     
    43064124    }
    43074125
    4308 #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \
    4309                                                         defined(WOLFSSL_HAPROXY)
     4126#ifdef HAVE_SNI
    43104127        if ((ret = SNI_Callback(ssl)) != 0)
    43114128            return ret;
    43124129        ssl->options.side = WOLFSSL_SERVER_END;
    4313 #endif /* OPENSSL_ALL || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
     4130#endif
    43144131
    43154132    i += totalExtSz;
     
    43214138    ssl->options.haveSessionId = 1;
    43224139
    4323 #if !defined(WOLFSSL_TLS13_DRAFT_18) && defined(WOLFSSL_SEND_HRR_COOKIE)
     4140#if defined(WOLFSSL_SEND_HRR_COOKIE)
    43244141    if (ssl->options.sendCookie &&
    43254142              ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
     
    43404157
    43414158#if (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)) && \
    4342      defined(HAVE_TLS_EXTENSIONS)
     4159                                                    defined(HAVE_TLS_EXTENSIONS)
    43434160    if (TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY) != NULL) {
    43444161        /* Refine list for PSK processing. */
     
    43624179
    43634180    if (!usingPSK) {
     4181#ifndef NO_CERTS
    43644182        if (TLSX_Find(ssl->extensions, TLSX_KEY_SHARE) == NULL) {
    43654183            WOLFSSL_MSG("Client did not send a KeyShare extension");
     
    43794197        }
    43804198
    4381 #ifdef HAVE_NULL_CIPHER
     4199    #ifdef HAVE_NULL_CIPHER
    43824200        if (ssl->options.cipherSuite0 == ECC_BYTE &&
    43834201                              (ssl->options.cipherSuite == TLS_SHA256_SHA256 ||
     
    43864204        }
    43874205        else
    4388 #endif
     4206    #endif
    43894207        /* Check that the negotiated ciphersuite matches protocol version. */
    43904208        if (ssl->options.cipherSuite0 != TLS13_BYTE) {
     
    43954213        }
    43964214
    4397 #ifdef HAVE_SESSION_TICKET
     4215    #ifdef HAVE_SESSION_TICKET
    43984216        if (ssl->options.resuming) {
    43994217            ssl->options.resuming = 0;
    44004218            XMEMSET(ssl->arrays->psk_key, 0, ssl->specs.hash_size);
    44014219        }
    4402 #endif
     4220    #endif
    44034221
    44044222        /* Derive early secret for handshake secret. */
    44054223        if ((ret = DeriveEarlySecret(ssl)) != 0)
    44064224            return ret;
     4225#else
     4226        ret = INVALID_PARAMETER;
     4227#endif
    44074228    }
    44084229
     
    44134234}
    44144235
    4415 #ifdef WOLFSSL_TLS13_DRAFT_18
    4416 /* handle generation of TLS 1.3 hello_retry_request (6) */
    4417 /* Send the HelloRetryRequest message to indicate the negotiated protocol
    4418  * version and security parameters the server is willing to use.
     4236/* Send TLS v1.3 ServerHello message to client.
    44194237 * Only a server will send this message.
    44204238 *
     
    44224240 * returns 0 on success, otherwise failure.
    44234241 */
    4424 int SendTls13HelloRetryRequest(WOLFSSL* ssl)
    4425 {
    4426     int    ret;
    4427     byte*  output;
    4428     word32 length;
    4429     word16 len;
    4430     word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
    4431     int    sendSz;
    4432 
    4433     WOLFSSL_ENTER("SendTls13HelloRetryRequest");
    4434 
    4435     /* Get the length of the extensions that will be written. */
    4436     len = 0;
    4437     ret = TLSX_GetResponseSize(ssl, hello_retry_request, &len);
    4438     /* There must be extensions sent to indicate what client needs to do. */
    4439     if (ret != 0)
    4440         return MISSING_HANDSHAKE_DATA;
    4441 
    4442     /* Protocol version + Extensions */
    4443     length = OPAQUE16_LEN + len;
    4444     sendSz = idx + length;
    4445 
    4446     /* Check buffers are big enough and grow if needed. */
    4447     if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
    4448         return ret;
    4449 
    4450     /* Get position in output buffer to write new message to. */
    4451     output = ssl->buffers.outputBuffer.buffer +
    4452              ssl->buffers.outputBuffer.length;
    4453     /* Add record and handshake headers. */
    4454     AddTls13Headers(output, length, hello_retry_request, ssl);
    4455 
    4456     /* The negotiated protocol version. */
    4457     output[idx++] = TLS_DRAFT_MAJOR;
    4458     output[idx++] = TLS_DRAFT_MINOR;
    4459 
    4460     /* Add TLS extensions. */
    4461     ret = TLSX_WriteResponse(ssl, output + idx, hello_retry_request, NULL);
    4462     if (ret != 0)
    4463         return ret;
    4464     idx += len;
    4465 
    4466 #ifdef WOLFSSL_CALLBACKS
    4467     if (ssl->hsInfoOn)
    4468         AddPacketName(ssl, "HelloRetryRequest");
    4469     if (ssl->toInfoOn) {
    4470         AddPacketInfo(ssl, "HelloRetryRequest", handshake, output, sendSz,
    4471                       WRITE_PROTO, ssl->heap);
    4472     }
    4473 #endif
    4474     if ((ret = HashOutput(ssl, output, idx, 0)) != 0)
    4475         return ret;
    4476 
    4477     ssl->buffers.outputBuffer.length += sendSz;
    4478 
    4479     if (!ssl->options.groupMessages)
    4480         ret = SendBuffered(ssl);
    4481 
    4482     WOLFSSL_LEAVE("SendTls13HelloRetryRequest", ret);
    4483 
    4484     return ret;
    4485 }
    4486 #endif /* WOLFSSL_TLS13_DRAFT_18 */
    4487 
    4488 /* Send TLS v1.3 ServerHello message to client.
    4489  * Only a server will send this message.
    4490  *
    4491  * ssl  The SSL/TLS object.
    4492  * returns 0 on success, otherwise failure.
    4493  */
    4494 #ifdef WOLFSSL_TLS13_DRAFT_18
    4495 static
    4496 #endif
    44974242/* handle generation of TLS 1.3 server_hello (2) */
    44984243int SendTls13ServerHello(WOLFSSL* ssl, byte extMsgType)
     
    45074252    WOLFSSL_ENTER("SendTls13ServerHello");
    45084253
    4509 #ifndef WOLFSSL_TLS13_DRAFT_18
    45104254    if (extMsgType == hello_retry_request) {
    45114255        WOLFSSL_MSG("wolfSSL Doing HelloRetryRequest");
     
    45134257            return ret;
    45144258    }
    4515 #endif
    4516 
    4517 #ifdef WOLFSSL_TLS13_DRAFT_18
    4518     /* Protocol version, server random, cipher suite and extensions. */
    4519     length = VERSION_SZ + RAN_LEN + SUITE_LEN;
    4520     ret = TLSX_GetResponseSize(ssl, server_hello, &length);
    4521     if (ret != 0)
    4522         return ret;
    4523 #else
     4259
    45244260    /* Protocol version, server random, session id, cipher suite, compression
    45254261     * and extensions.
     
    45304266    if (ret != 0)
    45314267        return ret;
    4532 #endif
    45334268    sendSz = idx + length;
    45344269
     
    45444279    AddTls13Headers(output, length, server_hello, ssl);
    45454280
    4546 #ifdef WOLFSSL_TLS13_DRAFT_18
    4547     /* The negotiated protocol version. */
    4548     output[idx++] = TLS_DRAFT_MAJOR;
    4549     output[idx++] = TLS_DRAFT_MINOR;
    4550 #else
    45514281    /* The protocol version must be TLS v1.2 for middleboxes. */
    45524282    output[idx++] = ssl->version.major;
    45534283    output[idx++] = TLSv1_2_MINOR;
    4554 #endif
    45554284
    45564285    if (extMsgType == server_hello) {
     
    45594288            return ret;
    45604289    }
    4561 #ifndef WOLFSSL_TLS13_DRAFT_18
    45624290    else {
    45634291        /* HelloRetryRequest message has fixed value for random. */
    45644292        XMEMCPY(output + idx, helloRetryRequestRandom, RAN_LEN);
    45654293    }
    4566 #endif
     4294
    45674295    /* Store in SSL for debugging. */
    45684296    XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
     
    45744302#endif
    45754303
    4576 #ifndef WOLFSSL_TLS13_DRAFT_18
    45774304    output[idx++] = ssl->session.sessionIDSz;
    45784305    if (ssl->session.sessionIDSz > 0) {
     
    45804307        idx += ssl->session.sessionIDSz;
    45814308    }
    4582 #endif
    45834309
    45844310    /* Chosen cipher suite */
     
    45864312    output[idx++] = ssl->options.cipherSuite;
    45874313
    4588 #ifndef WOLFSSL_TLS13_DRAFT_18
    45894314    /* Compression not supported in TLS v1.3. */
    45904315    output[idx++] = 0;
    4591 #endif
    45924316
    45934317    /* Extensions */
     
    46104334    #endif
    46114335
    4612 #ifdef WOLFSSL_TLS13_DRAFT_18
    4613     ssl->options.serverState = SERVER_HELLO_COMPLETE;
    4614 #else
    46154336    if (extMsgType == server_hello)
    46164337        ssl->options.serverState = SERVER_HELLO_COMPLETE;
    4617 #endif
    4618 
    4619 #ifdef WOLFSSL_TLS13_DRAFT_18
    4620     if (!ssl->options.groupMessages)
    4621 #else
     4338
    46224339    if (!ssl->options.groupMessages || extMsgType != server_hello)
    4623 #endif
     4340
    46244341        ret = SendBuffered(ssl);
    46254342
     
    46514368    ssl->keys.encryptionOn = 1;
    46524369
    4653 #ifndef WOLFSSL_NO_SERVER_GROUPS_EXT
     4370#if defined(HAVE_SUPPORTED_CURVES) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
    46544371    if ((ret = TLSX_SupportedCurve_CheckPriority(ssl)) != 0)
    46554372        return ret;
     
    47504467    word32 i;
    47514468    word16 reqSz;
    4752 #ifndef WOLFSSL_TLS13_DRAFT_18
    47534469    TLSX*  ext;
    4754 #endif
    47554470
    47564471    WOLFSSL_START(WC_FUNC_CERTIFICATE_REQUEST_SEND);
     
    47604475        InitSuitesHashSigAlgo(ssl->suites, 1, 1, 0, 1, ssl->buffers.keySz);
    47614476
    4762 #ifdef WOLFSSL_TLS13_DRAFT_18
    4763     i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
    4764     reqSz = OPAQUE8_LEN + reqCtxLen + REQ_HEADER_SZ + REQ_HEADER_SZ;
    4765     reqSz += LENGTH_SZ + ssl->suites->hashSigAlgoSz;
    4766 
    4767     sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + reqSz;
    4768     /* Always encrypted and make room for padding. */
    4769     sendSz += MAX_MSG_EXTRA;
    4770 
    4771     /* Check buffers are big enough and grow if needed. */
    4772     if ((ret = CheckAvailableSize(ssl, sendSz)) != 0)
    4773         return ret;
    4774 
    4775     /* Get position in output buffer to write new message to. */
    4776     output = ssl->buffers.outputBuffer.buffer +
    4777              ssl->buffers.outputBuffer.length;
    4778 
    4779     /* Put the record and handshake headers on. */
    4780     AddTls13Headers(output, reqSz, certificate_request, ssl);
    4781 
    4782     /* Certificate request context. */
    4783     output[i++] = reqCtxLen;
    4784     if (reqCtxLen != 0) {
    4785         XMEMCPY(output + i, reqCtx, reqCtxLen);
    4786         i += reqCtxLen;
    4787     }
    4788 
    4789     /* supported hash/sig */
    4790     c16toa(ssl->suites->hashSigAlgoSz, &output[i]);
    4791     i += LENGTH_SZ;
    4792 
    4793     XMEMCPY(&output[i], ssl->suites->hashSigAlgo, ssl->suites->hashSigAlgoSz);
    4794     i += ssl->suites->hashSigAlgoSz;
    4795 
    4796     /* Certificate authorities not supported yet - empty buffer. */
    4797     c16toa(0, &output[i]);
    4798     i += REQ_HEADER_SZ;
    4799 
    4800     /* Certificate extensions. */
    4801     c16toa(0, &output[i]);  /* auth's */
    4802     i += REQ_HEADER_SZ;
    4803 #else
    48044477    ext = TLSX_Find(ssl->extensions, TLSX_SIGNATURE_ALGORITHMS);
    48054478    if (ext == NULL)
     
    48414514        return ret;
    48424515    i += reqSz;
    4843 #endif
    48444516
    48454517    /* Always encrypted. */
     
    51814853#endif /* HAVE_ECC */
    51824854
    5183 #ifndef NO_RSA
     4855#if !defined(NO_RSA) && defined(WC_RSA_PSS)
    51844856/* Check that the decrypted signature matches the encoded signature
    51854857 * based on the digest of the signature data.
     
    52244896    return ret;
    52254897}
    5226 #endif /* !NO_RSA */
     4898#endif /* !NO_RSA && WC_RSA_PSS */
    52274899#endif /* !NO_RSA || HAVE_ECC */
    52284900
     
    55345206}
    55355207
     5208#if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
     5209     defined(HAVE_ED448)) && \
     5210    (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH))
    55365211typedef struct Scv13Args {
    55375212    byte*  output; /* not allocated */
     
    56505325            }
    56515326
    5652             if (args->length <= 0) {
     5327            if (args->length == 0) {
    56535328                ERROR_OUT(NO_PRIVATE_KEY, exit_scv);
    56545329            }
     
    56575332            if (ssl->hsType == DYNAMIC_TYPE_RSA)
    56585333                args->sigAlgo = rsa_pss_sa_algo;
     5334        #ifdef HAVE_ECC
    56595335            else if (ssl->hsType == DYNAMIC_TYPE_ECC)
    56605336                args->sigAlgo = ecc_dsa_sa_algo;
     5337        #endif
    56615338        #ifdef HAVE_ED25519
    56625339            else if (ssl->hsType == DYNAMIC_TYPE_ED25519)
     
    56675344                args->sigAlgo = ed448_sa_algo;
    56685345        #endif
     5346            else {
     5347                ERROR_OUT(ALGO_ID_E, exit_scv);
     5348            }
    56695349            EncodeSigAlg(ssl->suites->hashAlgo, args->sigAlgo, args->verify);
    56705350
     
    59135593    return ret;
    59145594}
    5915 
     5595#endif
     5596
     5597#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
    59165598/* handle processing TLS v1.3 certificate (11) */
    59175599/* Parse and handle a TLS v1.3 Certificate message.
     
    59545636    return ret;
    59555637}
     5638#endif
    59565639
    59575640#if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \
     
    60785761            if (args->sigAlgo == ed25519_sa_algo &&
    60795762                                                  !ssl->peerEd25519KeyPresent) {
    6080                 WOLFSSL_MSG("Oops, peer sent ED25519 key but not in verify");
     5763                WOLFSSL_MSG("Peer sent ED22519 sig but not ED22519 cert");
     5764                ret = SIG_VERIFY_E;
     5765                goto exit_dcv;
    60815766            }
    60825767        #endif
    60835768        #ifdef HAVE_ED448
    60845769            if (args->sigAlgo == ed448_sa_algo && !ssl->peerEd448KeyPresent) {
    6085                 WOLFSSL_MSG("Oops, peer sent ED448 key but not in verify");
     5770                WOLFSSL_MSG("Peer sent ED448 sig but not ED448 cert");
     5771                ret = SIG_VERIFY_E;
     5772                goto exit_dcv;
    60865773            }
    60875774        #endif
     
    60895776            if (args->sigAlgo == ecc_dsa_sa_algo &&
    60905777                                                   !ssl->peerEccDsaKeyPresent) {
    6091                 WOLFSSL_MSG("Oops, peer sent ECC key but not in verify");
     5778                WOLFSSL_MSG("Peer sent ECC sig but not ECC cert");
     5779                ret = SIG_VERIFY_E;
     5780                goto exit_dcv;
    60925781            }
    60935782        #endif
    60945783        #ifndef NO_RSA
    60955784            if (args->sigAlgo == rsa_sa_algo) {
    6096                 WOLFSSL_MSG("Oops, peer sent PKCS#1.5 signature");
     5785                WOLFSSL_MSG("Peer sent PKCS#1.5 algo but not in certificate");
    60975786                ERROR_OUT(INVALID_PARAMETER, exit_dcv);
    60985787            }
    60995788            if (args->sigAlgo == rsa_pss_sa_algo &&
    61005789                         (ssl->peerRsaKey == NULL || !ssl->peerRsaKeyPresent)) {
    6101                 WOLFSSL_MSG("Oops, peer sent RSA key but not in verify");
     5790                WOLFSSL_MSG("Peer sent RSA sig but not RSA cert");
     5791                ret = SIG_VERIFY_E;
     5792                goto exit_dcv;
    61025793            }
    61035794        #endif
     
    62615952        case TLS_ASYNC_VERIFY:
    62625953        {
    6263         #ifndef NO_RSA
     5954        #if !defined(NO_RSA) && defined(WC_RSA_PSS)
    62645955            if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) {
    62655956                ret = CheckRSASignature(ssl, args->sigAlgo, args->hashAlgo,
     
    62715962                ssl->peerRsaKeyPresent = 0;
    62725963            }
    6273         #endif /* !NO_RSA */
     5964        #endif /* !NO_RSA && WC_RSA_PSS */
    62745965
    62755966            /* Advance state and proceed */
     
    62915982            /* Advance state and proceed */
    62925983            ssl->options.asyncState = TLS_ASYNC_END;
     5984
     5985        #if !defined(NO_WOLFSSL_CLIENT)
     5986            if (ssl->options.side == WOLFSSL_CLIENT_END)
     5987                ssl->options.serverState = SERVER_CERT_VERIFY_COMPLETE;
     5988        #endif
    62935989        } /* case TLS_ASYNC_FINALIZE */
    62945990
     
    63266022}
    63276023#endif /* !NO_RSA || HAVE_ECC */
     6024#endif /* !NO_CERTS */
    63286025
    63296026/* Parse and handle a TLS v1.3 Finished message.
     
    63386035 * returns 0 on success and otherwise failure.
    63396036 */
    6340 static int DoTls13Finished(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
     6037int DoTls13Finished(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
    63416038                           word32 size, word32 totalSz, int sniff)
    63426039{
     
    63776074        secret = ssl->keys.server_write_MAC_secret;
    63786075    }
    6379     else
     6076    else {
    63806077        secret = ssl->keys.client_write_MAC_secret;
    6381 
    6382     ret = BuildTls13HandshakeHmac(ssl, secret, mac, &finishedSz);
    6383     if (ret != 0)
    6384         return ret;
    6385     if (size != finishedSz)
    6386         return BUFFER_ERROR;
    6387 
    6388     #ifdef WOLFSSL_CALLBACKS
    6389         if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
    6390         if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
    6391     #endif
     6078    }
     6079
     6080    if (sniff == NO_SNIFF) {
     6081        ret = BuildTls13HandshakeHmac(ssl, secret, mac, &finishedSz);
     6082        if (ret != 0)
     6083            return ret;
     6084        if (size != finishedSz)
     6085            return BUFFER_ERROR;
     6086    }
     6087
     6088#ifdef WOLFSSL_CALLBACKS
     6089    if (ssl->hsInfoOn) AddPacketName(ssl, "Finished");
     6090    if (ssl->toInfoOn) AddLateName("Finished", &ssl->timeoutInfo);
     6091#endif
    63926092
    63936093    if (sniff == NO_SNIFF) {
     
    64336133    return 0;
    64346134}
    6435 #endif /* NO_CERTS */
    64366135
    64376136/* Send the TLS v1.3 Finished message.
     
    65026201    if (sendSz < 0)
    65036202        return BUILD_MSG_ERROR;
    6504 
    6505 #ifndef NO_SESSION_CACHE
    6506     if (!ssl->options.resuming && (ssl->options.side == WOLFSSL_SERVER_END ||
    6507             (ssl->options.side == WOLFSSL_SERVER_END && ssl->arrays != NULL))) {
    6508         AddSession(ssl);    /* just try */
    6509     }
    6510 #endif
    65116203
    65126204    #ifdef WOLFSSL_CALLBACKS
     
    68396531    word16 length;
    68406532    word32 now;
    6841 #ifndef WOLFSSL_TLS13_DRAFT_18
    6842     const byte*  nonce;
    6843     byte         nonceLength;
    6844 #endif
     6533    const byte* nonce;
     6534    byte        nonceLength;
    68456535
    68466536    WOLFSSL_START(WC_FUNC_NEW_SESSION_TICKET_DO);
     
    68616551    *inOutIdx += SESSION_ADD_SZ;
    68626552
    6863 #ifndef WOLFSSL_TLS13_DRAFT_18
    68646553    /* Ticket nonce. */
    68656554    if ((*inOutIdx - begin) + 1 > size)
     
    68756564    nonce = input + *inOutIdx;
    68766565    *inOutIdx += nonceLength;
    6877 #endif
    68786566
    68796567    /* Ticket length. */
     
    69026590    ssl->session.maxEarlyDataSz = ssl->options.maxEarlyDataSz;
    69036591    #endif
    6904 #ifndef WOLFSSL_TLS13_DRAFT_18
    69056592    ssl->session.ticketNonce.len = nonceLength;
    69066593    if (nonceLength > 0)
    69076594        XMEMCPY(&ssl->session.ticketNonce.data, nonce, nonceLength);
    6908 #endif
    69096595    ssl->session.namedGroup     = ssl->namedGroup;
    69106596
     
    70026688    if (ssl->earlyData != no_early_data) {
    70036689        static byte endOfEarlyData[] = { 0x05, 0x00, 0x00, 0x00 };
    7004         ret = HashInputRaw(ssl, endOfEarlyData, sizeof(endOfEarlyData));
     6690        ret = HashRaw(ssl, endOfEarlyData, sizeof(endOfEarlyData));
    70056691        if (ret != 0)
    70066692            return ret;
    70076693    }
    70086694#endif
    7009     if ((ret = HashInputRaw(ssl, header, sizeof(header))) != 0)
    7010         return ret;
    7011     if ((ret = HashInputRaw(ssl, mac, finishedSz)) != 0)
     6695    if ((ret = HashRaw(ssl, header, sizeof(header))) != 0)
     6696        return ret;
     6697    if ((ret = HashRaw(ssl, mac, finishedSz)) != 0)
    70126698        return ret;
    70136699
     
    70696755#endif
    70706756
    7071 #ifndef WOLFSSL_TLS13_DRAFT_18
    70726757    /* Start ticket nonce at 0 and go up to 255. */
    70736758    if (ssl->session.ticketNonce.len == 0) {
     
    70776762    else
    70786763        ssl->session.ticketNonce.data[0]++;
    7079 #endif
    70806764
    70816765    if (!ssl->options.noTicketTls13) {
     
    70996783    length = SESSION_HINT_SZ + SESSION_ADD_SZ + LENGTH_SZ +
    71006784             ssl->session.ticketLen + extSz;
    7101 #ifndef WOLFSSL_TLS13_DRAFT_18
    71026785    /* Nonce */
    71036786    length += TICKET_NONCE_LEN_SZ + DEF_TICKET_NONCE_SZ;
    7104 #endif
    71056787    sendSz = idx + length + MAX_MSG_EXTRA;
    71066788
     
    71236805    idx += SESSION_ADD_SZ;
    71246806
    7125 #ifndef WOLFSSL_TLS13_DRAFT_18
    71266807    output[idx++] = ssl->session.ticketNonce.len;
    71276808    output[idx++] = ssl->session.ticketNonce.data[0];
    7128 #endif
    71296809
    71306810    /* length */
     
    71616841    ssl->buffers.outputBuffer.length += sendSz;
    71626842
    7163     if (!ssl->options.groupMessages)
    7164         ret = SendBuffered(ssl);
     6843    /* Always send as this is either directly after server's Finished or only
     6844     * message after client's Finished.
     6845     */
     6846    ret = SendBuffered(ssl);
    71656847
    71666848    WOLFSSL_LEAVE("SendTls13NewSessionTicket", 0);
     
    72126894            }
    72136895        #endif
    7214         #ifdef WOLFSSL_TLS13_DRAFT_18
    7215             if (ssl->msgsReceived.got_server_hello) {
     6896            if (ssl->msgsReceived.got_server_hello == 1) {
    72166897                WOLFSSL_MSG("Duplicate ServerHello received");
    72176898                return DUPLICATE_MSG_E;
    72186899            }
    7219             ssl->msgsReceived.got_server_hello = 1;
    7220         #else
    7221             if (ssl->msgsReceived.got_server_hello == 2) {
    7222                 WOLFSSL_MSG("Duplicate ServerHello received");
    7223                 return DUPLICATE_MSG_E;
    7224             }
    72256900            ssl->msgsReceived.got_server_hello++;
    7226         #endif
    72276901
    72286902            break;
     
    72736947#endif
    72746948
    7275 #ifdef WOLFSSL_TLS13_DRAFT_18
    7276     #ifndef NO_WOLFSSL_CLIENT
    7277         case hello_retry_request:
    7278         #ifndef NO_WOLFSSL_SERVER
    7279             if (ssl->options.side == WOLFSSL_SERVER_END) {
    7280                 WOLFSSL_MSG("HelloRetryRequest received by server");
    7281                 return OUT_OF_ORDER_E;
    7282             }
    7283         #endif
    7284             if (ssl->options.clientState > CLIENT_FINISHED_COMPLETE) {
    7285                 WOLFSSL_MSG("HelloRetryRequest received out of order");
    7286                 return OUT_OF_ORDER_E;
    7287             }
    7288             if (ssl->msgsReceived.got_hello_retry_request) {
    7289                 WOLFSSL_MSG("Duplicate HelloRetryRequest received");
    7290                 return DUPLICATE_MSG_E;
    7291             }
    7292             ssl->msgsReceived.got_hello_retry_request = 1;
    7293 
    7294             break;
    7295     #endif
    7296 #endif
    7297 
    72986949#ifndef NO_WOLFSSL_CLIENT
    72996950        case encrypted_extensions:
     
    73777028            if (ssl->options.serverState ==
    73787029                                         SERVER_ENCRYPTED_EXTENSIONS_COMPLETE &&
     7030                                                  ssl->arrays != NULL &&
    73797031                                                  ssl->arrays->psk_keySz != 0) {
    73807032                WOLFSSL_MSG("CertificateRequset received while using PSK");
     
    74037055                /* Server's authenticating with PSK must not send this. */
    74047056                if (ssl->options.serverState == SERVER_CERT_COMPLETE &&
     7057                                                  ssl->arrays != NULL &&
    74057058                                                  ssl->arrays->psk_keySz != 0) {
    74067059                    WOLFSSL_MSG("CertificateVerify received while using PSK");
     
    74417094                    return OUT_OF_ORDER_E;
    74427095                }
    7443                 if (ssl->options.serverState <
     7096                /* Must have seen certificate and verify from server except when
     7097                 * using PSK. */
     7098            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     7099                if (ssl->arrays != NULL && ssl->arrays->psk_keySz != 0) {
     7100                    if (ssl->options.serverState !=
    74447101                                         SERVER_ENCRYPTED_EXTENSIONS_COMPLETE) {
     7102                        WOLFSSL_MSG("Finished received out of order");
     7103                        return OUT_OF_ORDER_E;
     7104                    }
     7105                }
     7106                else
     7107            #endif
     7108                if (ssl->options.serverState != SERVER_CERT_VERIFY_COMPLETE) {
    74457109                    WOLFSSL_MSG("Finished received out of order");
    74467110                    return OUT_OF_ORDER_E;
     
    74507114        #ifndef NO_WOLFSSL_SERVER
    74517115            if (ssl->options.side == WOLFSSL_SERVER_END) {
    7452                 if (ssl->options.serverState < SERVER_FINISHED_COMPLETE) {
     7116                if (ssl->options.serverState != SERVER_FINISHED_COMPLETE) {
    74537117                    WOLFSSL_MSG("Finished received out of order");
    74547118                    return OUT_OF_ORDER_E;
     
    75317195    if (ssl->options.handShakeState == HANDSHAKE_DONE &&
    75327196            type != session_ticket && type != certificate_request &&
    7533             type != certificate && type != key_update) {
     7197            type != certificate && type != key_update && type != finished) {
    75347198        WOLFSSL_MSG("HandShake message after handshake complete");
    75357199        SendAlert(ssl, alert_fatal, unexpected_message);
     
    75567220#ifndef NO_WOLFSSL_CLIENT
    75577221    /* Messages only received by client. */
    7558     #ifdef WOLFSSL_TLS13_DRAFT_18
    7559     case hello_retry_request:
    7560         WOLFSSL_MSG("processing hello retry request");
    7561         ret = DoTls13HelloRetryRequest(ssl, input, inOutIdx, size);
    7562         break;
    7563     #endif
    7564 
    75657222    case server_hello:
    75667223        WOLFSSL_MSG("processing server hello");
     
    75727229                                               IsAtLeastTLSv1_3(ssl->version)) {
    75737230            ssl->options.cacheMessages = 0;
    7574             if (ssl->hsHashes->messages != NULL) {
     7231            if ((ssl->hsHashes != NULL) && (ssl->hsHashes->messages != NULL)) {
    75757232                XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES);
    75767233                ssl->hsHashes->messages = NULL;
     
    76147271
    76157272    /* Messages received by both client and server. */
    7616 #ifndef NO_CERTS
     7273#if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \
     7274                           !defined(WOLFSSL_NO_CLIENT_AUTH))
    76177275    case certificate:
    76187276        WOLFSSL_MSG("processing certificate");
     
    76767334
    76777335                if ((ret = DeriveTls13Keys(ssl, handshake_key,
    7678                                            ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0) {
     7336                                        ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0) {
    76797337                    return ret;
    76807338                }
    76817339        #ifdef WOLFSSL_EARLY_DATA
    7682                 if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
    7683                     return ret;
    7684         #else
     7340                if (ssl->earlyData != no_early_data) {
     7341                    if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0)
     7342                        return ret;
     7343                }
     7344                else
     7345        #endif
    76857346                if ((ret = SetKeysSide(ssl, ENCRYPT_AND_DECRYPT_SIDE)) != 0)
    76867347                    return ret;
    7687         #endif
    76887348            }
    76897349
     
    76937353        #ifdef WOLFSSL_EARLY_DATA
    76947354                if ((ret = DeriveTls13Keys(ssl, traffic_key,
    7695                                        ENCRYPT_AND_DECRYPT_SIDE,
    7696                                        ssl->earlyData == no_early_data)) != 0) {
     7355                                    ENCRYPT_AND_DECRYPT_SIDE,
     7356                                    ssl->earlyData == no_early_data)) != 0) {
    76977357                    return ret;
    76987358                }
    76997359        #else
    77007360                if ((ret = DeriveTls13Keys(ssl, traffic_key,
    7701                                            ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0) {
     7361                                        ENCRYPT_AND_DECRYPT_SIDE, 1)) != 0) {
    77027362                    return ret;
    77037363                }
     
    77117371                ssl->options.connectState  = FIRST_REPLY_DONE;
    77127372                ssl->options.handShakeState = CLIENT_HELLO_COMPLETE;
    7713 
    7714                 if (wolfSSL_connect_TLSv13(ssl) != SSL_SUCCESS)
    7715                     ret = POST_HAND_AUTH_ERROR;
     7373                ssl->options.processReply = 0; /* doProcessInit */
     7374
     7375                if (wolfSSL_connect_TLSv13(ssl) != WOLFSSL_SUCCESS) {
     7376                    ret = ssl->error;
     7377                    if (ret != WC_PENDING_E)
     7378                        ret = POST_HAND_AUTH_ERROR;
     7379                }
    77167380            }
    77177381        #endif
     
    77567420    int    ret = 0;
    77577421    word32 inputLength;
     7422    byte   type;
     7423    word32 size = 0;
    77587424
    77597425    WOLFSSL_ENTER("DoTls13HandShakeMsg()");
    77607426
    77617427    if (ssl->arrays == NULL) {
    7762         byte   type;
    7763         word32 size;
     7428
    77647429
    77657430        if (GetHandshakeHeader(ssl, input, inOutIdx, &type, &size,
     
    77787443     * pending message size will be non-zero. */
    77797444    if (ssl->arrays->pendingMsgSz == 0) {
    7780         byte   type;
    7781         word32 size;
    77827445
    77837446        if (GetHandshakeHeader(ssl,input, inOutIdx, &type, &size, totalSz) != 0)
     
    78797542    if (ssl->buffers.outputBuffer.length > 0
    78807543    #ifdef WOLFSSL_ASYNC_CRYPT
    7881         /* do not send buffered or advance state if last error was an 
     7544        /* do not send buffered or advance state if last error was an
    78827545            async pending operation */
    78837546        && ssl->error != WC_PENDING_E
     
    79177580    #ifdef WOLFSSL_EARLY_DATA
    79187581            if (ssl->earlyData != no_early_data) {
    7919         #if !defined(WOLFSSL_TLS13_DRAFT_18) && \
    7920                                          defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
     7582        #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
    79217583                if ((ssl->error = SendChangeCipher(ssl)) != 0) {
    79227584                    WOLFSSL_ERROR(ssl->error);
     
    79417603            }
    79427604
    7943             ssl->options.connectState = HELLO_AGAIN;
    7944             WOLFSSL_MSG("connect state: HELLO_AGAIN");
    7945             FALL_THROUGH;
    7946 
    7947         case HELLO_AGAIN:
    7948             if (ssl->options.certOnly)
    7949                 return WOLFSSL_SUCCESS;
    7950 
    79517605            if (!ssl->options.tls1_3) {
    79527606    #ifndef WOLFSSL_NO_TLS12
     
    79547608                    return wolfSSL_connect(ssl);
    79557609    #endif
    7956 
    79577610                WOLFSSL_MSG("Client using higher version, fatal error");
    79587611                return VERSION_ERROR;
    79597612            }
    79607613
     7614            ssl->options.connectState = HELLO_AGAIN;
     7615            WOLFSSL_MSG("connect state: HELLO_AGAIN");
     7616            FALL_THROUGH;
     7617
     7618        case HELLO_AGAIN:
     7619            if (ssl->options.certOnly)
     7620                return WOLFSSL_SUCCESS;
     7621
    79617622            if (ssl->options.serverState ==
    79627623                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
    7963         #if !defined(WOLFSSL_TLS13_DRAFT_18) && \
    7964                                          defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
     7624        #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
    79657625                if (!ssl->options.sentChangeCipher) {
    79667626                    if ((ssl->error = SendChangeCipher(ssl)) != 0) {
     
    80117671
    80127672        case FIRST_REPLY_FIRST:
    8013         #if !defined(WOLFSSL_TLS13_DRAFT_18) && \
    8014                                          defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
     7673        #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
    80157674            if (!ssl->options.sentChangeCipher) {
    80167675                if ((ssl->error = SendChangeCipher(ssl)) != 0) {
     
    80437702
    80447703        case FIRST_REPLY_THIRD:
    8045         #ifndef NO_CERTS
     7704        #if (!defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \
     7705             defined(HAVE_ED25519) || defined(HAVE_ED448))) && \
     7706             (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH))
    80467707            if (!ssl->options.resuming && ssl->options.sendVerify) {
    80477708                ssl->error = SendTls13CertificateVerify(ssl);
     
    81727833#endif
    81737834
     7835#ifdef HAVE_SUPPORTED_CURVES
    81747836/* Create a key share entry from group.
    81757837 * Generates a key pair.
     
    82137875    return WOLFSSL_SUCCESS;
    82147876}
     7877#endif
    82157878
    82167879/* Do not send a ticket after TLS v1.3 handshake for resumption.
     
    84148077        return NOT_READY_ERROR;
    84158078
     8079#ifdef HAVE_SUPPORTED_CURVES
    84168080    /* Return supported groups only. */
    84178081    return TLSX_SupportedCurve_Preferred(ssl, 1);
    84188082#else
     8083    return 0;
     8084#endif
     8085#else
    84198086    return SIDE_ERROR;
    84208087#endif
     
    84228089#endif
    84238090
     8091#if defined(HAVE_SUPPORTED_CURVES)
    84248092/* Sets the key exchange groups in rank order on a context.
    84258093 *
     
    84328100int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count)
    84338101{
    8434     int i;
    8435 
     8102    int ret, i;
     8103
     8104    WOLFSSL_ENTER("wolfSSL_CTX_set_groups");
    84368105    if (ctx == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT)
    84378106        return BAD_FUNC_ARG;
     
    84398108        return BAD_FUNC_ARG;
    84408109
    8441     for (i = 0; i < count; i++)
    8442         ctx->group[i] = (word16)groups[i];
     8110    ctx->numGroups = 0;
     8111    TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
     8112    for (i = 0; i < count; i++) {
     8113        /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups
     8114         * are valid */
     8115        if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, groups[i]))
     8116                != WOLFSSL_SUCCESS) {
     8117            TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
     8118            return ret;
     8119        }
     8120        ctx->group[i] = groups[i];
     8121    }
    84438122    ctx->numGroups = (byte)count;
    84448123
     
    84568135int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count)
    84578136{
    8458     int i;
    8459 
     8137    int ret, i;
     8138
     8139    WOLFSSL_ENTER("wolfSSL_set_groups");
    84608140    if (ssl == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT)
    84618141        return BAD_FUNC_ARG;
     
    84638143        return BAD_FUNC_ARG;
    84648144
    8465     for (i = 0; i < count; i++)
    8466         ssl->group[i] = (word16)groups[i];
     8145    ssl->numGroups = 0;
     8146    TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
     8147    for (i = 0; i < count; i++) {
     8148        /* Call to wolfSSL_UseSupportedCurve also checks if input groups
     8149                 * are valid */
     8150        if ((ret = wolfSSL_UseSupportedCurve(ssl, groups[i]))
     8151                != WOLFSSL_SUCCESS) {
     8152            TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
     8153            return ret;
     8154        }
     8155        ssl->group[i] = groups[i];
     8156    }
    84678157    ssl->numGroups = (byte)count;
    84688158
    84698159    return WOLFSSL_SUCCESS;
    84708160}
     8161#endif /* HAVE_SUPPORTED_CURVES */
    84718162
    84728163#ifndef NO_PSK
     
    86078298    if (ssl->buffers.outputBuffer.length > 0
    86088299    #ifdef WOLFSSL_ASYNC_CRYPT
    8609         /* do not send buffered or advance state if last error was an 
     8300        /* do not send buffered or advance state if last error was an
    86108301            async pending operation */
    86118302        && ssl->error != WC_PENDING_E
     
    86538344
    86548345        case TLS13_ACCEPT_CLIENT_HELLO_DONE :
    8655 #ifdef WOLFSSL_TLS13_DRAFT_18
    8656             if (ssl->options.serverState ==
    8657                                           SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
    8658                 if ((ssl->error = SendTls13HelloRetryRequest(ssl)) != 0) {
    8659                     WOLFSSL_ERROR(ssl->error);
    8660                     return WOLFSSL_FATAL_ERROR;
    8661                 }
    8662             }
    8663 
    8664             ssl->options.acceptState = TLS13_ACCEPT_FIRST_REPLY_DONE;
    8665             WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
    8666             FALL_THROUGH;
    8667 
    8668         case TLS13_ACCEPT_HELLO_RETRY_REQUEST_DONE :
    8669 #else
    86708346            if (ssl->options.serverState ==
    86718347                                          SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
     
    86968372            WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE");
    86978373            FALL_THROUGH;
    8698 #endif
    86998374
    87008375        case TLS13_ACCEPT_FIRST_REPLY_DONE :
     
    87248399
    87258400        case TLS13_SERVER_HELLO_SENT :
    8726     #if !defined(WOLFSSL_TLS13_DRAFT_18) && \
    8727                                          defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
     8401    #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT)
    87288402            if (!ssl->options.sentChangeCipher) {
    87298403                if ((ssl->error = SendChangeCipher(ssl)) != 0) {
     
    87408414
    87418415        case TLS13_ACCEPT_THIRD_REPLY_DONE :
     8416#ifdef HAVE_SUPPORTED_CURVES
    87428417            if (!ssl->options.noPskDheKe) {
    87438418                ssl->error = TLSX_KeyShare_DeriveSecret(ssl);
     
    87458420                    return WOLFSSL_FATAL_ERROR;
    87468421            }
     8422#endif
    87478423
    87488424            if ((ssl->error = SendTls13EncryptedExtensions(ssl)) != 0) {
     
    87848460
    87858461        case TLS13_CERT_SENT :
    8786 #ifndef NO_CERTS
     8462#if !defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \
     8463     defined(HAVE_ED25519) || defined(HAVE_ED448))
    87878464            if (!ssl->options.resuming && ssl->options.sendVerify) {
    87888465                if ((ssl->error = SendTls13CertificateVerify(ssl)) != 0) {
  • azure_iot_hub_f767zi/trunk/wolfssl-4.7.0/src/wolfio.c

    r457 r464  
    8989}
    9090
    91 static WC_INLINE int wolfSSL_LastError(void)
    92 {
     91static WC_INLINE int wolfSSL_LastError(int err)
     92{
     93    (void)err; /* Suppress unused arg */
     94
    9395#ifdef USE_WINDOWS_API
    9496    return WSAGetLastError();
    9597#elif defined(EBSNET)
    9698    return xn_getlasterror();
     99#elif defined(WOLFSSL_LINUXKM)
     100    return err; /* Return provided error value */
     101#elif defined(FUSION_RTOS)
     102    #include <fclerrno.h>
     103    return FCL_GET_ERRNO;
    97104#else
    98105    return errno;
     
    104111
    105112#ifdef OPENSSL_EXTRA
     113#ifndef NO_BIO
    106114/* Use the WOLFSSL read BIO for receiving data. This is set by the function
    107115 * wolfSSL_set_bio and can also be set by wolfSSL_CTX_SetIORecv.
     
    182190        WOLFSSL_MSG("Calling custom biowr");
    183191        sent = ssl->biowr->method->writeCb(ssl->biowr, buf, sz);
    184         if (sent < 0) {
     192        if ((sent < 0) && (sent != WOLFSSL_CBIO_ERR_WANT_WRITE)) {
    185193            return WOLFSSL_CBIO_ERR_GENERAL;
    186194        }
     
    205213    return sent;
    206214}
    207 #endif
     215#endif /* !NO_BIO */
     216#endif /* OPENSSL_EXTRA */
    208217
    209218
     
    215224int EmbedReceive(WOLFSSL *ssl, char *buf, int sz, void *ctx)
    216225{
     226    int recvd;
     227#ifndef WOLFSSL_LINUXKM
    217228    int sd = *(int*)ctx;
    218     int recvd;
     229#else
     230    struct socket *sd = (struct socket*)ctx;
     231#endif
    219232
    220233    recvd = wolfIO_Recv(sd, buf, sz, ssl->rflags);
    221234    if (recvd < 0) {
    222         int err = wolfSSL_LastError();
     235        int err = wolfSSL_LastError(recvd);
    223236        WOLFSSL_MSG("Embed Receive error");
    224237
     
    257270int EmbedSend(WOLFSSL* ssl, char *buf, int sz, void *ctx)
    258271{
     272    int sent;
     273#ifndef WOLFSSL_LINUXKM
    259274    int sd = *(int*)ctx;
    260     int sent;
     275#else
     276    struct socket *sd = (struct socket*)ctx;
     277#endif
    261278
    262279#ifdef WOLFSSL_MAX_SEND_SZ
     
    267284    sent = wolfIO_Send(sd, buf, sz, ssl->wflags);
    268285    if (sent < 0) {
    269         int err = wolfSSL_LastError();
     286        int err = wolfSSL_LastError(sent);
    270287        WOLFSSL_MSG("Embed Send error");
    271288
     
    319336    WOLFSSL_ENTER("EmbedReceiveFrom()");
    320337
    321     if (ssl->options.handShakeDone)
     338    /* Don't use ssl->options.handShakeDone since it is true even if
     339     * we are in the process of renegotiation */
     340    if (ssl->options.handShakeState == HANDSHAKE_DONE)
    322341        dtls_timeout = 0;
    323342
     
    335354        }
    336355    }
     356#ifndef NO_ASN_TIME
     357    else if(IsSCR(ssl)) {
     358        if (ssl->dtls_start_timeout &&
     359                LowResTimer() - ssl->dtls_start_timeout > (word32)dtls_timeout) {
     360            ssl->dtls_start_timeout = 0;
     361            return WOLFSSL_CBIO_ERR_TIMEOUT;
     362        }
     363        else if (!ssl->dtls_start_timeout) {
     364            ssl->dtls_start_timeout = LowResTimer();
     365        }
     366    }
     367#endif /* !NO_ASN_TIME */
    337368
    338369    recvd = (int)RECVFROM_FUNCTION(sd, buf, sz, ssl->rflags,
     
    342373
    343374    if (recvd < 0) {
    344         err = wolfSSL_LastError();
     375        err = wolfSSL_LastError(recvd);
    345376        WOLFSSL_MSG("Embed Receive From error");
    346377
     
    380411        }
    381412    }
     413#ifndef NO_ASN_TIME
     414    ssl->dtls_start_timeout = 0;
     415#endif /* !NO_ASN_TIME */
    382416
    383417    return recvd;
     
    404438
    405439    if (sent < 0) {
    406         err = wolfSSL_LastError();
     440        err = wolfSSL_LastError(sent);
    407441        WOLFSSL_MSG("Embed Send To error");
    408442
     
    452486
    453487    if (recvd < 0) {
    454         err = wolfSSL_LastError();
     488        err = wolfSSL_LastError(recvd);
    455489        WOLFSSL_MSG("Embed Receive From error");
    456490
     
    636670#endif /* WOLFSSL_SESSION_EXPORT */
    637671#endif /* WOLFSSL_DTLS */
     672
     673#ifdef WOLFSSL_LINUXKM
     674static int linuxkm_send(struct socket *socket, void *buf, int size,
     675    unsigned int flags)
     676{
     677    int ret;
     678    struct kvec vec = { .iov_base = buf, .iov_len = size };
     679    struct msghdr msg = { .msg_flags = flags };
     680    ret = kernel_sendmsg(socket, &msg, &vec, 1, size);
     681    return ret;
     682}
     683
     684static int linuxkm_recv(struct socket *socket, void *buf, int size,
     685    unsigned int flags)
     686{
     687    int ret;
     688    struct kvec vec = { .iov_base = buf, .iov_len = size };
     689    struct msghdr msg = { .msg_flags = flags };
     690    ret = kernel_recvmsg(socket, &msg, &vec, 1, size, msg.msg_flags);
     691    return ret;
     692}
     693#endif /* WOLFSSL_LINUXKM */
    638694
    639695
     
    733789            }
    734790        }
     791
     792        WOLFSSL_MSG("Select error");
    735793        return SOCKET_ERROR_E;
    736794    }
     
    780838#endif
    781839
     840    if (sockfd == NULL || ip == NULL) {
     841        return -1;
     842    }
     843
    782844    XMEMSET(&addr, 0, sizeof(addr));
    783845
     
    822884
    823885    *sockfd = (SOCKET_T)socket(addr.ss_family, SOCK_STREAM, 0);
    824 
    825886#ifdef USE_WINDOWS_API
    826     if (*sockfd == INVALID_SOCKET) {
     887    if (*sockfd == SOCKET_INVALID)
     888#else
     889    if (*sockfd <= SOCKET_INVALID)
     890#endif
     891    {
    827892        WOLFSSL_MSG("bad socket fd, out of fds?");
    828893        return -1;
    829894    }
    830 #else
    831      if (*sockfd < 0) {
    832          WOLFSSL_MSG("bad socket fd, out of fds?");
    833          return -1;
    834      }
    835 #endif
    836895
    837896#ifdef HAVE_IO_TIMEOUT
     
    858917    if (ret != 0) {
    859918        WOLFSSL_MSG("Responder tcp connect failed");
     919        CloseSocket(*sockfd);
     920        *sockfd = SOCKET_INVALID;
    860921        return -1;
    861922    }
     
    10741135            }
    10751136            else {
     1137                result = TranslateReturnCode(result, sfd);
     1138                result = wolfSSL_LastError(result);
     1139                if (result == SOCKET_EWOULDBLOCK || result == SOCKET_EAGAIN) {
     1140                    return OCSP_WANT_READ;
     1141                }
     1142
    10761143                WOLFSSL_MSG("wolfIO_HttpProcessResponse recv http from peer failed");
    10771144                return -1;
     
    13391406                        byte* ocspReqBuf, int ocspReqSz, byte** ocspRespBuf)
    13401407{
    1341     SOCKET_T sfd = 0;
     1408    SOCKET_T sfd = SOCKET_INVALID;
    13421409    word16   port;
    13431410    int      ret = -1;
     
    13861453
    13871454            ret = wolfIO_TcpConnect(&sfd, domainName, port, io_timeout_sec);
    1388             if ((ret != 0) || ((int)sfd < 0)) {
     1455            if (ret != 0) {
    13891456                WOLFSSL_MSG("OCSP Responder connection failed");
    13901457            }
     
    14011468                                                 HTTP_SCRATCH_BUFFER_SIZE, ctx);
    14021469            }
    1403 
    1404             CloseSocket(sfd);
     1470            if (sfd != SOCKET_INVALID)
     1471                CloseSocket(sfd);
    14051472            XFREE(httpBuf, ctx, DYNAMIC_TYPE_OCSP);
    14061473        }
     
    14601527int EmbedCrlLookup(WOLFSSL_CRL* crl, const char* url, int urlSz)
    14611528{
    1462     SOCKET_T sfd = 0;
     1529    SOCKET_T sfd = SOCKET_INVALID;
    14631530    word16   port;
    14641531    int      ret = -1;
     
    14921559
    14931560            ret = wolfIO_TcpConnect(&sfd, domainName, port, io_timeout_sec);
    1494             if ((ret != 0) || (sfd < 0)) {
     1561            if (ret != 0) {
    14951562                WOLFSSL_MSG("CRL connection failed");
    14961563            }
     
    15031570                                                      HTTP_SCRATCH_BUFFER_SIZE);
    15041571            }
    1505 
    1506             CloseSocket(sfd);
     1572            if (sfd != SOCKET_INVALID)
     1573                CloseSocket(sfd);
    15071574            XFREE(httpBuf, crl->heap, DYNAMIC_TYPE_CRL);
    15081575        }
     
    20312098
    20322099    XMEMSET(mynewt_ctx, 0, sizeof(Mynewt_Ctx));
    2033     mynewt_ctx->mnMemBuffer = XMALLOC(mempool_bytes, 0, 0);
     2100    mynewt_ctx->mnMemBuffer = (void *)XMALLOC(mempool_bytes, 0, 0);
    20342101    if(!mynewt_ctx->mnMemBuffer) {
    20352102        mynewt_ctx_clear((void*)mynewt_ctx);
     
    20822149    struct os_mbuf *m;
    20832150    int read_sz = 0;
    2084     uint16_t total;
     2151    word16 total;
    20852152
    20862153    if (mynewt_ctx == NULL || mynewt_ctx->mnSocket == NULL) {
     
    23252392    sock_udp_ep_t ep;
    23262393    int ret;
    2327     uint32_t timeout = wolfSSL_dtls_get_current_timeout(ssl) * 1000000;
     2394    word32 timeout = wolfSSL_dtls_get_current_timeout(ssl) * 1000000;
    23282395    sock_tls_t *ctx = (sock_tls_t *)_ctx;
    23292396    if (!ctx)
Note: See TracChangeset for help on using the changeset viewer.