Coverage Report

Created: 2026-09-20 06:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-normal-math/src/tls.c
Line
Count
Source
1
/* tls.c
2
 *
3
 * Copyright (C) 2006-2026 wolfSSL Inc.
4
 *
5
 * This file is part of wolfSSL.
6
 *
7
 * wolfSSL is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * wolfSSL is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20
 */
21
22
/*
23
 * TLS Build Options:
24
 * (See tls13.c for TLS 1.3-specific options)
25
 *
26
 * Protocol Control:
27
 * NO_OLD_TLS:               Disable TLS 1.0 and 1.1              default: off
28
 * WOLFSSL_ALLOW_TLSV10:     Allow TLS 1.0 connections             default: off
29
 * WOLFSSL_NO_TLS12:         Disable TLS 1.2                       default: off
30
 * NO_TLS:                   Disable TLS entirely (SSL only)       default: off
31
 * WOLFSSL_DTLS:             Enable DTLS support                   default: off
32
 * WOLFSSL_DTLS13:           Enable DTLS 1.3 support               default: off
33
 * WOLFSSL_DTLS_CID:         Enable DTLS Connection ID             default: off
34
 * WOLFSSL_AEAD_ONLY:        Only allow AEAD cipher suites         default: off
35
 * NO_WOLFSSL_CLIENT:        Disable TLS client functionality      default: off
36
 * NO_WOLFSSL_SERVER:        Disable TLS server functionality      default: off
37
 * WOLFSSL_EITHER_SIDE:      Allow same context for client/server  default: off
38
 * HAVE_TLS_EXTENSIONS:      Enable TLS extension support          default: on
39
 * HAVE_SNI:                 Server Name Indication extension      default: off
40
 * WOLFSSL_ALWAYS_KEEP_SNI:  Keep SNI after handshake              default: off
41
 * HAVE_MAX_FRAGMENT:        Max Fragment Length extension          default: off
42
 * HAVE_TRUNCATED_HMAC:      Truncated HMAC extension              default: off
43
 * HAVE_SUPPORTED_CURVES:    Supported Curves extension            default: on
44
 * HAVE_EXTENDED_MASTER:     Extended Master Secret (RFC 7627)     default: on
45
 * HAVE_ENCRYPT_THEN_MAC:    Encrypt-Then-MAC extension            default: on
46
 * HAVE_ALPN:                Application-Layer Protocol Negotiation default: off
47
 * HAVE_CERTIFICATE_STATUS_REQUEST: OCSP stapling                  default: off
48
 * HAVE_CERTIFICATE_STATUS_REQUEST_V2: OCSP stapling v2            default: off
49
 * HAVE_SECURE_RENEGOTIATION: Secure renegotiation support         default: off
50
 * HAVE_SERVER_RENEGOTIATION_INFO: Server renegotiation info       default: off
51
 * HAVE_SESSION_TICKET:      Session ticket support                default: off
52
 * HAVE_TRUSTED_CA:          Trusted CA Indication extension       default: off
53
 * HAVE_RPK:                 Raw Public Key support (RFC 7250)     default: off
54
 * HAVE_ECH:                 Encrypted Client Hello support        default: off
55
 * WOLFSSL_NO_SIGALG:        Disable signature algorithms ext      default: off
56
 * WOLFSSL_NO_CA_NAMES:      Disable CA Names in CertificateReq   default: off
57
 * WOLFSSL_NO_SERVER_GROUPS_EXT: Don't send server groups ext      default: off
58
 * NO_TLSX_PSKKEM_PLAIN_ANNOUNCE: Disable plain PSK announce      default: off
59
 * WOLFSSL_OLD_UNSUPPORTED_EXTENSION: Old unsupported ext handling default: off
60
 * WOLFSSL_ALLOW_SERVER_SC_EXT: Allow server supported curves ext  default: off
61
 *
62
 * Pre-Shared Keys:
63
 * NO_PSK:                   Disable PSK cipher suites             default: off
64
 *
65
 * Key Exchange:
66
 * HAVE_FFDHE:               Enable Finite Field DH ephemeral      default: off
67
 * HAVE_FFDHE_2048:          Enable FFDHE 2048-bit group           default: off
68
 * HAVE_FFDHE_3072:          Enable FFDHE 3072-bit group           default: off
69
 * HAVE_FFDHE_4096:          Enable FFDHE 4096-bit group           default: off
70
 * HAVE_FFDHE_6144:          Enable FFDHE 6144-bit group           default: off
71
 * HAVE_FFDHE_8192:          Enable FFDHE 8192-bit group           default: off
72
 * HAVE_PUBLIC_FFDHE:        Use public FFDHE parameters only      default: off
73
 * WOLFSSL_OLD_PRIME_CHECK:  Use old DH prime checking method      default: off
74
 * WOLFSSL_STATIC_DH:        Enable static DH cipher suites       default: off
75
 * WOLFSSL_STATIC_EPHEMERAL: Enable static ephemeral key loading   default: off
76
 *                           Reuses a key share across connections, which
77
 *                           RFC 9846 4.3.8 forbids. Inspection/debug only.
78
 *
79
 * Post-Quantum:
80
 * WOLFSSL_HAVE_MLKEM:       Enable ML-KEM (Kyber) support         default: off
81
 * WOLFSSL_MLKEM_KYBER:      Use Kyber round 3 parameters          default: off
82
 * WOLFSSL_KYBER512:         Enable Kyber/ML-KEM-512               default: off
83
 * WOLFSSL_KYBER768:         Enable Kyber/ML-KEM-768               default: off
84
 * WOLFSSL_KYBER1024:        Enable Kyber/ML-KEM-1024              default: off
85
 * WOLFSSL_NO_ML_KEM:        Disable all ML-KEM support            default: off
86
 * WOLFSSL_NO_ML_KEM_512:    Disable ML-KEM-512                    default: off
87
 * WOLFSSL_NO_ML_KEM_768:    Disable ML-KEM-768                    default: off
88
 * WOLFSSL_NO_ML_KEM_1024:   Disable ML-KEM-1024                  default: off
89
 * WOLFSSL_ML_KEM_USE_OLD_IDS: Use old IANA IDs for ML-KEM        default: off
90
 * WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ: Store ML-KEM object in ext   default: off
91
 * WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY: Store ML-KEM priv key   default: off
92
 * WOLFSSL_MLKEM_CACHE_A:    Cache ML-KEM A matrix                 default: off
93
 * WOLFSSL_MLKEM_NO_MAKE_KEY: Disable ML-KEM key generation       default: off
94
 * WOLFSSL_MLKEM_NO_ENCAPSULATE: Disable ML-KEM encapsulation     default: off
95
 * WOLFSSL_MLKEM_NO_DECAPSULATE: Disable ML-KEM decapsulation     default: off
96
 *
97
 * Curves:
98
 * HAVE_SECRET_CALLBACK:     Enable TLS secret callback            default: off
99
 * HAVE_PK_CALLBACKS:        Enable public key callbacks           default: off
100
 * HAVE_FUZZER:              Enable fuzzing callback support        default: off
101
 *
102
 * Features:
103
 * WOLFSSL_SNIFFER:          Enable TLS packet sniffing support    default: off
104
 * WOLFSSL_SNIFFER_KEYLOGFILE: Sniffer keylog file support         default: off
105
 * WOLFSSL_SSLKEYLOGFILE:    Enable SSL key log file output        default: off
106
 * WOLFSSL_SSLKEYLOGFILE_USE_ENV: Use SSLKEYLOGFILE env var path   default: off
107
 * WOLFSSL_SRTP:             Enable SRTP extension support         default: off
108
 * WOLFSSL_DUAL_ALG_CERTS:   Enable dual algorithm certificates   default: off
109
 * WOLFSSL_HAVE_PRF:         Enable TLS PRF function access        default: off
110
 * WOLFSSL_DEBUG_TLS:        Debug TLS protocol messages            default: off
111
 * WOLFSSL_32BIT_MILLI_TIME: 32-bit millisecond time function      default: off
112
 * WOLFSSL_REQUIRE_TCA:      Require Trusted CA extension          default: off
113
 * WOLFSSL_DH_EXTRA:         Extra DH key info in SSL object       default: off
114
 * WOLFSSL_CURVE25519_BLINDING: Curve25519 blinding in TLS         default: off
115
 * HAVE_NULL_CIPHER:         Allow NULL cipher suites               default: off
116
 * HAVE_WEBSERVER:           Enable web server features             default: off
117
 * NO_CERTS:                 Disable certificate processing        default: off
118
 */
119
120
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
121
122
#ifndef WOLFCRYPT_ONLY
123
124
#include <wolfssl/ssl.h>
125
#include <wolfssl/internal.h>
126
#include <wolfssl/error-ssl.h>
127
#include <wolfssl/wolfcrypt/hash.h>
128
#include <wolfssl/wolfcrypt/hmac.h>
129
#include <wolfssl/wolfcrypt/kdf.h>
130
#ifdef NO_INLINE
131
    #include <wolfssl/wolfcrypt/misc.h>
132
#else
133
    #define WOLFSSL_MISC_INCLUDED
134
    #include <wolfcrypt/src/misc.c>
135
#endif
136
137
#ifdef HAVE_CURVE25519
138
    #include <wolfssl/wolfcrypt/curve25519.h>
139
#endif
140
#ifdef HAVE_CURVE448
141
    #include <wolfssl/wolfcrypt/curve448.h>
142
#endif
143
#ifdef WOLFSSL_HAVE_MLKEM
144
    #include <wolfssl/wolfcrypt/wc_mlkem.h>
145
#endif
146
147
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
148
    #include <wolfssl/wolfcrypt/port/Renesas/renesas_tsip_internal.h>
149
#endif
150
151
#include <wolfssl/wolfcrypt/hpke.h>
152
153
#ifndef NO_TLS
154
155
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
156
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap);
157
#endif
158
159
#ifdef HAVE_SUPPORTED_CURVES
160
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions);
161
#endif
162
163
/* Digest enable checks */
164
#ifdef NO_OLD_TLS /* TLS 1.2 only */
165
    #if defined(NO_SHA256) && !defined(WOLFSSL_SHA384) && \
166
            !defined(WOLFSSL_SHA512)
167
        #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
168
    #endif
169
#else  /* TLS 1.1 or older */
170
    #if defined(NO_MD5) && defined(NO_SHA)
171
        #error Must have SHA1 and MD5 enabled for old TLS
172
    #endif
173
#endif
174
175
#ifdef WOLFSSL_TLS13
176
    #if !defined(NO_DH) && \
177
        !defined(HAVE_FFDHE_2048) && !defined(HAVE_FFDHE_3072) && \
178
        !defined(HAVE_FFDHE_4096) && !defined(HAVE_FFDHE_6144) && \
179
        !defined(HAVE_FFDHE_8192)
180
        #error Please configure your TLS 1.3 DH key size using either: HAVE_FFDHE_2048, HAVE_FFDHE_3072, HAVE_FFDHE_4096, HAVE_FFDHE_6144 or HAVE_FFDHE_8192
181
    #endif
182
    #if !defined(NO_RSA) && !defined(WC_RSA_PSS)
183
        #error The build option WC_RSA_PSS is required for TLS 1.3 with RSA
184
    #endif
185
    #ifndef HAVE_TLS_EXTENSIONS
186
        #if !defined(_MSC_VER) && !defined(__TASKING__)
187
            #error "The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3"
188
        #else
189
            #pragma message("Error: The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3")
190
        #endif
191
    #endif
192
#endif
193
194
/* Warn if secrets logging is enabled */
195
#if (defined(SHOW_SECRETS) || defined(WOLFSSL_SSLKEYLOGFILE)) && \
196
    !defined(WOLFSSL_KEYLOG_EXPORT_WARNED)
197
    #if !defined(_MSC_VER) && !defined(__TASKING__)
198
        #warning The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment
199
    #else
200
        #pragma message("Warning: The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment")
201
    #endif
202
#endif
203
204
#ifndef WOLFSSL_NO_TLS12
205
206
#ifdef WOLFSSL_SHA384
207
199
    #define HSHASH_SZ WC_SHA384_DIGEST_SIZE
208
#else
209
    #define HSHASH_SZ FINISHED_SZ
210
#endif
211
212
int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
213
0
{
214
0
    int ret = 0;
215
0
    word32 hashSz = FINISHED_SZ;
216
217
0
    if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
218
0
        return BAD_FUNC_ARG;
219
220
    /* for constant timing perform these even if error */
221
#ifndef NO_OLD_TLS
222
    ret |= wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
223
    ret |= wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
224
#endif
225
226
0
    if (IsAtLeastTLSv1_2(ssl)) {
227
0
#ifndef NO_SHA256
228
0
        if (ssl->specs.mac_algorithm <= sha256_mac ||
229
0
            ssl->specs.mac_algorithm == blake2b_mac) {
230
0
            ret |= wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
231
0
            hashSz = WC_SHA256_DIGEST_SIZE;
232
0
        }
233
0
#endif
234
0
#ifdef WOLFSSL_SHA384
235
0
        if (ssl->specs.mac_algorithm == sha384_mac) {
236
0
            ret |= wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
237
0
            hashSz = WC_SHA384_DIGEST_SIZE;
238
0
        }
239
0
#endif
240
0
#ifdef WOLFSSL_SM3
241
0
        if (ssl->specs.mac_algorithm == sm3_mac) {
242
0
            ret |= wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
243
0
            hashSz = WC_SM3_DIGEST_SIZE;
244
0
        }
245
0
#endif
246
0
    }
247
248
0
    *hashLen = hashSz;
249
#ifdef WOLFSSL_CHECK_MEM_ZERO
250
     wc_MemZero_Add("TLS handshake hash", hash, hashSz);
251
#endif
252
253
0
    if (ret != 0) {
254
0
        ret = BUILD_MSG_ERROR;
255
0
        WOLFSSL_ERROR_VERBOSE(ret);
256
0
    }
257
258
0
    return ret;
259
0
}
260
261
262
int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
263
157
{
264
157
    int ret;
265
157
    const byte* side = NULL;
266
157
    word32 hashSz = HSHASH_SZ;
267
157
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
268
157
    byte handshake_hash[HSHASH_SZ];
269
#else
270
    byte* handshake_hash = NULL;
271
    handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap, DYNAMIC_TYPE_DIGEST);
272
    if (handshake_hash == NULL)
273
        return MEMORY_E;
274
#endif
275
276
157
    XMEMSET(handshake_hash, 0, HSHASH_SZ);
277
157
    ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
278
157
    if (ret == 0) {
279
157
        if (XSTRNCMP((const char*)sender, (const char*)kTlsClientStr,
280
157
                                                          SIZEOF_SENDER) == 0) {
281
157
            side = kTlsClientFinStr;
282
157
        }
283
0
        else if (XSTRNCMP((const char*)sender, (const char*)kTlsServerStr,
284
0
                                                          SIZEOF_SENDER) == 0) {
285
0
            side = kTlsServerFinStr;
286
0
        }
287
0
        else {
288
0
            ret = BAD_FUNC_ARG;
289
0
            WOLFSSL_MSG("Unexpected sender value");
290
0
        }
291
157
    }
292
293
157
    if (ret == 0) {
294
157
#ifdef WOLFSSL_HAVE_PRF
295
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
296
        if (ssl->ctx->TlsFinishedCb) {
297
            void* ctx = wolfSSL_GetTlsFinishedCtx(ssl);
298
            ret = ssl->ctx->TlsFinishedCb(ssl, side, handshake_hash, hashSz,
299
                                          (byte*)hashes, ctx);
300
        }
301
        if (!ssl->ctx->TlsFinishedCb ||
302
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
303
#endif
304
157
        {
305
157
            PRIVATE_KEY_UNLOCK();
306
157
            ret = wc_PRF_TLS((byte*)hashes, TLS_FINISHED_SZ,
307
157
                      ssl->arrays->masterSecret, SECRET_LEN, side,
308
157
                      FINISHED_LABEL_SZ, handshake_hash, hashSz,
309
157
                      IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
310
157
                      ssl->heap, ssl->devId);
311
157
            PRIVATE_KEY_LOCK();
312
157
        }
313
157
        ForceZero(handshake_hash, hashSz);
314
#else
315
        /* Pseudo random function must be enabled in the configuration. */
316
        ret = PRF_MISSING;
317
        WOLFSSL_ERROR_VERBOSE(ret);
318
        WOLFSSL_MSG("Pseudo-random function is not enabled");
319
320
        (void)side;
321
        (void)hashes;
322
#endif
323
157
    }
324
325
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
326
    XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
327
#elif defined(WOLFSSL_CHECK_MEM_ZERO)
328
    wc_MemZero_Check(handshake_hash, HSHASH_SZ);
329
#endif
330
331
157
    return ret;
332
157
}
333
334
#endif /* !WOLFSSL_NO_TLS12 */
335
336
#ifndef NO_OLD_TLS
337
338
#ifdef WOLFSSL_ALLOW_TLSV10
339
ProtocolVersion MakeTLSv1(void)
340
{
341
    ProtocolVersion pv;
342
    pv.major = SSLv3_MAJOR;
343
    pv.minor = TLSv1_MINOR;
344
345
    return pv;
346
}
347
#endif /* WOLFSSL_ALLOW_TLSV10 */
348
349
350
ProtocolVersion MakeTLSv1_1(void)
351
{
352
    ProtocolVersion pv;
353
    pv.major = SSLv3_MAJOR;
354
    pv.minor = TLSv1_1_MINOR;
355
356
    return pv;
357
}
358
359
#endif /* !NO_OLD_TLS */
360
361
362
#ifndef WOLFSSL_NO_TLS12
363
364
ProtocolVersion MakeTLSv1_2(void)
365
4.98k
{
366
4.98k
    ProtocolVersion pv;
367
4.98k
    pv.major = SSLv3_MAJOR;
368
4.98k
    pv.minor = TLSv1_2_MINOR;
369
370
4.98k
    return pv;
371
4.98k
}
372
373
#endif /* !WOLFSSL_NO_TLS12 */
374
375
#ifdef WOLFSSL_TLS13
376
/* The TLS v1.3 protocol version.
377
 *
378
 * returns the protocol version data for TLS v1.3.
379
 */
380
ProtocolVersion MakeTLSv1_3(void)
381
8
{
382
8
    ProtocolVersion pv;
383
8
    pv.major = SSLv3_MAJOR;
384
8
    pv.minor = TLSv1_3_MINOR;
385
386
8
    return pv;
387
8
}
388
#endif
389
390
#if defined(HAVE_SUPPORTED_CURVES)
391
/* Sets the key exchange groups in rank order on a context.
392
 *
393
 * ctx     SSL/TLS context object.
394
 * groups  Array of groups.
395
 * count   Number of groups in array.
396
 * returns BAD_FUNC_ARG when ctx or groups is NULL, not using TLS v1.3, count is
397
 * not positive or count is greater than WOLFSSL_MAX_GROUP_COUNT and
398
 * WOLFSSL_SUCCESS on success.
399
 */
400
int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count)
401
0
{
402
0
    int ret, i;
403
404
0
    WOLFSSL_ENTER("wolfSSL_CTX_set_groups");
405
0
    if (ctx == NULL || groups == NULL || count <= 0 ||
406
0
            count > WOLFSSL_MAX_GROUP_COUNT)
407
0
        return BAD_FUNC_ARG;
408
0
    if (!IsTLS_ex(ctx->method->version))
409
0
        return BAD_FUNC_ARG;
410
411
0
    #ifdef WOLFSSL_TLS13
412
0
    ctx->numGroups = 0;
413
0
    #endif
414
0
    #if !defined(NO_TLS)
415
0
    TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
416
0
    #endif /* !NO_TLS */
417
0
    for (i = 0; i < count; i++) {
418
        /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups
419
         * are valid */
420
0
        if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, (word16)groups[i]))
421
0
                != WOLFSSL_SUCCESS) {
422
0
    #if !defined(NO_TLS)
423
0
            TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
424
0
    #endif /* !NO_TLS */
425
0
            return ret;
426
0
        }
427
0
        #ifdef WOLFSSL_TLS13
428
0
        ctx->group[i] = (word16)groups[i];
429
0
        #endif
430
0
    }
431
0
    #ifdef WOLFSSL_TLS13
432
0
    ctx->numGroups = (byte)count;
433
0
    #endif
434
435
0
    return WOLFSSL_SUCCESS;
436
0
}
437
438
/* Sets the key exchange groups in rank order.
439
 *
440
 * ssl     SSL/TLS object.
441
 * groups  Array of groups.
442
 * count   Number of groups in array.
443
 * returns BAD_FUNC_ARG when ssl or groups is NULL, not using TLS v1.3, count is
444
 * not positive or count is greater than WOLFSSL_MAX_GROUP_COUNT and
445
 * WOLFSSL_SUCCESS on success.
446
 */
447
int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count)
448
0
{
449
0
    int ret, i;
450
451
0
    WOLFSSL_ENTER("wolfSSL_set_groups");
452
0
    if (ssl == NULL || groups == NULL || count <= 0 ||
453
0
            count > WOLFSSL_MAX_GROUP_COUNT)
454
0
        return BAD_FUNC_ARG;
455
0
    if (!IsTLS_ex(ssl->version))
456
0
        return BAD_FUNC_ARG;
457
458
0
    #ifdef WOLFSSL_TLS13
459
0
    ssl->numGroups = 0;
460
0
    #endif
461
0
    #if !defined(NO_TLS)
462
0
    TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
463
0
    #endif /* !NO_TLS */
464
0
    for (i = 0; i < count; i++) {
465
        /* Call to wolfSSL_UseSupportedCurve also checks if input groups
466
                 * are valid */
467
0
        if ((ret = wolfSSL_UseSupportedCurve(ssl, (word16)groups[i]))
468
0
                != WOLFSSL_SUCCESS) {
469
0
    #if !defined(NO_TLS)
470
0
            TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
471
0
    #endif /* !NO_TLS */
472
0
            return ret;
473
0
        }
474
0
        #ifdef WOLFSSL_TLS13
475
0
        ssl->group[i] = (word16)groups[i];
476
0
        #endif
477
0
    }
478
0
    #ifdef WOLFSSL_TLS13
479
0
    ssl->numGroups = (byte)count;
480
0
    #endif
481
482
0
    return WOLFSSL_SUCCESS;
483
0
}
484
#endif /* HAVE_SUPPORTED_CURVES */
485
486
#ifndef WOLFSSL_NO_TLS12
487
488
#ifdef HAVE_EXTENDED_MASTER
489
static const byte ext_master_label[EXT_MASTER_LABEL_SZ + 1] =
490
                                                      "extended master secret";
491
#endif
492
static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
493
static const byte key_label   [KEY_LABEL_SZ + 1]    = "key expansion";
494
495
static int _DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
496
                         const byte* ms, word32 msLen,
497
                         const byte* sr, const byte* cr,
498
                         int tls1_2, int hash_type,
499
                         void* heap, int devId)
500
775
{
501
775
    int ret;
502
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
503
    byte* seed = NULL;
504
    seed = (byte*)XMALLOC(SEED_LEN, heap, DYNAMIC_TYPE_SEED);
505
    if (seed == NULL)
506
        return MEMORY_E;
507
#else
508
775
    byte seed[SEED_LEN];
509
775
#endif
510
511
775
    XMEMCPY(seed,           sr, RAN_LEN);
512
775
    XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
513
514
775
#ifdef WOLFSSL_HAVE_PRF
515
775
    PRIVATE_KEY_UNLOCK();
516
775
    ret = wc_PRF_TLS(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
517
775
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
518
775
    PRIVATE_KEY_LOCK();
519
#else
520
    /* Pseudo random function must be enabled in the configuration. */
521
    ret = PRF_MISSING;
522
    WOLFSSL_ERROR_VERBOSE(ret);
523
    WOLFSSL_MSG("Pseudo-random function is not enabled");
524
525
    (void)key_dig;
526
    (void)key_dig_len;
527
    (void)ms;
528
    (void)msLen;
529
    (void)tls1_2;
530
    (void)hash_type;
531
    (void)heap;
532
    (void)devId;
533
    (void)key_label;
534
    (void)master_label;
535
#ifdef HAVE_EXTENDED_MASTER
536
    (void)ext_master_label;
537
#endif
538
#endif
539
540
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
541
    XFREE(seed, heap, DYNAMIC_TYPE_SEED);
542
#endif
543
544
775
    return ret;
545
775
}
546
547
/* External facing wrapper so user can call as well, 0 on success */
548
int wolfSSL_DeriveTlsKeys(byte* key_data, word32 keyLen,
549
                         const byte* ms, word32 msLen,
550
                         const byte* sr, const byte* cr,
551
                         int tls1_2, int hash_type)
552
0
{
553
0
    return _DeriveTlsKeys(key_data, keyLen, ms, msLen, sr, cr, tls1_2,
554
0
        hash_type, NULL, INVALID_DEVID);
555
0
}
556
557
558
int DeriveTlsKeys(WOLFSSL* ssl)
559
775
{
560
775
    int   ret;
561
775
    int   key_dig_len = 2 * ssl->specs.hash_size +
562
775
                        2 * ssl->specs.key_size  +
563
775
                        2 * ssl->specs.iv_size;
564
775
    WC_DECLARE_VAR(key_dig, byte, MAX_PRF_DIG, 0);
565
566
775
    WC_ALLOC_VAR_EX(key_dig, byte, MAX_PRF_DIG, ssl->heap,
567
775
        DYNAMIC_TYPE_DIGEST, return MEMORY_E);
568
569
775
    XMEMSET(key_dig, 0, MAX_PRF_DIG);
570
571
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
572
    ret = PROTOCOLCB_UNAVAILABLE;
573
    if (ssl->ctx->GenSessionKeyCb) {
574
        void* ctx = wolfSSL_GetGenSessionKeyCtx(ssl);
575
        ret = ssl->ctx->GenSessionKeyCb(ssl, ctx);
576
    }
577
    if (!ssl->ctx->GenSessionKeyCb ||
578
        ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
579
#endif
580
775
    ret = _DeriveTlsKeys(key_dig, (word32)key_dig_len,
581
775
                     ssl->arrays->masterSecret, SECRET_LEN,
582
775
                     ssl->arrays->serverRandom, ssl->arrays->clientRandom,
583
775
                     IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
584
775
                     ssl->heap, ssl->devId);
585
775
    if (ret == 0)
586
775
        ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
587
588
#ifdef WOLFSSL_CHECK_MEM_ZERO
589
    wc_MemZero_Add("DeriveTlsKeys key_dig", key_dig, MAX_PRF_DIG);
590
#endif
591
775
    ForceZero(key_dig, MAX_PRF_DIG);
592
#ifdef WOLFSSL_CHECK_MEM_ZERO
593
    wc_MemZero_Check(key_dig, MAX_PRF_DIG);
594
#endif
595
596
775
    WC_FREE_VAR_EX(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
597
598
775
    return ret;
599
775
}
600
601
static int _MakeTlsMasterSecret(byte* ms, word32 msLen,
602
                               const byte* pms, word32 pmsLen,
603
                               const byte* cr, const byte* sr,
604
                               int tls1_2, int hash_type,
605
                               void* heap, int devId)
606
733
{
607
733
    int ret;
608
733
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
609
733
    byte seed[SEED_LEN];
610
#else
611
    byte* seed = NULL;
612
    seed = (byte*)XMALLOC(SEED_LEN, heap, DYNAMIC_TYPE_SEED);
613
    if (seed == NULL)
614
        return MEMORY_E;
615
#endif
616
617
733
    XMEMCPY(seed,           cr, RAN_LEN);
618
733
    XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
619
620
733
#ifdef WOLFSSL_HAVE_PRF
621
733
    PRIVATE_KEY_UNLOCK();
622
733
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
623
733
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
624
733
    PRIVATE_KEY_LOCK();
625
#else
626
    /* Pseudo random function must be enabled in the configuration. */
627
    ret = PRF_MISSING;
628
    WOLFSSL_MSG("Pseudo-random function is not enabled");
629
630
    (void)ms;
631
    (void)msLen;
632
    (void)pms;
633
    (void)pmsLen;
634
    (void)tls1_2;
635
    (void)hash_type;
636
    (void)heap;
637
    (void)devId;
638
#endif
639
640
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
641
    XFREE(seed, heap, DYNAMIC_TYPE_SEED);
642
#endif
643
644
733
    return ret;
645
733
}
646
647
/* External facing wrapper so user can call as well, 0 on success */
648
int wolfSSL_MakeTlsMasterSecret(byte* ms, word32 msLen,
649
                               const byte* pms, word32 pmsLen,
650
                               const byte* cr, const byte* sr,
651
                               int tls1_2, int hash_type)
652
0
{
653
0
    return _MakeTlsMasterSecret(ms, msLen, pms, pmsLen, cr, sr, tls1_2,
654
0
        hash_type, NULL, INVALID_DEVID);
655
0
}
656
657
658
#ifdef HAVE_EXTENDED_MASTER
659
660
static int _MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
661
                                        const byte* pms, word32 pmsLen,
662
                                        const byte* sHash, word32 sHashLen,
663
                                        int tls1_2, int hash_type,
664
                                        void* heap, int devId)
665
42
{
666
42
    int ret;
667
668
42
#ifdef WOLFSSL_HAVE_PRF
669
42
    PRIVATE_KEY_UNLOCK();
670
42
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
671
42
               sHash, sHashLen, tls1_2, hash_type, heap, devId);
672
42
    PRIVATE_KEY_LOCK();
673
#else
674
    /* Pseudo random function must be enabled in the configuration. */
675
    ret = PRF_MISSING;
676
    WOLFSSL_MSG("Pseudo-random function is not enabled");
677
678
    (void)ms;
679
    (void)msLen;
680
    (void)pms;
681
    (void)pmsLen;
682
    (void)sHash;
683
    (void)sHashLen;
684
    (void)tls1_2;
685
    (void)hash_type;
686
    (void)heap;
687
    (void)devId;
688
#endif
689
42
    return ret;
690
42
}
691
692
/* External facing wrapper so user can call as well, 0 on success */
693
int wolfSSL_MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
694
                                        const byte* pms, word32 pmsLen,
695
                                        const byte* sHash, word32 sHashLen,
696
                                        int tls1_2, int hash_type)
697
0
{
698
0
    return _MakeTlsExtendedMasterSecret(ms, msLen, pms, pmsLen, sHash, sHashLen,
699
0
        tls1_2, hash_type, NULL, INVALID_DEVID);
700
0
}
701
702
#endif /* HAVE_EXTENDED_MASTER */
703
704
705
int MakeTlsMasterSecret(WOLFSSL* ssl)
706
775
{
707
775
    int ret;
708
709
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
710
    /* If this is called from a sniffer session with keylog file support, obtain
711
     * the master secret from the callback */
712
    if (ssl->snifferSecretCb != NULL) {
713
        ret = ssl->snifferSecretCb(ssl->arrays->clientRandom,
714
                                   SNIFFER_SECRET_TLS12_MASTER_SECRET,
715
                                   ssl->arrays->masterSecret);
716
        if (ret != 0) {
717
            return ret;
718
        }
719
        ret = DeriveTlsKeys(ssl);
720
        return ret;
721
    }
722
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
723
724
775
#ifdef HAVE_EXTENDED_MASTER
725
775
    if (ssl->options.haveEMS) {
726
42
        word32 hashSz = HSHASH_SZ;
727
42
    #ifdef WOLFSSL_SMALL_STACK
728
42
        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
729
42
                                              DYNAMIC_TYPE_DIGEST);
730
42
        if (handshake_hash == NULL)
731
0
            return MEMORY_E;
732
    #else
733
        byte handshake_hash[HSHASH_SZ];
734
    #endif
735
736
42
        XMEMSET(handshake_hash, 0, HSHASH_SZ);
737
42
        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
738
42
        if (ret == 0) {
739
        #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
740
            ret = PROTOCOLCB_UNAVAILABLE;
741
            if (ssl->ctx->GenExtMasterCb) {
742
                void* ctx = wolfSSL_GetGenExtMasterSecretCtx(ssl);
743
                ret = ssl->ctx->GenExtMasterCb(ssl, handshake_hash, hashSz,
744
                                                ctx);
745
            }
746
            if (!ssl->ctx->GenExtMasterCb ||
747
                ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
748
        #endif /* (HAVE_SECRET_CALLBACK) && (HAVE_EXT_SECRET_CALLBACK) */
749
42
            {
750
42
                ret = _MakeTlsExtendedMasterSecret(
751
42
                    ssl->arrays->masterSecret, SECRET_LEN,
752
42
                    ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
753
42
                    handshake_hash, hashSz,
754
42
                    IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
755
42
                    ssl->heap, ssl->devId);
756
42
            }
757
42
            ForceZero(handshake_hash, hashSz);
758
42
        }
759
760
42
    #ifdef WOLFSSL_SMALL_STACK
761
42
        XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
762
    #elif defined(WOLFSSL_CHECK_MEM_ZERO)
763
        wc_MemZero_Check(handshake_hash, HSHASH_SZ);
764
    #endif
765
42
    }
766
733
    else
767
733
#endif /* HAVE_EXTENDED_MASTER */
768
733
    {
769
770
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
771
        ret = PROTOCOLCB_UNAVAILABLE;
772
        if (ssl->ctx->GenMasterCb) {
773
            void* ctx = wolfSSL_GetGenMasterSecretCtx(ssl);
774
            ret = ssl->ctx->GenMasterCb(ssl, ctx);
775
        }
776
        if (!ssl->ctx->GenMasterCb ||
777
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
778
#endif
779
733
        {
780
733
            ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret,
781
733
                      SECRET_LEN, ssl->arrays->preMasterSecret,
782
733
                      ssl->arrays->preMasterSz, ssl->arrays->clientRandom,
783
733
                      ssl->arrays->serverRandom, IsAtLeastTLSv1_2(ssl),
784
733
                      ssl->specs.mac_algorithm, ssl->heap, ssl->devId);
785
733
        }
786
733
    }
787
#ifdef HAVE_SECRET_CALLBACK
788
    if (ret == 0 && ssl->tlsSecretCb != NULL) {
789
        ret = ssl->tlsSecretCb(ssl, ssl->arrays->masterSecret,
790
                SECRET_LEN, ssl->tlsSecretCtx);
791
    }
792
#endif /* HAVE_SECRET_CALLBACK */
793
775
    if (ret == 0) {
794
775
        ret = DeriveTlsKeys(ssl);
795
775
    }
796
797
775
    return ret;
798
775
}
799
800
801
/* Used by EAP-TLS and EAP-TTLS to derive keying material from
802
 * the master_secret. */
803
int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* key, unsigned int len,
804
                                                              const char* label)
805
0
{
806
0
    int   ret;
807
0
    WC_DECLARE_VAR(seed, byte, SEED_LEN, 0);
808
809
    /* The randoms and the master secret live in the handshake arrays, which
810
     * are gone once the handshake resources have been released. */
811
0
    if (ssl == NULL || ssl->arrays == NULL)
812
0
        return BAD_FUNC_ARG;
813
814
0
    WC_ALLOC_VAR_EX(seed, byte, SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED,
815
0
        return MEMORY_E);
816
817
    /*
818
     * As per RFC-5281, the order of the client and server randoms is reversed
819
     * from that used by the TLS protocol to derive keys.
820
     */
821
0
    XMEMCPY(seed,           ssl->arrays->clientRandom, RAN_LEN);
822
0
    XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
823
824
0
#ifdef WOLFSSL_HAVE_PRF
825
0
    PRIVATE_KEY_UNLOCK();
826
0
    ret = wc_PRF_TLS((byte*)key, len, ssl->arrays->masterSecret, SECRET_LEN,
827
0
              (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
828
0
              IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
829
0
              ssl->heap, ssl->devId);
830
0
    PRIVATE_KEY_LOCK();
831
#else
832
    /* Pseudo random function must be enabled in the configuration. */
833
    ret = PRF_MISSING;
834
    WOLFSSL_MSG("Pseudo-random function is not enabled");
835
836
    (void)key;
837
    (void)len;
838
    (void)label;
839
#endif
840
841
0
    WC_FREE_VAR_EX(seed, ssl->heap, DYNAMIC_TYPE_SEED);
842
843
0
    return ret;
844
0
}
845
846
/* return HMAC digest type in wolfSSL format */
847
int wolfSSL_GetHmacType(WOLFSSL* ssl)
848
118
{
849
118
    if (ssl == NULL)
850
0
        return BAD_FUNC_ARG;
851
852
118
    return wolfSSL_GetHmacType_ex(&ssl->specs);
853
118
}
854
855
856
int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
857
                           int verify)
858
{
859
    if (ssl == NULL || inner == NULL)
860
        return BAD_FUNC_ARG;
861
862
    if (content == dtls12_cid
863
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
864
       || (ssl->options.dtls && DtlsGetCidTxSize(ssl) > 0)
865
#endif
866
    ) {
867
        WOLFSSL_MSG("wolfSSL_SetTlsHmacInner doesn't support CID");
868
        return BAD_FUNC_ARG;
869
    }
870
871
    XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
872
873
    WriteSEQ(ssl, verify, inner);
874
    inner[SEQ_SZ] = (byte)content;
875
    inner[SEQ_SZ + ENUM_LEN]            = ssl->version.major;
876
    inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
877
    c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
878
879
    return 0;
880
}
881
882
883
#ifndef WOLFSSL_AEAD_ONLY
884
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
885
    !defined(HAVE_SELFTEST)
886
887
/* Update the hash in the HMAC.
888
 *
889
 * hmac  HMAC object.
890
 * data  Data to be hashed.
891
 * sz    Size of data to hash.
892
 * returns 0 on success, otherwise failure.
893
 */
894
static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz)
895
0
{
896
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
897
898
0
    switch (hmac->macType) {
899
0
    #ifndef NO_SHA
900
0
        case WC_SHA:
901
0
            ret = wc_ShaUpdate(&hmac->hash.sha, data, sz);
902
0
            break;
903
0
    #endif /* !NO_SHA */
904
905
0
    #ifndef NO_SHA256
906
0
        case WC_SHA256:
907
0
            ret = wc_Sha256Update(&hmac->hash.sha256, data, sz);
908
0
            break;
909
0
    #endif /* !NO_SHA256 */
910
911
0
    #ifdef WOLFSSL_SHA384
912
0
        case WC_SHA384:
913
0
            ret = wc_Sha384Update(&hmac->hash.sha384, data, sz);
914
0
            break;
915
0
    #endif /* WOLFSSL_SHA384 */
916
917
0
    #ifdef WOLFSSL_SHA512
918
0
        case WC_SHA512:
919
0
            ret = wc_Sha512Update(&hmac->hash.sha512, data, sz);
920
0
            break;
921
0
    #endif /* WOLFSSL_SHA512 */
922
923
0
    #ifdef WOLFSSL_SM3
924
0
        case WC_SM3:
925
0
            ret = wc_Sm3Update(&hmac->hash.sm3, data, sz);
926
0
            break;
927
0
    #endif /* WOLFSSL_SM3 */
928
929
0
        default:
930
0
            ret = BAD_FUNC_ARG;
931
0
            break;
932
0
    }
933
934
0
    return ret;
935
0
}
936
937
/* Finalize the hash but don't put the EOC, padding or length in.
938
 *
939
 * hmac  HMAC object.
940
 * hash  Hash result.
941
 * returns 0 on success, otherwise failure.
942
 */
943
static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash)
944
0
{
945
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
946
947
0
    switch (hmac->macType) {
948
0
    #ifndef NO_SHA
949
0
        case WC_SHA:
950
0
            ret = wc_ShaFinalRaw(&hmac->hash.sha, hash);
951
0
            break;
952
0
    #endif /* !NO_SHA */
953
954
0
    #ifndef NO_SHA256
955
0
        case WC_SHA256:
956
0
            ret = wc_Sha256FinalRaw(&hmac->hash.sha256, hash);
957
0
            break;
958
0
    #endif /* !NO_SHA256 */
959
960
0
    #ifdef WOLFSSL_SHA384
961
0
        case WC_SHA384:
962
0
            ret = wc_Sha384FinalRaw(&hmac->hash.sha384, hash);
963
0
            break;
964
0
    #endif /* WOLFSSL_SHA384 */
965
966
0
    #ifdef WOLFSSL_SHA512
967
0
        case WC_SHA512:
968
0
            ret = wc_Sha512FinalRaw(&hmac->hash.sha512, hash);
969
0
            break;
970
0
    #endif /* WOLFSSL_SHA512 */
971
972
0
    #ifdef WOLFSSL_SM3
973
0
        case WC_SM3:
974
0
            ret = wc_Sm3FinalRaw(&hmac->hash.sm3, hash);
975
0
            break;
976
0
    #endif /* WOLFSSL_SM3 */
977
978
0
        default:
979
0
            ret = BAD_FUNC_ARG;
980
0
            break;
981
0
    }
982
983
0
    return ret;
984
0
}
985
986
/* Finalize the HMAC by performing outer hash.
987
 *
988
 * hmac  HMAC object.
989
 * mac   MAC result.
990
 * returns 0 on success, otherwise failure.
991
 */
992
static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac)
993
54
{
994
54
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
995
54
    WC_DECLARE_VAR(hash, wc_HashAlg, 1, hmac ? hmac->heap : NULL);
996
54
    enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
997
54
    int digestSz = wc_HashGetDigestSize(hashType);
998
54
    int blockSz = wc_HashGetBlockSize(hashType);
999
1000
54
    WC_ALLOC_VAR_EX(hash, wc_HashAlg, 1, hmac->heap, DYNAMIC_TYPE_HASHES,
1001
54
                    return MEMORY_E);
1002
1003
54
    if ((digestSz >= 0) && (blockSz >= 0)) {
1004
54
        ret = wc_HashInit(hash, hashType);
1005
54
    }
1006
0
    else {
1007
0
        ret = BAD_FUNC_ARG;
1008
0
    }
1009
1010
54
    if (ret == 0) {
1011
54
        ret = wc_HashUpdate(hash, hashType, (byte*)hmac->opad,
1012
54
            (word32)blockSz);
1013
54
        if (ret == 0)
1014
54
            ret = wc_HashUpdate(hash, hashType, (byte*)hmac->innerHash,
1015
54
                (word32)digestSz);
1016
54
        if (ret == 0)
1017
54
            ret = wc_HashFinal(hash, hashType, mac);
1018
54
        wc_HashFree(hash, hashType);
1019
54
    }
1020
1021
54
    WC_FREE_VAR_EX(hash, hmac->heap, DYNAMIC_TYPE_HASHES);
1022
54
    return ret;
1023
54
}
1024
1025
/* Calculate the HMAC of the header + message data.
1026
 * Constant time implementation using wc_Sha*FinalRaw().
1027
 *
1028
 * hmac    HMAC object.
1029
 * digest  MAC result.
1030
 * in      Message data.
1031
 * sz      Size of the message data.
1032
 * header  Constructed record header with length of handshake data.
1033
 * headerSz Length of header
1034
 * returns 0 on success, otherwise failure.
1035
 */
1036
static int Hmac_UpdateFinal_CT(Hmac* hmac, byte* digest, const byte* in,
1037
                           word32 sz, int macLen, byte* header, word32 headerSz)
1038
0
{
1039
0
    byte         lenBytes[8];
1040
0
    int          i, j;
1041
0
    unsigned int k;
1042
0
    int          blockBits, blockMask;
1043
0
    int          lastBlockLen, extraLen, eocIndex;
1044
0
    int          blocks;
1045
0
    int          safeBlocks;
1046
0
    int          lenBlock;
1047
0
    int          eocBlock;
1048
0
    word32       maxLen;
1049
0
    int          blockSz, padSz;
1050
0
    int          ret;
1051
0
    word32       realLen;
1052
0
    byte         extraBlock;
1053
1054
0
    if (macLen <= 0 || macLen > (int)sizeof(hmac->innerHash))
1055
0
        return BAD_FUNC_ARG;
1056
1057
0
    switch (hmac->macType) {
1058
0
    #ifndef NO_SHA
1059
0
        case WC_SHA:
1060
0
            blockSz = WC_SHA_BLOCK_SIZE;
1061
0
            blockBits = 6;
1062
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1063
0
            break;
1064
0
    #endif /* !NO_SHA */
1065
1066
0
    #ifndef NO_SHA256
1067
0
        case WC_SHA256:
1068
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1069
0
            blockBits = 6;
1070
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1071
0
            break;
1072
0
    #endif /* !NO_SHA256 */
1073
1074
0
    #ifdef WOLFSSL_SHA384
1075
0
        case WC_SHA384:
1076
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1077
0
            blockBits = 7;
1078
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1079
0
            break;
1080
0
    #endif /* WOLFSSL_SHA384 */
1081
1082
0
    #ifdef WOLFSSL_SHA512
1083
0
        case WC_SHA512:
1084
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1085
0
            blockBits = 7;
1086
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1087
0
            break;
1088
0
    #endif /* WOLFSSL_SHA512 */
1089
1090
0
    #ifdef WOLFSSL_SM3
1091
0
        case WC_SM3:
1092
0
            blockSz = WC_SM3_BLOCK_SIZE;
1093
0
            blockBits = 6;
1094
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1095
0
            break;
1096
0
    #endif /* WOLFSSL_SM3 */
1097
1098
0
        default:
1099
0
            return BAD_FUNC_ARG;
1100
0
    }
1101
0
    blockMask = blockSz - 1;
1102
1103
    /* Size of data to HMAC if padding length byte is zero. */
1104
0
    maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - (word32)macLen;
1105
1106
    /* Complete data (including padding) has block for EOC and/or length. */
1107
0
    extraBlock = ctSetLTE(((int)maxLen + padSz) & blockMask, padSz);
1108
    /* Total number of blocks for data including padding. */
1109
0
    blocks = ((int)(maxLen + (word32)blockSz - 1) >> blockBits) + extraBlock;
1110
    /* Up to last 6 blocks can be hashed safely. */
1111
0
    safeBlocks = blocks - 6;
1112
1113
    /* Length of message data. */
1114
0
    realLen = maxLen - in[sz - 1];
1115
    /* Number of message bytes in last block. */
1116
0
    lastBlockLen = (int)realLen & blockMask;
1117
    /* Number of padding bytes in last block. */
1118
0
    extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
1119
    /* Number of blocks to create for hash. */
1120
0
    lenBlock = ((int)realLen + extraLen) >> blockBits;
1121
    /* Block containing EOC byte. */
1122
0
    eocBlock = (int)(realLen >> (word32)blockBits);
1123
    /* Index of EOC byte in block. */
1124
0
    eocIndex = (int)(realLen & (word32)blockMask);
1125
1126
    /* Add length of hmac's ipad to total length. */
1127
0
    realLen += (word32)blockSz;
1128
    /* Length as bits - 8 bytes bigendian. */
1129
0
    c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
1130
0
    c32toa(realLen << 3, lenBytes + sizeof(word32));
1131
1132
0
    ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, (word32)blockSz);
1133
0
    if (ret != 0)
1134
0
        return ret;
1135
1136
0
    XMEMSET(hmac->innerHash, 0, (size_t)macLen);
1137
1138
0
    if (safeBlocks > 0) {
1139
0
        ret = Hmac_HashUpdate(hmac, header, headerSz);
1140
0
        if (ret != 0)
1141
0
            return ret;
1142
0
        ret = Hmac_HashUpdate(hmac, in, (word32)(safeBlocks * blockSz -
1143
0
                                WOLFSSL_TLS_HMAC_INNER_SZ));
1144
1145
0
        if (ret != 0)
1146
0
            return ret;
1147
0
    }
1148
0
    else
1149
0
        safeBlocks = 0;
1150
1151
0
    XMEMSET(digest, 0, (size_t)macLen);
1152
0
    k = (unsigned int)(safeBlocks * blockSz);
1153
0
    for (i = safeBlocks; i < blocks; i++) {
1154
0
        unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
1155
0
        unsigned char isEocBlock = ctMaskEq(i, eocBlock);
1156
0
        unsigned char isOutBlock = ctMaskEq(i, lenBlock);
1157
1158
0
        for (j = 0; j < blockSz; j++) {
1159
0
            unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
1160
0
            volatile unsigned char maskPastEoc = ctMaskGT(j, eocIndex);
1161
0
            volatile unsigned char pastEoc = maskPastEoc & isEocBlock;
1162
0
            unsigned char b = 0;
1163
1164
0
            if (k < headerSz)
1165
0
                b = header[k];
1166
0
            else if (k < maxLen)
1167
0
                b = in[k - headerSz];
1168
0
            k++;
1169
1170
0
            b = ctMaskSel(atEoc, 0x80, b);
1171
0
            b &= (unsigned char)~(word32)pastEoc;
1172
0
            b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
1173
1174
0
            if (j >= blockSz - 8) {
1175
0
                b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
1176
0
            }
1177
1178
0
            hashBlock[j] = b;
1179
0
        }
1180
1181
        /* cppcheck-suppress uninitvar */
1182
0
        ret = Hmac_HashUpdate(hmac, hashBlock, (word32)blockSz);
1183
0
        if (ret != 0)
1184
0
            return ret;
1185
0
        ret = Hmac_HashFinalRaw(hmac, hashBlock);
1186
0
        if (ret != 0)
1187
0
            return ret;
1188
0
        for (j = 0; j < macLen; j++)
1189
0
            ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
1190
0
    }
1191
1192
0
    ret = Hmac_OuterHash(hmac, digest);
1193
1194
0
    return ret;
1195
0
}
1196
1197
#endif
1198
1199
#if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
1200
    defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2B)
1201
1202
/* Calculate the HMAC of the header + message data.
1203
 * Constant time implementation using normal hashing operations.
1204
 * Update-Final need to be constant time.
1205
 *
1206
 * hmac    HMAC object.
1207
 * digest  MAC result.
1208
 * in      Message data.
1209
 * sz      Size of the message data.
1210
 * header  Constructed record header with length of handshake data.
1211
 * headerSz Length of header
1212
 * returns 0 on success, otherwise failure.
1213
 */
1214
static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
1215
                            word32 sz, byte* header, word32 headerSz)
1216
0
{
1217
0
    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
1218
0
    int        ret = 0;
1219
0
    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
1220
0
    word32     offset = 0;
1221
0
    int        msgBlocks, blocks, blockBits;
1222
0
    int        i;
1223
1224
0
    switch (hmac->macType) {
1225
0
    #ifndef NO_SHA
1226
0
        case WC_SHA:
1227
0
            blockSz = WC_SHA_BLOCK_SIZE;
1228
0
            blockBits = 6;
1229
0
            macSz = WC_SHA_DIGEST_SIZE;
1230
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1231
0
            break;
1232
0
    #endif /* !NO_SHA */
1233
1234
0
    #ifndef NO_SHA256
1235
0
        case WC_SHA256:
1236
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1237
0
            blockBits = 6;
1238
0
            macSz = WC_SHA256_DIGEST_SIZE;
1239
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1240
0
            break;
1241
0
    #endif /* !NO_SHA256 */
1242
1243
0
    #ifdef WOLFSSL_SHA384
1244
0
        case WC_SHA384:
1245
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1246
0
            blockBits = 7;
1247
0
            macSz = WC_SHA384_DIGEST_SIZE;
1248
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1249
0
            break;
1250
0
    #endif /* WOLFSSL_SHA384 */
1251
1252
0
    #ifdef WOLFSSL_SHA512
1253
0
        case WC_SHA512:
1254
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1255
0
            blockBits = 7;
1256
0
            macSz = WC_SHA512_DIGEST_SIZE;
1257
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1258
0
            break;
1259
0
    #endif /* WOLFSSL_SHA512 */
1260
1261
0
    #ifdef HAVE_BLAKE2B
1262
0
        case WC_HASH_TYPE_BLAKE2B:
1263
0
            blockSz = BLAKE2B_BLOCKBYTES;
1264
0
            blockBits = 7;
1265
0
            macSz = BLAKE2B_256;
1266
0
            padSz = 0;
1267
0
            break;
1268
0
    #endif /* HAVE_BLAKE2B */
1269
1270
0
    #ifdef WOLFSSL_SM3
1271
0
        case WC_SM3:
1272
0
            blockSz = WC_SM3_BLOCK_SIZE;
1273
0
            blockBits = 6;
1274
0
            macSz = WC_SM3_DIGEST_SIZE;
1275
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1276
0
            break;
1277
0
    #endif
1278
1279
0
        default:
1280
0
            WOLFSSL_MSG("ERROR: Hmac_UpdateFinal failed, no hmac->macType");
1281
0
            return BAD_FUNC_ARG;
1282
0
    }
1283
1284
0
    msgSz = sz - (1 + in[sz - 1] + macSz);
1285
    /* Make negative result 0 */
1286
0
    msgSz &= ~(0 - (msgSz >> 31));
1287
0
    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
1288
0
    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
1289
    /* Make negative result 0 */
1290
0
    maxSz &= ~(0 - (maxSz >> 31));
1291
1292
    /* Calculate #blocks processed in HMAC for max and real data. */
1293
0
    blocks      = (int)(maxSz >> blockBits);
1294
0
    blocks     += ((maxSz + padSz) % blockSz) < padSz;
1295
0
    msgBlocks   = (int)(realSz >> blockBits);
1296
    /* #Extra blocks to process. */
1297
0
    blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0);
1298
    /* Calculate whole blocks. */
1299
0
    msgBlocks--;
1300
1301
0
    ret = wc_HmacUpdate(hmac, header, headerSz);
1302
0
    if (ret == 0) {
1303
        /* Fill the rest of the block with any available data. */
1304
0
        word32 currSz = ctMaskLT((int)msgSz, (int)blockSz) & msgSz;
1305
0
        currSz |= ctMaskGTE((int)msgSz, (int)blockSz) & blockSz;
1306
0
        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
1307
0
        currSz &= ~(0 - (currSz >> 31));
1308
0
        ret = wc_HmacUpdate(hmac, in, currSz);
1309
0
        offset = currSz;
1310
0
    }
1311
0
    if (ret == 0) {
1312
        /* Do the hash operations on a block basis. */
1313
0
        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
1314
0
            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
1315
0
            if (ret != 0)
1316
0
                break;
1317
0
        }
1318
0
    }
1319
0
    if (ret == 0)
1320
0
        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
1321
0
    if (ret == 0)
1322
0
        ret = wc_HmacFinal(hmac, digest);
1323
0
    if (ret == 0) {
1324
        /* Do the dummy hash operations. Do at least one. */
1325
0
        for (i = 0; i < blocks + 1; i++) {
1326
0
            ret = wc_HmacUpdate(hmac, dummy, blockSz);
1327
0
            if (ret != 0)
1328
0
                break;
1329
0
        }
1330
0
    }
1331
1332
0
    return ret;
1333
0
}
1334
1335
#endif
1336
1337
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1338
#define TLS_HMAC_CID_SZ(s, v) \
1339
                ((v) ? DtlsGetCidRxSize((s)) \
1340
                     : DtlsGetCidTxSize((s)))
1341
#define TLS_HMAC_CID(s, v, b, c) \
1342
                ((v) ? wolfSSL_dtls_cid_get_rx((s), (b), (c)) \
1343
                     : wolfSSL_dtls_cid_get_tx((s), (b), (c)))
1344
#endif
1345
1346
static int TLS_hmac_SetInner(WOLFSSL* ssl, byte* inner, word32* innerSz,
1347
        word32 sz, int content, int verify, int epochOrder)
1348
{
1349
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1350
    unsigned int cidSz = 0;
1351
    if (ssl->options.dtls && (cidSz = TLS_HMAC_CID_SZ(ssl, verify)) > 0) {
1352
        word32 idx = 0;
1353
        if (cidSz > DTLS_CID_MAX_SIZE) {
1354
            WOLFSSL_MSG("DTLS CID too large");
1355
            return DTLS_CID_ERROR;
1356
        }
1357
1358
        XMEMSET(inner + idx, 0xFF, SEQ_SZ);
1359
        idx += SEQ_SZ;
1360
        inner[idx++] = dtls12_cid;
1361
        inner[idx++] = (byte)cidSz;
1362
        inner[idx++] = dtls12_cid;
1363
        inner[idx++] = ssl->version.major;
1364
        inner[idx++] = ssl->version.minor;
1365
        WriteSEQ(ssl, epochOrder, inner + idx);
1366
        idx += SEQ_SZ;
1367
        if (TLS_HMAC_CID(ssl, verify, inner + idx, cidSz) ==
1368
                WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
1369
            WOLFSSL_MSG("DTLS CID write failed");
1370
            return DTLS_CID_ERROR;
1371
        }
1372
        idx += cidSz;
1373
        c16toa((word16)sz, inner + idx);
1374
        idx += LENGTH_SZ;
1375
1376
        *innerSz = idx;
1377
        return 0;
1378
    }
1379
#endif
1380
    *innerSz = WOLFSSL_TLS_HMAC_INNER_SZ;
1381
    return wolfSSL_SetTlsHmacInner(ssl, inner, sz, content,
1382
            !ssl->options.dtls ? verify : epochOrder);
1383
}
1384
1385
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1386
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_CID_INNER_SZ
1387
#else
1388
0
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_INNER_SZ
1389
#endif
1390
1391
int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
1392
             int content, int verify, int epochOrder)
1393
0
{
1394
0
    WC_DECLARE_VAR(hmac, Hmac, 1, ssl ? ssl->heap : NULL);
1395
0
    byte   myInner[TLS_HMAC_INNER_SZ];
1396
0
    word32 innerSz = TLS_HMAC_INNER_SZ;
1397
0
    int    ret = 0;
1398
0
    const byte* macSecret = NULL;
1399
0
    word32 hashSz = 0;
1400
0
    word32 totalSz = 0;
1401
1402
0
    if (ssl == NULL)
1403
0
        return BAD_FUNC_ARG;
1404
1405
0
    WC_ALLOC_VAR_EX(hmac, Hmac, 1, ssl->heap, DYNAMIC_TYPE_HMAC,
1406
0
                    return MEMORY_E);
1407
1408
#ifdef HAVE_TRUNCATED_HMAC
1409
    hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
1410
                                        : ssl->specs.hash_size;
1411
#else
1412
0
    hashSz = ssl->specs.hash_size;
1413
0
#endif
1414
1415
    /* Pre-compute sz + hashSz + padSz + 1 with overflow checking.
1416
     * Used by fuzzer callback and Hmac_UpdateFinal* in the verify path. */
1417
0
    if (verify && padSz >= 0) {
1418
0
        word32 hmacSz = 0;
1419
0
        if (!WC_SAFE_SUM_WORD32(sz, hashSz, hmacSz) ||
1420
0
            !WC_SAFE_SUM_WORD32(hmacSz, (word32)padSz, hmacSz) ||
1421
0
            !WC_SAFE_SUM_WORD32(hmacSz, 1, hmacSz)) {
1422
0
            WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1423
0
            return BUFFER_E;
1424
0
        }
1425
0
        totalSz = hmacSz;
1426
0
    }
1427
1428
#ifdef HAVE_FUZZER
1429
    /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
1430
    if (ssl->fuzzerCb) {
1431
        if (verify && padSz >= 0) {
1432
            ssl->fuzzerCb(ssl, in, totalSz, FUZZ_HMAC,
1433
                          ssl->fuzzerCtx);
1434
        }
1435
        else {
1436
            ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
1437
        }
1438
    }
1439
#endif
1440
1441
0
    ret = TLS_hmac_SetInner(ssl, myInner, &innerSz, sz, content, verify,
1442
0
                            epochOrder);
1443
0
    if (ret != 0) {
1444
0
        WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1445
0
        return ret;
1446
0
    }
1447
1448
0
    ret = wc_HmacInit(hmac, ssl->heap, ssl->devId);
1449
0
    if (ret != 0) {
1450
0
        WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1451
0
        return ret;
1452
0
    }
1453
1454
1455
#ifdef WOLFSSL_DTLS
1456
    if (ssl->options.dtls)
1457
        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
1458
    else
1459
#endif
1460
0
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
1461
0
    ret = wc_HmacSetKey(hmac, wolfSSL_GetHmacType(ssl),
1462
0
                                              macSecret,
1463
0
                                              ssl->specs.hash_size);
1464
1465
0
    if (ret == 0) {
1466
        /* Constant time verification required. */
1467
0
        if (verify && padSz >= 0) {
1468
0
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
1469
0
    !defined(HAVE_SELFTEST)
1470
0
    #ifdef HAVE_BLAKE2B
1471
0
            if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
1472
0
                ret = Hmac_UpdateFinal(hmac, digest, in,
1473
0
                        totalSz, myInner, innerSz);
1474
0
            }
1475
0
            else
1476
0
    #endif
1477
0
            {
1478
0
                ret = Hmac_UpdateFinal_CT(hmac, digest, in,
1479
0
                                      totalSz,
1480
0
                                      (int)hashSz, myInner, innerSz);
1481
1482
0
            }
1483
#else
1484
            ret = Hmac_UpdateFinal(hmac, digest, in, totalSz,
1485
                                        myInner, innerSz);
1486
#endif
1487
0
        }
1488
0
        else {
1489
0
            ret = wc_HmacUpdate(hmac, myInner, innerSz);
1490
0
            if (ret == 0)
1491
0
                ret = wc_HmacUpdate(hmac, in, sz);                /* content */
1492
0
            if (ret == 0)
1493
0
                ret = wc_HmacFinal(hmac, digest);
1494
0
        }
1495
0
    }
1496
1497
0
    wc_HmacFree(hmac);
1498
0
    WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1499
1500
0
    return ret;
1501
0
}
1502
#endif /* WOLFSSL_AEAD_ONLY */
1503
1504
#endif /* !WOLFSSL_NO_TLS12 */
1505
1506
int wolfSSL_GetHmacType_ex(CipherSpecs* specs)
1507
0
{
1508
0
    if (specs == NULL)
1509
0
        return BAD_FUNC_ARG;
1510
1511
0
    switch (specs->mac_algorithm) {
1512
0
        #ifndef NO_MD5
1513
0
        case md5_mac:
1514
0
        {
1515
0
            return WC_MD5;
1516
0
        }
1517
0
        #endif
1518
0
        #ifndef NO_SHA256
1519
0
        case sha256_mac:
1520
0
        {
1521
0
            return WC_SHA256;
1522
0
        }
1523
0
        #endif
1524
0
        #ifdef WOLFSSL_SHA384
1525
0
        case sha384_mac:
1526
0
        {
1527
0
            return WC_SHA384;
1528
0
        }
1529
0
        #endif
1530
0
        #ifdef WOLFSSL_SM3
1531
0
        case sm3_mac:
1532
0
        {
1533
0
            return WC_SM3;
1534
0
        }
1535
0
        #endif
1536
0
        #ifndef NO_SHA
1537
0
        case sha_mac:
1538
0
        {
1539
0
            return WC_SHA;
1540
0
        }
1541
0
        #endif
1542
0
        #ifdef HAVE_BLAKE2B
1543
0
        case blake2b_mac:
1544
0
        {
1545
0
            return BLAKE2B_ID;
1546
0
        }
1547
0
        #endif
1548
0
        default:
1549
0
        {
1550
0
            return WOLFSSL_FATAL_ERROR;
1551
0
        }
1552
0
    }
1553
0
}
1554
1555
#ifdef HAVE_TLS_EXTENSIONS
1556
1557
/**
1558
 * The TLSX semaphore is used to calculate the size of the extensions to be sent
1559
 * from one peer to another.
1560
 */
1561
1562
/** Supports up to 72 flags. Increase as needed. */
1563
#define SEMAPHORE_SIZE 9
1564
1565
/** Highest extension type that TLSX_ToSemaphore() maps directly onto its own
1566
 * semaphore index. Higher types are either remapped into the remaining indices
1567
 * (renegotiation_info, QUIC, ECH, CKS) or fall outside the semaphore's range.
1568
 * This boundary also drives duplicate-extension detection in TLSX_Parse(); keep
1569
 * the two in sync. */
1570
0
#define SEMAPHORE_MAX_DIRECT_TYPE 62
1571
1572
/**
1573
 * Converts the extension type (id) to an index in the semaphore.
1574
 *
1575
 * Official reference for TLS extension types:
1576
 *   http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
1577
 *
1578
 * Motivation:
1579
 *   Previously, we used the extension type itself as the index of that
1580
 *   extension in the semaphore as the extension types were declared
1581
 *   sequentially, but maintain a semaphore as big as the number of available
1582
 *   extensions is no longer an option since the release of renegotiation_info.
1583
 *
1584
 * How to update:
1585
 *   Assign extension types that extrapolate the number of available semaphores
1586
 *   to the first available index going backwards in the semaphore array.
1587
 *   When adding a new extension type that don't extrapolate the number of
1588
 *   available semaphores, check for a possible collision with with a
1589
 *   'remapped' extension type.
1590
 *
1591
 * Update TLSX_Parse for duplicate detection if more added above
1592
 * SEMAPHORE_MAX_DIRECT_TYPE.
1593
 */
1594
static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
1595
{
1596
    switch (type) {
1597
1598
        case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
1599
            return 63;
1600
#ifdef WOLFSSL_QUIC
1601
        case TLSX_KEY_QUIC_TP_PARAMS_DRAFT: /* 0xffa5 */
1602
            return 64;
1603
#endif
1604
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
1605
        case TLSX_ECH: /* 0xfe0d */
1606
            return 65;
1607
#endif
1608
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
1609
        case TLSX_CKS:
1610
            return 66;
1611
#endif
1612
        default:
1613
            if (type > SEMAPHORE_MAX_DIRECT_TYPE) {
1614
                /* This message SHOULD only happens during the adding of
1615
                   new TLS extensions in which its IANA number overflows
1616
                   the current semaphore's range, or if its number already
1617
                   is assigned to be used by another extension.
1618
                   Use this check value for the new extension and decrement
1619
                   the check value by one. */
1620
                WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
1621
            }
1622
    }
1623
1624
    return type;
1625
}
1626
1627
/** Checks if a specific light (tls extension) is not set in the semaphore. */
1628
#define IS_OFF(semaphore, light) \
1629
0
    (!(((semaphore)[(light) / 8] &  (byte) (0x01 << ((light) % 8)))))
1630
1631
/** Turn on a specific light (tls extension) in the semaphore. */
1632
/* the semaphore marks the extensions already written to the message */
1633
#define TURN_ON(semaphore, light) \
1634
0
    ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
1635
1636
/** Turn off a specific light (tls extension) in the semaphore. */
1637
#define TURN_OFF(semaphore, light) \
1638
0
    ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
1639
1640
/** Creates a new extension. */
1641
static TLSX* TLSX_New(TLSX_Type type, const void* data, void* heap)
1642
133k
{
1643
133k
    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
1644
1645
133k
    (void)heap;
1646
1647
133k
    if (extension) {
1648
132k
        extension->type = type;
1649
132k
        extension->data = (void*)data;
1650
132k
        extension->resp = 0;
1651
132k
        extension->next = NULL;
1652
132k
    }
1653
1654
133k
    return extension;
1655
133k
}
1656
1657
/**
1658
 * Creates a new extension and appends it to the provided list.
1659
 * Checks for duplicate extensions, keeps the newest.
1660
 */
1661
int TLSX_Append(TLSX** list, TLSX_Type type, const void* data, void* heap)
1662
0
{
1663
0
    TLSX* extension = TLSX_New(type, data, heap);
1664
0
    TLSX* cur;
1665
0
    TLSX** prevNext = list;
1666
1667
0
    if (extension == NULL)
1668
0
        return MEMORY_E;
1669
1670
0
    for (cur = *list; cur != NULL;) {
1671
0
        if (cur->type == type) {
1672
0
            *prevNext = cur->next;
1673
0
            cur->next = NULL;
1674
0
            TLSX_FreeAll(cur, heap);
1675
0
            cur = *prevNext;
1676
0
        }
1677
0
        else {
1678
0
            prevNext = &cur->next;
1679
0
            cur = cur->next;
1680
0
        }
1681
0
    }
1682
1683
    /* Append the extension to the list */
1684
0
    *prevNext = extension;
1685
1686
0
    return 0;
1687
0
}
1688
1689
/**
1690
 * Creates a new extension and pushes it to the provided list.
1691
 * Checks for duplicate extensions, keeps the newest.
1692
 */
1693
int TLSX_Push(TLSX** list, TLSX_Type type, const void* data, void* heap)
1694
133k
{
1695
133k
    TLSX* extension = TLSX_New(type, data, heap);
1696
1697
133k
    if (extension == NULL)
1698
513
        return MEMORY_E;
1699
1700
    /* pushes the new extension on the list. */
1701
132k
    extension->next = *list;
1702
132k
    *list = extension;
1703
1704
    /* remove duplicate extensions, there should be only one of each type. */
1705
450k
    do {
1706
450k
        if (extension->next && extension->next->type == type) {
1707
811
            TLSX *next = extension->next;
1708
1709
811
            extension->next = next->next;
1710
811
            next->next = NULL;
1711
1712
811
            TLSX_FreeAll(next, heap);
1713
1714
            /* there is no way to occur more than
1715
             * two extensions of the same type.
1716
             */
1717
811
            break;
1718
811
        }
1719
450k
    } while ((extension = extension->next));
1720
1721
132k
    return 0;
1722
133k
}
1723
1724
#ifndef NO_WOLFSSL_CLIENT
1725
1726
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
1727
1728
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
1729
153
{
1730
153
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1731
1732
153
    if (!extension)
1733
153
        extension = TLSX_Find(ssl->ctx->extensions, type);
1734
1735
153
    return extension == NULL;
1736
153
}
1737
1738
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
1739
1740
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
1741
9
{
1742
9
    SendAlert(ssl, alert_fatal, unsupported_extension);
1743
9
    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
1744
9
    return UNSUPPORTED_EXTENSION;
1745
9
}
1746
1747
#else
1748
1749
#define TLSX_CheckUnsupportedExtension(ssl, type) 0
1750
#define TLSX_HandleUnsupportedExtension(ssl) 0
1751
1752
#endif
1753
1754
#if !defined(NO_WOLFSSL_SERVER) || defined(WOLFSSL_TLS13)
1755
static void TLSX_SetResponseInList(TLSX* list, TLSX_Type type);
1756
/** Mark an extension to be sent back to the client.
1757
 *  Operates on a list instead of the ssl.
1758
 *      (Should only be used on ssl->extensions or ech->extensions) */
1759
static void TLSX_SetResponseInList(TLSX* list, TLSX_Type type)
1760
2.78k
{
1761
2.78k
    TLSX *extension = TLSX_Find(list, type);
1762
1763
2.78k
    if (extension)
1764
2.78k
        extension->resp = 1;
1765
2.78k
}
1766
1767
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
1768
/** Mark an extension to be sent back to the client. */
1769
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
1770
2.78k
{
1771
2.78k
    TLSX_SetResponseInList(ssl->extensions, type);
1772
2.78k
}
1773
#endif
1774
1775
/******************************************************************************/
1776
/* Application-Layer Protocol Negotiation                                     */
1777
/******************************************************************************/
1778
1779
#ifdef HAVE_ALPN
1780
/** Creates a new ALPN object, providing protocol name to use. */
1781
static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
1782
                                                                     void* heap)
1783
{
1784
    ALPN *alpn;
1785
1786
    WOLFSSL_ENTER("TLSX_ALPN_New");
1787
1788
    if (protocol_name == NULL ||
1789
        protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
1790
        WOLFSSL_MSG("Invalid arguments");
1791
        return NULL;
1792
    }
1793
1794
    alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
1795
    if (alpn == NULL) {
1796
        WOLFSSL_MSG("Memory failure");
1797
        return NULL;
1798
    }
1799
1800
    alpn->next = NULL;
1801
    alpn->negotiated = 0;
1802
    alpn->options = 0;
1803
1804
    alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
1805
                                         heap, DYNAMIC_TYPE_TLSX);
1806
    if (alpn->protocol_name == NULL) {
1807
        WOLFSSL_MSG("Memory failure");
1808
        XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1809
        return NULL;
1810
    }
1811
1812
    XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
1813
    alpn->protocol_name[protocol_nameSz] = 0;
1814
1815
    (void)heap;
1816
1817
    return alpn;
1818
}
1819
1820
/** Releases an ALPN object. */
1821
static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
1822
{
1823
    (void)heap;
1824
1825
    if (alpn == NULL)
1826
        return;
1827
1828
    XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
1829
    XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1830
}
1831
1832
/** Releases all ALPN objects in the provided list. */
1833
static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
1834
{
1835
    ALPN* alpn;
1836
1837
    while ((alpn = list)) {
1838
        list = alpn->next;
1839
        TLSX_ALPN_Free(alpn, heap);
1840
    }
1841
}
1842
1843
/** Tells the buffered size of the ALPN objects in a list. */
1844
static word16 TLSX_ALPN_GetSize(ALPN *list)
1845
{
1846
    ALPN* alpn;
1847
    word32 length = OPAQUE16_LEN; /* list length */
1848
1849
    while ((alpn = list)) {
1850
        list = alpn->next;
1851
1852
        length++; /* protocol name length is on one byte */
1853
        length += (word32)XSTRLEN(alpn->protocol_name);
1854
1855
        if (length > WOLFSSL_MAX_16BIT) {
1856
            return 0;
1857
        }
1858
    }
1859
1860
    return (word16)length;
1861
}
1862
1863
/** Writes the ALPN objects of a list in a buffer. */
1864
static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
1865
{
1866
    ALPN* alpn;
1867
    word16 length = 0;
1868
    word16 offset = OPAQUE16_LEN; /* list length offset */
1869
1870
    while ((alpn = list)) {
1871
        list = alpn->next;
1872
1873
        length = (word16)XSTRLEN(alpn->protocol_name);
1874
1875
        /* protocol name length */
1876
        output[offset++] = (byte)length;
1877
1878
        /* protocol name value */
1879
        XMEMCPY(output + offset, alpn->protocol_name, length);
1880
1881
        offset += length;
1882
    }
1883
1884
    /* writing list length */
1885
    c16toa(offset - OPAQUE16_LEN, output);
1886
1887
    return offset;
1888
}
1889
1890
/** Finds a protocol name in the provided ALPN list */
1891
static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
1892
{
1893
    ALPN *alpn;
1894
1895
    if (list == NULL || protocol_name == NULL)
1896
        return NULL;
1897
1898
    alpn = list;
1899
    while (alpn != NULL && (
1900
           (word16)XSTRLEN(alpn->protocol_name) != size ||
1901
           XSTRNCMP(alpn->protocol_name, protocol_name, size)))
1902
        alpn = alpn->next;
1903
1904
    return alpn;
1905
}
1906
1907
/** Set the ALPN matching client and server requirements */
1908
static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
1909
                                                                     void* heap)
1910
{
1911
    ALPN *alpn;
1912
    int  ret;
1913
1914
    if (extensions == NULL || data == NULL)
1915
        return BAD_FUNC_ARG;
1916
1917
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1918
    if (alpn == NULL) {
1919
        WOLFSSL_MSG("Memory failure");
1920
        return MEMORY_E;
1921
    }
1922
1923
    alpn->negotiated = 1;
1924
1925
    ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
1926
                                                                          heap);
1927
    if (ret != 0) {
1928
        TLSX_ALPN_Free(alpn, heap);
1929
        return ret;
1930
    }
1931
1932
    return WOLFSSL_SUCCESS;
1933
}
1934
1935
static int ALPN_find_match(WOLFSSL *ssl, TLSX **pextension,
1936
                           const byte **psel, byte *psel_len,
1937
                           const byte *alpn_val, word16 alpn_val_len)
1938
{
1939
    TLSX    *extension;
1940
    ALPN    *alpn, *list;
1941
    const byte *sel = NULL, *s;
1942
    byte sel_len = 0, wlen;
1943
1944
    extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1945
    if (extension == NULL)
1946
        extension = TLSX_Find(ssl->ctx->extensions,
1947
                              TLSX_APPLICATION_LAYER_PROTOCOL);
1948
1949
    /* No ALPN configured here */
1950
    if (extension == NULL || extension->data == NULL) {
1951
        *pextension = NULL;
1952
        *psel = NULL;
1953
        *psel_len = 0;
1954
        return 0;
1955
    }
1956
1957
    list = (ALPN*)extension->data;
1958
    for (s = alpn_val;
1959
         (s - alpn_val) < alpn_val_len;
1960
         s += wlen) {
1961
        wlen = *s++; /* bounds already checked on save */
1962
        alpn = TLSX_ALPN_Find(list, (char*)s, wlen);
1963
        if (alpn != NULL) {
1964
            WOLFSSL_MSG("ALPN protocol match");
1965
            sel = s,
1966
            sel_len = wlen;
1967
            break;
1968
        }
1969
    }
1970
1971
    if (sel == NULL) {
1972
        WOLFSSL_MSG("No ALPN protocol match");
1973
1974
        /* The caller explicitly opted out of failing on mismatch by passing
1975
         * WOLFSSL_ALPN_CONTINUE_ON_MISMATCH, so continue without an agreed
1976
         * protocol like OpenSSL. This deliberately skips the RFC 7301 section
1977
         * 3.2 fatal no_application_protocol alert. */
1978
        if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
1979
            WOLFSSL_MSG("Continue on mismatch");
1980
        }
1981
        else {
1982
            SendAlert(ssl, alert_fatal, no_application_protocol);
1983
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1984
            return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1985
        }
1986
    }
1987
1988
    *pextension = extension;
1989
    *psel = sel;
1990
    *psel_len = sel_len;
1991
    return 0;
1992
}
1993
1994
int ALPN_Select(WOLFSSL *ssl)
1995
{
1996
    TLSX *extension;
1997
    const byte *sel = NULL;
1998
    byte sel_len = 0;
1999
    int r = 0;
2000
2001
    WOLFSSL_ENTER("ALPN_Select");
2002
    if (ssl->alpn_peer_requested == NULL)
2003
        return 0;
2004
2005
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
2006
    if (ssl->alpnSelect != NULL && ssl->options.side == WOLFSSL_SERVER_END) {
2007
        r = ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested,
2008
                ssl->alpn_peer_requested_length, ssl->alpnSelectArg);
2009
        switch (r) {
2010
            case SSL_TLSEXT_ERR_OK:
2011
                WOLFSSL_MSG("ALPN protocol match");
2012
                break;
2013
            case SSL_TLSEXT_ERR_NOACK:
2014
                WOLFSSL_MSG("ALPN cb no match but not fatal");
2015
                sel = NULL;
2016
                sel_len = 0;
2017
                break;
2018
            case SSL_TLSEXT_ERR_ALERT_FATAL:
2019
            default:
2020
                WOLFSSL_MSG("ALPN cb no match and fatal");
2021
                SendAlert(ssl, alert_fatal, no_application_protocol);
2022
                WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
2023
                return UNKNOWN_ALPN_PROTOCOL_NAME_E;
2024
        }
2025
    }
2026
    else
2027
#endif
2028
    {
2029
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len,
2030
                            ssl->alpn_peer_requested,
2031
                            ssl->alpn_peer_requested_length);
2032
        if (r != 0)
2033
            return r;
2034
    }
2035
2036
    if (sel != NULL) {
2037
        /* set the matching negotiated protocol */
2038
        r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
2039
        if (r != WOLFSSL_SUCCESS) {
2040
            WOLFSSL_MSG("TLSX_SetALPN failed");
2041
            return BUFFER_ERROR;
2042
        }
2043
        /* reply to ALPN extension sent from peer */
2044
#ifndef NO_WOLFSSL_SERVER
2045
        TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
2046
#endif
2047
    }
2048
    return 0;
2049
}
2050
2051
/** Parses a buffer of ALPN extensions and set the first one matching
2052
 * client and server requirements */
2053
static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, const byte *input, word16 length,
2054
                                 byte isRequest)
2055
{
2056
    word16  size = 0, offset = 0, wlen;
2057
    int     r = WC_NO_ERR_TRACE(BUFFER_ERROR);
2058
    const byte *s;
2059
    word16  entryCount = 0;
2060
2061
    if (OPAQUE16_LEN > length)
2062
        return BUFFER_ERROR;
2063
2064
    ato16(input, &size);
2065
    offset += OPAQUE16_LEN;
2066
2067
    /* validating alpn list length */
2068
    if (size == 0 || length != OPAQUE16_LEN + size)
2069
        return BUFFER_ERROR;
2070
2071
    /* validating length of entries before accepting */
2072
    for (s = input + offset; (s - input) < length; s += wlen) {
2073
        wlen = *s++;
2074
        if (wlen == 0 || (s + wlen - input) > length)
2075
            return BUFFER_ERROR;
2076
        entryCount++;
2077
    }
2078
2079
    /* RFC 7301 Section 3.1: the server's ProtocolNameList in its ALPN
2080
     * response MUST contain exactly one ProtocolName. */
2081
    if (!isRequest && entryCount != 1) {
2082
        SendAlert(ssl, alert_fatal, decode_error);
2083
        WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
2084
        return BUFFER_ERROR;
2085
    }
2086
2087
    if (isRequest) {
2088
        /* keep the list sent by peer, if this is from a request. We
2089
         * use it later in ALPN_Select() for evaluation. */
2090
        if (ssl->alpn_peer_requested != NULL) {
2091
            XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
2092
            ssl->alpn_peer_requested_length = 0;
2093
        }
2094
        ssl->alpn_peer_requested = (byte *)XMALLOC(size, ssl->heap,
2095
                                                   DYNAMIC_TYPE_ALPN);
2096
        if (ssl->alpn_peer_requested == NULL) {
2097
            return MEMORY_ERROR;
2098
        }
2099
        ssl->alpn_peer_requested_length = size;
2100
        XMEMCPY(ssl->alpn_peer_requested, (char*)input + offset, size);
2101
    }
2102
    else {
2103
        /* a response, we should find the value in our config */
2104
        const byte *sel = NULL;
2105
        byte sel_len = 0;
2106
        TLSX *extension = NULL;
2107
2108
        /* RFC 7301 Section 3.1: a ServerHello ALPN extension MUST contain
2109
         * exactly one protocol name. The first name's length byte plus its
2110
         * payload must therefore span the whole list. */
2111
        if ((word16)(input[offset] + OPAQUE8_LEN) != size) {
2112
            SendAlert(ssl, alert_fatal, illegal_parameter);
2113
            WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
2114
            return BUFFER_ERROR;
2115
        }
2116
2117
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len, input + offset, size);
2118
        if (r != 0)
2119
            return r;
2120
2121
        if (sel != NULL) {
2122
            /* set the matching negotiated protocol */
2123
            r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
2124
            if (r != WOLFSSL_SUCCESS) {
2125
                WOLFSSL_MSG("TLSX_SetALPN failed");
2126
                return BUFFER_ERROR;
2127
            }
2128
        }
2129
        /* If we had nothing configured, the response is unexpected */
2130
        else if (extension == NULL) {
2131
            r = TLSX_HandleUnsupportedExtension(ssl);
2132
            if (r != 0)
2133
                return r;
2134
        }
2135
    }
2136
    return 0;
2137
}
2138
2139
/** Add a protocol name to the list of accepted usable ones */
2140
int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
2141
                                                                     void* heap)
2142
{
2143
    ALPN *alpn;
2144
    TLSX *extension;
2145
    int  ret;
2146
2147
    if (extensions == NULL || data == NULL)
2148
        return BAD_FUNC_ARG;
2149
2150
    alpn = TLSX_ALPN_New((char *)data, size, heap);
2151
    if (alpn == NULL) {
2152
        WOLFSSL_MSG("Memory failure");
2153
        return MEMORY_E;
2154
    }
2155
2156
    /* Set Options of ALPN */
2157
    alpn->options = options;
2158
2159
    extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2160
    if (extension == NULL) {
2161
        ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
2162
                                                             (void*)alpn, heap);
2163
        if (ret != 0) {
2164
            TLSX_ALPN_Free(alpn, heap);
2165
            return ret;
2166
        }
2167
    }
2168
    else {
2169
        /* push new ALPN object to extension data. */
2170
        alpn->next = (ALPN*)extension->data;
2171
        extension->data = (void*)alpn;
2172
    }
2173
2174
    return WOLFSSL_SUCCESS;
2175
}
2176
2177
/** Get the protocol name set by the server */
2178
int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
2179
{
2180
    TLSX *extension;
2181
    ALPN *alpn;
2182
2183
    if (extensions == NULL || data == NULL || dataSz == NULL)
2184
        return BAD_FUNC_ARG;
2185
2186
    *data = NULL;
2187
    *dataSz = 0;
2188
2189
    extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2190
    if (extension == NULL) {
2191
        WOLFSSL_MSG("TLS extension not found");
2192
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2193
        return WOLFSSL_ALPN_NOT_FOUND;
2194
    }
2195
2196
    alpn = (ALPN *)extension->data;
2197
    if (alpn == NULL) {
2198
        WOLFSSL_MSG("ALPN extension not found");
2199
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2200
        return WOLFSSL_FATAL_ERROR;
2201
    }
2202
2203
    if (alpn->negotiated != 1) {
2204
2205
        /* consider as an error */
2206
        if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
2207
            WOLFSSL_MSG("No protocol match with peer -> Failed");
2208
            WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2209
            return WOLFSSL_FATAL_ERROR;
2210
        }
2211
2212
        /* continue without negotiated protocol */
2213
        WOLFSSL_MSG("No protocol match with peer -> Continue");
2214
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2215
        return WOLFSSL_ALPN_NOT_FOUND;
2216
    }
2217
2218
    if (alpn->next != NULL) {
2219
        WOLFSSL_MSG("Only one protocol name must be accepted");
2220
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2221
        return WOLFSSL_FATAL_ERROR;
2222
    }
2223
2224
    *data = alpn->protocol_name;
2225
    *dataSz = (word16)XSTRLEN((char*)*data);
2226
2227
    return WOLFSSL_SUCCESS;
2228
}
2229
2230
#define ALPN_FREE_ALL     TLSX_ALPN_FreeAll
2231
#define ALPN_GET_SIZE     TLSX_ALPN_GetSize
2232
#define ALPN_WRITE        TLSX_ALPN_Write
2233
#define ALPN_PARSE        TLSX_ALPN_ParseAndSet
2234
2235
#else /* HAVE_ALPN */
2236
2237
0
#define ALPN_FREE_ALL(list, heap) WC_DO_NOTHING
2238
#define ALPN_GET_SIZE(list)     0
2239
0
#define ALPN_WRITE(a, b)        0
2240
0
#define ALPN_PARSE(a, b, c, d)  0
2241
2242
#endif /* HAVE_ALPN */
2243
2244
/******************************************************************************/
2245
/* Server Name Indication                                                     */
2246
/******************************************************************************/
2247
2248
#ifdef HAVE_SNI
2249
2250
/** Creates a new SNI object. */
2251
static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
2252
28
{
2253
28
    SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
2254
2255
28
    (void)heap;
2256
2257
28
    if (sni) {
2258
28
        sni->type = type;
2259
28
        sni->next = NULL;
2260
2261
28
    #ifndef NO_WOLFSSL_SERVER
2262
28
        sni->options = 0;
2263
28
        sni->status  = WOLFSSL_SNI_NO_MATCH;
2264
28
    #endif
2265
2266
28
        switch (sni->type) {
2267
28
            case WOLFSSL_SNI_HOST_NAME:
2268
28
                sni->data.host_name = (char*)XMALLOC(size + 1, heap,
2269
28
                                                     DYNAMIC_TYPE_TLSX);
2270
28
                if (sni->data.host_name) {
2271
28
                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
2272
28
                    sni->data.host_name[size] = '\0';
2273
28
                } else {
2274
0
                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2275
0
                    sni = NULL;
2276
0
                }
2277
28
            break;
2278
2279
0
            default: /* invalid type */
2280
0
                XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2281
0
                sni = NULL;
2282
28
        }
2283
28
    }
2284
2285
28
    return sni;
2286
28
}
2287
2288
/** Releases a SNI object. */
2289
static void TLSX_SNI_Free(SNI* sni, void* heap)
2290
0
{
2291
0
    if (sni) {
2292
0
        switch (sni->type) {
2293
0
            case WOLFSSL_SNI_HOST_NAME:
2294
0
                XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
2295
0
            break;
2296
0
        }
2297
2298
0
        XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2299
0
    }
2300
0
    (void)heap;
2301
0
}
2302
2303
/** Releases all SNI objects in the provided list. */
2304
static void TLSX_SNI_FreeAll(SNI* list, void* heap)
2305
0
{
2306
0
    SNI* sni;
2307
2308
0
    while ((sni = list)) {
2309
0
        list = sni->next;
2310
0
        TLSX_SNI_Free(sni, heap);
2311
0
    }
2312
0
}
2313
2314
/** Tells the buffered size of the SNI objects in a list. */
2315
WOLFSSL_TEST_VIS word16 TLSX_SNI_GetSize(SNI* list)
2316
10.0k
{
2317
10.0k
    SNI* sni;
2318
10.0k
    word32 length = OPAQUE16_LEN; /* list length */
2319
2320
20.0k
    while ((sni = list)) {
2321
10.0k
        list = sni->next;
2322
2323
10.0k
        length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
2324
2325
10.0k
        switch (sni->type) {
2326
10.0k
            case WOLFSSL_SNI_HOST_NAME:
2327
10.0k
                length += (word32)XSTRLEN((char*)sni->data.host_name);
2328
10.0k
            break;
2329
10.0k
        }
2330
2331
10.0k
        if (length > WOLFSSL_MAX_16BIT) {
2332
0
            return 0;
2333
0
        }
2334
10.0k
    }
2335
2336
10.0k
    return (word16)length;
2337
10.0k
}
2338
2339
/** Writes the SNI objects of a list in a buffer. */
2340
static word16 TLSX_SNI_Write(SNI* list, byte* output)
2341
8.14k
{
2342
8.14k
    SNI* sni;
2343
8.14k
    word16 length = 0;
2344
8.14k
    word16 offset = OPAQUE16_LEN; /* list length offset */
2345
2346
16.2k
    while ((sni = list)) {
2347
8.14k
        list = sni->next;
2348
2349
8.14k
        output[offset++] = sni->type; /* sni type */
2350
2351
8.14k
        switch (sni->type) {
2352
8.14k
            case WOLFSSL_SNI_HOST_NAME:
2353
8.14k
                length = (word16)XSTRLEN((char*)sni->data.host_name);
2354
2355
8.14k
                c16toa(length, output + offset); /* sni length */
2356
8.14k
                offset += OPAQUE16_LEN;
2357
2358
8.14k
                XMEMCPY(output + offset, sni->data.host_name, length);
2359
2360
8.14k
                offset += length;
2361
8.14k
            break;
2362
8.14k
        }
2363
8.14k
    }
2364
2365
8.14k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2366
2367
8.14k
    return offset;
2368
8.14k
}
2369
2370
/** Finds a SNI object in the provided list. */
2371
static SNI* TLSX_SNI_Find(SNI *list, byte type)
2372
129
{
2373
129
    SNI* sni = list;
2374
2375
129
    while (sni && sni->type != type)
2376
0
        sni = sni->next;
2377
2378
129
    return sni;
2379
129
}
2380
2381
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
2382
/** Sets the status of a SNI object. */
2383
static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
2384
31
{
2385
31
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2386
31
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2387
2388
31
    if (sni)
2389
0
        sni->status = status;
2390
31
}
2391
#endif
2392
2393
/** Gets the status of a SNI object. */
2394
byte TLSX_SNI_Status(TLSX* extensions, byte type)
2395
0
{
2396
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2397
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2398
2399
0
    if (sni)
2400
0
        return sni->status;
2401
2402
0
    return 0;
2403
0
}
2404
2405
/** Parses a buffer of SNI extensions. */
2406
static int TLSX_SNI_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2407
                          byte isRequest)
2408
926
{
2409
926
#ifndef NO_WOLFSSL_SERVER
2410
926
    word16 size = 0;
2411
926
    word16 offset = 0;
2412
926
    int cacheOnly = 0;
2413
926
    int checkPublic = 0;
2414
926
    SNI* sni = NULL;
2415
926
    byte type;
2416
926
    byte matched = 0;
2417
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2418
    TLSX* echX = NULL;
2419
    WOLFSSL_ECH* ech = NULL;
2420
    WOLFSSL_EchConfig* workingConfig = NULL;
2421
#endif
2422
926
#endif /* !NO_WOLFSSL_SERVER */
2423
926
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
2424
2425
926
    if (!extension)
2426
926
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2427
2428
926
    if (!isRequest) {
2429
44
        #ifndef NO_WOLFSSL_CLIENT
2430
44
            if (!extension || !extension->data)
2431
0
                return TLSX_HandleUnsupportedExtension(ssl);
2432
2433
44
            if (length > 0)
2434
13
                return BUFFER_ERROR; /* SNI response MUST be empty. */
2435
2436
            /* This call enables wolfSSL_SNI_GetRequest() to be called in the
2437
             * client side to fetch the used SNI. It will only work if the SNI
2438
             * was set at the SSL object level. Right now we only support one
2439
             * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
2440
             * inclusion of other name types will turn this method inaccurate,
2441
             * as the extension response doesn't contains information of which
2442
             * name was accepted.
2443
             */
2444
31
            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
2445
31
                                                        WOLFSSL_SNI_REAL_MATCH);
2446
2447
31
            return 0;
2448
44
        #endif
2449
44
    }
2450
2451
882
#ifndef NO_WOLFSSL_SERVER
2452
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2453
    if (!ssl->options.disableECH && !ssl->options.echProcessingInner) {
2454
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
2455
        if (echX != NULL) {
2456
            ech = (WOLFSSL_ECH*)(echX->data);
2457
        }
2458
    }
2459
#endif
2460
2461
882
    if (!extension || !extension->data) {
2462
        /* This will keep SNI even though TLSX_UseSNI has not been called.
2463
         * Enable it so that the received sni is available to functions
2464
         * that use a custom callback when SNI is received.
2465
         */
2466
    #ifdef WOLFSSL_ALWAYS_KEEP_SNI
2467
        cacheOnly = 1;
2468
    #endif
2469
882
        if (ssl->ctx->sniRecvCb) {
2470
0
            cacheOnly = 1;
2471
0
        }
2472
2473
882
        if (cacheOnly) {
2474
0
            WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
2475
0
        }
2476
882
        else {
2477
        #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2478
            if (ech == NULL)
2479
        #endif
2480
882
            {
2481
                /* Skipping, SNI not enabled at server side. */
2482
882
                return 0;
2483
882
            }
2484
2485
        #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2486
            /* No server SNI configured but ECH is active:
2487
             * the outer SNI still needs to be matched against the echConfig
2488
             * publicName and recorded on ech->extensions. */
2489
            checkPublic = 1;
2490
        #endif
2491
882
        }
2492
882
    }
2493
2494
0
    if (OPAQUE16_LEN > length)
2495
0
        return BUFFER_ERROR;
2496
2497
0
    ato16(input, &size);
2498
0
    offset += OPAQUE16_LEN;
2499
2500
    /* validating sni list length */
2501
0
    if (length != OPAQUE16_LEN + size || size == 0)
2502
0
        return BUFFER_ERROR;
2503
2504
    /* SNI was badly specified and only one type is now recognized and allowed.
2505
     * Only one SNI value per type (RFC6066), so, no loop. */
2506
0
    type = input[offset++];
2507
0
    if (type != WOLFSSL_SNI_HOST_NAME)
2508
0
        return BUFFER_ERROR;
2509
2510
0
    if (offset + OPAQUE16_LEN > length)
2511
0
        return BUFFER_ERROR;
2512
0
    ato16(input + offset, &size);
2513
0
    offset += OPAQUE16_LEN;
2514
2515
0
    if (offset + size != length || size == 0)
2516
0
        return BUFFER_ERROR;
2517
2518
0
    if (!cacheOnly && !checkPublic &&
2519
0
            !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
2520
0
        return 0; /* not using this type of SNI. */
2521
2522
0
#if defined(WOLFSSL_TLS13)
2523
    /* Don't process the second ClientHello SNI extension if there
2524
     * was problems with the first.
2525
     */
2526
0
    if (!cacheOnly && sni != NULL && sni->status != WOLFSSL_SNI_NO_MATCH)
2527
0
        return 0;
2528
0
#endif
2529
2530
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2531
    /* While parsing the outer CH accept a match against any
2532
     * echConfig publicName */
2533
    if (ech != NULL) {
2534
        workingConfig = ech->echConfig;
2535
        while (workingConfig != NULL) {
2536
            if (XSTRLEN(workingConfig->publicName) == size &&
2537
                    XSTRNCMP(workingConfig->publicName,
2538
                    (const char*)input + offset, size) == 0) {
2539
                matched = 1;
2540
                break;
2541
            }
2542
            workingConfig = workingConfig->next;
2543
        }
2544
2545
        /* If a publicName is matched then this SNI is not something that should
2546
         * be forcibly cached. This allows an SNI response to be given for the
2547
         * public name */
2548
        if (matched)
2549
            cacheOnly = 0;
2550
    }
2551
    if (!matched)
2552
#endif
2553
0
    {
2554
0
        const char* hostName;
2555
0
        hostName = (sni != NULL) ? sni->data.host_name : NULL;
2556
0
        matched = cacheOnly || (hostName != NULL &&
2557
0
            XSTRLEN(hostName) == size &&
2558
0
            XSTRNCMP(hostName, (const char*)input + offset, size) == 0);
2559
0
    }
2560
2561
    /* No server SNI configured and the outer name did not match a publicName:
2562
     * stay permissive and record nothing. If ECH is accepted, the absent
2563
     * publicName match is caught after the outer parse. */
2564
0
    if (!matched && checkPublic)
2565
0
        return 0;
2566
2567
0
    if (matched ||
2568
0
            (sni != NULL && (sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH))) {
2569
0
        int matchStat;
2570
0
        int r;
2571
0
        TLSX** writeList = &ssl->extensions;
2572
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2573
        /* install onto ech->extensions if the public name was matched */
2574
        if (workingConfig != NULL)
2575
            writeList = &ech->extensions;
2576
#endif
2577
2578
0
        r = TLSX_UseSNI(writeList, type, input + offset, size, ssl->heap);
2579
2580
0
        if (r != WOLFSSL_SUCCESS)
2581
0
            return r; /* throws error. */
2582
2583
0
        if (cacheOnly) {
2584
0
            WOLFSSL_MSG("Forcing storage of SNI, Fake match");
2585
0
            matchStat = WOLFSSL_SNI_FORCE_KEEP;
2586
0
        }
2587
0
        else if (matched) {
2588
0
            WOLFSSL_MSG("SNI did match!");
2589
0
            matchStat = WOLFSSL_SNI_REAL_MATCH;
2590
0
        }
2591
0
        else {
2592
0
            WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
2593
0
            matchStat = WOLFSSL_SNI_FAKE_MATCH;
2594
0
        }
2595
2596
0
        TLSX_SNI_SetStatus(*writeList, type, (byte)matchStat);
2597
2598
0
        if (!cacheOnly)
2599
0
            TLSX_SetResponseInList(*writeList, TLSX_SERVER_NAME);
2600
0
    }
2601
0
    else if ((sni == NULL) ||
2602
0
            !(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
2603
0
        SendAlert(ssl, alert_fatal, unrecognized_name);
2604
0
        WOLFSSL_ERROR_VERBOSE(UNKNOWN_SNI_HOST_NAME_E);
2605
0
        return UNKNOWN_SNI_HOST_NAME_E;
2606
0
    }
2607
#else
2608
    (void)input;
2609
#endif /* !NO_WOLFSSL_SERVER */
2610
2611
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
2612
    (void)length;
2613
#endif
2614
2615
0
    return 0;
2616
0
}
2617
2618
static int TLSX_SNI_VerifyParse(WOLFSSL* ssl,  byte isRequest)
2619
10.2k
{
2620
10.2k
    (void)ssl;
2621
2622
10.2k
    if (isRequest) {
2623
9.49k
    #ifndef NO_WOLFSSL_SERVER
2624
9.49k
        TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2625
9.49k
        TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
2626
9.49k
        SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
2627
9.49k
        SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
2628
9.49k
        SNI* sni = NULL;
2629
2630
9.49k
        for (; ctx_sni; ctx_sni = ctx_sni->next) {
2631
0
            if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2632
0
                sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
2633
2634
0
                if (sni) {
2635
0
                    if (sni->status != WOLFSSL_SNI_NO_MATCH)
2636
0
                        continue;
2637
2638
                    /* if ssl level overrides ctx level, it is ok. */
2639
0
                    if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
2640
0
                        continue;
2641
0
                }
2642
2643
0
                SendAlert(ssl, alert_fatal,
2644
0
                          IsAtLeastTLSv1_3(ssl->version)
2645
0
                              ? missing_extension
2646
0
                              : handshake_failure);
2647
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2648
0
                return SNI_ABSENT_ERROR;
2649
0
            }
2650
0
        }
2651
2652
9.49k
        for (; ssl_sni; ssl_sni = ssl_sni->next) {
2653
0
            if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2654
0
                if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
2655
0
                    continue;
2656
2657
0
                SendAlert(ssl, alert_fatal,
2658
0
                          IsAtLeastTLSv1_3(ssl->version)
2659
0
                              ? missing_extension
2660
0
                              : handshake_failure);
2661
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2662
0
                return SNI_ABSENT_ERROR;
2663
0
            }
2664
0
        }
2665
9.49k
    #endif /* NO_WOLFSSL_SERVER */
2666
9.49k
    }
2667
2668
10.2k
    return 0;
2669
10.2k
}
2670
2671
int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
2672
                                                                     void* heap)
2673
28
{
2674
28
    TLSX* extension;
2675
28
    SNI* sni = NULL;
2676
2677
28
    if (extensions == NULL || data == NULL)
2678
0
        return BAD_FUNC_ARG;
2679
2680
28
    if ((type == WOLFSSL_SNI_HOST_NAME) && (size >= WOLFSSL_HOST_NAME_MAX))
2681
0
        return BAD_LENGTH_E;
2682
2683
28
    if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
2684
0
        return MEMORY_E;
2685
2686
28
    extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
2687
28
    if (!extension) {
2688
28
        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
2689
2690
28
        if (ret != 0) {
2691
0
            TLSX_SNI_Free(sni, heap);
2692
0
            return ret;
2693
0
        }
2694
28
    }
2695
0
    else {
2696
        /* push new SNI object to extension data. */
2697
0
        sni->next = (SNI*)extension->data;
2698
0
        extension->data = (void*)sni;
2699
2700
        /* remove duplicate SNI, there should be only one of each type. */
2701
0
        do {
2702
0
            if (sni->next && sni->next->type == type) {
2703
0
                SNI* next = sni->next;
2704
2705
0
                sni->next = next->next;
2706
0
                TLSX_SNI_Free(next, heap);
2707
2708
                /* there is no way to occur more than
2709
                 * two SNIs of the same type.
2710
                 */
2711
0
                break;
2712
0
            }
2713
0
        } while ((sni = sni->next));
2714
0
    }
2715
2716
28
    return WOLFSSL_SUCCESS;
2717
28
}
2718
2719
/* client-side needs this function when ECH is enabled */
2720
#if !defined(NO_WOLFSSL_SERVER) || defined(HAVE_ECH)
2721
/** Tells the SNI requested by the client. */
2722
word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data,
2723
        byte ignoreStatus)
2724
98
{
2725
98
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2726
98
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2727
2728
98
    if (sni && (ignoreStatus || sni->status != WOLFSSL_SNI_NO_MATCH)) {
2729
0
        switch (sni->type) {
2730
0
            case WOLFSSL_SNI_HOST_NAME:
2731
0
                if (data) {
2732
0
                    *data = sni->data.host_name;
2733
0
                    return (word16)XSTRLEN((char*)*data);
2734
0
                }
2735
0
        }
2736
0
    }
2737
2738
98
    return 0;
2739
98
}
2740
#endif
2741
2742
#ifndef NO_WOLFSSL_SERVER
2743
/** Sets the options for a SNI object. */
2744
void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
2745
0
{
2746
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2747
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2748
2749
0
    if (sni)
2750
0
        sni->options = options;
2751
0
}
2752
2753
/** Retrieves a SNI request from a client hello buffer. */
2754
int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
2755
                           byte type, byte* sni, word32* inOutSz)
2756
0
{
2757
0
    word32 offset = 0;
2758
0
    word32 len32 = 0;
2759
0
    word16 len16 = 0;
2760
2761
0
    if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
2762
0
        return INCOMPLETE_DATA;
2763
2764
    /* TLS record header */
2765
0
    if ((enum ContentType) clientHello[offset++] != handshake) {
2766
2767
        /* checking for SSLv2.0 client hello according to: */
2768
        /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
2769
0
        if ((enum HandShakeType) clientHello[++offset] == client_hello) {
2770
0
            offset += ENUM_LEN + VERSION_SZ; /* skip version */
2771
2772
0
            ato16(clientHello + offset, &len16);
2773
0
            offset += OPAQUE16_LEN;
2774
2775
0
            if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
2776
0
                return BUFFER_ERROR;
2777
2778
0
            ato16(clientHello + offset, &len16);
2779
            /* Returning SNI_UNSUPPORTED do not increment offset here */
2780
2781
0
            if (len16 != 0) /* session_id_length must be 0 */
2782
0
                return BUFFER_ERROR;
2783
2784
0
            WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2785
0
            return SNI_UNSUPPORTED;
2786
0
        }
2787
2788
0
        return BUFFER_ERROR;
2789
0
    }
2790
2791
0
    if (clientHello[offset++] != SSLv3_MAJOR)
2792
0
        return BUFFER_ERROR;
2793
2794
0
    if (clientHello[offset++] < TLSv1_MINOR) {
2795
0
        WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2796
0
        return SNI_UNSUPPORTED;
2797
0
    }
2798
2799
0
    ato16(clientHello + offset, &len16);
2800
0
    offset += OPAQUE16_LEN;
2801
2802
0
    if (offset + len16 > helloSz)
2803
0
        return INCOMPLETE_DATA;
2804
2805
    /* Handshake header */
2806
0
    if ((enum HandShakeType) clientHello[offset] != client_hello)
2807
0
        return BUFFER_ERROR;
2808
2809
0
    c24to32(clientHello + offset + 1, &len32);
2810
0
    offset += HANDSHAKE_HEADER_SZ;
2811
2812
0
    if (offset + len32 > helloSz)
2813
0
        return BUFFER_ERROR;
2814
2815
    /* client hello */
2816
0
    offset += VERSION_SZ + RAN_LEN; /* version, random */
2817
2818
0
    if (helloSz < offset + clientHello[offset])
2819
0
        return BUFFER_ERROR;
2820
2821
0
    offset += ENUM_LEN + clientHello[offset]; /* skip session id */
2822
2823
    /* cypher suites */
2824
0
    if (helloSz < offset + OPAQUE16_LEN)
2825
0
        return BUFFER_ERROR;
2826
2827
0
    ato16(clientHello + offset, &len16);
2828
0
    offset += OPAQUE16_LEN;
2829
2830
0
    if (helloSz < offset + len16)
2831
0
        return BUFFER_ERROR;
2832
2833
0
    offset += len16; /* skip cypher suites */
2834
2835
    /* compression methods */
2836
0
    if (helloSz < offset + 1)
2837
0
        return BUFFER_ERROR;
2838
2839
0
    if (helloSz < offset + clientHello[offset])
2840
0
        return BUFFER_ERROR;
2841
2842
0
    offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
2843
2844
    /* extensions */
2845
0
    if (helloSz < offset + OPAQUE16_LEN)
2846
0
        return 0; /* no extensions in client hello. */
2847
2848
0
    ato16(clientHello + offset, &len16);
2849
0
    offset += OPAQUE16_LEN;
2850
2851
0
    if (helloSz < offset + len16)
2852
0
        return BUFFER_ERROR;
2853
2854
0
    while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
2855
0
        word16 extType;
2856
0
        word16 extLen;
2857
2858
0
        ato16(clientHello + offset, &extType);
2859
0
        offset += OPAQUE16_LEN;
2860
2861
0
        ato16(clientHello + offset, &extLen);
2862
0
        offset += OPAQUE16_LEN;
2863
2864
0
        if (helloSz < offset + extLen)
2865
0
            return BUFFER_ERROR;
2866
2867
0
        if (extType != TLSX_SERVER_NAME) {
2868
0
            offset += extLen; /* skip extension */
2869
0
        } else {
2870
0
            word16 listLen;
2871
2872
0
            if (extLen < OPAQUE16_LEN)
2873
0
                return BUFFER_ERROR;
2874
2875
0
            ato16(clientHello + offset, &listLen);
2876
0
            offset += OPAQUE16_LEN;
2877
2878
0
            if (listLen != extLen - OPAQUE16_LEN)
2879
0
                return BUFFER_ERROR;
2880
2881
0
            if (helloSz < offset + listLen)
2882
0
                return BUFFER_ERROR;
2883
2884
0
            while (listLen > ENUM_LEN + OPAQUE16_LEN) {
2885
0
                byte   sniType = clientHello[offset++];
2886
0
                word16 sniLen;
2887
2888
0
                ato16(clientHello + offset, &sniLen);
2889
0
                offset += OPAQUE16_LEN;
2890
2891
0
                if (sniLen > listLen - (ENUM_LEN + OPAQUE16_LEN))
2892
0
                    return BUFFER_ERROR;
2893
2894
0
                if (helloSz < offset + sniLen)
2895
0
                    return BUFFER_ERROR;
2896
2897
0
                if (sniType != type) {
2898
0
                    offset  += sniLen;
2899
0
                    listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
2900
0
                    continue;
2901
0
                }
2902
2903
0
                *inOutSz = min(sniLen, *inOutSz);
2904
0
                XMEMCPY(sni, clientHello + offset, *inOutSz);
2905
2906
0
                return WOLFSSL_SUCCESS;
2907
0
            }
2908
0
        }
2909
2910
0
        len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
2911
0
    }
2912
2913
0
    return len16 ? BUFFER_ERROR : 0;
2914
0
}
2915
2916
#endif
2917
2918
0
#define SNI_FREE_ALL     TLSX_SNI_FreeAll
2919
#define SNI_GET_SIZE     TLSX_SNI_GetSize
2920
0
#define SNI_WRITE        TLSX_SNI_Write
2921
0
#define SNI_PARSE        TLSX_SNI_Parse
2922
0
#define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
2923
2924
#else
2925
2926
#define SNI_FREE_ALL(list, heap) WC_DO_NOTHING
2927
#define SNI_GET_SIZE(list)     0
2928
#define SNI_WRITE(a, b)        0
2929
#define SNI_PARSE(a, b, c, d)  0
2930
#define SNI_VERIFY_PARSE(a, b) 0
2931
2932
#endif /* HAVE_SNI */
2933
2934
/******************************************************************************/
2935
/* Trusted CA Key Indication                                                  */
2936
/******************************************************************************/
2937
2938
#ifdef HAVE_TRUSTED_CA
2939
2940
/** Creates a new TCA object. */
2941
static TCA* TLSX_TCA_New(byte type, const byte* id, word16 idSz, void* heap)
2942
{
2943
    TCA* tca = (TCA*)XMALLOC(sizeof(TCA), heap, DYNAMIC_TYPE_TLSX);
2944
2945
    if (tca) {
2946
        XMEMSET(tca, 0, sizeof(TCA));
2947
        tca->type = type;
2948
2949
        switch (type) {
2950
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2951
                break;
2952
2953
            #ifndef NO_SHA
2954
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2955
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2956
                if (idSz == WC_SHA_DIGEST_SIZE &&
2957
                        (tca->id =
2958
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2959
                    XMEMCPY(tca->id, id, idSz);
2960
                    tca->idSz = idSz;
2961
                }
2962
                else {
2963
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2964
                    tca = NULL;
2965
                }
2966
                break;
2967
            #endif
2968
2969
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2970
                if (idSz > 0 &&
2971
                        (tca->id =
2972
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2973
                    XMEMCPY(tca->id, id, idSz);
2974
                    tca->idSz = idSz;
2975
                }
2976
                else {
2977
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2978
                    tca = NULL;
2979
                }
2980
                break;
2981
2982
            default: /* invalid type */
2983
                XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2984
                tca = NULL;
2985
        }
2986
    }
2987
2988
    (void)heap;
2989
2990
    return tca;
2991
}
2992
2993
/** Releases a TCA object. */
2994
static void TLSX_TCA_Free(TCA* tca, void* heap)
2995
{
2996
    (void)heap;
2997
2998
    if (tca) {
2999
        XFREE(tca->id, heap, DYNAMIC_TYPE_TLSX);
3000
        XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
3001
    }
3002
}
3003
3004
/** Releases all TCA objects in the provided list. */
3005
static void TLSX_TCA_FreeAll(TCA* list, void* heap)
3006
{
3007
    TCA* tca;
3008
3009
    while ((tca = list)) {
3010
        list = tca->next;
3011
        TLSX_TCA_Free(tca, heap);
3012
    }
3013
}
3014
3015
/** Tells the buffered size of the TCA objects in a list. */
3016
static word16 TLSX_TCA_GetSize(TCA* list)
3017
{
3018
    TCA* tca;
3019
    word32 length = OPAQUE16_LEN; /* list length */
3020
3021
    while ((tca = list)) {
3022
        list = tca->next;
3023
3024
        length += ENUM_LEN; /* tca type */
3025
3026
        switch (tca->type) {
3027
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
3028
                break;
3029
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3030
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3031
                length += tca->idSz;
3032
                break;
3033
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3034
                length += OPAQUE16_LEN + tca->idSz;
3035
                break;
3036
        }
3037
3038
        if (length > WOLFSSL_MAX_16BIT) {
3039
            return 0;
3040
        }
3041
    }
3042
3043
    return (word16)length;
3044
}
3045
3046
/** Writes the TCA objects of a list in a buffer. */
3047
static word16 TLSX_TCA_Write(TCA* list, byte* output)
3048
{
3049
    TCA* tca;
3050
    word16 offset = OPAQUE16_LEN; /* list length offset */
3051
3052
    while ((tca = list)) {
3053
        list = tca->next;
3054
3055
        output[offset++] = tca->type; /* tca type */
3056
3057
        switch (tca->type) {
3058
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
3059
                break;
3060
            #ifndef NO_SHA
3061
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3062
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3063
                if (tca->id != NULL) {
3064
                    XMEMCPY(output + offset, tca->id, tca->idSz);
3065
                    offset += tca->idSz;
3066
                }
3067
                else {
3068
                    /* ID missing. Set to an empty string. */
3069
                    c16toa(0, output + offset);
3070
                    offset += OPAQUE16_LEN;
3071
                }
3072
                break;
3073
            #endif
3074
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3075
                if (tca->id != NULL) {
3076
                    c16toa(tca->idSz, output + offset); /* tca length */
3077
                    offset += OPAQUE16_LEN;
3078
                    XMEMCPY(output + offset, tca->id, tca->idSz);
3079
                    offset += tca->idSz;
3080
                }
3081
                else {
3082
                    /* ID missing. Set to an empty string. */
3083
                    c16toa(0, output + offset);
3084
                    offset += OPAQUE16_LEN;
3085
                }
3086
                break;
3087
            default:
3088
                /* ID unknown. Set to an empty string. */
3089
                c16toa(0, output + offset);
3090
                offset += OPAQUE16_LEN;
3091
        }
3092
    }
3093
3094
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
3095
3096
    return offset;
3097
}
3098
3099
#ifndef NO_WOLFSSL_SERVER
3100
static TCA* TLSX_TCA_Find(TCA *list, byte type, const byte* id, word16 idSz)
3101
{
3102
    TCA* tca = list;
3103
3104
    while (tca) {
3105
        if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED)
3106
            break;
3107
        if (tca->type == type && idSz == tca->idSz &&
3108
                XMEMCMP(id, tca->id, idSz) == 0)
3109
            break;
3110
        tca = tca->next;
3111
    }
3112
3113
    return tca;
3114
}
3115
#endif /* NO_WOLFSSL_SERVER */
3116
3117
/** Parses a buffer of TCA extensions. */
3118
static int TLSX_TCA_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3119
                          byte isRequest)
3120
{
3121
#ifndef NO_WOLFSSL_SERVER
3122
    word16 size = 0;
3123
    word16 offset = 0;
3124
#endif
3125
3126
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
3127
3128
    if (!extension)
3129
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_TRUSTED_CA_KEYS);
3130
3131
    if (!isRequest) {
3132
        #ifndef NO_WOLFSSL_CLIENT
3133
            if (!extension || !extension->data)
3134
                return TLSX_HandleUnsupportedExtension(ssl);
3135
3136
            if (length > 0)
3137
                return BUFFER_ERROR; /* TCA response MUST be empty. */
3138
3139
            /* Set the flag that we're good for keys */
3140
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
3141
3142
            return 0;
3143
        #endif
3144
    }
3145
3146
#ifndef NO_WOLFSSL_SERVER
3147
    if (!extension || !extension->data) {
3148
        /* Skipping, TCA not enabled at server side. */
3149
        return 0;
3150
    }
3151
3152
    if (OPAQUE16_LEN > length)
3153
        return BUFFER_ERROR;
3154
3155
    ato16(input, &size);
3156
    offset += OPAQUE16_LEN;
3157
3158
    /* validating tca list length */
3159
    if (length != OPAQUE16_LEN + size)
3160
        return BUFFER_ERROR;
3161
3162
    for (size = 0; offset < length; offset += size) {
3163
        TCA *tca = NULL;
3164
        byte type;
3165
        const byte* id = NULL;
3166
        word16 idSz = 0;
3167
3168
        if (offset + ENUM_LEN > length)
3169
            return BUFFER_ERROR;
3170
3171
        type = input[offset++];
3172
3173
        switch (type) {
3174
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
3175
                break;
3176
            #ifndef NO_SHA
3177
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3178
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3179
                if (offset + WC_SHA_DIGEST_SIZE > length)
3180
                    return BUFFER_ERROR;
3181
                idSz = WC_SHA_DIGEST_SIZE;
3182
                id = input + offset;
3183
                offset += idSz;
3184
                break;
3185
            #endif
3186
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3187
                if (offset + OPAQUE16_LEN > length)
3188
                    return BUFFER_ERROR;
3189
                ato16(input + offset, &idSz);
3190
                offset += OPAQUE16_LEN;
3191
                if ((offset > length) || (idSz > length - offset))
3192
                    return BUFFER_ERROR;
3193
                id = input + offset;
3194
                offset += idSz;
3195
                break;
3196
            default:
3197
                WOLFSSL_ERROR_VERBOSE(TCA_INVALID_ID_TYPE);
3198
                return TCA_INVALID_ID_TYPE;
3199
        }
3200
3201
        /* Find the type/ID in the TCA list. */
3202
        tca = TLSX_TCA_Find((TCA*)extension->data, type, id, idSz);
3203
        if (tca != NULL) {
3204
            /* Found it. Set the response flag and break out of the loop. */
3205
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
3206
            break;
3207
        }
3208
    }
3209
#else
3210
    (void)input;
3211
#endif
3212
3213
    return 0;
3214
}
3215
3216
/* Checks to see if the server sent a response for the TCA. */
3217
static int TLSX_TCA_VerifyParse(WOLFSSL* ssl, byte isRequest)
3218
{
3219
    (void)ssl;
3220
3221
    if (!isRequest) {
3222
        /* RFC 6066 section 6 states that the server responding
3223
         * to trusted_ca_keys is optional.  Do not error out unless
3224
         * opted into with the define WOLFSSL_REQUIRE_TCA. */
3225
    #if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_REQUIRE_TCA)
3226
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
3227
3228
        if (extension && !extension->resp) {
3229
            SendAlert(ssl, alert_fatal, handshake_failure);
3230
            WOLFSSL_ERROR_VERBOSE(TCA_ABSENT_ERROR);
3231
            return TCA_ABSENT_ERROR;
3232
        }
3233
    #else
3234
        WOLFSSL_MSG("No response received for trusted_ca_keys.  Continuing.");
3235
    #endif /* !NO_WOLFSSL_CLIENT && WOLFSSL_REQUIRE_TCA */
3236
    }
3237
3238
    return 0;
3239
}
3240
3241
int TLSX_UseTrustedCA(TLSX** extensions, byte type,
3242
                    const byte* id, word16 idSz, void* heap)
3243
{
3244
    TLSX* extension;
3245
    TCA* tca = NULL;
3246
3247
    if (extensions == NULL)
3248
        return BAD_FUNC_ARG;
3249
3250
    if ((tca = TLSX_TCA_New(type, id, idSz, heap)) == NULL)
3251
        return MEMORY_E;
3252
3253
    extension = TLSX_Find(*extensions, TLSX_TRUSTED_CA_KEYS);
3254
    if (!extension) {
3255
        int ret = TLSX_Push(extensions, TLSX_TRUSTED_CA_KEYS, (void*)tca, heap);
3256
3257
        if (ret != 0) {
3258
            TLSX_TCA_Free(tca, heap);
3259
            return ret;
3260
        }
3261
    }
3262
    else {
3263
        /* push new TCA object to extension data. */
3264
        tca->next = (TCA*)extension->data;
3265
        extension->data = (void*)tca;
3266
    }
3267
3268
    return WOLFSSL_SUCCESS;
3269
}
3270
3271
#define TCA_FREE_ALL     TLSX_TCA_FreeAll
3272
#define TCA_GET_SIZE     TLSX_TCA_GetSize
3273
#define TCA_WRITE        TLSX_TCA_Write
3274
#define TCA_PARSE        TLSX_TCA_Parse
3275
#define TCA_VERIFY_PARSE TLSX_TCA_VerifyParse
3276
3277
#else /* HAVE_TRUSTED_CA */
3278
3279
0
#define TCA_FREE_ALL(list, heap) WC_DO_NOTHING
3280
#define TCA_GET_SIZE(list)     0
3281
0
#define TCA_WRITE(a, b)        0
3282
0
#define TCA_PARSE(a, b, c, d)  0
3283
0
#define TCA_VERIFY_PARSE(a, b) 0
3284
3285
#endif /* HAVE_TRUSTED_CA */
3286
3287
/******************************************************************************/
3288
/* Max Fragment Length Negotiation                                            */
3289
/******************************************************************************/
3290
3291
#ifdef HAVE_MAX_FRAGMENT
3292
3293
static word16 TLSX_MFL_Write(byte* data, byte* output)
3294
{
3295
    output[0] = data[0];
3296
3297
    return ENUM_LEN;
3298
}
3299
3300
static int TLSX_MFL_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3301
                          byte isRequest)
3302
{
3303
    if (length != ENUM_LEN)
3304
        return BUFFER_ERROR;
3305
3306
#ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3307
    (void) isRequest;
3308
#else
3309
    if (!isRequest) {
3310
        TLSX* extension;
3311
3312
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
3313
            return TLSX_HandleUnsupportedExtension(ssl);
3314
3315
        /* RFC 6066 Section 4: the server's response value must match the
3316
         * value the client requested. The request may have been configured on
3317
         * the WOLFSSL object or inherited from the WOLFSSL_CTX. */
3318
        extension = TLSX_Find(ssl->extensions, TLSX_MAX_FRAGMENT_LENGTH);
3319
        if (extension == NULL) {
3320
            extension = TLSX_Find(ssl->ctx->extensions,
3321
                    TLSX_MAX_FRAGMENT_LENGTH);
3322
        }
3323
        if (extension == NULL || extension->data == NULL ||
3324
                ((byte*)extension->data)[0] != *input) {
3325
            SendAlert(ssl, alert_fatal, illegal_parameter);
3326
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
3327
            return UNKNOWN_MAX_FRAG_LEN_E;
3328
        }
3329
    }
3330
#endif
3331
3332
    switch (*input) {
3333
        case WOLFSSL_MFL_2_8 : ssl->max_fragment =  256; break;
3334
        case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
3335
        case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
3336
        case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
3337
        case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
3338
        case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
3339
3340
        default:
3341
            SendAlert(ssl, alert_fatal, illegal_parameter);
3342
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
3343
            return UNKNOWN_MAX_FRAG_LEN_E;
3344
    }
3345
    if (ssl->session != NULL) {
3346
        ssl->session->mfl = *input;
3347
    }
3348
3349
#ifndef NO_WOLFSSL_SERVER
3350
    if (isRequest) {
3351
        int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
3352
3353
        if (ret != WOLFSSL_SUCCESS)
3354
            return ret; /* throw error */
3355
3356
        TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
3357
    }
3358
#endif
3359
3360
    return 0;
3361
}
3362
3363
int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
3364
{
3365
    byte* data = NULL;
3366
    int ret = 0;
3367
3368
    if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
3369
        return BAD_FUNC_ARG;
3370
3371
    data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
3372
    if (data == NULL)
3373
        return MEMORY_E;
3374
3375
    data[0] = mfl;
3376
3377
    ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
3378
    if (ret != 0) {
3379
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
3380
        return ret;
3381
    }
3382
3383
    return WOLFSSL_SUCCESS;
3384
}
3385
3386
3387
#define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
3388
#define MFL_GET_SIZE(data) ENUM_LEN
3389
#define MFL_WRITE          TLSX_MFL_Write
3390
#define MFL_PARSE          TLSX_MFL_Parse
3391
3392
#else
3393
3394
0
#define MFL_FREE_ALL(a, b) WC_DO_NOTHING
3395
#define MFL_GET_SIZE(a)       0
3396
0
#define MFL_WRITE(a, b)       0
3397
0
#define MFL_PARSE(a, b, c, d) 0
3398
3399
#endif /* HAVE_MAX_FRAGMENT */
3400
3401
/******************************************************************************/
3402
/* Truncated HMAC                                                             */
3403
/******************************************************************************/
3404
3405
#ifdef HAVE_TRUNCATED_HMAC
3406
3407
static int TLSX_THM_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3408
                          byte isRequest)
3409
{
3410
    if (length != 0 || input == NULL)
3411
        return BUFFER_ERROR;
3412
3413
    if (!isRequest) {
3414
    #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3415
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
3416
            return TLSX_HandleUnsupportedExtension(ssl);
3417
    #endif
3418
    }
3419
    else {
3420
        #ifndef NO_WOLFSSL_SERVER
3421
            int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
3422
3423
            if (ret != WOLFSSL_SUCCESS)
3424
                return ret; /* throw error */
3425
3426
            TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
3427
        #endif
3428
    }
3429
3430
    ssl->truncated_hmac = 1;
3431
3432
    return 0;
3433
}
3434
3435
int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
3436
{
3437
    int ret = 0;
3438
3439
    if (extensions == NULL)
3440
        return BAD_FUNC_ARG;
3441
3442
    ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
3443
    if (ret != 0)
3444
        return ret;
3445
3446
    return WOLFSSL_SUCCESS;
3447
}
3448
3449
#define THM_PARSE TLSX_THM_Parse
3450
3451
#else
3452
3453
0
#define THM_PARSE(a, b, c, d) 0
3454
3455
#endif /* HAVE_TRUNCATED_HMAC */
3456
3457
/******************************************************************************/
3458
/* Certificate Status Request                                                 */
3459
/******************************************************************************/
3460
3461
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3462
3463
static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
3464
{
3465
    int i;
3466
3467
    switch (csr->status_type) {
3468
        case WOLFSSL_CSR_OCSP:
3469
            /* Requests are stored at the certificate's position in the chain,
3470
             * not packed: ProcessChainOCSPRequest() writes
3471
             * csr->request.ocsp[i] with i counting from 1 for the first
3472
             * intermediate, while csr->requests is a count. Bounding the free
3473
             * by that count leaves the tail entries allocated and unreachable
3474
             * whenever it is lower than the highest index written. Walk the
3475
             * whole array instead; FreeOcspRequest() is a no-op on a request
3476
             * that was never populated. */
3477
            for (i = 0; i < MAX_CERT_EXTENSIONS; i++) {
3478
                FreeOcspRequest(&csr->request.ocsp[i]);
3479
            }
3480
        break;
3481
    }
3482
#ifdef WOLFSSL_TLS13
3483
    for (i = 0; i < MAX_CERT_EXTENSIONS; i++) {
3484
        if (csr->responses[i].buffer != NULL) {
3485
            XFREE(csr->responses[i].buffer, heap,
3486
                DYNAMIC_TYPE_TMP_BUFFER);
3487
        }
3488
    }
3489
#endif
3490
    XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3491
    (void)heap;
3492
}
3493
3494
word16 TLSX_CSR_GetSize_ex(CertificateStatusRequest* csr, byte isRequest,
3495
                                                             int idx)
3496
{
3497
    word32 size = 0;
3498
3499
    /* shut up compiler warnings */
3500
    (void) csr; (void) isRequest;
3501
#ifndef NO_WOLFSSL_CLIENT
3502
    if (isRequest) {
3503
        switch (csr->status_type) {
3504
            case WOLFSSL_CSR_OCSP:
3505
                size += ENUM_LEN + 2 * OPAQUE16_LEN;
3506
3507
                if (csr->request.ocsp[0].nonceSz)
3508
                    size += OCSP_NONCE_EXT_SZ;
3509
            break;
3510
        }
3511
    }
3512
#endif
3513
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3514
    if (!isRequest && csr->ssl != NULL && IsAtLeastTLSv1_3(csr->ssl->version)) {
3515
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3516
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3517
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3518
            if (WOLFSSL_MAX_16BIT - OPAQUE8_LEN - OPAQUE24_LEN <
3519
                    csr->ssl->ocspCsrResp[idx].length) {
3520
                return 0;
3521
            }
3522
            size = OPAQUE8_LEN + OPAQUE24_LEN +
3523
                    csr->ssl->ocspCsrResp[idx].length;
3524
            return (word16)size;
3525
        }
3526
        if (WOLFSSL_MAX_16BIT - OPAQUE8_LEN - OPAQUE24_LEN <
3527
                csr->responses[idx].length) {
3528
            return 0;
3529
        }
3530
        size = OPAQUE8_LEN + OPAQUE24_LEN + csr->responses[idx].length;
3531
        return (word16)size;
3532
    }
3533
#else
3534
    (void)idx;
3535
#endif
3536
    return (word16)size;
3537
}
3538
3539
#if (defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER))
3540
int TLSX_CSR_SetResponseWithStatusCB(WOLFSSL *ssl)
3541
{
3542
    WOLFSSL_OCSP *ocsp;
3543
    int ret;
3544
3545
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3546
        return BAD_FUNC_ARG;
3547
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3548
    if (ocsp == NULL || ocsp->statusCb == NULL)
3549
        return BAD_FUNC_ARG;
3550
    ret = ocsp->statusCb(ssl, ocsp->statusCbArg);
3551
    switch (ret) {
3552
        case WOLFSSL_OCSP_STATUS_CB_OK: {
3553
            size_t i;
3554
            for (i = 0; i < XELEM_CNT(ssl->ocspCsrResp); i++) {
3555
                if (ssl->ocspCsrResp[i].length > 0) {
3556
                    /* ack the extension, status cb provided the response in
3557
                     * ssl->ocspCsrResp */
3558
                    TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3559
                    ssl->status_request = WOLFSSL_CSR_OCSP;
3560
                    break;
3561
                }
3562
            }
3563
            ret = 0;
3564
            break;
3565
        }
3566
        case WOLFSSL_OCSP_STATUS_CB_NOACK:
3567
            /* suppressing as not critical */
3568
            ret = 0;
3569
            break;
3570
        case WOLFSSL_OCSP_STATUS_CB_ALERT_FATAL:
3571
        default:
3572
            ret = WOLFSSL_FATAL_ERROR;
3573
            break;
3574
    }
3575
    return ret;
3576
}
3577
3578
static int TLSX_CSR_WriteWithStatusCB(CertificateStatusRequest* csr,
3579
    byte* output, int idx)
3580
{
3581
    WOLFSSL *ssl = csr->ssl;
3582
    WOLFSSL_OCSP *ocsp;
3583
    word16 offset = 0;
3584
    byte *response;
3585
    int respSz;
3586
3587
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3588
        return BAD_FUNC_ARG;
3589
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3590
    if (ocsp == NULL || ocsp->statusCb == NULL)
3591
        return BAD_FUNC_ARG;
3592
    response = ssl->ocspCsrResp[idx].buffer;
3593
    respSz = ssl->ocspCsrResp[idx].length;
3594
    if (response == NULL || respSz == 0)
3595
        return BAD_FUNC_ARG;
3596
    output[offset++] = WOLFSSL_CSR_OCSP;
3597
    c32to24(respSz, output + offset);
3598
    offset += OPAQUE24_LEN;
3599
    XMEMCPY(output + offset, response, respSz);
3600
    return offset + respSz;
3601
}
3602
#endif /* (TLS13 && !NO_WOLFSLL_SERVER) */
3603
3604
static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
3605
{
3606
    return TLSX_CSR_GetSize_ex(csr, isRequest, 0);
3607
}
3608
3609
int TLSX_CSR_Write_ex(CertificateStatusRequest* csr, byte* output,
3610
                          byte isRequest, int idx)
3611
{
3612
    /* shut up compiler warnings */
3613
    (void) csr; (void) output; (void) isRequest;
3614
3615
#ifndef NO_WOLFSSL_CLIENT
3616
    if (isRequest) {
3617
        int ret = 0;
3618
        word16 offset = 0;
3619
        word16 length = 0;
3620
3621
        /* type */
3622
        output[offset++] = csr->status_type;
3623
3624
        switch (csr->status_type) {
3625
            case WOLFSSL_CSR_OCSP:
3626
                /* responder id list */
3627
                c16toa(0, output + offset);
3628
                offset += OPAQUE16_LEN;
3629
3630
                /* request extensions */
3631
                if (csr->request.ocsp[0].nonceSz) {
3632
                    ret = (int)EncodeOcspRequestExtensions(&csr->request.ocsp[0],
3633
                                                 output + offset + OPAQUE16_LEN,
3634
                                                 OCSP_NONCE_EXT_SZ);
3635
3636
                    if (ret > 0) {
3637
                        length = (word16)ret;
3638
                    }
3639
                    else {
3640
                        return ret;
3641
                    }
3642
                }
3643
3644
                c16toa(length, output + offset);
3645
                offset += OPAQUE16_LEN + length;
3646
3647
            break;
3648
        }
3649
3650
        return (int)offset;
3651
    }
3652
#endif
3653
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3654
    if (!isRequest && csr->ssl != NULL && IsAtLeastTLSv1_3(csr->ssl->version)) {
3655
        word16 offset = 0;
3656
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3657
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3658
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3659
            return TLSX_CSR_WriteWithStatusCB(csr, output, idx);
3660
        }
3661
        output[offset++] = csr->status_type;
3662
        c32to24(csr->responses[idx].length, output + offset);
3663
        offset += OPAQUE24_LEN;
3664
        XMEMCPY(output + offset, csr->responses[idx].buffer,
3665
                                        csr->responses[idx].length);
3666
        offset += (word16)csr->responses[idx].length;
3667
        return offset;
3668
    }
3669
#else
3670
    (void)idx;
3671
#endif
3672
3673
    return 0;
3674
}
3675
3676
static int TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
3677
                          byte isRequest)
3678
{
3679
    return TLSX_CSR_Write_ex(csr, output, isRequest, 0);
3680
}
3681
3682
#if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
3683
    defined(WOLFSSL_TLS_OCSP_MULTI)
3684
/* Process OCSP request certificate chain
3685
 *
3686
 * ssl       SSL/TLS object.
3687
 * returns 0 on success, otherwise failure.
3688
 */
3689
int ProcessChainOCSPRequest(WOLFSSL* ssl)
3690
{
3691
    DecodedCert* cert;
3692
    OcspRequest* request;
3693
    TLSX* extension;
3694
    CertificateStatusRequest* csr;
3695
    DerBuffer* chain;
3696
    word32 pos = 0;
3697
    buffer der;
3698
    int i = 1;
3699
    int ret = 0;
3700
3701
    /* use certChain if available, otherwise use peer certificate */
3702
    chain = ssl->buffers.certChain;
3703
    if (chain == NULL) {
3704
        chain = ssl->buffers.certificate;
3705
    }
3706
3707
    extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3708
    csr = extension ?
3709
                (CertificateStatusRequest*)extension->data : NULL;
3710
    if (csr == NULL)
3711
        return MEMORY_ERROR;
3712
3713
    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
3714
                                         DYNAMIC_TYPE_DCERT);
3715
    if (cert == NULL) {
3716
        return MEMORY_E;
3717
    }
3718
3719
    if (chain && chain->buffer) {
3720
        while (ret == 0 && pos + OPAQUE24_LEN < chain->length) {
3721
            if (i >= MAX_CERT_EXTENSIONS) {
3722
                WOLFSSL_MSG_EX(
3723
                    "OCSP request cert chain exceeds maximum length: "
3724
                    "i=%d, MAX_CERT_EXTENSIONS=%d", i, MAX_CERT_EXTENSIONS);
3725
                ret = MAX_CERT_EXTENSIONS_ERR;
3726
                break;
3727
            }
3728
3729
            c24to32(chain->buffer + pos, &der.length);
3730
            pos += OPAQUE24_LEN;
3731
            der.buffer = chain->buffer + pos;
3732
            pos += der.length;
3733
3734
            if (pos > chain->length)
3735
                break;
3736
            request = &csr->request.ocsp[i];
3737
            if (ret == 0) {
3738
                ret = CreateOcspRequest(ssl, request, cert,
3739
                        der.buffer, der.length);
3740
            }
3741
3742
            if (ret == 0) {
3743
                ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
3744
                                       request, &csr->responses[i], ssl);
3745
                /* Suppressing soft-fail responder errors. OCSP_CERT_REVOKED
3746
                 * is an explicit positive assertion of revocation and must
3747
                 * not be ignored. OCSP_NO_URL just means there is no
3748
                 * responder to staple from, and OCSP_INVALID_STATUS covers
3749
                 * every other result the stapler could not turn into a usable
3750
                 * response - an unreachable responder, or a cached entry with
3751
                 * no raw response kept; stapling stays best-effort. */
3752
                if (ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) ||
3753
                    ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL) ||
3754
                    ret == WC_NO_ERR_TRACE(OCSP_INVALID_STATUS) ||
3755
                    ret == WC_NO_ERR_TRACE(OCSP_NO_URL)) {
3756
                    ret = 0;
3757
                }
3758
                i++;
3759
                csr->requests++;
3760
            }
3761
        }
3762
    }
3763
    XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3764
3765
    return ret;
3766
}
3767
#endif
3768
3769
static int TLSX_CSR_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3770
                          byte isRequest)
3771
{
3772
    int ret;
3773
#if !defined(NO_WOLFSSL_SERVER)
3774
    byte status_type;
3775
    word16 size = 0;
3776
#endif
3777
3778
#if !defined(NO_WOLFSSL_CLIENT)
3779
    OcspRequest* request;
3780
    TLSX* extension;
3781
    CertificateStatusRequest* csr;
3782
#endif
3783
3784
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
3785
 || !defined(NO_WOLFSSL_SERVER)
3786
    word32 offset = 0;
3787
#endif
3788
3789
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
3790
    word32 resp_length = 0;
3791
#endif
3792
3793
    /* shut up compiler warnings */
3794
    (void) ssl; (void) input;
3795
3796
    if (!isRequest) {
3797
#ifndef NO_WOLFSSL_CLIENT
3798
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3799
        csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3800
3801
        if (!csr) {
3802
            /* look at context level */
3803
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
3804
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3805
3806
            if (!csr) /* unexpected extension */
3807
                return TLSX_HandleUnsupportedExtension(ssl);
3808
3809
            /* enable extension at ssl level */
3810
            ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
3811
                                     csr->status_type, csr->options, ssl,
3812
                                     ssl->heap, ssl->devId);
3813
            if (ret != WOLFSSL_SUCCESS)
3814
                return ret == 0 ? -1 : ret;
3815
3816
            switch (csr->status_type) {
3817
                case WOLFSSL_CSR_OCSP:
3818
                    /* propagate nonce */
3819
                    if (csr->request.ocsp[0].nonceSz) {
3820
                        request =
3821
                            (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
3822
3823
                        if (request) {
3824
                            XMEMCPY(request->nonce, csr->request.ocsp[0].nonce,
3825
                                        (size_t)csr->request.ocsp[0].nonceSz);
3826
                            request->nonceSz = csr->request.ocsp[0].nonceSz;
3827
                        }
3828
                    }
3829
                break;
3830
            }
3831
        }
3832
3833
        ssl->status_request = 1;
3834
3835
    #ifdef WOLFSSL_TLS13
3836
        if (ssl->options.tls1_3) {
3837
            /* Get the new extension potentially created above. */
3838
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3839
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3840
            if (csr == NULL)
3841
                return MEMORY_ERROR;
3842
3843
            ret = 0;
3844
            if (OPAQUE8_LEN + OPAQUE24_LEN > length)
3845
                ret = BUFFER_ERROR;
3846
            if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP) {
3847
                ret = BAD_CERTIFICATE_STATUS_ERROR;
3848
                WOLFSSL_ERROR_VERBOSE(ret);
3849
            }
3850
            if (ret == 0) {
3851
                c24to32(input + offset, &resp_length);
3852
                offset += OPAQUE24_LEN;
3853
                if (offset + resp_length != length)
3854
                    ret = BUFFER_ERROR;
3855
            }
3856
            if (ret == 0) {
3857
                if (ssl->response_idx < (1 + MAX_CHAIN_DEPTH))
3858
                    csr->responses[ssl->response_idx].buffer =
3859
                    (byte*)XMALLOC(resp_length, ssl->heap,
3860
                        DYNAMIC_TYPE_TMP_BUFFER);
3861
                else
3862
                    ret = BAD_FUNC_ARG;
3863
3864
                if (ret == 0 &&
3865
                        csr->responses[ssl->response_idx].buffer == NULL)
3866
                    ret = MEMORY_ERROR;
3867
            }
3868
            if (ret == 0) {
3869
                XMEMCPY(csr->responses[ssl->response_idx].buffer,
3870
                                            input + offset, resp_length);
3871
                csr->responses[ssl->response_idx].length = resp_length;
3872
            }
3873
3874
            return ret;
3875
        }
3876
        else
3877
    #endif
3878
        {
3879
            /* extension_data MUST be empty. */
3880
            return length ? BUFFER_ERROR : 0;
3881
        }
3882
#endif
3883
    }
3884
    else {
3885
#ifndef NO_WOLFSSL_SERVER
3886
        if (length == 0)
3887
            return 0;
3888
3889
        status_type = input[offset++];
3890
3891
        switch (status_type) {
3892
            case WOLFSSL_CSR_OCSP: {
3893
3894
                /* skip responder_id_list */
3895
                if ((int)(length - offset) < OPAQUE16_LEN)
3896
                    return BUFFER_ERROR;
3897
3898
                ato16(input + offset, &size);
3899
                offset += OPAQUE16_LEN + size;
3900
3901
                /* skip request_extensions */
3902
                if ((int)(length - offset) < OPAQUE16_LEN)
3903
                    return BUFFER_ERROR;
3904
3905
                ato16(input + offset, &size);
3906
                offset += OPAQUE16_LEN + size;
3907
3908
                if (offset > length)
3909
                    return BUFFER_ERROR;
3910
3911
                /* is able to send OCSP response? */
3912
                if (SSL_CM(ssl) == NULL || !SSL_CM(ssl)->ocspStaplingEnabled)
3913
                    return 0;
3914
            }
3915
            break;
3916
3917
            /* unknown status type */
3918
            default:
3919
                return 0;
3920
        }
3921
3922
        /* if using status_request and already sending it, skip this one */
3923
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3924
        if (ssl->status_request_v2)
3925
            return 0;
3926
        #endif
3927
3928
        /* accept the first good status_type and return */
3929
        ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
3930
                                                 0, ssl, ssl->heap, ssl->devId);
3931
        if (ret != WOLFSSL_SUCCESS)
3932
            return ret == 0 ? -1 : ret; /* throw error */
3933
3934
        TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3935
        ssl->status_request = status_type;
3936
#endif
3937
    }
3938
3939
    return 0;
3940
}
3941
3942
int TLSX_CSR_InitRequest_ex(TLSX* extensions, DecodedCert* cert,
3943
                                                            void* heap, int idx)
3944
{
3945
     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3946
    CertificateStatusRequest* csr = extension ?
3947
        (CertificateStatusRequest*)extension->data : NULL;
3948
    int ret = 0;
3949
3950
    if (csr) {
3951
        switch (csr->status_type) {
3952
            case WOLFSSL_CSR_OCSP: {
3953
                byte nonce[MAX_OCSP_NONCE_SZ];
3954
                int  req_cnt = idx == -1 ? csr->requests : idx;
3955
                int  nonceSz = csr->request.ocsp[0].nonceSz;
3956
                OcspRequest* request;
3957
3958
                request = &csr->request.ocsp[req_cnt];
3959
                if (request->serial != NULL) {
3960
                    /* clear request contents before reuse */
3961
                    FreeOcspRequest(request);
3962
                    if (csr->requests > 0)
3963
                        csr->requests--;
3964
                }
3965
                /* preserve nonce */
3966
                XMEMCPY(nonce, csr->request.ocsp->nonce, (size_t)nonceSz);
3967
3968
                if (req_cnt < MAX_CERT_EXTENSIONS) {
3969
                    if ((ret = InitOcspRequest(request, cert, 0, heap)) != 0)
3970
                        return ret;
3971
3972
                    /* restore nonce */
3973
                    XMEMCPY(csr->request.ocsp->nonce, nonce, (size_t)nonceSz);
3974
                    request->nonceSz = nonceSz;
3975
                    csr->requests++;
3976
                }
3977
                else {
3978
                    WOLFSSL_ERROR_VERBOSE(MAX_CERT_EXTENSIONS_ERR);
3979
                    return MAX_CERT_EXTENSIONS_ERR;
3980
                }
3981
            }
3982
            break;
3983
        }
3984
    }
3985
3986
    return ret;
3987
}
3988
3989
int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
3990
{
3991
    return TLSX_CSR_InitRequest_ex(extensions, cert, heap, -1);
3992
}
3993
3994
void* TLSX_CSR_GetRequest_ex(TLSX* extensions, int idx)
3995
{
3996
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3997
    CertificateStatusRequest* csr = extension ?
3998
                              (CertificateStatusRequest*)extension->data : NULL;
3999
4000
    if (csr && csr->ssl) {
4001
        switch (csr->status_type) {
4002
            case WOLFSSL_CSR_OCSP:
4003
                if (IsAtLeastTLSv1_3(csr->ssl->version)) {
4004
                    return idx < csr->requests ? &csr->request.ocsp[idx] : NULL;
4005
                }
4006
                else {
4007
                    return idx == 0 ? &csr->request.ocsp[0] : NULL;
4008
                }
4009
        }
4010
    }
4011
4012
    return NULL;
4013
}
4014
4015
void* TLSX_CSR_GetRequest(TLSX* extensions)
4016
{
4017
    return TLSX_CSR_GetRequest_ex(extensions, 0);
4018
}
4019
4020
int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
4021
{
4022
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
4023
    CertificateStatusRequest* csr = extension ?
4024
                              (CertificateStatusRequest*)extension->data : NULL;
4025
4026
    if (csr) {
4027
        switch (csr->status_type) {
4028
            case WOLFSSL_CSR_OCSP:
4029
                if (SSL_CM(ssl)->ocspEnabled) {
4030
                    int ret;
4031
                    ret = CheckOcspRequest(SSL_CM(ssl)->ocsp,
4032
                                           &csr->request.ocsp[0], NULL, ssl);
4033
                    /* This is the client's fallback leaf lookup on the
4034
                     * verification instance, so honor the no-responder policy
4035
                     * just like the non-stapling leaf path. Default stays
4036
                     * best-effort; FAIL_IF_NOT_SUPPORTED makes it fail closed. */
4037
                    if (ret == WC_NO_ERR_TRACE(OCSP_NO_URL))
4038
                        ret = OcspNoUrlPolicy(SSL_CM(ssl));
4039
                    return ret;
4040
                }
4041
                else {
4042
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
4043
                    return OCSP_LOOKUP_FAIL;
4044
                }
4045
        }
4046
    }
4047
4048
    return 0;
4049
}
4050
4051
int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
4052
                                         byte options, WOLFSSL* ssl, void* heap,
4053
                                                                      int devId)
4054
{
4055
    CertificateStatusRequest* csr = NULL;
4056
    int ret = 0;
4057
4058
    if (!extensions || status_type != WOLFSSL_CSR_OCSP)
4059
        return BAD_FUNC_ARG;
4060
4061
    csr = (CertificateStatusRequest*)
4062
             XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
4063
    if (!csr)
4064
        return MEMORY_E;
4065
4066
    ForceZero(csr, sizeof(CertificateStatusRequest));
4067
#if defined(WOLFSSL_TLS13)
4068
    XMEMSET(csr->responses, 0, sizeof(csr->responses));
4069
#endif
4070
    csr->status_type = status_type;
4071
    csr->options     = options;
4072
    csr->ssl         = ssl;
4073
4074
    switch (csr->status_type) {
4075
        case WOLFSSL_CSR_OCSP:
4076
            if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
4077
                WC_RNG rng;
4078
4079
            #ifndef HAVE_FIPS
4080
                ret = wc_InitRng_ex(&rng, heap, devId);
4081
            #else
4082
                ret = wc_InitRng(&rng);
4083
                (void)devId;
4084
            #endif
4085
                if (ret == 0) {
4086
                    if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp[0].nonce,
4087
                                                        MAX_OCSP_NONCE_SZ) == 0)
4088
                        csr->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4089
4090
                    wc_FreeRng(&rng);
4091
                }
4092
            }
4093
        break;
4094
    }
4095
4096
    if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
4097
        XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
4098
        return ret;
4099
    }
4100
4101
    return WOLFSSL_SUCCESS;
4102
}
4103
4104
#define CSR_FREE_ALL TLSX_CSR_Free
4105
#define CSR_GET_SIZE TLSX_CSR_GetSize
4106
#define CSR_WRITE    TLSX_CSR_Write
4107
#define CSR_PARSE    TLSX_CSR_Parse
4108
4109
#else
4110
4111
0
#define CSR_FREE_ALL(data, heap) WC_DO_NOTHING
4112
#define CSR_GET_SIZE(a, b)    0
4113
0
#define CSR_WRITE(a, b, c)    0
4114
0
#define CSR_PARSE(a, b, c, d) 0
4115
4116
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
4117
4118
/******************************************************************************/
4119
/* Certificate Status Request v2                                              */
4120
/******************************************************************************/
4121
4122
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
4123
4124
static void TLSX_CSR2_FreePendingSigners(Signer *s, void* heap)
4125
{
4126
    Signer* next;
4127
    while(s) {
4128
        next = s->next;
4129
        FreeSigner(s, heap);
4130
        s = next;
4131
    }
4132
}
4133
static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
4134
{
4135
    CertificateStatusRequestItemV2* next;
4136
4137
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, heap);
4138
    for (; csr2; csr2 = next) {
4139
        next = csr2->next;
4140
4141
        switch (csr2->status_type) {
4142
            case WOLFSSL_CSR2_OCSP:
4143
            case WOLFSSL_CSR2_OCSP_MULTI:
4144
                while(csr2->requests--)
4145
                    FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
4146
            break;
4147
        }
4148
4149
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4150
    }
4151
    (void)heap;
4152
}
4153
4154
static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
4155
                                                                 byte isRequest)
4156
{
4157
    word32 size = 0;
4158
4159
    /* shut up compiler warnings */
4160
    (void) csr2; (void) isRequest;
4161
4162
#ifndef NO_WOLFSSL_CLIENT
4163
    if (isRequest) {
4164
        CertificateStatusRequestItemV2* next;
4165
4166
        for (size = OPAQUE16_LEN; csr2; csr2 = next) {
4167
            next = csr2->next;
4168
4169
            switch (csr2->status_type) {
4170
                case WOLFSSL_CSR2_OCSP:
4171
                case WOLFSSL_CSR2_OCSP_MULTI:
4172
                    size += ENUM_LEN + 3 * OPAQUE16_LEN;
4173
4174
                    if (csr2->request.ocsp[0].nonceSz)
4175
                        size += OCSP_NONCE_EXT_SZ;
4176
                break;
4177
            }
4178
4179
            if (size > WOLFSSL_MAX_16BIT) {
4180
                return 0;
4181
            }
4182
        }
4183
    }
4184
#endif
4185
4186
    return (word16)size;
4187
}
4188
4189
static int TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
4190
                                                   byte* output, byte isRequest)
4191
{
4192
    /* shut up compiler warnings */
4193
    (void) csr2; (void) output; (void) isRequest;
4194
4195
#ifndef NO_WOLFSSL_CLIENT
4196
    if (isRequest) {
4197
        int ret = 0;
4198
        word16 offset;
4199
        word16 length;
4200
4201
        for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
4202
            /* status_type */
4203
            output[offset++] = csr2->status_type;
4204
4205
            /* request */
4206
            switch (csr2->status_type) {
4207
                case WOLFSSL_CSR2_OCSP:
4208
                case WOLFSSL_CSR2_OCSP_MULTI:
4209
                    /* request_length */
4210
                    length = 2 * OPAQUE16_LEN;
4211
4212
                    if (csr2->request.ocsp[0].nonceSz)
4213
                        length += OCSP_NONCE_EXT_SZ;
4214
4215
                    c16toa(length, output + offset);
4216
                    offset += OPAQUE16_LEN;
4217
4218
                    /* responder id list */
4219
                    c16toa(0, output + offset);
4220
                    offset += OPAQUE16_LEN;
4221
4222
                    /* request extensions */
4223
                    length = 0;
4224
4225
                    if (csr2->request.ocsp[0].nonceSz) {
4226
                        ret = (int)EncodeOcspRequestExtensions(
4227
                                                 &csr2->request.ocsp[0],
4228
                                                 output + offset + OPAQUE16_LEN,
4229
                                                 OCSP_NONCE_EXT_SZ);
4230
4231
                        if (ret > 0) {
4232
                            length = (word16)ret;
4233
                        }
4234
                        else {
4235
                            return ret;
4236
                        }
4237
                    }
4238
4239
                    c16toa(length, output + offset);
4240
                    offset += OPAQUE16_LEN + length;
4241
                break;
4242
            }
4243
        }
4244
4245
        /* list size */
4246
        c16toa(offset - OPAQUE16_LEN, output);
4247
4248
        return (int)offset;
4249
    }
4250
#endif
4251
4252
    return 0;
4253
}
4254
4255
static int TLSX_CSR2_Parse(WOLFSSL* ssl, const byte* input, word16 length,
4256
                           byte isRequest)
4257
{
4258
    int ret;
4259
4260
    /* shut up compiler warnings */
4261
    (void) ssl; (void) input;
4262
4263
    if (!isRequest) {
4264
#ifndef NO_WOLFSSL_CLIENT
4265
        TLSX* extension;
4266
        CertificateStatusRequestItemV2* csr2;
4267
4268
        /* RFC 8446 Section 4.4.2.1: a TLS 1.3 client must not act upon the
4269
         * presence of, or the information in, this extension. Return before any
4270
         * extension state is touched. TLSX_Parse() already rejects it for every
4271
         * TLS 1.3 message type that reaches this branch, so this is defence in
4272
         * depth rather than the load bearing check. */
4273
        if (IsAtLeastTLSv1_3(ssl->version))
4274
            return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
4275
4276
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4277
        csr2 = extension ?
4278
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4279
4280
        if (!csr2) {
4281
            /* look at context level */
4282
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
4283
            csr2 = extension ?
4284
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4285
4286
            if (!csr2) /* unexpected extension */
4287
                return TLSX_HandleUnsupportedExtension(ssl);
4288
4289
            /* enable extension at ssl level */
4290
            for (; csr2; csr2 = csr2->next) {
4291
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4292
                                    csr2->status_type, csr2->options, ssl->heap,
4293
                                                                    ssl->devId);
4294
                if (ret != WOLFSSL_SUCCESS)
4295
                    return ret;
4296
4297
                switch (csr2->status_type) {
4298
                    case WOLFSSL_CSR2_OCSP:
4299
                        /* followed by */
4300
                    case WOLFSSL_CSR2_OCSP_MULTI:
4301
                        /* propagate nonce */
4302
                        if (csr2->request.ocsp[0].nonceSz) {
4303
                            OcspRequest* request =
4304
                             (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
4305
                                                          csr2->status_type, 0);
4306
4307
                            if (request) {
4308
                                XMEMCPY(request->nonce,
4309
                                        csr2->request.ocsp[0].nonce,
4310
                                        (size_t)csr2->request.ocsp[0].nonceSz);
4311
4312
                                request->nonceSz =
4313
                                                  csr2->request.ocsp[0].nonceSz;
4314
                            }
4315
                        }
4316
                    break;
4317
                }
4318
            }
4319
        }
4320
4321
        ssl->status_request_v2 = 1;
4322
4323
        return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
4324
#endif
4325
    }
4326
    else {
4327
#ifndef NO_WOLFSSL_SERVER
4328
        byte   status_type;
4329
        word16 request_length;
4330
        word16 offset = 0;
4331
        word16 size = 0;
4332
4333
        /* list size */
4334
        if (offset + OPAQUE16_LEN >= length) {
4335
            return BUFFER_E;
4336
        }
4337
4338
        ato16(input + offset, &request_length);
4339
        offset += OPAQUE16_LEN;
4340
4341
        if (length - OPAQUE16_LEN != request_length)
4342
            return BUFFER_ERROR;
4343
4344
        while (length > offset) {
4345
            if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
4346
                return BUFFER_ERROR;
4347
4348
            status_type = input[offset++];
4349
4350
            ato16(input + offset, &request_length);
4351
            offset += OPAQUE16_LEN;
4352
4353
            if (length - offset < request_length)
4354
                return BUFFER_ERROR;
4355
4356
            switch (status_type) {
4357
                case WOLFSSL_CSR2_OCSP:
4358
                case WOLFSSL_CSR2_OCSP_MULTI:
4359
                    /* skip responder_id_list */
4360
                    if ((int)(length - offset) < OPAQUE16_LEN)
4361
                        return BUFFER_ERROR;
4362
4363
                    ato16(input + offset, &size);
4364
                    if (length - offset - OPAQUE16_LEN < size)
4365
                        return BUFFER_ERROR;
4366
4367
                    offset += OPAQUE16_LEN + size;
4368
                    /* skip request_extensions */
4369
                    if ((int)(length - offset) < OPAQUE16_LEN)
4370
                        return BUFFER_ERROR;
4371
4372
                    ato16(input + offset, &size);
4373
                    if (length - offset < size)
4374
                        return BUFFER_ERROR;
4375
4376
                    offset += OPAQUE16_LEN + size;
4377
                    if (offset > length)
4378
                        return BUFFER_ERROR;
4379
4380
                    /* is able to send OCSP response? */
4381
                    if (SSL_CM(ssl) == NULL
4382
                    || !SSL_CM(ssl)->ocspStaplingEnabled)
4383
                        continue;
4384
                break;
4385
4386
                default:
4387
                    /* unknown status type, skipping! */
4388
                    offset += request_length;
4389
                    continue;
4390
            }
4391
4392
            /* if using status_request and already sending it, remove it
4393
             * and prefer to use the v2 version */
4394
            #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
4395
            if (ssl->status_request) {
4396
                ssl->status_request = 0;
4397
                TLSX_Remove(&ssl->extensions, TLSX_STATUS_REQUEST, ssl->heap);
4398
            }
4399
            #endif
4400
4401
            /* TLS 1.3 servers MUST NOT act upon presence or information in
4402
             * this extension (RFC 8448 Section 4.4.2.1).
4403
             */
4404
            if (!IsAtLeastTLSv1_3(ssl->version)) {
4405
                /* accept the first good status_type and return */
4406
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4407
                                         status_type, 0, ssl->heap, ssl->devId);
4408
                if (ret != WOLFSSL_SUCCESS)
4409
                    return ret; /* throw error */
4410
4411
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
4412
                ssl->status_request_v2 = status_type;
4413
            }
4414
4415
            return 0;
4416
        }
4417
#endif
4418
    }
4419
4420
    return 0;
4421
}
4422
4423
static CertificateStatusRequestItemV2* TLSX_CSR2_GetMulti(TLSX *extensions)
4424
{
4425
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4426
    CertificateStatusRequestItemV2* csr2 = extension ?
4427
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4428
4429
    for (; csr2; csr2 = csr2->next) {
4430
        if (csr2->status_type == WOLFSSL_CSR2_OCSP_MULTI)
4431
            return csr2;
4432
    }
4433
    return NULL;
4434
}
4435
4436
int TLSX_CSR2_IsMulti(TLSX *extensions)
4437
{
4438
    return TLSX_CSR2_GetMulti(extensions) != NULL;
4439
}
4440
4441
int TLSX_CSR2_AddPendingSigner(TLSX *extensions, Signer *s)
4442
{
4443
    CertificateStatusRequestItemV2* csr2;
4444
4445
    csr2 = TLSX_CSR2_GetMulti(extensions);
4446
    if (!csr2)
4447
        return WOLFSSL_FATAL_ERROR;
4448
4449
    s->next = csr2->pendingSigners;
4450
    csr2->pendingSigners = s;
4451
    return 0;
4452
}
4453
4454
Signer* TLSX_CSR2_GetPendingSigners(TLSX *extensions)
4455
{
4456
    CertificateStatusRequestItemV2* csr2;
4457
4458
    csr2 = TLSX_CSR2_GetMulti(extensions);
4459
    if (!csr2)
4460
        return NULL;
4461
4462
    return csr2->pendingSigners;
4463
}
4464
4465
int TLSX_CSR2_ClearPendingCA(WOLFSSL *ssl)
4466
{
4467
    CertificateStatusRequestItemV2* csr2;
4468
4469
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4470
    if (csr2 == NULL)
4471
        return 0;
4472
4473
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, SSL_CM(ssl)->heap);
4474
    csr2->pendingSigners = NULL;
4475
    return 0;
4476
}
4477
4478
int TLSX_CSR2_MergePendingCA(WOLFSSL* ssl)
4479
{
4480
    CertificateStatusRequestItemV2* csr2;
4481
    Signer *s, *next;
4482
    int r = 0;
4483
4484
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4485
    if (csr2 == NULL)
4486
        return 0;
4487
4488
    s = csr2->pendingSigners;
4489
    while (s != NULL) {
4490
        next = s->next;
4491
        r = AddSigner(SSL_CM(ssl), s);
4492
        if (r != 0)
4493
            FreeSigner(s, SSL_CM(ssl)->heap);
4494
        s = next;
4495
    }
4496
    csr2->pendingSigners = NULL;
4497
    return r;
4498
}
4499
4500
int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
4501
                                                                     void* heap)
4502
{
4503
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4504
    CertificateStatusRequestItemV2* csr2 = extension ?
4505
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4506
    int ret = 0;
4507
4508
    for (; csr2; csr2 = csr2->next) {
4509
        switch (csr2->status_type) {
4510
            case WOLFSSL_CSR2_OCSP:
4511
                if (!isPeer || csr2->requests != 0)
4512
                    break;
4513
4514
                FALL_THROUGH; /* followed by */
4515
4516
            case WOLFSSL_CSR2_OCSP_MULTI: {
4517
                if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
4518
                    byte nonce[MAX_OCSP_NONCE_SZ];
4519
                    int  nonceSz = csr2->request.ocsp[0].nonceSz;
4520
4521
                    /* preserve nonce, replicating nonce of ocsp[0] */
4522
                    XMEMCPY(nonce, csr2->request.ocsp[0].nonce,
4523
                    (size_t)nonceSz);
4524
4525
                    if ((ret = InitOcspRequest(
4526
                                      &csr2->request.ocsp[csr2->requests], cert,
4527
                                                                 0, heap)) != 0)
4528
                        return ret;
4529
4530
                    /* restore nonce */
4531
                    XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
4532
                                                        nonce, (size_t)nonceSz);
4533
                    csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
4534
                    csr2->requests++;
4535
                }
4536
            }
4537
            break;
4538
        }
4539
    }
4540
4541
    (void)cert;
4542
    return ret;
4543
}
4544
4545
void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
4546
{
4547
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4548
    CertificateStatusRequestItemV2* csr2 = extension ?
4549
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4550
4551
    for (; csr2; csr2 = csr2->next) {
4552
        if (csr2->status_type == status_type) {
4553
            switch (csr2->status_type) {
4554
                case WOLFSSL_CSR2_OCSP:
4555
                    /* followed by */
4556
4557
                case WOLFSSL_CSR2_OCSP_MULTI:
4558
                    /* requests are initialized in the reverse order */
4559
                    return idx < csr2->requests
4560
                         ? &csr2->request.ocsp[csr2->requests - idx - 1]
4561
                         : NULL;
4562
            }
4563
        }
4564
    }
4565
4566
    return NULL;
4567
}
4568
4569
int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
4570
{
4571
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4572
    CertificateStatusRequestItemV2* csr2 = extension ?
4573
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4574
4575
    /* forces only the first one */
4576
    if (csr2) {
4577
        switch (csr2->status_type) {
4578
            case WOLFSSL_CSR2_OCSP:
4579
                /* followed by */
4580
4581
            case WOLFSSL_CSR2_OCSP_MULTI:
4582
                if (SSL_CM(ssl)->ocspEnabled && csr2->requests >= 1) {
4583
                    int ret;
4584
                    ret = CheckOcspRequest(SSL_CM(ssl)->ocsp,
4585
                                          &csr2->request.ocsp[csr2->requests-1],
4586
                                          NULL, ssl);
4587
                    /* This is the client's fallback leaf lookup on the
4588
                     * verification instance, so honor the no-responder policy
4589
                     * just like the non-stapling leaf path. Default stays
4590
                     * best-effort; FAIL_IF_NOT_SUPPORTED makes it fail closed. */
4591
                    if (ret == WC_NO_ERR_TRACE(OCSP_NO_URL))
4592
                        ret = OcspNoUrlPolicy(SSL_CM(ssl));
4593
                    return ret;
4594
                }
4595
                else {
4596
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
4597
                    return OCSP_LOOKUP_FAIL;
4598
                }
4599
        }
4600
    }
4601
4602
    return 0;
4603
}
4604
4605
int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
4606
                                           byte options, void* heap, int devId)
4607
{
4608
    TLSX* extension = NULL;
4609
    CertificateStatusRequestItemV2* csr2 = NULL;
4610
    int ret = 0;
4611
4612
    if (!extensions)
4613
        return BAD_FUNC_ARG;
4614
4615
    if (status_type != WOLFSSL_CSR2_OCSP
4616
    &&  status_type != WOLFSSL_CSR2_OCSP_MULTI)
4617
        return BAD_FUNC_ARG;
4618
4619
    csr2 = (CertificateStatusRequestItemV2*)
4620
       XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
4621
    if (!csr2)
4622
        return MEMORY_E;
4623
4624
    ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
4625
4626
    csr2->status_type = status_type;
4627
    csr2->options     = options;
4628
    csr2->next        = NULL;
4629
4630
    switch (csr2->status_type) {
4631
        case WOLFSSL_CSR2_OCSP:
4632
        case WOLFSSL_CSR2_OCSP_MULTI:
4633
            if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
4634
                WC_RNG rng;
4635
4636
            #ifndef HAVE_FIPS
4637
                ret = wc_InitRng_ex(&rng, heap, devId);
4638
            #else
4639
                ret = wc_InitRng(&rng);
4640
                (void)devId;
4641
            #endif
4642
                if (ret == 0) {
4643
                    if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
4644
                                                        MAX_OCSP_NONCE_SZ) == 0)
4645
                        csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4646
4647
                    wc_FreeRng(&rng);
4648
                }
4649
            }
4650
        break;
4651
    }
4652
4653
    /* append new item */
4654
    if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
4655
        CertificateStatusRequestItemV2* last =
4656
                               (CertificateStatusRequestItemV2*)extension->data;
4657
4658
        if (last == NULL) {
4659
            XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4660
            return BAD_FUNC_ARG;
4661
        }
4662
4663
        for (; last->next; last = last->next);
4664
4665
        last->next = csr2;
4666
    }
4667
    else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
4668
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4669
        return ret;
4670
    }
4671
4672
    return WOLFSSL_SUCCESS;
4673
}
4674
4675
#define CSR2_FREE_ALL TLSX_CSR2_FreeAll
4676
#define CSR2_GET_SIZE TLSX_CSR2_GetSize
4677
#define CSR2_WRITE    TLSX_CSR2_Write
4678
#define CSR2_PARSE    TLSX_CSR2_Parse
4679
4680
#else
4681
4682
0
#define CSR2_FREE_ALL(data, heap) WC_DO_NOTHING
4683
#define CSR2_GET_SIZE(a, b)    0
4684
0
#define CSR2_WRITE(a, b, c)    0
4685
0
#define CSR2_PARSE(a, b, c, d) 0
4686
4687
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
4688
4689
#if defined(HAVE_SUPPORTED_CURVES) || \
4690
    (defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES))
4691
4692
#ifdef WOLFSSL_HAVE_MLKEM
4693
/* Returns whether ML-KEM groups are supported for the given side.
4694
 *
4695
 * ML-KEM groups require side specific crypto support. The client needs to
4696
 * generate a key and decapsulate, while the server needs to encapsulate.
4697
 *
4698
 * side  The side of the connection the check is for: WOLFSSL_CLIENT_END,
4699
 *       WOLFSSL_SERVER_END or WOLFSSL_NEITHER_END when the side is not known.
4700
 * returns 1 when supported or 0 otherwise.
4701
 */
4702
static int TLSX_IsMlKemGroupSupported(int side)
4703
20.0k
{
4704
20.0k
    if (side == WOLFSSL_CLIENT_END) {
4705
17.4k
    #ifdef WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT
4706
17.4k
        return 1;
4707
    #else
4708
        return 0;
4709
    #endif
4710
17.4k
    }
4711
2.59k
    else if (side == WOLFSSL_SERVER_END) {
4712
2.59k
    #ifdef WOLFSSL_HAVE_MLKEM_SERVER_SUPPORT
4713
2.59k
        return 1;
4714
    #else
4715
        return 0;
4716
    #endif
4717
2.59k
    }
4718
0
    else {
4719
        /* Side not known - supported if either side has the crypto support. */
4720
0
    #if defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) || \
4721
0
        defined(WOLFSSL_HAVE_MLKEM_SERVER_SUPPORT)
4722
0
        return 1;
4723
    #else
4724
        return 0;
4725
    #endif
4726
0
    }
4727
20.0k
}
4728
#endif /* WOLFSSL_HAVE_MLKEM */
4729
4730
/* Returns whether this group is supported.
4731
 *
4732
 * namedGroup  The named group to check.
4733
 * side        The side of the connection the check is for: WOLFSSL_CLIENT_END,
4734
 *             WOLFSSL_SERVER_END or WOLFSSL_NEITHER_END when the side is not
4735
 *             known. Used to determine whether the local side has the crypto
4736
 *             support required to use the group (e.g. ML-KEM requires
4737
 *             decapsulation on the client and encapsulation on the server).
4738
 * returns 1 when supported or 0 otherwise.
4739
 */
4740
int TLSX_IsGroupSupported(int namedGroup, int side)
4741
{
4742
    (void)side;
4743
4744
    switch (namedGroup) {
4745
    #ifdef HAVE_FFDHE_2048
4746
        case WOLFSSL_FFDHE_2048:
4747
            break;
4748
    #endif
4749
    #ifdef HAVE_FFDHE_3072
4750
        case WOLFSSL_FFDHE_3072:
4751
            break;
4752
    #endif
4753
    #ifdef HAVE_FFDHE_4096
4754
        case WOLFSSL_FFDHE_4096:
4755
            break;
4756
    #endif
4757
    #ifdef HAVE_FFDHE_6144
4758
        case WOLFSSL_FFDHE_6144:
4759
            break;
4760
    #endif
4761
    #ifdef HAVE_FFDHE_8192
4762
        case WOLFSSL_FFDHE_8192:
4763
            break;
4764
    #endif
4765
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4766
        #ifdef HAVE_ECC_KOBLITZ
4767
        case WOLFSSL_ECC_SECP256K1:
4768
            break;
4769
        #endif
4770
        #ifndef NO_ECC_SECP
4771
        case WOLFSSL_ECC_SECP256R1:
4772
            break;
4773
        #endif /* !NO_ECC_SECP */
4774
        #ifdef HAVE_ECC_BRAINPOOL
4775
        case WOLFSSL_ECC_BRAINPOOLP256R1:
4776
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
4777
            break;
4778
        #endif
4779
        #ifdef WOLFSSL_SM2
4780
        case WOLFSSL_ECC_SM2P256V1:
4781
            break;
4782
        #endif /* WOLFSSL_SM2 */
4783
    #endif
4784
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4785
        case WOLFSSL_ECC_X25519:
4786
            break;
4787
    #endif
4788
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4789
        case WOLFSSL_ECC_X448:
4790
            break;
4791
    #endif
4792
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
4793
        #ifndef NO_ECC_SECP
4794
        case WOLFSSL_ECC_SECP384R1:
4795
            break;
4796
        #endif /* !NO_ECC_SECP */
4797
        #ifdef HAVE_ECC_BRAINPOOL
4798
        case WOLFSSL_ECC_BRAINPOOLP384R1:
4799
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
4800
            break;
4801
        #endif
4802
    #endif
4803
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
4804
        #ifndef NO_ECC_SECP
4805
        case WOLFSSL_ECC_SECP521R1:
4806
            break;
4807
        #endif /* !NO_ECC_SECP */
4808
    #endif
4809
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
4810
        #ifdef HAVE_ECC_KOBLITZ
4811
        case WOLFSSL_ECC_SECP160K1:
4812
            break;
4813
        #endif
4814
        #ifndef NO_ECC_SECP
4815
        case WOLFSSL_ECC_SECP160R1:
4816
            break;
4817
        #endif
4818
        #ifdef HAVE_ECC_SECPR2
4819
        case WOLFSSL_ECC_SECP160R2:
4820
            break;
4821
        #endif
4822
    #endif
4823
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
4824
        #ifdef HAVE_ECC_KOBLITZ
4825
        case WOLFSSL_ECC_SECP192K1:
4826
            break;
4827
        #endif
4828
        #ifndef NO_ECC_SECP
4829
        case WOLFSSL_ECC_SECP192R1:
4830
            break;
4831
        #endif
4832
    #endif
4833
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
4834
        #ifdef HAVE_ECC_KOBLITZ
4835
        case WOLFSSL_ECC_SECP224K1:
4836
            break;
4837
        #endif
4838
        #ifndef NO_ECC_SECP
4839
        case WOLFSSL_ECC_SECP224R1:
4840
            break;
4841
        #endif
4842
    #endif
4843
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
4844
        #ifdef HAVE_ECC_BRAINPOOL
4845
        case WOLFSSL_ECC_BRAINPOOLP512R1:
4846
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
4847
            break;
4848
        #endif
4849
    #endif
4850
#ifdef WOLFSSL_HAVE_MLKEM
4851
#ifndef WOLFSSL_NO_ML_KEM
4852
        #ifndef WOLFSSL_NO_ML_KEM_512
4853
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4854
            case WOLFSSL_ML_KEM_512:
4855
                return TLSX_IsMlKemGroupSupported(side);
4856
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4857
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4858
            case WOLFSSL_SECP256R1MLKEM512:
4859
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4860
            case WOLFSSL_X25519MLKEM512:
4861
            #endif /* HAVE_CURVE25519 */
4862
                return TLSX_IsMlKemGroupSupported(side);
4863
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4864
        #endif /* WOLFSSL_NO_ML_KEM_512 */
4865
        #ifndef WOLFSSL_NO_ML_KEM_768
4866
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4867
            case WOLFSSL_ML_KEM_768:
4868
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4869
            #ifdef WOLFSSL_PQC_HYBRIDS
4870
            case WOLFSSL_SECP256R1MLKEM768:
4871
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4872
            case WOLFSSL_X25519MLKEM768:
4873
            #endif /* HAVE_CURVE25519 */
4874
            #endif /* WOLFSSL_PQC_HYBRIDS */
4875
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4876
            case WOLFSSL_SECP384R1MLKEM768:
4877
            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4878
            case WOLFSSL_X448MLKEM768:
4879
            #endif /* HAVE_CURVE448 */
4880
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4881
                return TLSX_IsMlKemGroupSupported(side);
4882
        #endif /* WOLFSSL_NO_ML_KEM_768 */
4883
        #ifndef WOLFSSL_NO_ML_KEM_1024
4884
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4885
            case WOLFSSL_ML_KEM_1024:
4886
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4887
            #ifdef WOLFSSL_PQC_HYBRIDS
4888
            case WOLFSSL_SECP384R1MLKEM1024:
4889
            #endif /* WOLFSSL_PQC_HYBRIDS */
4890
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4891
            case WOLFSSL_SECP521R1MLKEM1024:
4892
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4893
                return TLSX_IsMlKemGroupSupported(side);
4894
        #endif
4895
        #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
4896
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
4897
            case WOLFSSL_P256_ML_KEM_512_OLD:
4898
            case WOLFSSL_P384_ML_KEM_768_OLD:
4899
            case WOLFSSL_P521_ML_KEM_1024_OLD:
4900
                return TLSX_IsMlKemGroupSupported(side);
4901
        #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
4902
#endif /* WOLFSSL_NO_ML_KEM */
4903
#ifdef WOLFSSL_MLKEM_KYBER
4904
        #ifdef WOLFSSL_KYBER512
4905
            case WOLFSSL_KYBER_LEVEL1:
4906
            case WOLFSSL_P256_KYBER_LEVEL1:
4907
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4908
            case WOLFSSL_X25519_KYBER_LEVEL1:
4909
        #endif
4910
        #endif
4911
        #ifdef WOLFSSL_KYBER768
4912
            case WOLFSSL_KYBER_LEVEL3:
4913
            case WOLFSSL_P384_KYBER_LEVEL3:
4914
            case WOLFSSL_P256_KYBER_LEVEL3:
4915
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4916
            case WOLFSSL_X25519_KYBER_LEVEL3:
4917
        #endif
4918
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4919
            case WOLFSSL_X448_KYBER_LEVEL3:
4920
        #endif
4921
        #endif
4922
        #ifdef WOLFSSL_KYBER1024
4923
            case WOLFSSL_KYBER_LEVEL5:
4924
            case WOLFSSL_P521_KYBER_LEVEL5:
4925
        #endif
4926
                return TLSX_IsMlKemGroupSupported(side);
4927
#endif
4928
#endif /* WOLFSSL_HAVE_MLKEM */
4929
        default:
4930
            return 0;
4931
    }
4932
4933
    return 1;
4934
}
4935
#endif
4936
4937
/******************************************************************************/
4938
/* Supported Elliptic Curves                                                  */
4939
/******************************************************************************/
4940
4941
#ifdef HAVE_SUPPORTED_CURVES
4942
4943
#if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \
4944
                       && !defined(HAVE_FFDHE) && !defined(WOLFSSL_HAVE_MLKEM)
4945
#error Elliptic Curves Extension requires Elliptic Curve Cryptography or ML-KEM groups. \
4946
       Use --enable-ecc and/or --enable-mlkem in the configure script or \
4947
       define HAVE_ECC. Alternatively use FFDHE for DH cipher suites.
4948
#endif
4949
4950
static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
4951
                                                                     void* heap)
4952
283k
{
4953
283k
    if (curve == NULL)
4954
0
        return BAD_FUNC_ARG;
4955
4956
283k
    (void)heap;
4957
4958
283k
    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
4959
283k
                                                             DYNAMIC_TYPE_TLSX);
4960
283k
    if (*curve == NULL)
4961
371
        return MEMORY_E;
4962
4963
283k
    (*curve)->name = name;
4964
283k
    (*curve)->next = NULL;
4965
4966
283k
    return 0;
4967
283k
}
4968
4969
static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
4970
9.20k
{
4971
9.20k
    if (point == NULL)
4972
0
        return BAD_FUNC_ARG;
4973
4974
9.20k
    (void)heap;
4975
4976
9.20k
    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
4977
9.20k
                                                             DYNAMIC_TYPE_TLSX);
4978
9.20k
    if (*point == NULL)
4979
17
        return MEMORY_E;
4980
4981
9.18k
    (*point)->format = format;
4982
9.18k
    (*point)->next = NULL;
4983
4984
9.18k
    return 0;
4985
9.20k
}
4986
4987
static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
4988
24.9k
{
4989
24.9k
    SupportedCurve* curve;
4990
4991
308k
    while ((curve = list)) {
4992
283k
        list = curve->next;
4993
283k
        XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
4994
283k
    }
4995
24.9k
    (void)heap;
4996
24.9k
}
4997
4998
static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
4999
9.17k
{
5000
9.17k
    PointFormat* point;
5001
5002
18.3k
    while ((point = list)) {
5003
9.17k
        list = point->next;
5004
9.17k
        XFREE(point, heap, DYNAMIC_TYPE_TLSX);
5005
9.17k
    }
5006
9.17k
    (void)heap;
5007
9.17k
}
5008
5009
static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
5010
                                                                     void* heap)
5011
264k
{
5012
264k
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
5013
5014
2.32M
    while (list) {
5015
2.32M
        if (list->name == name) {
5016
4.82k
            ret = 0; /* curve already in use */
5017
4.82k
            break;
5018
4.82k
        }
5019
5020
2.32M
        if (list->next == NULL) {
5021
259k
            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
5022
259k
            break;
5023
259k
        }
5024
5025
2.06M
        list = list->next;
5026
2.06M
    }
5027
5028
264k
    return ret;
5029
264k
}
5030
5031
static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
5032
0
{
5033
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
5034
5035
0
    while (list) {
5036
0
        if (list->format == format) {
5037
0
            ret = 0; /* format already in use */
5038
0
            break;
5039
0
        }
5040
5041
0
        if (list->next == NULL) {
5042
0
            ret = TLSX_PointFormat_New(&list->next, format, heap);
5043
0
            break;
5044
0
        }
5045
5046
0
        list = list->next;
5047
0
    }
5048
5049
0
    return ret;
5050
0
}
5051
5052
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
5053
5054
#if defined(HAVE_FFDHE) && (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5055
                                                         defined(HAVE_CURVE448))
5056
static void TLSX_SupportedCurve_ValidateRequest(const WOLFSSL* ssl,
5057
                                                const byte* semaphore)
5058
18.1k
{
5059
    /* If all pre-defined parameter types for key exchange are supported then
5060
     * always send SupportedGroups extension.
5061
     */
5062
18.1k
    (void)ssl;
5063
18.1k
    (void)semaphore;
5064
18.1k
}
5065
#else
5066
static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
5067
{
5068
    word16 i;
5069
    const Suites* suites = WOLFSSL_SUITES(ssl);
5070
5071
    for (i = 0; i < suites->suiteSz; i += 2) {
5072
        if (suites->suites[i] == TLS13_BYTE)
5073
            return;
5074
    #ifdef BUILD_TLS_SM4_GCM_SM3
5075
        if ((suites->suites[i] == CIPHER_BYTE) &&
5076
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
5077
            return;
5078
    #endif
5079
    #ifdef BUILD_TLS_SM4_CCM_SM3
5080
        if ((suites->suites[i] == CIPHER_BYTE) &&
5081
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
5082
            return;
5083
    #endif
5084
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5085
        if ((suites->suites[i] == SM_BYTE) &&
5086
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
5087
            return;
5088
    #endif
5089
        if ((suites->suites[i] == ECC_BYTE) ||
5090
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
5091
            (suites->suites[i] == CHACHA_BYTE)) {
5092
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5093
                                                          defined(HAVE_CURVE448)
5094
            return;
5095
        #endif
5096
        }
5097
        #ifdef HAVE_FFDHE
5098
        else {
5099
            return;
5100
        }
5101
        #endif
5102
    }
5103
5104
    /* turns semaphore on to avoid sending this extension. */
5105
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
5106
}
5107
#endif
5108
5109
/* Only send PointFormats if TLSv13, ECC or CHACHA cipher suite present.
5110
 */
5111
static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
5112
18.1k
{
5113
18.1k
#ifdef HAVE_FFDHE
5114
18.1k
    (void)ssl;
5115
18.1k
    (void)semaphore;
5116
#else
5117
    word16 i;
5118
    const Suites* suites = WOLFSSL_SUITES(ssl);
5119
5120
    if (suites == NULL)
5121
        return;
5122
5123
    for (i = 0; i < suites->suiteSz; i += 2) {
5124
        if (suites->suites[i] == TLS13_BYTE)
5125
            return;
5126
    #ifdef BUILD_TLS_SM4_GCM_SM3
5127
        if ((suites->suites[i] == CIPHER_BYTE) &&
5128
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
5129
            return;
5130
    #endif
5131
    #ifdef BUILD_TLS_SM4_CCM_SM3
5132
        if ((suites->suites[i] == CIPHER_BYTE) &&
5133
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
5134
            return;
5135
    #endif
5136
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5137
        if ((suites->suites[i] == SM_BYTE) &&
5138
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
5139
            return;
5140
    #endif
5141
        if ((suites->suites[i] == ECC_BYTE) ||
5142
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
5143
            (suites->suites[i] == CHACHA_BYTE)) {
5144
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5145
                                                          defined(HAVE_CURVE448)
5146
            return;
5147
        #endif
5148
        }
5149
    }
5150
   /* turns semaphore on to avoid sending this extension. */
5151
   TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
5152
#endif
5153
18.1k
}
5154
5155
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
5156
5157
#ifndef NO_WOLFSSL_SERVER
5158
5159
static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
5160
{
5161
#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5162
                                                          defined(HAVE_CURVE448)
5163
    (void)semaphore;
5164
#endif
5165
5166
    if (ssl->options.cipherSuite0 == TLS13_BYTE)
5167
        return;
5168
#ifdef BUILD_TLS_SM4_GCM_SM3
5169
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
5170
        (ssl->options.cipherSuite == TLS_SM4_GCM_SM3))
5171
        return;
5172
#endif
5173
#ifdef BUILD_TLS_SM4_CCM_SM3
5174
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
5175
        (ssl->options.cipherSuite == TLS_SM4_CCM_SM3))
5176
        return;
5177
#endif
5178
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5179
    if ((ssl->options.cipherSuite0 == SM_BYTE) &&
5180
        (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
5181
        return;
5182
#endif
5183
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5184
    if (ssl->options.cipherSuite0 == ECC_BYTE ||
5185
        ssl->options.cipherSuite0 == ECDHE_PSK_BYTE ||
5186
        ssl->options.cipherSuite0 == CHACHA_BYTE) {
5187
        return;
5188
    }
5189
#endif
5190
5191
    /* turns semaphore on to avoid sending this extension. */
5192
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
5193
}
5194
5195
#endif /* !NO_WOLFSSL_SERVER */
5196
5197
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5198
5199
static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
5200
10.4k
{
5201
10.4k
    SupportedCurve* curve;
5202
10.4k
    word16 length = OPAQUE16_LEN; /* list length */
5203
5204
207k
    while ((curve = list)) {
5205
196k
        list = curve->next;
5206
196k
        length += OPAQUE16_LEN; /* curve length */
5207
196k
    }
5208
5209
10.4k
    return length;
5210
10.4k
}
5211
5212
#endif
5213
5214
static word16 TLSX_PointFormat_GetSize(PointFormat* list)
5215
4.24k
{
5216
4.24k
    PointFormat* point;
5217
4.24k
    word16 length = ENUM_LEN; /* list length */
5218
5219
8.48k
    while ((point = list)) {
5220
4.24k
        list = point->next;
5221
4.24k
        length += ENUM_LEN; /* format length */
5222
4.24k
    }
5223
5224
4.24k
    return length;
5225
4.24k
}
5226
5227
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5228
5229
static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
5230
8.54k
{
5231
8.54k
    word16 offset = OPAQUE16_LEN;
5232
5233
167k
    while (list) {
5234
159k
        c16toa(list->name, output + offset);
5235
159k
        offset += OPAQUE16_LEN;
5236
159k
        list = list->next;
5237
159k
    }
5238
5239
8.54k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
5240
5241
8.54k
    return offset;
5242
8.54k
}
5243
5244
#endif
5245
5246
static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
5247
4.21k
{
5248
4.21k
    word16 offset = ENUM_LEN;
5249
5250
8.42k
    while (list) {
5251
4.21k
        output[offset++] = list->format;
5252
4.21k
        list = list->next;
5253
4.21k
    }
5254
5255
4.21k
    output[0] = (byte)(offset - ENUM_LEN);
5256
5257
4.21k
    return offset;
5258
4.21k
}
5259
5260
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
5261
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
5262
5263
int TLSX_SupportedCurve_Parse(const WOLFSSL* ssl, const byte* input,
5264
                              word16 length, byte isRequest, TLSX** extensions)
5265
12.3k
{
5266
12.3k
    word16 offset;
5267
12.3k
    word16 name;
5268
12.3k
    int ret = 0;
5269
12.3k
    TLSX* extension;
5270
5271
12.3k
    if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
5272
#ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
5273
        return 0;
5274
#else
5275
0
        return BUFFER_ERROR; /* servers doesn't send this extension. */
5276
0
#endif
5277
0
    }
5278
12.3k
    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
5279
2.23k
        return BUFFER_ERROR;
5280
10.1k
    ato16(input, &offset);
5281
    /* validating curve list length */
5282
10.1k
    if (length != OPAQUE16_LEN + offset)
5283
76
        return BUFFER_ERROR;
5284
10.0k
    offset = OPAQUE16_LEN;
5285
10.0k
    if (offset == length) {
5286
        /* An empty named group list is malformed (named_group_list<2..2^16-1>,
5287
         * RFC 8422 / RFC 8446). BUFFER_ERROR yields a decode_error alert (see
5288
         * TranslateErrorToAlert()). Accepting it would also make an explicit
5289
         * empty extension look absent and impose no group restriction. */
5290
12
        return BUFFER_ERROR;
5291
12
    }
5292
5293
10.0k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5294
10.0k
    if (extension == NULL) {
5295
        /* Just accept what the peer wants to use */
5296
59.9k
        for (; offset < length; offset += OPAQUE16_LEN) {
5297
50.0k
            ato16(input + offset, &name);
5298
5299
50.0k
            ret = TLSX_UseSupportedCurve(extensions, name, ssl->heap,
5300
50.0k
                                         ssl->options.side);
5301
            /* If it is BAD_FUNC_ARG then it is a group we do not support, but
5302
             * that is fine. */
5303
50.0k
            if (ret != WOLFSSL_SUCCESS &&
5304
35.2k
                    ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
5305
105
                break;
5306
49.9k
#if !defined(NO_DH) && !defined(WOLFSSL_NO_TLS12) && \
5307
49.9k
    !defined(NO_WOLFSSL_SERVER)
5308
            /* RFC 7919 Section 4: any codepoint in the FFDHE range (256..511)
5309
             * restricts DHE to named groups even when the exact group is
5310
             * unknown. Keep it so TLSX_SupportedFFDHE_Set() sees the offer;
5311
             * an unsupported name can never match a server group. */
5312
49.9k
            if (ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG) && isRequest &&
5313
35.1k
                    WOLFSSL_NAMED_GROUP_IS_FFDHE(name)) {
5314
3.28k
                TLSX* ext = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5315
3.28k
                if (ext == NULL) {
5316
354
                    SupportedCurve* curve = NULL;
5317
354
                    ret = TLSX_SupportedCurve_New(&curve, name, ssl->heap);
5318
354
                    if (ret == 0) {
5319
342
                        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS,
5320
342
                                        curve, ssl->heap);
5321
342
                        if (ret != 0)
5322
7
                            XFREE(curve, ssl->heap, DYNAMIC_TYPE_TLSX);
5323
342
                    }
5324
354
                }
5325
2.92k
                else {
5326
2.92k
                    ret = TLSX_SupportedCurve_Append(
5327
2.92k
                        (SupportedCurve*)ext->data, name, ssl->heap);
5328
2.92k
                }
5329
3.28k
                if (ret != 0)
5330
52
                    break;
5331
3.28k
            }
5332
49.9k
#endif /* !NO_DH && !WOLFSSL_NO_TLS12 && !NO_WOLFSSL_SERVER */
5333
49.9k
            ret = 0;
5334
49.9k
        }
5335
        /* All advertised groups are unsupported, so no node was added above.
5336
         * Record an empty node so suite selection still sees the restriction
5337
         * (e.g. ECC/ECDHE must not be chosen) instead of treating the
5338
         * extension as absent. */
5339
9.99k
        if (ret == 0 && isRequest &&
5340
9.84k
                TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
5341
567
            ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, NULL, ssl->heap);
5342
567
        }
5343
9.99k
    }
5344
29
    else {
5345
        /* Find the intersection with what the user has set */
5346
29
        SupportedCurve* commonCurves = NULL;
5347
101
        for (; offset < length; offset += OPAQUE16_LEN) {
5348
72
            SupportedCurve* foundCurve = (SupportedCurve*)extension->data;
5349
72
            ato16(input + offset, &name);
5350
5351
168
            while (foundCurve != NULL && foundCurve->name != name)
5352
96
                foundCurve = foundCurve->next;
5353
5354
72
            if (foundCurve != NULL) {
5355
12
                ret = commonCurves == NULL ?
5356
10
                      TLSX_SupportedCurve_New(&commonCurves, name, ssl->heap) :
5357
12
                      TLSX_SupportedCurve_Append(commonCurves, name, ssl->heap);
5358
12
                if (ret != 0)
5359
0
                    break;
5360
12
            }
5361
60
#if !defined(NO_DH) && !defined(WOLFSSL_NO_TLS12) && \
5362
60
    !defined(NO_WOLFSSL_SERVER)
5363
            /* RFC 7919 Section 4 (see comment above). */
5364
60
            else if (isRequest && WOLFSSL_NAMED_GROUP_IS_FFDHE(name) &&
5365
8
                    !TLSX_IsGroupSupported(name, ssl->options.side)) {
5366
5
                ret = commonCurves == NULL ?
5367
4
                      TLSX_SupportedCurve_New(&commonCurves, name, ssl->heap) :
5368
5
                      TLSX_SupportedCurve_Append(commonCurves, name, ssl->heap);
5369
5
                if (ret != 0)
5370
0
                    break;
5371
5
            }
5372
72
#endif /* !NO_DH && !WOLFSSL_NO_TLS12 && !NO_WOLFSSL_SERVER */
5373
72
        }
5374
        /* If no common curves return error. In TLS 1.3 we can still try to save
5375
         * this by using HRR. */
5376
29
        if (ret == 0 && commonCurves == NULL &&
5377
15
                !IsAtLeastTLSv1_3(ssl->version))
5378
0
            ret = ECC_CURVE_ERROR;
5379
29
        if (ret == 0) {
5380
            /* Now swap out the curves in the extension */
5381
29
            TLSX_SupportedCurve_FreeAll((SupportedCurve*)extension->data,
5382
29
                                        ssl->heap);
5383
29
            extension->data = commonCurves;
5384
29
            commonCurves = NULL;
5385
29
        }
5386
29
        TLSX_SupportedCurve_FreeAll(commonCurves, ssl->heap);
5387
29
    }
5388
5389
10.0k
    return ret;
5390
10.0k
}
5391
#endif
5392
5393
#if !defined(NO_WOLFSSL_SERVER)
5394
5395
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5396
5397
/* Checks the priority of the groups on the server and set the supported groups
5398
 * response if there is a group not advertised by the client that is preferred.
5399
 *
5400
 * ssl  SSL/TLS object.
5401
 * returns 0 on success, otherwise an error.
5402
 */
5403
int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
5404
521
{
5405
521
    int ret;
5406
521
    TLSX* extension;
5407
521
    TLSX* priority = NULL;
5408
521
    TLSX* ext = NULL;
5409
521
    word16 name;
5410
521
    SupportedCurve* curve;
5411
5412
521
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5413
    /* May be doing PSK with no key exchange. */
5414
521
    if (extension == NULL)
5415
0
        return 0;
5416
5417
521
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5418
521
    if (ret != WOLFSSL_SUCCESS) {
5419
18
        TLSX_FreeAll(priority, ssl->heap);
5420
18
        return ret;
5421
18
    }
5422
5423
503
    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5424
503
    if (ext == NULL) {
5425
0
        WOLFSSL_MSG("Could not find supported groups extension");
5426
0
        TLSX_FreeAll(priority, ssl->heap);
5427
0
        return 0;
5428
0
    }
5429
5430
503
    curve = (SupportedCurve*)ext->data;
5431
503
    name = curve->name;
5432
5433
503
    curve = (SupportedCurve*)extension->data;
5434
1.39k
    while (curve != NULL) {
5435
907
        if (curve->name == name)
5436
16
            break;
5437
891
        curve = curve->next;
5438
891
    }
5439
5440
503
    if (curve == NULL) {
5441
        /* Couldn't find the preferred group in client list. */
5442
487
        extension->resp = 1;
5443
5444
        /* Send server list back and free client list. */
5445
487
        curve = (SupportedCurve*)extension->data;
5446
487
        extension->data = ext->data;
5447
487
        ext->data = curve;
5448
487
    }
5449
5450
503
    TLSX_FreeAll(priority, ssl->heap);
5451
5452
503
    return 0;
5453
503
}
5454
5455
#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
5456
5457
#if !defined(NO_DH) && !defined(WOLFSSL_NO_TLS12)
5458
#ifdef HAVE_FFDHE
5459
#ifdef HAVE_PUBLIC_FFDHE
5460
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5461
    SupportedCurve* serverGroup)
5462
1.91k
{
5463
1.91k
    int ret = 0;
5464
1.91k
    SupportedCurve* group;
5465
1.91k
    const DhParams* params = NULL;
5466
5467
32.9k
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5468
32.6k
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5469
30.6k
            continue;
5470
5471
4.29k
        for (group = clientGroup; group != NULL; group = group->next) {
5472
3.91k
            if (serverGroup->name != group->name)
5473
2.37k
                continue;
5474
5475
1.54k
            switch (serverGroup->name) {
5476
0
            #ifdef HAVE_FFDHE_2048
5477
1.54k
                case WOLFSSL_FFDHE_2048:
5478
1.54k
                    params = wc_Dh_ffdhe2048_Get();
5479
1.54k
                    break;
5480
0
            #endif
5481
            #ifdef HAVE_FFDHE_3072
5482
                case WOLFSSL_FFDHE_3072:
5483
                    params = wc_Dh_ffdhe3072_Get();
5484
                    break;
5485
            #endif
5486
            #ifdef HAVE_FFDHE_4096
5487
                case WOLFSSL_FFDHE_4096:
5488
                    params = wc_Dh_ffdhe4096_Get();
5489
                    break;
5490
            #endif
5491
            #ifdef HAVE_FFDHE_6144
5492
                case WOLFSSL_FFDHE_6144:
5493
                    params = wc_Dh_ffdhe6144_Get();
5494
                    break;
5495
            #endif
5496
            #ifdef HAVE_FFDHE_8192
5497
                case WOLFSSL_FFDHE_8192:
5498
                    params = wc_Dh_ffdhe8192_Get();
5499
                    break;
5500
            #endif
5501
0
                default:
5502
0
                    break;
5503
1.54k
            }
5504
1.54k
            if (params == NULL) {
5505
0
                ret = BAD_FUNC_ARG;
5506
0
                break;
5507
0
            }
5508
1.54k
            if (params->p_len >= ssl->options.minDhKeySz &&
5509
1.54k
                                     params->p_len <= ssl->options.maxDhKeySz) {
5510
1.54k
                break;
5511
1.54k
            }
5512
1.54k
        }
5513
5514
1.91k
        if (ret != 0)
5515
0
            break;
5516
1.91k
        if ((group != NULL) && (serverGroup->name == group->name))
5517
1.54k
            break;
5518
1.91k
    }
5519
5520
1.91k
    if ((ret == 0) && (serverGroup != NULL) && (params != NULL)) {
5521
1.54k
        ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
5522
1.54k
        ssl->buffers.serverDH_P.length = params->p_len;
5523
1.54k
        ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
5524
1.54k
        ssl->buffers.serverDH_G.length = params->g_len;
5525
5526
1.54k
        ssl->namedGroup = serverGroup->name;
5527
1.54k
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5528
1.54k
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5529
1.54k
        ssl->options.dhDoKeyTest = 0;
5530
1.54k
    #endif
5531
1.54k
        ssl->options.haveDH = 1;
5532
1.54k
    }
5533
5534
1.91k
    return ret;
5535
1.91k
}
5536
#else
5537
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5538
    SupportedCurve* serverGroup)
5539
{
5540
    int ret = 0;
5541
    SupportedCurve* group;
5542
    word32 p_len;
5543
5544
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5545
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5546
            continue;
5547
5548
        for (group = clientGroup; group != NULL; group = group->next) {
5549
            if (serverGroup->name != group->name)
5550
                continue;
5551
5552
            ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &p_len, NULL, NULL);
5553
            if (ret == 0) {
5554
                if (p_len == 0) {
5555
                    ret = BAD_FUNC_ARG;
5556
                    break;
5557
                }
5558
                if (p_len >= ssl->options.minDhKeySz &&
5559
                                                p_len <= ssl->options.maxDhKeySz) {
5560
                    break;
5561
                }
5562
            }
5563
        }
5564
5565
        if (ret != 0)
5566
            break;
5567
        if ((group != NULL) && (serverGroup->name == group->name))
5568
            break;
5569
    }
5570
5571
    if ((ret == 0) && (serverGroup != NULL)) {
5572
        word32 pSz, gSz;
5573
5574
        ssl->buffers.serverDH_P.buffer = NULL;
5575
        ssl->buffers.serverDH_G.buffer = NULL;
5576
        ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &pSz, &gSz, NULL);
5577
        if (ret == 0) {
5578
            ssl->buffers.serverDH_P.buffer =
5579
                (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5580
            if (ssl->buffers.serverDH_P.buffer == NULL)
5581
                ret = MEMORY_E;
5582
            else
5583
                ssl->buffers.serverDH_P.length = pSz;
5584
        }
5585
        if (ret == 0) {
5586
            ssl->buffers.serverDH_G.buffer =
5587
                (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5588
            if (ssl->buffers.serverDH_G.buffer == NULL) {
5589
                ret = MEMORY_E;
5590
            } else
5591
                ssl->buffers.serverDH_G.length = gSz;
5592
        }
5593
        if (ret == 0) {
5594
            ret = wc_DhCopyNamedKey(serverGroup->name,
5595
                              ssl->buffers.serverDH_P.buffer, &pSz,
5596
                              ssl->buffers.serverDH_G.buffer, &gSz,
5597
                              NULL, NULL);
5598
        }
5599
        if (ret == 0) {
5600
            ssl->buffers.weOwnDH = 1;
5601
5602
            ssl->namedGroup = serverGroup->name;
5603
        #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5604
            !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5605
            ssl->options.dhDoKeyTest = 0;
5606
        #endif
5607
            ssl->options.haveDH = 1;
5608
        }
5609
        else {
5610
            if (ssl->buffers.serverDH_P.buffer != NULL) {
5611
                XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5612
                    DYNAMIC_TYPE_PUBLIC_KEY);
5613
                ssl->buffers.serverDH_P.length = 0;
5614
                ssl->buffers.serverDH_P.buffer = NULL;
5615
            }
5616
            if (ssl->buffers.serverDH_G.buffer != NULL) {
5617
                XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5618
                    DYNAMIC_TYPE_PUBLIC_KEY);
5619
                ssl->buffers.serverDH_G.length = 0;
5620
                ssl->buffers.serverDH_G.buffer = NULL;
5621
            }
5622
        }
5623
    }
5624
5625
    return ret;
5626
}
5627
#endif
5628
#endif /* HAVE_FFDHE */
5629
5630
/* Set the highest priority common FFDHE group on the server as compared to
5631
 * client extensions.
5632
 *
5633
 * ssl    SSL/TLS object.
5634
 * returns 0 on success, otherwise an error.
5635
 */
5636
int TLSX_SupportedFFDHE_Set(WOLFSSL* ssl)
5637
6.78k
{
5638
6.78k
    int ret = 0;
5639
6.78k
#ifdef HAVE_FFDHE
5640
6.78k
    TLSX* priority = NULL;
5641
6.78k
    TLSX* ext = NULL;
5642
6.78k
#endif
5643
6.78k
    TLSX* extension;
5644
6.78k
    SupportedCurve* clientGroup;
5645
6.78k
    SupportedCurve* group;
5646
6.78k
    int found = 0;
5647
5648
6.78k
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5649
    /* May be doing PSK with no key exchange. */
5650
6.78k
    if (extension == NULL)
5651
0
        return 0;
5652
6.78k
    clientGroup = (SupportedCurve*)extension->data;
5653
13.2k
    for (group = clientGroup; group != NULL; group = group->next) {
5654
8.62k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(group->name)) {
5655
2.12k
            found = 1;
5656
2.12k
            break;
5657
2.12k
        }
5658
8.62k
    }
5659
6.78k
    if (!found)
5660
4.66k
        return 0;
5661
5662
2.12k
    if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
5663
0
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5664
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5665
0
    }
5666
2.12k
    if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
5667
0
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5668
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5669
0
    }
5670
2.12k
    ssl->buffers.serverDH_P.buffer = NULL;
5671
2.12k
    ssl->buffers.serverDH_G.buffer = NULL;
5672
2.12k
    ssl->buffers.weOwnDH = 0;
5673
2.12k
    ssl->options.haveDH = 0;
5674
5675
2.12k
#ifdef HAVE_FFDHE
5676
2.12k
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5677
2.12k
    if (ret == WOLFSSL_SUCCESS) {
5678
1.91k
        SupportedCurve* serverGroup;
5679
5680
1.91k
        ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5681
1.91k
        if (ext == NULL) {
5682
0
            WOLFSSL_MSG("Could not find supported groups extension");
5683
0
            ret = 0;
5684
0
        }
5685
1.91k
        else {
5686
1.91k
            serverGroup = (SupportedCurve*)ext->data;
5687
1.91k
            ret = tlsx_ffdhe_find_group(ssl, clientGroup, serverGroup);
5688
1.91k
        }
5689
1.91k
    }
5690
5691
2.12k
    TLSX_FreeAll(priority, ssl->heap);
5692
2.12k
#endif /* HAVE_FFDHE */
5693
5694
2.12k
    return ret;
5695
6.78k
}
5696
#endif /* !NO_DH && !WOLFSSL_NO_TLS12 */
5697
#endif /* !NO_WOLFSSL_SERVER */
5698
5699
/* Check if the given curve is present in the supported groups extension.
5700
 *
5701
 * ssl             SSL/TLS object.
5702
 * name            The curve name to check.
5703
 * returns 1 if present, 0 otherwise.
5704
 */
5705
int TLSX_SupportedCurve_IsSupported(WOLFSSL* ssl, word16 name)
5706
0
{
5707
0
    TLSX* extension;
5708
0
    SupportedCurve* curve;
5709
5710
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5711
0
    if (extension == NULL)
5712
0
        return 0;
5713
5714
0
    curve = (SupportedCurve*)extension->data;
5715
0
    while (curve != NULL) {
5716
0
        if (curve->name == name)
5717
0
            return 1;
5718
0
        curve = curve->next;
5719
0
    }
5720
5721
0
    return 0;
5722
0
}
5723
5724
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5725
/* Return the preferred group.
5726
 *
5727
 * ssl             SSL/TLS object.
5728
 * checkSupported  Whether to check for the first supported group.
5729
 * returns BAD_FUNC_ARG if no group found, otherwise the group.
5730
 */
5731
int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
5732
0
{
5733
0
    TLSX* extension;
5734
0
    SupportedCurve* curve;
5735
5736
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5737
0
    if (extension == NULL)
5738
0
        return BAD_FUNC_ARG;
5739
5740
0
    curve = (SupportedCurve*)extension->data;
5741
0
    while (curve != NULL) {
5742
0
        if (!checkSupported ||
5743
0
                TLSX_IsGroupSupported(curve->name, ssl->options.side))
5744
0
            return curve->name;
5745
0
        curve = curve->next;
5746
0
    }
5747
5748
0
    return BAD_FUNC_ARG;
5749
0
}
5750
5751
#endif /* HAVE_SUPPORTED_CURVES */
5752
5753
#ifndef NO_WOLFSSL_SERVER
5754
5755
static int TLSX_PointFormat_Parse(WOLFSSL* ssl, const byte* input,
5756
                                  word16 length, byte isRequest)
5757
1.13k
{
5758
1.13k
    int ret;
5759
5760
    /* validating formats list length */
5761
1.13k
    if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
5762
103
        return BUFFER_ERROR;
5763
5764
1.03k
    if (isRequest) {
5765
1.03k
    #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SUPPORTED_CURVES)
5766
        /* RFC 8422 Section 5.1.2: a client that sends the ec_point_formats
5767
         * extension MUST include the uncompressed (0) format. Record whether
5768
         * it is missing so DoClientHello() can abort with an illegal_parameter
5769
         * alert if the client also advertised ECC named groups. The decision
5770
         * is deferred to after all extensions are parsed so it does not depend
5771
         * on the relative order of the supported_groups and ec_point_formats
5772
         * extensions in the ClientHello. */
5773
1.03k
        word16 i;
5774
1.03k
        int found = 0;
5775
5776
2.49k
        for (i = 0; i < input[0]; i++) {
5777
2.33k
            if (input[ENUM_LEN + i] == WOLFSSL_EC_PF_UNCOMPRESSED) {
5778
871
                found = 1;
5779
871
                break;
5780
871
            }
5781
2.33k
        }
5782
1.03k
        ssl->options.peerNoUncompPF = (found == 0);
5783
1.03k
    #endif
5784
5785
        /* adding uncompressed point format to response */
5786
1.03k
        ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
5787
1.03k
                                                                     ssl->heap);
5788
1.03k
        if (ret != WOLFSSL_SUCCESS)
5789
22
            return ret; /* throw error */
5790
5791
1.01k
        TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
5792
1.01k
    }
5793
5794
1.01k
    return 0;
5795
1.03k
}
5796
5797
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5798
int TLSX_ValidateSupportedCurves(const WOLFSSL* ssl, byte first, byte second,
5799
                                 word32* ecdhCurveOID) {
5800
    TLSX*           extension = NULL;
5801
    SupportedCurve* curve     = NULL;
5802
    word32          oid       = 0;
5803
    word32          defOid    = 0;
5804
    word32          defSz     = 80; /* Maximum known curve size is 66. */
5805
    word32          nextOid   = 0;
5806
    word32          nextSz    = 80; /* Maximum known curve size is 66. */
5807
    word32          currOid   = ssl->ecdhCurveOID;
5808
    int             ephmSuite = 0;
5809
    word16          octets    = 0; /* according to 'ecc_set_type ecc_sets[];' */
5810
    int             key       = 0; /* validate key       */
5811
    int             foundCurve = 0; /* Found at least one supported curve */
5812
5813
    (void)oid;
5814
5815
    if (first == CHACHA_BYTE) {
5816
        switch (second) {
5817
            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5818
            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
5819
            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5820
            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5821
                return 1; /* no suite restriction */
5822
            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5823
            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5824
            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5825
                break;
5826
        }
5827
    }
5828
    if (first == ECC_BYTE || first == ECDHE_PSK_BYTE || first == CHACHA_BYTE)
5829
        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5830
    if (!extension)
5831
        return 1; /* no suite restriction */
5832
5833
    for (curve = (SupportedCurve*)extension->data;
5834
         curve && !key;
5835
         curve = curve->next) {
5836
5837
    #ifdef OPENSSL_EXTRA
5838
        /* skip if name is not in supported ECC range
5839
         * or disabled by user */
5840
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
5841
            continue;
5842
    #endif
5843
5844
        /* find supported curve */
5845
        switch (curve->name) {
5846
#ifdef HAVE_ECC
5847
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
5848
        #ifndef NO_ECC_SECP
5849
            case WOLFSSL_ECC_SECP160R1:
5850
                oid = ECC_SECP160R1_OID;
5851
                octets = 20;
5852
                break;
5853
        #endif /* !NO_ECC_SECP */
5854
        #ifdef HAVE_ECC_SECPR2
5855
            case WOLFSSL_ECC_SECP160R2:
5856
                oid = ECC_SECP160R2_OID;
5857
                octets = 20;
5858
                break;
5859
        #endif /* HAVE_ECC_SECPR2 */
5860
        #ifdef HAVE_ECC_KOBLITZ
5861
            case WOLFSSL_ECC_SECP160K1:
5862
                oid = ECC_SECP160K1_OID;
5863
                octets = 20;
5864
                break;
5865
        #endif /* HAVE_ECC_KOBLITZ */
5866
        #endif
5867
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
5868
        #ifndef NO_ECC_SECP
5869
            case WOLFSSL_ECC_SECP192R1:
5870
                oid = ECC_SECP192R1_OID;
5871
                octets = 24;
5872
                break;
5873
        #endif /* !NO_ECC_SECP */
5874
        #ifdef HAVE_ECC_KOBLITZ
5875
            case WOLFSSL_ECC_SECP192K1:
5876
                oid = ECC_SECP192K1_OID;
5877
                octets = 24;
5878
                break;
5879
        #endif /* HAVE_ECC_KOBLITZ */
5880
    #endif
5881
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
5882
        #ifndef NO_ECC_SECP
5883
            case WOLFSSL_ECC_SECP224R1:
5884
                oid = ECC_SECP224R1_OID;
5885
                octets = 28;
5886
                break;
5887
        #endif /* !NO_ECC_SECP */
5888
        #ifdef HAVE_ECC_KOBLITZ
5889
            case WOLFSSL_ECC_SECP224K1:
5890
                oid = ECC_SECP224K1_OID;
5891
                octets = 28;
5892
                break;
5893
        #endif /* HAVE_ECC_KOBLITZ */
5894
    #endif
5895
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5896
        #ifndef NO_ECC_SECP
5897
            case WOLFSSL_ECC_SECP256R1:
5898
                oid = ECC_SECP256R1_OID;
5899
                octets = 32;
5900
                break;
5901
        #endif /* !NO_ECC_SECP */
5902
    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
5903
#endif
5904
        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
5905
            case WOLFSSL_ECC_X25519:
5906
                oid = ECC_X25519_OID;
5907
                octets = 32;
5908
                break;
5909
        #endif /* HAVE_CURVE25519 */
5910
#ifdef HAVE_ECC
5911
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5912
        #ifdef HAVE_ECC_KOBLITZ
5913
            case WOLFSSL_ECC_SECP256K1:
5914
                oid = ECC_SECP256K1_OID;
5915
                octets = 32;
5916
                break;
5917
        #endif /* HAVE_ECC_KOBLITZ */
5918
        #ifdef HAVE_ECC_BRAINPOOL
5919
            case WOLFSSL_ECC_BRAINPOOLP256R1:
5920
                oid = ECC_BRAINPOOLP256R1_OID;
5921
                octets = 32;
5922
                break;
5923
        #endif /* HAVE_ECC_BRAINPOOL */
5924
        #ifdef WOLFSSL_SM2
5925
            case WOLFSSL_ECC_SM2P256V1:
5926
                oid = ECC_SM2P256V1_OID;
5927
                octets = 32;
5928
                break;
5929
        #endif /* WOLFSSL_SM2 */
5930
    #endif
5931
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
5932
        #ifndef NO_ECC_SECP
5933
            case WOLFSSL_ECC_SECP384R1:
5934
                oid = ECC_SECP384R1_OID;
5935
                octets = 48;
5936
                break;
5937
        #endif /* !NO_ECC_SECP */
5938
        #ifdef HAVE_ECC_BRAINPOOL
5939
            case WOLFSSL_ECC_BRAINPOOLP384R1:
5940
                oid = ECC_BRAINPOOLP384R1_OID;
5941
                octets = 48;
5942
                break;
5943
        #endif /* HAVE_ECC_BRAINPOOL */
5944
    #endif
5945
#endif
5946
        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
5947
            case WOLFSSL_ECC_X448:
5948
                oid = ECC_X448_OID;
5949
                octets = 57;
5950
                break;
5951
        #endif /* HAVE_CURVE448 */
5952
#ifdef HAVE_ECC
5953
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
5954
        #ifdef HAVE_ECC_BRAINPOOL
5955
            case WOLFSSL_ECC_BRAINPOOLP512R1:
5956
                oid = ECC_BRAINPOOLP512R1_OID;
5957
                octets = 64;
5958
                break;
5959
        #endif /* HAVE_ECC_BRAINPOOL */
5960
    #endif
5961
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
5962
        #ifndef NO_ECC_SECP
5963
            case WOLFSSL_ECC_SECP521R1:
5964
                oid = ECC_SECP521R1_OID;
5965
                octets = 66;
5966
                break;
5967
        #endif /* !NO_ECC_SECP */
5968
    #endif
5969
#endif
5970
            default: continue; /* unsupported curve */
5971
        }
5972
5973
        foundCurve = 1;
5974
5975
    #ifdef HAVE_ECC
5976
        /* Set default Oid */
5977
        if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
5978
            defOid = oid;
5979
            defSz = octets;
5980
        }
5981
5982
        /* The eccTempKeySz is the preferred ephemeral key size */
5983
        if (currOid == 0 && ssl->eccTempKeySz == octets)
5984
            currOid = oid;
5985
        if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
5986
            nextOid = oid;
5987
            nextSz  = octets;
5988
        }
5989
    #else
5990
        if (defOid == 0 && defSz > octets) {
5991
            defOid = oid;
5992
            defSz = octets;
5993
        }
5994
5995
        if (currOid == 0)
5996
            currOid = oid;
5997
        if (nextOid == 0 || nextSz > octets) {
5998
            nextOid = oid;
5999
            nextSz  = octets;
6000
        }
6001
    #endif
6002
6003
        if (first == ECC_BYTE) {
6004
            switch (second) {
6005
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
6006
                /* ECDHE_ECDSA */
6007
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
6008
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
6009
                case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
6010
                case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
6011
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
6012
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
6013
                case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
6014
                case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
6015
                case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
6016
                case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
6017
                    key |= ssl->ecdhCurveOID == oid;
6018
                    ephmSuite = 1;
6019
                break;
6020
6021
    #ifdef WOLFSSL_STATIC_DH
6022
                /* ECDH_ECDSA */
6023
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
6024
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
6025
                case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
6026
                case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
6027
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
6028
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
6029
                case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
6030
                case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
6031
                    if (oid == ECC_X25519_OID && defOid == oid) {
6032
                        defOid = 0;
6033
                        defSz = 80;
6034
                    }
6035
                    if (oid == ECC_X448_OID && defOid == oid) {
6036
                        defOid = 0;
6037
                        defSz = 80;
6038
                    }
6039
                    key |= ssl->pkCurveOID == oid;
6040
                break;
6041
    #endif /* WOLFSSL_STATIC_DH */
6042
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
6043
#ifndef NO_RSA
6044
                /* ECDHE_RSA */
6045
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
6046
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
6047
                case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
6048
                case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
6049
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
6050
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
6051
                case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
6052
                case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
6053
                    key |= ssl->ecdhCurveOID == oid;
6054
                    ephmSuite = 1;
6055
                break;
6056
6057
    #if defined(HAVE_ECC) && defined(WOLFSSL_STATIC_DH)
6058
                /* ECDH_RSA */
6059
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
6060
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
6061
                case TLS_ECDH_RSA_WITH_RC4_128_SHA:
6062
                case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
6063
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
6064
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
6065
                case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
6066
                case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
6067
                    if (oid == ECC_X25519_OID && defOid == oid) {
6068
                        defOid = 0;
6069
                        defSz = 80;
6070
                    }
6071
                    if (oid == ECC_X448_OID && defOid == oid) {
6072
                        defOid = 0;
6073
                        defSz = 80;
6074
                    }
6075
                    key |= ssl->pkCurveOID == oid;
6076
                break;
6077
    #endif /* HAVE_ECC && WOLFSSL_STATIC_DH */
6078
#endif
6079
                default:
6080
                    if (oid == ECC_X25519_OID && defOid == oid) {
6081
                        defOid = 0;
6082
                        defSz = 80;
6083
                    }
6084
                    if (oid == ECC_X448_OID && defOid == oid) {
6085
                        defOid = 0;
6086
                        defSz = 80;
6087
                    }
6088
                    key = 1;
6089
                break;
6090
            }
6091
        }
6092
6093
        /* ChaCha20-Poly1305 ECC cipher suites */
6094
        if (first == CHACHA_BYTE) {
6095
            switch (second) {
6096
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
6097
                /* ECDHE_ECDSA */
6098
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
6099
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
6100
                    key |= ssl->ecdhCurveOID == oid;
6101
                    ephmSuite = 1;
6102
                break;
6103
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
6104
#ifndef NO_RSA
6105
                /* ECDHE_RSA */
6106
                case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
6107
                case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
6108
                    key |= ssl->ecdhCurveOID == oid;
6109
                    ephmSuite = 1;
6110
                break;
6111
#endif
6112
                default:
6113
                    key = 1;
6114
                break;
6115
            }
6116
        }
6117
    }
6118
6119
    /* Check we found at least one supported curve */
6120
    if (!foundCurve)
6121
        return 0;
6122
6123
    *ecdhCurveOID = ssl->ecdhCurveOID;
6124
    /* Choose the default if it is at the required strength. */
6125
#ifdef HAVE_ECC
6126
    if (*ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
6127
#else
6128
    if (*ecdhCurveOID == 0)
6129
#endif
6130
    {
6131
        key = 1;
6132
        *ecdhCurveOID = defOid;
6133
    }
6134
    /* Choose any curve at the required strength. */
6135
    if (*ecdhCurveOID == 0) {
6136
        key = 1;
6137
        *ecdhCurveOID = currOid;
6138
    }
6139
    /* Choose the default if it is at the next highest strength. */
6140
    if (*ecdhCurveOID == 0 && defSz == nextSz)
6141
        *ecdhCurveOID = defOid;
6142
    /* Choose any curve at the next highest strength. */
6143
    if (*ecdhCurveOID == 0)
6144
        *ecdhCurveOID = nextOid;
6145
    /* No curve and ephemeral ECC suite requires a matching curve. */
6146
    if (*ecdhCurveOID == 0 && ephmSuite)
6147
        key = 0;
6148
6149
    return key;
6150
}
6151
#endif
6152
6153
#endif /* NO_WOLFSSL_SERVER */
6154
6155
6156
int TLSX_SupportedCurve_Copy(TLSX* src, TLSX** dst, void* heap)
6157
3.77k
{
6158
3.77k
    TLSX* extension;
6159
3.77k
    int ret;
6160
6161
3.77k
    extension = TLSX_Find(src, TLSX_SUPPORTED_GROUPS);
6162
3.77k
    if (extension != NULL) {
6163
0
        SupportedCurve* curve;
6164
0
        for (curve = (SupportedCurve*)extension->data; curve != NULL;
6165
0
                curve = curve->next) {
6166
            /* Copying an already validated list - don't drop a group based on
6167
             * the side, so accept when either side has the crypto support. */
6168
0
            ret = TLSX_UseSupportedCurve(dst, curve->name, heap,
6169
0
                                         WOLFSSL_NEITHER_END);
6170
0
            if (ret != WOLFSSL_SUCCESS)
6171
0
                return MEMORY_E;
6172
0
        }
6173
0
    }
6174
6175
3.77k
    return 0;
6176
3.77k
}
6177
6178
int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap, int side)
6179
320k
{
6180
320k
    TLSX* extension = NULL;
6181
320k
    SupportedCurve* curve = NULL;
6182
320k
    int ret;
6183
6184
320k
    if (extensions == NULL) {
6185
0
        return BAD_FUNC_ARG;
6186
0
    }
6187
6188
320k
    if (!TLSX_IsGroupSupported(name, side)) {
6189
35.1k
        return BAD_FUNC_ARG;
6190
35.1k
    }
6191
6192
285k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
6193
6194
285k
    if (!extension) {
6195
24.1k
        ret = TLSX_SupportedCurve_New(&curve, name, heap);
6196
24.1k
        if (ret != 0)
6197
72
            return ret;
6198
6199
24.1k
        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
6200
24.1k
        if (ret != 0) {
6201
50
            XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
6202
50
            return ret;
6203
50
        }
6204
24.1k
    }
6205
261k
    else {
6206
261k
        ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
6207
261k
                                                                          heap);
6208
261k
        if (ret != 0)
6209
254
            return ret;
6210
    #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
6211
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
6212
        if (name == WOLFSSL_SECP256R1MLKEM512) {
6213
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
6214
                WOLFSSL_P256_ML_KEM_512_OLD, heap);
6215
        }
6216
        else if (name == WOLFSSL_SECP384R1MLKEM768) {
6217
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
6218
                WOLFSSL_P384_ML_KEM_768_OLD, heap);
6219
        }
6220
        else if (name == WOLFSSL_SECP521R1MLKEM1024) {
6221
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
6222
                WOLFSSL_P521_ML_KEM_1024_OLD, heap);
6223
        }
6224
        if (ret != 0) {
6225
            return ret;
6226
        }
6227
    #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
6228
261k
    }
6229
6230
285k
    return WOLFSSL_SUCCESS;
6231
285k
}
6232
6233
int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
6234
9.20k
{
6235
9.20k
    TLSX* extension = NULL;
6236
9.20k
    PointFormat* point = NULL;
6237
9.20k
    int ret = 0;
6238
6239
9.20k
    if (extensions == NULL)
6240
0
        return BAD_FUNC_ARG;
6241
6242
9.20k
    extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
6243
6244
9.20k
    if (!extension) {
6245
9.20k
        ret = TLSX_PointFormat_New(&point, format, heap);
6246
9.20k
        if (ret != 0)
6247
17
            return ret;
6248
6249
9.18k
        ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
6250
9.18k
        if (ret != 0) {
6251
7
            XFREE(point, heap, DYNAMIC_TYPE_TLSX);
6252
7
            return ret;
6253
7
        }
6254
9.18k
    }
6255
0
    else {
6256
0
        ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
6257
0
                                                                          heap);
6258
0
        if (ret != 0)
6259
0
            return ret;
6260
0
    }
6261
6262
9.17k
    return WOLFSSL_SUCCESS;
6263
9.20k
}
6264
6265
0
#define EC_FREE_ALL         TLSX_SupportedCurve_FreeAll
6266
0
#define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
6267
6268
/* In TLS 1.2 the server never sends supported curve extension, but in TLS 1.3
6269
 * the server can send supported groups extension to indicate what it will
6270
 * support for later connections. */
6271
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
6272
#define EC_GET_SIZE TLSX_SupportedCurve_GetSize
6273
0
#define EC_WRITE    TLSX_SupportedCurve_Write
6274
#else
6275
#define EC_GET_SIZE(list)         0
6276
#define EC_WRITE(a, b)            0
6277
#endif
6278
6279
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
6280
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
6281
0
#define EC_PARSE TLSX_SupportedCurve_Parse
6282
#else
6283
#define EC_PARSE(a, b, c, d, e)   0
6284
#endif
6285
6286
0
#define PF_FREE_ALL          TLSX_PointFormat_FreeAll
6287
0
#define PF_VALIDATE_REQUEST  TLSX_PointFormat_ValidateRequest
6288
0
#define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
6289
6290
#define PF_GET_SIZE TLSX_PointFormat_GetSize
6291
0
#define PF_WRITE    TLSX_PointFormat_Write
6292
6293
#ifndef NO_WOLFSSL_SERVER
6294
0
#define PF_PARSE TLSX_PointFormat_Parse
6295
#else
6296
#define PF_PARSE(a, b, c, d)      0
6297
#endif
6298
6299
#else
6300
6301
#define EC_FREE_ALL(list, heap) WC_DO_NOTHING
6302
#define EC_GET_SIZE(list)         0
6303
#define EC_WRITE(a, b)            0
6304
#define EC_PARSE(a, b, c, d, e)   0
6305
#define EC_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
6306
6307
#define PF_FREE_ALL(list, heap)   WC_DO_NOTHING
6308
#define PF_GET_SIZE(list)         0
6309
#define PF_WRITE(a, b)            0
6310
#define PF_PARSE(a, b, c, d)      0
6311
#define PF_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
6312
#define PF_VALIDATE_RESPONSE(a, b) WC_DO_NOTHING
6313
6314
#endif /* HAVE_SUPPORTED_CURVES */
6315
6316
/******************************************************************************/
6317
/* Renegotiation Indication                                                   */
6318
/******************************************************************************/
6319
6320
#if defined(HAVE_SECURE_RENEGOTIATION) \
6321
 || defined(HAVE_SERVER_RENEGOTIATION_INFO)
6322
6323
static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
6324
                                                                  int isRequest)
6325
11.6k
{
6326
11.6k
    byte length = OPAQUE8_LEN; /* empty info length */
6327
6328
    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
6329
11.6k
    if (data && data->enabled && data->verifySet) {
6330
        /* client sends client_verify_data only */
6331
0
        length += TLS_FINISHED_SZ;
6332
6333
        /* server also sends server_verify_data */
6334
0
        if (!isRequest)
6335
0
            length += TLS_FINISHED_SZ;
6336
0
    }
6337
6338
11.6k
    return length;
6339
11.6k
}
6340
6341
static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
6342
                                                    byte* output, int isRequest)
6343
9.66k
{
6344
9.66k
    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
6345
9.66k
    if (data && data->enabled && data->verifySet) {
6346
        /* client sends client_verify_data only */
6347
0
        XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
6348
0
        offset += TLS_FINISHED_SZ;
6349
6350
        /* server also sends server_verify_data */
6351
0
        if (!isRequest) {
6352
0
            XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
6353
0
            offset += TLS_FINISHED_SZ;
6354
0
        }
6355
0
    }
6356
6357
9.66k
    output[0] = (byte)(offset - 1);  /* info length - self */
6358
6359
9.66k
    return offset;
6360
9.66k
}
6361
6362
static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input,
6363
                                          word16 length, byte isRequest)
6364
472
{
6365
472
    int ret = WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E);
6366
6367
472
    if (length >= OPAQUE8_LEN) {
6368
472
        if (isRequest) {
6369
290
        #ifndef NO_WOLFSSL_SERVER
6370
290
            if (ssl->secure_renegotiation == NULL) {
6371
239
                ret = wolfSSL_UseSecureRenegotiation(ssl);
6372
239
                if (ret == WOLFSSL_SUCCESS)
6373
231
                    ret = 0;
6374
239
            }
6375
            /* renegotiation_info seen (checked by DoClientHello, RFC 5746 3.7) */
6376
290
            if (ssl->secure_renegotiation != NULL)
6377
282
                ssl->secure_renegotiation->renegInfoSeen = 1;
6378
290
            if (ret != 0 && ret != WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E)) {
6379
8
            }
6380
282
            else if (ssl->secure_renegotiation == NULL) {
6381
0
            }
6382
282
            else if (!ssl->secure_renegotiation->enabled) {
6383
231
                if (*input == 0) {
6384
121
                    input++; /* get past size */
6385
6386
121
                    ssl->secure_renegotiation->enabled = 1;
6387
121
                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6388
121
                    ret = 0;
6389
121
                }
6390
110
                else {
6391
                    /* already in error state */
6392
110
                    WOLFSSL_MSG("SCR client verify data present");
6393
110
                }
6394
231
            }
6395
51
            else if (*input == TLS_FINISHED_SZ) {
6396
31
                if (length < TLS_FINISHED_SZ + 1) {
6397
7
                    WOLFSSL_MSG("SCR malformed buffer");
6398
7
                    ret = BUFFER_E;
6399
7
                }
6400
24
                else {
6401
24
                    input++; /* get past size */
6402
6403
                    /* validate client verify data */
6404
24
                    if (ConstantCompare(input,
6405
24
                            ssl->secure_renegotiation->client_verify_data,
6406
24
                            TLS_FINISHED_SZ) == 0) {
6407
18
                        WOLFSSL_MSG("SCR client verify data match");
6408
18
                        TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6409
18
                        ret = 0;  /* verified */
6410
18
                    }
6411
6
                    else {
6412
                        /* already in error state */
6413
6
                        WOLFSSL_MSG("SCR client verify data Failure");
6414
6
                    }
6415
24
                }
6416
31
            }
6417
290
        #endif
6418
290
        }
6419
182
        else if (ssl->secure_renegotiation != NULL) {
6420
182
        #ifndef NO_WOLFSSL_CLIENT
6421
182
            if (!ssl->secure_renegotiation->enabled) {
6422
182
                if (*input == 0) {
6423
174
                    ssl->secure_renegotiation->enabled = 1;
6424
174
                    ret = 0;
6425
174
                }
6426
182
            }
6427
0
            else if (*input == 2 * TLS_FINISHED_SZ &&
6428
0
                     length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
6429
0
                int cmpRes = 0;
6430
0
                input++;  /* get past size */
6431
0
                cmpRes |= ConstantCompare(input,
6432
0
                        ssl->secure_renegotiation->client_verify_data,
6433
0
                        TLS_FINISHED_SZ);
6434
0
                cmpRes |= ConstantCompare(input + TLS_FINISHED_SZ,
6435
0
                        ssl->secure_renegotiation->server_verify_data,
6436
0
                        TLS_FINISHED_SZ);
6437
                /* validate client and server verify data */
6438
0
                if (cmpRes == 0) {
6439
0
                    WOLFSSL_MSG("SCR client and server verify data match");
6440
0
                    ret = 0;  /* verified */
6441
0
                }
6442
0
                else {
6443
                    /* already in error state */
6444
0
                    WOLFSSL_MSG("SCR client and server verify data Failure");
6445
0
                }
6446
0
            }
6447
182
        #endif
6448
182
        }
6449
0
        else {
6450
0
            ret = SECURE_RENEGOTIATION_E;
6451
0
        }
6452
472
    }
6453
0
    else {
6454
0
        ret = SECURE_RENEGOTIATION_E;
6455
0
    }
6456
6457
472
    if (ret != 0) {
6458
49
        WOLFSSL_ERROR_VERBOSE(ret);
6459
49
        SendAlert(ssl, alert_fatal, handshake_failure);
6460
49
    }
6461
6462
472
    return ret;
6463
472
}
6464
6465
/* tmp_keys holds a copy of the session cipher and MAC keys, so wipe the
6466
 * struct before freeing it, matching the ForceZero of ssl->keys on connection
6467
 * teardown. */
6468
static void TLSX_SecureRenegotiation_Free(SecureRenegotiation* data, void* heap)
6469
15.9k
{
6470
15.9k
    if (data != NULL) {
6471
15.9k
        ForceZero(data, sizeof(SecureRenegotiation));
6472
15.9k
    }
6473
15.9k
    XFREE(data, heap, DYNAMIC_TYPE_TLSX);
6474
15.9k
    (void)heap;
6475
15.9k
}
6476
6477
int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
6478
16.0k
{
6479
16.0k
    int ret = 0;
6480
16.0k
    SecureRenegotiation* data;
6481
6482
16.0k
    data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
6483
16.0k
                                                             DYNAMIC_TYPE_TLSX);
6484
16.0k
    if (data == NULL)
6485
21
        return MEMORY_E;
6486
6487
16.0k
    XMEMSET(data, 0, sizeof(SecureRenegotiation));
6488
6489
16.0k
    ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
6490
16.0k
    if (ret != 0) {
6491
24
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
6492
24
        return ret;
6493
24
    }
6494
6495
15.9k
    return WOLFSSL_SUCCESS;
6496
16.0k
}
6497
6498
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
6499
6500
int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
6501
3.30k
{
6502
3.30k
    int ret;
6503
6504
    /* send empty renegotiation_info extension */
6505
3.30k
    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6506
3.30k
    if (ext == NULL) {
6507
3.30k
        ret = TLSX_UseSecureRenegotiation(extensions, heap);
6508
3.30k
        if (ret != WOLFSSL_SUCCESS)
6509
35
            return ret;
6510
6511
3.26k
        ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6512
3.26k
    }
6513
3.26k
    if (ext)
6514
3.26k
        ext->resp = 1;
6515
6516
3.26k
    return WOLFSSL_SUCCESS;
6517
3.30k
}
6518
6519
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
6520
6521
6522
0
#define SCR_FREE_ALL       TLSX_SecureRenegotiation_Free
6523
#define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
6524
0
#define SCR_WRITE          TLSX_SecureRenegotiation_Write
6525
0
#define SCR_PARSE          TLSX_SecureRenegotiation_Parse
6526
6527
#else
6528
6529
#define SCR_FREE_ALL(a, heap) WC_DO_NOTHING
6530
#define SCR_GET_SIZE(a, b)    0
6531
#define SCR_WRITE(a, b, c)    0
6532
#define SCR_PARSE(a, b, c, d) 0
6533
6534
#endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
6535
6536
/******************************************************************************/
6537
/* Session Tickets                                                            */
6538
/******************************************************************************/
6539
6540
#ifdef HAVE_SESSION_TICKET
6541
6542
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
6543
{
6544
    (void)isRequest;
6545
    return ticket ? ticket->size : 0;
6546
}
6547
6548
static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
6549
                                       int isRequest)
6550
{
6551
    word16 offset = 0; /* empty ticket */
6552
6553
    if (isRequest && ticket) {
6554
        XMEMCPY(output + offset, ticket->data, ticket->size);
6555
        offset += ticket->size;
6556
    }
6557
6558
    return offset;
6559
}
6560
6561
6562
static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, const byte* input,
6563
                                    word16 length, byte isRequest)
6564
{
6565
    int ret = 0;
6566
6567
    (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
6568
6569
    if (!isRequest) {
6570
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
6571
            return TLSX_HandleUnsupportedExtension(ssl);
6572
6573
        if (length != 0)
6574
            return BUFFER_ERROR;
6575
6576
#ifndef NO_WOLFSSL_CLIENT
6577
        ssl->expect_session_ticket = 1;
6578
#endif
6579
    }
6580
#ifndef NO_WOLFSSL_SERVER
6581
    else {
6582
        /* server side */
6583
        if (ssl->ctx->ticketEncCb == NULL) {
6584
            WOLFSSL_MSG("Client sent session ticket, server has no callback");
6585
            return 0;
6586
        }
6587
6588
#ifdef HAVE_SECURE_RENEGOTIATION
6589
        if (IsSCR(ssl)) {
6590
            WOLFSSL_MSG("Client sent session ticket during SCR. Ignoring.");
6591
            return 0;
6592
        }
6593
#endif
6594
6595
        if (length > SESSION_TICKET_LEN) {
6596
            ret = BAD_TICKET_MSG_SZ;
6597
            WOLFSSL_ERROR_VERBOSE(ret);
6598
        } else if (IsAtLeastTLSv1_3(ssl->version)) {
6599
            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
6600
            ssl->options.rejectTicket = 1;
6601
            ret = 0;  /* not fatal */
6602
        } else if (ssl->options.noTicketTls12) {
6603
            /* ignore ticket request */
6604
        } else if (length == 0) {
6605
            /* blank ticket */
6606
            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6607
            if (ret == WOLFSSL_SUCCESS) {
6608
                ret = 0;
6609
                /* send blank ticket */
6610
                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6611
                ssl->options.createTicket = 1;  /* will send ticket msg */
6612
                ssl->options.useTicket    = 1;
6613
                ssl->options.resuming     = 0;  /* no standard resumption */
6614
                ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
6615
            }
6616
        } else {
6617
            /* got actual ticket from client */
6618
            ret = DoClientTicket(ssl, input, length);
6619
            if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
6620
                WOLFSSL_MSG("Using existing client ticket");
6621
                ssl->options.useTicket    = 1;
6622
                ssl->options.resuming     = 1;
6623
                /* SERVER: ticket is peer auth. */
6624
                ssl->options.peerAuthGood = 1;
6625
            } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
6626
                WOLFSSL_MSG("Using existing client ticket, creating new one");
6627
                ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6628
                if (ret == WOLFSSL_SUCCESS) {
6629
                    ret = 0;
6630
                    TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6631
                                                    /* send blank ticket */
6632
                    ssl->options.createTicket = 1;  /* will send ticket msg */
6633
                    ssl->options.useTicket    = 1;
6634
                    ssl->options.resuming     = 1;
6635
                    /* SERVER: ticket is peer auth. */
6636
                    ssl->options.peerAuthGood = 1;
6637
                }
6638
            } else if (ret == WOLFSSL_TICKET_RET_REJECT ||
6639
                    ret == WC_NO_ERR_TRACE(VERSION_ERROR)) {
6640
                WOLFSSL_MSG("Process client ticket rejected, not using");
6641
                if (ret == WC_NO_ERR_TRACE(VERSION_ERROR))
6642
                    WOLFSSL_MSG("\tbad TLS version");
6643
                ret = 0;  /* not fatal */
6644
6645
                ssl->options.rejectTicket = 1;
6646
                /* If we have session tickets enabled then send a new ticket */
6647
                if (!TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET)) {
6648
                    ret = TLSX_UseSessionTicket(&ssl->extensions, NULL,
6649
                                                ssl->heap);
6650
                    if (ret == WOLFSSL_SUCCESS) {
6651
                        ret = 0;
6652
                        TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6653
                        ssl->options.createTicket = 1;
6654
                        ssl->options.useTicket    = 1;
6655
                    }
6656
                }
6657
            } else if (ret == WOLFSSL_TICKET_RET_FATAL) {
6658
                WOLFSSL_MSG("Process client ticket fatal error, not using");
6659
            } else if (ret < 0) {
6660
                WOLFSSL_MSG("Process client ticket unknown error, not using");
6661
            }
6662
        }
6663
    }
6664
#endif /* NO_WOLFSSL_SERVER */
6665
6666
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
6667
    (void)ssl;
6668
#endif
6669
6670
    return ret;
6671
}
6672
6673
WOLFSSL_TEST_VIS SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
6674
                                            byte* data, word16 size, void* heap)
6675
{
6676
    SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
6677
                                                       heap, DYNAMIC_TYPE_TLSX);
6678
    if (ticket) {
6679
        ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
6680
        if (ticket->data == NULL) {
6681
            XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
6682
            return NULL;
6683
        }
6684
6685
        XMEMCPY(ticket->data, data, size);
6686
        ticket->size     = size;
6687
        ticket->lifetime = lifetime;
6688
    }
6689
6690
    (void)heap;
6691
6692
    return ticket;
6693
}
6694
WOLFSSL_TEST_VIS void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
6695
{
6696
    if (ticket) {
6697
        XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
6698
        XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
6699
    }
6700
6701
    (void)heap;
6702
}
6703
6704
int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
6705
{
6706
    int ret = 0;
6707
6708
    if (extensions == NULL)
6709
        return BAD_FUNC_ARG;
6710
6711
    /* If the ticket is NULL, the client will request a new ticket from the
6712
       server. Otherwise, the client will use it in the next client hello. */
6713
    if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
6714
                                                                           != 0)
6715
        return ret;
6716
6717
    return WOLFSSL_SUCCESS;
6718
}
6719
6720
#define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
6721
#define WOLF_STK_WRITE            TLSX_SessionTicket_Write
6722
#define WOLF_STK_PARSE            TLSX_SessionTicket_Parse
6723
#define WOLF_STK_FREE(stk, heap)  TLSX_SessionTicket_Free((SessionTicket*)(stk),(heap))
6724
6725
#else
6726
6727
0
#define WOLF_STK_FREE(a, b) WC_DO_NOTHING
6728
#define WOLF_STK_VALIDATE_REQUEST(a) WC_DO_NOTHING
6729
#define WOLF_STK_GET_SIZE(a, b)      0
6730
0
#define WOLF_STK_WRITE(a, b, c)      0
6731
0
#define WOLF_STK_PARSE(a, b, c, d)   0
6732
6733
#endif /* HAVE_SESSION_TICKET */
6734
6735
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
6736
/******************************************************************************/
6737
/* Encrypt-then-MAC                                                           */
6738
/******************************************************************************/
6739
6740
#ifndef WOLFSSL_NO_TLS12
6741
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl);
6742
6743
/**
6744
 * Get the size of the Encrypt-Then-MAC extension.
6745
 *
6746
 * msgType  Type of message to put extension into.
6747
 * pSz      Size of extension data.
6748
 * return SANITY_MSG_E when the message is not allowed to have extension and
6749
 *        0 otherwise.
6750
 */
6751
static int TLSX_EncryptThenMac_GetSize(byte msgType, word16* pSz)
6752
10.7k
{
6753
10.7k
    (void)pSz;
6754
6755
10.7k
    if (msgType != client_hello && msgType != server_hello) {
6756
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6757
0
        return SANITY_MSG_E;
6758
0
    }
6759
6760
    /* Empty extension */
6761
6762
10.7k
    return 0;
6763
10.7k
}
6764
6765
/**
6766
 * Write the Encrypt-Then-MAC extension.
6767
 *
6768
 * data     Unused
6769
 * output   Extension data buffer. Unused.
6770
 * msgType  Type of message to put extension into.
6771
 * pSz      Size of extension data.
6772
 * return SANITY_MSG_E when the message is not allowed to have extension and
6773
 *        0 otherwise.
6774
 */
6775
static int TLSX_EncryptThenMac_Write(void* data, byte* output, byte msgType,
6776
                                     word16* pSz)
6777
8.85k
{
6778
8.85k
    (void)data;
6779
8.85k
    (void)output;
6780
8.85k
    (void)pSz;
6781
6782
8.85k
    if (msgType != client_hello && msgType != server_hello) {
6783
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6784
0
        return SANITY_MSG_E;
6785
0
    }
6786
6787
    /* Empty extension */
6788
6789
8.85k
    return 0;
6790
8.85k
}
6791
6792
/**
6793
 * Parse the Encrypt-Then-MAC extension.
6794
 *
6795
 * ssl      SSL object
6796
 * input    Extension data buffer.
6797
 * length   Length of this extension's data.
6798
 * msgType  Type of message to extension appeared in.
6799
 * return SANITY_MSG_E when the message is not allowed to have extension,
6800
 *        BUFFER_ERROR when the extension's data is invalid,
6801
 *        MEMORY_E when unable to allocate memory and
6802
 *        0 otherwise.
6803
 */
6804
static int TLSX_EncryptThenMac_Parse(WOLFSSL* ssl, const byte* input,
6805
                                     word16 length, byte msgType)
6806
1.31k
{
6807
1.31k
    int ret;
6808
6809
1.31k
    (void)input;
6810
6811
1.31k
    if (msgType != client_hello && msgType != server_hello) {
6812
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6813
0
        return SANITY_MSG_E;
6814
0
    }
6815
6816
    /* Empty extension */
6817
1.31k
    if (length != 0)
6818
24
        return BUFFER_ERROR;
6819
6820
1.29k
    if (msgType == client_hello) {
6821
        /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
6822
1.28k
        if (!ssl->options.disallowEncThenMac) {
6823
1.28k
            ssl->options.encThenMac = 1;
6824
            /* Set the extension reply. */
6825
1.28k
            ret = TLSX_EncryptThenMac_Use(ssl);
6826
1.28k
            if (ret != 0)
6827
13
                return ret;
6828
1.28k
        }
6829
1.27k
        return 0;
6830
1.28k
    }
6831
6832
    /* Server Hello */
6833
7
    if (ssl->options.disallowEncThenMac) {
6834
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6835
0
        return SANITY_MSG_E;
6836
0
    }
6837
6838
7
    ssl->options.encThenMac = 1;
6839
7
    return 0;
6840
6841
7
}
6842
6843
/**
6844
 * Add the Encrypt-Then-MAC extension to list.
6845
 *
6846
 * ssl      SSL object
6847
 * return MEMORY_E when unable to allocate memory and 0 otherwise.
6848
 */
6849
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl)
6850
13.8k
{
6851
13.8k
    int   ret = 0;
6852
13.8k
    TLSX* extension;
6853
6854
    /* Find the Encrypt-Then-Mac extension if it exists. */
6855
13.8k
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6856
13.8k
    if (extension == NULL) {
6857
        /* Push new Encrypt-Then-Mac extension. */
6858
13.7k
        ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
6859
13.7k
            ssl->heap);
6860
13.7k
        if (ret != 0)
6861
19
            return ret;
6862
13.7k
    }
6863
6864
13.8k
    return 0;
6865
13.8k
}
6866
6867
/**
6868
 * Set the Encrypt-Then-MAC extension as one to respond too.
6869
 *
6870
 * ssl      SSL object
6871
 * return EXT_MISSING when EncryptThenMac extension not in list.
6872
 */
6873
int TLSX_EncryptThenMac_Respond(WOLFSSL* ssl)
6874
764
{
6875
764
    TLSX* extension;
6876
6877
764
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6878
764
    if (extension == NULL)
6879
0
        return EXT_MISSING;
6880
764
    extension->resp = 1;
6881
6882
764
    return 0;
6883
764
}
6884
6885
#define ETM_GET_SIZE  TLSX_EncryptThenMac_GetSize
6886
0
#define ETM_WRITE     TLSX_EncryptThenMac_Write
6887
0
#define ETM_PARSE     TLSX_EncryptThenMac_Parse
6888
6889
#else
6890
6891
#define ETM_GET_SIZE(a, b)    0
6892
#define ETM_WRITE(a, b, c, d) 0
6893
#define ETM_PARSE(a, b, c, d) 0
6894
6895
#endif /* !WOLFSSL_NO_TLS12 */
6896
6897
#endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
6898
6899
6900
#ifdef WOLFSSL_SRTP
6901
6902
/******************************************************************************/
6903
/* DTLS SRTP (Secure Real-time Transport Protocol)                            */
6904
/******************************************************************************/
6905
6906
/* Only support single SRTP profile */
6907
typedef struct TlsxSrtp {
6908
    word16 profileCount;
6909
    word16 ids; /* selected bits */
6910
} TlsxSrtp;
6911
6912
#ifndef NO_WOLFSSL_SERVER
6913
static int TLSX_UseSRTP_GetSize(TlsxSrtp *srtp)
6914
{
6915
    /*   SRTP Profile Len (2)
6916
     *      SRTP Profiles (2)
6917
     *   MKI (master key id) Length */
6918
    return (OPAQUE16_LEN + (srtp->profileCount * OPAQUE16_LEN) + 1);
6919
}
6920
#endif
6921
6922
static TlsxSrtp* TLSX_UseSRTP_New(word16 ids, void* heap)
6923
{
6924
    TlsxSrtp* srtp;
6925
    int i;
6926
6927
    srtp = (TlsxSrtp*)XMALLOC(sizeof(TlsxSrtp), heap, DYNAMIC_TYPE_TLSX);
6928
    if (srtp == NULL) {
6929
        WOLFSSL_MSG("TLSX SRTP Memory failure");
6930
        return NULL;
6931
    }
6932
6933
    /* count and test each bit set */
6934
    srtp->profileCount = 0;
6935
    for (i=0; i<16; i++) {
6936
        if (ids & (1 << i)) {
6937
            srtp->profileCount++;
6938
        }
6939
    }
6940
    srtp->ids = ids;
6941
6942
    return srtp;
6943
}
6944
6945
static void TLSX_UseSRTP_Free(TlsxSrtp *srtp, void* heap)
6946
{
6947
    XFREE(srtp, heap, DYNAMIC_TYPE_TLSX);
6948
    (void)heap;
6949
}
6950
6951
#ifndef NO_WOLFSSL_SERVER
6952
static int TLSX_UseSRTP_Parse(WOLFSSL* ssl, const byte* input, word16 length,
6953
    byte isRequest)
6954
{
6955
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
6956
    word16 profile_len = 0;
6957
    word16 profile_value = 0;
6958
    word16 offset = 0;
6959
    int i;
6960
    TlsxSrtp* srtp = NULL;
6961
6962
    if (length < OPAQUE16_LEN) {
6963
        return BUFFER_ERROR;
6964
    }
6965
6966
    /* reset selected DTLS SRTP profile ID */
6967
    ssl->dtlsSrtpId = 0;
6968
6969
    /* total length, not include itself */
6970
    ato16(input, &profile_len);
6971
    offset += OPAQUE16_LEN;
6972
    /* Check profile length is not bigger than remaining length. */
6973
    if (profile_len > length - offset) {
6974
        return BUFFER_ERROR;
6975
    }
6976
    /* Protection profiles are 2 bytes long - ensure not an odd no. bytes. */
6977
    if ((profile_len & 1) == 1) {
6978
        return BUFFER_ERROR;
6979
    }
6980
    /* Ignoring srtp_mki field - SRTP Make Key Identifier.
6981
     * Defined to be 0..255 bytes long.
6982
     */
6983
    if ((length - profile_len - offset) > 255) {
6984
        return BUFFER_ERROR;
6985
    }
6986
6987
    if (!isRequest) {
6988
#ifndef NO_WOLFSSL_CLIENT
6989
        /* Only one SRTP Protection Profile can be chosen. */
6990
        if (profile_len != OPAQUE16_LEN) {
6991
            return BUFFER_ERROR;
6992
        }
6993
6994
        ato16(input + offset, &profile_value);
6995
6996
        /* check that the profile received was in the ones we support */
6997
        if (profile_value < 16 &&
6998
                               (ssl->dtlsSrtpProfiles & (1 << profile_value))) {
6999
            ssl->dtlsSrtpId = profile_value;
7000
            ret = 0; /* success */
7001
        }
7002
#endif
7003
    }
7004
    else {
7005
        /* parse remainder one profile at a time, looking for match in CTX */
7006
        ret = 0;
7007
        for (i = 0; i < profile_len; i += OPAQUE16_LEN) {
7008
            ato16(input + offset + i, &profile_value);
7009
            /* find first match */
7010
            if (profile_value < 16 &&
7011
                                 ssl->dtlsSrtpProfiles & (1 << profile_value)) {
7012
                ssl->dtlsSrtpId = profile_value;
7013
7014
                /* make sure we respond with selected SRTP id selected */
7015
                srtp = TLSX_UseSRTP_New((1 << profile_value), ssl->heap);
7016
                if (srtp != NULL) {
7017
                    ret = TLSX_Push(&ssl->extensions, TLSX_USE_SRTP,
7018
                        (void*)srtp, ssl->heap);
7019
                    if (ret == 0) {
7020
                        TLSX_SetResponse(ssl, TLSX_USE_SRTP);
7021
                        /* successfully set extension */
7022
                    }
7023
                }
7024
                else {
7025
                    ret = MEMORY_E;
7026
                }
7027
                break;
7028
            }
7029
        }
7030
    }
7031
7032
    if (ret == 0 && ssl->dtlsSrtpId == 0) {
7033
        WOLFSSL_MSG("TLSX_UseSRTP_Parse profile not found!");
7034
        /* not fatal */
7035
    }
7036
    else if (ret != 0) {
7037
        ssl->dtlsSrtpId = 0;
7038
        TLSX_UseSRTP_Free(srtp, ssl->heap);
7039
    }
7040
7041
    return ret;
7042
}
7043
7044
static word16 TLSX_UseSRTP_Write(TlsxSrtp* srtp, byte* output)
7045
{
7046
    word16 offset = 0;
7047
    int i, j;
7048
7049
    c16toa(srtp->profileCount * 2, output + offset);
7050
    offset += OPAQUE16_LEN;
7051
    j = 0;
7052
    for (i = 0; i < srtp->profileCount; i++) {
7053
        for (; j < 16; j++) {
7054
            if (srtp->ids & (1 << j)) {
7055
                c16toa(j, output + offset);
7056
                offset += OPAQUE16_LEN;
7057
            }
7058
        }
7059
    }
7060
    output[offset++] = 0x00; /* MKI Length */
7061
7062
    return offset;
7063
}
7064
#endif
7065
7066
static int TLSX_UseSRTP(TLSX** extensions, word16 profiles, void* heap)
7067
{
7068
    int ret = 0;
7069
    TLSX* extension;
7070
7071
    if (extensions == NULL) {
7072
        return BAD_FUNC_ARG;
7073
    }
7074
7075
    extension = TLSX_Find(*extensions, TLSX_USE_SRTP);
7076
    if (extension == NULL) {
7077
        TlsxSrtp* srtp = TLSX_UseSRTP_New(profiles, heap);
7078
        if (srtp == NULL) {
7079
            return MEMORY_E;
7080
        }
7081
7082
        ret = TLSX_Push(extensions, TLSX_USE_SRTP, (void*)srtp, heap);
7083
        if (ret != 0) {
7084
            TLSX_UseSRTP_Free(srtp, heap);
7085
        }
7086
    }
7087
7088
    return ret;
7089
}
7090
7091
#ifndef NO_WOLFSSL_SERVER
7092
    #define SRTP_FREE     TLSX_UseSRTP_Free
7093
    #define SRTP_PARSE    TLSX_UseSRTP_Parse
7094
    #define SRTP_WRITE    TLSX_UseSRTP_Write
7095
    #define SRTP_GET_SIZE TLSX_UseSRTP_GetSize
7096
#else
7097
    #define SRTP_FREE(a, b) WC_DO_NOTHING
7098
    #define SRTP_PARSE(a, b, c, d)      0
7099
    #define SRTP_WRITE(a, b)            0
7100
    #define SRTP_GET_SIZE(a)            0
7101
#endif
7102
7103
#endif /* WOLFSSL_SRTP */
7104
7105
7106
/******************************************************************************/
7107
/* Supported Versions                                                         */
7108
/******************************************************************************/
7109
7110
#ifdef WOLFSSL_TLS13
7111
static WC_INLINE int versionIsGreater(byte isDtls, byte a, byte b)
7112
{
7113
    (void)isDtls;
7114
7115
#ifdef WOLFSSL_DTLS
7116
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7117
    if (isDtls)
7118
        return a < b;
7119
#endif /* WOLFSSL_DTLS */
7120
7121
    return a > b;
7122
}
7123
7124
static WC_INLINE int versionIsLesser(byte isDtls, byte a, byte b)
7125
{
7126
    (void)isDtls;
7127
7128
#ifdef WOLFSSL_DTLS
7129
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7130
    if (isDtls)
7131
        return a > b;
7132
#endif /* WOLFSSL_DTLS */
7133
7134
    return a < b;
7135
}
7136
7137
static WC_INLINE int versionIsAtLeast(byte isDtls, byte a, byte b)
7138
{
7139
    (void)isDtls;
7140
7141
#ifdef WOLFSSL_DTLS
7142
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7143
    if (isDtls)
7144
        return a <= b;
7145
#endif /* WOLFSSL_DTLS */
7146
7147
    return a >= b;
7148
}
7149
7150
static WC_INLINE int versionIsLessEqual(byte isDtls, byte a, byte b)
7151
{
7152
    (void)isDtls;
7153
7154
#ifdef WOLFSSL_DTLS
7155
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7156
    if (isDtls)
7157
        return a >= b;
7158
#endif /* WOLFSSL_DTLS */
7159
7160
    return a <= b;
7161
}
7162
7163
/* Return the size of the SupportedVersions extension's data.
7164
 *
7165
 * data       The SSL/TLS object.
7166
 * msgType The type of the message this extension is being written into.
7167
 * returns the length of data that will be in the extension.
7168
 */
7169
static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
7170
0
{
7171
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7172
0
    byte tls13Minor, tls12Minor, tls11Minor, isDtls;
7173
7174
0
    isDtls = !!ssl->options.dtls;
7175
0
    tls13Minor = (byte)(isDtls ? DTLSv1_3_MINOR : TLSv1_3_MINOR);
7176
0
    tls12Minor = (byte)(isDtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR);
7177
0
    tls11Minor = (byte)(isDtls ? DTLS_MINOR : TLSv1_1_MINOR);
7178
7179
    /* unused on some configuration */
7180
0
    (void)tls12Minor;
7181
0
    (void)tls13Minor;
7182
0
    (void)tls11Minor;
7183
7184
0
    if (msgType == client_hello) {
7185
        /* TLS v1.2 and TLS v1.3  */
7186
0
        int cnt = 0;
7187
7188
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13Minor)
7189
        #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7190
            defined(WOLFSSL_WPAS_SMALL)
7191
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
7192
        #endif
7193
0
        ) {
7194
0
            cnt++;
7195
0
        }
7196
7197
0
        if (ssl->options.downgrade) {
7198
0
    #ifndef WOLFSSL_NO_TLS12
7199
0
            if (versionIsLessEqual(
7200
0
                    isDtls, ssl->options.minDowngrade, tls12Minor)
7201
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
7202
    defined(WOLFSSL_WPAS_SMALL)
7203
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
7204
#endif
7205
0
            ) {
7206
0
                cnt++;
7207
0
            }
7208
0
#endif
7209
    #ifndef NO_OLD_TLS
7210
            if (versionIsLessEqual(
7211
                    isDtls, ssl->options.minDowngrade, tls11Minor)
7212
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7213
                defined(WOLFSSL_WPAS_SMALL)
7214
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
7215
            #endif
7216
            ) {
7217
                cnt++;
7218
            }
7219
        #ifdef WOLFSSL_ALLOW_TLSV10
7220
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
7221
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7222
                defined(WOLFSSL_WPAS_SMALL)
7223
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
7224
            #endif
7225
            ) {
7226
                cnt++;
7227
            }
7228
        #endif
7229
    #endif
7230
0
        }
7231
7232
0
        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
7233
0
    }
7234
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7235
0
        *pSz += OPAQUE16_LEN;
7236
0
    }
7237
0
    else {
7238
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7239
0
        return SANITY_MSG_E;
7240
0
    }
7241
7242
0
    return 0;
7243
0
}
7244
7245
/* Writes the SupportedVersions extension into the buffer.
7246
 *
7247
 * data    The SSL/TLS object.
7248
 * output  The buffer to write the extension into.
7249
 * msgType The type of the message this extension is being written into.
7250
 * returns the length of data that was written.
7251
 */
7252
static int TLSX_SupportedVersions_Write(void* data, byte* output,
7253
                                        byte msgType, word16* pSz)
7254
0
{
7255
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7256
0
    byte tls13minor, tls12minor, tls11minor, isDtls = 0;
7257
7258
0
    tls13minor = (byte)TLSv1_3_MINOR;
7259
0
    tls12minor = (byte)TLSv1_2_MINOR;
7260
0
    tls11minor = (byte)TLSv1_1_MINOR;
7261
7262
    /* unused in some configuration */
7263
0
    (void)tls11minor;
7264
0
    (void)tls12minor;
7265
7266
#ifdef WOLFSSL_DTLS13
7267
    if (ssl->options.dtls) {
7268
        tls13minor = (byte)DTLSv1_3_MINOR;
7269
    #ifndef WOLFSSL_NO_TLS12
7270
        tls12minor = (byte)DTLSv1_2_MINOR;
7271
    #endif
7272
    #ifndef NO_OLD_TLS
7273
        tls11minor = (byte)DTLS_MINOR;
7274
    #endif
7275
        isDtls = 1;
7276
    }
7277
#endif /* WOLFSSL_DTLS13 */
7278
7279
0
    if (msgType == client_hello) {
7280
0
        byte major = ssl->ctx->method->version.major;
7281
7282
0
        byte* cnt = output++;
7283
0
        *cnt = 0;
7284
7285
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13minor)
7286
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
7287
    defined(WOLFSSL_WPAS_SMALL)
7288
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
7289
#endif
7290
0
        ) {
7291
0
            *cnt += OPAQUE16_LEN;
7292
        #ifdef WOLFSSL_TLS13_DRAFT
7293
            /* The TLS draft major number. */
7294
            *(output++) = TLS_DRAFT_MAJOR;
7295
            /* Version of draft supported. */
7296
            *(output++) = TLS_DRAFT_MINOR;
7297
        #else
7298
0
            *(output++) = major;
7299
0
            *(output++) = tls13minor;
7300
0
        #endif
7301
0
        }
7302
7303
0
        if (ssl->options.downgrade) {
7304
0
        #ifndef WOLFSSL_NO_TLS12
7305
0
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls12minor)
7306
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7307
                defined(WOLFSSL_WPAS_SMALL)
7308
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
7309
            #endif
7310
0
            ) {
7311
0
                *cnt += OPAQUE16_LEN;
7312
0
                *(output++) = major;
7313
0
                *(output++) = tls12minor;
7314
0
            }
7315
0
        #endif
7316
7317
    #ifndef NO_OLD_TLS
7318
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls11minor)
7319
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7320
                defined(WOLFSSL_WPAS_SMALL)
7321
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
7322
            #endif
7323
            ) {
7324
                *cnt += OPAQUE16_LEN;
7325
                *(output++) = major;
7326
                *(output++) = tls11minor;
7327
            }
7328
        #ifdef WOLFSSL_ALLOW_TLSV10
7329
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
7330
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7331
                defined(WOLFSSL_WPAS_SMALL)
7332
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
7333
            #endif
7334
            ) {
7335
                *cnt += OPAQUE16_LEN;
7336
                *(output++) = major;
7337
                *(output++) = (byte)TLSv1_MINOR;
7338
            }
7339
        #endif
7340
    #endif
7341
0
        }
7342
7343
0
        *pSz += (word16)(OPAQUE8_LEN + *cnt);
7344
0
    }
7345
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7346
0
        output[0] = ssl->version.major;
7347
0
        output[1] = ssl->version.minor;
7348
7349
0
        *pSz += OPAQUE16_LEN;
7350
0
    }
7351
0
    else {
7352
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7353
0
        return SANITY_MSG_E;
7354
0
    }
7355
7356
0
    return 0;
7357
0
}
7358
7359
/* Parse the SupportedVersions extension.
7360
 *
7361
 * ssl     The SSL/TLS object.
7362
 * input   The buffer with the extension data.
7363
 * length  The length of the extension data.
7364
 * msgType The type of the message this extension is being parsed from.
7365
 * pv      The output ProtocolVersion for the negotiated version
7366
 * opts    The output options structure. Can be NULL.
7367
 * exts    The output extensions list. Can be NULL.
7368
 * returns 0 on success, otherwise failure.
7369
 */
7370
int TLSX_SupportedVersions_Parse(const WOLFSSL* ssl, const byte* input,
7371
        word16 length, byte msgType, ProtocolVersion* pv, Options* opts,
7372
        TLSX** exts)
7373
0
{
7374
    /* The client's greatest minor version that we support */
7375
0
    byte clientGreatestMinor = SSLv3_MINOR;
7376
0
    int ret;
7377
0
    byte major, minor;
7378
0
    byte tls13minor, tls12minor;
7379
0
    byte isDtls;
7380
7381
0
    tls13minor = TLSv1_3_MINOR;
7382
0
    tls12minor = TLSv1_2_MINOR;
7383
0
    isDtls = ssl->options.dtls == 1;
7384
7385
#ifdef WOLFSSL_DTLS13
7386
    if (ssl->options.dtls) {
7387
        tls13minor = DTLSv1_3_MINOR;
7388
        tls12minor = DTLSv1_2_MINOR;
7389
        clientGreatestMinor = DTLS_MINOR;
7390
    }
7391
#endif /* WOLFSSL_DTLS13 */
7392
7393
0
    if (msgType == client_hello) {
7394
0
        int i;
7395
0
        int len;
7396
0
        int set = 0;
7397
7398
        /* Must contain a length and at least one version. */
7399
0
        if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1
7400
0
            || length > MAX_SV_EXT_LEN) {
7401
0
            return BUFFER_ERROR;
7402
0
        }
7403
7404
0
        len = *input;
7405
7406
        /* Protocol version array must fill rest of data. */
7407
0
        if (length != (word16)OPAQUE8_LEN + len)
7408
0
            return BUFFER_ERROR;
7409
7410
0
        input++;
7411
7412
        /* Find first match. */
7413
0
        for (i = 0; i < len; i += OPAQUE16_LEN) {
7414
0
            major = input[i];
7415
0
            minor = input[i + OPAQUE8_LEN];
7416
7417
#ifdef WOLFSSL_TLS13_DRAFT
7418
            if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
7419
                major = SSLv3_MAJOR;
7420
                minor = TLSv1_3_MINOR;
7421
            }
7422
#else
7423
0
            if (major == TLS_DRAFT_MAJOR)
7424
0
                continue;
7425
0
#endif
7426
7427
0
            if (major != ssl->ctx->method->version.major)
7428
0
                continue;
7429
7430
            /* No upgrade allowed. */
7431
0
            if (versionIsGreater(isDtls, minor, ssl->version.minor))
7432
0
                continue;
7433
7434
            /* Check downgrade. */
7435
0
            if (versionIsLesser(isDtls, minor, ssl->version.minor)) {
7436
0
                if (!ssl->options.downgrade)
7437
0
                    continue;
7438
7439
0
                if (versionIsLesser(isDtls, minor, ssl->options.minDowngrade))
7440
0
                    continue;
7441
0
            }
7442
0
            if (versionIsGreater(isDtls, minor, clientGreatestMinor))
7443
0
                clientGreatestMinor = minor;
7444
7445
0
            set = 1;
7446
0
        }
7447
0
        if (!set) {
7448
            /* No common supported version was negotiated */
7449
0
            SendAlert((WOLFSSL*)ssl, alert_fatal,
7450
0
                      wolfssl_alert_protocol_version);
7451
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7452
0
            return VERSION_ERROR;
7453
0
        }
7454
0
        pv->minor = clientGreatestMinor;
7455
0
        if (versionIsAtLeast(isDtls, clientGreatestMinor, tls13minor)) {
7456
0
            if (opts != NULL)
7457
0
                opts->tls1_3 = 1;
7458
7459
            /* TLS v1.3 requires supported version extension */
7460
0
            if (exts != NULL &&
7461
0
                    TLSX_Find(*exts, TLSX_SUPPORTED_VERSIONS) == NULL) {
7462
0
                ret = TLSX_Push(exts,
7463
0
                          TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
7464
0
                if (ret != 0) {
7465
0
                    return ret;
7466
0
                }
7467
                /* *exts should be pointing to the TLSX_SUPPORTED_VERSIONS
7468
                 * ext in the list since it was pushed. */
7469
0
                (*exts)->resp = 1;
7470
0
            }
7471
0
        }
7472
7473
0
    }
7474
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7475
        /* Must contain one version. */
7476
0
        if (length != OPAQUE16_LEN)
7477
0
            return BUFFER_ERROR;
7478
7479
0
        major = input[0];
7480
0
        minor = input[OPAQUE8_LEN];
7481
7482
        /* RFC 8446 4.2.1: a version in the ServerHello supported_versions that
7483
         * the client did not offer, or one prior to TLS 1.3, must be rejected
7484
         * with illegal_parameter, so return INVALID_PARAMETER rather than
7485
         * VERSION_ERROR (which maps to protocol_version). */
7486
7487
0
        if (major != ssl->ctx->method->version.major) {
7488
0
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
7489
0
            return INVALID_PARAMETER;
7490
0
        }
7491
7492
        /* Can't downgrade with this extension below TLS v1.3. */
7493
0
        if (versionIsLesser(isDtls, minor, tls13minor)) {
7494
0
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
7495
0
            return INVALID_PARAMETER;
7496
0
        }
7497
7498
        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
7499
0
        if (ssl->options.downgrade && ssl->version.minor == tls12minor) {
7500
            /* Set minor version back to TLS v1.3+ */
7501
0
            pv->minor = ssl->ctx->method->version.minor;
7502
0
        }
7503
7504
        /* No upgrade allowed. */
7505
0
        if (versionIsLesser(isDtls, ssl->version.minor, minor)) {
7506
0
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
7507
0
            return INVALID_PARAMETER;
7508
0
        }
7509
7510
        /* Check downgrade. */
7511
0
        if (versionIsGreater(isDtls, ssl->version.minor, minor)) {
7512
0
            if (!ssl->options.downgrade) {
7513
0
                WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
7514
0
                return INVALID_PARAMETER;
7515
0
            }
7516
7517
0
            if (versionIsLesser(
7518
0
                    isDtls, minor, ssl->options.minDowngrade)) {
7519
0
                WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
7520
0
                return INVALID_PARAMETER;
7521
0
            }
7522
7523
            /* Downgrade the version. */
7524
0
            pv->minor = minor;
7525
0
        }
7526
0
    }
7527
0
    else {
7528
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7529
0
        return SANITY_MSG_E;
7530
0
    }
7531
7532
0
    return 0;
7533
0
}
7534
7535
/* Sets a new SupportedVersions extension into the extension list.
7536
 *
7537
 * extensions  The list of extensions.
7538
 * data        The extensions specific data.
7539
 * heap        The heap used for allocation.
7540
 * returns 0 on success, otherwise failure.
7541
 */
7542
static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
7543
                                     void* heap)
7544
4.33k
{
7545
4.33k
    if (extensions == NULL || data == NULL)
7546
0
        return BAD_FUNC_ARG;
7547
7548
4.33k
    return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, data, heap);
7549
4.33k
}
7550
7551
#define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
7552
0
#define SV_WRITE     TLSX_SupportedVersions_Write
7553
#define SV_PARSE     TLSX_SupportedVersions_Parse
7554
7555
#else
7556
7557
#define SV_GET_SIZE(a, b, c) 0
7558
#define SV_WRITE(a, b, c, d) 0
7559
#define SV_PARSE(a, b, c, d, e, f, g) 0
7560
7561
#endif /* WOLFSSL_TLS13 */
7562
7563
#ifdef WOLFSSL_TLS13_COOKIE
7564
7565
/******************************************************************************/
7566
/* Cookie                                                                     */
7567
/******************************************************************************/
7568
7569
/* Free the cookie data.
7570
 *
7571
 * cookie  Cookie data.
7572
 * heap    The heap used for allocation.
7573
 */
7574
static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
7575
644
{
7576
644
    (void)heap;
7577
7578
644
    XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
7579
644
}
7580
7581
/* Get the size of the encoded Cookie extension.
7582
 * In messages: ClientHello and HelloRetryRequest.
7583
 *
7584
 * cookie   The cookie to write.
7585
 * msgType  The type of the message this extension is being written into.
7586
 * returns the number of bytes of the encoded Cookie extension.
7587
 */
7588
static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
7589
641
{
7590
641
    if (msgType == client_hello || msgType == hello_retry_request) {
7591
641
        *pSz += OPAQUE16_LEN + cookie->len;
7592
641
    }
7593
0
    else {
7594
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7595
0
        return SANITY_MSG_E;
7596
0
    }
7597
641
    return 0;
7598
641
}
7599
7600
/* Writes the Cookie extension into the output buffer.
7601
 * Assumes that the the output buffer is big enough to hold data.
7602
 * In messages: ClientHello and HelloRetryRequest.
7603
 *
7604
 * cookie   The cookie to write.
7605
 * output   The buffer to write into.
7606
 * msgType  The type of the message this extension is being written into.
7607
 * returns the number of bytes written into the buffer.
7608
 */
7609
static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType,
7610
                             word16* pSz)
7611
641
{
7612
641
    if (msgType == client_hello || msgType == hello_retry_request) {
7613
641
        c16toa(cookie->len, output);
7614
641
        output += OPAQUE16_LEN;
7615
641
        XMEMCPY(output, cookie->data, cookie->len);
7616
641
        *pSz += OPAQUE16_LEN + cookie->len;
7617
641
    }
7618
0
    else {
7619
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7620
0
        return SANITY_MSG_E;
7621
0
    }
7622
641
    return 0;
7623
641
}
7624
7625
/* Parse the Cookie extension.
7626
 * In messages: ClientHello and HelloRetryRequest.
7627
 *
7628
 * ssl      The SSL/TLS object.
7629
 * input    The extension data.
7630
 * length   The length of the extension data.
7631
 * msgType  The type of the message this extension is being parsed from.
7632
 * returns 0 on success and other values indicate failure.
7633
 */
7634
static int TLSX_Cookie_Parse(WOLFSSL* ssl, const byte* input, word16 length,
7635
                             byte msgType)
7636
0
{
7637
0
    word16  len;
7638
0
    word16  idx = 0;
7639
#ifdef WOLFSSL_SEND_HRR_COOKIE
7640
    TLSX*   extension;
7641
    Cookie* cookie;
7642
#endif
7643
7644
0
    if (msgType != client_hello && msgType != hello_retry_request) {
7645
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7646
0
        return SANITY_MSG_E;
7647
0
    }
7648
7649
    /* Message contains length and Cookie which must be at least one byte
7650
     * in length.
7651
     */
7652
0
    if (length < OPAQUE16_LEN + 1)
7653
0
        return BUFFER_E;
7654
0
    ato16(input + idx, &len);
7655
0
    idx += OPAQUE16_LEN;
7656
0
    if (length - idx != len)
7657
0
        return BUFFER_E;
7658
7659
0
    if (msgType == hello_retry_request) {
7660
        /* RFC 8446 4.2.2 allows up to 2^16-1 bytes. Cap it lower to limit
7661
         * how much a server can make us hold and echo back. */
7662
0
        if (len > WOLFSSL_MAX_TLS13_COOKIE_SZ) {
7663
0
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7664
0
            return HRR_COOKIE_ERROR;
7665
0
        }
7666
7667
0
        ssl->options.hrrSentCookie = 1;
7668
0
        return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 1,
7669
0
                               &ssl->extensions);
7670
0
    }
7671
7672
    /* client_hello - the encoding is checked above in every build. Only a
7673
     * server that sends cookies holds one to compare the echoed cookie
7674
     * against, so otherwise the value is accepted and ignored. */
7675
#ifdef WOLFSSL_SEND_HRR_COOKIE
7676
    extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
7677
    if (extension == NULL) {
7678
#ifdef WOLFSSL_DTLS13
7679
        if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
7680
            /* Allow a cookie extension with DTLS 1.3 because it is possible
7681
             * that a different SSL instance sent the cookie but we are now
7682
             * receiving it. */
7683
            return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
7684
                                   &ssl->extensions);
7685
        else
7686
#endif
7687
        {
7688
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7689
            return HRR_COOKIE_ERROR;
7690
        }
7691
    }
7692
7693
    cookie = (Cookie*)extension->data;
7694
    if (cookie->len != len || XMEMCMP(cookie->data, input + idx, len) != 0) {
7695
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7696
        return HRR_COOKIE_ERROR;
7697
    }
7698
7699
    /* Request seen. */
7700
    extension->resp = 0;
7701
#endif
7702
7703
0
    return 0;
7704
0
}
7705
7706
/* Use the data to create a new Cookie object in the extensions.
7707
 *
7708
 * ssl    SSL/TLS object.
7709
 * data   Cookie data.
7710
 * len    Length of cookie data in bytes.
7711
 * mac    MAC data.
7712
 * macSz  Length of MAC data in bytes.
7713
 * resp   Indicates the extension will go into a response (HelloRetryRequest).
7714
 * returns 0 on success and other values indicate failure.
7715
 */
7716
int TLSX_Cookie_Use(const WOLFSSL* ssl, const byte* data, word16 len, byte* mac,
7717
                    byte macSz, int resp, TLSX** exts)
7718
645
{
7719
645
    int     ret = 0;
7720
645
    TLSX*   extension;
7721
645
    Cookie* cookie;
7722
7723
    /* Find the cookie extension if it exists. */
7724
645
    extension = TLSX_Find(*exts, TLSX_COOKIE);
7725
645
    if (extension == NULL) {
7726
        /* Push new cookie extension. */
7727
645
        ret = TLSX_Push(exts, TLSX_COOKIE, NULL, ssl->heap);
7728
645
        if (ret != 0)
7729
1
            return ret;
7730
7731
644
        extension = TLSX_Find(*exts, TLSX_COOKIE);
7732
644
        if (extension == NULL)
7733
0
            return MEMORY_E;
7734
644
    }
7735
7736
644
    cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz, ssl->heap,
7737
644
                              DYNAMIC_TYPE_TLSX);
7738
644
    if (cookie == NULL)
7739
1
        return MEMORY_E;
7740
7741
643
    cookie->len = len + macSz;
7742
643
    XMEMCPY(cookie->data, data, len);
7743
643
    if (mac != NULL)
7744
641
        XMEMCPY(cookie->data + len, mac, macSz);
7745
7746
643
    XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
7747
7748
643
    extension->data = (void*)cookie;
7749
643
    extension->resp = (byte)resp;
7750
7751
643
    return 0;
7752
644
}
7753
7754
0
#define CKE_FREE_ALL  TLSX_Cookie_FreeAll
7755
#define CKE_GET_SIZE  TLSX_Cookie_GetSize
7756
0
#define CKE_WRITE     TLSX_Cookie_Write
7757
0
#define CKE_PARSE     TLSX_Cookie_Parse
7758
7759
#else
7760
7761
#define CKE_FREE_ALL(a, b)    WC_DO_NOTHING
7762
#define CKE_GET_SIZE(a, b, c) 0
7763
#define CKE_WRITE(a, b, c, d) 0
7764
#define CKE_PARSE(a, b, c, d) 0
7765
7766
#endif
7767
7768
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && \
7769
    !defined(WOLFSSL_NO_CA_NAMES) && defined(OPENSSL_EXTRA)
7770
/* Currently only settable through compatibility API */
7771
/******************************************************************************/
7772
/* Certificate Authorities                                                       */
7773
/******************************************************************************/
7774
7775
/* Smallest legal authorities list from RFC 8446 section 4.2.4: a 2 byte
7776
 * length plus at least 1 byte of name. */
7777
#ifndef WC_CA_NAMES_MIN_SZ
7778
    #define WC_CA_NAMES_MIN_SZ 3
7779
#endif
7780
7781
static word16 TLSX_CA_Names_GetSize(void* data)
7782
{
7783
    WOLFSSL* ssl = (WOLFSSL*)data;
7784
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7785
    word32 size = 0;
7786
7787
    /* Length of names */
7788
    size += OPAQUE16_LEN;
7789
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL; names = names->next) {
7790
        byte seq[MAX_SEQ_SZ];
7791
        WOLFSSL_X509_NAME* name = names->data.name;
7792
7793
        if (name != NULL) {
7794
            /* 16-bit length | SEQ | Len | DER of name */
7795
            size += (word32)(OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
7796
                             name->rawLen);
7797
            if (size > WOLFSSL_MAX_16BIT) {
7798
                return 0;
7799
            }
7800
        }
7801
    }
7802
    return (word16)size;
7803
}
7804
7805
static word16 TLSX_CA_Names_Write(void* data, byte* output)
7806
{
7807
    WOLFSSL* ssl = (WOLFSSL*)data;
7808
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7809
    byte* len;
7810
7811
    /* Reserve space for the length value */
7812
    len = output;
7813
    output += OPAQUE16_LEN;
7814
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL; names = names->next) {
7815
        byte seq[MAX_SEQ_SZ];
7816
        WOLFSSL_X509_NAME* name = names->data.name;
7817
7818
        if (name != NULL) {
7819
            c16toa((word16)name->rawLen +
7820
                   (word16)SetSequence(name->rawLen, seq), output);
7821
            output += OPAQUE16_LEN;
7822
            output += SetSequence(name->rawLen, output);
7823
            XMEMCPY(output, name->raw, name->rawLen);
7824
            output += name->rawLen;
7825
        }
7826
    }
7827
    /* Write the total length */
7828
    c16toa((word16)(output - len - OPAQUE16_LEN), len);
7829
    return (word16)(output - len);
7830
}
7831
7832
/* Count the CA names TLSX_CA_Names_Write() would write. RFC 8446 section
7833
 * 4.2.4 needs at least one, so send the extension only when this is non-zero.
7834
 * An empty list is one node with a NULL name, which counts as zero. */
7835
static int TLSX_CA_Names_Count(WOLFSSL* ssl)
7836
{
7837
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7838
    int cnt = 0;
7839
7840
    if (ssl == NULL)
7841
        return 0;
7842
7843
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL;
7844
            names = names->next) {
7845
        if (names->data.name != NULL)
7846
            cnt++;
7847
    }
7848
    return cnt;
7849
}
7850
7851
static int TLSX_CA_Names_Parse(WOLFSSL *ssl, const byte* input,
7852
                                  word16 length, byte isRequest)
7853
{
7854
    word16 extLen;
7855
7856
    (void)isRequest;
7857
7858
    wolfSSL_sk_X509_NAME_pop_free(ssl->peer_ca_names, NULL);
7859
    ssl->peer_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
7860
    if (ssl->peer_ca_names == NULL)
7861
        return MEMORY_ERROR;
7862
7863
    if (length < OPAQUE16_LEN)
7864
        return BUFFER_ERROR;
7865
7866
    ato16(input, &extLen);
7867
    input += OPAQUE16_LEN;
7868
    length -= OPAQUE16_LEN;
7869
    if (extLen != length)
7870
        return BUFFER_ERROR;
7871
7872
    /* RFC 8446 section 4.2.4 says authorities<3..2^16-1>, and the size table
7873
     * in TLSX_Parse skips certificate_request. Set WC_CA_NAMES_MIN_SZ to 0
7874
     * to accept short lists the way older versions did. */
7875
#if WC_CA_NAMES_MIN_SZ > 0
7876
    if (extLen < WC_CA_NAMES_MIN_SZ)
7877
        return BUFFER_ERROR;
7878
#endif
7879
7880
    while (length) {
7881
        word16 idx = 0;
7882
        WOLFSSL_X509_NAME* name = NULL;
7883
        int ret = 0;
7884
        int didInit = FALSE;
7885
        /* Use a DecodedCert struct to get access to GetName to
7886
         * parse DN name */
7887
#ifdef WOLFSSL_SMALL_STACK
7888
        DecodedCert *cert = (DecodedCert *)XMALLOC(
7889
            sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
7890
        if (cert == NULL)
7891
            return MEMORY_ERROR;
7892
#else
7893
        DecodedCert cert[1];
7894
#endif
7895
7896
        if (length < OPAQUE16_LEN) {
7897
            ret = BUFFER_ERROR;
7898
        }
7899
7900
        if (ret == 0) {
7901
            ato16(input, &extLen);
7902
            idx += OPAQUE16_LEN;
7903
7904
            if (extLen > length - idx)
7905
                ret = BUFFER_ERROR;
7906
        }
7907
7908
        if (ret == 0) {
7909
            InitDecodedCert(cert, input + idx, extLen, ssl->heap);
7910
            didInit = TRUE;
7911
            idx += extLen;
7912
            ret = GetName(cert, ASN_SUBJECT, extLen);
7913
        }
7914
7915
        if (ret == 0 && (name = wolfSSL_X509_NAME_new()) == NULL)
7916
            ret = MEMORY_ERROR;
7917
7918
        if (ret == 0) {
7919
            CopyDecodedName(name, cert, ASN_SUBJECT);
7920
            if (wolfSSL_sk_X509_NAME_push(ssl->peer_ca_names, name) <= 0) {
7921
                wolfSSL_X509_NAME_free(name);
7922
                ret = MEMORY_ERROR;
7923
            }
7924
        }
7925
7926
        if (didInit)
7927
            FreeDecodedCert(cert);
7928
7929
        WC_FREE_VAR_EX(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
7930
        if (ret != 0)
7931
            return ret;
7932
7933
        input += idx;
7934
        length -= idx;
7935
    }
7936
    return 0;
7937
}
7938
7939
#define CAN_GET_SIZE(data)      TLSX_CA_Names_GetSize(data)
7940
#define CAN_WRITE(data, output) TLSX_CA_Names_Write(data, output)
7941
#define CAN_PARSE(ssl, input, length, isRequest) \
7942
                                TLSX_CA_Names_Parse(ssl, input, length, isRequest)
7943
7944
#else
7945
7946
#define CAN_GET_SIZE(data)                       0
7947
#define CAN_WRITE(data, output)                  0
7948
#define CAN_PARSE(ssl, input, length, isRequest) 0
7949
7950
#endif
7951
7952
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
7953
/******************************************************************************/
7954
/* Signature Algorithms                                                       */
7955
/******************************************************************************/
7956
7957
/* Return the size of the SignatureAlgorithms extension's data.
7958
 *
7959
 * data  Unused
7960
 * returns the length of data that will be in the extension.
7961
 */
7962
7963
static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
7964
10.0k
{
7965
10.0k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7966
7967
10.0k
    if (sa->hashSigAlgoSz == 0)
7968
10.0k
        return OPAQUE16_LEN + WOLFSSL_SUITES(sa->ssl)->hashSigAlgoSz;
7969
0
    else
7970
0
        return OPAQUE16_LEN + sa->hashSigAlgoSz;
7971
10.0k
}
7972
7973
/* Creates a bit string of supported hash algorithms with RSA PSS.
7974
 * The bit string is used when determining which signature algorithm to use
7975
 * when creating the CertificateVerify message.
7976
 * Note: Valid data has an even length as each signature algorithm is two bytes.
7977
 *
7978
 * ssl     The SSL/TLS object.
7979
 * input   The buffer with the list of supported signature algorithms.
7980
 * length  The length of the list in bytes.
7981
 * returns 0 on success, BUFFER_ERROR when the length is not even.
7982
 */
7983
static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, const byte* input,
7984
                                           word16 length)
7985
11.9k
{
7986
11.9k
    word16 i;
7987
7988
11.9k
    if ((length & 1) == 1)
7989
0
        return BUFFER_ERROR;
7990
7991
11.9k
    ssl->pssAlgo = 0;
7992
210k
    for (i = 0; i < length; i += 2) {
7993
198k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
7994
28.1k
            ssl->pssAlgo |= 1 << input[i + 1];
7995
198k
    #ifdef WOLFSSL_TLS13
7996
198k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
7997
51.2k
                                                   input[i + 1] <= pss_sha512) {
7998
24.8k
            ssl->pssAlgo |= 1 << input[i + 1];
7999
24.8k
        }
8000
198k
    #endif
8001
198k
    }
8002
8003
11.9k
    return 0;
8004
11.9k
}
8005
8006
/* Writes the SignatureAlgorithms extension into the buffer.
8007
 *
8008
 * data    Unused
8009
 * output  The buffer to write the extension into.
8010
 * returns the length of data that was written.
8011
 */
8012
static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
8013
8.14k
{
8014
8.14k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
8015
8.14k
    const Suites* suites = WOLFSSL_SUITES(sa->ssl);
8016
8.14k
    word16 hashSigAlgoSz;
8017
8018
8.14k
    if (sa->hashSigAlgoSz == 0) {
8019
8.14k
        c16toa(suites->hashSigAlgoSz, output);
8020
8.14k
        XMEMCPY(output + OPAQUE16_LEN, suites->hashSigAlgo,
8021
8.14k
                suites->hashSigAlgoSz);
8022
8.14k
        hashSigAlgoSz = suites->hashSigAlgoSz;
8023
8.14k
    }
8024
0
    else {
8025
0
        c16toa(sa->hashSigAlgoSz, output);
8026
0
        XMEMCPY(output + OPAQUE16_LEN, sa->hashSigAlgo,
8027
0
                sa->hashSigAlgoSz);
8028
0
        hashSigAlgoSz = sa->hashSigAlgoSz;
8029
0
    }
8030
8031
8.14k
#ifndef NO_RSA
8032
8.14k
    TLSX_SignatureAlgorithms_MapPss(sa->ssl, output + OPAQUE16_LEN,
8033
8.14k
            hashSigAlgoSz);
8034
8.14k
#endif
8035
8036
8.14k
    return OPAQUE16_LEN + hashSigAlgoSz;
8037
8.14k
}
8038
8039
/* Parse the SignatureAlgorithms extension.
8040
 *
8041
 * ssl     The SSL/TLS object.
8042
 * input   The buffer with the extension data.
8043
 * length  The length of the extension data.
8044
 * returns 0 on success, otherwise failure.
8045
 */
8046
static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, const byte* input,
8047
                                  word16 length, byte isRequest, Suites* suites)
8048
3.93k
{
8049
3.93k
    word16 len;
8050
8051
3.93k
    if (!isRequest)
8052
0
        return BUFFER_ERROR;
8053
8054
    /* Must contain a length and at least algorithm. */
8055
3.93k
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
8056
46
        return BUFFER_ERROR;
8057
8058
3.89k
    ato16(input, &len);
8059
3.89k
    input += OPAQUE16_LEN;
8060
8061
    /* Algorithm array must fill rest of data. */
8062
3.89k
    if (length != OPAQUE16_LEN + len)
8063
90
        return BUFFER_ERROR;
8064
8065
    /* Truncate hashSigAlgo list if too long. */
8066
3.80k
    suites->hashSigAlgoSz = len;
8067
    /* Sig Algo list size must be even. */
8068
3.80k
    if (suites->hashSigAlgoSz % 2 != 0)
8069
0
        return BUFFER_ERROR;
8070
3.80k
    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
8071
20
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
8072
20
        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
8073
20
    }
8074
3.80k
    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
8075
8076
3.80k
    return TLSX_SignatureAlgorithms_MapPss(ssl, input, suites->hashSigAlgoSz);
8077
3.80k
}
8078
8079
/* Sets a new SignatureAlgorithms extension into the extension list.
8080
 *
8081
 * extensions  The list of extensions.
8082
 * data        The extensions specific data.
8083
 * heap        The heap used for allocation.
8084
 * returns 0 on success, otherwise failure.
8085
 */
8086
static int TLSX_SetSignatureAlgorithms(TLSX** extensions, WOLFSSL* ssl,
8087
                                       void* heap)
8088
26.7k
{
8089
26.7k
    SignatureAlgorithms* sa;
8090
26.7k
    int ret;
8091
8092
26.7k
    if (extensions == NULL)
8093
0
        return BAD_FUNC_ARG;
8094
8095
    /* Already present */
8096
26.7k
    if (TLSX_Find(*extensions, TLSX_SIGNATURE_ALGORITHMS) != NULL)
8097
133
        return 0;
8098
8099
26.6k
    sa = TLSX_SignatureAlgorithms_New(ssl, 0, heap);
8100
26.6k
    if (sa == NULL)
8101
43
        return MEMORY_ERROR;
8102
8103
26.6k
    ret = TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, sa, heap);
8104
26.6k
    if (ret != 0)
8105
233
        TLSX_SignatureAlgorithms_FreeAll(sa, heap);
8106
26.6k
    return ret;
8107
26.6k
}
8108
8109
SignatureAlgorithms* TLSX_SignatureAlgorithms_New(WOLFSSL* ssl,
8110
        word16 hashSigAlgoSz, void* heap)
8111
26.6k
{
8112
26.6k
    SignatureAlgorithms* sa;
8113
26.6k
    (void)heap;
8114
8115
26.6k
    sa = (SignatureAlgorithms*)XMALLOC(sizeof(*sa) + hashSigAlgoSz, heap,
8116
26.6k
                                       DYNAMIC_TYPE_TLSX);
8117
26.6k
    if (sa != NULL) {
8118
26.6k
        XMEMSET(sa, 0, sizeof(*sa) + hashSigAlgoSz);
8119
26.6k
        sa->ssl = ssl;
8120
26.6k
        sa->hashSigAlgoSz = hashSigAlgoSz;
8121
26.6k
    }
8122
26.6k
    return sa;
8123
26.6k
}
8124
8125
void TLSX_SignatureAlgorithms_FreeAll(SignatureAlgorithms* sa,
8126
                                             void* heap)
8127
26.6k
{
8128
26.6k
    XFREE(sa, heap, DYNAMIC_TYPE_TLSX);
8129
26.6k
    (void)heap;
8130
26.6k
}
8131
8132
#define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
8133
0
#define SA_WRITE     TLSX_SignatureAlgorithms_Write
8134
0
#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
8135
0
#define SA_FREE_ALL  TLSX_SignatureAlgorithms_FreeAll
8136
#endif
8137
/******************************************************************************/
8138
/* Signature Algorithms Certificate                                           */
8139
/******************************************************************************/
8140
8141
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
8142
/* Return the size of the SignatureAlgorithms extension's data.
8143
 *
8144
 * data  Unused
8145
 * returns the length of data that will be in the extension.
8146
 */
8147
static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
8148
0
{
8149
0
    WOLFSSL* ssl = (WOLFSSL*)data;
8150
8151
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
8152
0
}
8153
8154
/* Writes the SignatureAlgorithmsCert extension into the buffer.
8155
 *
8156
 * data    Unused
8157
 * output  The buffer to write the extension into.
8158
 * returns the length of data that was written.
8159
 */
8160
static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
8161
0
{
8162
0
    WOLFSSL* ssl = (WOLFSSL*)data;
8163
8164
0
    c16toa(ssl->certHashSigAlgoSz, output);
8165
0
    XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
8166
0
            ssl->certHashSigAlgoSz);
8167
8168
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
8169
0
}
8170
8171
/* Parse the SignatureAlgorithmsCert extension.
8172
 *
8173
 * ssl     The SSL/TLS object.
8174
 * input   The buffer with the extension data.
8175
 * length  The length of the extension data.
8176
 * returns 0 on success, otherwise failure.
8177
 */
8178
static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, const byte* input,
8179
                                              word16 length, byte isRequest)
8180
79
{
8181
79
    word16 len;
8182
8183
79
    if (!isRequest)
8184
0
        return BUFFER_ERROR;
8185
8186
    /* Must contain a length and at least algorithm. */
8187
79
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
8188
6
        return BUFFER_ERROR;
8189
8190
73
    ato16(input, &len);
8191
73
    input += OPAQUE16_LEN;
8192
8193
    /* Algorithm array must fill rest of data. */
8194
73
    if (length != OPAQUE16_LEN + len)
8195
45
        return BUFFER_ERROR;
8196
8197
    /* truncate hashSigAlgo list if too long */
8198
28
    ssl->certHashSigAlgoSz = len;
8199
28
    if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
8200
2
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
8201
2
        ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
8202
2
    }
8203
28
    XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
8204
8205
28
    return 0;
8206
73
}
8207
8208
/* Sets a new SignatureAlgorithmsCert extension into the extension list.
8209
 *
8210
 * extensions  The list of extensions.
8211
 * data        The extensions specific data.
8212
 * heap        The heap used for allocation.
8213
 * returns 0 on success, otherwise failure.
8214
 */
8215
static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions,
8216
        const WOLFSSL* data, void* heap)
8217
0
{
8218
0
    if (extensions == NULL)
8219
0
        return BAD_FUNC_ARG;
8220
8221
0
    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, data, heap);
8222
0
}
8223
8224
#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
8225
0
#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
8226
0
#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
8227
#endif /* WOLFSSL_TLS13 */
8228
8229
8230
/******************************************************************************/
8231
/* Key Share                                                                  */
8232
/******************************************************************************/
8233
8234
#ifndef MAX_KEYSHARE_NAMED_GROUPS
8235
    #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
8236
        !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
8237
2.63k
        #define MAX_KEYSHARE_NAMED_GROUPS    24
8238
    #else
8239
        #define MAX_KEYSHARE_NAMED_GROUPS    12
8240
    #endif
8241
#endif
8242
8243
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
8244
/* Create a key share entry using named Diffie-Hellman parameters group.
8245
 * Generates a key pair.
8246
 *
8247
 * ssl   The SSL/TLS object.
8248
 * kse   The key share entry object.
8249
 * returns 0 on success, otherwise failure.
8250
 */
8251
static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
8252
360
{
8253
360
    int ret = 0;
8254
360
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
8255
360
    word32 pSz = 0, pvtSz = 0;
8256
360
    DhKey* dhKey = (DhKey*)kse->key;
8257
8258
    /* Pick the parameters from the named group. */
8259
360
#ifdef HAVE_PUBLIC_FFDHE
8260
360
    const DhParams* params = NULL;
8261
360
    switch (kse->group) {
8262
0
    #ifdef HAVE_FFDHE_2048
8263
360
        case WOLFSSL_FFDHE_2048:
8264
360
            params = wc_Dh_ffdhe2048_Get();
8265
360
            pvtSz = 29;
8266
360
            break;
8267
0
    #endif
8268
    #ifdef HAVE_FFDHE_3072
8269
        case WOLFSSL_FFDHE_3072:
8270
            params = wc_Dh_ffdhe3072_Get();
8271
            pvtSz = 34;
8272
            break;
8273
    #endif
8274
    #ifdef HAVE_FFDHE_4096
8275
        case WOLFSSL_FFDHE_4096:
8276
            params = wc_Dh_ffdhe4096_Get();
8277
            pvtSz = 39;
8278
            break;
8279
    #endif
8280
    #ifdef HAVE_FFDHE_6144
8281
        case WOLFSSL_FFDHE_6144:
8282
            params = wc_Dh_ffdhe6144_Get();
8283
            pvtSz = 46;
8284
            break;
8285
    #endif
8286
    #ifdef HAVE_FFDHE_8192
8287
        case WOLFSSL_FFDHE_8192:
8288
            params = wc_Dh_ffdhe8192_Get();
8289
            pvtSz = 52;
8290
            break;
8291
    #endif
8292
0
        default:
8293
0
            break;
8294
360
    }
8295
360
    if (params == NULL)
8296
0
        return BAD_FUNC_ARG;
8297
360
    pSz = params->p_len;
8298
#else
8299
    pvtSz = wc_DhGetNamedKeyMinSize(kse->group);
8300
    if (pvtSz == 0) {
8301
        return BAD_FUNC_ARG;
8302
    }
8303
    ret = wc_DhGetNamedKeyParamSize(kse->group, &pSz, NULL, NULL);
8304
    if (ret != 0) {
8305
        return BAD_FUNC_ARG;
8306
    }
8307
#endif
8308
8309
    /* Trigger Key Generation */
8310
360
    if (kse->pubKey == NULL || kse->privKey == NULL) {
8311
325
        if (kse->key == NULL) {
8312
325
            kse->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
8313
325
                DYNAMIC_TYPE_DH);
8314
325
            if (kse->key == NULL)
8315
2
                return MEMORY_E;
8316
8317
            /* Setup Key */
8318
323
            ret = wc_InitDhKey_ex((DhKey*)kse->key, ssl->heap, ssl->devId);
8319
323
#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)
8320
323
            if (ret != 0) {
8321
0
                XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
8322
0
                kse->key = NULL;
8323
0
                return ret;
8324
0
            }
8325
323
#endif
8326
323
            if (ret == 0) {
8327
323
                dhKey = (DhKey*)kse->key;
8328
323
            #ifdef HAVE_PUBLIC_FFDHE
8329
323
                ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
8330
323
                                                                 params->g_len);
8331
            #else
8332
                ret = wc_DhSetNamedKey(dhKey, kse->group);
8333
            #endif
8334
323
            }
8335
        #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8336
            defined(WC_ASYNC_ENABLE_DH)
8337
            /* Only set non-blocking context when async device is active. With
8338
             * INVALID_DEVID there is no async loop to retry on MP_WOULDBLOCK, so
8339
             * skip non-blocking setup and use blocking mode instead. */
8340
            if (ret == 0 && ssl->devId != INVALID_DEVID) {
8341
                DhNb* dhNb = (DhNb*)XMALLOC(sizeof(DhNb), ssl->heap,
8342
                                            DYNAMIC_TYPE_TMP_BUFFER);
8343
                if (dhNb == NULL) {
8344
                    ret = MEMORY_E;
8345
                }
8346
                else {
8347
                    ret = wc_DhSetNonBlock((DhKey*)kse->key, dhNb);
8348
                    if (ret != 0) {
8349
                        XFREE(dhNb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8350
                    }
8351
                }
8352
            }
8353
        #endif /* WC_DH_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8354
                  WC_ASYNC_ENABLE_DH */
8355
323
        }
8356
8357
        /* Allocate space for the private and public key */
8358
323
        if (ret == 0 && kse->pubKey == NULL) {
8359
323
            kse->pubKey = (byte*)XMALLOC(pSz, ssl->heap,
8360
323
                DYNAMIC_TYPE_PUBLIC_KEY);
8361
323
            if (kse->pubKey == NULL)
8362
2
                ret = MEMORY_E;
8363
323
        }
8364
8365
323
        if (ret == 0 && kse->privKey == NULL) {
8366
321
            kse->privKey = (byte*)XMALLOC(pvtSz, ssl->heap,
8367
321
                DYNAMIC_TYPE_PRIVATE_KEY);
8368
321
            if (kse->privKey == NULL)
8369
2
                ret = MEMORY_E;
8370
321
        }
8371
8372
323
        if (ret == 0) {
8373
        #if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
8374
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_DH, kse->key);
8375
            kse->pubKeyLen = pSz;
8376
            kse->keyLen = pvtSz;
8377
            if (ret == 0) {
8378
                ret = wc_DhExportKeyPair(dhKey,
8379
                    (byte*)kse->privKey, &kse->keyLen, /* private */
8380
                    kse->pubKey, &kse->pubKeyLen /* public */
8381
                );
8382
            }
8383
            else
8384
        #endif
8385
319
            {
8386
                /* Generate a new key pair */
8387
                /* For async this is called once and when event is done, the
8388
                 *   provided buffers will be populated.
8389
                 * Final processing is zero pad below. */
8390
319
                kse->pubKeyLen = pSz;
8391
319
                kse->keyLen = pvtSz;
8392
319
                ret = DhGenKeyPair(ssl, dhKey,
8393
319
                    (byte*)kse->privKey, &kse->keyLen, /* private */
8394
319
                    kse->pubKey, &kse->pubKeyLen /* public */
8395
319
                );
8396
            #ifdef WOLFSSL_ASYNC_CRYPT
8397
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8398
                    return ret;
8399
                }
8400
            #endif
8401
319
            }
8402
319
        }
8403
323
    }
8404
8405
358
    if (ret == 0) {
8406
174
        if (pSz != kse->pubKeyLen) {
8407
            /* Zero pad the front of the public key to match prime "p" size */
8408
1
            XMEMMOVE(kse->pubKey + pSz - kse->pubKeyLen, kse->pubKey,
8409
1
                kse->pubKeyLen);
8410
1
            XMEMSET(kse->pubKey, 0, pSz - kse->pubKeyLen);
8411
1
            kse->pubKeyLen = pSz;
8412
1
        }
8413
8414
174
        if (pvtSz != kse->keyLen) {
8415
            /* Zero pad the front of the private key */
8416
0
            XMEMMOVE(kse->privKey + pvtSz - kse->keyLen, kse->privKey,
8417
0
                kse->keyLen);
8418
0
            XMEMSET(kse->privKey, 0, pvtSz - kse->keyLen);
8419
0
            kse->keyLen = pvtSz;
8420
0
        }
8421
8422
    #ifdef WOLFSSL_DEBUG_TLS
8423
        WOLFSSL_MSG("Public DH Key");
8424
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8425
    #endif
8426
174
    }
8427
8428
    /* Always release the DH key to free up memory.
8429
     * The DhKey will be setup again in TLSX_KeyShare_ProcessDh */
8430
358
    if (dhKey != NULL) {
8431
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8432
        defined(WC_ASYNC_ENABLE_DH)
8433
        if (dhKey->nb != NULL) {
8434
            XFREE(dhKey->nb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8435
            dhKey->nb = NULL;
8436
        }
8437
    #endif
8438
323
        wc_FreeDhKey(dhKey);
8439
323
    }
8440
358
    XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
8441
358
    kse->key = NULL;
8442
8443
358
    if (ret != 0) {
8444
        /* Cleanup on error, otherwise data owned by key share entry */
8445
184
        if (kse->privKey) {
8446
180
            ForceZero(kse->privKey, pvtSz);
8447
180
            XFREE(kse->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8448
180
            kse->privKey = NULL;
8449
180
        }
8450
184
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8451
184
        kse->pubKey = NULL;
8452
184
    }
8453
#else
8454
    (void)ssl;
8455
    (void)kse;
8456
8457
    ret = NOT_COMPILED_IN;
8458
    WOLFSSL_ERROR_VERBOSE(ret);
8459
#endif
8460
8461
358
    return ret;
8462
360
}
8463
8464
/* Create a key share entry using X25519 parameters group.
8465
 * Generates a key pair.
8466
 *
8467
 * ssl   The SSL/TLS object.
8468
 * kse   The key share entry object.
8469
 * returns 0 on success, otherwise failure.
8470
 */
8471
static int TLSX_KeyShare_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
8472
4.79k
{
8473
4.79k
    int ret = 0;
8474
4.79k
#ifdef HAVE_CURVE25519
8475
4.79k
    curve25519_key* key = (curve25519_key*)kse->key;
8476
8477
4.79k
    if (kse->key == NULL) {
8478
        /* Allocate a Curve25519 key to hold private key. */
8479
4.79k
        kse->key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
8480
4.79k
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8481
4.79k
        if (kse->key == NULL) {
8482
3
            WOLFSSL_MSG("GenX25519Key memory error");
8483
3
            return MEMORY_E;
8484
3
        }
8485
8486
        /* Initialize the Curve25519 key. */
8487
4.78k
        ret = wc_curve25519_init_ex((curve25519_key*)kse->key, ssl->heap,
8488
4.78k
            ssl->devId);
8489
4.78k
        if (ret == 0) {
8490
            /* setting "key" means okay to call wc_curve25519_free */
8491
4.78k
            key = (curve25519_key*)kse->key;
8492
4.78k
            kse->keyLen = CURVE25519_KEYSIZE;
8493
4.78k
        }
8494
    #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8495
        defined(WC_ASYNC_ENABLE_X25519)
8496
        /* Only set non-blocking context when async device is active. With
8497
         * INVALID_DEVID there is no async loop to retry on FP_WOULDBLOCK, so
8498
         * skip non-blocking setup and use blocking mode instead. */
8499
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
8500
            x25519_nb_ctx_t* nb_ctx = (x25519_nb_ctx_t*)XMALLOC(
8501
                sizeof(x25519_nb_ctx_t), ssl->heap,
8502
                DYNAMIC_TYPE_TMP_BUFFER);
8503
            if (nb_ctx == NULL) {
8504
                ret = MEMORY_E;
8505
            }
8506
            else {
8507
                ret = wc_curve25519_set_nonblock(key, nb_ctx);
8508
                if (ret != 0) {
8509
                    XFREE(nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8510
                }
8511
            }
8512
        }
8513
    #endif /* WC_X25519_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8514
              WC_ASYNC_ENABLE_X25519 */
8515
4.78k
    }
8516
8517
    /* Outside the allocation guard: a WC_PENDING_E retry must regenerate,
8518
     * not export an ungenerated key. pubKeyLen marks a completed export on
8519
     * every backend; pubSet stops the SW-async retry re-arming forever. */
8520
4.79k
    if (ret == 0 && key != NULL && kse->pubKeyLen == 0 && !key->pubSet) {
8521
    #ifdef WOLFSSL_STATIC_EPHEMERAL
8522
        ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE25519,
8523
            kse->key);
8524
        if (ret != 0) /* on failure, fallback to local key generation */
8525
    #endif
8526
4.78k
        {
8527
        #ifdef WOLFSSL_ASYNC_CRYPT
8528
            /* initialize event */
8529
            ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
8530
            if (ret != 0)
8531
                return ret;
8532
        #endif
8533
4.78k
            ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
8534
8535
            /* Handle async pending response */
8536
        #ifdef WOLFSSL_ASYNC_CRYPT
8537
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8538
                return wolfSSL_AsyncPush(ssl, &key->asyncDev);
8539
            }
8540
        #endif /* WOLFSSL_ASYNC_CRYPT */
8541
4.78k
        }
8542
4.78k
    }
8543
8544
4.79k
    if (ret == 0 && kse->pubKey == NULL) {
8545
        /* Allocate space for the public key. */
8546
4.76k
        kse->pubKey = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
8547
4.76k
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8548
4.76k
        if (kse->pubKey == NULL) {
8549
5
            WOLFSSL_MSG("GenX25519Key pub memory error");
8550
5
            ret = MEMORY_E;
8551
5
        }
8552
4.76k
    }
8553
8554
4.79k
    if (ret == 0) {
8555
        /* Export Curve25519 public key. */
8556
4.76k
        kse->pubKeyLen = CURVE25519_KEYSIZE;
8557
4.76k
        if (wc_curve25519_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8558
4.76k
                                                  EC25519_LITTLE_ENDIAN) != 0) {
8559
0
            ret = ECC_EXPORT_ERROR;
8560
0
            WOLFSSL_ERROR_VERBOSE(ret);
8561
0
        }
8562
4.76k
        kse->pubKeyLen = CURVE25519_KEYSIZE; /* always CURVE25519_KEYSIZE */
8563
4.76k
    }
8564
8565
#ifdef WOLFSSL_DEBUG_TLS
8566
    if (ret == 0) {
8567
        WOLFSSL_MSG("Public Curve25519 Key");
8568
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8569
    }
8570
#endif
8571
8572
4.79k
    if (ret != 0) {
8573
        /* Data owned by key share entry otherwise. */
8574
30
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8575
30
        kse->pubKey = NULL;
8576
30
        if (key != NULL) {
8577
        #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
8578
            if (key->nb_ctx != NULL) {
8579
                XFREE(key->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8580
            }
8581
        #endif
8582
30
            wc_curve25519_free(key);
8583
30
        }
8584
30
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8585
30
        kse->key = NULL;
8586
30
    }
8587
#else
8588
    (void)ssl;
8589
    (void)kse;
8590
8591
    ret = NOT_COMPILED_IN;
8592
    WOLFSSL_ERROR_VERBOSE(ret);
8593
#endif /* HAVE_CURVE25519 */
8594
8595
4.79k
    return ret;
8596
4.79k
}
8597
8598
/* Create a key share entry using X448 parameters group.
8599
 * Generates a key pair.
8600
 *
8601
 * ssl   The SSL/TLS object.
8602
 * kse   The key share entry object.
8603
 * returns 0 on success, otherwise failure.
8604
 */
8605
static int TLSX_KeyShare_GenX448Key(WOLFSSL *ssl, KeyShareEntry* kse)
8606
30
{
8607
30
    int ret = 0;
8608
30
#ifdef HAVE_CURVE448
8609
30
    curve448_key* key = (curve448_key*)kse->key;
8610
8611
30
    if (kse->key == NULL) {
8612
        /* Allocate a Curve448 key to hold private key. */
8613
29
        kse->key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
8614
29
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8615
29
        if (kse->key == NULL) {
8616
2
            WOLFSSL_MSG("GenX448Key memory error");
8617
2
            return MEMORY_E;
8618
2
        }
8619
8620
        /* Make an Curve448 key. */
8621
27
        ret = wc_curve448_init_ex((curve448_key*)kse->key, ssl->heap,
8622
27
                                  ssl->devId);
8623
27
        if (ret == 0) {
8624
27
            key = (curve448_key*)kse->key;
8625
27
            kse->keyLen = CURVE448_KEY_SIZE;
8626
8627
            #ifdef WOLFSSL_STATIC_EPHEMERAL
8628
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE448, kse->key);
8629
            if (ret != 0)
8630
        #endif
8631
27
            {
8632
27
                ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
8633
27
            }
8634
27
        }
8635
27
    }
8636
8637
28
    if (ret == 0 && kse->pubKey == NULL) {
8638
        /* Allocate space for the public key. */
8639
23
        kse->pubKey = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
8640
23
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8641
23
        if (kse->pubKey == NULL) {
8642
2
            WOLFSSL_MSG("GenX448Key pub memory error");
8643
2
            ret = MEMORY_E;
8644
2
        }
8645
23
    }
8646
8647
28
    if (ret == 0) {
8648
        /* Export Curve448 public key. */
8649
22
        kse->pubKeyLen = CURVE448_KEY_SIZE;
8650
22
        if (wc_curve448_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8651
22
                                                    EC448_LITTLE_ENDIAN) != 0) {
8652
0
            ret = ECC_EXPORT_ERROR;
8653
0
        }
8654
22
        kse->pubKeyLen = CURVE448_KEY_SIZE; /* always CURVE448_KEY_SIZE */
8655
22
    }
8656
8657
#ifdef WOLFSSL_DEBUG_TLS
8658
    if (ret == 0) {
8659
        WOLFSSL_MSG("Public Curve448 Key");
8660
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8661
    }
8662
#endif
8663
8664
28
    if (ret != 0) {
8665
        /* Data owned by key share entry otherwise. */
8666
6
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8667
6
        kse->pubKey = NULL;
8668
6
        if (key != NULL)
8669
6
            wc_curve448_free(key);
8670
6
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8671
6
        kse->key = NULL;
8672
6
    }
8673
#else
8674
    (void)ssl;
8675
    (void)kse;
8676
8677
    ret = NOT_COMPILED_IN;
8678
    WOLFSSL_ERROR_VERBOSE(ret);
8679
#endif /* HAVE_CURVE448 */
8680
8681
28
    return ret;
8682
30
}
8683
8684
/* Create a key share entry using named elliptic curve parameters group.
8685
 * Generates a key pair.
8686
 *
8687
 * ssl   The SSL/TLS object.
8688
 * kse   The key share entry object.
8689
 * returns 0 on success, otherwise failure.
8690
 */
8691
static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
8692
{
8693
    int ret = 0;
8694
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
8695
    word32 keySize = 0;
8696
    word16 curveId = (word16) ECC_CURVE_INVALID;
8697
    ecc_key* eccKey = (ecc_key*)kse->key;
8698
8699
    /* Translate named group to a curve id. */
8700
    switch (kse->group) {
8701
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
8702
        #ifndef NO_ECC_SECP
8703
        case WOLFSSL_ECC_SECP256R1:
8704
            curveId = ECC_SECP256R1;
8705
            break;
8706
        #endif /* !NO_ECC_SECP */
8707
        #ifdef WOLFSSL_SM2
8708
        case WOLFSSL_ECC_SM2P256V1:
8709
            curveId = ECC_SM2P256V1;
8710
            break;
8711
        #endif /* !WOLFSSL_SM2 */
8712
        #ifdef HAVE_ECC_BRAINPOOL
8713
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
8714
            curveId = ECC_BRAINPOOLP256R1;
8715
            break;
8716
        #endif /* HAVE_ECC_BRAINPOOL */
8717
    #endif
8718
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
8719
        #ifndef NO_ECC_SECP
8720
        case WOLFSSL_ECC_SECP384R1:
8721
            curveId = ECC_SECP384R1;
8722
            break;
8723
        #endif /* !NO_ECC_SECP */
8724
        #ifdef HAVE_ECC_BRAINPOOL
8725
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
8726
            curveId = ECC_BRAINPOOLP384R1;
8727
            break;
8728
        #endif /* HAVE_ECC_BRAINPOOL */
8729
    #endif
8730
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
8731
        #ifdef HAVE_ECC_BRAINPOOL
8732
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
8733
            curveId = ECC_BRAINPOOLP512R1;
8734
            break;
8735
        #endif /* HAVE_ECC_BRAINPOOL */
8736
    #endif
8737
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
8738
        #ifndef NO_ECC_SECP
8739
        case WOLFSSL_ECC_SECP521R1:
8740
            curveId = ECC_SECP521R1;
8741
            break;
8742
        #endif /* !NO_ECC_SECP */
8743
    #endif
8744
        default:
8745
            WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
8746
            return BAD_FUNC_ARG;
8747
    }
8748
8749
    {
8750
        int size = wc_ecc_get_curve_size_from_id(curveId);
8751
        if (size < 0) {
8752
            WOLFSSL_ERROR_VERBOSE(size);
8753
            return size;
8754
        }
8755
        keySize = (word32)size;
8756
    }
8757
8758
    if (kse->key == NULL) {
8759
        /* Allocate an ECC key to hold private key. */
8760
        kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC);
8761
        if (kse->key == NULL) {
8762
            WOLFSSL_MSG_EX("Failed to allocate %d bytes, ssl->heap: %p",
8763
                           (int)sizeof(ecc_key), (wc_ptr_t)ssl->heap);
8764
            WOLFSSL_MSG("EccTempKey Memory error!");
8765
            return MEMORY_E;
8766
        }
8767
8768
        /* Initialize an ECC key struct for the ephemeral key */
8769
        ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
8770
        if (ret == 0) {
8771
            /* setting eccKey means okay to call wc_ecc_free */
8772
            eccKey = (ecc_key*)kse->key;
8773
        }
8774
8775
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8776
        defined(WC_ASYNC_ENABLE_ECC)
8777
        /* Only set non-blocking context when async device is active. With
8778
         * INVALID_DEVID there is no async loop to retry on FP_WOULDBLOCK, so
8779
         * skip non-blocking setup and use blocking mode instead. */
8780
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
8781
            ecc_nb_ctx_t* eccNbCtx = (ecc_nb_ctx_t*)XMALLOC(
8782
                sizeof(ecc_nb_ctx_t), ssl->heap,
8783
                DYNAMIC_TYPE_TMP_BUFFER);
8784
            if (eccNbCtx == NULL) {
8785
                ret = MEMORY_E;
8786
            }
8787
            else {
8788
                ret = wc_ecc_set_nonblock((ecc_key*)kse->key, eccNbCtx);
8789
                if (ret != 0) {
8790
                    XFREE(eccNbCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8791
                }
8792
            }
8793
        }
8794
    #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8795
              WC_ASYNC_ENABLE_ECC */
8796
    }
8797
8798
    /* Outside the allocation guard: a WC_PENDING_E retry must regenerate,
8799
     * not export an ungenerated key. The key type marks completion;
8800
     * kse->pubKey covers backends that never touch the ecc_key (TSIP). */
8801
    if (ret == 0 && eccKey != NULL) {
8802
        /* Outside the generation guard below: the export alloc reads
8803
         * pubKeyLen even when generation is skipped. */
8804
        kse->keyLen = keySize;
8805
        kse->pubKeyLen = keySize * 2 + 1;
8806
    }
8807
8808
    if (ret == 0 && eccKey != NULL && kse->pubKey == NULL &&
8809
            eccKey->type != ECC_PRIVATEKEY &&
8810
            eccKey->type != ECC_PRIVATEKEY_ONLY) {
8811
    #if defined(WOLFSSL_RENESAS_TSIP_TLS)
8812
        ret = tsip_Tls13GenEccKeyPair(ssl, kse);
8813
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
8814
            return ret;
8815
        }
8816
    #endif
8817
8818
    #ifdef WOLFSSL_STATIC_EPHEMERAL
8819
        ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_ECDH, kse->key);
8820
        if (ret != 0 || eccKey->dp->id != curveId)
8821
    #endif
8822
        {
8823
            /* set curve info for EccMakeKey "peer" info */
8824
            ret = wc_ecc_set_curve(eccKey, (int)kse->keyLen, curveId);
8825
            if (ret == 0) {
8826
                /* Generate ephemeral ECC key; a crypto callback retry
8827
                 * re-enters here, x963 export follows below. */
8828
                ret = EccMakeKey(ssl, eccKey, eccKey);
8829
            }
8830
        #ifdef WOLFSSL_ASYNC_CRYPT
8831
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
8832
                return ret;
8833
        #endif
8834
        }
8835
    }
8836
8837
    if (ret == 0 && kse->pubKey == NULL) {
8838
        /* Allocate space for the public key */
8839
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8840
            DYNAMIC_TYPE_PUBLIC_KEY);
8841
        if (kse->pubKey == NULL) {
8842
            WOLFSSL_MSG("Key data Memory error");
8843
            ret = MEMORY_E;
8844
        }
8845
    }
8846
8847
    if (ret == 0) {
8848
        XMEMSET(kse->pubKey, 0, kse->pubKeyLen);
8849
8850
        /* Export public key. */
8851
        PRIVATE_KEY_UNLOCK();
8852
        if (wc_ecc_export_x963(eccKey, kse->pubKey, &kse->pubKeyLen) != 0) {
8853
            ret = ECC_EXPORT_ERROR;
8854
            WOLFSSL_ERROR_VERBOSE(ret);
8855
        }
8856
        PRIVATE_KEY_LOCK();
8857
    }
8858
#ifdef WOLFSSL_DEBUG_TLS
8859
    if (ret == 0) {
8860
        WOLFSSL_MSG("Public ECC Key");
8861
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8862
    }
8863
#endif
8864
8865
    if (ret != 0) {
8866
        /* Cleanup on error, otherwise data owned by key share entry */
8867
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8868
        kse->pubKey = NULL;
8869
        if (eccKey != NULL) {
8870
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8871
        defined(WC_ASYNC_ENABLE_ECC)
8872
            if (eccKey->nb_ctx != NULL) {
8873
                XFREE(eccKey->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8874
            }
8875
    #endif
8876
            wc_ecc_free(eccKey);
8877
        }
8878
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8879
        kse->key = NULL;
8880
    }
8881
#else
8882
    (void)ssl;
8883
    (void)kse;
8884
8885
    ret = NOT_COMPILED_IN;
8886
    WOLFSSL_ERROR_VERBOSE(ret);
8887
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
8888
8889
    return ret;
8890
}
8891
8892
#ifdef WOLFSSL_HAVE_MLKEM
8893
#if (defined(WOLFSSL_MLKEM_CACHE_A) || \
8894
    (defined(HAVE_PKCS11) && !defined(NO_PKCS11_MLKEM))) && \
8895
    !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY)
8896
    /* Store MlKemKey object rather than private key bytes in key share entry.
8897
     * Improves performance at cost of more dynamic memory being used. */
8898
    #define WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8899
#endif
8900
#if defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY) && \
8901
    defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ)
8902
    #error "Choose WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY or "
8903
           "WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ"
8904
#endif
8905
8906
#if (!defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
8907
     !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)) || \
8908
    !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) || \
8909
    (!defined(WOLFSSL_MLKEM_NO_DECAPSULATE) && \
8910
     !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ))
8911
static int mlkem_id2type(int id, int *type)
8912
4.27k
{
8913
4.27k
    int ret = 0;
8914
8915
4.27k
    switch (id) {
8916
0
#ifndef WOLFSSL_NO_ML_KEM
8917
0
    #ifndef WOLFSSL_NO_ML_KEM_512
8918
0
        case WOLFSSL_ML_KEM_512:
8919
0
            *type = WC_ML_KEM_512;
8920
0
            break;
8921
0
    #endif
8922
0
    #ifndef WOLFSSL_NO_ML_KEM_768
8923
4.25k
        case WOLFSSL_ML_KEM_768:
8924
4.25k
            *type = WC_ML_KEM_768;
8925
4.25k
            break;
8926
0
    #endif
8927
0
    #ifndef WOLFSSL_NO_ML_KEM_1024
8928
25
        case WOLFSSL_ML_KEM_1024:
8929
25
            *type = WC_ML_KEM_1024;
8930
25
            break;
8931
0
    #endif
8932
0
#endif
8933
#ifdef WOLFSSL_MLKEM_KYBER
8934
    #ifdef WOLFSSL_KYBER512
8935
        case WOLFSSL_KYBER_LEVEL1:
8936
            *type = KYBER512;
8937
            break;
8938
    #endif
8939
    #ifdef WOLFSSL_KYBER768
8940
        case WOLFSSL_KYBER_LEVEL3:
8941
            *type = KYBER768;
8942
            break;
8943
    #endif
8944
    #ifdef WOLFSSL_KYBER1024
8945
        case WOLFSSL_KYBER_LEVEL5:
8946
            *type = KYBER1024;
8947
            break;
8948
    #endif
8949
#endif
8950
0
        default:
8951
0
            ret = NOT_COMPILED_IN;
8952
0
            break;
8953
4.27k
    }
8954
8955
4.27k
    return ret;
8956
4.27k
}
8957
#endif
8958
8959
#if defined(WOLFSSL_NO_ML_KEM_768) && defined(WOLFSSL_NO_ML_KEM_1024) && \
8960
    defined(WOLFSSL_PQC_HYBRIDS)
8961
    #error "PQC hybrid combinations require either ML-KEM 768 or ML-KEM 1024"
8962
#endif
8963
8964
/* Structures and objects needed for hybrid key exchanges using both classic
8965
 * ECDHE and PQC KEM key material. */
8966
typedef struct PqcHybridMapping {
8967
    int hybrid;
8968
    int ecc;
8969
    int pqc;
8970
    int pqc_first;
8971
} PqcHybridMapping;
8972
8973
static const PqcHybridMapping pqc_hybrid_mapping[] = {
8974
#ifndef WOLFSSL_NO_ML_KEM
8975
#ifdef WOLFSSL_PQC_HYBRIDS
8976
    {WOLFSSL_SECP256R1MLKEM768, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_768, 0},
8977
    {WOLFSSL_SECP384R1MLKEM1024, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_1024, 0},
8978
#endif /* WOLFSSL_PQC_HYBRIDS */
8979
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
8980
    {WOLFSSL_SECP256R1MLKEM512, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8981
    {WOLFSSL_SECP384R1MLKEM768, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8982
    {WOLFSSL_SECP521R1MLKEM1024, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8983
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
8984
    {WOLFSSL_P256_ML_KEM_512_OLD, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8985
    {WOLFSSL_P384_ML_KEM_768_OLD, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8986
    {WOLFSSL_P521_ML_KEM_1024_OLD, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8987
#endif /* WOLFSSL_ML_KEM_USE_OLD_IDS */
8988
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
8989
#ifdef HAVE_CURVE25519
8990
#ifdef WOLFSSL_PQC_HYBRIDS
8991
    {WOLFSSL_X25519MLKEM768, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_768, 1},
8992
#endif /* WOLFSSL_PQC_HYBRIDS */
8993
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
8994
    {WOLFSSL_X25519MLKEM512, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_512, 1},
8995
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
8996
#endif /* HAVE_CURVE25519 */
8997
#ifdef HAVE_CURVE448
8998
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
8999
    {WOLFSSL_X448MLKEM768, WOLFSSL_ECC_X448, WOLFSSL_ML_KEM_768, 1},
9000
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
9001
#endif /* HAVE_CURVE448 */
9002
#endif /* WOLFSSL_NO_ML_KEM */
9003
#ifdef WOLFSSL_MLKEM_KYBER
9004
    {WOLFSSL_P256_KYBER_LEVEL1, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL1, 0},
9005
    {WOLFSSL_P384_KYBER_LEVEL3, WOLFSSL_ECC_SECP384R1, WOLFSSL_KYBER_LEVEL3, 0},
9006
    {WOLFSSL_P256_KYBER_LEVEL3, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL3, 0},
9007
    {WOLFSSL_P521_KYBER_LEVEL5, WOLFSSL_ECC_SECP521R1, WOLFSSL_KYBER_LEVEL5, 0},
9008
#ifdef HAVE_CURVE25519
9009
    {WOLFSSL_X25519_KYBER_LEVEL1, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL1, 0},
9010
    {WOLFSSL_X25519_KYBER_LEVEL3, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL3, 0},
9011
#endif
9012
#ifdef HAVE_CURVE448
9013
    {WOLFSSL_X448_KYBER_LEVEL3, WOLFSSL_ECC_X448, WOLFSSL_KYBER_LEVEL3, 0},
9014
#endif
9015
#endif /* WOLFSSL_MLKEM_KYBER */
9016
    {0, 0, 0, 0}
9017
};
9018
9019
/* Map an ecc-pqc hybrid group into its ecc group and pqc kem group. */
9020
static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group)
9021
8.79k
{
9022
8.79k
    int i;
9023
9024
8.79k
    if (pqc != NULL)
9025
4.31k
        *pqc = 0;
9026
8.79k
    if (ecc != NULL)
9027
8.79k
        *ecc = 0;
9028
8.79k
    if (pqc_first != NULL)
9029
4.31k
        *pqc_first = 0;
9030
9031
26.1k
    for (i = 0; pqc_hybrid_mapping[i].hybrid != 0; i++) {
9032
26.1k
        if (pqc_hybrid_mapping[i].hybrid == group) {
9033
8.76k
            if (pqc != NULL)
9034
4.31k
                *pqc = pqc_hybrid_mapping[i].pqc;
9035
8.76k
            if (ecc != NULL)
9036
8.76k
                *ecc = pqc_hybrid_mapping[i].ecc;
9037
8.76k
            if (pqc_first != NULL)
9038
4.31k
                *pqc_first = pqc_hybrid_mapping[i].pqc_first;
9039
8.76k
            break;
9040
8.76k
        }
9041
26.1k
    }
9042
8.79k
}
9043
9044
#if !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
9045
    !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9046
/* Create a key share entry using pqc parameters group on the client side.
9047
 * Generates a key pair.
9048
 *
9049
 * ssl   The SSL/TLS object.
9050
 * kse   The key share entry object.
9051
 * returns 0 on success, otherwise failure.
9052
 */
9053
static int TLSX_KeyShare_GenPqcKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
9054
4.27k
{
9055
4.27k
    int ret = 0;
9056
4.27k
    int type = 0;
9057
4.27k
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9058
4.27k
        WC_DECLARE_VAR(kem, MlKemKey, 1, 0);
9059
4.27k
    byte* privKey = NULL;
9060
4.27k
    word32 privSz = 0;
9061
#else
9062
    MlKemKey* kem = NULL;
9063
#endif
9064
9065
    /* This gets called twice. Once during parsing of the key share and once
9066
     * during the population of the extension. No need to do work the second
9067
     * time. Just return success if its already been done. */
9068
4.27k
    if (kse->pubKey != NULL) {
9069
0
        return ret;
9070
0
    }
9071
9072
    /* Get the type of key we need from the key share group. */
9073
4.27k
    ret = mlkem_id2type(kse->group, &type);
9074
4.27k
    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
9075
0
        WOLFSSL_MSG("Invalid ML-KEM algorithm specified.");
9076
0
        ret = BAD_FUNC_ARG;
9077
0
    }
9078
9079
4.27k
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9080
9081
4.27k
    #ifdef WOLFSSL_SMALL_STACK
9082
4.27k
    if (ret == 0) {
9083
4.27k
        kem = (MlKemKey *)XMALLOC(sizeof(*kem), ssl->heap,
9084
4.27k
                                  DYNAMIC_TYPE_PRIVATE_KEY);
9085
4.27k
        if (kem == NULL) {
9086
6
            WOLFSSL_MSG("KEM memory allocation failure");
9087
6
            ret = MEMORY_ERROR;
9088
6
        }
9089
4.27k
    }
9090
4.27k
    #endif /* WOLFSSL_SMALL_STACK */
9091
9092
4.27k
    if (ret == 0) {
9093
4.27k
        ret = wc_MlKemKey_Init(kem, type, ssl->heap, ssl->devId);
9094
4.27k
        if (ret != 0) {
9095
0
            WOLFSSL_MSG("Failed to initialize ML-KEM Key.");
9096
0
        }
9097
4.27k
    }
9098
9099
4.27k
    if (ret == 0) {
9100
4.27k
        ret = wc_MlKemKey_PrivateKeySize(kem, &privSz);
9101
4.27k
    }
9102
4.27k
    if (ret == 0) {
9103
4.27k
        ret = wc_MlKemKey_PublicKeySize(kem, &kse->pubKeyLen);
9104
4.27k
    }
9105
9106
4.27k
    if (ret == 0) {
9107
4.27k
        privKey = (byte*)XMALLOC(privSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9108
4.27k
        if (privKey == NULL) {
9109
2
            WOLFSSL_MSG("privkey memory allocation failure");
9110
2
            ret = MEMORY_ERROR;
9111
2
        }
9112
4.27k
    }
9113
#else
9114
    if (ret == 0) {
9115
        /* Allocate an ML-KEM key to hold private key. */
9116
        kem = (MlKemKey*)XMALLOC(sizeof(MlKemKey), ssl->heap,
9117
                                 DYNAMIC_TYPE_PRIVATE_KEY);
9118
        if (kem == NULL) {
9119
            WOLFSSL_MSG("KEM memory allocation failure");
9120
            ret = MEMORY_ERROR;
9121
        }
9122
    }
9123
    if (ret == 0) {
9124
        ret = wc_MlKemKey_Init(kem, type, ssl->heap, ssl->devId);
9125
        if (ret != 0) {
9126
            WOLFSSL_MSG("Failed to initialize ML-KEM Key.");
9127
        }
9128
    }
9129
    if (ret == 0) {
9130
        ret = wc_MlKemKey_PublicKeySize(kem, &kse->pubKeyLen);
9131
    }
9132
#endif
9133
9134
4.27k
    if (ret == 0) {
9135
4.27k
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
9136
4.27k
                                     DYNAMIC_TYPE_PUBLIC_KEY);
9137
4.27k
        if (kse->pubKey == NULL) {
9138
2
            WOLFSSL_MSG("pubkey memory allocation failure");
9139
2
            ret = MEMORY_ERROR;
9140
2
        }
9141
4.27k
    }
9142
9143
4.27k
    if (ret == 0) {
9144
4.26k
        ret = wc_MlKemKey_MakeKey(kem, ssl->rng);
9145
4.26k
        if (ret != 0) {
9146
12
            WOLFSSL_MSG("ML-KEM keygen failure");
9147
12
        }
9148
4.26k
    }
9149
4.27k
    if (ret == 0) {
9150
4.25k
        ret = wc_MlKemKey_EncodePublicKey(kem, kse->pubKey,
9151
4.25k
                                          kse->pubKeyLen);
9152
4.25k
    }
9153
9154
4.27k
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9155
4.27k
    if (ret == 0) {
9156
4.25k
        PRIVATE_KEY_UNLOCK();
9157
4.25k
        ret = wc_MlKemKey_EncodePrivateKey(kem, privKey, privSz);
9158
4.25k
        PRIVATE_KEY_LOCK();
9159
4.25k
    }
9160
4.27k
#endif
9161
9162
#ifdef WOLFSSL_DEBUG_TLS
9163
    WOLFSSL_MSG("Public ML-KEM Key");
9164
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
9165
#endif
9166
9167
4.27k
    if (ret != 0) {
9168
        /* Data owned by key share entry otherwise. */
9169
22
        wc_MlKemKey_Free(kem);
9170
22
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9171
22
        kse->pubKey = NULL;
9172
22
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9173
22
        if (privKey) {
9174
14
            ForceZero(privKey, privSz);
9175
14
            XFREE(privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9176
14
            privKey = NULL;
9177
14
        }
9178
    #else
9179
        XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9180
        kse->key = NULL;
9181
    #endif
9182
22
    }
9183
4.25k
    else {
9184
4.25k
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9185
4.25k
        wc_MlKemKey_Free(kem);
9186
4.25k
        kse->privKey = (byte*)privKey;
9187
4.25k
        kse->privKeyLen = privSz;
9188
    #else
9189
        kse->key = kem;
9190
    #endif
9191
4.25k
    }
9192
9193
4.27k
    #if !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ) && \
9194
4.27k
        defined(WOLFSSL_SMALL_STACK)
9195
4.27k
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9196
4.27k
    #endif
9197
9198
4.27k
    return ret;
9199
4.27k
}
9200
9201
/* Create a key share entry using both ecdhe and pqc parameters groups.
9202
 * Generates two key pairs on the client side.
9203
 *
9204
 * ssl   The SSL/TLS object.
9205
 * kse   The key share entry object.
9206
 * returns 0 on success, otherwise failure.
9207
 */
9208
static int TLSX_KeyShare_GenPqcHybridKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
9209
4.33k
{
9210
4.33k
    int ret = 0;
9211
4.33k
    KeyShareEntry *ecc_kse = NULL;
9212
4.33k
    KeyShareEntry *pqc_kse = NULL;
9213
4.33k
    int pqc_group = 0;
9214
4.33k
    int ecc_group = 0;
9215
4.33k
    int pqc_first = 0;
9216
9217
    /* This gets called twice. Once during parsing of the key share and once
9218
     * during the population of the extension. No need to do work the second
9219
     * time. Just return success if its already been done. */
9220
4.33k
    if (kse->pubKey != NULL) {
9221
23
        return ret;
9222
23
    }
9223
9224
    /* Determine the ECC and PQC group of the hybrid combination */
9225
4.31k
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, kse->group);
9226
4.31k
    if (ecc_group == 0 || pqc_group == 0) {
9227
0
        WOLFSSL_MSG("Invalid hybrid group");
9228
0
        ret = BAD_FUNC_ARG;
9229
0
    }
9230
9231
4.31k
    if (ret == 0) {
9232
4.31k
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
9233
4.31k
                   DYNAMIC_TYPE_TLSX);
9234
4.31k
        if (ecc_kse == NULL) {
9235
1
            WOLFSSL_MSG("kse memory allocation failure");
9236
1
            ret = MEMORY_ERROR;
9237
1
        }
9238
4.31k
        else {
9239
4.31k
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
9240
4.31k
        }
9241
4.31k
    }
9242
4.31k
    if (ret == 0) {
9243
4.31k
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
9244
4.31k
                   DYNAMIC_TYPE_TLSX);
9245
4.31k
        if (pqc_kse == NULL) {
9246
2
            WOLFSSL_MSG("kse memory allocation failure");
9247
2
            ret = MEMORY_ERROR;
9248
2
        }
9249
4.31k
        else {
9250
4.31k
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
9251
4.31k
        }
9252
4.31k
    }
9253
9254
    /* Generate ECC key share part */
9255
4.31k
    if (ret == 0) {
9256
4.31k
        ecc_kse->group = ecc_group;
9257
9258
    #ifdef WOLFSSL_ASYNC_CRYPT
9259
        /* Check if the provided kse already contains an ECC key and the
9260
         * last error was WC_PENDING_E. In this case, we already tried to
9261
         * generate an ECC key. Hence, we have to restore it. */
9262
        if (kse->key != NULL && kse->keyLen > 0 &&
9263
            kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9264
            ecc_kse->key = kse->key;
9265
            ecc_kse->keyLen = kse->keyLen;
9266
            ecc_kse->pubKeyLen = kse->pubKeyLen;
9267
            ecc_kse->lastRet = kse->lastRet;
9268
            kse->key = NULL;
9269
        }
9270
    #endif
9271
9272
4.31k
    #ifdef HAVE_CURVE25519
9273
4.31k
        if (ecc_group == WOLFSSL_ECC_X25519) {
9274
4.23k
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
9275
4.23k
        }
9276
73
        else
9277
73
    #endif
9278
73
    #ifdef HAVE_CURVE448
9279
73
        if (ecc_group == WOLFSSL_ECC_X448) {
9280
0
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
9281
0
        }
9282
73
        else
9283
73
    #endif
9284
73
        {
9285
73
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
9286
73
        }
9287
9288
    #ifdef WOLFSSL_ASYNC_CRYPT
9289
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9290
            /* Store the generated ECC key in the provided kse to later
9291
             * restore it.*/
9292
            kse->key = ecc_kse->key;
9293
            kse->keyLen = ecc_kse->keyLen;
9294
            kse->pubKeyLen = ecc_kse->pubKeyLen;
9295
            ecc_kse->key = NULL;
9296
        }
9297
    #endif
9298
4.31k
    }
9299
9300
    /* Generate PQC key share part */
9301
4.31k
    if (ret == 0) {
9302
4.27k
        pqc_kse->group = pqc_group;
9303
4.27k
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, pqc_kse);
9304
        /* No error message, TLSX_KeyShare_GenPqcKeyClient will do it. */
9305
4.27k
    }
9306
9307
    /* Allocate memory for combined public key */
9308
4.31k
    if (ret == 0) {
9309
4.25k
        kse->pubKey = (byte*)XMALLOC(ecc_kse->pubKeyLen + pqc_kse->pubKeyLen,
9310
4.25k
                                     ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9311
4.25k
        if (kse->pubKey == NULL) {
9312
23
            WOLFSSL_MSG("pubkey memory allocation failure");
9313
23
            ret = MEMORY_ERROR;
9314
23
        }
9315
4.25k
    }
9316
9317
    /* Create combined public key. The order of classic/pqc key material is
9318
     * indicated by the pqc_first variable. */
9319
4.31k
    if (ret == 0) {
9320
4.23k
        if (pqc_first) {
9321
4.19k
            XMEMCPY(kse->pubKey, pqc_kse->pubKey, pqc_kse->pubKeyLen);
9322
4.19k
            XMEMCPY(kse->pubKey + pqc_kse->pubKeyLen, ecc_kse->pubKey,
9323
4.19k
                    ecc_kse->pubKeyLen);
9324
4.19k
        }
9325
43
        else {
9326
43
            XMEMCPY(kse->pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen);
9327
43
            XMEMCPY(kse->pubKey + ecc_kse->pubKeyLen, pqc_kse->pubKey,
9328
43
                    pqc_kse->pubKeyLen);
9329
43
        }
9330
4.23k
        kse->pubKeyLen = ecc_kse->pubKeyLen + pqc_kse->pubKeyLen;
9331
4.23k
    }
9332
9333
    /* Store the private keys.
9334
     * Note we are saving the PQC private key and ECC private key
9335
     * separately. That's because the ECC private key is not simply a
9336
     * buffer. Its is an ecc_key struct. */
9337
4.31k
    if (ret == 0) {
9338
4.23k
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9339
        /* PQC private key is an encoded byte array */
9340
4.23k
        kse->privKey = pqc_kse->privKey;
9341
4.23k
        kse->privKeyLen = pqc_kse->privKeyLen;
9342
4.23k
        pqc_kse->privKey = NULL;
9343
    #else
9344
        /* PQC private key is a pointer to MlKemKey object */
9345
        kse->privKey = (byte*)pqc_kse->key;
9346
        kse->privKeyLen = 0;
9347
        pqc_kse->key = NULL;
9348
    #endif
9349
        /* ECC private key is a pointer to ecc_key object */
9350
4.23k
        kse->key = ecc_kse->key;
9351
4.23k
        kse->keyLen = ecc_kse->keyLen;
9352
4.23k
        ecc_kse->key = NULL;
9353
4.23k
    }
9354
9355
#ifdef WOLFSSL_DEBUG_TLS
9356
    WOLFSSL_MSG("Public ML-KEM Key");
9357
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
9358
#endif
9359
9360
4.31k
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
9361
4.31k
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
9362
9363
4.31k
    return ret;
9364
4.33k
}
9365
#endif /* !WOLFSSL_MLKEM_NO_MAKE_KEY && !WOLFSSL_MLKEM_NO_DECAPSULATE */
9366
#endif /* WOLFSSL_HAVE_MLKEM */
9367
9368
/* Generate a secret/key using the key share entry.
9369
 *
9370
 * ssl  The SSL/TLS object.
9371
 * kse  The key share entry holding peer data.
9372
 */
9373
int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
9374
6.30k
{
9375
6.30k
    int ret;
9376
    /* Named FFDHE groups have a bit set to identify them. */
9377
6.30k
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(kse->group))
9378
360
        ret = TLSX_KeyShare_GenDhKey(ssl, kse);
9379
5.94k
    else if (kse->group == WOLFSSL_ECC_X25519)
9380
557
        ret = TLSX_KeyShare_GenX25519Key(ssl, kse);
9381
5.38k
    else if (kse->group == WOLFSSL_ECC_X448)
9382
30
        ret = TLSX_KeyShare_GenX448Key(ssl, kse);
9383
5.35k
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
9384
5.35k
    !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9385
5.35k
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group))
9386
0
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, kse);
9387
5.35k
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(kse->group))
9388
4.33k
        ret = TLSX_KeyShare_GenPqcHybridKeyClient(ssl, kse);
9389
1.01k
#endif
9390
1.01k
    else
9391
1.01k
        ret = TLSX_KeyShare_GenEccKey(ssl, kse);
9392
#ifdef WOLFSSL_ASYNC_CRYPT
9393
    kse->lastRet = ret;
9394
#endif
9395
6.30k
    return ret;
9396
6.30k
}
9397
9398
/* Free the key share dynamic data.
9399
 *
9400
 * list  The linked list of key share entry objects.
9401
 * heap  The heap used for allocation.
9402
 */
9403
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
9404
19.7k
{
9405
19.7k
    KeyShareEntry* current;
9406
9407
37.8k
    while ((current = list) != NULL) {
9408
18.1k
        list = current->next;
9409
18.1k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(current->group)) {
9410
751
#ifndef NO_DH
9411
        #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9412
            defined(WC_ASYNC_ENABLE_DH)
9413
            if (current->key != NULL &&
9414
                    ((DhKey*)current->key)->nb != NULL) {
9415
                XFREE(((DhKey*)current->key)->nb, heap,
9416
                    DYNAMIC_TYPE_TMP_BUFFER);
9417
                ((DhKey*)current->key)->nb = NULL;
9418
            }
9419
        #endif
9420
751
            wc_FreeDhKey((DhKey*)current->key);
9421
751
            if (current->privKey != NULL && current->privKeyLen > 0) {
9422
0
                ForceZero(current->privKey, current->privKeyLen);
9423
0
            }
9424
751
#endif
9425
751
        }
9426
17.3k
        else if (current->group == WOLFSSL_ECC_X25519) {
9427
6.11k
#ifdef HAVE_CURVE25519
9428
        #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
9429
            if (current->key != NULL &&
9430
                    ((curve25519_key*)current->key)->nb_ctx != NULL) {
9431
                XFREE(((curve25519_key*)current->key)->nb_ctx, heap,
9432
                    DYNAMIC_TYPE_TMP_BUFFER);
9433
            }
9434
        #endif
9435
6.11k
            wc_curve25519_free((curve25519_key*)current->key);
9436
6.11k
#endif
9437
6.11k
        }
9438
11.2k
        else if (current->group == WOLFSSL_ECC_X448) {
9439
63
#ifdef HAVE_CURVE448
9440
63
            wc_curve448_free((curve448_key*)current->key);
9441
63
#endif
9442
63
        }
9443
11.1k
        else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
9444
4.30k
#ifdef WOLFSSL_HAVE_MLKEM
9445
4.30k
            wc_MlKemKey_Free((MlKemKey*)current->key);
9446
4.30k
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9447
4.30k
            if (current->privKey != NULL) {
9448
23
                ForceZero(current->privKey, current->privKeyLen);
9449
23
            }
9450
4.30k
        #endif
9451
4.30k
#endif
9452
4.30k
        }
9453
6.88k
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
9454
4.47k
#ifdef WOLFSSL_HAVE_MLKEM
9455
4.47k
            int ecc_group = 0;
9456
4.47k
            findEccPqc(&ecc_group, NULL, NULL, current->group);
9457
9458
            /* Free PQC private key */
9459
        #ifdef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9460
            wc_MlKemKey_Free((MlKemKey*)current->privKey);
9461
        #else
9462
4.47k
            if (current->privKey != NULL) {
9463
4.23k
                ForceZero(current->privKey, current->privKeyLen);
9464
4.23k
            }
9465
4.47k
        #endif
9466
9467
            /* Free ECC private key */
9468
4.47k
            if (ecc_group == WOLFSSL_ECC_X25519) {
9469
4.35k
            #ifdef HAVE_CURVE25519
9470
4.35k
                wc_curve25519_free((curve25519_key*)current->key);
9471
4.35k
            #endif
9472
4.35k
            }
9473
120
            else if (ecc_group == WOLFSSL_ECC_X448) {
9474
0
            #ifdef HAVE_CURVE448
9475
0
                wc_curve448_free((curve448_key*)current->key);
9476
0
            #endif
9477
0
            }
9478
120
            else {
9479
120
            #ifdef HAVE_ECC
9480
                #if defined(WC_ECC_NONBLOCK) && \
9481
                    defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9482
                    defined(WC_ASYNC_ENABLE_ECC)
9483
                if (current->key != NULL &&
9484
                        ((ecc_key*)current->key)->nb_ctx != NULL) {
9485
                    XFREE(((ecc_key*)current->key)->nb_ctx, heap,
9486
                        DYNAMIC_TYPE_TMP_BUFFER);
9487
                }
9488
                #endif
9489
120
                wc_ecc_free((ecc_key*)current->key);
9490
120
            #endif
9491
120
            }
9492
4.47k
#endif
9493
4.47k
        }
9494
2.40k
        else {
9495
2.40k
#ifdef HAVE_ECC
9496
        #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9497
            defined(WC_ASYNC_ENABLE_ECC)
9498
            if (current->key != NULL &&
9499
                    ((ecc_key*)current->key)->nb_ctx != NULL) {
9500
                XFREE(((ecc_key*)current->key)->nb_ctx, heap,
9501
                    DYNAMIC_TYPE_TMP_BUFFER);
9502
            }
9503
        #endif
9504
2.40k
            wc_ecc_free((ecc_key*)current->key);
9505
2.40k
#endif
9506
2.40k
        }
9507
18.1k
        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
9508
18.1k
    #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
9509
18.1k
        XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY);
9510
18.1k
    #endif
9511
18.1k
        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
9512
18.1k
        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
9513
18.1k
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
9514
18.1k
    }
9515
9516
19.7k
    (void)heap;
9517
19.7k
}
9518
9519
/* Get the size of the encoded key share extension.
9520
 *
9521
 * list     The linked list of key share extensions.
9522
 * msgType  The type of the message this extension is being written into.
9523
 * returns the number of bytes of the encoded key share extension.
9524
 */
9525
static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
9526
7.45k
{
9527
7.45k
    word16         len = 0;
9528
7.45k
    byte           isRequest = (msgType == client_hello);
9529
7.45k
    KeyShareEntry* current;
9530
9531
    /* The named group the server wants to use. */
9532
7.45k
    if (msgType == hello_retry_request)
9533
680
        return OPAQUE16_LEN;
9534
9535
    /* List of key exchange groups. */
9536
6.77k
    if (isRequest)
9537
6.13k
        len += OPAQUE16_LEN;
9538
11.6k
    while ((current = list) != NULL) {
9539
4.92k
        list = current->next;
9540
9541
4.92k
        if (!isRequest && current->pubKey == NULL)
9542
0
            continue;
9543
9544
4.92k
        len += (word16)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
9545
4.92k
    }
9546
9547
6.77k
    return len;
9548
7.45k
}
9549
9550
/* Writes the key share extension into the output buffer.
9551
 * Assumes that the the output buffer is big enough to hold data.
9552
 *
9553
 * list     The linked list of key share entries.
9554
 * output   The buffer to write into.
9555
 * msgType  The type of the message this extension is being written into.
9556
 * returns the number of bytes written into the buffer.
9557
 */
9558
static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
9559
                                  byte msgType)
9560
5.57k
{
9561
5.57k
    word16         i = 0;
9562
5.57k
    byte           isRequest = (msgType == client_hello);
9563
5.57k
    KeyShareEntry* current;
9564
9565
5.57k
    if (msgType == hello_retry_request) {
9566
677
        c16toa(list->group, output);
9567
677
        return OPAQUE16_LEN;
9568
677
    }
9569
9570
    /* ClientHello has a list but ServerHello is only the chosen. */
9571
4.90k
    if (isRequest)
9572
4.27k
        i += OPAQUE16_LEN;
9573
9574
    /* Write out all in the list. */
9575
7.95k
    while ((current = list) != NULL) {
9576
3.05k
        list = current->next;
9577
9578
3.05k
        if (!isRequest && current->pubKey == NULL)
9579
0
            continue;
9580
9581
3.05k
        c16toa(current->group, &output[i]);
9582
3.05k
        i += KE_GROUP_LEN;
9583
3.05k
        c16toa((word16)(current->pubKeyLen), &output[i]);
9584
3.05k
        i += OPAQUE16_LEN;
9585
3.05k
        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
9586
3.05k
        i += (word16)current->pubKeyLen;
9587
3.05k
    }
9588
    /* Write the length of the list if required. */
9589
4.90k
    if (isRequest)
9590
4.27k
        c16toa(i - OPAQUE16_LEN, output);
9591
9592
4.90k
    return i;
9593
5.57k
}
9594
9595
/* Process the DH key share extension on the client side.
9596
 *
9597
 * ssl            The SSL/TLS object.
9598
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9599
 * returns 0 on success and other values indicate failure.
9600
 */
9601
static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9602
16
{
9603
16
    int ret = 0;
9604
16
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
9605
16
    word32 pSz = 0;
9606
16
    DhKey* dhKey = (DhKey*)keyShareEntry->key;
9607
9608
16
#ifdef HAVE_PUBLIC_FFDHE
9609
16
    const DhParams* params = NULL;
9610
16
    switch (keyShareEntry->group) {
9611
0
    #ifdef HAVE_FFDHE_2048
9612
16
        case WOLFSSL_FFDHE_2048:
9613
16
            params = wc_Dh_ffdhe2048_Get();
9614
16
            break;
9615
0
    #endif
9616
    #ifdef HAVE_FFDHE_3072
9617
        case WOLFSSL_FFDHE_3072:
9618
            params = wc_Dh_ffdhe3072_Get();
9619
            break;
9620
    #endif
9621
    #ifdef HAVE_FFDHE_4096
9622
        case WOLFSSL_FFDHE_4096:
9623
            params = wc_Dh_ffdhe4096_Get();
9624
            break;
9625
    #endif
9626
    #ifdef HAVE_FFDHE_6144
9627
        case WOLFSSL_FFDHE_6144:
9628
            params = wc_Dh_ffdhe6144_Get();
9629
            break;
9630
    #endif
9631
    #ifdef HAVE_FFDHE_8192
9632
        case WOLFSSL_FFDHE_8192:
9633
            params = wc_Dh_ffdhe8192_Get();
9634
            break;
9635
    #endif
9636
0
        default:
9637
0
            break;
9638
16
    }
9639
16
    if (params == NULL) {
9640
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9641
0
        return PEER_KEY_ERROR;
9642
0
    }
9643
16
    pSz = params->p_len;
9644
#else
9645
    ret = wc_DhGetNamedKeyParamSize(keyShareEntry->group, &pSz, NULL, NULL);
9646
    if (ret != 0 || pSz == 0) {
9647
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9648
        return PEER_KEY_ERROR;
9649
    }
9650
#endif
9651
9652
    /* RFC 8446 Section 4.2.8.1: FFDHE key_exchange values are left-padded with
9653
     * zeros to the size of the named-group prime. Reject any peer key share
9654
     * whose byte length does not match the expected prime size. */
9655
16
    if (keyShareEntry->keLen != pSz) {
9656
16
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9657
16
        return PEER_KEY_ERROR;
9658
16
    }
9659
9660
    /* if DhKey is not setup, do it now */
9661
0
    if (keyShareEntry->key == NULL) {
9662
0
        keyShareEntry->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
9663
0
            DYNAMIC_TYPE_DH);
9664
0
        if (keyShareEntry->key == NULL)
9665
0
            return MEMORY_E;
9666
9667
        /* Setup Key */
9668
0
        ret = wc_InitDhKey_ex((DhKey*)keyShareEntry->key, ssl->heap, ssl->devId);
9669
0
#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)
9670
0
        if (ret != 0) {
9671
0
            XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
9672
0
            keyShareEntry->key = NULL;
9673
0
            return ret;
9674
0
        }
9675
0
#endif
9676
0
        if (ret == 0) {
9677
0
            dhKey = (DhKey*)keyShareEntry->key;
9678
        /* Set key */
9679
0
        #ifdef HAVE_PUBLIC_FFDHE
9680
0
            ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
9681
0
                                                                params->g_len);
9682
        #else
9683
            ret = wc_DhSetNamedKey(dhKey, keyShareEntry->group);
9684
        #endif
9685
0
        }
9686
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9687
        defined(WC_ASYNC_ENABLE_DH)
9688
        /* Only set non-blocking context when async device is active. With
9689
         * INVALID_DEVID there is no async loop to retry on MP_WOULDBLOCK, so
9690
         * skip non-blocking setup and use blocking mode instead. */
9691
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
9692
            DhNb* dhNb = (DhNb*)XMALLOC(sizeof(DhNb), ssl->heap,
9693
                                        DYNAMIC_TYPE_TMP_BUFFER);
9694
            if (dhNb == NULL) {
9695
                ret = MEMORY_E;
9696
            }
9697
            else {
9698
                ret = wc_DhSetNonBlock((DhKey*)keyShareEntry->key, dhNb);
9699
                if (ret != 0) {
9700
                    XFREE(dhNb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9701
                }
9702
            }
9703
        }
9704
    #endif /* WC_DH_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
9705
              WC_ASYNC_ENABLE_DH */
9706
0
    }
9707
9708
0
    if (ret == 0
9709
    #ifdef WOLFSSL_ASYNC_CRYPT
9710
        && keyShareEntry->lastRet == 0 /* don't enter here if WC_PENDING_E */
9711
    #endif
9712
0
    ) {
9713
    #ifdef WOLFSSL_DEBUG_TLS
9714
        WOLFSSL_MSG("Peer DH Key");
9715
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9716
    #endif
9717
9718
0
        ssl->options.dhKeySz = (word16)pSz;
9719
9720
        /* Derive secret from private key and peer's public key. */
9721
0
        ret = DhAgree(ssl, dhKey,
9722
0
            (const byte*)keyShareEntry->privKey, keyShareEntry->keyLen, /* our private */
9723
0
            keyShareEntry->ke, keyShareEntry->keLen,                    /* peer's public key */
9724
0
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,    /* secret */
9725
0
            NULL, 0
9726
0
        );
9727
    #ifdef WOLFSSL_ASYNC_CRYPT
9728
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9729
            return ret;
9730
        }
9731
    #endif
9732
0
    }
9733
9734
    /* RFC 8446 Section 7.4.1:
9735
     *     ... left-padded with zeros up to the size of the prime. ...
9736
     */
9737
0
    if (ret == 0 && (word32)ssl->options.dhKeySz > ssl->arrays->preMasterSz) {
9738
0
        word32 diff = (word32)ssl->options.dhKeySz - ssl->arrays->preMasterSz;
9739
0
        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
9740
0
                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9741
0
        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
9742
0
        ssl->arrays->preMasterSz = ssl->options.dhKeySz;
9743
0
    }
9744
9745
    /* done with key share, release resources */
9746
0
    if (dhKey) {
9747
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9748
        defined(WC_ASYNC_ENABLE_DH)
9749
        if (dhKey->nb != NULL) {
9750
            XFREE(dhKey->nb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9751
            dhKey->nb = NULL;
9752
        }
9753
    #endif
9754
0
        wc_FreeDhKey(dhKey);
9755
0
    }
9756
0
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
9757
0
    keyShareEntry->key = NULL;
9758
0
    if (keyShareEntry->privKey) {
9759
0
        ForceZero(keyShareEntry->privKey, keyShareEntry->keyLen);
9760
0
        XFREE(keyShareEntry->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9761
0
        keyShareEntry->privKey = NULL;
9762
0
    }
9763
0
    XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9764
0
    keyShareEntry->pubKey = NULL;
9765
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9766
0
    keyShareEntry->ke = NULL;
9767
#else
9768
    (void)ssl;
9769
    (void)keyShareEntry;
9770
    ret = PEER_KEY_ERROR;
9771
    WOLFSSL_ERROR_VERBOSE(ret);
9772
#endif
9773
0
    return ret;
9774
0
}
9775
9776
/* Process the X25519 key share extension on the client side.
9777
 *
9778
 * ssl            The SSL/TLS object.
9779
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9780
 * ssOutput       The destination buffer for the shared secret.
9781
 * ssOutSz        The size of the generated shared secret.
9782
 *
9783
 * returns 0 on success and other values indicate failure.
9784
 */
9785
static int TLSX_KeyShare_ProcessX25519_ex(WOLFSSL* ssl,
9786
                                          KeyShareEntry* keyShareEntry,
9787
                                          unsigned char* ssOutput,
9788
                                          word32* ssOutSz)
9789
520
{
9790
520
    int ret = 0;
9791
9792
520
#ifdef HAVE_CURVE25519
9793
520
    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
9794
520
    const byte* peerPub = keyShareEntry->ke;
9795
520
    word32 peerPubLen = keyShareEntry->keLen;
9796
520
#ifndef WOLFSSL_X25519_NO_MASK_PEER
9797
520
    byte maskedPub[CURVE25519_KEYSIZE];
9798
520
#endif
9799
9800
#ifdef WOLFSSL_ASYNC_CRYPT
9801
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9802
#endif
9803
520
    {
9804
520
    #ifdef HAVE_ECC
9805
520
        if (ssl->peerEccKey != NULL) {
9806
0
            wc_ecc_free(ssl->peerEccKey);
9807
0
            ssl->peerEccKey = NULL;
9808
0
            ssl->peerEccKeyPresent = 0;
9809
0
        }
9810
520
    #endif
9811
9812
520
        ssl->peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
9813
520
                                        ssl->heap, DYNAMIC_TYPE_TLSX);
9814
520
        if (ssl->peerX25519Key == NULL) {
9815
2
            WOLFSSL_MSG("PeerX25519Key Memory error");
9816
2
            return MEMORY_ERROR;
9817
2
        }
9818
518
        ret = wc_curve25519_init(ssl->peerX25519Key);
9819
518
        if (ret != 0) {
9820
0
            XFREE(ssl->peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9821
0
            ssl->peerX25519Key = NULL;
9822
0
            return ret;
9823
0
        }
9824
    #ifdef WOLFSSL_DEBUG_TLS
9825
        WOLFSSL_MSG("Peer Curve25519 Key");
9826
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9827
    #endif
9828
9829
518
    #ifndef WOLFSSL_X25519_NO_MASK_PEER
9830
518
        peerPub = MaskCurve25519PeerKey(peerPub, peerPubLen, maskedPub);
9831
518
    #endif
9832
9833
518
        if (wc_curve25519_check_public(peerPub, peerPubLen,
9834
518
                                                  EC25519_LITTLE_ENDIAN) != 0) {
9835
6
            ret = ECC_PEERKEY_ERROR;
9836
6
            WOLFSSL_ERROR_VERBOSE(ret);
9837
6
        }
9838
9839
518
        if (ret == 0) {
9840
512
            if (wc_curve25519_import_public_ex(peerPub, peerPubLen,
9841
512
                                        ssl->peerX25519Key,
9842
512
                                        EC25519_LITTLE_ENDIAN) != 0) {
9843
0
                ret = ECC_PEERKEY_ERROR;
9844
0
                WOLFSSL_ERROR_VERBOSE(ret);
9845
0
            }
9846
512
        }
9847
9848
518
        if (ret == 0) {
9849
512
            ssl->ecdhCurveOID = ECC_X25519_OID;
9850
512
            ssl->peerX25519KeyPresent = 1;
9851
512
        }
9852
518
    }
9853
9854
518
    if (ret == 0 && key == NULL)
9855
0
        ret = BAD_FUNC_ARG;
9856
518
    if (ret == 0) {
9857
512
    #ifdef WOLFSSL_CURVE25519_BLINDING
9858
512
        ret = wc_curve25519_set_rng(key, ssl->rng);
9859
512
    }
9860
518
    if (ret == 0) {
9861
512
    #endif
9862
    #ifdef WOLFSSL_ASYNC_CRYPT
9863
        if (keyShareEntry->lastRet != WC_NO_ERR_TRACE(WC_PENDING_E))
9864
    #endif
9865
512
        {
9866
        #ifdef WOLFSSL_ASYNC_CRYPT
9867
            /* initialize event */
9868
            ret = wolfSSL_AsyncInit(ssl, &key->asyncDev,
9869
                WC_ASYNC_FLAG_CALL_AGAIN);
9870
            if (ret != 0)
9871
                return ret;
9872
        #endif
9873
512
            ret = wc_curve25519_shared_secret_ex(key, ssl->peerX25519Key,
9874
512
                        ssOutput, ssOutSz, EC25519_LITTLE_ENDIAN);
9875
        #ifdef WOLFSSL_ASYNC_CRYPT
9876
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9877
                return wolfSSL_AsyncPush(ssl, &key->asyncDev);
9878
            }
9879
        #endif
9880
512
        }
9881
        /* On CALL_AGAIN re-entry (lastRet == PENDING): the block above
9882
         * is skipped entirely, so wc_curve25519_shared_secret_ex is not
9883
         * called again. ret stays 0 from initialization, and execution
9884
         * falls through to the cleanup code below. */
9885
512
    }
9886
9887
    /* done with key share, release resources */
9888
518
    if (ssl->peerX25519Key != NULL) {
9889
518
        wc_curve25519_free(ssl->peerX25519Key);
9890
518
        XFREE(ssl->peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9891
518
        ssl->peerX25519Key = NULL;
9892
518
        ssl->peerX25519KeyPresent = 0;
9893
518
    }
9894
518
    if (keyShareEntry->key != NULL) {
9895
    #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
9896
        if (((curve25519_key*)keyShareEntry->key)->nb_ctx != NULL) {
9897
            XFREE(((curve25519_key*)keyShareEntry->key)->nb_ctx, ssl->heap,
9898
                DYNAMIC_TYPE_TMP_BUFFER);
9899
        }
9900
    #endif
9901
518
        wc_curve25519_free((curve25519_key*)keyShareEntry->key);
9902
518
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9903
518
        keyShareEntry->key = NULL;
9904
518
    }
9905
518
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9906
518
    keyShareEntry->ke = NULL;
9907
#else
9908
    (void)ssl;
9909
    (void)keyShareEntry;
9910
    (void)ssOutput;
9911
    (void)ssOutSz;
9912
9913
    ret = PEER_KEY_ERROR;
9914
    WOLFSSL_ERROR_VERBOSE(ret);
9915
#endif /* HAVE_CURVE25519 */
9916
9917
518
    return ret;
9918
518
}
9919
9920
/* Process the X25519 key share extension on the client side.
9921
 *
9922
 * ssl            The SSL/TLS object.
9923
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9924
 *
9925
 * returns 0 on success and other values indicate failure.
9926
 */
9927
static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
9928
                                       KeyShareEntry* keyShareEntry)
9929
520
{
9930
520
    return TLSX_KeyShare_ProcessX25519_ex(ssl, keyShareEntry,
9931
520
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9932
520
}
9933
9934
/* Process the X448 key share extension on the client side.
9935
 *
9936
 * ssl            The SSL/TLS object.
9937
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9938
 * ssOutput       The destination buffer for the shared secret.
9939
 * ssOutSz        The size of the generated shared secret.
9940
 *
9941
 * returns 0 on success and other values indicate failure.
9942
 */
9943
static int TLSX_KeyShare_ProcessX448_ex(WOLFSSL* ssl,
9944
                                        KeyShareEntry* keyShareEntry,
9945
                                        unsigned char* ssOutput,
9946
                                        word32* ssOutSz)
9947
8
{
9948
8
    int ret;
9949
9950
8
#ifdef HAVE_CURVE448
9951
8
    curve448_key* key = (curve448_key*)keyShareEntry->key;
9952
8
    curve448_key* peerX448Key;
9953
9954
8
#ifdef HAVE_ECC
9955
8
    if (ssl->peerEccKey != NULL) {
9956
0
        wc_ecc_free(ssl->peerEccKey);
9957
0
        ssl->peerEccKey = NULL;
9958
0
        ssl->peerEccKeyPresent = 0;
9959
0
    }
9960
8
#endif
9961
9962
8
    peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
9963
8
                                                             DYNAMIC_TYPE_TLSX);
9964
8
    if (peerX448Key == NULL) {
9965
1
        WOLFSSL_MSG("PeerEccKey Memory error");
9966
1
        return MEMORY_ERROR;
9967
1
    }
9968
7
    ret = wc_curve448_init(peerX448Key);
9969
7
    if (ret != 0) {
9970
0
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9971
0
        return ret;
9972
0
    }
9973
#ifdef WOLFSSL_DEBUG_TLS
9974
    WOLFSSL_MSG("Peer Curve448 Key");
9975
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9976
#endif
9977
9978
7
    if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9979
7
                                                    EC448_LITTLE_ENDIAN) != 0) {
9980
3
        ret = ECC_PEERKEY_ERROR;
9981
3
        WOLFSSL_ERROR_VERBOSE(ret);
9982
3
    }
9983
9984
7
    if (ret == 0) {
9985
4
        if (wc_curve448_import_public_ex(keyShareEntry->ke,
9986
4
                                              keyShareEntry->keLen, peerX448Key,
9987
4
                                              EC448_LITTLE_ENDIAN) != 0) {
9988
0
            ret = ECC_PEERKEY_ERROR;
9989
0
            WOLFSSL_ERROR_VERBOSE(ret);
9990
0
        }
9991
4
    }
9992
9993
7
    if (ret == 0) {
9994
4
        ssl->ecdhCurveOID = ECC_X448_OID;
9995
9996
4
        ret = wc_curve448_shared_secret_ex(key, peerX448Key,
9997
4
                    ssOutput, ssOutSz, EC448_LITTLE_ENDIAN);
9998
4
    }
9999
10000
7
    wc_curve448_free(peerX448Key);
10001
7
    XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
10002
7
    wc_curve448_free((curve448_key*)keyShareEntry->key);
10003
7
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10004
7
    keyShareEntry->key = NULL;
10005
7
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10006
7
    keyShareEntry->ke = NULL;
10007
#else
10008
    (void)ssl;
10009
    (void)keyShareEntry;
10010
    (void)ssOutput;
10011
    (void)ssOutSz;
10012
10013
    ret = PEER_KEY_ERROR;
10014
    WOLFSSL_ERROR_VERBOSE(ret);
10015
#endif /* HAVE_CURVE448 */
10016
10017
7
    return ret;
10018
7
}
10019
10020
/* Process the X448 key share extension on the client side.
10021
 *
10022
 * ssl            The SSL/TLS object.
10023
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10024
 * returns 0 on success and other values indicate failure.
10025
 */
10026
static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
10027
8
{
10028
8
    return TLSX_KeyShare_ProcessX448_ex(ssl, keyShareEntry,
10029
8
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
10030
8
}
10031
10032
/* Process the ECC key share extension on the client side.
10033
 *
10034
 * ssl            The SSL/TLS object.
10035
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10036
 * ssOutput       The destination buffer for the shared secret.
10037
 * ssOutSz        The size of the generated shared secret.
10038
 *
10039
 * returns 0 on success and other values indicate failure.
10040
 */
10041
static int TLSX_KeyShare_ProcessEcc_ex(WOLFSSL* ssl,
10042
                                       KeyShareEntry* keyShareEntry,
10043
                                       unsigned char* ssOutput,
10044
                                       word32* ssOutSz)
10045
{
10046
    int ret = 0;
10047
#ifdef HAVE_ECC
10048
    int curveId = ECC_CURVE_INVALID;
10049
    ecc_key* eccKey = (ecc_key*)keyShareEntry->key;
10050
10051
    /* find supported curve */
10052
    switch (keyShareEntry->group) {
10053
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
10054
        #ifndef NO_ECC_SECP
10055
        case WOLFSSL_ECC_SECP256R1:
10056
            curveId = ECC_SECP256R1;
10057
            break;
10058
        #endif /* !NO_ECC_SECP */
10059
        #ifdef WOLFSSL_SM2
10060
        case WOLFSSL_ECC_SM2P256V1:
10061
            curveId = ECC_SM2P256V1;
10062
            break;
10063
        #endif /* WOLFSSL_SM2 */
10064
        #ifdef HAVE_ECC_BRAINPOOL
10065
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
10066
            curveId = ECC_BRAINPOOLP256R1;
10067
            break;
10068
        #endif /* HAVE_ECC_BRAINPOOL */
10069
    #endif
10070
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
10071
        #ifndef NO_ECC_SECP
10072
        case WOLFSSL_ECC_SECP384R1:
10073
            curveId = ECC_SECP384R1;
10074
            break;
10075
        #endif /* !NO_ECC_SECP */
10076
        #ifdef HAVE_ECC_BRAINPOOL
10077
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
10078
            curveId = ECC_BRAINPOOLP384R1;
10079
            break;
10080
        #endif /* HAVE_ECC_BRAINPOOL */
10081
    #endif
10082
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
10083
        #ifdef HAVE_ECC_BRAINPOOL
10084
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
10085
            curveId = ECC_BRAINPOOLP512R1;
10086
            break;
10087
        #endif /* HAVE_ECC_BRAINPOOL */
10088
    #endif
10089
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
10090
        #ifndef NO_ECC_SECP
10091
        case WOLFSSL_ECC_SECP521R1:
10092
            curveId = ECC_SECP521R1;
10093
            break;
10094
        #endif /* !NO_ECC_SECP */
10095
    #endif
10096
    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
10097
        case WOLFSSL_ECC_X448:
10098
            curveId = ECC_X448;
10099
            break;
10100
    #endif
10101
        default:
10102
            /* unsupported curve */
10103
            WOLFSSL_ERROR_VERBOSE(ECC_PEERKEY_ERROR);
10104
            return ECC_PEERKEY_ERROR;
10105
    }
10106
10107
#ifdef WOLFSSL_ASYNC_CRYPT
10108
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
10109
#endif
10110
    {
10111
    #ifdef WOLFSSL_DEBUG_TLS
10112
        WOLFSSL_MSG("Peer ECC Key");
10113
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
10114
    #endif
10115
10116
        if (ssl->peerEccKey != NULL) {
10117
            wc_ecc_free(ssl->peerEccKey);
10118
            XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
10119
            ssl->peerEccKeyPresent = 0;
10120
        }
10121
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
10122
        ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry);
10123
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
10124
            return ret;
10125
        }
10126
        ret = 0;
10127
#endif
10128
10129
        ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
10130
                                            DYNAMIC_TYPE_ECC);
10131
        if (ssl->peerEccKey == NULL) {
10132
            WOLFSSL_MSG("PeerEccKey Memory error");
10133
            ret = MEMORY_ERROR;
10134
        }
10135
10136
        if (ret == 0) {
10137
            ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
10138
        }
10139
10140
        /* Point is validated by import function. */
10141
        if (ret == 0) {
10142
#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
10143
            ret = wc_ecc_import_x963_ex2(keyShareEntry->ke,
10144
                keyShareEntry->keLen, ssl->peerEccKey, curveId, 1);
10145
#else
10146
            /* FIPS has validation define on. */
10147
            ret = wc_ecc_import_x963_ex(keyShareEntry->ke,
10148
                keyShareEntry->keLen, ssl->peerEccKey, curveId);
10149
#endif
10150
            if (ret != 0) {
10151
                ret = ECC_PEERKEY_ERROR;
10152
                WOLFSSL_ERROR_VERBOSE(ret);
10153
            }
10154
        }
10155
10156
        if (ret == 0) {
10157
            ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
10158
            ssl->peerEccKeyPresent = 1;
10159
        }
10160
    }
10161
10162
    if (ret == 0 && eccKey == NULL)
10163
        ret = BAD_FUNC_ARG;
10164
    if (ret == 0) {
10165
        ret = EccSharedSecret(ssl, eccKey, ssl->peerEccKey,
10166
            keyShareEntry->ke, &keyShareEntry->keLen,
10167
            ssOutput, ssOutSz, ssl->options.side);
10168
    #ifdef WOLFSSL_ASYNC_CRYPT
10169
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
10170
            return ret;
10171
    #endif
10172
    }
10173
10174
    /* done with key share, release resources */
10175
    if (ssl->peerEccKey != NULL
10176
    #ifdef HAVE_PK_CALLBACKS
10177
        && ssl->ctx->EccSharedSecretCb == NULL
10178
    #endif
10179
    ) {
10180
        wc_ecc_free(ssl->peerEccKey);
10181
        XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
10182
        ssl->peerEccKey = NULL;
10183
        ssl->peerEccKeyPresent = 0;
10184
    }
10185
    if (eccKey != NULL) {
10186
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
10187
        defined(WC_ASYNC_ENABLE_ECC)
10188
        if (eccKey->nb_ctx != NULL) {
10189
            XFREE(eccKey->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
10190
        }
10191
    #endif
10192
        wc_ecc_free(eccKey);
10193
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_ECC);
10194
        keyShareEntry->key = NULL;
10195
    }
10196
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10197
    keyShareEntry->ke = NULL;
10198
#else
10199
    (void)ssl;
10200
    (void)keyShareEntry;
10201
    (void)ssOutput;
10202
    (void)ssOutSz;
10203
10204
    ret = PEER_KEY_ERROR;
10205
    WOLFSSL_ERROR_VERBOSE(ret);
10206
#endif /* HAVE_ECC */
10207
10208
    return ret;
10209
}
10210
10211
/* Process the ECC key share extension on the client side.
10212
 *
10213
 * ssl            The SSL/TLS object.
10214
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10215
 * returns 0 on success and other values indicate failure.
10216
 */
10217
static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
10218
73
{
10219
73
    return TLSX_KeyShare_ProcessEcc_ex(ssl, keyShareEntry,
10220
73
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
10221
73
}
10222
10223
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
10224
/* Process the ML-KEM key share extension on the client side.
10225
 *
10226
 * ssl            The SSL/TLS object.
10227
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10228
 * ssOutput       The destination buffer for the shared secret.
10229
 * ssOutSz        The size of the generated shared secret.
10230
 *
10231
 * returns 0 on success and other values indicate failure.
10232
 */
10233
static int TLSX_KeyShare_ProcessPqcClient_ex(WOLFSSL* ssl,
10234
                                             KeyShareEntry* keyShareEntry,
10235
                                             unsigned char* ssOutput,
10236
                                             word32* ssOutSz)
10237
0
{
10238
0
    int       ret = 0;
10239
0
    MlKemKey* kem = (MlKemKey*)keyShareEntry->key;
10240
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10241
0
    word32    privSz = 0;
10242
0
#endif
10243
0
    word32    ctSz = 0;
10244
0
    word32    ssSz = 0;
10245
10246
0
    if (ssl->options.side == WOLFSSL_SERVER_END) {
10247
        /* I am the server, the shared secret has already been generated and
10248
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
10249
0
        return 0;
10250
0
    }
10251
10252
0
    if (keyShareEntry->ke == NULL) {
10253
0
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
10254
0
        return BAD_FUNC_ARG;
10255
0
    }
10256
0
    if (ssOutSz == NULL)
10257
0
        return BAD_FUNC_ARG;
10258
10259
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10260
0
    if (kem == NULL) {
10261
0
        int type = 0;
10262
10263
        /* Allocate an ML-KEM key to hold private key. */
10264
0
        kem = (MlKemKey*) XMALLOC(sizeof(MlKemKey), ssl->heap,
10265
0
                                  DYNAMIC_TYPE_PRIVATE_KEY);
10266
0
        if (kem == NULL) {
10267
0
            WOLFSSL_MSG("GenPqcKey memory error");
10268
0
            ret = MEMORY_E;
10269
0
        }
10270
0
        else {
10271
            /* Zero so an unconditional wc_MlKemKey_Free is safe even if Init is
10272
             * skipped on an id2type failure. */
10273
0
            XMEMSET(kem, 0, sizeof(MlKemKey));
10274
0
        }
10275
0
        if (ret == 0) {
10276
0
            ret = mlkem_id2type(keyShareEntry->group, &type);
10277
0
        }
10278
0
        if (ret != 0) {
10279
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10280
0
            ret = BAD_FUNC_ARG;
10281
0
        }
10282
0
        if (ret == 0) {
10283
0
            ret = wc_MlKemKey_Init(kem, type, ssl->heap, ssl->devId);
10284
0
            if (ret != 0) {
10285
0
                WOLFSSL_MSG("Error creating ML-KEM key");
10286
0
            }
10287
0
        }
10288
0
    }
10289
#else
10290
    if (kem == NULL || keyShareEntry->privKeyLen != 0) {
10291
        WOLFSSL_MSG("Invalid ML-KEM key.");
10292
        ret = BAD_FUNC_ARG;
10293
    }
10294
#endif
10295
10296
0
    if (ret == 0) {
10297
0
        ret = wc_MlKemKey_SharedSecretSize(kem, &ssSz);
10298
0
    }
10299
0
    if (ret == 0) {
10300
0
        ret = wc_MlKemKey_CipherTextSize(kem, &ctSz);
10301
0
    }
10302
10303
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10304
0
    if (ret == 0) {
10305
0
        ret = wc_MlKemKey_PrivateKeySize(kem, &privSz);
10306
0
    }
10307
0
    if (ret == 0 && privSz != keyShareEntry->privKeyLen) {
10308
0
        WOLFSSL_MSG("Invalid private key size.");
10309
0
        ret = BAD_FUNC_ARG;
10310
0
    }
10311
0
    if (ret == 0) {
10312
0
        PRIVATE_KEY_UNLOCK();
10313
0
        ret = wc_MlKemKey_DecodePrivateKey(kem, keyShareEntry->privKey, privSz);
10314
0
        PRIVATE_KEY_LOCK();
10315
0
    }
10316
0
#endif
10317
10318
0
    if (ret == 0 && keyShareEntry->keLen < ctSz) {
10319
0
        WOLFSSL_MSG("PQC key share data too short for ciphertext.");
10320
0
        ret = BUFFER_E;
10321
0
    }
10322
0
    if (ret == 0) {
10323
0
        PRIVATE_KEY_UNLOCK();
10324
0
        ret = wc_MlKemKey_Decapsulate(kem, ssOutput,
10325
0
                                      keyShareEntry->ke, ctSz);
10326
0
        PRIVATE_KEY_LOCK();
10327
0
        if (ret != 0) {
10328
0
            WOLFSSL_MSG("wc_MlKemKey decapsulation failure.");
10329
0
            ret = BAD_FUNC_ARG;
10330
0
        }
10331
0
    }
10332
0
    if (ret == 0) {
10333
0
        *ssOutSz = ssSz;
10334
0
    }
10335
10336
0
    wc_MlKemKey_Free(kem);
10337
10338
0
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10339
0
    keyShareEntry->key = NULL;
10340
10341
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10342
0
    keyShareEntry->ke = NULL;
10343
10344
0
    return ret;
10345
0
}
10346
10347
/* Process the ML-KEM key share extension on the client side.
10348
 *
10349
 * ssl            The SSL/TLS object.
10350
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10351
 *
10352
 * returns 0 on success and other values indicate failure.
10353
 */
10354
static int TLSX_KeyShare_ProcessPqcClient(WOLFSSL* ssl,
10355
                                          KeyShareEntry* keyShareEntry)
10356
0
{
10357
0
    return TLSX_KeyShare_ProcessPqcClient_ex(ssl, keyShareEntry,
10358
0
                                             ssl->arrays->preMasterSecret,
10359
0
                                             &ssl->arrays->preMasterSz);
10360
0
}
10361
10362
/* Process the hybrid key share extension on the client side.
10363
 *
10364
 * ssl            The SSL/TLS object.
10365
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10366
 * returns 0 on success and other values indicate failure.
10367
 */
10368
static int TLSX_KeyShare_ProcessPqcHybridClient(WOLFSSL* ssl,
10369
                                                KeyShareEntry* keyShareEntry)
10370
1
{
10371
1
    int      ret = 0;
10372
1
    int      pqc_group = 0;
10373
1
    int      ecc_group = 0;
10374
1
    int      pqc_first = 0;
10375
1
    KeyShareEntry* pqc_kse = NULL;
10376
1
    KeyShareEntry *ecc_kse = NULL;
10377
1
    word32   ctSz = 0;
10378
1
    word32   ssSzPqc = 0;
10379
10380
1
    if (ssl->options.side == WOLFSSL_SERVER_END) {
10381
        /* I am the server, the shared secret has already been generated and
10382
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
10383
0
        return 0;
10384
0
    }
10385
10386
1
    if (keyShareEntry->ke == NULL) {
10387
0
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
10388
0
        return BAD_FUNC_ARG;
10389
0
    }
10390
10391
    /* I am the client, both the PQC ciphertext and the ECHD public key are in
10392
     * keyShareEntry->ke */
10393
10394
    /* Determine the ECC and PQC group of the hybrid combination */
10395
1
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
10396
1
    if (ecc_group == 0 || pqc_group == 0) {
10397
0
        WOLFSSL_MSG("Invalid hybrid group");
10398
0
        ret = BAD_FUNC_ARG;
10399
0
    }
10400
10401
1
    if (ret == 0) {
10402
1
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
10403
1
                   DYNAMIC_TYPE_TLSX);
10404
1
        if (ecc_kse == NULL) {
10405
0
            WOLFSSL_MSG("kse memory allocation failure");
10406
0
            ret = MEMORY_ERROR;
10407
0
        }
10408
1
        else {
10409
1
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
10410
1
        }
10411
1
    }
10412
1
    if (ret == 0) {
10413
1
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
10414
1
                   DYNAMIC_TYPE_TLSX);
10415
1
        if (pqc_kse == NULL) {
10416
0
            WOLFSSL_MSG("kse memory allocation failure");
10417
0
            ret = MEMORY_ERROR;
10418
0
        }
10419
1
        else {
10420
1
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
10421
1
        }
10422
1
    }
10423
10424
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
10425
     * decode these sizes to separate the KEM ciphertext from the ECDH public
10426
     * key. */
10427
1
    if (ret == 0) {
10428
1
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10429
1
        int type;
10430
10431
1
        pqc_kse->privKey = keyShareEntry->privKey;
10432
10433
1
        ret = mlkem_id2type(pqc_group, &type);
10434
1
        if (ret != 0) {
10435
0
            WOLFSSL_MSG("Invalid ML-KEM algorithm specified.");
10436
0
            ret = BAD_FUNC_ARG;
10437
0
        }
10438
1
        if (ret == 0) {
10439
1
            pqc_kse->key = XMALLOC(sizeof(MlKemKey), ssl->heap,
10440
1
                                DYNAMIC_TYPE_PRIVATE_KEY);
10441
1
            if (pqc_kse->key == NULL) {
10442
0
                WOLFSSL_MSG("GenPqcKey memory error");
10443
0
                ret = MEMORY_E;
10444
0
            }
10445
1
        }
10446
1
        if (ret == 0) {
10447
1
            ret = wc_MlKemKey_Init((MlKemKey*)pqc_kse->key, type,
10448
1
                                   ssl->heap, ssl->devId);
10449
1
            if (ret != 0) {
10450
0
                WOLFSSL_MSG("Error creating ML-KEM key");
10451
0
            }
10452
1
        }
10453
    #else
10454
        pqc_kse->key = keyShareEntry->privKey;
10455
    #endif
10456
10457
1
        pqc_kse->group = pqc_group;
10458
1
        pqc_kse->privKeyLen = keyShareEntry->privKeyLen;
10459
10460
1
        if (ret == 0) {
10461
1
            ret = wc_MlKemKey_SharedSecretSize((MlKemKey*)pqc_kse->key,
10462
1
                                               &ssSzPqc);
10463
1
        }
10464
1
        if (ret == 0) {
10465
1
            ret = wc_MlKemKey_CipherTextSize((MlKemKey*)pqc_kse->key,
10466
1
                                             &ctSz);
10467
1
            if (ret == 0 && keyShareEntry->keLen <= ctSz) {
10468
1
                WOLFSSL_MSG("Invalid ciphertext size.");
10469
1
                ret = BAD_FUNC_ARG;
10470
1
            }
10471
1
        }
10472
1
        if (ret == 0) {
10473
0
            pqc_kse->keLen = ctSz;
10474
0
            pqc_kse->ke = (byte*)XMALLOC(pqc_kse->keLen, ssl->heap,
10475
0
                                         DYNAMIC_TYPE_PUBLIC_KEY);
10476
0
            if (pqc_kse->ke == NULL) {
10477
0
                WOLFSSL_MSG("pqc_kse memory allocation failure");
10478
0
                ret = MEMORY_ERROR;
10479
0
            }
10480
            /* Copy the PQC KEM ciphertext. Depending on the pqc_first flag,
10481
             * the KEM ciphertext comes before or after the ECDH public key. */
10482
0
            if (ret == 0) {
10483
0
                int offset = keyShareEntry->keLen - ctSz;
10484
10485
0
                if (pqc_first)
10486
0
                    offset = 0;
10487
10488
0
                XMEMCPY(pqc_kse->ke, keyShareEntry->ke + offset, ctSz);
10489
0
            }
10490
0
        }
10491
1
    }
10492
10493
1
    if (ret == 0) {
10494
0
        ecc_kse->group = ecc_group;
10495
0
        ecc_kse->keLen = keyShareEntry->keLen - ctSz;
10496
0
        ecc_kse->key = keyShareEntry->key;
10497
0
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
10498
0
                                        DYNAMIC_TYPE_PUBLIC_KEY);
10499
0
        if (ecc_kse->ke == NULL) {
10500
0
            WOLFSSL_MSG("ecc_kse memory allocation failure");
10501
0
            ret = MEMORY_ERROR;
10502
0
        }
10503
        /* Copy the ECDH public key. Depending on the pqc_first flag, the
10504
         * KEM ciphertext comes before or after the ECDH public key. */
10505
0
        if (ret == 0) {
10506
0
            int offset = 0;
10507
10508
0
            if (pqc_first)
10509
0
                offset = ctSz;
10510
10511
0
            XMEMCPY(ecc_kse->ke, keyShareEntry->ke + offset, ecc_kse->keLen);
10512
0
        }
10513
    #ifdef WOLFSSL_ASYNC_CRYPT
10514
        ecc_kse->lastRet = keyShareEntry->lastRet;
10515
    #endif
10516
0
    }
10517
10518
    /* Process ECDH key share part. The generated shared secret is directly
10519
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
10520
     * pqc_first flag, the ECDH shared secret part goes before or after the
10521
     * KEM part. */
10522
1
    if (ret == 0) {
10523
0
        int offset = 0;
10524
10525
0
        if (pqc_first)
10526
0
            offset = ssSzPqc;
10527
10528
0
    #ifdef HAVE_CURVE25519
10529
0
        if (ecc_group == WOLFSSL_ECC_X25519) {
10530
0
            ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
10531
0
                    ssl->arrays->preMasterSecret + offset,
10532
0
                    &ssl->arrays->preMasterSz);
10533
0
        }
10534
0
        else
10535
0
    #endif
10536
0
    #ifdef HAVE_CURVE448
10537
0
        if (ecc_group == WOLFSSL_ECC_X448) {
10538
0
            ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
10539
0
                    ssl->arrays->preMasterSecret + offset,
10540
0
                    &ssl->arrays->preMasterSz);
10541
0
        }
10542
0
        else
10543
0
    #endif
10544
0
        {
10545
0
            ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
10546
0
                    ssl->arrays->preMasterSecret + offset,
10547
0
                    &ssl->arrays->preMasterSz);
10548
0
        }
10549
10550
    #ifdef WOLFSSL_ASYNC_CRYPT
10551
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10552
            keyShareEntry->lastRet = WC_PENDING_E;
10553
            /* Prevent freeing of the ECC and ML-KEM private keys */
10554
            ecc_kse->key = NULL;
10555
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10556
            pqc_kse->privKey = NULL;
10557
        #else
10558
            pqc_kse->key = NULL;
10559
        #endif
10560
        }
10561
        else
10562
    #endif
10563
0
        {
10564
            /* Re-sync keyShareEntry->key with ecc_kse->key. ecc_kse->key was
10565
             * aliased to keyShareEntry->key above. The inner Process*_ex
10566
             * either ran its end-of-function cleanup and set ecc_kse->key
10567
             * to NULL (so the outer pointer must also become NULL to avoid
10568
             * UAF/double-free in TLSX_KeyShare_FreeAll), or returned early
10569
             * before cleanup with ecc_kse->key still pointing at the live
10570
             * key (so the outer pointer must keep that pointer for later
10571
             * freeing). Mirroring whatever the inner left in ecc_kse->key
10572
             * handles both cases correctly. */
10573
0
            keyShareEntry->key = ecc_kse->key;
10574
0
        }
10575
0
    }
10576
10577
1
    if (ret == 0) {
10578
0
        if ((ssl->arrays->preMasterSz + ssSzPqc) > ENCRYPT_LEN) {
10579
0
            WOLFSSL_MSG("shared secret is too long.");
10580
0
            ret = LENGTH_ERROR;
10581
0
        }
10582
0
    }
10583
10584
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
10585
     * KEM shared secret part goes before or after the ECDH part. */
10586
1
    if (ret == 0) {
10587
0
        int offset = ssl->arrays->preMasterSz;
10588
10589
0
        if (pqc_first)
10590
0
            offset = 0;
10591
10592
0
        ret = TLSX_KeyShare_ProcessPqcClient_ex(ssl, pqc_kse,
10593
0
                ssl->arrays->preMasterSecret + offset, &ssSzPqc);
10594
0
    }
10595
10596
1
    if (ret == 0) {
10597
0
        keyShareEntry->privKey = (byte*)pqc_kse->key;
10598
10599
0
        ssl->arrays->preMasterSz += ssSzPqc;
10600
0
    }
10601
1
    else
10602
#ifdef WOLFSSL_ASYNC_CRYPT
10603
        if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
10604
#endif
10605
1
    {
10606
        /* Clear the pre master secret buffer to prevent leaking any
10607
         * intermediate keys in the error case. Do not use preMasterSz
10608
         * here as it may already been set to the ECC shared secret size,
10609
         * which would be too small due to the PQC offset case. */
10610
1
        ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
10611
10612
        /* Prevent FreeAll from freeing pointers owned by keyShareEntry. */
10613
1
        if (ecc_kse != NULL)
10614
1
            ecc_kse->key = NULL;
10615
1
        if (pqc_kse != NULL) {
10616
1
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10617
1
            pqc_kse->privKey = NULL;
10618
        #else
10619
            pqc_kse->key = NULL;
10620
        #endif
10621
1
        }
10622
1
    }
10623
10624
1
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
10625
1
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
10626
10627
1
    return ret;
10628
1
}
10629
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_DECAPSULATE */
10630
10631
/* Process the key share extension on the client side.
10632
 *
10633
 * ssl            The SSL/TLS object.
10634
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10635
 * returns 0 on success and other values indicate failure.
10636
 */
10637
static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
10638
{
10639
    int ret;
10640
10641
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
10642
    keyShareEntry->session = ssl->session->namedGroup;
10643
    ssl->session->namedGroup = keyShareEntry->group;
10644
#endif
10645
    /* reset the pre master secret size */
10646
    if (ssl->arrays->preMasterSz == 0)
10647
        ssl->arrays->preMasterSz = ENCRYPT_LEN;
10648
10649
    /* Use Key Share Data from server. */
10650
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(keyShareEntry->group))
10651
        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
10652
    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
10653
        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
10654
    else if (keyShareEntry->group == WOLFSSL_ECC_X448)
10655
        ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
10656
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
10657
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group))
10658
        ret = TLSX_KeyShare_ProcessPqcClient(ssl, keyShareEntry);
10659
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(keyShareEntry->group))
10660
        ret = TLSX_KeyShare_ProcessPqcHybridClient(ssl, keyShareEntry);
10661
#endif
10662
    else
10663
        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
10664
10665
#ifdef WOLFSSL_DEBUG_TLS
10666
    if (ret == 0) {
10667
        WOLFSSL_MSG("KE Secret");
10668
        WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
10669
    }
10670
#endif
10671
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) || \
10672
    defined(WOLFSSL_ASYNC_CRYPT)
10673
    keyShareEntry->derived = (ret == 0);
10674
#endif
10675
#ifdef WOLFSSL_ASYNC_CRYPT
10676
    keyShareEntry->lastRet = ret;
10677
#endif
10678
10679
    return ret;
10680
}
10681
10682
/* Parse an entry of the KeyShare extension.
10683
 *
10684
 * ssl     The SSL/TLS object.
10685
 * input   The extension data.
10686
 * length  The length of the extension data.
10687
 * kse     The new key share entry object.
10688
 * returns a positive number to indicate amount of data parsed and a negative
10689
 * number on error.
10690
 */
10691
static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
10692
            word16 length, KeyShareEntry **kse, word16* seenGroups,
10693
            int* seenGroupsCnt, TLSX** extensions)
10694
2.80k
{
10695
2.80k
    int    ret;
10696
2.80k
    word16 group;
10697
2.80k
    word16 keLen;
10698
2.80k
    int    offset = 0;
10699
2.80k
    byte*  ke;
10700
2.80k
    int    i;
10701
10702
2.80k
    if (length < OPAQUE16_LEN + OPAQUE16_LEN)
10703
21
        return BUFFER_ERROR;
10704
    /* Named group */
10705
2.77k
    ato16(&input[offset], &group);
10706
2.77k
    offset += OPAQUE16_LEN;
10707
    /* Key exchange data - public key. */
10708
2.77k
    ato16(&input[offset], &keLen);
10709
2.77k
    offset += OPAQUE16_LEN;
10710
2.77k
    if (keLen == 0)
10711
26
        return BUFFER_ERROR;
10712
2.75k
    if (keLen > length - offset)
10713
117
        return BUFFER_ERROR;
10714
10715
2.63k
    if (seenGroups != NULL) {
10716
2.63k
        if (*seenGroupsCnt >= MAX_KEYSHARE_NAMED_GROUPS) {
10717
1
            return BAD_KEY_SHARE_DATA;
10718
1
        }
10719
3.94k
        for (i = 0; i < *seenGroupsCnt; i++) {
10720
1.32k
            if (seenGroups[i] == group) {
10721
14
                return BAD_KEY_SHARE_DATA;
10722
14
            }
10723
1.32k
        }
10724
2.61k
        seenGroups[i] = group;
10725
2.61k
        *seenGroupsCnt = i + 1;
10726
2.61k
    }
10727
10728
    /* Store a copy in the key share object. */
10729
2.62k
    ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10730
2.62k
    if (ke == NULL)
10731
20
        return MEMORY_E;
10732
2.60k
    XMEMCPY(ke, &input[offset], keLen);
10733
10734
    /* Populate a key share object in the extension. */
10735
2.60k
    ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
10736
2.60k
    if (ret != 0) {
10737
19
        XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10738
19
        return ret;
10739
19
    }
10740
10741
    /* Total length of the parsed data. */
10742
2.58k
    return offset + keLen;
10743
2.60k
}
10744
10745
/* Searches the groups sent for the specified named group.
10746
 *
10747
 * ssl    SSL/TLS object.
10748
 * name   Group name to match.
10749
 * returns 1 when the extension has the group name and 0 otherwise.
10750
 */
10751
static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
10752
1.10k
{
10753
1.10k
    TLSX*          extension;
10754
1.10k
    KeyShareEntry* list;
10755
10756
1.10k
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
10757
1.10k
    if (extension == NULL) {
10758
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
10759
0
        if (extension == NULL)
10760
0
            return 0;
10761
0
    }
10762
10763
1.10k
    list = (KeyShareEntry*)extension->data;
10764
2.17k
    while (list != NULL) {
10765
1.10k
        if (list->group == group)
10766
31
            return 1;
10767
1.07k
        list = list->next;
10768
1.07k
    }
10769
10770
1.07k
    return 0;
10771
1.10k
}
10772
10773
10774
/* Searches the supported groups extension for the specified named group.
10775
 *
10776
 * ssl   The SSL/TLS object.
10777
 * name  The group name to match.
10778
 * returns 1 when the extension has the group name and 0 otherwise.
10779
 */
10780
static int TLSX_SupportedGroups_Find(const WOLFSSL* ssl, word16 name,
10781
                                     TLSX* extensions)
10782
2.97k
{
10783
2.97k
#ifdef HAVE_SUPPORTED_CURVES
10784
2.97k
    TLSX*          extension;
10785
2.97k
    SupportedCurve* curve = NULL;
10786
10787
2.97k
    if ((extension = TLSX_Find(extensions, TLSX_SUPPORTED_GROUPS)) == NULL) {
10788
0
        if ((extension = TLSX_Find(ssl->ctx->extensions,
10789
0
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
10790
0
            return 0;
10791
0
        }
10792
0
    }
10793
10794
12.8k
    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
10795
12.0k
        if (curve->name == name)
10796
2.12k
            return 1;
10797
12.0k
    }
10798
855
#endif
10799
10800
855
    (void)ssl;
10801
855
    (void)name;
10802
10803
855
    return 0;
10804
2.97k
}
10805
10806
int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl,
10807
        const byte* input, word16 length, TLSX** extensions)
10808
2.38k
{
10809
2.38k
    int ret;
10810
2.38k
    int    offset = 0;
10811
2.38k
    word16 len;
10812
2.38k
    TLSX*  extension;
10813
2.38k
    word16 seenGroups[MAX_KEYSHARE_NAMED_GROUPS];
10814
2.38k
    int    seenGroupsCnt = 0;
10815
10816
    /* Add a KeyShare extension if it doesn't exist even if peer sent no
10817
     * entries. The presence of this extension signals that the peer can be
10818
     * negotiated with. */
10819
2.38k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10820
2.38k
    if (extension == NULL) {
10821
        /* Push new KeyShare extension. */
10822
2.37k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10823
2.37k
        if (ret != 0)
10824
6
            return ret;
10825
2.37k
    }
10826
10827
2.38k
    if (length < OPAQUE16_LEN)
10828
21
        return BUFFER_ERROR;
10829
10830
    /* ClientHello contains zero or more key share entries. Limits extension
10831
     * length to 2^16-1 and subtracting 4 bytes for header size per RFC 8446 */
10832
2.35k
    ato16(input, &len);
10833
2.35k
    if ((len != length - OPAQUE16_LEN) ||
10834
2.30k
         length > (MAX_EXT_DATA_LEN - HELLO_EXT_SZ)) {
10835
56
        return BUFFER_ERROR;
10836
56
    }
10837
2.30k
    offset += OPAQUE16_LEN;
10838
10839
4.88k
    while (offset < (int)length) {
10840
2.77k
        ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset],
10841
2.77k
                length - (word16)offset, NULL, seenGroups, &seenGroupsCnt,
10842
2.77k
                extensions);
10843
2.77k
        if (ret < 0)
10844
191
            return ret;
10845
10846
2.58k
        offset += ret;
10847
2.58k
    }
10848
10849
2.11k
    return 0;
10850
2.30k
}
10851
10852
/* Parse the KeyShare extension.
10853
 * Different formats in different messages.
10854
 *
10855
 * ssl      The SSL/TLS object.
10856
 * input    The extension data.
10857
 * length   The length of the extension data.
10858
 * msgType  The type of the message this extension is being parsed from.
10859
 * returns 0 on success and other values indicate failure.
10860
 */
10861
int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10862
                               byte msgType)
10863
2.65k
{
10864
2.65k
    int ret = 0;
10865
2.65k
    KeyShareEntry *keyShareEntry = NULL;
10866
2.65k
    word16 group;
10867
10868
2.65k
    if (msgType == client_hello) {
10869
1.54k
        ret = TLSX_KeyShare_Parse_ClientHello(ssl, input, length,
10870
1.54k
                                              &ssl->extensions);
10871
1.54k
    }
10872
1.11k
    else if (msgType == server_hello) {
10873
51
        int len;
10874
10875
51
        if (length < OPAQUE16_LEN)
10876
2
            return BUFFER_ERROR;
10877
10878
49
        ssl->options.shSentKeyShare = 1;
10879
10880
        /* The data is the named group the server wants to use. */
10881
49
        ato16(input, &group);
10882
10883
        /* Check the selected group was supported by ClientHello extensions. */
10884
49
        if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10885
4
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10886
4
            return BAD_KEY_SHARE_DATA;
10887
4
        }
10888
10889
        /* Check if the group was sent. */
10890
45
        if (!TLSX_KeyShare_Find(ssl, group)) {
10891
16
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10892
16
            return BAD_KEY_SHARE_DATA;
10893
16
        }
10894
10895
        /* ServerHello contains one key share entry. */
10896
29
        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry, NULL,
10897
29
                NULL, &ssl->extensions);
10898
29
        if (len != (int)length)
10899
28
            return BUFFER_ERROR;
10900
10901
        /* Not in list sent if there isn't a private key. */
10902
1
        if (keyShareEntry == NULL || (keyShareEntry->key == NULL
10903
0
        #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
10904
0
            && keyShareEntry->privKey == NULL
10905
1
        #endif
10906
1
        )) {
10907
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10908
0
            return BAD_KEY_SHARE_DATA;
10909
0
        }
10910
10911
        /* Process the entry to calculate the secret. */
10912
1
        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
10913
1
        if (ret == 0)
10914
0
            ssl->session->namedGroup = ssl->namedGroup = group;
10915
1
    }
10916
1.06k
    else if (msgType == hello_retry_request) {
10917
1.06k
        if (length != OPAQUE16_LEN)
10918
2
            return BUFFER_ERROR;
10919
10920
1.06k
        ssl->options.hrrSentKeyShare = 1;
10921
10922
        /* The data is the named group the server wants to use. */
10923
1.06k
        ato16(input, &group);
10924
10925
    #ifdef WOLFSSL_ASYNC_CRYPT
10926
        /* only perform find and clear TLSX if not returning from async */
10927
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
10928
    #endif
10929
1.06k
        {
10930
            /* Check the selected group was supported by ClientHello extensions.
10931
             */
10932
1.06k
            if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10933
2
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10934
2
                return BAD_KEY_SHARE_DATA;
10935
2
            }
10936
10937
            /* Make sure KeyShare for server requested group was not sent in
10938
             * ClientHello. */
10939
1.05k
            if (TLSX_KeyShare_Find(ssl, group)) {
10940
2
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10941
2
                return BAD_KEY_SHARE_DATA;
10942
2
            }
10943
10944
            /* Clear out unusable key shares. */
10945
1.05k
            ret = TLSX_KeyShare_Empty(ssl);
10946
1.05k
            if (ret != 0)
10947
0
                return ret;
10948
1.05k
        }
10949
10950
1.05k
        ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
10951
1.05k
        if (ret == 0)
10952
291
            ssl->session->namedGroup = ssl->namedGroup = group;
10953
1.05k
    }
10954
0
    else {
10955
        /* Not a message type that is allowed to have this extension. */
10956
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10957
0
        return SANITY_MSG_E;
10958
0
    }
10959
10960
2.60k
    return ret;
10961
2.65k
}
10962
10963
/* Create a new key share entry and put it into the list.
10964
 *
10965
 * list           The linked list of key share entries.
10966
 * group          The named group.
10967
 * heap           The memory to allocate with.
10968
 * keyShareEntry  The new key share entry object.
10969
 * returns 0 on success and other values indicate failure.
10970
 */
10971
static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
10972
                             KeyShareEntry** keyShareEntry)
10973
9.51k
{
10974
9.51k
    KeyShareEntry* kse;
10975
9.51k
    KeyShareEntry** next;
10976
10977
9.51k
    kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
10978
9.51k
                                  DYNAMIC_TYPE_TLSX);
10979
9.51k
    if (kse == NULL)
10980
33
        return MEMORY_E;
10981
10982
9.48k
    XMEMSET(kse, 0, sizeof(*kse));
10983
9.48k
    kse->group = (word16)group;
10984
10985
    /* Add it to the back and maintain the links. */
10986
10.7k
    while (*list != NULL) {
10987
        /* Assign to temporary to work around compiler bug found by customer. */
10988
1.23k
        next = &((*list)->next);
10989
1.23k
        list = next;
10990
1.23k
    }
10991
9.48k
    *list = kse;
10992
9.48k
    *keyShareEntry = kse;
10993
10994
9.48k
    (void)heap;
10995
10996
9.48k
    return 0;
10997
9.51k
}
10998
10999
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
11000
/* Process the ML-KEM key share extension on the server side.
11001
 *
11002
 * ssl            The SSL/TLS object.
11003
 * keyShareEntry  The key share entry object to be sent to the client.
11004
 * data           The key share data received from the client.
11005
 * len            The length of the key share data from the client.
11006
 * ssOutput       The destination buffer for the shared secret.
11007
 * ssOutSz        The size of the generated shared secret.
11008
 *
11009
 * returns 0 on success and other values indicate failure.
11010
 */
11011
static int TLSX_KeyShare_HandlePqcKeyServer(WOLFSSL* ssl,
11012
    KeyShareEntry* keyShareEntry, byte* clientData, word16 clientLen,
11013
    unsigned char* ssOutput, word32* ssOutSz)
11014
0
{
11015
    /* We are on the server side. The key share contains a PQC KEM public key
11016
     * that we are using for an encapsulate operation. The resulting ciphertext
11017
     * is stored in the server key share. */
11018
0
    MlKemKey* kemKey = (MlKemKey*)keyShareEntry->key;
11019
0
    byte* ciphertext = NULL;
11020
0
    int ret = 0;
11021
0
    word32 pubSz = 0;
11022
0
    word32 ctSz = 0;
11023
0
    word32 ssSz = 0;
11024
11025
0
    if (clientData == NULL) {
11026
0
        WOLFSSL_MSG("No KEM public key from the client.");
11027
0
        return BAD_FUNC_ARG;
11028
0
    }
11029
11030
0
    if (kemKey == NULL) {
11031
0
        int type = 0;
11032
11033
        /* Allocate an ML-KEM key to hold private key. */
11034
0
        kemKey = (MlKemKey*) XMALLOC(sizeof(MlKemKey), ssl->heap,
11035
0
                                     DYNAMIC_TYPE_PRIVATE_KEY);
11036
0
        if (kemKey == NULL) {
11037
0
            WOLFSSL_MSG("GenPqcKey memory error");
11038
0
            ret = MEMORY_E;
11039
0
        }
11040
0
        if (ret == 0) {
11041
0
            ret = mlkem_id2type(keyShareEntry->group, &type);
11042
0
        }
11043
0
        if (ret != 0) {
11044
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
11045
0
            ret = BAD_FUNC_ARG;
11046
0
        }
11047
0
        if (ret == 0) {
11048
0
            ret = wc_MlKemKey_Init(kemKey, type, ssl->heap, ssl->devId);
11049
0
            if (ret != 0) {
11050
0
                WOLFSSL_MSG("Error creating ML-KEM key");
11051
0
            }
11052
0
        }
11053
0
    }
11054
11055
0
    if (ret == 0) {
11056
0
        ret = wc_MlKemKey_PublicKeySize(kemKey, &pubSz);
11057
0
    }
11058
0
    if (ret == 0) {
11059
0
        ret = wc_MlKemKey_CipherTextSize(kemKey, &ctSz);
11060
0
    }
11061
0
    if (ret == 0) {
11062
0
        ret = wc_MlKemKey_SharedSecretSize(kemKey, &ssSz);
11063
0
    }
11064
11065
0
    if (ret == 0 && clientLen != pubSz) {
11066
0
        WOLFSSL_MSG("Invalid public key.");
11067
0
        ret = BAD_FUNC_ARG;
11068
0
    }
11069
11070
0
    if (ret == 0) {
11071
0
        ciphertext = (byte*)XMALLOC(ctSz, ssl->heap, DYNAMIC_TYPE_TLSX);
11072
11073
0
        if (ciphertext == NULL) {
11074
0
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
11075
0
            ret = MEMORY_E;
11076
0
        }
11077
0
    }
11078
11079
0
    if (ret == 0) {
11080
0
        ret = wc_MlKemKey_DecodePublicKey(kemKey, clientData, pubSz);
11081
0
    }
11082
0
    if (ret == 0) {
11083
0
        ret = wc_MlKemKey_Encapsulate(kemKey, ciphertext,
11084
0
                                      ssOutput, ssl->rng);
11085
0
        if (ret != 0) {
11086
0
            WOLFSSL_MSG("wc_MlKemKey encapsulation failure.");
11087
0
        }
11088
0
    }
11089
11090
0
    if (ret == 0) {
11091
0
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11092
11093
0
        *ssOutSz = ssSz;
11094
0
        keyShareEntry->ke = NULL;
11095
0
        keyShareEntry->keLen = 0;
11096
11097
0
        XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11098
0
        keyShareEntry->pubKey = ciphertext;
11099
0
        keyShareEntry->pubKeyLen = ctSz;
11100
0
        ciphertext = NULL;
11101
11102
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
11103
         * the server side. */
11104
0
        ssl->namedGroup = keyShareEntry->group;
11105
0
    }
11106
11107
0
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
11108
11109
0
    wc_MlKemKey_Free(kemKey);
11110
0
    XFREE(kemKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
11111
0
    keyShareEntry->key = NULL;
11112
0
    return ret;
11113
0
}
11114
11115
int TLSX_KeyShare_HandlePqcHybridKeyServer(WOLFSSL* ssl,
11116
    KeyShareEntry* keyShareEntry, byte* data, word16 len)
11117
0
{
11118
    /* I am the server. The data parameter is the concatenation of the client's
11119
     * ECDH public key and the KEM public key. I need to generate a matching
11120
     * public key for ECDH and encapsulate a shared secret using the KEM public
11121
     * key. We send the ECDH public key and the KEM ciphertext back to the
11122
     * client. Additionally, we create the ECDH shared secret here already.
11123
     */
11124
0
    int    type;
11125
0
    byte*  ciphertext = NULL;
11126
0
    int    ret = 0;
11127
0
    int    pqc_group = 0;
11128
0
    int    ecc_group = 0;
11129
0
    int    pqc_first = 0;
11130
0
    KeyShareEntry *ecc_kse = NULL;
11131
0
    KeyShareEntry *pqc_kse = NULL;
11132
0
    word32 pubSz = 0;
11133
0
    word32 ctSz = 0;
11134
0
    word32 ssSzPqc = 0;
11135
11136
0
    if (data == NULL) {
11137
0
        WOLFSSL_MSG("No hybrid key share data from the client.");
11138
0
        return BAD_FUNC_ARG;
11139
0
    }
11140
11141
    /* Determine the ECC and PQC group of the hybrid combination */
11142
0
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
11143
0
    if (ecc_group == 0 || pqc_group == 0) {
11144
0
        WOLFSSL_MSG("Invalid hybrid group");
11145
0
        ret = BAD_FUNC_ARG;
11146
0
    }
11147
11148
0
    if (ret == 0) {
11149
0
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
11150
0
                   DYNAMIC_TYPE_TLSX);
11151
0
        if (ecc_kse == NULL) {
11152
0
            WOLFSSL_MSG("kse memory allocation failure");
11153
0
            ret = MEMORY_ERROR;
11154
0
        }
11155
0
    }
11156
0
    if (ret == 0) {
11157
0
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
11158
0
        ecc_kse->group = ecc_group;
11159
11160
0
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
11161
0
                   DYNAMIC_TYPE_TLSX);
11162
0
        if (pqc_kse == NULL) {
11163
0
            WOLFSSL_MSG("kse memory allocation failure");
11164
0
            ret = MEMORY_ERROR;
11165
0
        }
11166
0
    }
11167
0
    if (ret == 0) {
11168
0
        XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
11169
0
        pqc_kse->group = pqc_group;
11170
0
    }
11171
11172
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
11173
     * decode these sizes to properly concatenate the KEM ciphertext with the
11174
     * ECDH public key. */
11175
0
    if (ret == 0) {
11176
        /* Allocate an ML-KEM key to hold private key. */
11177
0
        pqc_kse->key = (MlKemKey*) XMALLOC(sizeof(MlKemKey), ssl->heap,
11178
0
                                           DYNAMIC_TYPE_PRIVATE_KEY);
11179
0
        if (pqc_kse->key == NULL) {
11180
0
            WOLFSSL_MSG("GenPqcKey memory error");
11181
0
            ret = MEMORY_E;
11182
0
        }
11183
0
        if (ret == 0) {
11184
0
            ret = mlkem_id2type(pqc_kse->group, &type);
11185
0
        }
11186
0
        if (ret != 0) {
11187
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
11188
0
            ret = BAD_FUNC_ARG;
11189
0
        }
11190
0
        if (ret == 0) {
11191
0
            ret = wc_MlKemKey_Init((MlKemKey*)pqc_kse->key, type,
11192
0
                                   ssl->heap, ssl->devId);
11193
0
            if (ret != 0) {
11194
0
                WOLFSSL_MSG("Error creating ML-KEM key");
11195
0
            }
11196
0
        }
11197
0
        if (ret == 0) {
11198
0
            ret = wc_MlKemKey_SharedSecretSize((MlKemKey*)pqc_kse->key,
11199
0
                                               &ssSzPqc);
11200
0
        }
11201
0
        if (ret == 0) {
11202
0
            ret = wc_MlKemKey_CipherTextSize((MlKemKey*)pqc_kse->key,
11203
0
                                             &ctSz);
11204
0
        }
11205
0
        if (ret == 0) {
11206
0
            ret = wc_MlKemKey_PublicKeySize((MlKemKey*)pqc_kse->key,
11207
0
                                            &pubSz);
11208
0
        }
11209
0
    }
11210
11211
#ifdef WOLFSSL_ASYNC_CRYPT
11212
    if (ret == 0) {
11213
        /* Restore ECC state from a prior suspended pass. This is not gated on
11214
         * a still-pending lastRet: the async layer clears lastRet to 0 on
11215
         * completion, which would skip the restore and regenerate the key. */
11216
        if (keyShareEntry->key != NULL && keyShareEntry->keyLen > 0) {
11217
            ecc_kse->key = keyShareEntry->key;
11218
            ecc_kse->keyLen = keyShareEntry->keyLen;
11219
            ecc_kse->pubKey = keyShareEntry->pubKey;
11220
            ecc_kse->pubKeyLen = keyShareEntry->pubKeyLen;
11221
            ecc_kse->lastRet = keyShareEntry->lastRet;
11222
            keyShareEntry->key = NULL;
11223
            keyShareEntry->pubKey = NULL;
11224
        }
11225
    }
11226
#endif
11227
11228
    /* Generate the ECDH key share part to be sent to the client */
11229
0
    if (ret == 0 && ecc_group != 0 && ecc_kse->pubKey == NULL) {
11230
0
    #ifdef HAVE_CURVE25519
11231
0
        if (ecc_group == WOLFSSL_ECC_X25519) {
11232
0
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
11233
0
        }
11234
0
        else
11235
0
    #endif
11236
0
    #ifdef HAVE_CURVE448
11237
0
        if (ecc_group == WOLFSSL_ECC_X448) {
11238
0
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
11239
0
        }
11240
0
        else
11241
0
    #endif
11242
0
        {
11243
0
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
11244
0
        }
11245
    #ifdef WOLFSSL_ASYNC_CRYPT
11246
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11247
            /* Store the generated ECC key in the provided kse to later
11248
             * restore it.*/
11249
            keyShareEntry->key = ecc_kse->key;
11250
            keyShareEntry->keyLen = ecc_kse->keyLen;
11251
            keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen;
11252
            keyShareEntry->lastRet = WC_PENDING_E;
11253
            ecc_kse->key = NULL;
11254
        }
11255
        else if (ret == 0 &&
11256
                 keyShareEntry->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11257
            keyShareEntry->lastRet = 0;
11258
            ecc_kse->lastRet = 0;
11259
        }
11260
    #endif
11261
0
    }
11262
11263
0
    if (ret == 0 && len != pubSz + ecc_kse->pubKeyLen) {
11264
0
        WOLFSSL_MSG("Invalid public key.");
11265
0
        ret = BAD_FUNC_ARG;
11266
0
    }
11267
11268
    /* Allocate buffer for the concatenated client key share data
11269
     * (PQC KEM ciphertext + ECDH public key) */
11270
0
    if (ret == 0) {
11271
0
        ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap,
11272
0
            DYNAMIC_TYPE_TLSX);
11273
11274
0
        if (ciphertext == NULL) {
11275
0
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
11276
0
            ret = MEMORY_E;
11277
0
        }
11278
0
    }
11279
11280
    /* Process ECDH key share part. The generated shared secret is directly
11281
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
11282
     * pqc_first flag, the ECDH shared secret part goes before or after the
11283
     * KEM part. */
11284
0
    if (ret == 0) {
11285
0
        ecc_kse->keLen = len - pubSz;
11286
0
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
11287
0
                                     DYNAMIC_TYPE_PUBLIC_KEY);
11288
0
        if (ecc_kse->ke == NULL) {
11289
0
            WOLFSSL_MSG("ecc_kse memory allocation failure");
11290
0
            ret = MEMORY_ERROR;
11291
0
        }
11292
0
        if (ret == 0) {
11293
0
            int pubOffset = 0;
11294
0
            int ssOffset = 0;
11295
11296
0
            if (pqc_first) {
11297
0
                pubOffset = pubSz;
11298
0
                ssOffset = ssSzPqc;
11299
0
            }
11300
11301
0
            XMEMCPY(ecc_kse->ke, data + pubOffset, ecc_kse->keLen);
11302
11303
0
        #ifdef HAVE_CURVE25519
11304
0
            if (ecc_group == WOLFSSL_ECC_X25519) {
11305
0
                ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
11306
0
                        ssl->arrays->preMasterSecret + ssOffset,
11307
0
                        &ssl->arrays->preMasterSz);
11308
0
            }
11309
0
            else
11310
0
        #endif
11311
0
        #ifdef HAVE_CURVE448
11312
0
            if (ecc_group == WOLFSSL_ECC_X448) {
11313
0
                ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
11314
0
                        ssl->arrays->preMasterSecret + ssOffset,
11315
0
                        &ssl->arrays->preMasterSz);
11316
0
            }
11317
0
            else
11318
0
        #endif
11319
0
            {
11320
0
                ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
11321
0
                        ssl->arrays->preMasterSecret + ssOffset,
11322
0
                        &ssl->arrays->preMasterSz);
11323
0
            }
11324
0
        }
11325
0
        if (ret == 0) {
11326
0
            if (ssl->arrays->preMasterSz != ecc_kse->keyLen) {
11327
0
                WOLFSSL_MSG("Data length mismatch.");
11328
0
                ret = BAD_FUNC_ARG;
11329
0
            }
11330
0
        }
11331
    #ifdef WOLFSSL_ASYNC_CRYPT
11332
        else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11333
            keyShareEntry->lastRet = WC_PENDING_E;
11334
            keyShareEntry->key = ecc_kse->key;
11335
            keyShareEntry->keyLen = ecc_kse->keyLen;
11336
            keyShareEntry->pubKey = ecc_kse->pubKey;
11337
            keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen;
11338
            ecc_kse->key = NULL;
11339
            ecc_kse->pubKey = NULL;
11340
        }
11341
    #endif
11342
0
    }
11343
11344
0
    if (ret == 0 && ssl->arrays->preMasterSz + ssSzPqc > ENCRYPT_LEN) {
11345
0
        WOLFSSL_MSG("shared secret is too long.");
11346
0
        ret = LENGTH_ERROR;
11347
0
    }
11348
11349
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
11350
     * KEM shared secret part goes before or after the ECDH part. */
11351
0
    if (ret == 0) {
11352
0
        int input_offset = ecc_kse->keLen;
11353
0
        int output_offset = ssl->arrays->preMasterSz;
11354
11355
0
        if (pqc_first) {
11356
0
            input_offset = 0;
11357
0
            output_offset = 0;
11358
0
        }
11359
11360
0
        ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, pqc_kse,
11361
0
                data + input_offset, pubSz,
11362
0
                ssl->arrays->preMasterSecret + output_offset, &ssSzPqc);
11363
0
    }
11364
11365
0
    if (ret == 0) {
11366
0
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11367
11368
0
        ssl->arrays->preMasterSz += ssSzPqc;
11369
0
        keyShareEntry->ke = NULL;
11370
0
        keyShareEntry->keLen = 0;
11371
    #ifdef WOLFSSL_ASYNC_CRYPT
11372
        /* Hybrid encapsulation is fully complete here. Clear the pending
11373
         * state so the TLS_ASYNC_VERIFY re-drive is skipped and does not
11374
         * re-enter this handler with the now-freed ke. */
11375
        keyShareEntry->lastRet = 0;
11376
    #endif
11377
11378
        /* Concatenate the ECDH public key and the PQC KEM ciphertext. Based on
11379
         * the pqc_first flag, the ECDH public key goes before or after the KEM
11380
         * ciphertext. */
11381
0
        if (pqc_first) {
11382
0
            XMEMCPY(ciphertext, pqc_kse->pubKey, ctSz);
11383
0
            XMEMCPY(ciphertext + ctSz, ecc_kse->pubKey, ecc_kse->pubKeyLen);
11384
0
        }
11385
0
        else {
11386
0
            XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen);
11387
0
            XMEMCPY(ciphertext + ecc_kse->pubKeyLen, pqc_kse->pubKey, ctSz);
11388
0
        }
11389
11390
0
        XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11391
0
        keyShareEntry->pubKey = ciphertext;
11392
0
        keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen + ctSz;
11393
0
        ciphertext = NULL;
11394
11395
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
11396
         * the server side. */
11397
0
        ssl->namedGroup = keyShareEntry->group;
11398
0
    }
11399
0
    else
11400
#ifdef WOLFSSL_ASYNC_CRYPT
11401
        if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
11402
#endif
11403
0
    {
11404
        /* Clear the pre master secret buffer to prevent leaking any
11405
         * intermediate keys in the error case. Do not use preMasterSz
11406
         * here as it may already been set to the ECC shared secret size,
11407
         * which would be too small due to the PQC offset case. */
11408
0
        ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
11409
0
    }
11410
11411
0
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
11412
0
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
11413
0
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
11414
0
    return ret;
11415
0
}
11416
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_ENCAPSULATE */
11417
11418
/* Use the data to create a new key share object in the extensions.
11419
 *
11420
 * ssl    The SSL/TLS object.
11421
 * group  The named group.
11422
 * len    The length of the public key data.
11423
 * data   The public key data.
11424
 * kse    The new key share entry object.
11425
 * returns 0 on success and other values indicate failure.
11426
 */
11427
int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
11428
                      KeyShareEntry **kse, TLSX** extensions)
11429
7.99k
{
11430
7.99k
    int            ret = 0;
11431
7.99k
    TLSX*          extension;
11432
7.99k
    KeyShareEntry* keyShareEntry = NULL;
11433
11434
    /* Find the KeyShare extension if it exists. */
11435
7.99k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11436
7.99k
    if (extension == NULL) {
11437
        /* Push new KeyShare extension. */
11438
4.24k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11439
4.24k
        if (ret != 0)
11440
1
            return ret;
11441
11442
4.24k
        extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11443
4.24k
        if (extension == NULL)
11444
0
            return MEMORY_E;
11445
4.24k
    }
11446
7.99k
    extension->resp = 0;
11447
11448
    /* Try to find the key share entry with this group. */
11449
7.99k
    keyShareEntry = (KeyShareEntry*)extension->data;
11450
9.26k
    while (keyShareEntry != NULL) {
11451
    #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
11452
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
11453
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
11454
                keyShareEntry->group == WOLFSSL_SECP256R1MLKEM512) ||
11455
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
11456
                keyShareEntry->group == WOLFSSL_SECP384R1MLKEM768) ||
11457
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
11458
                keyShareEntry->group == WOLFSSL_SECP521R1MLKEM1024)) {
11459
            keyShareEntry->group = group;
11460
            break;
11461
        }
11462
        else
11463
    #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
11464
1.37k
        if (keyShareEntry->group == group)
11465
106
            break;
11466
1.27k
        keyShareEntry = keyShareEntry->next;
11467
1.27k
    }
11468
11469
    /* Create a new key share entry if not found. */
11470
7.99k
    if (keyShareEntry == NULL) {
11471
7.88k
        ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
11472
7.88k
                                ssl->heap, &keyShareEntry);
11473
7.88k
        if (ret != 0)
11474
23
            return ret;
11475
7.88k
    }
11476
11477
7.97k
    if (data != NULL) {
11478
        /* Store the peer data in the key share object. */
11479
2.58k
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11480
2.58k
        keyShareEntry->ke = data;
11481
2.58k
        keyShareEntry->keLen = len;
11482
2.58k
    }
11483
5.38k
    else {
11484
        /* Generate a key pair. Casting to non-const since changes inside are
11485
         * minimal but would require an extensive redesign to refactor. Also
11486
         * this path shouldn't be taken when parsing a ClientHello in stateless
11487
         * mode. */
11488
5.38k
        ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, keyShareEntry);
11489
5.38k
        if (ret != 0)
11490
811
            return ret;
11491
5.38k
    }
11492
11493
7.15k
    if (kse != NULL)
11494
2
        *kse = keyShareEntry;
11495
11496
7.15k
    return 0;
11497
7.97k
}
11498
11499
/* Set an empty Key Share extension.
11500
 *
11501
 * ssl  The SSL/TLS object.
11502
 * returns 0 on success and other values indicate failure.
11503
 */
11504
int TLSX_KeyShare_Empty(WOLFSSL* ssl)
11505
2.91k
{
11506
2.91k
    int   ret = 0;
11507
2.91k
    TLSX* extension;
11508
11509
    /* Find the KeyShare extension if it exists. */
11510
2.91k
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11511
2.91k
    if (extension == NULL) {
11512
        /* Push new KeyShare extension. */
11513
0
        ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11514
0
    }
11515
2.91k
    else if (extension->data != NULL) {
11516
2.91k
        TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
11517
2.91k
        extension->data = NULL;
11518
2.91k
    }
11519
11520
2.91k
    return ret;
11521
2.91k
}
11522
11523
/* Compile-time gating must stay aligned with TLSX_PopulateSupportedGroups().
11524
 * Runtime-only conditions in that function (TLS 1.3 version check, FFDHE
11525
 * key-size bounds, session-resumption short-circuit, downgrade-aware
11526
 * Brainpool TLS 1.2 selection) are intentionally not represented here. */
11527
static const word16 preferredGroup[] = {
11528
    /* Sort by strength, but prefer non-experimental PQ/T hybrid groups */
11529
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11530
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS)
11531
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
11532
        ECC_MIN_KEY_SZ <= 256
11533
    WOLFSSL_X25519MLKEM768,
11534
    #endif
11535
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11536
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11537
        ECC_MIN_KEY_SZ <= 384
11538
    WOLFSSL_SECP384R1MLKEM1024,
11539
    #endif
11540
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11541
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11542
        ECC_MIN_KEY_SZ <= 256
11543
    WOLFSSL_SECP256R1MLKEM768,
11544
    #endif
11545
#endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && !WOLFSSL_NO_ML_KEM &&
11546
        * WOLFSSL_PQC_HYBRIDS */
11547
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11548
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_1024) && \
11549
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11550
    WOLFSSL_ML_KEM_1024,
11551
#endif
11552
#if defined(HAVE_ECC) && (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
11553
    !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
11554
    WOLFSSL_ECC_SECP521R1,
11555
#endif
11556
#if defined(HAVE_ECC) && (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && \
11557
    defined(HAVE_ECC_BRAINPOOL) && ECC_MIN_KEY_SZ <= 512
11558
    WOLFSSL_ECC_BRAINPOOLP512R1TLS13,
11559
    WOLFSSL_ECC_BRAINPOOLP512R1,
11560
#endif
11561
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11562
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_768) && \
11563
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11564
    WOLFSSL_ML_KEM_768,
11565
#endif
11566
#if defined(HAVE_ECC) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11567
    ECC_MIN_KEY_SZ <= 384
11568
    #ifndef NO_ECC_SECP
11569
    WOLFSSL_ECC_SECP384R1,
11570
    #endif
11571
    #ifdef HAVE_ECC_BRAINPOOL
11572
    WOLFSSL_ECC_BRAINPOOLP384R1TLS13,
11573
    WOLFSSL_ECC_BRAINPOOLP384R1,
11574
    #endif
11575
#endif
11576
#if !defined(HAVE_FIPS) && defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11577
    WOLFSSL_ECC_X448,
11578
#endif
11579
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11580
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_512) && \
11581
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11582
    WOLFSSL_ML_KEM_512,
11583
#endif
11584
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11585
    ECC_MIN_KEY_SZ <= 256
11586
    #ifndef NO_ECC_SECP
11587
    WOLFSSL_ECC_SECP256R1,
11588
    #endif
11589
    #ifdef HAVE_ECC_KOBLITZ
11590
    WOLFSSL_ECC_SECP256K1,
11591
    #endif
11592
    #ifdef HAVE_ECC_BRAINPOOL
11593
    WOLFSSL_ECC_BRAINPOOLP256R1TLS13,
11594
    WOLFSSL_ECC_BRAINPOOLP256R1,
11595
    #endif
11596
    #if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
11597
    WOLFSSL_ECC_SM2P256V1,
11598
    #endif
11599
#endif
11600
#if !defined(HAVE_FIPS) && defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11601
    WOLFSSL_ECC_X25519,
11602
#endif
11603
#if defined(HAVE_ECC) && (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && \
11604
    ECC_MIN_KEY_SZ <= 224
11605
    #ifndef NO_ECC_SECP
11606
    WOLFSSL_ECC_SECP224R1,
11607
    #endif
11608
    #ifdef HAVE_ECC_KOBLITZ
11609
    WOLFSSL_ECC_SECP224K1,
11610
    #endif
11611
#endif
11612
#if !defined(HAVE_FIPS) && defined(HAVE_ECC)
11613
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && \
11614
        ECC_MIN_KEY_SZ <= 192
11615
        #ifndef NO_ECC_SECP
11616
        WOLFSSL_ECC_SECP192R1,
11617
        #endif
11618
        #ifdef HAVE_ECC_KOBLITZ
11619
        WOLFSSL_ECC_SECP192K1,
11620
        #endif
11621
    #endif
11622
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && \
11623
        ECC_MIN_KEY_SZ <= 160
11624
        #ifndef NO_ECC_SECP
11625
        WOLFSSL_ECC_SECP160R1,
11626
        #endif
11627
        #ifdef HAVE_ECC_SECPR2
11628
        WOLFSSL_ECC_SECP160R2,
11629
        #endif
11630
        #ifdef HAVE_ECC_KOBLITZ
11631
        WOLFSSL_ECC_SECP160K1,
11632
        #endif
11633
    #endif
11634
#endif /* !HAVE_FIPS && HAVE_ECC */
11635
#if defined(HAVE_FFDHE_8192)
11636
    WOLFSSL_FFDHE_8192,
11637
#endif
11638
#if defined(HAVE_FFDHE_6144)
11639
    WOLFSSL_FFDHE_6144,
11640
#endif
11641
#if defined(HAVE_FFDHE_4096)
11642
    WOLFSSL_FFDHE_4096,
11643
#endif
11644
#if defined(HAVE_FFDHE_3072)
11645
    WOLFSSL_FFDHE_3072,
11646
#endif
11647
#if defined(HAVE_FFDHE_2048)
11648
    WOLFSSL_FFDHE_2048,
11649
#endif
11650
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11651
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
11652
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11653
        (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
11654
        ECC_MIN_KEY_SZ <= 521
11655
    WOLFSSL_SECP521R1MLKEM1024,
11656
    #endif
11657
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11658
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11659
        ECC_MIN_KEY_SZ <= 384
11660
    WOLFSSL_SECP384R1MLKEM768,
11661
    #endif
11662
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE448) && \
11663
        ECC_MIN_KEY_SZ <= 448
11664
    WOLFSSL_X448MLKEM768,
11665
    #endif
11666
    #if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_ECC) && \
11667
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11668
        ECC_MIN_KEY_SZ <= 256
11669
    WOLFSSL_SECP256R1MLKEM512,
11670
    #endif
11671
    #if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_CURVE25519) && \
11672
        ECC_MIN_KEY_SZ <= 256
11673
    WOLFSSL_X25519MLKEM512,
11674
    #endif
11675
#endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && !WOLFSSL_NO_ML_KEM &&
11676
        * WOLFSSL_EXTRA_PQC_HYBRIDS */
11677
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11678
    defined(WOLFSSL_MLKEM_KYBER)
11679
    #ifdef WOLFSSL_KYBER1024
11680
    WOLFSSL_KYBER_LEVEL5,
11681
    #if defined(HAVE_ECC) && (defined(HAVE_ECC521) || \
11682
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
11683
    WOLFSSL_P521_KYBER_LEVEL5,
11684
    #endif
11685
    #endif
11686
    #ifdef WOLFSSL_KYBER768
11687
    WOLFSSL_KYBER_LEVEL3,
11688
    #if defined(HAVE_ECC) && (defined(HAVE_ECC384) || \
11689
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
11690
    WOLFSSL_P384_KYBER_LEVEL3,
11691
    #endif
11692
    #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11693
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
11694
    WOLFSSL_P256_KYBER_LEVEL3,
11695
    #endif
11696
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11697
    WOLFSSL_X25519_KYBER_LEVEL3,
11698
    #endif
11699
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11700
    WOLFSSL_X448_KYBER_LEVEL3,
11701
    #endif
11702
    #endif
11703
    #ifdef WOLFSSL_KYBER512
11704
    WOLFSSL_KYBER_LEVEL1,
11705
    #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11706
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
11707
    WOLFSSL_P256_KYBER_LEVEL1,
11708
    #endif
11709
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11710
    WOLFSSL_X25519_KYBER_LEVEL1,
11711
    #endif
11712
    #endif
11713
#endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && WOLFSSL_MLKEM_KYBER */
11714
    WOLFSSL_NAMED_GROUP_INVALID
11715
};
11716
11717
#define PREFERRED_GROUP_SZ \
11718
2.04k
    ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
11719
                                            /* -1 for the invalid group */
11720
11721
/* WOLFSSL_KEY_SHARE_DEFAULT_GROUP - group used for the speculative key share
11722
 * in ClientHello messages when the application has not selected one via
11723
 * wolfSSL_CTX_set_groups() / wolfSSL_set_groups() or wolfSSL_UseKeyShare().
11724
 *
11725
 * The default is optimized for the likelihood that the server will accept the
11726
 * speculative key share without forcing a HelloRetryRequest. It therefore
11727
 * differs from preferredGroup[] (which is sorted by strength): we pick the
11728
 * most widely deployed group at each tier rather than the strongest.
11729
 *
11730
 * Selection order when not user-defined:
11731
 *   1. A standardized PQ/T hybrid using X25519 or SECP256R1, if available.
11732
 *   2. SECP256R1, then X25519, then SECP384R1.
11733
 *   3. FFDHE 2048 or 3072, for DH-only TLS 1.3 builds.
11734
 *   4. preferredGroup[0] as a final fallback for any other configuration.
11735
 *
11736
 * Users can override the default by defining WOLFSSL_KEY_SHARE_DEFAULT_GROUP
11737
 * in user_settings.h to any of the WOLFSSL_* group identifiers from
11738
 * wolfssl/ssl.h (or the numeric IANA code point). The macro is substituted
11739
 * directly into an assignment, so wrap non-trivial expressions in parentheses.
11740
 */
11741
#ifndef WOLFSSL_KEY_SHARE_DEFAULT_GROUP
11742
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
11743
      !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11744
      !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
11745
      ECC_MIN_KEY_SZ <= 256
11746
0
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_X25519MLKEM768
11747
#elif defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
11748
      !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11749
      !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11750
      (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11751
      ECC_MIN_KEY_SZ <= 256
11752
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_SECP256R1MLKEM768
11753
#elif defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
11754
      !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11755
      !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11756
      (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11757
      ECC_MIN_KEY_SZ <= 384
11758
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_SECP384R1MLKEM1024
11759
#elif defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11760
      defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 && \
11761
      !defined(NO_ECC_SECP)
11762
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_SECP256R1
11763
#elif !defined(HAVE_FIPS) && defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11764
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_X25519
11765
#elif defined(HAVE_ECC) && (defined(HAVE_ECC384) || \
11766
      defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 && \
11767
      !defined(NO_ECC_SECP)
11768
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_SECP384R1
11769
#elif defined(HAVE_FFDHE_2048)
11770
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_FFDHE_2048
11771
#elif defined(HAVE_FFDHE_3072)
11772
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_FFDHE_3072
11773
#else
11774
    /* Fall back to whatever preferredGroup[] starts with. */
11775
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP (preferredGroup[0])
11776
#endif
11777
#endif /* !WOLFSSL_KEY_SHARE_DEFAULT_GROUP */
11778
11779
/* Examines the application specified group ranking and returns the rank of the
11780
 * group.
11781
 * If no group ranking set then all groups are rank 0 (highest).
11782
 *
11783
 * ssl    The SSL/TLS object.
11784
 * group  The group to check ranking for.
11785
 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
11786
 */
11787
static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
11788
2.04k
{
11789
2.04k
    byte i;
11790
2.04k
    const word16* groups;
11791
2.04k
    byte numGroups;
11792
11793
2.04k
    if (ssl->numGroups == 0) {
11794
        /* If the user didn't specify a group list with a preferred order,
11795
         * use the internal preferred group list. */
11796
2.04k
        groups = preferredGroup;
11797
2.04k
        numGroups = PREFERRED_GROUP_SZ;
11798
2.04k
    }
11799
0
    else {
11800
0
        groups = ssl->group;
11801
0
        numGroups = ssl->numGroups;
11802
0
    }
11803
11804
23.3k
    for (i = 0; i < numGroups; i++) {
11805
#if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
11806
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
11807
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
11808
             groups[i] == WOLFSSL_SECP256R1MLKEM512) ||
11809
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
11810
             groups[i] == WOLFSSL_SECP384R1MLKEM768) ||
11811
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
11812
             groups[i] == WOLFSSL_SECP521R1MLKEM1024)) {
11813
            return i;
11814
        }
11815
#endif
11816
23.3k
        if (groups[i] == (word16)group)
11817
2.04k
            return i;
11818
23.3k
    }
11819
11820
0
    return WOLFSSL_FATAL_ERROR;
11821
2.04k
}
11822
11823
/* Set a key share that is supported by the client into extensions.
11824
 *
11825
 * ssl  The SSL/TLS object.
11826
 * returns 0 if a mutual group was found, KEY_SHARE_ERROR if no mutual
11827
 * group exists and other values indicate an error.
11828
 */
11829
int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, TLSX** extensions)
11830
785
{
11831
785
    int             ret;
11832
785
#ifdef HAVE_SUPPORTED_CURVES
11833
785
    TLSX*           extension;
11834
785
    SupportedCurve* curve = NULL;
11835
785
    SupportedCurve* preferredCurve = NULL;
11836
785
    word16          name = WOLFSSL_NAMED_GROUP_INVALID;
11837
785
    KeyShareEntry*  kse = NULL;
11838
785
    int             preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11839
785
    int             rank;
11840
11841
785
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
11842
785
    if (extension != NULL)
11843
785
        curve = (SupportedCurve*)extension->data;
11844
2.43k
    for (; curve != NULL; curve = curve->next) {
11845
        /* Use server's preference order. Common group was found but key share
11846
         * was missing */
11847
1.65k
        if (!TLSX_IsGroupSupported(curve->name, ssl->options.side))
11848
618
            continue;
11849
1.03k
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
11850
0
            continue;
11851
11852
1.03k
        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
11853
1.03k
        if (rank == -1)
11854
0
            continue;
11855
1.03k
        if (rank < preferredRank) {
11856
886
            preferredCurve = curve;
11857
886
            preferredRank = rank;
11858
886
        }
11859
1.03k
    }
11860
785
    curve = preferredCurve;
11861
11862
785
    if (curve == NULL) {
11863
        /* No mutual group exists. An HRR may request only a group the
11864
         * client advertised in supported_groups, so it cannot recover.
11865
         * RFC 8446 4.2.1. */
11866
45
        WOLFSSL_ERROR_VERBOSE(KEY_SHARE_ERROR);
11867
45
        return KEY_SHARE_ERROR;
11868
45
    }
11869
740
    name = curve->name;
11870
11871
    #ifdef WOLFSSL_ASYNC_CRYPT
11872
    /* Check the old key share data list. */
11873
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11874
    if (extension != NULL) {
11875
        kse = (KeyShareEntry*)extension->data;
11876
        /* We should not be computing keys if we are only going to advertise
11877
         * our choice here. */
11878
        if (kse != NULL && kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11879
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11880
            return BAD_KEY_SHARE_DATA;
11881
        }
11882
    }
11883
    #endif
11884
11885
    /* Push new KeyShare extension. This will also free the old one */
11886
740
    ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11887
740
    if (ret != 0)
11888
25
        return ret;
11889
    /* Extension got pushed to head */
11890
715
    extension = *extensions;
11891
    /* Push the selected curve */
11892
715
    ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, name,
11893
715
                            ssl->heap, &kse);
11894
715
    if (ret != 0)
11895
6
        return ret;
11896
    /* Set extension to be in response. */
11897
709
    extension->resp = 1;
11898
#else
11899
11900
    (void)ssl;
11901
11902
    WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN);
11903
    ret = NOT_COMPILED_IN;
11904
#endif
11905
11906
709
    return ret;
11907
715
}
11908
11909
#ifdef WOLFSSL_DUAL_ALG_CERTS
11910
/* Writes the CKS objects of a list in a buffer. */
11911
static word16 CKS_WRITE(WOLFSSL* ssl, byte* output)
11912
{
11913
    XMEMCPY(output, ssl->sigSpec, ssl->sigSpecSz);
11914
    return ssl->sigSpecSz;
11915
}
11916
11917
static int TLSX_UseCKS(TLSX** extensions, WOLFSSL* ssl, void* heap)
11918
{
11919
    int ret = 0;
11920
    TLSX* extension;
11921
11922
    if (extensions == NULL) {
11923
        return BAD_FUNC_ARG;
11924
    }
11925
11926
    extension = TLSX_Find(*extensions, TLSX_CKS);
11927
    /* If it is already present, do nothing. */
11928
    if (extension == NULL) {
11929
        /* The data required is in the ssl struct, so push it in. */
11930
        ret = TLSX_Push(extensions, TLSX_CKS, (void*)ssl, heap);
11931
    }
11932
11933
    return ret;
11934
}
11935
11936
int TLSX_CKS_Set(WOLFSSL* ssl, TLSX** extensions)
11937
{
11938
    int ret;
11939
    TLSX* extension;
11940
    /* Push new KeyShare extension. This will also free the old one */
11941
    ret = TLSX_Push(extensions, TLSX_CKS, NULL, ssl->heap);
11942
    if (ret != 0)
11943
        return ret;
11944
    /* Extension got pushed to head */
11945
    extension = *extensions;
11946
    /* Need ssl->sigSpecSz during extension length calculation. */
11947
    extension->data = ssl;
11948
    /* Set extension to be in response. */
11949
    extension->resp = 1;
11950
    return ret;
11951
}
11952
11953
int TLSX_CKS_Parse(WOLFSSL* ssl, byte* input, word16 length,
11954
                   TLSX** extensions)
11955
{
11956
    int ret;
11957
    int i, j;
11958
11959
    (void) extensions;
11960
11961
    /* Validating the input. A well-formed CKS list carries at most one of each
11962
     * valid specifier, so reject anything longer than WOLFSSL_MAX_CKS_SIGSPEC_SZ
11963
     * to bound the peerSigSpec allocation below. */
11964
    if (length == 0 || length > WOLFSSL_MAX_CKS_SIGSPEC_SZ)
11965
        return BUFFER_ERROR;
11966
    for (i = 0; i < length; i++) {
11967
        switch (input[i])
11968
        {
11969
            case WOLFSSL_CKS_SIGSPEC_NATIVE:
11970
            case WOLFSSL_CKS_SIGSPEC_ALTERNATIVE:
11971
            case WOLFSSL_CKS_SIGSPEC_BOTH:
11972
                /* These are all valid values; do nothing */
11973
                break;
11974
            case WOLFSSL_CKS_SIGSPEC_EXTERNAL:
11975
            default:
11976
                /* All other values (including external) are not. */
11977
                return BAD_FUNC_ARG;
11978
        }
11979
    }
11980
11981
    /* This could be a situation where the client tried to start with TLS 1.3
11982
     * when it sent ClientHello and the server down-graded to TLS 1.2. In that
11983
     * case, erroring out because it is TLS 1.2 is not a reasonable thing to do.
11984
     * In the case of TLS 1.2, the CKS values will be ignored. */
11985
    if (!IsAtLeastTLSv1_3(ssl->version)) {
11986
        ssl->sigSpec = NULL;
11987
        ssl->sigSpecSz = 0;
11988
        return 0;
11989
    }
11990
11991
    /* Extension data is valid, but if we are the server and we don't have an
11992
     * alt private key, do not respond with CKS extension. */
11993
    if (wolfSSL_is_server(ssl) && ssl->buffers.altKey == NULL) {
11994
        ssl->sigSpec = NULL;
11995
        ssl->sigSpecSz = 0;
11996
        return 0;
11997
    }
11998
11999
    /* Copy as the lifetime of input seems to be ephemeral. */
12000
    ssl->peerSigSpec = (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_TLSX);
12001
    if (ssl->peerSigSpec == NULL) {
12002
        return BUFFER_ERROR;
12003
    }
12004
    XMEMCPY(ssl->peerSigSpec, input, length);
12005
    ssl->peerSigSpecSz = length;
12006
12007
    /* If there is no preference set, use theirs... */
12008
    if (ssl->sigSpec == NULL) {
12009
        ret = wolfSSL_UseCKS(ssl, ssl->peerSigSpec, 1);
12010
        if (ret == WOLFSSL_SUCCESS) {
12011
            ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
12012
            TLSX_SetResponse(ssl, TLSX_CKS);
12013
        }
12014
        return ret;
12015
    }
12016
12017
    /* ...otherwise, prioritize our preference. */
12018
    for (i = 0; i < ssl->sigSpecSz; i++) {
12019
        for (j = 0; j < length; j++) {
12020
            if (ssl->sigSpec[i] == input[j]) {
12021
                /* Got the match, set to this one. */
12022
                ret = wolfSSL_UseCKS(ssl, &ssl->sigSpec[i], 1);
12023
                if (ret == WOLFSSL_SUCCESS) {
12024
                    ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
12025
                    TLSX_SetResponse(ssl, TLSX_CKS);
12026
                }
12027
                return ret;
12028
            }
12029
        }
12030
    }
12031
12032
    /* No match found. Cannot continue. */
12033
    return MATCH_SUITE_ERROR;
12034
}
12035
#endif /* WOLFSSL_DUAL_ALG_CERTS */
12036
12037
/* Server side KSE processing */
12038
int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
12039
    byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, byte* searched)
12040
{
12041
    TLSX*          extension;
12042
    KeyShareEntry* clientKSE = NULL;
12043
    KeyShareEntry* list = NULL;
12044
    KeyShareEntry* preferredKSE = NULL;
12045
    int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
12046
    int rank;
12047
12048
    (void)cipherSuite0;
12049
    (void)cipherSuite;
12050
12051
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
12052
        return BAD_FUNC_ARG;
12053
12054
    *searched = 0;
12055
12056
    /* Find the KeyShare extension if it exists. */
12057
    extension = TLSX_Find(extensions, TLSX_KEY_SHARE);
12058
    if (extension != NULL)
12059
        list = (KeyShareEntry*)extension->data;
12060
12061
    if (extension && extension->resp == 1) {
12062
        /* Outside of the async case this path should not be taken. */
12063
        int ret = WC_NO_ERR_TRACE(INCOMPLETE_DATA);
12064
    #ifdef WOLFSSL_ASYNC_CRYPT
12065
        /* in async case make sure key generation is finalized */
12066
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
12067
        if (serverKSE && serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
12068
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
12069
                *searched = 1;
12070
            ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
12071
        }
12072
        else
12073
    #endif
12074
        {
12075
            ret = INCOMPLETE_DATA;
12076
        }
12077
        return ret;
12078
    }
12079
12080
    /* Use server's preference order. */
12081
    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
12082
        if (clientKSE->ke == NULL)
12083
            continue;
12084
12085
#ifdef WOLFSSL_SM2
12086
        if ((cipherSuite0 == CIPHER_BYTE) &&
12087
            ((cipherSuite == TLS_SM4_GCM_SM3) ||
12088
             (cipherSuite == TLS_SM4_CCM_SM3))) {
12089
           if (clientKSE->group != WOLFSSL_ECC_SM2P256V1) {
12090
               continue;
12091
           }
12092
        }
12093
        else if (clientKSE->group == WOLFSSL_ECC_SM2P256V1) {
12094
           continue;
12095
        }
12096
#endif
12097
12098
        /* Check consistency now - extensions in any order. */
12099
        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions))
12100
            continue;
12101
12102
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(clientKSE->group)) {
12103
            /* Check max value supported. */
12104
            if (clientKSE->group > WOLFSSL_ECC_MAX) {
12105
#ifdef WOLFSSL_HAVE_MLKEM
12106
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) &&
12107
                    !WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group))
12108
#endif
12109
                    continue;
12110
            }
12111
            if (wolfSSL_curve_is_disabled(ssl, clientKSE->group))
12112
                continue;
12113
        }
12114
        if (!TLSX_IsGroupSupported(clientKSE->group, ssl->options.side))
12115
            continue;
12116
12117
        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
12118
        if (rank == -1)
12119
            continue;
12120
        if (rank < preferredRank) {
12121
            preferredKSE = clientKSE;
12122
            preferredRank = rank;
12123
        }
12124
    }
12125
    *kse = preferredKSE;
12126
    *searched = 1;
12127
    return 0;
12128
}
12129
12130
/* Server side KSE processing */
12131
int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
12132
916
{
12133
916
    int            ret;
12134
916
    TLSX*          extension;
12135
916
    KeyShareEntry* serverKSE;
12136
916
    KeyShareEntry* list = NULL;
12137
12138
916
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
12139
0
        return BAD_FUNC_ARG;
12140
12141
916
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
12142
916
    if (extension == NULL)
12143
0
        return BAD_STATE_E;
12144
12145
916
    if (clientKSE == NULL) {
12146
#ifdef WOLFSSL_ASYNC_CRYPT
12147
        /* Not necessarily an error. The key may have already been setup. */
12148
        if (extension != NULL && extension->resp == 1) {
12149
            serverKSE = (KeyShareEntry*)extension->data;
12150
            if (serverKSE != NULL) {
12151
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
12152
                /* Re-drive server hybrid encapsulation on resume. GenKey
12153
                 * routes a hybrid group to the client generator, and the
12154
                 * lastRet == 0 path treats the share as done after only the
12155
                 * ECDH part completed, dropping the KEM ciphertext. ke holds
12156
                 * the client share until the handler completes and clears it. */
12157
                if (serverKSE->ke != NULL &&
12158
                        WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(serverKSE->group)) {
12159
                    return TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
12160
                            serverKSE, serverKSE->ke, serverKSE->keLen);
12161
                }
12162
#endif
12163
                /* in async case make sure key generation is finalized */
12164
                if (serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E))
12165
                    return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
12166
                else if (serverKSE->lastRet == 0)
12167
                    return 0;
12168
            }
12169
        }
12170
#endif
12171
0
        return BAD_FUNC_ARG;
12172
0
    }
12173
12174
    /* Generate a new key pair except in the case of PQC KEM because we
12175
     * are going to encapsulate and that does not require us to generate a
12176
     * key pair.
12177
     */
12178
916
    ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
12179
916
    if (ret != 0)
12180
4
        return ret;
12181
12182
912
    if (clientKSE->key == NULL) {
12183
912
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
12184
912
        if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) {
12185
0
            ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, serverKSE,
12186
0
                    clientKSE->ke, clientKSE->keLen,
12187
0
                    ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
12188
0
        }
12189
912
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
12190
0
            ret = TLSX_KeyShare_HandlePqcHybridKeyServer(ssl, serverKSE,
12191
0
                    clientKSE->ke, clientKSE->keLen);
12192
0
        }
12193
912
        else
12194
912
#endif
12195
912
        {
12196
912
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
12197
912
        }
12198
12199
        /* for async do setup of serverKSE below, but return WC_PENDING_E */
12200
912
        if (ret != 0
12201
        #ifdef WOLFSSL_ASYNC_CRYPT
12202
            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
12203
        #endif
12204
912
        ) {
12205
253
            TLSX_KeyShare_FreeAll(list, ssl->heap);
12206
253
            return ret;
12207
253
        }
12208
912
    }
12209
0
    else {
12210
        /* transfer buffers to serverKSE */
12211
0
        serverKSE->key = clientKSE->key;
12212
0
        clientKSE->key = NULL;
12213
0
        serverKSE->keyLen = clientKSE->keyLen;
12214
0
        serverKSE->pubKey = clientKSE->pubKey;
12215
0
        clientKSE->pubKey = NULL;
12216
0
        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
12217
0
    #ifndef NO_DH
12218
0
        serverKSE->privKey = clientKSE->privKey;
12219
0
        clientKSE->privKey = NULL;
12220
0
    #endif
12221
0
    }
12222
659
    serverKSE->ke = clientKSE->ke;
12223
659
    serverKSE->keLen = clientKSE->keLen;
12224
659
    clientKSE->ke = NULL;
12225
659
    clientKSE->keLen = 0;
12226
659
    ssl->namedGroup = serverKSE->group;
12227
12228
659
    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
12229
659
    extension->data = (void *)serverKSE;
12230
12231
659
    extension->resp = 1;
12232
659
    return ret;
12233
912
}
12234
12235
/* Ensure there is a key pair that can be used for key exchange.
12236
 *
12237
 * ssl  The SSL/TLS object.
12238
 * doHelloRetry If set to non-zero will do hello_retry
12239
 * returns 0 on success and other values indicate failure.
12240
 */
12241
int TLSX_KeyShare_Establish(WOLFSSL *ssl, int* doHelloRetry)
12242
0
{
12243
0
    int            ret;
12244
0
    KeyShareEntry* clientKSE = NULL;
12245
0
    byte           searched = 0;
12246
12247
0
    *doHelloRetry = 0;
12248
12249
0
    ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, ssl->cipher.cipherSuite0,
12250
0
        ssl->cipher.cipherSuite, &clientKSE, &searched);
12251
0
    if (ret != 0 || !searched)
12252
0
        return ret;
12253
12254
    /* No supported group found - send HelloRetryRequest. */
12255
0
    if (clientKSE == NULL) {
12256
        /* HRR is only valid if it requests a group the client advertised.
12257
         * SetSupported fails when no mutual group exists. */
12258
0
        ret = TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
12259
0
        if (ret == 0)
12260
0
            *doHelloRetry = 1;
12261
0
        return ret;
12262
0
    }
12263
12264
0
    return TLSX_KeyShare_Setup(ssl, clientKSE);
12265
0
}
12266
12267
/* Derive the shared secret of the key exchange.
12268
 *
12269
 * ssl  The SSL/TLS object.
12270
 * returns 0 on success and other values indicate failure.
12271
 */
12272
int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
12273
0
{
12274
0
    int            ret;
12275
0
    TLSX*          extension;
12276
0
    KeyShareEntry* list = NULL;
12277
12278
    /* Find the KeyShare extension if it exists. */
12279
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
12280
0
    if (extension != NULL)
12281
0
        list = (KeyShareEntry*)extension->data;
12282
12283
0
    if (list == NULL) {
12284
        /* Unreachable once the handshake reached this accept state
12285
         * (TLSX_KeyShare_Setup installed the extension), so no async event
12286
         * can be stranded by returning before the pop below. */
12287
0
        return KEY_SHARE_ERROR;
12288
0
    }
12289
12290
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) || \
12291
    defined(WOLFSSL_ASYNC_CRYPT)
12292
    /* Already derived: a later pend's retry re-enters here with the peer
12293
     * key freed. Checked before the pop so the later operation's queued
12294
     * event is not stolen. */
12295
    if (list->derived)
12296
        return 0;
12297
#endif
12298
12299
#ifdef WOLFSSL_ASYNC_CRYPT
12300
    ret = wolfSSL_AsyncPop(ssl, NULL);
12301
    /* Check for error */
12302
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) && ret < 0) {
12303
        return ret;
12304
    }
12305
#endif
12306
12307
    /* Calculate secret. */
12308
0
    ret = TLSX_KeyShare_Process(ssl, list);
12309
12310
0
    return ret;
12311
0
}
12312
12313
0
#define KS_FREE_ALL  TLSX_KeyShare_FreeAll
12314
#define KS_GET_SIZE  TLSX_KeyShare_GetSize
12315
0
#define KS_WRITE     TLSX_KeyShare_Write
12316
0
#define KS_PARSE     TLSX_KeyShare_Parse
12317
12318
#else
12319
12320
#define KS_FREE_ALL(a, b) WC_DO_NOTHING
12321
#define KS_GET_SIZE(a, b)    0
12322
#define KS_WRITE(a, b, c)    0
12323
#define KS_PARSE(a, b, c, d) 0
12324
12325
#endif /* WOLFSSL_TLS13 */
12326
12327
/******************************************************************************/
12328
/* Pre-Shared Key                                                             */
12329
/******************************************************************************/
12330
12331
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
12332
/* Free the pre-shared key dynamic data.
12333
 *
12334
 * list  The linked list of key share entry objects.
12335
 * heap  The heap used for allocation.
12336
 */
12337
static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
12338
{
12339
    PreSharedKey* current;
12340
12341
    while ((current = list) != NULL) {
12342
        list = current->next;
12343
        /* identity may hold an in-place decrypted ticket whose bytes are the
12344
         * resumption master secret; wipe before returning it to the heap. */
12345
        if (current->identity != NULL)
12346
            ForceZero(current->identity, current->identityLen);
12347
        XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
12348
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
12349
    }
12350
12351
    (void)heap;
12352
}
12353
12354
/* Get the size of the encoded pre shared key extension.
12355
 *
12356
 * list     The linked list of pre-shared key extensions.
12357
 * msgType  The type of the message this extension is being written into.
12358
 * returns the number of bytes of the encoded pre-shared key extension or
12359
 * SANITY_MSG_E to indicate invalid message type.
12360
 */
12361
static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
12362
                                     word16* pSz)
12363
{
12364
    if (msgType == client_hello) {
12365
        /* Length of identities + Length of binders. */
12366
        word32 len = OPAQUE16_LEN + OPAQUE16_LEN;
12367
        while (list != NULL) {
12368
            /* Each entry has: identity, ticket age and binder. */
12369
            len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
12370
                   OPAQUE8_LEN + (word32)list->binderLen;
12371
            if (len > WOLFSSL_MAX_16BIT) {
12372
                WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12373
                return LENGTH_ERROR;
12374
            }
12375
            list = list->next;
12376
        }
12377
        if ((word32)*pSz + len > WOLFSSL_MAX_16BIT) {
12378
            WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12379
            return LENGTH_ERROR;
12380
        }
12381
        *pSz += (word16)len;
12382
        return 0;
12383
    }
12384
12385
    if (msgType == server_hello) {
12386
        *pSz += OPAQUE16_LEN;
12387
        return 0;
12388
    }
12389
12390
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12391
    return SANITY_MSG_E;
12392
}
12393
12394
/* The number of bytes to be written for the binders.
12395
 *
12396
 * list     The linked list of pre-shared key extensions.
12397
 * msgType  The type of the message this extension is being written into.
12398
 * returns the number of bytes of the encoded pre-shared key extension or
12399
 * SANITY_MSG_E to indicate invalid message type.
12400
 */
12401
int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
12402
                                     word16* pSz)
12403
{
12404
    word32 len;
12405
12406
    if (msgType != client_hello) {
12407
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12408
        return SANITY_MSG_E;
12409
    }
12410
12411
    /* Length of all binders. */
12412
    len = OPAQUE16_LEN;
12413
    while (list != NULL) {
12414
        len += OPAQUE8_LEN + (word32)list->binderLen;
12415
        if (len > WOLFSSL_MAX_16BIT) {
12416
            WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12417
            return LENGTH_ERROR;
12418
        }
12419
        list = list->next;
12420
    }
12421
12422
    *pSz = (word16)len;
12423
    return 0;
12424
}
12425
12426
/* Writes the pre-shared key extension into the output buffer - binders only.
12427
 * Assumes that the the output buffer is big enough to hold data.
12428
 *
12429
 * list     The linked list of key share entries.
12430
 * output   The buffer to write into.
12431
 * msgType  The type of the message this extension is being written into.
12432
 * returns the number of bytes written into the buffer.
12433
 */
12434
int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
12435
                                   byte msgType, word16* pSz)
12436
{
12437
    PreSharedKey* current = list;
12438
    word16 idx = 0;
12439
    word16 lenIdx;
12440
    word16 len;
12441
12442
    if (msgType != client_hello) {
12443
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12444
        return SANITY_MSG_E;
12445
    }
12446
12447
    /* Skip length of all binders. */
12448
    lenIdx = idx;
12449
    idx += OPAQUE16_LEN;
12450
    while (current != NULL) {
12451
        /* Binder data length. */
12452
        output[idx++] = (byte)current->binderLen;
12453
        /* Binder data. */
12454
        XMEMCPY(output + idx, current->binder, current->binderLen);
12455
        idx += (word16)current->binderLen;
12456
12457
        current = current->next;
12458
    }
12459
    /* Length of the binders. */
12460
    len = idx - lenIdx - OPAQUE16_LEN;
12461
    c16toa(len, output + lenIdx);
12462
12463
    *pSz = idx;
12464
    return 0;
12465
}
12466
12467
12468
/* Writes the pre-shared key extension into the output buffer.
12469
 * Assumes that the the output buffer is big enough to hold data.
12470
 *
12471
 * list     The linked list of key share entries.
12472
 * output   The buffer to write into.
12473
 * msgType  The type of the message this extension is being written into.
12474
 * returns the number of bytes written into the buffer.
12475
 */
12476
static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
12477
                                   byte msgType, word16* pSz)
12478
{
12479
    if (msgType == client_hello) {
12480
        PreSharedKey* current = list;
12481
        word16 idx = 0;
12482
        word16 lenIdx;
12483
        word16 len;
12484
        int ret;
12485
12486
        /* Write identities only. Binders after HMACing over this. */
12487
        lenIdx = idx;
12488
        idx += OPAQUE16_LEN;
12489
        while (current != NULL) {
12490
            /* Identity length */
12491
            c16toa(current->identityLen, output + idx);
12492
            idx += OPAQUE16_LEN;
12493
            /* Identity data */
12494
            XMEMCPY(output + idx, current->identity, current->identityLen);
12495
            idx += current->identityLen;
12496
12497
            /* Obfuscated ticket age. */
12498
            c32toa(current->ticketAge, output + idx);
12499
            idx += OPAQUE32_LEN;
12500
12501
            current = current->next;
12502
        }
12503
        /* Length of the identities. */
12504
        len = idx - lenIdx - OPAQUE16_LEN;
12505
        c16toa(len, output + lenIdx);
12506
12507
        /* Don't include binders here.
12508
         * The binders are based on the hash of all the ClientHello data up to
12509
         * and include the identities written above.
12510
         */
12511
        ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
12512
        if (ret < 0)
12513
            return ret;
12514
        /* Zero the reserved binder region rather than leaving it
12515
         * uninitialized.  For the outer ClientHello these bytes are
12516
         * overwritten by TLSX_PreSharedKey_WriteBinders(), but when ECH is
12517
         * enabled the inner ClientHello is hashed (expanded form), sealed
12518
         * (encoded form), and used as seal-time AAD (outer form) before
12519
         * WritePSKBinders() runs, so unwritten binder bytes would leak
12520
         * heap contents into the HPKE payload and taint the transcript. */
12521
        XMEMSET(output + idx, 0, len);
12522
        *pSz += idx + len;
12523
    }
12524
    else if (msgType == server_hello) {
12525
        word16 i;
12526
12527
        /* Find the index of the chosen identity. */
12528
        for (i=0; list != NULL && !list->chosen; i++)
12529
            list = list->next;
12530
        if (list == NULL) {
12531
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
12532
            return BUILD_MSG_ERROR;
12533
        }
12534
12535
        /* The index of the identity chosen by the server from the list supplied
12536
         * by the client.
12537
         */
12538
        c16toa(i, output);
12539
        *pSz += OPAQUE16_LEN;
12540
    }
12541
    else {
12542
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12543
        return SANITY_MSG_E;
12544
    }
12545
12546
    return 0;
12547
}
12548
12549
int TLSX_PreSharedKey_Parse_ClientHello(TLSX** extensions, const byte* input,
12550
                                        word16 length, void* heap)
12551
{
12552
12553
    int    ret;
12554
    word16 len;
12555
    word16 idx = 0;
12556
    TLSX*         extension;
12557
    PreSharedKey* list;
12558
12559
    TLSX_Remove(extensions, TLSX_PRE_SHARED_KEY, heap);
12560
12561
    /* Length of identities and of binders. */
12562
    if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
12563
        return BUFFER_E;
12564
12565
    /* Length of identities. */
12566
    ato16(input + idx, &len);
12567
    idx += OPAQUE16_LEN;
12568
    if (len < MIN_PSK_ID_LEN || length - idx < len)
12569
        return BUFFER_E;
12570
12571
    /* Create a pre-shared key object for each identity. */
12572
    while (len > 0) {
12573
        const byte* identity;
12574
        word16      identityLen;
12575
        word32      age;
12576
12577
        if (len < OPAQUE16_LEN)
12578
            return BUFFER_E;
12579
12580
        /* Length of identity. */
12581
        ato16(input + idx, &identityLen);
12582
        idx += OPAQUE16_LEN;
12583
        if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
12584
                identityLen > MAX_PSK_ID_LEN)
12585
            return BUFFER_E;
12586
        /* Cache identity pointer. */
12587
        identity = input + idx;
12588
        idx += identityLen;
12589
        /* Ticket age. */
12590
        ato32(input + idx, &age);
12591
        idx += OPAQUE32_LEN;
12592
12593
        ret = TLSX_PreSharedKey_Use(extensions, identity, identityLen, age, no_mac,
12594
                                    0, 0, 1, NULL, heap);
12595
        if (ret != 0)
12596
            return ret;
12597
12598
        /* Done with this identity. */
12599
        len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
12600
    }
12601
12602
    /* Find the list of identities sent to server. */
12603
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12604
    if (extension == NULL)
12605
        return PSK_KEY_ERROR;
12606
    list = (PreSharedKey*)extension->data;
12607
12608
    /* Length of binders. */
12609
    if (idx + OPAQUE16_LEN > length)
12610
        return BUFFER_E;
12611
    ato16(input + idx, &len);
12612
    idx += OPAQUE16_LEN;
12613
    if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
12614
        return BUFFER_E;
12615
12616
    /* Set binder for each identity. */
12617
    while (list != NULL && len > 0) {
12618
        /* Length of binder */
12619
        list->binderLen = input[idx++];
12620
        if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
12621
                list->binderLen > WC_MAX_DIGEST_SIZE)
12622
            return BUFFER_E;
12623
        if (len < OPAQUE8_LEN + list->binderLen)
12624
            return BUFFER_E;
12625
12626
        /* Copy binder into static buffer. */
12627
        XMEMCPY(list->binder, input + idx, list->binderLen);
12628
        idx += (word16)list->binderLen;
12629
12630
        /* Done with binder entry. */
12631
        len -= OPAQUE8_LEN + (word16)list->binderLen;
12632
12633
        /* Next identity. */
12634
        list = list->next;
12635
    }
12636
    if (list != NULL || len != 0)
12637
        return BUFFER_E;
12638
12639
    return 0;
12640
12641
}
12642
12643
/* Parse the pre-shared key extension.
12644
 * Different formats in different messages.
12645
 *
12646
 * ssl      The SSL/TLS object.
12647
 * input    The extension data.
12648
 * length   The length of the extension data.
12649
 * msgType  The type of the message this extension is being parsed from.
12650
 * returns 0 on success and other values indicate failure.
12651
 */
12652
static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, const byte* input,
12653
                                   word16 length, byte msgType)
12654
{
12655
12656
    if (msgType == client_hello) {
12657
        return TLSX_PreSharedKey_Parse_ClientHello(&ssl->extensions, input,
12658
                                                   length, ssl->heap);
12659
    }
12660
12661
    if (msgType == server_hello) {
12662
        word16 idx;
12663
        PreSharedKey* list;
12664
        TLSX*         extension;
12665
12666
        /* Index of identity chosen by server. */
12667
        if (length != OPAQUE16_LEN)
12668
            return BUFFER_E;
12669
        ato16(input, &idx);
12670
12671
    #ifdef WOLFSSL_EARLY_DATA
12672
        ssl->options.pskIdIndex = idx + 1;
12673
    #endif
12674
12675
        /* Find the list of identities sent to server. */
12676
        extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
12677
        if (extension == NULL)
12678
            return INCOMPLETE_DATA;
12679
        list = (PreSharedKey*)extension->data;
12680
12681
        /* Mark the identity as chosen. */
12682
        for (; list != NULL && idx > 0; idx--)
12683
            list = list->next;
12684
        if (list == NULL) {
12685
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12686
            return PSK_KEY_ERROR;
12687
        }
12688
        list->chosen = 1;
12689
12690
        if (list->resumption) {
12691
           /* Check that the session's details are the same as the server's. */
12692
           if (ssl->options.cipherSuite0  != ssl->session->cipherSuite0       ||
12693
               ssl->options.cipherSuite   != ssl->session->cipherSuite        ||
12694
               ssl->session->version.major != ssl->ctx->method->version.major ||
12695
               ssl->session->version.minor != ssl->ctx->method->version.minor) {
12696
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12697
               return PSK_KEY_ERROR;
12698
           }
12699
        }
12700
12701
        return 0;
12702
    }
12703
12704
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12705
    return SANITY_MSG_E;
12706
}
12707
12708
/* Create a new pre-shared key and put it into the list.
12709
 *
12710
 * list          The linked list of pre-shared key.
12711
 * identity      The identity.
12712
 * len           The length of the identity data.
12713
 * heap          The memory to allocate with.
12714
 * preSharedKey  The new pre-shared key object.
12715
 * returns 0 on success and other values indicate failure.
12716
 */
12717
static int TLSX_PreSharedKey_New(PreSharedKey** list, const byte* identity,
12718
                                 word16 len, void *heap,
12719
                                 PreSharedKey** preSharedKey)
12720
{
12721
    PreSharedKey* psk;
12722
    PreSharedKey** next;
12723
12724
    psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
12725
    if (psk == NULL)
12726
        return MEMORY_E;
12727
    XMEMSET(psk, 0, sizeof(*psk));
12728
12729
    /* Make a copy of the identity data. */
12730
    psk->identity = (byte*)XMALLOC(len + NULL_TERM_LEN, heap,
12731
                                   DYNAMIC_TYPE_TLSX);
12732
    if (psk->identity == NULL) {
12733
        XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
12734
        return MEMORY_E;
12735
    }
12736
    XMEMCPY(psk->identity, identity, len);
12737
    psk->identityLen = len;
12738
    /* Use a NULL terminator in case it is a C string */
12739
    psk->identity[psk->identityLen] = '\0';
12740
12741
    /* Add it to the end and maintain the links. */
12742
    while (*list != NULL) {
12743
        /* Assign to temporary to work around compiler bug found by customer. */
12744
        next = &((*list)->next);
12745
        list = next;
12746
    }
12747
    *list = psk;
12748
    *preSharedKey = psk;
12749
12750
    (void)heap;
12751
12752
    return 0;
12753
}
12754
12755
static WC_INLINE byte GetHmacLength(int hmac)
12756
{
12757
    switch (hmac) {
12758
    #ifndef NO_SHA256
12759
        case sha256_mac:
12760
            return WC_SHA256_DIGEST_SIZE;
12761
    #endif
12762
    #ifdef WOLFSSL_SHA384
12763
        case sha384_mac:
12764
            return WC_SHA384_DIGEST_SIZE;
12765
    #endif
12766
    #ifdef WOLFSSL_SHA512
12767
        case sha512_mac:
12768
            return WC_SHA512_DIGEST_SIZE;
12769
    #endif
12770
    #ifdef WOLFSSL_SM3
12771
        case sm3_mac:
12772
            return WC_SM3_DIGEST_SIZE;
12773
    #endif
12774
        default:
12775
            break;
12776
    }
12777
    return 0;
12778
}
12779
12780
/* Use the data to create a new pre-shared key object in the extensions.
12781
 *
12782
 * ssl           The SSL/TLS object.
12783
 * identity      The identity.
12784
 * len           The length of the identity data.
12785
 * age           The age of the identity.
12786
 * hmac          The HMAC algorithm.
12787
 * cipherSuite0  The first byte of the cipher suite to use.
12788
 * cipherSuite   The second byte of the cipher suite to use.
12789
 * resumption    The PSK is for resumption of a session.
12790
 * preSharedKey  The new pre-shared key object.
12791
 * returns 0 on success and other values indicate failure.
12792
 */
12793
int TLSX_PreSharedKey_Use(TLSX** extensions, const byte* identity, word16 len,
12794
                          word32 age, byte hmac, byte cipherSuite0,
12795
                          byte cipherSuite, byte resumption,
12796
                          PreSharedKey **preSharedKey, void* heap)
12797
{
12798
    int           ret = 0;
12799
    TLSX*         extension;
12800
    PreSharedKey* psk = NULL;
12801
12802
    /* Find the pre-shared key extension if it exists. */
12803
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12804
    if (extension == NULL) {
12805
        /* Push new pre-shared key extension. */
12806
        ret = TLSX_Push(extensions, TLSX_PRE_SHARED_KEY, NULL, heap);
12807
        if (ret != 0)
12808
            return ret;
12809
12810
        extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12811
        if (extension == NULL)
12812
            return MEMORY_E;
12813
    }
12814
12815
    /* Try to find the pre-shared key with this identity. */
12816
    psk = (PreSharedKey*)extension->data;
12817
    while (psk != NULL) {
12818
        if ((psk->identityLen == len) &&
12819
               (XMEMCMP(psk->identity, identity, len) == 0)) {
12820
            break;
12821
        }
12822
        psk = psk->next;
12823
    }
12824
12825
    /* Create a new pre-shared key object if not found. */
12826
    if (psk == NULL) {
12827
        ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
12828
                                    len, heap, &psk);
12829
        if (ret != 0)
12830
            return ret;
12831
    }
12832
12833
    /* Update/set age and HMAC algorithm. */
12834
    psk->ticketAge    = age;
12835
    psk->hmac         = hmac;
12836
    psk->cipherSuite0 = cipherSuite0;
12837
    psk->cipherSuite  = cipherSuite;
12838
    psk->resumption   = resumption;
12839
    psk->binderLen    = GetHmacLength(psk->hmac);
12840
12841
    if (preSharedKey != NULL)
12842
        *preSharedKey = psk;
12843
12844
    return 0;
12845
}
12846
12847
#define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
12848
#define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
12849
#define PSK_WRITE     TLSX_PreSharedKey_Write
12850
#define PSK_PARSE     TLSX_PreSharedKey_Parse
12851
12852
#else
12853
12854
#define PSK_FREE_ALL(a, b) WC_DO_NOTHING
12855
#define PSK_GET_SIZE(a, b, c) 0
12856
#define PSK_WRITE(a, b, c, d) 0
12857
#define PSK_PARSE(a, b, c, d) 0
12858
12859
#endif
12860
12861
/******************************************************************************/
12862
/* Certificate Authentication with External Pre-Shared Key                    */
12863
/******************************************************************************/
12864
12865
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
12866
    !defined(NO_PSK)
12867
12868
static int TLSX_CertWithExternPsk_GetSize(byte msgType, word16* pSz)
12869
{
12870
    (void)msgType;
12871
    (void)pSz;
12872
    /* Zero-length extension - nothing to add. */
12873
    return 0;
12874
}
12875
12876
static int TLSX_CertWithExternPsk_Write(byte* output, byte msgType,
12877
    word16* pSz)
12878
{
12879
    (void)output;
12880
    (void)msgType;
12881
    (void)pSz;
12882
    /* Zero-length extension - nothing to write. */
12883
    return 0;
12884
}
12885
12886
static int TLSX_CertWithExternPsk_Parse(WOLFSSL* ssl, byte msgType)
12887
{
12888
    if (msgType == client_hello) {
12889
        /* Server has not opted in - treat the extension as unknown. */
12890
        if (!ssl->options.certWithExternPsk)
12891
            return 0;
12892
        /* Record that the client offered the extension, leaving resp=0.
12893
         * CheckPreSharedKeys() is the sole writer that flips resp to 1, and
12894
         * only after confirming that a non-ticket PSK was matched. */
12895
        if (TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) == NULL) {
12896
            return TLSX_Push(&ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK,
12897
                NULL, ssl->heap);
12898
        }
12899
        return 0;
12900
    }
12901
12902
    if (msgType == server_hello) {
12903
        if (TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) == NULL) {
12904
            WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
12905
            return EXT_NOT_ALLOWED;
12906
        }
12907
        ssl->options.certWithExternPsk = 1;
12908
        return 0;
12909
    }
12910
12911
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12912
    return SANITY_MSG_E;
12913
}
12914
12915
int TLSX_CertWithExternPsk_Use(WOLFSSL* ssl)
12916
{
12917
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK);
12918
12919
    if (extension == NULL) {
12920
        int ret = TLSX_Push(&ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK, NULL,
12921
            ssl->heap);
12922
        if (ret != 0)
12923
            return ret;
12924
        extension = TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK);
12925
        if (extension == NULL)
12926
            return MEMORY_E;
12927
    }
12928
    extension->resp = 1;
12929
    return 0;
12930
}
12931
12932
#define PSK_WITH_CERT_GET_SIZE  TLSX_CertWithExternPsk_GetSize
12933
#define PSK_WITH_CERT_WRITE     TLSX_CertWithExternPsk_Write
12934
#define PSK_WITH_CERT_PARSE     TLSX_CertWithExternPsk_Parse
12935
12936
#else
12937
12938
#define PSK_WITH_CERT_GET_SIZE(a, b) 0
12939
#define PSK_WITH_CERT_WRITE(a, b, c) 0
12940
#define PSK_WITH_CERT_PARSE(a, b) 0
12941
12942
#endif /* WOLFSSL_TLS13 && WOLFSSL_CERT_WITH_EXTERN_PSK */
12943
12944
/******************************************************************************/
12945
/* PSK Key Exchange Modes                                                     */
12946
/******************************************************************************/
12947
12948
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
12949
/* Get the size of the encoded PSK KE modes extension.
12950
 * Only in ClientHello.
12951
 *
12952
 * modes    The PSK KE mode bit string.
12953
 * msgType  The type of the message this extension is being written into.
12954
 * returns the number of bytes of the encoded PSK KE mode extension.
12955
 */
12956
static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
12957
{
12958
    if (msgType == client_hello) {
12959
        /* Format: Len | Modes* */
12960
        word16 len = OPAQUE8_LEN;
12961
        /* Check whether each possible mode is to be written. */
12962
        if (modes & (1 << PSK_KE))
12963
            len += OPAQUE8_LEN;
12964
        if (modes & (1 << PSK_DHE_KE))
12965
            len += OPAQUE8_LEN;
12966
        *pSz += len;
12967
        return 0;
12968
    }
12969
12970
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12971
    return SANITY_MSG_E;
12972
}
12973
12974
/* Writes the PSK KE modes extension into the output buffer.
12975
 * Assumes that the the output buffer is big enough to hold data.
12976
 * Only in ClientHello.
12977
 *
12978
 * modes    The PSK KE mode bit string.
12979
 * output   The buffer to write into.
12980
 * msgType  The type of the message this extension is being written into.
12981
 * returns the number of bytes written into the buffer.
12982
 */
12983
static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
12984
                                 word16* pSz)
12985
{
12986
    if (msgType == client_hello) {
12987
        /* Format: Len | Modes* */
12988
        word16 idx = OPAQUE8_LEN;
12989
12990
        /* Write out each possible mode. */
12991
        if (modes & (1 << PSK_KE))
12992
            output[idx++] = PSK_KE;
12993
        if (modes & (1 << PSK_DHE_KE))
12994
            output[idx++] = PSK_DHE_KE;
12995
        /* Write out length of mode list. */
12996
        output[0] = (byte)(idx - OPAQUE8_LEN);
12997
12998
        *pSz += idx;
12999
        return 0;
13000
    }
13001
13002
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13003
    return SANITY_MSG_E;
13004
}
13005
13006
int TLSX_PskKeyModes_Parse_Modes(const byte* input, word16 length, byte msgType,
13007
                                byte* modes)
13008
{
13009
    if (msgType == client_hello) {
13010
        /* Format: Len | Modes* */
13011
        int   idx = 0;
13012
        word16 len;
13013
        *modes = 0;
13014
13015
        /* Ensure length byte exists. */
13016
        if (length < OPAQUE8_LEN)
13017
            return BUFFER_E;
13018
13019
        /* Get length of mode list and ensure that is the only data. */
13020
        len = input[0];
13021
        if (length - OPAQUE8_LEN != len)
13022
            return BUFFER_E;
13023
13024
        idx = OPAQUE8_LEN;
13025
        /* Set a bit for each recognized modes. */
13026
        while (len > 0) {
13027
            /* Ignore unrecognized modes.  */
13028
            if (input[idx] <= PSK_DHE_KE)
13029
               *modes |= 1 << input[idx];
13030
            idx++;
13031
            len--;
13032
        }
13033
        return 0;
13034
    }
13035
13036
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13037
    return SANITY_MSG_E;
13038
}
13039
13040
/* Parse the PSK KE modes extension.
13041
 * Only in ClientHello.
13042
 *
13043
 * ssl      The SSL/TLS object.
13044
 * input    The extension data.
13045
 * length   The length of the extension data.
13046
 * msgType  The type of the message this extension is being parsed from.
13047
 * returns 0 on success and other values indicate failure.
13048
 */
13049
static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, const byte* input, word16 length,
13050
                                 byte msgType)
13051
{
13052
    int    ret;
13053
    byte modes;
13054
13055
    ret = TLSX_PskKeyModes_Parse_Modes(input, length, msgType, &modes);
13056
    if (ret == 0) {
13057
#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
13058
    defined(WOLFSSL_TLS13_TICKET_CHECK_PSK_MODES)
13059
        /* Keep the advertised modes for the NewSessionTicket decision. The
13060
         * extension object is dropped with the rest of the handshake state
13061
         * once the handshake is done. */
13062
        ssl->options.pskKeModes = modes;
13063
        ssl->options.pskKeModesRecvd = 1;
13064
#endif
13065
        ret = TLSX_PskKeyModes_Use(ssl, modes);
13066
    }
13067
13068
    if (ret != 0) {
13069
        WOLFSSL_ERROR_VERBOSE(ret);
13070
    }
13071
13072
    return ret;
13073
}
13074
13075
/* Use the data to create a new PSK Key Exchange Modes object in the extensions.
13076
 *
13077
 * ssl    The SSL/TLS object.
13078
 * modes  The PSK key exchange modes.
13079
 * returns 0 on success and other values indicate failure.
13080
 */
13081
int TLSX_PskKeyModes_Use(WOLFSSL* ssl, byte modes)
13082
{
13083
    int           ret = 0;
13084
    TLSX*         extension;
13085
13086
    /* Find the PSK key exchange modes extension if it exists. */
13087
    extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
13088
    if (extension == NULL) {
13089
        /* Push new PSK key exchange modes extension. */
13090
        ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
13091
            ssl->heap);
13092
        if (ret != 0)
13093
            return ret;
13094
13095
        extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
13096
        if (extension == NULL)
13097
            return MEMORY_E;
13098
    }
13099
13100
    extension->val = modes;
13101
13102
    return 0;
13103
}
13104
13105
#define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
13106
#define PKM_WRITE     TLSX_PskKeModes_Write
13107
#define PKM_PARSE     TLSX_PskKeModes_Parse
13108
13109
#else
13110
13111
#define PKM_GET_SIZE(a, b, c) 0
13112
#define PKM_WRITE(a, b, c, d) 0
13113
#define PKM_PARSE(a, b, c, d) 0
13114
13115
#endif
13116
13117
/******************************************************************************/
13118
/* Post-Handshake Authentication                                              */
13119
/******************************************************************************/
13120
13121
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
13122
/* Get the size of the encoded Post-Handshake Authentication extension.
13123
 * Only in ClientHello.
13124
 *
13125
 * msgType  The type of the message this extension is being written into.
13126
 * returns the number of bytes of the encoded Post-Handshake Authentication
13127
 * extension.
13128
 */
13129
static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
13130
{
13131
    if (msgType == client_hello) {
13132
        *pSz += 0;
13133
        return 0;
13134
    }
13135
13136
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13137
    return SANITY_MSG_E;
13138
}
13139
13140
/* Writes the Post-Handshake Authentication extension into the output buffer.
13141
 * Assumes that the the output buffer is big enough to hold data.
13142
 * Only in ClientHello.
13143
 *
13144
 * output   The buffer to write into.
13145
 * msgType  The type of the message this extension is being written into.
13146
 * returns the number of bytes written into the buffer.
13147
 */
13148
static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
13149
{
13150
    (void)output;
13151
13152
    if (msgType == client_hello) {
13153
        *pSz += 0;
13154
        return 0;
13155
    }
13156
13157
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13158
    return SANITY_MSG_E;
13159
}
13160
13161
/* Parse the Post-Handshake Authentication extension.
13162
 * Only in ClientHello.
13163
 *
13164
 * ssl      The SSL/TLS object.
13165
 * input    The extension data.
13166
 * length   The length of the extension data.
13167
 * msgType  The type of the message this extension is being parsed from.
13168
 * returns 0 on success and other values indicate failure.
13169
 */
13170
static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, const byte* input,
13171
                                   word16 length, byte msgType)
13172
{
13173
    (void)input;
13174
13175
    if (msgType == client_hello) {
13176
        /* Ensure extension is empty. */
13177
        if (length != 0)
13178
            return BUFFER_E;
13179
13180
        ssl->options.postHandshakeAuth = 1;
13181
        return 0;
13182
    }
13183
13184
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13185
    return SANITY_MSG_E;
13186
}
13187
13188
/* Create a new Post-handshake authentication object in the extensions.
13189
 *
13190
 * ssl    The SSL/TLS object.
13191
 * returns 0 on success and other values indicate failure.
13192
 */
13193
static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
13194
{
13195
    int   ret = 0;
13196
    TLSX* extension;
13197
13198
    /* Find the PSK key exchange modes extension if it exists. */
13199
    extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
13200
    if (extension == NULL) {
13201
        /* Push new Post-handshake Authentication extension. */
13202
        ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
13203
            ssl->heap);
13204
        if (ret != 0)
13205
            return ret;
13206
    }
13207
13208
    return 0;
13209
}
13210
13211
#define PHA_GET_SIZE  TLSX_PostHandAuth_GetSize
13212
#define PHA_WRITE     TLSX_PostHandAuth_Write
13213
#define PHA_PARSE     TLSX_PostHandAuth_Parse
13214
13215
#else
13216
13217
#define PHA_GET_SIZE(a, b)    0
13218
#define PHA_WRITE(a, b, c)    0
13219
#define PHA_PARSE(a, b, c, d) 0
13220
13221
#endif
13222
13223
/******************************************************************************/
13224
/* Early Data Indication                                                      */
13225
/******************************************************************************/
13226
13227
#ifdef WOLFSSL_EARLY_DATA
13228
/* Get the size of the encoded Early Data Indication extension.
13229
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
13230
 *
13231
 * msgType  The type of the message this extension is being written into.
13232
 * returns the number of bytes of the encoded Early Data Indication extension.
13233
 */
13234
static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
13235
{
13236
    int ret = 0;
13237
13238
    if (msgType == client_hello || msgType == encrypted_extensions)
13239
        *pSz += 0;
13240
    else if (msgType == session_ticket)
13241
        *pSz += OPAQUE32_LEN;
13242
    else {
13243
        ret = SANITY_MSG_E;
13244
        WOLFSSL_ERROR_VERBOSE(ret);
13245
    }
13246
13247
    return ret;
13248
}
13249
13250
/* Writes the Early Data Indicator extension into the output buffer.
13251
 * Assumes that the the output buffer is big enough to hold data.
13252
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
13253
 *
13254
 * maxSz    The maximum early data size.
13255
 * output   The buffer to write into.
13256
 * msgType  The type of the message this extension is being written into.
13257
 * returns the number of bytes written into the buffer.
13258
 */
13259
static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
13260
                                word16* pSz)
13261
{
13262
    if (msgType == client_hello || msgType == encrypted_extensions)
13263
        return 0;
13264
    else if (msgType == session_ticket) {
13265
        c32toa(maxSz, output);
13266
        *pSz += OPAQUE32_LEN;
13267
        return 0;
13268
    }
13269
13270
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13271
    return SANITY_MSG_E;
13272
}
13273
13274
/* Parse the Early Data Indicator extension.
13275
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
13276
 *
13277
 * ssl      The SSL/TLS object.
13278
 * input    The extension data.
13279
 * length   The length of the extension data.
13280
 * msgType  The type of the message this extension is being parsed from.
13281
 * returns 0 on success and other values indicate failure.
13282
 */
13283
static int TLSX_EarlyData_Parse(WOLFSSL* ssl, const byte* input, word16 length,
13284
                                 byte msgType)
13285
{
13286
    WOLFSSL_ENTER("TLSX_EarlyData_Parse");
13287
    if (msgType == client_hello) {
13288
        if (length != 0)
13289
            return BUFFER_E;
13290
13291
        if (ssl->earlyData == expecting_early_data) {
13292
13293
            if (ssl->options.maxEarlyDataSz != 0)
13294
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
13295
            else
13296
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
13297
13298
            return TLSX_EarlyData_Use(ssl, 0, 0);
13299
        }
13300
        ssl->earlyData = early_data_ext;
13301
13302
        return 0;
13303
    }
13304
    if (msgType == encrypted_extensions) {
13305
        if (length != 0)
13306
            return BUFFER_E;
13307
13308
        /* Ensure the index of PSK identity chosen by server is 0.
13309
         * Index is plus one to handle 'not set' value of 0.
13310
         */
13311
        if (ssl->options.pskIdIndex != 1) {
13312
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
13313
            return PSK_KEY_ERROR;
13314
        }
13315
13316
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
13317
            /* the extension from server comes in */
13318
            ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
13319
        }
13320
13321
        return TLSX_EarlyData_Use(ssl, 1, 1);
13322
    }
13323
    if (msgType == session_ticket) {
13324
        word32 maxSz;
13325
13326
        if (length != OPAQUE32_LEN)
13327
            return BUFFER_E;
13328
        ato32(input, &maxSz);
13329
13330
        ssl->session->maxEarlyDataSz = maxSz;
13331
        return 0;
13332
    }
13333
13334
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13335
    return SANITY_MSG_E;
13336
}
13337
13338
/* Use the data to create a new Early Data object in the extensions.
13339
 *
13340
 * ssl    The SSL/TLS object.
13341
 * maxSz  The maximum early data size.
13342
 * is_response   if this extension is part of a response
13343
 * returns 0 on success and other values indicate failure.
13344
 */
13345
int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz, int is_response)
13346
{
13347
    int   ret = 0;
13348
    TLSX* extension;
13349
13350
    /* Find the early data extension if it exists. */
13351
    extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
13352
    if (extension == NULL) {
13353
        /* Push new early data extension. */
13354
        ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
13355
        if (ret != 0)
13356
            return ret;
13357
13358
        extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
13359
        if (extension == NULL)
13360
            return MEMORY_E;
13361
    }
13362
13363
    extension->resp = is_response;
13364
    /* In QUIC, earlydata size is either 0 or 0xffffffff.
13365
     * Override any size between, possibly left from our initial value */
13366
    extension->val  = (WOLFSSL_IS_QUIC(ssl) && is_response && maxSz > 0) ?
13367
                       WOLFSSL_MAX_32BIT : maxSz;
13368
13369
    return 0;
13370
}
13371
13372
#define EDI_GET_SIZE  TLSX_EarlyData_GetSize
13373
#define EDI_WRITE     TLSX_EarlyData_Write
13374
#define EDI_PARSE     TLSX_EarlyData_Parse
13375
13376
#else
13377
13378
#define EDI_GET_SIZE(a, b)    0
13379
#define EDI_WRITE(a, b, c, d) 0
13380
#define EDI_PARSE(a, b, c, d) 0
13381
13382
#endif
13383
13384
/******************************************************************************/
13385
/* QUIC transport parameter extension                                         */
13386
/******************************************************************************/
13387
#ifdef WOLFSSL_QUIC
13388
13389
static word16 TLSX_QuicTP_GetSize(TLSX* extension)
13390
{
13391
    const QuicTransportParam *tp = (QuicTransportParam*)extension->data;
13392
13393
    return tp ? tp->len : 0;
13394
}
13395
13396
int TLSX_QuicTP_Use(WOLFSSL* ssl, TLSX_Type ext_type, int is_response)
13397
{
13398
    int ret = 0;
13399
    TLSX* extension;
13400
13401
    WOLFSSL_ENTER("TLSX_QuicTP_Use");
13402
    if (ssl->quic.transport_local == NULL) {
13403
        /* RFC9000, ch 7.3: "An endpoint MUST treat the absence of [...]
13404
         *     from either endpoint [...] as a connection error of type
13405
         *     TRANSPORT_PARAMETER_ERROR."
13406
         */
13407
        ret = QUIC_TP_MISSING_E;
13408
        goto cleanup;
13409
    }
13410
13411
    extension = TLSX_Find(ssl->extensions, ext_type);
13412
    if (extension == NULL) {
13413
        ret = TLSX_Push(&ssl->extensions, ext_type, NULL, ssl->heap);
13414
        if (ret != 0)
13415
            goto cleanup;
13416
13417
        extension = TLSX_Find(ssl->extensions, ext_type);
13418
        if (extension == NULL) {
13419
            ret = MEMORY_E;
13420
            goto cleanup;
13421
        }
13422
    }
13423
    if (extension->data) {
13424
        QuicTransportParam_free((QuicTransportParam*)extension->data, ssl->heap);
13425
        extension->data = NULL;
13426
    }
13427
    extension->resp = is_response;
13428
    extension->data = (void*)QuicTransportParam_dup(ssl->quic.transport_local, ssl->heap);
13429
    if (!extension->data) {
13430
        ret = MEMORY_E;
13431
        goto cleanup;
13432
    }
13433
13434
cleanup:
13435
    WOLFSSL_LEAVE("TLSX_QuicTP_Use", ret);
13436
    return ret;
13437
}
13438
13439
static word16 TLSX_QuicTP_Write(QuicTransportParam *tp, byte* output)
13440
{
13441
    word16 len = 0;
13442
13443
    WOLFSSL_ENTER("TLSX_QuicTP_Write");
13444
    if (tp && tp->len) {
13445
        XMEMCPY(output, tp->data, tp->len);
13446
        len = tp->len;
13447
    }
13448
    WOLFSSL_LEAVE("TLSX_QuicTP_Write", len);
13449
    return len;
13450
}
13451
13452
static int TLSX_QuicTP_Parse(WOLFSSL *ssl, const byte *input, size_t len, int ext_type, int msgType)
13453
{
13454
    const QuicTransportParam *tp, **ptp;
13455
13456
    (void)msgType;
13457
    tp = QuicTransportParam_new(input, len, ssl->heap);
13458
    if (!tp) {
13459
        return MEMORY_E;
13460
    }
13461
    ptp = (ext_type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT) ?
13462
        &ssl->quic.transport_peer_draft : &ssl->quic.transport_peer;
13463
    if (*ptp) {
13464
        QTP_FREE(*ptp, ssl->heap);
13465
    }
13466
    *ptp = tp;
13467
    return 0;
13468
}
13469
13470
#define QTP_GET_SIZE    TLSX_QuicTP_GetSize
13471
#define QTP_USE         TLSX_QuicTP_Use
13472
#define QTP_WRITE       TLSX_QuicTP_Write
13473
#define QTP_PARSE       TLSX_QuicTP_Parse
13474
13475
#endif /* WOLFSSL_QUIC */
13476
13477
#if defined(WOLFSSL_DTLS_CID)
13478
#define CID_GET_SIZE  TLSX_ConnectionID_GetSize
13479
#define CID_WRITE  TLSX_ConnectionID_Write
13480
#define CID_PARSE  TLSX_ConnectionID_Parse
13481
#define CID_FREE  TLSX_ConnectionID_Free
13482
#else
13483
#define CID_GET_SIZE(a) 0
13484
#define CID_WRITE(a, b) 0
13485
#define CID_PARSE(a, b, c, d) 0
13486
#define CID_FREE(a, b) 0
13487
#endif /* defined(WOLFSSL_DTLS_CID) */
13488
13489
#if defined(HAVE_RPK)
13490
/******************************************************************************/
13491
/* Client_Certificate_Type extension                                          */
13492
/******************************************************************************/
13493
/* return 1 if specified type is included in the given list, otherwise 0 */
13494
static int IsCertTypeListed(byte type, byte cnt, const byte* list)
13495
{
13496
    int ret = 0;
13497
    int i;
13498
13499
    if (cnt == 0 || list == NULL)
13500
        return ret;
13501
13502
    if (cnt > 0 && cnt <= MAX_CLIENT_CERT_TYPE_CNT) {
13503
        for (i = 0; i < cnt; i++) {
13504
            if (list[i] == type)
13505
                return 1;
13506
        }
13507
    }
13508
    return 0;
13509
}
13510
13511
/* Search both arrays from above to find a common value between the two given
13512
 * arrays(a and b). return 1 if it finds a common value, otherwise return 0.
13513
 */
13514
static int GetCommonItem(const byte* a, byte aLen, const byte* b, byte bLen,
13515
                                                                    byte* type)
13516
{
13517
    int i, j;
13518
13519
    if (a == NULL || b == NULL)
13520
        return 0;
13521
13522
    for (i = 0; i < aLen; i++) {
13523
        for (j = 0; j < bLen; j++) {
13524
            if (a[i] == b[j]) {
13525
                *type = a[i];
13526
                return 1;
13527
            }
13528
        }
13529
    }
13530
    return 0;
13531
}
13532
13533
/* Creates a "client certificate type" extension if necessary.
13534
 * Returns 0 if no error occurred, negative value otherwise.
13535
 * A return of 0, it does not indicae that the extension was created.
13536
 */
13537
static int TLSX_ClientCertificateType_Use(WOLFSSL* ssl, byte isServer)
13538
{
13539
    int ret = 0;
13540
13541
    if (ssl == NULL)
13542
        return BAD_FUNC_ARG;
13543
13544
    if (isServer) {
13545
        /* [in server side]
13546
         */
13547
13548
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13549
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13550
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
13551
13552
            WOLFSSL_MSG("Adding Client Certificate Type extension");
13553
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
13554
                                                                    ssl->heap);
13555
            if (ret == 0) {
13556
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
13557
            }
13558
        }
13559
    }
13560
    else {
13561
        /* [in client side]
13562
         * This extension MUST be omitted from the ClientHello unless the RPK
13563
         * certificate is preferred by the user and actually loaded.
13564
         */
13565
13566
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13567
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13568
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
13569
13570
            if (ssl->options.rpkState.isRPKLoaded) {
13571
13572
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
13573
                ssl->options.rpkState.sending_ClientCertTypes[0] =
13574
                                                        WOLFSSL_CERT_TYPE_RPK;
13575
13576
                /* Push new client_certificate_type extension. */
13577
                WOLFSSL_MSG("Adding Client Certificate Type extension");
13578
                ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE,
13579
                                                                ssl, ssl->heap);
13580
            }
13581
            else {
13582
                WOLFSSL_MSG("Willing to use RPK cert but not loaded it");
13583
            }
13584
        }
13585
        else {
13586
            WOLFSSL_MSG("No will to use RPK cert");
13587
        }
13588
    }
13589
    return ret;
13590
}
13591
13592
/* Parse a "client certificate type" extension received from peer.
13593
 * returns 0 on success and other values indicate failure.
13594
 */
13595
static int TLSX_ClientCertificateType_Parse(WOLFSSL* ssl, const byte* input,
13596
                                                word16 length, byte msgType)
13597
{
13598
    byte typeCnt;
13599
    int idx = 0;
13600
    int ret = 0;
13601
    int i;
13602
    int populate = 0;
13603
    byte  cmnType;
13604
13605
13606
    if (msgType == client_hello) {
13607
        /* [parse ClientHello in server end]
13608
         * case 1) if peer verify is disabled, this extension must be omitted
13609
         *         from ServerHello.
13610
         * case 2) if user have not set his preference, find X509 in parsed
13611
         *         result, then populate "Client Certificate Type" extension.
13612
         * case 3) if user have not set his preference and X509 isn't included
13613
         *         in parsed result, send "unsupported certificate" alert.
13614
         * case 4) if user have set his preference, find a common cert type
13615
         *         in users preference and received cert types.
13616
         * case 5) if user have set his preference, but no common cert type
13617
         *         found.
13618
         */
13619
13620
        /* case 1 */
13621
        if (ssl->options.verifyNone) {
13622
            return ret;
13623
        }
13624
13625
        /* parse extension */
13626
        if (length < OPAQUE8_LEN)
13627
            return BUFFER_E;
13628
13629
        typeCnt = input[idx];
13630
13631
        if (typeCnt > MAX_CLIENT_CERT_TYPE_CNT)
13632
            return BUFFER_E;
13633
13634
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
13635
            return BUFFER_E;
13636
        }
13637
13638
        ssl->options.rpkState.received_ClientCertTypeCnt = input[idx];
13639
        idx += OPAQUE8_LEN;
13640
13641
        for (i = 0; i < typeCnt; i++) {
13642
            ssl->options.rpkState.received_ClientCertTypes[i] = input[idx];
13643
            idx += OPAQUE8_LEN;
13644
        }
13645
13646
        if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt == 0) {
13647
            /* case 2 */
13648
            if (IsCertTypeListed(WOLFSSL_CERT_TYPE_X509,
13649
                            ssl->options.rpkState.received_ClientCertTypeCnt,
13650
                            ssl->options.rpkState.received_ClientCertTypes)) {
13651
13652
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
13653
                ssl->options.rpkState.sending_ClientCertTypes[0] =
13654
                                                        WOLFSSL_CERT_TYPE_X509;
13655
                populate = 1;
13656
            }
13657
            /* case 3 */
13658
            else {
13659
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
13660
                SendAlert(ssl, alert_fatal, unsupported_certificate);
13661
                return UNSUPPORTED_CERTIFICATE;
13662
            }
13663
        }
13664
        else if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt > 0) {
13665
            /* case 4 */
13666
            if (GetCommonItem(
13667
                            ssl->options.rpkConfig.preferred_ClientCertTypes,
13668
                            ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13669
                            ssl->options.rpkState.received_ClientCertTypes,
13670
                            ssl->options.rpkState.received_ClientCertTypeCnt,
13671
                            &cmnType)) {
13672
                ssl->options.rpkState.sending_ClientCertTypeCnt  = 1;
13673
                ssl->options.rpkState.sending_ClientCertTypes[0] = cmnType;
13674
                populate = 1;
13675
            }
13676
            /* case 5 */
13677
            else {
13678
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
13679
                SendAlert(ssl, alert_fatal, unsupported_certificate);
13680
                return UNSUPPORTED_CERTIFICATE;
13681
            }
13682
        }
13683
13684
        /* populate client_certificate_type extension */
13685
        if (populate) {
13686
            WOLFSSL_MSG("Adding Client Certificate Type extension");
13687
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
13688
                                                                    ssl->heap);
13689
            if (ret == 0) {
13690
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
13691
            }
13692
        }
13693
    }
13694
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13695
        /* parse it in client side */
13696
        if (length == 1) {
13697
            /* Same offered-vs-received binding as server_cert_type: an
13698
             * unsolicited value lets the peer pick the form this client
13699
             * presents its own credential in. */
13700
            if (ssl->options.rpkState.sending_ClientCertTypeCnt == 0) {
13701
                WOLFSSL_MSG("client_cert_type received but never offered");
13702
                SendAlert(ssl, alert_fatal, unsupported_extension);
13703
                WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
13704
                return UNSUPPORTED_EXTENSION;
13705
            }
13706
            if (!IsCertTypeListed(*input,
13707
                    ssl->options.rpkState.sending_ClientCertTypeCnt,
13708
                    ssl->options.rpkState.sending_ClientCertTypes)) {
13709
                WOLFSSL_MSG("client_cert_type value was not offered");
13710
                SendAlert(ssl, alert_fatal, unsupported_extension);
13711
                WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
13712
                return UNSUPPORTED_EXTENSION;
13713
            }
13714
13715
            ssl->options.rpkState.received_ClientCertTypeCnt  = 1;
13716
            ssl->options.rpkState.received_ClientCertTypes[0] = *input;
13717
        }
13718
        else {
13719
            return BUFFER_E;
13720
        }
13721
    }
13722
13723
    return ret;
13724
}
13725
13726
/* Write out the "client certificate type" extension data into the given buffer.
13727
 * return the size wrote in the buffer on success, negative value on error.
13728
 */
13729
static word16 TLSX_ClientCertificateType_Write(void* data, byte* output,
13730
                                              byte msgType)
13731
{
13732
    WOLFSSL* ssl = (WOLFSSL*)data;
13733
    word16 idx = 0;
13734
    byte cnt = 0;
13735
    int i;
13736
13737
    /* skip to write extension if count is zero */
13738
    cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
13739
13740
    if (cnt == 0)
13741
        return 0;
13742
13743
    if (msgType == client_hello) {
13744
        /* client side */
13745
13746
        *(output + idx) = cnt;
13747
        idx += OPAQUE8_LEN;
13748
13749
        for (i = 0; i < cnt; i++) {
13750
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[i];
13751
            idx += OPAQUE8_LEN;
13752
        }
13753
        return idx;
13754
    }
13755
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13756
        /* sever side */
13757
        if (cnt == 1) {
13758
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[0];
13759
            idx += OPAQUE8_LEN;
13760
        }
13761
    }
13762
    return idx;
13763
}
13764
13765
/* Calculate then return the size of the "client certificate type" extension
13766
 * data.
13767
 * return the extension data size on success, negative value on error.
13768
*/
13769
static int TLSX_ClientCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
13770
{
13771
    int ret = 0;
13772
    byte cnt;
13773
13774
    if (ssl == NULL)
13775
        return BAD_FUNC_ARG;
13776
13777
    if (msgType == client_hello) {
13778
        /* client side */
13779
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
13780
        ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
13781
    }
13782
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13783
        /* server side */
13784
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;/* must be one */
13785
        if (cnt != 1)
13786
            return SANITY_MSG_E;
13787
        ret = OPAQUE8_LEN;
13788
    }
13789
    else {
13790
        return SANITY_MSG_E;
13791
    }
13792
    return ret;
13793
}
13794
13795
    #define CCT_GET_SIZE  TLSX_ClientCertificateType_GetSize
13796
    #define CCT_WRITE     TLSX_ClientCertificateType_Write
13797
    #define CCT_PARSE     TLSX_ClientCertificateType_Parse
13798
#else
13799
    #define CCT_GET_SIZE(a)  0
13800
    #define CCT_WRITE(a, b)  0
13801
    #define CCT_PARSE(a, b, c, d) 0
13802
#endif /* HAVE_RPK */
13803
13804
#if defined(HAVE_RPK)
13805
/******************************************************************************/
13806
/* Server_Certificate_Type extension                                          */
13807
/******************************************************************************/
13808
/* Creates a "server certificate type" extension if necessary.
13809
 * Returns 0 if no error occurred, negative value otherwise.
13810
 * A return of 0, it does not indicae that the extension was created.
13811
 */
13812
static int TLSX_ServerCertificateType_Use(WOLFSSL* ssl, byte isServer)
13813
{
13814
    int ret = 0;
13815
    byte ctype;
13816
13817
    if (ssl == NULL)
13818
        return BAD_FUNC_ARG;
13819
13820
    if (isServer) {
13821
        /* [in server side] */
13822
        /* find common cert type to both end */
13823
        if (GetCommonItem(
13824
                ssl->options.rpkConfig.preferred_ServerCertTypes,
13825
                ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
13826
                ssl->options.rpkState.received_ServerCertTypes,
13827
                ssl->options.rpkState.received_ServerCertTypeCnt,
13828
                &ctype)) {
13829
            ssl->options.rpkState.sending_ServerCertTypeCnt = 1;
13830
            ssl->options.rpkState.sending_ServerCertTypes[0] = ctype;
13831
13832
            /* Push new server_certificate_type extension. */
13833
            WOLFSSL_MSG("Adding Server Certificate Type extension");
13834
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
13835
                                                                    ssl->heap);
13836
            if (ret == 0) {
13837
                TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
13838
            }
13839
        }
13840
        else {
13841
            /* no common cert type found */
13842
            WOLFSSL_MSG("No common cert type found in server_certificate_type ext");
13843
            SendAlert(ssl, alert_fatal, unsupported_certificate);
13844
            ret = UNSUPPORTED_CERTIFICATE;
13845
        }
13846
    }
13847
    else {
13848
        /* [in client side] */
13849
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13850
                            ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
13851
                            ssl->options.rpkConfig.preferred_ServerCertTypes)) {
13852
13853
            ssl->options.rpkState.sending_ServerCertTypeCnt =
13854
                        ssl->options.rpkConfig.preferred_ServerCertTypeCnt;
13855
            XMEMCPY(ssl->options.rpkState.sending_ServerCertTypes,
13856
                    ssl->options.rpkConfig.preferred_ServerCertTypes,
13857
                    ssl->options.rpkConfig.preferred_ServerCertTypeCnt);
13858
13859
            /* Push new server_certificate_type extension. */
13860
            WOLFSSL_MSG("Adding Server Certificate Type extension");
13861
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
13862
                                                                    ssl->heap);
13863
        }
13864
        else {
13865
            WOLFSSL_MSG("No will to accept RPK cert");
13866
        }
13867
    }
13868
13869
    return ret;
13870
}
13871
13872
/* Parse a "server certificate type" extension received from peer.
13873
 * returns 0 on success and other values indicate failure.
13874
 */
13875
static int TLSX_ServerCertificateType_Parse(WOLFSSL* ssl, const byte* input,
13876
                                                word16 length, byte msgType)
13877
{
13878
    byte typeCnt;
13879
    int idx = 0;
13880
    int ret = 0;
13881
    int i;
13882
13883
    if (msgType == client_hello) {
13884
        /* in server side */
13885
13886
        if (length < OPAQUE8_LEN)
13887
            return BUFFER_E;
13888
13889
        typeCnt = input[idx];
13890
13891
        if (typeCnt > MAX_SERVER_CERT_TYPE_CNT)
13892
            return BUFFER_E;
13893
13894
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
13895
            return BUFFER_E;
13896
        }
13897
        ssl->options.rpkState.received_ServerCertTypeCnt = input[idx];
13898
        idx += OPAQUE8_LEN;
13899
13900
        for (i = 0; i < typeCnt; i++) {
13901
            ssl->options.rpkState.received_ServerCertTypes[i] = input[idx];
13902
            idx += OPAQUE8_LEN;
13903
        }
13904
13905
        ret = TLSX_ServerCertificateType_Use(ssl, 1);
13906
        if (ret == 0) {
13907
            TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
13908
        }
13909
    }
13910
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13911
        /* in client side */
13912
        if (length != 1)                     /* length slould be 1 */
13913
            return BUFFER_E;
13914
13915
        /* RFC 7250 4.1, RFC 8446 4.2: the server may only answer with a type
13916
         * the client offered. ProcessPeerCertParse() treats the stored value as
13917
         * negotiated, so an unsolicited one lets the peer select RawPublicKey
13918
         * and skip chain verification. */
13919
        if (ssl->options.rpkState.sending_ServerCertTypeCnt == 0) {
13920
            WOLFSSL_MSG("server_cert_type received but never offered");
13921
            SendAlert(ssl, alert_fatal, unsupported_extension);
13922
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
13923
            return UNSUPPORTED_EXTENSION;
13924
        }
13925
        if (!IsCertTypeListed(*input,
13926
                ssl->options.rpkState.sending_ServerCertTypeCnt,
13927
                ssl->options.rpkState.sending_ServerCertTypes)) {
13928
            WOLFSSL_MSG("server_cert_type value was not offered");
13929
            SendAlert(ssl, alert_fatal, unsupported_extension);
13930
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
13931
            return UNSUPPORTED_EXTENSION;
13932
        }
13933
13934
        ssl->options.rpkState.received_ServerCertTypeCnt  = 1;
13935
        ssl->options.rpkState.received_ServerCertTypes[0] = *input;
13936
    }
13937
13938
    return 0;
13939
}
13940
13941
/* Write out the "server certificate type" extension data into the given buffer.
13942
 * return the size wrote in the buffer on success, negative value on error.
13943
 */
13944
static word16 TLSX_ServerCertificateType_Write(void* data, byte* output,
13945
                                                                byte msgType)
13946
{
13947
    WOLFSSL* ssl = (WOLFSSL*)data;
13948
    word16 idx = 0;
13949
    int cnt = 0;
13950
    int i;
13951
13952
    /* skip to write extension if count is zero */
13953
    cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
13954
13955
    if (cnt == 0)
13956
        return 0;
13957
13958
    if (msgType == client_hello) {
13959
        /* in client side */
13960
13961
        *(output + idx) = cnt;
13962
        idx += OPAQUE8_LEN;
13963
13964
        for (i = 0; i < cnt; i++) {
13965
            *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[i];
13966
            idx += OPAQUE8_LEN;
13967
        }
13968
    }
13969
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13970
        /* in server side */
13971
        /* ensure cnt is one */
13972
        if (cnt != 1)
13973
            return 0;
13974
13975
        *(output + idx) =  ssl->options.rpkState.sending_ServerCertTypes[0];
13976
        idx += OPAQUE8_LEN;
13977
    }
13978
    return idx;
13979
}
13980
13981
/* Calculate then return the size of the "server certificate type" extension
13982
 * data.
13983
 * return the extension data size on success, negative value on error.
13984
*/
13985
static int TLSX_ServerCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
13986
{
13987
    int ret = 0;
13988
    int cnt;
13989
13990
    if (ssl == NULL)
13991
        return BAD_FUNC_ARG;
13992
13993
    if (msgType == client_hello) {
13994
        /* in clent side */
13995
        cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
13996
        if (cnt > 0) {
13997
            ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
13998
        }
13999
    }
14000
    else if (msgType == server_hello || msgType == encrypted_extensions) {
14001
        /* in server side */
14002
        ret = (int)OPAQUE8_LEN;
14003
    }
14004
    else {
14005
        return SANITY_MSG_E;
14006
    }
14007
    return ret;
14008
}
14009
14010
    #define SCT_GET_SIZE  TLSX_ServerCertificateType_GetSize
14011
    #define SCT_WRITE     TLSX_ServerCertificateType_Write
14012
    #define SCT_PARSE     TLSX_ServerCertificateType_Parse
14013
#else
14014
    #define SCT_GET_SIZE(a)  0
14015
    #define SCT_WRITE(a, b)  0
14016
    #define SCT_PARSE(a, b, c, d) 0
14017
#endif /* HAVE_RPK */
14018
14019
/******************************************************************************/
14020
/* TLS Extensions Framework                                                   */
14021
/******************************************************************************/
14022
14023
/** Finds an extension in the provided list. */
14024
TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
14025
560k
{
14026
560k
    TLSX* extension = list;
14027
14028
1.07M
    while (extension && extension->type != type)
14029
513k
        extension = extension->next;
14030
14031
560k
    return extension;
14032
560k
}
14033
14034
/** Remove an extension. */
14035
void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
14036
9.51k
{
14037
9.51k
    TLSX* extension;
14038
9.51k
    TLSX** next;
14039
14040
9.51k
    if (list == NULL)
14041
0
        return;
14042
14043
9.51k
    extension = *list;
14044
9.51k
    next = list;
14045
14046
80.0k
    while (extension && extension->type != type) {
14047
70.5k
        next = &extension->next;
14048
70.5k
        extension = extension->next;
14049
70.5k
    }
14050
14051
9.51k
    if (extension) {
14052
175
        *next = extension->next;
14053
175
        extension->next = NULL;
14054
175
        TLSX_FreeAll(extension, heap);
14055
175
    }
14056
9.51k
}
14057
14058
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
14059
#define GREASE_ECH_SIZE 160
14060
#define TLS_INFO_CONST_STRING "tls ech"
14061
#define TLS_INFO_CONST_STRING_SZ 7
14062
14063
/* return status after setting up ech to write a grease ech */
14064
static int TLSX_GreaseECH_Use(TLSX** extensions, void* heap, WC_RNG* rng)
14065
{
14066
    int ret = 0;
14067
    TLSX* echX;
14068
    WOLFSSL_ECH* ech;
14069
14070
    if (extensions == NULL)
14071
        return BAD_FUNC_ARG;
14072
    /* skip if we already have an ech extension, we will for hrr */
14073
    echX = TLSX_Find(*extensions, TLSX_ECH);
14074
    if (echX != NULL)
14075
        return 0;
14076
14077
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
14078
        DYNAMIC_TYPE_TMP_BUFFER);
14079
    if (ech == NULL)
14080
        return MEMORY_E;
14081
    XMEMSET(ech, 0, sizeof(WOLFSSL_ECH));
14082
14083
    ech->state = ECH_WRITE_GREASE;
14084
14085
    /* 0 for outer */
14086
    ech->type = ECH_TYPE_OUTER;
14087
    /* kemId */
14088
    ech->kemId = DHKEM_X25519_HKDF_SHA256;
14089
    /* cipherSuite kdf */
14090
    ech->cipherSuite.kdfId = HKDF_SHA256;
14091
    /* cipherSuite aead */
14092
    ech->cipherSuite.aeadId = HPKE_AES_128_GCM;
14093
14094
    /* random configId */
14095
    ret = wc_RNG_GenerateByte(rng, &(ech->configId));
14096
14097
    /* curve25519 encLen */
14098
    ech->encLen = DHKEM_X25519_ENC_LEN;
14099
14100
    if (ret == 0)
14101
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
14102
14103
    if (ret != 0) {
14104
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14105
    }
14106
14107
    return ret;
14108
}
14109
14110
/* return status after setting up ech to write real ech */
14111
static int TLSX_ECH_Use(WOLFSSL_EchConfig* echConfig, TLSX** extensions,
14112
    void* heap, WC_RNG* rng)
14113
{
14114
    int ret = 0;
14115
    int suiteIndex;
14116
    TLSX* echX;
14117
    WOLFSSL_ECH* ech;
14118
    if (extensions == NULL)
14119
        return BAD_FUNC_ARG;
14120
    /* skip if we already have an ech extension, we will for hrr */
14121
    echX = TLSX_Find(*extensions, TLSX_ECH);
14122
    if (echX != NULL)
14123
        return 0;
14124
    /* find a supported cipher suite */
14125
    suiteIndex = EchConfigGetSupportedCipherSuite(echConfig);
14126
    if (suiteIndex < 0)
14127
        return suiteIndex;
14128
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
14129
        DYNAMIC_TYPE_TMP_BUFFER);
14130
    if (ech == NULL)
14131
        return MEMORY_E;
14132
    XMEMSET(ech, 0, sizeof(WOLFSSL_ECH));
14133
    ech->state = ECH_WRITE_REAL;
14134
    ech->echConfig = echConfig;
14135
    /* 0 for outer */
14136
    ech->type = ECH_TYPE_OUTER;
14137
    /* kemId */
14138
    ech->kemId = echConfig->kemId;
14139
    /* cipherSuite kdf */
14140
    ech->cipherSuite.kdfId = echConfig->cipherSuites[suiteIndex].kdfId;
14141
    /* cipherSuite aead */
14142
    ech->cipherSuite.aeadId = echConfig->cipherSuites[suiteIndex].aeadId;
14143
    /* configId */
14144
    ech->configId = echConfig->configId;
14145
    /* encLen */
14146
    ech->encLen = wc_HpkeKemGetEncLen(echConfig->kemId);
14147
    if (ech->encLen == 0) {
14148
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14149
        return BAD_FUNC_ARG;
14150
    }
14151
    /* setup hpke */
14152
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
14153
    if (ech->hpke == NULL) {
14154
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14155
        return MEMORY_E;
14156
    }
14157
    ret = wc_HpkeInit(ech->hpke, ech->kemId, ech->cipherSuite.kdfId,
14158
        ech->cipherSuite.aeadId, heap);
14159
    /* setup the ephemeralKey */
14160
    if (ret == 0)
14161
        ret = wc_HpkeGenerateKeyPair(ech->hpke, &ech->ephemeralKey, rng);
14162
    if (ret == 0) {
14163
        /* use the chosen config's public name for the outer SNI */
14164
        ret = TLSX_UseSNI(&ech->extensions, WOLFSSL_SNI_HOST_NAME,
14165
            echConfig->publicName, (word16)XSTRLEN(echConfig->publicName),
14166
            heap);
14167
        if (ret != WOLFSSL_SUCCESS ||
14168
                (ret = TLSX_Push(extensions, TLSX_ECH, ech, heap)) != 0) {
14169
            TLSX_FreeAll(ech->extensions, heap);
14170
            wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
14171
                ech->hpke->heap);
14172
        }
14173
    }
14174
    if (ret != 0) {
14175
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
14176
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14177
    }
14178
    return ret;
14179
}
14180
14181
/* return status after setting up ech to read and decrypt */
14182
WOLFSSL_TEST_VIS int TLSX_ServerECH_Use(TLSX** extensions, void* heap,
14183
    WOLFSSL_EchConfig* configs)
14184
{
14185
    int ret;
14186
    WOLFSSL_ECH* ech;
14187
    TLSX* echX;
14188
    if (extensions == NULL)
14189
        return BAD_FUNC_ARG;
14190
    /* if we already have ech don't override it */
14191
    echX = TLSX_Find(*extensions, TLSX_ECH);
14192
    if (echX != NULL)
14193
        return 0;
14194
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
14195
        DYNAMIC_TYPE_TMP_BUFFER);
14196
    if (ech == NULL)
14197
        return MEMORY_E;
14198
    XMEMSET(ech, 0, sizeof(WOLFSSL_ECH));
14199
    ech->state = ECH_WRITE_NONE;
14200
    /* 0 for outer */
14201
    ech->type = ECH_TYPE_OUTER;
14202
    ech->echConfig = configs;
14203
    /* setup the rest of the settings when we receive ech from the client */
14204
    ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
14205
    if (ret != 0)
14206
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14207
    return ret;
14208
}
14209
14210
/* return status after writing the ech and updating offset */
14211
static int TLSX_ECH_Write(WOLFSSL_ECH* ech, byte msgType, byte* writeBuf,
14212
    word16* offset)
14213
{
14214
    int ret = 0;
14215
    int rngRet = -1;
14216
    word32 configsLen = 0;
14217
    void* ephemeralKey = NULL;
14218
    byte* writeBuf_p = writeBuf;
14219
    WC_DECLARE_VAR(hpke, Hpke, 1, DYNAMIC_TYPE_TMP_BUFFER);
14220
    WC_DECLARE_VAR(rng, WC_RNG, 1, DYNAMIC_TYPE_RNG);
14221
14222
    WOLFSSL_MSG("TLSX_ECH_Write");
14223
    if (msgType == hello_retry_request) {
14224
        WC_ALLOC_VAR_EX(rng, WC_RNG, 1, NULL, DYNAMIC_TYPE_RNG, ret = MEMORY_E);
14225
        if (ret == 0) {
14226
            ret = wc_InitRng(rng);
14227
        }
14228
        if (ret == 0) {
14229
            /* randomize confirmation in case ech is rejected */
14230
            ret = wc_RNG_GenerateBlock(rng, writeBuf,
14231
                    ECH_ACCEPT_CONFIRMATION_SZ);
14232
            wc_FreeRng(rng);
14233
        }
14234
        if (ret == 0) {
14235
            *offset += ECH_ACCEPT_CONFIRMATION_SZ;
14236
            ech->confBuf = writeBuf;
14237
        }
14238
14239
        WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
14240
        return ret;
14241
    }
14242
    if (ech->state == ECH_WRITE_NONE || ech->state == ECH_PARSED_INTERNAL)
14243
        return 0;
14244
    if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
14245
        /* get size then write */
14246
        ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen);
14247
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
14248
            return ret;
14249
        ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen);
14250
        if (ret != WOLFSSL_SUCCESS)
14251
            return ret;
14252
        *offset += configsLen;
14253
        return 0;
14254
    }
14255
    /* type */
14256
    *writeBuf_p = ech->type;
14257
    writeBuf_p += sizeof(ech->type);
14258
    /* outer has body, inner does not */
14259
    if (ech->type == ECH_TYPE_OUTER) {
14260
        /* kdfId */
14261
        c16toa(ech->cipherSuite.kdfId, writeBuf_p);
14262
        writeBuf_p += sizeof(ech->cipherSuite.kdfId);
14263
        /* aeadId */
14264
        c16toa(ech->cipherSuite.aeadId, writeBuf_p);
14265
        writeBuf_p += sizeof(ech->cipherSuite.aeadId);
14266
        /* configId */
14267
        *writeBuf_p = ech->configId;
14268
        writeBuf_p += sizeof(ech->configId);
14269
        /* encLen */
14270
        if (ech->innerCount == 0) {
14271
            c16toa(ech->encLen, writeBuf_p);
14272
        }
14273
        else {
14274
            /* set to 0 if this is clientInner 2 */
14275
            c16toa(0, writeBuf_p);
14276
        }
14277
        writeBuf_p += 2;
14278
        if (ech->state == ECH_WRITE_GREASE) {
14279
            word32 size;
14280
            WC_ALLOC_VAR_EX(rng, WC_RNG, 1, NULL, DYNAMIC_TYPE_RNG,
14281
                ret = MEMORY_E);
14282
14283
            if (ret == 0)
14284
                rngRet = ret = wc_InitRng(rng);
14285
            if (ret == 0 && ech->innerCount == 0) {
14286
                WC_ALLOC_VAR_EX(hpke, Hpke, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
14287
                    ret = MEMORY_E);
14288
14289
                /* hpke init */
14290
                if (ret == 0)
14291
                    ret = wc_HpkeInit(hpke, ech->kemId, ech->cipherSuite.kdfId,
14292
                        ech->cipherSuite.aeadId, NULL);
14293
                /* create the ephemeralKey */
14294
                if (ret == 0)
14295
                    ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng);
14296
                /* enc */
14297
                if (ret == 0) {
14298
                    ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey,
14299
                        writeBuf_p, &ech->encLen);
14300
                    writeBuf_p += ech->encLen;
14301
                }
14302
14303
                if (ephemeralKey != NULL)
14304
                    wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap);
14305
                WC_FREE_VAR_EX(hpke, NULL, DYNAMIC_TYPE_TMP_BUFFER);
14306
            }
14307
14308
            if (ret == 0) {
14309
                size = GREASE_ECH_SIZE + (ech->configId / 4);
14310
                size += ECH_PADDING_TO_32(size) + WC_AES_BLOCK_SIZE;
14311
14312
                /* innerClientHelloLen */
14313
                c16toa((word16)size, writeBuf_p);
14314
                writeBuf_p += 2;
14315
                /* innerClientHello */
14316
                ret = wc_RNG_GenerateBlock(rng, writeBuf_p, size);
14317
                writeBuf_p += size;
14318
            }
14319
14320
            if (rngRet == 0)
14321
                wc_FreeRng(rng);
14322
            WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
14323
        }
14324
        else {
14325
            if (ech->innerCount == 0) {
14326
                /* write enc to writeBuf_p */
14327
                ret = wc_HpkeSerializePublicKey(ech->hpke, ech->ephemeralKey,
14328
                    writeBuf_p, &ech->encLen);
14329
                writeBuf_p += ech->encLen;
14330
            }
14331
14332
            /* innerClientHelloLen */
14333
            c16toa((word16)ech->innerClientHelloLen, writeBuf_p);
14334
            writeBuf_p += 2;
14335
            /* set payload offset for when we finalize */
14336
            ech->outerClientPayload = writeBuf_p;
14337
            /* write zeros for payload */
14338
            XMEMSET(writeBuf_p, 0, ech->innerClientHelloLen);
14339
            writeBuf_p += ech->innerClientHelloLen;
14340
        }
14341
    }
14342
    if (ret == 0)
14343
        *offset += (writeBuf_p - writeBuf);
14344
    return ret;
14345
}
14346
14347
/* return the size needed for the ech extension */
14348
static int TLSX_ECH_GetSize(WOLFSSL_ECH* ech, byte msgType)
14349
{
14350
    int ret;
14351
    word32 size = 0;
14352
14353
    if (ech->state == ECH_WRITE_GREASE) {
14354
        word32 payload;
14355
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
14356
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16);
14357
        /* enc only printed on CH1 */
14358
        if (ech->innerCount == 0)
14359
            size += ech->encLen;
14360
        /* GREASE payload mimics the regular sealed inner:
14361
         *   plaintext length divisible by 32 and the AEAD tag
14362
         *   configId is used to randomize the GREASE length
14363
         *     (divide by 4 to save space) */
14364
        payload = GREASE_ECH_SIZE + (ech->configId / 4);
14365
        payload += ECH_PADDING_TO_32(payload) + WC_AES_BLOCK_SIZE;
14366
        size += payload;
14367
    }
14368
    else if (msgType == hello_retry_request) {
14369
        size = ECH_ACCEPT_CONFIRMATION_SZ;
14370
    }
14371
    else if (ech->state == ECH_WRITE_NONE ||
14372
        ech->state == ECH_PARSED_INTERNAL) {
14373
        size = 0;
14374
    }
14375
    else if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
14376
        /* get the size of the raw configs */
14377
        ret = GetEchConfigsEx(ech->echConfig, NULL, &size);
14378
14379
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
14380
            return ret;
14381
    }
14382
    else if (ech->type == ECH_TYPE_INNER)
14383
    {
14384
        size = sizeof(ech->type);
14385
    }
14386
    else
14387
    {
14388
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
14389
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16) +
14390
            ech->innerClientHelloLen;
14391
        /* enc only printed on CH1 */
14392
        if (ech->innerCount == 0)
14393
            size += ech->encLen;
14394
    }
14395
14396
    return (int)size;
14397
}
14398
14399
#ifdef HAVE_SECRET_CALLBACK
14400
/* log ECH_SECRET and ECH_CONFIG
14401
 * returns 0 on success, TLS13_SECRET_CB_E otherwise */
14402
static int EchWriteKeyLog(WOLFSSL* ssl, const byte* secret, word32 secretSz,
14403
    const byte* config, word32 configSz)
14404
{
14405
    int ret = 0;
14406
    if (ssl->tls13SecretCb != NULL) {
14407
        ret = ssl->tls13SecretCb(ssl, ECH_SECRET, secret, (int)secretSz,
14408
                ssl->tls13SecretCtx);
14409
        if (ret == 0) {
14410
            ret = ssl->tls13SecretCb(ssl, ECH_CONFIG, config, (int)configSz,
14411
                    ssl->tls13SecretCtx);
14412
        }
14413
        if (ret != 0) {
14414
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
14415
            ret = TLS13_SECRET_CB_E;
14416
        }
14417
    }
14418
#ifdef OPENSSL_EXTRA
14419
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
14420
        ret = ssl->tls13KeyLogCb(ssl, ECH_SECRET, secret, (int)secretSz, NULL);
14421
        if (ret == 0) {
14422
            ret = ssl->tls13KeyLogCb(ssl, ECH_CONFIG, config, (int)configSz,
14423
                    NULL);
14424
        }
14425
        if (ret != 0) {
14426
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
14427
            ret = TLS13_SECRET_CB_E;
14428
        }
14429
    }
14430
#endif /* OPENSSL_EXTRA */
14431
    return ret;
14432
}
14433
#endif /* HAVE_SECRET_CALLBACK */
14434
14435
/* rough check that inner hello fields do not exceed length of decrypted
14436
 * information. Additionally, this function will check that all padding bytes
14437
 * are zero and decrease the innerHelloLen accordingly if so.
14438
 * returns 0 on success and otherwise failure */
14439
static int TLSX_ECH_CheckInnerPadding(WOLFSSL* ssl, WOLFSSL_ECH* ech)
14440
{
14441
    int headerSz;
14442
    const byte* innerCh;
14443
    word32 innerChLen;
14444
    word32 idx;
14445
    byte sessionIdLen;
14446
    word16 cipherSuitesLen;
14447
    byte compressionLen;
14448
    word16 extLen;
14449
    byte acc = 0;
14450
    word32 i;
14451
14452
#ifdef WOLFSSL_DTLS13
14453
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
14454
                                   HANDSHAKE_HEADER_SZ;
14455
#else
14456
    (void)ssl;
14457
14458
    headerSz = HANDSHAKE_HEADER_SZ;
14459
#endif
14460
14461
    innerCh = ech->innerClientHello + headerSz;
14462
    innerChLen = ech->innerClientHelloLen;
14463
14464
    idx = OPAQUE16_LEN + RAN_LEN;
14465
    if (idx >= innerChLen)
14466
        return BUFFER_ERROR;
14467
14468
    sessionIdLen = innerCh[idx++];
14469
    /* innerHello sessionID must initially be empty */
14470
    if (sessionIdLen != 0)
14471
        return INVALID_PARAMETER;
14472
    idx += sessionIdLen;
14473
    if (idx + OPAQUE16_LEN > innerChLen)
14474
        return BUFFER_ERROR;
14475
14476
    ato16(innerCh + idx, &cipherSuitesLen);
14477
    idx += OPAQUE16_LEN + cipherSuitesLen;
14478
    if (idx >= innerChLen)
14479
        return BUFFER_ERROR;
14480
14481
    compressionLen = innerCh[idx++];
14482
    idx += compressionLen;
14483
    if (idx + OPAQUE16_LEN > innerChLen)
14484
        return BUFFER_ERROR;
14485
14486
    ato16(innerCh + idx, &extLen);
14487
    idx += OPAQUE16_LEN + extLen;
14488
    if (idx > innerChLen)
14489
        return BUFFER_ERROR;
14490
14491
    /* should now be at the end of the innerHello
14492
     * Per ECH spec all padding bytes MUST be 0 */
14493
    for (i = idx; i < innerChLen; i++) {
14494
        acc |= innerCh[i];
14495
    }
14496
    if (acc != 0) {
14497
        return INVALID_PARAMETER;
14498
    }
14499
14500
    ech->innerClientHelloLen -= i - idx;
14501
    return 0;
14502
}
14503
14504
/* Locate the given extension type, use the extOffset to start off after where a
14505
 * previous call to this function ended
14506
 *
14507
 * outerCh          The outer ClientHello buffer.
14508
 * chLen            Outer ClientHello length.
14509
 * extType          Extension type to look for.
14510
 * extLen           Out parameter, length of found extension.
14511
 * extOffset        Offset into outer ClientHello to look for extension from.
14512
 * extensionsStart  Start of outer ClientHello extensions.
14513
 * extensionsLen    Length of outer ClientHello extensions.
14514
 * returns 0 on success and otherwise failure.
14515
 */
14516
static const byte* TLSX_ECH_FindOuterExtension(const byte* outerCh,
14517
    word32 chLen, word16 extType, word32* extLen, word32* extOffset,
14518
    word16* extensionsStart, word16* extensionsLen)
14519
{
14520
    word32 idx = *extOffset;
14521
    byte sessionIdLen;
14522
    word16 cipherSuitesLen;
14523
    byte compressionLen;
14524
    word16 type;
14525
    word16 len;
14526
14527
    if (idx == 0) {
14528
        idx = OPAQUE16_LEN + RAN_LEN;
14529
        if (idx >= chLen)
14530
            return NULL;
14531
14532
        sessionIdLen = outerCh[idx++];
14533
        idx += sessionIdLen;
14534
        if (idx + OPAQUE16_LEN > chLen)
14535
            return NULL;
14536
14537
        ato16(outerCh + idx, &cipherSuitesLen);
14538
        idx += OPAQUE16_LEN + cipherSuitesLen;
14539
        if (idx >= chLen)
14540
            return NULL;
14541
14542
        compressionLen = outerCh[idx++];
14543
        idx += compressionLen;
14544
        if (idx + OPAQUE16_LEN > chLen)
14545
            return NULL;
14546
14547
        ato16(outerCh + idx, extensionsLen);
14548
        idx += OPAQUE16_LEN;
14549
        *extensionsStart = (word16)idx;
14550
14551
        if (idx + *extensionsLen > chLen)
14552
            return NULL;
14553
    }
14554
14555
    while (idx - *extensionsStart < *extensionsLen) {
14556
        if (idx + OPAQUE16_LEN + OPAQUE16_LEN > chLen)
14557
            return NULL;
14558
14559
        ato16(outerCh + idx, &type);
14560
        idx += OPAQUE16_LEN;
14561
        ato16(outerCh + idx, &len);
14562
        idx += OPAQUE16_LEN;
14563
14564
        if (idx + len - *extensionsStart > *extensionsLen)
14565
            return NULL;
14566
14567
        if (type == extType) {
14568
            *extLen = len + OPAQUE16_LEN + OPAQUE16_LEN;
14569
            *extOffset = idx + len;
14570
            return outerCh + idx - OPAQUE16_LEN - OPAQUE16_LEN;
14571
        }
14572
14573
        idx += len;
14574
    }
14575
14576
    return NULL;
14577
}
14578
14579
/* If newinnerCh is NULL, validate ordering and existence of references
14580
 *   - updates newInnerChLen with total length of selected extensions
14581
 * If newinnerCh is not NULL, copy extensions into newInnerCh
14582
 *
14583
 * outerCh          The outer ClientHello buffer.
14584
 * outerChLen       Outer ClientHello length.
14585
 * newInnerCh       The inner ClientHello buffer.
14586
 * newInnerChLen    Inner ClientHello length.
14587
 * numOuterRefs     Number of references described by OuterExtensions extension.
14588
 * OuterRefTypes    References described by OuterExtensions extension.
14589
 * returns 0 on success and otherwise failure.
14590
 */
14591
static int TLSX_ECH_CopyOuterExtensions(const byte* outerCh, word32 outerChLen,
14592
    byte** newInnerCh, word32* newInnerChLen,
14593
    word16 numOuterRefs, const byte* outerRefTypes)
14594
{
14595
    int ret = 0;
14596
    word16 refType;
14597
    word32 outerExtLen;
14598
    word32 outerExtOffset = 0;
14599
    word16 extsStart = 0;
14600
    word16 extsLen = 0;
14601
    const byte* outerExtData;
14602
14603
    if (newInnerCh == NULL) {
14604
        *newInnerChLen = 0;
14605
    }
14606
14607
    while (numOuterRefs-- > 0) {
14608
        ato16(outerRefTypes, &refType);
14609
14610
        if (refType == TLSXT_ECH) {
14611
            WOLFSSL_MSG("ECH: ech_outer_extensions references ECH");
14612
            ret = INVALID_PARAMETER;
14613
            break;
14614
        }
14615
14616
        outerExtData = TLSX_ECH_FindOuterExtension(outerCh, outerChLen,
14617
                            refType, &outerExtLen, &outerExtOffset,
14618
                            &extsStart, &extsLen);
14619
14620
        if (outerExtData == NULL) {
14621
            WOLFSSL_MSG("ECH: referenced extension not in outer CH or out "
14622
                        "of order");
14623
            ret = INVALID_PARAMETER;
14624
            break;
14625
        }
14626
14627
        if (newInnerCh == NULL) {
14628
            *newInnerChLen += outerExtLen;
14629
        }
14630
        else {
14631
            XMEMCPY(*newInnerCh, outerExtData, outerExtLen);
14632
            *newInnerCh += outerExtLen;
14633
        }
14634
14635
        outerRefTypes += OPAQUE16_LEN;
14636
    }
14637
14638
    return ret;
14639
}
14640
14641
/* Expand ech_outer_extensions in the inner ClientHello by copying referenced
14642
 * extensions from the outer ClientHello.
14643
 * If the sessionID exists in the outer ClientHello then also copy that into the
14644
 * expanded inner ClientHello.
14645
 *
14646
 * ssl      SSL/TLS object.
14647
 * ech      ECH object.
14648
 * heap     Heap hint.
14649
 * returns 0 on success and otherwise failure.
14650
 */
14651
static int TLSX_ECH_ExpandOuterExtensions(WOLFSSL* ssl, WOLFSSL_ECH* ech,
14652
    void* heap)
14653
{
14654
    int ret = 0;
14655
    int headerSz;
14656
    const byte* innerCh;
14657
    word32 innerChLen;
14658
    const byte* outerCh;
14659
    word32 outerChLen;
14660
    word32 idx;
14661
    byte sessionIdLen;
14662
    word16 cipherSuitesLen;
14663
    byte compressionLen;
14664
14665
    word32 innerExtIdx;
14666
    word16 innerExtLen;
14667
    word32 echOuterExtIdx = 0;
14668
    word16 echOuterExtLen = 0;
14669
    int foundEchOuter = 0;
14670
    word16 numOuterRefs = 0;
14671
    const byte* outerRefTypes = NULL;
14672
    word32 extraSize = 0;
14673
    byte* newInnerCh = NULL;
14674
    byte* newInnerChRef;
14675
    word32 newInnerChLen;
14676
    word32 copyLen;
14677
14678
    WOLFSSL_ENTER("TLSX_ExpandEchOuterExtensions");
14679
14680
    if (ech == NULL || ech->innerClientHello == NULL || ech->aad == NULL)
14681
        return BAD_FUNC_ARG;
14682
14683
#ifdef WOLFSSL_DTLS13
14684
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
14685
                                   HANDSHAKE_HEADER_SZ;
14686
#else
14687
    headerSz = HANDSHAKE_HEADER_SZ;
14688
#endif
14689
14690
    innerCh = ech->innerClientHello + headerSz;
14691
    innerChLen = ech->innerClientHelloLen;
14692
    outerCh = ech->aad;
14693
    outerChLen = ech->aadLen;
14694
14695
    /* don't need to check for buffer overflows here since they are caught by
14696
     * TLSX_ECH_CheckInnerPadding */
14697
    idx = OPAQUE16_LEN + RAN_LEN;
14698
14699
    sessionIdLen = innerCh[idx++];
14700
    idx += sessionIdLen;
14701
14702
    ato16(innerCh + idx, &cipherSuitesLen);
14703
    idx += OPAQUE16_LEN + cipherSuitesLen;
14704
14705
    compressionLen = innerCh[idx++];
14706
    idx += compressionLen;
14707
14708
    ato16(innerCh + idx, &innerExtLen);
14709
    idx += OPAQUE16_LEN;
14710
    innerExtIdx = idx;
14711
14712
    /* validate ech_outer_extensions and calculate extra size */
14713
    while (idx < innerChLen && (idx - innerExtIdx) < innerExtLen) {
14714
        word16 type;
14715
        word16 len;
14716
        byte outerExtListLen;
14717
14718
        if (idx + OPAQUE16_LEN + OPAQUE16_LEN > innerChLen)
14719
            return BUFFER_ERROR;
14720
14721
        ato16(innerCh + idx, &type);
14722
        idx += OPAQUE16_LEN;
14723
        ato16(innerCh + idx, &len);
14724
        idx += OPAQUE16_LEN;
14725
14726
        if (idx + len > innerChLen)
14727
            return BUFFER_ERROR;
14728
14729
        if (type == TLSXT_ECH_OUTER_EXTENSIONS) {
14730
            if (foundEchOuter) {
14731
                WOLFSSL_MSG("ECH: duplicate ech_outer_extensions");
14732
                return INVALID_PARAMETER;
14733
            }
14734
            foundEchOuter = 1;
14735
            echOuterExtIdx = idx - OPAQUE16_LEN - OPAQUE16_LEN;
14736
            echOuterExtLen = len + OPAQUE16_LEN + OPAQUE16_LEN;
14737
14738
            /* ech_outer_extensions data format: 1-byte length + extension types
14739
             * ExtensionType OuterExtensions<2..254>; */
14740
            if (len < 1)
14741
                return BUFFER_ERROR;
14742
            outerExtListLen = innerCh[idx];
14743
            if (outerExtListLen + 1 != len || outerExtListLen < 2 ||
14744
                    outerExtListLen == 255)
14745
                return BUFFER_ERROR;
14746
14747
            outerRefTypes = innerCh + idx + 1;
14748
            numOuterRefs = outerExtListLen / OPAQUE16_LEN;
14749
14750
            ret = TLSX_ECH_CopyOuterExtensions(outerCh, outerChLen, NULL,
14751
                    &extraSize, numOuterRefs, outerRefTypes);
14752
            if (ret != 0)
14753
                return ret;
14754
        }
14755
14756
        idx += len;
14757
    }
14758
14759
    newInnerChLen = innerChLen - echOuterExtLen + extraSize - sessionIdLen +
14760
                        ssl->session->sessionIDSz;
14761
    if (newInnerChLen > 0xFFFF) {
14762
        return BUFFER_E;
14763
    }
14764
14765
    if (!foundEchOuter && sessionIdLen == ssl->session->sessionIDSz) {
14766
        /* no extensions + no sessionID to copy */
14767
        WOLFSSL_MSG("ECH: no EchOuterExtensions extension found");
14768
        return ret;
14769
    }
14770
    else {
14771
        newInnerCh = (byte*)XMALLOC(newInnerChLen + headerSz, heap,
14772
                                    DYNAMIC_TYPE_TMP_BUFFER);
14773
        if (newInnerCh == NULL)
14774
            return MEMORY_E;
14775
    }
14776
14777
    /* note: The first HANDSHAKE_HEADER_SZ bytes are reserved for the header
14778
     * but not initialized here. The header will be properly set later by
14779
     * AddTls13HandShakeHeader() in DoTls13ClientHello(). */
14780
14781
    /* copy everything up to EchOuterExtensions */
14782
    newInnerChRef = newInnerCh + headerSz;
14783
    copyLen = OPAQUE16_LEN + RAN_LEN;
14784
    XMEMCPY(newInnerChRef, innerCh, copyLen);
14785
    newInnerChRef += copyLen;
14786
14787
    *newInnerChRef = ssl->session->sessionIDSz;
14788
    newInnerChRef += OPAQUE8_LEN;
14789
14790
    copyLen = ssl->session->sessionIDSz;
14791
    XMEMCPY(newInnerChRef, ssl->session->sessionID, copyLen);
14792
    newInnerChRef += copyLen;
14793
14794
    if (!foundEchOuter) {
14795
        WOLFSSL_MSG("ECH: no EchOuterExtensions extension found");
14796
14797
        copyLen = innerChLen - OPAQUE16_LEN - RAN_LEN - OPAQUE8_LEN -
14798
                sessionIdLen;
14799
        XMEMCPY(newInnerChRef, innerCh + OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN +
14800
                sessionIdLen, copyLen);
14801
    }
14802
    else {
14803
        innerExtIdx = headerSz + innerExtIdx - OPAQUE16_LEN -
14804
            sessionIdLen + ssl->session->sessionIDSz;
14805
14806
        copyLen = echOuterExtIdx - OPAQUE16_LEN - RAN_LEN - OPAQUE8_LEN -
14807
                sessionIdLen;
14808
        XMEMCPY(newInnerChRef, innerCh + OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN +
14809
                sessionIdLen, copyLen);
14810
        newInnerChRef += copyLen;
14811
14812
        /* update extensions length in the new ClientHello */
14813
        c16toa(innerExtLen - echOuterExtLen + (word16)extraSize,
14814
                newInnerCh + innerExtIdx);
14815
14816
        ret = TLSX_ECH_CopyOuterExtensions(outerCh, outerChLen, &newInnerChRef,
14817
                &newInnerChLen, numOuterRefs, outerRefTypes);
14818
        if (ret == 0) {
14819
            /* copy remaining extensions after ech_outer_extensions */
14820
            copyLen = innerChLen - (echOuterExtIdx + echOuterExtLen);
14821
            XMEMCPY(newInnerChRef, innerCh + echOuterExtIdx + echOuterExtLen,
14822
                    copyLen);
14823
14824
            WOLFSSL_MSG("ECH: expanded ech_outer_extensions successfully");
14825
        }
14826
    }
14827
14828
    if (ret == 0) {
14829
        XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
14830
        ech->innerClientHello = newInnerCh;
14831
        ech->innerClientHelloLen = newInnerChLen;
14832
        newInnerCh = NULL;
14833
    }
14834
14835
    if (newInnerCh != NULL)
14836
        XFREE(newInnerCh, heap, DYNAMIC_TYPE_TMP_BUFFER);
14837
14838
    return ret;
14839
}
14840
14841
/* Header bytes reserved before the ECH inner ClientHello (DTLS uses a larger handshake header than TLS). */
14842
static word32 TLSX_EchInnerHeaderSz(const WOLFSSL* ssl)
14843
{
14844
#ifdef WOLFSSL_DTLS13
14845
    return ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ : HANDSHAKE_HEADER_SZ;
14846
#else
14847
    (void)ssl;
14848
    return HANDSHAKE_HEADER_SZ;
14849
#endif
14850
}
14851
14852
/* return status after attempting to open the hpke encrypted ech extension, if
14853
 * successful the inner client hello will be stored in
14854
 * ech->innerClientHelloLen */
14855
static int TLSX_ExtractEch(WOLFSSL* ssl, WOLFSSL_ECH* ech,
14856
    WOLFSSL_EchConfig* echConfig, byte* aad, word32 aadLen)
14857
{
14858
    int ret = 0;
14859
    int i;
14860
    int allocatedHpke = 0;
14861
    word32 rawConfigLen = 0;
14862
    byte* info = NULL;
14863
    word32 infoLen = 0;
14864
    if (ssl == NULL || ech == NULL || echConfig == NULL || aad == NULL)
14865
        return BAD_FUNC_ARG;
14866
    /* verify the kem and key len */
14867
    if (wc_HpkeKemGetEncLen(echConfig->kemId) != ech->encLen)
14868
        return BAD_FUNC_ARG;
14869
    /* verify the cipher suite */
14870
    for (i = 0; i < echConfig->numCipherSuites; i++) {
14871
        if (echConfig->cipherSuites[i].kdfId == ech->cipherSuite.kdfId &&
14872
            echConfig->cipherSuites[i].aeadId == ech->cipherSuite.aeadId) {
14873
            break;
14874
        }
14875
    }
14876
    if (i >= echConfig->numCipherSuites) {
14877
        return BAD_FUNC_ARG;
14878
    }
14879
    /* check if hpke already exists, may if HelloRetryRequest */
14880
    if (ech->hpke == NULL) {
14881
        allocatedHpke = 1;
14882
        ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), ssl->heap,
14883
            DYNAMIC_TYPE_TMP_BUFFER);
14884
        if (ech->hpke == NULL)
14885
            ret = MEMORY_E;
14886
        /* init the hpke struct */
14887
        if (ret == 0) {
14888
            ret = wc_HpkeInit(ech->hpke, echConfig->kemId,
14889
                ech->cipherSuite.kdfId, ech->cipherSuite.aeadId, ssl->heap);
14890
        }
14891
        if (ret == 0) {
14892
            /* allocate hpkeContext */
14893
            ech->hpkeContext =
14894
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
14895
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
14896
            if (ech->hpkeContext == NULL)
14897
                ret = MEMORY_E;
14898
        }
14899
        /* get the rawConfigLen */
14900
        if (ret == 0)
14901
            ret = GetEchConfig(echConfig, NULL, &rawConfigLen);
14902
        if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
14903
            ret = 0;
14904
        /* create info */
14905
        if (ret == 0) {
14906
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + rawConfigLen;
14907
            info = (byte*)XMALLOC(infoLen, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14908
14909
            if (info == NULL)
14910
                ret = MEMORY_E;
14911
            else {
14912
                XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
14913
                    TLS_INFO_CONST_STRING_SZ + 1);
14914
                ret = GetEchConfig(echConfig, info +
14915
                    TLS_INFO_CONST_STRING_SZ + 1, &rawConfigLen);
14916
            }
14917
        }
14918
#ifdef HAVE_SECRET_CALLBACK
14919
        /* allocate secret buffer for wc_HpkeInitOpenContext to copy into */
14920
        if (ret == 0 && (ssl->tls13SecretCb != NULL
14921
#ifdef OPENSSL_EXTRA
14922
                || ssl->tls13KeyLogCb != NULL
14923
#endif
14924
                )) {
14925
            ret = wc_HpkeInitEchSecret(ech->hpke);
14926
        }
14927
#endif /* HAVE_SECRET_CALLBACK */
14928
        /* init the context for opening */
14929
        if (ret == 0) {
14930
            ret = wc_HpkeInitOpenContext(ech->hpke, ech->hpkeContext,
14931
                echConfig->receiverPrivkey, ech->enc, ech->encLen, info,
14932
                infoLen);
14933
        }
14934
    }
14935
    /* decrypt the ech payload */
14936
    if (ret == 0) {
14937
        ret = wc_HpkeContextOpenBase(ech->hpke, ech->hpkeContext, aad, aadLen,
14938
            ech->outerClientPayload, ech->innerClientHelloLen,
14939
            ech->innerClientHello + TLSX_EchInnerHeaderSz(ssl));
14940
    }
14941
14942
#ifdef HAVE_SECRET_CALLBACK
14943
    if (ret == 0 && ech->hpke->echSecret != NULL) {
14944
        ret = EchWriteKeyLog(ssl, ech->hpke->echSecret, ech->hpke->Nsecret,
14945
                info + TLS_INFO_CONST_STRING_SZ + 1, rawConfigLen);
14946
    }
14947
    wc_HpkeFreeEchSecret(ech->hpke);
14948
#endif /* HAVE_SECRET_CALLBACK */
14949
14950
    /* only free hpke/hpkeContext if allocated in this call; otherwise preserve
14951
     * them for clientHello2 */
14952
    if (ret != 0 && allocatedHpke) {
14953
        XFREE(ech->hpke, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14954
        ech->hpke = NULL;
14955
        if (ech->hpkeContext != NULL) {
14956
            ForceZero(ech->hpkeContext, sizeof(HpkeBaseContext));
14957
            XFREE(ech->hpkeContext, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14958
            ech->hpkeContext = NULL;
14959
        }
14960
    }
14961
14962
    if (info != NULL)
14963
        XFREE(info, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14964
14965
    return ret;
14966
}
14967
14968
/* parse the ech extension, if internal update ech->state and return, if
14969
 * external attempt to extract the inner client_hello, return the status */
14970
static int TLSX_ECH_Parse(WOLFSSL* ssl, const byte* readBuf, word16 size,
14971
    byte msgType)
14972
{
14973
    int ret = 0;
14974
    TLSX* echX;
14975
    WOLFSSL_ECH* ech;
14976
    WOLFSSL_EchConfig* echConfig;
14977
    byte* aadCopy;
14978
    byte* readBuf_p = (byte*)readBuf;
14979
    word32 offset = 0;
14980
    word16 len;
14981
    word16 tmpVal16;
14982
    word16 lenCh;
14983
14984
    WOLFSSL_MSG("TLSX_ECH_Parse");
14985
    if (ssl->options.disableECH) {
14986
        WOLFSSL_MSG("TLSX_ECH_Parse: ECH disabled. Ignoring.");
14987
        return 0;
14988
    }
14989
    if (size == 0)
14990
        return BAD_FUNC_ARG;
14991
14992
    /* retry configs */
14993
    if (msgType == encrypted_extensions) {
14994
        /* configs must only be sent on ECH rejection (RFC9849, Section 5) */
14995
        if (ssl->options.echAccepted) {
14996
            SendAlert(ssl, alert_fatal, unsupported_extension);
14997
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
14998
            return UNSUPPORTED_EXTENSION;
14999
        }
15000
15001
        ret = SetRetryConfigs(ssl, readBuf, (word32)size);
15002
        if (ret == WC_NO_ERR_TRACE(UNSUPPORTED_SUITE) ||
15003
                ret == WC_NO_ERR_TRACE(UNSUPPORTED_PROTO_VERSION)) {
15004
            WOLFSSL_MSG("ECH retry configs had 'bad version' or 'bad suite'");
15005
            ret = 0;
15006
        }
15007
15008
        if (ssl->echConfigs == NULL) {
15009
            /* on GREASE connection configs must be checked syntactically and
15010
             * must not be saved (RFC 9849, Section 6.2.1) */
15011
            FreeEchConfigs(ssl->echRetryConfigs, ssl->heap);
15012
            ssl->echRetryConfigs = NULL;
15013
        }
15014
15015
        /* retry configs may only be accepted at the point when ECH_REQUIRED is
15016
         * sent */
15017
        ssl->options.echRetryConfigsAccepted = 0;
15018
    }
15019
    /* HRR with special confirmation */
15020
    else if (msgType == hello_retry_request && ssl->echConfigs != NULL) {
15021
        /* length must be 8 */
15022
        if (size != ECH_ACCEPT_CONFIRMATION_SZ)
15023
            return BUFFER_ERROR;
15024
15025
        /* get extension */
15026
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
15027
        if (echX == NULL)
15028
            return BAD_FUNC_ARG;
15029
        ech = (WOLFSSL_ECH*)echX->data;
15030
15031
        ech->confBuf = (byte*)readBuf;
15032
    }
15033
    else if (msgType == client_hello && ssl->ctx->echConfigs != NULL) {
15034
        /* get extension */
15035
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
15036
        if (echX == NULL)
15037
            return BAD_FUNC_ARG;
15038
        ech = (WOLFSSL_ECH*)echX->data;
15039
15040
        /* if the first ECH was rejected or CH1 did not have ECH then there is
15041
         * no need to decrypt this one */
15042
        if (!ssl->options.echAccepted && ssl->options.serverState ==
15043
                SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
15044
            ech->state = ECH_WRITE_RETRY_CONFIGS;
15045
            return 0;
15046
        }
15047
15048
        /* read the ech parameters before the payload */
15049
        ech->type = *readBuf_p;
15050
        readBuf_p++;
15051
        offset += 1;
15052
        if (ssl->options.echProcessingInner && ech->type == ECH_TYPE_INNER) {
15053
            ech->state = ECH_PARSED_INTERNAL;
15054
            return 0;
15055
        }
15056
        else if ((!ssl->options.echProcessingInner &&
15057
                  ech->type != ECH_TYPE_OUTER) ||
15058
                 (ssl->options.echProcessingInner &&
15059
                  ech->type != ECH_TYPE_INNER)) {
15060
            /* MUST process INNER in inner hello and OUTER in outer hello */
15061
            return INVALID_PARAMETER;
15062
        }
15063
        /* Must have kdfId, aeadId, configId, enc len and payload len. */
15064
        if (size < offset + 2 + 2 + 1 + 2 + 2) {
15065
            return BUFFER_ERROR;
15066
        }
15067
        /* only get enc if we don't already have the hpke context */
15068
        if (ech->hpkeContext == NULL) {
15069
            /* kdfId */
15070
            ato16(readBuf_p, &ech->cipherSuite.kdfId);
15071
            readBuf_p += 2;
15072
            offset += 2;
15073
            /* aeadId */
15074
            ato16(readBuf_p, &ech->cipherSuite.aeadId);
15075
            readBuf_p += 2;
15076
            offset += 2;
15077
            /* configId */
15078
            ech->configId = *readBuf_p;
15079
            readBuf_p++;
15080
            offset++;
15081
            /* encLen */
15082
            ato16(readBuf_p, &len);
15083
            readBuf_p += 2;
15084
            offset += 2;
15085
            /* Check encLen isn't more than remaining bytes minus
15086
             * payload length. */
15087
            if (len > size - offset - 2) {
15088
                return BUFFER_ERROR;
15089
            }
15090
            if (len > HPKE_Npk_MAX) {
15091
                return BUFFER_ERROR;
15092
            }
15093
            /* read enc */
15094
            XMEMCPY(ech->enc, readBuf_p, len);
15095
            ech->encLen = len;
15096
        }
15097
        else {
15098
            /* kdfId, aeadId, and configId must be the same as last time */
15099
            /* kdfId */
15100
            ato16(readBuf_p, &tmpVal16);
15101
            if (tmpVal16 != ech->cipherSuite.kdfId) {
15102
                return INVALID_PARAMETER;
15103
            }
15104
            readBuf_p += 2;
15105
            offset += 2;
15106
            /* aeadId */
15107
            ato16(readBuf_p, &tmpVal16);
15108
            if (tmpVal16 != ech->cipherSuite.aeadId) {
15109
                return INVALID_PARAMETER;
15110
            }
15111
            readBuf_p += 2;
15112
            offset += 2;
15113
            /* configId */
15114
            if (*readBuf_p != ech->configId) {
15115
                return INVALID_PARAMETER;
15116
            }
15117
            readBuf_p++;
15118
            offset++;
15119
            /* on an HRR the enc value MUST be empty */
15120
            ato16(readBuf_p, &len);
15121
            if (len != 0) {
15122
                return INVALID_PARAMETER;
15123
            }
15124
            readBuf_p += 2;
15125
            offset += 2;
15126
        }
15127
        readBuf_p += len;
15128
        offset += len;
15129
        /* read payload (encrypted CH) len */
15130
        ato16(readBuf_p, &lenCh);
15131
        ech->innerClientHelloLen = lenCh;
15132
        readBuf_p += 2;
15133
        offset += 2;
15134
        /* Check payload is no bigger than remaining bytes. */
15135
        if (ech->innerClientHelloLen > size - offset) {
15136
            return BUFFER_ERROR;
15137
        }
15138
        if (ech->innerClientHelloLen < WC_AES_BLOCK_SIZE) {
15139
            return BUFFER_ERROR;
15140
        }
15141
        ech->innerClientHelloLen -= WC_AES_BLOCK_SIZE;
15142
        ech->outerClientPayload = readBuf_p;
15143
        /* make a copy of the aad */
15144
        aadCopy = (byte*)XMALLOC(ech->aadLen, ssl->heap,
15145
            DYNAMIC_TYPE_TMP_BUFFER);
15146
        if (aadCopy == NULL)
15147
            return MEMORY_E;
15148
        XMEMCPY(aadCopy, ech->aad, ech->aadLen);
15149
        /* set the ech payload of the copy to zeros */
15150
        XMEMSET(aadCopy + (readBuf_p - ech->aad), 0,
15151
            ech->innerClientHelloLen + WC_AES_BLOCK_SIZE);
15152
        /* free the old ech when this is the second client hello */
15153
        if (ech->innerClientHello != NULL)
15154
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15155
        /* allocate the inner payload buffer */
15156
        ech->innerClientHello =
15157
            (byte*)XMALLOC(ech->innerClientHelloLen + TLSX_EchInnerHeaderSz(ssl),
15158
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15159
        if (ech->innerClientHello == NULL) {
15160
            XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15161
            return MEMORY_E;
15162
        }
15163
        /* try to decrypt with matching configId */
15164
        echConfig = ssl->ctx->echConfigs;
15165
        while (echConfig != NULL) {
15166
            if (echConfig->configId == ech->configId) {
15167
                ret = TLSX_ExtractEch(ssl, ech, echConfig, aadCopy,
15168
                        ech->aadLen);
15169
                if (ret == 0 || ret == WC_NO_ERR_TRACE(TLS13_SECRET_CB_E))
15170
                    break;
15171
            }
15172
            echConfig = echConfig->next;
15173
        }
15174
        /* otherwise, try to decrypt with all configs (trial decryption) */
15175
        if (echConfig == NULL && ssl->options.enableEchTrialDecrypt) {
15176
            echConfig = ssl->ctx->echConfigs;
15177
            while (echConfig != NULL) {
15178
                if (echConfig->configId != ech->configId) {
15179
                    ret = TLSX_ExtractEch(ssl, ech, echConfig, aadCopy,
15180
                            ech->aadLen);
15181
                    if (ret == 0 || ret == WC_NO_ERR_TRACE(TLS13_SECRET_CB_E))
15182
                        break;
15183
                }
15184
                echConfig = echConfig->next;
15185
            }
15186
        }
15187
        /* TLS13_SECRET_CB_E isn't correlated with ECH acceptance so skip both
15188
         * paths */
15189
        if (ret != WC_NO_ERR_TRACE(TLS13_SECRET_CB_E)) {
15190
            /* if we failed to extract/expand */
15191
            if (ret != 0 || echConfig == NULL) {
15192
                WOLFSSL_MSG("ECH rejected");
15193
15194
                if (ssl->options.echAccepted == 0) {
15195
                    /* on SH1 prepare to write retry configs */
15196
                    XFREE(ech->innerClientHello, ssl->heap,
15197
                        DYNAMIC_TYPE_TMP_BUFFER);
15198
                    ech->innerClientHello = NULL;
15199
                    ech->state = ECH_WRITE_RETRY_CONFIGS;
15200
                    ret = 0;
15201
                }
15202
                else {
15203
                    /* on SH2 failure to decrypt is fatal */
15204
                    SendAlert(ssl, alert_fatal, decrypt_error);
15205
                    WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
15206
                    ret = DECRYPT_ERROR;
15207
                }
15208
            }
15209
            else {
15210
                WOLFSSL_MSG("ECH accepted");
15211
                ssl->options.echAccepted = 1;
15212
15213
                ret = TLSX_ECH_CheckInnerPadding(ssl, ech);
15214
                if (ret == 0) {
15215
                    /* expand EchOuterExtensions if present.
15216
                    * Also, if it exists, copy sessionID from outer hello */
15217
                    ret = TLSX_ECH_ExpandOuterExtensions(ssl, ech, ssl->heap);
15218
                }
15219
            }
15220
        }
15221
        if (ret != 0) {
15222
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15223
            ech->innerClientHello = NULL;
15224
        }
15225
15226
        XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15227
    }
15228
15229
    return ret;
15230
}
15231
15232
/* free the ech struct and the dynamic buffer it uses */
15233
static void TLSX_ECH_Free(WOLFSSL_ECH* ech, void* heap)
15234
{
15235
    XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
15236
    if (ech->hpke != NULL) {
15237
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
15238
            ech->hpke->heap);
15239
        /* wc_HpkeFreeEchSecret is intentionally not here, free it in
15240
         * TLSX_ExtractEch / TLSX_FinalizeEch */
15241
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
15242
    }
15243
    if (ech->hpkeContext != NULL) {
15244
        ForceZero(ech->hpkeContext, sizeof(HpkeBaseContext));
15245
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
15246
    }
15247
15248
    XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
15249
    (void)heap;
15250
}
15251
15252
/* encrypt the client hello and store it in ech->outerClientPayload, return
15253
 * status */
15254
int TLSX_FinalizeEch(WOLFSSL* ssl, WOLFSSL_ECH* ech, byte* aad, word32 aadLen)
15255
{
15256
    int ret = 0;
15257
    void* receiverPubkey = NULL;
15258
    byte* info = NULL;
15259
    int infoLen = 0;
15260
    byte* aadCopy = NULL;
15261
    if (ssl == NULL || ech == NULL || aad == NULL)
15262
        return BAD_FUNC_ARG;
15263
    /* setup hpke context to seal, should be done at most once per connection */
15264
    if (ech->hpkeContext == NULL) {
15265
        /* import the server public key */
15266
        ret = wc_HpkeDeserializePublicKey(ech->hpke, &receiverPubkey,
15267
            ech->echConfig->receiverPubkey, ech->encLen);
15268
        if (ret == 0) {
15269
            /* allocate hpke context */
15270
            ech->hpkeContext =
15271
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
15272
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
15273
            if (ech->hpkeContext == NULL)
15274
                ret = MEMORY_E;
15275
        }
15276
        if (ret == 0) {
15277
            /* create info */
15278
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + ech->echConfig->rawLen;
15279
            info = (byte*)XMALLOC(infoLen, ech->hpke->heap,
15280
                DYNAMIC_TYPE_TMP_BUFFER);
15281
            if (info == NULL)
15282
                ret = MEMORY_E;
15283
        }
15284
        if (ret == 0) {
15285
            /* puts the null byte in for me */
15286
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
15287
                TLS_INFO_CONST_STRING_SZ + 1);
15288
            XMEMCPY(info + TLS_INFO_CONST_STRING_SZ + 1,
15289
                ech->echConfig->raw, ech->echConfig->rawLen);
15290
        }
15291
#ifdef HAVE_SECRET_CALLBACK
15292
        /* allocate secret buffer for wc_HpkeInitSealContext to copy into */
15293
        if (ret == 0 && (ssl->tls13SecretCb != NULL
15294
#ifdef OPENSSL_EXTRA
15295
                || ssl->tls13KeyLogCb != NULL
15296
#endif
15297
                )) {
15298
            ret = wc_HpkeInitEchSecret(ech->hpke);
15299
        }
15300
#endif /* HAVE_SECRET_CALLBACK */
15301
        if (ret == 0) {
15302
            /* init the context for seal with info and keys */
15303
            ret = wc_HpkeInitSealContext(ech->hpke, ech->hpkeContext,
15304
                ech->ephemeralKey, receiverPubkey, info, infoLen);
15305
        }
15306
    }
15307
    if (ret == 0) {
15308
        /* make a copy of the aad since we overwrite it */
15309
        aadCopy = (byte*)XMALLOC(aadLen, ech->hpke->heap,
15310
            DYNAMIC_TYPE_TMP_BUFFER);
15311
        if (aadCopy == NULL) {
15312
            ret = MEMORY_E;
15313
        }
15314
    }
15315
    if (ret == 0) {
15316
        XMEMCPY(aadCopy, aad, aadLen);
15317
        /* seal the payload with context */
15318
        ret = wc_HpkeContextSealBase(ech->hpke, ech->hpkeContext, aadCopy,
15319
            aadLen, ech->innerClientHello,
15320
            ech->innerClientHelloLen - ech->hpke->Nt, ech->outerClientPayload);
15321
    }
15322
15323
#ifdef HAVE_SECRET_CALLBACK
15324
    if (ret == 0 && ech->hpke->echSecret != NULL) {
15325
        ret = EchWriteKeyLog(ssl, ech->hpke->echSecret, ech->hpke->Nsecret,
15326
            ech->echConfig->raw, ech->echConfig->rawLen);
15327
    }
15328
    wc_HpkeFreeEchSecret(ech->hpke);
15329
#endif /* HAVE_SECRET_CALLBACK */
15330
15331
    if (info != NULL)
15332
        XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
15333
    if (aadCopy != NULL)
15334
        XFREE(aadCopy, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
15335
    if (receiverPubkey != NULL)
15336
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, receiverPubkey,
15337
            ech->hpke->heap);
15338
    return ret;
15339
}
15340
15341
#define GREASE_ECH_USE TLSX_GreaseECH_Use
15342
#define ECH_USE TLSX_ECH_Use
15343
#define SERVER_ECH_USE TLSX_ServerECH_Use
15344
#define ECH_WRITE TLSX_ECH_Write
15345
#define ECH_GET_SIZE TLSX_ECH_GetSize
15346
#define ECH_PARSE TLSX_ECH_Parse
15347
#define ECH_FREE TLSX_ECH_Free
15348
15349
#endif /* WOLFSSL_TLS13 && HAVE_ECH */
15350
15351
/** Releases all extensions in the provided list. */
15352
void TLSX_FreeAll(TLSX* list, void* heap)
15353
4.97k
{
15354
4.97k
    TLSX* extension;
15355
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15356
    TLSX* echList;
15357
    TLSX* tail;
15358
#endif
15359
15360
4.97k
    while ((extension = list)) {
15361
0
        list = extension->next;
15362
15363
0
        switch (extension->type) {
15364
#if defined(HAVE_RPK)
15365
            case TLSX_CLIENT_CERTIFICATE_TYPE:
15366
                WOLFSSL_MSG("Client Certificate Type extension free");
15367
                /* nothing to do */
15368
                break;
15369
            case TLSX_SERVER_CERTIFICATE_TYPE:
15370
                WOLFSSL_MSG("Server Certificate Type extension free");
15371
                /* nothing to do */
15372
                break;
15373
#endif
15374
15375
0
#ifdef HAVE_SNI
15376
0
            case TLSX_SERVER_NAME:
15377
0
                WOLFSSL_MSG("SNI extension free");
15378
0
                SNI_FREE_ALL((SNI*)extension->data, heap);
15379
0
                break;
15380
0
#endif
15381
15382
0
            case TLSX_TRUSTED_CA_KEYS:
15383
0
                WOLFSSL_MSG("Trusted CA Indication extension free");
15384
0
                TCA_FREE_ALL((TCA*)extension->data, heap);
15385
0
                break;
15386
15387
0
            case TLSX_MAX_FRAGMENT_LENGTH:
15388
0
                WOLFSSL_MSG("Max Fragment Length extension free");
15389
0
                MFL_FREE_ALL(extension->data, heap);
15390
0
                break;
15391
15392
0
            case TLSX_EXTENDED_MASTER_SECRET:
15393
0
                WOLFSSL_MSG("Extended Master Secret free");
15394
                /* Nothing to do. */
15395
0
                break;
15396
0
            case TLSX_TRUNCATED_HMAC:
15397
0
                WOLFSSL_MSG("Truncated HMAC extension free");
15398
                /* Nothing to do. */
15399
0
                break;
15400
15401
0
            case TLSX_SUPPORTED_GROUPS:
15402
0
                WOLFSSL_MSG("Supported Groups extension free");
15403
0
                EC_FREE_ALL((SupportedCurve*)extension->data, heap);
15404
0
                break;
15405
15406
0
            case TLSX_EC_POINT_FORMATS:
15407
0
                WOLFSSL_MSG("Point Formats extension free");
15408
0
                PF_FREE_ALL((PointFormat*)extension->data, heap);
15409
0
                break;
15410
15411
0
            case TLSX_STATUS_REQUEST:
15412
0
                WOLFSSL_MSG("Certificate Status Request extension free");
15413
0
                CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
15414
0
                break;
15415
15416
0
            case TLSX_STATUS_REQUEST_V2:
15417
0
                WOLFSSL_MSG("Certificate Status Request v2 extension free");
15418
0
                CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
15419
0
                        heap);
15420
0
                break;
15421
15422
0
            case TLSX_RENEGOTIATION_INFO:
15423
0
                WOLFSSL_MSG("Secure Renegotiation extension free");
15424
0
                SCR_FREE_ALL((SecureRenegotiation*)extension->data, heap);
15425
0
                break;
15426
15427
0
            case TLSX_SESSION_TICKET:
15428
0
                WOLFSSL_MSG("Session Ticket extension free");
15429
0
                WOLF_STK_FREE(extension->data, heap);
15430
0
                break;
15431
15432
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
15433
0
                WOLFSSL_MSG("ALPN extension free");
15434
0
                ALPN_FREE_ALL((ALPN*)extension->data, heap);
15435
0
                break;
15436
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15437
0
            case TLSX_SIGNATURE_ALGORITHMS:
15438
0
                WOLFSSL_MSG("Signature Algorithms extension to free");
15439
0
                SA_FREE_ALL((SignatureAlgorithms*)extension->data, heap);
15440
0
                break;
15441
0
#endif
15442
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
15443
0
            case TLSX_ENCRYPT_THEN_MAC:
15444
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension free");
15445
0
                break;
15446
0
#endif
15447
15448
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15449
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15450
            case TLSX_PRE_SHARED_KEY:
15451
                WOLFSSL_MSG("Pre-Shared Key extension free");
15452
                PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
15453
                break;
15454
15455
        #ifdef WOLFSSL_TLS13
15456
            case TLSX_PSK_KEY_EXCHANGE_MODES:
15457
                WOLFSSL_MSG("PSK Key Exchange Modes extension free");
15458
                break;
15459
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
15460
            case TLSX_CERT_WITH_EXTERN_PSK:
15461
                WOLFSSL_MSG("Cert with external PSK extension free");
15462
                break;
15463
        #endif
15464
        #endif
15465
    #endif
15466
15467
0
            case TLSX_KEY_SHARE:
15468
0
                WOLFSSL_MSG("Key Share extension free");
15469
0
                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
15470
0
                break;
15471
0
#endif
15472
0
#ifdef WOLFSSL_TLS13
15473
0
            case TLSX_SUPPORTED_VERSIONS:
15474
0
                WOLFSSL_MSG("Supported Versions extension free");
15475
0
                break;
15476
15477
0
            case TLSX_COOKIE:
15478
0
                WOLFSSL_MSG("Cookie extension free");
15479
0
                CKE_FREE_ALL((Cookie*)extension->data, heap);
15480
0
                break;
15481
15482
    #ifdef WOLFSSL_EARLY_DATA
15483
            case TLSX_EARLY_DATA:
15484
                WOLFSSL_MSG("Early Data extension free");
15485
                break;
15486
    #endif
15487
15488
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15489
            case TLSX_POST_HANDSHAKE_AUTH:
15490
                WOLFSSL_MSG("Post-Handshake Authentication extension free");
15491
                break;
15492
    #endif
15493
15494
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15495
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
15496
0
                WOLFSSL_MSG("Signature Algorithms extension free");
15497
0
                break;
15498
0
    #endif
15499
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15500
            case TLSX_CERTIFICATE_AUTHORITIES:
15501
                WOLFSSL_MSG("Certificate Authorities extension free");
15502
                break;
15503
    #endif
15504
0
#endif
15505
#ifdef WOLFSSL_SRTP
15506
            case TLSX_USE_SRTP:
15507
                WOLFSSL_MSG("SRTP extension free");
15508
                SRTP_FREE((TlsxSrtp*)extension->data, heap);
15509
                break;
15510
#endif
15511
15512
    #ifdef WOLFSSL_QUIC
15513
            case TLSX_KEY_QUIC_TP_PARAMS:
15514
                FALL_THROUGH;
15515
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
15516
                WOLFSSL_MSG("QUIC transport parameter free");
15517
                QTP_FREE((QuicTransportParam*)extension->data, heap);
15518
                break;
15519
    #endif
15520
15521
#ifdef WOLFSSL_DTLS_CID
15522
            case TLSX_CONNECTION_ID:
15523
                WOLFSSL_MSG("Connection ID extension free");
15524
                CID_FREE((byte*)extension->data, heap);
15525
                break;
15526
#endif /* WOLFSSL_DTLS_CID */
15527
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15528
            case TLSX_ECH:
15529
                WOLFSSL_MSG("ECH extension free");
15530
                /* append the ech extensions to the tail of the list so a
15531
                 * recursive TLSX_FreeAll is not necessary */
15532
                echList = ((WOLFSSL_ECH*)extension->data)->extensions;
15533
                if (echList != NULL) {
15534
                    if (list == NULL) {
15535
                        list = echList;
15536
                    }
15537
                    else {
15538
                        tail = list;
15539
                        while (tail->next != NULL)
15540
                            tail = tail->next;
15541
                        tail->next = echList;
15542
                    }
15543
                }
15544
                ECH_FREE((WOLFSSL_ECH*)extension->data, heap);
15545
                break;
15546
#endif
15547
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
15548
            case TLSX_CKS:
15549
                WOLFSSL_MSG("CKS extension free");
15550
                /* nothing to do */
15551
                break;
15552
#endif
15553
0
            default:
15554
0
                break;
15555
0
        }
15556
15557
0
        XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
15558
0
    }
15559
15560
4.97k
    (void)heap;
15561
4.97k
}
15562
15563
/** Checks if the tls extensions are supported based on the protocol version. */
15564
67.9k
int TLSX_SupportExtensions(WOLFSSL* ssl) {
15565
67.9k
    return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
15566
67.9k
}
15567
15568
/** Tells the buffered size of the extensions in a list. */
15569
static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
15570
                        word16* pLength)
15571
{
15572
    int    ret = 0;
15573
    TLSX*  extension;
15574
    /* Use a word32 accumulator so that an extension whose contribution
15575
     * pushes the running total past 0xFFFF is detected rather than
15576
     * silently wrapped (the TLS extensions block length prefix on the
15577
     * wire is a 2-byte field). Callees that take a word16* accumulator
15578
     * are invoked via a per-iteration shim (`cbShim`) and their delta
15579
     * is added back into the word32 total.
15580
     *
15581
     * MAINTAINER NOTE: do NOT pass &length to any *_GET_SIZE function
15582
     * that expects a `word16*` out-parameter -- that would be a type
15583
     * mismatch (UB) and would silently bypass the overflow detection
15584
     * below. When adding a new extension case, either:
15585
     *   - use `length += FOO_GET_SIZE(...)` when the helper returns a
15586
     *     word16 by value, or
15587
     *   - use the cbShim pattern: `cbShim = 0; ret = FOO_GET_SIZE(...,
15588
     *     &cbShim); length += cbShim;`
15589
     */
15590
    word32 length = 0;
15591
    word16 cbShim = 0;
15592
    byte   isRequest = (msgType == client_hello ||
15593
                        msgType == certificate_request);
15594
    (void)cbShim;
15595
15596
    while ((extension = list)) {
15597
        list = extension->next;
15598
15599
        /* only extensions marked as response are sent back to the client. */
15600
        if (!isRequest && !extension->resp)
15601
            continue; /* skip! */
15602
15603
        /* ssl level extensions are expected to override ctx level ones. */
15604
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
15605
            continue; /* skip! */
15606
15607
        /* extension type + extension data length. */
15608
        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
15609
15610
        switch (extension->type) {
15611
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
15612
            case TLSX_CKS:
15613
                length += ((WOLFSSL*)extension->data)->sigSpecSz ;
15614
                break;
15615
#endif
15616
#ifdef HAVE_SNI
15617
            case TLSX_SERVER_NAME:
15618
                /* SNI only sends the name on the request. */
15619
                if (isRequest)
15620
                    length += SNI_GET_SIZE((SNI*)extension->data);
15621
                break;
15622
#endif
15623
15624
            case TLSX_TRUSTED_CA_KEYS:
15625
                /* TCA only sends the list on the request. */
15626
                if (isRequest) {
15627
                    word16 tcaSz = TCA_GET_SIZE((TCA*)extension->data);
15628
                    /* 0 on non-empty list means 16-bit overflow. */
15629
                    if (tcaSz == 0 && extension->data != NULL) {
15630
                        ret = LENGTH_ERROR;
15631
                        break;
15632
                    }
15633
                    length += tcaSz;
15634
                }
15635
                break;
15636
15637
            case TLSX_MAX_FRAGMENT_LENGTH:
15638
                length += MFL_GET_SIZE(extension->data);
15639
                break;
15640
15641
            case TLSX_EXTENDED_MASTER_SECRET:
15642
            case TLSX_TRUNCATED_HMAC:
15643
                /* always empty. */
15644
                break;
15645
15646
            case TLSX_SUPPORTED_GROUPS:
15647
                length += EC_GET_SIZE((SupportedCurve*)extension->data);
15648
                break;
15649
15650
            case TLSX_EC_POINT_FORMATS:
15651
                length += PF_GET_SIZE((PointFormat*)extension->data);
15652
                break;
15653
15654
            case TLSX_STATUS_REQUEST:
15655
                if (msgType != certificate_request)
15656
                    length += CSR_GET_SIZE(
15657
                            (CertificateStatusRequest*)extension->data, isRequest);
15658
                break;
15659
15660
            case TLSX_STATUS_REQUEST_V2:
15661
                length += CSR2_GET_SIZE(
15662
                        (CertificateStatusRequestItemV2*)extension->data,
15663
                        isRequest);
15664
                break;
15665
15666
            case TLSX_RENEGOTIATION_INFO:
15667
                length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
15668
                        isRequest);
15669
                break;
15670
15671
            case TLSX_SESSION_TICKET:
15672
                length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
15673
                        isRequest);
15674
                break;
15675
15676
            case TLSX_APPLICATION_LAYER_PROTOCOL: {
15677
                word16 alpnSz = ALPN_GET_SIZE((ALPN*)extension->data);
15678
                /* 0 on non-empty list means 16-bit overflow. */
15679
                if (alpnSz == 0 && extension->data != NULL) {
15680
                    ret = LENGTH_ERROR;
15681
                    break;
15682
                }
15683
                length += alpnSz;
15684
                break;
15685
            }
15686
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15687
            case TLSX_SIGNATURE_ALGORITHMS:
15688
                length += SA_GET_SIZE(extension->data);
15689
                break;
15690
#endif
15691
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
15692
            case TLSX_ENCRYPT_THEN_MAC:
15693
                cbShim = 0;
15694
                ret = ETM_GET_SIZE(msgType, &cbShim);
15695
                length += cbShim;
15696
                break;
15697
#endif /* HAVE_ENCRYPT_THEN_MAC */
15698
15699
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15700
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15701
            case TLSX_PRE_SHARED_KEY:
15702
                cbShim = 0;
15703
                ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
15704
                                                                       &cbShim);
15705
                length += cbShim;
15706
                break;
15707
        #ifdef WOLFSSL_TLS13
15708
            case TLSX_PSK_KEY_EXCHANGE_MODES:
15709
                cbShim = 0;
15710
                ret = PKM_GET_SIZE((byte)extension->val, msgType, &cbShim);
15711
                length += cbShim;
15712
                break;
15713
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
15714
            case TLSX_CERT_WITH_EXTERN_PSK:
15715
                cbShim = 0;
15716
                ret = PSK_WITH_CERT_GET_SIZE(msgType, &cbShim);
15717
                length += cbShim;
15718
                break;
15719
        #endif
15720
        #endif
15721
    #endif
15722
            case TLSX_KEY_SHARE:
15723
                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
15724
                break;
15725
#endif
15726
15727
#ifdef WOLFSSL_TLS13
15728
            case TLSX_SUPPORTED_VERSIONS:
15729
                cbShim = 0;
15730
                ret = SV_GET_SIZE(extension->data, msgType, &cbShim);
15731
                length += cbShim;
15732
                break;
15733
15734
            case TLSX_COOKIE:
15735
                cbShim = 0;
15736
                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &cbShim);
15737
                length += cbShim;
15738
                break;
15739
15740
    #ifdef WOLFSSL_EARLY_DATA
15741
            case TLSX_EARLY_DATA:
15742
                cbShim = 0;
15743
                ret = EDI_GET_SIZE(msgType, &cbShim);
15744
                length += cbShim;
15745
                break;
15746
    #endif
15747
15748
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15749
            case TLSX_POST_HANDSHAKE_AUTH:
15750
                cbShim = 0;
15751
                ret = PHA_GET_SIZE(msgType, &cbShim);
15752
                length += cbShim;
15753
                break;
15754
    #endif
15755
15756
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15757
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
15758
                length += SAC_GET_SIZE(extension->data);
15759
                break;
15760
    #endif
15761
15762
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15763
            case TLSX_CERTIFICATE_AUTHORITIES: {
15764
                word16 canSz = CAN_GET_SIZE(extension->data);
15765
                /* 0 on non-empty list means 16-bit overflow. */
15766
                if (canSz == 0) {
15767
                    ret = LENGTH_ERROR;
15768
                    break;
15769
                }
15770
                length += canSz;
15771
                break;
15772
            }
15773
    #endif
15774
#endif
15775
#ifdef WOLFSSL_SRTP
15776
            case TLSX_USE_SRTP:
15777
                length += SRTP_GET_SIZE((TlsxSrtp*)extension->data);
15778
                break;
15779
#endif
15780
15781
#ifdef HAVE_RPK
15782
            case TLSX_CLIENT_CERTIFICATE_TYPE:
15783
                length += CCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
15784
                break;
15785
15786
            case TLSX_SERVER_CERTIFICATE_TYPE:
15787
                length += SCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
15788
                break;
15789
#endif /* HAVE_RPK */
15790
15791
#ifdef WOLFSSL_QUIC
15792
            case TLSX_KEY_QUIC_TP_PARAMS:
15793
                FALL_THROUGH; /* followed by */
15794
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
15795
                length += QTP_GET_SIZE(extension);
15796
                break;
15797
#endif
15798
#ifdef WOLFSSL_DTLS_CID
15799
            case TLSX_CONNECTION_ID:
15800
                length += CID_GET_SIZE((byte*)extension->data);
15801
                break;
15802
#endif /* WOLFSSL_DTLS_CID */
15803
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15804
            case TLSX_ECH:
15805
                length += ECH_GET_SIZE((WOLFSSL_ECH*)extension->data, msgType);
15806
                break;
15807
#endif
15808
            default:
15809
                break;
15810
        }
15811
15812
        if (ret != 0)
15813
            return ret;
15814
15815
        /* Early exit: stop accumulating as soon as the running total
15816
         * cannot possibly fit the 2-byte wire length. Check *before*
15817
         * marking the extension as processed so the semaphore is not
15818
         * left in an inconsistent state on the error path. */
15819
        if (length > WOLFSSL_MAX_16BIT) {
15820
            WOLFSSL_MSG("TLSX_GetSize extension length exceeds word16");
15821
            return BUFFER_E;
15822
        }
15823
15824
        /* marks the extension as processed so ctx level */
15825
        /* extensions don't overlap with ssl level ones. */
15826
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
15827
    }
15828
15829
    if ((word32)*pLength + length > WOLFSSL_MAX_16BIT) {
15830
        WOLFSSL_MSG("TLSX_GetSize total extensions length exceeds word16");
15831
        return BUFFER_E;
15832
    }
15833
15834
    *pLength += (word16)length;
15835
15836
    return ret;
15837
}
15838
15839
/** Writes the extensions of a list in a buffer. */
15840
static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
15841
                         byte msgType, word16* pOffset)
15842
0
{
15843
0
    int    ret = 0;
15844
0
    TLSX*  extension;
15845
    /* Use word32 to symmetrize with TLSX_GetSize -- a single extension can
15846
     * contribute up to 0x10003 bytes (4-byte type/length header + 0xFFFF
15847
     * payload), which would word16-overflow undetectably (e.g. wrap to a
15848
     * value still above prevOffset). Per-iteration and aggregate bounds are
15849
     * checked below before truncating back into the word16 wire fields.
15850
     * Callees that take a word16* offset use the cbShim pattern (init to 0,
15851
     * then add the returned delta to the word32 accumulator). */
15852
0
    word32 offset = 0;
15853
0
    word32 length_offset = 0;
15854
0
    word32 prevOffset;
15855
0
    word16 cbShim = 0;
15856
0
    byte   isRequest = (msgType == client_hello ||
15857
0
                        msgType == certificate_request);
15858
0
    (void)cbShim;
15859
15860
0
    while ((extension = list)) {
15861
0
        list = extension->next;
15862
15863
        /* only extensions marked as response are written in a response. */
15864
0
        if (!isRequest && !extension->resp)
15865
0
            continue; /* skip! */
15866
15867
        /* ssl level extensions are expected to override ctx level ones. */
15868
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
15869
0
            continue; /* skip! */
15870
15871
        /* Snapshot offset to detect word16 wrap within this iteration;
15872
         * see matching comment in TLSX_GetSize. */
15873
0
        prevOffset = offset;
15874
15875
        /* writes extension type. */
15876
0
        c16toa((word16)extension->type, output + offset);
15877
0
        offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
15878
0
        length_offset = offset;
15879
15880
        /* extension data should be written internally. */
15881
0
        switch (extension->type) {
15882
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
15883
            case TLSX_CKS:
15884
                WOLFSSL_MSG("CKS extension to write");
15885
                offset += CKS_WRITE(((WOLFSSL*)extension->data),
15886
                                    output + offset);
15887
                break;
15888
#endif
15889
0
#ifdef HAVE_SNI
15890
0
            case TLSX_SERVER_NAME:
15891
0
                if (isRequest) {
15892
0
                    WOLFSSL_MSG("SNI extension to write");
15893
0
                    offset += SNI_WRITE((SNI*)extension->data, output + offset);
15894
0
                }
15895
0
                break;
15896
0
#endif
15897
15898
0
            case TLSX_TRUSTED_CA_KEYS:
15899
0
                WOLFSSL_MSG("Trusted CA Indication extension to write");
15900
0
                if (isRequest) {
15901
0
                    offset += TCA_WRITE((TCA*)extension->data, output + offset);
15902
0
                }
15903
0
                break;
15904
15905
0
            case TLSX_MAX_FRAGMENT_LENGTH:
15906
0
                WOLFSSL_MSG("Max Fragment Length extension to write");
15907
0
                offset += MFL_WRITE((byte*)extension->data, output + offset);
15908
0
                break;
15909
15910
0
            case TLSX_EXTENDED_MASTER_SECRET:
15911
0
                WOLFSSL_MSG("Extended Master Secret");
15912
                /* always empty. */
15913
0
                break;
15914
15915
0
            case TLSX_TRUNCATED_HMAC:
15916
0
                WOLFSSL_MSG("Truncated HMAC extension to write");
15917
                /* always empty. */
15918
0
                break;
15919
15920
0
            case TLSX_SUPPORTED_GROUPS:
15921
0
                WOLFSSL_MSG("Supported Groups extension to write");
15922
0
                offset += EC_WRITE((SupportedCurve*)extension->data,
15923
0
                                    output + offset);
15924
0
                break;
15925
15926
0
            case TLSX_EC_POINT_FORMATS:
15927
0
                WOLFSSL_MSG("Point Formats extension to write");
15928
0
                offset += PF_WRITE((PointFormat*)extension->data,
15929
0
                                    output + offset);
15930
0
                break;
15931
15932
0
            case TLSX_STATUS_REQUEST:
15933
0
                WOLFSSL_MSG("Certificate Status Request extension to write");
15934
0
                if (msgType == certificate_request) {
15935
0
                    ret = 0;
15936
0
                } else {
15937
0
                    ret = CSR_WRITE((CertificateStatusRequest*)extension->data,
15938
0
                            output + offset, isRequest);
15939
0
                    if (ret > 0) {
15940
0
                        offset += (word16)ret;
15941
0
                        ret = 0;
15942
0
                    }
15943
0
                }
15944
0
                break;
15945
15946
0
            case TLSX_STATUS_REQUEST_V2:
15947
0
                WOLFSSL_MSG("Certificate Status Request v2 extension to write");
15948
0
                ret = CSR2_WRITE(
15949
0
                        (CertificateStatusRequestItemV2*)extension->data,
15950
0
                        output + offset, isRequest);
15951
0
                if (ret > 0) {
15952
0
                    offset += (word16)ret;
15953
0
                    ret = 0;
15954
0
                }
15955
0
                break;
15956
15957
0
            case TLSX_RENEGOTIATION_INFO:
15958
0
                WOLFSSL_MSG("Secure Renegotiation extension to write");
15959
0
                offset += SCR_WRITE((SecureRenegotiation*)extension->data,
15960
0
                        output + offset, isRequest);
15961
0
                break;
15962
15963
0
            case TLSX_SESSION_TICKET:
15964
0
                WOLFSSL_MSG("Session Ticket extension to write");
15965
0
                offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
15966
0
                        output + offset, isRequest);
15967
0
                break;
15968
15969
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
15970
0
                WOLFSSL_MSG("ALPN extension to write");
15971
0
                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
15972
0
                break;
15973
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15974
0
            case TLSX_SIGNATURE_ALGORITHMS:
15975
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
15976
0
                offset += SA_WRITE(extension->data, output + offset);
15977
0
                break;
15978
0
#endif
15979
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
15980
0
            case TLSX_ENCRYPT_THEN_MAC:
15981
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
15982
0
                cbShim = 0;
15983
0
                ret = ETM_WRITE(extension->data, output, msgType, &cbShim);
15984
0
                offset += cbShim;
15985
0
                break;
15986
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
15987
15988
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15989
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15990
            case TLSX_PRE_SHARED_KEY:
15991
                WOLFSSL_MSG("Pre-Shared Key extension to write");
15992
                cbShim = 0;
15993
                ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
15994
                                                              msgType, &cbShim);
15995
                offset += cbShim;
15996
                break;
15997
15998
        #ifdef WOLFSSL_TLS13
15999
            case TLSX_PSK_KEY_EXCHANGE_MODES:
16000
                WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
16001
                cbShim = 0;
16002
                ret = PKM_WRITE((byte)extension->val, output + offset, msgType,
16003
                                                                       &cbShim);
16004
                offset += cbShim;
16005
                break;
16006
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
16007
            case TLSX_CERT_WITH_EXTERN_PSK:
16008
                WOLFSSL_MSG("Cert with external PSK extension to write");
16009
                cbShim = 0;
16010
                ret = PSK_WITH_CERT_WRITE(output + offset, msgType, &cbShim);
16011
                offset += cbShim;
16012
                break;
16013
        #endif
16014
        #endif
16015
    #endif
16016
0
            case TLSX_KEY_SHARE:
16017
0
                WOLFSSL_MSG("Key Share extension to write");
16018
0
                offset += KS_WRITE((KeyShareEntry*)extension->data,
16019
0
                                                      output + offset, msgType);
16020
0
                break;
16021
0
#endif
16022
0
#ifdef WOLFSSL_TLS13
16023
0
            case TLSX_SUPPORTED_VERSIONS:
16024
0
                WOLFSSL_MSG("Supported Versions extension to write");
16025
0
                cbShim = 0;
16026
0
                ret = SV_WRITE(extension->data, output + offset, msgType,
16027
0
                                                                       &cbShim);
16028
0
                offset += cbShim;
16029
0
                break;
16030
16031
0
            case TLSX_COOKIE:
16032
0
                WOLFSSL_MSG("Cookie extension to write");
16033
0
                cbShim = 0;
16034
0
                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
16035
0
                                msgType, &cbShim);
16036
0
                offset += cbShim;
16037
0
                break;
16038
16039
    #ifdef WOLFSSL_EARLY_DATA
16040
            case TLSX_EARLY_DATA:
16041
                WOLFSSL_MSG("Early Data extension to write");
16042
                cbShim = 0;
16043
                ret = EDI_WRITE(extension->val, output + offset, msgType,
16044
                                                                       &cbShim);
16045
                offset += cbShim;
16046
                break;
16047
    #endif
16048
16049
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
16050
            case TLSX_POST_HANDSHAKE_AUTH:
16051
                WOLFSSL_MSG("Post-Handshake Authentication extension to write");
16052
                cbShim = 0;
16053
                ret = PHA_WRITE(output + offset, msgType, &cbShim);
16054
                offset += cbShim;
16055
                break;
16056
    #endif
16057
16058
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16059
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
16060
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
16061
0
                offset += SAC_WRITE(extension->data, output + offset);
16062
0
                break;
16063
0
    #endif
16064
16065
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16066
            case TLSX_CERTIFICATE_AUTHORITIES:
16067
                WOLFSSL_MSG("Certificate Authorities extension to write");
16068
                offset += CAN_WRITE(extension->data, output + offset);
16069
                break;
16070
    #endif
16071
0
#endif
16072
#ifdef WOLFSSL_SRTP
16073
            case TLSX_USE_SRTP:
16074
                WOLFSSL_MSG("SRTP extension to write");
16075
                offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset);
16076
                break;
16077
#endif
16078
16079
#ifdef HAVE_RPK
16080
            case TLSX_CLIENT_CERTIFICATE_TYPE:
16081
                WOLFSSL_MSG("Client Certificate Type extension to write");
16082
                offset += CCT_WRITE(extension->data, output + offset, msgType);
16083
                break;
16084
16085
            case TLSX_SERVER_CERTIFICATE_TYPE:
16086
                WOLFSSL_MSG("Server Certificate Type extension to write");
16087
                offset += SCT_WRITE(extension->data, output + offset, msgType);
16088
                break;
16089
#endif /* HAVE_RPK */
16090
16091
#ifdef WOLFSSL_QUIC
16092
            case TLSX_KEY_QUIC_TP_PARAMS:
16093
                FALL_THROUGH;
16094
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
16095
                WOLFSSL_MSG("QUIC transport parameter to write");
16096
                offset += QTP_WRITE((QuicTransportParam*)extension->data,
16097
                                    output + offset);
16098
                break;
16099
#endif
16100
#ifdef WOLFSSL_DTLS_CID
16101
            case TLSX_CONNECTION_ID:
16102
                WOLFSSL_MSG("Connection ID extension to write");
16103
                offset += CID_WRITE((byte*)extension->data, output+offset);
16104
                break;
16105
16106
#endif /* WOLFSSL_DTLS_CID */
16107
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
16108
            case TLSX_ECH:
16109
                WOLFSSL_MSG("ECH extension to write");
16110
                cbShim = 0;
16111
                ret = ECH_WRITE((WOLFSSL_ECH*)extension->data, msgType,
16112
                    output + offset, &cbShim);
16113
                offset += cbShim;
16114
                break;
16115
#endif
16116
0
            default:
16117
0
                break;
16118
0
        }
16119
16120
        /* Per-extension data length is a 2-byte wire field; reject any
16121
         * single extension whose payload exceeds that before truncating. */
16122
0
        if (offset - length_offset > WOLFSSL_MAX_16BIT) {
16123
0
            WOLFSSL_MSG("TLSX_Write single extension length exceeds word16");
16124
0
            return BUFFER_E;
16125
0
        }
16126
16127
        /* writes extension data length. */
16128
0
        c16toa((word16)(offset - length_offset),
16129
0
               output + length_offset - OPAQUE16_LEN);
16130
16131
        /* marks the extension as processed so ctx level */
16132
        /* extensions don't overlap with ssl level ones. */
16133
0
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
16134
16135
        /* if we encountered an error propagate it */
16136
0
        if (ret != 0)
16137
0
            break;
16138
16139
0
        if (offset <= prevOffset) {
16140
0
            WOLFSSL_MSG("TLSX_Write extension made no progress");
16141
0
            return BUFFER_E;
16142
0
        }
16143
0
    }
16144
16145
    /* Only validate and commit the aggregate offset when the loop
16146
     * completed without error; on the error path, leave *pOffset
16147
     * unchanged and return the original failure reason so callers
16148
     * see the real error instead of a masking BUFFER_E. */
16149
0
    if (ret == 0) {
16150
0
        if ((word32)*pOffset + offset > WOLFSSL_MAX_16BIT) {
16151
0
            WOLFSSL_MSG("TLSX_Write total extensions length exceeds word16");
16152
0
            return BUFFER_E;
16153
0
        }
16154
0
        *pOffset += (word16)offset;
16155
0
    }
16156
16157
0
    return ret;
16158
0
}
16159
16160
#ifdef HAVE_SUPPORTED_CURVES
16161
16162
/* Populates the default supported groups / curves */
16163
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
16164
{
16165
    int ret = WOLFSSL_SUCCESS;
16166
#ifdef WOLFSSL_TLS13
16167
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16168
    if (ssl->options.resuming && ssl->session->namedGroup != 0) {
16169
        return TLSX_UseSupportedCurve(extensions, ssl->session->namedGroup,
16170
                                                  ssl->heap, ssl->options.side);
16171
    }
16172
#endif
16173
16174
    if (ssl->numGroups != 0) {
16175
        int i;
16176
        for (i = 0; i < ssl->numGroups; i++) {
16177
            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap,
16178
                                                             ssl->options.side);
16179
            if (ret != WOLFSSL_SUCCESS)
16180
                return ret;
16181
        }
16182
        return WOLFSSL_SUCCESS;
16183
    }
16184
#endif /* WOLFSSL_TLS13 */
16185
16186
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
16187
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS)
16188
    /* Prefer non-experimental PQ/T hybrid groups (only for TLS 1.3) */
16189
    if (IsAtLeastTLSv1_3(ssl->version) &&
16190
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16191
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
16192
        ECC_MIN_KEY_SZ <= 256
16193
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM768,
16194
            ssl->heap, ssl->options.side);
16195
        if (ret != WOLFSSL_SUCCESS) return ret;
16196
    #endif
16197
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
16198
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
16199
        ECC_MIN_KEY_SZ <= 384
16200
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM1024,
16201
            ssl->heap, ssl->options.side);
16202
        if (ret != WOLFSSL_SUCCESS) return ret;
16203
    #endif
16204
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
16205
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
16206
        ECC_MIN_KEY_SZ <= 256
16207
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM768,
16208
            ssl->heap, ssl->options.side);
16209
        if (ret != WOLFSSL_SUCCESS) return ret;
16210
    #endif
16211
    }
16212
#endif
16213
16214
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
16215
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_1024) && \
16216
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
16217
    if (IsAtLeastTLSv1_3(ssl->version) &&
16218
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16219
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
16220
                                     ssl->heap, ssl->options.side);
16221
        if (ret != WOLFSSL_SUCCESS) return ret;
16222
    }
16223
#endif
16224
16225
#if defined(HAVE_ECC)
16226
    /* list in order by strength, since not all servers choose by strength */
16227
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
16228
        #ifndef NO_ECC_SECP
16229
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP521R1,
16230
                                     ssl->heap, ssl->options.side);
16231
        if (ret != WOLFSSL_SUCCESS) return ret;
16232
        #endif
16233
    #endif
16234
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
16235
        #ifdef HAVE_ECC_BRAINPOOL
16236
        if (IsAtLeastTLSv1_3(ssl->version)) {
16237
            /* TLS 1.3 BrainpoolP512 curve */
16238
            ret = TLSX_UseSupportedCurve(extensions,
16239
                WOLFSSL_ECC_BRAINPOOLP512R1TLS13, ssl->heap, ssl->options.side);
16240
            if (ret != WOLFSSL_SUCCESS) return ret;
16241
16242
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
16243
            if (ssl->options.downgrade &&
16244
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
16245
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
16246
                ret = TLSX_UseSupportedCurve(extensions,
16247
                    WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap, ssl->options.side);
16248
                if (ret != WOLFSSL_SUCCESS) return ret;
16249
            }
16250
        }
16251
        else {
16252
            /* TLS 1.2 only */
16253
            ret = TLSX_UseSupportedCurve(extensions,
16254
                WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap, ssl->options.side);
16255
            if (ret != WOLFSSL_SUCCESS) return ret;
16256
        }
16257
        #endif
16258
    #endif
16259
#endif
16260
16261
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16262
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_768) && \
16263
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
16264
    if (IsAtLeastTLSv1_3(ssl->version) &&
16265
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16266
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
16267
                                     ssl->heap, ssl->options.side);
16268
        if (ret != WOLFSSL_SUCCESS) return ret;
16269
    }
16270
#endif
16271
16272
#if defined(HAVE_ECC)
16273
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
16274
        #ifndef NO_ECC_SECP
16275
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP384R1,
16276
            ssl->heap, ssl->options.side);
16277
        if (ret != WOLFSSL_SUCCESS) return ret;
16278
        #endif
16279
        #ifdef HAVE_ECC_BRAINPOOL
16280
        if (IsAtLeastTLSv1_3(ssl->version)) {
16281
            /* TLS 1.3 BrainpoolP384 curve */
16282
            ret = TLSX_UseSupportedCurve(extensions,
16283
                WOLFSSL_ECC_BRAINPOOLP384R1TLS13, ssl->heap, ssl->options.side);
16284
            if (ret != WOLFSSL_SUCCESS) return ret;
16285
16286
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
16287
            if (ssl->options.downgrade &&
16288
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
16289
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
16290
                ret = TLSX_UseSupportedCurve(extensions,
16291
                    WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap, ssl->options.side);
16292
                if (ret != WOLFSSL_SUCCESS) return ret;
16293
            }
16294
        }
16295
        else {
16296
            /* TLS 1.2 only */
16297
            ret = TLSX_UseSupportedCurve(extensions,
16298
                WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap, ssl->options.side);
16299
            if (ret != WOLFSSL_SUCCESS) return ret;
16300
        }
16301
        #endif
16302
    #endif
16303
#endif /* HAVE_ECC */
16304
16305
#ifndef HAVE_FIPS
16306
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
16307
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_X448, ssl->heap,
16308
            ssl->options.side);
16309
        if (ret != WOLFSSL_SUCCESS) return ret;
16310
    #endif
16311
#endif /* HAVE_FIPS */
16312
16313
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16314
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_512) && \
16315
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
16316
    if (IsAtLeastTLSv1_3(ssl->version) &&
16317
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16318
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512, ssl->heap,
16319
            ssl->options.side);
16320
        if (ret != WOLFSSL_SUCCESS) return ret;
16321
    }
16322
#endif
16323
16324
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
16325
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
16326
        #ifndef NO_ECC_SECP
16327
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP256R1,
16328
            ssl->heap, ssl->options.side);
16329
        if (ret != WOLFSSL_SUCCESS) return ret;
16330
        #endif
16331
        #ifdef HAVE_ECC_KOBLITZ
16332
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP256K1,
16333
            ssl->heap, ssl->options.side);
16334
        if (ret != WOLFSSL_SUCCESS) return ret;
16335
        #endif
16336
        #ifdef HAVE_ECC_BRAINPOOL
16337
        if (IsAtLeastTLSv1_3(ssl->version)) {
16338
            /* TLS 1.3 BrainpoolP256 curve */
16339
            ret = TLSX_UseSupportedCurve(extensions,
16340
                WOLFSSL_ECC_BRAINPOOLP256R1TLS13, ssl->heap, ssl->options.side);
16341
            if (ret != WOLFSSL_SUCCESS) return ret;
16342
16343
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
16344
            if (ssl->options.downgrade &&
16345
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
16346
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
16347
                ret = TLSX_UseSupportedCurve(extensions,
16348
                    WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap, ssl->options.side);
16349
                if (ret != WOLFSSL_SUCCESS) return ret;
16350
            }
16351
        }
16352
        else {
16353
            /* TLS 1.2 only */
16354
            ret = TLSX_UseSupportedCurve(extensions,
16355
                WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap, ssl->options.side);
16356
            if (ret != WOLFSSL_SUCCESS) return ret;
16357
        }
16358
        #endif
16359
        #if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
16360
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SM2P256V1,
16361
            ssl->heap, ssl->options.side);
16362
        if (ret != WOLFSSL_SUCCESS) return ret;
16363
        #endif
16364
    #endif
16365
#endif /* HAVE_ECC */
16366
16367
#ifndef HAVE_FIPS
16368
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
16369
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_X25519,
16370
            ssl->heap, ssl->options.side);
16371
        if (ret != WOLFSSL_SUCCESS) return ret;
16372
    #endif
16373
#endif /* HAVE_FIPS */
16374
16375
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
16376
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
16377
        #ifndef NO_ECC_SECP
16378
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP224R1,
16379
            ssl->heap, ssl->options.side);
16380
        if (ret != WOLFSSL_SUCCESS) return ret;
16381
        #endif
16382
        #ifdef HAVE_ECC_KOBLITZ
16383
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP224K1,
16384
            ssl->heap, ssl->options.side);
16385
        if (ret != WOLFSSL_SUCCESS) return ret;
16386
        #endif
16387
    #endif
16388
16389
    #ifndef HAVE_FIPS
16390
        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
16391
            #ifndef NO_ECC_SECP
16392
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP192R1,
16393
                    ssl->heap, ssl->options.side);
16394
                if (ret != WOLFSSL_SUCCESS) return ret;
16395
            #endif
16396
            #ifdef HAVE_ECC_KOBLITZ
16397
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP192K1,
16398
                    ssl->heap, ssl->options.side);
16399
                if (ret != WOLFSSL_SUCCESS) return ret;
16400
            #endif
16401
        #endif
16402
        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
16403
            #ifndef NO_ECC_SECP
16404
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP160R1,
16405
                    ssl->heap, ssl->options.side);
16406
                if (ret != WOLFSSL_SUCCESS) return ret;
16407
            #endif
16408
            #ifdef HAVE_ECC_SECPR2
16409
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP160R2,
16410
                    ssl->heap, ssl->options.side);
16411
                if (ret != WOLFSSL_SUCCESS) return ret;
16412
            #endif
16413
            #ifdef HAVE_ECC_KOBLITZ
16414
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP160K1,
16415
                    ssl->heap, ssl->options.side);
16416
                if (ret != WOLFSSL_SUCCESS) return ret;
16417
            #endif
16418
        #endif
16419
    #endif /* HAVE_FIPS */
16420
#endif /* HAVE_ECC */
16421
16422
#ifndef NO_DH
16423
        /* Add FFDHE supported groups. */
16424
    #ifdef HAVE_FFDHE_8192
16425
        if (8192/8 >= ssl->options.minDhKeySz &&
16426
                                        8192/8 <= ssl->options.maxDhKeySz) {
16427
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_8192,
16428
                ssl->heap, ssl->options.side);
16429
            if (ret != WOLFSSL_SUCCESS)
16430
                return ret;
16431
        }
16432
    #endif
16433
    #ifdef HAVE_FFDHE_6144
16434
        if (6144/8 >= ssl->options.minDhKeySz &&
16435
                                        6144/8 <= ssl->options.maxDhKeySz) {
16436
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_6144,
16437
                ssl->heap, ssl->options.side);
16438
            if (ret != WOLFSSL_SUCCESS)
16439
                return ret;
16440
        }
16441
    #endif
16442
    #ifdef HAVE_FFDHE_4096
16443
        if (4096/8 >= ssl->options.minDhKeySz &&
16444
                                        4096/8 <= ssl->options.maxDhKeySz) {
16445
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_4096,
16446
                ssl->heap, ssl->options.side);
16447
            if (ret != WOLFSSL_SUCCESS)
16448
                return ret;
16449
        }
16450
    #endif
16451
    #ifdef HAVE_FFDHE_3072
16452
        if (3072/8 >= ssl->options.minDhKeySz &&
16453
                                        3072/8 <= ssl->options.maxDhKeySz) {
16454
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_3072,
16455
                ssl->heap, ssl->options.side);
16456
            if (ret != WOLFSSL_SUCCESS)
16457
                return ret;
16458
        }
16459
    #endif
16460
    #ifdef HAVE_FFDHE_2048
16461
        if (2048/8 >= ssl->options.minDhKeySz &&
16462
                                        2048/8 <= ssl->options.maxDhKeySz) {
16463
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_2048,
16464
                ssl->heap, ssl->options.side);
16465
            if (ret != WOLFSSL_SUCCESS)
16466
                return ret;
16467
        }
16468
    #endif
16469
#endif
16470
16471
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16472
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
16473
    if (IsAtLeastTLSv1_3(ssl->version) &&
16474
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16475
#if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
16476
    (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
16477
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP521R1MLKEM1024,
16478
                                     ssl->heap, ssl->options.side);
16479
        if (ret != WOLFSSL_SUCCESS) return ret;
16480
#endif
16481
#if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
16482
    (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
16483
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM768,
16484
                                     ssl->heap, ssl->options.side);
16485
        if (ret != WOLFSSL_SUCCESS) return ret;
16486
#endif
16487
#if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE448) && \
16488
    ECC_MIN_KEY_SZ <= 448
16489
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448MLKEM768,
16490
                                     ssl->heap, ssl->options.side);
16491
        if (ret != WOLFSSL_SUCCESS) return ret;
16492
#endif
16493
#if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_ECC) && \
16494
    (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
16495
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM512,
16496
                                     ssl->heap, ssl->options.side);
16497
        if (ret != WOLFSSL_SUCCESS) return ret;
16498
#endif
16499
#if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_CURVE25519) && \
16500
    ECC_MIN_KEY_SZ <= 256
16501
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM512,
16502
                                     ssl->heap, ssl->options.side);
16503
        if (ret != WOLFSSL_SUCCESS) return ret;
16504
#endif
16505
    }
16506
#endif
16507
16508
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16509
    defined(WOLFSSL_MLKEM_KYBER)
16510
    if (IsAtLeastTLSv1_3(ssl->version) &&
16511
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16512
#ifdef WOLFSSL_KYBER1024
16513
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
16514
                                     ssl->heap, ssl->options.side);
16515
        if (ret != WOLFSSL_SUCCESS) return ret;
16516
#if defined(HAVE_ECC) && (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
16517
    ECC_MIN_KEY_SZ <= 521
16518
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
16519
                                     ssl->heap, ssl->options.side);
16520
        if (ret != WOLFSSL_SUCCESS) return ret;
16521
#endif
16522
#endif
16523
#ifdef WOLFSSL_KYBER768
16524
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
16525
                                     ssl->heap, ssl->options.side);
16526
        if (ret != WOLFSSL_SUCCESS) return ret;
16527
#if defined(HAVE_ECC) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
16528
        ECC_MIN_KEY_SZ <= 384
16529
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
16530
                                     ssl->heap, ssl->options.side);
16531
        if (ret != WOLFSSL_SUCCESS) return ret;
16532
#endif
16533
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
16534
    ECC_MIN_KEY_SZ <= 256
16535
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
16536
                                     ssl->heap, ssl->options.side);
16537
        if (ret != WOLFSSL_SUCCESS) return ret;
16538
#endif
16539
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
16540
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
16541
                                     ssl->heap, ssl->options.side);
16542
        if (ret != WOLFSSL_SUCCESS) return ret;
16543
#endif
16544
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
16545
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
16546
                                     ssl->heap, ssl->options.side);
16547
        if (ret != WOLFSSL_SUCCESS) return ret;
16548
#endif
16549
#endif
16550
#ifdef WOLFSSL_KYBER512
16551
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1,
16552
                                     ssl->heap, ssl->options.side);
16553
        if (ret != WOLFSSL_SUCCESS) return ret;
16554
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
16555
    ECC_MIN_KEY_SZ <= 256
16556
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
16557
                                     ssl->heap, ssl->options.side);
16558
        if (ret != WOLFSSL_SUCCESS) return ret;
16559
#endif
16560
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
16561
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
16562
                                     ssl->heap, ssl->options.side);
16563
        if (ret != WOLFSSL_SUCCESS) return ret;
16564
#endif
16565
#endif
16566
    }
16567
#endif
16568
16569
    (void)ssl;
16570
    (void)extensions;
16571
16572
    return ret;
16573
}
16574
16575
#endif /* HAVE_SUPPORTED_CURVES */
16576
16577
int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
16578
0
{
16579
0
    int ret = 0;
16580
0
    byte* public_key      = NULL;
16581
0
    word16 public_key_len = 0;
16582
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
16583
    int usingPSK = 0;
16584
#endif
16585
0
#if defined(HAVE_SUPPORTED_CURVES) && defined(WOLFSSL_TLS13)
16586
0
    TLSX* extension = NULL;
16587
0
    word16 namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
16588
0
#endif
16589
16590
    /* server will add extension depending on what is parsed from client */
16591
0
    if (!isServer) {
16592
#if defined(HAVE_RPK)
16593
        ret = TLSX_ClientCertificateType_Use(ssl, isServer);
16594
        if (ret != 0)
16595
            return ret;
16596
16597
        ret = TLSX_ServerCertificateType_Use(ssl, isServer);
16598
        if (ret != 0)
16599
            return ret;
16600
#endif /* HAVE_RPK */
16601
16602
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) && \
16603
0
    !defined(WOLFSSL_NO_TLS12)
16604
0
        if (!ssl->options.disallowEncThenMac) {
16605
0
            ret = TLSX_EncryptThenMac_Use(ssl);
16606
0
            if (ret != 0)
16607
0
                return ret;
16608
0
        }
16609
0
#endif
16610
16611
0
#if defined(HAVE_SUPPORTED_CURVES)
16612
0
        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
16613
0
            if (TLSX_Find(ssl->ctx->extensions,
16614
0
                                               TLSX_SUPPORTED_GROUPS) == NULL) {
16615
0
                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
16616
0
                if (ret != WOLFSSL_SUCCESS)
16617
0
                    return ret;
16618
0
            }
16619
0
        }
16620
0
    #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
16621
0
        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
16622
0
               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
16623
0
               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
16624
0
            ret = TLSX_UsePointFormat(&ssl->extensions,
16625
0
                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
16626
0
            if (ret != WOLFSSL_SUCCESS)
16627
0
                return ret;
16628
0
        }
16629
0
    #endif
16630
0
#endif /* HAVE_SUPPORTED_CURVES */
16631
16632
#ifdef WOLFSSL_SRTP
16633
        if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
16634
            WOLFSSL_MSG("Adding DTLS SRTP extension");
16635
            if ((ret = TLSX_UseSRTP(&ssl->extensions, ssl->dtlsSrtpProfiles,
16636
                                                                ssl->heap)) != 0) {
16637
                return ret;
16638
            }
16639
        }
16640
#endif
16641
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
16642
        if ((IsAtLeastTLSv1_3(ssl->version)) && (ssl->sigSpec != NULL)) {
16643
            WOLFSSL_MSG("Adding CKS extension");
16644
            if ((ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap)) != 0) {
16645
                return ret;
16646
            }
16647
        }
16648
#endif
16649
0
    } /* is not server */
16650
16651
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16652
0
    WOLFSSL_MSG("Adding signature algorithms extension");
16653
0
    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
16654
0
                                                                         != 0) {
16655
0
            return ret;
16656
0
    }
16657
#else
16658
    ret = 0;
16659
#endif
16660
0
#ifdef WOLFSSL_TLS13
16661
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16662
        if (IsAtLeastTLSv1_3(ssl->version) &&
16663
                TLSX_CA_Names_Count(ssl) > 0) {
16664
            WOLFSSL_MSG("Adding certificate authorities extension");
16665
            if ((ret = TLSX_Push(&ssl->extensions,
16666
                    TLSX_CERTIFICATE_AUTHORITIES, ssl, ssl->heap)) != 0) {
16667
                    return ret;
16668
            }
16669
        }
16670
    #endif
16671
0
        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
16672
            /* Add mandatory TLS v1.3 extension: supported version */
16673
0
            WOLFSSL_MSG("Adding supported versions extension");
16674
0
            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
16675
0
                                                             ssl->heap)) != 0) {
16676
0
                return ret;
16677
0
            }
16678
16679
0
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16680
0
            if (ssl->certHashSigAlgoSz > 0) {
16681
0
                WOLFSSL_MSG("Adding signature algorithms cert extension");
16682
0
                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
16683
0
                                                        ssl, ssl->heap)) != 0) {
16684
0
                    return ret;
16685
0
                }
16686
0
            }
16687
0
        #endif
16688
16689
0
        #if defined(HAVE_SUPPORTED_CURVES)
16690
0
            extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
16691
0
            if (extension == NULL) {
16692
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16693
                if (ssl->options.resuming && ssl->session->namedGroup != 0)
16694
                    namedGroup = ssl->session->namedGroup;
16695
                else
16696
            #endif
16697
0
                if (ssl->numGroups > 0) {
16698
0
                    int set = 0;
16699
0
                    int i, j;
16700
16701
                    /* Find the first element of ssl->group[] that is also
16702
                     * present in preferredGroup[]. The user's ranking wins;
16703
                     * if nothing intersects, send no key share and let the
16704
                     * server drive group selection via HRR. */
16705
0
                    namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
16706
0
                    for (i = 0; i < ssl->numGroups && !set; i++) {
16707
0
                        for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
16708
0
                            if (preferredGroup[j] == ssl->group[i]) {
16709
0
                                namedGroup = ssl->group[i];
16710
0
                                set = 1;
16711
0
                                break;
16712
0
                            }
16713
0
                        }
16714
0
                    }
16715
0
                }
16716
0
                else {
16717
                    /* Choose the most preferred group. */
16718
0
                    namedGroup = WOLFSSL_KEY_SHARE_DEFAULT_GROUP;
16719
0
                }
16720
0
            }
16721
0
            else {
16722
0
                KeyShareEntry* kse = (KeyShareEntry*)extension->data;
16723
0
                if (kse)
16724
0
                    namedGroup = kse->group;
16725
0
            }
16726
0
            if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
16727
0
                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
16728
0
                        &ssl->extensions);
16729
0
            }
16730
0
            else {
16731
                /* No suitable key share group found, send no key share to
16732
                 * trigger a HRR with the server's preferred group. */
16733
0
                WOLFSSL_MSG("Sending no key share to trigger HRR");
16734
0
                ret = TLSX_KeyShare_Empty(ssl);
16735
0
            }
16736
0
            if (ret != 0)
16737
0
                return ret;
16738
0
        #endif /* HAVE_SUPPORTED_CURVES */
16739
16740
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16741
            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
16742
        #endif
16743
        #if defined(HAVE_SESSION_TICKET)
16744
            if (ssl->options.resuming && ssl->session->ticketLen > 0
16745
        #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
16746
                && !ssl->options.certWithExternPsk
16747
        #endif
16748
            ) {
16749
                WOLFSSL_SESSION* sess = ssl->session;
16750
            #ifdef WOLFSSL_32BIT_MILLI_TIME
16751
                word32 now, milli;
16752
            #else
16753
                word64 now, milli;
16754
            #endif
16755
16756
                /* Determine the MAC algorithm for the cipher suite used. */
16757
                ssl->options.cipherSuite0 = sess->cipherSuite0;
16758
                ssl->options.cipherSuite  = sess->cipherSuite;
16759
                ret = SetCipherSpecs(ssl);
16760
                if (ret != 0)
16761
                    return ret;
16762
                now = (word64)TimeNowInMilliseconds();
16763
                if (now == 0)
16764
                    return GETTIME_ERROR;
16765
            #ifdef WOLFSSL_32BIT_MILLI_TIME
16766
                if (now < sess->ticketSeen)
16767
                    milli = (0xFFFFFFFFU - sess->ticketSeen) + 1 + now;
16768
                else
16769
                    milli = now - sess->ticketSeen;
16770
                milli += sess->ticketAdd;
16771
16772
                /* Pre-shared key is mandatory extension for resumption. */
16773
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
16774
                    sess->ticketLen, milli, ssl->specs.mac_algorithm,
16775
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
16776
                    NULL, ssl->heap);
16777
            #else
16778
                milli = now - sess->ticketSeen + sess->ticketAdd;
16779
16780
                /* Pre-shared key is mandatory extension for resumption. */
16781
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
16782
                    sess->ticketLen, (word32)milli, ssl->specs.mac_algorithm,
16783
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
16784
                    NULL, ssl->heap);
16785
            #endif
16786
                if (ret != 0)
16787
                    return ret;
16788
16789
                usingPSK = 1;
16790
            }
16791
        #endif
16792
    #ifndef NO_PSK
16793
        #ifndef WOLFSSL_PSK_ONE_ID
16794
            if (ssl->options.client_psk_cs_cb != NULL) {
16795
                int i;
16796
                const Suites* suites = WOLFSSL_SUITES(ssl);
16797
                for (i = 0; i < suites->suiteSz; i += 2) {
16798
                    byte cipherSuite0 = suites->suites[i + 0];
16799
                    byte cipherSuite = suites->suites[i + 1];
16800
                    unsigned int keySz;
16801
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16802
                    int cnt = 0;
16803
                #endif
16804
16805
                #ifdef HAVE_NULL_CIPHER
16806
                    if (cipherSuite0 == ECC_BYTE ||
16807
                        cipherSuite0 == ECDHE_PSK_BYTE) {
16808
                        if (cipherSuite != TLS_SHA256_SHA256 &&
16809
                                             cipherSuite != TLS_SHA384_SHA384) {
16810
                            continue;
16811
                        }
16812
                    }
16813
                    else
16814
                #endif
16815
                #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
16816
                    defined(WOLFSSL_SM3)
16817
                    if (cipherSuite0 == CIPHER_BYTE) {
16818
                        if ((cipherSuite != TLS_SM4_GCM_SM3) &&
16819
                            (cipherSuite != TLS_SM4_CCM_SM3)) {
16820
                            continue;
16821
                        }
16822
                    }
16823
                    else
16824
                #endif
16825
                    if (cipherSuite0 != TLS13_BYTE)
16826
                        continue;
16827
16828
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16829
                    do {
16830
                        ssl->arrays->client_identity[0] = cnt;
16831
                #endif
16832
16833
                        ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
16834
                        keySz = ssl->options.client_psk_cs_cb(
16835
                            ssl, ssl->arrays->server_hint,
16836
                            ssl->arrays->client_identity, MAX_PSK_ID_LEN,
16837
                            ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
16838
                            GetCipherNameInternal(cipherSuite0, cipherSuite));
16839
                        if (keySz > 0) {
16840
                            ssl->arrays->psk_keySz = keySz;
16841
                            ret = TLSX_PreSharedKey_Use(&ssl->extensions,
16842
                                (byte*)ssl->arrays->client_identity,
16843
                                (word16)XSTRLEN(ssl->arrays->client_identity),
16844
                                0, SuiteMac(WOLFSSL_SUITES(ssl)->suites + i),
16845
                                cipherSuite0, cipherSuite, 0, NULL, ssl->heap);
16846
                            if (ret != 0)
16847
                                return ret;
16848
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16849
                            cnt++;
16850
                #endif
16851
                        }
16852
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16853
                    }
16854
                    while (keySz > 0);
16855
                #endif
16856
                }
16857
16858
                usingPSK = 1;
16859
            }
16860
            else
16861
        #endif
16862
            if (ssl->options.client_psk_cb != NULL ||
16863
                ssl->options.client_psk_tls13_cb != NULL) {
16864
                /* Default cipher suite. */
16865
                byte cipherSuite0 = TLS13_BYTE;
16866
                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
16867
                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
16868
                const char* cipherName = NULL;
16869
16870
                if (ssl->options.client_psk_tls13_cb != NULL) {
16871
                    ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
16872
                        ssl, ssl->arrays->server_hint,
16873
                        ssl->arrays->client_identity, MAX_PSK_ID_LEN,
16874
                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
16875
                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
16876
                            &cipherSuite, NULL, NULL, &cipherSuiteFlags) != 0) {
16877
                        return PSK_KEY_ERROR;
16878
                    }
16879
                }
16880
                else {
16881
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
16882
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
16883
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
16884
                }
16885
                if (
16886
                #ifdef OPENSSL_EXTRA
16887
                    /* OpenSSL treats a PSK key length of 0
16888
                     * to indicate no PSK available.
16889
                     */
16890
                    ssl->arrays->psk_keySz == 0 ||
16891
                #endif
16892
                         (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
16893
                     (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
16894
                #ifndef OPENSSL_EXTRA
16895
                    ret = PSK_KEY_ERROR;
16896
                #endif
16897
                }
16898
                else {
16899
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
16900
16901
                    ssl->options.cipherSuite0 = cipherSuite0;
16902
                    ssl->options.cipherSuite  = cipherSuite;
16903
                    (void)cipherSuiteFlags;
16904
                    ret = SetCipherSpecs(ssl);
16905
                    if (ret == 0) {
16906
                        ret = TLSX_PreSharedKey_Use(
16907
                            &ssl->extensions,
16908
                                     (byte*)ssl->arrays->client_identity,
16909
                            (word16)XSTRLEN(ssl->arrays->client_identity),
16910
                            0, ssl->specs.mac_algorithm,
16911
                            cipherSuite0, cipherSuite, 0,
16912
                            NULL, ssl->heap);
16913
                    }
16914
                    if (ret == 0)
16915
                        usingPSK = 1;
16916
                }
16917
                if (ret != 0)
16918
                    return ret;
16919
            }
16920
    #endif /* !NO_PSK */
16921
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16922
16923
            /* Some servers do not generate session tickets unless
16924
             * the extension is seen in a non-resume client hello.
16925
             * We used to send it only if we were otherwise using PSK.
16926
             * Now always send it. Define NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
16927
             * to revert to the old behaviour. */
16928
            #ifdef NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
16929
            if (usingPSK)
16930
            #endif
16931
            {
16932
                byte modes = 0;
16933
16934
                (void)usingPSK;
16935
                /* Pre-shared key modes: mandatory extension for resumption. */
16936
            #ifdef HAVE_SUPPORTED_CURVES
16937
                if (!ssl->options.onlyPskDheKe)
16938
            #endif
16939
                {
16940
                    modes = 1 << PSK_KE;
16941
                }
16942
            #if !defined(NO_DH) || defined(HAVE_ECC) || \
16943
                          defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
16944
                          (defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
16945
                           !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE))
16946
                if (!ssl->options.noPskDheKe) {
16947
                    modes |= 1 << PSK_DHE_KE;
16948
                }
16949
            #endif
16950
            #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
16951
                if (ssl->options.certWithExternPsk) {
16952
                    /* RFC 9973 requires psk_dhe_ke with cert_with_extern_psk. */
16953
                    modes |= 1 << PSK_DHE_KE;
16954
                }
16955
            #endif
16956
                ret = TLSX_PskKeyModes_Use(ssl, modes);
16957
                if (ret != 0)
16958
                    return ret;
16959
            }
16960
16961
        #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
16962
            if (usingPSK && ssl->options.certWithExternPsk) {
16963
                ret = TLSX_CertWithExternPsk_Use(ssl);
16964
                if (ret != 0)
16965
                    return ret;
16966
                /* Require server confirmation before using cert-with-PSK path. */
16967
                ssl->options.certWithExternPsk = 0;
16968
            }
16969
        #endif
16970
        #endif
16971
        #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
16972
            if (!isServer && ssl->options.postHandshakeAuth) {
16973
                ret = TLSX_PostHandAuth_Use(ssl);
16974
                if (ret != 0)
16975
                    return ret;
16976
            }
16977
        #endif
16978
#if defined(HAVE_ECH)
16979
            /* GREASE ECH */
16980
            if (!ssl->options.disableECH) {
16981
                if (ssl->echConfigs == NULL) {
16982
                    ret = GREASE_ECH_USE(&(ssl->extensions), ssl->heap,
16983
                            ssl->rng);
16984
                }
16985
                else if (ssl->echConfigs != NULL) {
16986
                    ret = ECH_USE(ssl->echConfigs, &(ssl->extensions),
16987
                            ssl->heap, ssl->rng);
16988
                }
16989
            }
16990
#endif
16991
0
        }
16992
#if defined(HAVE_ECH)
16993
        else if (IsAtLeastTLSv1_3(ssl->version)) {
16994
            if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
16995
                ret = SERVER_ECH_USE(&(ssl->extensions), ssl->heap,
16996
                    ssl->ctx->echConfigs);
16997
16998
                if (ret == 0)
16999
                    TLSX_SetResponse(ssl, TLSX_ECH);
17000
            }
17001
        }
17002
#endif
17003
17004
0
#endif
17005
17006
0
    (void)isServer;
17007
0
    (void)public_key;
17008
0
    (void)public_key_len;
17009
0
    (void)ssl;
17010
17011
0
    return ret;
17012
0
}
17013
17014
17015
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
17016
17017
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
17018
/* Returns 1 if the extensions should be hidden for this write */
17019
static int TLSX_EchShouldHideInner(WOLFSSL_ECH* ech)
17020
{
17021
    return ech != NULL && ech->type == ECH_TYPE_OUTER &&
17022
        ech->state != ECH_WRITE_GREASE;
17023
}
17024
17025
/* Swap matching extension types between *sslExts and *echExts.
17026
 *   Non-matched extensions in *echExts are appended to the tail of *sslExts
17027
 *
17028
 * Extensions are stored in reverse wire order, so non-matched extensions are
17029
 * appended to the tail rather than the head; this avoids displacing the leading
17030
 * extension (e.g. pre_shared_key, which must stay last on the wire).
17031
 *
17032
 * *appended is in/out:
17033
 *  in  -> number of trailing extensions to move from *sslExts to *echExts
17034
 *  out -> the number of extensions appended to the tail of *sslExts
17035
 *
17036
 * Returns 0 on success, error otherwise. */
17037
WOLFSSL_TEST_VIS int TLSX_EchSwapExtensions(TLSX** sslExts, TLSX** echExts,
17038
    word16* appended)
17039
{
17040
    TLSX* chunk = NULL;
17041
    TLSX* node;
17042
    TLSX* outer;
17043
    TLSX* inner;
17044
    TLSX** outerLink;
17045
    TLSX** innerLink;
17046
    TLSX** sslTail;
17047
    word16 len = 0;
17048
17049
    if (*appended > 0) {
17050
        for (node = *sslExts; node != NULL; node = node->next)
17051
            len++;
17052
        if (*appended >= len)
17053
            return BAD_FUNC_ARG;
17054
        sslTail = sslExts;
17055
        while (len > *appended) {
17056
            sslTail = &(*sslTail)->next;
17057
            len--;
17058
        }
17059
        chunk = *sslTail;
17060
        *sslTail = NULL;
17061
    }
17062
17063
    *appended = 0;
17064
17065
    outerLink = echExts;
17066
    while (*outerLink != NULL) {
17067
        innerLink = sslExts;
17068
        outer = *outerLink;
17069
17070
        while (*innerLink != NULL && (*innerLink)->type != outer->type)
17071
            innerLink = &(*innerLink)->next;
17072
17073
        if (*innerLink != NULL) {
17074
            inner = *innerLink;
17075
17076
            *innerLink  = outer;
17077
            *outerLink  = inner;
17078
            node        = outer->next;
17079
            outer->next = inner->next;
17080
            inner->next = node;
17081
17082
            outerLink = &inner->next;
17083
        }
17084
        else {
17085
            *outerLink  = outer->next;
17086
            *innerLink  = outer;
17087
            outer->next = NULL;
17088
            *appended   += 1;
17089
        }
17090
    }
17091
17092
    /* outerLink is at the tail of *echExts; append the chunk */
17093
    *outerLink = chunk;
17094
17095
    return 0;
17096
}
17097
17098
/* sets installed if extensions were concealed, clears it otherwise.
17099
 * updates appended with the number of extensions appended.
17100
 * returns 0 on success, error otherwise */
17101
static int TLSX_EchConcealExtensions(WOLFSSL* ssl, WOLFSSL_ECH* ech,
17102
    word16* appended, int* installed)
17103
{
17104
    int ret = 0;
17105
17106
    *installed = 0;
17107
    *appended = 0;
17108
    if (TLSX_EchShouldHideInner(ech)) {
17109
        ret = TLSX_EchSwapExtensions(&ssl->extensions, &ech->extensions,
17110
                appended);
17111
        if (ret == 0)
17112
            *installed = 1;
17113
    }
17114
17115
    return ret;
17116
}
17117
17118
/* reverses TLSX_EchConcealExtensions
17119
 * returns 0 on success, error otherwise */
17120
static int TLSX_EchExposeExtensions(WOLFSSL* ssl, WOLFSSL_ECH* ech,
17121
    word16 appended, int installed)
17122
{
17123
    int ret = 0;
17124
17125
    if (installed) {
17126
        /* this is expected to always succeed, but in the case that it does not
17127
         * the handshake should be aborted and the ssl should not be reused. */
17128
        ret = TLSX_EchSwapExtensions(&ssl->extensions, &ech->extensions,
17129
            &appended);
17130
        if (ret == 0 && appended != 0) {
17131
            WOLFSSL_MSG("Bad restore with TLSX_EchSwapExtensions");
17132
            ret = BAD_STATE_E;
17133
        }
17134
    }
17135
17136
    return ret;
17137
}
17138
17139
/* If ECH is accepted, delete ech->extensions
17140
 * If rejected, replace matching ssl->extensions with ech->extensions,
17141
 *   appending to the tail if necessary */
17142
int TLSX_EchReplaceExtensions(WOLFSSL* ssl, byte accepted)
17143
{
17144
    int ret = 0;
17145
    TLSX* echX;
17146
    WOLFSSL_ECH* ech;
17147
    word16 appended = 0;
17148
17149
    echX = TLSX_Find(ssl->extensions, TLSX_ECH);
17150
    if (echX == NULL || echX->data == NULL)
17151
        return 0;
17152
    ech = (WOLFSSL_ECH*)echX->data;
17153
17154
    if (!accepted)
17155
        ret = TLSX_EchSwapExtensions(&ssl->extensions, &ech->extensions,
17156
            &appended);
17157
17158
    if (ret == 0) {
17159
        TLSX_FreeAll(ech->extensions, ssl->heap);
17160
        ech->extensions = NULL;
17161
    }
17162
17163
    return ret;
17164
}
17165
17166
/* Returns 1 if the extension may be encoded into ech_outer_extensions,
17167
 * 0 otherwise */
17168
static int TLSX_ECH_IsEncodable(word16 type)
17169
{
17170
    /* supported_versions being here prevents the inner hello from advertising
17171
     * a version less than TLS1.3 */
17172
    switch (type) {
17173
        case TLSX_SERVER_NAME:
17174
        case TLSX_APPLICATION_LAYER_PROTOCOL:
17175
        case TLSX_SUPPORTED_VERSIONS:
17176
        case TLSX_ECH:
17177
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17178
        case TLSX_PRE_SHARED_KEY:
17179
#endif
17180
#ifdef WOLFSSL_EARLY_DATA
17181
        case TLSX_EARLY_DATA:
17182
#endif
17183
            return 0;
17184
        default:
17185
            return 1;
17186
    }
17187
}
17188
17189
/* find extensions that can be encoded into ech_outer_extensions.
17190
 * If output is non-NULL, then write the encoded form.
17191
 *
17192
 * Layout of OuterExtensions (RFC 9849, S5.1):
17193
 *   2-byte extension_type + 2-byte extension_data length +
17194
 *   1-byte list length    + 2*count bytes of extension types
17195
 */
17196
static int TLSX_ECH_BuildOuterExtensions(WOLFSSL* ssl, const byte* semaphore,
17197
    byte msgType, byte* output, word16* pOffset, word16* outCount,
17198
    byte* encodeMask)
17199
{
17200
    TLSX* list;
17201
    TLSX* extension;
17202
    byte* typesStart = NULL;
17203
    int listIdx;
17204
    word16 count = 0;
17205
    byte isRequest = (msgType == client_hello ||
17206
                      msgType == certificate_request);
17207
    byte seen[SEMAPHORE_SIZE];
17208
17209
    /* backup semaphore so it can be aliased by encodeMask */
17210
    XMEMCPY(seen, semaphore, SEMAPHORE_SIZE);
17211
17212
    if (output != NULL && pOffset != NULL) {
17213
        typesStart = output + *pOffset
17214
                     + HELLO_EXT_TYPE_SZ + OPAQUE16_LEN + OPAQUE8_LEN;
17215
    }
17216
17217
    for (listIdx = 0; listIdx < 2; listIdx++) {
17218
        list = (listIdx == 0) ? ssl->extensions :
17219
            (ssl->ctx != NULL ? ssl->ctx->extensions : NULL);
17220
        for (extension = list; extension != NULL; extension = extension->next) {
17221
            word16 type = (word16)extension->type;
17222
            word16 semIdx = TLSX_ToSemaphore(type);
17223
17224
            /* OuterExtensions is <2..254>, so reference at most 127 types */
17225
            if (count >= 127) {
17226
                WOLFSSL_MSG("ECH: cannot encode more than 127 extensions");
17227
                break;
17228
            }
17229
17230
            if (!isRequest && !extension->resp)
17231
                continue;
17232
            if (!IS_OFF(seen, semIdx))
17233
                continue;
17234
            TURN_ON(seen, semIdx);
17235
            if (!TLSX_ECH_IsEncodable(type))
17236
                continue;
17237
17238
            if (typesStart != NULL)
17239
                c16toa(type, typesStart + count * OPAQUE16_LEN);
17240
            count++;
17241
            TURN_ON(encodeMask, semIdx);
17242
        }
17243
    }
17244
17245
    if (count > 0 && pOffset != NULL) {
17246
        word16 listLen = (word16)(OPAQUE16_LEN * count);
17247
        word16 blockSz = (word16)(HELLO_EXT_TYPE_SZ + OPAQUE16_LEN
17248
                                + OPAQUE8_LEN + listLen);
17249
        if ((word32)*pOffset + blockSz > WOLFSSL_MAX_16BIT) {
17250
            WOLFSSL_MSG("ECH OuterExtensions overflows extensions length");
17251
            return BUFFER_E;
17252
        }
17253
        if (output != NULL) {
17254
            byte* hdr = output + *pOffset;
17255
            c16toa(TLSXT_ECH_OUTER_EXTENSIONS, hdr);
17256
            c16toa((word16)(OPAQUE8_LEN + listLen), hdr + OPAQUE16_LEN);
17257
            hdr[OPAQUE16_LEN + OPAQUE16_LEN] = (byte)listLen;
17258
        }
17259
17260
        /* accumulate offset even if nothing is written */
17261
        *pOffset += blockSz;
17262
    }
17263
17264
    *outCount = count;
17265
    return 0;
17266
}
17267
17268
/* because the size of ech depends on the size of other extensions we need to
17269
 * get the size with ech special and process ech last, return status */
17270
static int TLSX_GetSizeWithEch(WOLFSSL* ssl, byte* semaphore, byte msgType,
17271
    word16* pLength)
17272
{
17273
    int ret = 0;
17274
    int retC;
17275
    int installed = 0;
17276
    TLSX* echX = NULL;
17277
    WOLFSSL_ECH* ech = NULL;
17278
    word16 count = 0;
17279
    word16 appended = 0;
17280
17281
    if (ssl->extensions)
17282
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
17283
    if (echX != NULL)
17284
        ech = (WOLFSSL_ECH*)echX->data;
17285
17286
    ret = retC = TLSX_EchConcealExtensions(ssl, ech, &appended, &installed);
17287
17288
    /* if encoding, then count encoded form of inner ClientHello.
17289
     * `semaphore` is in/out so encodable extensions will later be ignored */
17290
    if (ret == 0 &&
17291
            ech != NULL && ech->type == ECH_TYPE_INNER && ech->writeEncoded) {
17292
        ret = TLSX_ECH_BuildOuterExtensions(ssl, semaphore, msgType,
17293
            NULL, pLength, &count, semaphore);
17294
    }
17295
    if (ret == 0 && ssl->extensions)
17296
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, pLength);
17297
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions)
17298
        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, pLength);
17299
17300
    /* always try to restore extensions to a good state */
17301
    if (retC == 0)
17302
        retC = TLSX_EchExposeExtensions(ssl, ech, appended, installed);
17303
17304
    if (ret == 0)
17305
        ret = retC;
17306
    return ret;
17307
}
17308
#endif
17309
17310
#if defined(HAVE_TLS_EXTENSIONS) && defined(OPENSSL_EXTRA)
17311
/* OpenSSL-compatible application-defined ("custom") TLS extensions.
17312
 *
17313
 * Unlike the standard extensions above, custom extensions carry arbitrary
17314
 * IANA types chosen by the application, so they cannot live in the TLSX list
17315
 * (which keys every extension on a fixed semaphore index). They are kept in a
17316
 * separate list on the WOLFSSL_CTX and processed alongside the unknown
17317
 * extension handling. Only the client side, for TLS 1.2 and below, is wired up
17318
 * here, matching the legacy SSL_CTX_add_client_custom_ext() contract. */
17319
17320
/* Returns 1 if ext_type is an extension wolfSSL handles internally, which the
17321
 * application is therefore not allowed to register a custom handler for. */
17322
static int TLSX_CustomExt_IsKnown(word16 ext_type)
17323
{
17324
    switch (ext_type) {
17325
        case TLSXT_SERVER_NAME:
17326
        case TLSXT_MAX_FRAGMENT_LENGTH:
17327
        case TLSXT_TRUSTED_CA_KEYS:
17328
        case TLSXT_TRUNCATED_HMAC:
17329
        case TLSXT_STATUS_REQUEST:
17330
        case TLSXT_SUPPORTED_GROUPS:
17331
        case TLSXT_EC_POINT_FORMATS:
17332
        case TLSXT_SIGNATURE_ALGORITHMS:
17333
        case TLSXT_USE_SRTP:
17334
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
17335
        case TLSXT_STATUS_REQUEST_V2:
17336
        case TLSXT_CLIENT_CERTIFICATE:
17337
        case TLSXT_SERVER_CERTIFICATE:
17338
        case TLSXT_ENCRYPT_THEN_MAC:
17339
        case TLSXT_EXTENDED_MASTER_SECRET:
17340
        case TLSXT_CERT_WITH_EXTERN_PSK:
17341
        case TLSXT_SESSION_TICKET:
17342
        case TLSXT_PRE_SHARED_KEY:
17343
        case TLSXT_EARLY_DATA:
17344
        case TLSXT_SUPPORTED_VERSIONS:
17345
        case TLSXT_COOKIE:
17346
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
17347
        case TLSXT_CERTIFICATE_AUTHORITIES:
17348
        case TLSXT_POST_HANDSHAKE_AUTH:
17349
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
17350
        case TLSXT_KEY_SHARE:
17351
        case TLSXT_CONNECTION_ID:
17352
        case TLSXT_KEY_QUIC_TP_PARAMS:
17353
        case TLSXT_ECH:
17354
        case TLSXT_ECH_OUTER_EXTENSIONS:
17355
        case TLSXT_CKS:
17356
        case TLSXT_RENEGOTIATION_INFO:
17357
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
17358
            return 1;
17359
        default:
17360
            return 0;
17361
    }
17362
}
17363
17364
/**
17365
 * Registers an application-defined client extension on the context. Mirrors
17366
 * OpenSSL's SSL_CTX_add_client_custom_ext(): returns WOLFSSL_SUCCESS (1) on
17367
 * success, WOLFSSL_FAILURE (0) on failure.
17368
 *
17369
 * In this legacy API, wolfSSL supports custom extensions on the client side
17370
 * for TLS 1.2 and below.
17371
 *
17372
 * @param ctx        Context on which to register the custom extension.
17373
 * @param ext_type   IANA extension type to register. Must fit in 16 bits,
17374
 *                   must not name an extension wolfSSL already handles
17375
 *                   internally, and must not already be registered on @p ctx.
17376
 * @param add_cb     Callback used to build the outgoing extension. If NULL, a
17377
 *                   zero-length extension is sent.
17378
 * @param free_cb    Optional callback used to release data produced by
17379
 *                   @p add_cb. Must be NULL when @p add_cb is NULL.
17380
 * @param add_arg    Opaque application pointer for @p add_cb and @p free_cb.
17381
 * @param parse_cb   Optional callback used to parse the echoed extension.
17382
 * @param parse_arg  Opaque application pointer for @p parse_cb.
17383
 * @return WOLFSSL_SUCCESS on successful registration, otherwise
17384
 *         WOLFSSL_FAILURE.
17385
 */
17386
int wolfSSL_CTX_add_client_custom_ext(WOLFSSL_CTX* ctx, unsigned int ext_type,
17387
        wolfSSL_custom_ext_add_cb add_cb, wolfSSL_custom_ext_free_cb free_cb,
17388
        void* add_arg, wolfSSL_custom_ext_parse_cb parse_cb, void* parse_arg)
17389
{
17390
    WOLFSSL_CustomExt* meth;
17391
17392
    WOLFSSL_ENTER("wolfSSL_CTX_add_client_custom_ext");
17393
17394
    if (ctx == NULL || ext_type > 0xffff)
17395
        return WOLFSSL_FAILURE;
17396
17397
    /* free_cb without add_cb is meaningless: there is nothing to free. */
17398
    if (add_cb == NULL && free_cb != NULL)
17399
        return WOLFSSL_FAILURE;
17400
17401
    /* Don't allow shadowing of internally handled extensions. */
17402
    if (TLSX_CustomExt_IsKnown((word16)ext_type))
17403
        return WOLFSSL_FAILURE;
17404
17405
    /* Reject duplicate registrations for the same type. */
17406
    for (meth = ctx->customExt; meth != NULL; meth = meth->next) {
17407
        if (meth->ext_type == (word16)ext_type)
17408
            return WOLFSSL_FAILURE;
17409
    }
17410
17411
    meth = (WOLFSSL_CustomExt*)XMALLOC(sizeof(WOLFSSL_CustomExt), ctx->heap,
17412
                                       DYNAMIC_TYPE_TLSX);
17413
    if (meth == NULL)
17414
        return WOLFSSL_FAILURE;
17415
17416
    meth->ext_type  = (word16)ext_type;
17417
    meth->add_cb    = add_cb;
17418
    meth->free_cb   = free_cb;
17419
    meth->parse_cb  = parse_cb;
17420
    meth->add_arg   = add_arg;
17421
    meth->parse_arg = parse_arg;
17422
    meth->next      = ctx->customExt;
17423
    ctx->customExt  = meth;
17424
17425
    return WOLFSSL_SUCCESS;
17426
}
17427
17428
/* Frees a list of registered custom extension methods. */
17429
void TLSX_CustomExt_FreeAll(WOLFSSL_CustomExt* list, void* heap)
17430
{
17431
    WOLFSSL_CustomExt* meth;
17432
17433
    while ((meth = list) != NULL) {
17434
        list = meth->next;
17435
        XFREE(meth, heap, DYNAMIC_TYPE_TLSX);
17436
    }
17437
}
17438
17439
/* Builds one custom extension via its add callback and appends it (type,
17440
 * length, data) to the buffer tracked by *pData / *pDataSz, recording the type
17441
 * in ssl->customExtSent. Runs the matching free callback for the add. Returns 0
17442
 * when the extension was appended or intentionally omitted, otherwise a
17443
 * negative error. */
17444
static int TLSX_CustomExt_AddOne(WOLFSSL* ssl, WOLFSSL_CustomExt* meth,
17445
        byte** pData, word32* pDataSz)
17446
{
17447
    const unsigned char* out = NULL;
17448
    size_t outlen = 0;
17449
    int al = unsupported_extension;
17450
    int addRet = 1; /* no add_cb => add a zero-length extension */
17451
    word32 need = 0;
17452
    byte* tmp = NULL;
17453
    word16* sent = NULL;
17454
    byte* data = *pData;
17455
    word32 dataSz = *pDataSz;
17456
    int ret = 0;
17457
17458
    if (meth->add_cb != NULL) {
17459
        addRet = meth->add_cb(ssl, meth->ext_type, &out, &outlen, &al,
17460
                              meth->add_arg);
17461
    }
17462
17463
    if (addRet < 0) {
17464
        /* Fatal: callback requested the connection be aborted. add_cb
17465
         * returned < 0, so free_cb is not run (skips free_ext). */
17466
        SendAlert(ssl, alert_fatal, (byte)al);
17467
        return WOLFSSL_FATAL_ERROR;
17468
    }
17469
    if (addRet == 0)
17470
        return 0; /* extension omitted for this message */
17471
17472
    if (out == NULL && outlen > 0) {
17473
        ret = BAD_FUNC_ARG;
17474
    }
17475
    else if (outlen > WOLFSSL_MAX_16BIT) {
17476
        ret = BUFFER_ERROR;
17477
    }
17478
    else {
17479
        need = HELLO_EXT_TYPE_SZ + OPAQUE16_LEN + (word32)outlen;
17480
        if (dataSz + need > (word32)WOLFSSL_MAX_16BIT)
17481
            ret = BUFFER_ERROR;
17482
    }
17483
    if (ret != 0)
17484
        goto free_ext;
17485
17486
    tmp = (byte*)XREALLOC(data, dataSz + need, ssl->heap,
17487
                          DYNAMIC_TYPE_TMP_BUFFER);
17488
    if (tmp == NULL) {
17489
        ret = MEMORY_E;
17490
        goto free_ext;
17491
    }
17492
    data = tmp;
17493
17494
    c16toa(meth->ext_type, data + dataSz);
17495
    dataSz += HELLO_EXT_TYPE_SZ;
17496
    c16toa((word16)outlen, data + dataSz);
17497
    dataSz += OPAQUE16_LEN;
17498
    if (outlen > 0) {
17499
        XMEMCPY(data + dataSz, out, outlen);
17500
        dataSz += (word32)outlen;
17501
    }
17502
17503
    /* Record the type as sent so the server may legitimately echo it. */
17504
    sent = (word16*)XREALLOC(ssl->customExtSent,
17505
            (ssl->customExtSentCnt + 1) * (word32)sizeof(word16),
17506
            ssl->heap, DYNAMIC_TYPE_TLSX);
17507
    if (sent == NULL) {
17508
        ret = MEMORY_E;
17509
        goto free_ext;
17510
    }
17511
    ssl->customExtSent = sent;
17512
    ssl->customExtSent[ssl->customExtSentCnt++] = meth->ext_type;
17513
17514
free_ext:
17515
    if (meth->free_cb != NULL)
17516
        meth->free_cb(ssl, meth->ext_type, out, meth->add_arg);
17517
17518
    *pData = data;
17519
    *pDataSz = dataSz;
17520
    return ret;
17521
}
17522
17523
/* Invokes the registered add callbacks and serializes the resulting custom
17524
 * extensions for the ClientHello into ssl->customExtData. The total wire size
17525
 * (type + length + data for each included extension) is returned in *pSz. The
17526
 * buffer is consumed and released by TLSX_WriteRequest. */
17527
WOLFSSL_TEST_VIS int TLSX_CustomExt_BuildRequest(WOLFSSL* ssl, word16* pSz)
17528
{
17529
    WOLFSSL_CustomExt* meth;
17530
    byte*  data = NULL;
17531
    word32 dataSz = 0;  /* word32 to detect a word16 wire-field overflow */
17532
    int    ret = 0;
17533
17534
    if (ssl == NULL || pSz == NULL)
17535
        return BAD_FUNC_ARG;
17536
17537
    *pSz = 0;
17538
17539
    XFREE(ssl->customExtData, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
17540
    ssl->customExtData = NULL;
17541
    ssl->customExtSz = 0;
17542
    XFREE(ssl->customExtSent, ssl->heap, DYNAMIC_TYPE_TLSX);
17543
    ssl->customExtSent = NULL;
17544
    ssl->customExtSentCnt = 0;
17545
17546
    if (ssl->ctx == NULL || ssl->ctx->customExt == NULL)
17547
        return 0;
17548
17549
    for (meth = ssl->ctx->customExt; meth != NULL && ret == 0;
17550
            meth = meth->next) {
17551
        ret = TLSX_CustomExt_AddOne(ssl, meth, &data, &dataSz);
17552
    }
17553
17554
    if (ret != 0) {
17555
        XFREE(data, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
17556
        if (ssl->customExtSent != NULL) {
17557
            XFREE(ssl->customExtSent, ssl->heap, DYNAMIC_TYPE_TLSX);
17558
            ssl->customExtSent = NULL;
17559
            ssl->customExtSentCnt = 0;
17560
        }
17561
        return ret;
17562
    }
17563
17564
    ssl->customExtData = data;
17565
    ssl->customExtSz = (word16)dataSz;
17566
    *pSz = (word16)dataSz;
17567
17568
    return 0;
17569
}
17570
17571
/* Returns 1 if a custom extension handler is registered for the given type. */
17572
static int TLSX_CustomExt_IsRegistered(const WOLFSSL* ssl, word16 type)
17573
{
17574
    WOLFSSL_CustomExt* meth;
17575
17576
    if (ssl->ctx == NULL)
17577
        return 0;
17578
    for (meth = ssl->ctx->customExt; meth != NULL; meth = meth->next) {
17579
        if (meth->ext_type == type)
17580
            return 1;
17581
    }
17582
    return 0;
17583
}
17584
17585
/* Returns 1 if the given custom extension type was emitted in our ClientHello. */
17586
static int TLSX_CustomExt_WasSent(const WOLFSSL* ssl, word16 type)
17587
{
17588
    word16 i;
17589
17590
    for (i = 0; i < ssl->customExtSentCnt; i++) {
17591
        if (ssl->customExtSent[i] == type)
17592
            return 1;
17593
    }
17594
    return 0;
17595
}
17596
17597
/* Looks up a registered custom extension matching the received type and, if
17598
 * found, invokes its parse callback. *found is set to 1 when a handler matched
17599
 * (whether it succeeded or failed). Returns 0 on success, or a negative error
17600
 * (after sending the appropriate alert) when the extension is unsolicited or
17601
 * the callback rejects the data. */
17602
int TLSX_CustomExt_Parse(WOLFSSL* ssl, byte msgType, word16 type,
17603
        const byte* input, word16 size, int* found)
17604
{
17605
    WOLFSSL_CustomExt* meth;
17606
17607
    *found = 0;
17608
17609
    if (ssl->ctx == NULL || ssl->ctx->customExt == NULL)
17610
        return 0;
17611
17612
    /* Legacy client custom extensions only apply to the ServerHello of a
17613
     * TLS 1.2 (or below) handshake. For TLS 1.3, fall through so the unknown
17614
     * extension is handled per RFC 8446 (unsupported_extension alert). */
17615
    if (msgType != server_hello || IsAtLeastTLSv1_3(ssl->version))
17616
        return 0;
17617
17618
    /* OpenSSL registers the legacy API with SSL_EXT_IGNORE_ON_RESUMPTION, so on
17619
     * a resumed handshake the extension is not processed (the server echo is
17620
     * silently ignored). Only ignore when the server has actually confirmed
17621
     * resumption by echoing our session ID -- the RFC 5246 / RFC 5077 (tickets,
17622
     * non-empty session ID) signal. A cached ticket alone is not enough: if the
17623
     * server falls back to a full handshake it will not echo our session ID, so
17624
     * the extension is still parsed/validated below (and an unsolicited one is
17625
     * rejected). These fields are set from the ServerHello before this point. */
17626
    if (ssl->options.resuming && ssl->options.haveSessionId &&
17627
            ssl->arrays != NULL && ssl->session != NULL &&
17628
            ssl->arrays->sessionIDSz > 0 &&
17629
            ssl->arrays->sessionIDSz == ssl->session->sessionIDSz &&
17630
            XMEMCMP(ssl->arrays->sessionID, ssl->session->sessionID,
17631
                    ssl->arrays->sessionIDSz) == 0) {
17632
        return 0;
17633
    }
17634
17635
    for (meth = ssl->ctx->customExt; meth != NULL; meth = meth->next) {
17636
        if (meth->ext_type != type)
17637
            continue;
17638
17639
        *found = 1;
17640
17641
        /* RFC 5246 7.4.1.4: the server must not send an extension the client
17642
         * did not request. add_cb may decline to send for a given handshake,
17643
         * so reject a response for any type we did not actually emit. */
17644
        if (!TLSX_CustomExt_WasSent(ssl, type)) {
17645
            WOLFSSL_MSG("Unsolicited custom extension in ServerHello");
17646
            SendAlert(ssl, alert_fatal, unsupported_extension);
17647
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
17648
            return UNSUPPORTED_EXTENSION;
17649
        }
17650
17651
        if (meth->parse_cb != NULL) {
17652
            int al = unsupported_extension;
17653
            int parseRet = meth->parse_cb(ssl, type, input, (size_t)size, &al,
17654
                                          meth->parse_arg);
17655
            if (parseRet <= 0) {
17656
                SendAlert(ssl, alert_fatal, (byte)al);
17657
                WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
17658
                return UNSUPPORTED_EXTENSION;
17659
            }
17660
        }
17661
        break;
17662
    }
17663
17664
    return 0;
17665
}
17666
#endif /* HAVE_TLS_EXTENSIONS && OPENSSL_EXTRA */
17667
17668
/** Tells the buffered size of extensions to be sent into the client hello. */
17669
int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word32* pLength)
17670
{
17671
    int ret = 0;
17672
    word16 length = 0;
17673
    byte semaphore[SEMAPHORE_SIZE] = {0};
17674
17675
    if (!TLSX_SupportExtensions(ssl))
17676
        return 0;
17677
    if (msgType == client_hello) {
17678
        EC_VALIDATE_REQUEST(ssl, semaphore);
17679
        PF_VALIDATE_REQUEST(ssl, semaphore);
17680
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17681
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
17682
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
17683
#endif
17684
#if defined(WOLFSSL_TLS13)
17685
        if (!IsAtLeastTLSv1_2(ssl)) {
17686
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17687
        }
17688
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
17689
        if (!IsAtLeastTLSv1_3(ssl->version)) {
17690
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17691
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17692
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17693
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
17694
        #endif
17695
        #ifdef WOLFSSL_EARLY_DATA
17696
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
17697
        #endif
17698
        #ifdef WOLFSSL_TLS13_COOKIE
17699
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
17700
        #endif
17701
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
17702
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
17703
        #endif
17704
        }
17705
    #endif
17706
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
17707
        if (!IsAtLeastTLSv1_3(ssl->version) ||
17708
                TLSX_CA_Names_Count(ssl) == 0) {
17709
            TURN_ON(semaphore,
17710
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
17711
        }
17712
    #endif
17713
#endif /* WOLFSSL_TLS13 */
17714
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
17715
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17716
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
17717
            /* mark already sent, so it won't send it */
17718
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17719
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
17720
        }
17721
    #endif
17722
    }
17723
17724
#ifdef WOLFSSL_TLS13
17725
    #ifndef NO_CERTS
17726
    else if (msgType == certificate_request) {
17727
        /* Don't send out any extension except those that are turned off. */
17728
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17729
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17730
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
17731
#endif
17732
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
17733
        if (TLSX_CA_Names_Count(ssl) > 0) {
17734
            TURN_OFF(semaphore,
17735
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
17736
        }
17737
#endif
17738
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, OID_FILTERS */
17739
        /* TLSX_STATUS_REQUEST is enabled: the server may request the client
17740
         * to staple an OCSP response with its CertificateRequest. */
17741
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17742
    }
17743
    #endif
17744
#if defined(HAVE_ECH)
17745
    if (!ssl->options.disableECH && msgType == client_hello) {
17746
        ret = TLSX_GetSizeWithEch(ssl, semaphore, msgType, &length);
17747
        if (ret != 0)
17748
            return ret;
17749
    }
17750
    else
17751
#endif /* HAVE_ECH */
17752
#endif /* WOLFSSL_TLS13 */
17753
    {
17754
        if (ssl->extensions) {
17755
            ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
17756
            if (ret != 0)
17757
                return ret;
17758
        }
17759
        if (ssl->ctx && ssl->ctx->extensions) {
17760
            ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType,
17761
                &length);
17762
            if (ret != 0)
17763
                return ret;
17764
        }
17765
    }
17766
17767
#ifdef HAVE_EXTENDED_MASTER
17768
    if (msgType == client_hello && ssl->options.haveEMS &&
17769
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
17770
        length += HELLO_EXT_SZ;
17771
    }
17772
#endif
17773
17774
#if defined(HAVE_TLS_EXTENSIONS) && defined(OPENSSL_EXTRA)
17775
    /* Custom (application-defined) extensions. These are always offered in the
17776
     * ClientHello regardless of the client's maximum version (matching OpenSSL,
17777
     * whose is_tls13 check is false while constructing the ClientHello), so
17778
     * they work with flexible client methods that go on to negotiate TLS 1.2.
17779
     * The negotiated-version restriction is enforced on the parse side. The add
17780
     * callbacks run here and the resulting bytes are cached for
17781
     * TLSX_WriteRequest. */
17782
    if (msgType == client_hello) {
17783
        word16 customSz = 0;
17784
        ret = TLSX_CustomExt_BuildRequest(ssl, &customSz);
17785
        if (ret != 0)
17786
            return ret;
17787
        if ((word32)length + customSz > (WOLFSSL_MAX_16BIT - OPAQUE16_LEN)) {
17788
            WOLFSSL_MSG("TLSX_GetRequestSize extensions exceed word16");
17789
            return BUFFER_E;
17790
        }
17791
        length += customSz;
17792
    }
17793
#endif
17794
17795
    /* The TLS extensions block length prefix is a 2-byte field, so any
17796
     * accumulated total above 0xFFFF must be rejected rather than silently
17797
     * truncating and producing a short, malformed handshake message. */
17798
    if (length > (word16)(WOLFSSL_MAX_16BIT - OPAQUE16_LEN)) {
17799
        WOLFSSL_MSG("TLSX_GetRequestSize extensions exceed word16");
17800
        return BUFFER_E;
17801
    }
17802
    if (length)
17803
        length += OPAQUE16_LEN; /* for total length storage. */
17804
17805
    *pLength += length;
17806
17807
    return ret;
17808
}
17809
17810
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
17811
/* return status after writing the extensions with ech written last */
17812
static int TLSX_WriteWithEch(WOLFSSL* ssl, byte* output, byte* semaphore,
17813
    byte msgType, word16* pOffset)
17814
{
17815
    int ret = 0;
17816
    int retC;
17817
    int installed = 0;
17818
    TLSX* echX = NULL;
17819
    WOLFSSL_ECH* ech = NULL;
17820
    word16 appended = 0;
17821
17822
    if (ssl->extensions)
17823
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
17824
    if (echX != NULL)
17825
        ech = (WOLFSSL_ECH*)echX->data;
17826
17827
    ret = retC = TLSX_EchConcealExtensions(ssl, ech, &appended, &installed);
17828
17829
    if (ret == 0 && echX != NULL) {
17830
        /* turn ech on so it doesn't write, then write it last */
17831
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
17832
    }
17833
17834
    /* for ECH inner, print the encodable block first, then the non-encodables.
17835
     * This allows the same transcript to be produced on either side
17836
     * (the transcript is over the expanded form). */
17837
    if (ret == 0 && ech != NULL && ech->type == ECH_TYPE_INNER) {
17838
        byte encodeMask[SEMAPHORE_SIZE];
17839
        byte* mask = ech->writeEncoded ? semaphore : encodeMask;
17840
        word16 count = 0;
17841
        int i;
17842
17843
        XMEMSET(encodeMask, 0, SEMAPHORE_SIZE);
17844
17845
        ret = TLSX_ECH_BuildOuterExtensions(ssl, semaphore, msgType,
17846
            ech->writeEncoded ? output : NULL,
17847
            ech->writeEncoded ? pOffset : NULL,
17848
            &count, mask);
17849
        if (ret == 0 && count >= 1 && !ech->writeEncoded) {
17850
            /* expanded: print encodable block normally */
17851
            for (i = 0; i < SEMAPHORE_SIZE; i++) {
17852
                semaphore[i] |= encodeMask[i];
17853
                encodeMask[i] = (byte)~encodeMask[i];
17854
            }
17855
            if (ssl->extensions) {
17856
                ret = TLSX_Write(ssl->extensions, output + *pOffset,
17857
                        encodeMask, msgType, pOffset);
17858
            }
17859
            if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
17860
                ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset,
17861
                        encodeMask, msgType, pOffset);
17862
            }
17863
        }
17864
    }
17865
17866
    /* print non-encodable block */
17867
    if (ret == 0 && ssl->extensions) {
17868
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
17869
                         msgType, pOffset);
17870
    }
17871
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
17872
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
17873
                         msgType, pOffset);
17874
    }
17875
17876
    /* write ECH last */
17877
    if (ret == 0 && echX != NULL) {
17878
        /* turn off and write it last */
17879
        TURN_OFF(semaphore, TLSX_ToSemaphore(echX->type));
17880
17881
        if (ssl->extensions) {
17882
            ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
17883
                msgType, pOffset);
17884
        }
17885
17886
        if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
17887
            ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
17888
                msgType, pOffset);
17889
        }
17890
    }
17891
17892
    /* always try to restore extensions to a good state */
17893
    if (retC == 0)
17894
        retC = TLSX_EchExposeExtensions(ssl, ech, appended, installed);
17895
17896
    if (ret == 0)
17897
        ret = retC;
17898
    return ret;
17899
}
17900
#endif
17901
17902
/** Writes the extensions to be sent into the client hello. */
17903
int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word32* pOffset)
17904
0
{
17905
0
    int ret = 0;
17906
0
    word16 offset = 0;
17907
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
17908
17909
0
    if (!TLSX_SupportExtensions(ssl) || output == NULL)
17910
0
        return 0;
17911
17912
0
    offset += OPAQUE16_LEN; /* extensions length */
17913
17914
0
    if (msgType == client_hello) {
17915
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
17916
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
17917
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17918
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
17919
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
17920
0
#endif
17921
0
#ifdef WOLFSSL_TLS13
17922
0
        if (!IsAtLeastTLSv1_2(ssl)) {
17923
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17924
0
        }
17925
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
17926
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
17927
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17928
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17929
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
17930
        #endif
17931
        #ifdef WOLFSSL_EARLY_DATA
17932
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
17933
        #endif
17934
0
        #ifdef WOLFSSL_TLS13_COOKIE
17935
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
17936
0
        #endif
17937
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
17938
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
17939
        #endif
17940
        #ifdef WOLFSSL_DUAL_ALG_CERTS
17941
            TURN_ON(semaphore,
17942
                    TLSX_ToSemaphore(TLSX_CKS));
17943
        #endif
17944
0
        }
17945
0
    #endif
17946
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
17947
        if (!IsAtLeastTLSv1_3(ssl->version) || TLSX_CA_Names_Count(ssl) == 0) {
17948
            TURN_ON(semaphore,
17949
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
17950
        }
17951
    #endif
17952
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17953
        /* Must write Pre-shared Key extension at the end in TLS v1.3.
17954
         * Must not write out Pre-shared Key extension in earlier versions of
17955
         * protocol.
17956
         */
17957
        TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17958
    #endif
17959
0
#endif /* WOLFSSL_TLS13 */
17960
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
17961
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17962
         /* mark already sent, so it won't send it */
17963
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
17964
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17965
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
17966
        }
17967
    #endif
17968
0
    }
17969
0
#ifdef WOLFSSL_TLS13
17970
0
    #ifndef NO_CERTS
17971
0
    else if (msgType == certificate_request) {
17972
        /* Don't send out any extension except those that are turned off. */
17973
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17974
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17975
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
17976
0
#endif
17977
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
17978
        if (TLSX_CA_Names_Count(ssl) > 0) {
17979
            TURN_OFF(semaphore,
17980
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
17981
        }
17982
#endif
17983
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, TLSX_OID_FILTERS */
17984
        /* TLSX_STATUS_REQUEST is enabled: the server may request the client
17985
         * to staple an OCSP response with its CertificateRequest. */
17986
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17987
0
    }
17988
0
#endif
17989
0
#endif
17990
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
17991
    if (!ssl->options.disableECH && msgType == client_hello) {
17992
        ret = TLSX_WriteWithEch(ssl, output, semaphore, msgType, &offset);
17993
        if (ret != 0)
17994
            return ret;
17995
    }
17996
    else
17997
#endif
17998
0
    {
17999
0
        if (ssl->extensions) {
18000
0
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
18001
0
                             msgType, &offset);
18002
0
            if (ret != 0)
18003
0
                return ret;
18004
0
        }
18005
0
        if (ssl->ctx && ssl->ctx->extensions) {
18006
0
            ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
18007
0
                             msgType, &offset);
18008
0
            if (ret != 0)
18009
0
                return ret;
18010
0
        }
18011
0
    }
18012
18013
0
#ifdef HAVE_EXTENDED_MASTER
18014
0
    if (msgType == client_hello && ssl->options.haveEMS &&
18015
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
18016
0
        WOLFSSL_MSG("EMS extension to write");
18017
0
        c16toa(HELLO_EXT_EXTMS, output + offset);
18018
0
        offset += HELLO_EXT_TYPE_SZ;
18019
0
        c16toa(0, output + offset);
18020
0
        offset += HELLO_EXT_SZ_SZ;
18021
0
    }
18022
0
#endif
18023
18024
#if defined(HAVE_TLS_EXTENSIONS) && defined(OPENSSL_EXTRA)
18025
    /* Copy out the custom (application-defined) extension bytes built during
18026
     * TLSX_GetRequestSize, then release the cached buffer. */
18027
    if (msgType == client_hello && ssl->customExtData != NULL) {
18028
        WOLFSSL_MSG("Custom extensions to write");
18029
        XMEMCPY(output + offset, ssl->customExtData, ssl->customExtSz);
18030
        offset += ssl->customExtSz;
18031
        XFREE(ssl->customExtData, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
18032
        ssl->customExtData = NULL;
18033
        ssl->customExtSz = 0;
18034
    }
18035
#endif
18036
18037
0
#ifdef WOLFSSL_TLS13
18038
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18039
    if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
18040
        /* Write out what we can of Pre-shared key extension.  */
18041
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18042
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
18043
                         client_hello, &offset);
18044
        if (ret != 0)
18045
            return ret;
18046
    }
18047
    #endif
18048
0
#endif
18049
18050
    /* Wrap detection for the TLSX_Write calls above is handled inside
18051
     * TLSX_Write itself: any iteration that would push the local word16
18052
     * offset past 0xFFFF returns BUFFER_E so we never reach here with a
18053
     * truncated value. The TLS extensions block length prefix on the
18054
     * wire is a 2-byte field, matching this invariant. */
18055
18056
0
    if (offset > OPAQUE16_LEN || msgType != client_hello)
18057
0
        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
18058
18059
0
     *pOffset += offset;
18060
18061
0
    return ret;
18062
0
}
18063
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
18064
18065
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
18066
18067
/** Tells the buffered size of extensions to be sent into the server hello. */
18068
int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
18069
{
18070
    int ret = 0;
18071
    word16 length = 0;
18072
    byte semaphore[SEMAPHORE_SIZE] = {0};
18073
18074
    switch (msgType) {
18075
#ifndef NO_WOLFSSL_SERVER
18076
        case server_hello:
18077
            PF_VALIDATE_RESPONSE(ssl, semaphore);
18078
        #ifdef WOLFSSL_TLS13
18079
                if (IsAtLeastTLSv1_3(ssl->version)) {
18080
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18081
                    TURN_OFF(semaphore,
18082
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18083
                #if defined(HAVE_SUPPORTED_CURVES)
18084
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18085
                    if (!ssl->options.noPskDheKe)
18086
                #endif
18087
                    {
18088
                        /* Expect KeyShare extension in ServerHello. */
18089
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18090
                    }
18091
                #endif
18092
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18093
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18094
                #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
18095
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
18096
                #endif
18097
                #endif
18098
                }
18099
            #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
18100
                else {
18101
                #ifdef HAVE_SUPPORTED_CURVES
18102
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18103
                #endif
18104
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18105
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18106
                #endif
18107
                }
18108
            #endif
18109
            #ifdef WOLFSSL_DTLS_CID
18110
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
18111
            #endif
18112
        #endif /* WOLFSSL_TLS13 */
18113
            break;
18114
18115
    #ifdef WOLFSSL_TLS13
18116
        case hello_retry_request:
18117
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18118
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18119
        #ifdef HAVE_SUPPORTED_CURVES
18120
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18121
            if (!ssl->options.noPskDheKe)
18122
        #endif
18123
            {
18124
                /* Expect KeyShare extension in HelloRetryRequest. */
18125
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18126
            }
18127
        #endif
18128
        #ifdef WOLFSSL_SEND_HRR_COOKIE
18129
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
18130
        #endif
18131
#ifdef HAVE_ECH
18132
            /* send the special confirmation */
18133
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
18134
#endif
18135
            break;
18136
    #endif
18137
18138
    #ifdef WOLFSSL_TLS13
18139
        case encrypted_extensions:
18140
            /* Send out all extension except those that are turned on. */
18141
        #ifdef HAVE_ECC
18142
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
18143
        #endif
18144
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18145
        #ifdef HAVE_SESSION_TICKET
18146
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
18147
        #endif
18148
        #ifdef HAVE_SUPPORTED_CURVES
18149
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18150
        #endif
18151
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18152
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18153
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
18154
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
18155
        #endif
18156
        #endif
18157
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
18158
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
18159
        #endif
18160
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
18161
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
18162
        #endif
18163
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
18164
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
18165
        #endif
18166
        #ifdef WOLFSSL_DTLS_CID
18167
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
18168
        #endif /* WOLFSSL_DTLS_CID */
18169
            break;
18170
18171
        #ifdef WOLFSSL_EARLY_DATA
18172
        case session_ticket:
18173
            if (ssl->options.tls1_3) {
18174
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18175
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
18176
            }
18177
            break;
18178
        #endif
18179
    #endif
18180
#endif
18181
18182
#ifdef WOLFSSL_TLS13
18183
    #ifndef NO_CERTS
18184
        case certificate:
18185
            /* Don't send out any extension except those that are turned off. */
18186
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18187
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
18188
            /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
18189
             *       TLSX_SERVER_CERTIFICATE_TYPE
18190
             */
18191
            break;
18192
    #endif
18193
#endif
18194
    }
18195
18196
#ifdef HAVE_EXTENDED_MASTER
18197
    if (ssl->options.haveEMS && msgType == server_hello &&
18198
                                              !IsAtLeastTLSv1_3(ssl->version)) {
18199
        length += HELLO_EXT_SZ;
18200
    }
18201
#endif
18202
18203
    if (TLSX_SupportExtensions(ssl)) {
18204
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
18205
        if (ret != 0)
18206
            return ret;
18207
    }
18208
18209
    /* All the response data is set at the ssl object only, so no ctx here. */
18210
18211
    if (length || msgType != server_hello)
18212
        length += OPAQUE16_LEN; /* for total length storage. */
18213
18214
    *pLength += length;
18215
18216
    return ret;
18217
}
18218
18219
/** Writes the server hello extensions into a buffer. */
18220
int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
18221
0
{
18222
0
    int ret = 0;
18223
0
    word16 offset = 0;
18224
18225
0
    if (TLSX_SupportExtensions(ssl) && output) {
18226
0
        byte semaphore[SEMAPHORE_SIZE] = {0};
18227
18228
0
        switch (msgType) {
18229
0
#ifndef NO_WOLFSSL_SERVER
18230
0
            case server_hello:
18231
0
                PF_VALIDATE_RESPONSE(ssl, semaphore);
18232
0
        #ifdef WOLFSSL_TLS13
18233
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18234
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18235
0
                    TURN_OFF(semaphore,
18236
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18237
0
            #ifdef HAVE_SUPPORTED_CURVES
18238
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18239
                    if (!ssl->options.noPskDheKe)
18240
                #endif
18241
0
                    {
18242
                        /* Write out KeyShare in ServerHello. */
18243
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18244
0
                    }
18245
0
            #endif
18246
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18247
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18248
            #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
18249
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
18250
            #endif
18251
            #endif
18252
0
                }
18253
0
                else
18254
0
        #endif /* WOLFSSL_TLS13 */
18255
0
                {
18256
0
        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
18257
0
            #ifdef HAVE_SUPPORTED_CURVES
18258
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18259
0
            #endif
18260
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18261
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18262
            #endif
18263
0
        #endif
18264
0
                    WC_DO_NOTHING; /* avoid empty brackets */
18265
0
                }
18266
        #ifdef WOLFSSL_DTLS_CID
18267
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
18268
        #endif /* WOLFSSL_DTLS_CID */
18269
0
                break;
18270
18271
0
    #ifdef WOLFSSL_TLS13
18272
0
            case hello_retry_request:
18273
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18274
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18275
0
        #ifdef HAVE_SUPPORTED_CURVES
18276
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18277
                if (!ssl->options.noPskDheKe)
18278
            #endif
18279
0
                {
18280
                    /* Write out KeyShare in HelloRetryRequest. */
18281
0
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18282
0
                }
18283
0
        #endif
18284
0
                break;
18285
0
    #endif
18286
18287
0
    #ifdef WOLFSSL_TLS13
18288
0
            case encrypted_extensions:
18289
                /* Send out all extension except those that are turned on. */
18290
0
        #ifdef HAVE_ECC
18291
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
18292
0
        #endif
18293
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18294
        #ifdef HAVE_SESSION_TICKET
18295
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
18296
        #endif
18297
0
        #ifdef HAVE_SUPPORTED_CURVES
18298
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18299
0
        #endif
18300
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18301
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18302
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
18303
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
18304
        #endif
18305
        #endif
18306
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
18307
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
18308
        #endif
18309
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
18310
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
18311
        #endif
18312
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
18313
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
18314
0
        #endif
18315
        #ifdef WOLFSSL_DTLS_CID
18316
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
18317
        #endif /* WOLFSSL_DTLS_CID */
18318
0
                break;
18319
18320
        #ifdef WOLFSSL_EARLY_DATA
18321
            case session_ticket:
18322
                if (ssl->options.tls1_3) {
18323
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18324
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
18325
                }
18326
                break;
18327
        #endif
18328
0
    #endif
18329
0
#endif
18330
18331
0
    #ifdef WOLFSSL_TLS13
18332
0
        #ifndef NO_CERTS
18333
0
            case certificate:
18334
                /* Don't send out any extension except those that are turned
18335
                 * off. */
18336
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18337
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
18338
                /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
18339
                 *       TLSX_SERVER_CERTIFICATE_TYPE
18340
                 */
18341
0
                break;
18342
0
        #endif
18343
0
    #endif
18344
18345
0
            default:
18346
0
                break;
18347
0
        }
18348
18349
0
        offset += OPAQUE16_LEN; /* extensions length */
18350
18351
0
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
18352
0
                         msgType, &offset);
18353
0
        if (ret != 0)
18354
0
            return ret;
18355
18356
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
18357
        if (msgType == hello_retry_request) {
18358
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18359
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
18360
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
18361
                             msgType, &offset);
18362
            if (ret != 0)
18363
                return ret;
18364
        }
18365
#endif
18366
18367
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
18368
        /* write ECH last to promote interop with other implementations */
18369
        if (msgType == hello_retry_request) {
18370
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18371
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
18372
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
18373
                             msgType, &offset);
18374
            if (ret != 0)
18375
                return ret;
18376
        }
18377
#endif
18378
18379
0
#ifdef HAVE_EXTENDED_MASTER
18380
0
        if (ssl->options.haveEMS && msgType == server_hello &&
18381
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
18382
0
            WOLFSSL_MSG("EMS extension to write");
18383
0
            c16toa(HELLO_EXT_EXTMS, output + offset);
18384
0
            offset += HELLO_EXT_TYPE_SZ;
18385
0
            c16toa(0, output + offset);
18386
0
            offset += HELLO_EXT_SZ_SZ;
18387
0
        }
18388
0
#endif
18389
18390
0
        if (offset > OPAQUE16_LEN || msgType != server_hello)
18391
0
            c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
18392
0
    }
18393
18394
0
    if (pOffset)
18395
0
        *pOffset += offset;
18396
18397
0
    return ret;
18398
0
}
18399
18400
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
18401
18402
#ifdef WOLFSSL_TLS13
18403
int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
18404
                      byte msgType, int* found)
18405
{
18406
    int ret = 0;
18407
    int offset = 0;
18408
18409
    *found = 0;
18410
    while (offset < (int)length) {
18411
        word16 type;
18412
        word16 size;
18413
18414
        if (offset + (2 * OPAQUE16_LEN) > length) {
18415
            ret = BUFFER_ERROR;
18416
            break;
18417
        }
18418
18419
        ato16(input + offset, &type);
18420
        offset += HELLO_EXT_TYPE_SZ;
18421
18422
        ato16(input + offset, &size);
18423
        offset += OPAQUE16_LEN;
18424
18425
        if (offset + size > length) {
18426
            ret = BUFFER_ERROR;
18427
            break;
18428
        }
18429
18430
        if (type == TLSX_SUPPORTED_VERSIONS) {
18431
            *found = 1;
18432
18433
            WOLFSSL_MSG("Supported Versions extension received");
18434
18435
            ret = SV_PARSE(ssl, input + offset, size, msgType, &ssl->version,
18436
                           &ssl->options, &ssl->extensions);
18437
            break;
18438
        }
18439
18440
        offset += size;
18441
    }
18442
18443
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_DTLS_CID)
18444
    ssl->options.haveSupportedVersions = (ret == 0 && *found);
18445
#endif
18446
    return ret;
18447
}
18448
#endif
18449
/* Jump Table to check minimum size values for client case in TLSX_Parse */
18450
#ifndef NO_WOLFSSL_SERVER
18451
static word16 TLSX_GetMinSize_Client(word16* type)
18452
81.7k
{
18453
81.7k
    switch (*type) {
18454
1.04k
        case TLSXT_SERVER_NAME:
18455
1.04k
            return WOLFSSL_SNI_MIN_SIZE_CLIENT;
18456
2.70k
        case TLSXT_EARLY_DATA:
18457
2.70k
            return WOLFSSL_EDI_MIN_SIZE_CLIENT;
18458
298
        case TLSXT_MAX_FRAGMENT_LENGTH:
18459
298
            return WOLFSSL_MFL_MIN_SIZE_CLIENT;
18460
298
        case TLSXT_TRUSTED_CA_KEYS:
18461
298
            return WOLFSSL_TCA_MIN_SIZE_CLIENT;
18462
618
        case TLSXT_TRUNCATED_HMAC:
18463
618
            return WOLFSSL_THM_MIN_SIZE_CLIENT;
18464
603
        case TLSXT_STATUS_REQUEST:
18465
603
            return WOLFSSL_CSR_MIN_SIZE_CLIENT;
18466
9.28k
        case TLSXT_SUPPORTED_GROUPS:
18467
9.28k
            return WOLFSSL_EC_MIN_SIZE_CLIENT;
18468
1.49k
        case TLSXT_EC_POINT_FORMATS:
18469
1.49k
            return WOLFSSL_PF_MIN_SIZE_CLIENT;
18470
6.38k
        case TLSXT_SIGNATURE_ALGORITHMS:
18471
6.38k
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
18472
218
        case TLSXT_USE_SRTP:
18473
218
            return WOLFSSL_SRTP_MIN_SIZE_CLIENT;
18474
260
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
18475
260
            return WOLFSSL_ALPN_MIN_SIZE_CLIENT;
18476
192
        case TLSXT_STATUS_REQUEST_V2:
18477
192
            return WOLFSSL_CSR2_MIN_SIZE_CLIENT;
18478
98
        case TLSXT_CLIENT_CERTIFICATE:
18479
98
            return WOLFSSL_CCT_MIN_SIZE_CLIENT;
18480
62
        case TLSXT_SERVER_CERTIFICATE:
18481
62
            return WOLFSSL_SCT_MIN_SIZE_CLIENT;
18482
1.90k
        case TLSXT_ENCRYPT_THEN_MAC:
18483
1.90k
            return WOLFSSL_ETM_MIN_SIZE_CLIENT;
18484
1.55k
        case TLSXT_SESSION_TICKET:
18485
1.55k
            return WOLFSSL_STK_MIN_SIZE_CLIENT;
18486
1.56k
        case TLSXT_PRE_SHARED_KEY:
18487
1.56k
            return WOLFSSL_PSK_MIN_SIZE_CLIENT;
18488
83
        case TLSXT_COOKIE:
18489
83
            return WOLFSSL_CKE_MIN_SIZE_CLIENT;
18490
1.42k
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
18491
1.42k
            return WOLFSSL_PKM_MIN_SIZE_CLIENT;
18492
81
        case TLSXT_CERT_WITH_EXTERN_PSK:
18493
81
            return WOLFSSL_CWEP_MIN_SIZE_CLIENT;
18494
769
        case TLSXT_CERTIFICATE_AUTHORITIES:
18495
769
            return WOLFSSL_CAN_MIN_SIZE_CLIENT;
18496
218
        case TLSXT_POST_HANDSHAKE_AUTH:
18497
218
            return WOLFSSL_PHA_MIN_SIZE_CLIENT;
18498
234
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
18499
234
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
18500
4.42k
        case TLSXT_KEY_SHARE:
18501
4.42k
            return WOLFSSL_KS_MIN_SIZE_CLIENT;
18502
123
        case TLSXT_CONNECTION_ID:
18503
123
            return WOLFSSL_CID_MIN_SIZE_CLIENT;
18504
324
        case TLSXT_RENEGOTIATION_INFO:
18505
324
            return WOLFSSL_SCR_MIN_SIZE_CLIENT;
18506
12
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
18507
12
            return WOLFSSL_QTP_MIN_SIZE_CLIENT;
18508
53
        case TLSXT_ECH:
18509
53
            return WOLFSSL_ECH_MIN_SIZE_CLIENT;
18510
45.4k
        default:
18511
45.4k
            return 0;
18512
81.7k
    }
18513
81.7k
}
18514
0
    #define TLSX_GET_MIN_SIZE_CLIENT(type) TLSX_GetMinSize_Client(type)
18515
#else
18516
    #define TLSX_GET_MIN_SIZE_CLIENT(type) 0
18517
#endif
18518
18519
18520
#ifndef NO_WOLFSSL_CLIENT
18521
/* Jump Table to check minimum size values for server case in TLSX_Parse */
18522
static word16 TLSX_GetMinSize_Server(const word16 *type)
18523
4.24k
{
18524
4.24k
    switch (*type) {
18525
51
        case TLSXT_SERVER_NAME:
18526
51
            return WOLFSSL_SNI_MIN_SIZE_SERVER;
18527
5
        case TLSXT_EARLY_DATA:
18528
5
            return WOLFSSL_EDI_MIN_SIZE_SERVER;
18529
8
        case TLSXT_MAX_FRAGMENT_LENGTH:
18530
8
            return WOLFSSL_MFL_MIN_SIZE_SERVER;
18531
5
        case TLSXT_TRUSTED_CA_KEYS:
18532
5
            return WOLFSSL_TCA_MIN_SIZE_SERVER;
18533
13
        case TLSXT_TRUNCATED_HMAC:
18534
13
            return WOLFSSL_THM_MIN_SIZE_SERVER;
18535
17
        case TLSXT_STATUS_REQUEST:
18536
17
            return WOLFSSL_CSR_MIN_SIZE_SERVER;
18537
5
        case TLSXT_SUPPORTED_GROUPS:
18538
5
            return WOLFSSL_EC_MIN_SIZE_SERVER;
18539
21
        case TLSXT_EC_POINT_FORMATS:
18540
21
            return WOLFSSL_PF_MIN_SIZE_SERVER;
18541
8
        case TLSXT_SIGNATURE_ALGORITHMS:
18542
8
            return WOLFSSL_SA_MIN_SIZE_SERVER;
18543
63
        case TLSXT_USE_SRTP:
18544
63
            return WOLFSSL_SRTP_MIN_SIZE_SERVER;
18545
75
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
18546
75
            return WOLFSSL_ALPN_MIN_SIZE_SERVER;
18547
5
        case TLSXT_STATUS_REQUEST_V2:
18548
5
            return WOLFSSL_CSR2_MIN_SIZE_SERVER;
18549
3
        case TLSXT_CLIENT_CERTIFICATE:
18550
3
            return WOLFSSL_CCT_MIN_SIZE_SERVER;
18551
3
        case TLSXT_SERVER_CERTIFICATE:
18552
3
            return WOLFSSL_SCT_MIN_SIZE_SERVER;
18553
58
        case TLSXT_ENCRYPT_THEN_MAC:
18554
58
            return WOLFSSL_ETM_MIN_SIZE_SERVER;
18555
16
        case TLSXT_SESSION_TICKET:
18556
16
            return WOLFSSL_STK_MIN_SIZE_SERVER;
18557
104
        case TLSXT_PRE_SHARED_KEY:
18558
104
            return WOLFSSL_PSK_MIN_SIZE_SERVER;
18559
23
        case TLSXT_COOKIE:
18560
23
            return WOLFSSL_CKE_MIN_SIZE_SERVER;
18561
8
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
18562
8
            return WOLFSSL_PKM_MIN_SIZE_SERVER;
18563
0
        case TLSXT_CERT_WITH_EXTERN_PSK:
18564
0
            return WOLFSSL_CWEP_MIN_SIZE_SERVER;
18565
5
        case TLSXT_CERTIFICATE_AUTHORITIES:
18566
5
            return WOLFSSL_CAN_MIN_SIZE_SERVER;
18567
4
        case TLSXT_POST_HANDSHAKE_AUTH:
18568
4
            return WOLFSSL_PHA_MIN_SIZE_SERVER;
18569
7
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
18570
7
            return WOLFSSL_SA_MIN_SIZE_SERVER;
18571
1.11k
        case TLSXT_KEY_SHARE:
18572
1.11k
            return WOLFSSL_KS_MIN_SIZE_SERVER;
18573
8
        case TLSXT_CONNECTION_ID:
18574
8
            return WOLFSSL_CID_MIN_SIZE_SERVER;
18575
187
        case TLSXT_RENEGOTIATION_INFO:
18576
187
            return WOLFSSL_SCR_MIN_SIZE_SERVER;
18577
2
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
18578
2
            return WOLFSSL_QTP_MIN_SIZE_SERVER;
18579
0
        case TLSXT_ECH:
18580
0
            return WOLFSSL_ECH_MIN_SIZE_SERVER;
18581
2.42k
        default:
18582
2.42k
            return 0;
18583
4.24k
    }
18584
4.24k
}
18585
0
    #define TLSX_GET_MIN_SIZE_SERVER(type) TLSX_GetMinSize_Server(type)
18586
#else
18587
    #define TLSX_GET_MIN_SIZE_SERVER(type) 0
18588
#endif
18589
18590
18591
/** Parses a buffer of TLS extensions. */
18592
WOLFSSL_TEST_VIS int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length,
18593
                                byte msgType, Suites *suites)
18594
0
{
18595
0
    int ret = 0;
18596
0
    word16 offset = 0;
18597
0
    byte isRequest = (msgType == client_hello ||
18598
0
                      msgType == certificate_request);
18599
18600
0
#ifdef HAVE_EXTENDED_MASTER
18601
0
    byte pendingEMS = 0;
18602
0
#endif
18603
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
18604
    int pskDone = 0;
18605
#endif
18606
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
18607
    !defined(NO_PSK)
18608
    int secondClientHello = 0;
18609
    int prevHasPskWithCert = 0;
18610
#endif
18611
0
    byte seenType[SEMAPHORE_SIZE];  /* Seen known extensions. */
18612
18613
0
    if (!ssl || !input || (isRequest && !suites))
18614
0
        return BAD_FUNC_ARG;
18615
18616
    /* No known extensions seen yet. */
18617
0
    XMEMSET(seenType, 0, sizeof(seenType));
18618
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
18619
    !defined(NO_PSK)
18620
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == client_hello &&
18621
            ssl->msgsReceived.got_client_hello == 2) {
18622
        secondClientHello = 1;
18623
        prevHasPskWithCert =
18624
            TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) != NULL;
18625
    }
18626
#endif
18627
18628
0
    while (ret == 0 && offset < length) {
18629
0
        word16 type;
18630
0
        word16 size;
18631
18632
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
18633
        if (msgType == client_hello && pskDone) {
18634
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
18635
            return PSK_KEY_ERROR;
18636
        }
18637
#endif
18638
18639
0
        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
18640
0
            return BUFFER_ERROR;
18641
18642
0
        ato16(input + offset, &type);
18643
0
        offset += HELLO_EXT_TYPE_SZ;
18644
18645
0
        ato16(input + offset, &size);
18646
0
        offset += OPAQUE16_LEN;
18647
18648
        /* Check we have a bit for extension type. */
18649
0
        if ((type <= SEMAPHORE_MAX_DIRECT_TYPE)
18650
0
            || (type == TLSX_RENEGOTIATION_INFO)
18651
        #ifdef WOLFSSL_QUIC
18652
            || (type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT)
18653
        #endif
18654
        #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
18655
            || (type == TLSX_ECH)
18656
        #endif
18657
        #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
18658
            || (type == TLSX_CKS)
18659
        #endif
18660
0
            )
18661
0
        {
18662
            /* Detect duplicate recognized extensions. */
18663
0
            if (IS_OFF(seenType, TLSX_ToSemaphore(type))) {
18664
0
                TURN_ON(seenType, TLSX_ToSemaphore(type));
18665
0
            }
18666
0
            else {
18667
0
                return DUPLICATE_TLS_EXT_E;
18668
0
            }
18669
0
        }
18670
#if defined(HAVE_TLS_EXTENSIONS) && defined(OPENSSL_EXTRA)
18671
        /* The semaphore-based duplicate detection above does not cover
18672
         * application-registered custom extensions whose arbitrary type is
18673
         * above the semaphore range. Match OpenSSL, which gives each registered
18674
         * custom extension its own slot and rejects repeats: scan the
18675
         * already-parsed portion of this message for an earlier extension of
18676
         * the same type. (Types <= SEMAPHORE_MAX_DIRECT_TYPE are handled by
18677
         * the block above.) */
18678
        else if (type > SEMAPHORE_MAX_DIRECT_TYPE &&
18679
                TLSX_CustomExt_IsRegistered(ssl, type)) {
18680
            word32 scan = 0;
18681
            word32 upto = (word32)offset - HELLO_EXT_TYPE_SZ - OPAQUE16_LEN;
18682
            while (scan + HELLO_EXT_TYPE_SZ + OPAQUE16_LEN <= upto) {
18683
                word16 sT, sS;
18684
                ato16(input + scan, &sT);
18685
                ato16(input + scan + HELLO_EXT_TYPE_SZ, &sS);
18686
                if (sT == type)
18687
                    return DUPLICATE_TLS_EXT_E;
18688
                scan += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN + sS;
18689
            }
18690
        }
18691
#endif
18692
18693
0
        if (length - offset < size)
18694
0
            return BUFFER_ERROR;
18695
18696
#ifdef OPENSSL_EXTRA
18697
        /* Report the extension to the debug callback, like OpenSSL does in
18698
         * tls1_handle_extensions(). client_server is 1 when this SSL object
18699
         * is a client. */
18700
        if (ssl->tlsextDebugCb != NULL) {
18701
            ssl->tlsextDebugCb(ssl,
18702
                    (int)(ssl->options.side == WOLFSSL_CLIENT_END), (int)type,
18703
                    input + offset, (int)size, ssl->tlsextDebugArg);
18704
        }
18705
#endif
18706
18707
        /* Check minimum size required for TLSX, even if disabled */
18708
0
        switch (msgType) {
18709
0
            #ifndef NO_WOLFSSL_SERVER
18710
0
            case client_hello:
18711
0
                if (size < TLSX_GET_MIN_SIZE_CLIENT(&type)){
18712
0
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
18713
0
                    return BUFFER_ERROR;
18714
0
                }
18715
0
            break;
18716
0
            #endif
18717
0
            #ifndef NO_WOLFSSL_CLIENT
18718
0
            case server_hello:
18719
0
            case hello_retry_request:
18720
0
                if (size < TLSX_GET_MIN_SIZE_SERVER(&type)){
18721
0
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
18722
0
                    return BUFFER_ERROR;
18723
0
                }
18724
0
            break;
18725
0
            #endif
18726
0
            default:
18727
0
            break;
18728
0
        }
18729
18730
0
#ifdef WOLFSSL_TLS13
18731
        /* RFC 8446 4.4.2: extensions in a Certificate message MUST
18732
         * correspond to ones offered in our prior ClientHello (client) or
18733
         * CertificateRequest (server). Reject anything we did not offer, but a
18734
         * CTX-level API leaves the extension on ctx->extensions, so look there
18735
         * too before concluding it was never offered. */
18736
0
        if (msgType == certificate &&
18737
0
            IsAtLeastTLSv1_3(ssl->version) &&
18738
0
            TLSX_Find(ssl->extensions, (TLSX_Type)type) == NULL &&
18739
0
            (ssl->ctx == NULL ||
18740
0
             TLSX_Find(ssl->ctx->extensions, (TLSX_Type)type) == NULL)) {
18741
0
            WOLFSSL_MSG("Cert-msg extension not offered in CH/CR");
18742
0
            SendAlert(ssl, alert_fatal, unsupported_extension);
18743
0
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
18744
0
            return UNSUPPORTED_EXTENSION;
18745
0
        }
18746
0
#endif
18747
18748
0
        switch (type) {
18749
0
#ifdef HAVE_SNI
18750
0
            case TLSX_SERVER_NAME:
18751
0
                WOLFSSL_MSG("SNI extension received");
18752
            #ifdef WOLFSSL_DEBUG_TLS
18753
                WOLFSSL_BUFFER(input + offset, size);
18754
            #endif
18755
18756
0
#ifdef WOLFSSL_TLS13
18757
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18758
0
                    if (msgType != client_hello &&
18759
0
                        msgType != encrypted_extensions)
18760
0
                        return EXT_NOT_ALLOWED;
18761
0
                }
18762
0
                else
18763
0
#endif
18764
0
                {
18765
0
                    if (msgType != client_hello &&
18766
0
                        msgType != server_hello)
18767
0
                        return EXT_NOT_ALLOWED;
18768
0
                }
18769
0
                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
18770
0
                break;
18771
0
#endif
18772
18773
0
            case TLSX_TRUSTED_CA_KEYS:
18774
0
                WOLFSSL_MSG("Trusted CA extension received");
18775
            #ifdef WOLFSSL_DEBUG_TLS
18776
                WOLFSSL_BUFFER(input + offset, size);
18777
            #endif
18778
18779
0
#ifdef WOLFSSL_TLS13
18780
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18781
0
                    if (msgType != client_hello) {
18782
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18783
0
                        return EXT_NOT_ALLOWED;
18784
0
                    }
18785
0
                    break;
18786
0
                }
18787
0
                else
18788
0
#endif
18789
0
                {
18790
0
                    if (msgType != client_hello &&
18791
0
                        msgType != server_hello)
18792
0
                        return EXT_NOT_ALLOWED;
18793
0
                }
18794
0
                ret = TCA_PARSE(ssl, input + offset, size, isRequest);
18795
0
                break;
18796
18797
0
            case TLSX_MAX_FRAGMENT_LENGTH:
18798
0
                WOLFSSL_MSG("Max Fragment Length extension received");
18799
            #ifdef WOLFSSL_DEBUG_TLS
18800
                WOLFSSL_BUFFER(input + offset, size);
18801
            #endif
18802
18803
0
#ifdef WOLFSSL_TLS13
18804
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18805
0
                    if (msgType != client_hello &&
18806
0
                        msgType != encrypted_extensions) {
18807
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18808
0
                        return EXT_NOT_ALLOWED;
18809
0
                    }
18810
0
                }
18811
0
                else
18812
0
#endif
18813
0
                {
18814
0
                    if (msgType != client_hello &&
18815
0
                        msgType != server_hello) {
18816
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18817
0
                        return EXT_NOT_ALLOWED;
18818
0
                    }
18819
0
                }
18820
0
                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
18821
0
                break;
18822
18823
0
            case TLSX_TRUNCATED_HMAC:
18824
0
                WOLFSSL_MSG("Truncated HMAC extension received");
18825
            #ifdef WOLFSSL_DEBUG_TLS
18826
                WOLFSSL_BUFFER(input + offset, size);
18827
            #endif
18828
18829
0
#ifdef WOLFSSL_TLS13
18830
0
                if (IsAtLeastTLSv1_3(ssl->version))
18831
0
                    break;
18832
0
#endif
18833
0
                if (msgType != client_hello)
18834
0
                    return EXT_NOT_ALLOWED;
18835
0
                ret = THM_PARSE(ssl, input + offset, size, isRequest);
18836
0
                break;
18837
18838
0
            case TLSX_SUPPORTED_GROUPS:
18839
0
                WOLFSSL_MSG("Supported Groups extension received");
18840
            #ifdef WOLFSSL_DEBUG_TLS
18841
                WOLFSSL_BUFFER(input + offset, size);
18842
            #endif
18843
18844
0
#ifdef WOLFSSL_TLS13
18845
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18846
0
                    if (msgType != client_hello &&
18847
0
                        msgType != encrypted_extensions) {
18848
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18849
0
                        return EXT_NOT_ALLOWED;
18850
0
                    }
18851
0
                }
18852
0
                else
18853
0
#endif
18854
0
                {
18855
0
                    if (msgType != client_hello) {
18856
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18857
0
                        return EXT_NOT_ALLOWED;
18858
0
                    }
18859
0
                }
18860
0
                ret = EC_PARSE(ssl, input + offset, size, isRequest,
18861
0
                        &ssl->extensions);
18862
0
                break;
18863
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
18864
            case TLSX_CKS:
18865
                WOLFSSL_MSG("CKS extension received");
18866
                if (msgType != client_hello &&
18867
                     msgType != encrypted_extensions) {
18868
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18869
                        return EXT_NOT_ALLOWED;
18870
                }
18871
                ret = TLSX_CKS_Parse(ssl, (byte *)(input + offset), size,
18872
                                     &ssl->extensions);
18873
            break;
18874
#endif /* WOLFSSL_DUAL_ALG_CERTS */
18875
0
            case TLSX_EC_POINT_FORMATS:
18876
0
                WOLFSSL_MSG("Point Formats extension received");
18877
            #ifdef WOLFSSL_DEBUG_TLS
18878
                WOLFSSL_BUFFER(input + offset, size);
18879
            #endif
18880
18881
0
#ifdef WOLFSSL_TLS13
18882
0
                if (IsAtLeastTLSv1_3(ssl->version))
18883
0
                    break;
18884
0
#endif
18885
0
                if (msgType != client_hello &&
18886
0
                    msgType != server_hello) {
18887
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18888
0
                    return EXT_NOT_ALLOWED;
18889
0
                }
18890
18891
0
                ret = PF_PARSE(ssl, input + offset, size, isRequest);
18892
0
                break;
18893
18894
0
            case TLSX_STATUS_REQUEST:
18895
0
                WOLFSSL_MSG("Certificate Status Request extension received");
18896
            #ifdef WOLFSSL_DEBUG_TLS
18897
                WOLFSSL_BUFFER(input + offset, size);
18898
            #endif
18899
18900
0
#ifdef WOLFSSL_TLS13
18901
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18902
0
                    if (msgType != client_hello &&
18903
0
                        msgType != certificate_request &&
18904
0
                        msgType != certificate)
18905
0
                        return EXT_NOT_ALLOWED;
18906
0
                }
18907
0
                else
18908
0
 #endif
18909
0
                {
18910
0
                    if (msgType != client_hello &&
18911
0
                        msgType != server_hello)
18912
0
                        return EXT_NOT_ALLOWED;
18913
0
                }
18914
0
                ret = CSR_PARSE(ssl, input + offset, size, isRequest);
18915
0
                break;
18916
18917
0
            case TLSX_STATUS_REQUEST_V2:
18918
0
                WOLFSSL_MSG("Certificate Status Request v2 extension received");
18919
            #ifdef WOLFSSL_DEBUG_TLS
18920
                WOLFSSL_BUFFER(input + offset, size);
18921
            #endif
18922
18923
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
18924
                if (IsAtLeastTLSv1_3(ssl->version)) {
18925
                    /* RFC 8446 Section 4.4.2.1: a TLS 1.3 server must not send
18926
                     * this extension in EncryptedExtensions, CertificateRequest
18927
                     * or Certificate. ClientHello stays allowed because the
18928
                     * peer may still negotiate a lower version, where the
18929
                     * extension does apply. */
18930
                    if (msgType != client_hello)
18931
                        return EXT_NOT_ALLOWED;
18932
                }
18933
                else
18934
#endif
18935
0
                {
18936
0
                    if (msgType != client_hello &&
18937
0
                        msgType != server_hello)
18938
0
                        return EXT_NOT_ALLOWED;
18939
0
                }
18940
0
                ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
18941
0
                break;
18942
18943
0
#ifdef HAVE_EXTENDED_MASTER
18944
0
            case HELLO_EXT_EXTMS:
18945
0
                WOLFSSL_MSG("Extended Master Secret extension received");
18946
            #ifdef WOLFSSL_DEBUG_TLS
18947
                WOLFSSL_BUFFER(input + offset, size);
18948
            #endif
18949
18950
0
#if defined(WOLFSSL_TLS13)
18951
0
                if (IsAtLeastTLSv1_3(ssl->version))
18952
0
                    break;
18953
0
#endif
18954
0
                if (msgType != client_hello &&
18955
0
                    msgType != server_hello)
18956
0
                    return EXT_NOT_ALLOWED;
18957
0
                if (size != 0)
18958
0
                    return BUFFER_ERROR;
18959
18960
                /* Honor a user request to disable EMS by ignoring the peer's
18961
                 * extension rather than enabling it. */
18962
0
                if (!ssl->options.disableEMS) {
18963
0
#ifndef NO_WOLFSSL_SERVER
18964
0
                    if (isRequest)
18965
0
                        ssl->options.haveEMS = 1;
18966
0
#endif
18967
0
                    pendingEMS = 1;
18968
0
                }
18969
0
                break;
18970
0
#endif
18971
18972
0
            case TLSX_RENEGOTIATION_INFO:
18973
0
                WOLFSSL_MSG("Secure Renegotiation extension received");
18974
            #ifdef WOLFSSL_DEBUG_TLS
18975
                WOLFSSL_BUFFER(input + offset, size);
18976
            #endif
18977
18978
0
#ifdef WOLFSSL_TLS13
18979
0
                if (IsAtLeastTLSv1_3(ssl->version))
18980
0
                    break;
18981
0
#endif
18982
0
                if (msgType != client_hello &&
18983
0
                    msgType != server_hello)
18984
0
                    return EXT_NOT_ALLOWED;
18985
0
                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
18986
0
                break;
18987
18988
0
            case TLSX_SESSION_TICKET:
18989
0
                WOLFSSL_MSG("Session Ticket extension received");
18990
            #ifdef WOLFSSL_DEBUG_TLS
18991
                WOLFSSL_BUFFER(input + offset, size);
18992
            #endif
18993
18994
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
18995
                if (IsAtLeastTLSv1_3(ssl->version)) {
18996
                    if (msgType != client_hello)
18997
                        return EXT_NOT_ALLOWED;
18998
                }
18999
                else
19000
#endif
19001
0
                {
19002
0
                    if (msgType != client_hello &&
19003
0
                        msgType != server_hello)
19004
0
                        return EXT_NOT_ALLOWED;
19005
0
                }
19006
0
                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
19007
0
                break;
19008
19009
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
19010
0
                WOLFSSL_MSG("ALPN extension received");
19011
19012
            #ifdef WOLFSSL_DEBUG_TLS
19013
                WOLFSSL_BUFFER(input + offset, size);
19014
            #endif
19015
19016
#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
19017
                if (IsAtLeastTLSv1_3(ssl->version)) {
19018
                    if (msgType != client_hello &&
19019
                        msgType != encrypted_extensions)
19020
                        return EXT_NOT_ALLOWED;
19021
                }
19022
                else
19023
#endif
19024
0
                {
19025
0
                    if (msgType != client_hello &&
19026
0
                        msgType != server_hello)
19027
0
                        return EXT_NOT_ALLOWED;
19028
0
                }
19029
0
                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
19030
0
                break;
19031
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
19032
0
            case TLSX_SIGNATURE_ALGORITHMS:
19033
0
                WOLFSSL_MSG("Signature Algorithms extension received");
19034
            #ifdef WOLFSSL_DEBUG_TLS
19035
                WOLFSSL_BUFFER(input + offset, size);
19036
            #endif
19037
19038
0
                if (!IsAtLeastTLSv1_2(ssl))
19039
0
                    break;
19040
0
            #ifdef WOLFSSL_TLS13
19041
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
19042
0
                    if (msgType != client_hello &&
19043
0
                        msgType != certificate_request)
19044
0
                        return EXT_NOT_ALLOWED;
19045
0
                }
19046
0
                else
19047
0
            #endif
19048
0
                {
19049
0
                    if (msgType != client_hello)
19050
0
                        return EXT_NOT_ALLOWED;
19051
0
                }
19052
0
                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
19053
0
                break;
19054
0
#endif
19055
19056
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
19057
0
            case TLSX_ENCRYPT_THEN_MAC:
19058
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension received");
19059
19060
                /* Ignore for TLS 1.3+ */
19061
0
                if (IsAtLeastTLSv1_3(ssl->version))
19062
0
                    break;
19063
0
                if (msgType != client_hello &&
19064
0
                    msgType != server_hello)
19065
0
                    return EXT_NOT_ALLOWED;
19066
19067
0
                ret = ETM_PARSE(ssl, input + offset, size, msgType);
19068
0
                break;
19069
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
19070
19071
0
#ifdef WOLFSSL_TLS13
19072
0
            case TLSX_SUPPORTED_VERSIONS:
19073
0
                WOLFSSL_MSG("Skipping Supported Versions - already processed");
19074
            #ifdef WOLFSSL_DEBUG_TLS
19075
                WOLFSSL_BUFFER(input + offset, size);
19076
            #endif
19077
0
                if (msgType != client_hello &&
19078
0
                    msgType != server_hello &&
19079
0
                    msgType != hello_retry_request)
19080
0
                    return EXT_NOT_ALLOWED;
19081
19082
0
                break;
19083
19084
0
            case TLSX_COOKIE:
19085
0
                WOLFSSL_MSG("Cookie extension received");
19086
            #ifdef WOLFSSL_DEBUG_TLS
19087
                WOLFSSL_BUFFER(input + offset, size);
19088
            #endif
19089
0
                if (!IsAtLeastTLSv1_3(ssl->version))
19090
0
                    break;
19091
19092
0
                if (msgType != client_hello &&
19093
0
                    msgType != hello_retry_request) {
19094
0
                    return EXT_NOT_ALLOWED;
19095
0
                }
19096
19097
0
                ret = CKE_PARSE(ssl, input + offset, size, msgType);
19098
0
                break;
19099
19100
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
19101
            case TLSX_PRE_SHARED_KEY:
19102
                WOLFSSL_MSG("Pre-Shared Key extension received");
19103
            #ifdef WOLFSSL_DEBUG_TLS
19104
                WOLFSSL_BUFFER(input + offset, size);
19105
            #endif
19106
19107
                if (!IsAtLeastTLSv1_3(ssl->version))
19108
                    break;
19109
19110
                if (msgType != client_hello &&
19111
                    msgType != server_hello) {
19112
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19113
                    return EXT_NOT_ALLOWED;
19114
                }
19115
19116
                ret = PSK_PARSE(ssl, input + offset, size, msgType);
19117
                pskDone = 1;
19118
                break;
19119
19120
            case TLSX_PSK_KEY_EXCHANGE_MODES:
19121
                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
19122
            #ifdef WOLFSSL_DEBUG_TLS
19123
                WOLFSSL_BUFFER(input + offset, size);
19124
            #endif
19125
19126
                if (!IsAtLeastTLSv1_3(ssl->version))
19127
                    break;
19128
19129
                if (msgType != client_hello) {
19130
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19131
                    return EXT_NOT_ALLOWED;
19132
                }
19133
19134
                ret = PKM_PARSE(ssl, input + offset, size, msgType);
19135
                break;
19136
19137
    #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
19138
            case TLSX_CERT_WITH_EXTERN_PSK:
19139
                WOLFSSL_MSG("Cert with external PSK extension received");
19140
            #ifdef WOLFSSL_DEBUG_TLS
19141
                WOLFSSL_BUFFER(input + offset, size);
19142
            #endif
19143
19144
                if (!IsAtLeastTLSv1_3(ssl->version))
19145
                    break;
19146
19147
                if (msgType != client_hello && msgType != server_hello) {
19148
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19149
                    return EXT_NOT_ALLOWED;
19150
                }
19151
                if (size != 0) {
19152
                    WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
19153
                    return BUFFER_ERROR;
19154
                }
19155
19156
                ret = PSK_WITH_CERT_PARSE(ssl, msgType);
19157
                break;
19158
    #endif
19159
    #endif
19160
19161
    #ifdef WOLFSSL_EARLY_DATA
19162
            case TLSX_EARLY_DATA:
19163
                WOLFSSL_MSG("Early Data extension received");
19164
            #ifdef WOLFSSL_DEBUG_TLS
19165
                WOLFSSL_BUFFER(input + offset, size);
19166
            #endif
19167
19168
                if (!IsAtLeastTLSv1_3(ssl->version))
19169
                    break;
19170
19171
                if (msgType != client_hello && msgType != session_ticket &&
19172
                    msgType != encrypted_extensions) {
19173
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19174
                    return EXT_NOT_ALLOWED;
19175
                }
19176
                ret = EDI_PARSE(ssl, input + offset, size, msgType);
19177
                break;
19178
    #endif
19179
19180
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
19181
            case TLSX_POST_HANDSHAKE_AUTH:
19182
                WOLFSSL_MSG("Post Handshake Authentication extension received");
19183
            #ifdef WOLFSSL_DEBUG_TLS
19184
                WOLFSSL_BUFFER(input + offset, size);
19185
            #endif
19186
19187
                if (!IsAtLeastTLSv1_3(ssl->version))
19188
                    break;
19189
19190
                if (msgType != client_hello) {
19191
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19192
                    return EXT_NOT_ALLOWED;
19193
                }
19194
19195
                ret = PHA_PARSE(ssl, input + offset, size, msgType);
19196
                break;
19197
    #endif
19198
19199
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
19200
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
19201
0
                WOLFSSL_MSG("Signature Algorithms extension received");
19202
            #ifdef WOLFSSL_DEBUG_TLS
19203
                WOLFSSL_BUFFER(input + offset, size);
19204
            #endif
19205
19206
0
                if (!IsAtLeastTLSv1_3(ssl->version))
19207
0
                    break;
19208
19209
0
                if (msgType != client_hello &&
19210
0
                        msgType != certificate_request) {
19211
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19212
0
                    return EXT_NOT_ALLOWED;
19213
0
                }
19214
19215
0
                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
19216
0
                break;
19217
0
    #endif
19218
19219
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
19220
            case TLSX_CERTIFICATE_AUTHORITIES:
19221
                WOLFSSL_MSG("Certificate Authorities extension received");
19222
            #ifdef WOLFSSL_DEBUG_TLS
19223
                WOLFSSL_BUFFER(input + offset, size);
19224
            #endif
19225
19226
                if (!IsAtLeastTLSv1_3(ssl->version))
19227
                    break;
19228
19229
                if (msgType != client_hello &&
19230
                        msgType != certificate_request) {
19231
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19232
                    return EXT_NOT_ALLOWED;
19233
                }
19234
19235
                ret = CAN_PARSE(ssl, input + offset, size, isRequest);
19236
                break;
19237
    #endif
19238
19239
0
            case TLSX_KEY_SHARE:
19240
0
                WOLFSSL_MSG("Key Share extension received");
19241
            #ifdef WOLFSSL_DEBUG_TLS
19242
                WOLFSSL_BUFFER(input + offset, size);
19243
            #endif
19244
19245
0
    #ifdef HAVE_SUPPORTED_CURVES
19246
0
                if (!IsAtLeastTLSv1_3(ssl->version))
19247
0
                    break;
19248
19249
0
                if (msgType != client_hello && msgType != server_hello &&
19250
0
                        msgType != hello_retry_request) {
19251
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19252
0
                    return EXT_NOT_ALLOWED;
19253
0
                }
19254
0
    #endif
19255
19256
0
                ret = KS_PARSE(ssl, input + offset, size, msgType);
19257
0
                break;
19258
0
#endif
19259
#ifdef WOLFSSL_SRTP
19260
            case TLSX_USE_SRTP:
19261
                WOLFSSL_MSG("Use SRTP extension received");
19262
19263
#if defined(WOLFSSL_TLS13)
19264
                if (IsAtLeastTLSv1_3(ssl->version)) {
19265
                    if (msgType != client_hello &&
19266
                        msgType != encrypted_extensions)
19267
                        return EXT_NOT_ALLOWED;
19268
                }
19269
                else
19270
#endif
19271
                {
19272
                    if (msgType != client_hello &&
19273
                        msgType != server_hello)
19274
                        return EXT_NOT_ALLOWED;
19275
                }
19276
                ret = SRTP_PARSE(ssl, input + offset, size, isRequest);
19277
                break;
19278
#endif
19279
#ifdef WOLFSSL_QUIC
19280
            case TLSX_KEY_QUIC_TP_PARAMS:
19281
                FALL_THROUGH;
19282
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
19283
                WOLFSSL_MSG("QUIC transport parameter received");
19284
            #ifdef WOLFSSL_DEBUG_TLS
19285
                WOLFSSL_BUFFER(input + offset, size);
19286
            #endif
19287
19288
                if (IsAtLeastTLSv1_3(ssl->version) &&
19289
                        msgType != client_hello &&
19290
                        msgType != encrypted_extensions) {
19291
                    return EXT_NOT_ALLOWED;
19292
                }
19293
                else if (!IsAtLeastTLSv1_3(ssl->version) &&
19294
                         msgType == encrypted_extensions) {
19295
                    return EXT_NOT_ALLOWED;
19296
                }
19297
                else if (WOLFSSL_IS_QUIC(ssl)) {
19298
                    ret = QTP_PARSE(ssl, input + offset, size, type, msgType);
19299
                }
19300
                else {
19301
                    WOLFSSL_MSG("QUIC transport param TLS extension type, but no QUIC");
19302
                    SendAlert(ssl, alert_fatal, unsupported_extension);
19303
                    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
19304
                    return UNSUPPORTED_EXTENSION;
19305
                }
19306
                break;
19307
#endif /* WOLFSSL_QUIC */
19308
#if defined(WOLFSSL_DTLS_CID)
19309
            case TLSX_CONNECTION_ID:
19310
                if (msgType != client_hello && msgType != server_hello)
19311
                    return EXT_NOT_ALLOWED;
19312
19313
                WOLFSSL_MSG("ConnectionID extension received");
19314
                ret = CID_PARSE(ssl, input + offset, size, isRequest);
19315
                break;
19316
19317
#endif /* defined(WOLFSSL_DTLS_CID) */
19318
#if defined(HAVE_RPK)
19319
            case TLSX_CLIENT_CERTIFICATE_TYPE:
19320
                WOLFSSL_MSG("Client Certificate Type extension received");
19321
#if defined(WOLFSSL_TLS13)
19322
                /* RFC 8446, Section 4.2 (Extensions), client_certificate_type
19323
                   and server_certificate_type MUST be sent in ClientHello(CH)
19324
                   or EncryptedExtensions(EE) */
19325
                if (IsAtLeastTLSv1_3(ssl->version)) {
19326
                    if (msgType != client_hello &&
19327
                        msgType != encrypted_extensions) {
19328
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19329
                        return EXT_NOT_ALLOWED;
19330
                    }
19331
                }
19332
                else
19333
#endif
19334
                {
19335
                    /* TLS 1.2: allowed in CH and SH (RFC 7250) */
19336
                    if (msgType != client_hello &&
19337
                        msgType != server_hello) {
19338
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19339
                        return EXT_NOT_ALLOWED;
19340
                    }
19341
                }
19342
                ret = CCT_PARSE(ssl, input + offset, size, msgType);
19343
                break;
19344
19345
            case TLSX_SERVER_CERTIFICATE_TYPE:
19346
                WOLFSSL_MSG("Server Certificate Type extension received");
19347
#if defined(WOLFSSL_TLS13)
19348
                /* RFC 8446, Section 4.2 (Extensions) */
19349
                if (IsAtLeastTLSv1_3(ssl->version)) {
19350
                    if (msgType != client_hello &&
19351
                        msgType != encrypted_extensions) {
19352
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19353
                        return EXT_NOT_ALLOWED;
19354
                    }
19355
                }
19356
                else
19357
#endif
19358
                {
19359
                    /* TLS 1.2: allowed in CH and SH (RFC 7250) */
19360
                    if (msgType != client_hello &&
19361
                        msgType != server_hello) {
19362
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19363
                        return EXT_NOT_ALLOWED;
19364
                    }
19365
                }
19366
                ret = SCT_PARSE(ssl, input + offset, size, msgType);
19367
                break;
19368
#endif /* HAVE_RPK */
19369
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
19370
            case TLSX_ECH:
19371
                WOLFSSL_MSG("ECH extension received");
19372
                if (!IsAtLeastTLSv1_3(ssl->version))
19373
                    break;
19374
19375
                if (msgType != client_hello &&
19376
                    msgType != encrypted_extensions &&
19377
                    msgType != hello_retry_request) {
19378
                    return EXT_NOT_ALLOWED;
19379
                }
19380
19381
                ret = ECH_PARSE(ssl, input + offset, size, msgType);
19382
                break;
19383
            case TLSXT_ECH_OUTER_EXTENSIONS:
19384
                /* RFC 9849 s5.1: ech_outer_extensions MUST only appear in
19385
                 * the EncodedClientHelloInner */
19386
                WOLFSSL_MSG("ech_outer_extensions in plaintext message");
19387
                WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
19388
                return INVALID_PARAMETER;
19389
#endif
19390
0
            default:
19391
#if defined(HAVE_TLS_EXTENSIONS) && defined(OPENSSL_EXTRA)
19392
                {
19393
                    /* Custom (application-defined) extension handler, if one
19394
                     * was registered for this type. */
19395
                    int customFound = 0;
19396
                    ret = TLSX_CustomExt_Parse(ssl, msgType, type,
19397
                                               input + offset, size,
19398
                                               &customFound);
19399
                    if (ret != 0)
19400
                        return ret;
19401
                    if (customFound)
19402
                        break;
19403
                }
19404
#endif
19405
0
                WOLFSSL_MSG("Unknown TLS extension type");
19406
0
#if defined(WOLFSSL_TLS13)
19407
                /* RFC 8446 Sec. 4.2: a TLS 1.3 client MUST abort with an
19408
                 * unsupported_extension alert when it receives an extension
19409
                 * "response" that was not advertised in the ClientHello. The
19410
                 * rule applies only to messages whose extensions are responses
19411
                 * to the ClientHello: ServerHello, HelloRetryRequest,
19412
                 * EncryptedExtensions and Certificate.
19413
                 *
19414
                 * Extensions in CertificateRequest and NewSessionTicket are
19415
                 * independent server-initiated payloads, not responses, and
19416
                 * per RFC 8701 (GREASE) the server MAY include unknown
19417
                 * (GREASE) extension types there which the client MUST treat
19418
                 * like any other unknown value (i.e. ignore them). */
19419
0
                if (IsAtLeastTLSv1_3(ssl->version) &&
19420
0
                        (msgType == server_hello ||
19421
0
                         msgType == hello_retry_request ||
19422
0
                         msgType == encrypted_extensions ||
19423
0
                         msgType == certificate)) {
19424
0
                    SendAlert((WOLFSSL*)ssl, alert_fatal, unsupported_extension);
19425
0
                    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
19426
0
                    return UNSUPPORTED_EXTENSION;
19427
0
                }
19428
0
#endif
19429
0
        }
19430
19431
        /* offset should be updated here! */
19432
0
        offset += size;
19433
0
    }
19434
19435
0
#ifdef HAVE_EXTENDED_MASTER
19436
0
    if (IsAtLeastTLSv1_3(ssl->version) &&
19437
0
        (msgType == hello_retry_request || msgType == hello_verify_request ||
19438
0
         msgType == session_ticket)) {
19439
        /* Don't change EMS status until server_hello received.
19440
         * Second ClientHello must have same extensions.
19441
         * NewSessionTicket is post-handshake and never carries the extension,
19442
         * so its absence there says nothing about what was negotiated.
19443
         */
19444
0
    }
19445
0
    else if (!isRequest && ssl->options.haveEMS && !pendingEMS)
19446
0
        ssl->options.haveEMS = 0;
19447
0
#endif
19448
#if defined(WOLFSSL_TLS13) && !defined(NO_PSK)
19449
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == server_hello &&
19450
        IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE))) {
19451
        ssl->options.noPskDheKe = 1;
19452
    }
19453
#endif
19454
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
19455
    !defined(NO_PSK)
19456
    if (IsAtLeastTLSv1_3(ssl->version)) {
19457
        int hasPskWithCert = !IS_OFF(seenType,
19458
            TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
19459
        if (hasPskWithCert && ssl->options.certWithExternPsk) {
19460
            int hasPsk = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
19461
            int hasPskModes = !IS_OFF(seenType,
19462
                TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
19463
            int hasKeyShare = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE));
19464
            int hasSg = !IS_OFF(seenType,
19465
                TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
19466
            int hasSigAlg = !IS_OFF(seenType,
19467
                TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
19468
#ifdef WOLFSSL_EARLY_DATA
19469
            int hasEarlyData = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_EARLY_DATA));
19470
#endif
19471
19472
            if (msgType == client_hello && isRequest) {
19473
                TLSX* pskm;
19474
                /* RFC 9973: CH2 after HRR must keep CH1's extension set. */
19475
                if (secondClientHello && !prevHasPskWithCert) {
19476
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19477
                    return EXT_NOT_ALLOWED;
19478
                }
19479
                /* RFC 9973: cert_with_extern_psk depends on these extensions. */
19480
                if (!hasPsk || !hasPskModes || !hasKeyShare || !hasSg ||
19481
                    !hasSigAlg) {
19482
                    WOLFSSL_ERROR_VERBOSE(EXT_MISSING);
19483
                    return EXT_MISSING;
19484
                }
19485
#ifdef WOLFSSL_EARLY_DATA
19486
                /* External PSK + certificate mode forbids 0-RTT in CH.
19487
                 * When WOLFSSL_EARLY_DATA is not defined there is no parser
19488
                 * case for TLSX_EARLY_DATA, so an incoming early_data
19489
                 * extension is treated as unknown and ignored per RFC 8446
19490
                 * Sect. 4.2 - no additional check is needed in that case. */
19491
                if (hasEarlyData) {
19492
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19493
                    return EXT_NOT_ALLOWED;
19494
                }
19495
#endif
19496
                pskm = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
19497
                /* RFC 9973 requires client support for psk_dhe_ke mode. */
19498
                if (pskm == NULL || (pskm->val & (1 << PSK_DHE_KE)) == 0) {
19499
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19500
                    return EXT_NOT_ALLOWED;
19501
                }
19502
            }
19503
            else if (msgType == server_hello && !isRequest) {
19504
                /* SH confirming cert_with_extern_psk must also confirm PSK and KSE. */
19505
                if (!hasPsk || !hasKeyShare) {
19506
                    WOLFSSL_ERROR_VERBOSE(EXT_MISSING);
19507
                    return EXT_MISSING;
19508
                }
19509
            }
19510
        }
19511
        else if (msgType == client_hello && isRequest && secondClientHello &&
19512
                prevHasPskWithCert) {
19513
            /* RFC 9973: reject dropping the extension in CH2 after HRR. */
19514
            WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19515
            return EXT_NOT_ALLOWED;
19516
        }
19517
    }
19518
#endif
19519
0
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
19520
    /* RFC 8446 Section 9.2: ClientHello with KeyShare must
19521
     * contain SupportedGroups and vice-versa. */
19522
0
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == client_hello && isRequest) {
19523
0
        int hasKeyShare = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE));
19524
0
        int hasSupportedGroups = !IS_OFF(seenType,
19525
0
            TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
19526
19527
0
        if (hasKeyShare && !hasSupportedGroups) {
19528
0
            WOLFSSL_MSG("ClientHello with KeyShare extension missing required "
19529
0
                        "SupportedGroups extension");
19530
0
            return INCOMPLETE_DATA;
19531
0
        }
19532
0
        if (hasSupportedGroups && !hasKeyShare) {
19533
0
            WOLFSSL_MSG("ClientHello with SupportedGroups extension missing "
19534
0
                        "required KeyShare extension");
19535
0
            return INCOMPLETE_DATA;
19536
0
        }
19537
0
    }
19538
0
#endif
19539
19540
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
19541
    /* Reconcile ECH inner/outer extensions before verifying SNI so the verify
19542
     * pass sees the authoritative list */
19543
    if (ret == 0 && msgType == client_hello && isRequest &&
19544
            !ssl->options.echProcessingInner &&
19545
            ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
19546
        TLSX* echX = TLSX_Find(ssl->extensions, TLSX_ECH);
19547
        WOLFSSL_ECH* ech = NULL;
19548
        if (echX != NULL)
19549
            ech = (WOLFSSL_ECH*)echX->data;
19550
19551
        if (ech != NULL) {
19552
            if (ech->state == ECH_WRITE_NONE && ech->innerClientHello != NULL) {
19553
                /* ECH accepted: use private extensions
19554
                 * return early, inner hello needs to be parsed before VERIFY */
19555
                return TLSX_EchReplaceExtensions(ssl, ssl->options.echAccepted);
19556
            }
19557
            else {
19558
                /* If ECH was accepted in CH1 then CH2 MUST contain an ECH
19559
                 * extension */
19560
                if (ssl->options.serverState ==
19561
                            SERVER_HELLO_RETRY_REQUEST_COMPLETE &&
19562
                        ssl->options.echAccepted) {
19563
                    WOLFSSL_MSG("Client did not send an EncryptedClientHello "
19564
                                "extension");
19565
                    WOLFSSL_ERROR_VERBOSE(INCOMPLETE_DATA);
19566
                    return INCOMPLETE_DATA;
19567
                }
19568
                /* Otherwise ECH rejected: use public extensions */
19569
                if (ech->state == ECH_WRITE_NONE ||
19570
                        ech->state == ECH_WRITE_RETRY_CONFIGS) {
19571
                    ret = TLSX_EchReplaceExtensions(ssl,
19572
                        ssl->options.echAccepted);
19573
                    if (ret == 0 && ech->state == ECH_WRITE_NONE) {
19574
                        echX->resp = 0;
19575
                    }
19576
                }
19577
            }
19578
        }
19579
    }
19580
#endif
19581
19582
0
    if (ret == 0)
19583
0
        ret = SNI_VERIFY_PARSE(ssl, isRequest);
19584
0
    if (ret == 0)
19585
0
        ret = TCA_VERIFY_PARSE(ssl, isRequest);
19586
19587
0
    WOLFSSL_LEAVE("Leaving TLSX_Parse", ret);
19588
0
    return ret;
19589
0
}
19590
19591
/* undefining semaphore macros */
19592
#undef IS_OFF
19593
#undef TURN_ON
19594
#undef SEMAPHORE_SIZE
19595
19596
#endif /* HAVE_TLS_EXTENSIONS */
19597
19598
#ifndef NO_WOLFSSL_CLIENT
19599
19600
    WOLFSSL_METHOD* wolfTLS_client_method(void)
19601
0
    {
19602
0
        return wolfTLS_client_method_ex(NULL);
19603
0
    }
19604
    WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
19605
0
    {
19606
0
        WOLFSSL_METHOD* method =
19607
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19608
0
                                                     heap, DYNAMIC_TYPE_METHOD);
19609
0
        (void)heap;
19610
0
        WOLFSSL_ENTER("TLS_client_method_ex");
19611
0
        if (method) {
19612
0
        #if defined(WOLFSSL_TLS13)
19613
0
            InitSSL_Method(method, MakeTLSv1_3());
19614
        #elif !defined(WOLFSSL_NO_TLS12)
19615
            InitSSL_Method(method, MakeTLSv1_2());
19616
        #elif !defined(NO_OLD_TLS)
19617
            InitSSL_Method(method, MakeTLSv1_1());
19618
        #elif defined(WOLFSSL_ALLOW_TLSV10)
19619
            InitSSL_Method(method, MakeTLSv1());
19620
        #else
19621
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
19622
        #endif
19623
19624
0
            method->downgrade = 1;
19625
0
            method->side      = WOLFSSL_CLIENT_END;
19626
0
        }
19627
0
        return method;
19628
0
    }
19629
19630
#ifndef NO_OLD_TLS
19631
    #ifdef WOLFSSL_ALLOW_TLSV10
19632
    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
19633
    {
19634
        return wolfTLSv1_client_method_ex(NULL);
19635
    }
19636
    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
19637
    {
19638
        WOLFSSL_METHOD* method =
19639
                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19640
                                                     heap, DYNAMIC_TYPE_METHOD);
19641
        (void)heap;
19642
        WOLFSSL_ENTER("TLSv1_client_method_ex");
19643
        if (method)
19644
            InitSSL_Method(method, MakeTLSv1());
19645
        return method;
19646
    }
19647
    #endif /* WOLFSSL_ALLOW_TLSV10 */
19648
19649
    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
19650
    {
19651
        return wolfTLSv1_1_client_method_ex(NULL);
19652
    }
19653
    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
19654
    {
19655
        WOLFSSL_METHOD* method =
19656
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19657
                                                     heap, DYNAMIC_TYPE_METHOD);
19658
        (void)heap;
19659
        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
19660
        if (method)
19661
            InitSSL_Method(method, MakeTLSv1_1());
19662
        return method;
19663
    }
19664
#endif /* !NO_OLD_TLS */
19665
19666
#ifndef WOLFSSL_NO_TLS12
19667
    WOLFSSL_ABI
19668
    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
19669
4
    {
19670
4
        return wolfTLSv1_2_client_method_ex(NULL);
19671
4
    }
19672
    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
19673
4
    {
19674
4
        WOLFSSL_METHOD* method =
19675
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19676
4
                                                     heap, DYNAMIC_TYPE_METHOD);
19677
4
        (void)heap;
19678
4
        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
19679
4
        if (method)
19680
4
            InitSSL_Method(method, MakeTLSv1_2());
19681
4
        return method;
19682
4
    }
19683
#endif /* WOLFSSL_NO_TLS12 */
19684
19685
#ifdef WOLFSSL_TLS13
19686
    /* The TLS v1.3 client method data.
19687
     *
19688
     * returns the method data for a TLS v1.3 client.
19689
     */
19690
    WOLFSSL_ABI
19691
    WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
19692
4
    {
19693
4
        return wolfTLSv1_3_client_method_ex(NULL);
19694
4
    }
19695
19696
    /* The TLS v1.3 client method data.
19697
     *
19698
     * heap  The heap used for allocation.
19699
     * returns the method data for a TLS v1.3 client.
19700
     */
19701
    WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
19702
4
    {
19703
4
        WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
19704
4
                                 XMALLOC(sizeof(WOLFSSL_METHOD), heap,
19705
4
                                         DYNAMIC_TYPE_METHOD);
19706
4
        (void)heap;
19707
4
        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
19708
4
        if (method)
19709
4
            InitSSL_Method(method, MakeTLSv1_3());
19710
4
        return method;
19711
4
    }
19712
#endif /* WOLFSSL_TLS13 */
19713
19714
#ifdef WOLFSSL_DTLS
19715
19716
    WOLFSSL_METHOD* wolfDTLS_client_method(void)
19717
    {
19718
        return wolfDTLS_client_method_ex(NULL);
19719
    }
19720
    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
19721
    {
19722
        WOLFSSL_METHOD* method =
19723
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19724
                                                     heap, DYNAMIC_TYPE_METHOD);
19725
        (void)heap;
19726
        WOLFSSL_ENTER("DTLS_client_method_ex");
19727
        if (method) {
19728
        #if defined(WOLFSSL_DTLS13)
19729
            InitSSL_Method(method, MakeDTLSv1_3());
19730
        #elif !defined(WOLFSSL_NO_TLS12)
19731
            InitSSL_Method(method, MakeDTLSv1_2());
19732
        #elif !defined(NO_OLD_TLS)
19733
            InitSSL_Method(method, MakeDTLSv1());
19734
        #else
19735
            #error No DTLS version enabled!
19736
        #endif
19737
19738
            method->downgrade = 1;
19739
            method->side      = WOLFSSL_CLIENT_END;
19740
        }
19741
        return method;
19742
    }
19743
19744
    #ifndef NO_OLD_TLS
19745
    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
19746
    {
19747
        return wolfDTLSv1_client_method_ex(NULL);
19748
    }
19749
    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
19750
    {
19751
        WOLFSSL_METHOD* method =
19752
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19753
                                                 heap, DYNAMIC_TYPE_METHOD);
19754
        (void)heap;
19755
        WOLFSSL_ENTER("DTLSv1_client_method_ex");
19756
        if (method)
19757
            InitSSL_Method(method, MakeDTLSv1());
19758
        return method;
19759
    }
19760
    #endif  /* NO_OLD_TLS */
19761
19762
    #ifndef WOLFSSL_NO_TLS12
19763
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
19764
    {
19765
        return wolfDTLSv1_2_client_method_ex(NULL);
19766
    }
19767
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
19768
    {
19769
        WOLFSSL_METHOD* method =
19770
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19771
                                                 heap, DYNAMIC_TYPE_METHOD);
19772
        (void)heap;
19773
        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
19774
        if (method)
19775
            InitSSL_Method(method, MakeDTLSv1_2());
19776
        (void)heap;
19777
        return method;
19778
    }
19779
    #endif /* !WOLFSSL_NO_TLS12 */
19780
#endif /* WOLFSSL_DTLS */
19781
19782
#endif /* NO_WOLFSSL_CLIENT */
19783
19784
19785
/* EITHER SIDE METHODS */
19786
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
19787
    #ifndef NO_OLD_TLS
19788
    #ifdef WOLFSSL_ALLOW_TLSV10
19789
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
19790
     *
19791
     * Returns a pointer to a WOLFSSL_METHOD struct
19792
     */
19793
    WOLFSSL_METHOD* wolfTLSv1_method(void)
19794
    {
19795
        return wolfTLSv1_method_ex(NULL);
19796
    }
19797
    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
19798
    {
19799
        WOLFSSL_METHOD* m;
19800
        WOLFSSL_ENTER("TLSv1_method");
19801
    #ifndef NO_WOLFSSL_CLIENT
19802
        m = wolfTLSv1_client_method_ex(heap);
19803
    #else
19804
        m = wolfTLSv1_server_method_ex(heap);
19805
    #endif
19806
        if (m != NULL) {
19807
            m->side = WOLFSSL_NEITHER_END;
19808
        }
19809
19810
        return m;
19811
    }
19812
    #endif /* WOLFSSL_ALLOW_TLSV10 */
19813
19814
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
19815
     *
19816
     * Returns a pointer to a WOLFSSL_METHOD struct
19817
     */
19818
    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
19819
    {
19820
        return wolfTLSv1_1_method_ex(NULL);
19821
    }
19822
    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
19823
    {
19824
        WOLFSSL_METHOD* m;
19825
        WOLFSSL_ENTER("TLSv1_1_method");
19826
    #ifndef NO_WOLFSSL_CLIENT
19827
        m = wolfTLSv1_1_client_method_ex(heap);
19828
    #else
19829
        m = wolfTLSv1_1_server_method_ex(heap);
19830
    #endif
19831
        if (m != NULL) {
19832
            m->side = WOLFSSL_NEITHER_END;
19833
        }
19834
        return m;
19835
    }
19836
    #endif /* !NO_OLD_TLS */
19837
19838
    #ifndef WOLFSSL_NO_TLS12
19839
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
19840
     *
19841
     * Returns a pointer to a WOLFSSL_METHOD struct
19842
     */
19843
    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
19844
    {
19845
        return wolfTLSv1_2_method_ex(NULL);
19846
    }
19847
    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
19848
    {
19849
        WOLFSSL_METHOD* m;
19850
        WOLFSSL_ENTER("TLSv1_2_method");
19851
    #ifndef NO_WOLFSSL_CLIENT
19852
        m = wolfTLSv1_2_client_method_ex(heap);
19853
    #else
19854
        m = wolfTLSv1_2_server_method_ex(heap);
19855
    #endif
19856
        if (m != NULL) {
19857
            m->side = WOLFSSL_NEITHER_END;
19858
        }
19859
        return m;
19860
    }
19861
    #endif /* !WOLFSSL_NO_TLS12 */
19862
19863
    #ifdef WOLFSSL_TLS13
19864
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
19865
     *
19866
     * Returns a pointer to a WOLFSSL_METHOD struct
19867
     */
19868
    WOLFSSL_METHOD* wolfTLSv1_3_method(void)
19869
    {
19870
        return wolfTLSv1_3_method_ex(NULL);
19871
    }
19872
    WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
19873
    {
19874
        WOLFSSL_METHOD* m;
19875
        WOLFSSL_ENTER("TLSv1_3_method");
19876
    #ifndef NO_WOLFSSL_CLIENT
19877
        m = wolfTLSv1_3_client_method_ex(heap);
19878
    #else
19879
        m = wolfTLSv1_3_server_method_ex(heap);
19880
    #endif
19881
        if (m != NULL) {
19882
            m->side = WOLFSSL_NEITHER_END;
19883
        }
19884
        return m;
19885
    }
19886
    #endif /* WOLFSSL_TLS13 */
19887
19888
#ifdef WOLFSSL_DTLS
19889
    WOLFSSL_METHOD* wolfDTLS_method(void)
19890
    {
19891
        return wolfDTLS_method_ex(NULL);
19892
    }
19893
    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
19894
    {
19895
        WOLFSSL_METHOD* m;
19896
        WOLFSSL_ENTER("DTLS_method_ex");
19897
    #ifndef NO_WOLFSSL_CLIENT
19898
        m = wolfDTLS_client_method_ex(heap);
19899
    #else
19900
        m = wolfDTLS_server_method_ex(heap);
19901
    #endif
19902
        if (m != NULL) {
19903
            m->side = WOLFSSL_NEITHER_END;
19904
        }
19905
        return m;
19906
    }
19907
19908
    #ifndef NO_OLD_TLS
19909
    WOLFSSL_METHOD* wolfDTLSv1_method(void)
19910
    {
19911
        return wolfDTLSv1_method_ex(NULL);
19912
    }
19913
    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
19914
    {
19915
        WOLFSSL_METHOD* m;
19916
        WOLFSSL_ENTER("DTLSv1_method_ex");
19917
    #ifndef NO_WOLFSSL_CLIENT
19918
        m = wolfDTLSv1_client_method_ex(heap);
19919
    #else
19920
        m = wolfDTLSv1_server_method_ex(heap);
19921
    #endif
19922
        if (m != NULL) {
19923
            m->side = WOLFSSL_NEITHER_END;
19924
        }
19925
        return m;
19926
    }
19927
    #endif /* !NO_OLD_TLS */
19928
    #ifndef WOLFSSL_NO_TLS12
19929
    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
19930
    {
19931
        return wolfDTLSv1_2_method_ex(NULL);
19932
    }
19933
    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
19934
    {
19935
        WOLFSSL_METHOD* m;
19936
        WOLFSSL_ENTER("DTLSv1_2_method");
19937
    #ifndef NO_WOLFSSL_CLIENT
19938
        m = wolfDTLSv1_2_client_method_ex(heap);
19939
    #else
19940
        m = wolfDTLSv1_2_server_method_ex(heap);
19941
    #endif
19942
        if (m != NULL) {
19943
            m->side = WOLFSSL_NEITHER_END;
19944
        }
19945
        return m;
19946
    }
19947
    #endif /* !WOLFSSL_NO_TLS12 */
19948
    #ifdef WOLFSSL_DTLS13
19949
    WOLFSSL_METHOD* wolfDTLSv1_3_method(void)
19950
    {
19951
        return wolfDTLSv1_3_method_ex(NULL);
19952
    }
19953
    WOLFSSL_METHOD* wolfDTLSv1_3_method_ex(void* heap)
19954
    {
19955
        WOLFSSL_METHOD* m;
19956
        WOLFSSL_ENTER("DTLSv1_3_method");
19957
    #ifndef NO_WOLFSSL_CLIENT
19958
        m = wolfDTLSv1_3_client_method_ex(heap);
19959
    #else
19960
        m = wolfDTLSv1_3_server_method_ex(heap);
19961
    #endif
19962
        if (m != NULL) {
19963
            m->side = WOLFSSL_NEITHER_END;
19964
        }
19965
        return m;
19966
    }
19967
    #endif /* WOLFSSL_DTLS13 */
19968
#endif /* WOLFSSL_DTLS */
19969
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
19970
19971
19972
#ifndef NO_WOLFSSL_SERVER
19973
19974
    WOLFSSL_METHOD* wolfTLS_server_method(void)
19975
0
    {
19976
0
        return wolfTLS_server_method_ex(NULL);
19977
0
    }
19978
19979
    WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
19980
0
    {
19981
0
        WOLFSSL_METHOD* method =
19982
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19983
0
                                                     heap, DYNAMIC_TYPE_METHOD);
19984
0
        (void)heap;
19985
0
        WOLFSSL_ENTER("TLS_server_method_ex");
19986
0
        if (method) {
19987
0
        #if defined(WOLFSSL_TLS13)
19988
0
            InitSSL_Method(method, MakeTLSv1_3());
19989
        #elif !defined(WOLFSSL_NO_TLS12)
19990
            InitSSL_Method(method, MakeTLSv1_2());
19991
        #elif !defined(NO_OLD_TLS)
19992
            InitSSL_Method(method, MakeTLSv1_1());
19993
        #elif defined(WOLFSSL_ALLOW_TLSV10)
19994
            InitSSL_Method(method, MakeTLSv1());
19995
        #else
19996
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
19997
        #endif
19998
19999
0
            method->downgrade = 1;
20000
0
            method->side      = WOLFSSL_SERVER_END;
20001
0
        }
20002
0
        return method;
20003
0
    }
20004
20005
#ifndef NO_OLD_TLS
20006
    #ifdef WOLFSSL_ALLOW_TLSV10
20007
    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
20008
    {
20009
        return wolfTLSv1_server_method_ex(NULL);
20010
    }
20011
    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
20012
    {
20013
        WOLFSSL_METHOD* method =
20014
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20015
                                                     heap, DYNAMIC_TYPE_METHOD);
20016
        (void)heap;
20017
        WOLFSSL_ENTER("TLSv1_server_method_ex");
20018
        if (method) {
20019
            InitSSL_Method(method, MakeTLSv1());
20020
            method->side = WOLFSSL_SERVER_END;
20021
        }
20022
        return method;
20023
    }
20024
    #endif /* WOLFSSL_ALLOW_TLSV10 */
20025
20026
    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
20027
    {
20028
        return wolfTLSv1_1_server_method_ex(NULL);
20029
    }
20030
    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
20031
    {
20032
        WOLFSSL_METHOD* method =
20033
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20034
                                                     heap, DYNAMIC_TYPE_METHOD);
20035
        (void)heap;
20036
        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
20037
        if (method) {
20038
            InitSSL_Method(method, MakeTLSv1_1());
20039
            method->side = WOLFSSL_SERVER_END;
20040
        }
20041
        return method;
20042
    }
20043
#endif /* !NO_OLD_TLS */
20044
20045
20046
#ifndef WOLFSSL_NO_TLS12
20047
    WOLFSSL_ABI
20048
    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
20049
4.98k
    {
20050
4.98k
        return wolfTLSv1_2_server_method_ex(NULL);
20051
4.98k
    }
20052
    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
20053
4.98k
    {
20054
4.98k
        WOLFSSL_METHOD* method =
20055
4.98k
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20056
4.98k
                                                     heap, DYNAMIC_TYPE_METHOD);
20057
4.98k
        (void)heap;
20058
4.98k
        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
20059
4.98k
        if (method) {
20060
4.98k
            InitSSL_Method(method, MakeTLSv1_2());
20061
4.98k
            method->side = WOLFSSL_SERVER_END;
20062
4.98k
        }
20063
4.98k
        return method;
20064
4.98k
    }
20065
#endif /* !WOLFSSL_NO_TLS12 */
20066
20067
#ifdef WOLFSSL_TLS13
20068
    /* The TLS v1.3 server method data.
20069
     *
20070
     * returns the method data for a TLS v1.3 server.
20071
     */
20072
    WOLFSSL_ABI
20073
    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
20074
4
    {
20075
4
        return wolfTLSv1_3_server_method_ex(NULL);
20076
4
    }
20077
20078
    /* The TLS v1.3 server method data.
20079
     *
20080
     * heap  The heap used for allocation.
20081
     * returns the method data for a TLS v1.3 server.
20082
     */
20083
    WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
20084
4
    {
20085
4
        WOLFSSL_METHOD* method =
20086
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20087
4
                                                     heap, DYNAMIC_TYPE_METHOD);
20088
4
        (void)heap;
20089
4
        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
20090
4
        if (method) {
20091
4
            InitSSL_Method(method, MakeTLSv1_3());
20092
4
            method->side = WOLFSSL_SERVER_END;
20093
4
        }
20094
4
        return method;
20095
4
    }
20096
#endif /* WOLFSSL_TLS13 */
20097
20098
#ifdef WOLFSSL_DTLS
20099
    WOLFSSL_METHOD* wolfDTLS_server_method(void)
20100
    {
20101
        return wolfDTLS_server_method_ex(NULL);
20102
    }
20103
    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
20104
    {
20105
        WOLFSSL_METHOD* method =
20106
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20107
                                                     heap, DYNAMIC_TYPE_METHOD);
20108
        (void)heap;
20109
        WOLFSSL_ENTER("DTLS_server_method_ex");
20110
        if (method) {
20111
        #if defined(WOLFSSL_DTLS13)
20112
            InitSSL_Method(method, MakeDTLSv1_3());
20113
        #elif !defined(WOLFSSL_NO_TLS12)
20114
            InitSSL_Method(method, MakeDTLSv1_2());
20115
        #elif !defined(NO_OLD_TLS)
20116
            InitSSL_Method(method, MakeDTLSv1());
20117
        #else
20118
            #error No DTLS version enabled!
20119
        #endif
20120
20121
            method->downgrade = 1;
20122
            method->side      = WOLFSSL_SERVER_END;
20123
        }
20124
        return method;
20125
    }
20126
20127
    #ifndef NO_OLD_TLS
20128
    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
20129
    {
20130
        return wolfDTLSv1_server_method_ex(NULL);
20131
    }
20132
    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
20133
    {
20134
        WOLFSSL_METHOD* method =
20135
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20136
                                                 heap, DYNAMIC_TYPE_METHOD);
20137
        (void)heap;
20138
        WOLFSSL_ENTER("DTLSv1_server_method_ex");
20139
        if (method) {
20140
            InitSSL_Method(method, MakeDTLSv1());
20141
            method->side = WOLFSSL_SERVER_END;
20142
        }
20143
        return method;
20144
    }
20145
    #endif /* !NO_OLD_TLS */
20146
20147
    #ifndef WOLFSSL_NO_TLS12
20148
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
20149
    {
20150
        return wolfDTLSv1_2_server_method_ex(NULL);
20151
    }
20152
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
20153
    {
20154
        WOLFSSL_METHOD* method =
20155
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20156
                                                 heap, DYNAMIC_TYPE_METHOD);
20157
        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
20158
        (void)heap;
20159
        if (method) {
20160
            InitSSL_Method(method, MakeDTLSv1_2());
20161
            method->side = WOLFSSL_SERVER_END;
20162
        }
20163
        (void)heap;
20164
        return method;
20165
    }
20166
    #endif /* !WOLFSSL_NO_TLS12 */
20167
#endif /* WOLFSSL_DTLS */
20168
20169
#endif /* NO_WOLFSSL_SERVER */
20170
20171
#endif /* NO_TLS */
20172
20173
#endif /* WOLFCRYPT_ONLY */