wolf SSL / wolfSSL-TLS13-Beta

Fork of wolfSSL by wolf SSL

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers tls.c Source File

tls.c

00001 /* tls.c
00002  *
00003  * Copyright (C) 2006-2016 wolfSSL Inc.
00004  *
00005  * This file is part of wolfSSL.
00006  *
00007  * wolfSSL is free software; you can redistribute it and/or modify
00008  * it under the terms of the GNU General Public License as published by
00009  * the Free Software Foundation; either version 2 of the License, or
00010  * (at your option) any later version.
00011  *
00012  * wolfSSL is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  * GNU General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU General Public License
00018  * along with this program; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
00020  */
00021 
00022 
00023 
00024 #ifdef HAVE_CONFIG_H
00025     #include <config.h>
00026 #endif
00027 
00028 #include <wolfssl/wolfcrypt/settings.h>
00029 
00030 #ifndef WOLFCRYPT_ONLY
00031 
00032 #include <wolfssl/ssl.h>
00033 #include <wolfssl/internal.h>
00034 #include <wolfssl/error-ssl.h>
00035 #include <wolfssl/wolfcrypt/hmac.h>
00036 #ifdef NO_INLINE
00037     #include <wolfssl/wolfcrypt/misc.h>
00038 #else
00039     #define WOLFSSL_MISC_INCLUDED
00040     #include <wolfcrypt/src/misc.c>
00041 #endif
00042 
00043 #ifdef HAVE_CURVE25519
00044     #include <wolfssl/wolfcrypt/curve25519.h>
00045 #endif
00046 
00047 #ifdef HAVE_NTRU
00048     #include "libntruencrypt/ntru_crypto.h"
00049     #include <wolfssl/wolfcrypt/random.h>
00050 #endif
00051 #ifdef HAVE_QSH
00052     static int TLSX_AddQSHKey(QSHKey** list, QSHKey* key);
00053     static byte* TLSX_QSHKeyFind_Pub(QSHKey* qsh, word16* pubLen, word16 name);
00054 #endif
00055 #if defined(HAVE_NTRU) || defined(HAVE_QSH)
00056     static int TLSX_CreateNtruKey(WOLFSSL* ssl, int type);
00057 #endif
00058 
00059 
00060 #ifndef NO_TLS
00061 
00062 /* Digest enable checks */
00063 #ifdef NO_OLD_TLS /* TLS 1.2 only */
00064     #if defined(NO_SHA256) && !defined(WOLFSSL_SHA384) && \
00065             !defined(WOLFSSL_SHA512)
00066         #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
00067     #endif
00068 #else  /* TLS 1.1 or older */
00069     #if defined(NO_MD5) && defined(NO_SHA)
00070         #error Must have SHA1 and MD5 enabled for old TLS
00071     #endif
00072 #endif
00073 
00074 
00075 #ifdef WOLFSSL_SHA384
00076     #define P_HASH_MAX_SIZE SHA384_DIGEST_SIZE
00077 #else
00078     #define P_HASH_MAX_SIZE SHA256_DIGEST_SIZE
00079 #endif
00080 
00081 
00082 /* compute p_hash for MD5, SHA-1, SHA-256, or SHA-384 for TLSv1 PRF */
00083 static int p_hash(byte* result, word32 resLen, const byte* secret,
00084                    word32 secLen, const byte* seed, word32 seedLen, int hash)
00085 {
00086     word32 len = P_HASH_MAX_SIZE;
00087     word32 times;
00088     word32 lastLen;
00089     word32 lastTime;
00090     word32 i;
00091     word32 idx = 0;
00092     int    ret = 0;
00093 #ifdef WOLFSSL_SMALL_STACK
00094     byte*  previous;
00095     byte*  current;
00096     Hmac*  hmac;
00097 #else
00098     byte   previous[P_HASH_MAX_SIZE];  /* max size */
00099     byte   current[P_HASH_MAX_SIZE];   /* max size */
00100     Hmac   hmac[1];
00101 #endif
00102 
00103 #ifdef WOLFSSL_SMALL_STACK
00104     previous = (byte*)XMALLOC(P_HASH_MAX_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00105     current  = (byte*)XMALLOC(P_HASH_MAX_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00106     hmac     = (Hmac*)XMALLOC(sizeof(Hmac),    NULL, DYNAMIC_TYPE_TMP_BUFFER);
00107 
00108     if (previous == NULL || current == NULL || hmac == NULL) {
00109         if (previous) XFREE(previous, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00110         if (current)  XFREE(current,  NULL, DYNAMIC_TYPE_TMP_BUFFER);
00111         if (hmac)     XFREE(hmac,     NULL, DYNAMIC_TYPE_TMP_BUFFER);
00112 
00113         return MEMORY_E;
00114     }
00115 #endif
00116 
00117     switch (hash) {
00118         #ifndef NO_MD5
00119             case md5_mac:
00120                 hash = MD5;
00121                 len  = MD5_DIGEST_SIZE;
00122             break;
00123         #endif
00124 
00125         #ifndef NO_SHA256
00126             case sha256_mac:
00127                 hash = SHA256;
00128                 len  = SHA256_DIGEST_SIZE;
00129             break;
00130         #endif
00131 
00132         #ifdef WOLFSSL_SHA384
00133             case sha384_mac:
00134                 hash = SHA384;
00135                 len  = SHA384_DIGEST_SIZE;
00136             break;
00137         #endif
00138 
00139         #ifndef NO_SHA
00140             case sha_mac:
00141             default:
00142                 hash = SHA;
00143                 len  = SHA_DIGEST_SIZE;
00144             break;
00145         #endif
00146     }
00147 
00148     times   = resLen / len;
00149     lastLen = resLen % len;
00150 
00151     if (lastLen)
00152         times += 1;
00153 
00154     lastTime = times - 1;
00155 
00156     ret = wc_HmacInit(hmac, NULL, INVALID_DEVID);
00157     if (ret == 0) {
00158         ret = wc_HmacSetKey(hmac, hash, secret, secLen);
00159         if (ret == 0)
00160             ret = wc_HmacUpdate(hmac, seed, seedLen); /* A0 = seed */
00161         if (ret == 0)
00162             ret = wc_HmacFinal(hmac, previous);       /* A1 */
00163         if (ret == 0) {
00164             for (i = 0; i < times; i++) {
00165                 ret = wc_HmacUpdate(hmac, previous, len);
00166                 if (ret != 0)
00167                     break;
00168                 ret = wc_HmacUpdate(hmac, seed, seedLen);
00169                 if (ret != 0)
00170                     break;
00171                 ret = wc_HmacFinal(hmac, current);
00172                 if (ret != 0)
00173                     break;
00174 
00175                 if ((i == lastTime) && lastLen)
00176                     XMEMCPY(&result[idx], current,
00177                                              min(lastLen, P_HASH_MAX_SIZE));
00178                 else {
00179                     XMEMCPY(&result[idx], current, len);
00180                     idx += len;
00181                     ret = wc_HmacUpdate(hmac, previous, len);
00182                     if (ret != 0)
00183                         break;
00184                     ret = wc_HmacFinal(hmac, previous);
00185                     if (ret != 0)
00186                         break;
00187                 }
00188             }
00189         }
00190         wc_HmacFree(hmac);
00191     }
00192 
00193     ForceZero(previous,  P_HASH_MAX_SIZE);
00194     ForceZero(current,   P_HASH_MAX_SIZE);
00195     ForceZero(hmac,      sizeof(Hmac));
00196 
00197 #ifdef WOLFSSL_SMALL_STACK
00198     XFREE(previous, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00199     XFREE(current,  NULL, DYNAMIC_TYPE_TMP_BUFFER);
00200     XFREE(hmac,     NULL, DYNAMIC_TYPE_TMP_BUFFER);
00201 #endif
00202 
00203     return ret;
00204 }
00205 
00206 #undef P_HASH_MAX_SIZE
00207 
00208 
00209 #ifndef NO_OLD_TLS
00210 
00211 /* calculate XOR for TLSv1 PRF */
00212 static INLINE void get_xor(byte *digest, word32 digLen, byte* md5, byte* sha)
00213 {
00214     word32 i;
00215 
00216     for (i = 0; i < digLen; i++)
00217         digest[i] = md5[i] ^ sha[i];
00218 }
00219 
00220 
00221 /* compute TLSv1 PRF (pseudo random function using HMAC) */
00222 static int doPRF(byte* digest, word32 digLen, const byte* secret,word32 secLen,
00223                  const byte* label, word32 labLen, const byte* seed,
00224                  word32 seedLen)
00225 {
00226     int    ret  = 0;
00227     word32 half = (secLen + 1) / 2;
00228 
00229 #ifdef WOLFSSL_SMALL_STACK
00230     byte* md5_half;
00231     byte* sha_half;
00232     byte* labelSeed;
00233     byte* md5_result;
00234     byte* sha_result;
00235 #else
00236     byte  md5_half[MAX_PRF_HALF];     /* half is real size */
00237     byte  sha_half[MAX_PRF_HALF];     /* half is real size */
00238     byte  labelSeed[MAX_PRF_LABSEED]; /* labLen + seedLen is real size */
00239     byte  md5_result[MAX_PRF_DIG];    /* digLen is real size */
00240     byte  sha_result[MAX_PRF_DIG];    /* digLen is real size */
00241 #endif
00242 
00243     if (half > MAX_PRF_HALF)
00244         return BUFFER_E;
00245     if (labLen + seedLen > MAX_PRF_LABSEED)
00246         return BUFFER_E;
00247     if (digLen > MAX_PRF_DIG)
00248         return BUFFER_E;
00249 
00250 #ifdef WOLFSSL_SMALL_STACK
00251     md5_half   = (byte*)XMALLOC(MAX_PRF_HALF,    NULL, DYNAMIC_TYPE_TMP_BUFFER);
00252     sha_half   = (byte*)XMALLOC(MAX_PRF_HALF,    NULL, DYNAMIC_TYPE_TMP_BUFFER);
00253     labelSeed  = (byte*)XMALLOC(MAX_PRF_LABSEED, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00254     md5_result = (byte*)XMALLOC(MAX_PRF_DIG,     NULL, DYNAMIC_TYPE_TMP_BUFFER);
00255     sha_result = (byte*)XMALLOC(MAX_PRF_DIG,     NULL, DYNAMIC_TYPE_TMP_BUFFER);
00256 
00257     if (md5_half == NULL || sha_half == NULL || labelSeed == NULL ||
00258                                      md5_result == NULL || sha_result == NULL) {
00259         if (md5_half)   XFREE(md5_half,   NULL, DYNAMIC_TYPE_TMP_BUFFER);
00260         if (sha_half)   XFREE(sha_half,   NULL, DYNAMIC_TYPE_TMP_BUFFER);
00261         if (labelSeed)  XFREE(labelSeed,  NULL, DYNAMIC_TYPE_TMP_BUFFER);
00262         if (md5_result) XFREE(md5_result, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00263         if (sha_result) XFREE(sha_result, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00264 
00265         return MEMORY_E;
00266     }
00267 #endif
00268 
00269     XMEMSET(md5_result, 0, digLen);
00270     XMEMSET(sha_result, 0, digLen);
00271 
00272     XMEMCPY(md5_half, secret, half);
00273     XMEMCPY(sha_half, secret + half - secLen % 2, half);
00274 
00275     XMEMCPY(labelSeed, label, labLen);
00276     XMEMCPY(labelSeed + labLen, seed, seedLen);
00277 
00278     if ((ret = p_hash(md5_result, digLen, md5_half, half, labelSeed,
00279                                              labLen + seedLen, md5_mac)) == 0) {
00280         if ((ret = p_hash(sha_result, digLen, sha_half, half, labelSeed,
00281                                              labLen + seedLen, sha_mac)) == 0) {
00282             get_xor(digest, digLen, md5_result, sha_result);
00283         }
00284     }
00285 
00286 #ifdef WOLFSSL_SMALL_STACK
00287     XFREE(md5_half,   NULL, DYNAMIC_TYPE_TMP_BUFFER);
00288     XFREE(sha_half,   NULL, DYNAMIC_TYPE_TMP_BUFFER);
00289     XFREE(labelSeed,  NULL, DYNAMIC_TYPE_TMP_BUFFER);
00290     XFREE(md5_result, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00291     XFREE(sha_result, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00292 #endif
00293 
00294     return ret;
00295 }
00296 
00297 #endif
00298 
00299 
00300 /* Wrapper to call straight thru to p_hash in TSL 1.2 cases to remove stack
00301    use */
00302 static int PRF(byte* digest, word32 digLen, const byte* secret, word32 secLen,
00303             const byte* label, word32 labLen, const byte* seed, word32 seedLen,
00304             int useAtLeastSha256, int hash_type)
00305 {
00306     int ret = 0;
00307 
00308     if (useAtLeastSha256) {
00309 #ifdef WOLFSSL_SMALL_STACK
00310         byte* labelSeed;
00311 #else
00312         byte labelSeed[MAX_PRF_LABSEED]; /* labLen + seedLen is real size */
00313 #endif
00314 
00315         if (labLen + seedLen > MAX_PRF_LABSEED)
00316             return BUFFER_E;
00317 
00318 #ifdef WOLFSSL_SMALL_STACK
00319         labelSeed = (byte*)XMALLOC(MAX_PRF_LABSEED, NULL,
00320                                                        DYNAMIC_TYPE_TMP_BUFFER);
00321         if (labelSeed == NULL)
00322            return MEMORY_E;
00323 #endif
00324 
00325         XMEMCPY(labelSeed, label, labLen);
00326         XMEMCPY(labelSeed + labLen, seed, seedLen);
00327 
00328         /* If a cipher suite wants an algorithm better than sha256, it
00329          * should use better. */
00330         if (hash_type < sha256_mac || hash_type == blake2b_mac)
00331             hash_type = sha256_mac;
00332         ret = p_hash(digest, digLen, secret, secLen, labelSeed,
00333                      labLen + seedLen, hash_type);
00334 
00335 #ifdef WOLFSSL_SMALL_STACK
00336         XFREE(labelSeed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00337 #endif
00338     }
00339 #ifndef NO_OLD_TLS
00340     else {
00341         ret = doPRF(digest, digLen, secret, secLen, label, labLen, seed,
00342                     seedLen);
00343     }
00344 #endif
00345 
00346     return ret;
00347 }
00348 
00349 #ifdef WOLFSSL_SHA384
00350     #define HSHASH_SZ SHA384_DIGEST_SIZE
00351 #else
00352     #define HSHASH_SZ FINISHED_SZ
00353 #endif
00354 
00355 
00356 int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
00357 {
00358     word32 hashSz = FINISHED_SZ;
00359 
00360     if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
00361         return BAD_FUNC_ARG;
00362 
00363 #ifndef NO_OLD_TLS
00364     wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
00365     wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[MD5_DIGEST_SIZE]);
00366 #endif
00367 
00368     if (IsAtLeastTLSv1_2(ssl)) {
00369 #ifndef NO_SHA256
00370         if (ssl->specs.mac_algorithm <= sha256_mac ||
00371             ssl->specs.mac_algorithm == blake2b_mac) {
00372             int ret = wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
00373 
00374             if (ret != 0)
00375                 return ret;
00376 
00377             hashSz = SHA256_DIGEST_SIZE;
00378         }
00379 #endif
00380 #ifdef WOLFSSL_SHA384
00381         if (ssl->specs.mac_algorithm == sha384_mac) {
00382             int ret = wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
00383 
00384             if (ret != 0)
00385                 return ret;
00386 
00387             hashSz = SHA384_DIGEST_SIZE;
00388         }
00389 #endif
00390     }
00391 
00392     *hashLen = hashSz;
00393 
00394     return 0;
00395 }
00396 
00397 
00398 int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
00399 {
00400     int         ret;
00401     const byte* side;
00402     byte*       handshake_hash;
00403     word32      hashSz = HSHASH_SZ;
00404 
00405     /* using allocate here to allow async hardware to use buffer directly */
00406     handshake_hash = (byte*)XMALLOC(hashSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
00407     if (handshake_hash == NULL)
00408         return MEMORY_E;
00409 
00410     ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
00411     if (ret == 0) {
00412         if ( XSTRNCMP((const char*)sender, (const char*)client, SIZEOF_SENDER) == 0)
00413             side = tls_client;
00414         else
00415             side = tls_server;
00416 
00417         ret = PRF((byte*)hashes, TLS_FINISHED_SZ, ssl->arrays->masterSecret,
00418                    SECRET_LEN, side, FINISHED_LABEL_SZ, handshake_hash, hashSz,
00419                    IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm);
00420     }
00421 
00422     XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
00423 
00424     return ret;
00425 }
00426 
00427 
00428 #ifndef NO_OLD_TLS
00429 
00430 ProtocolVersion MakeTLSv1(void)
00431 {
00432     ProtocolVersion pv;
00433     pv.major = SSLv3_MAJOR;
00434     pv.minor = TLSv1_MINOR;
00435 
00436     return pv;
00437 }
00438 
00439 
00440 ProtocolVersion MakeTLSv1_1(void)
00441 {
00442     ProtocolVersion pv;
00443     pv.major = SSLv3_MAJOR;
00444     pv.minor = TLSv1_1_MINOR;
00445 
00446     return pv;
00447 }
00448 
00449 #endif
00450 
00451 
00452 ProtocolVersion MakeTLSv1_2(void)
00453 {
00454     ProtocolVersion pv;
00455     pv.major = SSLv3_MAJOR;
00456     pv.minor = TLSv1_2_MINOR;
00457 
00458     return pv;
00459 }
00460 
00461 #ifdef WOLFSSL_TLS13
00462 /* The TLS v1.3 protocol version.
00463  *
00464  * returns the protocol version data for TLS v1.3.
00465  */
00466 ProtocolVersion MakeTLSv1_3(void)
00467 {
00468     ProtocolVersion pv;
00469     pv.major = SSLv3_MAJOR;
00470     pv.minor = TLSv1_3_MINOR;
00471 
00472     return pv;
00473 }
00474 #endif
00475 
00476 
00477 #ifdef HAVE_EXTENDED_MASTER
00478 static const byte ext_master_label[EXT_MASTER_LABEL_SZ + 1] =
00479                                                       "extended master secret";
00480 #endif
00481 static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
00482 static const byte key_label   [KEY_LABEL_SZ + 1]    = "key expansion";
00483 
00484 
00485 /* External facing wrapper so user can call as well, 0 on success */
00486 int wolfSSL_DeriveTlsKeys(byte* key_data, word32 keyLen,
00487                          const byte* ms, word32 msLen,
00488                          const byte* sr, const byte* cr,
00489                          int tls1_2, int hash_type)
00490 {
00491     byte  seed[SEED_LEN];
00492 
00493     XMEMCPY(seed,           sr, RAN_LEN);
00494     XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
00495 
00496     return PRF(key_data, keyLen, ms, msLen, key_label, KEY_LABEL_SZ,
00497                seed, SEED_LEN, tls1_2, hash_type);
00498 }
00499 
00500 
00501 int DeriveTlsKeys(WOLFSSL* ssl)
00502 {
00503     int   ret;
00504     int   length = 2 * ssl->specs.hash_size +
00505                    2 * ssl->specs.key_size  +
00506                    2 * ssl->specs.iv_size;
00507 #ifdef WOLFSSL_SMALL_STACK
00508     byte* key_data;
00509 #else
00510     byte  key_data[MAX_PRF_DIG];
00511 #endif
00512 
00513 #ifdef WOLFSSL_SMALL_STACK
00514     key_data = (byte*)XMALLOC(MAX_PRF_DIG, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00515     if (key_data == NULL) {
00516         return MEMORY_E;
00517     }
00518 #endif
00519 
00520     ret = wolfSSL_DeriveTlsKeys(key_data, length,
00521                            ssl->arrays->masterSecret, SECRET_LEN,
00522                            ssl->arrays->serverRandom, ssl->arrays->clientRandom,
00523                            IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm);
00524     if (ret == 0)
00525         ret = StoreKeys(ssl, key_data);
00526 
00527 #ifdef WOLFSSL_SMALL_STACK
00528     XFREE(key_data, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00529 #endif
00530 
00531     return ret;
00532 }
00533 
00534 
00535 /* External facing wrapper so user can call as well, 0 on success */
00536 int wolfSSL_MakeTlsMasterSecret(byte* ms, word32 msLen,
00537                                const byte* pms, word32 pmsLen,
00538                                const byte* cr, const byte* sr,
00539                                int tls1_2, int hash_type)
00540 {
00541     byte  seed[SEED_LEN];
00542 
00543     XMEMCPY(seed,           cr, RAN_LEN);
00544     XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
00545 
00546     return PRF(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
00547                seed, SEED_LEN, tls1_2, hash_type);
00548 }
00549 
00550 
00551 #ifdef HAVE_EXTENDED_MASTER
00552 
00553 /* External facing wrapper so user can call as well, 0 on success */
00554 int wolfSSL_MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
00555                                         const byte* pms, word32 pmsLen,
00556                                         const byte* sHash, word32 sHashLen,
00557                                         int tls1_2, int hash_type)
00558 {
00559     return PRF(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
00560                sHash, sHashLen, tls1_2, hash_type);
00561 }
00562 
00563 #endif /* HAVE_EXTENDED_MASTER */
00564 
00565 
00566 int MakeTlsMasterSecret(WOLFSSL* ssl)
00567 {
00568     int    ret;
00569 #ifdef HAVE_EXTENDED_MASTER
00570     if (ssl->options.haveEMS) {
00571         byte*  handshake_hash;
00572         word32 hashSz = HSHASH_SZ;
00573 
00574         handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
00575         if (handshake_hash == NULL)
00576             return MEMORY_E;
00577 
00578         ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
00579         if (ret < 0) {
00580             XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
00581             return ret;
00582         }
00583 
00584         ret = wolfSSL_MakeTlsExtendedMasterSecret(
00585                 ssl->arrays->masterSecret, SECRET_LEN,
00586                 ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
00587                 handshake_hash, hashSz,
00588                 IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm);
00589 
00590         XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
00591     } else
00592 #endif
00593     ret = wolfSSL_MakeTlsMasterSecret(ssl->arrays->masterSecret, SECRET_LEN,
00594               ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
00595               ssl->arrays->clientRandom, ssl->arrays->serverRandom,
00596               IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm);
00597 
00598     if (ret == 0) {
00599     #ifdef SHOW_SECRETS
00600         int i;
00601 
00602         printf("master secret: ");
00603         for (i = 0; i < SECRET_LEN; i++)
00604             printf("%02x", ssl->arrays->masterSecret[i]);
00605         printf("\n");
00606     #endif
00607 
00608         ret = DeriveTlsKeys(ssl);
00609     }
00610 
00611     return ret;
00612 }
00613 
00614 
00615 /* Used by EAP-TLS and EAP-TTLS to derive keying material from
00616  * the master_secret. */
00617 int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* msk, unsigned int len,
00618                                                               const char* label)
00619 {
00620     int   ret;
00621 #ifdef WOLFSSL_SMALL_STACK
00622     byte* seed;
00623 #else
00624     byte  seed[SEED_LEN];
00625 #endif
00626 
00627 #ifdef WOLFSSL_SMALL_STACK
00628     seed = (byte*)XMALLOC(SEED_LEN, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00629     if (seed == NULL)
00630         return MEMORY_E;
00631 #endif
00632 
00633     /*
00634      * As per RFC-5281, the order of the client and server randoms is reversed
00635      * from that used by the TLS protocol to derive keys.
00636      */
00637     XMEMCPY(seed,           ssl->arrays->clientRandom, RAN_LEN);
00638     XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
00639 
00640     ret = PRF((byte*)msk, len, ssl->arrays->masterSecret, SECRET_LEN,
00641               (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
00642               IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm);
00643 
00644 #ifdef WOLFSSL_SMALL_STACK
00645     XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER);
00646 #endif
00647 
00648     return ret;
00649 }
00650 
00651 
00652 /*** next for static INLINE s copied internal.c ***/
00653 
00654 /* convert 16 bit integer to opaque */
00655 static INLINE void c16toa(word16 u16, byte* c)
00656 {
00657     c[0] = (u16 >> 8) & 0xff;
00658     c[1] =  u16 & 0xff;
00659 }
00660 
00661 #ifdef HAVE_TLS_EXTENSIONS
00662 /* convert opaque to 16 bit integer */
00663 static INLINE void ato16(const byte* c, word16* u16)
00664 {
00665     *u16 = (c[0] << 8) | (c[1]);
00666 }
00667 
00668 #if defined(HAVE_SNI) && !defined(NO_WOLFSSL_SERVER)
00669 /* convert a 24 bit integer into a 32 bit one */
00670 static INLINE void c24to32(const word24 u24, word32* u32)
00671 {
00672     *u32 = (u24[0] << 16) | (u24[1] << 8) | u24[2];
00673 }
00674 #endif
00675 
00676 #if defined(WOLFSSL_TLS13) && !defined(NO_PSK)
00677 /* Convert opaque data to a 32-bit unsigned integer.
00678  *
00679  * c    The opaque data holding a 32-bit integer.
00680  * u32  The 32-bit unsigned integer.
00681  */
00682 static INLINE void ato32(const byte* c, word32* u32)
00683 {
00684     *u32 = (c[0] << 24) | (c[1] << 16) | (c[2] << 8) | c[3];
00685 }
00686 #endif
00687 #endif /* HAVE_TLS_EXTENSIONS */
00688 
00689 /* convert 32 bit integer to opaque */
00690 static INLINE void c32toa(word32 u32, byte* c)
00691 {
00692     c[0] = (u32 >> 24) & 0xff;
00693     c[1] = (u32 >> 16) & 0xff;
00694     c[2] = (u32 >>  8) & 0xff;
00695     c[3] =  u32 & 0xff;
00696 }
00697 
00698 
00699 static INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
00700 {
00701     if (verify) {
00702         seq[0] = ssl->keys.peer_sequence_number_hi;
00703         seq[1] = ssl->keys.peer_sequence_number_lo++;
00704         if (seq[1] > ssl->keys.peer_sequence_number_lo) {
00705             /* handle rollover */
00706             ssl->keys.peer_sequence_number_hi++;
00707         }
00708     }
00709     else {
00710         seq[0] = ssl->keys.sequence_number_hi;
00711         seq[1] = ssl->keys.sequence_number_lo++;
00712         if (seq[1] > ssl->keys.sequence_number_lo) {
00713             /* handle rollover */
00714             ssl->keys.sequence_number_hi++;
00715         }
00716     }
00717 }
00718 
00719 
00720 #ifdef WOLFSSL_DTLS
00721 static INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
00722 {
00723     if (order == PREV_ORDER) {
00724         /* Previous epoch case */
00725         seq[0] = ((ssl->keys.dtls_epoch - 1) << 16) |
00726                  (ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
00727         seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
00728     }
00729     else if (order == PEER_ORDER) {
00730         seq[0] = (ssl->keys.curEpoch << 16) |
00731                  (ssl->keys.curSeq_hi & 0xFFFF);
00732         seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
00733     }
00734     else {
00735         seq[0] = (ssl->keys.dtls_epoch << 16) |
00736                  (ssl->keys.dtls_sequence_number_hi & 0xFFFF);
00737         seq[1] = ssl->keys.dtls_sequence_number_lo;
00738     }
00739 }
00740 #endif /* WOLFSSL_DTLS */
00741 
00742 
00743 static INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
00744 {
00745     word32 seq[2] = {0, 0};
00746 
00747     if (!ssl->options.dtls) {
00748         GetSEQIncrement(ssl, verifyOrder, seq);
00749     }
00750     else {
00751 #ifdef WOLFSSL_DTLS
00752         DtlsGetSEQ(ssl, verifyOrder, seq);
00753 #endif
00754     }
00755 
00756     c32toa(seq[0], out);
00757     c32toa(seq[1], out + OPAQUE32_LEN);
00758 }
00759 
00760 
00761 /*** end copy ***/
00762 
00763 
00764 /* return HMAC digest type in wolfSSL format */
00765 int wolfSSL_GetHmacType(WOLFSSL* ssl)
00766 {
00767     if (ssl == NULL)
00768         return BAD_FUNC_ARG;
00769 
00770     switch (ssl->specs.mac_algorithm) {
00771         #ifndef NO_MD5
00772         case md5_mac:
00773         {
00774             return MD5;
00775         }
00776         #endif
00777         #ifndef NO_SHA256
00778         case sha256_mac:
00779         {
00780             return SHA256;
00781         }
00782         #endif
00783         #ifdef WOLFSSL_SHA384
00784         case sha384_mac:
00785         {
00786             return SHA384;
00787         }
00788 
00789         #endif
00790         #ifndef NO_SHA
00791         case sha_mac:
00792         {
00793             return SHA;
00794         }
00795         #endif
00796         #ifdef HAVE_BLAKE2
00797         case blake2b_mac:
00798         {
00799             return BLAKE2B_ID;
00800         }
00801         #endif
00802         default:
00803         {
00804             return SSL_FATAL_ERROR;
00805         }
00806     }
00807 }
00808 
00809 
00810 int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
00811                            int verify)
00812 {
00813     if (ssl == NULL || inner == NULL)
00814         return BAD_FUNC_ARG;
00815 
00816     XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
00817 
00818     WriteSEQ(ssl, verify, inner);
00819     inner[SEQ_SZ] = (byte)content;
00820     inner[SEQ_SZ + ENUM_LEN]            = ssl->version.major;
00821     inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
00822     c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
00823 
00824     return 0;
00825 }
00826 
00827 
00828 /* TLS type HMAC */
00829 int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz,
00830               int content, int verify)
00831 {
00832     Hmac hmac;
00833     int  ret = 0;
00834     byte myInner[WOLFSSL_TLS_HMAC_INNER_SZ];
00835 
00836     if (ssl == NULL)
00837         return BAD_FUNC_ARG;
00838 
00839 #ifdef HAVE_FUZZER
00840     if (ssl->fuzzerCb)
00841         ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
00842 #endif
00843 
00844     wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
00845 
00846     ret = wc_HmacInit(&hmac, NULL, ssl->devId);
00847     if (ret != 0)
00848         return ret;
00849 
00850     ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
00851                      wolfSSL_GetMacSecret(ssl, verify), ssl->specs.hash_size);
00852     if (ret == 0) {
00853         ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner));
00854         if (ret == 0)
00855             ret = wc_HmacUpdate(&hmac, in, sz);                    /* content */
00856         if (ret == 0)
00857             ret = wc_HmacFinal(&hmac, digest);
00858     }
00859     wc_HmacFree(&hmac);
00860 
00861     return ret;
00862 }
00863 
00864 #ifdef HAVE_TLS_EXTENSIONS
00865 
00866 /**
00867  * The TLSX semaphore is used to calculate the size of the extensions to be sent
00868  * from one peer to another.
00869  */
00870 
00871 /** Supports up to 64 flags. Increase as needed. */
00872 #define SEMAPHORE_SIZE 8
00873 
00874 /**
00875  * Converts the extension type (id) to an index in the semaphore.
00876  *
00877  * Oficial reference for TLS extension types:
00878  *   http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
00879  *
00880  * Motivation:
00881  *   Previously, we used the extension type itself as the index of that
00882  *   extension in the semaphore as the extension types were declared
00883  *   sequentially, but maintain a semaphore as big as the number of available
00884  *   extensions is no longer an option since the release of renegotiation_info.
00885  *
00886  * How to update:
00887  *   Assign extension types that extrapolate the number of available semaphores
00888  *   to the first available index going backwards in the semaphore array.
00889  *   When adding a new extension type that don't extrapolate the number of
00890  *   available semaphores, check for a possible collision with with a
00891  *   'remapped' extension type.
00892  */
00893 static INLINE word16 TLSX_ToSemaphore(word16 type)
00894 {
00895     switch (type) {
00896 
00897         case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
00898             return 63;
00899 
00900         default:
00901             if (type > 62) {
00902                 /* This message SHOULD only happens during the adding of
00903                    new TLS extensions in which its IANA number overflows
00904                    the current semaphore's range, or if its number already
00905                    is assigned to be used by another extension.
00906                    Use this check value for the new extension and decrement
00907                    the check value by one. */
00908                 WOLFSSL_MSG("### TLSX semaphore colision or overflow detected!");
00909             }
00910     }
00911 
00912     return type;
00913 }
00914 
00915 /** Checks if a specific light (tls extension) is not set in the semaphore. */
00916 #define IS_OFF(semaphore, light) \
00917     (!(((semaphore)[(light) / 8] &  (byte) (0x01 << ((light) % 8)))))
00918 
00919 /** Turn on a specific light (tls extension) in the semaphore. */
00920 #define TURN_ON(semaphore, light) \
00921     ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
00922 
00923 /** Turn off a specific light (tls extension) in the semaphore. */
00924 #define TURN_OFF(semaphore, light) \
00925     ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
00926 
00927 /** Creates a new extension. */
00928 static TLSX* TLSX_New(TLSX_Type type, void* data, void* heap)
00929 {
00930     TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
00931 
00932     if (extension) {
00933         extension->type = type;
00934         extension->data = data;
00935         extension->resp = 0;
00936         extension->next = NULL;
00937     }
00938 
00939     return extension;
00940 }
00941 
00942 /**
00943  * Creates a new extension and pushes it to the provided list.
00944  * Checks for duplicate extensions, keeps the newest.
00945  */
00946 static int TLSX_Push(TLSX** list, TLSX_Type type, void* data, void* heap)
00947 {
00948     TLSX* extension = TLSX_New(type, data, heap);
00949 
00950     if (extension == NULL)
00951         return MEMORY_E;
00952 
00953     /* pushes the new extension on the list. */
00954     extension->next = *list;
00955     *list = extension;
00956 
00957     /* remove duplicate extensions, there should be only one of each type. */
00958     do {
00959         if (extension->next && extension->next->type == type) {
00960             TLSX *next = extension->next;
00961 
00962             extension->next = next->next;
00963             next->next = NULL;
00964 
00965             TLSX_FreeAll(next, heap);
00966 
00967             /* there is no way to occur more than */
00968             /* two extensions of the same type.   */
00969             break;
00970         }
00971     } while ((extension = extension->next));
00972 
00973     return 0;
00974 }
00975 
00976 #ifndef NO_WOLFSSL_SERVER
00977 
00978 /** Mark an extension to be sent back to the client. */
00979 void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
00980 
00981 void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
00982 {
00983     TLSX *ext = TLSX_Find(ssl->extensions, type);
00984 
00985     if (ext)
00986         ext->resp = 1;
00987 }
00988 
00989 #endif
00990 
00991 /******************************************************************************/
00992 /* Application-Layer Protocol Negotiation                                     */
00993 /******************************************************************************/
00994 
00995 #ifdef HAVE_ALPN
00996 /** Creates a new ALPN object, providing protocol name to use. */
00997 static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
00998                                                                      void* heap)
00999 {
01000     ALPN *alpn;
01001 
01002     WOLFSSL_ENTER("TLSX_ALPN_New");
01003 
01004     if (protocol_name == NULL ||
01005         protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
01006         WOLFSSL_MSG("Invalid arguments");
01007         return NULL;
01008     }
01009 
01010     alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
01011     if (alpn == NULL) {
01012         WOLFSSL_MSG("Memory failure");
01013         return NULL;
01014     }
01015 
01016     alpn->next = NULL;
01017     alpn->negotiated = 0;
01018     alpn->options = 0;
01019 
01020     alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
01021                                          heap, DYNAMIC_TYPE_TLSX);
01022     if (alpn->protocol_name == NULL) {
01023         WOLFSSL_MSG("Memory failure");
01024         XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
01025         return NULL;
01026     }
01027 
01028     XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
01029     alpn->protocol_name[protocol_nameSz] = 0;
01030 
01031     return alpn;
01032 }
01033 
01034 /** Releases an ALPN object. */
01035 static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
01036 {
01037     (void)heap;
01038 
01039     if (alpn == NULL)
01040         return;
01041 
01042     XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
01043     XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
01044 }
01045 
01046 /** Releases all ALPN objects in the provided list. */
01047 static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
01048 {
01049     ALPN* alpn;
01050 
01051     while ((alpn = list)) {
01052         list = alpn->next;
01053         TLSX_ALPN_Free(alpn, heap);
01054     }
01055 }
01056 
01057 /** Tells the buffered size of the ALPN objects in a list. */
01058 static word16 TLSX_ALPN_GetSize(ALPN *list)
01059 {
01060     ALPN* alpn;
01061     word16 length = OPAQUE16_LEN; /* list length */
01062 
01063     while ((alpn = list)) {
01064         list = alpn->next;
01065 
01066         length++; /* protocol name length is on one byte */
01067         length += (word16)XSTRLEN(alpn->protocol_name);
01068     }
01069 
01070     return length;
01071 }
01072 
01073 /** Writes the ALPN objects of a list in a buffer. */
01074 static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
01075 {
01076     ALPN* alpn;
01077     word16 length = 0;
01078     word16 offset = OPAQUE16_LEN; /* list length offset */
01079 
01080     while ((alpn = list)) {
01081         list = alpn->next;
01082 
01083         length = (word16)XSTRLEN(alpn->protocol_name);
01084 
01085         /* protocol name length */
01086         output[offset++] = (byte)length;
01087 
01088         /* protocol name value */
01089         XMEMCPY(output + offset, alpn->protocol_name, length);
01090 
01091         offset += length;
01092     }
01093 
01094     /* writing list length */
01095     c16toa(offset - OPAQUE16_LEN, output);
01096 
01097     return offset;
01098 }
01099 
01100 /** Finds a protocol name in the provided ALPN list */
01101 static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
01102 {
01103     ALPN *alpn;
01104 
01105     if (list == NULL || protocol_name == NULL)
01106         return NULL;
01107 
01108     alpn = list;
01109     while (alpn != NULL && (
01110            (word16)XSTRLEN(alpn->protocol_name) != size ||
01111            XSTRNCMP(alpn->protocol_name, protocol_name, size)))
01112         alpn = alpn->next;
01113 
01114     return alpn;
01115 }
01116 
01117 /** Set the ALPN matching client and server requirements */
01118 static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
01119                                                                      void* heap)
01120 {
01121     ALPN *alpn;
01122     int  ret;
01123 
01124     if (extensions == NULL || data == NULL)
01125         return BAD_FUNC_ARG;
01126 
01127     alpn = TLSX_ALPN_New((char *)data, size, heap);
01128     if (alpn == NULL) {
01129         WOLFSSL_MSG("Memory failure");
01130         return MEMORY_E;
01131     }
01132 
01133     alpn->negotiated = 1;
01134 
01135     ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
01136                                                                           heap);
01137     if (ret != 0) {
01138         TLSX_ALPN_Free(alpn, heap);
01139         return ret;
01140     }
01141 
01142     return SSL_SUCCESS;
01143 }
01144 
01145 /** Parses a buffer of ALPN extensions and set the first one matching
01146  * client and server requirements */
01147 static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, byte *input, word16 length,
01148                                  byte isRequest)
01149 {
01150     word16  size = 0, offset = 0, idx = 0;
01151     int     r = BUFFER_ERROR;
01152     byte    match = 0;
01153     TLSX    *extension;
01154     ALPN    *alpn = NULL, *list;
01155 
01156     if (OPAQUE16_LEN > length)
01157         return BUFFER_ERROR;
01158 
01159     ato16(input, &size);
01160     offset += OPAQUE16_LEN;
01161 
01162     extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
01163     if (extension == NULL)
01164         extension = TLSX_Find(ssl->ctx->extensions,
01165                                                TLSX_APPLICATION_LAYER_PROTOCOL);
01166 
01167 #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
01168     if (ssl->alpnSelect != NULL) {
01169         const byte* out;
01170         unsigned char outLen;
01171 
01172         if (ssl->alpnSelect(ssl, &out, &outLen, input + offset, size,
01173                             ssl->alpnSelectArg) == 0) {
01174             WOLFSSL_MSG("ALPN protocol match");
01175             if (TLSX_UseALPN(&ssl->extensions, (char*)out, outLen, 0, ssl->heap)
01176                                                                == SSL_SUCCESS) {
01177                 if (extension == NULL) {
01178                     extension = TLSX_Find(ssl->extensions,
01179                                           TLSX_APPLICATION_LAYER_PROTOCOL);
01180                 }
01181             }
01182         }
01183     }
01184 #endif
01185 
01186     if (extension == NULL || extension->data == NULL) {
01187         WOLFSSL_MSG("No ALPN extensions not used or bad");
01188         return isRequest ? 0             /* not using ALPN */
01189                          : BUFFER_ERROR; /* unexpected ALPN response */
01190     }
01191 
01192     /* validating alpn list length */
01193     if (length != OPAQUE16_LEN + size)
01194         return BUFFER_ERROR;
01195 
01196     list = (ALPN*)extension->data;
01197 
01198     /* keep the list sent by client */
01199     if (isRequest) {
01200         if (ssl->alpn_client_list != NULL)
01201             XFREE(ssl->alpn_client_list, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
01202 
01203         ssl->alpn_client_list = (char *)XMALLOC(size, ssl->heap,
01204                                                 DYNAMIC_TYPE_TMP_BUFFER);
01205         if (ssl->alpn_client_list == NULL)
01206             return MEMORY_ERROR;
01207     }
01208 
01209     for (size = 0; offset < length; offset += size) {
01210 
01211         size = input[offset++];
01212         if (offset + size > length)
01213             return BUFFER_ERROR;
01214 
01215         if (isRequest) {
01216             XMEMCPY(ssl->alpn_client_list+idx, (char*)input + offset, size);
01217             idx += size;
01218             ssl->alpn_client_list[idx++] = ',';
01219         }
01220 
01221         if (!match) {
01222             alpn = TLSX_ALPN_Find(list, (char*)input + offset, size);
01223             if (alpn != NULL) {
01224                 WOLFSSL_MSG("ALPN protocol match");
01225                 match = 1;
01226 
01227                 /* skip reading other values if not required */
01228                 if (!isRequest)
01229                     break;
01230             }
01231         }
01232     }
01233 
01234     if (isRequest)
01235         ssl->alpn_client_list[idx-1] = 0;
01236 
01237     if (!match) {
01238         WOLFSSL_MSG("No ALPN protocol match");
01239 
01240         /* do nothing if no protocol match between client and server and option
01241          is set to continue (like OpenSSL) */
01242         if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
01243             WOLFSSL_MSG("Continue on mismatch");
01244             return 0;
01245         }
01246 
01247         SendAlert(ssl, alert_fatal, no_application_protocol);
01248         return UNKNOWN_ALPN_PROTOCOL_NAME_E;
01249     }
01250 
01251     /* set the matching negotiated protocol */
01252     r = TLSX_SetALPN(&ssl->extensions,
01253                      alpn->protocol_name,
01254                      (word16)XSTRLEN(alpn->protocol_name),
01255                      ssl->heap);
01256     if (r != SSL_SUCCESS) {
01257         WOLFSSL_MSG("TLSX_UseALPN failed");
01258         return BUFFER_ERROR;
01259     }
01260 
01261     /* reply to ALPN extension sent from client */
01262     if (isRequest) {
01263 #ifndef NO_WOLFSSL_SERVER
01264         TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
01265 #endif
01266     }
01267 
01268     return 0;
01269 }
01270 
01271 /** Add a protocol name to the list of accepted usable ones */
01272 int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
01273                                                                      void* heap)
01274 {
01275     ALPN *alpn;
01276     TLSX *extension;
01277     int  ret;
01278 
01279     if (extensions == NULL || data == NULL)
01280         return BAD_FUNC_ARG;
01281 
01282     alpn = TLSX_ALPN_New((char *)data, size, heap);
01283     if (alpn == NULL) {
01284         WOLFSSL_MSG("Memory failure");
01285         return MEMORY_E;
01286     }
01287 
01288     /* Set Options of ALPN */
01289     alpn->options = options;
01290 
01291     extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
01292     if (extension == NULL) {
01293         ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
01294                                                              (void*)alpn, heap);
01295         if (ret != 0) {
01296             TLSX_ALPN_Free(alpn, heap);
01297             return ret;
01298         }
01299     }
01300     else {
01301         /* push new ALPN object to extension data. */
01302         alpn->next = (ALPN*)extension->data;
01303         extension->data = (void*)alpn;
01304     }
01305 
01306     return SSL_SUCCESS;
01307 }
01308 
01309 /** Get the protocol name set by the server */
01310 int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
01311 {
01312     TLSX *extension;
01313     ALPN *alpn;
01314 
01315     if (extensions == NULL || data == NULL || dataSz == NULL)
01316         return BAD_FUNC_ARG;
01317 
01318     extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
01319     if (extension == NULL) {
01320         WOLFSSL_MSG("TLS extension not found");
01321         return SSL_ALPN_NOT_FOUND;
01322     }
01323 
01324     alpn = (ALPN *)extension->data;
01325     if (alpn == NULL) {
01326         WOLFSSL_MSG("ALPN extension not found");
01327         *data = NULL;
01328         *dataSz = 0;
01329         return SSL_FATAL_ERROR;
01330     }
01331 
01332     if (alpn->negotiated != 1) {
01333 
01334         /* consider as an error */
01335         if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
01336             WOLFSSL_MSG("No protocol match with peer -> Failed");
01337             return SSL_FATAL_ERROR;
01338         }
01339 
01340         /* continue without negotiated protocol */
01341         WOLFSSL_MSG("No protocol match with peer -> Continue");
01342         return SSL_ALPN_NOT_FOUND;
01343     }
01344 
01345     if (alpn->next != NULL) {
01346         WOLFSSL_MSG("Only one protocol name must be accepted");
01347         return SSL_FATAL_ERROR;
01348     }
01349 
01350     *data = alpn->protocol_name;
01351     *dataSz = (word16)XSTRLEN((char*)*data);
01352 
01353     return SSL_SUCCESS;
01354 }
01355 
01356 #define ALPN_FREE_ALL     TLSX_ALPN_FreeAll
01357 #define ALPN_GET_SIZE     TLSX_ALPN_GetSize
01358 #define ALPN_WRITE        TLSX_ALPN_Write
01359 #define ALPN_PARSE        TLSX_ALPN_ParseAndSet
01360 
01361 #else /* HAVE_ALPN */
01362 
01363 #define ALPN_FREE_ALL(list, heap)
01364 #define ALPN_GET_SIZE(list)     0
01365 #define ALPN_WRITE(a, b)        0
01366 #define ALPN_PARSE(a, b, c, d)  0
01367 
01368 #endif /* HAVE_ALPN */
01369 
01370 /******************************************************************************/
01371 /* Server Name Indication                                                     */
01372 /******************************************************************************/
01373 
01374 #ifdef HAVE_SNI
01375 
01376 /** Creates a new SNI object. */
01377 static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
01378 {
01379     SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
01380 
01381     if (sni) {
01382         sni->type = type;
01383         sni->next = NULL;
01384 
01385     #ifndef NO_WOLFSSL_SERVER
01386         sni->options = 0;
01387         sni->status  = WOLFSSL_SNI_NO_MATCH;
01388     #endif
01389 
01390         switch (sni->type) {
01391             case WOLFSSL_SNI_HOST_NAME:
01392                 sni->data.host_name = (char*)XMALLOC(size + 1, heap,
01393                                                      DYNAMIC_TYPE_TLSX);
01394                 if (sni->data.host_name) {
01395                     XSTRNCPY(sni->data.host_name, (const char*)data, size);
01396                     sni->data.host_name[size] = 0;
01397                 } else {
01398                     XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
01399                     sni = NULL;
01400                 }
01401             break;
01402 
01403             default: /* invalid type */
01404                 XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
01405                 sni = NULL;
01406         }
01407     }
01408 
01409     return sni;
01410 }
01411 
01412 /** Releases a SNI object. */
01413 static void TLSX_SNI_Free(SNI* sni, void* heap)
01414 {
01415     if (sni) {
01416         switch (sni->type) {
01417             case WOLFSSL_SNI_HOST_NAME:
01418                 XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
01419             break;
01420         }
01421 
01422         XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
01423     }
01424     (void)heap;
01425 }
01426 
01427 /** Releases all SNI objects in the provided list. */
01428 static void TLSX_SNI_FreeAll(SNI* list, void* heap)
01429 {
01430     SNI* sni;
01431 
01432     while ((sni = list)) {
01433         list = sni->next;
01434         TLSX_SNI_Free(sni, heap);
01435     }
01436 }
01437 
01438 /** Tells the buffered size of the SNI objects in a list. */
01439 static word16 TLSX_SNI_GetSize(SNI* list)
01440 {
01441     SNI* sni;
01442     word16 length = OPAQUE16_LEN; /* list length */
01443 
01444     while ((sni = list)) {
01445         list = sni->next;
01446 
01447         length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
01448 
01449         switch (sni->type) {
01450             case WOLFSSL_SNI_HOST_NAME:
01451                 length += (word16)XSTRLEN((char*)sni->data.host_name);
01452             break;
01453         }
01454     }
01455 
01456     return length;
01457 }
01458 
01459 /** Writes the SNI objects of a list in a buffer. */
01460 static word16 TLSX_SNI_Write(SNI* list, byte* output)
01461 {
01462     SNI* sni;
01463     word16 length = 0;
01464     word16 offset = OPAQUE16_LEN; /* list length offset */
01465 
01466     while ((sni = list)) {
01467         list = sni->next;
01468 
01469         output[offset++] = sni->type; /* sni type */
01470 
01471         switch (sni->type) {
01472             case WOLFSSL_SNI_HOST_NAME:
01473                 length = (word16)XSTRLEN((char*)sni->data.host_name);
01474 
01475                 c16toa(length, output + offset); /* sni length */
01476                 offset += OPAQUE16_LEN;
01477 
01478                 XMEMCPY(output + offset, sni->data.host_name, length);
01479 
01480                 offset += length;
01481             break;
01482         }
01483     }
01484 
01485     c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
01486 
01487     return offset;
01488 }
01489 
01490 #ifndef NO_WOLFSSL_SERVER
01491 
01492 /** Finds a SNI object in the provided list. */
01493 static SNI* TLSX_SNI_Find(SNI *list, byte type)
01494 {
01495     SNI *sni = list;
01496 
01497     while (sni && sni->type != type)
01498         sni = sni->next;
01499 
01500     return sni;
01501 }
01502 
01503 
01504 /** Sets the status of a SNI object. */
01505 static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
01506 {
01507     TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
01508     SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
01509 
01510     if (sni)
01511         sni->status = status;
01512 }
01513 
01514 /** Gets the status of a SNI object. */
01515 byte TLSX_SNI_Status(TLSX* extensions, byte type)
01516 {
01517     TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
01518     SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
01519 
01520     if (sni)
01521         return sni->status;
01522 
01523     return 0;
01524 }
01525 
01526 #endif /* NO_WOLFSSL_SERVER */
01527 
01528 /** Parses a buffer of SNI extensions. */
01529 static int TLSX_SNI_Parse(WOLFSSL* ssl, byte* input, word16 length,
01530                                                                  byte isRequest)
01531 {
01532 #ifndef NO_WOLFSSL_SERVER
01533     word16 size = 0;
01534     word16 offset = 0;
01535     int cacheOnly = 0;
01536 #endif
01537 
01538     TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
01539 
01540     if (!extension)
01541         extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
01542 
01543     (void)isRequest;
01544     (void)input;
01545 
01546     if (!extension || !extension->data) {
01547 #if defined(WOLFSSL_ALWAYS_KEEP_SNI) && !defined(NO_WOLFSSL_SERVER)
01548         /* This will keep SNI even though TLSX_UseSNI has not been called.
01549          * Enable it so that the received sni is available to functions
01550          * that use a custom callback when SNI is received */
01551         cacheOnly = 1;
01552         WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
01553 #else
01554         return isRequest ? 0             /* not using SNI.           */
01555                          : BUFFER_ERROR; /* unexpected SNI response. */
01556 #endif
01557     }
01558 
01559     if (!isRequest)
01560         return length ? BUFFER_ERROR /* SNI response MUST be empty. */
01561                       : 0;           /* nothing else to do.         */
01562 
01563 #ifndef NO_WOLFSSL_SERVER
01564 
01565     if (OPAQUE16_LEN > length)
01566         return BUFFER_ERROR;
01567 
01568     ato16(input, &size);
01569     offset += OPAQUE16_LEN;
01570 
01571     /* validating sni list length */
01572     if (length != OPAQUE16_LEN + size)
01573         return BUFFER_ERROR;
01574 
01575     for (size = 0; offset < length; offset += size) {
01576         SNI *sni = NULL;
01577         byte type = input[offset++];
01578 
01579         if (offset + OPAQUE16_LEN > length)
01580             return BUFFER_ERROR;
01581 
01582         ato16(input + offset, &size);
01583         offset += OPAQUE16_LEN;
01584 
01585         if (offset + size > length)
01586             return BUFFER_ERROR;
01587 
01588         if (!cacheOnly && !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
01589             continue; /* not using this type of SNI. */
01590 
01591         switch(type) {
01592             case WOLFSSL_SNI_HOST_NAME: {
01593                 int matchStat;
01594 #ifdef WOLFSSL_TLS13
01595                 /* Don't process the second ClientHello SNI extension if there
01596                  * was problems with the first.
01597                  */
01598                 if (sni->status != 0)
01599                     break;
01600 #endif
01601                 byte matched = cacheOnly ||
01602                             ((XSTRLEN(sni->data.host_name) == size)
01603                             && (XSTRNCMP(sni->data.host_name,
01604                                        (const char*)input + offset, size) == 0));
01605 
01606                 if (matched || sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH) {
01607                     int r = TLSX_UseSNI(&ssl->extensions,
01608                                          type, input + offset, size, ssl->heap);
01609 
01610                     if (r != SSL_SUCCESS)
01611                         return r; /* throws error. */
01612 
01613                     if(cacheOnly) {
01614                         WOLFSSL_MSG("Forcing storage of SNI, Fake match");
01615                         matchStat = WOLFSSL_SNI_FORCE_KEEP;
01616                     } else if(matched) {
01617                         WOLFSSL_MSG("SNI did match!");
01618                         matchStat = WOLFSSL_SNI_REAL_MATCH;
01619                     } else {
01620                         WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
01621                         matchStat = WOLFSSL_SNI_FAKE_MATCH;
01622                     }
01623 
01624                     TLSX_SNI_SetStatus(ssl->extensions, type, matchStat);
01625 
01626                     if(!cacheOnly)
01627                         TLSX_SetResponse(ssl, TLSX_SERVER_NAME);
01628 
01629                 } else if (!(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
01630                     SendAlert(ssl, alert_fatal, unrecognized_name);
01631 
01632                     return UNKNOWN_SNI_HOST_NAME_E;
01633                 }
01634                 break;
01635             }
01636         }
01637     }
01638 
01639 #endif
01640 
01641     return 0;
01642 }
01643 
01644 static int TLSX_SNI_VerifyParse(WOLFSSL* ssl,  byte isRequest)
01645 {
01646     (void)ssl;
01647 
01648     if (isRequest) {
01649     #ifndef NO_WOLFSSL_SERVER
01650         TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
01651         TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
01652         SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
01653         SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
01654         SNI* sni = NULL;
01655 
01656         for (; ctx_sni; ctx_sni = ctx_sni->next) {
01657             if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
01658                 sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
01659 
01660                 if (sni) {
01661                     if (sni->status != WOLFSSL_SNI_NO_MATCH)
01662                         continue;
01663 
01664                     /* if ssl level overrides ctx level, it is ok. */
01665                     if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
01666                         continue;
01667                 }
01668 
01669                 SendAlert(ssl, alert_fatal, handshake_failure);
01670                 return SNI_ABSENT_ERROR;
01671             }
01672         }
01673 
01674         for (; ssl_sni; ssl_sni = ssl_sni->next) {
01675             if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
01676                 if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
01677                     continue;
01678 
01679                 SendAlert(ssl, alert_fatal, handshake_failure);
01680                 return SNI_ABSENT_ERROR;
01681             }
01682         }
01683     #endif /* NO_WOLFSSL_SERVER */
01684     }
01685 
01686     return 0;
01687 }
01688 
01689 int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
01690                                                                      void* heap)
01691 {
01692     TLSX* extension;
01693     SNI*  sni       = NULL;
01694 
01695     if (extensions == NULL || data == NULL)
01696         return BAD_FUNC_ARG;
01697 
01698     if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
01699         return MEMORY_E;
01700 
01701     extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
01702     if (!extension) {
01703         int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
01704         if (ret != 0) {
01705             TLSX_SNI_Free(sni, heap);
01706             return ret;
01707         }
01708     }
01709     else {
01710         /* push new SNI object to extension data. */
01711         sni->next = (SNI*)extension->data;
01712         extension->data = (void*)sni;
01713 
01714         /* remove duplicate SNI, there should be only one of each type. */
01715         do {
01716             if (sni->next && sni->next->type == type) {
01717                 SNI *next = sni->next;
01718 
01719                 sni->next = next->next;
01720                 TLSX_SNI_Free(next, heap);
01721 
01722                 /* there is no way to occur more than */
01723                 /* two SNIs of the same type.         */
01724                 break;
01725             }
01726         } while ((sni = sni->next));
01727     }
01728 
01729     return SSL_SUCCESS;
01730 }
01731 
01732 #ifndef NO_WOLFSSL_SERVER
01733 
01734 /** Tells the SNI requested by the client. */
01735 word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data)
01736 {
01737     TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
01738     SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
01739 
01740     if (sni && sni->status != WOLFSSL_SNI_NO_MATCH) {
01741         switch (sni->type) {
01742             case WOLFSSL_SNI_HOST_NAME:
01743                 if (data) {
01744                     *data = sni->data.host_name;
01745                     return (word16)XSTRLEN((char*)*data);
01746                 }
01747         }
01748     }
01749 
01750     return 0;
01751 }
01752 
01753 /** Sets the options for a SNI object. */
01754 void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
01755 {
01756     TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
01757     SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
01758 
01759     if (sni)
01760         sni->options = options;
01761 }
01762 
01763 /** Retrieves a SNI request from a client hello buffer. */
01764 int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
01765                            byte type, byte* sni, word32* inOutSz)
01766 {
01767     word32 offset = 0;
01768     word32 len32  = 0;
01769     word16 len16  = 0;
01770 
01771     if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
01772         return INCOMPLETE_DATA;
01773 
01774     /* TLS record header */
01775     if ((enum ContentType) clientHello[offset++] != handshake) {
01776 
01777         /* checking for SSLv2.0 client hello according to: */
01778         /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
01779         if ((enum HandShakeType) clientHello[++offset] == client_hello) {
01780             offset += ENUM_LEN + VERSION_SZ; /* skip version */
01781 
01782             ato16(clientHello + offset, &len16);
01783             offset += OPAQUE16_LEN;
01784 
01785             if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
01786                 return BUFFER_ERROR;
01787 
01788             ato16(clientHello + offset, &len16);
01789             /* Returning SNI_UNSUPPORTED do not increment offset here */
01790 
01791             if (len16 != 0) /* session_id_length must be 0 */
01792                 return BUFFER_ERROR;
01793 
01794             return SNI_UNSUPPORTED;
01795         }
01796 
01797         return BUFFER_ERROR;
01798     }
01799 
01800     if (clientHello[offset++] != SSLv3_MAJOR)
01801         return BUFFER_ERROR;
01802 
01803     if (clientHello[offset++] < TLSv1_MINOR)
01804         return SNI_UNSUPPORTED;
01805 
01806     ato16(clientHello + offset, &len16);
01807     offset += OPAQUE16_LEN;
01808 
01809     if (offset + len16 > helloSz)
01810         return INCOMPLETE_DATA;
01811 
01812     /* Handshake header */
01813     if ((enum HandShakeType) clientHello[offset] != client_hello)
01814         return BUFFER_ERROR;
01815 
01816     c24to32(clientHello + offset + 1, &len32);
01817     offset += HANDSHAKE_HEADER_SZ;
01818 
01819     if (offset + len32 > helloSz)
01820         return BUFFER_ERROR;
01821 
01822     /* client hello */
01823     offset += VERSION_SZ + RAN_LEN; /* version, random */
01824 
01825     if (helloSz < offset + clientHello[offset])
01826         return BUFFER_ERROR;
01827 
01828     offset += ENUM_LEN + clientHello[offset]; /* skip session id */
01829 
01830     /* cypher suites */
01831     if (helloSz < offset + OPAQUE16_LEN)
01832         return BUFFER_ERROR;
01833 
01834     ato16(clientHello + offset, &len16);
01835     offset += OPAQUE16_LEN;
01836 
01837     if (helloSz < offset + len16)
01838         return BUFFER_ERROR;
01839 
01840     offset += len16; /* skip cypher suites */
01841 
01842     /* compression methods */
01843     if (helloSz < offset + 1)
01844         return BUFFER_ERROR;
01845 
01846     if (helloSz < offset + clientHello[offset])
01847         return BUFFER_ERROR;
01848 
01849     offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
01850 
01851     /* extensions */
01852     if (helloSz < offset + OPAQUE16_LEN)
01853         return 0; /* no extensions in client hello. */
01854 
01855     ato16(clientHello + offset, &len16);
01856     offset += OPAQUE16_LEN;
01857 
01858     if (helloSz < offset + len16)
01859         return BUFFER_ERROR;
01860 
01861     while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
01862         word16 extType;
01863         word16 extLen;
01864 
01865         ato16(clientHello + offset, &extType);
01866         offset += OPAQUE16_LEN;
01867 
01868         ato16(clientHello + offset, &extLen);
01869         offset += OPAQUE16_LEN;
01870 
01871         if (helloSz < offset + extLen)
01872             return BUFFER_ERROR;
01873 
01874         if (extType != TLSX_SERVER_NAME) {
01875             offset += extLen; /* skip extension */
01876         } else {
01877             word16 listLen;
01878 
01879             ato16(clientHello + offset, &listLen);
01880             offset += OPAQUE16_LEN;
01881 
01882             if (helloSz < offset + listLen)
01883                 return BUFFER_ERROR;
01884 
01885             while (listLen > ENUM_LEN + OPAQUE16_LEN) {
01886                 byte   sniType = clientHello[offset++];
01887                 word16 sniLen;
01888 
01889                 ato16(clientHello + offset, &sniLen);
01890                 offset += OPAQUE16_LEN;
01891 
01892                 if (helloSz < offset + sniLen)
01893                     return BUFFER_ERROR;
01894 
01895                 if (sniType != type) {
01896                     offset  += sniLen;
01897                     listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
01898                     continue;
01899                 }
01900 
01901                 *inOutSz = min(sniLen, *inOutSz);
01902                 XMEMCPY(sni, clientHello + offset, *inOutSz);
01903 
01904                 return SSL_SUCCESS;
01905             }
01906         }
01907 
01908         len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
01909     }
01910 
01911     return len16 ? BUFFER_ERROR : 0;
01912 }
01913 
01914 #endif
01915 
01916 #define SNI_FREE_ALL     TLSX_SNI_FreeAll
01917 #define SNI_GET_SIZE     TLSX_SNI_GetSize
01918 #define SNI_WRITE        TLSX_SNI_Write
01919 #define SNI_PARSE        TLSX_SNI_Parse
01920 #define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
01921 
01922 #else
01923 
01924 #define SNI_FREE_ALL(list, heap)
01925 #define SNI_GET_SIZE(list)     0
01926 #define SNI_WRITE(a, b)        0
01927 #define SNI_PARSE(a, b, c, d)  0
01928 #define SNI_VERIFY_PARSE(a, b) 0
01929 
01930 #endif /* HAVE_SNI */
01931 
01932 /******************************************************************************/
01933 /* Max Fragment Length Negotiation                                            */
01934 /******************************************************************************/
01935 
01936 #ifdef HAVE_MAX_FRAGMENT
01937 
01938 static word16 TLSX_MFL_Write(byte* data, byte* output)
01939 {
01940     output[0] = data[0];
01941 
01942     return ENUM_LEN;
01943 }
01944 
01945 static int TLSX_MFL_Parse(WOLFSSL* ssl, byte* input, word16 length,
01946                                                                  byte isRequest)
01947 {
01948     (void)isRequest;
01949 
01950     if (length != ENUM_LEN)
01951         return BUFFER_ERROR;
01952 
01953     switch (*input) {
01954         case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
01955         case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
01956         case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
01957         case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
01958         case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
01959 
01960         default:
01961             SendAlert(ssl, alert_fatal, illegal_parameter);
01962 
01963             return UNKNOWN_MAX_FRAG_LEN_E;
01964     }
01965 
01966 #ifndef NO_WOLFSSL_SERVER
01967     if (isRequest) {
01968         int r = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
01969 
01970         if (r != SSL_SUCCESS) return r; /* throw error */
01971 
01972         TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
01973     }
01974 #endif
01975 
01976     return 0;
01977 }
01978 
01979 int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
01980 {
01981     byte* data = NULL;
01982     int   ret  = 0;
01983 
01984     if (extensions == NULL)
01985         return BAD_FUNC_ARG;
01986 
01987     if (mfl < WOLFSSL_MFL_2_9 || WOLFSSL_MFL_2_13 < mfl)
01988         return BAD_FUNC_ARG;
01989 
01990     if ((data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX)) == NULL)
01991         return MEMORY_E;
01992 
01993     data[0] = mfl;
01994 
01995     /* push new MFL extension. */
01996     if ((ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap))
01997                                                                          != 0) {
01998         XFREE(data, heap, DYNAMIC_TYPE_TLSX);
01999         return ret;
02000     }
02001 
02002     return SSL_SUCCESS;
02003 }
02004 
02005 
02006 #define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
02007 #define MFL_GET_SIZE(data) ENUM_LEN
02008 #define MFL_WRITE          TLSX_MFL_Write
02009 #define MFL_PARSE          TLSX_MFL_Parse
02010 
02011 #else
02012 
02013 #define MFL_FREE_ALL(a, b)
02014 #define MFL_GET_SIZE(a)       0
02015 #define MFL_WRITE(a, b)       0
02016 #define MFL_PARSE(a, b, c, d) 0
02017 
02018 #endif /* HAVE_MAX_FRAGMENT */
02019 
02020 /******************************************************************************/
02021 /* Truncated HMAC                                                             */
02022 /******************************************************************************/
02023 
02024 #ifdef HAVE_TRUNCATED_HMAC
02025 
02026 static int TLSX_THM_Parse(WOLFSSL* ssl, byte* input, word16 length,
02027                                                                  byte isRequest)
02028 {
02029     (void)isRequest;
02030 
02031     if (length != 0 || input == NULL)
02032         return BUFFER_ERROR;
02033 
02034 #ifndef NO_WOLFSSL_SERVER
02035     if (isRequest) {
02036         int r = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
02037 
02038         if (r != SSL_SUCCESS)
02039             return r; /* throw error */
02040 
02041         TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
02042     }
02043 #endif
02044 
02045     ssl->truncated_hmac = 1;
02046 
02047     return 0;
02048 }
02049 
02050 int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
02051 {
02052     int ret = 0;
02053 
02054     if (extensions == NULL)
02055         return BAD_FUNC_ARG;
02056 
02057     if ((ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap)) != 0)
02058         return ret;
02059 
02060     return SSL_SUCCESS;
02061 }
02062 
02063 #define THM_PARSE TLSX_THM_Parse
02064 
02065 #else
02066 
02067 #define THM_PARSE(a, b, c, d) 0
02068 
02069 #endif /* HAVE_TRUNCATED_HMAC */
02070 
02071 /******************************************************************************/
02072 /* Certificate Status Request                                                 */
02073 /******************************************************************************/
02074 
02075 #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
02076 
02077 static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
02078 {
02079     switch (csr->status_type) {
02080         case WOLFSSL_CSR_OCSP:
02081             FreeOcspRequest(&csr->request.ocsp);
02082         break;
02083     }
02084 
02085     XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
02086     (void)heap;
02087 }
02088 
02089 static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
02090 {
02091     word16 size = 0;
02092 
02093     /* shut up compiler warnings */
02094     (void) csr; (void) isRequest;
02095 
02096 #ifndef NO_WOLFSSL_CLIENT
02097     if (isRequest) {
02098         switch (csr->status_type) {
02099             case WOLFSSL_CSR_OCSP:
02100                 size += ENUM_LEN + 2 * OPAQUE16_LEN;
02101 
02102                 if (csr->request.ocsp.nonceSz)
02103                     size += OCSP_NONCE_EXT_SZ;
02104             break;
02105         }
02106     }
02107 #endif
02108 
02109     return size;
02110 }
02111 
02112 static word16 TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
02113                                                                  byte isRequest)
02114 {
02115     /* shut up compiler warnings */
02116     (void) csr; (void) output; (void) isRequest;
02117 
02118 #ifndef NO_WOLFSSL_CLIENT
02119     if (isRequest) {
02120         word16 offset = 0;
02121         word16 length = 0;
02122 
02123         /* type */
02124         output[offset++] = csr->status_type;
02125 
02126         switch (csr->status_type) {
02127             case WOLFSSL_CSR_OCSP:
02128                 /* responder id list */
02129                 c16toa(0, output + offset);
02130                 offset += OPAQUE16_LEN;
02131 
02132                 /* request extensions */
02133                 if (csr->request.ocsp.nonceSz)
02134                     length = (word16)EncodeOcspRequestExtensions(
02135                                                  &csr->request.ocsp,
02136                                                  output + offset + OPAQUE16_LEN,
02137                                                  OCSP_NONCE_EXT_SZ);
02138 
02139                 c16toa(length, output + offset);
02140                 offset += OPAQUE16_LEN + length;
02141 
02142             break;
02143         }
02144 
02145         return offset;
02146     }
02147 #endif
02148 
02149     return 0;
02150 }
02151 
02152 static int TLSX_CSR_Parse(WOLFSSL* ssl, byte* input, word16 length,
02153                                                                  byte isRequest)
02154 {
02155     int ret;
02156 
02157     /* shut up compiler warnings */
02158     (void) ssl; (void) input;
02159 
02160     if (!isRequest) {
02161 #ifndef NO_WOLFSSL_CLIENT
02162         TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
02163         CertificateStatusRequest* csr = extension ?
02164                               (CertificateStatusRequest*)extension->data : NULL;
02165 
02166         if (!csr) {
02167             /* look at context level */
02168             extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
02169             csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
02170 
02171             if (!csr)
02172                 return BUFFER_ERROR; /* unexpected extension */
02173 
02174             /* enable extension at ssl level */
02175             ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
02176                                      csr->status_type, csr->options, ssl->heap,
02177                                      ssl->devId);
02178             if (ret != SSL_SUCCESS)
02179                 return ret;
02180 
02181             switch (csr->status_type) {
02182                 case WOLFSSL_CSR_OCSP:
02183                     /* propagate nonce */
02184                     if (csr->request.ocsp.nonceSz) {
02185                         OcspRequest* request =
02186                              (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
02187 
02188                         if (request) {
02189                             XMEMCPY(request->nonce, csr->request.ocsp.nonce,
02190                                                     csr->request.ocsp.nonceSz);
02191                             request->nonceSz = csr->request.ocsp.nonceSz;
02192                         }
02193                     }
02194                 break;
02195             }
02196         }
02197 
02198         ssl->status_request = 1;
02199 
02200         return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
02201 #endif
02202     }
02203     else {
02204 #ifndef NO_WOLFSSL_SERVER
02205         byte   status_type;
02206         word16 offset = 0;
02207         word16 size = 0;
02208 
02209         if (length < ENUM_LEN)
02210             return BUFFER_ERROR;
02211 
02212         status_type = input[offset++];
02213 
02214         switch (status_type) {
02215             case WOLFSSL_CSR_OCSP: {
02216 
02217                 /* skip responder_id_list */
02218                 if (length - offset < OPAQUE16_LEN)
02219                     return BUFFER_ERROR;
02220 
02221                 ato16(input + offset, &size);
02222                 offset += OPAQUE16_LEN + size;
02223 
02224                 /* skip request_extensions */
02225                 if (length - offset < OPAQUE16_LEN)
02226                     return BUFFER_ERROR;
02227 
02228                 ato16(input + offset, &size);
02229                 offset += OPAQUE16_LEN + size;
02230 
02231                 if (offset > length)
02232                     return BUFFER_ERROR;
02233 
02234                 /* is able to send OCSP response? */
02235                 if (ssl->ctx->cm == NULL || !ssl->ctx->cm->ocspStaplingEnabled)
02236                     return 0;
02237             }
02238             break;
02239 
02240             /* unknown status type */
02241             default:
02242                 return 0;
02243         }
02244 
02245         /* if using status_request and already sending it, skip this one */
02246         #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
02247         if (ssl->status_request_v2)
02248             return 0;
02249         #endif
02250 
02251         /* accept the first good status_type and return */
02252         ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
02253                                                       0, ssl->heap, ssl->devId);
02254         if (ret != SSL_SUCCESS)
02255             return ret; /* throw error */
02256 
02257         TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
02258         ssl->status_request = status_type;
02259 
02260 #endif
02261     }
02262 
02263     return 0;
02264 }
02265 
02266 int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
02267 {
02268     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
02269     CertificateStatusRequest* csr = extension ?
02270         (CertificateStatusRequest*)extension->data : NULL;
02271     int ret = 0;
02272 
02273     if (csr) {
02274         switch (csr->status_type) {
02275             case WOLFSSL_CSR_OCSP: {
02276                 byte nonce[MAX_OCSP_NONCE_SZ];
02277                 int  nonceSz = csr->request.ocsp.nonceSz;
02278 
02279                 /* preserve nonce */
02280                 XMEMCPY(nonce, csr->request.ocsp.nonce, nonceSz);
02281 
02282                 if ((ret = InitOcspRequest(&csr->request.ocsp, cert, 0, heap))
02283                                                                            != 0)
02284                     return ret;
02285 
02286                 /* restore nonce */
02287                 XMEMCPY(csr->request.ocsp.nonce, nonce, nonceSz);
02288                 csr->request.ocsp.nonceSz = nonceSz;
02289             }
02290             break;
02291         }
02292     }
02293 
02294     return ret;
02295 }
02296 
02297 void* TLSX_CSR_GetRequest(TLSX* extensions)
02298 {
02299     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
02300     CertificateStatusRequest* csr = extension ?
02301                               (CertificateStatusRequest*)extension->data : NULL;
02302 
02303     if (csr) {
02304         switch (csr->status_type) {
02305             case WOLFSSL_CSR_OCSP:
02306                 return &csr->request.ocsp;
02307             break;
02308         }
02309     }
02310 
02311     return NULL;
02312 }
02313 
02314 int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
02315 {
02316     TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
02317     CertificateStatusRequest* csr = extension ?
02318                               (CertificateStatusRequest*)extension->data : NULL;
02319 
02320     if (csr) {
02321         switch (csr->status_type) {
02322             case WOLFSSL_CSR_OCSP:
02323                 if (ssl->ctx->cm->ocspEnabled) {
02324                 #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
02325                     csr->request.ocsp.ssl = ssl;
02326                 #endif
02327                     return CheckOcspRequest(ssl->ctx->cm->ocsp,
02328                                                       &csr->request.ocsp, NULL);
02329                 }
02330                 else
02331                     return OCSP_LOOKUP_FAIL;
02332         }
02333     }
02334 
02335     return 0;
02336 }
02337 
02338 int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
02339                                            byte options, void* heap, int devId)
02340 {
02341     CertificateStatusRequest* csr = NULL;
02342     int ret = 0;
02343 
02344     if (!extensions || status_type != WOLFSSL_CSR_OCSP)
02345         return BAD_FUNC_ARG;
02346 
02347     csr = (CertificateStatusRequest*)
02348              XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
02349     if (!csr)
02350         return MEMORY_E;
02351 
02352     ForceZero(csr, sizeof(CertificateStatusRequest));
02353 
02354     csr->status_type = status_type;
02355     csr->options     = options;
02356 
02357     switch (csr->status_type) {
02358         case WOLFSSL_CSR_OCSP:
02359             if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
02360                 WC_RNG rng;
02361 
02362             #ifndef HAVE_FIPS
02363                 ret = wc_InitRng_ex(&rng, heap, devId);
02364             #else
02365                 ret = wc_InitRng(&rng);
02366                 (void)devId;
02367             #endif
02368                 if (ret == 0) {
02369                     if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp.nonce,
02370                                                         MAX_OCSP_NONCE_SZ) == 0)
02371                         csr->request.ocsp.nonceSz = MAX_OCSP_NONCE_SZ;
02372 
02373                     wc_FreeRng(&rng);
02374                 }
02375             }
02376         break;
02377     }
02378 
02379     if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
02380         XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
02381         return ret;
02382     }
02383 
02384     return SSL_SUCCESS;
02385 }
02386 
02387 #define CSR_FREE_ALL TLSX_CSR_Free
02388 #define CSR_GET_SIZE TLSX_CSR_GetSize
02389 #define CSR_WRITE    TLSX_CSR_Write
02390 #define CSR_PARSE    TLSX_CSR_Parse
02391 
02392 #else
02393 
02394 #define CSR_FREE_ALL(data, heap)
02395 #define CSR_GET_SIZE(a, b)    0
02396 #define CSR_WRITE(a, b, c)    0
02397 #define CSR_PARSE(a, b, c, d) 0
02398 
02399 #endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
02400 
02401 /******************************************************************************/
02402 /* Certificate Status Request v2                                              */
02403 /******************************************************************************/
02404 
02405 #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
02406 
02407 static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
02408 {
02409     CertificateStatusRequestItemV2* next;
02410 
02411     for (; csr2; csr2 = next) {
02412         next = csr2->next;
02413 
02414         switch (csr2->status_type) {
02415             case WOLFSSL_CSR2_OCSP:
02416             case WOLFSSL_CSR2_OCSP_MULTI:
02417                 while(csr2->requests--)
02418                     FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
02419             break;
02420         }
02421 
02422         XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
02423     }
02424     (void)heap;
02425 }
02426 
02427 static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
02428                                                                  byte isRequest)
02429 {
02430     word16 size = 0;
02431 
02432     /* shut up compiler warnings */
02433     (void) csr2; (void) isRequest;
02434 
02435 #ifndef NO_WOLFSSL_CLIENT
02436     if (isRequest) {
02437         CertificateStatusRequestItemV2* next;
02438 
02439         for (size = OPAQUE16_LEN; csr2; csr2 = next) {
02440             next = csr2->next;
02441 
02442             switch (csr2->status_type) {
02443                 case WOLFSSL_CSR2_OCSP:
02444                 case WOLFSSL_CSR2_OCSP_MULTI:
02445                     size += ENUM_LEN + 3 * OPAQUE16_LEN;
02446 
02447                     if (csr2->request.ocsp[0].nonceSz)
02448                         size += OCSP_NONCE_EXT_SZ;
02449                 break;
02450             }
02451         }
02452     }
02453 #endif
02454 
02455     return size;
02456 }
02457 
02458 static word16 TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
02459                                                    byte* output, byte isRequest)
02460 {
02461     /* shut up compiler warnings */
02462     (void) csr2; (void) output; (void) isRequest;
02463 
02464 #ifndef NO_WOLFSSL_CLIENT
02465     if (isRequest) {
02466         word16 offset;
02467         word16 length;
02468 
02469         for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
02470             /* status_type */
02471             output[offset++] = csr2->status_type;
02472 
02473             /* request */
02474             switch (csr2->status_type) {
02475                 case WOLFSSL_CSR2_OCSP:
02476                 case WOLFSSL_CSR2_OCSP_MULTI:
02477                     /* request_length */
02478                     length = 2 * OPAQUE16_LEN;
02479 
02480                     if (csr2->request.ocsp[0].nonceSz)
02481                         length += OCSP_NONCE_EXT_SZ;
02482 
02483                     c16toa(length, output + offset);
02484                     offset += OPAQUE16_LEN;
02485 
02486                     /* responder id list */
02487                     c16toa(0, output + offset);
02488                     offset += OPAQUE16_LEN;
02489 
02490                     /* request extensions */
02491                     length = 0;
02492 
02493                     if (csr2->request.ocsp[0].nonceSz)
02494                         length = (word16)EncodeOcspRequestExtensions(
02495                                                  &csr2->request.ocsp[0],
02496                                                  output + offset + OPAQUE16_LEN,
02497                                                  OCSP_NONCE_EXT_SZ);
02498 
02499                     c16toa(length, output + offset);
02500                     offset += OPAQUE16_LEN + length;
02501                 break;
02502             }
02503         }
02504 
02505         /* list size */
02506         c16toa(offset - OPAQUE16_LEN, output);
02507 
02508         return offset;
02509     }
02510 #endif
02511 
02512     return 0;
02513 }
02514 
02515 static int TLSX_CSR2_Parse(WOLFSSL* ssl, byte* input, word16 length,
02516                                                                  byte isRequest)
02517 {
02518     int ret;
02519 
02520     /* shut up compiler warnings */
02521     (void) ssl; (void) input;
02522 
02523     if (!isRequest) {
02524 #ifndef NO_WOLFSSL_CLIENT
02525         TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
02526         CertificateStatusRequestItemV2* csr2 = extension ?
02527                         (CertificateStatusRequestItemV2*)extension->data : NULL;
02528 
02529         if (!csr2) {
02530             /* look at context level */
02531             extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
02532             csr2 = extension ?
02533                         (CertificateStatusRequestItemV2*)extension->data : NULL;
02534 
02535             if (!csr2)
02536                 return BUFFER_ERROR; /* unexpected extension */
02537 
02538             /* enable extension at ssl level */
02539             for (; csr2; csr2 = csr2->next) {
02540                 ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
02541                        csr2->status_type, csr2->options, ssl->heap, ssl->devId);
02542                 if (ret != SSL_SUCCESS)
02543                     return ret;
02544 
02545                 switch (csr2->status_type) {
02546                     case WOLFSSL_CSR2_OCSP:
02547                         /* followed by */
02548                     case WOLFSSL_CSR2_OCSP_MULTI:
02549                         /* propagate nonce */
02550                         if (csr2->request.ocsp[0].nonceSz) {
02551                             OcspRequest* request =
02552                              (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
02553                                                           csr2->status_type, 0);
02554 
02555                             if (request) {
02556                                 XMEMCPY(request->nonce,
02557                                         csr2->request.ocsp[0].nonce,
02558                                         csr2->request.ocsp[0].nonceSz);
02559 
02560                                 request->nonceSz =
02561                                                   csr2->request.ocsp[0].nonceSz;
02562                             }
02563                         }
02564                     break;
02565                 }
02566             }
02567         }
02568 
02569         ssl->status_request_v2 = 1;
02570 
02571         return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
02572 #endif
02573     }
02574     else {
02575 #ifndef NO_WOLFSSL_SERVER
02576         byte   status_type;
02577         word16 request_length;
02578         word16 offset = 0;
02579         word16 size = 0;
02580 
02581         /* list size */
02582         ato16(input + offset, &request_length);
02583         offset += OPAQUE16_LEN;
02584 
02585         if (length - OPAQUE16_LEN != request_length)
02586             return BUFFER_ERROR;
02587 
02588         while (length > offset) {
02589             if (length - offset < ENUM_LEN + OPAQUE16_LEN)
02590                 return BUFFER_ERROR;
02591 
02592             status_type = input[offset++];
02593 
02594             ato16(input + offset, &request_length);
02595             offset += OPAQUE16_LEN;
02596 
02597             if (length - offset < request_length)
02598                 return BUFFER_ERROR;
02599 
02600             switch (status_type) {
02601                 case WOLFSSL_CSR2_OCSP:
02602                 case WOLFSSL_CSR2_OCSP_MULTI:
02603                     /* skip responder_id_list */
02604                     if (length - offset < OPAQUE16_LEN)
02605                         return BUFFER_ERROR;
02606 
02607                     ato16(input + offset, &size);
02608                     offset += OPAQUE16_LEN + size;
02609 
02610                     /* skip request_extensions */
02611                     if (length - offset < OPAQUE16_LEN)
02612                         return BUFFER_ERROR;
02613 
02614                     ato16(input + offset, &size);
02615                     offset += OPAQUE16_LEN + size;
02616 
02617                     if (offset > length)
02618                         return BUFFER_ERROR;
02619 
02620                     /* is able to send OCSP response? */
02621                     if (ssl->ctx->cm == NULL
02622                     || !ssl->ctx->cm->ocspStaplingEnabled)
02623                         continue;
02624                 break;
02625 
02626                 default:
02627                     /* unknown status type, skipping! */
02628                     offset += request_length;
02629                     continue;
02630             }
02631 
02632             /* if using status_request and already sending it, skip this one */
02633             #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
02634             if (ssl->status_request)
02635                 return 0;
02636             #endif
02637 
02638             /* accept the first good status_type and return */
02639             ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
02640                                          status_type, 0, ssl->heap, ssl->devId);
02641             if (ret != SSL_SUCCESS)
02642                 return ret; /* throw error */
02643 
02644             TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
02645             ssl->status_request_v2 = status_type;
02646 
02647             return 0;
02648         }
02649 #endif
02650     }
02651 
02652     return 0;
02653 }
02654 
02655 int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
02656                                                                      void* heap)
02657 {
02658     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
02659     CertificateStatusRequestItemV2* csr2 = extension ?
02660         (CertificateStatusRequestItemV2*)extension->data : NULL;
02661     int ret = 0;
02662 
02663     for (; csr2; csr2 = csr2->next) {
02664         switch (csr2->status_type) {
02665             case WOLFSSL_CSR2_OCSP:
02666                 if (!isPeer || csr2->requests != 0)
02667                     break;
02668 
02669                 /* followed by */
02670 
02671             case WOLFSSL_CSR2_OCSP_MULTI: {
02672                 if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
02673                     byte nonce[MAX_OCSP_NONCE_SZ];
02674                     int  nonceSz = csr2->request.ocsp[0].nonceSz;
02675 
02676                     /* preserve nonce, replicating nonce of ocsp[0] */
02677                     XMEMCPY(nonce, csr2->request.ocsp[0].nonce, nonceSz);
02678 
02679                     if ((ret = InitOcspRequest(
02680                                       &csr2->request.ocsp[csr2->requests], cert,
02681                                                                  0, heap)) != 0)
02682                         return ret;
02683 
02684                     /* restore nonce */
02685                     XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
02686                                                                 nonce, nonceSz);
02687                     csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
02688                     csr2->requests++;
02689                 }
02690             }
02691             break;
02692         }
02693     }
02694 
02695     (void)cert;
02696     return ret;
02697 }
02698 
02699 void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
02700 {
02701     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
02702     CertificateStatusRequestItemV2* csr2 = extension ?
02703                         (CertificateStatusRequestItemV2*)extension->data : NULL;
02704 
02705     for (; csr2; csr2 = csr2->next) {
02706         if (csr2->status_type == status_type) {
02707             switch (csr2->status_type) {
02708                 case WOLFSSL_CSR2_OCSP:
02709                     /* followed by */
02710 
02711                 case WOLFSSL_CSR2_OCSP_MULTI:
02712                     /* requests are initialized in the reverse order */
02713                     return idx < csr2->requests
02714                          ? &csr2->request.ocsp[csr2->requests - idx - 1]
02715                          : NULL;
02716                 break;
02717             }
02718         }
02719     }
02720 
02721     return NULL;
02722 }
02723 
02724 int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
02725 {
02726     TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
02727     CertificateStatusRequestItemV2* csr2 = extension ?
02728                         (CertificateStatusRequestItemV2*)extension->data : NULL;
02729 
02730     /* forces only the first one */
02731     if (csr2) {
02732         switch (csr2->status_type) {
02733             case WOLFSSL_CSR2_OCSP:
02734                 /* followed by */
02735 
02736             case WOLFSSL_CSR2_OCSP_MULTI:
02737                 if (ssl->ctx->cm->ocspEnabled) {
02738                 #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
02739                     csr2->request.ocsp[0].ssl = ssl;
02740                 #endif
02741                     return CheckOcspRequest(ssl->ctx->cm->ocsp,
02742                                                   &csr2->request.ocsp[0], NULL);
02743                 }
02744                 else
02745                     return OCSP_LOOKUP_FAIL;
02746         }
02747     }
02748 
02749     return 0;
02750 }
02751 
02752 int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
02753                                            byte options, void* heap, int devId)
02754 {
02755     TLSX* extension = NULL;
02756     CertificateStatusRequestItemV2* csr2 = NULL;
02757     int ret = 0;
02758 
02759     if (!extensions)
02760         return BAD_FUNC_ARG;
02761 
02762     if (status_type != WOLFSSL_CSR2_OCSP
02763     &&  status_type != WOLFSSL_CSR2_OCSP_MULTI)
02764         return BAD_FUNC_ARG;
02765 
02766     csr2 = (CertificateStatusRequestItemV2*)
02767        XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
02768     if (!csr2)
02769         return MEMORY_E;
02770 
02771     ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
02772 
02773     csr2->status_type = status_type;
02774     csr2->options     = options;
02775     csr2->next        = NULL;
02776 
02777     switch (csr2->status_type) {
02778         case WOLFSSL_CSR2_OCSP:
02779         case WOLFSSL_CSR2_OCSP_MULTI:
02780             if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
02781                 WC_RNG rng;
02782 
02783             #ifndef HAVE_FIPS
02784                 ret = wc_InitRng_ex(&rng, heap, devId);
02785             #else
02786                 ret = wc_InitRng(&rng);
02787                 (void)devId;
02788             #endif
02789                 if (ret == 0) {
02790                     if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
02791                                                         MAX_OCSP_NONCE_SZ) == 0)
02792                         csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
02793 
02794                     wc_FreeRng(&rng);
02795                 }
02796             }
02797         break;
02798     }
02799 
02800     /* append new item */
02801     if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
02802         CertificateStatusRequestItemV2* last =
02803                                (CertificateStatusRequestItemV2*)extension->data;
02804 
02805         for (; last->next; last = last->next);
02806 
02807         last->next = csr2;
02808     }
02809     else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
02810         XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
02811         return ret;
02812     }
02813 
02814     return SSL_SUCCESS;
02815 }
02816 
02817 #define CSR2_FREE_ALL TLSX_CSR2_FreeAll
02818 #define CSR2_GET_SIZE TLSX_CSR2_GetSize
02819 #define CSR2_WRITE    TLSX_CSR2_Write
02820 #define CSR2_PARSE    TLSX_CSR2_Parse
02821 
02822 #else
02823 
02824 #define CSR2_FREE_ALL(data, heap)
02825 #define CSR2_GET_SIZE(a, b)    0
02826 #define CSR2_WRITE(a, b, c)    0
02827 #define CSR2_PARSE(a, b, c, d) 0
02828 
02829 #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
02830 
02831 /******************************************************************************/
02832 /* Supported Elliptic Curves                                                  */
02833 /******************************************************************************/
02834 
02835 #ifdef HAVE_SUPPORTED_CURVES
02836 
02837 #ifndef HAVE_ECC
02838 #error Elliptic Curves Extension requires Elliptic Curve Cryptography. \
02839        Use --enable-ecc in the configure script or define HAVE_ECC.
02840 #endif
02841 
02842 static void TLSX_EllipticCurve_FreeAll(EllipticCurve* list, void* heap)
02843 {
02844     EllipticCurve* curve;
02845 
02846     while ((curve = list)) {
02847         list = curve->next;
02848         XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
02849     }
02850     (void)heap;
02851 }
02852 
02853 static int TLSX_EllipticCurve_Append(EllipticCurve** list, word16 name,
02854                                                                      void* heap)
02855 {
02856     EllipticCurve* curve = NULL;
02857 
02858     if (list == NULL)
02859         return BAD_FUNC_ARG;
02860 
02861     curve = (EllipticCurve*)XMALLOC(sizeof(EllipticCurve), heap,
02862                                                              DYNAMIC_TYPE_TLSX);
02863     if (curve == NULL)
02864         return MEMORY_E;
02865 
02866     curve->name = name;
02867     curve->next = *list;
02868 
02869     *list = curve;
02870 
02871     return 0;
02872 }
02873 
02874 #ifndef NO_WOLFSSL_CLIENT
02875 
02876 static void TLSX_EllipticCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
02877 {
02878     int i;
02879 
02880     for (i = 0; i < ssl->suites->suiteSz; i+= 2)
02881         if (ssl->suites->suites[i] == ECC_BYTE ||
02882                 ssl->suites->suites[i] == CHACHA_BYTE ||
02883                 ssl->suites->suites[i] == TLS13_BYTE)
02884             return;
02885 
02886     /* turns semaphore on to avoid sending this extension. */
02887     TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
02888 }
02889 
02890 static word16 TLSX_EllipticCurve_GetSize(EllipticCurve* list)
02891 {
02892     EllipticCurve* curve;
02893     word16 length = OPAQUE16_LEN; /* list length */
02894 
02895     while ((curve = list)) {
02896         list = curve->next;
02897         length += OPAQUE16_LEN; /* curve length */
02898     }
02899 
02900     return length;
02901 }
02902 
02903 static word16 TLSX_EllipticCurve_WriteR(EllipticCurve* curve, byte* output);
02904 static word16 TLSX_EllipticCurve_WriteR(EllipticCurve* curve, byte* output)
02905 {
02906     word16 offset = 0;
02907 
02908     if (!curve)
02909         return offset;
02910 
02911     offset = TLSX_EllipticCurve_WriteR(curve->next, output);
02912     c16toa(curve->name, output + offset);
02913 
02914     return OPAQUE16_LEN + offset;
02915 }
02916 
02917 static word16 TLSX_EllipticCurve_Write(EllipticCurve* list, byte* output)
02918 {
02919     word16 length = TLSX_EllipticCurve_WriteR(list, output + OPAQUE16_LEN);
02920 
02921     c16toa(length, output); /* writing list length */
02922 
02923     return OPAQUE16_LEN + length;
02924 }
02925 
02926 #endif /* NO_WOLFSSL_CLIENT */
02927 #ifndef NO_WOLFSSL_SERVER
02928 
02929 static int TLSX_EllipticCurve_Parse(WOLFSSL* ssl, byte* input, word16 length,
02930                                                                  byte isRequest)
02931 {
02932     word16 offset;
02933     word16 name;
02934     int r;
02935 
02936     (void) isRequest; /* shut up compiler! */
02937 
02938     if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
02939         return BUFFER_ERROR;
02940 
02941     ato16(input, &offset);
02942 
02943     /* validating curve list length */
02944     if (length != OPAQUE16_LEN + offset)
02945         return BUFFER_ERROR;
02946 
02947     while (offset) {
02948         ato16(input + offset, &name);
02949         offset -= OPAQUE16_LEN;
02950 
02951         r = TLSX_UseSupportedCurve(&ssl->extensions, name, ssl->heap);
02952 
02953         if (r != SSL_SUCCESS) return r; /* throw error */
02954     }
02955 
02956     return 0;
02957 }
02958 
02959 #ifdef WOLFSSL_TLS13
02960 /* Searches the supported groups extension for the specified named group.
02961  *
02962  * ssl   The SSL/TLS object.
02963  * name  The group name to match.
02964  * returns 1 when the extension has the group name and 0 otherwise.
02965  */
02966 static int TLSX_SupportedGroups_Find(WOLFSSL* ssl, word16 name)
02967 {
02968     TLSX*          extension;
02969     EllipticCurve* curve = NULL;
02970 
02971     if ((extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS)) == NULL)
02972         return 0;
02973 
02974     for (curve = (EllipticCurve*)extension->data; curve; curve = curve->next) {
02975         if (curve->name == name)
02976             return 1;
02977     }
02978     return 0;
02979 }
02980 #endif /* WOLFSSL_TLS13 */
02981 
02982 int TLSX_ValidateEllipticCurves(WOLFSSL* ssl, byte first, byte second) {
02983     TLSX*          extension = (first == ECC_BYTE || first == CHACHA_BYTE)
02984                              ? TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS)
02985                              : NULL;
02986     EllipticCurve* curve     = NULL;
02987     word32         oid       = 0;
02988     word32         defOid    = 0;
02989     word32         defSz     = 80; /* Maximum known curve size is 66. */
02990     word32         nextOid   = 0;
02991     word32         nextSz    = 80; /* Maximum known curve size is 66. */
02992     word32         currOid   = ssl->ecdhCurveOID;
02993     int            ephmSuite = 0;
02994     word16         octets    = 0; /* according to 'ecc_set_type ecc_sets[];' */
02995     int            sig       = 0; /* validate signature */
02996     int            key       = 0; /* validate key       */
02997 
02998     (void)oid;
02999 
03000     if (!extension)
03001         return 1; /* no suite restriction */
03002 
03003     for (curve = (EllipticCurve*)extension->data;
03004          curve && !(sig && key);
03005          curve = curve->next) {
03006 
03007         /* find supported curve */
03008         switch (curve->name) {
03009     #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
03010         #ifndef NO_ECC_SECP
03011             case WOLFSSL_ECC_SECP160R1:
03012                 oid = ECC_SECP160R1_OID;
03013                 octets = 20;
03014                 break;
03015         #endif /* !NO_ECC_SECP */
03016         #ifdef HAVE_ECC_SECPR2
03017             case WOLFSSL_ECC_SECP160R2:
03018                 oid = ECC_SECP160R2_OID;
03019                 octets = 20;
03020                 break;
03021         #endif /* HAVE_ECC_SECPR2 */
03022         #ifdef HAVE_ECC_KOBLITZ
03023             case WOLFSSL_ECC_SECP160K1:
03024                 oid = ECC_SECP160K1_OID;
03025                 octets = 20;
03026                 break;
03027         #endif /* HAVE_ECC_KOBLITZ */
03028     #endif
03029     #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
03030         #ifndef NO_ECC_SECP
03031             case WOLFSSL_ECC_SECP192R1:
03032                 oid = ECC_SECP192R1_OID;
03033                 octets = 24;
03034                 break;
03035         #endif /* !NO_ECC_SECP */
03036         #ifdef HAVE_ECC_KOBLITZ
03037             case WOLFSSL_ECC_SECP192K1:
03038                 oid = ECC_SECP192K1_OID;
03039                 octets = 24;
03040                 break;
03041         #endif /* HAVE_ECC_KOBLITZ */
03042     #endif
03043     #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
03044         #ifndef NO_ECC_SECP
03045             case WOLFSSL_ECC_SECP224R1:
03046                 oid = ECC_SECP224R1_OID;
03047                 octets = 28;
03048                 break;
03049         #endif /* !NO_ECC_SECP */
03050         #ifdef HAVE_ECC_KOBLITZ
03051             case WOLFSSL_ECC_SECP224K1:
03052                 oid = ECC_SECP224K1_OID;
03053                 octets = 28;
03054                 break;
03055         #endif /* HAVE_ECC_KOBLITZ */
03056     #endif
03057     #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES)
03058         #ifndef NO_ECC_SECP
03059             case WOLFSSL_ECC_SECP256R1:
03060                 oid = ECC_SECP256R1_OID;
03061                 octets = 32;
03062                 break;
03063         #endif /* !NO_ECC_SECP */
03064         #ifdef HAVE_ECC_KOBLITZ
03065             case WOLFSSL_ECC_SECP256K1:
03066                 oid = ECC_SECP256K1_OID;
03067                 octets = 32;
03068                 break;
03069         #endif /* HAVE_ECC_KOBLITZ */
03070         #ifdef HAVE_ECC_BRAINPOOL
03071             case WOLFSSL_ECC_BRAINPOOLP256R1:
03072                 oid = ECC_BRAINPOOLP256R1_OID;
03073                 octets = 32;
03074                 break;
03075         #endif /* HAVE_ECC_BRAINPOOL */
03076     #endif
03077     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
03078         #ifndef NO_ECC_SECP
03079             case WOLFSSL_ECC_SECP384R1:
03080                 oid = ECC_SECP384R1_OID;
03081                 octets = 48;
03082                 break;
03083         #endif /* !NO_ECC_SECP */
03084         #ifdef HAVE_ECC_BRAINPOOL
03085             case WOLFSSL_ECC_BRAINPOOLP384R1:
03086                 oid = ECC_BRAINPOOLP384R1_OID;
03087                 octets = 48;
03088                 break;
03089         #endif /* HAVE_ECC_BRAINPOOL */
03090     #endif
03091     #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
03092         #ifdef HAVE_ECC_BRAINPOOL
03093             case WOLFSSL_ECC_BRAINPOOLP512R1:
03094                 oid = ECC_BRAINPOOLP512R1_OID;
03095                 octets = 64;
03096                 break;
03097         #endif /* HAVE_ECC_BRAINPOOL */
03098     #endif
03099     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
03100         #ifndef NO_ECC_SECP
03101             case WOLFSSL_ECC_SECP521R1:
03102                 oid = ECC_SECP521R1_OID;
03103                 octets = 66;
03104                 break;
03105         #endif /* !NO_ECC_SECP */
03106     #endif
03107             default: continue; /* unsupported curve */
03108         }
03109 
03110         /* Set default Oid */
03111         if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
03112             defOid = oid;
03113             defSz = octets;
03114         }
03115 
03116         if (currOid == 0 && ssl->eccTempKeySz == octets)
03117             currOid = oid;
03118         if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
03119             nextOid = oid;
03120             nextSz  = octets;
03121         }
03122 
03123         if (first == ECC_BYTE) {
03124             switch (second) {
03125                 /* ECDHE_ECDSA */
03126                 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
03127                 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
03128                 case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
03129                 case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
03130                 case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
03131                 case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
03132                 case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
03133                 case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
03134                 case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
03135                 case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
03136                     sig |= ssl->pkCurveOID == oid;
03137                     key |= ssl->ecdhCurveOID == oid;
03138                     ephmSuite = 1;
03139                 break;
03140 
03141 #ifdef WOLFSSL_STATIC_DH
03142                 /* ECDH_ECDSA */
03143                 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
03144                 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
03145                 case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
03146                 case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
03147                 case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
03148                 case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
03149                 case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
03150                 case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
03151                     sig |= ssl->pkCurveOID == oid;
03152                     key |= ssl->pkCurveOID == oid;
03153                 break;
03154 #endif /* WOLFSSL_STATIC_DH */
03155 #ifndef NO_RSA
03156                 /* ECDHE_RSA */
03157                 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
03158                 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
03159                 case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
03160                 case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
03161                 case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
03162                 case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
03163                 case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
03164                 case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
03165                     sig = 1;
03166                     key |= ssl->ecdhCurveOID == oid;
03167                     ephmSuite = 1;
03168                 break;
03169 
03170 #ifdef WOLFSSL_STATIC_DH
03171                 /* ECDH_RSA */
03172                 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
03173                 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
03174                 case TLS_ECDH_RSA_WITH_RC4_128_SHA:
03175                 case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
03176                 case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
03177                 case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
03178                 case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
03179                 case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
03180                     sig = 1;
03181                     key |= ssl->pkCurveOID == oid;
03182                 break;
03183 #endif /* WOLFSSL_STATIC_DH */
03184 #endif
03185                 default:
03186                     sig = 1;
03187                     key = 1;
03188                 break;
03189             }
03190         }
03191 
03192         /* ChaCha20-Poly1305 ECC cipher suites */
03193         if (first == CHACHA_BYTE) {
03194             switch (second) {
03195                 /* ECDHE_ECDSA */
03196                 case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
03197                 case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
03198                     sig |= ssl->pkCurveOID == oid;
03199                     key |= ssl->ecdhCurveOID == oid;
03200                     ephmSuite = 1;
03201                 break;
03202 #ifndef NO_RSA
03203                 /* ECDHE_RSA */
03204                 case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
03205                 case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
03206                     sig = 1;
03207                     key |= ssl->ecdhCurveOID == oid;
03208                     ephmSuite = 1;
03209                 break;
03210 #endif
03211                 default:
03212                     sig = 1;
03213                     key = 1;
03214                 break;
03215             }
03216         }
03217     }
03218 
03219     /* Choose the default if it is at the required strength. */
03220     if (ssl->ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz) {
03221         key = 1;
03222         ssl->ecdhCurveOID = defOid;
03223     }
03224     /* Choose any curve at the required strength. */
03225     if (ssl->ecdhCurveOID == 0) {
03226         key = 1;
03227         ssl->ecdhCurveOID = currOid;
03228     }
03229     /* Choose the default if it is at the next highest strength. */
03230     if (ssl->ecdhCurveOID == 0 && defSz == nextSz)
03231         ssl->ecdhCurveOID = defOid;
03232     /* Choose any curve at the next highest strength. */
03233     if (ssl->ecdhCurveOID == 0)
03234         ssl->ecdhCurveOID = nextOid;
03235     /* No curve and ephemeral ECC suite requires a matching curve. */
03236     if (ssl->ecdhCurveOID == 0 && ephmSuite)
03237         key = 0;
03238 
03239     return sig && key;
03240 }
03241 
03242 #endif /* NO_WOLFSSL_SERVER */
03243 
03244 int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
03245 {
03246     TLSX*          extension;
03247     EllipticCurve* curve     = NULL;
03248     int            ret       = 0;
03249 
03250     if (extensions == NULL)
03251         return BAD_FUNC_ARG;
03252 
03253     if ((ret = TLSX_EllipticCurve_Append(&curve, name, heap)) != 0)
03254         return ret;
03255 
03256     extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
03257     if (!extension) {
03258         if ((ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap))
03259                                                                          != 0) {
03260             XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
03261             return ret;
03262         }
03263     }
03264     else {
03265         /* push new EllipticCurve object to extension data. */
03266         curve->next = (EllipticCurve*)extension->data;
03267         extension->data = (void*)curve;
03268 
03269         /* look for another curve of the same name to remove (replacement) */
03270         do {
03271             if (curve->next && curve->next->name == name) {
03272                 EllipticCurve *next = curve->next;
03273 
03274                 curve->next = next->next;
03275                 XFREE(next, heap, DYNAMIC_TYPE_TLSX);
03276 
03277                 break;
03278             }
03279         } while ((curve = curve->next));
03280     }
03281 
03282     return SSL_SUCCESS;
03283 }
03284 
03285 #define EC_FREE_ALL         TLSX_EllipticCurve_FreeAll
03286 #define EC_VALIDATE_REQUEST TLSX_EllipticCurve_ValidateRequest
03287 
03288 #ifndef NO_WOLFSSL_CLIENT
03289 #define EC_GET_SIZE TLSX_EllipticCurve_GetSize
03290 #define EC_WRITE    TLSX_EllipticCurve_Write
03291 #else
03292 #define EC_GET_SIZE(list)         0
03293 #define EC_WRITE(a, b)            0
03294 #endif
03295 
03296 #ifndef NO_WOLFSSL_SERVER
03297 #define EC_PARSE TLSX_EllipticCurve_Parse
03298 #else
03299 #define EC_PARSE(a, b, c, d)      0
03300 #endif
03301 
03302 #else
03303 
03304 #define EC_FREE_ALL(list, heap)
03305 #define EC_GET_SIZE(list)         0
03306 #define EC_WRITE(a, b)            0
03307 #define EC_PARSE(a, b, c, d)      0
03308 #define EC_VALIDATE_REQUEST(a, b)
03309 
03310 #endif /* HAVE_SUPPORTED_CURVES */
03311 
03312 /******************************************************************************/
03313 /* Renegotiation Indication                                                   */
03314 /******************************************************************************/
03315 
03316 #if defined(HAVE_SECURE_RENEGOTIATION) \
03317  || defined(HAVE_SERVER_RENEGOTIATION_INFO)
03318 
03319 static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
03320                                                                   int isRequest)
03321 {
03322     byte length = OPAQUE8_LEN; /* empty info length */
03323 
03324     /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
03325     if (data && data->enabled) {
03326         /* client sends client_verify_data only */
03327         length += TLS_FINISHED_SZ;
03328 
03329         /* server also sends server_verify_data */
03330         if (!isRequest)
03331             length += TLS_FINISHED_SZ;
03332     }
03333 
03334     return length;
03335 }
03336 
03337 static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
03338                                                     byte* output, int isRequest)
03339 {
03340     word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
03341 
03342     if (data && data->enabled) {
03343         /* client sends client_verify_data only */
03344         XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
03345         offset += TLS_FINISHED_SZ;
03346 
03347         /* server also sends server_verify_data */
03348         if (!isRequest) {
03349             XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
03350             offset += TLS_FINISHED_SZ;
03351         }
03352     }
03353 
03354     output[0] = (byte)(offset - 1);  /* info length - self */
03355 
03356     return offset;
03357 }
03358 
03359 static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, byte* input,
03360                                                   word16 length, byte isRequest)
03361 {
03362     int ret = SECURE_RENEGOTIATION_E;
03363 
03364     if (length >= OPAQUE8_LEN) {
03365         if (ssl->secure_renegotiation == NULL) {
03366         #ifndef NO_WOLFSSL_SERVER
03367             if (isRequest && *input == 0) {
03368             #ifdef HAVE_SERVER_RENEGOTIATION_INFO
03369                 if (length == OPAQUE8_LEN) {
03370                     if (TLSX_Find(ssl->extensions,
03371                                   TLSX_RENEGOTIATION_INFO) == NULL) {
03372                         ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions,
03373                                                              ssl->heap);
03374                         if (ret == SSL_SUCCESS)
03375                             ret = 0;
03376 
03377                     } else {
03378                         ret = 0;
03379                     }
03380                 }
03381             #else
03382                 ret = 0;  /* don't reply, user didn't enable */
03383             #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
03384             }
03385             #ifdef HAVE_SERVER_RENEGOTIATION_INFO
03386             else if (!isRequest) {
03387                 /* don't do anything on client side */
03388                 ret = 0;
03389             }
03390             #endif
03391         #endif
03392         }
03393         else if (isRequest) {
03394         #ifndef NO_WOLFSSL_SERVER
03395             if (*input == TLS_FINISHED_SZ) {
03396                 /* TODO compare client_verify_data */
03397                 ret = 0;
03398             }
03399         #endif
03400         }
03401         else {
03402         #ifndef NO_WOLFSSL_CLIENT
03403             if (!ssl->secure_renegotiation->enabled) {
03404                 if (*input == 0) {
03405                     ssl->secure_renegotiation->enabled = 1;
03406                     ret = 0;
03407                 }
03408             }
03409             else if (*input == 2 * TLS_FINISHED_SZ &&
03410                      length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
03411                 input++;  /* get past size */
03412 
03413                 /* validate client and server verify data */
03414                 if (XMEMCMP(input,
03415                             ssl->secure_renegotiation->client_verify_data,
03416                             TLS_FINISHED_SZ) == 0 &&
03417                     XMEMCMP(input + TLS_FINISHED_SZ,
03418                             ssl->secure_renegotiation->server_verify_data,
03419                             TLS_FINISHED_SZ) == 0) {
03420                     WOLFSSL_MSG("SCR client and server verify data match");
03421                     ret = 0;  /* verified */
03422                 } else {
03423                     /* already in error state */
03424                     WOLFSSL_MSG("SCR client and server verify data Failure");
03425                 }
03426             }
03427         #endif
03428         }
03429     }
03430 
03431     if (ret != 0) {
03432         SendAlert(ssl, alert_fatal, handshake_failure);
03433     }
03434 
03435     return ret;
03436 }
03437 
03438 int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
03439 {
03440     int ret = 0;
03441     SecureRenegotiation* data = NULL;
03442 
03443     data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
03444                                                              DYNAMIC_TYPE_TLSX);
03445     if (data == NULL)
03446         return MEMORY_E;
03447 
03448     XMEMSET(data, 0, sizeof(SecureRenegotiation));
03449 
03450     ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
03451     if (ret != 0) {
03452         XFREE(data, heap, DYNAMIC_TYPE_TLSX);
03453         return ret;
03454     }
03455 
03456     return SSL_SUCCESS;
03457 }
03458 
03459 #ifdef HAVE_SERVER_RENEGOTIATION_INFO
03460 
03461 int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
03462 {
03463     int ret;
03464 
03465     ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, NULL, heap);
03466     if (ret != 0)
03467         return ret;
03468 
03469     /* send empty renegotiation_info extension */
03470     TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
03471     if (ext)
03472         ext->resp = 1;
03473 
03474     return SSL_SUCCESS;
03475 }
03476 
03477 #endif /* HAVE_SERVER_RENEGOTIATION_INFO */
03478 
03479 
03480 #define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
03481 #define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
03482 #define SCR_WRITE          TLSX_SecureRenegotiation_Write
03483 #define SCR_PARSE          TLSX_SecureRenegotiation_Parse
03484 
03485 #else
03486 
03487 #define SCR_FREE_ALL(a, heap)
03488 #define SCR_GET_SIZE(a, b)    0
03489 #define SCR_WRITE(a, b, c)    0
03490 #define SCR_PARSE(a, b, c, d) 0
03491 
03492 #endif /* HAVE_SECURE_RENEGOTIATION */
03493 
03494 /******************************************************************************/
03495 /* Session Tickets                                                            */
03496 /******************************************************************************/
03497 
03498 #ifdef HAVE_SESSION_TICKET
03499 
03500 #ifndef NO_WOLFSSL_CLIENT
03501 static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl)
03502 {
03503     TLSX*          extension = TLSX_Find(ssl->extensions, TLSX_SESSION_TICKET);
03504     SessionTicket* ticket    = extension ?
03505                                          (SessionTicket*)extension->data : NULL;
03506 
03507     if (ticket) {
03508         /* TODO validate ticket timeout here! */
03509         if (ticket->lifetime == 0xfffffff) {
03510             /* send empty ticket on timeout */
03511             TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
03512         }
03513     }
03514 }
03515 #endif /* NO_WOLFSSL_CLIENT */
03516 
03517 
03518 static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
03519 {
03520     (void)isRequest;
03521     return ticket ? ticket->size : 0;
03522 }
03523 
03524 static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
03525                                                                   int isRequest)
03526 {
03527     word16 offset = 0; /* empty ticket */
03528 
03529     if (isRequest && ticket) {
03530         XMEMCPY(output + offset, ticket->data, ticket->size);
03531         offset += ticket->size;
03532     }
03533 
03534     return offset;
03535 }
03536 
03537 
03538 static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, byte* input, word16 length,
03539                                                                  byte isRequest)
03540 {
03541     int ret = 0;
03542 
03543     (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
03544 
03545     if (!isRequest) {
03546         /* client side */
03547         if (length != 0)
03548             return BUFFER_ERROR;
03549 
03550 #ifndef NO_WOLFSSL_CLIENT
03551         ssl->expect_session_ticket = 1;
03552 #endif
03553     }
03554 #ifndef NO_WOLFSSL_SERVER
03555     else {
03556         /* server side */
03557         if (ssl->ctx->ticketEncCb == NULL) {
03558             WOLFSSL_MSG("Client sent session ticket, server has no callback");
03559             return 0;
03560         }
03561 
03562         if (length == 0) {
03563             /* blank ticket */
03564             ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
03565             if (ret == SSL_SUCCESS) {
03566                 ret = 0;
03567                 TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);  /* send blank ticket */
03568                 ssl->options.createTicket = 1;  /* will send ticket msg */
03569                 ssl->options.useTicket    = 1;
03570                 ssl->options.resuming     = 0;  /* no standard resumption */
03571                 ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
03572             }
03573         } else {
03574             /* got actual ticket from client */
03575             ret = DoClientTicket(ssl, input, length);
03576             if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
03577                 WOLFSSL_MSG("Using exisitng client ticket");
03578                 ssl->options.useTicket = 1;
03579                 ssl->options.resuming  = 1;
03580             } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
03581                 WOLFSSL_MSG("Using existing client ticket, creating new one");
03582                 ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
03583                 if (ret == SSL_SUCCESS) {
03584                     ret = 0;
03585                     TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
03586                                                     /* send blank ticket */
03587                     ssl->options.createTicket = 1;  /* will send ticket msg */
03588                     ssl->options.useTicket    = 1;
03589                     ssl->options.resuming     = 1;
03590                 }
03591             } else if (ret == WOLFSSL_TICKET_RET_REJECT) {
03592                 WOLFSSL_MSG("Process client ticket rejected, not using");
03593                 ssl->options.rejectTicket = 1;
03594                 ret = 0;  /* not fatal */
03595             } else if (ret == WOLFSSL_TICKET_RET_FATAL || ret < 0) {
03596                 WOLFSSL_MSG("Process client ticket fatal error, not using");
03597             }
03598         }
03599     }
03600 #endif /* NO_WOLFSSL_SERVER */
03601 
03602     return ret;
03603 }
03604 
03605 WOLFSSL_LOCAL SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
03606                                             byte* data, word16 size, void* heap)
03607 {
03608     SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
03609                                                        heap, DYNAMIC_TYPE_TLSX);
03610     if (ticket) {
03611         ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
03612         if (ticket->data == NULL) {
03613             XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
03614             return NULL;
03615         }
03616 
03617         XMEMCPY(ticket->data, data, size);
03618         ticket->size     = size;
03619         ticket->lifetime = lifetime;
03620     }
03621 
03622     return ticket;
03623 }
03624 WOLFSSL_LOCAL void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
03625 {
03626     if (ticket) {
03627         XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
03628         XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
03629     }
03630 
03631     (void)heap;
03632 }
03633 
03634 int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
03635 {
03636     int ret = 0;
03637 
03638     if (extensions == NULL)
03639         return BAD_FUNC_ARG;
03640 
03641     /* If the ticket is NULL, the client will request a new ticket from the
03642        server. Otherwise, the client will use it in the next client hello. */
03643     if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
03644                                                                            != 0)
03645         return ret;
03646 
03647     return SSL_SUCCESS;
03648 }
03649 
03650 #define WOLF_STK_VALIDATE_REQUEST TLSX_SessionTicket_ValidateRequest
03651 #define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
03652 #define WOLF_STK_WRITE            TLSX_SessionTicket_Write
03653 #define WOLF_STK_PARSE            TLSX_SessionTicket_Parse
03654 #define WOLF_STK_FREE(stk, heap)  TLSX_SessionTicket_Free((SessionTicket*)stk,(heap))
03655 
03656 #else
03657 
03658 #define WOLF_STK_FREE(a, b)
03659 #define WOLF_STK_VALIDATE_REQUEST(a)
03660 #define WOLF_STK_GET_SIZE(a, b)      0
03661 #define WOLF_STK_WRITE(a, b, c)      0
03662 #define WOLF_STK_PARSE(a, b, c, d)   0
03663 
03664 #endif /* HAVE_SESSION_TICKET */
03665 
03666 /******************************************************************************/
03667 /* Quantum-Safe-Hybrid                                                        */
03668 /******************************************************************************/
03669 
03670 #if defined(HAVE_NTRU) && defined(HAVE_QSH)
03671 static WC_RNG* rng;
03672 static wolfSSL_Mutex* rngMutex;
03673 #endif
03674 
03675 #ifdef HAVE_QSH
03676 static void TLSX_QSH_FreeAll(QSHScheme* list, void* heap)
03677 {
03678     QSHScheme* current;
03679 
03680     while ((current = list)) {
03681         list = current->next;
03682         XFREE(current, heap, DYNAMIC_TYPE_TLSX);
03683     }
03684 
03685     (void)heap;
03686 }
03687 
03688 static int TLSX_QSH_Append(QSHScheme** list, word16 name, byte* pub,
03689                                                                   word16 pubLen)
03690 {
03691     QSHScheme* temp;
03692 
03693     if (list == NULL)
03694         return BAD_FUNC_ARG;
03695 
03696     if ((temp = (QSHScheme*)XMALLOC(sizeof(QSHScheme), NULL,
03697                                                     DYNAMIC_TYPE_TLSX)) == NULL)
03698         return MEMORY_E;
03699 
03700     temp->name  = name;
03701     temp->PK    = pub;
03702     temp->PKLen = pubLen;
03703     temp->next  = *list;
03704 
03705     *list = temp;
03706 
03707     return 0;
03708 }
03709 
03710 
03711 /* request for server's public key : 02 indicates 0-2 requested */
03712 static byte TLSX_QSH_SerPKReq(byte* output, byte isRequest)
03713 {
03714     if (isRequest) {
03715         /* only request one public key from the server */
03716         output[0] = 0x01;
03717 
03718         return OPAQUE8_LEN;
03719     }
03720     else {
03721         return 0;
03722     }
03723 }
03724 
03725 #ifndef NO_WOLFSSL_CLIENT
03726 
03727 /* check for TLS_QSH suite */
03728 static void TLSX_QSH_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
03729 {
03730     int i;
03731 
03732     for (i = 0; i < ssl->suites->suiteSz; i+= 2)
03733         if (ssl->suites->suites[i] == QSH_BYTE)
03734             return;
03735 
03736     /* No QSH suite found */
03737     TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_QUANTUM_SAFE_HYBRID));
03738 }
03739 
03740 
03741 /* return the size of the QSH hello extension
03742    list      the list of QSHScheme structs containing id and key
03743    isRequest if 1 then is being sent to the server
03744  */
03745 word16 TLSX_QSH_GetSize(QSHScheme* list, byte isRequest)
03746 {
03747     QSHScheme* temp = list;
03748     word16 length = 0;
03749 
03750     /* account for size of scheme list and public key list */
03751     if (isRequest)
03752         length = OPAQUE16_LEN;
03753     length += OPAQUE24_LEN;
03754 
03755     /* for each non null element in list add size */
03756     while ((temp)) {
03757         /* add public key info Scheme | Key Length | Key */
03758         length += OPAQUE16_LEN;
03759         length += OPAQUE16_LEN;
03760         length += temp->PKLen;
03761 
03762         /* if client add name size for scheme list
03763            advance to next QSHScheme struct in list */
03764         if (isRequest)
03765             length += OPAQUE16_LEN;
03766         temp = temp->next;
03767     }
03768 
03769     /* add length for request server public keys */
03770     if (isRequest)
03771         length += OPAQUE8_LEN;
03772 
03773     return length;
03774 }
03775 
03776 
03777 /* write out a list of QSHScheme IDs */
03778 static word16 TLSX_QSH_Write(QSHScheme* list, byte* output)
03779 {
03780     QSHScheme* current = list;
03781     word16 length      = 0;
03782 
03783     length += OPAQUE16_LEN;
03784 
03785     while (current) {
03786         c16toa(current->name, output + length);
03787         length += OPAQUE16_LEN;
03788         current = (QSHScheme*)current->next;
03789     }
03790 
03791     c16toa(length - OPAQUE16_LEN, output); /* writing list length */
03792 
03793     return length;
03794 }
03795 
03796 
03797 /* write public key list in extension */
03798 static word16 TLSX_QSHPK_WriteR(QSHScheme* format, byte* output);
03799 static word16 TLSX_QSHPK_WriteR(QSHScheme* format, byte* output)
03800 {
03801     word32 offset = 0;
03802     word16 public_len = 0;
03803 
03804     if (!format)
03805         return offset;
03806 
03807     /* write scheme ID */
03808     c16toa(format->name, output + offset);
03809     offset += OPAQUE16_LEN;
03810 
03811     /* write public key matching scheme */
03812     public_len = format->PKLen;
03813     c16toa(public_len, output + offset);
03814     offset += OPAQUE16_LEN;
03815     if (format->PK) {
03816         XMEMCPY(output+offset, format->PK, public_len);
03817     }
03818 
03819     return public_len + offset;
03820 }
03821 
03822 word16 TLSX_QSHPK_Write(QSHScheme* list, byte* output)
03823 {
03824     QSHScheme* current = list;
03825     word32 length = 0;
03826     word24 toWire;
03827 
03828     length += OPAQUE24_LEN;
03829 
03830     while (current) {
03831         length += TLSX_QSHPK_WriteR(current, output + length);
03832         current = (QSHScheme*)current->next;
03833     }
03834     /* length of public keys sent */
03835     c32to24(length - OPAQUE24_LEN, toWire);
03836     output[0] = toWire[0];
03837     output[1] = toWire[1];
03838     output[2] = toWire[2];
03839 
03840     return length;
03841 }
03842 
03843 #endif /* NO_WOLFSSL_CLIENT */
03844 #ifndef NO_WOLFSSL_SERVER
03845 
03846 static void TLSX_QSHAgreement(TLSX** extensions, void* heap)
03847 {
03848     TLSX* extension = TLSX_Find(*extensions, TLSX_QUANTUM_SAFE_HYBRID);
03849     QSHScheme* format = NULL;
03850     QSHScheme* del    = NULL;
03851     QSHScheme* prev   = NULL;
03852 
03853     if (extension == NULL)
03854         return;
03855 
03856     format = (QSHScheme*)extension->data;
03857     while (format) {
03858         if (format->PKLen == 0) {
03859             /* case of head */
03860             if (format == extension->data) {
03861                 extension->data = format->next;
03862             }
03863             if (prev)
03864                 prev->next = format->next;
03865             del = format;
03866             format = format->next;
03867             XFREE(del, heap, DYNAMIC_TYPE_TMP_BUFFER);
03868             del = NULL;
03869         } else {
03870             prev   = format;
03871             format = format->next;
03872         }
03873     }
03874 
03875     (void)heap;
03876 }
03877 
03878 
03879 /* Parse in hello extension
03880    input     the byte stream to process
03881    length    length of total extension found
03882    isRequest set to 1 if being sent to the server
03883  */
03884 static int TLSX_QSH_Parse(WOLFSSL* ssl, byte* input, word16 length,
03885                                                                  byte isRequest)
03886 {
03887     byte   numKeys    = 0;
03888     word16 offset     = 0;
03889     word16 schemSz    = 0;
03890     word16 offset_len = 0;
03891     word32 offset_pk  = 0;
03892     word16 name  = 0;
03893     word16 PKLen = 0;
03894     byte*  PK = NULL;
03895     int r;
03896 
03897 
03898     if (OPAQUE16_LEN > length)
03899         return BUFFER_ERROR;
03900 
03901     if (isRequest) {
03902         ato16(input, &schemSz);
03903 
03904         /* list of public keys available for QSH schemes */
03905         offset_len = schemSz + OPAQUE16_LEN;
03906     }
03907 
03908     offset_pk = ((input[offset_len] << 16)   & 0xFF00000) |
03909                 (((input[offset_len + 1]) << 8) & 0xFF00) |
03910                 (input[offset_len + 2] & 0xFF);
03911     offset_len += OPAQUE24_LEN;
03912 
03913     /* check buffer size */
03914     if (offset_pk > length)
03915         return BUFFER_ERROR;
03916 
03917     /* set maximum number of keys the client will accept */
03918     if (!isRequest)
03919         numKeys = (ssl->maxRequest < 1)? 1 : ssl->maxRequest;
03920 
03921     /* hello extension read list of scheme ids */
03922     if (isRequest) {
03923 
03924         /* read in request for public keys */
03925         ssl->minRequest = (input[length -1] >> 4) & 0xFF;
03926         ssl->maxRequest = input[length -1] & 0x0F;
03927 
03928         /* choose the min between min requested by client and 1 */
03929         numKeys = (ssl->minRequest > 1) ? ssl->minRequest : 1;
03930 
03931         if (ssl->minRequest > ssl->maxRequest)
03932             return BAD_FUNC_ARG;
03933 
03934         offset  += OPAQUE16_LEN;
03935         schemSz += offset;
03936 
03937         /* check buffer size */
03938         if (schemSz > length)
03939             return BUFFER_ERROR;
03940 
03941         while ((offset < schemSz) && numKeys) {
03942             /* Scheme ID list */
03943             ato16(input + offset, &name);
03944             offset += OPAQUE16_LEN;
03945 
03946             /* validate we have scheme id */
03947             if (ssl->user_set_QSHSchemes &&
03948                     !TLSX_ValidateQSHScheme(&ssl->extensions, name)) {
03949                 continue;
03950             }
03951 
03952             /* server create keys on demand */
03953             if ((r = TLSX_CreateNtruKey(ssl, name)) != 0) {
03954                 WOLFSSL_MSG("Error creating ntru keys");
03955                 return r;
03956             }
03957 
03958             /* peer sent an agreed upon scheme */
03959             r = TLSX_UseQSHScheme(&ssl->extensions, name, NULL, 0, ssl->heap);
03960 
03961             if (r != SSL_SUCCESS) return r; /* throw error */
03962 
03963             numKeys--;
03964         }
03965 
03966         /* choose the min between min requested by client and 1 */
03967         numKeys = (ssl->minRequest > 1) ? ssl->minRequest : 1;
03968     }
03969 
03970     /* QSHPK struct */
03971     offset_pk += offset_len;
03972     while ((offset_len < offset_pk) && numKeys) {
03973         QSHKey * temp;
03974 
03975         if ((temp = (QSHKey*)XMALLOC(sizeof(QSHKey), ssl->heap,
03976                                                     DYNAMIC_TYPE_TLSX)) == NULL)
03977             return MEMORY_E;
03978 
03979         /* initialize */
03980         temp->next = NULL;
03981         temp->pub.buffer = NULL;
03982         temp->pub.length = 0;
03983         temp->pri.buffer = NULL;
03984         temp->pri.length = 0;
03985 
03986         /* scheme id */
03987         ato16(input + offset_len, &(temp->name));
03988         offset_len += OPAQUE16_LEN;
03989 
03990         /* public key length */
03991         ato16(input + offset_len, &PKLen);
03992         temp->pub.length = PKLen;
03993         offset_len += OPAQUE16_LEN;
03994 
03995 
03996         if (isRequest) {
03997             /* validate we have scheme id */
03998             if (ssl->user_set_QSHSchemes &&
03999                     (!TLSX_ValidateQSHScheme(&ssl->extensions, temp->name))) {
04000                 offset_len += PKLen;
04001                 XFREE(temp, ssl->heap, DYNAMIC_TYPE_TLSX);
04002                 continue;
04003             }
04004         }
04005 
04006         /* read in public key */
04007         if (PKLen > 0) {
04008             temp->pub.buffer = (byte*)XMALLOC(temp->pub.length,
04009                                             ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
04010             XMEMCPY(temp->pub.buffer, input + offset_len, temp->pub.length);
04011             offset_len += PKLen;
04012         }
04013         else {
04014             PK = NULL;
04015         }
04016 
04017         /* use own key when adding to extensions list for sending reply */
04018         PKLen = 0;
04019         PK = TLSX_QSHKeyFind_Pub(ssl->QSH_Key, &PKLen, temp->name);
04020         r  = TLSX_UseQSHScheme(&ssl->extensions, temp->name, PK, PKLen,
04021                                                                      ssl->heap);
04022 
04023         /* store peers key */
04024         ssl->peerQSHKeyPresent = 1;
04025         if (TLSX_AddQSHKey(&ssl->peerQSHKey, temp) != 0)
04026             return MEMORY_E;
04027 
04028         if (temp->pub.length == 0) {
04029             XFREE(temp, ssl->heap, DYNAMIC_TYPE_TLSX);
04030         }
04031 
04032         if (r != SSL_SUCCESS) {return r;} /* throw error */
04033 
04034         numKeys--;
04035     }
04036 
04037     /* reply to a QSH extension sent from client */
04038     if (isRequest) {
04039         TLSX_SetResponse(ssl, TLSX_QUANTUM_SAFE_HYBRID);
04040         /* only use schemes we have key generated for -- free the rest */
04041         TLSX_QSHAgreement(&ssl->extensions, ssl->heap);
04042     }
04043 
04044     return 0;
04045 }
04046 
04047 
04048 /* Used for parsing in QSHCipher structs on Key Exchange */
04049 int TLSX_QSHCipher_Parse(WOLFSSL* ssl, const byte* input, word16 length,
04050                                                                   byte isServer)
04051 {
04052     QSHKey* key;
04053     word16 Max_Secret_Len = 48;
04054     word16 offset     = 0;
04055     word16 offset_len = 0;
04056     word32 offset_pk  = 0;
04057     word16 name       = 0;
04058     word16 secretLen  = 0;
04059     byte*  secret     = NULL;
04060     word16 buffLen    = 0;
04061     byte buff[145]; /* size enough for 3 secrets */
04062     buffer* buf;
04063 
04064     /* pointer to location where secret should be stored */
04065     if (isServer) {
04066         buf = ssl->QSH_secret->CliSi;
04067     }
04068     else {
04069         buf = ssl->QSH_secret->SerSi;
04070     }
04071 
04072     offset_pk = ((input[offset_len] << 16)    & 0xFF0000) |
04073                 (((input[offset_len + 1]) << 8) & 0xFF00) |
04074                 (input[offset_len + 2] & 0xFF);
04075     offset_len += OPAQUE24_LEN;
04076 
04077     /* validating extension list length -- check if trying to read over edge
04078        of buffer */
04079     if (length < (offset_pk + OPAQUE24_LEN)) {
04080         return BUFFER_ERROR;
04081     }
04082 
04083     /* QSHCipherList struct */
04084     offset_pk += offset_len;
04085     while (offset_len < offset_pk) {
04086 
04087         /* scheme id */
04088         ato16(input + offset_len, &name);
04089         offset_len += OPAQUE16_LEN;
04090 
04091         /* public key length */
04092         ato16(input + offset_len, &secretLen);
04093         offset_len += OPAQUE16_LEN;
04094 
04095         /* read in public key */
04096         if (secretLen > 0) {
04097             secret = (byte*)(input + offset_len);
04098             offset_len += secretLen;
04099         }
04100         else {
04101             secret = NULL;
04102         }
04103 
04104         /* no secret sent */
04105         if (secret == NULL)
04106             continue;
04107 
04108         /* find corresponding key */
04109         key = ssl->QSH_Key;
04110         while (key) {
04111             if (key->name == name)
04112                 break;
04113             else
04114                 key = (QSHKey*)key->next;
04115         }
04116 
04117         /* if we do not have the key than there was a big issue negotiation */
04118         if (key == NULL) {
04119             WOLFSSL_MSG("key was null for decryption!!!\n");
04120             return MEMORY_E;
04121         }
04122 
04123         /* Decrypt sent secret */
04124         buffLen = Max_Secret_Len;
04125         QSH_Decrypt(key, secret, secretLen, buff + offset, &buffLen);
04126         offset += buffLen;
04127     }
04128 
04129     /* allocate memory for buffer */
04130     buf->length = offset;
04131     buf->buffer = (byte*)XMALLOC(offset, NULL, DYNAMIC_TYPE_TMP_BUFFER);
04132     if (buf->buffer == NULL)
04133         return MEMORY_E;
04134 
04135     /* store secrets */
04136     XMEMCPY(buf->buffer, buff, offset);
04137     ForceZero(buff, offset);
04138 
04139     return offset_len;
04140 }
04141 
04142 
04143 /* return 1 on success */
04144 int TLSX_ValidateQSHScheme(TLSX** extensions, word16 theirs) {
04145     TLSX* extension = TLSX_Find(*extensions, TLSX_QUANTUM_SAFE_HYBRID);
04146     QSHScheme* format    = NULL;
04147 
04148     /* if no extension is sent then do not use QSH */
04149     if (!extension) {
04150         WOLFSSL_MSG("No QSH Extension");
04151         return 0;
04152     }
04153 
04154     for (format = (QSHScheme*)extension->data; format; format = format->next) {
04155         if (format->name == theirs) {
04156             WOLFSSL_MSG("Found Matching QSH Scheme");
04157             return 1; /* have QSH */
04158         }
04159     }
04160 
04161     return 0;
04162 }
04163 #endif /* NO_WOLFSSL_SERVER */
04164 
04165 /* test if the QSH Scheme is implemented
04166    return 1 if yes 0 if no */
04167 static int TLSX_HaveQSHScheme(word16 name)
04168 {
04169     switch(name) {
04170         #ifdef HAVE_NTRU
04171             case WOLFSSL_NTRU_EESS439:
04172             case WOLFSSL_NTRU_EESS593:
04173             case WOLFSSL_NTRU_EESS743:
04174                     return 1;
04175         #endif
04176             case WOLFSSL_LWE_XXX:
04177             case WOLFSSL_HFE_XXX:
04178                     return 0; /* not supported yet */
04179 
04180         default:
04181             return 0;
04182     }
04183 }
04184 
04185 
04186 /* Add a QSHScheme struct to list of usable ones */
04187 int TLSX_UseQSHScheme(TLSX** extensions, word16 name, byte* pKey, word16 pkeySz,
04188                                                                      void* heap)
04189 {
04190     TLSX*      extension = TLSX_Find(*extensions, TLSX_QUANTUM_SAFE_HYBRID);
04191     QSHScheme* format    = NULL;
04192     int        ret       = 0;
04193 
04194     /* sanity check */
04195     if (extensions == NULL || (pKey == NULL && pkeySz != 0))
04196         return BAD_FUNC_ARG;
04197 
04198     /* if scheme is implemented than add */
04199     if (TLSX_HaveQSHScheme(name)) {
04200         if ((ret = TLSX_QSH_Append(&format, name, pKey, pkeySz)) != 0)
04201             return ret;
04202 
04203         if (!extension) {
04204             if ((ret = TLSX_Push(extensions, TLSX_QUANTUM_SAFE_HYBRID, format,
04205                                                                   heap)) != 0) {
04206                 XFREE(format, 0, DYNAMIC_TYPE_TLSX);
04207                 return ret;
04208             }
04209         }
04210         else {
04211             /* push new QSH object to extension data. */
04212             format->next = (QSHScheme*)extension->data;
04213             extension->data = (void*)format;
04214 
04215             /* look for another format of the same name to remove (replacement) */
04216             do {
04217                 if (format->next && (format->next->name == name)) {
04218                     QSHScheme* next = format->next;
04219 
04220                     format->next = next->next;
04221                     XFREE(next, 0, DYNAMIC_TYPE_TLSX);
04222 
04223                     break;
04224                 }
04225             } while ((format = format->next));
04226         }
04227     }
04228     return SSL_SUCCESS;
04229 }
04230 
04231 #define QSH_FREE_ALL         TLSX_QSH_FreeAll
04232 #define QSH_VALIDATE_REQUEST TLSX_QSH_ValidateRequest
04233 
04234 #ifndef NO_WOLFSSL_CLIENT
04235 #define QSH_GET_SIZE TLSX_QSH_GetSize
04236 #define QSH_WRITE    TLSX_QSH_Write
04237 #else
04238 #define QSH_GET_SIZE(list)         0
04239 #define QSH_WRITE(a, b)            0
04240 #endif
04241 
04242 #ifndef NO_WOLFSSL_SERVER
04243 #define QSH_PARSE TLSX_QSH_Parse
04244 #else
04245 #define QSH_PARSE(a, b, c, d)      0
04246 #endif
04247 
04248 #define QSHPK_WRITE TLSX_QSHPK_Write
04249 #define QSH_SERREQ TLSX_QSH_SerPKReq
04250 #else
04251 
04252 #define QSH_FREE_ALL(list, heap)
04253 #define QSH_GET_SIZE(list, a)      0
04254 #define QSH_WRITE(a, b)            0
04255 #define QSH_PARSE(a, b, c, d)      0
04256 #define QSHPK_WRITE(a, b)          0
04257 #define QSH_SERREQ(a, b)           0
04258 #define QSH_VALIDATE_REQUEST(a, b)
04259 
04260 #endif /* HAVE_QSH */
04261 
04262 /******************************************************************************/
04263 /* Supported Versions                                                         */
04264 /******************************************************************************/
04265 
04266 #ifdef WOLFSSL_TLS13
04267 /* Return the size of the SupportedVersions extension's data.
04268  *
04269  * data       The SSL/TLS object.
04270  * returns the length of data that will be in the extension.
04271  */
04272 static word16 TLSX_SupportedVersions_GetSize(byte* data)
04273 {
04274     (void)data;
04275 
04276     /* TLS v1.2 and TLS v1.3  */
04277     int cnt = 2;
04278 
04279 #ifndef NO_OLD_TLS
04280     /* TLS v1 and TLS v1.1  */
04281     cnt += 2;
04282 #endif
04283 
04284     return OPAQUE8_LEN + cnt * OPAQUE16_LEN;
04285 }
04286 
04287 /* Writes the SupportedVersions extension into the buffer.
04288  *
04289  * data    The SSL/TLS object.
04290  * output  The buffer to write the extension into.
04291  * returns the length of data that was written.
04292  */
04293 static word16 TLSX_SupportedVersions_Write(byte* data, byte* output)
04294 {
04295     WOLFSSL* ssl = (WOLFSSL*)data;
04296     ProtocolVersion pv = ssl->ctx->method->version;
04297     int i;
04298     /* TLS v1.2 and TLS v1.3  */
04299     int cnt = 2;
04300 
04301 #ifndef NO_OLD_TLS
04302     /* TLS v1 and TLS v1.1  */
04303     cnt += 2;
04304 #endif
04305 
04306     *(output++) = cnt * OPAQUE16_LEN;
04307     for (i = 0; i < cnt; i++) {
04308         /* TODO: [TLS13] Remove code when TLS v1.3 becomes an RFC. */
04309         if (pv.minor - i == TLSv1_3_MINOR) {
04310             /* The TLS draft major number. */
04311             *(output++) = TLS_DRAFT_MAJOR;
04312             /* Version of draft supported. */
04313             *(output++) = TLS_DRAFT_MINOR;
04314             continue;
04315         }
04316 
04317         *(output++) = pv.major;
04318         *(output++) = pv.minor - i;
04319     }
04320 
04321     return OPAQUE8_LEN + cnt * OPAQUE16_LEN;
04322 }
04323 
04324 /* Parse the SupportedVersions extension.
04325  *
04326  * ssl     The SSL/TLS object.
04327  * input   The buffer with the extension data.
04328  * length  The length of the extension data.
04329  * returns 0 on success, otherwise failure.
04330  */
04331 static int TLSX_SupportedVersions_Parse(WOLFSSL *ssl, byte* input,
04332                                         word16 length)
04333 {
04334     ProtocolVersion pv = ssl->ctx->method->version;
04335     int i;
04336     int ret = 0;
04337     int len;
04338 
04339     /* Must contain a length and at least one version. */
04340     if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1)
04341         return BUFFER_ERROR;
04342 
04343     len = *input;
04344 
04345     /* Protocol version array must fill rest of data. */
04346     if (length != OPAQUE8_LEN + len)
04347         return BUFFER_ERROR;
04348 
04349     input++;
04350 
04351     /* Find first match. */
04352     for (i = 0; i < len; i += OPAQUE16_LEN) {
04353         /* TODO: [TLS13] Remove code when TLS v1.3 becomes an RFC. */
04354         if (input[i] == TLS_DRAFT_MAJOR &&
04355                                     input[i + OPAQUE8_LEN] == TLS_DRAFT_MINOR) {
04356             ssl->version.minor = TLSv1_3_MINOR;
04357             ssl->options.tls1_3 = 1;
04358             TLSX_Push(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, input,
04359                       ssl->heap);
04360             break;
04361         }
04362 
04363         if (input[i] != pv.major)
04364             continue;
04365 
04366 #ifndef NO_OLD_TLS
04367         if (input[i + OPAQUE8_LEN] == TLSv1_MINOR ||
04368             input[i + OPAQUE8_LEN] == TLSv1_1_MINOR) {
04369             ssl->version.minor = input[i + OPAQUE8_LEN];
04370             break;
04371         }
04372 #endif
04373         if (input[i + OPAQUE8_LEN] == TLSv1_2_MINOR) {
04374             ssl->version.minor = input[i + OPAQUE8_LEN];
04375             TLSX_Push(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, input,
04376                       ssl->heap);
04377             break;
04378         }
04379         if (input[i + OPAQUE8_LEN] == TLSv1_3_MINOR) {
04380             ssl->version.minor = input[i + OPAQUE8_LEN];
04381             ssl->options.tls1_3 = 1;
04382             TLSX_Push(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, input,
04383                       ssl->heap);
04384             break;
04385         }
04386     }
04387 
04388     return ret;
04389 }
04390 
04391 /* Sets a new SupportedVersions extension into the extension list.
04392  *
04393  * extensions  The list of extensions.
04394  * data        The extensions specific data.
04395  * heap        The heap used for allocation.
04396  * returns 0 on success, otherwise failure.
04397  */
04398 static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
04399                                      void* heap)
04400 {
04401     if (extensions == NULL || data == NULL)
04402         return BAD_FUNC_ARG;
04403 
04404     return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, (void *)data, heap);
04405 }
04406 
04407 #define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
04408 #define SV_WRITE     TLSX_SupportedVersions_Write
04409 #define SV_PARSE     TLSX_SupportedVersions_Parse
04410 
04411 #else
04412 
04413 #define SV_GET_SIZE(a)       0
04414 #define SV_WRITE(a, b)       0
04415 #define SV_PARSE(a, b, c)    0
04416 
04417 #endif /* WOLFSSL_TLS13 */
04418 
04419 /******************************************************************************/
04420 /* Sugnature Algorithms                                                       */
04421 /******************************************************************************/
04422 
04423 #ifdef WOLFSSL_TLS13
04424 /* Return the size of the SignatureAlgorithms extension's data.
04425  *
04426  * data  Unused
04427  * returns the length of data that will be in the extension.
04428  */
04429 static word16 TLSX_SignatureAlgorithms_GetSize(byte* data)
04430 {
04431     WOLFSSL* ssl = (WOLFSSL*)data;
04432     int      cnt = 0;
04433 
04434     (void)data;
04435 
04436 #ifndef NO_RSA
04437     #ifndef NO_SHA1
04438         cnt++;
04439     #endif
04440     #ifndef NO_SHA256
04441         cnt++;
04442     #endif
04443     #ifdef HAVE_SHA384
04444         cnt++;
04445     #endif
04446     #ifdef HAVE_SHA512
04447         cnt++;
04448     #endif
04449     #ifdef WC_RSA_PSS
04450         if (IsAtLeastTLSv1_3(ssl->version)) {
04451         #ifndef NO_SHA256
04452             cnt++;
04453         #endif
04454         #ifdef HAVE_SHA384
04455             cnt++;
04456         #endif
04457         #ifdef HAVE_SHA512
04458             cnt++;
04459         #endif
04460         }
04461     #endif
04462 #endif
04463 
04464 #ifdef HAVE_ECC
04465     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
04466         #ifndef NO_ECC_SECP
04467             cnt++;
04468         #endif
04469     #endif
04470     #if !defined(NO_ECC384)  || defined(HAVE_ALL_CURVES)
04471         #ifndef NO_ECC_SECP
04472             cnt++;
04473         #endif
04474     #endif
04475     #if !defined(NO_ECC521)  || defined(HAVE_ALL_CURVES)
04476         #ifndef NO_ECC_SECP
04477             cnt++;
04478         #endif
04479     #endif
04480 #endif
04481 
04482     return OPAQUE16_LEN + cnt * OPAQUE16_LEN;
04483 }
04484 
04485 /* Writes the SignatureAlgorithms extension into the buffer.
04486  *
04487  * data    Unused
04488  * output  The buffer to write the extension into.
04489  * returns the length of data that was written.
04490  */
04491 static word16 TLSX_SignatureAlgorithms_Write(byte* data, byte* output)
04492 {
04493     WOLFSSL* ssl = (WOLFSSL*)data;
04494     int      idx = OPAQUE16_LEN;
04495 
04496 
04497 #ifndef NO_RSA
04498     #ifndef NO_SHA1
04499         output[idx++] = 0x02;
04500         output[idx++] = 0x01;
04501     #endif
04502     #ifndef NO_SHA256
04503         output[idx++] = 0x04;
04504         output[idx++] = 0x01;
04505     #endif
04506     #ifdef HAVE_SHA384
04507         output[idx++] = 0x05;
04508         output[idx++] = 0x01;
04509     #endif
04510     #ifdef HAVE_SHA512
04511         output[idx++] = 0x06;
04512         output[idx++] = 0x01;
04513     #endif
04514     #ifdef WC_RSA_PSS
04515         if (IsAtLeastTLSv1_3(ssl->version)) {
04516         #ifndef NO_SHA256
04517             output[idx++] = 0x08;
04518             output[idx++] = 0x04;
04519         #endif
04520         #ifdef HAVE_SHA384
04521             output[idx++] = 0x08;
04522             output[idx++] = 0x05;
04523         #endif
04524         #ifdef HAVE_SHA512
04525             output[idx++] = 0x08;
04526             output[idx++] = 0x06;
04527         #endif
04528         }
04529     #endif
04530 #endif
04531 
04532 #ifdef HAVE_ECC
04533     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
04534         #ifndef NO_ECC_SECP
04535             output[idx++] = 0x04;
04536             output[idx++] = 0x03;
04537         #endif
04538     #endif
04539     #if !defined(NO_ECC384)  || defined(HAVE_ALL_CURVES)
04540         #ifndef NO_ECC_SECP
04541             output[idx++] = 0x05;
04542             output[idx++] = 0x03;
04543         #endif
04544     #endif
04545     #if !defined(NO_ECC521)  || defined(HAVE_ALL_CURVES)
04546         #ifndef NO_ECC_SECP
04547             output[idx++] = 0x06;
04548             output[idx++] = 0x03;
04549         #endif
04550     #endif
04551 #endif
04552 
04553     output[0] = (idx - OPAQUE16_LEN) >> 8;
04554     output[1] = idx - OPAQUE16_LEN;
04555 
04556     return idx;
04557 }
04558 
04559 /* Parse the SignatureAlgorithms extension.
04560  *
04561  * ssl     The SSL/TLS object.
04562  * input   The buffer with the extension data.
04563  * length  The length of the extension data.
04564  * returns 0 on success, otherwise failure.
04565  */
04566 static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, byte* input,
04567                                           word16 length)
04568 {
04569     int    ret = 0;
04570     word16 len;
04571 
04572     (void)ssl;
04573 
04574     /* Must contain a length and at least algorithm. */
04575     if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
04576         return BUFFER_ERROR;
04577 
04578     ato16(input, &len);
04579 
04580     /* Algorithm array must fill rest of data. */
04581     if (length != OPAQUE16_LEN + len)
04582         return BUFFER_ERROR;
04583 
04584     /* Ignore for now. */
04585 
04586     return ret;
04587 }
04588 
04589 /* Sets a new SupportedVersions extension into the extension list.
04590  *
04591  * extensions  The list of extensions.
04592  * data        The extensions specific data.
04593  * heap        The heap used for allocation.
04594  * returns 0 on success, otherwise failure.
04595  */
04596 static int TLSX_SetSignatureAlgorithms(TLSX** extensions, const void* data,
04597                                        void* heap)
04598 {
04599     if (extensions == NULL)
04600         return BAD_FUNC_ARG;
04601 
04602     return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, (void *)data, heap);
04603 }
04604 
04605 #define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
04606 #define SA_WRITE     TLSX_SignatureAlgorithms_Write
04607 #define SA_PARSE     TLSX_SignatureAlgorithms_Parse
04608 
04609 #else
04610 
04611 #define SA_GET_SIZE(a)       0
04612 #define SA_WRITE(a, b)       0
04613 #define SA_PARSE(a, b, c)    0
04614 
04615 #endif
04616 
04617 /******************************************************************************/
04618 /* Key Share                                                                  */
04619 /******************************************************************************/
04620 
04621 #ifdef WOLFSSL_TLS13
04622 #ifndef NO_DH
04623 /* Create a key share entry using named Diffie-Hellman parameters group.
04624  * Generates a key pair.
04625  *
04626  * ssl   The SSL/TLS object.
04627  * kse   The key share entry object.
04628  * returns 0 on success, otherwise failure.
04629  */
04630 static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
04631 {
04632     int             ret;
04633     byte*           keyData;
04634     void*           key = NULL;
04635     word32          keySz;
04636     word32          dataSz;
04637     const DhParams* params;
04638     DhKey dhKey;
04639 
04640     /* TODO: [TLS13] The key size should come from wolfcrypt. */
04641     /* Pick the parameters from the named group. */
04642     switch (kse->group) {
04643     #ifdef HAVE_FFDHE_2048
04644         case WOLFSSL_FFDHE_2048:
04645             params = wc_Dh_ffdhe2048_Get();
04646             keySz = 29;
04647             break;
04648     #endif
04649     #ifdef HAVE_FFDHE_3072
04650         case WOLFSSL_FFDHE_3072:
04651             params = wc_Dh_ffdhe3072_Get();
04652             keySz = 34;
04653             break;
04654     #endif
04655     #ifdef HAVE_FFDHE_4096
04656         case WOLFSSL_FFDHE_4096:
04657             params = wc_Dh_ffdhe4096_Get();
04658             keySz = 39;
04659             break;
04660     #endif
04661     #ifdef HAVE_FFDHE_6144
04662         case WOLFSSL_FFDHE_6144:
04663             params = wc_Dh_ffdhe6144_Get();
04664             keySz = 46;
04665             break;
04666     #endif
04667     #ifdef HAVE_FFDHE_8192
04668         case WOLFSSL_FFDHE_8192:
04669             params = wc_Dh_ffdhe8192_Get();
04670             keySz = 52;
04671             break;
04672     #endif
04673         default:
04674             return BAD_FUNC_ARG;
04675     }
04676 
04677     ret = wc_InitDhKey_ex(&dhKey, ssl->heap, ssl->devId);
04678     if (ret != 0)
04679         return ret;
04680 
04681     /* Allocate space for the public key. */
04682     dataSz = params->p_len;
04683     keyData = (byte*)XMALLOC(dataSz, ssl->heap, DYNAMIC_TYPE_TLSX);
04684     if (keyData == NULL) {
04685         ret = MEMORY_E;
04686         goto end;
04687     }
04688     /* Allocate space for the private key. */
04689     key = (byte*)XMALLOC(keySz, ssl->heap, DYNAMIC_TYPE_TLSX);
04690     if (key == NULL) {
04691         ret = MEMORY_E;
04692         goto end;
04693     }
04694 
04695     /* Set key */
04696     ret = wc_DhSetKey(&dhKey,
04697         (byte*)params->p, params->p_len,
04698         (byte*)params->g, params->g_len);
04699     if (ret != 0)
04700         goto end;
04701 
04702     /* Generate a new key pair. */
04703     ret = wc_DhGenerateKeyPair(&dhKey, ssl->rng, key, &keySz, keyData, &dataSz);
04704 #ifdef WOLFSSL_ASYNC_CRYPT
04705     /* TODO: Make this function non-blocking */
04706     if (ret == WC_PENDING_E) {
04707         ret = wc_AsyncWait(ret, &dhKey.asyncDev, WC_ASYNC_FLAG_NONE);
04708     }
04709 #endif
04710     if (ret != 0)
04711         goto end;
04712 
04713     if (params->p_len != dataSz) {
04714         /* Pad the front of the key data with zeros. */
04715         XMEMMOVE(keyData + params->p_len - dataSz, keyData, dataSz);
04716         XMEMSET(keyData, 0, params->p_len - dataSz);
04717     }
04718 
04719     kse->ke = keyData;
04720     kse->keLen = params->p_len;
04721     kse->key = key;
04722     kse->keyLen = keySz;
04723 
04724 #ifdef WOLFSSL_DEBUG_TLS
04725     WOLFSSL_MSG("Public DH Key");
04726     WOLFSSL_BUFFER(keyData, params->p_len);
04727 #endif
04728 
04729 end:
04730 
04731     wc_FreeDhKey(&dhKey);
04732 
04733     if (ret != 0) {
04734         /* Data owned by key share entry otherwise. */
04735         if (keyData != NULL)
04736             XFREE(keyData, ssl->heap, DYNAMIC_TYPE_TLSX);
04737         if (key != NULL)
04738             XFREE(key, ssl->heap, DYNAMIC_TYPE_TLSX);
04739     }
04740 
04741     return ret;
04742 }
04743 #endif
04744 
04745 #ifndef NO_ECC
04746 /* Create a key share entry using named elliptic curve parameters group.
04747  * Generates a key pair.
04748  *
04749  * ssl   The SSL/TLS object.
04750  * kse   The key share entry object.
04751  * returns 0 on success, otherwise failure.
04752  */
04753 static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
04754 {
04755     int      ret;
04756     byte*    keyData = NULL;
04757     word32   dataSize;
04758     word32   keySize;
04759     ecc_key* eccKey;
04760     word16   curveId;
04761 
04762     /* TODO: [TLS13] The key sizes should come from wolfcrypt. */
04763     /* Translate named group to a curve id. */
04764     switch (kse->group) {
04765     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
04766         #ifndef NO_ECC_SECP
04767         case WOLFSSL_ECC_SECP256R1:
04768             curveId = ECC_SECP256R1;
04769             keySize = 32;
04770             dataSize = keySize * 2 + 1;
04771             break;
04772         #endif /* !NO_ECC_SECP */
04773     #endif
04774     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
04775         #ifndef NO_ECC_SECP
04776         case WOLFSSL_ECC_SECP384R1:
04777             curveId = ECC_SECP384R1;
04778             keySize = 48;
04779             dataSize = keySize * 2 + 1;
04780             break;
04781         #endif /* !NO_ECC_SECP */
04782     #endif
04783     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
04784         #ifndef NO_ECC_SECP
04785         case WOLFSSL_ECC_SECP521R1:
04786             curveId = ECC_SECP521R1;
04787             keySize = 66;
04788             dataSize = keySize * 2 + 1;
04789             break;
04790         #endif /* !NO_ECC_SECP */
04791     #endif
04792     #ifdef HAVE_CURVE25519
04793         case WOLFSSL_ECC_X25519:
04794             {
04795                 curve25519_key* key;
04796                 /* Allocate an ECC key to hold private key. */
04797                 key = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
04798                                                ssl->heap, DYNAMIC_TYPE_TLSX);
04799                 if (key == NULL) {
04800                     WOLFSSL_MSG("EccTempKey Memory error");
04801                     return MEMORY_E;
04802                 }
04803 
04804                 dataSize = keySize = 32;
04805 
04806                 /* Make an ECC key. */
04807                 ret = wc_curve25519_init(key);
04808                 if (ret != 0)
04809                     goto end;
04810                 ret = wc_curve25519_make_key(ssl->rng, keySize, key);
04811                 if (ret != 0)
04812                     goto end;
04813 
04814                 /* Allocate space for the public key. */
04815                 keyData = XMALLOC(dataSize, ssl->heap, DYNAMIC_TYPE_TLSX);
04816                 if (keyData == NULL) {
04817                     WOLFSSL_MSG("Key data Memory error");
04818                     ret = MEMORY_E;
04819                     goto end;
04820                 }
04821 
04822                 /* Export public key. */
04823                 if (wc_curve25519_export_public_ex(key, keyData, &dataSize,
04824                                                   EC25519_LITTLE_ENDIAN) != 0) {
04825                     ret = ECC_EXPORT_ERROR;
04826                     goto end;
04827                 }
04828 
04829                 kse->ke = keyData;
04830                 kse->keLen = dataSize;
04831                 kse->key = key;
04832 
04833 #ifdef WOLFSSL_DEBUG_TLS
04834                 WOLFSSL_MSG("Public ECC Key");
04835                 WOLFSSL_BUFFER(keyData, dataSize);
04836 #endif
04837 
04838                 goto end;
04839             }
04840     #endif
04841     #ifdef HAVE_X448
04842         case WOLFSSL_ECC_X448:
04843             curveId = ECC_X448;
04844             dataSize = keySize = 56;
04845             break;
04846     #endif
04847         default:
04848             return BAD_FUNC_ARG;
04849     }
04850 
04851     /* Allocate an ECC key to hold private key. */
04852     eccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_TLSX);
04853     if (eccKey == NULL) {
04854         WOLFSSL_MSG("EccTempKey Memory error");
04855         return MEMORY_E;
04856     }
04857 
04858     /* Make an ECC key. */
04859     ret = wc_ecc_init_ex(eccKey, ssl->heap, ssl->devId);
04860     if (ret != 0)
04861         goto end;
04862     ret = wc_ecc_make_key_ex(ssl->rng, keySize, eccKey, curveId);
04863 #ifdef WOLFSSL_ASYNC_CRYPT
04864     /* TODO: Make this function non-blocking */
04865     if (ret == WC_PENDING_E) {
04866         ret = wc_AsyncWait(ret, &eccKey->asyncDev, WC_ASYNC_FLAG_NONE);
04867     }
04868 #endif
04869     if (ret != 0)
04870         goto end;
04871 
04872     /* Allocate space for the public key. */
04873     keyData = XMALLOC(dataSize, ssl->heap, DYNAMIC_TYPE_TLSX);
04874     if (keyData == NULL) {
04875         WOLFSSL_MSG("Key data Memory error");
04876         ret = MEMORY_E;
04877         goto end;
04878     }
04879 
04880     /* Export public key. */
04881     if (wc_ecc_export_x963(eccKey, keyData, &dataSize) != 0) {
04882         ret = ECC_EXPORT_ERROR;
04883         goto end;
04884     }
04885 
04886     kse->ke = keyData;
04887     kse->keLen = dataSize;
04888     kse->key = eccKey;
04889 
04890 #ifdef WOLFSSL_DEBUG_TLS
04891     WOLFSSL_MSG("Public ECC Key");
04892     WOLFSSL_BUFFER(keyData, dataSize);
04893 #endif
04894 
04895 end:
04896     if (ret != 0) {
04897         /* Data owned by key share entry otherwise. */
04898         if (eccKey != NULL)
04899             XFREE(eccKey, ssl->heap, DYNAMIC_TYPE_TLSX);
04900         if (keyData != NULL)
04901             XFREE(keyData, ssl->heap, DYNAMIC_TYPE_TLSX);
04902     }
04903     return ret;
04904 }
04905 #endif /* !NO_ECC */
04906 
04907 /* Generate a secret/key using the key share entry.
04908  *
04909  * ssl  The SSL/TLS object.
04910  * kse  The key share entry holding peer data.
04911  */
04912 static int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
04913 {
04914     /* Named FFHE groups have a bit set to identify them. */
04915     if ((kse->group & NAMED_DH_MASK) == NAMED_DH_MASK)
04916         return TLSX_KeyShare_GenDhKey(ssl, kse);
04917     return TLSX_KeyShare_GenEccKey(ssl, kse);
04918 }
04919 
04920 /* Free the key share dynamic data.
04921  *
04922  * list  The linked list of key share entry objects.
04923  * heap  The heap used for allocation.
04924  */
04925 static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
04926 {
04927     KeyShareEntry* current;
04928 
04929     while ((current = list) != NULL) {
04930         list = current->next;
04931         XFREE(current->key, heap, DYNAMIC_TYPE_TLSX);
04932         XFREE(current->ke, heap, DYNAMIC_TYPE_TLSX);
04933         XFREE(current, heap, DYNAMIC_TYPE_TLSX);
04934     }
04935 
04936     (void)heap;
04937 }
04938 
04939 /* Get the size of the encoded key share extension.
04940  *
04941  * list     The linked list of key share extensions.
04942  * msgType  The type of the message this extension is being written into.
04943  * returns the number of bytes of the encoded key share extension.
04944  */
04945 static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
04946 {
04947     int            len = 0;
04948     byte           isRequest = (msgType == client_hello);
04949     KeyShareEntry* current;
04950 
04951     /* The named group the server wants to use. */
04952     if (msgType == hello_retry_request)
04953         return OPAQUE16_LEN;
04954 
04955     /* List of key exchange groups. */
04956     if (isRequest)
04957         len += OPAQUE16_LEN;
04958     while ((current = list) != NULL) {
04959         list = current->next;
04960 
04961         if (!isRequest && current->key == NULL)
04962             continue;
04963 
04964         len += OPAQUE16_LEN + OPAQUE16_LEN + current->keLen;
04965     }
04966 
04967     return len;
04968 }
04969 
04970 /* Writes the key share extension into the output buffer.
04971  * Assumes that the the output buffer is big enough to hold data.
04972  *
04973  * list     The linked list of key share entries.
04974  * output   The buffer to write into.
04975  * msgType  The type of the message this extension is being written into.
04976  * returns the number of bytes written into the buffer.
04977  */
04978 static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
04979                                   byte msgType)
04980 {
04981     word16         i = 0;
04982     byte           isRequest = (msgType == client_hello);
04983     KeyShareEntry* current;
04984 
04985     if (msgType == hello_retry_request) {
04986         c16toa(list->group, output);
04987         return OPAQUE16_LEN;
04988     }
04989 
04990     /* ClientHello has a list but ServerHello is only the chosen. */
04991     if (isRequest)
04992         i += OPAQUE16_LEN;
04993 
04994     /* Write out all in the list. */
04995     while ((current = list) != NULL) {
04996         list = current->next;
04997 
04998         if (!isRequest && current->key == NULL)
04999             continue;
05000 
05001         c16toa(current->group, &output[i]);
05002         i += KE_GROUP_LEN;
05003         c16toa(current->keLen, &output[i]);
05004         i += OPAQUE16_LEN;
05005         XMEMCPY(&output[i], current->ke, current->keLen);
05006         i += current->keLen;
05007     }
05008     /* Write the length of the list if required. */
05009     if (isRequest)
05010         c16toa(i - OPAQUE16_LEN, output);
05011 
05012     return i;
05013 }
05014 
05015 /* Process the DH key share extension on the client side.
05016  *
05017  * ssl            The SSL/TLS object.
05018  * keyShareEntry  The key share entry object to use to calculate shared secret.
05019  * returns 0 on success and other values indicate failure.
05020  */
05021 static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
05022 {
05023 #ifndef NO_DH
05024     int             ret;
05025     const DhParams* params;
05026     word16          i;
05027     byte            b;
05028     DhKey           dhKey;
05029 
05030     switch (keyShareEntry->group) {
05031     #ifdef HAVE_FFDHE_2048
05032         case WOLFSSL_FFDHE_2048:
05033             params = wc_Dh_ffdhe2048_Get();
05034             break;
05035     #endif
05036     #ifdef HAVE_FFDHE_3072
05037         case WOLFSSL_FFDHE_3072:
05038             params = wc_Dh_ffdhe3072_Get();
05039             break;
05040     #endif
05041     #ifdef HAVE_FFDHE_4096
05042         case WOLFSSL_FFDHE_4096:
05043             params = wc_Dh_ffdhe4096_Get();
05044             break;
05045     #endif
05046     #ifdef HAVE_FFDHE_6144
05047         case WOLFSSL_FFDHE_6144:
05048             params = wc_Dh_ffdhe6144_Get();
05049             break;
05050     #endif
05051     #ifdef HAVE_FFDHE_8192
05052         case WOLFSSL_FFDHE_8192:
05053             params = wc_Dh_ffdhe8192_Get();
05054             break;
05055     #endif
05056         default:
05057             return PEER_KEY_ERROR;
05058     }
05059 
05060 #ifdef WOLFSSL_DEBUG_TLS
05061     WOLFSSL_MSG("Peer DH Key");
05062     WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
05063 #endif
05064 
05065     if (params->p_len != keyShareEntry->keLen)
05066         return BUFFER_ERROR;
05067 
05068     /* TODO: [TLS13] move this check down into wolfcrypt. */
05069     /* Check that public DH key is not 0 or 1. */
05070     b = 0;
05071     for (i = 0; i < params->p_len - 1; i++)
05072         b |= keyShareEntry->ke[i];
05073     if (b == 0 && (keyShareEntry->ke[i] == 0x00 ||
05074                    keyShareEntry->ke[i] == 0x01)) {
05075         return PEER_KEY_ERROR;
05076     }
05077     /* Check that public DH key is not mod, mod + 1 or mod - 1. */
05078     b = 0;
05079     for (i = 0; i < params->p_len - 1; i++)
05080         b |= params->p[i] ^ keyShareEntry->ke[i];
05081     if (b == 0 && (params->p[i]     == keyShareEntry->ke[i] ||
05082                    params->p[i] - 1 == keyShareEntry->ke[i] ||
05083                    params->p[i] + 1 == keyShareEntry->ke[i])) {
05084         return PEER_KEY_ERROR;
05085     }
05086 
05087     ret = wc_InitDhKey_ex(&dhKey, ssl->heap, ssl->devId);
05088     if (ret != 0)
05089         return ret;
05090 
05091     /* Set key */
05092     ret = wc_DhSetKey(&dhKey,
05093         (byte*)params->p, params->p_len,
05094         (byte*)params->g, params->g_len);
05095     if (ret != 0) {
05096         wc_FreeDhKey(&dhKey);
05097         return ret;
05098     }
05099 
05100     /* Derive secret from private key and peer's public key. */
05101     ret = wc_DhAgree(&dhKey,
05102         ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
05103         keyShareEntry->key, keyShareEntry->keyLen,
05104         keyShareEntry->ke, keyShareEntry->keLen);
05105 #ifdef WOLFSSL_ASYNC_CRYPT
05106     /* TODO: Make this function non-blocking */
05107     if (ret == WC_PENDING_E) {
05108         ret = wc_AsyncWait(ret, &dhKey.asyncDev, WC_ASYNC_FLAG_NONE);
05109     }
05110 #endif
05111 
05112     wc_FreeDhKey(&dhKey);
05113 
05114     return ret;
05115 #else
05116     return PEER_KEY_ERROR;
05117 #endif
05118 }
05119 
05120 /* Process the ECC key share extension on the client side.
05121  *
05122  * ssl            The SSL/TLS object.
05123  * keyShareEntry  The key share entry object to use to calculate shared secret.
05124  * returns 0 on success and other values indicate failure.
05125  */
05126 static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
05127 {
05128 #ifndef NO_ECC
05129     int ret;
05130     int curveId;
05131     ecc_key* keyShareKey = (ecc_key*)keyShareEntry->key;
05132 
05133     if (ssl->peerEccKey != NULL)
05134         wc_ecc_free(ssl->peerEccKey);
05135 
05136     ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
05137                                         DYNAMIC_TYPE_TLSX);
05138     if (ssl->peerEccKey == NULL) {
05139         WOLFSSL_MSG("PeerEccKey Memory error");
05140         return MEMORY_ERROR;
05141     }
05142     ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
05143     if (ret != 0)
05144         return ret;
05145 
05146     /* find supported curve */
05147     switch (keyShareEntry->group) {
05148     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
05149         #ifndef NO_ECC_SECP
05150         case WOLFSSL_ECC_SECP256R1:
05151             curveId = ECC_SECP256R1;
05152             break;
05153         #endif /* !NO_ECC_SECP */
05154     #endif
05155     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
05156         #ifndef NO_ECC_SECP
05157         case WOLFSSL_ECC_SECP384R1:
05158             curveId = ECC_SECP384R1;
05159             break;
05160         #endif /* !NO_ECC_SECP */
05161     #endif
05162     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
05163         #ifndef NO_ECC_SECP
05164         case WOLFSSL_ECC_SECP521R1:
05165             curveId = ECC_SECP521R1;
05166             break;
05167         #endif /* !NO_ECC_SECP */
05168     #endif
05169     #ifdef HAVE_CURVE25519
05170         case WOLFSSL_ECC_X25519:
05171             {
05172                 curve25519_key* key = (curve25519_key*)keyShareEntry->key;
05173                 curve25519_key* peerEccKey;
05174 
05175                 if (ssl->peerEccKey != NULL)
05176                     wc_ecc_free(ssl->peerEccKey);
05177 
05178                 peerEccKey = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
05179                                                   ssl->heap, DYNAMIC_TYPE_TLSX);
05180                 if (peerEccKey == NULL) {
05181                     WOLFSSL_MSG("PeerEccKey Memory error");
05182                     return MEMORY_ERROR;
05183                 }
05184                 ret = wc_curve25519_init(peerEccKey);
05185                 if (ret != 0)
05186                     return ret;
05187 #ifdef WOLFSSL_DEBUG_TLS
05188                 WOLFSSL_MSG("Peer ECC Key");
05189                 WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
05190 #endif
05191 
05192                 /* Point is validated by import function. */
05193                 if (wc_curve25519_import_public_ex(keyShareEntry->ke,
05194                                                keyShareEntry->keLen, peerEccKey,
05195                                                EC25519_LITTLE_ENDIAN) != 0) {
05196                     return ECC_PEERKEY_ERROR;
05197                 }
05198 
05199                 ssl->arrays->preMasterSz = ENCRYPT_LEN;
05200                 ret = wc_curve25519_shared_secret_ex(key, peerEccKey,
05201                     ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
05202                     EC25519_LITTLE_ENDIAN);
05203                 wc_curve25519_free(peerEccKey);
05204                 XFREE(peerEccKey, ssl->heap, DYNAMIC_TYPE_TLSX);
05205                 return ret;
05206             }
05207     #endif
05208     #ifdef HAVE_X448
05209         case WOLFSSL_ECC_X448:
05210             curveId = ECC_X448;
05211             break;
05212     #endif
05213         default:
05214             /* unsupported curve */
05215             return ECC_PEERKEY_ERROR;
05216     }
05217 
05218 #ifdef WOLFSSL_DEBUG_TLS
05219     WOLFSSL_MSG("Peer ECC Key");
05220     WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
05221 #endif
05222 
05223     /* Point is validated by import function. */
05224     if (wc_ecc_import_x963_ex(keyShareEntry->ke, keyShareEntry->keLen,
05225                               ssl->peerEccKey, curveId) != 0) {
05226         return ECC_PEERKEY_ERROR;
05227     }
05228 
05229     ssl->arrays->preMasterSz = ENCRYPT_LEN;
05230     do {
05231     #if defined(WOLFSSL_ASYNC_CRYPT)
05232         ret = wc_AsyncWait(ret, &keyShareKey->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
05233     #endif
05234         if (ret >= 0)
05235             ret = wc_ecc_shared_secret(keyShareKey, ssl->peerEccKey,
05236                 ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
05237     } while (ret == WC_PENDING_E);
05238 
05239 #if 0
05240     /* TODO: Switch to support async here and use: */
05241     ret = EccSharedSecret(ssl, keyShareEntry->key, ssl->peerEccKey,
05242         keyShareEntry->ke, &keyShareEntry->keLen,
05243         ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
05244         ssl->options.side,
05245     #ifdef HAVE_PK_CALLBACKS
05246         ssl->EccSharedSecretCtx
05247     #else
05248         NULL
05249     #endif
05250     );
05251 #endif
05252 
05253     return ret;
05254 #else
05255     return PEER_KEY_ERROR;
05256 #endif
05257 }
05258 
05259 /* Process the key share extension on the client side.
05260  *
05261  * ssl            The SSL/TLS object.
05262  * keyShareEntry  The key share entry object to use to calculate shared secret.
05263  * returns 0 on success and other values indicate failure.
05264  */
05265 static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
05266 {
05267     int ret;
05268 
05269 #ifdef HAVE_SESSION_TICKET
05270     ssl->session.namedGroup = keyShareEntry->group;
05271 #endif
05272     /* Use Key Share Data from server. */
05273     if (keyShareEntry->group & NAMED_DH_MASK)
05274         ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
05275     else
05276         ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
05277 
05278 #ifdef WOLFSSL_DEBUG_TLS
05279     WOLFSSL_MSG("KE Secret");
05280     WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
05281 #endif
05282 
05283     return ret;
05284 }
05285 
05286 /* Parse an entry of the KeyShare extension.
05287  *
05288  * ssl     The SSL/TLS object.
05289  * input   The extension data.
05290  * length  The length of the extension data.
05291  * kse     The new key share entry object.
05292  * returns a positive number to indicate amount of data parsed and a negative
05293  * number on error.
05294  */
05295 static int TLSX_KeyShareEntry_Parse(WOLFSSL* ssl, byte* input, word16 length,
05296                                     KeyShareEntry **kse)
05297 {
05298     int    ret;
05299     word16 group;
05300     word16 keLen;
05301     int    offset = 0;
05302     byte*  ke;
05303 
05304     if (length < OPAQUE16_LEN + OPAQUE16_LEN)
05305         return BUFFER_ERROR;
05306     /* Named group */
05307     ato16(&input[offset], &group);
05308     offset += OPAQUE16_LEN;
05309     /* Key exchange data - public key. */
05310     ato16(&input[offset], &keLen);
05311     offset += OPAQUE16_LEN;
05312     if (keLen < 1 || keLen > length - offset)
05313         return BUFFER_ERROR;
05314 
05315     /* Store a copy in the key share object. */
05316     ke = XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_TLSX);
05317     if (ke == NULL)
05318         return MEMORY_E;
05319     XMEMCPY(ke, &input[offset], keLen);
05320 
05321     /* Populate a key share object in the extension. */
05322     ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse);
05323     if (ret != 0)
05324         return ret;
05325 
05326     /* Total length of the parsed data. */
05327     return offset + keLen;
05328 }
05329 
05330 /* Searches the groups sent for the specified named group.
05331  *
05332  * ssl   The SSL/TLS object.
05333  * name  The group name to match.
05334  * returns 1 when the extension has the group name and 0 otherwise.
05335  */
05336 static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
05337 {
05338     TLSX*          extension;
05339     KeyShareEntry* list;
05340 
05341     extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
05342     if (extension == NULL)
05343         return 0;
05344 
05345     list = (KeyShareEntry*)extension->data;
05346     while (list != NULL) {
05347         if (list->group == group) {
05348             return 1;
05349         }
05350         list = list->next;
05351     }
05352 
05353     return 0;
05354 }
05355 
05356 /* Parse the KeyShare extension.
05357  * Different formats in different messages.
05358  *
05359  * ssl      The SSL/TLS object.
05360  * input    The extension data.
05361  * length   The length of the extension data.
05362  * msgType  The type of the message this extension is being parsed from.
05363  * returns 0 on success and other values indicate failure.
05364  */
05365 static int TLSX_KeyShare_Parse(WOLFSSL* ssl, byte* input, word16 length,
05366                                byte msgType)
05367 {
05368     int ret;
05369     KeyShareEntry *keyShareEntry;
05370 
05371     if (msgType == client_hello) {
05372         int offset = 0;
05373         word16 len;
05374 
05375         if (length < OPAQUE16_LEN)
05376             return BUFFER_ERROR;
05377 
05378         /* ClientHello contains zero or more key share entries. */
05379         ato16(input, &len);
05380         if (len != length - OPAQUE16_LEN)
05381             return BUFFER_ERROR;
05382         offset += OPAQUE16_LEN;
05383 
05384         while (offset < length) {
05385             ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset], length,
05386                                            &keyShareEntry);
05387             if (ret < 0)
05388                 return ret;
05389 
05390             offset += ret;
05391         }
05392 
05393         ret = 0;
05394     }
05395     else if (msgType == server_hello) {
05396         int len;
05397 
05398         /* ServerHello contains one key share entry. */
05399         len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry);
05400         if (len != length)
05401             return BUFFER_ERROR;
05402 
05403         /* Not in list sent if there isn't a private key. */
05404         if (keyShareEntry->key == NULL)
05405             return BAD_KEY_SHARE_DATA;
05406 
05407         /* Process the entry to calculate the secret. */
05408         ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
05409     }
05410     else if (msgType == hello_retry_request) {
05411         word16 group;
05412 
05413         if (length != OPAQUE16_LEN)
05414             return BUFFER_ERROR;
05415 
05416         /* The data is the named group the server wants to use. */
05417         ato16(input, &group);
05418 
05419         /* Check the selected group was supported by ClientHello extensions. */
05420         if (!TLSX_SupportedGroups_Find(ssl, group))
05421             return BAD_KEY_SHARE_DATA;
05422 
05423         /* Check if the group was sent. */
05424         if (TLSX_KeyShare_Find(ssl, group))
05425             return BAD_KEY_SHARE_DATA;
05426 
05427         /* Try to use the server's group. */
05428         ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL);
05429     }
05430     else {
05431         /* Not a message type that is allowed to have this extension. */
05432         return SANITY_MSG_E;
05433     }
05434 
05435     return ret;
05436 }
05437 
05438 /* Create a new key share entry and put it into the list.
05439  *
05440  * list           The linked list of key share entries.
05441  * group          The named group.
05442  * heap           The memory to allocate with.
05443  * keyShareEntry  The new key share entry object.
05444  * returns 0 on success and other values indicate failure.
05445  */
05446 static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
05447                              KeyShareEntry** keyShareEntry)
05448 {
05449     KeyShareEntry* kse;
05450 
05451     kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
05452                                   DYNAMIC_TYPE_TLSX);
05453     if (kse == NULL)
05454         return MEMORY_E;
05455 
05456     XMEMSET(kse, 0, sizeof(*kse));
05457     kse->group = group;
05458 
05459     /* Add it to the back and maintain the links. */
05460     while (*list != NULL)
05461         list = &((*list)->next);
05462     *list = kse;
05463     *keyShareEntry = kse;
05464 
05465     return 0;
05466 }
05467 
05468 /* Use the data to create a new key share object in the extensions.
05469  *
05470  * ssl    The SSL/TLS object.
05471  * group  The named group.
05472  * len    The length of the public key data.
05473  * data   The public key data.
05474  * kse    The new key share entry object.
05475  * returns 0 on success and other values indicate failure.
05476  */
05477 int TLSX_KeyShare_Use(WOLFSSL* ssl, word16 group, word16 len, byte* data,
05478                       KeyShareEntry **kse)
05479 {
05480     int            ret = 0;
05481     TLSX*          extension;
05482     KeyShareEntry* keyShareEntry = NULL;
05483 
05484     /* Find the KeyShare extension if it exists. */
05485     extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
05486     if (extension == NULL) {
05487         /* Push new KeyShare extension. */
05488         ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
05489         if (ret != 0)
05490             return ret;
05491 
05492         extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
05493         if (extension == NULL)
05494             return MEMORY_E;
05495     }
05496 
05497     /* Try to find the key share entry with this group. */
05498     keyShareEntry = (KeyShareEntry*)extension->data;
05499     while (keyShareEntry != NULL) {
05500         if (keyShareEntry->group == group)
05501             break;
05502         keyShareEntry = keyShareEntry->next;
05503     }
05504 
05505     /* Create a new key share entry if not found. */
05506     if (keyShareEntry == NULL) {
05507         ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
05508                                 ssl->heap, &keyShareEntry);
05509         if (ret != 0)
05510             return ret;
05511     }
05512 
05513     if (data != NULL) {
05514         /* Keep the public key data and free when finished. */
05515         if (keyShareEntry->ke != NULL)
05516             XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_TLSX);
05517         keyShareEntry->ke = data;
05518         keyShareEntry->keLen = len;
05519     }
05520     else {
05521         /* Generate a key pair. */
05522         ret = TLSX_KeyShare_GenKey(ssl, keyShareEntry);
05523         if (ret != 0)
05524             return ret;
05525     }
05526 
05527     if (kse != NULL)
05528         *kse = keyShareEntry;
05529 
05530     return 0;
05531 }
05532 
05533 /* Set an empty Key Share extension.
05534  *
05535  * ssl  The SSL/TLS object.
05536  * returns 0 on success and other values indicate failure.
05537  */
05538 int TLSX_KeyShare_Empty(WOLFSSL* ssl)
05539 {
05540     int   ret = 0;
05541     TLSX* extension;
05542 
05543     /* Find the KeyShare extension if it exists. */
05544     extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
05545     if (extension == NULL) {
05546         /* Push new KeyShare extension. */
05547         ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
05548     }
05549     else if (extension->data != NULL) {
05550         TLSX_KeyShare_FreeAll(extension->data, ssl->heap);
05551         extension->data = NULL;
05552     }
05553 
05554     return ret;
05555 }
05556 
05557 /* Returns whether this group is supported.
05558  *
05559  * namedGroup  The named group to check.
05560  * returns 1 when supported or 0 otherwise.
05561  */
05562 static int TLSX_KeyShare_IsSupported(int namedGroup)
05563 {
05564     switch (namedGroup) {
05565     #ifdef HAVE_FFDHE_2048
05566         case WOLFSSL_FFDHE_2048:
05567             break;
05568     #endif
05569     #ifdef HAVE_FFDHE_3072
05570         case WOLFSSL_FFDHE_3072:
05571             break;
05572     #endif
05573     #ifdef HAVE_FFDHE_4096
05574         case WOLFSSL_FFDHE_4096:
05575             break;
05576     #endif
05577     #ifdef HAVE_FFDHE_6144
05578         case WOLFSSL_FFDHE_6144:
05579             break;
05580     #endif
05581     #ifdef HAVE_FFDHE_8192
05582         case WOLFSSL_FFDHE_8192:
05583             break;
05584     #endif
05585     #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
05586         #ifndef NO_ECC_SECP
05587         case WOLFSSL_ECC_SECP256R1:
05588             break;
05589         #endif /* !NO_ECC_SECP */
05590     #endif
05591     #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
05592         #ifndef NO_ECC_SECP
05593         case WOLFSSL_ECC_SECP384R1:
05594             break;
05595         #endif /* !NO_ECC_SECP */
05596     #endif
05597     #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
05598         #ifndef NO_ECC_SECP
05599         case WOLFSSL_ECC_SECP521R1:
05600             break;
05601         #endif /* !NO_ECC_SECP */
05602     #endif
05603     #ifdef HAVE_CURVE25519
05604         case WOLFSSL_ECC_X25519:
05605             break;
05606     #endif
05607     #ifdef HAVE_X448
05608         case WOLFSSL_ECC_X448:
05609             break;
05610     #endif
05611         default:
05612             return 0;
05613     }
05614 
05615     return 1;
05616 }
05617 
05618 /* Set a key share that is supported by the client into extensions.
05619  *
05620  * ssl  The SSL/TLS object.
05621  * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
05622  * 0 if a supported group has a key share and other values indicate an error.
05623  */
05624 static int TLSX_KeyShare_SetSupported(WOLFSSL* ssl)
05625 {
05626     int            ret;
05627     TLSX*          extension;
05628     EllipticCurve* curve = NULL;
05629 
05630     /* Use SupportedGroup's order. */
05631     extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
05632     if (extension != NULL)
05633         curve = (EllipticCurve*)extension->data;
05634     for (; curve != NULL; curve = curve->next) {
05635         if (TLSX_KeyShare_IsSupported(curve->name) &&
05636                 !TLSX_KeyShare_Find(ssl, curve->name)) {
05637             break;
05638         }
05639     }
05640     if (curve == NULL)
05641         return BAD_KEY_SHARE_DATA;
05642 
05643     /* Delete the old key share data list. */
05644     extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
05645     if (extension != NULL) {
05646         TLSX_KeyShare_FreeAll(extension->data, ssl->heap);
05647         extension->data = NULL;
05648     }
05649 
05650     /* Add in the chosen group. */
05651     ret = TLSX_KeyShare_Use(ssl, curve->name, 0, NULL, NULL);
05652     if (ret != 0)
05653         return ret;
05654 
05655     /* Set extension to be in reponse. */
05656     extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
05657     extension->resp = 1;
05658 
05659     return 0;
05660 }
05661 
05662 /* Establish the secret based on the key shares received from the client.
05663  *
05664  * ssl  The SSL/TLS object.
05665  * returns 0 on success and other values indicate failure.
05666  */
05667 int TLSX_KeyShare_Establish(WOLFSSL *ssl)
05668 {
05669     int            ret;
05670     TLSX*          extension;
05671     KeyShareEntry* clientKSE = NULL;
05672     KeyShareEntry* serverKSE;
05673     KeyShareEntry* list = NULL;
05674     byte*          ke;
05675     word16         keLen;
05676 
05677     /* Find the KeyShare extension if it exists. */
05678     extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
05679     if (extension != NULL)
05680         list = (KeyShareEntry*)extension->data;
05681 
05682     /* TODO: [TLS13] Server's preference and sending back SupportedGroups */
05683     /* Use client's preference. */
05684     for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
05685         /* Check consistency now - extensions in any order. */
05686         if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group))
05687             return BAD_KEY_SHARE_DATA;
05688 
05689         /* Check if server supports group. */
05690         if (TLSX_KeyShare_IsSupported(clientKSE->group))
05691             break;
05692     }
05693     /* No supported group found - send HelloRetryRequest. */
05694     if (clientKSE == NULL) {
05695         ret = TLSX_KeyShare_SetSupported(ssl);
05696         /* Return KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
05697         if (ret == 0)
05698             return KEY_SHARE_ERROR;
05699         return ret;
05700     }
05701 
05702     list = NULL;
05703     /* Generate a new key pair. */
05704     ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
05705     if (ret != 0)
05706         return ret;
05707     ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
05708     if (ret != 0)
05709         return ret;
05710 
05711     /* Move private key to client entry. */
05712     if (clientKSE->key != NULL)
05713         XFREE(clientKSE->key, heap, DYNAMIC_TYPE_TLSX);
05714     clientKSE->key = serverKSE->key;
05715     serverKSE->key = NULL;
05716     clientKSE->keyLen = serverKSE->keyLen;
05717 
05718     /* Calculate secret. */
05719     ret = TLSX_KeyShare_Process(ssl, clientKSE);
05720     if (ret != 0)
05721         return ret;
05722 
05723     /* Swap public keys for sending to client. */
05724     ke = serverKSE->ke;
05725     keLen = serverKSE->keLen;
05726     serverKSE->ke = clientKSE->ke;
05727     serverKSE->keLen = clientKSE->keLen;
05728     clientKSE->ke = ke;
05729     clientKSE->keLen = keLen;
05730 
05731     extension->resp = 1;
05732 
05733     /* Dispose of temporary server extension. */
05734     TLSX_KeyShare_FreeAll(list, ssl->heap);
05735 
05736     return 0;
05737 }
05738 
05739 #define KS_FREE_ALL  TLSX_KeyShare_FreeAll
05740 #define KS_GET_SIZE  TLSX_KeyShare_GetSize
05741 #define KS_WRITE     TLSX_KeyShare_Write
05742 #define KS_PARSE     TLSX_KeyShare_Parse
05743 
05744 #else
05745 
05746 #define KS_FREE_ALL(a, b)
05747 #define KS_GET_SIZE(a, b)    0
05748 #define KS_WRITE(a, b, c)    0
05749 #define KS_PARSE(a, b, c, d) 0
05750 
05751 #endif /* WOLFSSL_TLS13 */
05752 
05753 /******************************************************************************/
05754 /* Pre-Shared Key                                                             */
05755 /******************************************************************************/
05756 
05757 #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) && !defined(NO_PSK)
05758 /* Free the pre-shared key dynamic data.
05759  *
05760  * list  The linked list of key share entry objects.
05761  * heap  The heap used for allocation.
05762  */
05763 static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
05764 {
05765     PreSharedKey* current;
05766 
05767     while ((current = list) != NULL) {
05768         list = current->next;
05769         XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
05770         XFREE(current, heap, DYNAMIC_TYPE_TLSX);
05771     }
05772 
05773     (void)heap;
05774 }
05775 
05776 /* Get the size of the encoded pre shared key extension.
05777  *
05778  * list     The linked list of pre-shared key extensions.
05779  * msgType  The type of the message this extension is being written into.
05780  * returns the number of bytes of the encoded pre-shared key extension or
05781  * SANITY_MSG_E to indicate invalid message type.
05782  */
05783 static word16 TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType)
05784 {
05785     if (msgType == client_hello) {
05786         /* Length of identities + Length of binders. */
05787         word16 len = OPAQUE16_LEN + OPAQUE16_LEN;
05788         while (list != NULL) {
05789             /* Each entry has: identity, ticket age and binder. */
05790             len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
05791                    OPAQUE8_LEN + list->binderLen;
05792             list = list->next;
05793         }
05794         return len;
05795     }
05796 
05797     if (msgType == server_hello) {
05798         return OPAQUE16_LEN;
05799     }
05800 
05801     return 0;
05802 }
05803 
05804 /* The number of bytes to be written for the binders.
05805  *
05806  * list     The linked list of pre-shared key extensions.
05807  * msgType  The type of the message this extension is being written into.
05808  * returns the number of bytes of the encoded pre-shared key extension or
05809  * SANITY_MSG_E to indicate invalid message type.
05810  */
05811 word16 TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType)
05812 {
05813     word16 len;
05814 
05815     if (msgType != client_hello)
05816         return SANITY_MSG_E;
05817 
05818     /* Length of all binders. */
05819     len = OPAQUE16_LEN;
05820     while (list != NULL) {
05821         len += OPAQUE8_LEN + list->binderLen;
05822         list = list->next;
05823     }
05824 
05825     return len;
05826 }
05827 
05828 /* Writes the pre-shared key extension into the output buffer - binders only.
05829  * Assumes that the the output buffer is big enough to hold data.
05830  *
05831  * list     The linked list of key share entries.
05832  * output   The buffer to write into.
05833  * msgType  The type of the message this extension is being written into.
05834  * returns the number of bytes written into the buffer.
05835  */
05836 word16 TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
05837                                       byte msgType)
05838 {
05839     PreSharedKey* current = list;
05840     word16 idx = 0;
05841     word16 lenIdx;
05842     word16 len;
05843 
05844     if (msgType != client_hello)
05845         return SANITY_MSG_E;
05846 
05847     /* Skip length of all binders. */
05848     lenIdx = idx;
05849     idx += OPAQUE16_LEN;
05850     while (current != NULL) {
05851         /* Binder data length. */
05852         output[idx++] = current->binderLen;
05853         /* Binder data. */
05854         XMEMCPY(output + idx, current->binder, current->binderLen);
05855         idx += current->binderLen;
05856 
05857         current = current->next;
05858     }
05859     /* Length of the binders. */
05860     len = idx - lenIdx - OPAQUE16_LEN;
05861     c16toa(len, output + lenIdx);
05862 
05863     return idx;
05864 }
05865 
05866 
05867 /* Writes the pre-shared key extension into the output buffer.
05868  * Assumes that the the output buffer is big enough to hold data.
05869  *
05870  * list     The linked list of key share entries.
05871  * output   The buffer to write into.
05872  * msgType  The type of the message this extension is being written into.
05873  * returns the number of bytes written into the buffer.
05874  */
05875 static word16 TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
05876                                       byte msgType)
05877 {
05878     if (msgType == client_hello) {
05879         PreSharedKey* current = list;
05880         word16 idx = 0;
05881         word16 lenIdx;
05882         word16 len;
05883 
05884         /* Write identites only. Binders after HMACing over this. */
05885         lenIdx = idx;
05886         idx += OPAQUE16_LEN;
05887         while (current != NULL) {
05888             /* Identity length */
05889             c16toa(current->identityLen, output + idx);
05890             idx += OPAQUE16_LEN;
05891             /* Identity data */
05892             XMEMCPY(output + idx, current->identity, current->identityLen);
05893             idx += current->identityLen;
05894 
05895             /* Obfuscated ticket age. */
05896             c32toa(current->ticketAge, output + idx);
05897             idx += OPAQUE32_LEN;
05898 
05899             current = current->next;
05900         }
05901         /* Length of the identites. */
05902         len = idx - lenIdx - OPAQUE16_LEN;
05903         c16toa(len, output + lenIdx);
05904 
05905         /* Don't include binders here.
05906          * The binders are based on the hash of all the ClientHello data up to
05907          * and include the identities written above.
05908          */
05909         idx += TLSX_PreSharedKey_GetSizeBinders(list, msgType);
05910 
05911         return idx;
05912     }
05913 
05914     if (msgType == server_hello) {
05915         word16 i;
05916 
05917         /* Find the index of the chosen identity. */
05918         for (i=0; list != NULL && !list->chosen; i++)
05919             list = list->next;
05920         if (list == NULL)
05921             return BUILD_MSG_ERROR;
05922 
05923         /* The index of the identity chosen by the server from the list supplied
05924          * by the client.
05925          */
05926         c16toa(i, output);
05927         return OPAQUE16_LEN;
05928     }
05929 
05930     return 0;
05931 }
05932 
05933 /* Parse the pre-shared key extension.
05934  * Different formats in different messages.
05935  *
05936  * ssl      The SSL/TLS object.
05937  * input    The extension data.
05938  * length   The length of the extension data.
05939  * msgType  The type of the message this extension is being parsed from.
05940  * returns 0 on success and other values indicate failure.
05941  */
05942 static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, byte* input, word16 length,
05943                                    byte msgType)
05944 {
05945     TLSX*         extension;
05946     PreSharedKey* list;
05947 
05948     if (msgType == client_hello) {
05949         int    ret;
05950         word16 len;
05951         word16 idx = 0;
05952 
05953         /* Length of identities and of binders. */
05954         if (length - idx < OPAQUE16_LEN + OPAQUE16_LEN)
05955             return BUFFER_E;
05956 
05957         /* Length of identities. */
05958         ato16(input + idx, &len);
05959         idx += OPAQUE16_LEN;
05960         if (len < MIN_PSK_ID_LEN || length - idx < len)
05961             return BUFFER_E;
05962 
05963         /* Create a pre-shared key object for each identity. */
05964         while (len > 0) {
05965             byte*  identity;
05966             word16 identityLen;
05967             word32 age;
05968 
05969             if (len < OPAQUE16_LEN)
05970                 return BUFFER_E;
05971 
05972             /* Length of identity. */
05973             ato16(input + idx, &identityLen);
05974             idx += OPAQUE16_LEN;
05975             if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN)
05976                 return BUFFER_E;
05977             /* Cache identity pointer. */
05978             identity = input + idx;
05979             idx += identityLen;
05980             /* Ticket age. */
05981             ato32(input + idx, &age);
05982             idx += OPAQUE32_LEN;
05983 
05984             ret = TLSX_PreSharedKey_Use(ssl, identity, identityLen, age, 0, 1,
05985                                         NULL);
05986             if (ret != 0)
05987                 return ret;
05988 
05989             /* Done with this identity. */
05990             len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
05991         }
05992 
05993         /* Find the list of identities sent to server. */
05994         extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
05995         if (extension == NULL)
05996             return PSK_KEY_ERROR;
05997         list = (PreSharedKey*)extension->data;
05998 
05999         /* Length of binders. */
06000         ato16(input + idx, &len);
06001         idx += OPAQUE16_LEN;
06002         if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
06003             return BUFFER_E;
06004 
06005         /* Set binder for each identity. */
06006         while (list != NULL && len > 0) {
06007             /* Length of binder */
06008             list->binderLen = input[idx++];
06009             if (list->binderLen < SHA256_DIGEST_SIZE ||
06010                     list->binderLen > MAX_DIGEST_SIZE)
06011                 return BUFFER_E;
06012             if (len < OPAQUE8_LEN + list->binderLen)
06013                 return BUFFER_E;
06014 
06015             /* Copy binder into static buffer. */
06016             XMEMCPY(list->binder, input + idx, list->binderLen);
06017             idx += list->binderLen;
06018 
06019             /* Done with binder entry. */
06020             len -= OPAQUE8_LEN + list->binderLen;
06021 
06022             /* Next identity. */
06023             list = list->next;
06024         }
06025         if (list != NULL || len != 0)
06026             return BUFFER_E;
06027 
06028         return 0;
06029     }
06030 
06031     if (msgType == server_hello) {
06032         word16 idx;
06033 
06034         /* Index of identity chosen by server. */
06035         if (length != OPAQUE16_LEN)
06036             return BUFFER_E;
06037         ato16(input, &idx);
06038 
06039         /* Find the list of identities sent to server. */
06040         extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
06041         if (extension == NULL)
06042             return PSK_KEY_ERROR;
06043         list = (PreSharedKey*)extension->data;
06044 
06045         /* Mark the identity as chosen. */
06046         for (; list != NULL && idx > 0; idx--)
06047             list = list->next;
06048         if (list == NULL)
06049             return PSK_KEY_ERROR;
06050         list->chosen = 1;
06051 
06052         if (list->resumption) {
06053            /* Check that the session's details are the same as the server's. */
06054            if (ssl->options.cipherSuite0  != ssl->session.cipherSuite0 ||
06055                ssl->options.cipherSuite   != ssl->session.cipherSuite  ||
06056                ssl->session.version.major != ssl->version.major        ||
06057                ssl->session.version.minor != ssl->version.minor        ) {
06058                return PSK_KEY_ERROR;
06059            }
06060         }
06061         /* TODO: [TLS13] More checks of consistency.
06062          * the "key_share", and "signature_algorithms" extensions are
06063          * consistent with the indicated ke_modes and auth_modes values
06064          */
06065 
06066         return 0;
06067     }
06068 
06069     return SANITY_MSG_E;
06070 }
06071 
06072 /* Create a new pre-shared key and put it into the list.
06073  *
06074  * list          The linked list of pre-shared key.
06075  * identity      The identity.
06076  * len           The length of the identity data.
06077  * heap          The memory to allocate with.
06078  * preSharedKey  The new pre-shared key object.
06079  * returns 0 on success and other values indicate failure.
06080  */
06081 static int TLSX_PreSharedKey_New(PreSharedKey** list, byte* identity,
06082                                  word16 len, void *heap,
06083                                  PreSharedKey** preSharedKey)
06084 {
06085     PreSharedKey* psk;
06086 
06087     psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
06088     if (psk == NULL)
06089         return MEMORY_E;
06090     XMEMSET(psk, 0, sizeof(*psk));
06091 
06092     /* Make a copy of the identity data. */
06093     psk->identity = (byte*)XMALLOC(len, heap, DYNAMIC_TYPE_TLSX);
06094     if (psk->identity == NULL) {
06095         XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
06096         return MEMORY_E;
06097     }
06098     XMEMCPY(psk->identity, identity, len);
06099     psk->identityLen = len;
06100 
06101     /* Add it to the end and maintain the links. */
06102     while (*list != NULL)
06103         list = &((*list)->next);
06104     *list = psk;
06105     *preSharedKey = psk;
06106 
06107     return 0;
06108 }
06109 
06110 static INLINE byte GetHmacLength(int hmac)
06111 {
06112     switch (hmac) {
06113     #ifndef NO_SHA256
06114         case sha256_mac:
06115             return SHA256_DIGEST_SIZE;
06116     #endif
06117     #ifndef NO_SHA384
06118         case sha384_mac:
06119             return SHA384_DIGEST_SIZE;
06120     #endif
06121     #ifndef NO_SHA512
06122         case sha512_mac:
06123             return SHA512_DIGEST_SIZE;
06124     #endif
06125     }
06126     return 0;
06127 }
06128 
06129 /* Use the data to create a new pre-shared key object in the extensions.
06130  *
06131  * ssl           The SSL/TLS object.
06132  * identity      The identity.
06133  * len           The length of the identity data.
06134  * age           The age of the identity.
06135  * hmac          The HMAC algorithm.
06136  * resumption    The PSK is for resumption of a session.
06137  * preSharedKey  The new pre-shared key object.
06138  * returns 0 on success and other values indicate failure.
06139  */
06140 int TLSX_PreSharedKey_Use(WOLFSSL* ssl, byte* identity, word16 len, word32 age,
06141                           byte hmac, byte resumption,
06142                           PreSharedKey **preSharedKey)
06143 {
06144     int           ret = 0;
06145     TLSX*         extension;
06146     PreSharedKey* psk = NULL;
06147 
06148     /* Find the pre-shared key extension if it exists. */
06149     extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
06150     if (extension == NULL) {
06151         /* Push new pre-shared key extension. */
06152         ret = TLSX_Push(&ssl->extensions, TLSX_PRE_SHARED_KEY, NULL, ssl->heap);
06153         if (ret != 0)
06154             return ret;
06155 
06156         extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
06157         if (extension == NULL)
06158             return MEMORY_E;
06159     }
06160 
06161     /* Try to find the pre-shared key with this identity. */
06162     psk = (PreSharedKey*)extension->data;
06163     while (psk != NULL) {
06164         if ((psk->identityLen == len) &&
06165                (XMEMCMP(psk->identity, identity, len) == 0)) {
06166             break;
06167         }
06168         psk = psk->next;
06169     }
06170 
06171     /* Create a new pre-shared key object if not found. */
06172     if (psk == NULL) {
06173         ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
06174                                     len, ssl->heap, &psk);
06175         if (ret != 0)
06176             return ret;
06177     }
06178 
06179     /* Update/set age and HMAC algorithm. */
06180     psk->ticketAge = age;
06181     psk->hmac = hmac;
06182     psk->resumption = resumption;
06183     psk->binderLen = GetHmacLength(psk->hmac);
06184 
06185     if (preSharedKey != NULL)
06186         *preSharedKey = psk;
06187 
06188     return 0;
06189 }
06190 
06191 #define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
06192 #define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
06193 #define PSK_WRITE     TLSX_PreSharedKey_Write
06194 #define PSK_PARSE     TLSX_PreSharedKey_Parse
06195 
06196 #else
06197 
06198 #define PSK_FREE_ALL(a, b)
06199 #define PSK_GET_SIZE(a, b)    0
06200 #define PSK_WRITE(a, b, c)    0
06201 #define PSK_PARSE(a, b, c, d) 0
06202 
06203 #endif
06204 
06205 /******************************************************************************/
06206 /* PSK Key Exchange Modes                                                     */
06207 /******************************************************************************/
06208 
06209 #if defined(WOLFSSL_TLS13) && !defined(NO_PSK)
06210 /* Get the size of the encoded PSK KE modes extension.
06211  * Only in ClientHello.
06212  *
06213  * modes    The PSK KE mode bit string.
06214  * msgType  The type of the message this extension is being written into.
06215  * returns the number of bytes of the encoded key share extension.
06216  */
06217 static word16 TLSX_PskKeModes_GetSize(byte modes, byte msgType)
06218 {
06219     if (msgType == client_hello) {
06220         /* Format: Len | Modes* */
06221         word16 len = OPAQUE8_LEN;
06222         /* Check whether each possible mode is to be written. */
06223         if (modes & (1 << PSK_KE))
06224             len += OPAQUE8_LEN;
06225         if (modes & (1 << PSK_DHE_KE))
06226             len += OPAQUE8_LEN;
06227         return len;
06228     }
06229 
06230     return SANITY_MSG_E;
06231 }
06232 
06233 /* Writes the PSK KE modes extension into the output buffer.
06234  * Assumes that the the output buffer is big enough to hold data.
06235  * Only in ClientHello.
06236  *
06237  * modes    The PSK KE mode bit string.
06238  * output   The buffer to write into.
06239  * msgType  The type of the message this extension is being written into.
06240  * returns the number of bytes written into the buffer.
06241  */
06242 static word16 TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType)
06243 {
06244     if (msgType == client_hello) {
06245         /* Format: Len | Modes* */
06246         int idx = OPAQUE8_LEN;
06247 
06248         /* Write out each possible mode. */
06249         if (modes & (1 << PSK_KE))
06250             output[idx++] = PSK_KE;
06251         if (modes & (1 << PSK_DHE_KE))
06252             output[idx++] = PSK_DHE_KE;
06253         /* Write out length of mode list. */
06254         output[0] = idx - OPAQUE8_LEN;
06255 
06256         return idx;
06257     }
06258 
06259     return SANITY_MSG_E;
06260 }
06261 
06262 /* Parse the PSK KE modes extension.
06263  * Only in ClientHello.
06264  *
06265  * ssl      The SSL/TLS object.
06266  * input    The extension data.
06267  * length   The length of the extension data.
06268  * msgType  The type of the message this extension is being parsed from.
06269  * returns 0 on success and other values indicate failure.
06270  */
06271 static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, byte* input, word16 length,
06272                                  byte msgType)
06273 {
06274     int    ret;
06275 
06276     if (msgType == client_hello) {
06277         /* Format: Len | Modes* */
06278         int   idx = 0;
06279         int   len;
06280         byte  modes = 0;
06281 
06282         /* Ensure length byte exists. */
06283         if (length < OPAQUE8_LEN)
06284             return BUFFER_E;
06285 
06286         /* Get length of mode list and ensure that is the only data. */
06287         len = input[0];
06288         if (length - OPAQUE8_LEN != len)
06289             return BUFFER_E;
06290 
06291         idx = OPAQUE8_LEN;
06292         /* Set a bit for each recognized modes. */
06293         while (len > 0) {
06294             /* Ignore unrecognized modes.  */
06295             if (input[idx] <= PSK_DHE_KE)
06296                modes |= 1 << input[idx];
06297             idx++;
06298             len--;
06299         }
06300 
06301         ret = TLSX_PskKeModes_Use(ssl, modes);
06302         if (ret != 0)
06303             return ret;
06304 
06305         return 0;
06306     }
06307 
06308     return SANITY_MSG_E;
06309 }
06310 
06311 /* Use the data to create a new PSK Key Exchange Modes object in the extensions.
06312  *
06313  * ssl    The SSL/TLS object.
06314  * modes  The PSK key exchange modes.
06315  * returns 0 on success and other values indicate failure.
06316  */
06317 int TLSX_PskKeModes_Use(WOLFSSL* ssl, byte modes)
06318 {
06319     int           ret = 0;
06320     TLSX*         extension;
06321 
06322     /* Find the PSK key exchange modes extension if it exists. */
06323     extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
06324     if (extension == NULL) {
06325         /* Push new PSK key exchange modes extension. */
06326         ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
06327             ssl->heap);
06328         if (ret != 0)
06329             return ret;
06330 
06331         extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
06332         if (extension == NULL)
06333             return MEMORY_E;
06334     }
06335 
06336     extension->val = modes;
06337 
06338     return 0;
06339 }
06340 
06341 #define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
06342 #define PKM_WRITE     TLSX_PskKeModes_Write
06343 #define PKM_PARSE     TLSX_PskKeModes_Parse
06344 
06345 #else
06346 
06347 #define PKM_GET_SIZE(a, b)    0
06348 #define PKM_WRITE(a, b, c)    0
06349 #define PKM_PARSE(a, b, c, d) 0
06350 
06351 #endif
06352 
06353 /******************************************************************************/
06354 /* TLS Extensions Framework                                                   */
06355 /******************************************************************************/
06356 
06357 /** Finds an extension in the provided list. */
06358 TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
06359 {
06360     TLSX* extension = list;
06361 
06362     while (extension && extension->type != type)
06363         extension = extension->next;
06364 
06365     return extension;
06366 }
06367 
06368 /** Releases all extensions in the provided list. */
06369 void TLSX_FreeAll(TLSX* list, void* heap)
06370 {
06371     TLSX* extension;
06372 
06373     while ((extension = list)) {
06374         list = extension->next;
06375 
06376         switch (extension->type) {
06377 
06378             case TLSX_SERVER_NAME:
06379                 SNI_FREE_ALL((SNI*)extension->data, heap);
06380                 break;
06381 
06382             case TLSX_MAX_FRAGMENT_LENGTH:
06383                 MFL_FREE_ALL(extension->data, heap);
06384                 break;
06385 
06386             case TLSX_TRUNCATED_HMAC:
06387                 /* Nothing to do. */
06388                 break;
06389 
06390             case TLSX_SUPPORTED_GROUPS:
06391                 EC_FREE_ALL((EllipticCurve*)extension->data, heap);
06392                 break;
06393 
06394             case TLSX_STATUS_REQUEST:
06395                 CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
06396                 break;
06397 
06398             case TLSX_STATUS_REQUEST_V2:
06399                 CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
06400                         heap);
06401                 break;
06402 
06403             case TLSX_RENEGOTIATION_INFO:
06404                 SCR_FREE_ALL(extension->data, heap);
06405                 break;
06406 
06407             case TLSX_SESSION_TICKET:
06408                 WOLF_STK_FREE(extension->data, heap);
06409                 break;
06410 
06411             case TLSX_QUANTUM_SAFE_HYBRID:
06412                 QSH_FREE_ALL((QSHScheme*)extension->data, heap);
06413                 break;
06414 
06415             case TLSX_APPLICATION_LAYER_PROTOCOL:
06416                 ALPN_FREE_ALL((ALPN*)extension->data, heap);
06417                 break;
06418 
06419             case TLSX_SIGNATURE_ALGORITHMS:
06420                 break;
06421 
06422 #ifdef WOLFSSL_TLS13
06423             case TLSX_SUPPORTED_VERSIONS:
06424                 break;
06425 
06426             case TLSX_KEY_SHARE:
06427                 KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
06428                 break;
06429 
06430     #ifndef NO_PSK
06431             case TLSX_PRE_SHARED_KEY:
06432                 PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
06433                 break;
06434 
06435             case TLSX_PSK_KEY_EXCHANGE_MODES:
06436                 break;
06437     #endif
06438 #endif
06439         }
06440 
06441         XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
06442     }
06443 
06444     (void)heap;
06445 }
06446 
06447 /** Checks if the tls extensions are supported based on the protocol version. */
06448 int TLSX_SupportExtensions(WOLFSSL* ssl) {
06449     return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
06450 }
06451 
06452 /** Tells the buffered size of the extensions in a list. */
06453 static word16 TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType)
06454 {
06455     TLSX*  extension;
06456     word16 length = 0;
06457     byte   isRequest = (msgType == client_hello);
06458 
06459     while ((extension = list)) {
06460         list = extension->next;
06461 
06462         /* only extensions marked as response are sent back to the client. */
06463         if (!isRequest && !extension->resp)
06464             continue; /* skip! */
06465 
06466         /* ssl level extensions are expected to override ctx level ones. */
06467         if (!IS_OFF(semaphore, TLSX_ToSemaphore(extension->type)))
06468             continue; /* skip! */
06469 
06470         /* extension type + extension data length. */
06471         length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
06472 
06473 
06474         switch (extension->type) {
06475 
06476             case TLSX_SERVER_NAME:
06477                 /* SNI only sends the name on the request. */
06478                 if (isRequest)
06479                     length += SNI_GET_SIZE((SNI*)extension->data);
06480                 break;
06481 
06482             case TLSX_MAX_FRAGMENT_LENGTH:
06483                 length += MFL_GET_SIZE(extension->data);
06484                 break;
06485 
06486             case TLSX_TRUNCATED_HMAC:
06487                 /* always empty. */
06488                 break;
06489 
06490             case TLSX_SUPPORTED_GROUPS:
06491                 length += EC_GET_SIZE((EllipticCurve*)extension->data);
06492                 break;
06493 
06494             case TLSX_STATUS_REQUEST:
06495                 length += CSR_GET_SIZE(
06496                          (CertificateStatusRequest*)extension->data, isRequest);
06497                 break;
06498 
06499             case TLSX_STATUS_REQUEST_V2:
06500                 length += CSR2_GET_SIZE(
06501                         (CertificateStatusRequestItemV2*)extension->data,
06502                         isRequest);
06503                 break;
06504 
06505             case TLSX_RENEGOTIATION_INFO:
06506                 length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
06507                         isRequest);
06508                 break;
06509 
06510             case TLSX_SESSION_TICKET:
06511                 length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
06512                         isRequest);
06513                 break;
06514 
06515             case TLSX_QUANTUM_SAFE_HYBRID:
06516                 length += QSH_GET_SIZE((QSHScheme*)extension->data, isRequest);
06517                 break;
06518 
06519             case TLSX_APPLICATION_LAYER_PROTOCOL:
06520                 length += ALPN_GET_SIZE((ALPN*)extension->data);
06521                 break;
06522 
06523             case TLSX_SIGNATURE_ALGORITHMS:
06524 #ifdef WOLFSSL_TLS13
06525                 length += SA_GET_SIZE(extension->data);
06526 #endif
06527                 break;
06528 
06529 #ifdef WOLFSSL_TLS13
06530             case TLSX_SUPPORTED_VERSIONS:
06531                 length += SV_GET_SIZE(extension->data);
06532                 break;
06533 
06534             case TLSX_KEY_SHARE:
06535                 length += KS_GET_SIZE(extension->data, msgType);
06536                 break;
06537 
06538     #ifndef NO_PSK
06539             case TLSX_PRE_SHARED_KEY:
06540                 length += PSK_GET_SIZE(extension->data, msgType);
06541                 break;
06542 
06543             case TLSX_PSK_KEY_EXCHANGE_MODES:
06544                 length += PKM_GET_SIZE(extension->val, msgType);
06545                 break;
06546     #endif
06547 #endif
06548         }
06549 
06550         /* marks the extension as processed so ctx level */
06551         /* extensions don't overlap with ssl level ones. */
06552         TURN_ON(semaphore, TLSX_ToSemaphore(extension->type));
06553     }
06554 
06555     return length;
06556 }
06557 
06558 /** Writes the extensions of a list in a buffer. */
06559 static word16 TLSX_Write(TLSX* list, byte* output, byte* semaphore,
06560                          byte msgType)
06561 {
06562     TLSX* extension;
06563     word16 offset = 0;
06564     word16 length_offset = 0;
06565     byte   isRequest = (msgType == client_hello);
06566 
06567     while ((extension = list)) {
06568         list = extension->next;
06569 
06570         /* only extensions marked as response are written in a response. */
06571         if (!isRequest && !extension->resp)
06572             continue; /* skip! */
06573 
06574         /* ssl level extensions are expected to override ctx level ones. */
06575         if (!IS_OFF(semaphore, TLSX_ToSemaphore(extension->type)))
06576             continue; /* skip! */
06577 
06578         /* writes extension type. */
06579         c16toa(extension->type, output + offset);
06580         offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
06581         length_offset = offset;
06582 
06583         /* extension data should be written internally. */
06584         switch (extension->type) {
06585             case TLSX_SERVER_NAME:
06586                 if (isRequest) {
06587                     WOLFSSL_MSG("SNI extension to write");
06588                     offset += SNI_WRITE((SNI*)extension->data, output + offset);
06589                 }
06590                 break;
06591 
06592             case TLSX_MAX_FRAGMENT_LENGTH:
06593                 WOLFSSL_MSG("Max Fragment Length extension to write");
06594                 offset += MFL_WRITE((byte*)extension->data, output + offset);
06595                 break;
06596 
06597             case TLSX_TRUNCATED_HMAC:
06598                 WOLFSSL_MSG("Truncated HMAC extension to write");
06599                 /* always empty. */
06600                 break;
06601 
06602             case TLSX_SUPPORTED_GROUPS:
06603                 WOLFSSL_MSG("Elliptic Curves extension to write");
06604                 offset += EC_WRITE((EllipticCurve*)extension->data,
06605                                     output + offset);
06606                 break;
06607 
06608             case TLSX_STATUS_REQUEST:
06609                 WOLFSSL_MSG("Certificate Status Request extension to write");
06610                 offset += CSR_WRITE((CertificateStatusRequest*)extension->data,
06611                         output + offset, isRequest);
06612                 break;
06613 
06614             case TLSX_STATUS_REQUEST_V2:
06615                 WOLFSSL_MSG("Certificate Status Request v2 extension to write");
06616                 offset += CSR2_WRITE(
06617                         (CertificateStatusRequestItemV2*)extension->data,
06618                         output + offset, isRequest);
06619                 break;
06620 
06621             case TLSX_RENEGOTIATION_INFO:
06622                 WOLFSSL_MSG("Secure Renegotiation extension to write");
06623                 offset += SCR_WRITE((SecureRenegotiation*)extension->data,
06624                         output + offset, isRequest);
06625                 break;
06626 
06627             case TLSX_SESSION_TICKET:
06628                 WOLFSSL_MSG("Session Ticket extension to write");
06629                 offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
06630                         output + offset, isRequest);
06631                 break;
06632 
06633             case TLSX_QUANTUM_SAFE_HYBRID:
06634                 WOLFSSL_MSG("Quantum-Safe-Hybrid extension to write");
06635                 if (isRequest) {
06636                     offset += QSH_WRITE((QSHScheme*)extension->data, output + offset);
06637                 }
06638                 offset += QSHPK_WRITE((QSHScheme*)extension->data, output + offset);
06639                 offset += QSH_SERREQ(output + offset, isRequest);
06640                 break;
06641 
06642             case TLSX_APPLICATION_LAYER_PROTOCOL:
06643                 WOLFSSL_MSG("ALPN extension to write");
06644                 offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
06645                 break;
06646 
06647             case TLSX_SIGNATURE_ALGORITHMS:
06648 #ifdef WOLFSSL_TLS13
06649                 WOLFSSL_MSG("Signature Algorithms extension to write");
06650                 offset += SA_WRITE(extension->data, output + offset);
06651 #endif
06652                 break;
06653 
06654 #ifdef WOLFSSL_TLS13
06655             case TLSX_SUPPORTED_VERSIONS:
06656                 WOLFSSL_MSG("Supported Versions extension to write");
06657                 offset += SV_WRITE(extension->data, output + offset);
06658                 break;
06659 
06660             case TLSX_KEY_SHARE:
06661                 WOLFSSL_MSG("Key Share extension to write");
06662                 offset += KS_WRITE(extension->data, output + offset, msgType);
06663                 break;
06664 
06665     #ifndef NO_PSK
06666             case TLSX_PRE_SHARED_KEY:
06667                 WOLFSSL_MSG("Pre-Shared Key extension to write");
06668                 offset += PSK_WRITE(extension->data, output + offset, msgType);
06669                 break;
06670 
06671             case TLSX_PSK_KEY_EXCHANGE_MODES:
06672                 WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
06673                 offset += PKM_WRITE(extension->val, output + offset, msgType);
06674                 break;
06675     #endif
06676 #endif
06677         }
06678 
06679         /* writes extension data length. */
06680         c16toa(offset - length_offset, output + length_offset - OPAQUE16_LEN);
06681 
06682         /* marks the extension as processed so ctx level */
06683         /* extensions don't overlap with ssl level ones. */
06684         TURN_ON(semaphore, TLSX_ToSemaphore(extension->type));
06685     }
06686 
06687     return offset;
06688 }
06689 
06690 
06691 #ifdef HAVE_NTRU
06692 
06693 static word32 GetEntropy(unsigned char* out, word32 num_bytes)
06694 {
06695     int ret = 0;
06696 
06697     if (rng == NULL) {
06698         if ((rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL,
06699                                                     DYNAMIC_TYPE_TLSX)) == NULL)
06700             return DRBG_OUT_OF_MEMORY;
06701         wc_InitRng(rng);
06702     }
06703 
06704     if (rngMutex == NULL) {
06705         if ((rngMutex = (wolfSSL_Mutex*)XMALLOC(sizeof(wolfSSL_Mutex), NULL,
06706                                                     DYNAMIC_TYPE_TLSX)) == NULL)
06707             return DRBG_OUT_OF_MEMORY;
06708         wc_InitMutex(rngMutex);
06709     }
06710 
06711     ret |= wc_LockMutex(rngMutex);
06712     ret |= wc_RNG_GenerateBlock(rng, out, num_bytes);
06713     ret |= wc_UnLockMutex(rngMutex);
06714 
06715     if (ret != 0)
06716         return DRBG_ENTROPY_FAIL;
06717 
06718     return DRBG_OK;
06719 }
06720 #endif
06721 
06722 
06723 #ifdef HAVE_QSH
06724 static int TLSX_CreateQSHKey(WOLFSSL* ssl, int type)
06725 {
06726     int ret;
06727 
06728     (void)ssl;
06729 
06730     switch (type) {
06731 #ifdef HAVE_NTRU
06732         case WOLFSSL_NTRU_EESS439:
06733         case WOLFSSL_NTRU_EESS593:
06734         case WOLFSSL_NTRU_EESS743:
06735             ret = TLSX_CreateNtruKey(ssl, type);
06736             break;
06737 #endif
06738         default:
06739             WOLFSSL_MSG("Unknown type for creating NTRU key");
06740             return -1;
06741     }
06742 
06743     return ret;
06744 }
06745 
06746 
06747 static int TLSX_AddQSHKey(QSHKey** list, QSHKey* key)
06748 {
06749     QSHKey* current;
06750 
06751     if (key == NULL)
06752         return BAD_FUNC_ARG;
06753 
06754     /* if no public key stored in key then do not add */
06755     if (key->pub.length == 0 || key->pub.buffer == NULL)
06756         return 0;
06757 
06758     /* first element to be added to the list */
06759     current = *list;
06760     if (current == NULL) {
06761         *list = key;
06762         return 0;
06763     }
06764 
06765     while (current->next) {
06766         /* can only have one of the key in the list */
06767         if (current->name == key->name)
06768             return -1;
06769         current = (QSHKey*)current->next;
06770     }
06771 
06772     current->next = (struct QSHKey*)key;
06773 
06774     return 0;
06775 }
06776 
06777 
06778 #if defined(HAVE_NTRU) || defined(HAVE_QSH)
06779 int TLSX_CreateNtruKey(WOLFSSL* ssl, int type)
06780 {
06781     int ret = -1;
06782 #ifdef HAVE_NTRU
06783     int ntruType;
06784 
06785     /* variable declarations for NTRU*/
06786     QSHKey* temp = NULL;
06787     byte   public_key[1027];
06788     word16 public_key_len = sizeof(public_key);
06789     byte   private_key[1120];
06790     word16 private_key_len = sizeof(private_key);
06791     DRBG_HANDLE drbg;
06792 
06793     if (ssl == NULL)
06794         return BAD_FUNC_ARG;
06795 
06796     switch (type) {
06797         case WOLFSSL_NTRU_EESS439:
06798             ntruType = NTRU_EES439EP1;
06799             break;
06800         case WOLFSSL_NTRU_EESS593:
06801             ntruType = NTRU_EES593EP1;
06802             break;
06803         case WOLFSSL_NTRU_EESS743:
06804             ntruType = NTRU_EES743EP1;
06805             break;
06806         default:
06807             WOLFSSL_MSG("Unknown type for creating NTRU key");
06808             return -1;
06809     }
06810     ret = ntru_crypto_drbg_external_instantiate(GetEntropy, &drbg);
06811     if (ret != DRBG_OK) {
06812         WOLFSSL_MSG("NTRU drbg instantiate failed\n");
06813         return ret;
06814     }
06815 
06816     if ((ret = ntru_crypto_ntru_encrypt_keygen(drbg, ntruType,
06817                      &public_key_len, NULL, &private_key_len, NULL)) != NTRU_OK)
06818         return ret;
06819 
06820     if ((ret = ntru_crypto_ntru_encrypt_keygen(drbg, ntruType,
06821         &public_key_len, public_key, &private_key_len, private_key)) != NTRU_OK)
06822         return ret;
06823 
06824     ret = ntru_crypto_drbg_uninstantiate(drbg);
06825     if (ret != NTRU_OK) {
06826         WOLFSSL_MSG("NTRU drbg uninstantiate failed\n");
06827         return ret;
06828     }
06829 
06830     if ((temp = (QSHKey*)XMALLOC(sizeof(QSHKey), ssl->heap,
06831                                                     DYNAMIC_TYPE_TLSX)) == NULL)
06832         return MEMORY_E;
06833     temp->name = type;
06834     temp->pub.length = public_key_len;
06835     temp->pub.buffer = (byte*)XMALLOC(public_key_len, ssl->heap,
06836                                 DYNAMIC_TYPE_PUBLIC_KEY);
06837     XMEMCPY(temp->pub.buffer, public_key, public_key_len);
06838     temp->pri.length = private_key_len;
06839     temp->pri.buffer = (byte*)XMALLOC(private_key_len, ssl->heap,
06840                                 DYNAMIC_TYPE_ARRAYS);
06841     XMEMCPY(temp->pri.buffer, private_key, private_key_len);
06842     temp->next = NULL;
06843 
06844     TLSX_AddQSHKey(&ssl->QSH_Key, temp);
06845 #endif
06846 
06847     (void)ssl;
06848     (void)type;
06849 
06850     return ret;
06851 }
06852 #endif
06853 
06854 
06855 /*
06856     Used to find a public key from the list of keys
06857     pubLen length of array
06858     name   input the name of the scheme looking for ie WOLFSSL_NTRU_ESSXXX
06859 
06860     returns a pointer to public key byte* or NULL if not found
06861  */
06862 static byte* TLSX_QSHKeyFind_Pub(QSHKey* qsh, word16* pubLen, word16 name)
06863 {
06864     QSHKey* current = qsh;
06865 
06866     if (qsh == NULL || pubLen == NULL)
06867         return NULL;
06868 
06869     *pubLen = 0;
06870 
06871     while(current) {
06872         if (current->name == name) {
06873             *pubLen = current->pub.length;
06874             return current->pub.buffer;
06875         }
06876         current = (QSHKey*)current->next;
06877     }
06878 
06879     return NULL;
06880 }
06881 #endif /* HAVE_QSH */
06882 
06883 int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
06884 {
06885     int ret = 0;
06886     byte* public_key      = NULL;
06887     word16 public_key_len = 0;
06888 #ifdef HAVE_QSH
06889     TLSX* extension;
06890     QSHScheme* qsh;
06891     QSHScheme* next;
06892 
06893     /* add supported QSHSchemes */
06894     WOLFSSL_MSG("Adding supported QSH Schemes");
06895 #endif
06896 
06897     /* server will add extension depending on whats parsed from client */
06898     if (!isServer) {
06899 #ifdef HAVE_QSH
06900         /* test if user has set a specific scheme already */
06901         if (!ssl->user_set_QSHSchemes) {
06902             if (ssl->sendQSHKeys && ssl->QSH_Key == NULL) {
06903                 if ((ret = TLSX_CreateQSHKey(ssl, WOLFSSL_NTRU_EESS743)) != 0) {
06904                     WOLFSSL_MSG("Error creating ntru keys");
06905                     return ret;
06906                 }
06907                 if ((ret = TLSX_CreateQSHKey(ssl, WOLFSSL_NTRU_EESS593)) != 0) {
06908                     WOLFSSL_MSG("Error creating ntru keys");
06909                     return ret;
06910                 }
06911                 if ((ret = TLSX_CreateQSHKey(ssl, WOLFSSL_NTRU_EESS439)) != 0) {
06912                     WOLFSSL_MSG("Error creating ntru keys");
06913                     return ret;
06914                 }
06915 
06916             /* add NTRU 256 */
06917             public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
06918                     &public_key_len, WOLFSSL_NTRU_EESS743);
06919             }
06920             if (TLSX_UseQSHScheme(&ssl->extensions, WOLFSSL_NTRU_EESS743,
06921                                   public_key, public_key_len, ssl->heap)
06922                                   != SSL_SUCCESS)
06923                 ret = -1;
06924 
06925             /* add NTRU 196 */
06926             if (ssl->sendQSHKeys) {
06927                 public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
06928                     &public_key_len, WOLFSSL_NTRU_EESS593);
06929             }
06930             if (TLSX_UseQSHScheme(&ssl->extensions, WOLFSSL_NTRU_EESS593,
06931                                   public_key, public_key_len, ssl->heap)
06932                                   != SSL_SUCCESS)
06933                 ret = -1;
06934 
06935             /* add NTRU 128 */
06936             if (ssl->sendQSHKeys) {
06937                 public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
06938                     &public_key_len, WOLFSSL_NTRU_EESS439);
06939             }
06940             if (TLSX_UseQSHScheme(&ssl->extensions, WOLFSSL_NTRU_EESS439,
06941                                   public_key, public_key_len, ssl->heap)
06942                                   != SSL_SUCCESS)
06943                 ret = -1;
06944         }
06945         else if (ssl->sendQSHKeys && ssl->QSH_Key == NULL) {
06946             /* for each scheme make a client key */
06947             extension = TLSX_Find(ssl->extensions, TLSX_QUANTUM_SAFE_HYBRID);
06948             if (extension) {
06949                 qsh = (QSHScheme*)extension->data;
06950 
06951                 while (qsh) {
06952                     if ((ret = TLSX_CreateQSHKey(ssl, qsh->name)) != 0)
06953                         return ret;
06954 
06955                     /* get next now because qsh could be freed */
06956                     next = qsh->next;
06957 
06958                     /* find the public key created and add to extension*/
06959                     public_key = TLSX_QSHKeyFind_Pub(ssl->QSH_Key,
06960                              &public_key_len, qsh->name);
06961                     if (TLSX_UseQSHScheme(&ssl->extensions, qsh->name,
06962                                           public_key, public_key_len,
06963                                           ssl->heap) != SSL_SUCCESS)
06964                         ret = -1;
06965                     qsh = next;
06966                 }
06967             }
06968         }
06969 #endif
06970 
06971 #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
06972         if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
06973     #ifndef HAVE_FIPS
06974         #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)
06975             #ifndef NO_ECC_SECP
06976                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
06977                                               WOLFSSL_ECC_SECP160R1, ssl->heap);
06978                 if (ret != SSL_SUCCESS) return ret;
06979             #endif
06980             #ifdef HAVE_ECC_SECPR2
06981                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
06982                                               WOLFSSL_ECC_SECP160R2, ssl->heap);
06983                 if (ret != SSL_SUCCESS) return ret;
06984             #endif
06985             #ifdef HAVE_ECC_KOBLITZ
06986                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
06987                                               WOLFSSL_ECC_SECP160K1, ssl->heap);
06988                 if (ret != SSL_SUCCESS) return ret;
06989             #endif
06990         #endif
06991         #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)
06992             #ifndef NO_ECC_SECP
06993                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
06994                                               WOLFSSL_ECC_SECP192R1, ssl->heap);
06995                 if (ret != SSL_SUCCESS) return ret;
06996             #endif
06997             #ifdef HAVE_ECC_KOBLITZ
06998                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
06999                                               WOLFSSL_ECC_SECP192K1, ssl->heap);
07000                 if (ret != SSL_SUCCESS) return ret;
07001             #endif
07002         #endif
07003     #endif
07004         #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)
07005             #ifndef NO_ECC_SECP
07006                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
07007                                               WOLFSSL_ECC_SECP224R1, ssl->heap);
07008                 if (ret != SSL_SUCCESS) return ret;
07009             #endif
07010             #ifdef HAVE_ECC_KOBLITZ
07011                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
07012                                               WOLFSSL_ECC_SECP224K1, ssl->heap);
07013                 if (ret != SSL_SUCCESS) return ret;
07014             #endif
07015         #endif
07016         #if !defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)
07017             #ifndef NO_ECC_SECP
07018                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
07019                                               WOLFSSL_ECC_SECP256R1, ssl->heap);
07020                 if (ret != SSL_SUCCESS) return ret;
07021             #endif
07022             #ifdef HAVE_ECC_KOBLITZ
07023                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
07024                                               WOLFSSL_ECC_SECP256K1, ssl->heap);
07025                 if (ret != SSL_SUCCESS) return ret;
07026             #endif
07027             #ifdef HAVE_ECC_BRAINPOOL
07028                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
07029                                         WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
07030                 if (ret != SSL_SUCCESS) return ret;
07031             #endif
07032         #endif
07033         #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)
07034             #ifndef NO_ECC_SECP
07035                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
07036                                               WOLFSSL_ECC_SECP384R1, ssl->heap);
07037                 if (ret != SSL_SUCCESS) return ret;
07038             #endif
07039             #ifdef HAVE_ECC_BRAINPOOL
07040                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
07041                                         WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
07042                 if (ret != SSL_SUCCESS) return ret;
07043             #endif
07044         #endif
07045         #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)
07046             #ifdef HAVE_ECC_BRAINPOOL
07047                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
07048                                         WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
07049                 if (ret != SSL_SUCCESS) return ret;
07050             #endif
07051         #endif
07052         #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)
07053             #ifndef NO_ECC_SECP
07054                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
07055                                               WOLFSSL_ECC_SECP521R1, ssl->heap);
07056                 if (ret != SSL_SUCCESS) return ret;
07057             #endif
07058         #endif
07059     #ifdef WOLFSSL_TLS13
07060         #if defined(HAVE_CURVE25519)
07061             #ifndef NO_ECC_SECP
07062                 ret = TLSX_UseSupportedCurve(&ssl->extensions,
07063                                                  WOLFSSL_ECC_X25519, ssl->heap);
07064                 if (ret != SSL_SUCCESS) return ret;
07065             #endif
07066         #endif
07067     #endif
07068         }
07069 #endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */
07070     } /* is not server */
07071 
07072     #ifdef WOLFSSL_TLS13
07073         WOLFSSL_MSG("Adding signature algorithms extension");
07074         if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl,
07075                                                ssl->heap)) != 0)
07076             return ret;
07077 
07078         if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
07079             /* Add mandatory TLS v1.3 extension: supported version */
07080             WOLFSSL_MSG("Adding supported versions extension");
07081             if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
07082                                                  ssl->heap)) != 0)
07083                 return ret;
07084 
07085             /* Add FFDHE supported groups. */
07086     #ifdef HAVE_FFDHE_2048
07087             ret = TLSX_UseSupportedCurve(&ssl->extensions,
07088                                          WOLFSSL_FFDHE_2048, ssl->heap);
07089             if (ret != SSL_SUCCESS)
07090                 return ret;
07091     #endif
07092     #ifdef HAVE_FFDHE_3072
07093             ret = TLSX_UseSupportedCurve(&ssl->extensions,
07094                                          WOLFSSL_FFDHE_3072, ssl->heap);
07095             if (ret != SSL_SUCCESS)
07096                 return ret;
07097     #endif
07098     #ifdef HAVE_FFDHE_4096
07099             ret = TLSX_UseSupportedCurve(&ssl->extensions,
07100                                          WOLFSSL_FFDHE_4096, ssl->heap);
07101             if (ret != SSL_SUCCESS)
07102                 return ret;
07103     #endif
07104     #ifdef HAVE_FFDHE_6144
07105             ret = TLSX_UseSupportedCurve(&ssl->extensions,
07106                                          WOLFSSL_FFDHE_6144, ssl->heap);
07107             if (ret != SSL_SUCCESS)
07108                 return ret;
07109     #endif
07110     #ifdef HAVE_FFDHE_8192
07111             ret = TLSX_UseSupportedCurve(&ssl->extensions,
07112                                          WOLFSSL_FFDHE_8192, ssl->heap);
07113             if (ret != SSL_SUCCESS)
07114                 return ret;
07115     #endif
07116             ret = 0;
07117 
07118             if (TLSX_Find(ssl->extensions, TLSX_KEY_SHARE) == NULL) {
07119     #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && \
07120         !defined(NO_ECC_SECP)
07121                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_SECP256R1, 0, NULL,
07122                                         NULL);
07123     #elif (!defined(NO_ECC384)  || defined(HAVE_ALL_CURVES)) && \
07124           !defined(NO_ECC_SECP)
07125                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_SECP384R1, 0, NULL,
07126                                         NULL);
07127     #elif (!defined(NO_ECC521)  || defined(HAVE_ALL_CURVES)) && \
07128           !defined(NO_ECC_SECP)
07129                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_ECC_SECP521R1, 0, NULL,
07130                                         NULL);
07131     #elif defined(HAVE_FFDHE_2048)
07132                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_2048, 0, NULL, NULL);
07133     #elif defined(HAVE_FFDHE_3072)
07134                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_3072, 0, NULL, NULL);
07135     #elif defined(HAVE_FFDHE_4096)
07136                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_4096, 0, NULL, NULL);
07137     #elif defined(HAVE_FFDHE_6144)
07138                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_6144, 0, NULL, NULL);
07139     #elif defined(HAVE_FFDHE_8192)
07140                 ret = TLSX_KeyShare_Use(ssl, WOLFSSL_FFDHE_8192, 0, NULL, NULL);
07141     #else
07142                 ret = KEY_SHARE_ERROR;
07143     #endif
07144                 if (ret != 0)
07145                     return ret;
07146             }
07147 
07148         #if defined(HAVE_SESSION_TICKET) && !defined(NO_PSK)
07149             if (ssl->options.resuming) {
07150                 WOLFSSL_SESSION* sess = &ssl->session;
07151                 word32           milli;
07152                 byte             modes;
07153 
07154                 /* Determine the MAC algorithm for the cipher suite used. */
07155                 ssl->options.cipherSuite0 = sess->cipherSuite0;
07156                 ssl->options.cipherSuite  = sess->cipherSuite;
07157                 SetCipherSpecs(ssl);
07158                 milli = TimeNowInMilliseconds() - sess->ticketSeen +
07159                         sess->ticketAdd;
07160                 /* Pre-shared key is mandatory extension for resumption. */
07161                 ret = TLSX_PreSharedKey_Use(ssl, sess->ticket, sess->ticketLen,
07162                                             milli, ssl->specs.mac_algorithm, 1,
07163                                             ssl->heap);
07164                 if (ret != 0)
07165                     return ret;
07166 
07167                 /* Pre-shared key modes: mandatory extension for resumption. */
07168                 modes = 1 << PSK_KE;
07169             #if !defined(NO_DH) || defined(HAVE_ECC)
07170                 if (!ssl->options.noPskDheKe)
07171                     modes |= 1 << PSK_DHE_KE;
07172             #endif
07173                 ret = TLSX_PskKeModes_Use(ssl, modes);
07174                 if (ret != 0)
07175                     return ret;
07176             }
07177         #endif
07178             /* TODO: [TLS13] Add PSKs */
07179         }
07180 
07181     #endif
07182 
07183     (void)isServer;
07184     (void)public_key;
07185     (void)public_key_len;
07186     (void)ssl;
07187 
07188     if (ret == SSL_SUCCESS)
07189         ret = 0;
07190 
07191     return ret;
07192 }
07193 
07194 
07195 #ifndef NO_WOLFSSL_CLIENT
07196 
07197 /** Tells the buffered size of extensions to be sent into the client hello. */
07198 word16 TLSX_GetRequestSize(WOLFSSL* ssl)
07199 {
07200     word16 length = 0;
07201 
07202     if (TLSX_SupportExtensions(ssl)) {
07203         byte semaphore[SEMAPHORE_SIZE] = {0};
07204 
07205         EC_VALIDATE_REQUEST(ssl, semaphore);
07206         QSH_VALIDATE_REQUEST(ssl, semaphore);
07207         WOLF_STK_VALIDATE_REQUEST(ssl);
07208 #if defined(WOLFSSL_TLS13)
07209         if (!IsAtLeastTLSv1_2(ssl))
07210             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
07211         if (!IsAtLeastTLSv1_3(ssl->version)) {
07212             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
07213             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
07214     #ifndef NO_PSK
07215             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
07216             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
07217     #endif
07218         }
07219 #endif
07220 
07221         if (ssl->extensions)
07222             length += TLSX_GetSize(ssl->extensions, semaphore, client_hello);
07223 
07224         if (ssl->ctx && ssl->ctx->extensions) {
07225             length += TLSX_GetSize(ssl->ctx->extensions, semaphore,
07226                                    client_hello);
07227         }
07228 
07229 #ifndef WOLFSSL_TLS13
07230         if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz)
07231             length += HELLO_EXT_SZ + OPAQUE16_LEN +
07232                    + ssl->suites->hashSigAlgoSz;
07233 #endif
07234 
07235 #ifdef HAVE_EXTENDED_MASTER
07236         if (ssl->options.haveEMS)
07237             length += HELLO_EXT_SZ;
07238 #endif
07239     }
07240 
07241     if (length)
07242         length += OPAQUE16_LEN; /* for total length storage. */
07243 
07244     return length;
07245 }
07246 
07247 /** Writes the extensions to be sent into the client hello. */
07248 word16 TLSX_WriteRequest(WOLFSSL* ssl, byte* output)
07249 {
07250     word16 offset = 0;
07251 
07252     if (TLSX_SupportExtensions(ssl) && output) {
07253         byte semaphore[SEMAPHORE_SIZE] = {0};
07254 
07255         offset += OPAQUE16_LEN; /* extensions length */
07256 
07257         EC_VALIDATE_REQUEST(ssl, semaphore);
07258         WOLF_STK_VALIDATE_REQUEST(ssl);
07259         QSH_VALIDATE_REQUEST(ssl, semaphore);
07260 #if defined(WOLFSSL_TLS13)
07261         if (!IsAtLeastTLSv1_2(ssl))
07262             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
07263         if (!IsAtLeastTLSv1_3(ssl->version)) {
07264             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
07265             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
07266     #ifndef NO_PSK
07267             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
07268     #endif
07269         }
07270     #ifndef NO_PSK
07271         TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
07272     #endif
07273 #endif
07274 
07275         if (ssl->extensions)
07276             offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
07277                                  client_hello);
07278 
07279         if (ssl->ctx && ssl->ctx->extensions)
07280             offset += TLSX_Write(ssl->ctx->extensions, output + offset,
07281                                  semaphore, client_hello);
07282 
07283 #ifndef WOLFSSL_TLS13
07284         if (IsAtLeastTLSv1_2(ssl) && ssl->suites->hashSigAlgoSz) {
07285             int i;
07286             /* extension type */
07287             c16toa(TLSX_SIGNATURE_ALGORITHMS, output + offset);
07288             offset += HELLO_EXT_TYPE_SZ;
07289 
07290             /* extension data length */
07291             c16toa(OPAQUE16_LEN + ssl->suites->hashSigAlgoSz,
07292                    output + offset);
07293             offset += OPAQUE16_LEN;
07294 
07295             /* sig algos length */
07296             c16toa(ssl->suites->hashSigAlgoSz, output + offset);
07297             offset += OPAQUE16_LEN;
07298 
07299             /* sig algos */
07300             for (i = 0; i < ssl->suites->hashSigAlgoSz; i++, offset++)
07301                 output[offset] = ssl->suites->hashSigAlgo[i];
07302         }
07303 #endif
07304 
07305 #ifdef HAVE_EXTENDED_MASTER
07306         if (ssl->options.haveEMS) {
07307             c16toa(HELLO_EXT_EXTMS, output + offset);
07308             offset += HELLO_EXT_TYPE_SZ;
07309             c16toa(0, output + offset);
07310             offset += HELLO_EXT_SZ_SZ;
07311         }
07312 #endif
07313 
07314 #ifdef WOLFSSL_TLS13
07315         if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.resuming) {
07316     #ifndef NO_PSK
07317             TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
07318     #endif
07319             offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
07320                                  client_hello);
07321         }
07322 #endif
07323 
07324         if (offset > OPAQUE16_LEN)
07325             c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
07326     }
07327 
07328     return offset;
07329 }
07330 
07331 #endif /* NO_WOLFSSL_CLIENT */
07332 
07333 #ifndef NO_WOLFSSL_SERVER
07334 
07335 /** Tells the buffered size of extensions to be sent into the server hello. */
07336 word16 TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType)
07337 {
07338     word16 length = 0;
07339     byte semaphore[SEMAPHORE_SIZE] = {0};
07340 
07341     switch (msgType) {
07342         case server_hello:
07343 #ifdef WOLFSSL_TLS13
07344         case hello_retry_request:
07345             if (ssl->options.tls1_3) {
07346                 XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
07347                 TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
07348     #ifndef NO_PSK
07349                 TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
07350     #endif
07351             }
07352             break;
07353         case encrypted_extensions:
07354             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
07355             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
07356     #ifndef NO_PSK
07357             TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
07358     #endif
07359 #endif
07360             break;
07361     }
07362 
07363     #ifdef HAVE_QSH
07364         /* change response if not using TLS_QSH */
07365         if (!ssl->options.haveQSH) {
07366             TLSX* ext = TLSX_Find(ssl->extensions, TLSX_QUANTUM_SAFE_HYBRID);
07367             if (ext)
07368                 ext->resp = 0;
07369         }
07370     #endif
07371 
07372 #ifdef HAVE_EXTENDED_MASTER
07373     if (ssl->options.haveEMS && msgType == server_hello)
07374         length += HELLO_EXT_SZ;
07375 #endif
07376 
07377     if (TLSX_SupportExtensions(ssl))
07378         length += TLSX_GetSize(ssl->extensions, semaphore, msgType);
07379 
07380     /* All the response data is set at the ssl object only, so no ctx here. */
07381 
07382     if (length || (msgType != server_hello))
07383         length += OPAQUE16_LEN; /* for total length storage. */
07384 
07385     return length;
07386 }
07387 
07388 /** Writes the server hello extensions into a buffer. */
07389 word16 TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType)
07390 {
07391     word16 offset = 0;
07392 
07393     if (TLSX_SupportExtensions(ssl) && output) {
07394         byte semaphore[SEMAPHORE_SIZE] = {0};
07395 
07396         switch (msgType) {
07397             case server_hello:
07398 #ifdef WOLFSSL_TLS13
07399             case hello_retry_request:
07400                 if (ssl->options.tls1_3) {
07401                     XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
07402                     TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
07403     #ifndef NO_PSK
07404                     TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
07405     #endif
07406                 }
07407                 break;
07408             case encrypted_extensions:
07409                 TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
07410                 TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
07411     #ifndef NO_PSK
07412                 TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
07413     #endif
07414 #endif
07415                 break;
07416         }
07417 
07418         offset += OPAQUE16_LEN; /* extensions length */
07419 
07420         offset += TLSX_Write(ssl->extensions, output + offset, semaphore,
07421                              msgType);
07422 
07423 #ifdef HAVE_EXTENDED_MASTER
07424         if (ssl->options.haveEMS && msgType == server_hello) {
07425             c16toa(HELLO_EXT_EXTMS, output + offset);
07426             offset += HELLO_EXT_TYPE_SZ;
07427             c16toa(0, output + offset);
07428             offset += HELLO_EXT_SZ_SZ;
07429         }
07430 #endif
07431 
07432         if (offset > OPAQUE16_LEN || msgType == encrypted_extensions)
07433             c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
07434     }
07435 
07436     return offset;
07437 }
07438 
07439 #endif /* NO_WOLFSSL_SERVER */
07440 
07441 /** Parses a buffer of TLS extensions. */
07442 int TLSX_Parse(WOLFSSL* ssl, byte* input, word16 length, byte msgType,
07443                                                                  Suites *suites)
07444 {
07445     int ret = 0;
07446     word16 offset = 0;
07447     byte isRequest = (msgType == client_hello);
07448 #ifdef HAVE_EXTENDED_MASTER
07449     byte pendingEMS = 0;
07450 #endif
07451 
07452     if (!ssl || !input || (isRequest && !suites))
07453         return BAD_FUNC_ARG;
07454 
07455     while (ret == 0 && offset < length) {
07456         word16 type;
07457         word16 size;
07458 
07459         if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
07460             return BUFFER_ERROR;
07461 
07462         ato16(input + offset, &type);
07463         offset += HELLO_EXT_TYPE_SZ;
07464 
07465         ato16(input + offset, &size);
07466         offset += OPAQUE16_LEN;
07467 
07468         if (offset + size > length)
07469             return BUFFER_ERROR;
07470 
07471         switch (type) {
07472             case TLSX_SERVER_NAME:
07473                 WOLFSSL_MSG("SNI extension received");
07474 
07475 #ifdef WOLFSSL_TLS13
07476                 if (IsAtLeastTLSv1_3(ssl->version) &&
07477                         msgType != client_hello &&
07478                         msgType != encrypted_extensions) {
07479                     return EXT_NOT_ALLOWED;
07480                 }
07481 #endif
07482                 ret = SNI_PARSE(ssl, input + offset, size, isRequest);
07483                 break;
07484 
07485             case TLSX_MAX_FRAGMENT_LENGTH:
07486                 WOLFSSL_MSG("Max Fragment Length extension received");
07487 
07488 #ifdef WOLFSSL_TLS13
07489                 if (IsAtLeastTLSv1_3(ssl->version) &&
07490                         msgType != client_hello &&
07491                         msgType != encrypted_extensions) {
07492                     return EXT_NOT_ALLOWED;
07493                 }
07494 #endif
07495                 ret = MFL_PARSE(ssl, input + offset, size, isRequest);
07496                 break;
07497 
07498             case TLSX_TRUNCATED_HMAC:
07499                 WOLFSSL_MSG("Truncated HMAC extension received");
07500 
07501 #ifdef WOLFSSL_TLS13
07502                 if (IsAtLeastTLSv1_3(ssl->version))
07503                     return EXT_NOT_ALLOWED;
07504 #endif
07505                 ret = THM_PARSE(ssl, input + offset, size, isRequest);
07506                 break;
07507 
07508             case TLSX_SUPPORTED_GROUPS:
07509                 WOLFSSL_MSG("Elliptic Curves extension received");
07510 
07511 #ifdef WOLFSSL_TLS13
07512                 if (IsAtLeastTLSv1_3(ssl->version) &&
07513                         msgType != client_hello &&
07514                         msgType != encrypted_extensions) {
07515                     return EXT_NOT_ALLOWED;
07516                 }
07517 #endif
07518                 ret = EC_PARSE(ssl, input + offset, size, isRequest);
07519                 break;
07520 
07521             case TLSX_STATUS_REQUEST:
07522                 WOLFSSL_MSG("Certificate Status Request extension received");
07523 
07524 #ifdef WOLFSSL_TLS13
07525                 if (IsAtLeastTLSv1_3(ssl->version) &&
07526                         msgType != client_hello &&
07527                         msgType != encrypted_extensions) {
07528                     return EXT_NOT_ALLOWED;
07529                 }
07530 #endif
07531                 ret = CSR_PARSE(ssl, input + offset, size, isRequest);
07532                 break;
07533 
07534             case TLSX_STATUS_REQUEST_V2:
07535                 WOLFSSL_MSG("Certificate Status Request v2 extension received");
07536 
07537 #ifdef WOLFSSL_TLS13
07538                 if (IsAtLeastTLSv1_3(ssl->version) &&
07539                         msgType != client_hello &&
07540                         msgType != encrypted_extensions) {
07541                     return EXT_NOT_ALLOWED;
07542                 }
07543 #endif
07544                 ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
07545                 break;
07546 
07547 #ifdef HAVE_EXTENDED_MASTER
07548             case HELLO_EXT_EXTMS:
07549                 WOLFSSL_MSG("Extended Master Secret extension received");
07550 
07551 #ifdef WOLFSSL_TLS13
07552                 if (IsAtLeastTLSv1_3(ssl->version) &&
07553                         msgType != client_hello) {
07554                     return EXT_NOT_ALLOWED;
07555                 }
07556 #endif
07557 #ifndef NO_WOLFSSL_SERVER
07558                 if (isRequest && !IsAtLeastTLSv1_3(ssl->version))
07559                     ssl->options.haveEMS = 1;
07560 #endif
07561                 pendingEMS = 1;
07562                 break;
07563 #endif
07564 
07565             case TLSX_RENEGOTIATION_INFO:
07566                 WOLFSSL_MSG("Secure Renegotiation extension received");
07567 
07568                 ret = SCR_PARSE(ssl, input + offset, size, isRequest);
07569                 break;
07570 
07571             case TLSX_SESSION_TICKET:
07572                 WOLFSSL_MSG("Session Ticket extension received");
07573 
07574 #ifdef WOLFSSL_TLS13
07575                 if (IsAtLeastTLSv1_3(ssl->version) &&
07576                         msgType != client_hello) {
07577                     return EXT_NOT_ALLOWED;
07578                 }
07579 #endif
07580                 ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
07581                 break;
07582 
07583             case TLSX_QUANTUM_SAFE_HYBRID:
07584                 WOLFSSL_MSG("Quantum-Safe-Hybrid extension received");
07585 
07586 #ifdef WOLFSSL_TLS13
07587                 if (IsAtLeastTLSv1_3(ssl->version))
07588                     return EXT_NOT_ALLOWED;
07589 #endif
07590                 ret = QSH_PARSE(ssl, input + offset, size, isRequest);
07591                 break;
07592 
07593             case TLSX_APPLICATION_LAYER_PROTOCOL:
07594                 WOLFSSL_MSG("ALPN extension received");
07595 
07596 #ifdef WOLFSSL_TLS13
07597                 if (IsAtLeastTLSv1_3(ssl->version) &&
07598                         msgType != client_hello &&
07599                         msgType != encrypted_extensions) {
07600                     return EXT_NOT_ALLOWED;
07601                 }
07602 #endif
07603                 ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
07604                 break;
07605 
07606 #ifndef WOLFSSL_TLS13
07607             case TLSX_SIGNATURE_ALGORITHMS:
07608                 WOLFSSL_MSG("Extended signature algorithm extension received");
07609 
07610                 if (isRequest) {
07611                     /* do not mess with offset inside the switch! */
07612                     if (IsAtLeastTLSv1_2(ssl)) {
07613                         ato16(input + offset, &suites->hashSigAlgoSz);
07614 
07615                         if (suites->hashSigAlgoSz > size - OPAQUE16_LEN)
07616                             return BUFFER_ERROR;
07617 
07618                         XMEMCPY(suites->hashSigAlgo,
07619                                 input + offset + OPAQUE16_LEN,
07620                                 min(suites->hashSigAlgoSz,
07621                                                         HELLO_EXT_SIGALGO_MAX));
07622                     }
07623                 } else {
07624                     WOLFSSL_MSG("Servers MUST NOT send SIG ALGO extension.");
07625                 }
07626 
07627                 break;
07628 #endif
07629 
07630 #ifdef WOLFSSL_TLS13
07631             case TLSX_SUPPORTED_VERSIONS:
07632                 WOLFSSL_MSG("Supported Versions extension received");
07633 
07634                 if (!IsAtLeastTLSv1_3(ssl->version))
07635                     break;
07636 
07637                 if (IsAtLeastTLSv1_3(ssl->version) &&
07638                         msgType != client_hello) {
07639                     return EXT_NOT_ALLOWED;
07640                 }
07641                 ret = SV_PARSE(ssl, input + offset, size);
07642                 break;
07643 
07644             case TLSX_SIGNATURE_ALGORITHMS:
07645                 WOLFSSL_MSG("Signature Algorithms extension received");
07646 
07647                 if (!IsAtLeastTLSv1_2(ssl))
07648                     break;
07649 
07650                 if (IsAtLeastTLSv1_3(ssl->version) &&
07651                         msgType != client_hello) {
07652                     return EXT_NOT_ALLOWED;
07653                 }
07654                 ret = SA_PARSE(ssl, input + offset, size);
07655                 break;
07656 
07657             case TLSX_KEY_SHARE:
07658                 WOLFSSL_MSG("Key Share extension received");
07659 
07660                 if (!IsAtLeastTLSv1_3(ssl->version))
07661                     break;
07662 
07663                 if (IsAtLeastTLSv1_3(ssl->version) &&
07664                         msgType != client_hello && msgType != server_hello &&
07665                         msgType != hello_retry_request) {
07666                     return EXT_NOT_ALLOWED;
07667                 }
07668                 ret = KS_PARSE(ssl, input + offset, size, msgType);
07669                 break;
07670 
07671     #ifndef NO_PSK
07672             case TLSX_PRE_SHARED_KEY:
07673                 WOLFSSL_MSG("Pre-Shared Key extension received");
07674 
07675                 if (!IsAtLeastTLSv1_3(ssl->version))
07676                     break;
07677 
07678                 if (IsAtLeastTLSv1_3(ssl->version) &&
07679                         msgType != client_hello && msgType != server_hello) {
07680                     return EXT_NOT_ALLOWED;
07681                 }
07682                 ret = PSK_PARSE(ssl, input + offset, size, msgType);
07683                 break;
07684 
07685             case TLSX_PSK_KEY_EXCHANGE_MODES:
07686                 WOLFSSL_MSG("PSK Key Exchange Modes extension received");
07687 
07688                 if (!IsAtLeastTLSv1_3(ssl->version))
07689                     break;
07690 
07691                 if (IsAtLeastTLSv1_3(ssl->version) &&
07692                         msgType != client_hello) {
07693                     return EXT_NOT_ALLOWED;
07694                 }
07695                 ret = PKM_PARSE(ssl, input + offset, size, msgType);
07696                 break;
07697     #endif
07698 #endif
07699         }
07700 
07701         /* offset should be updated here! */
07702         offset += size;
07703     }
07704 
07705 #ifdef HAVE_EXTENDED_MASTER
07706     if (!isRequest && ssl->options.haveEMS && !pendingEMS)
07707         ssl->options.haveEMS = 0;
07708 #endif
07709 
07710     if (ret == 0)
07711         ret = SNI_VERIFY_PARSE(ssl, isRequest);
07712 
07713     return ret;
07714 }
07715 
07716 /* undefining semaphore macros */
07717 #undef IS_OFF
07718 #undef TURN_ON
07719 #undef SEMAPHORE_SIZE
07720 
07721 #endif /* HAVE_TLS_EXTENSIONS */
07722 
07723 #ifndef NO_WOLFSSL_CLIENT
07724 
07725 #ifndef NO_OLD_TLS
07726 
07727     WOLFSSL_METHOD* wolfTLSv1_client_method(void)
07728     {
07729         return wolfTLSv1_client_method_ex(NULL);
07730     }
07731 
07732 
07733     WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
07734     {
07735         return wolfTLSv1_1_client_method_ex(NULL);
07736     }
07737 
07738     WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
07739     {
07740         WOLFSSL_METHOD* method =
07741                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
07742                                                      heap, DYNAMIC_TYPE_METHOD);
07743         if (method)
07744             InitSSL_Method(method, MakeTLSv1());
07745         return method;
07746     }
07747 
07748 
07749     WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
07750     {
07751         WOLFSSL_METHOD* method =
07752                               (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
07753                                                      heap, DYNAMIC_TYPE_METHOD);
07754         if (method)
07755             InitSSL_Method(method, MakeTLSv1_1());
07756         return method;
07757     }
07758 
07759 #endif /* !NO_OLD_TLS */
07760 
07761 
07762     WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
07763     {
07764         return wolfTLSv1_2_client_method_ex(NULL);
07765     }
07766 
07767     WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
07768     {
07769         WOLFSSL_METHOD* method =
07770                               (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
07771                                                      heap, DYNAMIC_TYPE_METHOD);
07772         (void)heap;
07773         if (method)
07774             InitSSL_Method(method, MakeTLSv1_2());
07775         return method;
07776     }
07777 
07778 #ifdef WOLFSSL_TLS13
07779     /* The TLS v1.3 client method data.
07780      *
07781      * returns the method data for a TLS v1.3 client.
07782      */
07783     WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
07784     {
07785         return wolfTLSv1_3_client_method_ex(NULL);
07786     }
07787 
07788     /* The TLS v1.3 client method data.
07789      *
07790      * heap  The heap used for allocation.
07791      * returns the method data for a TLS v1.3 client.
07792      */
07793     WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
07794     {
07795         WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
07796                                  XMALLOC(sizeof(WOLFSSL_METHOD), heap,
07797                                          DYNAMIC_TYPE_METHOD);
07798         (void)heap;
07799         if (method) {
07800             InitSSL_Method(method, MakeTLSv1_3());
07801             method->downgrade = 1;
07802         }
07803         return method;
07804     }
07805 #endif /* WOLFSSL_TLS13 */
07806 
07807 
07808     WOLFSSL_METHOD* wolfSSLv23_client_method(void)
07809     {
07810         return wolfSSLv23_client_method_ex(NULL);
07811     }
07812 
07813 
07814     WOLFSSL_METHOD* wolfSSLv23_client_method_ex(void* heap)
07815     {
07816         WOLFSSL_METHOD* method =
07817                               (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
07818                                                      heap, DYNAMIC_TYPE_METHOD);
07819         (void)heap;
07820         if (method) {
07821 #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
07822 #ifdef WOLFSSL_TLS13
07823             InitSSL_Method(method, MakeTLSv1_3());
07824 #else
07825             InitSSL_Method(method, MakeTLSv1_2());
07826 #endif
07827 #else
07828     #ifndef NO_OLD_TLS
07829             InitSSL_Method(method, MakeTLSv1_1());
07830     #endif
07831 #endif
07832 #ifndef NO_OLD_TLS
07833             method->downgrade = 1;
07834 #endif
07835         }
07836         return method;
07837     }
07838 
07839 #endif /* NO_WOLFSSL_CLIENT */
07840 
07841 
07842 
07843 #ifndef NO_WOLFSSL_SERVER
07844 
07845 #ifndef NO_OLD_TLS
07846 
07847     WOLFSSL_METHOD* wolfTLSv1_server_method(void)
07848     {
07849         return wolfTLSv1_server_method_ex(NULL);
07850     }
07851 
07852 
07853     WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
07854     {
07855         return wolfTLSv1_1_server_method_ex(NULL);
07856     }
07857 
07858     WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
07859     {
07860         WOLFSSL_METHOD* method =
07861                               (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
07862                                                      heap, DYNAMIC_TYPE_METHOD);
07863         if (method) {
07864             InitSSL_Method(method, MakeTLSv1());
07865             method->side = WOLFSSL_SERVER_END;
07866         }
07867         return method;
07868     }
07869 
07870 
07871     WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
07872     {
07873         WOLFSSL_METHOD* method =
07874                               (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
07875                                                      heap, DYNAMIC_TYPE_METHOD);
07876         if (method) {
07877             InitSSL_Method(method, MakeTLSv1_1());
07878             method->side = WOLFSSL_SERVER_END;
07879         }
07880         return method;
07881     }
07882 #endif /* !NO_OLD_TLS */
07883 
07884 
07885     WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
07886     {
07887         return wolfTLSv1_2_server_method_ex(NULL);
07888     }
07889 
07890     WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
07891     {
07892         WOLFSSL_METHOD* method =
07893                               (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
07894                                                      heap, DYNAMIC_TYPE_METHOD);
07895         (void)heap;
07896         if (method) {
07897             InitSSL_Method(method, MakeTLSv1_2());
07898             method->side = WOLFSSL_SERVER_END;
07899         }
07900         return method;
07901     }
07902 
07903 #ifdef WOLFSSL_TLS13
07904     /* The TLS v1.3 server method data.
07905      *
07906      * returns the method data for a TLS v1.3 server.
07907      */
07908     WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
07909     {
07910         return wolfTLSv1_3_server_method_ex(NULL);
07911     }
07912 
07913     /* The TLS v1.3 server method data.
07914      *
07915      * heap  The heap used for allocation.
07916      * returns the method data for a TLS v1.3 server.
07917      */
07918     WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
07919     {
07920         WOLFSSL_METHOD* method =
07921                               (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
07922                                                      heap, DYNAMIC_TYPE_METHOD);
07923         (void)heap;
07924         if (method) {
07925             InitSSL_Method(method, MakeTLSv1_3());
07926             method->side = WOLFSSL_SERVER_END;
07927         }
07928         return method;
07929     }
07930 #endif /* WOLFSSL_TLS13 */
07931 
07932     WOLFSSL_METHOD* wolfSSLv23_server_method(void)
07933     {
07934         return wolfSSLv23_server_method_ex(NULL);
07935     }
07936 
07937     WOLFSSL_METHOD* wolfSSLv23_server_method_ex(void* heap)
07938     {
07939         WOLFSSL_METHOD* method =
07940                               (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
07941                                                      heap, DYNAMIC_TYPE_METHOD);
07942         (void)heap;
07943         if (method) {
07944 #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)
07945 #ifdef WOLFSSL_TLS13
07946             InitSSL_Method(method, MakeTLSv1_3());
07947 #else
07948             InitSSL_Method(method, MakeTLSv1_2());
07949 #endif
07950 #else
07951     #ifndef NO_OLD_TLS
07952             InitSSL_Method(method, MakeTLSv1_1());
07953     #else
07954             #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
07955     #endif
07956 #endif
07957 #ifndef NO_OLD_TLS
07958             method->downgrade = 1;
07959 #endif
07960             method->side      = WOLFSSL_SERVER_END;
07961         }
07962         return method;
07963     }
07964 
07965 
07966 #endif /* NO_WOLFSSL_SERVER */
07967 #endif /* NO_TLS */
07968 #endif /* WOLFCRYPT_ONLY */
07969