Ignore:
Timestamp:
Feb 7, 2019, 8:36:33 AM (5 years ago)
Author:
coas-nagasima
Message:

wolfsslを3.15.7にバージョンアップ

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_rx/trunk/wolfssl-3.12.2/src/tls.c

    r337 r372  
    4949    #include <wolfssl/wolfcrypt/random.h>
    5050#endif
     51
    5152#ifdef HAVE_QSH
    5253    static int TLSX_AddQSHKey(QSHKey** list, QSHKey* key);
     
    5758#endif /* HAVE_QSH */
    5859
     60#if (!defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
     61        !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)) || \
     62    (defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES))
     63static int TLSX_KeyShare_IsSupported(int namedGroup);
     64#endif
     65
     66#if (!defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
     67        !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)) || \
     68    (defined(WOLFSSL_TLS13) && !defined(HAVE_ECC) && \
     69        !defined(HAVE_CURVE25519) && defined(HAVE_SUPPORTED_CURVES)) || \
     70    ((defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
     71        defined(HAVE_SUPPORTED_CURVES))
     72static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions);
     73#endif
     74
    5975
    6076#ifndef NO_TLS
     
    7288#endif
    7389
     90#ifdef WOLFSSL_TLS13
     91    #if !defined(NO_DH) && \
     92        !defined(HAVE_FFDHE_2048) && !defined(HAVE_FFDHE_3072) && \
     93        !defined(HAVE_FFDHE_4096) && !defined(HAVE_FFDHE_6144) && \
     94        !defined(HAVE_FFDHE_8192)
     95        #error Please configure your TLS 1.3 DH key size using either: HAVE_FFDHE_2048, HAVE_FFDHE_3072, HAVE_FFDHE_4096, HAVE_FFDHE_6144 or HAVE_FFDHE_8192
     96    #endif
     97    #if !defined(NO_RSA) && !defined(WC_RSA_PSS)
     98        #error The build option WC_RSA_PSS is required for TLS 1.3 with RSA
     99    #endif
     100#endif
     101
     102/* Optional Pre-Master-Secret logging for Wireshark */
     103#if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE)
     104#ifndef WOLFSSL_SSLKEYLOGFILE_OUTPUT
     105    #define WOLFSSL_SSLKEYLOGFILE_OUTPUT "sslkeylog.log"
     106#endif
     107#endif
     108
     109#ifndef WOLFSSL_NO_TLS12
    74110
    75111#ifdef WOLFSSL_SHA384
     
    78114    #define P_HASH_MAX_SIZE WC_SHA256_DIGEST_SIZE
    79115#endif
    80 
    81116
    82117/* compute p_hash for MD5, SHA-1, SHA-256, or SHA-384 for TLSv1 PRF */
     
    207242#undef P_HASH_MAX_SIZE
    208243
     244#endif /* !WOLFSSL_NO_TLS12 */
     245
    209246
    210247#ifndef NO_OLD_TLS
    211248
    212249/* calculate XOR for TLSv1 PRF */
    213 static INLINE void get_xor(byte *digest, word32 digLen, byte* md5, byte* sha)
     250static WC_INLINE void get_xor(byte *digest, word32 digLen, byte* md5, byte* sha)
    214251{
    215252    word32 i;
     
    231268    byte* md5_half;
    232269    byte* sha_half;
    233     byte* labelSeed;
    234270    byte* md5_result;
    235271    byte* sha_result;
     
    237273    byte  md5_half[MAX_PRF_HALF];     /* half is real size */
    238274    byte  sha_half[MAX_PRF_HALF];     /* half is real size */
    239     byte  labelSeed[MAX_PRF_LABSEED]; /* labLen + seedLen is real size */
    240275    byte  md5_result[MAX_PRF_DIG];    /* digLen is real size */
    241276    byte  sha_result[MAX_PRF_DIG];    /* digLen is real size */
    242277#endif
    243 
    244     if (half > MAX_PRF_HALF)
     278#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     279    DECLARE_VAR(labelSeed, byte, MAX_PRF_LABSEED, heap);
     280    if (labelSeed == NULL)
     281        return MEMORY_E;
     282#else
     283    byte labelSeed[MAX_PRF_LABSEED];
     284#endif
     285
     286    if (half > MAX_PRF_HALF ||
     287        labLen + seedLen > MAX_PRF_LABSEED ||
     288        digLen > MAX_PRF_DIG)
     289    {
     290    #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     291        FREE_VAR(labelSeed, heap);
     292    #endif
    245293        return BUFFER_E;
    246     if (labLen + seedLen > MAX_PRF_LABSEED)
    247         return BUFFER_E;
    248     if (digLen > MAX_PRF_DIG)
    249         return BUFFER_E;
     294    }
    250295
    251296#ifdef WOLFSSL_SMALL_STACK
    252297    md5_half   = (byte*)XMALLOC(MAX_PRF_HALF,    heap, DYNAMIC_TYPE_DIGEST);
    253298    sha_half   = (byte*)XMALLOC(MAX_PRF_HALF,    heap, DYNAMIC_TYPE_DIGEST);
    254     labelSeed  = (byte*)XMALLOC(MAX_PRF_LABSEED, heap, DYNAMIC_TYPE_SEED);
    255299    md5_result = (byte*)XMALLOC(MAX_PRF_DIG,     heap, DYNAMIC_TYPE_DIGEST);
    256300    sha_result = (byte*)XMALLOC(MAX_PRF_DIG,     heap, DYNAMIC_TYPE_DIGEST);
    257301
    258     if (md5_half == NULL || sha_half == NULL || labelSeed == NULL ||
    259                                      md5_result == NULL || sha_result == NULL) {
     302    if (md5_half == NULL || sha_half == NULL || md5_result == NULL ||
     303                                                           sha_result == NULL) {
    260304        if (md5_half)   XFREE(md5_half,   heap, DYNAMIC_TYPE_DIGEST);
    261305        if (sha_half)   XFREE(sha_half,   heap, DYNAMIC_TYPE_DIGEST);
    262         if (labelSeed)  XFREE(labelSeed,  heap, DYNAMIC_TYPE_SEED);
    263306        if (md5_result) XFREE(md5_result, heap, DYNAMIC_TYPE_DIGEST);
    264307        if (sha_result) XFREE(sha_result, heap, DYNAMIC_TYPE_DIGEST);
     308    #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     309        FREE_VAR(labelSeed, heap);
     310    #endif
    265311
    266312        return MEMORY_E;
     
    288334    XFREE(md5_half,   heap, DYNAMIC_TYPE_DIGEST);
    289335    XFREE(sha_half,   heap, DYNAMIC_TYPE_DIGEST);
    290     XFREE(labelSeed,  heap, DYNAMIC_TYPE_SEED);
    291336    XFREE(md5_result, heap, DYNAMIC_TYPE_DIGEST);
    292337    XFREE(sha_result, heap, DYNAMIC_TYPE_DIGEST);
    293338#endif
    294339
     340#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     341    FREE_VAR(labelSeed, heap);
     342#endif
     343
    295344    return ret;
    296345}
     
    298347#endif
    299348
     349
     350#ifndef WOLFSSL_NO_TLS12
    300351
    301352/* Wrapper to call straight thru to p_hash in TSL 1.2 cases to remove stack
     
    308359
    309360    if (useAtLeastSha256) {
    310 #ifdef WOLFSSL_SMALL_STACK
    311         byte* labelSeed;
     361    #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     362        DECLARE_VAR(labelSeed, byte, MAX_PRF_LABSEED, heap);
     363        if (labelSeed == NULL)
     364            return MEMORY_E;
    312365#else
    313         byte labelSeed[MAX_PRF_LABSEED]; /* labLen + seedLen is real size */
     366        byte labelSeed[MAX_PRF_LABSEED];
    314367#endif
    315368
    316369        if (labLen + seedLen > MAX_PRF_LABSEED)
    317370            return BUFFER_E;
    318 
    319 #ifdef WOLFSSL_SMALL_STACK
    320         labelSeed = (byte*)XMALLOC(MAX_PRF_LABSEED, heap, DYNAMIC_TYPE_SEED);
    321         if (labelSeed == NULL)
    322            return MEMORY_E;
    323 #endif
    324371
    325372        XMEMCPY(labelSeed, label, labLen);
     
    333380                     labLen + seedLen, hash_type, heap, devId);
    334381
    335 #ifdef WOLFSSL_SMALL_STACK
    336         XFREE(labelSeed, heap, DYNAMIC_TYPE_SEED);
     382    #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     383        FREE_VAR(labelSeed, heap);
    337384#endif
    338385    }
     
    356403int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
    357404{
     405    int ret = 0;
    358406    word32 hashSz = FINISHED_SZ;
    359407
     
    361409        return BAD_FUNC_ARG;
    362410
     411    /* for constant timing perform these even if error */
    363412#ifndef NO_OLD_TLS
    364     wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
    365     wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
     413    ret |= wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
     414    ret |= wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
    366415#endif
    367416
     
    370419        if (ssl->specs.mac_algorithm <= sha256_mac ||
    371420            ssl->specs.mac_algorithm == blake2b_mac) {
    372             int ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
    373 
    374             if (ret != 0)
    375                 return ret;
    376 
     421            ret |= wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
    377422            hashSz = WC_SHA256_DIGEST_SIZE;
    378423        }
     
    380425#ifdef WOLFSSL_SHA384
    381426        if (ssl->specs.mac_algorithm == sha384_mac) {
    382             int ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
    383 
    384             if (ret != 0)
    385                 return ret;
    386 
     427            ret |= wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
    387428            hashSz = WC_SHA384_DIGEST_SIZE;
    388429        }
     
    392433    *hashLen = hashSz;
    393434
    394     return 0;
     435    if (ret != 0)
     436        ret = BUILD_MSG_ERROR;
     437
     438    return ret;
    395439}
    396440
     
    400444    int         ret;
    401445    const byte* side;
    402     byte*       handshake_hash;
    403446    word32      hashSz = HSHASH_SZ;
    404 
    405     /* using allocate here to allow async hardware to use buffer directly */
    406     handshake_hash = (byte*)XMALLOC(hashSz, ssl->heap, DYNAMIC_TYPE_DIGEST);
     447#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     448    DECLARE_VAR(handshake_hash, byte, HSHASH_SZ, ssl->heap);
    407449    if (handshake_hash == NULL)
    408450        return MEMORY_E;
     451#else
     452    byte handshake_hash[HSHASH_SZ];
     453#endif
    409454
    410455    ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
     
    421466    }
    422467
    423     XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
     468#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     469    FREE_VAR(handshake_hash, ssl->heap);
     470#endif
    424471
    425472    return ret;
    426473}
    427474
     475#endif /* !WOLFSSL_NO_TLS12 */
    428476
    429477#ifndef NO_OLD_TLS
    430478
     479#ifdef WOLFSSL_ALLOW_TLSV10
    431480ProtocolVersion MakeTLSv1(void)
    432481{
     
    437486    return pv;
    438487}
     488#endif /* WOLFSSL_ALLOW_TLSV10 */
    439489
    440490
     
    448498}
    449499
    450 #endif
    451 
     500#endif /* !NO_OLD_TLS */
     501
     502
     503#ifndef WOLFSSL_NO_TLS12
    452504
    453505ProtocolVersion MakeTLSv1_2(void)
     
    459511    return pv;
    460512}
     513
     514#endif /* !WOLFSSL_NO_TLS12 */
    461515
    462516#ifdef WOLFSSL_TLS13
     
    475529#endif
    476530
     531#ifndef WOLFSSL_NO_TLS12
    477532
    478533#ifdef HAVE_EXTENDED_MASTER
     
    489544                         void* heap, int devId)
    490545{
     546    int ret;
     547#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     548    DECLARE_VAR(seed, byte, SEED_LEN, heap);
     549    if (seed == NULL)
     550        return MEMORY_E;
     551#else
    491552    byte  seed[SEED_LEN];
     553#endif
    492554
    493555    XMEMCPY(seed,           sr, RAN_LEN);
    494556    XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
    495557
    496     return PRF(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
     558    ret = PRF(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
    497559               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
     560
     561#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     562    FREE_VAR(seed, heap);
     563#endif
     564
     565    return ret;
    498566}
    499567
     
    549617                               void* heap, int devId)
    550618{
     619    int ret;
     620#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     621    DECLARE_VAR(seed, byte, SEED_LEN, heap);
     622    if (seed == NULL)
     623        return MEMORY_E;
     624#else
    551625    byte  seed[SEED_LEN];
     626#endif
    552627
    553628    XMEMCPY(seed,           cr, RAN_LEN);
    554629    XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
    555630
    556     return PRF(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
     631    ret = PRF(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
    557632               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
     633
     634#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
     635    FREE_VAR(seed, heap);
     636#endif
     637
     638    return ret;
    558639}
    559640
     
    597678{
    598679    int    ret;
     680
    599681#ifdef HAVE_EXTENDED_MASTER
    600682    if (ssl->options.haveEMS) {
    601         byte*  handshake_hash;
    602683        word32 hashSz = HSHASH_SZ;
    603 
    604         handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
     684    #ifdef WOLFSSL_SMALL_STACK
     685        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
    605686                                        DYNAMIC_TYPE_DIGEST);
    606687        if (handshake_hash == NULL)
    607688            return MEMORY_E;
     689    #else
     690        byte handshake_hash[HSHASH_SZ];
     691    #endif
    608692
    609693        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
    610         if (ret < 0) {
    611             XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
    612             return ret;
    613         }
    614 
     694        if (ret == 0) {
    615695        ret = _MakeTlsExtendedMasterSecret(
    616696                ssl->arrays->masterSecret, SECRET_LEN,
     
    619699                IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
    620700                ssl->heap, ssl->devId);
    621 
     701        }
     702
     703    #ifdef WOLFSSL_SMALL_STACK
    622704        XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
    623     } else
    624 #endif
     705#endif
     706    }
     707    else
     708#endif /* HAVE_EXTENDED_MASTER */
     709    {
    625710    ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret, SECRET_LEN,
    626711              ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
     
    628713              IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
    629714              ssl->heap, ssl->devId);
    630 
     715    }
    631716    if (ret == 0) {
    632717    #ifdef SHOW_SECRETS
    633         int i;
    634 
    635         printf("master secret: ");
    636         for (i = 0; i < SECRET_LEN; i++)
    637             printf("%02x", ssl->arrays->masterSecret[i]);
    638         printf("\n");
    639     #endif
     718        /* Wireshark Pre-Master-Secret Format:
     719         *  CLIENT_RANDOM <clientrandom> <mastersecret>
     720         */
     721        const char* CLIENT_RANDOM_LABEL = "CLIENT_RANDOM";
     722        int i, pmsPos = 0;
     723        char pmsBuf[13 + 1 + 64 + 1 + 96 + 1 + 1];
     724
     725        XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%s ",
     726            CLIENT_RANDOM_LABEL);
     727        pmsPos += XSTRLEN(CLIENT_RANDOM_LABEL) + 1;
     728        for (i = 0; i < RAN_LEN; i++) {
     729            XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x",
     730                ssl->arrays->clientRandom[i]);
     731            pmsPos += 2;
     732        }
     733        XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, " ");
     734        pmsPos += 1;
     735        for (i = 0; i < SECRET_LEN; i++) {
     736            XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x",
     737                ssl->arrays->masterSecret[i]);
     738            pmsPos += 2;
     739        }
     740        XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "\n");
     741        pmsPos += 1;
     742
     743        /* print master secret */
     744        puts(pmsBuf);
     745
     746        #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE)
     747        {
     748            FILE* f = XFOPEN(WOLFSSL_SSLKEYLOGFILE_OUTPUT, "a");
     749            if (f != XBADFILE) {
     750                XFWRITE(pmsBuf, 1, pmsPos, f);
     751                XFCLOSE(f);
     752            }
     753        }
     754    #endif
     755    #endif /* SHOW_SECRETS */
    640756
    641757        ret = DeriveTlsKeys(ssl);
     
    684800
    685801
    686 static INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
     802static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
    687803{
    688804    if (verify) {
     
    706822
    707823#ifdef WOLFSSL_DTLS
    708 static INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
     824static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
    709825{
    710826    if (order == PREV_ORDER) {
     
    728844
    729845
    730 static INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
     846static WC_INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
    731847{
    732848    word32 seq[2] = {0, 0};
     
    813929
    814930
    815 /* TLS type HMAC */
    816 int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
    817               int content, int verify)
    818 {
    819     Hmac hmac;
    820     int  ret = 0;
    821     byte myInner[WOLFSSL_TLS_HMAC_INNER_SZ];
     931#ifndef WOLFSSL_AEAD_ONLY
     932#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
     933    !defined(HAVE_SELFTEST)
     934
     935/* Update the hash in the HMAC.
     936 *
     937 * hmac  HMAC object.
     938 * data  Data to be hashed.
     939 * sz    Size of data to hash.
     940 * returns 0 on success, otherwise failure.
     941 */
     942static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz)
     943{
     944    int ret = BAD_FUNC_ARG;
     945
     946    switch (hmac->macType) {
     947    #ifndef NO_SHA
     948        case WC_SHA:
     949            ret = wc_ShaUpdate(&hmac->hash.sha, data, sz);
     950            break;
     951    #endif /* !NO_SHA */
     952
     953    #ifndef NO_SHA256
     954        case WC_SHA256:
     955            ret = wc_Sha256Update(&hmac->hash.sha256, data, sz);
     956            break;
     957    #endif /* !NO_SHA256 */
     958
     959    #ifdef WOLFSSL_SHA384
     960        case WC_SHA384:
     961            ret = wc_Sha384Update(&hmac->hash.sha384, data, sz);
     962            break;
     963    #endif /* WOLFSSL_SHA384 */
     964
     965    #ifdef WOLFSSL_SHA512
     966        case WC_SHA512:
     967            ret = wc_Sha512Update(&hmac->hash.sha512, data, sz);
     968            break;
     969    #endif /* WOLFSSL_SHA512 */
     970    }
     971
     972    return ret;
     973}
     974
     975/* Finalize the hash but don't put the EOC, padding or length in.
     976 *
     977 * hmac  HMAC object.
     978 * hash  Hash result.
     979 * returns 0 on success, otherwise failure.
     980 */
     981static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash)
     982{
     983    int ret = BAD_FUNC_ARG;
     984
     985    switch (hmac->macType) {
     986    #ifndef NO_SHA
     987        case WC_SHA:
     988            ret = wc_ShaFinalRaw(&hmac->hash.sha, hash);
     989            break;
     990    #endif /* !NO_SHA */
     991
     992    #ifndef NO_SHA256
     993        case WC_SHA256:
     994            ret = wc_Sha256FinalRaw(&hmac->hash.sha256, hash);
     995            break;
     996    #endif /* !NO_SHA256 */
     997
     998    #ifdef WOLFSSL_SHA384
     999        case WC_SHA384:
     1000            ret = wc_Sha384FinalRaw(&hmac->hash.sha384, hash);
     1001            break;
     1002    #endif /* WOLFSSL_SHA384 */
     1003
     1004    #ifdef WOLFSSL_SHA512
     1005        case WC_SHA512:
     1006            ret = wc_Sha512FinalRaw(&hmac->hash.sha512, hash);
     1007            break;
     1008    #endif /* WOLFSSL_SHA512 */
     1009    }
     1010
     1011    return ret;
     1012}
     1013
     1014/* Finalize the HMAC by performing outer hash.
     1015 *
     1016 * hmac  HMAC object.
     1017 * mac   MAC result.
     1018 * returns 0 on success, otherwise failure.
     1019 */
     1020static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac)
     1021{
     1022    int ret = BAD_FUNC_ARG;
     1023    wc_HashAlg hash;
     1024    enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
     1025    int digestSz = wc_HashGetDigestSize(hashType);
     1026    int blockSz = wc_HashGetBlockSize(hashType);
     1027
     1028    ret = wc_HashInit(&hash, hashType);
     1029    if (ret == 0) {
     1030        ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->opad,
     1031            blockSz);
     1032        if (ret == 0)
     1033            ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->innerHash,
     1034                digestSz);
     1035        if (ret == 0)
     1036            ret = wc_HashFinal(&hash, hashType, mac);
     1037        wc_HashFree(&hash, hashType);
     1038    }
     1039
     1040    return ret;
     1041}
     1042
     1043/* Calculate the HMAC of the header + message data.
     1044 * Constant time implementation using wc_Sha*FinalRaw().
     1045 *
     1046 * hmac    HMAC object.
     1047 * digest  MAC result.
     1048 * in      Message data.
     1049 * sz      Size of the message data.
     1050 * header  Constructed record header with length of handshake data.
     1051 * returns 0 on success, otherwise failure.
     1052 */
     1053static int Hmac_UpdateFinal_CT(Hmac* hmac, byte* digest, const byte* in,
     1054                               word32 sz, byte* header)
     1055{
     1056    byte lenBytes[8];
     1057    int  i, j, k;
     1058    int  blockBits, blockMask;
     1059    int  realLen, lastBlockLen, macLen, extraLen, eocIndex;
     1060    int  blocks, safeBlocks, lenBlock, eocBlock;
     1061    int  maxLen;
     1062    int  blockSz, padSz;
     1063    int  ret;
     1064    byte extraBlock;
     1065
     1066    switch (hmac->macType) {
     1067    #ifndef NO_SHA
     1068        case WC_SHA:
     1069            blockSz = WC_SHA_BLOCK_SIZE;
     1070            blockBits = 6;
     1071            macLen = WC_SHA_DIGEST_SIZE;
     1072            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
     1073            break;
     1074    #endif /* !NO_SHA */
     1075
     1076    #ifndef NO_SHA256
     1077        case WC_SHA256:
     1078            blockSz = WC_SHA256_BLOCK_SIZE;
     1079            blockBits = 6;
     1080            macLen = WC_SHA256_DIGEST_SIZE;
     1081            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
     1082            break;
     1083    #endif /* !NO_SHA256 */
     1084
     1085    #ifdef WOLFSSL_SHA384
     1086        case WC_SHA384:
     1087            blockSz = WC_SHA384_BLOCK_SIZE;
     1088            blockBits = 7;
     1089            macLen = WC_SHA384_DIGEST_SIZE;
     1090            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
     1091            break;
     1092    #endif /* WOLFSSL_SHA384 */
     1093
     1094    #ifdef WOLFSSL_SHA512
     1095        case WC_SHA512:
     1096            blockSz = WC_SHA512_BLOCK_SIZE;
     1097            blockBits = 7;
     1098            macLen = WC_SHA512_DIGEST_SIZE;
     1099            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
     1100            break;
     1101    #endif /* WOLFSSL_SHA512 */
     1102
     1103        default:
     1104            return BAD_FUNC_ARG;
     1105}
     1106    blockMask = blockSz - 1;
     1107
     1108    /* Size of data to HMAC if padding length byte is zero. */
     1109    maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - macLen;
     1110    /* Complete data (including padding) has block for EOC and/or length. */
     1111    extraBlock = ctSetLTE((maxLen + padSz) & blockMask, padSz);
     1112    /* Total number of blocks for data including padding. */
     1113    blocks = ((maxLen + blockSz - 1) >> blockBits) + extraBlock;
     1114    /* Up to last 6 blocks can be hashed safely. */
     1115    safeBlocks = blocks - 6;
     1116
     1117    /* Length of message data. */
     1118    realLen = maxLen - in[sz - 1];
     1119    /* Number of message bytes in last block. */
     1120    lastBlockLen = realLen & blockMask;
     1121    /* Number of padding bytes in last block. */
     1122    extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
     1123    /* Number of blocks to create for hash. */
     1124    lenBlock = (realLen + extraLen) >> blockBits;
     1125    /* Block containing EOC byte. */
     1126    eocBlock = realLen >> blockBits;
     1127    /* Index of EOC byte in block. */
     1128    eocIndex = realLen & blockMask;
     1129
     1130    /* Add length of hmac's ipad to total length. */
     1131    realLen += blockSz;
     1132    /* Length as bits - 8 bytes bigendian. */
     1133    c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
     1134    c32toa(realLen << 3, lenBytes + sizeof(word32));
     1135
     1136    ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, blockSz);
     1137    if (ret != 0)
     1138        return ret;
     1139
     1140    XMEMSET(hmac->innerHash, 0, macLen);
     1141
     1142    if (safeBlocks > 0) {
     1143        ret = Hmac_HashUpdate(hmac, header, WOLFSSL_TLS_HMAC_INNER_SZ);
     1144        if (ret != 0)
     1145            return ret;
     1146        ret = Hmac_HashUpdate(hmac, in, safeBlocks * blockSz -
     1147                                                     WOLFSSL_TLS_HMAC_INNER_SZ);
     1148        if (ret != 0)
     1149            return ret;
     1150    }
     1151    else
     1152        safeBlocks = 0;
     1153
     1154    XMEMSET(digest, 0, macLen);
     1155    k = safeBlocks * blockSz;
     1156    for (i = safeBlocks; i < blocks; i++) {
     1157        unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
     1158        unsigned char isEocBlock = ctMaskEq(i, eocBlock);
     1159        unsigned char isOutBlock = ctMaskEq(i, lenBlock);
     1160
     1161        for (j = 0; j < blockSz; j++, k++) {
     1162            unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
     1163            unsigned char pastEoc = ctMaskGT(j, eocIndex) & isEocBlock;
     1164            unsigned char b = 0;
     1165
     1166            if (k < WOLFSSL_TLS_HMAC_INNER_SZ)
     1167                b = header[k];
     1168            else if (k < maxLen)
     1169                b = in[k - WOLFSSL_TLS_HMAC_INNER_SZ];
     1170
     1171            b = ctMaskSel(atEoc, 0x80, b);
     1172            b &= (unsigned char)~(word32)pastEoc;
     1173            b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
     1174
     1175            if (j >= blockSz - 8) {
     1176                b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
     1177            }
     1178
     1179            hashBlock[j] = b;
     1180        }
     1181
     1182        ret = Hmac_HashUpdate(hmac, hashBlock, blockSz);
     1183        if (ret != 0)
     1184            return ret;
     1185        ret = Hmac_HashFinalRaw(hmac, hashBlock);
     1186        if (ret != 0)
     1187            return ret;
     1188        for (j = 0; j < macLen; j++)
     1189            ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
     1190    }
     1191
     1192    ret = Hmac_OuterHash(hmac, digest);
     1193
     1194    return ret;
     1195}
     1196
     1197#endif
     1198
     1199#if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
     1200    defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2)
     1201
     1202/* Calculate the HMAC of the header + message data.
     1203 * Constant time implementation using normal hashing operations.
     1204 * Update-Final need to be constant time.
     1205 *
     1206 * hmac    HMAC object.
     1207 * digest  MAC result.
     1208 * in      Message data.
     1209 * sz      Size of the message data.
     1210 * header  Constructed record header with length of handshake data.
     1211 * returns 0 on success, otherwise failure.
     1212 */
     1213static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
     1214                            word32 sz, byte* header)
     1215{
     1216    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
     1217    int        ret;
     1218    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
     1219    word32     currSz, offset;
     1220    int        msgBlocks, blocks, blockBits;
     1221    int        i;
     1222
     1223    switch (hmac->macType) {
     1224    #ifndef NO_SHA
     1225        case WC_SHA:
     1226            blockSz = WC_SHA_BLOCK_SIZE;
     1227            blockBits = 6;
     1228            macSz = WC_SHA_DIGEST_SIZE;
     1229            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
     1230            break;
     1231    #endif /* !NO_SHA */
     1232
     1233    #ifndef NO_SHA256
     1234        case WC_SHA256:
     1235            blockSz = WC_SHA256_BLOCK_SIZE;
     1236            blockBits = 6;
     1237            macSz = WC_SHA256_DIGEST_SIZE;
     1238            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
     1239            break;
     1240    #endif /* !NO_SHA256 */
     1241
     1242    #ifdef WOLFSSL_SHA384
     1243        case WC_SHA384:
     1244            blockSz = WC_SHA384_BLOCK_SIZE;
     1245            blockBits = 7;
     1246            macSz = WC_SHA384_DIGEST_SIZE;
     1247            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
     1248            break;
     1249    #endif /* WOLFSSL_SHA384 */
     1250
     1251    #ifdef WOLFSSL_SHA512
     1252        case WC_SHA512:
     1253            blockSz = WC_SHA512_BLOCK_SIZE;
     1254            blockBits = 7;
     1255            macSz = WC_SHA512_DIGEST_SIZE;
     1256            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
     1257            break;
     1258    #endif /* WOLFSSL_SHA512 */
     1259
     1260    #ifdef HAVE_BLAKE2
     1261        case WC_HASH_TYPE_BLAKE2B:
     1262            blockSz = BLAKE2B_BLOCKBYTES;
     1263            blockBits = 7;
     1264            macSz = BLAKE2B_256;
     1265            padSz = 0;
     1266            break;
     1267    #endif /* HAVE_BLAK2 */
     1268
     1269        default:
     1270            return BAD_FUNC_ARG;
     1271    }
     1272
     1273    msgSz = sz - (1 + in[sz - 1] + macSz);
     1274    /* Make negative result 0 */
     1275    msgSz &= ~(0 - (msgSz >> 31));
     1276    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
     1277    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
     1278
     1279    /* Calculate #blocks processed in HMAC for max and real data. */
     1280    blocks      = maxSz >> blockBits;
     1281    blocks     += ((maxSz + padSz) % blockSz) < padSz;
     1282    msgBlocks   = realSz >> blockBits;
     1283    /* #Extra blocks to process. */
     1284    blocks -= msgBlocks + (((realSz + padSz) % blockSz) < padSz);
     1285    /* Calculate whole blocks. */
     1286    msgBlocks--;
     1287
     1288    ret = wc_HmacUpdate(hmac, header, WOLFSSL_TLS_HMAC_INNER_SZ);
     1289    if (ret == 0) {
     1290        /* Fill the rest of the block with any available data. */
     1291        currSz = ctMaskLT(msgSz, blockSz) & msgSz;
     1292        currSz |= ctMaskGTE(msgSz, blockSz) & blockSz;
     1293        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
     1294        currSz &= ~(0 - (currSz >> 31));
     1295        ret = wc_HmacUpdate(hmac, in, currSz);
     1296        offset = currSz;
     1297    }
     1298    if (ret == 0) {
     1299        /* Do the hash operations on a block basis. */
     1300        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
     1301            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
     1302            if (ret != 0)
     1303                break;
     1304        }
     1305    }
     1306    if (ret == 0)
     1307        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
     1308    if (ret == 0)
     1309        ret = wc_HmacFinal(hmac, digest);
     1310    if (ret == 0) {
     1311        /* Do the dummy hash operations. Do at least one. */
     1312        for (i = 0; i < blocks + 1; i++) {
     1313            ret = wc_HmacUpdate(hmac, dummy, blockSz);
     1314            if (ret != 0)
     1315                break;
     1316        }
     1317    }
     1318
     1319    return ret;
     1320}
     1321
     1322#endif
     1323
     1324int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
     1325             int content, int verify)
     1326{
     1327    Hmac   hmac;
     1328    byte   myInner[WOLFSSL_TLS_HMAC_INNER_SZ];
     1329    int    ret = 0;
    8221330
    8231331    if (ssl == NULL)
     
    8251333
    8261334#ifdef HAVE_FUZZER
    827     if (ssl->fuzzerCb)
    828         ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
     1335    /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
     1336    if (ssl->fuzzerCb) {
     1337        if (verify && padSz >= 0) {
     1338            ssl->fuzzerCb(ssl, in, sz + ssl->specs.hash_size + padSz + 1,
     1339                FUZZ_HMAC, ssl->fuzzerCtx);
     1340        }
     1341        else {
     1342            ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
     1343        }
     1344}
    8291345#endif
    8301346
     
    8361352
    8371353    ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
    838                      wolfSSL_GetMacSecret(ssl, verify), ssl->specs.hash_size);
     1354                                              wolfSSL_GetMacSecret(ssl, verify),
     1355                                              ssl->specs.hash_size);
    8391356    if (ret == 0) {
    840         ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner));
    841         if (ret == 0)
    842             ret = wc_HmacUpdate(&hmac, in, sz);                    /* content */
    843         if (ret == 0)
    844             ret = wc_HmacFinal(&hmac, digest);
    845     }
     1357        /* Constant time verification required. */
     1358        if (verify && padSz >= 0) {
     1359#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
     1360    !defined(HAVE_SELFTEST)
     1361    #ifdef HAVE_BLAKE2
     1362            if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
     1363                ret = Hmac_UpdateFinal(&hmac, digest, in, sz +
     1364                                               ssl->specs.hash_size + padSz + 1,
     1365                                               myInner);
     1366            }
     1367            else
     1368#endif
     1369            {
     1370                ret = Hmac_UpdateFinal_CT(&hmac, digest, in, sz +
     1371                                               ssl->specs.hash_size + padSz + 1,
     1372                                               myInner);
     1373            }
     1374#else
     1375            ret = Hmac_UpdateFinal(&hmac, digest, in, sz +
     1376                                               ssl->specs.hash_size + padSz + 1,
     1377                                               myInner);
     1378#endif
     1379        }
     1380        else {
     1381            ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner));
     1382            if (ret == 0)
     1383                ret = wc_HmacUpdate(&hmac, in, sz);                /* content */
     1384            if (ret == 0)
     1385                ret = wc_HmacFinal(&hmac, digest);
     1386        }
     1387    }
     1388
    8461389    wc_HmacFree(&hmac);
    8471390
    8481391    return ret;
    8491392}
     1393#endif /* WOLFSSL_AEAD_ONLY */
     1394
     1395#endif /* !WOLFSSL_NO_TLS12 */
    8501396
    8511397#ifdef HAVE_TLS_EXTENSIONS
     
    8781424 *   'remapped' extension type.
    8791425 */
    880 static INLINE word16 TLSX_ToSemaphore(word16 type)
     1426static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
    8811427{
    8821428    switch (type) {
     
    9181464    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
    9191465
     1466    (void)heap;
     1467
    9201468    if (extension) {
    9211469        extension->type = type;
     
    9531501            TLSX_FreeAll(next, heap);
    9541502
    955             /* there is no way to occur more than */
    956             /* two extensions of the same type.   */
     1503            /* there is no way to occur more than
     1504             * two extensions of the same type.
     1505             */
    9571506            break;
    9581507        }
     
    9621511}
    9631512
    964 #ifndef NO_WOLFSSL_SERVER
     1513#ifndef NO_WOLFSSL_CLIENT
     1514
     1515int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
     1516
     1517int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
     1518{
     1519    TLSX *extension = TLSX_Find(ssl->extensions, type);
     1520
     1521    if (!extension)
     1522        extension = TLSX_Find(ssl->ctx->extensions, type);
     1523
     1524    return extension == NULL;
     1525}
     1526
     1527int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
     1528
     1529int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
     1530{
     1531    SendAlert(ssl, alert_fatal, unsupported_extension);
     1532    return UNSUPPORTED_EXTENSION;
     1533}
     1534
     1535#else
     1536
     1537#define TLSX_CheckUnsupportedExtension(ssl, type) 0
     1538#define TLSX_HandleUnsupportedExtension(ssl) 0
     1539
     1540#endif
    9651541
    9661542/** Mark an extension to be sent back to the client. */
     
    9691545void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
    9701546{
    971     TLSX *ext = TLSX_Find(ssl->extensions, type);
    972 
    973     if (ext)
    974         ext->resp = 1;
    975 }
    976 
    977 #endif
     1547    TLSX *extension = TLSX_Find(ssl->extensions, type);
     1548
     1549    if (extension)
     1550        extension->resp = 1;
     1551}
    9781552
    9791553/******************************************************************************/
     
    11531727                                               TLSX_APPLICATION_LAYER_PROTOCOL);
    11541728
    1155 #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
     1729#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
    11561730    if (ssl->alpnSelect != NULL) {
    11571731        const byte* out;
     
    11731747
    11741748    if (extension == NULL || extension->data == NULL) {
    1175         WOLFSSL_MSG("No ALPN extensions not used or bad");
    1176         return isRequest ? 0             /* not using ALPN */
    1177                          : BUFFER_ERROR; /* unexpected ALPN response */
     1749        return isRequest ? 0
     1750                         : TLSX_HandleUnsupportedExtension(ssl);
    11781751    }
    11791752
     
    13821955                if (sni->data.host_name) {
    13831956                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
    1384                     sni->data.host_name[size] = 0;
     1957                    sni->data.host_name[size] = '\0';
    13851958                } else {
    13861959                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
     
    14762049}
    14772050
    1478 #ifndef NO_WOLFSSL_SERVER
    1479 
    14802051/** Finds a SNI object in the provided list. */
    14812052static SNI* TLSX_SNI_Find(SNI *list, byte type)
     
    14892060}
    14902061
    1491 
    14922062/** Sets the status of a SNI object. */
    14932063static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
     
    15112081    return 0;
    15122082}
    1513 
    1514 #endif /* NO_WOLFSSL_SERVER */
    15152083
    15162084/** Parses a buffer of SNI extensions. */
     
    15292097        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
    15302098
    1531     (void)isRequest;
    1532     (void)input;
    1533 
     2099    if (!isRequest) {
     2100        #ifndef NO_WOLFSSL_CLIENT
     2101            if (!extension || !extension->data)
     2102                return TLSX_HandleUnsupportedExtension(ssl);
     2103
     2104            if (length > 0)
     2105                return BUFFER_ERROR; /* SNI response MUST be empty. */
     2106
     2107            /* This call enables wolfSSL_SNI_GetRequest() to be called in the
     2108             * client side to fetch the used SNI. It will only work if the SNI
     2109             * was set at the SSL object level. Right now we only support one
     2110             * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
     2111             * inclusion of other name types will turn this method inaccurate,
     2112             * as the extension response doesn't contains information of which
     2113             * name was accepted.
     2114             */
     2115            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
     2116                                                        WOLFSSL_SNI_REAL_MATCH);
     2117
     2118            return 0;
     2119        #endif
     2120    }
     2121
     2122#ifndef NO_WOLFSSL_SERVER
    15342123    if (!extension || !extension->data) {
    15352124#if defined(WOLFSSL_ALWAYS_KEEP_SNI) && !defined(NO_WOLFSSL_SERVER)
    15362125        /* This will keep SNI even though TLSX_UseSNI has not been called.
    15372126         * Enable it so that the received sni is available to functions
    1538          * that use a custom callback when SNI is received */
     2127            * that use a custom callback when SNI is received.
     2128            */
     2129
    15392130        cacheOnly = 1;
    15402131        WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
    15412132#else
    1542         return isRequest ? 0             /* not using SNI.           */
    1543                          : BUFFER_ERROR; /* unexpected SNI response. */
    1544 #endif
    1545     }
    1546 
    1547     if (!isRequest)
    1548         return length ? BUFFER_ERROR /* SNI response MUST be empty. */
    1549                       : 0;           /* nothing else to do.         */
    1550 
    1551 #ifndef NO_WOLFSSL_SERVER
     2133            /* Skipping, SNI not enabled at server side. */
     2134            return 0;
     2135#endif
     2136    }
    15522137
    15532138    if (OPAQUE16_LEN > length)
     
    15802165            case WOLFSSL_SNI_HOST_NAME: {
    15812166                int matchStat;
     2167                byte matched;
     2168
    15822169#ifdef WOLFSSL_TLS13
    15832170                /* Don't process the second ClientHello SNI extension if there
     
    15872174                    break;
    15882175#endif
    1589                 byte matched = cacheOnly ||
    1590                             ((XSTRLEN(sni->data.host_name) == size)
    1591                             && (XSTRNCMP(sni->data.host_name,
     2176                matched = cacheOnly ||
     2177                    ((XSTRLEN(sni->data.host_name) == size) &&
     2178                    (XSTRNCMP(sni->data.host_name,
    15922179                                       (const char*)input + offset, size) == 0));
    15932180
     
    16102197                    }
    16112198
    1612                     TLSX_SNI_SetStatus(ssl->extensions, type, matchStat);
     2199                    TLSX_SNI_SetStatus(ssl->extensions, type, (byte)matchStat);
    16132200
    16142201                    if(!cacheOnly)
     
    16242211        }
    16252212    }
    1626 
     2213#else
     2214    (void)input;
    16272215#endif
    16282216
     
    16902278    if (!extension) {
    16912279        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
     2280
    16922281        if (ret != 0) {
    16932282            TLSX_SNI_Free(sni, heap);
     
    17082297                TLSX_SNI_Free(next, heap);
    17092298
    1710                 /* there is no way to occur more than */
    1711                 /* two SNIs of the same type.         */
     2299                /* there is no way to occur more than
     2300                 * two SNIs of the same type.
     2301                 */
    17122302                break;
    17132303            }
     
    19342524                                                                 byte isRequest)
    19352525{
    1936     (void)isRequest;
    1937 
    19382526    if (length != ENUM_LEN)
    19392527        return BUFFER_ERROR;
    19402528
     2529#ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
     2530    (void) isRequest;
     2531#else
     2532    if (!isRequest)
     2533        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
     2534            return TLSX_HandleUnsupportedExtension(ssl);
     2535#endif
     2536
    19412537    switch (*input) {
     2538        case WOLFSSL_MFL_2_8 : ssl->max_fragment =  256; break;
    19422539        case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
    19432540        case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
     
    19542551#ifndef NO_WOLFSSL_SERVER
    19552552    if (isRequest) {
    1956         int r = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
    1957 
    1958         if (r != WOLFSSL_SUCCESS) return r; /* throw error */
     2553        int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
     2554
     2555        if (ret != WOLFSSL_SUCCESS)
     2556            return ret; /* throw error */
    19592557
    19602558        TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
     
    19702568    int   ret  = 0;
    19712569
    1972     if (extensions == NULL)
     2570    if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
    19732571        return BAD_FUNC_ARG;
    19742572
    1975     if (mfl < WOLFSSL_MFL_2_9 || WOLFSSL_MFL_2_13 < mfl)
    1976         return BAD_FUNC_ARG;
    1977 
    1978     if ((data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX)) == NULL)
     2573    data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
     2574    if (data == NULL)
    19792575        return MEMORY_E;
    19802576
    19812577    data[0] = mfl;
    19822578
    1983     /* push new MFL extension. */
    1984     if ((ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap))
    1985                                                                          != 0) {
     2579    ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
     2580    if (ret != 0) {
    19862581        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
    19872582        return ret;
     
    20152610                                                                 byte isRequest)
    20162611{
    2017     (void)isRequest;
    2018 
    20192612    if (length != 0 || input == NULL)
    20202613        return BUFFER_ERROR;
    20212614
     2615    if (!isRequest) {
     2616    #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
     2617        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
     2618            return TLSX_HandleUnsupportedExtension(ssl);
     2619    #endif
     2620    }
     2621    else {
    20222622#ifndef NO_WOLFSSL_SERVER
    2023     if (isRequest) {
    2024         int r = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
    2025 
    2026         if (r != WOLFSSL_SUCCESS)
    2027             return r; /* throw error */
     2623            int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
     2624
     2625            if (ret != WOLFSSL_SUCCESS)
     2626                return ret; /* throw error */
    20282627
    20292628        TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
    2030     }
    2031 #endif
     2629#endif
     2630    }
    20322631
    20332632    ssl->truncated_hmac = 1;
     
    20432642        return BAD_FUNC_ARG;
    20442643
    2045     if ((ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap)) != 0)
     2644    ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
     2645    if (ret != 0)
    20462646        return ret;
    20472647
     
    20922692            break;
    20932693        }
     2694    }
     2695#endif
     2696#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
     2697    if (!isRequest && csr->ssl->options.tls1_3) {
     2698        if (csr->response.buffer == NULL) {
     2699            OcspRequest* request = &csr->request.ocsp;
     2700            int ret = CreateOcspResponse(csr->ssl, &request, &csr->response);
     2701            if (ret < 0)
     2702                return ret;
     2703        }
     2704        return OPAQUE8_LEN + OPAQUE24_LEN + csr->response.length;
    20942705    }
    20952706#endif
     
    21342745    }
    21352746#endif
     2747#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
     2748    if (!isRequest && csr->ssl->options.tls1_3) {
     2749        word16 offset = 0;
     2750        output[offset++] = csr->status_type;
     2751        c32to24(csr->response.length, output + offset);
     2752        offset += OPAQUE24_LEN;
     2753        XMEMCPY(output + offset, csr->response.buffer, csr->response.length);
     2754        offset += csr->response.length;
     2755        return offset;
     2756    }
     2757#endif
    21362758
    21372759    return 0;
     
    21572779            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
    21582780
    2159             if (!csr)
    2160                 return BUFFER_ERROR; /* unexpected extension */
     2781            if (!csr) /* unexpected extension */
     2782                return TLSX_HandleUnsupportedExtension(ssl);
    21612783
    21622784            /* enable extension at ssl level */
    21632785            ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
    2164                                      csr->status_type, csr->options, ssl->heap,
    2165                                      ssl->devId);
     2786                                     csr->status_type, csr->options, ssl,
     2787                                     ssl->heap, ssl->devId);
    21662788            if (ret != WOLFSSL_SUCCESS)
    21672789                return ret;
     
    21862808        ssl->status_request = 1;
    21872809
    2188         return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
     2810    #ifdef WOLFSSL_TLS13
     2811        if (ssl->options.tls1_3) {
     2812            word32       resp_length;
     2813            word32       offset = 0;
     2814            ret = 0;
     2815            if (OPAQUE8_LEN + OPAQUE24_LEN > length)
     2816                ret = BUFFER_ERROR;
     2817            if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP)
     2818                ret = BAD_CERTIFICATE_STATUS_ERROR;
     2819            if (ret == 0) {
     2820                c24to32(input + offset, &resp_length);
     2821                offset += OPAQUE24_LEN;
     2822                if (offset + resp_length != length)
     2823                    ret = BUFFER_ERROR;
     2824            }
     2825            if (ret == 0) {
     2826                csr->response.buffer = input + offset;
     2827                csr->response.length = resp_length;
     2828            }
     2829
     2830            return ret;
     2831        }
     2832        else
     2833    #endif
     2834        {
     2835            /* extension_data MUST be empty. */
     2836            return length ? BUFFER_ERROR : 0;
     2837        }
    21892838#endif
    21902839    }
     
    22392888        /* accept the first good status_type and return */
    22402889        ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
    2241                                                       0, ssl->heap, ssl->devId);
     2890                                                 0, ssl, ssl->heap, ssl->devId);
    22422891        if (ret != WOLFSSL_SUCCESS)
    22432892            return ret; /* throw error */
     
    22452894        TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
    22462895        ssl->status_request = status_type;
    2247 
    22482896#endif
    22492897    }
     
    23232971
    23242972int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
    2325                                            byte options, void* heap, int devId)
     2973                                         byte options, WOLFSSL* ssl, void* heap,
     2974                                                                      int devId)
    23262975{
    23272976    CertificateStatusRequest* csr = NULL;
     
    23402989    csr->status_type = status_type;
    23412990    csr->options     = options;
     2991    csr->ssl         = ssl;
    23422992
    23432993    switch (csr->status_type) {
     
    25193169                        (CertificateStatusRequestItemV2*)extension->data : NULL;
    25203170
    2521             if (!csr2)
    2522                 return BUFFER_ERROR; /* unexpected extension */
     3171            if (!csr2) /* unexpected extension */
     3172                return TLSX_HandleUnsupportedExtension(ssl);
    25233173
    25243174            /* enable extension at ssl level */
    25253175            for (; csr2; csr2 = csr2->next) {
    25263176                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
    2527                        csr2->status_type, csr2->options, ssl->heap, ssl->devId);
     3177                                    csr2->status_type, csr2->options, ssl->heap,
     3178                                                                    ssl->devId);
    25283179                if (ret != WOLFSSL_SUCCESS)
    25293180                    return ret;
     
    25663217
    25673218        /* list size */
     3219        if (offset + OPAQUE16_LEN >= length) {
     3220            return BUFFER_E;
     3221        }
     3222
    25683223        ato16(input + offset, &request_length);
    25693224        offset += OPAQUE16_LEN;
     
    28193474#ifdef HAVE_SUPPORTED_CURVES
    28203475
    2821 #ifndef HAVE_ECC
     3476#if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(WOLFSSL_TLS13)
    28223477#error Elliptic Curves Extension requires Elliptic Curve Cryptography. \
    28233478       Use --enable-ecc in the configure script or define HAVE_ECC.
     
    28293484    if (curve == NULL)
    28303485        return BAD_FUNC_ARG;
     3486
     3487    (void)heap;
    28313488
    28323489    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
     
    28463503        return BAD_FUNC_ARG;
    28473504
     3505    (void)heap;
     3506
    28483507    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
    28493508                                                             DYNAMIC_TYPE_TLSX);
     
    28823541                                                                     void* heap)
    28833542{
    2884     if (list == NULL)
    2885         return BAD_FUNC_ARG;
    2886 
    2887     while (1) {
    2888         if (list->name == name)
    2889             return 0; /* curve alreay in use */
    2890 
    2891         if (list->next == NULL)
    2892             return TLSX_SupportedCurve_New(&list->next, name, heap);
     3543    int ret = BAD_FUNC_ARG;
     3544
     3545    while (list) {
     3546        if (list->name == name) {
     3547            ret = 0; /* curve alreay in use */
     3548            break;
     3549        }
     3550
     3551        if (list->next == NULL) {
     3552            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
     3553            break;
     3554        }
    28933555
    28943556        list = list->next;
    28953557    }
    28963558
    2897     return 0;
     3559    return ret;
    28983560}
    28993561
    29003562static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
    29013563{
    2902     if (list == NULL)
    2903         return BAD_FUNC_ARG;
    2904 
    2905     while (1) {
    2906         if (list->format == format)
    2907             return 0; /* format already in use */
    2908 
    2909         if (list->next == NULL)
    2910             return TLSX_PointFormat_New(&list->next, format, heap);
     3564    int ret = BAD_FUNC_ARG;
     3565
     3566    while (list) {
     3567        if (list->format == format) {
     3568            ret = 0; /* format already in use */
     3569            break;
     3570        }
     3571
     3572        if (list->next == NULL) {
     3573            ret = TLSX_PointFormat_New(&list->next, format, heap);
     3574            break;
     3575        }
    29113576
    29123577        list = list->next;
    29133578    }
    29143579
    2915     return 0;
    2916 }
    2917 
    2918 #ifndef NO_WOLFSSL_CLIENT
     3580    return ret;
     3581}
     3582
     3583#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
    29193584
    29203585static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
     
    29473612
    29483613#endif
     3614
    29493615#ifndef NO_WOLFSSL_SERVER
    29503616
     
    30193685    }
    30203686
    3021     output[0] = offset - ENUM_LEN;
     3687    output[0] = (byte)(offset - ENUM_LEN);
    30223688
    30233689    return offset;
    30243690}
    30253691
    3026 #ifndef NO_WOLFSSL_SERVER
     3692#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
     3693                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
    30273694
    30283695static int TLSX_SupportedCurve_Parse(WOLFSSL* ssl, byte* input, word16 length,
     
    30333700    int ret;
    30343701
    3035     (void) isRequest; /* shut up compiler! */
     3702    if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
     3703#ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
     3704        return 0;
     3705#else
     3706        return BUFFER_ERROR; /* servers doesn't send this extension. */
     3707#endif
     3708    }
    30363709
    30373710    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
     
    30443717        return BUFFER_ERROR;
    30453718
    3046     for (offset = OPAQUE16_LEN; offset < length; offset += OPAQUE16_LEN) {
     3719    offset = OPAQUE16_LEN;
     3720    if (offset == length)
     3721        return 0;
     3722
     3723#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
     3724    if (!isRequest) {
     3725        TLSX* extension;
     3726        SupportedCurve* curve;
     3727
     3728        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
     3729        if (extension != NULL) {
     3730            /* Replace client list with server list of supported groups. */
     3731            curve = (SupportedCurve*)extension->data;
     3732            extension->data = NULL;
     3733            TLSX_SupportedCurve_FreeAll(curve, ssl->heap);
     3734
    30473735        ato16(input + offset, &name);
     3736            offset += OPAQUE16_LEN;
     3737
     3738            ret = TLSX_SupportedCurve_New(&curve, name, ssl->heap);
     3739            if (ret != 0)
     3740                return ret; /* throw error */
     3741            extension->data = (void*)curve;
     3742        }
     3743    }
     3744#endif
     3745
     3746    for (; offset < length; offset += OPAQUE16_LEN) {
     3747        ato16(input + offset, &name);
    30483748
    30493749        ret = TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
    3050 
    30513750        if (ret != WOLFSSL_SUCCESS)
    30523751            return ret; /* throw error */
     
    30553754    return 0;
    30563755}
     3756
     3757#endif
     3758
     3759#if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
     3760                                          !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
     3761
     3762/* Checks the priority of the groups on the server and set the supported groups
     3763 * response if there is a group not advertised by the client that is preferred.
     3764 *
     3765 * ssl  SSL/TLS object.
     3766 * returns 0 on success, otherwise an error.
     3767 */
     3768int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
     3769{
     3770    int ret;
     3771    TLSX* extension;
     3772    TLSX* priority = NULL;
     3773    TLSX* ext = NULL;
     3774    word16 name;
     3775    SupportedCurve* curve;
     3776
     3777    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
     3778    /* May be doing PSK with no key exchange. */
     3779    if (extension == NULL)
     3780        return 0;
     3781
     3782    if ((ret = TLSX_PopulateSupportedGroups(ssl, &priority)) != WOLFSSL_SUCCESS)
     3783        return ret;
     3784
     3785    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
     3786    curve = (SupportedCurve*)ext->data;
     3787    name = curve->name;
     3788
     3789    curve = (SupportedCurve*)extension->data;
     3790    while (curve != NULL) {
     3791        if (curve->name == name)
     3792            break;
     3793        curve = curve->next;
     3794    }
     3795
     3796    if (curve == NULL) {
     3797        /* Couldn't find the preferred group in client list. */
     3798        extension->resp = 1;
     3799
     3800        /* Send server list back and free client list. */
     3801        curve = (SupportedCurve*)extension->data;
     3802        extension->data = ext->data;
     3803        ext->data = curve;
     3804    }
     3805
     3806    TLSX_FreeAll(priority, ssl->heap);
     3807
     3808    return 0;
     3809}
     3810
     3811#endif
     3812
     3813#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
     3814/* Return the preferred group.
     3815 *
     3816 * ssl             SSL/TLS object.
     3817 * checkSupported  Whether to check for the first supported group.
     3818 * returns BAD_FUNC_ARG if no group found, otherwise the group.
     3819 */
     3820int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
     3821{
     3822    TLSX* extension;
     3823    SupportedCurve* curve;
     3824
     3825    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
     3826    if (extension == NULL)
     3827        return BAD_FUNC_ARG;
     3828
     3829    curve = (SupportedCurve*)extension->data;
     3830    while (curve != NULL) {
     3831        if (!checkSupported || TLSX_KeyShare_IsSupported(curve->name))
     3832            return curve->name;
     3833        curve = curve->next;
     3834    }
     3835
     3836    return BAD_FUNC_ARG;
     3837}
     3838
     3839#endif
     3840
     3841#ifndef NO_WOLFSSL_SERVER
    30573842
    30583843static int TLSX_PointFormat_Parse(WOLFSSL* ssl, byte* input, word16 length,
     
    30783863}
    30793864
     3865#if defined(HAVE_ECC) || defined(HAVE_CURVE25519)
    30803866int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) {
    30813867    TLSX*          extension = (first == ECC_BYTE || first == CHACHA_BYTE)
     
    31113897        /* find supported curve */
    31123898        switch (curve->name) {
     3899#ifdef HAVE_ECC
    31133900    #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
    31143901        #ifndef NO_ECC_SECP
     
    31663953                break;
    31673954        #endif /* !NO_ECC_SECP */
     3955    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
     3956#endif
    31683957        #ifdef HAVE_CURVE25519
    31693958            case WOLFSSL_ECC_X25519:
     
    31773966                break;
    31783967        #endif /* HAVE_CURVE25519 */
     3968#ifdef HAVE_ECC
     3969    #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
    31793970        #ifdef HAVE_ECC_KOBLITZ
    31803971            case WOLFSSL_ECC_SECP256K1:
     
    32204011        #endif /* !NO_ECC_SECP */
    32214012    #endif
     4013#endif
    32224014            default: continue; /* unsupported curve */
    32234015        }
    32244016
     4017    #ifdef HAVE_ECC
    32254018        /* Set default Oid */
    32264019        if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
     
    32294022        }
    32304023
     4024        /* The eccTempKeySz is the preferred ephemeral key size */
    32314025        if (currOid == 0 && ssl->eccTempKeySz == octets)
    32324026            currOid = oid;
     
    32354029            nextSz  = octets;
    32364030        }
     4031    #else
     4032        if (defOid == 0 && defSz > octets) {
     4033            defOid = oid;
     4034            defSz = octets;
     4035        }
     4036
     4037        if (currOid == 0)
     4038            currOid = oid;
     4039        if (nextOid == 0 || nextSz > octets) {
     4040            nextOid = oid;
     4041            nextSz  = octets;
     4042        }
     4043    #endif
    32374044
    32384045        if (first == ECC_BYTE) {
     
    33464153
    33474154    /* Choose the default if it is at the required strength. */
    3348     if (ssl->ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz) {
     4155#ifdef HAVE_ECC
     4156    if (ssl->ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
     4157#else
     4158    if (ssl->ecdhCurveOID == 0)
     4159#endif
     4160    {
    33494161        key = 1;
    33504162        ssl->ecdhCurveOID = defOid;
     
    33674179    return sig && key;
    33684180}
     4181#endif
    33694182
    33704183#endif /* NO_WOLFSSL_SERVER */
     
    33744187    TLSX* extension = NULL;
    33754188    SupportedCurve* curve = NULL;
    3376     int ret = 0;
     4189    int ret;
    33774190
    33784191    if (extensions == NULL)
     
    33994212    }
    34004213
    3401     return (TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS) == NULL)
    3402         ? TLSX_UsePointFormat(extensions, WOLFSSL_EC_PF_UNCOMPRESSED, heap)
    3403         : WOLFSSL_SUCCESS;
     4214    return WOLFSSL_SUCCESS;
    34044215}
    34054216
     
    34474258#endif
    34484259
    3449 #ifndef NO_WOLFSSL_SERVER
     4260#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
     4261                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
    34504262#define EC_PARSE TLSX_SupportedCurve_Parse
    34514263#else
     
    34964308
    34974309    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
    3498     if (data && data->enabled) {
     4310    if (data && data->enabled && data->verifySet) {
    34994311        /* client sends client_verify_data only */
    35004312        length += TLS_FINISHED_SZ;
     
    35124324{
    35134325    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
    3514 
    3515     if (data && data->enabled) {
     4326    if (data && data->enabled && data->verifySet) {
    35164327        /* client sends client_verify_data only */
    35174328        XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
     
    35364347
    35374348    if (length >= OPAQUE8_LEN) {
    3538         if (ssl->secure_renegotiation == NULL) {
     4349        if (isRequest) {
    35394350        #ifndef NO_WOLFSSL_SERVER
    3540             if (isRequest && *input == 0) {
    3541             #ifdef HAVE_SERVER_RENEGOTIATION_INFO
    3542                 if (length == OPAQUE8_LEN) {
    3543                     if (TLSX_Find(ssl->extensions,
    3544                                   TLSX_RENEGOTIATION_INFO) == NULL) {
    3545                         ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions,
    3546                                                              ssl->heap);
    3547                         if (ret == WOLFSSL_SUCCESS)
    3548                             ret = 0;
    3549 
    3550                     } else {
     4351            if (ssl->secure_renegotiation == NULL) {
     4352                /* already in error state */
     4353                WOLFSSL_MSG("server SCR not available");
     4354            }
     4355            else if (!ssl->secure_renegotiation->enabled) {
     4356                if (*input == 0) {
     4357                    input++; /* get past size */
     4358
     4359                    ssl->secure_renegotiation->enabled = 1;
     4360                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
    35514361                        ret = 0;
    35524362                    }
     4363                else {
     4364                    /* already in error state */
     4365                    WOLFSSL_MSG("SCR client verify data present");
    35534366                }
    3554             #else
    3555                 ret = 0;  /* don't reply, user didn't enable */
    3556             #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
    35574367            }
    3558             #ifdef HAVE_SERVER_RENEGOTIATION_INFO
    3559             else if (!isRequest) {
    3560                 /* don't do anything on client side */
    3561                 ret = 0;
    3562             }
    3563             #endif
    3564         #endif
    3565         }
    3566         else if (isRequest) {
    3567         #ifndef NO_WOLFSSL_SERVER
    3568             if (*input == TLS_FINISHED_SZ) {
    3569                 /* TODO compare client_verify_data */
    3570                 ret = 0;
     4368            else if (*input == TLS_FINISHED_SZ) {
     4369                input++; /* get past size */
     4370
     4371                /* validate client verify data */
     4372                if (XMEMCMP(input,
     4373                            ssl->secure_renegotiation->client_verify_data,
     4374                            TLS_FINISHED_SZ) == 0) {
     4375                    WOLFSSL_MSG("SCR client verify data match");
     4376                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
     4377                    ret = 0;  /* verified */
     4378                } else {
     4379                    /* already in error state */
     4380                    WOLFSSL_MSG("SCR client verify data Failure");
     4381        }
    35714382            }
    35724383        #endif
     
    36324443#ifdef HAVE_SERVER_RENEGOTIATION_INFO
    36334444
    3634 int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
    3635 {
    3636     int ret;
    3637 
    3638     ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, NULL, heap);
    3639     if (ret != 0)
    3640         return ret;
    3641 
     4445int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions)
     4446{
    36424447    /* send empty renegotiation_info extension */
    36434448    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
     
    36714476#ifdef HAVE_SESSION_TICKET
    36724477
    3673 #ifndef NO_WOLFSSL_CLIENT
     4478#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
    36744479static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl)
    36754480{
     
    36864491    }
    36874492}
    3688 #endif /* NO_WOLFSSL_CLIENT */
     4493#endif /* WLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
    36894494
    36904495
     
    37174522
    37184523    if (!isRequest) {
    3719         /* client side */
     4524        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
     4525            return TLSX_HandleUnsupportedExtension(ssl);
     4526
    37204527        if (length != 0)
    37214528            return BUFFER_ERROR;
     
    44415248 *
    44425249 * data       The SSL/TLS object.
     5250 * msgType The type of the message this extension is being written into.
    44435251 * returns the length of data that will be in the extension.
    44445252 */
    4445 static word16 TLSX_SupportedVersions_GetSize(void* data)
     5253static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
    44465254{
    44475255    WOLFSSL* ssl = (WOLFSSL*)data;
    44485256
     5257    if (msgType == client_hello) {
    44495258    /* TLS v1.2 and TLS v1.3  */
    44505259    int cnt = 2;
    44515260
    44525261#ifndef NO_OLD_TLS
    4453     /* TLS v1 and TLS v1.1  */
    4454     cnt += 2;
     5262        /* TLS v1.1  */
     5263        cnt++;
     5264    #ifdef WOLFSSL_ALLOW_TLSV10
     5265        /* TLS v1.0  */
     5266        cnt++;
     5267    #endif
    44555268#endif
    44565269
     
    44585271       cnt = 1;
    44595272
    4460     return OPAQUE8_LEN + cnt * OPAQUE16_LEN;
     5273        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
     5274    }
     5275#ifndef WOLFSSL_TLS13_DRAFT_18
     5276    else if (msgType == server_hello || msgType == hello_retry_request)
     5277        *pSz += OPAQUE16_LEN;
     5278#endif
     5279    else
     5280        return SANITY_MSG_E;
     5281
     5282    return 0;
    44615283}
    44625284
     
    44655287 * data    The SSL/TLS object.
    44665288 * output  The buffer to write the extension into.
     5289 * msgType The type of the message this extension is being written into.
    44675290 * returns the length of data that was written.
    44685291 */
    4469 static word16 TLSX_SupportedVersions_Write(void* data, byte* output)
     5292static int TLSX_SupportedVersions_Write(void* data, byte* output,
     5293                                           byte msgType, word16* pSz)
    44705294{
    44715295    WOLFSSL* ssl = (WOLFSSL*)data;
    4472     ProtocolVersion pv = ssl->ctx->method->version;
     5296    ProtocolVersion pv;
    44735297    int i;
     5298    int cnt;
     5299
     5300    if (msgType == client_hello) {
     5301        pv = ssl->ctx->method->version;
    44745302    /* TLS v1.2 and TLS v1.3  */
    4475     int cnt = 2;
     5303        cnt = 2;
    44765304
    44775305#ifndef NO_OLD_TLS
    4478     /* TLS v1 and TLS v1.1  */
    4479     cnt += 2;
     5306        /* TLS v1.1  */
     5307        cnt++;
     5308    #ifdef WOLFSSL_ALLOW_TLSV10
     5309        /* TLS v1.0  */
     5310        cnt++;
     5311    #endif
    44805312#endif
    44815313
     
    44835315       cnt = 1;
    44845316
    4485     *(output++) = cnt * OPAQUE16_LEN;
     5317        *(output++) = (byte)(cnt * OPAQUE16_LEN);
    44865318    for (i = 0; i < cnt; i++) {
    4487         /* TODO: [TLS13] Remove code when TLS v1.3 becomes an RFC. */
     5319#ifdef WOLFSSL_TLS13_DRAFT
    44885320        if (pv.minor - i == TLSv1_3_MINOR) {
    44895321            /* The TLS draft major number. */
     
    44935325            continue;
    44945326        }
     5327#endif
    44955328
    44965329        *(output++) = pv.major;
    4497         *(output++) = pv.minor - i;
    4498     }
    4499 
    4500     return OPAQUE8_LEN + cnt * OPAQUE16_LEN;
     5330            *(output++) = (byte)(pv.minor - i);
     5331        }
     5332
     5333        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
     5334    }
     5335#ifndef WOLFSSL_TLS13_DRAFT_18
     5336    else if (msgType == server_hello || msgType == hello_retry_request) {
     5337    #ifdef WOLFSSL_TLS13_DRAFT
     5338        if (ssl->version.major == SSLv3_MAJOR &&
     5339                                          ssl->version.minor == TLSv1_3_MINOR) {
     5340            output[0] = TLS_DRAFT_MAJOR;
     5341            output[1] = TLS_DRAFT_MINOR;
     5342        }
     5343        else
     5344    #endif
     5345        {
     5346            output[0] = ssl->version.major;
     5347            output[1] = ssl->version.minor;
     5348        }
     5349
     5350        *pSz += OPAQUE16_LEN;
     5351    }
     5352#endif
     5353    else
     5354        return SANITY_MSG_E;
     5355
     5356    return 0;
    45015357}
    45025358
     
    45065362 * input   The buffer with the extension data.
    45075363 * length  The length of the extension data.
     5364 * msgType The type of the message this extension is being parsed from.
    45085365 * returns 0 on success, otherwise failure.
    45095366 */
    45105367static int TLSX_SupportedVersions_Parse(WOLFSSL *ssl, byte* input,
    4511                                         word16 length)
     5368                                        word16 length, byte msgType)
    45125369{
    45135370    ProtocolVersion pv = ssl->ctx->method->version;
    45145371    int i;
    4515     int ret = VERSION_ERROR;
    45165372    int len;
    45175373    byte major, minor;
    4518 
     5374    int newMinor = 0;
     5375
     5376    if (msgType == client_hello) {
    45195377    /* Must contain a length and at least one version. */
    45205378    if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1)
     
    45345392        minor = input[i + OPAQUE8_LEN];
    45355393
    4536         /* TODO: [TLS13] Remove code when TLS v1.3 becomes an RFC. */
     5394#ifdef WOLFSSL_TLS13_DRAFT
    45375395        if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
    45385396            major = SSLv3_MAJOR;
    45395397            minor = TLSv1_3_MINOR;
    45405398        }
     5399#endif
    45415400
    45425401        if (major != pv.major)
     
    45445403
    45455404        /* No upgrade allowed. */
    4546         if (ssl->version.minor > minor)
     5405            if (minor > ssl->version.minor)
    45475406                continue;
    45485407        /* Check downgrade. */
    4549         if (ssl->version.minor < minor) {
     5408            if (minor < ssl->version.minor) {
    45505409            if (!ssl->options.downgrade)
    45515410                continue;
    45525411
    4553 #ifdef NO_OLD_TLS
    4554             if (minor < TLSv1_2_MINOR)
     5412                if (minor < ssl->options.minDowngrade)
    45555413                continue;
    4556 #endif
     5414
     5415                if (newMinor == 0 && minor > ssl->options.oldMinor) {
    45575416            /* Downgrade the version. */
    45585417            ssl->version.minor = minor;
    45595418        }
     5419            }
    45605420
    45615421        if (minor >= TLSv1_3_MINOR) {
     5422                if (!ssl->options.tls1_3) {
    45625423            ssl->options.tls1_3 = 1;
    4563             TLSX_Push(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, input,
     5424                    TLSX_Push(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, ssl,
    45645425                      ssl->heap);
    4565         }
    4566         ret = 0;
    4567         break;
    4568     }
    4569 
    4570     return ret;
     5426#ifndef WOLFSSL_TLS13_DRAFT_18
     5427                    TLSX_SetResponse(ssl, TLSX_SUPPORTED_VERSIONS);
     5428#endif
     5429        }
     5430                if (minor > newMinor) {
     5431                    ssl->version.minor = minor;
     5432                    newMinor = minor;
     5433                }
     5434            }
     5435            else if (minor > ssl->options.oldMinor)
     5436                ssl->options.oldMinor = minor;
     5437        }
     5438    }
     5439#ifndef WOLFSSL_TLS13_DRAFT_18
     5440    else if (msgType == server_hello || msgType == hello_retry_request) {
     5441        /* Must contain one version. */
     5442        if (length != OPAQUE16_LEN)
     5443            return BUFFER_ERROR;
     5444
     5445        major = input[0];
     5446        minor = input[OPAQUE8_LEN];
     5447
     5448    #ifdef WOLFSSL_TLS13_DRAFT
     5449        if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
     5450            major = SSLv3_MAJOR;
     5451            minor = TLSv1_3_MINOR;
     5452        }
     5453    #endif
     5454
     5455        if (major != pv.major)
     5456            return VERSION_ERROR;
     5457
     5458        /* Can't downgrade with this extension below TLS v1.3. */
     5459        if (minor < TLSv1_3_MINOR)
     5460            return VERSION_ERROR;
     5461
     5462        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
     5463        if (ssl->options.downgrade && ssl->version.minor == TLSv1_2_MINOR) {
     5464            /* Set minor version back to TLS v1.3+ */
     5465            ssl->version.minor = ssl->ctx->method->version.minor;
     5466    }
     5467
     5468        /* No upgrade allowed. */
     5469        if (ssl->version.minor < minor)
     5470            return VERSION_ERROR;
     5471
     5472        /* Check downgrade. */
     5473        if (ssl->version.minor > minor) {
     5474            if (!ssl->options.downgrade)
     5475                return VERSION_ERROR;
     5476
     5477            if (minor < ssl->options.minDowngrade)
     5478                return VERSION_ERROR;
     5479
     5480            /* Downgrade the version. */
     5481            ssl->version.minor = minor;
     5482        }
     5483    }
     5484#endif
     5485    else
     5486        return SANITY_MSG_E;
     5487
     5488    return 0;
    45715489}
    45725490
     
    45935511#else
    45945512
    4595 #define SV_GET_SIZE(a)      0
    4596 #define SV_WRITE(a, b)      0
    4597 #define SV_PARSE(a, b, c)    0
     5513#define SV_GET_SIZE(a, b, c) 0
     5514#define SV_WRITE(a, b, c, d) 0
     5515#define SV_PARSE(a, b, c, d) 0
    45985516
    45995517#endif /* WOLFSSL_TLS13 */
     
    46255543 * returns the number of bytes of the encoded Cookie extension.
    46265544 */
    4627 static word16 TLSX_Cookie_GetSize(Cookie* cookie, byte msgType)
     5545static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
    46285546{
    46295547    if (msgType == client_hello || msgType == hello_retry_request)
    4630         return OPAQUE16_LEN + cookie->len;
    4631 
     5548        *pSz += OPAQUE16_LEN + cookie->len;
     5549    else
    46325550    return SANITY_MSG_E;
     5551    return 0;
    46335552}
    46345553
     
    46425561 * returns the number of bytes written into the buffer.
    46435562 */
    4644 static word16 TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType)
     5563static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType, word16* pSz)
    46455564{
    46465565    if (msgType == client_hello || msgType == hello_retry_request) {
     
    46485567        output += OPAQUE16_LEN;
    46495568        XMEMCPY(output, &cookie->data, cookie->len);
    4650         return OPAQUE16_LEN + cookie->len;
    4651     }
    4652 
     5569        *pSz += OPAQUE16_LEN + cookie->len;
     5570    }
     5571    else
    46535572    return SANITY_MSG_E;
     5573    return 0;
    46545574}
    46555575
     
    47445664
    47455665    extension->data = (void*)cookie;
    4746     extension->resp = resp;
     5666    extension->resp = (byte)resp;
    47475667
    47485668    return 0;
     
    47575677
    47585678#define CKE_FREE_ALL(a, b)    0
    4759 #define CKE_GET_SIZE(a, b)    0
    4760 #define CKE_WRITE(a, b, c)    0
     5679#define CKE_GET_SIZE(a, b, c) 0
     5680#define CKE_WRITE(a, b, c, d) 0
    47615681#define CKE_PARSE(a, b, c, d) 0
    47625682
     
    47645684
    47655685/******************************************************************************/
    4766 /* Sugnature Algorithms                                                       */
     5686/* Signature Algorithms                                                       */
    47675687/******************************************************************************/
    47685688
     
    47905710 */
    47915711static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, byte* input,
    4792                                            word16 length)
     5712                                                                  word16 length)
    47935713{
    47945714    word16 i;
     
    48345754 */
    48355755static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, byte* input,
    4836                                           word16 length, Suites* suites)
     5756                                  word16 length, byte isRequest, Suites* suites)
    48375757{
    48385758    word16 len;
    48395759
    4840     (void)ssl;
     5760    if (!isRequest)
     5761        return BUFFER_ERROR;
    48415762
    48425763    /* Must contain a length and at least algorithm. */
     
    48515772        return BUFFER_ERROR;
    48525773
    4853     XMEMCPY(suites->hashSigAlgo, input, len);
     5774    /* truncate hashSigAlgo list if too long */
    48545775    suites->hashSigAlgoSz = len;
     5776    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
     5777        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
     5778        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
     5779    }
     5780    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
    48555781
    48565782    return TLSX_SignatureAlgorithms_MapPss(ssl, input, len);
    48575783}
    48585784
    4859 /* Sets a new SupportedVersions extension into the extension list.
     5785/* Sets a new SignatureAlgorithms extension into the extension list.
    48605786 *
    48615787 * extensions  The list of extensions.
     
    48775803#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
    48785804
     5805/******************************************************************************/
     5806/* Signature Algorithms Certificate                                           */
     5807/******************************************************************************/
     5808
     5809#ifdef WOLFSSL_TLS13
     5810#if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     5811/* Return the size of the SignatureAlgorithms extension's data.
     5812 *
     5813 * data  Unused
     5814 * returns the length of data that will be in the extension.
     5815 */
     5816static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
     5817{
     5818    WOLFSSL* ssl = (WOLFSSL*)data;
     5819
     5820    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
     5821}
     5822
     5823/* Writes the SignatureAlgorithmsCert extension into the buffer.
     5824 *
     5825 * data    Unused
     5826 * output  The buffer to write the extension into.
     5827 * returns the length of data that was written.
     5828 */
     5829static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
     5830{
     5831    WOLFSSL* ssl = (WOLFSSL*)data;
     5832
     5833    c16toa(ssl->certHashSigAlgoSz, output);
     5834    XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
     5835            ssl->certHashSigAlgoSz);
     5836
     5837    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
     5838}
     5839
     5840/* Parse the SignatureAlgorithmsCert extension.
     5841 *
     5842 * ssl     The SSL/TLS object.
     5843 * input   The buffer with the extension data.
     5844 * length  The length of the extension data.
     5845 * returns 0 on success, otherwise failure.
     5846 */
     5847static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, byte* input,
     5848                                              word16 length, byte isRequest)
     5849{
     5850    word16 len;
     5851
     5852    if (!isRequest)
     5853        return BUFFER_ERROR;
     5854
     5855    /* Must contain a length and at least algorithm. */
     5856    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
     5857        return BUFFER_ERROR;
     5858
     5859    ato16(input, &len);
     5860    input += OPAQUE16_LEN;
     5861
     5862    /* Algorithm array must fill rest of data. */
     5863    if (length != OPAQUE16_LEN + len)
     5864        return BUFFER_ERROR;
     5865
     5866    /* truncate hashSigAlgo list if too long */
     5867    ssl->certHashSigAlgoSz = len;
     5868    if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
     5869        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
     5870        ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
     5871    }
     5872    XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
     5873
     5874    return 0;
     5875}
     5876
     5877/* Sets a new SignatureAlgorithmsCert extension into the extension list.
     5878 *
     5879 * extensions  The list of extensions.
     5880 * data        The extensions specific data.
     5881 * heap        The heap used for allocation.
     5882 * returns 0 on success, otherwise failure.
     5883 */
     5884static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions, const void* data,
     5885                                       void* heap)
     5886{
     5887    if (extensions == NULL)
     5888        return BAD_FUNC_ARG;
     5889
     5890    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, (void *)data,
     5891                                                                          heap);
     5892}
     5893
     5894#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
     5895#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
     5896#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
     5897#endif /* !WOLFSSL_TLS13_DRAFT_18 && !WOLFSSL_TLS13_DRAFT_22 */
     5898#endif /* WOLFSSL_TLS13 */
     5899
    48795900
    48805901/******************************************************************************/
     
    48835904
    48845905#ifdef WOLFSSL_TLS13
    4885 #ifndef NO_DH
    48865906/* Create a key share entry using named Diffie-Hellman parameters group.
    48875907 * Generates a key pair.
     
    48945914{
    48955915    int             ret;
     5916#ifndef NO_DH
    48965917    byte*           keyData;
    48975918    void*           key = NULL;
     
    48995920    word32          dataSz;
    49005921    const DhParams* params;
    4901     DhKey dhKey;
     5922#ifdef WOLFSSL_SMALL_STACK
     5923    DhKey*          dhKey = NULL;
     5924#else
     5925    DhKey           dhKey[1];
     5926#endif
    49025927
    49035928    /* TODO: [TLS13] The key size should come from wolfcrypt. */
     
    49385963    }
    49395964
    4940     ret = wc_InitDhKey_ex(&dhKey, ssl->heap, ssl->devId);
    4941     if (ret != 0)
     5965#ifdef WOLFSSL_SMALL_STACK
     5966    dhKey = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap, DYNAMIC_TYPE_DH);
     5967    if (dhKey == NULL)
     5968        return MEMORY_E;
     5969#endif
     5970
     5971    ret = wc_InitDhKey_ex(dhKey, ssl->heap, ssl->devId);
     5972    if (ret != 0) {
     5973    #ifdef WOLFSSL_SMALL_STACK
     5974        XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
     5975    #endif
    49425976        return ret;
     5977    }
    49435978
    49445979    /* Allocate space for the public key. */
     
    49575992
    49585993    /* Set key */
    4959     ret = wc_DhSetKey(&dhKey,
     5994    ret = wc_DhSetKey(dhKey,
    49605995        (byte*)params->p, params->p_len,
    49615996        (byte*)params->g, params->g_len);
     
    49645999
    49656000    /* Generate a new key pair. */
    4966     ret = wc_DhGenerateKeyPair(&dhKey, ssl->rng, (byte*)key, &keySz, keyData,
     6001    ret = wc_DhGenerateKeyPair(dhKey, ssl->rng, (byte*)key, &keySz, keyData,
    49676002                               &dataSz);
    49686003#ifdef WOLFSSL_ASYNC_CRYPT
    49696004    /* TODO: Make this function non-blocking */
    49706005    if (ret == WC_PENDING_E) {
    4971         ret = wc_AsyncWait(ret, &dhKey.asyncDev, WC_ASYNC_FLAG_NONE);
     6006        ret = wc_AsyncWait(ret, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
    49726007    }
    49736008#endif
     
    49816016    }
    49826017
    4983     kse->ke = keyData;
    4984     kse->keLen = params->p_len;
     6018    kse->pubKey = keyData;
     6019    kse->pubKeyLen = params->p_len;
    49856020    kse->key = key;
    49866021    kse->keyLen = keySz;
     
    49936028end:
    49946029
    4995     wc_FreeDhKey(&dhKey);
     6030    wc_FreeDhKey(dhKey);
     6031#ifdef WOLFSSL_SMALL_STACK
     6032    XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
     6033#endif
    49966034
    49976035    if (ret != 0) {
     
    50026040            XFREE(key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
    50036041    }
     6042#else
     6043    (void)ssl;
     6044    (void)kse;
     6045
     6046    ret = NOT_COMPILED_IN;
     6047#endif
    50046048
    50056049    return ret;
    50066050}
    5007 #endif
    5008 
    5009 #ifdef HAVE_ECC
     6051
     6052/* Create a key share entry using X25519 parameters group.
     6053 * Generates a key pair.
     6054 *
     6055 * ssl   The SSL/TLS object.
     6056 * kse   The key share entry object.
     6057 * returns 0 on success, otherwise failure.
     6058 */
     6059static int TLSX_KeyShare_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
     6060{
     6061    int      ret;
     6062    #ifdef HAVE_CURVE25519
     6063    byte*           keyData = NULL;
     6064    word32          dataSize = CURVE25519_KEYSIZE;
     6065                curve25519_key* key;
     6066
     6067                /* Allocate an ECC key to hold private key. */
     6068                key = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
     6069                                           ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
     6070                if (key == NULL) {
     6071                    WOLFSSL_MSG("EccTempKey Memory error");
     6072                    return MEMORY_E;
     6073                }
     6074
     6075                /* Make an ECC key. */
     6076                ret = wc_curve25519_init(key);
     6077                if (ret != 0)
     6078                    goto end;
     6079    ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
     6080                if (ret != 0)
     6081                    goto end;
     6082
     6083                /* Allocate space for the public key. */
     6084    keyData = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
     6085                                         DYNAMIC_TYPE_PUBLIC_KEY);
     6086                if (keyData == NULL) {
     6087                    WOLFSSL_MSG("Key data Memory error");
     6088                    ret = MEMORY_E;
     6089                    goto end;
     6090                }
     6091
     6092                /* Export public key. */
     6093                if (wc_curve25519_export_public_ex(key, keyData, &dataSize,
     6094                                                  EC25519_LITTLE_ENDIAN) != 0) {
     6095                    ret = ECC_EXPORT_ERROR;
     6096                    goto end;
     6097                }
     6098
     6099    kse->pubKey = keyData;
     6100    kse->pubKeyLen = CURVE25519_KEYSIZE;
     6101                kse->key = key;
     6102
     6103#ifdef WOLFSSL_DEBUG_TLS
     6104                WOLFSSL_MSG("Public Curve25519 Key");
     6105                WOLFSSL_BUFFER(keyData, dataSize);
     6106#endif
     6107
     6108end:
     6109    if (ret != 0) {
     6110        /* Data owned by key share entry otherwise. */
     6111        if (keyData != NULL)
     6112            XFREE(keyData, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
     6113        wc_curve25519_free(key);
     6114        XFREE(key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
     6115    }
     6116#else
     6117    (void)ssl;
     6118    (void)kse;
     6119
     6120    ret = NOT_COMPILED_IN;
     6121#endif /* HAVE_CURVE25519 */
     6122
     6123    return ret;
     6124            }
     6125
    50106126/* Create a key share entry using named elliptic curve parameters group.
    50116127 * Generates a key pair.
     
    50186134{
    50196135    int      ret;
     6136#ifdef HAVE_ECC
    50206137    byte*    keyData = NULL;
    50216138    word32   dataSize;
     6139    byte*    keyPtr = NULL;
    50226140    word32   keySize;
    5023     ecc_key* eccKey = NULL;
     6141    ecc_key* eccKey;
    50246142    word16   curveId;
    50256143
     
    50546172        #endif /* !NO_ECC_SECP */
    50556173    #endif
    5056     #ifdef HAVE_CURVE25519
    5057         case WOLFSSL_ECC_X25519:
    5058             {
    5059                 curve25519_key* key;
    5060                 /* Allocate an ECC key to hold private key. */
    5061                 key = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
    5062                                            ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
    5063                 if (key == NULL) {
    5064                     WOLFSSL_MSG("EccTempKey Memory error");
    5065                     return MEMORY_E;
    5066                 }
    5067 
    5068                 dataSize = keySize = 32;
    5069 
    5070                 /* Make an ECC key. */
    5071                 ret = wc_curve25519_init(key);
    5072                 if (ret != 0)
    5073                     goto end;
    5074                 ret = wc_curve25519_make_key(ssl->rng, keySize, key);
    5075                 if (ret != 0)
    5076                     goto end;
    5077 
    5078                 /* Allocate space for the public key. */
    5079                 keyData = (byte*)XMALLOC(dataSize, ssl->heap,
    5080                                          DYNAMIC_TYPE_PUBLIC_KEY);
    5081                 if (keyData == NULL) {
    5082                     WOLFSSL_MSG("Key data Memory error");
    5083                     ret = MEMORY_E;
    5084                     goto end;
    5085                 }
    5086 
    5087                 /* Export public key. */
    5088                 if (wc_curve25519_export_public_ex(key, keyData, &dataSize,
    5089                                                   EC25519_LITTLE_ENDIAN) != 0) {
    5090                     ret = ECC_EXPORT_ERROR;
    5091                     goto end;
    5092                 }
    5093 
    5094                 kse->ke = keyData;
    5095                 kse->keLen = dataSize;
    5096                 kse->key = key;
    5097 
    5098 #ifdef WOLFSSL_DEBUG_TLS
    5099                 WOLFSSL_MSG("Public Curve25519 Key");
    5100                 WOLFSSL_BUFFER(keyData, dataSize);
    5101 #endif
    5102 
    5103                 goto end;
    5104             }
    5105     #endif
    51066174    #ifdef HAVE_X448
    51076175        case WOLFSSL_ECC_X448:
     
    51156183
    51166184    /* Allocate an ECC key to hold private key. */
    5117     eccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
     6185    keyPtr = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap,
    51186186                               DYNAMIC_TYPE_PRIVATE_KEY);
    5119     if (eccKey == NULL) {
     6187    if (keyPtr == NULL) {
    51206188        WOLFSSL_MSG("EccTempKey Memory error");
    51216189        return MEMORY_E;
    51226190    }
     6191    eccKey = (ecc_key*)keyPtr;
    51236192
    51246193    /* Make an ECC key. */
     
    51506219    }
    51516220
    5152     kse->ke = keyData;
    5153     kse->keLen = dataSize;
    5154     kse->key = eccKey;
     6221    kse->pubKey = keyData;
     6222    kse->pubKeyLen = dataSize;
     6223    kse->key = keyPtr;
    51556224
    51566225#ifdef WOLFSSL_DEBUG_TLS
     
    51626231    if (ret != 0) {
    51636232        /* Data owned by key share entry otherwise. */
    5164         if (eccKey != NULL)
    5165             XFREE(eccKey, ssl->heap, DYNAMIC_TYPE_TLSX);
     6233        if (keyPtr != NULL)
     6234            XFREE(keyPtr, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
    51666235        if (keyData != NULL)
    5167             XFREE(keyData, ssl->heap, DYNAMIC_TYPE_TLSX);
    5168     }
     6236            XFREE(keyData, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
     6237    }
     6238#else
     6239    (void)ssl;
     6240    (void)kse;
     6241
     6242    ret = NOT_COMPILED_IN;
     6243#endif /* HAVE_ECC */
     6244
    51696245    return ret;
    51706246}
    5171 #endif /* HAVE_ECC */
    51726247
    51736248/* Generate a secret/key using the key share entry.
     
    51786253static int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
    51796254{
    5180 #ifndef NO_DH
    51816255    /* Named FFHE groups have a bit set to identify them. */
    51826256    if ((kse->group & NAMED_DH_MASK) == NAMED_DH_MASK)
    51836257        return TLSX_KeyShare_GenDhKey(ssl, kse);
    5184 #endif
    5185 #ifdef HAVE_ECC
     6258    if (kse->group == WOLFSSL_ECC_X25519)
     6259        return TLSX_KeyShare_GenX25519Key(ssl, kse);
    51866260    return TLSX_KeyShare_GenEccKey(ssl, kse);
    5187 #else
    5188     return NOT_COMPILED_IN;
    5189 #endif
    51906261}
    51916262
     
    52046275            if (current->group == WOLFSSL_ECC_X25519) {
    52056276#ifdef HAVE_CURVE25519
    5206 
     6277                wc_curve25519_free((curve25519_key*)current->key);
    52076278#endif
    52086279            }
     
    52136284            }
    52146285        }
     6286        if (current->key != NULL)
    52156287        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
     6288        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
    52166289        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
    52176290        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
     
    52466319            continue;
    52476320
    5248         len += OPAQUE16_LEN + OPAQUE16_LEN + current->keLen;
    5249     }
    5250 
    5251     return len;
     6321        len += (int)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
     6322    }
     6323
     6324    return (word16)len;
    52526325}
    52536326
     
    52856358        c16toa(current->group, &output[i]);
    52866359        i += KE_GROUP_LEN;
    5287         c16toa(current->keLen, &output[i]);
     6360        c16toa((word16)(current->pubKeyLen), &output[i]);
    52886361        i += OPAQUE16_LEN;
    5289         XMEMCPY(&output[i], current->ke, current->keLen);
    5290         i += current->keLen;
     6362        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
     6363        i += (word16)current->pubKeyLen;
    52916364    }
    52926365    /* Write the length of the list if required. */
     
    53086381    int             ret;
    53096382    const DhParams* params;
    5310     word16          i;
    5311     byte            b;
    5312     DhKey           dhKey;
     6383#ifdef WOLFSSL_SMALL_STACK
     6384    DhKey*          dhKey = NULL;
     6385#else
     6386    DhKey           dhKey[1];
     6387#endif
    53136388
    53146389    switch (keyShareEntry->group) {
     
    53476422#endif
    53486423
    5349     if (params->p_len != keyShareEntry->keLen)
    5350         return BUFFER_ERROR;
    5351     ssl->options.dhKeySz = params->p_len;
    5352 
    5353     /* TODO: [TLS13] move this check down into wolfcrypt. */
    5354     /* Check that public DH key is not 0 or 1. */
    5355     b = 0;
    5356     for (i = 0; i < params->p_len - 1; i++)
    5357         b |= keyShareEntry->ke[i];
    5358     if (b == 0 && (keyShareEntry->ke[i] == 0x00 ||
    5359                    keyShareEntry->ke[i] == 0x01)) {
     6424#ifdef WOLFSSL_SMALL_STACK
     6425    dhKey = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap, DYNAMIC_TYPE_DH);
     6426    if (dhKey == NULL)
     6427        return MEMORY_E;
     6428#endif
     6429
     6430    ret = wc_InitDhKey_ex(dhKey, ssl->heap, ssl->devId);
     6431    if (ret != 0) {
     6432    #ifdef WOLFSSL_SMALL_STACK
     6433        XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
     6434    #endif
     6435        return ret;
     6436    }
     6437
     6438    /* Set key */
     6439    ret = wc_DhSetKey(dhKey, (byte*)params->p, params->p_len, (byte*)params->g,
     6440                                                                 params->g_len);
     6441    if (ret != 0) {
     6442        wc_FreeDhKey(dhKey);
     6443    #ifdef WOLFSSL_SMALL_STACK
     6444        XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
     6445    #endif
     6446        return ret;
     6447    }
     6448
     6449    ret = wc_DhCheckPubKey(dhKey, keyShareEntry->ke, keyShareEntry->keLen);
     6450    if (ret != 0) {
     6451        wc_FreeDhKey(dhKey);
     6452    #ifdef WOLFSSL_SMALL_STACK
     6453        XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
     6454    #endif
    53606455        return PEER_KEY_ERROR;
    53616456    }
    5362     /* Check that public DH key is not mod, mod + 1 or mod - 1. */
    5363     b = 0;
    5364     for (i = 0; i < params->p_len - 1; i++)
    5365         b |= params->p[i] ^ keyShareEntry->ke[i];
    5366     if (b == 0 && (params->p[i]     == keyShareEntry->ke[i] ||
    5367                    params->p[i] - 1 == keyShareEntry->ke[i] ||
    5368                    params->p[i] + 1 == keyShareEntry->ke[i])) {
    5369         return PEER_KEY_ERROR;
    5370     }
    5371 
    5372     ret = wc_InitDhKey_ex(&dhKey, ssl->heap, ssl->devId);
    5373     if (ret != 0)
    5374         return ret;
    5375 
    5376     /* Set key */
    5377     ret = wc_DhSetKey(&dhKey,
    5378         (byte*)params->p, params->p_len,
    5379         (byte*)params->g, params->g_len);
    5380     if (ret != 0) {
    5381         wc_FreeDhKey(&dhKey);
    5382         return ret;
    5383     }
    53846457
    53856458    /* Derive secret from private key and peer's public key. */
    5386     ret = wc_DhAgree(&dhKey,
     6459    ret = wc_DhAgree(dhKey,
    53876460        ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
    53886461        (const byte*)keyShareEntry->key, keyShareEntry->keyLen,
     
    53916464    /* TODO: Make this function non-blocking */
    53926465    if (ret == WC_PENDING_E) {
    5393         ret = wc_AsyncWait(ret, &dhKey.asyncDev, WC_ASYNC_FLAG_NONE);
    5394     }
    5395 #endif
    5396 
    5397     wc_FreeDhKey(&dhKey);
     6466        ret = wc_AsyncWait(ret, &dhKey->asyncDev, WC_ASYNC_FLAG_NONE);
     6467    }
     6468#endif
     6469    /* RFC 8446 Section 7.4.1:
     6470     *     ... left-padded with zeros up to the size of the prime. ...
     6471     */
     6472    if (params->p_len > ssl->arrays->preMasterSz) {
     6473        word32 diff = params->p_len - ssl->arrays->preMasterSz;
     6474        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
     6475                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
     6476        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
     6477        ssl->arrays->preMasterSz = params->p_len;
     6478    }
     6479
     6480    wc_FreeDhKey(dhKey);
     6481#ifdef WOLFSSL_SMALL_STACK
     6482    XFREE(dhKey, ssl->heap, DYNAMIC_TYPE_DH);
     6483#endif
     6484    if (keyShareEntry->key != NULL) {
     6485        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
     6486        keyShareEntry->key = NULL;
     6487    }
     6488    XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
     6489    keyShareEntry->pubKey = NULL;
     6490    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
     6491    keyShareEntry->ke = NULL;
    53986492
    53996493    return ret;
     
    54036497    return PEER_KEY_ERROR;
    54046498#endif
     6499}
     6500
     6501/* Process the X25519 key share extension on the client side.
     6502 *
     6503 * ssl            The SSL/TLS object.
     6504 * keyShareEntry  The key share entry object to use to calculate shared secret.
     6505 * returns 0 on success and other values indicate failure.
     6506 */
     6507static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
     6508                                       KeyShareEntry* keyShareEntry)
     6509{
     6510    int ret;
     6511
     6512#ifdef HAVE_CURVE25519
     6513    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
     6514    curve25519_key* peerX25519Key;
     6515
     6516#ifdef HAVE_ECC
     6517    if (ssl->peerEccKey != NULL) {
     6518        wc_ecc_free(ssl->peerEccKey);
     6519        ssl->peerEccKey = NULL;
     6520    }
     6521#endif
     6522
     6523    peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
     6524                                                             DYNAMIC_TYPE_TLSX);
     6525    if (peerX25519Key == NULL) {
     6526        WOLFSSL_MSG("PeerEccKey Memory error");
     6527        return MEMORY_ERROR;
     6528    }
     6529    ret = wc_curve25519_init(peerX25519Key);
     6530    if (ret != 0) {
     6531        XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
     6532        return ret;
     6533    }
     6534#ifdef WOLFSSL_DEBUG_TLS
     6535    WOLFSSL_MSG("Peer Curve25519 Key");
     6536    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
     6537#endif
     6538
     6539    /* Point is validated by import function. */
     6540    if (wc_curve25519_import_public_ex(keyShareEntry->ke, keyShareEntry->keLen,
     6541                                                  peerX25519Key,
     6542                                                  EC25519_LITTLE_ENDIAN) != 0) {
     6543        ret = ECC_PEERKEY_ERROR;
     6544    }
     6545
     6546    if (ret == 0) {
     6547        ssl->arrays->preMasterSz = ENCRYPT_LEN;
     6548        ssl->ecdhCurveOID = ECC_X25519_OID;
     6549
     6550        ret = wc_curve25519_shared_secret_ex(key, peerX25519Key,
     6551                                                   ssl->arrays->preMasterSecret,
     6552                                                   &ssl->arrays->preMasterSz,
     6553                                                   EC25519_LITTLE_ENDIAN);
     6554    }
     6555
     6556    wc_curve25519_free(peerX25519Key);
     6557    XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
     6558    wc_curve25519_free((curve25519_key*)keyShareEntry->key);
     6559    if (keyShareEntry->key != NULL) {
     6560        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
     6561        keyShareEntry->key = NULL;
     6562    }
     6563#else
     6564    (void)ssl;
     6565    (void)keyShareEntry;
     6566
     6567    ret = PEER_KEY_ERROR;
     6568#endif /* HAVE_CURVE25519 */
     6569
     6570    return ret;
    54056571}
    54066572
     
    54556621        #endif /* !NO_ECC_SECP */
    54566622    #endif
    5457     #ifdef HAVE_CURVE25519
    5458         case WOLFSSL_ECC_X25519:
    5459             {
    5460                 curve25519_key* key = (curve25519_key*)keyShareEntry->key;
    5461                 curve25519_key* peerEccKey;
    5462 
    5463                 if (ssl->peerEccKey != NULL)
    5464                     wc_ecc_free(ssl->peerEccKey);
    5465 
    5466                 peerEccKey = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
    5467                                                   ssl->heap, DYNAMIC_TYPE_TLSX);
    5468                 if (peerEccKey == NULL) {
    5469                     WOLFSSL_MSG("PeerEccKey Memory error");
    5470                     return MEMORY_ERROR;
    5471                 }
    5472                 ret = wc_curve25519_init(peerEccKey);
    5473                 if (ret != 0)
    5474                     return ret;
    5475 #ifdef WOLFSSL_DEBUG_TLS
    5476                 WOLFSSL_MSG("Peer Curve25519 Key");
    5477                 WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
    5478 #endif
    5479 
    5480                 /* Point is validated by import function. */
    5481                 if (wc_curve25519_import_public_ex(keyShareEntry->ke,
    5482                                                keyShareEntry->keLen, peerEccKey,
    5483                                                EC25519_LITTLE_ENDIAN) != 0) {
    5484                     return ECC_PEERKEY_ERROR;
    5485                 }
    5486 
    5487                 ssl->arrays->preMasterSz = ENCRYPT_LEN;
    5488                 ret = wc_curve25519_shared_secret_ex(key, peerEccKey,
    5489                     ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
    5490                     EC25519_LITTLE_ENDIAN);
    5491                 wc_curve25519_free(peerEccKey);
    5492                 XFREE(peerEccKey, ssl->heap, DYNAMIC_TYPE_TLSX);
    5493                 ssl->ecdhCurveOID = ECC_X25519_OID;
    5494                 return ret;
    5495             }
    5496     #endif
    54976623    #ifdef HAVE_X448
    54986624        case WOLFSSL_ECC_X448:
     
    55326658        keyShareEntry->ke, &keyShareEntry->keLen,
    55336659        ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
    5534         ssl->options.side,
    5535     #ifdef HAVE_PK_CALLBACKS
    5536         ssl->EccSharedSecretCtx
    5537     #else
    5538         NULL
    5539     #endif
     6660        ssl->options.side
    55406661    );
    55416662#endif
    55426663
     6664    wc_ecc_free(ssl->peerEccKey);
     6665    XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
     6666    ssl->peerEccKey = NULL;
     6667    wc_ecc_free((ecc_key*)(keyShareEntry->key));
     6668    if (keyShareEntry->key != NULL) {
     6669        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
     6670        keyShareEntry->key = NULL;
     6671    }
    55436672
    55446673#else
     
    55636692
    55646693#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    5565     ssl->session.namedGroup = keyShareEntry->group;
     6694    ssl->session.namedGroup = (byte)keyShareEntry->group;
    55666695#endif
    55676696    /* Use Key Share Data from server. */
    55686697    if (keyShareEntry->group & NAMED_DH_MASK)
    55696698        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
     6699    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
     6700        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
    55706701    else
    55716702        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
     
    56276758/* Searches the groups sent for the specified named group.
    56286759 *
    5629  * ssl   The SSL/TLS object.
    5630  * name  The group name to match.
     6760 * ssl    SSL/TLS object.
     6761 * name   Group name to match.
    56316762 * returns 1 when the extension has the group name and 0 otherwise.
    56326763 */
     
    56376768
    56386769    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
     6770    if (extension == NULL) {
     6771        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
    56396772    if (extension == NULL)
    56406773        return 0;
     6774    }
    56416775
    56426776    list = (KeyShareEntry*)extension->data;
    56436777    while (list != NULL) {
    5644         if (list->group == group) {
     6778        if (list->group == group)
    56456779            return 1;
    5646         }
    56476780        list = list->next;
    56486781    }
     
    56646797    SupportedCurve* curve = NULL;
    56656798
    5666     if ((extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS)) == NULL)
     6799    if ((extension = TLSX_Find(ssl->extensions,
     6800                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
     6801        if ((extension = TLSX_Find(ssl->ctx->extensions,
     6802                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
    56676803        return 0;
     6804        }
     6805    }
    56686806
    56696807    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
     
    56936831{
    56946832    int ret;
    5695     KeyShareEntry *keyShareEntry;
     6833    KeyShareEntry *keyShareEntry = NULL;
     6834    word16 group;
    56966835
    56976836    if (msgType == client_hello) {
    56986837        int offset = 0;
    56996838        word16 len;
     6839        TLSX*  extension;
     6840
     6841        /* Add a KeyShare extension if it doesn't exist. */
     6842        extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
     6843        if (extension == NULL) {
     6844            /* Push new KeyShare extension. */
     6845            ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
     6846            if (ret != 0)
     6847                return ret;
     6848        }
    57006849
    57016850        if (length < OPAQUE16_LEN)
     
    57226871        int len;
    57236872
     6873        if (length < OPAQUE16_LEN)
     6874            return BUFFER_ERROR;
     6875
     6876        /* The data is the named group the server wants to use. */
     6877        ato16(input, &group);
     6878
     6879        /* Check the selected group was supported by ClientHello extensions. */
     6880        if (!TLSX_SupportedGroups_Find(ssl, group))
     6881            return BAD_KEY_SHARE_DATA;
     6882
     6883        /* Check if the group was sent. */
     6884        if (!TLSX_KeyShare_Find(ssl, group))
     6885            return BAD_KEY_SHARE_DATA;
     6886
    57246887        /* ServerHello contains one key share entry. */
    57256888        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry);
     
    57286891
    57296892        /* Not in list sent if there isn't a private key. */
    5730         if (keyShareEntry->key == NULL)
     6893        if (keyShareEntry == NULL || keyShareEntry->key == NULL)
    57316894            return BAD_KEY_SHARE_DATA;
    57326895
    57336896        /* Process the entry to calculate the secret. */
    57346897        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
     6898        if (ret == 0)
     6899            ssl->session.namedGroup = ssl->namedGroup = group;
    57356900    }
    57366901    else if (msgType == hello_retry_request) {
    5737         word16 group;
    5738 
    57396902        if (length != OPAQUE16_LEN)
    57406903            return BUFFER_ERROR;
     
    57506913        if (TLSX_KeyShare_Find(ssl, group))
    57516914            return BAD_KEY_SHARE_DATA;
     6915
     6916        /* Clear out unusable key shares. */
     6917        ret = TLSX_KeyShare_Empty(ssl);
     6918        if (ret != 0)
     6919            return ret;
    57526920
    57536921        /* Try to use the server's group. */
     
    57816949
    57826950    XMEMSET(kse, 0, sizeof(*kse));
    5783     kse->group = group;
     6951    kse->group = (word16)group;
    57846952
    57856953    /* Add it to the back and maintain the links. */
     
    57886956    *list = kse;
    57896957    *keyShareEntry = kse;
     6958
     6959    (void)heap;
    57906960
    57916961    return 0;
     
    58397009
    58407010    if (data != NULL) {
    5841         /* Keep the public key data and free when finished. */
    5842         if (keyShareEntry->ke != NULL)
    5843             XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
    58447011        keyShareEntry->ke = data;
    58457012        keyShareEntry->keLen = len;
     
    59417108
    59427109    return 1;
     7110}
     7111
     7112/* Examines the application specified group ranking and returns the rank of the
     7113 * group.
     7114 * If no group ranking set then all groups are rank 0 (highest).
     7115 *
     7116 * ssl    The SSL/TLS object.
     7117 * group  The group to check ranking for.
     7118 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
     7119 */
     7120static int TLSX_KeyShare_GroupRank(WOLFSSL* ssl, int group)
     7121{
     7122    byte i;
     7123
     7124    if (ssl->numGroups == 0) {
     7125#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
     7126    #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
     7127        #ifndef NO_ECC_SECP
     7128            ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP256R1;
     7129        #endif
     7130    #endif
     7131#endif
     7132    #ifndef HAVE_FIPS
     7133        #if defined(HAVE_CURVE25519)
     7134            ssl->group[ssl->numGroups++] = WOLFSSL_ECC_X25519;
     7135        #endif
     7136    #endif
     7137#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
     7138    #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
     7139        #ifndef NO_ECC_SECP
     7140            ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP384R1;
     7141        #endif
     7142    #endif
     7143    #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     7144        #ifndef NO_ECC_SECP
     7145            ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP521R1;
     7146        #endif
     7147    #endif
     7148#endif
     7149            /* Add FFDHE supported groups. */
     7150        #ifdef HAVE_FFDHE_2048
     7151            ssl->group[ssl->numGroups++] = WOLFSSL_FFDHE_2048;
     7152        #endif
     7153        #ifdef HAVE_FFDHE_3072
     7154            ssl->group[ssl->numGroups++] = WOLFSSL_FFDHE_3072;
     7155        #endif
     7156        #ifdef HAVE_FFDHE_4096
     7157            ssl->group[ssl->numGroups++] = WOLFSSL_FFDHE_4096;
     7158        #endif
     7159        #ifdef HAVE_FFDHE_6144
     7160            ssl->group[ssl->numGroups++] = WOLFSSL_FFDHE_6144;
     7161        #endif
     7162        #ifdef HAVE_FFDHE_8192
     7163            ssl->group[ssl->numGroups++] = WOLFSSL_FFDHE_8192;
     7164        #endif
     7165    }
     7166
     7167    for (i = 0; i < ssl->numGroups; i++)
     7168        if (ssl->group[i] == group)
     7169            return i;
     7170
     7171    return -1;
    59437172}
    59447173
     
    59557184    TLSX*          extension;
    59567185    SupportedCurve* curve = NULL;
    5957 
    5958     /* Use SupportedGroup's order. */
     7186    SupportedCurve* preferredCurve = NULL;
     7187    int             preferredRank = WOLFSSL_MAX_GROUP_COUNT;
     7188    int             rank;
     7189
    59597190    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
    59607191    if (extension != NULL)
    59617192        curve = (SupportedCurve*)extension->data;
     7193    /* Use server's preference order. */
    59627194    for (; curve != NULL; curve = curve->next) {
    5963         if (TLSX_KeyShare_IsSupported(curve->name) &&
    5964                 !TLSX_KeyShare_Find(ssl, curve->name)) {
    5965             break;
    5966         }
    5967     }
     7195        if (!TLSX_KeyShare_IsSupported(curve->name))
     7196            continue;
     7197
     7198        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
     7199        if (rank == -1)
     7200            continue;
     7201        if (rank < preferredRank) {
     7202            preferredCurve = curve;
     7203            preferredRank = rank;
     7204        }
     7205    }
     7206    curve = preferredCurve;
     7207
    59687208    if (curve == NULL)
    59697209        return BAD_KEY_SHARE_DATA;
     
    59937233}
    59947234
    5995 /* Establish the secret based on the key shares received from the client.
     7235/* Ensure there is a key pair that can be used for key exchange.
    59967236 *
    59977237 * ssl  The SSL/TLS object.
     
    60057245    KeyShareEntry* serverKSE;
    60067246    KeyShareEntry* list = NULL;
    6007     byte*          ke;
    6008     word16         keLen;
     7247    KeyShareEntry* preferredKSE = NULL;
     7248    int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
     7249    int rank;
    60097250
    60107251    /* Find the KeyShare extension if it exists. */
     
    60167257        return 0;
    60177258
    6018     /* TODO: [TLS13] Server's preference and sending back SupportedGroups */
    6019     /* Use client's preference. */
     7259    /* Use server's preference order. */
    60207260    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
     7261        if (clientKSE->ke == NULL)
     7262            continue;
     7263
    60217264        /* Check consistency now - extensions in any order. */
    60227265        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group))
     
    60247267
    60257268    #ifdef OPENSSL_EXTRA
     7269        if ((clientKSE->group & NAMED_DH_MASK) == 0) {
    60267270        /* Check if server supports group. */
    60277271        if (ssl->ctx->disabledCurves & (1 << clientKSE->group))
    60287272            continue;
    6029     #endif
    6030         if (TLSX_KeyShare_IsSupported(clientKSE->group))
    6031             break;
    6032     }
     7273        }
     7274    #endif
     7275        if (!TLSX_KeyShare_IsSupported(clientKSE->group))
     7276            continue;
     7277
     7278        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
     7279        if (rank == -1)
     7280            continue;
     7281        if (rank < preferredRank) {
     7282            preferredKSE = clientKSE;
     7283            preferredRank = rank;
     7284    }
     7285    }
     7286    clientKSE = preferredKSE;
     7287
    60337288    /* No supported group found - send HelloRetryRequest. */
    60347289    if (clientKSE == NULL) {
     
    60457300    if (ret != 0)
    60467301        return ret;
    6047     ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
     7302
     7303    if (clientKSE->key == NULL) {
     7304        ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
    60487305    if (ret != 0)
    60497306        return ret;
    6050 
    6051     /* Move private key to client entry. */
    6052     if (clientKSE->key != NULL)
    6053         XFREE(clientKSE->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
    6054     clientKSE->key = serverKSE->key;
    6055     serverKSE->key = NULL;
    6056     clientKSE->keyLen = serverKSE->keyLen;
     7307    }
     7308    else {
     7309        serverKSE->key = clientKSE->key;
     7310        serverKSE->keyLen = clientKSE->keyLen;
     7311        serverKSE->pubKey = clientKSE->pubKey;
     7312        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
     7313        clientKSE->key = NULL;
     7314        clientKSE->pubKey = NULL;
     7315    }
     7316    serverKSE->ke = clientKSE->ke;
     7317    serverKSE->keLen = clientKSE->keLen;
     7318    clientKSE->ke = NULL;
     7319    clientKSE->keLen = 0;
     7320
     7321    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
     7322    extension->data = (void *)serverKSE;
     7323
     7324    extension->resp = 1;
     7325
     7326    return 0;
     7327}
     7328
     7329/* Derive the shared secret of the key exchange.
     7330 *
     7331 * ssl  The SSL/TLS object.
     7332 * returns 0 on success and other values indicate failure.
     7333 */
     7334int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
     7335{
     7336    int            ret;
     7337    TLSX*          extension;
     7338    KeyShareEntry* list = NULL;
     7339
     7340    /* Find the KeyShare extension if it exists. */
     7341    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
     7342    if (extension != NULL)
     7343        list = (KeyShareEntry*)extension->data;
     7344
     7345    if (list == NULL)
     7346        return KEY_SHARE_ERROR;
    60577347
    60587348    /* Calculate secret. */
    6059     ret = TLSX_KeyShare_Process(ssl, clientKSE);
     7349    ret = TLSX_KeyShare_Process(ssl, list);
    60607350    if (ret != 0)
    60617351        return ret;
    60627352
    6063     /* Swap public keys for sending to client. */
    6064     ke = serverKSE->ke;
    6065     keLen = serverKSE->keLen;
    6066     serverKSE->ke = clientKSE->ke;
    6067     serverKSE->keLen = clientKSE->keLen;
    6068     clientKSE->ke = ke;
    6069     clientKSE->keLen = keLen;
    6070 
    6071     extension->resp = 1;
    6072 
    6073     /* Dispose of temporary server extension. */
    6074     TLSX_KeyShare_FreeAll(list, ssl->heap);
    6075 
    6076     return 0;
     7353    return ret;
    60777354}
    60787355
     
    62917568        word16 idx = 0;
    62927569
     7570        TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
     7571
    62937572        /* Length of identities and of binders. */
    62947573        if (length - idx < OPAQUE16_LEN + OPAQUE16_LEN)
     
    63487627            list->binderLen = input[idx++];
    63497628            if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
    6350                     list->binderLen > MAX_DIGEST_SIZE)
     7629                    list->binderLen > WC_MAX_DIGEST_SIZE)
    63517630                return BUFFER_E;
    63527631            if (len < OPAQUE8_LEN + list->binderLen)
     
    63767655            return BUFFER_E;
    63777656        ato16(input, &idx);
     7657
     7658    #ifdef WOLFSSL_EARLY_DATA
     7659        ssl->options.pskIdIndex = idx + 1;
     7660    #endif
    63787661
    63797662        /* Find the list of identities sent to server. */
     
    63957678           if (ssl->options.cipherSuite0  != ssl->session.cipherSuite0 ||
    63967679               ssl->options.cipherSuite   != ssl->session.cipherSuite  ||
    6397                ssl->session.version.major != ssl->version.major        ||
    6398                ssl->session.version.minor != ssl->version.minor        ) {
     7680               ssl->session.version.major != ssl->ctx->method->version.major ||
     7681               ssl->session.version.minor != ssl->ctx->method->version.minor) {
    63997682               return PSK_KEY_ERROR;
    64007683           }
    64017684        }
    64027685    #endif
    6403         /* TODO: [TLS13] More checks of consistency.
    6404          * the "key_share", and "signature_algorithms" extensions are
    6405          * consistent with the indicated ke_modes and auth_modes values
    6406          */
    64077686
    64087687        return 0;
     
    64507729}
    64517730
    6452 static INLINE byte GetHmacLength(int hmac)
     7731static WC_INLINE byte GetHmacLength(int hmac)
    64537732{
    64547733    switch (hmac) {
     
    64577736            return WC_SHA256_DIGEST_SIZE;
    64587737    #endif
    6459     #ifndef NO_SHA384
     7738    #ifdef WOLFSSL_SHA384
    64607739        case sha384_mac:
    64617740            return WC_SHA384_DIGEST_SIZE;
    64627741    #endif
    6463     #ifndef NO_SHA512
     7742    #ifdef WOLFSSL_SHA512
    64647743        case sha512_mac:
    64657744            return WC_SHA512_DIGEST_SIZE;
     
    67137992{
    67147993    if (msgType == client_hello)
    6715         return OPAQUE8_LEN;
     7994        return 0;
    67167995
    67177996    return SANITY_MSG_E;
     
    67288007static word16 TLSX_PostHandAuth_Write(byte* output, byte msgType)
    67298008{
    6730     if (msgType == client_hello) {
    6731         *output = 0;
    6732         return OPAQUE8_LEN;
    6733     }
     8009    (void)output;
     8010
     8011    if (msgType == client_hello)
     8012        return 0;
    67348013
    67358014    return SANITY_MSG_E;
     
    67488027                                 byte msgType)
    67498028{
    6750     byte len;
     8029    (void)input;
    67518030
    67528031    if (msgType == client_hello) {
    6753         /* Ensure length byte exists. */
    6754         if (length < OPAQUE8_LEN)
    6755             return BUFFER_E;
    6756 
    6757         len = input[0];
    6758         if (length - OPAQUE8_LEN != len || len != 0)
     8032        /* Ensure extension is empty. */
     8033        if (length != 0)
    67598034            return BUFFER_E;
    67608035
     
    68668141            return BUFFER_E;
    68678142
     8143        /* Ensure the index of PSK identity chosen by server is 0.
     8144         * Index is plus one to handle 'not set' value of 0.
     8145         */
     8146        if (ssl->options.pskIdIndex != 1)
     8147            return PSK_KEY_ERROR;
     8148
    68688149        return TLSX_EarlyData_Use(ssl, 1);
    68698150    }
     
    69398220}
    69408221
     8222/** Remove an extension. */
     8223void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
     8224{
     8225    TLSX* extension = *list;
     8226    TLSX** next = list;
     8227
     8228    while (extension && extension->type != type) {
     8229        next = &extension->next;
     8230        extension = extension->next;
     8231    }
     8232
     8233    if (extension) {
     8234        *next = extension->next;
     8235        extension->next = NULL;
     8236        TLSX_FreeAll(extension, heap);
     8237    }
     8238}
     8239
    69418240/** Releases all extensions in the provided list. */
    69428241void TLSX_FreeAll(TLSX* list, void* heap)
     
    70058304                break;
    70068305
    7007             case TLSX_KEY_SHARE:
    7008                 KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
    7009                 break;
    7010 
    70118306    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    70128307            case TLSX_PRE_SHARED_KEY:
     
    70278322                break;
    70288323    #endif
     8324
     8325    #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     8326            case TLSX_SIGNATURE_ALGORITHMS_CERT:
     8327                break;
     8328    #endif
     8329
     8330            case TLSX_KEY_SHARE:
     8331                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
     8332                break;
    70298333#endif
    70308334        }
     
    70428346
    70438347/** Tells the buffered size of the extensions in a list. */
    7044 static word16 TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType)
    7045 {
     8348static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType, word16* pLength)
     8349{
     8350    int    ret = 0;
    70468351    TLSX*  extension;
    70478352    word16 length = 0;
     
    71238428#ifdef WOLFSSL_TLS13
    71248429            case TLSX_SUPPORTED_VERSIONS:
    7125                 length += SV_GET_SIZE(extension->data);
     8430                ret = SV_GET_SIZE(extension->data, msgType, &length);
    71268431                break;
    71278432
    71288433            case TLSX_COOKIE:
    7129                 length += CKE_GET_SIZE((Cookie*)extension->data, msgType);
    7130                 break;
    7131 
    7132             case TLSX_KEY_SHARE:
    7133                 length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
     8434                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &length);
    71348435                break;
    71358436
     
    71558456                break;
    71568457    #endif
     8458
     8459    #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     8460            case TLSX_SIGNATURE_ALGORITHMS_CERT:
     8461                length += SAC_GET_SIZE(extension->data);
     8462                break;
     8463    #endif
     8464
     8465            case TLSX_KEY_SHARE:
     8466                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
     8467                break;
    71578468#endif
    71588469        }
     
    71638474    }
    71648475
    7165     return length;
     8476    *pLength += length;
     8477
     8478    return ret;
    71668479}
    71678480
    71688481/** Writes the extensions of a list in a buffer. */
    7169 static word16 TLSX_Write(TLSX* list, byte* output, byte* semaphore,
    7170                          byte msgType)
    7171 {
     8482static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
     8483                         byte msgType, word16* pOffset)
     8484{
     8485    int    ret = 0;
    71728486    TLSX* extension;
    71738487    word16 offset = 0;
     
    72128526
    72138527            case TLSX_SUPPORTED_GROUPS:
    7214                 WOLFSSL_MSG("Elliptic Curves extension to write");
     8528                WOLFSSL_MSG("Supported Groups extension to write");
    72158529                offset += EC_WRITE((SupportedCurve*)extension->data,
    72168530                                    output + offset);
     
    72708584            case TLSX_SUPPORTED_VERSIONS:
    72718585                WOLFSSL_MSG("Supported Versions extension to write");
    7272                 offset += SV_WRITE(extension->data, output + offset);
     8586                ret = SV_WRITE(extension->data, output + offset, msgType, &offset);
    72738587                break;
    72748588
    72758589            case TLSX_COOKIE:
    72768590                WOLFSSL_MSG("Cookie extension to write");
    7277                 offset += CKE_WRITE((Cookie*)extension->data, output + offset,
    7278                                     msgType);
    7279                 break;
    7280 
    7281             case TLSX_KEY_SHARE:
    7282                 WOLFSSL_MSG("Key Share extension to write");
    7283                 offset += KS_WRITE((KeyShareEntry*)extension->data,
    7284                                    output + offset, msgType);
     8591                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
     8592                                msgType, &offset);
    72858593                break;
    72868594
     
    73118619                break;
    73128620    #endif
     8621
     8622    #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     8623            case TLSX_SIGNATURE_ALGORITHMS_CERT:
     8624                WOLFSSL_MSG("Signature Algorithms extension to write");
     8625                offset += SAC_WRITE(extension->data, output + offset);
     8626                break;
     8627    #endif
     8628
     8629            case TLSX_KEY_SHARE:
     8630                WOLFSSL_MSG("Key Share extension to write");
     8631                offset += KS_WRITE((KeyShareEntry*)extension->data,
     8632                                   output + offset, msgType);
     8633                break;
    73138634#endif
    73148635        }
     
    73228643    }
    73238644
    7324     return offset;
     8645    *pOffset += offset;
     8646
     8647    return ret;
    73258648}
    73268649
     
    75168839#endif /* HAVE_QSH */
    75178840
     8841#if (!defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
     8842        !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)) || \
     8843    (defined(WOLFSSL_TLS13) && !defined(HAVE_ECC) && \
     8844        !defined(HAVE_CURVE25519) && defined(HAVE_SUPPORTED_CURVES)) || \
     8845    ((defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
     8846        defined(HAVE_SUPPORTED_CURVES))
     8847
     8848/* Populates the default supported groups / curves */
     8849static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
     8850{
     8851    int ret = WOLFSSL_SUCCESS;
     8852#ifdef WOLFSSL_TLS13
     8853    int i;
     8854
     8855#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     8856    if (ssl->options.resuming && ssl->session.namedGroup != 0) {
     8857        return TLSX_UseSupportedCurve(extensions, ssl->session.namedGroup,
     8858                                                                     ssl->heap);
     8859        }
     8860#endif
     8861
     8862    if (ssl->numGroups != 0) {
     8863        for (i = 0; i < ssl->numGroups; i++) {
     8864            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap);
     8865            if (ret != WOLFSSL_SUCCESS)
     8866                        return ret;
     8867            }
     8868        return WOLFSSL_SUCCESS;
     8869        }
     8870#endif /* WOLFSSL_TLS13 */
     8871
     8872#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
     8873        /* list in order by strength, since not all servers choose by strength */
     8874        #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
     8875            #ifndef NO_ECC_SECP
     8876                ret = TLSX_UseSupportedCurve(extensions,
     8877                                              WOLFSSL_ECC_SECP521R1, ssl->heap);
     8878                if (ret != WOLFSSL_SUCCESS) return ret;
     8879            #endif
     8880        #endif
     8881        #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
     8882            #ifdef HAVE_ECC_BRAINPOOL
     8883                ret = TLSX_UseSupportedCurve(extensions,
     8884                                        WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
     8885                if (ret != WOLFSSL_SUCCESS) return ret;
     8886            #endif
     8887        #endif
     8888        #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
     8889            #ifndef NO_ECC_SECP
     8890                ret = TLSX_UseSupportedCurve(extensions,
     8891                                              WOLFSSL_ECC_SECP384R1, ssl->heap);
     8892                if (ret != WOLFSSL_SUCCESS) return ret;
     8893            #endif
     8894            #ifdef HAVE_ECC_BRAINPOOL
     8895                ret = TLSX_UseSupportedCurve(extensions,
     8896                                        WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
     8897                if (ret != WOLFSSL_SUCCESS) return ret;
     8898        #endif
     8899        #endif
     8900        #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
     8901            #ifndef NO_ECC_SECP
     8902                ret = TLSX_UseSupportedCurve(extensions,
     8903                                              WOLFSSL_ECC_SECP256R1, ssl->heap);
     8904                if (ret != WOLFSSL_SUCCESS) return ret;
     8905            #endif
     8906            #ifdef HAVE_ECC_KOBLITZ
     8907                ret = TLSX_UseSupportedCurve(extensions,
     8908                                              WOLFSSL_ECC_SECP256K1, ssl->heap);
     8909                if (ret != WOLFSSL_SUCCESS) return ret;
     8910            #endif
     8911            #ifdef HAVE_ECC_BRAINPOOL
     8912                ret = TLSX_UseSupportedCurve(extensions,
     8913                                        WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
     8914                if (ret != WOLFSSL_SUCCESS) return ret;
     8915            #endif
     8916        #endif
     8917#endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */
     8918
     8919        #ifndef HAVE_FIPS
     8920            #if defined(HAVE_CURVE25519)
     8921                ret = TLSX_UseSupportedCurve(extensions,
     8922                                                 WOLFSSL_ECC_X25519, ssl->heap);
     8923                if (ret != WOLFSSL_SUCCESS) return ret;
     8924    #endif
     8925        #endif /* HAVE_FIPS */
     8926
     8927#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
     8928        #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
     8929            #ifndef NO_ECC_SECP
     8930                ret = TLSX_UseSupportedCurve(extensions,
     8931                                              WOLFSSL_ECC_SECP224R1, ssl->heap);
     8932                if (ret != WOLFSSL_SUCCESS) return ret;
     8933            #endif
     8934            #ifdef HAVE_ECC_KOBLITZ
     8935                ret = TLSX_UseSupportedCurve(extensions,
     8936                                              WOLFSSL_ECC_SECP224K1, ssl->heap);
     8937                if (ret != WOLFSSL_SUCCESS) return ret;
     8938            #endif
     8939        #endif
     8940
     8941    #ifndef HAVE_FIPS
     8942        #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
     8943            #ifndef NO_ECC_SECP
     8944                ret = TLSX_UseSupportedCurve(extensions,
     8945                                              WOLFSSL_ECC_SECP192R1, ssl->heap);
     8946                if (ret != WOLFSSL_SUCCESS) return ret;
     8947            #endif
     8948            #ifdef HAVE_ECC_KOBLITZ
     8949                ret = TLSX_UseSupportedCurve(extensions,
     8950                                              WOLFSSL_ECC_SECP192K1, ssl->heap);
     8951                if (ret != WOLFSSL_SUCCESS) return ret;
     8952            #endif
     8953        #endif
     8954        #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
     8955            #ifndef NO_ECC_SECP
     8956                ret = TLSX_UseSupportedCurve(extensions,
     8957                                              WOLFSSL_ECC_SECP160R1, ssl->heap);
     8958                if (ret != WOLFSSL_SUCCESS) return ret;
     8959            #endif
     8960            #ifdef HAVE_ECC_SECPR2
     8961                ret = TLSX_UseSupportedCurve(extensions,
     8962                                              WOLFSSL_ECC_SECP160R2, ssl->heap);
     8963                if (ret != WOLFSSL_SUCCESS) return ret;
     8964            #endif
     8965            #ifdef HAVE_ECC_KOBLITZ
     8966                ret = TLSX_UseSupportedCurve(extensions,
     8967                                              WOLFSSL_ECC_SECP160K1, ssl->heap);
     8968                if (ret != WOLFSSL_SUCCESS) return ret;
     8969            #endif
     8970        #endif
     8971    #endif /* HAVE_FIPS */
     8972#endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */
     8973
     8974    #ifdef WOLFSSL_TLS13
     8975        if (IsAtLeastTLSv1_3(ssl->version)) {
     8976                /* Add FFDHE supported groups. */
     8977        #ifdef HAVE_FFDHE_8192
     8978                ret = TLSX_UseSupportedCurve(extensions,
     8979                                             WOLFSSL_FFDHE_8192, ssl->heap);
     8980                if (ret != WOLFSSL_SUCCESS)
     8981                    return ret;
     8982        #endif
     8983        #ifdef HAVE_FFDHE_6144
     8984                ret = TLSX_UseSupportedCurve(extensions,
     8985                                             WOLFSSL_FFDHE_6144, ssl->heap);
     8986                if (ret != WOLFSSL_SUCCESS)
     8987                    return ret;
     8988        #endif
     8989        #ifdef HAVE_FFDHE_4096
     8990                ret = TLSX_UseSupportedCurve(extensions,
     8991                                             WOLFSSL_FFDHE_4096, ssl->heap);
     8992                if (ret != WOLFSSL_SUCCESS)
     8993                    return ret;
     8994        #endif
     8995        #ifdef HAVE_FFDHE_3072
     8996                ret = TLSX_UseSupportedCurve(extensions,
     8997                                             WOLFSSL_FFDHE_3072, ssl->heap);
     8998                if (ret != WOLFSSL_SUCCESS)
     8999                    return ret;
     9000        #endif
     9001        #ifdef HAVE_FFDHE_2048
     9002                ret = TLSX_UseSupportedCurve(extensions,
     9003                                             WOLFSSL_FFDHE_2048, ssl->heap);
     9004                if (ret != WOLFSSL_SUCCESS)
     9005                    return ret;
     9006        #endif
     9007        }
     9008    #endif /* WOLFSSL_TLS13 */
     9009
     9010    (void)ssl;
     9011    (void)extensions;
     9012
     9013    return ret;
     9014}
     9015
     9016#endif
     9017
    75189018int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
    75199019{
     
    75319031    /* add supported QSHSchemes */
    75329032    WOLFSSL_MSG("Adding supported QSH Schemes");
    7533 #endif
     9033            #endif
    75349034
    75359035    /* server will add extension depending on whats parsed from client */
     
    76059105            }
    76069106        }
    7607 #endif
    7608 
    7609 #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
    7610         if (!ssl->options.userCurves && !ssl->ctx->userCurves &&
    7611                TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
    7612 
    7613     #ifndef HAVE_FIPS
    7614         #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
    7615             #ifndef NO_ECC_SECP
    7616                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7617                                               WOLFSSL_ECC_SECP160R1, ssl->heap);
    7618                 if (ret != WOLFSSL_SUCCESS) return ret;
    7619             #endif
    7620             #ifdef HAVE_ECC_SECPR2
    7621                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7622                                               WOLFSSL_ECC_SECP160R2, ssl->heap);
    7623                 if (ret != WOLFSSL_SUCCESS) return ret;
    7624             #endif
    7625             #ifdef HAVE_ECC_KOBLITZ
    7626                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7627                                               WOLFSSL_ECC_SECP160K1, ssl->heap);
    7628                 if (ret != WOLFSSL_SUCCESS) return ret;
    7629             #endif
    76309107        #endif
    7631         #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
    7632             #ifndef NO_ECC_SECP
    7633                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7634                                               WOLFSSL_ECC_SECP192R1, ssl->heap);
    7635                 if (ret != WOLFSSL_SUCCESS) return ret;
    7636             #endif
    7637             #ifdef HAVE_ECC_KOBLITZ
    7638                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7639                                               WOLFSSL_ECC_SECP192K1, ssl->heap);
    7640                 if (ret != WOLFSSL_SUCCESS) return ret;
    7641             #endif
    7642         #endif
    7643     #endif
    7644         #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
    7645             #ifndef NO_ECC_SECP
    7646                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7647                                               WOLFSSL_ECC_SECP224R1, ssl->heap);
    7648                 if (ret != WOLFSSL_SUCCESS) return ret;
    7649             #endif
    7650             #ifdef HAVE_ECC_KOBLITZ
    7651                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7652                                               WOLFSSL_ECC_SECP224K1, ssl->heap);
    7653                 if (ret != WOLFSSL_SUCCESS) return ret;
    7654             #endif
    7655         #endif
    7656         #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
    7657             #ifndef NO_ECC_SECP
    7658                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7659                                               WOLFSSL_ECC_SECP256R1, ssl->heap);
    7660                 if (ret != WOLFSSL_SUCCESS) return ret;
    7661             #endif
    7662             #if defined(HAVE_CURVE25519)
    7663                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7664                                                  WOLFSSL_ECC_X25519, ssl->heap);
    7665                 if (ret != WOLFSSL_SUCCESS) return ret;
    7666             #endif
    7667             #ifdef HAVE_ECC_KOBLITZ
    7668                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7669                                               WOLFSSL_ECC_SECP256K1, ssl->heap);
    7670                 if (ret != WOLFSSL_SUCCESS) return ret;
    7671             #endif
    7672             #ifdef HAVE_ECC_BRAINPOOL
    7673                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7674                                         WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
    7675                 if (ret != WOLFSSL_SUCCESS) return ret;
    7676             #endif
    7677         #endif
    7678         #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
    7679             #ifndef NO_ECC_SECP
    7680                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7681                                               WOLFSSL_ECC_SECP384R1, ssl->heap);
    7682                 if (ret != WOLFSSL_SUCCESS) return ret;
    7683             #endif
    7684             #ifdef HAVE_ECC_BRAINPOOL
    7685                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7686                                         WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
    7687                 if (ret != WOLFSSL_SUCCESS) return ret;
    7688             #endif
    7689         #endif
    7690         #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
    7691             #ifdef HAVE_ECC_BRAINPOOL
    7692                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7693                                         WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
    7694                 if (ret != WOLFSSL_SUCCESS) return ret;
    7695             #endif
    7696         #endif
    7697         #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
    7698             #ifndef NO_ECC_SECP
    7699                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7700                                               WOLFSSL_ECC_SECP521R1, ssl->heap);
    7701                 if (ret != WOLFSSL_SUCCESS) return ret;
    7702             #endif
    7703         #endif
    7704         }
    7705 #endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */
     9108
     9109#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \
     9110                                                  defined(HAVE_SUPPORTED_CURVES)
     9111        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
     9112            if (TLSX_Find(ssl->ctx->extensions,
     9113                                               TLSX_SUPPORTED_GROUPS) == NULL) {
     9114                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
     9115                if (ret != WOLFSSL_SUCCESS)
     9116                    return ret;
     9117        }
     9118        }
     9119        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
     9120               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
     9121               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
     9122             ret = TLSX_UsePointFormat(&ssl->extensions,
     9123                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
     9124             if (ret != WOLFSSL_SUCCESS)
     9125                 return ret;
     9126        }
     9127#endif /* (HAVE_ECC || HAVE_CURVE25519) && HAVE_SUPPORTED_CURVES */
    77069128    } /* is not server */
    77079129
     
    77179139            WOLFSSL_MSG("Adding supported versions extension");
    77189140            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
    7719                                                  ssl->heap)) != 0)
     9141                                                             ssl->heap)) != 0) {
    77209142                return ret;
    7721 
    7722 #ifdef HAVE_SUPPORTED_CURVES
    7723             if (!ssl->options.userCurves && !ssl->ctx->userCurves &&
    7724                 TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS)
    7725                                                                       == NULL) {
    7726                 /* Add FFDHE supported groups. */
    7727         #ifdef HAVE_FFDHE_2048
    7728                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7729                                              WOLFSSL_FFDHE_2048, ssl->heap);
     9143            }
     9144
     9145    #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && \
     9146                                                  defined(HAVE_SUPPORTED_CURVES)
     9147        if (TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
     9148            /* Put in DH groups for TLS 1.3 only. */
     9149            ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
    77309150                if (ret != WOLFSSL_SUCCESS)
    77319151                    return ret;
    7732         #endif
    7733         #ifdef HAVE_FFDHE_3072
    7734                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7735                                              WOLFSSL_FFDHE_3072, ssl->heap);
    7736                 if (ret != WOLFSSL_SUCCESS)
    7737                     return ret;
    7738         #endif
    7739         #ifdef HAVE_FFDHE_4096
    7740                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7741                                              WOLFSSL_FFDHE_4096, ssl->heap);
    7742                 if (ret != WOLFSSL_SUCCESS)
    7743                     return ret;
    7744         #endif
    7745         #ifdef HAVE_FFDHE_6144
    7746                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7747                                              WOLFSSL_FFDHE_6144, ssl->heap);
    7748                 if (ret != WOLFSSL_SUCCESS)
    7749                     return ret;
    7750         #endif
    7751         #ifdef HAVE_FFDHE_8192
    7752                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
    7753                                              WOLFSSL_FFDHE_8192, ssl->heap);
    7754                 if (ret != WOLFSSL_SUCCESS)
    7755                     return ret;
    7756         #endif
    77579152                ret = 0;
    77589153            }
    7759 #endif
     9154    #endif /* !HAVE_ECC && !HAVE_CURVE25519 && HAVE_SUPPORTED_CURVES */
     9155
     9156        #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     9157            if (ssl->certHashSigAlgoSz > 0) {
     9158                WOLFSSL_MSG("Adding signature algorithms cert extension");
     9159                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
     9160                                                        ssl, ssl->heap)) != 0) {
     9161                    return ret;
     9162                }
     9163            }
     9164        #endif /* !WOLFSSL_TLS13_DRAFT_18 && !WOLFSSL_TLS13_DRAFT_22 */
    77609165
    77619166            if (TLSX_Find(ssl->extensions, TLSX_KEY_SHARE) == NULL) {
    7762         #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && \
    7763             !defined(NO_ECC_SECP)
    7764                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_SECP256R1, 0, NULL,
    7765                                         NULL);
     9167                word16 namedGroup;
     9168
     9169        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     9170                if (ssl->options.resuming && ssl->session.namedGroup != 0)
     9171                    namedGroup = ssl->session.namedGroup;
     9172                else
     9173        #endif
     9174                {
     9175        #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
     9176                              defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP)
     9177                    namedGroup = WOLFSSL_ECC_SECP256R1;
    77669178        #elif defined(HAVE_CURVE25519)
    7767                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_X25519, 0, NULL, NULL);
    7768         #elif (!defined(NO_ECC384)  || defined(HAVE_ALL_CURVES)) && \
    7769               !defined(NO_ECC_SECP)
    7770                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_SECP384R1, 0, NULL,
    7771                                         NULL);
    7772         #elif (!defined(NO_ECC521)  || defined(HAVE_ALL_CURVES)) && \
    7773               !defined(NO_ECC_SECP)
    7774                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_SECP521R1, 0, NULL,
    7775                                         NULL);
     9179                    namedGroup = WOLFSSL_ECC_X25519;
     9180        #elif defined(HAVE_ECC) && (!defined(NO_ECC384) || \
     9181                              defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP)
     9182                    namedGroup = WOLFSSL_ECC_SECP384R1;
     9183        #elif defined(HAVE_ECC) && (!defined(NO_ECC521) || \
     9184                              defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP)
     9185                    namedGroup = WOLFSSL_ECC_SECP521R1;
    77769186        #elif defined(HAVE_FFDHE_2048)
    7777                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_2048, 0, NULL, NULL);
     9187                    namedGroup = WOLFSSL_FFDHE_2048;
    77789188        #elif defined(HAVE_FFDHE_3072)
    7779                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_3072, 0, NULL, NULL);
     9189                    namedGroup = WOLFSSL_FFDHE_3072;
    77809190        #elif defined(HAVE_FFDHE_4096)
    7781                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_4096, 0, NULL, NULL);
     9191                    namedGroup = WOLFSSL_FFDHE_4096;
    77829192        #elif defined(HAVE_FFDHE_6144)
    7783                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_6144, 0, NULL, NULL);
     9193                    namedGroup = WOLFSSL_FFDHE_6144;
    77849194        #elif defined(HAVE_FFDHE_8192)
    7785                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_8192, 0, NULL, NULL);
     9195                    namedGroup = WOLFSSL_FFDHE_8192;
    77869196        #else
    7787                 ret = KEY_SHARE_ERROR;
     9197                    return KEY_SHARE_ERROR;
    77889198        #endif
     9199                }
     9200                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL);
    77899201                if (ret != 0)
    77909202                    return ret;
    77919203            }
    77929204
     9205        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     9206            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
     9207        #endif
    77939208        #if defined(HAVE_SESSION_TICKET)
    7794             if (ssl->options.resuming) {
     9209            if (ssl->options.resuming && ssl->session.ticketLen > 0) {
    77959210                WOLFSSL_SESSION* sess = &ssl->session;
    77969211                word32           milli;
     
    78399254                ret = TLSX_PreSharedKey_Use(ssl,
    78409255                                          (byte*)ssl->arrays->client_identity,
    7841                                           XSTRLEN(ssl->arrays->client_identity),
     9256                                  (word16)XSTRLEN(ssl->arrays->client_identity),
    78429257                                          0, ssl->specs.mac_algorithm,
    78439258                                          cipherSuite0, cipherSuite, 0,
     
    78559270                /* Pre-shared key modes: mandatory extension for resumption. */
    78569271                modes = 1 << PSK_KE;
    7857             #if !defined(NO_DH) || defined(HAVE_ECC)
     9272            #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519)
    78589273                if (!ssl->options.noPskDheKe)
    78599274                    modes |= 1 << PSK_DHE_KE;
     
    78809295    (void)ssl;
    78819296
    7882     if (ret == WOLFSSL_SUCCESS)
    7883         ret = 0;
    7884 
    78859297    return ret;
    78869298}
    78879299
    78889300
    7889 #ifndef NO_WOLFSSL_CLIENT
     9301#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
    78909302
    78919303/** Tells the buffered size of extensions to be sent into the client hello. */
    7892 word16 TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType)
    7893 {
     9304int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word16* pLength)
     9305{
     9306    int ret = 0;
    78949307    word16 length = 0;
    78959308    byte semaphore[SEMAPHORE_SIZE] = {0};
     
    79219334    #endif
    79229335        }
     9336    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     9337        if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.noPskDheKe) {
     9338        #if !defined(NO_PSK)
     9339            if (ssl->options.havePSK)
     9340                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     9341        #endif
     9342        #if defined(HAVE_SESSION_TICKET)
     9343            if (ssl->options.resuming)
     9344                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     9345        #endif
     9346        }
     9347    #endif
    79239348#endif
    79249349    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
     
    79369361        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    79379362        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
    7938         TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
    79399363        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
    79409364         *       TLSX_CERTIFICATE_AUTHORITIES, OID_FILTERS
     9365         *       TLSX_STATUS_REQUEST
    79419366         */
    79429367    }
     
    79459370
    79469371    if (ssl->extensions)
    7947         length += TLSX_GetSize(ssl->extensions, semaphore, msgType);
     9372        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
    79489373    if (ssl->ctx && ssl->ctx->extensions)
    7949         length += TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType);
     9374        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, &length);
    79509375
    79519376#ifdef HAVE_EXTENDED_MASTER
    79529377    if (msgType == client_hello && ssl->options.haveEMS &&
    7953                                               !IsAtLeastTLSv1_3(ssl->version)) {
     9378                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
    79549379        length += HELLO_EXT_SZ;
    79559380    }
     
    79599384        length += OPAQUE16_LEN; /* for total length storage. */
    79609385
    7961     return length;
     9386    *pLength += length;
     9387
     9388    return ret;
    79629389}
    79639390
    79649391/** Writes the extensions to be sent into the client hello. */
    7965 word16 TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType)
    7966 {
     9392int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word16* pOffset)
     9393{
     9394    int ret = 0;
    79679395    word16 offset = 0;
    79689396    byte semaphore[SEMAPHORE_SIZE] = {0};
     
    79979425        }
    79989426    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     9427        if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.noPskDheKe) {
     9428        #if !defined(NO_PSK)
     9429            if (ssl->options.havePSK)
     9430                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     9431        #endif
     9432        #if defined(HAVE_SESSION_TICKET)
     9433            if (ssl->options.resuming)
     9434                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     9435        #endif
     9436        }
     9437    #endif
     9438    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    79999439        /* Must write Pre-shared Key extension at the end in TLS v1.3.
    80009440         * Must not write out Pre-shared Key extension in earlier versions of
     
    80189458        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    80199459        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
    8020         TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
    80219460        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
    80229461         *       TLSX_CERTIFICATE_AUTHORITIES, TLSX_OID_FILTERS
     9462         *       TLSX_STATUS_REQUEST
    80239463         */
    80249464    }
     
    80279467
    80289468    if (ssl->extensions) {
    8029         offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
    8030                              msgType);
     9469        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
     9470                         msgType, &offset);
    80319471    }
    80329472    if (ssl->ctx && ssl->ctx->extensions) {
    8033         offset += TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
    8034                              msgType);
     9473        ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
     9474                         msgType, &offset);
    80359475    }
    80369476
    80379477#ifdef HAVE_EXTENDED_MASTER
    80389478    if (msgType == client_hello && ssl->options.haveEMS &&
    8039                                               !IsAtLeastTLSv1_3(ssl->version)) {
     9479                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
     9480        WOLFSSL_MSG("EMS extension to write");
    80409481        c16toa(HELLO_EXT_EXTMS, output + offset);
    80419482        offset += HELLO_EXT_TYPE_SZ;
     
    80509491        /* Write out what we can of Pre-shared key extension.  */
    80519492        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
    8052         offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
    8053                              client_hello);
     9493        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
     9494                         client_hello, &offset);
    80549495    }
    80559496    #endif
     
    80599500        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
    80609501
    8061     return offset;
    8062 }
    8063 
    8064 #endif /* NO_WOLFSSL_CLIENT */
    8065 
    8066 #ifndef NO_WOLFSSL_SERVER
     9502     *pOffset += offset;
     9503
     9504    return ret;
     9505}
     9506
     9507#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
     9508
     9509#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
    80679510
    80689511/** Tells the buffered size of extensions to be sent into the server hello. */
    8069 word16 TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType)
    8070 {
     9512int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
     9513{
     9514    int ret = 0;
    80719515    word16 length = 0;
    80729516    byte semaphore[SEMAPHORE_SIZE] = {0};
    80739517
    80749518    switch (msgType) {
     9519#ifndef NO_WOLFSSL_SERVER
    80759520        case server_hello:
    80769521            PF_VALIDATE_RESPONSE(ssl, semaphore);
     
    80789523                if (ssl->options.tls1_3) {
    80799524                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
     9525        #ifndef WOLFSSL_TLS13_DRAFT_18
     9526                    TURN_OFF(semaphore,
     9527                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
     9528        #endif
     9529                    if (!ssl->options.noPskDheKe)
    80809530                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
    80819531    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     
    80839533    #endif
    80849534                }
     9535                else {
     9536                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     9537        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     9538                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
     9539        #endif
     9540                }
    80859541#endif
    80869542            break;
     9543
    80879544#ifdef WOLFSSL_TLS13
    80889545        case hello_retry_request:
    80899546            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
     9547        #ifndef WOLFSSL_TLS13_DRAFT_18
     9548                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
     9549        #endif
     9550            if (!ssl->options.noPskDheKe)
    80909551            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
    80919552            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
    8092 #endif
    80939553            break;
     9554    #endif
     9555
    80949556#ifdef WOLFSSL_TLS13
    80959557        case encrypted_extensions:
     9558            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
     9559            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
    80969560            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
    80979561            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     
    80999563            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
    81009564    #endif
     9565        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
     9566            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
     9567        #endif
    81019568            break;
     9569
    81029570    #ifdef WOLFSSL_EARLY_DATA
    81039571        case session_ticket:
     
    81089576            break;
    81099577    #endif
     9578    #endif
     9579#endif
     9580
     9581#ifdef WOLFSSL_TLS13
    81109582    #ifndef NO_CERT
    81119583        case certificate:
     
    81309602
    81319603#ifdef HAVE_EXTENDED_MASTER
    8132     if (ssl->options.haveEMS && msgType == server_hello)
     9604    if (ssl->options.haveEMS && msgType == server_hello &&
     9605                                              !IsAtLeastTLSv1_3(ssl->version)) {
    81339606        length += HELLO_EXT_SZ;
     9607    }
    81349608#endif
    81359609
    81369610    if (TLSX_SupportExtensions(ssl))
    8137         length += TLSX_GetSize(ssl->extensions, semaphore, msgType);
     9611        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
    81389612
    81399613    /* All the response data is set at the ssl object only, so no ctx here. */
     
    81429616        length += OPAQUE16_LEN; /* for total length storage. */
    81439617
    8144     return length;
     9618    *pLength += length;
     9619
     9620    return ret;
    81459621}
    81469622
    81479623/** Writes the server hello extensions into a buffer. */
    8148 word16 TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType)
    8149 {
     9624int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
     9625{
     9626    int ret = 0;
    81509627    word16 offset = 0;
    81519628
     
    81549631
    81559632        switch (msgType) {
     9633#ifndef NO_WOLFSSL_SERVER
    81569634            case server_hello:
    81579635                PF_VALIDATE_RESPONSE(ssl, semaphore);
     
    81599637                if (ssl->options.tls1_3) {
    81609638                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
     9639        #ifndef WOLFSSL_TLS13_DRAFT_18
     9640                    TURN_OFF(semaphore,
     9641                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
     9642        #endif
     9643                    if (!ssl->options.noPskDheKe)
    81619644                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
    81629645    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     
    81649647    #endif
    81659648                }
    8166 #endif
    8167                 break;
     9649                else {
     9650                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     9651        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     9652                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
     9653        #endif
     9654                }
     9655#endif
     9656                break;
     9657
    81689658#ifdef WOLFSSL_TLS13
    81699659            case hello_retry_request:
    81709660                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    8171                 TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
    8172 #endif
    8173                 break;
     9661        #ifndef WOLFSSL_TLS13_DRAFT_18
     9662                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
     9663#endif
     9664                if (!ssl->options.noPskDheKe)
     9665                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     9666                /* Cookie is written below as last extension. */
     9667                break;
     9668    #endif
     9669
    81749670#ifdef WOLFSSL_TLS13
    81759671            case encrypted_extensions:
     9672                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
     9673                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
    81769674                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
    81779675                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
     
    81799677                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
    81809678    #endif
    8181                 break;
     9679        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
     9680                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
     9681        #endif
     9682                break;
     9683
     9684        #ifdef WOLFSSL_EARLY_DATA
     9685            case session_ticket:
     9686                if (ssl->options.tls1_3) {
     9687                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
     9688                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
     9689                }
     9690                break;
     9691        #endif
     9692    #endif
     9693#endif
     9694
     9695    #ifdef WOLFSSL_TLS13
    81829696    #ifndef NO_CERTS
    81839697            case certificate:
     
    81899703                break;
    81909704    #endif
    8191     #ifdef WOLFSSL_EARLY_DATA
    8192             case session_ticket:
    8193                 if (ssl->options.tls1_3) {
    8194                     XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    8195                     TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
    8196                 }
    8197                 break;
    8198     #endif
    81999705#endif
    82009706        }
     
    82029708        offset += OPAQUE16_LEN; /* extensions length */
    82039709
    8204         offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
    8205                              msgType);
     9710        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
     9711                         msgType, &offset);
    82069712
    82079713#ifdef WOLFSSL_TLS13
     
    82099715            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
    82109716            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
    8211             offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
    8212                                  msgType);
     9717            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
     9718                             msgType, &offset);
    82139719        }
    82149720#endif
    82159721
    82169722#ifdef HAVE_EXTENDED_MASTER
    8217         if (ssl->options.haveEMS && msgType == server_hello) {
     9723        if (ssl->options.haveEMS && msgType == server_hello &&
     9724                                              !IsAtLeastTLSv1_3(ssl->version)) {
     9725            WOLFSSL_MSG("EMS extension to write");
    82189726            c16toa(HELLO_EXT_EXTMS, output + offset);
    82199727            offset += HELLO_EXT_TYPE_SZ;
     
    82279735    }
    82289736
    8229     return offset;
    8230 }
    8231 
    8232 #endif /* NO_WOLFSSL_SERVER */
     9737    if (pOffset)
     9738        *pOffset += offset;
     9739
     9740    return ret;
     9741}
     9742
     9743#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
    82339744
    82349745/** Parses a buffer of TLS extensions. */
     
    82409751    byte isRequest = (msgType == client_hello ||
    82419752                      msgType == certificate_request);
     9753
    82429754#ifdef HAVE_EXTENDED_MASTER
    82439755    byte pendingEMS = 0;
     9756#endif
     9757#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
     9758    int pskDone = 0;
    82449759#endif
    82459760
     
    82519766        word16 size;
    82529767
     9768#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
     9769        if (msgType == client_hello && pskDone)
     9770            return PSK_KEY_ERROR;
     9771#endif
     9772
    82539773        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
    82549774            return BUFFER_ERROR;
     
    82689788
    82699789#ifdef WOLFSSL_TLS13
    8270                 if (IsAtLeastTLSv1_3(ssl->version) &&
     9790                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
    82719791                        msgType != client_hello &&
    82729792                        msgType != encrypted_extensions) {
    82739793                    return EXT_NOT_ALLOWED;
    82749794                }
     9795                else if (!IsAtLeastTLSv1_3(ssl->version) &&
     9796                         msgType == encrypted_extensions) {
     9797                    return EXT_NOT_ALLOWED;
     9798                }
    82759799#endif
    82769800                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
     
    82819805
    82829806#ifdef WOLFSSL_TLS13
    8283                 if (IsAtLeastTLSv1_3(ssl->version) &&
     9807                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
    82849808                        msgType != client_hello &&
    82859809                        msgType != encrypted_extensions) {
    82869810                    return EXT_NOT_ALLOWED;
    82879811                }
     9812                else if (!IsAtLeastTLSv1_3(ssl->version) &&
     9813                         msgType == encrypted_extensions) {
     9814                    return EXT_NOT_ALLOWED;
     9815                }
    82889816#endif
    82899817                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
     
    82949822
    82959823#ifdef WOLFSSL_TLS13
    8296                 if (IsAtLeastTLSv1_3(ssl->version))
    8297                     return EXT_NOT_ALLOWED;
     9824                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
     9825                        !ssl->options.downgrade) {
     9826                    break;
     9827                }
    82989828#endif
    82999829                ret = THM_PARSE(ssl, input + offset, size, isRequest);
     
    83019831
    83029832            case TLSX_SUPPORTED_GROUPS:
    8303                 WOLFSSL_MSG("Elliptic Curves extension received");
     9833                WOLFSSL_MSG("Supported Groups extension received");
    83049834
    83059835#ifdef WOLFSSL_TLS13
    8306                 if (IsAtLeastTLSv1_3(ssl->version) &&
     9836                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
    83079837                        msgType != client_hello &&
    83089838                        msgType != encrypted_extensions) {
    83099839                    return EXT_NOT_ALLOWED;
    83109840                }
     9841                else if (!IsAtLeastTLSv1_3(ssl->version) &&
     9842                         msgType == encrypted_extensions) {
     9843                    return EXT_NOT_ALLOWED;
     9844                }
    83119845#endif
    83129846                ret = EC_PARSE(ssl, input + offset, size, isRequest);
     
    83179851
    83189852#ifdef WOLFSSL_TLS13
    8319                 if (IsAtLeastTLSv1_3(ssl->version) &&
    8320                         msgType != client_hello &&
    8321                         msgType != encrypted_extensions) {
    8322                     return EXT_NOT_ALLOWED;
     9853                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
     9854                        !ssl->options.downgrade) {
     9855                    break;
    83239856                }
    83249857#endif
     
    83309863
    83319864#ifdef WOLFSSL_TLS13
    8332                 if (IsAtLeastTLSv1_3(ssl->version) &&
    8333                         msgType != client_hello &&
    8334                         msgType != encrypted_extensions) {
    8335                     return EXT_NOT_ALLOWED;
     9865                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
     9866                        !ssl->options.downgrade) {
     9867                    break;
    83369868                }
    83379869#endif
     
    83439875
    83449876#ifdef WOLFSSL_TLS13
    8345                 if (IsAtLeastTLSv1_3(ssl->version) &&
     9877                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
    83469878                        msgType != client_hello &&
    8347                         msgType != encrypted_extensions) {
     9879                        msgType != certificate_request &&
     9880                        msgType != certificate) {
    83489881                    return EXT_NOT_ALLOWED;
    83499882                }
     
    83559888            case HELLO_EXT_EXTMS:
    83569889                WOLFSSL_MSG("Extended Master Secret extension received");
     9890
     9891#ifdef WOLFSSL_TLS13
     9892                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
     9893                        !ssl->options.downgrade) {
     9894                    break;
     9895                }
     9896#endif
     9897#ifndef NO_WOLFSSL_SERVER
     9898                if (isRequest)
     9899                    ssl->options.haveEMS = 1;
     9900#endif
     9901                pendingEMS = 1;
     9902                break;
     9903#endif
     9904
     9905            case TLSX_RENEGOTIATION_INFO:
     9906                WOLFSSL_MSG("Secure Renegotiation extension received");
     9907
     9908#ifdef WOLFSSL_TLS13
     9909                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
     9910                        !ssl->options.downgrade) {
     9911                    break;
     9912                }
     9913#endif
     9914                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
     9915                break;
     9916
     9917            case TLSX_SESSION_TICKET:
     9918                WOLFSSL_MSG("Session Ticket extension received");
    83579919
    83589920#ifdef WOLFSSL_TLS13
     
    83629924                }
    83639925#endif
    8364 #ifndef NO_WOLFSSL_SERVER
    8365                 if (isRequest && !IsAtLeastTLSv1_3(ssl->version))
    8366                     ssl->options.haveEMS = 1;
    8367 #endif
    8368                 pendingEMS = 1;
    8369                 break;
    8370 #endif
    8371 
    8372             case TLSX_RENEGOTIATION_INFO:
    8373                 WOLFSSL_MSG("Secure Renegotiation extension received");
    8374 
    8375                 ret = SCR_PARSE(ssl, input + offset, size, isRequest);
    8376                 break;
    8377 
    8378             case TLSX_SESSION_TICKET:
    8379                 WOLFSSL_MSG("Session Ticket extension received");
    8380 
    8381 #ifdef WOLFSSL_TLS13
    8382                 if (IsAtLeastTLSv1_3(ssl->version) &&
    8383                         msgType != client_hello) {
    8384                     return EXT_NOT_ALLOWED;
    8385                 }
    8386 #endif
    83879926                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
    83889927                break;
     
    83929931
    83939932#ifdef WOLFSSL_TLS13
    8394                 if (IsAtLeastTLSv1_3(ssl->version))
    8395                     return EXT_NOT_ALLOWED;
     9933                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
     9934                        !ssl->options.downgrade) {
     9935                    break;
     9936                }
    83969937#endif
    83979938                ret = QSH_PARSE(ssl, input + offset, size, isRequest);
     
    84029943
    84039944#ifdef WOLFSSL_TLS13
    8404                 if (IsAtLeastTLSv1_3(ssl->version) &&
     9945                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
    84059946                        msgType != client_hello &&
     9947                        msgType != server_hello &&
    84069948                        msgType != encrypted_extensions) {
    84079949                    return EXT_NOT_ALLOWED;
    84089950                }
     9951                else if (!IsAtLeastTLSv1_3(ssl->version) &&
     9952                         msgType == encrypted_extensions) {
     9953                    return EXT_NOT_ALLOWED;
     9954                }
    84099955#endif
    84109956                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
     
    84179963                    break;
    84189964
    8419                 if (IsAtLeastTLSv1_3(ssl->version) &&
     9965#ifdef WOLFSSL_TLS13
     9966                if (IsAtLeastTLSv1_3(ssl->ctx->method->version) &&
    84209967                        msgType != client_hello &&
    84219968                        msgType != certificate_request) {
    84229969                    return EXT_NOT_ALLOWED;
    84239970                }
    8424                 ret = SA_PARSE(ssl, input + offset, size, suites);
     9971#endif
     9972                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
    84259973                break;
    84269974
     
    84299977                WOLFSSL_MSG("Supported Versions extension received");
    84309978
    8431                 if (IsAtLeastTLSv1_3(ssl->version) &&
    8432                         msgType != client_hello) {
     9979                if (!IsAtLeastTLSv1_3(ssl->ctx->method->version))
     9980                    break;
     9981
     9982                if (
     9983    #ifdef WOLFSSL_TLS13_DRAFT_18
     9984                        msgType != client_hello
     9985    #else
     9986                        msgType != client_hello &&
     9987                        msgType != server_hello &&
     9988                        msgType != hello_retry_request
     9989    #endif
     9990                   ) {
    84339991                    return EXT_NOT_ALLOWED;
    84349992                }
    8435                 ret = SV_PARSE(ssl, input + offset, size);
     9993                ret = SV_PARSE(ssl, input + offset, size, msgType);
    84369994                break;
    84379995
     
    84399997                WOLFSSL_MSG("Cookie extension received");
    84409998
    8441                 if (!IsAtLeastTLSv1_3(ssl->version))
     9999                if (!IsAtLeastTLSv1_3(ssl->ctx->method->version))
    844210000                    break;
    844310001
    8444                 if (IsAtLeastTLSv1_3(ssl->version) &&
    8445                         msgType != client_hello &&
     10002                if (msgType != client_hello &&
    844610003                        msgType != hello_retry_request) {
    844710004                    return EXT_NOT_ALLOWED;
    844810005                }
     10006
    844910007                ret = CKE_PARSE(ssl, input + offset, size, msgType);
    845010008                break;
     10009
     10010    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
     10011            case TLSX_PRE_SHARED_KEY:
     10012                WOLFSSL_MSG("Pre-Shared Key extension received");
     10013
     10014                if (!IsAtLeastTLSv1_3(ssl->ctx->method->version))
     10015                    break;
     10016
     10017                if (msgType != client_hello && msgType != server_hello)
     10018                    return EXT_NOT_ALLOWED;
     10019
     10020                ret = PSK_PARSE(ssl, input + offset, size, msgType);
     10021                pskDone = 1;
     10022                break;
     10023
     10024            case TLSX_PSK_KEY_EXCHANGE_MODES:
     10025                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
     10026
     10027                if (!IsAtLeastTLSv1_3(ssl->ctx->method->version))
     10028                    break;
     10029
     10030                if (msgType != client_hello)
     10031                    return EXT_NOT_ALLOWED;
     10032
     10033                ret = PKM_PARSE(ssl, input + offset, size, msgType);
     10034                break;
     10035    #endif
     10036
     10037    #ifdef WOLFSSL_EARLY_DATA
     10038            case TLSX_EARLY_DATA:
     10039                WOLFSSL_MSG("Early Data extension received");
     10040
     10041                if (!IsAtLeastTLSv1_3(ssl->ctx->method->version))
     10042                    break;
     10043
     10044                if (msgType != client_hello && msgType != session_ticket &&
     10045                         msgType != encrypted_extensions) {
     10046                    return EXT_NOT_ALLOWED;
     10047                }
     10048                if (!IsAtLeastTLSv1_3(ssl->version) &&
     10049                        (msgType == session_ticket ||
     10050                         msgType == encrypted_extensions)) {
     10051                    return EXT_NOT_ALLOWED;
     10052                }
     10053                ret = EDI_PARSE(ssl, input + offset, size, msgType);
     10054                break;
     10055    #endif
     10056
     10057    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
     10058            case TLSX_POST_HANDSHAKE_AUTH:
     10059                WOLFSSL_MSG("Post Handshake Authentication extension received");
     10060
     10061                if (!IsAtLeastTLSv1_3(ssl->ctx->method->version))
     10062                    break;
     10063
     10064                if (msgType != client_hello)
     10065                    return EXT_NOT_ALLOWED;
     10066
     10067                ret = PHA_PARSE(ssl, input + offset, size, msgType);
     10068                break;
     10069    #endif
     10070
     10071    #if !defined(WOLFSSL_TLS13_DRAFT_18) && !defined(WOLFSSL_TLS13_DRAFT_22)
     10072            case TLSX_SIGNATURE_ALGORITHMS_CERT:
     10073                WOLFSSL_MSG("Signature Algorithms extension received");
     10074
     10075                if (!IsAtLeastTLSv1_3(ssl->ctx->method->version))
     10076                    break;
     10077
     10078                if (msgType != client_hello &&
     10079                        msgType != certificate_request) {
     10080                    return EXT_NOT_ALLOWED;
     10081                }
     10082                if (!IsAtLeastTLSv1_3(ssl->version) &&
     10083                        msgType == certificate_request) {
     10084                    return EXT_NOT_ALLOWED;
     10085                }
     10086
     10087                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
     10088                break;
     10089    #endif
    845110090
    845210091            case TLSX_KEY_SHARE:
    845310092                WOLFSSL_MSG("Key Share extension received");
    845410093
    8455                 if (!IsAtLeastTLSv1_3(ssl->version))
     10094                if (!IsAtLeastTLSv1_3(ssl->ctx->method->version))
    845610095                    break;
    845710096
    8458                 if (IsAtLeastTLSv1_3(ssl->version) &&
    8459                         msgType != client_hello && msgType != server_hello &&
     10097                if (msgType != client_hello && msgType != server_hello &&
    846010098                        msgType != hello_retry_request) {
    846110099                    return EXT_NOT_ALLOWED;
     
    846310101                ret = KS_PARSE(ssl, input + offset, size, msgType);
    846410102                break;
    8465 
    8466     #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
    8467             case TLSX_PRE_SHARED_KEY:
    8468                 WOLFSSL_MSG("Pre-Shared Key extension received");
    8469 
    8470                 if (!IsAtLeastTLSv1_3(ssl->version))
    8471                     break;
    8472 
    8473                 if (IsAtLeastTLSv1_3(ssl->version) &&
    8474                         msgType != client_hello && msgType != server_hello) {
    8475                     return EXT_NOT_ALLOWED;
    8476                 }
    8477                 ret = PSK_PARSE(ssl, input + offset, size, msgType);
    8478                 break;
    8479 
    8480             case TLSX_PSK_KEY_EXCHANGE_MODES:
    8481                 WOLFSSL_MSG("PSK Key Exchange Modes extension received");
    8482 
    8483                 if (!IsAtLeastTLSv1_3(ssl->version))
    8484                     break;
    8485 
    8486                 if (IsAtLeastTLSv1_3(ssl->version) &&
    8487                         msgType != client_hello) {
    8488                     return EXT_NOT_ALLOWED;
    8489                 }
    8490                 ret = PKM_PARSE(ssl, input + offset, size, msgType);
    8491                 break;
    8492     #endif
    8493 
    8494     #ifdef WOLFSSL_EARLY_DATA
    8495             case TLSX_EARLY_DATA:
    8496                 WOLFSSL_MSG("Early Data extension received");
    8497 
    8498                 if (!IsAtLeastTLSv1_3(ssl->version))
    8499                     break;
    8500 
    8501                 if (IsAtLeastTLSv1_3(ssl->version) &&
    8502                          msgType != client_hello && msgType != session_ticket &&
    8503                          msgType != encrypted_extensions) {
    8504                     return EXT_NOT_ALLOWED;
    8505                 }
    8506                 ret = EDI_PARSE(ssl, input + offset, size, msgType);
    8507                 break;
    8508     #endif
    8509 
    8510     #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
    8511             case TLSX_POST_HANDSHAKE_AUTH:
    8512                 WOLFSSL_MSG("PSK Key Exchange Modes extension received");
    8513 
    8514                 if (!IsAtLeastTLSv1_3(ssl->version))
    8515                     break;
    8516 
    8517                 if (IsAtLeastTLSv1_3(ssl->version) &&
    8518                         msgType != client_hello) {
    8519                     return EXT_NOT_ALLOWED;
    8520                 }
    8521                 ret = PHA_PARSE(ssl, input + offset, size, msgType);
    8522                 break;
    8523     #endif
    852410103#endif
    852510104        }
     
    855010129
    855110130#ifndef NO_OLD_TLS
    8552 
     10131    #ifdef WOLFSSL_ALLOW_TLSV10
    855310132    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
    855410133    {
    855510134        return wolfTLSv1_client_method_ex(NULL);
    855610135    }
    8557 
    8558 
    8559     WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
    8560     {
    8561         return wolfTLSv1_1_client_method_ex(NULL);
    8562     }
    8563 
    856410136    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
    856510137    {
     
    856710139                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
    856810140                                                     heap, DYNAMIC_TYPE_METHOD);
     10141        (void)heap;
     10142        WOLFSSL_ENTER("TLSv1_client_method_ex");
    856910143        if (method)
    857010144            InitSSL_Method(method, MakeTLSv1());
    857110145        return method;
    857210146    }
    8573 
    8574 
     10147    #endif /* WOLFSSL_ALLOW_TLSV10 */
     10148
     10149    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
     10150    {
     10151        return wolfTLSv1_1_client_method_ex(NULL);
     10152    }
    857510153    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
    857610154    {
     
    857810156                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
    857910157                                                     heap, DYNAMIC_TYPE_METHOD);
     10158        (void)heap;
     10159        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
    858010160        if (method)
    858110161            InitSSL_Method(method, MakeTLSv1_1());
    858210162        return method;
    858310163    }
    8584 
    858510164#endif /* !NO_OLD_TLS */
    858610165
    8587 
     10166#ifndef WOLFSSL_NO_TLS12
    858810167    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
    858910168    {
    859010169        return wolfTLSv1_2_client_method_ex(NULL);
    859110170    }
    8592 
    859310171    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
    859410172    {
     
    859710175                                                     heap, DYNAMIC_TYPE_METHOD);
    859810176        (void)heap;
     10177        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
    859910178        if (method)
    860010179            InitSSL_Method(method, MakeTLSv1_2());
    860110180        return method;
    860210181    }
     10182#endif /* WOLFSSL_NO_TLS12 */
    860310183
    860410184#ifdef WOLFSSL_TLS13
     
    862310203                                         DYNAMIC_TYPE_METHOD);
    862410204        (void)heap;
     10205        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
    862510206        if (method)
    862610207            InitSSL_Method(method, MakeTLSv1_3());
     
    862910210#endif /* WOLFSSL_TLS13 */
    863010211
    8631 
    8632     WOLFSSL_METHOD* wolfSSLv23_client_method(void)
     10212#ifdef WOLFSSL_DTLS
     10213
     10214    WOLFSSL_METHOD* wolfDTLS_client_method(void)
    863310215    {
    8634         return wolfSSLv23_client_method_ex(NULL);
    8635     }
    8636 
    8637 
    8638     WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
     10216        return wolfDTLS_client_method_ex(NULL);
     10217    }
     10218    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
    863910219    {
    864010220        WOLFSSL_METHOD* method =
     
    864210222                                                     heap, DYNAMIC_TYPE_METHOD);
    864310223        (void)heap;
     10224        WOLFSSL_ENTER("DTLS_client_method_ex");
    864410225        if (method) {
    8645 #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
    8646 #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NGINX)
    8647             InitSSL_Method(method, MakeTLSv1_3());
     10226        #if !defined(WOLFSSL_NO_TLS12)
     10227            InitSSL_Method(method, MakeDTLSv1_2());
     10228        #elif !defined(NO_OLD_TLS)
     10229            InitSSL_Method(method, MakeDTLSv1());
    864810230#else
    8649             InitSSL_Method(method, MakeTLSv1_2());
    8650 #endif
    8651 #else
     10231            #error No DTLS version enabled!
     10232    #endif
     10233
     10234            method->downgrade = 1;
     10235            method->side      = WOLFSSL_CLIENT_END;
     10236        }
     10237        return method;
     10238    }
     10239
    865210240    #ifndef NO_OLD_TLS
    8653             InitSSL_Method(method, MakeTLSv1_1());
    8654     #endif
    8655 #endif
     10241    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
     10242    {
     10243        return wolfDTLSv1_client_method_ex(NULL);
     10244    }
     10245    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
     10246    {
     10247        WOLFSSL_METHOD* method =
     10248                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
     10249                                                 heap, DYNAMIC_TYPE_METHOD);
     10250        (void)heap;
     10251        WOLFSSL_ENTER("DTLSv1_client_method_ex");
     10252        if (method)
     10253            InitSSL_Method(method, MakeDTLSv1());
     10254        return method;
     10255    }
     10256    #endif  /* NO_OLD_TLS */
     10257
     10258    #ifndef WOLFSSL_NO_TLS12
     10259    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
     10260    {
     10261        return wolfDTLSv1_2_client_method_ex(NULL);
     10262    }
     10263    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
     10264    {
     10265        WOLFSSL_METHOD* method =
     10266                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
     10267                                                 heap, DYNAMIC_TYPE_METHOD);
     10268        (void)heap;
     10269        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
     10270        if (method)
     10271            InitSSL_Method(method, MakeDTLSv1_2());
     10272        (void)heap;
     10273        return method;
     10274    }
     10275    #endif /* !WOLFSSL_NO_TLS12 */
     10276#endif /* WOLFSSL_DTLS */
     10277
     10278#endif /* NO_WOLFSSL_CLIENT */
     10279
     10280
     10281/* EITHER SIDE METHODS */
     10282#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
    865610283#ifndef NO_OLD_TLS
    8657             method->downgrade = 1;
    8658 #endif
    8659         }
    8660         return method;
    8661     }
    8662 
    8663 #endif /* NO_WOLFSSL_CLIENT */
    8664 
     10284    #ifdef WOLFSSL_ALLOW_TLSV10
     10285    /* Gets a WOLFSL_METHOD type that is not set as client or server
     10286     *
     10287     * Returns a pointer to a WOLFSSL_METHOD struct
     10288     */
     10289    WOLFSSL_METHOD* wolfTLSv1_method(void)
     10290    {
     10291        return wolfTLSv1_method_ex(NULL);
     10292    }
     10293    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
     10294    {
     10295        WOLFSSL_METHOD* m;
     10296        WOLFSSL_ENTER("TLSv1_method");
     10297    #ifndef NO_WOLFSSL_CLIENT
     10298        m = wolfTLSv1_client_method_ex(heap);
     10299    #else
     10300        m = wolfTLSv1_server_method_ex(heap);
     10301    #endif
     10302        if (m != NULL) {
     10303            m->side = WOLFSSL_NEITHER_END;
     10304        }
     10305
     10306        return m;
     10307    }
     10308    #endif /* WOLFSSL_ALLOW_TLSV10 */
     10309
     10310    /* Gets a WOLFSL_METHOD type that is not set as client or server
     10311     *
     10312     * Returns a pointer to a WOLFSSL_METHOD struct
     10313     */
     10314    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
     10315    {
     10316        return wolfTLSv1_1_method_ex(NULL);
     10317    }
     10318    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
     10319    {
     10320        WOLFSSL_METHOD* m;
     10321        WOLFSSL_ENTER("TLSv1_1_method");
     10322    #ifndef NO_WOLFSSL_CLIENT
     10323        m = wolfTLSv1_1_client_method_ex(heap);
     10324    #else
     10325        m = wolfTLSv1_1_server_method_ex(heap);
     10326    #endif
     10327        if (m != NULL) {
     10328            m->side = WOLFSSL_NEITHER_END;
     10329        }
     10330        return m;
     10331    }
     10332    #endif /* !NO_OLD_TLS */
     10333
     10334    #ifndef WOLFSSL_NO_TLS12
     10335    /* Gets a WOLFSL_METHOD type that is not set as client or server
     10336     *
     10337     * Returns a pointer to a WOLFSSL_METHOD struct
     10338     */
     10339    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
     10340    {
     10341        return wolfTLSv1_2_method_ex(NULL);
     10342    }
     10343    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
     10344    {
     10345        WOLFSSL_METHOD* m;
     10346        WOLFSSL_ENTER("TLSv1_2_method");
     10347    #ifndef NO_WOLFSSL_CLIENT
     10348        m = wolfTLSv1_2_client_method_ex(heap);
     10349    #else
     10350        m = wolfTLSv1_2_server_method_ex(heap);
     10351    #endif
     10352        if (m != NULL) {
     10353            m->side = WOLFSSL_NEITHER_END;
     10354    }
     10355        return m;
     10356    }
     10357    #endif /* !WOLFSSL_NO_TLS12 */
     10358
     10359#ifdef WOLFSSL_DTLS
     10360    WOLFSSL_METHOD* wolfDTLS_method(void)
     10361    {
     10362        return wolfDTLS_method_ex(NULL);
     10363    }
     10364    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
     10365    {
     10366        WOLFSSL_METHOD* m;
     10367        WOLFSSL_ENTER("DTLS_method_ex");
     10368    #ifndef NO_WOLFSSL_CLIENT
     10369        m = wolfDTLS_client_method_ex(heap);
     10370    #else
     10371        m = wolfDTLS_server_method_ex(heap);
     10372    #endif
     10373        if (m != NULL) {
     10374            m->side = WOLFSSL_NEITHER_END;
     10375        }
     10376        return m;
     10377    }
     10378
     10379    #ifndef NO_OLD_TLS
     10380    WOLFSSL_METHOD* wolfDTLSv1_method(void)
     10381    {
     10382        return wolfDTLSv1_method_ex(NULL);
     10383    }
     10384    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
     10385    {
     10386        WOLFSSL_METHOD* m;
     10387        WOLFSSL_ENTER("DTLSv1_method_ex");
     10388    #ifndef NO_WOLFSSL_CLIENT
     10389        m = wolfDTLSv1_client_method_ex(heap);
     10390    #else
     10391        m = wolfDTLSv1_server_method_ex(heap);
     10392    #endif
     10393        if (m != NULL) {
     10394            m->side = WOLFSSL_NEITHER_END;
     10395        }
     10396        return m;
     10397    }
     10398    #endif /* !NO_OLD_TLS */
     10399    #ifndef WOLFSSL_NO_TLS12
     10400    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
     10401    {
     10402        return wolfDTLSv1_2_method_ex(NULL);
     10403    }
     10404    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
     10405    {
     10406        WOLFSSL_METHOD* m;
     10407        WOLFSSL_ENTER("DTLSv1_2_method");
     10408    #ifndef NO_WOLFSSL_CLIENT
     10409        m = wolfDTLSv1_2_client_method_ex(heap);
     10410    #else
     10411        m = wolfDTLSv1_2_server_method_ex(heap);
     10412    #endif
     10413        if (m != NULL) {
     10414            m->side = WOLFSSL_NEITHER_END;
     10415        }
     10416        return m;
     10417    }
     10418    #endif /* !WOLFSSL_NO_TLS12 */
     10419#endif /* WOLFSSL_DTLS */
     10420#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
    866510421
    866610422
     
    866810424
    866910425#ifndef NO_OLD_TLS
    8670 
     10426    #ifdef WOLFSSL_ALLOW_TLSV10
    867110427    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
    867210428    {
    867310429        return wolfTLSv1_server_method_ex(NULL);
    867410430    }
    8675 
    8676 
    8677     WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
    8678     {
    8679         return wolfTLSv1_1_server_method_ex(NULL);
    8680     }
    8681 
    868210431    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
    868310432    {
     
    868510434                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
    868610435                                                     heap, DYNAMIC_TYPE_METHOD);
     10436        (void)heap;
     10437        WOLFSSL_ENTER("TLSv1_server_method_ex");
    868710438        if (method) {
    868810439            InitSSL_Method(method, MakeTLSv1());
     
    869110442        return method;
    869210443    }
    8693 
    8694 
     10444    #endif /* WOLFSSL_ALLOW_TLSV10 */
     10445
     10446    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
     10447    {
     10448        return wolfTLSv1_1_server_method_ex(NULL);
     10449    }
    869510450    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
    869610451    {
     
    869810453                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
    869910454                                                     heap, DYNAMIC_TYPE_METHOD);
     10455        (void)heap;
     10456        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
    870010457        if (method) {
    870110458            InitSSL_Method(method, MakeTLSv1_1());
     
    870710464
    870810465
     10466#ifndef WOLFSSL_NO_TLS12
    870910467    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
    871010468    {
    871110469        return wolfTLSv1_2_server_method_ex(NULL);
    871210470    }
    8713 
    871410471    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
    871510472    {
     
    871810475                                                     heap, DYNAMIC_TYPE_METHOD);
    871910476        (void)heap;
     10477        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
    872010478        if (method) {
    872110479            InitSSL_Method(method, MakeTLSv1_2());
     
    872410482        return method;
    872510483    }
     10484#endif /* !WOLFSSL_NO_TLS12 */
    872610485
    872710486#ifdef WOLFSSL_TLS13
     
    874610505                                                     heap, DYNAMIC_TYPE_METHOD);
    874710506        (void)heap;
     10507        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
    874810508        if (method) {
    874910509            InitSSL_Method(method, MakeTLSv1_3());
     
    875410514#endif /* WOLFSSL_TLS13 */
    875510515
    8756     WOLFSSL_METHOD* wolfSSLv23_server_method(void)
     10516#ifdef WOLFSSL_DTLS
     10517    WOLFSSL_METHOD* wolfDTLS_server_method(void)
    875710518    {
    8758         return wolfSSLv23_server_method_ex(NULL);
    8759     }
    8760 
    8761     WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
     10519        return wolfDTLS_server_method_ex(NULL);
     10520    }
     10521    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
    876210522    {
    876310523        WOLFSSL_METHOD* method =
     
    876510525                                                     heap, DYNAMIC_TYPE_METHOD);
    876610526        (void)heap;
     10527        WOLFSSL_ENTER("DTLS_server_method_ex");
    876710528        if (method) {
    8768 #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
    8769 #ifdef WOLFSSL_TLS13
    8770             InitSSL_Method(method, MakeTLSv1_3());
    8771 #else
    8772             InitSSL_Method(method, MakeTLSv1_2());
    8773 #endif
    8774 #else
     10529        #if !defined(WOLFSSL_NO_TLS12)
     10530            InitSSL_Method(method, MakeDTLSv1_2());
     10531        #elif !defined(NO_OLD_TLS)
     10532            InitSSL_Method(method, MakeDTLSv1());
     10533    #else
     10534            #error No DTLS version enabled!
     10535    #endif
     10536
     10537            method->downgrade = 1;
     10538            method->side      = WOLFSSL_SERVER_END;
     10539        }
     10540        return method;
     10541    }
     10542
    877510543    #ifndef NO_OLD_TLS
    8776             InitSSL_Method(method, MakeTLSv1_1());
    8777     #else
    8778             #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
    8779     #endif
    8780 #endif
    8781 #ifndef NO_OLD_TLS
    8782             method->downgrade = 1;
    8783 #endif
    8784             method->side      = WOLFSSL_SERVER_END;
     10544    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
     10545    {
     10546        return wolfDTLSv1_server_method_ex(NULL);
     10547    }
     10548    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
     10549    {
     10550        WOLFSSL_METHOD* method =
     10551                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
     10552                                                 heap, DYNAMIC_TYPE_METHOD);
     10553        (void)heap;
     10554        WOLFSSL_ENTER("DTLSv1_server_method_ex");
     10555        if (method) {
     10556            InitSSL_Method(method, MakeDTLSv1());
     10557            method->side = WOLFSSL_SERVER_END;
    878510558        }
    878610559        return method;
    878710560    }
    8788 
     10561    #endif /* !NO_OLD_TLS */
     10562
     10563    #ifndef WOLFSSL_NO_TLS12
     10564    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
     10565    {
     10566        return wolfDTLSv1_2_server_method_ex(NULL);
     10567    }
     10568    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
     10569    {
     10570        WOLFSSL_METHOD* method =
     10571                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
     10572                                                 heap, DYNAMIC_TYPE_METHOD);
     10573        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
     10574        (void)heap;
     10575        if (method) {
     10576            InitSSL_Method(method, MakeDTLSv1_2());
     10577            method->side = WOLFSSL_SERVER_END;
     10578        }
     10579        (void)heap;
     10580        return method;
     10581    }
     10582    #endif /* !WOLFSSL_NO_TLS12 */
     10583#endif /* WOLFSSL_DTLS */
    878910584
    879010585#endif /* NO_WOLFSSL_SERVER */
     10586
    879110587#endif /* NO_TLS */
    879210588#endif /* WOLFCRYPT_ONLY */
Note: See TracChangeset for help on using the changeset viewer.