Coverage Report

Created: 2026-10-16 06:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl/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
    #ifdef WOLFSSL_TLS13
146
    /* internal.h sizes the buffer without this header in scope. */
147
    wc_static_assert(PMS_MLKEM_SZ == WC_ML_KEM_SS_SZ);
148
    #endif
149
#endif
150
151
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
152
    #include <wolfssl/wolfcrypt/port/Renesas/renesas_tsip_internal.h>
153
#endif
154
155
#include <wolfssl/wolfcrypt/hpke.h>
156
157
#ifndef NO_TLS
158
159
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
160
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap);
161
#endif
162
163
#ifdef HAVE_SUPPORTED_CURVES
164
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions);
165
#endif
166
167
/* Digest enable checks */
168
#ifdef NO_OLD_TLS /* TLS 1.2 only */
169
    #if defined(NO_SHA256) && !defined(WOLFSSL_SHA384) && \
170
            !defined(WOLFSSL_SHA512)
171
        #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
172
    #endif
173
#else  /* TLS 1.1 or older */
174
    #if defined(NO_MD5) && defined(NO_SHA)
175
        #error Must have SHA1 and MD5 enabled for old TLS
176
    #endif
177
#endif
178
179
#ifdef WOLFSSL_TLS13
180
    #if !defined(NO_DH) && \
181
        !defined(HAVE_FFDHE_2048) && !defined(HAVE_FFDHE_3072) && \
182
        !defined(HAVE_FFDHE_4096) && !defined(HAVE_FFDHE_6144) && \
183
        !defined(HAVE_FFDHE_8192)
184
        #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
185
    #endif
186
    #if !defined(NO_RSA) && !defined(WC_RSA_PSS)
187
        #error The build option WC_RSA_PSS is required for TLS 1.3 with RSA
188
    #endif
189
    #ifndef HAVE_TLS_EXTENSIONS
190
        #if !defined(_MSC_VER) && !defined(__TASKING__)
191
            #error "The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3"
192
        #else
193
            #pragma message("Error: The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3")
194
        #endif
195
    #endif
196
#endif
197
198
/* Warn if secrets logging is enabled */
199
#if (defined(SHOW_SECRETS) || defined(WOLFSSL_SSLKEYLOGFILE)) && \
200
    !defined(WOLFSSL_KEYLOG_EXPORT_WARNED)
201
    #if !defined(_MSC_VER) && !defined(__TASKING__)
202
        #warning The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment
203
    #else
204
        #pragma message("Warning: The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment")
205
    #endif
206
#endif
207
208
#ifndef WOLFSSL_NO_TLS12
209
210
#ifdef WOLFSSL_SHA384
211
0
    #define HSHASH_SZ WC_SHA384_DIGEST_SIZE
212
#else
213
    #define HSHASH_SZ FINISHED_SZ
214
#endif
215
216
int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
217
0
{
218
0
    int ret = 0;
219
0
    word32 hashSz = FINISHED_SZ;
220
221
0
    if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
222
0
        return BAD_FUNC_ARG;
223
224
    /* for constant timing perform these even if error */
225
#ifndef NO_OLD_TLS
226
    ret |= wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
227
    ret |= wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
228
#endif
229
230
0
    if (IsAtLeastTLSv1_2(ssl)) {
231
0
#ifndef NO_SHA256
232
0
        if (ssl->specs.mac_algorithm <= sha256_mac ||
233
0
            ssl->specs.mac_algorithm == blake2b_mac) {
234
0
            ret |= wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
235
0
            hashSz = WC_SHA256_DIGEST_SIZE;
236
0
        }
237
0
#endif
238
0
#ifdef WOLFSSL_SHA384
239
0
        if (ssl->specs.mac_algorithm == sha384_mac) {
240
0
            ret |= wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
241
0
            hashSz = WC_SHA384_DIGEST_SIZE;
242
0
        }
243
0
#endif
244
#ifdef WOLFSSL_SM3
245
        if (ssl->specs.mac_algorithm == sm3_mac) {
246
            ret |= wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
247
            hashSz = WC_SM3_DIGEST_SIZE;
248
        }
249
#endif
250
0
    }
251
252
0
    *hashLen = hashSz;
253
#ifdef WOLFSSL_CHECK_MEM_ZERO
254
     wc_MemZero_Add("TLS handshake hash", hash, hashSz);
255
#endif
256
257
0
    if (ret != 0) {
258
0
        ret = BUILD_MSG_ERROR;
259
0
        WOLFSSL_ERROR_VERBOSE(ret);
260
0
    }
261
262
0
    return ret;
263
0
}
264
265
266
int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
267
0
{
268
0
    int ret;
269
0
    const byte* side = NULL;
270
0
    word32 hashSz = HSHASH_SZ;
271
0
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
272
0
    byte handshake_hash[HSHASH_SZ];
273
#else
274
    byte* handshake_hash = NULL;
275
    handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap, DYNAMIC_TYPE_DIGEST);
276
    if (handshake_hash == NULL)
277
        return MEMORY_E;
278
#endif
279
280
0
    XMEMSET(handshake_hash, 0, HSHASH_SZ);
281
0
    ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
282
0
    if (ret == 0) {
283
0
        if (XSTRNCMP((const char*)sender, (const char*)kTlsClientStr,
284
0
                                                          SIZEOF_SENDER) == 0) {
285
0
            side = kTlsClientFinStr;
286
0
        }
287
0
        else if (XSTRNCMP((const char*)sender, (const char*)kTlsServerStr,
288
0
                                                          SIZEOF_SENDER) == 0) {
289
0
            side = kTlsServerFinStr;
290
0
        }
291
0
        else {
292
0
            ret = BAD_FUNC_ARG;
293
0
            WOLFSSL_MSG("Unexpected sender value");
294
0
        }
295
0
    }
296
297
0
    if (ret == 0) {
298
0
#ifdef WOLFSSL_HAVE_PRF
299
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
300
        if (ssl->ctx->TlsFinishedCb) {
301
            void* ctx = wolfSSL_GetTlsFinishedCtx(ssl);
302
            ret = ssl->ctx->TlsFinishedCb(ssl, side, handshake_hash, hashSz,
303
                                          (byte*)hashes, ctx);
304
        }
305
        if (!ssl->ctx->TlsFinishedCb ||
306
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
307
#endif
308
0
        {
309
0
            PRIVATE_KEY_UNLOCK();
310
0
            ret = wc_PRF_TLS((byte*)hashes, TLS_FINISHED_SZ,
311
0
                      ssl->arrays->masterSecret, SECRET_LEN, side,
312
0
                      FINISHED_LABEL_SZ, handshake_hash, hashSz,
313
0
                      IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
314
0
                      ssl->heap, ssl->devId);
315
0
            PRIVATE_KEY_LOCK();
316
0
        }
317
0
        ForceZero(handshake_hash, hashSz);
318
#else
319
        /* Pseudo random function must be enabled in the configuration. */
320
        ret = PRF_MISSING;
321
        WOLFSSL_ERROR_VERBOSE(ret);
322
        WOLFSSL_MSG("Pseudo-random function is not enabled");
323
324
        (void)side;
325
        (void)hashes;
326
#endif
327
0
    }
328
329
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
330
    XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
331
#elif defined(WOLFSSL_CHECK_MEM_ZERO)
332
    wc_MemZero_Check(handshake_hash, HSHASH_SZ);
333
#endif
334
335
0
    return ret;
336
0
}
337
338
#endif /* !WOLFSSL_NO_TLS12 */
339
340
#ifndef NO_OLD_TLS
341
342
#ifdef WOLFSSL_ALLOW_TLSV10
343
ProtocolVersion MakeTLSv1(void)
344
{
345
    ProtocolVersion pv;
346
    pv.major = SSLv3_MAJOR;
347
    pv.minor = TLSv1_MINOR;
348
349
    return pv;
350
}
351
#endif /* WOLFSSL_ALLOW_TLSV10 */
352
353
354
ProtocolVersion MakeTLSv1_1(void)
355
{
356
    ProtocolVersion pv;
357
    pv.major = SSLv3_MAJOR;
358
    pv.minor = TLSv1_1_MINOR;
359
360
    return pv;
361
}
362
363
#endif /* !NO_OLD_TLS */
364
365
366
#ifndef WOLFSSL_NO_TLS12
367
368
ProtocolVersion MakeTLSv1_2(void)
369
0
{
370
0
    ProtocolVersion pv;
371
0
    pv.major = SSLv3_MAJOR;
372
0
    pv.minor = TLSv1_2_MINOR;
373
374
0
    return pv;
375
0
}
376
377
#endif /* !WOLFSSL_NO_TLS12 */
378
379
#ifdef WOLFSSL_TLS13
380
/* The TLS v1.3 protocol version.
381
 *
382
 * returns the protocol version data for TLS v1.3.
383
 */
384
ProtocolVersion MakeTLSv1_3(void)
385
0
{
386
0
    ProtocolVersion pv;
387
0
    pv.major = SSLv3_MAJOR;
388
0
    pv.minor = TLSv1_3_MINOR;
389
390
0
    return pv;
391
0
}
392
#endif
393
394
#if defined(HAVE_SUPPORTED_CURVES)
395
/* Sets the key exchange groups in rank order on a context.
396
 *
397
 * ctx     SSL/TLS context object.
398
 * groups  Array of groups.
399
 * count   Number of groups in array.
400
 * returns BAD_FUNC_ARG when ctx or groups is NULL, not using TLS v1.3, count is
401
 * not positive or count is greater than WOLFSSL_MAX_GROUP_COUNT and
402
 * WOLFSSL_SUCCESS on success.
403
 */
404
int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count)
405
0
{
406
0
    int ret, i;
407
408
0
    WOLFSSL_ENTER("wolfSSL_CTX_set_groups");
409
0
    if (ctx == NULL || groups == NULL || count <= 0 ||
410
0
            count > WOLFSSL_MAX_GROUP_COUNT)
411
0
        return BAD_FUNC_ARG;
412
0
    if (!IsTLS_ex(ctx->method->version))
413
0
        return BAD_FUNC_ARG;
414
415
0
    #ifdef WOLFSSL_TLS13
416
0
    ctx->numGroups = 0;
417
0
    #endif
418
0
    #if !defined(NO_TLS)
419
0
    TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
420
0
    #endif /* !NO_TLS */
421
0
    for (i = 0; i < count; i++) {
422
        /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups
423
         * are valid */
424
0
        if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, (word16)groups[i]))
425
0
                != WOLFSSL_SUCCESS) {
426
0
    #if !defined(NO_TLS)
427
0
            TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
428
0
    #endif /* !NO_TLS */
429
0
            return ret;
430
0
        }
431
0
        #ifdef WOLFSSL_TLS13
432
0
        ctx->group[i] = (word16)groups[i];
433
0
        #endif
434
0
    }
435
0
    #ifdef WOLFSSL_TLS13
436
0
    ctx->numGroups = (byte)count;
437
0
    #endif
438
439
0
    return WOLFSSL_SUCCESS;
440
0
}
441
442
/* Sets the key exchange groups in rank order.
443
 *
444
 * ssl     SSL/TLS object.
445
 * groups  Array of groups.
446
 * count   Number of groups in array.
447
 * returns BAD_FUNC_ARG when ssl or groups is NULL, not using TLS v1.3, count is
448
 * not positive or count is greater than WOLFSSL_MAX_GROUP_COUNT and
449
 * WOLFSSL_SUCCESS on success.
450
 */
451
int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count)
452
0
{
453
0
    int ret, i;
454
455
0
    WOLFSSL_ENTER("wolfSSL_set_groups");
456
0
    if (ssl == NULL || groups == NULL || count <= 0 ||
457
0
            count > WOLFSSL_MAX_GROUP_COUNT)
458
0
        return BAD_FUNC_ARG;
459
0
    if (!IsTLS_ex(ssl->version))
460
0
        return BAD_FUNC_ARG;
461
462
0
    #ifdef WOLFSSL_TLS13
463
0
    ssl->numGroups = 0;
464
0
    #endif
465
0
    #if !defined(NO_TLS)
466
0
    TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
467
0
    #endif /* !NO_TLS */
468
0
    for (i = 0; i < count; i++) {
469
        /* Call to wolfSSL_UseSupportedCurve also checks if input groups
470
                 * are valid */
471
0
        if ((ret = wolfSSL_UseSupportedCurve(ssl, (word16)groups[i]))
472
0
                != WOLFSSL_SUCCESS) {
473
0
    #if !defined(NO_TLS)
474
0
            TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
475
0
    #endif /* !NO_TLS */
476
0
            return ret;
477
0
        }
478
0
        #ifdef WOLFSSL_TLS13
479
0
        ssl->group[i] = (word16)groups[i];
480
0
        #endif
481
0
    }
482
0
    #ifdef WOLFSSL_TLS13
483
0
    ssl->numGroups = (byte)count;
484
0
    #endif
485
486
0
    return WOLFSSL_SUCCESS;
487
0
}
488
#endif /* HAVE_SUPPORTED_CURVES */
489
490
#ifndef WOLFSSL_NO_TLS12
491
492
#ifdef HAVE_EXTENDED_MASTER
493
static const byte ext_master_label[EXT_MASTER_LABEL_SZ + 1] =
494
                                                      "extended master secret";
495
#endif
496
static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
497
static const byte key_label   [KEY_LABEL_SZ + 1]    = "key expansion";
498
499
static int _DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
500
                         const byte* ms, word32 msLen,
501
                         const byte* sr, const byte* cr,
502
                         int tls1_2, int hash_type,
503
                         void* heap, int devId)
504
0
{
505
0
    int ret;
506
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
507
    byte* seed = NULL;
508
    seed = (byte*)XMALLOC(SEED_LEN, heap, DYNAMIC_TYPE_SEED);
509
    if (seed == NULL)
510
        return MEMORY_E;
511
#else
512
0
    byte seed[SEED_LEN];
513
0
#endif
514
515
0
    XMEMCPY(seed,           sr, RAN_LEN);
516
0
    XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
517
518
0
#ifdef WOLFSSL_HAVE_PRF
519
0
    PRIVATE_KEY_UNLOCK();
520
0
    ret = wc_PRF_TLS(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
521
0
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
522
0
    PRIVATE_KEY_LOCK();
523
#else
524
    /* Pseudo random function must be enabled in the configuration. */
525
    ret = PRF_MISSING;
526
    WOLFSSL_ERROR_VERBOSE(ret);
527
    WOLFSSL_MSG("Pseudo-random function is not enabled");
528
529
    (void)key_dig;
530
    (void)key_dig_len;
531
    (void)ms;
532
    (void)msLen;
533
    (void)tls1_2;
534
    (void)hash_type;
535
    (void)heap;
536
    (void)devId;
537
    (void)key_label;
538
    (void)master_label;
539
#ifdef HAVE_EXTENDED_MASTER
540
    (void)ext_master_label;
541
#endif
542
#endif
543
544
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
545
    XFREE(seed, heap, DYNAMIC_TYPE_SEED);
546
#endif
547
548
0
    return ret;
549
0
}
550
551
/* External facing wrapper so user can call as well, 0 on success */
552
int wolfSSL_DeriveTlsKeys(byte* key_data, word32 keyLen,
553
                         const byte* ms, word32 msLen,
554
                         const byte* sr, const byte* cr,
555
                         int tls1_2, int hash_type)
556
0
{
557
0
    return _DeriveTlsKeys(key_data, keyLen, ms, msLen, sr, cr, tls1_2,
558
0
        hash_type, NULL, INVALID_DEVID);
559
0
}
560
561
562
int DeriveTlsKeys(WOLFSSL* ssl)
563
0
{
564
0
    int   ret;
565
0
    int   key_dig_len = 2 * ssl->specs.hash_size +
566
0
                        2 * ssl->specs.key_size  +
567
0
                        2 * ssl->specs.iv_size;
568
0
    WC_DECLARE_VAR(key_dig, byte, MAX_PRF_DIG, 0);
569
570
0
    if (key_dig_len <= 0 || key_dig_len > MAX_PRF_DIG) {
571
0
        WOLFSSL_MSG("Key block too large for PRF digest buffer");
572
0
        WOLFSSL_ERROR_VERBOSE(BUFFER_E);
573
0
        return BUFFER_E;
574
0
    }
575
576
0
    WC_ALLOC_VAR_EX(key_dig, byte, MAX_PRF_DIG, ssl->heap,
577
0
        DYNAMIC_TYPE_DIGEST, return MEMORY_E);
578
579
0
    XMEMSET(key_dig, 0, MAX_PRF_DIG);
580
581
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
582
    ret = PROTOCOLCB_UNAVAILABLE;
583
    if (ssl->ctx->GenSessionKeyCb) {
584
        void* ctx = wolfSSL_GetGenSessionKeyCtx(ssl);
585
        ret = ssl->ctx->GenSessionKeyCb(ssl, ctx);
586
    }
587
    if (!ssl->ctx->GenSessionKeyCb ||
588
        ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
589
#endif
590
0
    ret = _DeriveTlsKeys(key_dig, (word32)key_dig_len,
591
0
                     ssl->arrays->masterSecret, SECRET_LEN,
592
0
                     ssl->arrays->serverRandom, ssl->arrays->clientRandom,
593
0
                     IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
594
0
                     ssl->heap, ssl->devId);
595
0
    if (ret == 0)
596
0
        ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
597
598
#ifdef WOLFSSL_CHECK_MEM_ZERO
599
    wc_MemZero_Add("DeriveTlsKeys key_dig", key_dig, MAX_PRF_DIG);
600
#endif
601
0
    ForceZero(key_dig, MAX_PRF_DIG);
602
#ifdef WOLFSSL_CHECK_MEM_ZERO
603
    wc_MemZero_Check(key_dig, MAX_PRF_DIG);
604
#endif
605
606
0
    WC_FREE_VAR_EX(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
607
608
0
    return ret;
609
0
}
610
611
static int _MakeTlsMasterSecret(byte* ms, word32 msLen,
612
                               const byte* pms, word32 pmsLen,
613
                               const byte* cr, const byte* sr,
614
                               int tls1_2, int hash_type,
615
                               void* heap, int devId)
616
0
{
617
0
    int ret;
618
0
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
619
0
    byte seed[SEED_LEN];
620
#else
621
    byte* seed = NULL;
622
    seed = (byte*)XMALLOC(SEED_LEN, heap, DYNAMIC_TYPE_SEED);
623
    if (seed == NULL)
624
        return MEMORY_E;
625
#endif
626
627
0
    XMEMCPY(seed,           cr, RAN_LEN);
628
0
    XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
629
630
0
#ifdef WOLFSSL_HAVE_PRF
631
0
    PRIVATE_KEY_UNLOCK();
632
0
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
633
0
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
634
0
    PRIVATE_KEY_LOCK();
635
#else
636
    /* Pseudo random function must be enabled in the configuration. */
637
    ret = PRF_MISSING;
638
    WOLFSSL_MSG("Pseudo-random function is not enabled");
639
640
    (void)ms;
641
    (void)msLen;
642
    (void)pms;
643
    (void)pmsLen;
644
    (void)tls1_2;
645
    (void)hash_type;
646
    (void)heap;
647
    (void)devId;
648
#endif
649
650
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
651
    XFREE(seed, heap, DYNAMIC_TYPE_SEED);
652
#endif
653
654
0
    return ret;
655
0
}
656
657
/* External facing wrapper so user can call as well, 0 on success */
658
int wolfSSL_MakeTlsMasterSecret(byte* ms, word32 msLen,
659
                               const byte* pms, word32 pmsLen,
660
                               const byte* cr, const byte* sr,
661
                               int tls1_2, int hash_type)
662
0
{
663
0
    return _MakeTlsMasterSecret(ms, msLen, pms, pmsLen, cr, sr, tls1_2,
664
0
        hash_type, NULL, INVALID_DEVID);
665
0
}
666
667
668
#ifdef HAVE_EXTENDED_MASTER
669
670
static int _MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
671
                                        const byte* pms, word32 pmsLen,
672
                                        const byte* sHash, word32 sHashLen,
673
                                        int tls1_2, int hash_type,
674
                                        void* heap, int devId)
675
0
{
676
0
    int ret;
677
678
0
#ifdef WOLFSSL_HAVE_PRF
679
0
    PRIVATE_KEY_UNLOCK();
680
0
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
681
0
               sHash, sHashLen, tls1_2, hash_type, heap, devId);
682
0
    PRIVATE_KEY_LOCK();
683
#else
684
    /* Pseudo random function must be enabled in the configuration. */
685
    ret = PRF_MISSING;
686
    WOLFSSL_MSG("Pseudo-random function is not enabled");
687
688
    (void)ms;
689
    (void)msLen;
690
    (void)pms;
691
    (void)pmsLen;
692
    (void)sHash;
693
    (void)sHashLen;
694
    (void)tls1_2;
695
    (void)hash_type;
696
    (void)heap;
697
    (void)devId;
698
#endif
699
0
    return ret;
700
0
}
701
702
/* External facing wrapper so user can call as well, 0 on success */
703
int wolfSSL_MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
704
                                        const byte* pms, word32 pmsLen,
705
                                        const byte* sHash, word32 sHashLen,
706
                                        int tls1_2, int hash_type)
707
0
{
708
0
    return _MakeTlsExtendedMasterSecret(ms, msLen, pms, pmsLen, sHash, sHashLen,
709
0
        tls1_2, hash_type, NULL, INVALID_DEVID);
710
0
}
711
712
#endif /* HAVE_EXTENDED_MASTER */
713
714
715
int MakeTlsMasterSecret(WOLFSSL* ssl)
716
0
{
717
0
    int ret;
718
719
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
720
    /* If this is called from a sniffer session with keylog file support, obtain
721
     * the master secret from the callback */
722
    if (ssl->snifferSecretCb != NULL) {
723
        ret = ssl->snifferSecretCb(ssl->arrays->clientRandom,
724
                                   SNIFFER_SECRET_TLS12_MASTER_SECRET,
725
                                   ssl->arrays->masterSecret);
726
        if (ret != 0) {
727
            return ret;
728
        }
729
        ret = DeriveTlsKeys(ssl);
730
        return ret;
731
    }
732
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
733
734
0
#ifdef HAVE_EXTENDED_MASTER
735
0
    if (ssl->options.haveEMS) {
736
0
        word32 hashSz = HSHASH_SZ;
737
    #ifdef WOLFSSL_SMALL_STACK
738
        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
739
                                              DYNAMIC_TYPE_DIGEST);
740
        if (handshake_hash == NULL)
741
            return MEMORY_E;
742
    #else
743
0
        byte handshake_hash[HSHASH_SZ];
744
0
    #endif
745
746
0
        XMEMSET(handshake_hash, 0, HSHASH_SZ);
747
0
        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
748
0
        if (ret == 0) {
749
        #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
750
            ret = PROTOCOLCB_UNAVAILABLE;
751
            if (ssl->ctx->GenExtMasterCb) {
752
                void* ctx = wolfSSL_GetGenExtMasterSecretCtx(ssl);
753
                ret = ssl->ctx->GenExtMasterCb(ssl, handshake_hash, hashSz,
754
                                                ctx);
755
            }
756
            if (!ssl->ctx->GenExtMasterCb ||
757
                ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
758
        #endif /* (HAVE_SECRET_CALLBACK) && (HAVE_EXT_SECRET_CALLBACK) */
759
0
            {
760
0
                ret = _MakeTlsExtendedMasterSecret(
761
0
                    ssl->arrays->masterSecret, SECRET_LEN,
762
0
                    ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
763
0
                    handshake_hash, hashSz,
764
0
                    IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
765
0
                    ssl->heap, ssl->devId);
766
0
            }
767
0
            ForceZero(handshake_hash, hashSz);
768
0
        }
769
770
    #ifdef WOLFSSL_SMALL_STACK
771
        XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
772
    #elif defined(WOLFSSL_CHECK_MEM_ZERO)
773
        wc_MemZero_Check(handshake_hash, HSHASH_SZ);
774
    #endif
775
0
    }
776
0
    else
777
0
#endif /* HAVE_EXTENDED_MASTER */
778
0
    {
779
780
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
781
        ret = PROTOCOLCB_UNAVAILABLE;
782
        if (ssl->ctx->GenMasterCb) {
783
            void* ctx = wolfSSL_GetGenMasterSecretCtx(ssl);
784
            ret = ssl->ctx->GenMasterCb(ssl, ctx);
785
        }
786
        if (!ssl->ctx->GenMasterCb ||
787
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
788
#endif
789
0
        {
790
0
            ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret,
791
0
                      SECRET_LEN, ssl->arrays->preMasterSecret,
792
0
                      ssl->arrays->preMasterSz, ssl->arrays->clientRandom,
793
0
                      ssl->arrays->serverRandom, IsAtLeastTLSv1_2(ssl),
794
0
                      ssl->specs.mac_algorithm, ssl->heap, ssl->devId);
795
0
        }
796
0
    }
797
#ifdef HAVE_SECRET_CALLBACK
798
    if (ret == 0 && ssl->tlsSecretCb != NULL) {
799
        ret = ssl->tlsSecretCb(ssl, ssl->arrays->masterSecret,
800
                SECRET_LEN, ssl->tlsSecretCtx);
801
    }
802
#endif /* HAVE_SECRET_CALLBACK */
803
0
    if (ret == 0) {
804
0
        ret = DeriveTlsKeys(ssl);
805
0
    }
806
807
0
    return ret;
808
0
}
809
810
811
/* Used by EAP-TLS and EAP-TTLS to derive keying material from
812
 * the master_secret. */
813
int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* key, unsigned int len,
814
                                                              const char* label)
815
0
{
816
0
    int   ret;
817
0
    WC_DECLARE_VAR(seed, byte, SEED_LEN, 0);
818
819
    /* The randoms and the master secret live in the handshake arrays, which
820
     * are gone once the handshake resources have been released. */
821
0
    if (ssl == NULL || ssl->arrays == NULL)
822
0
        return BAD_FUNC_ARG;
823
824
0
    WC_ALLOC_VAR_EX(seed, byte, SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED,
825
0
        return MEMORY_E);
826
827
    /*
828
     * As per RFC-5281, the order of the client and server randoms is reversed
829
     * from that used by the TLS protocol to derive keys.
830
     */
831
0
    XMEMCPY(seed,           ssl->arrays->clientRandom, RAN_LEN);
832
0
    XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
833
834
0
#ifdef WOLFSSL_HAVE_PRF
835
0
    PRIVATE_KEY_UNLOCK();
836
0
    ret = wc_PRF_TLS((byte*)key, len, ssl->arrays->masterSecret, SECRET_LEN,
837
0
              (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
838
0
              IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
839
0
              ssl->heap, ssl->devId);
840
0
    PRIVATE_KEY_LOCK();
841
#else
842
    /* Pseudo random function must be enabled in the configuration. */
843
    ret = PRF_MISSING;
844
    WOLFSSL_MSG("Pseudo-random function is not enabled");
845
846
    (void)key;
847
    (void)len;
848
    (void)label;
849
#endif
850
851
0
    WC_FREE_VAR_EX(seed, ssl->heap, DYNAMIC_TYPE_SEED);
852
853
0
    return ret;
854
0
}
855
856
/* return HMAC digest type in wolfSSL format */
857
int wolfSSL_GetHmacType(WOLFSSL* ssl)
858
0
{
859
0
    if (ssl == NULL)
860
0
        return BAD_FUNC_ARG;
861
862
0
    return wolfSSL_GetHmacType_ex(&ssl->specs);
863
0
}
864
865
866
int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
867
                           int verify)
868
0
{
869
0
    if (ssl == NULL || inner == NULL)
870
0
        return BAD_FUNC_ARG;
871
872
0
    if (content == dtls12_cid
873
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
874
       || (ssl->options.dtls && DtlsGetCidTxSize(ssl) > 0)
875
#endif
876
0
    ) {
877
0
        WOLFSSL_MSG("wolfSSL_SetTlsHmacInner doesn't support CID");
878
0
        return BAD_FUNC_ARG;
879
0
    }
880
881
0
    XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
882
883
0
    WriteSEQ(ssl, verify, inner);
884
0
    inner[SEQ_SZ] = (byte)content;
885
0
    inner[SEQ_SZ + ENUM_LEN]            = ssl->version.major;
886
0
    inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
887
0
    c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
888
889
0
    return 0;
890
0
}
891
892
893
#ifndef WOLFSSL_AEAD_ONLY
894
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
895
    !defined(HAVE_SELFTEST)
896
897
/* Update the hash in the HMAC.
898
 *
899
 * hmac  HMAC object.
900
 * data  Data to be hashed.
901
 * sz    Size of data to hash.
902
 * returns 0 on success, otherwise failure.
903
 */
904
static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz)
905
0
{
906
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
907
908
0
    switch (hmac->macType) {
909
0
    #ifndef NO_SHA
910
0
        case WC_SHA:
911
0
            ret = wc_ShaUpdate(&hmac->hash.sha, data, sz);
912
0
            break;
913
0
    #endif /* !NO_SHA */
914
915
0
    #ifndef NO_SHA256
916
0
        case WC_SHA256:
917
0
            ret = wc_Sha256Update(&hmac->hash.sha256, data, sz);
918
0
            break;
919
0
    #endif /* !NO_SHA256 */
920
921
0
    #ifdef WOLFSSL_SHA384
922
0
        case WC_SHA384:
923
0
            ret = wc_Sha384Update(&hmac->hash.sha384, data, sz);
924
0
            break;
925
0
    #endif /* WOLFSSL_SHA384 */
926
927
0
    #ifdef WOLFSSL_SHA512
928
0
        case WC_SHA512:
929
0
            ret = wc_Sha512Update(&hmac->hash.sha512, data, sz);
930
0
            break;
931
0
    #endif /* WOLFSSL_SHA512 */
932
933
    #ifdef WOLFSSL_SM3
934
        case WC_SM3:
935
            ret = wc_Sm3Update(&hmac->hash.sm3, data, sz);
936
            break;
937
    #endif /* WOLFSSL_SM3 */
938
939
0
        default:
940
0
            ret = BAD_FUNC_ARG;
941
0
            break;
942
0
    }
943
944
0
    return ret;
945
0
}
946
947
/* Finalize the hash but don't put the EOC, padding or length in.
948
 *
949
 * hmac  HMAC object.
950
 * hash  Hash result.
951
 * returns 0 on success, otherwise failure.
952
 */
953
static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash)
954
0
{
955
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
956
957
0
    switch (hmac->macType) {
958
0
    #ifndef NO_SHA
959
0
        case WC_SHA:
960
0
            ret = wc_ShaFinalRaw(&hmac->hash.sha, hash);
961
0
            break;
962
0
    #endif /* !NO_SHA */
963
964
0
    #ifndef NO_SHA256
965
0
        case WC_SHA256:
966
0
            ret = wc_Sha256FinalRaw(&hmac->hash.sha256, hash);
967
0
            break;
968
0
    #endif /* !NO_SHA256 */
969
970
0
    #ifdef WOLFSSL_SHA384
971
0
        case WC_SHA384:
972
0
            ret = wc_Sha384FinalRaw(&hmac->hash.sha384, hash);
973
0
            break;
974
0
    #endif /* WOLFSSL_SHA384 */
975
976
0
    #ifdef WOLFSSL_SHA512
977
0
        case WC_SHA512:
978
0
            ret = wc_Sha512FinalRaw(&hmac->hash.sha512, hash);
979
0
            break;
980
0
    #endif /* WOLFSSL_SHA512 */
981
982
    #ifdef WOLFSSL_SM3
983
        case WC_SM3:
984
            ret = wc_Sm3FinalRaw(&hmac->hash.sm3, hash);
985
            break;
986
    #endif /* WOLFSSL_SM3 */
987
988
0
        default:
989
0
            ret = BAD_FUNC_ARG;
990
0
            break;
991
0
    }
992
993
0
    return ret;
994
0
}
995
996
/* Finalize the HMAC by performing outer hash.
997
 *
998
 * hmac  HMAC object.
999
 * mac   MAC result.
1000
 * returns 0 on success, otherwise failure.
1001
 */
1002
static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac)
1003
0
{
1004
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
1005
0
    WC_DECLARE_VAR(hash, wc_HashAlg, 1, hmac ? hmac->heap : NULL);
1006
0
    enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
1007
0
    int digestSz = wc_HashGetDigestSize(hashType);
1008
0
    int blockSz = wc_HashGetBlockSize(hashType);
1009
1010
0
    WC_ALLOC_VAR_EX(hash, wc_HashAlg, 1, hmac->heap, DYNAMIC_TYPE_HASHES,
1011
0
                    return MEMORY_E);
1012
1013
0
    if ((digestSz >= 0) && (blockSz >= 0)) {
1014
0
        ret = wc_HashInit(hash, hashType);
1015
0
    }
1016
0
    else {
1017
0
        ret = BAD_FUNC_ARG;
1018
0
    }
1019
1020
0
    if (ret == 0) {
1021
0
        ret = wc_HashUpdate(hash, hashType, (byte*)hmac->opad,
1022
0
            (word32)blockSz);
1023
0
        if (ret == 0)
1024
0
            ret = wc_HashUpdate(hash, hashType, (byte*)hmac->innerHash,
1025
0
                (word32)digestSz);
1026
0
        if (ret == 0)
1027
0
            ret = wc_HashFinal(hash, hashType, mac);
1028
0
        wc_HashFree(hash, hashType);
1029
0
    }
1030
1031
0
    WC_FREE_VAR_EX(hash, hmac->heap, DYNAMIC_TYPE_HASHES);
1032
0
    return ret;
1033
0
}
1034
1035
/* Calculate the HMAC of the header + message data.
1036
 * Constant time implementation using wc_Sha*FinalRaw().
1037
 *
1038
 * hmac    HMAC object.
1039
 * digest  MAC result.
1040
 * in      Message data.
1041
 * sz      Size of the message data.
1042
 * header  Constructed record header with length of handshake data.
1043
 * headerSz Length of header
1044
 * returns 0 on success, otherwise failure.
1045
 */
1046
static int Hmac_UpdateFinal_CT(Hmac* hmac, byte* digest, const byte* in,
1047
                           word32 sz, int macLen, byte* header, word32 headerSz)
1048
0
{
1049
0
    byte         lenBytes[8];
1050
0
    int          i, j;
1051
0
    unsigned int k;
1052
0
    int          blockBits, blockMask;
1053
0
    int          lastBlockLen, extraLen, eocIndex;
1054
0
    int          blocks;
1055
0
    int          safeBlocks;
1056
0
    int          lenBlock;
1057
0
    int          eocBlock;
1058
0
    word32       maxLen;
1059
0
    int          blockSz, padSz;
1060
0
    int          ret;
1061
0
    word32       realLen;
1062
0
    byte         extraBlock;
1063
1064
0
    if (macLen <= 0 || macLen > (int)sizeof(hmac->innerHash))
1065
0
        return BAD_FUNC_ARG;
1066
1067
0
    switch (hmac->macType) {
1068
0
    #ifndef NO_SHA
1069
0
        case WC_SHA:
1070
0
            blockSz = WC_SHA_BLOCK_SIZE;
1071
0
            blockBits = 6;
1072
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1073
0
            break;
1074
0
    #endif /* !NO_SHA */
1075
1076
0
    #ifndef NO_SHA256
1077
0
        case WC_SHA256:
1078
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1079
0
            blockBits = 6;
1080
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1081
0
            break;
1082
0
    #endif /* !NO_SHA256 */
1083
1084
0
    #ifdef WOLFSSL_SHA384
1085
0
        case WC_SHA384:
1086
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1087
0
            blockBits = 7;
1088
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1089
0
            break;
1090
0
    #endif /* WOLFSSL_SHA384 */
1091
1092
0
    #ifdef WOLFSSL_SHA512
1093
0
        case WC_SHA512:
1094
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1095
0
            blockBits = 7;
1096
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1097
0
            break;
1098
0
    #endif /* WOLFSSL_SHA512 */
1099
1100
    #ifdef WOLFSSL_SM3
1101
        case WC_SM3:
1102
            blockSz = WC_SM3_BLOCK_SIZE;
1103
            blockBits = 6;
1104
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1105
            break;
1106
    #endif /* WOLFSSL_SM3 */
1107
1108
0
        default:
1109
0
            return BAD_FUNC_ARG;
1110
0
    }
1111
0
    blockMask = blockSz - 1;
1112
1113
    /* Size of data to HMAC if padding length byte is zero. */
1114
0
    maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - (word32)macLen;
1115
1116
    /* Complete data (including padding) has block for EOC and/or length. */
1117
0
    extraBlock = ctSetLTE(((int)maxLen + padSz) & blockMask, padSz);
1118
    /* Total number of blocks for data including padding. */
1119
0
    blocks = ((int)(maxLen + (word32)blockSz - 1) >> blockBits) + extraBlock;
1120
    /* Up to last 6 blocks can be hashed safely. */
1121
0
    safeBlocks = blocks - 6;
1122
1123
    /* Length of message data. */
1124
0
    realLen = maxLen - in[sz - 1];
1125
    /* Number of message bytes in last block. */
1126
0
    lastBlockLen = (int)realLen & blockMask;
1127
    /* Number of padding bytes in last block. */
1128
0
    extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
1129
    /* Number of blocks to create for hash. */
1130
0
    lenBlock = ((int)realLen + extraLen) >> blockBits;
1131
    /* Block containing EOC byte. */
1132
0
    eocBlock = (int)(realLen >> (word32)blockBits);
1133
    /* Index of EOC byte in block. */
1134
0
    eocIndex = (int)(realLen & (word32)blockMask);
1135
1136
    /* Add length of hmac's ipad to total length. */
1137
0
    realLen += (word32)blockSz;
1138
    /* Length as bits - 8 bytes bigendian. */
1139
0
    c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
1140
0
    c32toa(realLen << 3, lenBytes + sizeof(word32));
1141
1142
0
    ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, (word32)blockSz);
1143
0
    if (ret != 0)
1144
0
        return ret;
1145
1146
0
    XMEMSET(hmac->innerHash, 0, (size_t)macLen);
1147
1148
0
    if (safeBlocks > 0) {
1149
0
        ret = Hmac_HashUpdate(hmac, header, headerSz);
1150
0
        if (ret != 0)
1151
0
            return ret;
1152
0
        ret = Hmac_HashUpdate(hmac, in, (word32)(safeBlocks * blockSz -
1153
0
                                WOLFSSL_TLS_HMAC_INNER_SZ));
1154
1155
0
        if (ret != 0)
1156
0
            return ret;
1157
0
    }
1158
0
    else
1159
0
        safeBlocks = 0;
1160
1161
0
    XMEMSET(digest, 0, (size_t)macLen);
1162
0
    k = (unsigned int)(safeBlocks * blockSz);
1163
0
    for (i = safeBlocks; i < blocks; i++) {
1164
0
        unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
1165
0
        unsigned char isEocBlock = ctMaskEq(i, eocBlock);
1166
0
        unsigned char isOutBlock = ctMaskEq(i, lenBlock);
1167
1168
0
        for (j = 0; j < blockSz; j++) {
1169
0
            unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
1170
0
            volatile unsigned char maskPastEoc = ctMaskGT(j, eocIndex);
1171
0
            volatile unsigned char pastEoc = maskPastEoc & isEocBlock;
1172
0
            unsigned char b = 0;
1173
1174
0
            if (k < headerSz)
1175
0
                b = header[k];
1176
0
            else if (k < maxLen)
1177
0
                b = in[k - headerSz];
1178
0
            k++;
1179
1180
0
            b = ctMaskSel(atEoc, 0x80, b);
1181
0
            b &= (unsigned char)~(word32)pastEoc;
1182
0
            b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
1183
1184
0
            if (j >= blockSz - 8) {
1185
0
                b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
1186
0
            }
1187
1188
0
            hashBlock[j] = b;
1189
0
        }
1190
1191
        /* cppcheck-suppress uninitvar */
1192
0
        ret = Hmac_HashUpdate(hmac, hashBlock, (word32)blockSz);
1193
0
        if (ret != 0)
1194
0
            return ret;
1195
0
        ret = Hmac_HashFinalRaw(hmac, hashBlock);
1196
0
        if (ret != 0)
1197
0
            return ret;
1198
0
        for (j = 0; j < macLen; j++)
1199
0
            ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
1200
0
    }
1201
1202
0
    ret = Hmac_OuterHash(hmac, digest);
1203
1204
0
    return ret;
1205
0
}
1206
1207
#endif
1208
1209
/* A cryptocb device that services HMAC SETKEY owns the key: wc_HmacSetKey()
1210
 * leaves keyRaw NULL and never derives the software ipad/opad the raw-hash path
1211
 * reads. Only WOLF_CRYPTO_CB_SETKEY builds reach that (incl. a find-mapped
1212
 * device with no devId). */
1213
#if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
1214
    defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2B) || \
1215
    (defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_SETKEY))
1216
1217
/* Calculate the HMAC of the header + message data.
1218
 * Constant time implementation using normal hashing operations.
1219
 * Update-Final need to be constant time.
1220
 *
1221
 * hmac    HMAC object.
1222
 * digest  MAC result.
1223
 * in      Message data.
1224
 * sz      Size of the message data.
1225
 * header  Constructed record header with length of handshake data.
1226
 * headerSz Length of header
1227
 * returns 0 on success, otherwise failure.
1228
 */
1229
static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
1230
                            word32 sz, byte* header, word32 headerSz)
1231
{
1232
    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
1233
    int        ret = 0;
1234
    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
1235
    word32     offset = 0;
1236
    int        msgBlocks, blocks, blockBits;
1237
    int        i;
1238
1239
    switch (hmac->macType) {
1240
    #ifndef NO_SHA
1241
        case WC_SHA:
1242
            blockSz = WC_SHA_BLOCK_SIZE;
1243
            blockBits = 6;
1244
            macSz = WC_SHA_DIGEST_SIZE;
1245
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1246
            break;
1247
    #endif /* !NO_SHA */
1248
1249
    #ifndef NO_SHA256
1250
        case WC_SHA256:
1251
            blockSz = WC_SHA256_BLOCK_SIZE;
1252
            blockBits = 6;
1253
            macSz = WC_SHA256_DIGEST_SIZE;
1254
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1255
            break;
1256
    #endif /* !NO_SHA256 */
1257
1258
    #ifdef WOLFSSL_SHA384
1259
        case WC_SHA384:
1260
            blockSz = WC_SHA384_BLOCK_SIZE;
1261
            blockBits = 7;
1262
            macSz = WC_SHA384_DIGEST_SIZE;
1263
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1264
            break;
1265
    #endif /* WOLFSSL_SHA384 */
1266
1267
    #ifdef WOLFSSL_SHA512
1268
        case WC_SHA512:
1269
            blockSz = WC_SHA512_BLOCK_SIZE;
1270
            blockBits = 7;
1271
            macSz = WC_SHA512_DIGEST_SIZE;
1272
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1273
            break;
1274
    #endif /* WOLFSSL_SHA512 */
1275
1276
    #ifdef HAVE_BLAKE2B
1277
        case WC_HASH_TYPE_BLAKE2B:
1278
            blockSz = BLAKE2B_BLOCKBYTES;
1279
            blockBits = 7;
1280
            macSz = BLAKE2B_256;
1281
            padSz = 0;
1282
            break;
1283
    #endif /* HAVE_BLAKE2B */
1284
1285
    #ifdef WOLFSSL_SM3
1286
        case WC_SM3:
1287
            blockSz = WC_SM3_BLOCK_SIZE;
1288
            blockBits = 6;
1289
            macSz = WC_SM3_DIGEST_SIZE;
1290
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1291
            break;
1292
    #endif
1293
1294
        default:
1295
            WOLFSSL_MSG("ERROR: Hmac_UpdateFinal failed, no hmac->macType");
1296
            return BAD_FUNC_ARG;
1297
    }
1298
1299
    msgSz = sz - (1 + in[sz - 1] + macSz);
1300
    /* Make negative result 0 */
1301
    msgSz &= ~(0 - (msgSz >> 31));
1302
    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
1303
    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
1304
    /* Make negative result 0 */
1305
    maxSz &= ~(0 - (maxSz >> 31));
1306
1307
    /* Calculate #blocks processed in HMAC for max and real data. */
1308
    blocks      = (int)(maxSz >> blockBits);
1309
    blocks     += ((maxSz + padSz) % blockSz) < padSz;
1310
    msgBlocks   = (int)(realSz >> blockBits);
1311
    /* #Extra blocks to process. */
1312
    blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0);
1313
    /* Calculate whole blocks. */
1314
    msgBlocks--;
1315
1316
    ret = wc_HmacUpdate(hmac, header, headerSz);
1317
    if (ret == 0) {
1318
        /* Fill the rest of the block with any available data. */
1319
        word32 currSz = ctMaskLT((int)msgSz, (int)blockSz) & msgSz;
1320
        currSz |= ctMaskGTE((int)msgSz, (int)blockSz) & blockSz;
1321
        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
1322
        currSz &= ~(0 - (currSz >> 31));
1323
        ret = wc_HmacUpdate(hmac, in, currSz);
1324
        offset = currSz;
1325
    }
1326
    if (ret == 0) {
1327
        /* Do the hash operations on a block basis. */
1328
        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
1329
            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
1330
            if (ret != 0)
1331
                break;
1332
        }
1333
    }
1334
    if (ret == 0)
1335
        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
1336
    if (ret == 0)
1337
        ret = wc_HmacFinal(hmac, digest);
1338
    if (ret == 0) {
1339
        /* Do the dummy hash operations. Do at least one. */
1340
        for (i = 0; i < blocks + 1; i++) {
1341
            ret = wc_HmacUpdate(hmac, dummy, blockSz);
1342
            if (ret != 0)
1343
                break;
1344
        }
1345
    }
1346
1347
    return ret;
1348
}
1349
1350
#endif
1351
1352
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1353
#define TLS_HMAC_CID_SZ(s, v) \
1354
                ((v) ? DtlsGetCidRxSize((s)) \
1355
                     : DtlsGetCidTxSize((s)))
1356
#define TLS_HMAC_CID(s, v, b, c) \
1357
                ((v) ? wolfSSL_dtls_cid_get_rx((s), (b), (c)) \
1358
                     : wolfSSL_dtls_cid_get_tx((s), (b), (c)))
1359
#endif
1360
1361
static int TLS_hmac_SetInner(WOLFSSL* ssl, byte* inner, word32* innerSz,
1362
        word32 sz, int content, int verify, int epochOrder)
1363
0
{
1364
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1365
    unsigned int cidSz = 0;
1366
    if (ssl->options.dtls && (cidSz = TLS_HMAC_CID_SZ(ssl, verify)) > 0) {
1367
        word32 idx = 0;
1368
        if (cidSz > DTLS_CID_MAX_SIZE) {
1369
            WOLFSSL_MSG("DTLS CID too large");
1370
            return DTLS_CID_ERROR;
1371
        }
1372
1373
        XMEMSET(inner + idx, 0xFF, SEQ_SZ);
1374
        idx += SEQ_SZ;
1375
        inner[idx++] = dtls12_cid;
1376
        inner[idx++] = (byte)cidSz;
1377
        inner[idx++] = dtls12_cid;
1378
        inner[idx++] = ssl->version.major;
1379
        inner[idx++] = ssl->version.minor;
1380
        WriteSEQ(ssl, epochOrder, inner + idx);
1381
        idx += SEQ_SZ;
1382
        if (TLS_HMAC_CID(ssl, verify, inner + idx, cidSz) ==
1383
                WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
1384
            WOLFSSL_MSG("DTLS CID write failed");
1385
            return DTLS_CID_ERROR;
1386
        }
1387
        idx += cidSz;
1388
        c16toa((word16)sz, inner + idx);
1389
        idx += LENGTH_SZ;
1390
1391
        *innerSz = idx;
1392
        return 0;
1393
    }
1394
#endif
1395
0
    *innerSz = WOLFSSL_TLS_HMAC_INNER_SZ;
1396
0
    return wolfSSL_SetTlsHmacInner(ssl, inner, sz, content,
1397
0
            !ssl->options.dtls ? verify : epochOrder);
1398
0
}
1399
1400
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1401
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_CID_INNER_SZ
1402
#else
1403
0
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_INNER_SZ
1404
#endif
1405
1406
int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
1407
             int content, int verify, int epochOrder)
1408
0
{
1409
0
    WC_DECLARE_VAR(hmac, Hmac, 1, ssl ? ssl->heap : NULL);
1410
0
    byte   myInner[TLS_HMAC_INNER_SZ];
1411
0
    word32 innerSz = TLS_HMAC_INNER_SZ;
1412
0
    int    ret = 0;
1413
0
    const byte* macSecret = NULL;
1414
0
    word32 hashSz = 0;
1415
0
    word32 totalSz = 0;
1416
1417
0
    if (ssl == NULL)
1418
0
        return BAD_FUNC_ARG;
1419
1420
0
    WC_ALLOC_VAR_EX(hmac, Hmac, 1, ssl->heap, DYNAMIC_TYPE_HMAC,
1421
0
                    return MEMORY_E);
1422
1423
#ifdef HAVE_TRUNCATED_HMAC
1424
    hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
1425
                                        : ssl->specs.hash_size;
1426
#else
1427
0
    hashSz = ssl->specs.hash_size;
1428
0
#endif
1429
1430
    /* Pre-compute sz + hashSz + padSz + 1 with overflow checking.
1431
     * Used by fuzzer callback and Hmac_UpdateFinal* in the verify path. */
1432
0
    if (verify && padSz >= 0) {
1433
0
        word32 hmacSz = 0;
1434
0
        if (!WC_SAFE_SUM_WORD32(sz, hashSz, hmacSz) ||
1435
0
            !WC_SAFE_SUM_WORD32(hmacSz, (word32)padSz, hmacSz) ||
1436
0
            !WC_SAFE_SUM_WORD32(hmacSz, 1, hmacSz)) {
1437
0
            WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1438
0
            return BUFFER_E;
1439
0
        }
1440
0
        totalSz = hmacSz;
1441
0
    }
1442
1443
#ifdef HAVE_FUZZER
1444
    /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
1445
    if (ssl->fuzzerCb) {
1446
        if (verify && padSz >= 0) {
1447
            ssl->fuzzerCb(ssl, in, totalSz, FUZZ_HMAC,
1448
                          ssl->fuzzerCtx);
1449
        }
1450
        else {
1451
            ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
1452
        }
1453
    }
1454
#endif
1455
1456
0
    ret = TLS_hmac_SetInner(ssl, myInner, &innerSz, sz, content, verify,
1457
0
                            epochOrder);
1458
0
    if (ret != 0) {
1459
0
        WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1460
0
        return ret;
1461
0
    }
1462
1463
0
    ret = wc_HmacInit(hmac, ssl->heap, ssl->devId);
1464
0
    if (ret != 0) {
1465
0
        WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1466
0
        return ret;
1467
0
    }
1468
1469
1470
#ifdef WOLFSSL_DTLS
1471
    if (ssl->options.dtls)
1472
        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
1473
    else
1474
#endif
1475
0
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
1476
0
    ret = wc_HmacSetKey(hmac, wolfSSL_GetHmacType(ssl),
1477
0
                                              macSecret,
1478
0
                                              ssl->specs.hash_size);
1479
1480
0
    if (ret == 0) {
1481
        /* Constant time verification required. */
1482
0
        if (verify && padSz >= 0) {
1483
0
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
1484
0
    !defined(HAVE_SELFTEST)
1485
    #if defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_SETKEY)
1486
            /* keyRaw NULL: a device owns the key, so the raw-hash state is
1487
             * empty -- use update/final, which keeps the dummy-block padding
1488
             * equalization. Software-keyed HMACs (keyRaw set, incl. PK-only
1489
             * offload) keep the raw-hash path below. */
1490
            if (hmac->keyRaw == NULL) {
1491
                ret = Hmac_UpdateFinal(hmac, digest, in,
1492
                        totalSz, myInner, innerSz);
1493
            }
1494
            else
1495
    #endif
1496
    #ifdef HAVE_BLAKE2B
1497
            if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
1498
                ret = Hmac_UpdateFinal(hmac, digest, in,
1499
                        totalSz, myInner, innerSz);
1500
            }
1501
            else
1502
    #endif
1503
0
            {
1504
0
                ret = Hmac_UpdateFinal_CT(hmac, digest, in,
1505
0
                                      totalSz,
1506
0
                                      (int)hashSz, myInner, innerSz);
1507
1508
0
            }
1509
#else
1510
            ret = Hmac_UpdateFinal(hmac, digest, in, totalSz,
1511
                                        myInner, innerSz);
1512
#endif
1513
0
        }
1514
0
        else {
1515
0
            ret = wc_HmacUpdate(hmac, myInner, innerSz);
1516
0
            if (ret == 0)
1517
0
                ret = wc_HmacUpdate(hmac, in, sz);                /* content */
1518
0
            if (ret == 0)
1519
0
                ret = wc_HmacFinal(hmac, digest);
1520
0
        }
1521
0
    }
1522
1523
0
    wc_HmacFree(hmac);
1524
0
    WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1525
1526
0
    return ret;
1527
0
}
1528
#endif /* WOLFSSL_AEAD_ONLY */
1529
1530
#endif /* !WOLFSSL_NO_TLS12 */
1531
1532
int wolfSSL_GetHmacType_ex(CipherSpecs* specs)
1533
0
{
1534
0
    if (specs == NULL)
1535
0
        return BAD_FUNC_ARG;
1536
1537
0
    switch (specs->mac_algorithm) {
1538
        #ifndef NO_MD5
1539
        case md5_mac:
1540
        {
1541
            return WC_MD5;
1542
        }
1543
        #endif
1544
0
        #ifndef NO_SHA256
1545
0
        case sha256_mac:
1546
0
        {
1547
0
            return WC_SHA256;
1548
0
        }
1549
0
        #endif
1550
0
        #ifdef WOLFSSL_SHA384
1551
0
        case sha384_mac:
1552
0
        {
1553
0
            return WC_SHA384;
1554
0
        }
1555
0
        #endif
1556
        #ifdef WOLFSSL_SM3
1557
        case sm3_mac:
1558
        {
1559
            return WC_SM3;
1560
        }
1561
        #endif
1562
0
        #ifndef NO_SHA
1563
0
        case sha_mac:
1564
0
        {
1565
0
            return WC_SHA;
1566
0
        }
1567
0
        #endif
1568
        #ifdef HAVE_BLAKE2B
1569
        case blake2b_mac:
1570
        {
1571
            return BLAKE2B_ID;
1572
        }
1573
        #endif
1574
0
        default:
1575
0
        {
1576
0
            return WOLFSSL_FATAL_ERROR;
1577
0
        }
1578
0
    }
1579
0
}
1580
1581
#ifdef HAVE_TLS_EXTENSIONS
1582
1583
/**
1584
 * The TLSX semaphore is used to calculate the size of the extensions to be sent
1585
 * from one peer to another.
1586
 */
1587
1588
/** Supports up to 72 flags. Increase as needed. */
1589
#define SEMAPHORE_SIZE 9
1590
1591
/** Highest extension type that TLSX_ToSemaphore() maps directly onto its own
1592
 * semaphore index. Higher types are either remapped into the remaining indices
1593
 * (renegotiation_info, QUIC, ECH, CKS) or fall outside the semaphore's range.
1594
 * This boundary also drives duplicate-extension detection in TLSX_Parse(); keep
1595
 * the two in sync. */
1596
0
#define SEMAPHORE_MAX_DIRECT_TYPE 62
1597
1598
/**
1599
 * Converts the extension type (id) to an index in the semaphore.
1600
 *
1601
 * Official reference for TLS extension types:
1602
 *   http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
1603
 *
1604
 * Motivation:
1605
 *   Previously, we used the extension type itself as the index of that
1606
 *   extension in the semaphore as the extension types were declared
1607
 *   sequentially, but maintain a semaphore as big as the number of available
1608
 *   extensions is no longer an option since the release of renegotiation_info.
1609
 *
1610
 * How to update:
1611
 *   Assign extension types that extrapolate the number of available semaphores
1612
 *   to the first available index going backwards in the semaphore array.
1613
 *   When adding a new extension type that don't extrapolate the number of
1614
 *   available semaphores, check for a possible collision with with a
1615
 *   'remapped' extension type.
1616
 *
1617
 * Update TLSX_Parse for duplicate detection if more added above
1618
 * SEMAPHORE_MAX_DIRECT_TYPE.
1619
 */
1620
static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
1621
0
{
1622
0
    switch (type) {
1623
1624
0
        case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
1625
0
            return 63;
1626
#ifdef WOLFSSL_QUIC
1627
        case TLSX_KEY_QUIC_TP_PARAMS_DRAFT: /* 0xffa5 */
1628
            return 64;
1629
#endif
1630
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
1631
        case TLSX_ECH: /* 0xfe0d */
1632
            return 65;
1633
#endif
1634
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
1635
        case TLSX_CKS:
1636
            return 66;
1637
#endif
1638
0
        default:
1639
0
            if (type > SEMAPHORE_MAX_DIRECT_TYPE) {
1640
                /* This message SHOULD only happens during the adding of
1641
                   new TLS extensions in which its IANA number overflows
1642
                   the current semaphore's range, or if its number already
1643
                   is assigned to be used by another extension.
1644
                   Use this check value for the new extension and decrement
1645
                   the check value by one. */
1646
0
                WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
1647
0
            }
1648
0
    }
1649
1650
0
    return type;
1651
0
}
1652
1653
/** Checks if a specific light (tls extension) is not set in the semaphore. */
1654
#define IS_OFF(semaphore, light) \
1655
0
    (!(((semaphore)[(light) / 8] &  (byte) (0x01 << ((light) % 8)))))
1656
1657
/** Turn on a specific light (tls extension) in the semaphore. */
1658
/* the semaphore marks the extensions already written to the message */
1659
#define TURN_ON(semaphore, light) \
1660
0
    ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
1661
1662
/** Turn off a specific light (tls extension) in the semaphore. */
1663
#define TURN_OFF(semaphore, light) \
1664
0
    ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
1665
1666
/** Creates a new extension. */
1667
static TLSX* TLSX_New(TLSX_Type type, const void* data, void* heap)
1668
0
{
1669
0
    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
1670
1671
0
    (void)heap;
1672
1673
0
    if (extension) {
1674
0
        extension->type = type;
1675
0
        extension->data = (void*)data;
1676
0
        extension->resp = 0;
1677
0
        extension->next = NULL;
1678
0
    }
1679
1680
0
    return extension;
1681
0
}
1682
1683
/**
1684
 * Creates a new extension and appends it to the provided list.
1685
 * Checks for duplicate extensions, keeps the newest.
1686
 */
1687
int TLSX_Append(TLSX** list, TLSX_Type type, const void* data, void* heap)
1688
0
{
1689
0
    TLSX* extension = TLSX_New(type, data, heap);
1690
0
    TLSX* cur;
1691
0
    TLSX** prevNext = list;
1692
1693
0
    if (extension == NULL)
1694
0
        return MEMORY_E;
1695
1696
0
    for (cur = *list; cur != NULL;) {
1697
0
        if (cur->type == type) {
1698
0
            *prevNext = cur->next;
1699
0
            cur->next = NULL;
1700
0
            TLSX_FreeAll(cur, heap);
1701
0
            cur = *prevNext;
1702
0
        }
1703
0
        else {
1704
0
            prevNext = &cur->next;
1705
0
            cur = cur->next;
1706
0
        }
1707
0
    }
1708
1709
    /* Append the extension to the list */
1710
0
    *prevNext = extension;
1711
1712
0
    return 0;
1713
0
}
1714
1715
/**
1716
 * Creates a new extension and pushes it to the provided list.
1717
 * Checks for duplicate extensions, keeps the newest.
1718
 */
1719
int TLSX_Push(TLSX** list, TLSX_Type type, const void* data, void* heap)
1720
0
{
1721
0
    TLSX* extension = TLSX_New(type, data, heap);
1722
1723
0
    if (extension == NULL)
1724
0
        return MEMORY_E;
1725
1726
    /* pushes the new extension on the list. */
1727
0
    extension->next = *list;
1728
0
    *list = extension;
1729
1730
    /* remove duplicate extensions, there should be only one of each type. */
1731
0
    do {
1732
0
        if (extension->next && extension->next->type == type) {
1733
0
            TLSX *next = extension->next;
1734
1735
0
            extension->next = next->next;
1736
0
            next->next = NULL;
1737
1738
0
            TLSX_FreeAll(next, heap);
1739
1740
            /* there is no way to occur more than
1741
             * two extensions of the same type.
1742
             */
1743
0
            break;
1744
0
        }
1745
0
    } while ((extension = extension->next));
1746
1747
0
    return 0;
1748
0
}
1749
1750
#ifndef NO_WOLFSSL_CLIENT
1751
1752
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
1753
1754
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
1755
0
{
1756
0
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1757
1758
0
    if (!extension)
1759
0
        extension = TLSX_Find(ssl->ctx->extensions, type);
1760
1761
0
    return extension == NULL;
1762
0
}
1763
1764
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
1765
1766
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
1767
0
{
1768
0
    SendAlert(ssl, alert_fatal, unsupported_extension);
1769
0
    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
1770
0
    return UNSUPPORTED_EXTENSION;
1771
0
}
1772
1773
#else
1774
1775
#define TLSX_CheckUnsupportedExtension(ssl, type) 0
1776
#define TLSX_HandleUnsupportedExtension(ssl) 0
1777
1778
#endif
1779
1780
#if !defined(NO_WOLFSSL_SERVER) || defined(WOLFSSL_TLS13)
1781
static void TLSX_SetResponseInList(TLSX* list, TLSX_Type type);
1782
/** Mark an extension to be sent back to the client.
1783
 *  Operates on a list instead of the ssl.
1784
 *      (Should only be used on ssl->extensions or ech->extensions) */
1785
static void TLSX_SetResponseInList(TLSX* list, TLSX_Type type)
1786
0
{
1787
0
    TLSX *extension = TLSX_Find(list, type);
1788
1789
0
    if (extension)
1790
0
        extension->resp = 1;
1791
0
}
1792
1793
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
1794
/** Mark an extension to be sent back to the client. */
1795
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
1796
0
{
1797
0
    TLSX_SetResponseInList(ssl->extensions, type);
1798
0
}
1799
#endif
1800
1801
/******************************************************************************/
1802
/* Application-Layer Protocol Negotiation                                     */
1803
/******************************************************************************/
1804
1805
#ifdef HAVE_ALPN
1806
/** Creates a new ALPN object, providing protocol name to use. */
1807
static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
1808
                                                                     void* heap)
1809
{
1810
    ALPN *alpn;
1811
1812
    WOLFSSL_ENTER("TLSX_ALPN_New");
1813
1814
    if (protocol_name == NULL ||
1815
        protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
1816
        WOLFSSL_MSG("Invalid arguments");
1817
        return NULL;
1818
    }
1819
1820
    alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
1821
    if (alpn == NULL) {
1822
        WOLFSSL_MSG("Memory failure");
1823
        return NULL;
1824
    }
1825
1826
    alpn->next = NULL;
1827
    alpn->negotiated = 0;
1828
    alpn->options = 0;
1829
1830
    alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
1831
                                         heap, DYNAMIC_TYPE_TLSX);
1832
    if (alpn->protocol_name == NULL) {
1833
        WOLFSSL_MSG("Memory failure");
1834
        XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1835
        return NULL;
1836
    }
1837
1838
    XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
1839
    alpn->protocol_name[protocol_nameSz] = 0;
1840
    alpn->protocol_nameSz = protocol_nameSz;
1841
1842
    (void)heap;
1843
1844
    return alpn;
1845
}
1846
1847
/** Releases an ALPN object. */
1848
static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
1849
{
1850
    (void)heap;
1851
1852
    if (alpn == NULL)
1853
        return;
1854
1855
    XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
1856
    XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1857
}
1858
1859
/** Releases all ALPN objects in the provided list. */
1860
static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
1861
{
1862
    ALPN* alpn;
1863
1864
    while ((alpn = list)) {
1865
        list = alpn->next;
1866
        TLSX_ALPN_Free(alpn, heap);
1867
    }
1868
}
1869
1870
/** Tells the buffered size of the ALPN objects in a list. */
1871
static word16 TLSX_ALPN_GetSize(ALPN *list)
1872
{
1873
    ALPN* alpn;
1874
    word32 length = OPAQUE16_LEN; /* list length */
1875
1876
    while ((alpn = list)) {
1877
        list = alpn->next;
1878
1879
        length++; /* protocol name length is on one byte */
1880
        length += (word32)alpn->protocol_nameSz;
1881
1882
        if (length > WOLFSSL_MAX_16BIT) {
1883
            return 0;
1884
        }
1885
    }
1886
1887
    return (word16)length;
1888
}
1889
1890
/** Writes the ALPN objects of a list in a buffer. */
1891
static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
1892
{
1893
    ALPN* alpn;
1894
    word16 length = 0;
1895
    word16 offset = OPAQUE16_LEN; /* list length offset */
1896
1897
    while ((alpn = list)) {
1898
        list = alpn->next;
1899
1900
        length = alpn->protocol_nameSz;
1901
1902
        /* protocol name length */
1903
        output[offset++] = (byte)length;
1904
1905
        /* protocol name value */
1906
        XMEMCPY(output + offset, alpn->protocol_name, length);
1907
1908
        offset += length;
1909
    }
1910
1911
    /* writing list length */
1912
    c16toa(offset - OPAQUE16_LEN, output);
1913
1914
    return offset;
1915
}
1916
1917
/** Finds a protocol name in the provided ALPN list */
1918
static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
1919
{
1920
    ALPN *alpn;
1921
1922
    if (list == NULL || protocol_name == NULL)
1923
        return NULL;
1924
1925
    alpn = list;
1926
    while (alpn != NULL && (
1927
           alpn->protocol_nameSz != size ||
1928
           XMEMCMP(alpn->protocol_name, protocol_name, size)))
1929
        alpn = alpn->next;
1930
1931
    return alpn;
1932
}
1933
1934
/** Set the ALPN matching client and server requirements */
1935
static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
1936
                                                                     void* heap)
1937
{
1938
    ALPN *alpn;
1939
    int  ret;
1940
1941
    if (extensions == NULL || data == NULL)
1942
        return BAD_FUNC_ARG;
1943
1944
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1945
    if (alpn == NULL) {
1946
        WOLFSSL_MSG("Memory failure");
1947
        return MEMORY_E;
1948
    }
1949
1950
    alpn->negotiated = 1;
1951
1952
    ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
1953
                                                                          heap);
1954
    if (ret != 0) {
1955
        TLSX_ALPN_Free(alpn, heap);
1956
        return ret;
1957
    }
1958
1959
    return WOLFSSL_SUCCESS;
1960
}
1961
1962
static int ALPN_find_match(WOLFSSL *ssl, TLSX **pextension,
1963
                           const byte **psel, byte *psel_len,
1964
                           const byte *alpn_val, word16 alpn_val_len)
1965
{
1966
    TLSX    *extension;
1967
    ALPN    *alpn, *list;
1968
    const byte *sel = NULL, *s;
1969
    byte sel_len = 0, wlen;
1970
1971
    extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1972
    if (extension == NULL)
1973
        extension = TLSX_Find(ssl->ctx->extensions,
1974
                              TLSX_APPLICATION_LAYER_PROTOCOL);
1975
1976
    /* No ALPN configured here */
1977
    if (extension == NULL || extension->data == NULL) {
1978
        *pextension = NULL;
1979
        *psel = NULL;
1980
        *psel_len = 0;
1981
        return 0;
1982
    }
1983
1984
    list = (ALPN*)extension->data;
1985
    for (s = alpn_val;
1986
         (s - alpn_val) < alpn_val_len;
1987
         s += wlen) {
1988
        wlen = *s++; /* bounds already checked on save */
1989
        alpn = TLSX_ALPN_Find(list, (char*)s, wlen);
1990
        if (alpn != NULL) {
1991
            WOLFSSL_MSG("ALPN protocol match");
1992
            sel = s,
1993
            sel_len = wlen;
1994
            break;
1995
        }
1996
    }
1997
1998
    if (sel == NULL) {
1999
        WOLFSSL_MSG("No ALPN protocol match");
2000
2001
        /* The caller explicitly opted out of failing on mismatch by passing
2002
         * WOLFSSL_ALPN_CONTINUE_ON_MISMATCH, so continue without an agreed
2003
         * protocol like OpenSSL. This deliberately skips the RFC 7301 section
2004
         * 3.2 fatal no_application_protocol alert. */
2005
        if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
2006
            WOLFSSL_MSG("Continue on mismatch");
2007
        }
2008
        else {
2009
            SendAlert(ssl, alert_fatal, no_application_protocol);
2010
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
2011
            return UNKNOWN_ALPN_PROTOCOL_NAME_E;
2012
        }
2013
    }
2014
2015
    *pextension = extension;
2016
    *psel = sel;
2017
    *psel_len = sel_len;
2018
    return 0;
2019
}
2020
2021
int ALPN_Select(WOLFSSL *ssl)
2022
{
2023
    TLSX *extension;
2024
    const byte *sel = NULL;
2025
    byte sel_len = 0;
2026
    int r = 0;
2027
2028
    WOLFSSL_ENTER("ALPN_Select");
2029
    if (ssl->alpn_peer_requested == NULL)
2030
        return 0;
2031
2032
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
2033
    if (ssl->alpnSelect != NULL && ssl->options.side == WOLFSSL_SERVER_END) {
2034
        r = ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested,
2035
                ssl->alpn_peer_requested_length, ssl->alpnSelectArg);
2036
        switch (r) {
2037
            case SSL_TLSEXT_ERR_OK:
2038
                WOLFSSL_MSG("ALPN protocol match");
2039
                break;
2040
            case SSL_TLSEXT_ERR_NOACK:
2041
                WOLFSSL_MSG("ALPN cb no match but not fatal");
2042
                sel = NULL;
2043
                sel_len = 0;
2044
                break;
2045
            case SSL_TLSEXT_ERR_ALERT_FATAL:
2046
            default:
2047
                WOLFSSL_MSG("ALPN cb no match and fatal");
2048
                SendAlert(ssl, alert_fatal, no_application_protocol);
2049
                WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
2050
                return UNKNOWN_ALPN_PROTOCOL_NAME_E;
2051
        }
2052
    }
2053
    else
2054
#endif
2055
    {
2056
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len,
2057
                            ssl->alpn_peer_requested,
2058
                            ssl->alpn_peer_requested_length);
2059
        if (r != 0)
2060
            return r;
2061
    }
2062
2063
    if (sel != NULL) {
2064
        /* set the matching negotiated protocol */
2065
        r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
2066
        if (r != WOLFSSL_SUCCESS) {
2067
            WOLFSSL_MSG("TLSX_SetALPN failed");
2068
            return BUFFER_ERROR;
2069
        }
2070
        /* reply to ALPN extension sent from peer */
2071
#ifndef NO_WOLFSSL_SERVER
2072
        TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
2073
#endif
2074
    }
2075
    return 0;
2076
}
2077
2078
/** Parses a buffer of ALPN extensions and set the first one matching
2079
 * client and server requirements */
2080
static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, const byte *input, word16 length,
2081
                                 byte isRequest)
2082
{
2083
    word16  size = 0, offset = 0, wlen;
2084
    int     r = WC_NO_ERR_TRACE(BUFFER_ERROR);
2085
    const byte *s;
2086
    word16  entryCount = 0;
2087
2088
    if (OPAQUE16_LEN > length)
2089
        return BUFFER_ERROR;
2090
2091
    ato16(input, &size);
2092
    offset += OPAQUE16_LEN;
2093
2094
    /* validating alpn list length */
2095
    if (size == 0 || length != OPAQUE16_LEN + size)
2096
        return BUFFER_ERROR;
2097
2098
    /* validating length of entries before accepting */
2099
    for (s = input + offset; (s - input) < length; s += wlen) {
2100
        wlen = *s++;
2101
        if (wlen == 0 || (s + wlen - input) > length)
2102
            return BUFFER_ERROR;
2103
        entryCount++;
2104
    }
2105
2106
    /* RFC 7301 Section 3.1: the server's ProtocolNameList in its ALPN
2107
     * response MUST contain exactly one ProtocolName. */
2108
    if (!isRequest && entryCount != 1) {
2109
        SendAlert(ssl, alert_fatal, decode_error);
2110
        WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
2111
        return BUFFER_ERROR;
2112
    }
2113
2114
    if (isRequest) {
2115
        /* keep the list sent by peer, if this is from a request. We
2116
         * use it later in ALPN_Select() for evaluation. */
2117
        if (ssl->alpn_peer_requested != NULL) {
2118
            XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
2119
            ssl->alpn_peer_requested_length = 0;
2120
        }
2121
        ssl->alpn_peer_requested = (byte *)XMALLOC(size, ssl->heap,
2122
                                                   DYNAMIC_TYPE_ALPN);
2123
        if (ssl->alpn_peer_requested == NULL) {
2124
            return MEMORY_ERROR;
2125
        }
2126
        ssl->alpn_peer_requested_length = size;
2127
        XMEMCPY(ssl->alpn_peer_requested, (char*)input + offset, size);
2128
    }
2129
    else {
2130
        /* a response, we should find the value in our config */
2131
        const byte *sel = NULL;
2132
        byte sel_len = 0;
2133
        TLSX *extension = NULL;
2134
2135
        /* RFC 7301 Section 3.1: a ServerHello ALPN extension MUST contain
2136
         * exactly one protocol name. The first name's length byte plus its
2137
         * payload must therefore span the whole list. */
2138
        if ((word16)(input[offset] + OPAQUE8_LEN) != size) {
2139
            SendAlert(ssl, alert_fatal, illegal_parameter);
2140
            WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
2141
            return BUFFER_ERROR;
2142
        }
2143
2144
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len, input + offset, size);
2145
        if (r != 0)
2146
            return r;
2147
2148
        if (sel != NULL) {
2149
            /* set the matching negotiated protocol */
2150
            r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
2151
            if (r != WOLFSSL_SUCCESS) {
2152
                WOLFSSL_MSG("TLSX_SetALPN failed");
2153
                return BUFFER_ERROR;
2154
            }
2155
        }
2156
        /* If we had nothing configured, the response is unexpected */
2157
        else if (extension == NULL) {
2158
            r = TLSX_HandleUnsupportedExtension(ssl);
2159
            if (r != 0)
2160
                return r;
2161
        }
2162
    }
2163
    return 0;
2164
}
2165
2166
/** Add a protocol name to the list of accepted usable ones */
2167
int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
2168
                                                                     void* heap)
2169
{
2170
    ALPN *alpn;
2171
    TLSX *extension;
2172
    int  ret;
2173
2174
    if (extensions == NULL || data == NULL)
2175
        return BAD_FUNC_ARG;
2176
2177
    alpn = TLSX_ALPN_New((char *)data, size, heap);
2178
    if (alpn == NULL) {
2179
        WOLFSSL_MSG("Memory failure");
2180
        return MEMORY_E;
2181
    }
2182
2183
    /* Set Options of ALPN */
2184
    alpn->options = options;
2185
2186
    extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2187
    if (extension == NULL) {
2188
        ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
2189
                                                             (void*)alpn, heap);
2190
        if (ret != 0) {
2191
            TLSX_ALPN_Free(alpn, heap);
2192
            return ret;
2193
        }
2194
    }
2195
    else {
2196
        /* push new ALPN object to extension data. */
2197
        alpn->next = (ALPN*)extension->data;
2198
        extension->data = (void*)alpn;
2199
    }
2200
2201
    return WOLFSSL_SUCCESS;
2202
}
2203
2204
/** Get the protocol name set by the server */
2205
int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
2206
{
2207
    TLSX *extension;
2208
    ALPN *alpn;
2209
2210
    if (extensions == NULL || data == NULL || dataSz == NULL)
2211
        return BAD_FUNC_ARG;
2212
2213
    *data = NULL;
2214
    *dataSz = 0;
2215
2216
    extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2217
    if (extension == NULL) {
2218
        WOLFSSL_MSG("TLS extension not found");
2219
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2220
        return WOLFSSL_ALPN_NOT_FOUND;
2221
    }
2222
2223
    alpn = (ALPN *)extension->data;
2224
    if (alpn == NULL) {
2225
        WOLFSSL_MSG("ALPN extension not found");
2226
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2227
        return WOLFSSL_FATAL_ERROR;
2228
    }
2229
2230
    if (alpn->negotiated != 1) {
2231
2232
        /* consider as an error */
2233
        if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
2234
            WOLFSSL_MSG("No protocol match with peer -> Failed");
2235
            WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2236
            return WOLFSSL_FATAL_ERROR;
2237
        }
2238
2239
        /* continue without negotiated protocol */
2240
        WOLFSSL_MSG("No protocol match with peer -> Continue");
2241
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2242
        return WOLFSSL_ALPN_NOT_FOUND;
2243
    }
2244
2245
    if (alpn->next != NULL) {
2246
        WOLFSSL_MSG("Only one protocol name must be accepted");
2247
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2248
        return WOLFSSL_FATAL_ERROR;
2249
    }
2250
2251
    *data = alpn->protocol_name;
2252
    *dataSz = alpn->protocol_nameSz;
2253
2254
    return WOLFSSL_SUCCESS;
2255
}
2256
2257
#define ALPN_FREE_ALL     TLSX_ALPN_FreeAll
2258
#define ALPN_GET_SIZE     TLSX_ALPN_GetSize
2259
#define ALPN_WRITE        TLSX_ALPN_Write
2260
#define ALPN_PARSE        TLSX_ALPN_ParseAndSet
2261
2262
#else /* HAVE_ALPN */
2263
2264
0
#define ALPN_FREE_ALL(list, heap) WC_DO_NOTHING
2265
0
#define ALPN_GET_SIZE(list)     0
2266
0
#define ALPN_WRITE(a, b)        0
2267
0
#define ALPN_PARSE(a, b, c, d)  0
2268
2269
#endif /* HAVE_ALPN */
2270
2271
/******************************************************************************/
2272
/* Server Name Indication                                                     */
2273
/******************************************************************************/
2274
2275
#ifdef HAVE_SNI
2276
2277
/** Creates a new SNI object. */
2278
static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
2279
0
{
2280
0
    SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
2281
2282
0
    (void)heap;
2283
2284
0
    if (sni) {
2285
0
        sni->type = type;
2286
0
        sni->next = NULL;
2287
2288
0
    #ifndef NO_WOLFSSL_SERVER
2289
0
        sni->options = 0;
2290
0
        sni->status  = WOLFSSL_SNI_NO_MATCH;
2291
0
    #endif
2292
2293
0
        switch (sni->type) {
2294
0
            case WOLFSSL_SNI_HOST_NAME:
2295
0
                sni->data.host_name = (char*)XMALLOC(size + 1, heap,
2296
0
                                                     DYNAMIC_TYPE_TLSX);
2297
0
                if (sni->data.host_name) {
2298
0
                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
2299
0
                    sni->data.host_name[size] = '\0';
2300
0
                } else {
2301
0
                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2302
0
                    sni = NULL;
2303
0
                }
2304
0
            break;
2305
2306
0
            default: /* invalid type */
2307
0
                XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2308
0
                sni = NULL;
2309
0
        }
2310
0
    }
2311
2312
0
    return sni;
2313
0
}
2314
2315
/** Releases a SNI object. */
2316
static void TLSX_SNI_Free(SNI* sni, void* heap)
2317
0
{
2318
0
    if (sni) {
2319
0
        switch (sni->type) {
2320
0
            case WOLFSSL_SNI_HOST_NAME:
2321
0
                XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
2322
0
            break;
2323
0
        }
2324
2325
0
        XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2326
0
    }
2327
0
    (void)heap;
2328
0
}
2329
2330
/** Releases all SNI objects in the provided list. */
2331
static void TLSX_SNI_FreeAll(SNI* list, void* heap)
2332
0
{
2333
0
    SNI* sni;
2334
2335
0
    while ((sni = list)) {
2336
0
        list = sni->next;
2337
0
        TLSX_SNI_Free(sni, heap);
2338
0
    }
2339
0
}
2340
2341
/** Tells the buffered size of the SNI objects in a list. */
2342
WOLFSSL_TEST_VIS word16 TLSX_SNI_GetSize(SNI* list)
2343
0
{
2344
0
    SNI* sni;
2345
0
    word32 length = OPAQUE16_LEN; /* list length */
2346
2347
0
    while ((sni = list)) {
2348
0
        list = sni->next;
2349
2350
0
        length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
2351
2352
0
        switch (sni->type) {
2353
0
            case WOLFSSL_SNI_HOST_NAME:
2354
0
                length += (word32)XSTRLEN((char*)sni->data.host_name);
2355
0
            break;
2356
0
        }
2357
2358
0
        if (length > WOLFSSL_MAX_16BIT) {
2359
0
            return 0;
2360
0
        }
2361
0
    }
2362
2363
0
    return (word16)length;
2364
0
}
2365
2366
/** Writes the SNI objects of a list in a buffer. */
2367
static word16 TLSX_SNI_Write(SNI* list, byte* output)
2368
0
{
2369
0
    SNI* sni;
2370
0
    word16 length = 0;
2371
0
    word16 offset = OPAQUE16_LEN; /* list length offset */
2372
2373
0
    while ((sni = list)) {
2374
0
        list = sni->next;
2375
2376
0
        output[offset++] = sni->type; /* sni type */
2377
2378
0
        switch (sni->type) {
2379
0
            case WOLFSSL_SNI_HOST_NAME:
2380
0
                length = (word16)XSTRLEN((char*)sni->data.host_name);
2381
2382
0
                c16toa(length, output + offset); /* sni length */
2383
0
                offset += OPAQUE16_LEN;
2384
2385
0
                XMEMCPY(output + offset, sni->data.host_name, length);
2386
2387
0
                offset += length;
2388
0
            break;
2389
0
        }
2390
0
    }
2391
2392
0
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2393
2394
0
    return offset;
2395
0
}
2396
2397
/** Finds a SNI object in the provided list. */
2398
static SNI* TLSX_SNI_Find(SNI *list, byte type)
2399
0
{
2400
0
    SNI* sni = list;
2401
2402
0
    while (sni && sni->type != type)
2403
0
        sni = sni->next;
2404
2405
0
    return sni;
2406
0
}
2407
2408
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
2409
/** Sets the status of a SNI object. */
2410
static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
2411
0
{
2412
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2413
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2414
2415
0
    if (sni)
2416
0
        sni->status = status;
2417
0
}
2418
#endif
2419
2420
/** Gets the status of a SNI object. */
2421
byte TLSX_SNI_Status(TLSX* extensions, byte type)
2422
0
{
2423
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2424
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2425
2426
0
    if (sni)
2427
0
        return sni->status;
2428
2429
0
    return 0;
2430
0
}
2431
2432
/** Parses a buffer of SNI extensions. */
2433
static int TLSX_SNI_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2434
                          byte isRequest)
2435
0
{
2436
0
#ifndef NO_WOLFSSL_SERVER
2437
0
    word16 size = 0;
2438
0
    word16 offset = 0;
2439
0
    int cacheOnly = 0;
2440
0
    int checkPublic = 0;
2441
0
    SNI* sni = NULL;
2442
0
    byte type;
2443
0
    byte matched = 0;
2444
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2445
    TLSX* echX = NULL;
2446
    WOLFSSL_ECH* ech = NULL;
2447
    WOLFSSL_EchConfig* workingConfig = NULL;
2448
#endif
2449
0
#endif /* !NO_WOLFSSL_SERVER */
2450
0
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
2451
2452
0
    if (!extension)
2453
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2454
2455
0
    if (!isRequest) {
2456
0
        #ifndef NO_WOLFSSL_CLIENT
2457
0
            if (!extension || !extension->data)
2458
0
                return TLSX_HandleUnsupportedExtension(ssl);
2459
2460
0
            if (length > 0)
2461
0
                return BUFFER_ERROR; /* SNI response MUST be empty. */
2462
2463
            /* This call enables wolfSSL_SNI_GetRequest() to be called in the
2464
             * client side to fetch the used SNI. It will only work if the SNI
2465
             * was set at the SSL object level. Right now we only support one
2466
             * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
2467
             * inclusion of other name types will turn this method inaccurate,
2468
             * as the extension response doesn't contains information of which
2469
             * name was accepted.
2470
             */
2471
0
            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
2472
0
                                                        WOLFSSL_SNI_REAL_MATCH);
2473
2474
0
            return 0;
2475
0
        #endif
2476
0
    }
2477
2478
0
#ifndef NO_WOLFSSL_SERVER
2479
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2480
    if (!ssl->options.disableECH && !ssl->options.echProcessingInner) {
2481
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
2482
        if (echX != NULL) {
2483
            ech = (WOLFSSL_ECH*)(echX->data);
2484
        }
2485
    }
2486
#endif
2487
2488
0
    if (!extension || !extension->data) {
2489
        /* This will keep SNI even though TLSX_UseSNI has not been called.
2490
         * Enable it so that the received sni is available to functions
2491
         * that use a custom callback when SNI is received.
2492
         */
2493
    #ifdef WOLFSSL_ALWAYS_KEEP_SNI
2494
        cacheOnly = 1;
2495
    #endif
2496
0
        if (ssl->ctx->sniRecvCb) {
2497
0
            cacheOnly = 1;
2498
0
        }
2499
2500
0
        if (cacheOnly) {
2501
0
            WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
2502
0
        }
2503
0
        else {
2504
        #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2505
            if (ech == NULL)
2506
        #endif
2507
0
            {
2508
                /* Skipping, SNI not enabled at server side. */
2509
0
                return 0;
2510
0
            }
2511
2512
        #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2513
            /* No server SNI configured but ECH is active:
2514
             * the outer SNI still needs to be matched against the echConfig
2515
             * publicName and recorded on ech->extensions. */
2516
            checkPublic = 1;
2517
        #endif
2518
0
        }
2519
0
    }
2520
2521
0
    if (OPAQUE16_LEN > length)
2522
0
        return BUFFER_ERROR;
2523
2524
0
    ato16(input, &size);
2525
0
    offset += OPAQUE16_LEN;
2526
2527
    /* validating sni list length */
2528
0
    if (length != OPAQUE16_LEN + size || size == 0)
2529
0
        return BUFFER_ERROR;
2530
2531
    /* SNI was badly specified and only one type is now recognized and allowed.
2532
     * Only one SNI value per type (RFC6066), so, no loop. */
2533
0
    type = input[offset++];
2534
0
    if (type != WOLFSSL_SNI_HOST_NAME)
2535
0
        return BUFFER_ERROR;
2536
2537
0
    if (offset + OPAQUE16_LEN > length)
2538
0
        return BUFFER_ERROR;
2539
0
    ato16(input + offset, &size);
2540
0
    offset += OPAQUE16_LEN;
2541
2542
0
    if (offset + size != length || size == 0)
2543
0
        return BUFFER_ERROR;
2544
2545
0
    if (!cacheOnly && !checkPublic &&
2546
0
            !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
2547
0
        return 0; /* not using this type of SNI. */
2548
2549
0
#if defined(WOLFSSL_TLS13)
2550
    /* Don't process the second ClientHello SNI extension if there
2551
     * was problems with the first.
2552
     */
2553
0
    if (!cacheOnly && sni != NULL && sni->status != WOLFSSL_SNI_NO_MATCH)
2554
0
        return 0;
2555
0
#endif
2556
2557
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2558
    /* While parsing the outer CH accept a match against any
2559
     * echConfig publicName */
2560
    if (ech != NULL) {
2561
        workingConfig = ech->echConfig;
2562
        while (workingConfig != NULL) {
2563
            if (XSTRLEN(workingConfig->publicName) == size &&
2564
                    XSTRNCMP(workingConfig->publicName,
2565
                    (const char*)input + offset, size) == 0) {
2566
                matched = 1;
2567
                break;
2568
            }
2569
            workingConfig = workingConfig->next;
2570
        }
2571
2572
        /* If a publicName is matched then this SNI is not something that should
2573
         * be forcibly cached. This allows an SNI response to be given for the
2574
         * public name */
2575
        if (matched)
2576
            cacheOnly = 0;
2577
    }
2578
    if (!matched)
2579
#endif
2580
0
    {
2581
0
        const char* hostName;
2582
0
        hostName = (sni != NULL) ? sni->data.host_name : NULL;
2583
0
        matched = cacheOnly || (hostName != NULL &&
2584
0
            XSTRLEN(hostName) == size &&
2585
0
            XSTRNCMP(hostName, (const char*)input + offset, size) == 0);
2586
0
    }
2587
2588
    /* No server SNI configured and the outer name did not match a publicName:
2589
     * stay permissive and record nothing. If ECH is accepted, the absent
2590
     * publicName match is caught after the outer parse. */
2591
0
    if (!matched && checkPublic)
2592
0
        return 0;
2593
2594
0
    if (matched ||
2595
0
            (sni != NULL && (sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH))) {
2596
0
        int matchStat;
2597
0
        int r;
2598
0
        TLSX** writeList = &ssl->extensions;
2599
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2600
        /* install onto ech->extensions if the public name was matched */
2601
        if (workingConfig != NULL)
2602
            writeList = &ech->extensions;
2603
#endif
2604
2605
0
        r = TLSX_UseSNI(writeList, type, input + offset, size, ssl->heap);
2606
2607
0
        if (r != WOLFSSL_SUCCESS)
2608
0
            return r; /* throws error. */
2609
2610
0
        if (cacheOnly) {
2611
0
            WOLFSSL_MSG("Forcing storage of SNI, Fake match");
2612
0
            matchStat = WOLFSSL_SNI_FORCE_KEEP;
2613
0
        }
2614
0
        else if (matched) {
2615
0
            WOLFSSL_MSG("SNI did match!");
2616
0
            matchStat = WOLFSSL_SNI_REAL_MATCH;
2617
0
        }
2618
0
        else {
2619
0
            WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
2620
0
            matchStat = WOLFSSL_SNI_FAKE_MATCH;
2621
0
        }
2622
2623
0
        TLSX_SNI_SetStatus(*writeList, type, (byte)matchStat);
2624
2625
0
        if (!cacheOnly)
2626
0
            TLSX_SetResponseInList(*writeList, TLSX_SERVER_NAME);
2627
0
    }
2628
0
    else if ((sni == NULL) ||
2629
0
            !(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
2630
0
        SendAlert(ssl, alert_fatal, unrecognized_name);
2631
0
        WOLFSSL_ERROR_VERBOSE(UNKNOWN_SNI_HOST_NAME_E);
2632
0
        return UNKNOWN_SNI_HOST_NAME_E;
2633
0
    }
2634
#else
2635
    (void)input;
2636
#endif /* !NO_WOLFSSL_SERVER */
2637
2638
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
2639
    (void)length;
2640
#endif
2641
2642
0
    return 0;
2643
0
}
2644
2645
static int TLSX_SNI_VerifyParse(WOLFSSL* ssl,  byte isRequest)
2646
0
{
2647
0
    (void)ssl;
2648
2649
0
    if (isRequest) {
2650
0
    #ifndef NO_WOLFSSL_SERVER
2651
0
        TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2652
0
        TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
2653
0
        SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
2654
0
        SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
2655
0
        SNI* sni = NULL;
2656
2657
0
        for (; ctx_sni; ctx_sni = ctx_sni->next) {
2658
0
            if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2659
0
                sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
2660
2661
0
                if (sni) {
2662
0
                    if (sni->status != WOLFSSL_SNI_NO_MATCH)
2663
0
                        continue;
2664
2665
                    /* if ssl level overrides ctx level, it is ok. */
2666
0
                    if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
2667
0
                        continue;
2668
0
                }
2669
2670
0
                SendAlert(ssl, alert_fatal,
2671
0
                          IsAtLeastTLSv1_3(ssl->version)
2672
0
                              ? missing_extension
2673
0
                              : handshake_failure);
2674
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2675
0
                return SNI_ABSENT_ERROR;
2676
0
            }
2677
0
        }
2678
2679
0
        for (; ssl_sni; ssl_sni = ssl_sni->next) {
2680
0
            if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2681
0
                if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
2682
0
                    continue;
2683
2684
0
                SendAlert(ssl, alert_fatal,
2685
0
                          IsAtLeastTLSv1_3(ssl->version)
2686
0
                              ? missing_extension
2687
0
                              : handshake_failure);
2688
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2689
0
                return SNI_ABSENT_ERROR;
2690
0
            }
2691
0
        }
2692
0
    #endif /* NO_WOLFSSL_SERVER */
2693
0
    }
2694
2695
0
    return 0;
2696
0
}
2697
2698
int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
2699
                                                                     void* heap)
2700
0
{
2701
0
    TLSX* extension;
2702
0
    SNI* sni = NULL;
2703
2704
0
    if (extensions == NULL || data == NULL)
2705
0
        return BAD_FUNC_ARG;
2706
2707
0
    if ((type == WOLFSSL_SNI_HOST_NAME) && (size >= WOLFSSL_HOST_NAME_MAX))
2708
0
        return BAD_LENGTH_E;
2709
2710
0
    if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
2711
0
        return MEMORY_E;
2712
2713
0
    extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
2714
0
    if (!extension) {
2715
0
        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
2716
2717
0
        if (ret != 0) {
2718
0
            TLSX_SNI_Free(sni, heap);
2719
0
            return ret;
2720
0
        }
2721
0
    }
2722
0
    else {
2723
        /* push new SNI object to extension data. */
2724
0
        sni->next = (SNI*)extension->data;
2725
0
        extension->data = (void*)sni;
2726
2727
        /* remove duplicate SNI, there should be only one of each type. */
2728
0
        do {
2729
0
            if (sni->next && sni->next->type == type) {
2730
0
                SNI* next = sni->next;
2731
2732
0
                sni->next = next->next;
2733
0
                TLSX_SNI_Free(next, heap);
2734
2735
                /* there is no way to occur more than
2736
                 * two SNIs of the same type.
2737
                 */
2738
0
                break;
2739
0
            }
2740
0
        } while ((sni = sni->next));
2741
0
    }
2742
2743
0
    return WOLFSSL_SUCCESS;
2744
0
}
2745
2746
/* client-side needs this function when ECH is enabled */
2747
#if !defined(NO_WOLFSSL_SERVER) || defined(HAVE_ECH)
2748
/** Tells the SNI requested by the client. */
2749
word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data,
2750
        byte ignoreStatus)
2751
0
{
2752
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2753
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2754
2755
0
    if (sni && (ignoreStatus || sni->status != WOLFSSL_SNI_NO_MATCH)) {
2756
0
        switch (sni->type) {
2757
0
            case WOLFSSL_SNI_HOST_NAME:
2758
0
                if (data) {
2759
0
                    *data = sni->data.host_name;
2760
0
                    return (word16)XSTRLEN((char*)*data);
2761
0
                }
2762
0
        }
2763
0
    }
2764
2765
0
    return 0;
2766
0
}
2767
#endif
2768
2769
#ifndef NO_WOLFSSL_SERVER
2770
/** Sets the options for a SNI object. */
2771
void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
2772
0
{
2773
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2774
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2775
2776
0
    if (sni)
2777
0
        sni->options = options;
2778
0
}
2779
2780
/** Retrieves a SNI request from a client hello buffer. */
2781
int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
2782
                           byte type, byte* sni, word32* inOutSz)
2783
0
{
2784
0
    word32 offset = 0;
2785
0
    word32 len32 = 0;
2786
0
    word16 len16 = 0;
2787
2788
0
    if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
2789
0
        return INCOMPLETE_DATA;
2790
2791
    /* TLS record header */
2792
0
    if ((enum ContentType) clientHello[offset++] != handshake) {
2793
2794
        /* checking for SSLv2.0 client hello according to: */
2795
        /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
2796
0
        if ((enum HandShakeType) clientHello[++offset] == client_hello) {
2797
0
            offset += ENUM_LEN + VERSION_SZ; /* skip version */
2798
2799
0
            ato16(clientHello + offset, &len16);
2800
0
            offset += OPAQUE16_LEN;
2801
2802
0
            if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
2803
0
                return BUFFER_ERROR;
2804
2805
0
            ato16(clientHello + offset, &len16);
2806
            /* Returning SNI_UNSUPPORTED do not increment offset here */
2807
2808
0
            if (len16 != 0) /* session_id_length must be 0 */
2809
0
                return BUFFER_ERROR;
2810
2811
0
            WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2812
0
            return SNI_UNSUPPORTED;
2813
0
        }
2814
2815
0
        return BUFFER_ERROR;
2816
0
    }
2817
2818
0
    if (clientHello[offset++] != SSLv3_MAJOR)
2819
0
        return BUFFER_ERROR;
2820
2821
0
    if (clientHello[offset++] < TLSv1_MINOR) {
2822
0
        WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2823
0
        return SNI_UNSUPPORTED;
2824
0
    }
2825
2826
0
    ato16(clientHello + offset, &len16);
2827
0
    offset += OPAQUE16_LEN;
2828
2829
0
    if (offset + len16 > helloSz)
2830
0
        return INCOMPLETE_DATA;
2831
2832
    /* Handshake header */
2833
0
    if ((enum HandShakeType) clientHello[offset] != client_hello)
2834
0
        return BUFFER_ERROR;
2835
2836
0
    c24to32(clientHello + offset + 1, &len32);
2837
0
    offset += HANDSHAKE_HEADER_SZ;
2838
2839
0
    if (offset + len32 > helloSz)
2840
0
        return BUFFER_ERROR;
2841
2842
    /* client hello */
2843
0
    offset += VERSION_SZ + RAN_LEN; /* version, random */
2844
2845
0
    if (helloSz < offset + clientHello[offset])
2846
0
        return BUFFER_ERROR;
2847
2848
0
    offset += ENUM_LEN + clientHello[offset]; /* skip session id */
2849
2850
    /* cypher suites */
2851
0
    if (helloSz < offset + OPAQUE16_LEN)
2852
0
        return BUFFER_ERROR;
2853
2854
0
    ato16(clientHello + offset, &len16);
2855
0
    offset += OPAQUE16_LEN;
2856
2857
0
    if (helloSz < offset + len16)
2858
0
        return BUFFER_ERROR;
2859
2860
0
    offset += len16; /* skip cypher suites */
2861
2862
    /* compression methods */
2863
0
    if (helloSz < offset + 1)
2864
0
        return BUFFER_ERROR;
2865
2866
0
    if (helloSz < offset + clientHello[offset])
2867
0
        return BUFFER_ERROR;
2868
2869
0
    offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
2870
2871
    /* extensions */
2872
0
    if (helloSz < offset + OPAQUE16_LEN)
2873
0
        return 0; /* no extensions in client hello. */
2874
2875
0
    ato16(clientHello + offset, &len16);
2876
0
    offset += OPAQUE16_LEN;
2877
2878
0
    if (helloSz < offset + len16)
2879
0
        return BUFFER_ERROR;
2880
2881
0
    while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
2882
0
        word16 extType;
2883
0
        word16 extLen;
2884
2885
0
        ato16(clientHello + offset, &extType);
2886
0
        offset += OPAQUE16_LEN;
2887
2888
0
        ato16(clientHello + offset, &extLen);
2889
0
        offset += OPAQUE16_LEN;
2890
2891
0
        if (helloSz < offset + extLen)
2892
0
            return BUFFER_ERROR;
2893
2894
0
        if (extType != TLSX_SERVER_NAME) {
2895
0
            offset += extLen; /* skip extension */
2896
0
        } else {
2897
0
            word16 listLen;
2898
2899
0
            if (extLen < OPAQUE16_LEN)
2900
0
                return BUFFER_ERROR;
2901
2902
0
            ato16(clientHello + offset, &listLen);
2903
0
            offset += OPAQUE16_LEN;
2904
2905
0
            if (listLen != extLen - OPAQUE16_LEN)
2906
0
                return BUFFER_ERROR;
2907
2908
0
            if (helloSz < offset + listLen)
2909
0
                return BUFFER_ERROR;
2910
2911
0
            while (listLen > ENUM_LEN + OPAQUE16_LEN) {
2912
0
                byte   sniType = clientHello[offset++];
2913
0
                word16 sniLen;
2914
2915
0
                ato16(clientHello + offset, &sniLen);
2916
0
                offset += OPAQUE16_LEN;
2917
2918
0
                if (sniLen > listLen - (ENUM_LEN + OPAQUE16_LEN))
2919
0
                    return BUFFER_ERROR;
2920
2921
0
                if (helloSz < offset + sniLen)
2922
0
                    return BUFFER_ERROR;
2923
2924
0
                if (sniType != type) {
2925
0
                    offset  += sniLen;
2926
0
                    listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
2927
0
                    continue;
2928
0
                }
2929
2930
0
                *inOutSz = min(sniLen, *inOutSz);
2931
0
                XMEMCPY(sni, clientHello + offset, *inOutSz);
2932
2933
0
                return WOLFSSL_SUCCESS;
2934
0
            }
2935
0
        }
2936
2937
0
        len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
2938
0
    }
2939
2940
0
    return len16 ? BUFFER_ERROR : 0;
2941
0
}
2942
2943
#endif
2944
2945
0
#define SNI_FREE_ALL     TLSX_SNI_FreeAll
2946
0
#define SNI_GET_SIZE     TLSX_SNI_GetSize
2947
0
#define SNI_WRITE        TLSX_SNI_Write
2948
0
#define SNI_PARSE        TLSX_SNI_Parse
2949
0
#define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
2950
2951
#else
2952
2953
#define SNI_FREE_ALL(list, heap) WC_DO_NOTHING
2954
#define SNI_GET_SIZE(list)     0
2955
#define SNI_WRITE(a, b)        0
2956
#define SNI_PARSE(a, b, c, d)  0
2957
#define SNI_VERIFY_PARSE(a, b) 0
2958
2959
#endif /* HAVE_SNI */
2960
2961
/******************************************************************************/
2962
/* Trusted CA Key Indication                                                  */
2963
/******************************************************************************/
2964
2965
#ifdef HAVE_TRUSTED_CA
2966
2967
/** Creates a new TCA object. */
2968
static TCA* TLSX_TCA_New(byte type, const byte* id, word16 idSz, void* heap)
2969
{
2970
    TCA* tca = (TCA*)XMALLOC(sizeof(TCA), heap, DYNAMIC_TYPE_TLSX);
2971
2972
    if (tca) {
2973
        XMEMSET(tca, 0, sizeof(TCA));
2974
        tca->type = type;
2975
2976
        switch (type) {
2977
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2978
                break;
2979
2980
            #ifndef NO_SHA
2981
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2982
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2983
                if (idSz == WC_SHA_DIGEST_SIZE &&
2984
                        (tca->id =
2985
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2986
                    XMEMCPY(tca->id, id, idSz);
2987
                    tca->idSz = idSz;
2988
                }
2989
                else {
2990
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2991
                    tca = NULL;
2992
                }
2993
                break;
2994
            #endif
2995
2996
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2997
                if (idSz > 0 &&
2998
                        (tca->id =
2999
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
3000
                    XMEMCPY(tca->id, id, idSz);
3001
                    tca->idSz = idSz;
3002
                }
3003
                else {
3004
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
3005
                    tca = NULL;
3006
                }
3007
                break;
3008
3009
            default: /* invalid type */
3010
                XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
3011
                tca = NULL;
3012
        }
3013
    }
3014
3015
    (void)heap;
3016
3017
    return tca;
3018
}
3019
3020
/** Releases a TCA object. */
3021
static void TLSX_TCA_Free(TCA* tca, void* heap)
3022
{
3023
    (void)heap;
3024
3025
    if (tca) {
3026
        XFREE(tca->id, heap, DYNAMIC_TYPE_TLSX);
3027
        XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
3028
    }
3029
}
3030
3031
/** Releases all TCA objects in the provided list. */
3032
static void TLSX_TCA_FreeAll(TCA* list, void* heap)
3033
{
3034
    TCA* tca;
3035
3036
    while ((tca = list)) {
3037
        list = tca->next;
3038
        TLSX_TCA_Free(tca, heap);
3039
    }
3040
}
3041
3042
/** Tells the buffered size of the TCA objects in a list. */
3043
static word16 TLSX_TCA_GetSize(TCA* list)
3044
{
3045
    TCA* tca;
3046
    word32 length = OPAQUE16_LEN; /* list length */
3047
3048
    while ((tca = list)) {
3049
        list = tca->next;
3050
3051
        length += ENUM_LEN; /* tca type */
3052
3053
        switch (tca->type) {
3054
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
3055
                break;
3056
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3057
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3058
                length += tca->idSz;
3059
                break;
3060
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3061
                length += OPAQUE16_LEN + tca->idSz;
3062
                break;
3063
        }
3064
3065
        if (length > WOLFSSL_MAX_16BIT) {
3066
            return 0;
3067
        }
3068
    }
3069
3070
    return (word16)length;
3071
}
3072
3073
/** Writes the TCA objects of a list in a buffer. */
3074
static word16 TLSX_TCA_Write(TCA* list, byte* output)
3075
{
3076
    TCA* tca;
3077
    word16 offset = OPAQUE16_LEN; /* list length offset */
3078
3079
    while ((tca = list)) {
3080
        list = tca->next;
3081
3082
        output[offset++] = tca->type; /* tca type */
3083
3084
        switch (tca->type) {
3085
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
3086
                break;
3087
            #ifndef NO_SHA
3088
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3089
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3090
                if (tca->id != NULL) {
3091
                    XMEMCPY(output + offset, tca->id, tca->idSz);
3092
                    offset += tca->idSz;
3093
                }
3094
                else {
3095
                    /* ID missing. Set to an empty string. */
3096
                    c16toa(0, output + offset);
3097
                    offset += OPAQUE16_LEN;
3098
                }
3099
                break;
3100
            #endif
3101
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3102
                if (tca->id != NULL) {
3103
                    c16toa(tca->idSz, output + offset); /* tca length */
3104
                    offset += OPAQUE16_LEN;
3105
                    XMEMCPY(output + offset, tca->id, tca->idSz);
3106
                    offset += tca->idSz;
3107
                }
3108
                else {
3109
                    /* ID missing. Set to an empty string. */
3110
                    c16toa(0, output + offset);
3111
                    offset += OPAQUE16_LEN;
3112
                }
3113
                break;
3114
            default:
3115
                /* ID unknown. Set to an empty string. */
3116
                c16toa(0, output + offset);
3117
                offset += OPAQUE16_LEN;
3118
        }
3119
    }
3120
3121
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
3122
3123
    return offset;
3124
}
3125
3126
#ifndef NO_WOLFSSL_SERVER
3127
static TCA* TLSX_TCA_Find(TCA *list, byte type, const byte* id, word16 idSz)
3128
{
3129
    TCA* tca = list;
3130
3131
    while (tca) {
3132
        if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED)
3133
            break;
3134
        if (tca->type == type && idSz == tca->idSz &&
3135
                XMEMCMP(id, tca->id, idSz) == 0)
3136
            break;
3137
        tca = tca->next;
3138
    }
3139
3140
    return tca;
3141
}
3142
#endif /* NO_WOLFSSL_SERVER */
3143
3144
/** Parses a buffer of TCA extensions. */
3145
static int TLSX_TCA_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3146
                          byte isRequest)
3147
{
3148
#ifndef NO_WOLFSSL_SERVER
3149
    word16 size = 0;
3150
    word16 offset = 0;
3151
#endif
3152
3153
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
3154
3155
    if (!extension)
3156
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_TRUSTED_CA_KEYS);
3157
3158
    if (!isRequest) {
3159
        #ifndef NO_WOLFSSL_CLIENT
3160
            if (!extension || !extension->data)
3161
                return TLSX_HandleUnsupportedExtension(ssl);
3162
3163
            if (length > 0)
3164
                return BUFFER_ERROR; /* TCA response MUST be empty. */
3165
3166
            /* Set the flag that we're good for keys */
3167
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
3168
3169
            return 0;
3170
        #endif
3171
    }
3172
3173
#ifndef NO_WOLFSSL_SERVER
3174
    if (!extension || !extension->data) {
3175
        /* Skipping, TCA not enabled at server side. */
3176
        return 0;
3177
    }
3178
3179
    if (OPAQUE16_LEN > length)
3180
        return BUFFER_ERROR;
3181
3182
    ato16(input, &size);
3183
    offset += OPAQUE16_LEN;
3184
3185
    /* validating tca list length */
3186
    if (length != OPAQUE16_LEN + size)
3187
        return BUFFER_ERROR;
3188
3189
    for (size = 0; offset < length; offset += size) {
3190
        TCA *tca = NULL;
3191
        byte type;
3192
        const byte* id = NULL;
3193
        word16 idSz = 0;
3194
3195
        if (offset + ENUM_LEN > length)
3196
            return BUFFER_ERROR;
3197
3198
        type = input[offset++];
3199
3200
        switch (type) {
3201
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
3202
                break;
3203
            #ifndef NO_SHA
3204
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3205
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3206
                if (offset + WC_SHA_DIGEST_SIZE > length)
3207
                    return BUFFER_ERROR;
3208
                idSz = WC_SHA_DIGEST_SIZE;
3209
                id = input + offset;
3210
                offset += idSz;
3211
                break;
3212
            #endif
3213
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3214
                if (offset + OPAQUE16_LEN > length)
3215
                    return BUFFER_ERROR;
3216
                ato16(input + offset, &idSz);
3217
                offset += OPAQUE16_LEN;
3218
                if ((offset > length) || (idSz > length - offset))
3219
                    return BUFFER_ERROR;
3220
                id = input + offset;
3221
                offset += idSz;
3222
                break;
3223
            default:
3224
                WOLFSSL_ERROR_VERBOSE(TCA_INVALID_ID_TYPE);
3225
                return TCA_INVALID_ID_TYPE;
3226
        }
3227
3228
        /* Find the type/ID in the TCA list. */
3229
        tca = TLSX_TCA_Find((TCA*)extension->data, type, id, idSz);
3230
        if (tca != NULL) {
3231
            /* Found it. Set the response flag and break out of the loop. */
3232
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
3233
            break;
3234
        }
3235
    }
3236
#else
3237
    (void)input;
3238
#endif
3239
3240
    return 0;
3241
}
3242
3243
/* Checks to see if the server sent a response for the TCA. */
3244
static int TLSX_TCA_VerifyParse(WOLFSSL* ssl, byte isRequest)
3245
{
3246
    (void)ssl;
3247
3248
    if (!isRequest) {
3249
        /* RFC 6066 section 6 states that the server responding
3250
         * to trusted_ca_keys is optional.  Do not error out unless
3251
         * opted into with the define WOLFSSL_REQUIRE_TCA. */
3252
    #if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_REQUIRE_TCA)
3253
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
3254
3255
        if (extension && !extension->resp) {
3256
            SendAlert(ssl, alert_fatal, handshake_failure);
3257
            WOLFSSL_ERROR_VERBOSE(TCA_ABSENT_ERROR);
3258
            return TCA_ABSENT_ERROR;
3259
        }
3260
    #else
3261
        WOLFSSL_MSG("No response received for trusted_ca_keys.  Continuing.");
3262
    #endif /* !NO_WOLFSSL_CLIENT && WOLFSSL_REQUIRE_TCA */
3263
    }
3264
3265
    return 0;
3266
}
3267
3268
int TLSX_UseTrustedCA(TLSX** extensions, byte type,
3269
                    const byte* id, word16 idSz, void* heap)
3270
{
3271
    TLSX* extension;
3272
    TCA* tca = NULL;
3273
3274
    if (extensions == NULL)
3275
        return BAD_FUNC_ARG;
3276
3277
    if ((tca = TLSX_TCA_New(type, id, idSz, heap)) == NULL)
3278
        return MEMORY_E;
3279
3280
    extension = TLSX_Find(*extensions, TLSX_TRUSTED_CA_KEYS);
3281
    if (!extension) {
3282
        int ret = TLSX_Push(extensions, TLSX_TRUSTED_CA_KEYS, (void*)tca, heap);
3283
3284
        if (ret != 0) {
3285
            TLSX_TCA_Free(tca, heap);
3286
            return ret;
3287
        }
3288
    }
3289
    else {
3290
        /* push new TCA object to extension data. */
3291
        tca->next = (TCA*)extension->data;
3292
        extension->data = (void*)tca;
3293
    }
3294
3295
    return WOLFSSL_SUCCESS;
3296
}
3297
3298
#define TCA_FREE_ALL     TLSX_TCA_FreeAll
3299
#define TCA_GET_SIZE     TLSX_TCA_GetSize
3300
#define TCA_WRITE        TLSX_TCA_Write
3301
#define TCA_PARSE        TLSX_TCA_Parse
3302
#define TCA_VERIFY_PARSE TLSX_TCA_VerifyParse
3303
3304
#else /* HAVE_TRUSTED_CA */
3305
3306
0
#define TCA_FREE_ALL(list, heap) WC_DO_NOTHING
3307
0
#define TCA_GET_SIZE(list)     0
3308
0
#define TCA_WRITE(a, b)        0
3309
0
#define TCA_PARSE(a, b, c, d)  0
3310
0
#define TCA_VERIFY_PARSE(a, b) 0
3311
3312
#endif /* HAVE_TRUSTED_CA */
3313
3314
/******************************************************************************/
3315
/* Max Fragment Length Negotiation                                            */
3316
/******************************************************************************/
3317
3318
#ifdef HAVE_MAX_FRAGMENT
3319
3320
static word16 TLSX_MFL_Write(byte* data, byte* output)
3321
{
3322
    output[0] = data[0];
3323
3324
    return ENUM_LEN;
3325
}
3326
3327
static int TLSX_MFL_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3328
                          byte isRequest)
3329
{
3330
    if (length != ENUM_LEN)
3331
        return BUFFER_ERROR;
3332
3333
#ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3334
    (void) isRequest;
3335
#else
3336
    if (!isRequest) {
3337
        TLSX* extension;
3338
3339
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
3340
            return TLSX_HandleUnsupportedExtension(ssl);
3341
3342
        /* RFC 6066 Section 4: the server's response value must match the
3343
         * value the client requested. The request may have been configured on
3344
         * the WOLFSSL object or inherited from the WOLFSSL_CTX. */
3345
        extension = TLSX_Find(ssl->extensions, TLSX_MAX_FRAGMENT_LENGTH);
3346
        if (extension == NULL) {
3347
            extension = TLSX_Find(ssl->ctx->extensions,
3348
                    TLSX_MAX_FRAGMENT_LENGTH);
3349
        }
3350
        if (extension == NULL || extension->data == NULL ||
3351
                ((byte*)extension->data)[0] != *input) {
3352
            SendAlert(ssl, alert_fatal, illegal_parameter);
3353
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
3354
            return UNKNOWN_MAX_FRAG_LEN_E;
3355
        }
3356
    }
3357
#endif
3358
3359
    switch (*input) {
3360
        case WOLFSSL_MFL_2_8 : ssl->max_fragment =  256; break;
3361
        case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
3362
        case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
3363
        case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
3364
        case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
3365
        case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
3366
3367
        default:
3368
            SendAlert(ssl, alert_fatal, illegal_parameter);
3369
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
3370
            return UNKNOWN_MAX_FRAG_LEN_E;
3371
    }
3372
    if (ssl->session != NULL) {
3373
        ssl->session->mfl = *input;
3374
    }
3375
3376
#ifndef NO_WOLFSSL_SERVER
3377
    if (isRequest) {
3378
        int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
3379
3380
        if (ret != WOLFSSL_SUCCESS)
3381
            return ret; /* throw error */
3382
3383
        TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
3384
    }
3385
#endif
3386
3387
    return 0;
3388
}
3389
3390
int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
3391
{
3392
    byte* data = NULL;
3393
    int ret = 0;
3394
3395
    if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
3396
        return BAD_FUNC_ARG;
3397
3398
    data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
3399
    if (data == NULL)
3400
        return MEMORY_E;
3401
3402
    data[0] = mfl;
3403
3404
    ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
3405
    if (ret != 0) {
3406
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
3407
        return ret;
3408
    }
3409
3410
    return WOLFSSL_SUCCESS;
3411
}
3412
3413
3414
#define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
3415
#define MFL_GET_SIZE(data) ENUM_LEN
3416
#define MFL_WRITE          TLSX_MFL_Write
3417
#define MFL_PARSE          TLSX_MFL_Parse
3418
3419
#else
3420
3421
0
#define MFL_FREE_ALL(a, b) WC_DO_NOTHING
3422
0
#define MFL_GET_SIZE(a)       0
3423
0
#define MFL_WRITE(a, b)       0
3424
0
#define MFL_PARSE(a, b, c, d) 0
3425
3426
#endif /* HAVE_MAX_FRAGMENT */
3427
3428
/******************************************************************************/
3429
/* Truncated HMAC                                                             */
3430
/******************************************************************************/
3431
3432
#ifdef HAVE_TRUNCATED_HMAC
3433
3434
static int TLSX_THM_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3435
                          byte isRequest)
3436
{
3437
    if (length != 0 || input == NULL)
3438
        return BUFFER_ERROR;
3439
3440
    if (!isRequest) {
3441
    #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3442
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
3443
            return TLSX_HandleUnsupportedExtension(ssl);
3444
    #endif
3445
    }
3446
    else {
3447
        #ifndef NO_WOLFSSL_SERVER
3448
            int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
3449
3450
            if (ret != WOLFSSL_SUCCESS)
3451
                return ret; /* throw error */
3452
3453
            TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
3454
        #endif
3455
    }
3456
3457
    ssl->truncated_hmac = 1;
3458
3459
    return 0;
3460
}
3461
3462
int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
3463
{
3464
    int ret = 0;
3465
3466
    if (extensions == NULL)
3467
        return BAD_FUNC_ARG;
3468
3469
    ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
3470
    if (ret != 0)
3471
        return ret;
3472
3473
    return WOLFSSL_SUCCESS;
3474
}
3475
3476
#define THM_PARSE TLSX_THM_Parse
3477
3478
#else
3479
3480
0
#define THM_PARSE(a, b, c, d) 0
3481
3482
#endif /* HAVE_TRUNCATED_HMAC */
3483
3484
/******************************************************************************/
3485
/* Certificate Status Request                                                 */
3486
/******************************************************************************/
3487
3488
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3489
3490
static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
3491
{
3492
    int i;
3493
3494
    switch (csr->status_type) {
3495
        case WOLFSSL_CSR_OCSP:
3496
            /* Requests are stored at the certificate's position in the chain,
3497
             * not packed: ProcessChainOCSPRequest() writes
3498
             * csr->request.ocsp[i] with i counting from 1 for the first
3499
             * intermediate, while csr->requests is a count. Bounding the free
3500
             * by that count leaves the tail entries allocated and unreachable
3501
             * whenever it is lower than the highest index written. Walk the
3502
             * whole array instead; FreeOcspRequest() is a no-op on a request
3503
             * that was never populated. */
3504
            for (i = 0; i < MAX_CERT_EXTENSIONS; i++) {
3505
                FreeOcspRequest(&csr->request.ocsp[i]);
3506
            }
3507
        break;
3508
    }
3509
#ifdef WOLFSSL_TLS13
3510
    for (i = 0; i < MAX_CERT_EXTENSIONS; i++) {
3511
        if (csr->responses[i].buffer != NULL) {
3512
            XFREE(csr->responses[i].buffer, heap,
3513
                DYNAMIC_TYPE_TMP_BUFFER);
3514
        }
3515
    }
3516
#endif
3517
    XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3518
    (void)heap;
3519
}
3520
3521
word16 TLSX_CSR_GetSize_ex(CertificateStatusRequest* csr, byte isRequest,
3522
                                                             int idx)
3523
{
3524
    word32 size = 0;
3525
3526
    /* shut up compiler warnings */
3527
    (void) csr; (void) isRequest;
3528
#ifndef NO_WOLFSSL_CLIENT
3529
    if (isRequest) {
3530
        switch (csr->status_type) {
3531
            case WOLFSSL_CSR_OCSP:
3532
                size += ENUM_LEN + 2 * OPAQUE16_LEN;
3533
3534
                if (csr->request.ocsp[0].nonceSz)
3535
                    size += OCSP_NONCE_EXT_SZ;
3536
            break;
3537
        }
3538
    }
3539
#endif
3540
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3541
    if (!isRequest && csr->ssl != NULL && IsAtLeastTLSv1_3(csr->ssl->version)) {
3542
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3543
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3544
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3545
            if (WOLFSSL_MAX_16BIT - OPAQUE8_LEN - OPAQUE24_LEN <
3546
                    csr->ssl->ocspCsrResp[idx].length) {
3547
                return 0;
3548
            }
3549
            size = OPAQUE8_LEN + OPAQUE24_LEN +
3550
                    csr->ssl->ocspCsrResp[idx].length;
3551
            return (word16)size;
3552
        }
3553
        if (WOLFSSL_MAX_16BIT - OPAQUE8_LEN - OPAQUE24_LEN <
3554
                csr->responses[idx].length) {
3555
            return 0;
3556
        }
3557
        size = OPAQUE8_LEN + OPAQUE24_LEN + csr->responses[idx].length;
3558
        return (word16)size;
3559
    }
3560
#else
3561
    (void)idx;
3562
#endif
3563
    return (word16)size;
3564
}
3565
3566
#if (defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER))
3567
int TLSX_CSR_SetResponseWithStatusCB(WOLFSSL *ssl)
3568
{
3569
    WOLFSSL_OCSP *ocsp;
3570
    int ret;
3571
3572
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3573
        return BAD_FUNC_ARG;
3574
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3575
    if (ocsp == NULL || ocsp->statusCb == NULL)
3576
        return BAD_FUNC_ARG;
3577
    ret = ocsp->statusCb(ssl, ocsp->statusCbArg);
3578
    switch (ret) {
3579
        case WOLFSSL_OCSP_STATUS_CB_OK: {
3580
            size_t i;
3581
            for (i = 0; i < XELEM_CNT(ssl->ocspCsrResp); i++) {
3582
                if (ssl->ocspCsrResp[i].length > 0) {
3583
                    /* ack the extension, status cb provided the response in
3584
                     * ssl->ocspCsrResp */
3585
                    TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3586
                    ssl->status_request = WOLFSSL_CSR_OCSP;
3587
                    break;
3588
                }
3589
            }
3590
            ret = 0;
3591
            break;
3592
        }
3593
        case WOLFSSL_OCSP_STATUS_CB_NOACK:
3594
            /* suppressing as not critical */
3595
            ret = 0;
3596
            break;
3597
        case WOLFSSL_OCSP_STATUS_CB_ALERT_FATAL:
3598
        default:
3599
            ret = WOLFSSL_FATAL_ERROR;
3600
            break;
3601
    }
3602
    return ret;
3603
}
3604
3605
static int TLSX_CSR_WriteWithStatusCB(CertificateStatusRequest* csr,
3606
    byte* output, int idx)
3607
{
3608
    WOLFSSL *ssl = csr->ssl;
3609
    WOLFSSL_OCSP *ocsp;
3610
    word16 offset = 0;
3611
    byte *response;
3612
    int respSz;
3613
3614
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3615
        return BAD_FUNC_ARG;
3616
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3617
    if (ocsp == NULL || ocsp->statusCb == NULL)
3618
        return BAD_FUNC_ARG;
3619
    response = ssl->ocspCsrResp[idx].buffer;
3620
    respSz = ssl->ocspCsrResp[idx].length;
3621
    if (response == NULL || respSz == 0)
3622
        return BAD_FUNC_ARG;
3623
    output[offset++] = WOLFSSL_CSR_OCSP;
3624
    c32to24(respSz, output + offset);
3625
    offset += OPAQUE24_LEN;
3626
    XMEMCPY(output + offset, response, respSz);
3627
    return offset + respSz;
3628
}
3629
#endif /* (TLS13 && !NO_WOLFSLL_SERVER) */
3630
3631
static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
3632
{
3633
    return TLSX_CSR_GetSize_ex(csr, isRequest, 0);
3634
}
3635
3636
int TLSX_CSR_Write_ex(CertificateStatusRequest* csr, byte* output,
3637
                          byte isRequest, int idx)
3638
{
3639
    /* shut up compiler warnings */
3640
    (void) csr; (void) output; (void) isRequest;
3641
3642
#ifndef NO_WOLFSSL_CLIENT
3643
    if (isRequest) {
3644
        int ret = 0;
3645
        word16 offset = 0;
3646
        word16 length = 0;
3647
3648
        /* type */
3649
        output[offset++] = csr->status_type;
3650
3651
        switch (csr->status_type) {
3652
            case WOLFSSL_CSR_OCSP:
3653
                /* responder id list */
3654
                c16toa(0, output + offset);
3655
                offset += OPAQUE16_LEN;
3656
3657
                /* request extensions */
3658
                if (csr->request.ocsp[0].nonceSz) {
3659
                    ret = (int)EncodeOcspRequestExtensions(&csr->request.ocsp[0],
3660
                                                 output + offset + OPAQUE16_LEN,
3661
                                                 OCSP_NONCE_EXT_SZ);
3662
3663
                    if (ret > 0) {
3664
                        length = (word16)ret;
3665
                    }
3666
                    else {
3667
                        return ret;
3668
                    }
3669
                }
3670
3671
                c16toa(length, output + offset);
3672
                offset += OPAQUE16_LEN + length;
3673
3674
            break;
3675
        }
3676
3677
        return (int)offset;
3678
    }
3679
#endif
3680
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3681
    if (!isRequest && csr->ssl != NULL && IsAtLeastTLSv1_3(csr->ssl->version)) {
3682
        word16 offset = 0;
3683
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3684
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3685
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3686
            return TLSX_CSR_WriteWithStatusCB(csr, output, idx);
3687
        }
3688
        output[offset++] = csr->status_type;
3689
        c32to24(csr->responses[idx].length, output + offset);
3690
        offset += OPAQUE24_LEN;
3691
        XMEMCPY(output + offset, csr->responses[idx].buffer,
3692
                                        csr->responses[idx].length);
3693
        offset += (word16)csr->responses[idx].length;
3694
        return offset;
3695
    }
3696
#else
3697
    (void)idx;
3698
#endif
3699
3700
    return 0;
3701
}
3702
3703
static int TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
3704
                          byte isRequest)
3705
{
3706
    return TLSX_CSR_Write_ex(csr, output, isRequest, 0);
3707
}
3708
3709
#if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
3710
    defined(WOLFSSL_TLS_OCSP_MULTI)
3711
/* Process OCSP request certificate chain
3712
 *
3713
 * ssl       SSL/TLS object.
3714
 * returns 0 on success, otherwise failure.
3715
 */
3716
int ProcessChainOCSPRequest(WOLFSSL* ssl)
3717
{
3718
    DecodedCert* cert;
3719
    OcspRequest* request;
3720
    TLSX* extension;
3721
    CertificateStatusRequest* csr;
3722
    DerBuffer* chain;
3723
    word32 pos = 0;
3724
    buffer der;
3725
    int i = 1;
3726
    int ret = 0;
3727
3728
    /* use certChain if available, otherwise use peer certificate */
3729
    chain = ssl->buffers.certChain;
3730
    if (chain == NULL) {
3731
        chain = ssl->buffers.certificate;
3732
    }
3733
3734
    extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3735
    csr = extension ?
3736
                (CertificateStatusRequest*)extension->data : NULL;
3737
    if (csr == NULL)
3738
        return MEMORY_ERROR;
3739
3740
    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
3741
                                         DYNAMIC_TYPE_DCERT);
3742
    if (cert == NULL) {
3743
        return MEMORY_E;
3744
    }
3745
3746
    if (chain && chain->buffer) {
3747
        while (ret == 0 && pos + OPAQUE24_LEN < chain->length) {
3748
            if (i >= MAX_CERT_EXTENSIONS) {
3749
                WOLFSSL_MSG_EX(
3750
                    "OCSP request cert chain exceeds maximum length: "
3751
                    "i=%d, MAX_CERT_EXTENSIONS=%d", i, MAX_CERT_EXTENSIONS);
3752
                ret = MAX_CERT_EXTENSIONS_ERR;
3753
                break;
3754
            }
3755
3756
            c24to32(chain->buffer + pos, &der.length);
3757
            pos += OPAQUE24_LEN;
3758
            der.buffer = chain->buffer + pos;
3759
            pos += der.length;
3760
3761
            if (pos > chain->length)
3762
                break;
3763
            request = &csr->request.ocsp[i];
3764
            if (ret == 0) {
3765
                ret = CreateOcspRequest(ssl, request, cert,
3766
                        der.buffer, der.length);
3767
            }
3768
3769
            if (ret == 0) {
3770
                ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
3771
                                       request, &csr->responses[i], ssl);
3772
                /* Suppressing soft-fail responder errors. OCSP_CERT_REVOKED
3773
                 * is an explicit positive assertion of revocation and must
3774
                 * not be ignored. OCSP_NO_URL just means there is no
3775
                 * responder to staple from, and OCSP_INVALID_STATUS covers
3776
                 * every other result the stapler could not turn into a usable
3777
                 * response - an unreachable responder, or a cached entry with
3778
                 * no raw response kept; stapling stays best-effort. */
3779
                if (ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) ||
3780
                    ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL) ||
3781
                    ret == WC_NO_ERR_TRACE(OCSP_INVALID_STATUS) ||
3782
                    ret == WC_NO_ERR_TRACE(OCSP_NO_URL)) {
3783
                    ret = 0;
3784
                }
3785
                i++;
3786
                csr->requests++;
3787
            }
3788
        }
3789
    }
3790
    XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3791
3792
    return ret;
3793
}
3794
#endif
3795
3796
static int TLSX_CSR_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3797
                          byte isRequest)
3798
{
3799
    int ret;
3800
#if !defined(NO_WOLFSSL_SERVER)
3801
    byte status_type;
3802
    word16 size = 0;
3803
#endif
3804
3805
#if !defined(NO_WOLFSSL_CLIENT)
3806
    OcspRequest* request;
3807
    TLSX* extension;
3808
    CertificateStatusRequest* csr;
3809
#endif
3810
3811
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
3812
 || !defined(NO_WOLFSSL_SERVER)
3813
    word32 offset = 0;
3814
#endif
3815
3816
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
3817
    word32 resp_length = 0;
3818
#endif
3819
3820
    /* shut up compiler warnings */
3821
    (void) ssl; (void) input;
3822
3823
    if (!isRequest) {
3824
#ifndef NO_WOLFSSL_CLIENT
3825
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3826
        csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3827
3828
        if (!csr) {
3829
            /* look at context level */
3830
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
3831
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3832
3833
            if (!csr) /* unexpected extension */
3834
                return TLSX_HandleUnsupportedExtension(ssl);
3835
3836
            /* enable extension at ssl level */
3837
            ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
3838
                                     csr->status_type, csr->options, ssl,
3839
                                     ssl->heap, ssl->devId);
3840
            if (ret != WOLFSSL_SUCCESS)
3841
                return ret == 0 ? -1 : ret;
3842
3843
            switch (csr->status_type) {
3844
                case WOLFSSL_CSR_OCSP:
3845
                    /* propagate nonce */
3846
                    if (csr->request.ocsp[0].nonceSz) {
3847
                        request =
3848
                            (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
3849
3850
                        if (request) {
3851
                            XMEMCPY(request->nonce, csr->request.ocsp[0].nonce,
3852
                                        (size_t)csr->request.ocsp[0].nonceSz);
3853
                            request->nonceSz = csr->request.ocsp[0].nonceSz;
3854
                        }
3855
                    }
3856
                break;
3857
            }
3858
        }
3859
3860
        ssl->status_request = 1;
3861
3862
    #ifdef WOLFSSL_TLS13
3863
        if (ssl->options.tls1_3) {
3864
            /* Get the new extension potentially created above. */
3865
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3866
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3867
            if (csr == NULL)
3868
                return MEMORY_ERROR;
3869
3870
            ret = 0;
3871
            if (OPAQUE8_LEN + OPAQUE24_LEN > length)
3872
                ret = BUFFER_ERROR;
3873
            if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP) {
3874
                ret = BAD_CERTIFICATE_STATUS_ERROR;
3875
                WOLFSSL_ERROR_VERBOSE(ret);
3876
            }
3877
            if (ret == 0) {
3878
                c24to32(input + offset, &resp_length);
3879
                offset += OPAQUE24_LEN;
3880
                if (offset + resp_length != length)
3881
                    ret = BUFFER_ERROR;
3882
            }
3883
            if (ret == 0) {
3884
                if (ssl->response_idx < (1 + MAX_CHAIN_DEPTH))
3885
                    csr->responses[ssl->response_idx].buffer =
3886
                    (byte*)XMALLOC(resp_length, ssl->heap,
3887
                        DYNAMIC_TYPE_TMP_BUFFER);
3888
                else
3889
                    ret = BAD_FUNC_ARG;
3890
3891
                if (ret == 0 &&
3892
                        csr->responses[ssl->response_idx].buffer == NULL)
3893
                    ret = MEMORY_ERROR;
3894
            }
3895
            if (ret == 0) {
3896
                XMEMCPY(csr->responses[ssl->response_idx].buffer,
3897
                                            input + offset, resp_length);
3898
                csr->responses[ssl->response_idx].length = resp_length;
3899
            }
3900
3901
            return ret;
3902
        }
3903
        else
3904
    #endif
3905
        {
3906
            /* extension_data MUST be empty. */
3907
            return length ? BUFFER_ERROR : 0;
3908
        }
3909
#endif
3910
    }
3911
    else {
3912
#ifndef NO_WOLFSSL_SERVER
3913
        if (length == 0)
3914
            return 0;
3915
3916
        status_type = input[offset++];
3917
3918
        switch (status_type) {
3919
            case WOLFSSL_CSR_OCSP: {
3920
3921
                /* skip responder_id_list */
3922
                if ((int)(length - offset) < OPAQUE16_LEN)
3923
                    return BUFFER_ERROR;
3924
3925
                ato16(input + offset, &size);
3926
                offset += OPAQUE16_LEN + size;
3927
3928
                /* skip request_extensions */
3929
                if ((int)(length - offset) < OPAQUE16_LEN)
3930
                    return BUFFER_ERROR;
3931
3932
                ato16(input + offset, &size);
3933
                offset += OPAQUE16_LEN + size;
3934
3935
                if (offset > length)
3936
                    return BUFFER_ERROR;
3937
3938
                /* is able to send OCSP response? */
3939
                if (SSL_CM(ssl) == NULL || !SSL_CM(ssl)->ocspStaplingEnabled)
3940
                    return 0;
3941
            }
3942
            break;
3943
3944
            /* unknown status type */
3945
            default:
3946
                return 0;
3947
        }
3948
3949
        /* if using status_request and already sending it, skip this one */
3950
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3951
        if (ssl->status_request_v2)
3952
            return 0;
3953
        #endif
3954
3955
        /* accept the first good status_type and return */
3956
        ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
3957
                                                 0, ssl, ssl->heap, ssl->devId);
3958
        if (ret != WOLFSSL_SUCCESS)
3959
            return ret == 0 ? -1 : ret; /* throw error */
3960
3961
        TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3962
        ssl->status_request = status_type;
3963
#endif
3964
    }
3965
3966
    return 0;
3967
}
3968
3969
int TLSX_CSR_InitRequest_ex(TLSX* extensions, DecodedCert* cert,
3970
                                                            void* heap, int idx)
3971
{
3972
     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3973
    CertificateStatusRequest* csr = extension ?
3974
        (CertificateStatusRequest*)extension->data : NULL;
3975
    int ret = 0;
3976
3977
    if (csr) {
3978
        switch (csr->status_type) {
3979
            case WOLFSSL_CSR_OCSP: {
3980
                byte nonce[MAX_OCSP_NONCE_SZ];
3981
                int  req_cnt = idx == -1 ? csr->requests : idx;
3982
                int  nonceSz = csr->request.ocsp[0].nonceSz;
3983
                OcspRequest* request;
3984
3985
                request = &csr->request.ocsp[req_cnt];
3986
                if (request->serial != NULL) {
3987
                    /* clear request contents before reuse */
3988
                    FreeOcspRequest(request);
3989
                    if (csr->requests > 0)
3990
                        csr->requests--;
3991
                }
3992
                /* preserve nonce */
3993
                XMEMCPY(nonce, csr->request.ocsp->nonce, (size_t)nonceSz);
3994
3995
                if (req_cnt < MAX_CERT_EXTENSIONS) {
3996
                    if ((ret = InitOcspRequest(request, cert, 0, heap)) != 0)
3997
                        return ret;
3998
3999
                    /* restore nonce */
4000
                    XMEMCPY(csr->request.ocsp->nonce, nonce, (size_t)nonceSz);
4001
                    request->nonceSz = nonceSz;
4002
                    csr->requests++;
4003
                }
4004
                else {
4005
                    WOLFSSL_ERROR_VERBOSE(MAX_CERT_EXTENSIONS_ERR);
4006
                    return MAX_CERT_EXTENSIONS_ERR;
4007
                }
4008
            }
4009
            break;
4010
        }
4011
    }
4012
4013
    return ret;
4014
}
4015
4016
int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
4017
{
4018
    return TLSX_CSR_InitRequest_ex(extensions, cert, heap, -1);
4019
}
4020
4021
void* TLSX_CSR_GetRequest_ex(TLSX* extensions, int idx)
4022
{
4023
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
4024
    CertificateStatusRequest* csr = extension ?
4025
                              (CertificateStatusRequest*)extension->data : NULL;
4026
4027
    if (csr && csr->ssl) {
4028
        switch (csr->status_type) {
4029
            case WOLFSSL_CSR_OCSP:
4030
                if (IsAtLeastTLSv1_3(csr->ssl->version)) {
4031
                    return idx < csr->requests ? &csr->request.ocsp[idx] : NULL;
4032
                }
4033
                else {
4034
                    return idx == 0 ? &csr->request.ocsp[0] : NULL;
4035
                }
4036
        }
4037
    }
4038
4039
    return NULL;
4040
}
4041
4042
void* TLSX_CSR_GetRequest(TLSX* extensions)
4043
{
4044
    return TLSX_CSR_GetRequest_ex(extensions, 0);
4045
}
4046
4047
int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
4048
{
4049
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
4050
    CertificateStatusRequest* csr = extension ?
4051
                              (CertificateStatusRequest*)extension->data : NULL;
4052
4053
    if (csr) {
4054
        switch (csr->status_type) {
4055
            case WOLFSSL_CSR_OCSP:
4056
                if (SSL_CM(ssl)->ocspEnabled) {
4057
                    int ret;
4058
                    ret = CheckOcspRequest(SSL_CM(ssl)->ocsp,
4059
                                           &csr->request.ocsp[0], NULL, ssl);
4060
                    /* This is the client's fallback leaf lookup on the
4061
                     * verification instance, so honor the no-responder policy
4062
                     * just like the non-stapling leaf path. Default stays
4063
                     * best-effort; FAIL_IF_NOT_SUPPORTED makes it fail closed. */
4064
                    if (ret == WC_NO_ERR_TRACE(OCSP_NO_URL))
4065
                        ret = OcspNoUrlPolicy(SSL_CM(ssl));
4066
                    return ret;
4067
                }
4068
                else {
4069
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
4070
                    return OCSP_LOOKUP_FAIL;
4071
                }
4072
        }
4073
    }
4074
4075
    return 0;
4076
}
4077
4078
int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
4079
                                         byte options, WOLFSSL* ssl, void* heap,
4080
                                                                      int devId)
4081
{
4082
    CertificateStatusRequest* csr = NULL;
4083
    int ret = 0;
4084
4085
    if (!extensions || status_type != WOLFSSL_CSR_OCSP)
4086
        return BAD_FUNC_ARG;
4087
4088
    csr = (CertificateStatusRequest*)
4089
             XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
4090
    if (!csr)
4091
        return MEMORY_E;
4092
4093
    ForceZero(csr, sizeof(CertificateStatusRequest));
4094
#if defined(WOLFSSL_TLS13)
4095
    XMEMSET(csr->responses, 0, sizeof(csr->responses));
4096
#endif
4097
    csr->status_type = status_type;
4098
    csr->options     = options;
4099
    csr->ssl         = ssl;
4100
4101
    switch (csr->status_type) {
4102
        case WOLFSSL_CSR_OCSP:
4103
            if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
4104
                WC_RNG rng;
4105
4106
            #ifndef HAVE_FIPS
4107
                ret = wc_InitRng_ex(&rng, heap, devId);
4108
            #else
4109
                ret = wc_InitRng(&rng);
4110
                (void)devId;
4111
            #endif
4112
                if (ret == 0) {
4113
                    if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp[0].nonce,
4114
                                                        MAX_OCSP_NONCE_SZ) == 0)
4115
                        csr->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4116
4117
                    wc_FreeRng(&rng);
4118
                }
4119
            }
4120
        break;
4121
    }
4122
4123
    if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
4124
        XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
4125
        return ret;
4126
    }
4127
4128
    return WOLFSSL_SUCCESS;
4129
}
4130
4131
#define CSR_FREE_ALL TLSX_CSR_Free
4132
#define CSR_GET_SIZE TLSX_CSR_GetSize
4133
#define CSR_WRITE    TLSX_CSR_Write
4134
#define CSR_PARSE    TLSX_CSR_Parse
4135
4136
#else
4137
4138
0
#define CSR_FREE_ALL(data, heap) WC_DO_NOTHING
4139
0
#define CSR_GET_SIZE(a, b)    0
4140
0
#define CSR_WRITE(a, b, c)    0
4141
0
#define CSR_PARSE(a, b, c, d) 0
4142
4143
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
4144
4145
/******************************************************************************/
4146
/* Certificate Status Request v2                                              */
4147
/******************************************************************************/
4148
4149
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
4150
4151
static void TLSX_CSR2_FreePendingSigners(Signer *s, void* heap)
4152
{
4153
    Signer* next;
4154
    while(s) {
4155
        next = s->next;
4156
        FreeSigner(s, heap);
4157
        s = next;
4158
    }
4159
}
4160
static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
4161
{
4162
    CertificateStatusRequestItemV2* next;
4163
4164
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, heap);
4165
    for (; csr2; csr2 = next) {
4166
        next = csr2->next;
4167
4168
        switch (csr2->status_type) {
4169
            case WOLFSSL_CSR2_OCSP:
4170
            case WOLFSSL_CSR2_OCSP_MULTI:
4171
                while(csr2->requests--)
4172
                    FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
4173
            break;
4174
        }
4175
4176
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4177
    }
4178
    (void)heap;
4179
}
4180
4181
static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
4182
                                                                 byte isRequest)
4183
{
4184
    word32 size = 0;
4185
4186
    /* shut up compiler warnings */
4187
    (void) csr2; (void) isRequest;
4188
4189
#ifndef NO_WOLFSSL_CLIENT
4190
    if (isRequest) {
4191
        CertificateStatusRequestItemV2* next;
4192
4193
        for (size = OPAQUE16_LEN; csr2; csr2 = next) {
4194
            next = csr2->next;
4195
4196
            switch (csr2->status_type) {
4197
                case WOLFSSL_CSR2_OCSP:
4198
                case WOLFSSL_CSR2_OCSP_MULTI:
4199
                    size += ENUM_LEN + 3 * OPAQUE16_LEN;
4200
4201
                    if (csr2->request.ocsp[0].nonceSz)
4202
                        size += OCSP_NONCE_EXT_SZ;
4203
                break;
4204
            }
4205
4206
            if (size > WOLFSSL_MAX_16BIT) {
4207
                return 0;
4208
            }
4209
        }
4210
    }
4211
#endif
4212
4213
    return (word16)size;
4214
}
4215
4216
static int TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
4217
                                                   byte* output, byte isRequest)
4218
{
4219
    /* shut up compiler warnings */
4220
    (void) csr2; (void) output; (void) isRequest;
4221
4222
#ifndef NO_WOLFSSL_CLIENT
4223
    if (isRequest) {
4224
        int ret = 0;
4225
        word16 offset;
4226
        word16 length;
4227
4228
        for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
4229
            /* status_type */
4230
            output[offset++] = csr2->status_type;
4231
4232
            /* request */
4233
            switch (csr2->status_type) {
4234
                case WOLFSSL_CSR2_OCSP:
4235
                case WOLFSSL_CSR2_OCSP_MULTI:
4236
                    /* request_length */
4237
                    length = 2 * OPAQUE16_LEN;
4238
4239
                    if (csr2->request.ocsp[0].nonceSz)
4240
                        length += OCSP_NONCE_EXT_SZ;
4241
4242
                    c16toa(length, output + offset);
4243
                    offset += OPAQUE16_LEN;
4244
4245
                    /* responder id list */
4246
                    c16toa(0, output + offset);
4247
                    offset += OPAQUE16_LEN;
4248
4249
                    /* request extensions */
4250
                    length = 0;
4251
4252
                    if (csr2->request.ocsp[0].nonceSz) {
4253
                        ret = (int)EncodeOcspRequestExtensions(
4254
                                                 &csr2->request.ocsp[0],
4255
                                                 output + offset + OPAQUE16_LEN,
4256
                                                 OCSP_NONCE_EXT_SZ);
4257
4258
                        if (ret > 0) {
4259
                            length = (word16)ret;
4260
                        }
4261
                        else {
4262
                            return ret;
4263
                        }
4264
                    }
4265
4266
                    c16toa(length, output + offset);
4267
                    offset += OPAQUE16_LEN + length;
4268
                break;
4269
            }
4270
        }
4271
4272
        /* list size */
4273
        c16toa(offset - OPAQUE16_LEN, output);
4274
4275
        return (int)offset;
4276
    }
4277
#endif
4278
4279
    return 0;
4280
}
4281
4282
static int TLSX_CSR2_Parse(WOLFSSL* ssl, const byte* input, word16 length,
4283
                           byte isRequest)
4284
{
4285
    int ret;
4286
4287
    /* shut up compiler warnings */
4288
    (void) ssl; (void) input;
4289
4290
    if (!isRequest) {
4291
#ifndef NO_WOLFSSL_CLIENT
4292
        TLSX* extension;
4293
        CertificateStatusRequestItemV2* csr2;
4294
4295
        /* RFC 8446 Section 4.4.2.1: a TLS 1.3 client must not act upon the
4296
         * presence of, or the information in, this extension. Return before any
4297
         * extension state is touched. TLSX_Parse() already rejects it for every
4298
         * TLS 1.3 message type that reaches this branch, so this is defence in
4299
         * depth rather than the load bearing check. */
4300
        if (IsAtLeastTLSv1_3(ssl->version))
4301
            return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
4302
4303
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4304
        csr2 = extension ?
4305
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4306
4307
        if (!csr2) {
4308
            /* look at context level */
4309
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
4310
            csr2 = extension ?
4311
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4312
4313
            if (!csr2) /* unexpected extension */
4314
                return TLSX_HandleUnsupportedExtension(ssl);
4315
4316
            /* enable extension at ssl level */
4317
            for (; csr2; csr2 = csr2->next) {
4318
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4319
                                    csr2->status_type, csr2->options, ssl->heap,
4320
                                                                    ssl->devId);
4321
                if (ret != WOLFSSL_SUCCESS)
4322
                    return ret;
4323
4324
                switch (csr2->status_type) {
4325
                    case WOLFSSL_CSR2_OCSP:
4326
                        /* followed by */
4327
                    case WOLFSSL_CSR2_OCSP_MULTI:
4328
                        /* propagate nonce */
4329
                        if (csr2->request.ocsp[0].nonceSz) {
4330
                            OcspRequest* request =
4331
                             (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
4332
                                                          csr2->status_type, 0);
4333
4334
                            if (request) {
4335
                                XMEMCPY(request->nonce,
4336
                                        csr2->request.ocsp[0].nonce,
4337
                                        (size_t)csr2->request.ocsp[0].nonceSz);
4338
4339
                                request->nonceSz =
4340
                                                  csr2->request.ocsp[0].nonceSz;
4341
                            }
4342
                        }
4343
                    break;
4344
                }
4345
            }
4346
        }
4347
4348
        ssl->status_request_v2 = 1;
4349
4350
        return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
4351
#endif
4352
    }
4353
    else {
4354
#ifndef NO_WOLFSSL_SERVER
4355
        byte   status_type;
4356
        word16 request_length;
4357
        word16 offset = 0;
4358
        word16 size = 0;
4359
4360
        /* list size */
4361
        if (offset + OPAQUE16_LEN >= length) {
4362
            return BUFFER_E;
4363
        }
4364
4365
        ato16(input + offset, &request_length);
4366
        offset += OPAQUE16_LEN;
4367
4368
        if (length - OPAQUE16_LEN != request_length)
4369
            return BUFFER_ERROR;
4370
4371
        while (length > offset) {
4372
            if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
4373
                return BUFFER_ERROR;
4374
4375
            status_type = input[offset++];
4376
4377
            ato16(input + offset, &request_length);
4378
            offset += OPAQUE16_LEN;
4379
4380
            if (length - offset < request_length)
4381
                return BUFFER_ERROR;
4382
4383
            switch (status_type) {
4384
                case WOLFSSL_CSR2_OCSP:
4385
                case WOLFSSL_CSR2_OCSP_MULTI:
4386
                    /* skip responder_id_list */
4387
                    if ((int)(length - offset) < OPAQUE16_LEN)
4388
                        return BUFFER_ERROR;
4389
4390
                    ato16(input + offset, &size);
4391
                    if (length - offset - OPAQUE16_LEN < size)
4392
                        return BUFFER_ERROR;
4393
4394
                    offset += OPAQUE16_LEN + size;
4395
                    /* skip request_extensions */
4396
                    if ((int)(length - offset) < OPAQUE16_LEN)
4397
                        return BUFFER_ERROR;
4398
4399
                    ato16(input + offset, &size);
4400
                    if (length - offset < size)
4401
                        return BUFFER_ERROR;
4402
4403
                    offset += OPAQUE16_LEN + size;
4404
                    if (offset > length)
4405
                        return BUFFER_ERROR;
4406
4407
                    /* is able to send OCSP response? */
4408
                    if (SSL_CM(ssl) == NULL
4409
                    || !SSL_CM(ssl)->ocspStaplingEnabled)
4410
                        continue;
4411
                break;
4412
4413
                default:
4414
                    /* unknown status type, skipping! */
4415
                    offset += request_length;
4416
                    continue;
4417
            }
4418
4419
            /* if using status_request and already sending it, remove it
4420
             * and prefer to use the v2 version */
4421
            #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
4422
            if (ssl->status_request) {
4423
                ssl->status_request = 0;
4424
                TLSX_Remove(&ssl->extensions, TLSX_STATUS_REQUEST, ssl->heap);
4425
            }
4426
            #endif
4427
4428
            /* TLS 1.3 servers MUST NOT act upon presence or information in
4429
             * this extension (RFC 8448 Section 4.4.2.1).
4430
             */
4431
            if (!IsAtLeastTLSv1_3(ssl->version)) {
4432
                /* accept the first good status_type and return */
4433
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4434
                                         status_type, 0, ssl->heap, ssl->devId);
4435
                if (ret != WOLFSSL_SUCCESS)
4436
                    return ret; /* throw error */
4437
4438
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
4439
                ssl->status_request_v2 = status_type;
4440
            }
4441
4442
            return 0;
4443
        }
4444
#endif
4445
    }
4446
4447
    return 0;
4448
}
4449
4450
static CertificateStatusRequestItemV2* TLSX_CSR2_GetMulti(TLSX *extensions)
4451
{
4452
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4453
    CertificateStatusRequestItemV2* csr2 = extension ?
4454
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4455
4456
    for (; csr2; csr2 = csr2->next) {
4457
        if (csr2->status_type == WOLFSSL_CSR2_OCSP_MULTI)
4458
            return csr2;
4459
    }
4460
    return NULL;
4461
}
4462
4463
int TLSX_CSR2_IsMulti(TLSX *extensions)
4464
{
4465
    return TLSX_CSR2_GetMulti(extensions) != NULL;
4466
}
4467
4468
int TLSX_CSR2_AddPendingSigner(TLSX *extensions, Signer *s)
4469
{
4470
    CertificateStatusRequestItemV2* csr2;
4471
4472
    csr2 = TLSX_CSR2_GetMulti(extensions);
4473
    if (!csr2)
4474
        return WOLFSSL_FATAL_ERROR;
4475
4476
    s->next = csr2->pendingSigners;
4477
    csr2->pendingSigners = s;
4478
    return 0;
4479
}
4480
4481
Signer* TLSX_CSR2_GetPendingSigners(TLSX *extensions)
4482
{
4483
    CertificateStatusRequestItemV2* csr2;
4484
4485
    csr2 = TLSX_CSR2_GetMulti(extensions);
4486
    if (!csr2)
4487
        return NULL;
4488
4489
    return csr2->pendingSigners;
4490
}
4491
4492
int TLSX_CSR2_ClearPendingCA(WOLFSSL *ssl)
4493
{
4494
    CertificateStatusRequestItemV2* csr2;
4495
4496
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4497
    if (csr2 == NULL)
4498
        return 0;
4499
4500
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, SSL_CM(ssl)->heap);
4501
    csr2->pendingSigners = NULL;
4502
    return 0;
4503
}
4504
4505
int TLSX_CSR2_MergePendingCA(WOLFSSL* ssl)
4506
{
4507
    CertificateStatusRequestItemV2* csr2;
4508
    Signer *s, *next;
4509
    int r = 0;
4510
4511
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4512
    if (csr2 == NULL)
4513
        return 0;
4514
4515
    s = csr2->pendingSigners;
4516
    while (s != NULL) {
4517
        next = s->next;
4518
        r = AddSigner(SSL_CM(ssl), s);
4519
        if (r != 0)
4520
            FreeSigner(s, SSL_CM(ssl)->heap);
4521
        s = next;
4522
    }
4523
    csr2->pendingSigners = NULL;
4524
    return r;
4525
}
4526
4527
int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
4528
                                                                     void* heap)
4529
{
4530
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4531
    CertificateStatusRequestItemV2* csr2 = extension ?
4532
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4533
    int ret = 0;
4534
4535
    for (; csr2; csr2 = csr2->next) {
4536
        switch (csr2->status_type) {
4537
            case WOLFSSL_CSR2_OCSP:
4538
                if (!isPeer || csr2->requests != 0)
4539
                    break;
4540
4541
                FALL_THROUGH; /* followed by */
4542
4543
            case WOLFSSL_CSR2_OCSP_MULTI: {
4544
                if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
4545
                    byte nonce[MAX_OCSP_NONCE_SZ];
4546
                    int  nonceSz = csr2->request.ocsp[0].nonceSz;
4547
4548
                    /* preserve nonce, replicating nonce of ocsp[0] */
4549
                    XMEMCPY(nonce, csr2->request.ocsp[0].nonce,
4550
                    (size_t)nonceSz);
4551
4552
                    if ((ret = InitOcspRequest(
4553
                                      &csr2->request.ocsp[csr2->requests], cert,
4554
                                                                 0, heap)) != 0)
4555
                        return ret;
4556
4557
                    /* restore nonce */
4558
                    XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
4559
                                                        nonce, (size_t)nonceSz);
4560
                    csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
4561
                    csr2->requests++;
4562
                }
4563
            }
4564
            break;
4565
        }
4566
    }
4567
4568
    (void)cert;
4569
    return ret;
4570
}
4571
4572
void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
4573
{
4574
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4575
    CertificateStatusRequestItemV2* csr2 = extension ?
4576
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4577
4578
    for (; csr2; csr2 = csr2->next) {
4579
        if (csr2->status_type == status_type) {
4580
            switch (csr2->status_type) {
4581
                case WOLFSSL_CSR2_OCSP:
4582
                    /* followed by */
4583
4584
                case WOLFSSL_CSR2_OCSP_MULTI:
4585
                    /* requests are initialized in the reverse order */
4586
                    return idx < csr2->requests
4587
                         ? &csr2->request.ocsp[csr2->requests - idx - 1]
4588
                         : NULL;
4589
            }
4590
        }
4591
    }
4592
4593
    return NULL;
4594
}
4595
4596
int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
4597
{
4598
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4599
    CertificateStatusRequestItemV2* csr2 = extension ?
4600
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4601
4602
    /* forces only the first one */
4603
    if (csr2) {
4604
        switch (csr2->status_type) {
4605
            case WOLFSSL_CSR2_OCSP:
4606
                /* followed by */
4607
4608
            case WOLFSSL_CSR2_OCSP_MULTI:
4609
                if (SSL_CM(ssl)->ocspEnabled && csr2->requests >= 1) {
4610
                    int ret;
4611
                    ret = CheckOcspRequest(SSL_CM(ssl)->ocsp,
4612
                                          &csr2->request.ocsp[csr2->requests-1],
4613
                                          NULL, ssl);
4614
                    /* This is the client's fallback leaf lookup on the
4615
                     * verification instance, so honor the no-responder policy
4616
                     * just like the non-stapling leaf path. Default stays
4617
                     * best-effort; FAIL_IF_NOT_SUPPORTED makes it fail closed. */
4618
                    if (ret == WC_NO_ERR_TRACE(OCSP_NO_URL))
4619
                        ret = OcspNoUrlPolicy(SSL_CM(ssl));
4620
                    return ret;
4621
                }
4622
                else {
4623
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
4624
                    return OCSP_LOOKUP_FAIL;
4625
                }
4626
        }
4627
    }
4628
4629
    return 0;
4630
}
4631
4632
int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
4633
                                           byte options, void* heap, int devId)
4634
{
4635
    TLSX* extension = NULL;
4636
    CertificateStatusRequestItemV2* csr2 = NULL;
4637
    int ret = 0;
4638
4639
    if (!extensions)
4640
        return BAD_FUNC_ARG;
4641
4642
    if (status_type != WOLFSSL_CSR2_OCSP
4643
    &&  status_type != WOLFSSL_CSR2_OCSP_MULTI)
4644
        return BAD_FUNC_ARG;
4645
4646
    csr2 = (CertificateStatusRequestItemV2*)
4647
       XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
4648
    if (!csr2)
4649
        return MEMORY_E;
4650
4651
    ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
4652
4653
    csr2->status_type = status_type;
4654
    csr2->options     = options;
4655
    csr2->next        = NULL;
4656
4657
    switch (csr2->status_type) {
4658
        case WOLFSSL_CSR2_OCSP:
4659
        case WOLFSSL_CSR2_OCSP_MULTI:
4660
            if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
4661
                WC_RNG rng;
4662
4663
            #ifndef HAVE_FIPS
4664
                ret = wc_InitRng_ex(&rng, heap, devId);
4665
            #else
4666
                ret = wc_InitRng(&rng);
4667
                (void)devId;
4668
            #endif
4669
                if (ret == 0) {
4670
                    if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
4671
                                                        MAX_OCSP_NONCE_SZ) == 0)
4672
                        csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4673
4674
                    wc_FreeRng(&rng);
4675
                }
4676
            }
4677
        break;
4678
    }
4679
4680
    /* append new item */
4681
    if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
4682
        CertificateStatusRequestItemV2* last =
4683
                               (CertificateStatusRequestItemV2*)extension->data;
4684
4685
        if (last == NULL) {
4686
            XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4687
            return BAD_FUNC_ARG;
4688
        }
4689
4690
        for (; last->next; last = last->next);
4691
4692
        last->next = csr2;
4693
    }
4694
    else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
4695
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4696
        return ret;
4697
    }
4698
4699
    return WOLFSSL_SUCCESS;
4700
}
4701
4702
#define CSR2_FREE_ALL TLSX_CSR2_FreeAll
4703
#define CSR2_GET_SIZE TLSX_CSR2_GetSize
4704
#define CSR2_WRITE    TLSX_CSR2_Write
4705
#define CSR2_PARSE    TLSX_CSR2_Parse
4706
4707
#else
4708
4709
0
#define CSR2_FREE_ALL(data, heap) WC_DO_NOTHING
4710
0
#define CSR2_GET_SIZE(a, b)    0
4711
0
#define CSR2_WRITE(a, b, c)    0
4712
0
#define CSR2_PARSE(a, b, c, d) 0
4713
4714
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
4715
4716
#if defined(HAVE_SUPPORTED_CURVES) || \
4717
    (defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES))
4718
4719
#ifdef WOLFSSL_HAVE_MLKEM
4720
/* Returns whether ML-KEM groups are supported for the given side.
4721
 *
4722
 * ML-KEM groups require side specific crypto support. The client needs to
4723
 * generate a key and decapsulate, while the server needs to encapsulate.
4724
 *
4725
 * side  The side of the connection the check is for: WOLFSSL_CLIENT_END,
4726
 *       WOLFSSL_SERVER_END or WOLFSSL_NEITHER_END when the side is not known.
4727
 * returns 1 when supported or 0 otherwise.
4728
 */
4729
static int TLSX_IsMlKemGroupSupported(int side)
4730
0
{
4731
0
    if (side == WOLFSSL_CLIENT_END) {
4732
0
    #ifdef WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT
4733
0
        return 1;
4734
    #else
4735
        return 0;
4736
    #endif
4737
0
    }
4738
0
    else if (side == WOLFSSL_SERVER_END) {
4739
0
    #ifdef WOLFSSL_HAVE_MLKEM_SERVER_SUPPORT
4740
0
        return 1;
4741
    #else
4742
        return 0;
4743
    #endif
4744
0
    }
4745
0
    else {
4746
        /* Side not known - supported if either side has the crypto support. */
4747
0
    #if defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) || \
4748
0
        defined(WOLFSSL_HAVE_MLKEM_SERVER_SUPPORT)
4749
0
        return 1;
4750
    #else
4751
        return 0;
4752
    #endif
4753
0
    }
4754
0
}
4755
#endif /* WOLFSSL_HAVE_MLKEM */
4756
4757
/* Returns whether this group is supported.
4758
 *
4759
 * namedGroup  The named group to check.
4760
 * side        The side of the connection the check is for: WOLFSSL_CLIENT_END,
4761
 *             WOLFSSL_SERVER_END or WOLFSSL_NEITHER_END when the side is not
4762
 *             known. Used to determine whether the local side has the crypto
4763
 *             support required to use the group (e.g. ML-KEM requires
4764
 *             decapsulation on the client and encapsulation on the server).
4765
 * returns 1 when supported or 0 otherwise.
4766
 */
4767
int TLSX_IsGroupSupported(int namedGroup, int side)
4768
0
{
4769
0
    (void)side;
4770
4771
0
    switch (namedGroup) {
4772
0
    #ifdef HAVE_FFDHE_2048
4773
0
        case WOLFSSL_FFDHE_2048:
4774
0
            break;
4775
0
    #endif
4776
    #ifdef HAVE_FFDHE_3072
4777
        case WOLFSSL_FFDHE_3072:
4778
            break;
4779
    #endif
4780
    #ifdef HAVE_FFDHE_4096
4781
        case WOLFSSL_FFDHE_4096:
4782
            break;
4783
    #endif
4784
    #ifdef HAVE_FFDHE_6144
4785
        case WOLFSSL_FFDHE_6144:
4786
            break;
4787
    #endif
4788
    #ifdef HAVE_FFDHE_8192
4789
        case WOLFSSL_FFDHE_8192:
4790
            break;
4791
    #endif
4792
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4793
        #ifdef HAVE_ECC_KOBLITZ
4794
        case WOLFSSL_ECC_SECP256K1:
4795
            break;
4796
        #endif
4797
0
        #ifndef NO_ECC_SECP
4798
0
        case WOLFSSL_ECC_SECP256R1:
4799
0
            break;
4800
0
        #endif /* !NO_ECC_SECP */
4801
        #ifdef HAVE_ECC_BRAINPOOL
4802
        case WOLFSSL_ECC_BRAINPOOLP256R1:
4803
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
4804
            break;
4805
        #endif
4806
        #ifdef WOLFSSL_SM2
4807
        case WOLFSSL_ECC_SM2P256V1:
4808
            break;
4809
        #endif /* WOLFSSL_SM2 */
4810
0
    #endif
4811
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4812
        case WOLFSSL_ECC_X25519:
4813
            break;
4814
    #endif
4815
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4816
        case WOLFSSL_ECC_X448:
4817
            break;
4818
    #endif
4819
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
4820
0
        #ifndef NO_ECC_SECP
4821
0
        case WOLFSSL_ECC_SECP384R1:
4822
0
            break;
4823
0
        #endif /* !NO_ECC_SECP */
4824
        #ifdef HAVE_ECC_BRAINPOOL
4825
        case WOLFSSL_ECC_BRAINPOOLP384R1:
4826
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
4827
            break;
4828
        #endif
4829
0
    #endif
4830
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
4831
0
        #ifndef NO_ECC_SECP
4832
0
        case WOLFSSL_ECC_SECP521R1:
4833
0
            break;
4834
0
        #endif /* !NO_ECC_SECP */
4835
0
    #endif
4836
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
4837
        #ifdef HAVE_ECC_KOBLITZ
4838
        case WOLFSSL_ECC_SECP160K1:
4839
            break;
4840
        #endif
4841
        #ifndef NO_ECC_SECP
4842
        case WOLFSSL_ECC_SECP160R1:
4843
            break;
4844
        #endif
4845
        #ifdef HAVE_ECC_SECPR2
4846
        case WOLFSSL_ECC_SECP160R2:
4847
            break;
4848
        #endif
4849
    #endif
4850
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
4851
        #ifdef HAVE_ECC_KOBLITZ
4852
        case WOLFSSL_ECC_SECP192K1:
4853
            break;
4854
        #endif
4855
        #ifndef NO_ECC_SECP
4856
        case WOLFSSL_ECC_SECP192R1:
4857
            break;
4858
        #endif
4859
    #endif
4860
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
4861
        #ifdef HAVE_ECC_KOBLITZ
4862
        case WOLFSSL_ECC_SECP224K1:
4863
            break;
4864
        #endif
4865
0
        #ifndef NO_ECC_SECP
4866
0
        case WOLFSSL_ECC_SECP224R1:
4867
0
            break;
4868
0
        #endif
4869
0
    #endif
4870
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
4871
        #ifdef HAVE_ECC_BRAINPOOL
4872
        case WOLFSSL_ECC_BRAINPOOLP512R1:
4873
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
4874
            break;
4875
        #endif
4876
0
    #endif
4877
0
#ifdef WOLFSSL_HAVE_MLKEM
4878
0
#ifndef WOLFSSL_NO_ML_KEM
4879
0
        #ifndef WOLFSSL_NO_ML_KEM_512
4880
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4881
            case WOLFSSL_ML_KEM_512:
4882
                return TLSX_IsMlKemGroupSupported(side);
4883
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4884
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4885
            case WOLFSSL_SECP256R1MLKEM512:
4886
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4887
            case WOLFSSL_X25519MLKEM512:
4888
            #endif /* HAVE_CURVE25519 */
4889
                return TLSX_IsMlKemGroupSupported(side);
4890
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4891
0
        #endif /* WOLFSSL_NO_ML_KEM_512 */
4892
0
        #ifndef WOLFSSL_NO_ML_KEM_768
4893
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4894
            case WOLFSSL_ML_KEM_768:
4895
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4896
0
            #ifdef WOLFSSL_PQC_HYBRIDS
4897
0
            case WOLFSSL_SECP256R1MLKEM768:
4898
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4899
            case WOLFSSL_X25519MLKEM768:
4900
            #endif /* HAVE_CURVE25519 */
4901
0
            #endif /* WOLFSSL_PQC_HYBRIDS */
4902
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4903
            case WOLFSSL_SECP384R1MLKEM768:
4904
            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4905
            case WOLFSSL_X448MLKEM768:
4906
            #endif /* HAVE_CURVE448 */
4907
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4908
0
                return TLSX_IsMlKemGroupSupported(side);
4909
0
        #endif /* WOLFSSL_NO_ML_KEM_768 */
4910
0
        #ifndef WOLFSSL_NO_ML_KEM_1024
4911
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4912
            case WOLFSSL_ML_KEM_1024:
4913
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4914
0
            #ifdef WOLFSSL_PQC_HYBRIDS
4915
0
            case WOLFSSL_SECP384R1MLKEM1024:
4916
0
            #endif /* WOLFSSL_PQC_HYBRIDS */
4917
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4918
            case WOLFSSL_SECP521R1MLKEM1024:
4919
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4920
0
                return TLSX_IsMlKemGroupSupported(side);
4921
0
        #endif
4922
        #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
4923
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
4924
            case WOLFSSL_P256_ML_KEM_512_OLD:
4925
            case WOLFSSL_P384_ML_KEM_768_OLD:
4926
            case WOLFSSL_P521_ML_KEM_1024_OLD:
4927
                return TLSX_IsMlKemGroupSupported(side);
4928
        #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
4929
0
#endif /* WOLFSSL_NO_ML_KEM */
4930
#ifdef WOLFSSL_MLKEM_KYBER
4931
        #ifdef WOLFSSL_KYBER512
4932
            case WOLFSSL_KYBER_LEVEL1:
4933
            case WOLFSSL_P256_KYBER_LEVEL1:
4934
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4935
            case WOLFSSL_X25519_KYBER_LEVEL1:
4936
        #endif
4937
        #endif
4938
        #ifdef WOLFSSL_KYBER768
4939
            case WOLFSSL_KYBER_LEVEL3:
4940
            case WOLFSSL_P384_KYBER_LEVEL3:
4941
            case WOLFSSL_P256_KYBER_LEVEL3:
4942
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4943
            case WOLFSSL_X25519_KYBER_LEVEL3:
4944
        #endif
4945
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4946
            case WOLFSSL_X448_KYBER_LEVEL3:
4947
        #endif
4948
        #endif
4949
        #ifdef WOLFSSL_KYBER1024
4950
            case WOLFSSL_KYBER_LEVEL5:
4951
            case WOLFSSL_P521_KYBER_LEVEL5:
4952
        #endif
4953
                return TLSX_IsMlKemGroupSupported(side);
4954
#endif
4955
0
#endif /* WOLFSSL_HAVE_MLKEM */
4956
0
        default:
4957
0
            return 0;
4958
0
    }
4959
4960
0
    return 1;
4961
0
}
4962
#endif
4963
4964
/******************************************************************************/
4965
/* Supported Elliptic Curves                                                  */
4966
/******************************************************************************/
4967
4968
#ifdef HAVE_SUPPORTED_CURVES
4969
4970
#if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \
4971
                       && !defined(HAVE_FFDHE) && !defined(WOLFSSL_HAVE_MLKEM)
4972
#error Elliptic Curves Extension requires Elliptic Curve Cryptography or ML-KEM groups. \
4973
       Use --enable-ecc and/or --enable-mlkem in the configure script or \
4974
       define HAVE_ECC. Alternatively use FFDHE for DH cipher suites.
4975
#endif
4976
4977
static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
4978
                                                                     void* heap)
4979
0
{
4980
0
    if (curve == NULL)
4981
0
        return BAD_FUNC_ARG;
4982
4983
0
    (void)heap;
4984
4985
0
    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
4986
0
                                                             DYNAMIC_TYPE_TLSX);
4987
0
    if (*curve == NULL)
4988
0
        return MEMORY_E;
4989
4990
0
    (*curve)->name = name;
4991
0
    (*curve)->next = NULL;
4992
4993
0
    return 0;
4994
0
}
4995
4996
static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
4997
0
{
4998
0
    if (point == NULL)
4999
0
        return BAD_FUNC_ARG;
5000
5001
0
    (void)heap;
5002
5003
0
    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
5004
0
                                                             DYNAMIC_TYPE_TLSX);
5005
0
    if (*point == NULL)
5006
0
        return MEMORY_E;
5007
5008
0
    (*point)->format = format;
5009
0
    (*point)->next = NULL;
5010
5011
0
    return 0;
5012
0
}
5013
5014
static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
5015
0
{
5016
0
    SupportedCurve* curve;
5017
5018
0
    while ((curve = list)) {
5019
0
        list = curve->next;
5020
0
        XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
5021
0
    }
5022
0
    (void)heap;
5023
0
}
5024
5025
static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
5026
0
{
5027
0
    PointFormat* point;
5028
5029
0
    while ((point = list)) {
5030
0
        list = point->next;
5031
0
        XFREE(point, heap, DYNAMIC_TYPE_TLSX);
5032
0
    }
5033
0
    (void)heap;
5034
0
}
5035
5036
static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
5037
                                                                     void* heap)
5038
0
{
5039
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
5040
5041
0
    while (list) {
5042
0
        if (list->name == name) {
5043
0
            ret = 0; /* curve already in use */
5044
0
            break;
5045
0
        }
5046
5047
0
        if (list->next == NULL) {
5048
0
            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
5049
0
            break;
5050
0
        }
5051
5052
0
        list = list->next;
5053
0
    }
5054
5055
0
    return ret;
5056
0
}
5057
5058
static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
5059
0
{
5060
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
5061
5062
0
    while (list) {
5063
0
        if (list->format == format) {
5064
0
            ret = 0; /* format already in use */
5065
0
            break;
5066
0
        }
5067
5068
0
        if (list->next == NULL) {
5069
0
            ret = TLSX_PointFormat_New(&list->next, format, heap);
5070
0
            break;
5071
0
        }
5072
5073
0
        list = list->next;
5074
0
    }
5075
5076
0
    return ret;
5077
0
}
5078
5079
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
5080
5081
#if defined(HAVE_FFDHE) && (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5082
                                                         defined(HAVE_CURVE448))
5083
static void TLSX_SupportedCurve_ValidateRequest(const WOLFSSL* ssl,
5084
                                                const byte* semaphore)
5085
0
{
5086
    /* If all pre-defined parameter types for key exchange are supported then
5087
     * always send SupportedGroups extension.
5088
     */
5089
0
    (void)ssl;
5090
0
    (void)semaphore;
5091
0
}
5092
#else
5093
static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
5094
{
5095
    word16 i;
5096
    const Suites* suites = WOLFSSL_SUITES(ssl);
5097
5098
    for (i = 0; i < suites->suiteSz; i += 2) {
5099
        if (suites->suites[i] == TLS13_BYTE)
5100
            return;
5101
    #ifdef BUILD_TLS_SM4_GCM_SM3
5102
        if ((suites->suites[i] == CIPHER_BYTE) &&
5103
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
5104
            return;
5105
    #endif
5106
    #ifdef BUILD_TLS_SM4_CCM_SM3
5107
        if ((suites->suites[i] == CIPHER_BYTE) &&
5108
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
5109
            return;
5110
    #endif
5111
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5112
        if ((suites->suites[i] == SM_BYTE) &&
5113
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
5114
            return;
5115
    #endif
5116
        if ((suites->suites[i] == ECC_BYTE) ||
5117
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
5118
            (suites->suites[i] == CHACHA_BYTE)) {
5119
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5120
                                                          defined(HAVE_CURVE448)
5121
            return;
5122
        #endif
5123
        }
5124
        #ifdef HAVE_FFDHE
5125
        else {
5126
            return;
5127
        }
5128
        #endif
5129
    }
5130
5131
    /* turns semaphore on to avoid sending this extension. */
5132
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
5133
}
5134
#endif
5135
5136
/* Only send PointFormats if TLSv13, ECC or CHACHA cipher suite present.
5137
 */
5138
static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
5139
0
{
5140
0
#ifdef HAVE_FFDHE
5141
0
    (void)ssl;
5142
0
    (void)semaphore;
5143
#else
5144
    word16 i;
5145
    const Suites* suites = WOLFSSL_SUITES(ssl);
5146
5147
    if (suites == NULL)
5148
        return;
5149
5150
    for (i = 0; i < suites->suiteSz; i += 2) {
5151
        if (suites->suites[i] == TLS13_BYTE)
5152
            return;
5153
    #ifdef BUILD_TLS_SM4_GCM_SM3
5154
        if ((suites->suites[i] == CIPHER_BYTE) &&
5155
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
5156
            return;
5157
    #endif
5158
    #ifdef BUILD_TLS_SM4_CCM_SM3
5159
        if ((suites->suites[i] == CIPHER_BYTE) &&
5160
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
5161
            return;
5162
    #endif
5163
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5164
        if ((suites->suites[i] == SM_BYTE) &&
5165
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
5166
            return;
5167
    #endif
5168
        if ((suites->suites[i] == ECC_BYTE) ||
5169
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
5170
            (suites->suites[i] == CHACHA_BYTE)) {
5171
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5172
                                                          defined(HAVE_CURVE448)
5173
            return;
5174
        #endif
5175
        }
5176
    }
5177
   /* turns semaphore on to avoid sending this extension. */
5178
   TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
5179
#endif
5180
0
}
5181
5182
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
5183
5184
#ifndef NO_WOLFSSL_SERVER
5185
5186
static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
5187
0
{
5188
0
#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5189
0
                                                          defined(HAVE_CURVE448)
5190
0
    (void)semaphore;
5191
0
#endif
5192
5193
0
    if (ssl->options.cipherSuite0 == TLS13_BYTE)
5194
0
        return;
5195
#ifdef BUILD_TLS_SM4_GCM_SM3
5196
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
5197
        (ssl->options.cipherSuite == TLS_SM4_GCM_SM3))
5198
        return;
5199
#endif
5200
#ifdef BUILD_TLS_SM4_CCM_SM3
5201
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
5202
        (ssl->options.cipherSuite == TLS_SM4_CCM_SM3))
5203
        return;
5204
#endif
5205
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5206
    if ((ssl->options.cipherSuite0 == SM_BYTE) &&
5207
        (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
5208
        return;
5209
#endif
5210
0
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5211
0
    if (ssl->options.cipherSuite0 == ECC_BYTE ||
5212
0
        ssl->options.cipherSuite0 == ECDHE_PSK_BYTE ||
5213
0
        ssl->options.cipherSuite0 == CHACHA_BYTE) {
5214
0
        return;
5215
0
    }
5216
0
#endif
5217
5218
    /* turns semaphore on to avoid sending this extension. */
5219
0
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
5220
0
}
5221
5222
#endif /* !NO_WOLFSSL_SERVER */
5223
5224
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5225
5226
static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
5227
0
{
5228
0
    SupportedCurve* curve;
5229
0
    word16 length = OPAQUE16_LEN; /* list length */
5230
5231
0
    while ((curve = list)) {
5232
0
        list = curve->next;
5233
0
        length += OPAQUE16_LEN; /* curve length */
5234
0
    }
5235
5236
0
    return length;
5237
0
}
5238
5239
#endif
5240
5241
static word16 TLSX_PointFormat_GetSize(PointFormat* list)
5242
0
{
5243
0
    PointFormat* point;
5244
0
    word16 length = ENUM_LEN; /* list length */
5245
5246
0
    while ((point = list)) {
5247
0
        list = point->next;
5248
0
        length += ENUM_LEN; /* format length */
5249
0
    }
5250
5251
0
    return length;
5252
0
}
5253
5254
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5255
5256
static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
5257
0
{
5258
0
    word16 offset = OPAQUE16_LEN;
5259
5260
0
    while (list) {
5261
0
        c16toa(list->name, output + offset);
5262
0
        offset += OPAQUE16_LEN;
5263
0
        list = list->next;
5264
0
    }
5265
5266
0
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
5267
5268
0
    return offset;
5269
0
}
5270
5271
#endif
5272
5273
static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
5274
0
{
5275
0
    word16 offset = ENUM_LEN;
5276
5277
0
    while (list) {
5278
0
        output[offset++] = list->format;
5279
0
        list = list->next;
5280
0
    }
5281
5282
0
    output[0] = (byte)(offset - ENUM_LEN);
5283
5284
0
    return offset;
5285
0
}
5286
5287
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
5288
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
5289
5290
int TLSX_SupportedCurve_Parse(const WOLFSSL* ssl, const byte* input,
5291
                              word16 length, byte isRequest, TLSX** extensions)
5292
0
{
5293
0
    word16 offset;
5294
0
    word16 name;
5295
0
    int ret = 0;
5296
0
    TLSX* extension;
5297
5298
0
    if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
5299
#ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
5300
        return 0;
5301
#else
5302
0
        return BUFFER_ERROR; /* servers doesn't send this extension. */
5303
0
#endif
5304
0
    }
5305
0
    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
5306
0
        return BUFFER_ERROR;
5307
0
    ato16(input, &offset);
5308
    /* validating curve list length */
5309
0
    if (length != OPAQUE16_LEN + offset)
5310
0
        return BUFFER_ERROR;
5311
0
    offset = OPAQUE16_LEN;
5312
0
    if (offset == length) {
5313
        /* An empty named group list is malformed (named_group_list<2..2^16-1>,
5314
         * RFC 8422 / RFC 8446). BUFFER_ERROR yields a decode_error alert (see
5315
         * TranslateErrorToAlert()). Accepting it would also make an explicit
5316
         * empty extension look absent and impose no group restriction. */
5317
0
        return BUFFER_ERROR;
5318
0
    }
5319
5320
0
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5321
0
    if (extension == NULL) {
5322
        /* Just accept what the peer wants to use */
5323
0
        for (; offset < length; offset += OPAQUE16_LEN) {
5324
0
            ato16(input + offset, &name);
5325
5326
0
            ret = TLSX_UseSupportedCurve(extensions, name, ssl->heap,
5327
0
                                         ssl->options.side);
5328
            /* If it is BAD_FUNC_ARG then it is a group we do not support, but
5329
             * that is fine. */
5330
0
            if (ret != WOLFSSL_SUCCESS &&
5331
0
                    ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
5332
0
                break;
5333
0
#if !defined(NO_DH) && !defined(WOLFSSL_NO_TLS12) && \
5334
0
    !defined(NO_WOLFSSL_SERVER)
5335
            /* RFC 7919 Section 4: any codepoint in the FFDHE range (256..511)
5336
             * restricts DHE to named groups even when the exact group is
5337
             * unknown. Keep it so TLSX_SupportedFFDHE_Set() sees the offer;
5338
             * an unsupported name can never match a server group. */
5339
0
            if (ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG) && isRequest &&
5340
0
                    WOLFSSL_NAMED_GROUP_IS_FFDHE(name)) {
5341
0
                TLSX* ext = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5342
0
                if (ext == NULL) {
5343
0
                    SupportedCurve* curve = NULL;
5344
0
                    ret = TLSX_SupportedCurve_New(&curve, name, ssl->heap);
5345
0
                    if (ret == 0) {
5346
0
                        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS,
5347
0
                                        curve, ssl->heap);
5348
0
                        if (ret != 0)
5349
0
                            XFREE(curve, ssl->heap, DYNAMIC_TYPE_TLSX);
5350
0
                    }
5351
0
                }
5352
0
                else {
5353
0
                    ret = TLSX_SupportedCurve_Append(
5354
0
                        (SupportedCurve*)ext->data, name, ssl->heap);
5355
0
                }
5356
0
                if (ret != 0)
5357
0
                    break;
5358
0
            }
5359
0
#endif /* !NO_DH && !WOLFSSL_NO_TLS12 && !NO_WOLFSSL_SERVER */
5360
0
            ret = 0;
5361
0
        }
5362
        /* All advertised groups are unsupported, so no node was added above.
5363
         * Record an empty node so suite selection still sees the restriction
5364
         * (e.g. ECC/ECDHE must not be chosen) instead of treating the
5365
         * extension as absent. */
5366
0
        if (ret == 0 && isRequest &&
5367
0
                TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
5368
0
            ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, NULL, ssl->heap);
5369
0
        }
5370
0
    }
5371
0
    else {
5372
        /* Find the intersection with what the user has set */
5373
0
        SupportedCurve* commonCurves = NULL;
5374
0
        for (; offset < length; offset += OPAQUE16_LEN) {
5375
0
            SupportedCurve* foundCurve = (SupportedCurve*)extension->data;
5376
0
            ato16(input + offset, &name);
5377
5378
0
            while (foundCurve != NULL && foundCurve->name != name)
5379
0
                foundCurve = foundCurve->next;
5380
5381
0
            if (foundCurve != NULL) {
5382
0
                ret = commonCurves == NULL ?
5383
0
                      TLSX_SupportedCurve_New(&commonCurves, name, ssl->heap) :
5384
0
                      TLSX_SupportedCurve_Append(commonCurves, name, ssl->heap);
5385
0
                if (ret != 0)
5386
0
                    break;
5387
0
            }
5388
0
#if !defined(NO_DH) && !defined(WOLFSSL_NO_TLS12) && \
5389
0
    !defined(NO_WOLFSSL_SERVER)
5390
            /* RFC 7919 Section 4 (see comment above). */
5391
0
            else if (isRequest && WOLFSSL_NAMED_GROUP_IS_FFDHE(name) &&
5392
0
                    !TLSX_IsGroupSupported(name, ssl->options.side)) {
5393
0
                ret = commonCurves == NULL ?
5394
0
                      TLSX_SupportedCurve_New(&commonCurves, name, ssl->heap) :
5395
0
                      TLSX_SupportedCurve_Append(commonCurves, name, ssl->heap);
5396
0
                if (ret != 0)
5397
0
                    break;
5398
0
            }
5399
0
#endif /* !NO_DH && !WOLFSSL_NO_TLS12 && !NO_WOLFSSL_SERVER */
5400
0
        }
5401
        /* If no common curves return error. In TLS 1.3 we can still try to save
5402
         * this by using HRR. */
5403
0
        if (ret == 0 && commonCurves == NULL &&
5404
0
                !IsAtLeastTLSv1_3(ssl->version))
5405
0
            ret = ECC_CURVE_ERROR;
5406
0
        if (ret == 0) {
5407
            /* Now swap out the curves in the extension */
5408
0
            TLSX_SupportedCurve_FreeAll((SupportedCurve*)extension->data,
5409
0
                                        ssl->heap);
5410
0
            extension->data = commonCurves;
5411
0
            commonCurves = NULL;
5412
0
        }
5413
0
        TLSX_SupportedCurve_FreeAll(commonCurves, ssl->heap);
5414
0
    }
5415
5416
0
    return ret;
5417
0
}
5418
#endif
5419
5420
#if !defined(NO_WOLFSSL_SERVER)
5421
5422
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5423
5424
/* Checks the priority of the groups on the server and set the supported groups
5425
 * response if there is a group not advertised by the client that is preferred.
5426
 *
5427
 * ssl  SSL/TLS object.
5428
 * returns 0 on success, otherwise an error.
5429
 */
5430
int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
5431
0
{
5432
0
    int ret;
5433
0
    TLSX* extension;
5434
0
    TLSX* priority = NULL;
5435
0
    TLSX* ext = NULL;
5436
0
    word16 name;
5437
0
    SupportedCurve* curve;
5438
5439
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5440
    /* May be doing PSK with no key exchange. */
5441
0
    if (extension == NULL)
5442
0
        return 0;
5443
5444
0
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5445
0
    if (ret != WOLFSSL_SUCCESS) {
5446
0
        TLSX_FreeAll(priority, ssl->heap);
5447
0
        return ret;
5448
0
    }
5449
5450
0
    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5451
0
    if (ext == NULL) {
5452
0
        WOLFSSL_MSG("Could not find supported groups extension");
5453
0
        TLSX_FreeAll(priority, ssl->heap);
5454
0
        return 0;
5455
0
    }
5456
5457
0
    curve = (SupportedCurve*)ext->data;
5458
0
    name = curve->name;
5459
5460
0
    curve = (SupportedCurve*)extension->data;
5461
0
    while (curve != NULL) {
5462
0
        if (curve->name == name)
5463
0
            break;
5464
0
        curve = curve->next;
5465
0
    }
5466
5467
0
    if (curve == NULL) {
5468
        /* Couldn't find the preferred group in client list. */
5469
0
        extension->resp = 1;
5470
5471
        /* Send server list back and free client list. */
5472
0
        curve = (SupportedCurve*)extension->data;
5473
0
        extension->data = ext->data;
5474
0
        ext->data = curve;
5475
0
    }
5476
5477
0
    TLSX_FreeAll(priority, ssl->heap);
5478
5479
0
    return 0;
5480
0
}
5481
5482
#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
5483
5484
#if !defined(NO_DH) && !defined(WOLFSSL_NO_TLS12)
5485
#ifdef HAVE_FFDHE
5486
#ifdef HAVE_PUBLIC_FFDHE
5487
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5488
    SupportedCurve* serverGroup)
5489
0
{
5490
0
    int ret = 0;
5491
0
    SupportedCurve* group;
5492
0
    const DhParams* params = NULL;
5493
5494
0
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5495
0
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5496
0
            continue;
5497
5498
0
        for (group = clientGroup; group != NULL; group = group->next) {
5499
0
            if (serverGroup->name != group->name)
5500
0
                continue;
5501
5502
0
            switch (serverGroup->name) {
5503
0
            #ifdef HAVE_FFDHE_2048
5504
0
                case WOLFSSL_FFDHE_2048:
5505
0
                    params = wc_Dh_ffdhe2048_Get();
5506
0
                    break;
5507
0
            #endif
5508
            #ifdef HAVE_FFDHE_3072
5509
                case WOLFSSL_FFDHE_3072:
5510
                    params = wc_Dh_ffdhe3072_Get();
5511
                    break;
5512
            #endif
5513
            #ifdef HAVE_FFDHE_4096
5514
                case WOLFSSL_FFDHE_4096:
5515
                    params = wc_Dh_ffdhe4096_Get();
5516
                    break;
5517
            #endif
5518
            #ifdef HAVE_FFDHE_6144
5519
                case WOLFSSL_FFDHE_6144:
5520
                    params = wc_Dh_ffdhe6144_Get();
5521
                    break;
5522
            #endif
5523
            #ifdef HAVE_FFDHE_8192
5524
                case WOLFSSL_FFDHE_8192:
5525
                    params = wc_Dh_ffdhe8192_Get();
5526
                    break;
5527
            #endif
5528
0
                default:
5529
0
                    break;
5530
0
            }
5531
0
            if (params == NULL) {
5532
0
                ret = BAD_FUNC_ARG;
5533
0
                break;
5534
0
            }
5535
0
            if (params->p_len >= ssl->options.minDhKeySz &&
5536
0
                                     params->p_len <= ssl->options.maxDhKeySz) {
5537
0
                break;
5538
0
            }
5539
0
        }
5540
5541
0
        if (ret != 0)
5542
0
            break;
5543
0
        if ((group != NULL) && (serverGroup->name == group->name))
5544
0
            break;
5545
0
    }
5546
5547
0
    if ((ret == 0) && (serverGroup != NULL) && (params != NULL)) {
5548
0
        ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
5549
0
        ssl->buffers.serverDH_P.length = params->p_len;
5550
0
        ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
5551
0
        ssl->buffers.serverDH_G.length = params->g_len;
5552
5553
0
        ssl->namedGroup = serverGroup->name;
5554
0
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5555
0
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5556
0
        ssl->options.dhDoKeyTest = 0;
5557
0
    #endif
5558
0
        ssl->options.haveDH = 1;
5559
0
    }
5560
5561
0
    return ret;
5562
0
}
5563
#else
5564
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5565
    SupportedCurve* serverGroup)
5566
{
5567
    int ret = 0;
5568
    SupportedCurve* group;
5569
    word32 p_len;
5570
5571
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5572
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5573
            continue;
5574
5575
        for (group = clientGroup; group != NULL; group = group->next) {
5576
            if (serverGroup->name != group->name)
5577
                continue;
5578
5579
            ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &p_len, NULL, NULL);
5580
            if (ret == 0) {
5581
                if (p_len == 0) {
5582
                    ret = BAD_FUNC_ARG;
5583
                    break;
5584
                }
5585
                if (p_len >= ssl->options.minDhKeySz &&
5586
                                                p_len <= ssl->options.maxDhKeySz) {
5587
                    break;
5588
                }
5589
            }
5590
        }
5591
5592
        if (ret != 0)
5593
            break;
5594
        if ((group != NULL) && (serverGroup->name == group->name))
5595
            break;
5596
    }
5597
5598
    if ((ret == 0) && (serverGroup != NULL)) {
5599
        word32 pSz, gSz;
5600
5601
        ssl->buffers.serverDH_P.buffer = NULL;
5602
        ssl->buffers.serverDH_G.buffer = NULL;
5603
        ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &pSz, &gSz, NULL);
5604
        if (ret == 0) {
5605
            ssl->buffers.serverDH_P.buffer =
5606
                (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5607
            if (ssl->buffers.serverDH_P.buffer == NULL)
5608
                ret = MEMORY_E;
5609
            else
5610
                ssl->buffers.serverDH_P.length = pSz;
5611
        }
5612
        if (ret == 0) {
5613
            ssl->buffers.serverDH_G.buffer =
5614
                (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5615
            if (ssl->buffers.serverDH_G.buffer == NULL) {
5616
                ret = MEMORY_E;
5617
            } else
5618
                ssl->buffers.serverDH_G.length = gSz;
5619
        }
5620
        if (ret == 0) {
5621
            ret = wc_DhCopyNamedKey(serverGroup->name,
5622
                              ssl->buffers.serverDH_P.buffer, &pSz,
5623
                              ssl->buffers.serverDH_G.buffer, &gSz,
5624
                              NULL, NULL);
5625
        }
5626
        if (ret == 0) {
5627
            ssl->buffers.weOwnDH = 1;
5628
5629
            ssl->namedGroup = serverGroup->name;
5630
        #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5631
            !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5632
            ssl->options.dhDoKeyTest = 0;
5633
        #endif
5634
            ssl->options.haveDH = 1;
5635
        }
5636
        else {
5637
            if (ssl->buffers.serverDH_P.buffer != NULL) {
5638
                XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5639
                    DYNAMIC_TYPE_PUBLIC_KEY);
5640
                ssl->buffers.serverDH_P.length = 0;
5641
                ssl->buffers.serverDH_P.buffer = NULL;
5642
            }
5643
            if (ssl->buffers.serverDH_G.buffer != NULL) {
5644
                XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5645
                    DYNAMIC_TYPE_PUBLIC_KEY);
5646
                ssl->buffers.serverDH_G.length = 0;
5647
                ssl->buffers.serverDH_G.buffer = NULL;
5648
            }
5649
        }
5650
    }
5651
5652
    return ret;
5653
}
5654
#endif
5655
#endif /* HAVE_FFDHE */
5656
5657
/* Set the highest priority common FFDHE group on the server as compared to
5658
 * client extensions.
5659
 *
5660
 * ssl    SSL/TLS object.
5661
 * returns 0 on success, otherwise an error.
5662
 */
5663
int TLSX_SupportedFFDHE_Set(WOLFSSL* ssl)
5664
0
{
5665
0
    int ret = 0;
5666
0
#ifdef HAVE_FFDHE
5667
0
    TLSX* priority = NULL;
5668
0
    TLSX* ext = NULL;
5669
0
#endif
5670
0
    TLSX* extension;
5671
0
    SupportedCurve* clientGroup;
5672
0
    SupportedCurve* group;
5673
0
    int found = 0;
5674
5675
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5676
    /* May be doing PSK with no key exchange. */
5677
0
    if (extension == NULL)
5678
0
        return 0;
5679
0
    clientGroup = (SupportedCurve*)extension->data;
5680
0
    for (group = clientGroup; group != NULL; group = group->next) {
5681
0
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(group->name)) {
5682
0
            found = 1;
5683
0
            break;
5684
0
        }
5685
0
    }
5686
0
    if (!found)
5687
0
        return 0;
5688
5689
0
    if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
5690
0
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5691
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5692
0
    }
5693
0
    if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
5694
0
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5695
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5696
0
    }
5697
0
    ssl->buffers.serverDH_P.buffer = NULL;
5698
0
    ssl->buffers.serverDH_G.buffer = NULL;
5699
0
    ssl->buffers.weOwnDH = 0;
5700
0
    ssl->options.haveDH = 0;
5701
5702
0
#ifdef HAVE_FFDHE
5703
0
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5704
0
    if (ret == WOLFSSL_SUCCESS) {
5705
0
        SupportedCurve* serverGroup;
5706
5707
0
        ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5708
0
        if (ext == NULL) {
5709
0
            WOLFSSL_MSG("Could not find supported groups extension");
5710
0
            ret = 0;
5711
0
        }
5712
0
        else {
5713
0
            serverGroup = (SupportedCurve*)ext->data;
5714
0
            ret = tlsx_ffdhe_find_group(ssl, clientGroup, serverGroup);
5715
0
        }
5716
0
    }
5717
5718
0
    TLSX_FreeAll(priority, ssl->heap);
5719
0
#endif /* HAVE_FFDHE */
5720
5721
0
    return ret;
5722
0
}
5723
#endif /* !NO_DH && !WOLFSSL_NO_TLS12 */
5724
#endif /* !NO_WOLFSSL_SERVER */
5725
5726
/* Check if the given curve is present in the supported groups extension.
5727
 *
5728
 * ssl             SSL/TLS object.
5729
 * name            The curve name to check.
5730
 * returns 1 if present, 0 otherwise.
5731
 */
5732
int TLSX_SupportedCurve_IsSupported(WOLFSSL* ssl, word16 name)
5733
0
{
5734
0
    TLSX* extension;
5735
0
    SupportedCurve* curve;
5736
5737
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5738
0
    if (extension == NULL)
5739
0
        return 0;
5740
5741
0
    curve = (SupportedCurve*)extension->data;
5742
0
    while (curve != NULL) {
5743
0
        if (curve->name == name)
5744
0
            return 1;
5745
0
        curve = curve->next;
5746
0
    }
5747
5748
0
    return 0;
5749
0
}
5750
5751
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5752
/* Return the preferred group.
5753
 *
5754
 * ssl             SSL/TLS object.
5755
 * checkSupported  Whether to check for the first supported group.
5756
 * returns BAD_FUNC_ARG if no group found, otherwise the group.
5757
 */
5758
int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
5759
0
{
5760
0
    TLSX* extension;
5761
0
    SupportedCurve* curve;
5762
5763
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5764
0
    if (extension == NULL)
5765
0
        return BAD_FUNC_ARG;
5766
5767
0
    curve = (SupportedCurve*)extension->data;
5768
0
    while (curve != NULL) {
5769
0
        if (!checkSupported ||
5770
0
                TLSX_IsGroupSupported(curve->name, ssl->options.side))
5771
0
            return curve->name;
5772
0
        curve = curve->next;
5773
0
    }
5774
5775
0
    return BAD_FUNC_ARG;
5776
0
}
5777
5778
#endif /* HAVE_SUPPORTED_CURVES */
5779
5780
#ifndef NO_WOLFSSL_SERVER
5781
5782
static int TLSX_PointFormat_Parse(WOLFSSL* ssl, const byte* input,
5783
                                  word16 length, byte isRequest)
5784
0
{
5785
0
    int ret;
5786
5787
    /* validating formats list length */
5788
0
    if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
5789
0
        return BUFFER_ERROR;
5790
5791
0
    if (isRequest) {
5792
0
    #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SUPPORTED_CURVES)
5793
        /* RFC 8422 Section 5.1.2: a client that sends the ec_point_formats
5794
         * extension MUST include the uncompressed (0) format. Record whether
5795
         * it is missing so DoClientHello() can abort with an illegal_parameter
5796
         * alert if the client also advertised ECC named groups. The decision
5797
         * is deferred to after all extensions are parsed so it does not depend
5798
         * on the relative order of the supported_groups and ec_point_formats
5799
         * extensions in the ClientHello. */
5800
0
        word16 i;
5801
0
        int found = 0;
5802
5803
0
        for (i = 0; i < input[0]; i++) {
5804
0
            if (input[ENUM_LEN + i] == WOLFSSL_EC_PF_UNCOMPRESSED) {
5805
0
                found = 1;
5806
0
                break;
5807
0
            }
5808
0
        }
5809
0
        ssl->options.peerNoUncompPF = (found == 0);
5810
0
    #endif
5811
5812
        /* adding uncompressed point format to response */
5813
0
        ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
5814
0
                                                                     ssl->heap);
5815
0
        if (ret != WOLFSSL_SUCCESS)
5816
0
            return ret; /* throw error */
5817
5818
0
        TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
5819
0
    }
5820
5821
0
    return 0;
5822
0
}
5823
5824
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5825
int TLSX_ValidateSupportedCurves(const WOLFSSL* ssl, byte first, byte second,
5826
0
                                 word32* ecdhCurveOID) {
5827
0
    TLSX*           extension = NULL;
5828
0
    SupportedCurve* curve     = NULL;
5829
0
    word32          oid       = 0;
5830
0
    word32          defOid    = 0;
5831
0
    word32          defSz     = 80; /* Maximum known curve size is 66. */
5832
0
    word32          nextOid   = 0;
5833
0
    word32          nextSz    = 80; /* Maximum known curve size is 66. */
5834
0
    word32          currOid   = ssl->ecdhCurveOID;
5835
0
    int             ephmSuite = 0;
5836
0
    word16          octets    = 0; /* according to 'ecc_set_type ecc_sets[];' */
5837
0
    int             key       = 0; /* validate key       */
5838
0
    int             foundCurve = 0; /* Found at least one supported curve */
5839
5840
0
    (void)oid;
5841
5842
0
    if (first == CHACHA_BYTE) {
5843
0
        switch (second) {
5844
0
            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5845
0
            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
5846
0
            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5847
0
            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5848
0
                return 1; /* no suite restriction */
5849
0
            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5850
0
            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5851
0
            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5852
0
                break;
5853
0
        }
5854
0
    }
5855
0
    if (first == ECC_BYTE || first == ECDHE_PSK_BYTE || first == CHACHA_BYTE)
5856
0
        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5857
0
    if (!extension)
5858
0
        return 1; /* no suite restriction */
5859
5860
0
    for (curve = (SupportedCurve*)extension->data;
5861
0
         curve && !key;
5862
0
         curve = curve->next) {
5863
5864
    #ifdef OPENSSL_EXTRA
5865
        /* skip if name is not in supported ECC range
5866
         * or disabled by user */
5867
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
5868
            continue;
5869
    #endif
5870
5871
        /* find supported curve */
5872
0
        switch (curve->name) {
5873
0
#ifdef HAVE_ECC
5874
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
5875
        #ifndef NO_ECC_SECP
5876
            case WOLFSSL_ECC_SECP160R1:
5877
                oid = ECC_SECP160R1_OID;
5878
                octets = 20;
5879
                break;
5880
        #endif /* !NO_ECC_SECP */
5881
        #ifdef HAVE_ECC_SECPR2
5882
            case WOLFSSL_ECC_SECP160R2:
5883
                oid = ECC_SECP160R2_OID;
5884
                octets = 20;
5885
                break;
5886
        #endif /* HAVE_ECC_SECPR2 */
5887
        #ifdef HAVE_ECC_KOBLITZ
5888
            case WOLFSSL_ECC_SECP160K1:
5889
                oid = ECC_SECP160K1_OID;
5890
                octets = 20;
5891
                break;
5892
        #endif /* HAVE_ECC_KOBLITZ */
5893
        #endif
5894
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
5895
        #ifndef NO_ECC_SECP
5896
            case WOLFSSL_ECC_SECP192R1:
5897
                oid = ECC_SECP192R1_OID;
5898
                octets = 24;
5899
                break;
5900
        #endif /* !NO_ECC_SECP */
5901
        #ifdef HAVE_ECC_KOBLITZ
5902
            case WOLFSSL_ECC_SECP192K1:
5903
                oid = ECC_SECP192K1_OID;
5904
                octets = 24;
5905
                break;
5906
        #endif /* HAVE_ECC_KOBLITZ */
5907
    #endif
5908
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
5909
0
        #ifndef NO_ECC_SECP
5910
0
            case WOLFSSL_ECC_SECP224R1:
5911
0
                oid = ECC_SECP224R1_OID;
5912
0
                octets = 28;
5913
0
                break;
5914
0
        #endif /* !NO_ECC_SECP */
5915
        #ifdef HAVE_ECC_KOBLITZ
5916
            case WOLFSSL_ECC_SECP224K1:
5917
                oid = ECC_SECP224K1_OID;
5918
                octets = 28;
5919
                break;
5920
        #endif /* HAVE_ECC_KOBLITZ */
5921
0
    #endif
5922
0
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5923
0
        #ifndef NO_ECC_SECP
5924
0
            case WOLFSSL_ECC_SECP256R1:
5925
0
                oid = ECC_SECP256R1_OID;
5926
0
                octets = 32;
5927
0
                break;
5928
0
        #endif /* !NO_ECC_SECP */
5929
0
    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
5930
0
#endif
5931
        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
5932
            case WOLFSSL_ECC_X25519:
5933
                oid = ECC_X25519_OID;
5934
                octets = 32;
5935
                break;
5936
        #endif /* HAVE_CURVE25519 */
5937
0
#ifdef HAVE_ECC
5938
0
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5939
        #ifdef HAVE_ECC_KOBLITZ
5940
            case WOLFSSL_ECC_SECP256K1:
5941
                oid = ECC_SECP256K1_OID;
5942
                octets = 32;
5943
                break;
5944
        #endif /* HAVE_ECC_KOBLITZ */
5945
        #ifdef HAVE_ECC_BRAINPOOL
5946
            case WOLFSSL_ECC_BRAINPOOLP256R1:
5947
                oid = ECC_BRAINPOOLP256R1_OID;
5948
                octets = 32;
5949
                break;
5950
        #endif /* HAVE_ECC_BRAINPOOL */
5951
        #ifdef WOLFSSL_SM2
5952
            case WOLFSSL_ECC_SM2P256V1:
5953
                oid = ECC_SM2P256V1_OID;
5954
                octets = 32;
5955
                break;
5956
        #endif /* WOLFSSL_SM2 */
5957
0
    #endif
5958
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
5959
0
        #ifndef NO_ECC_SECP
5960
0
            case WOLFSSL_ECC_SECP384R1:
5961
0
                oid = ECC_SECP384R1_OID;
5962
0
                octets = 48;
5963
0
                break;
5964
0
        #endif /* !NO_ECC_SECP */
5965
        #ifdef HAVE_ECC_BRAINPOOL
5966
            case WOLFSSL_ECC_BRAINPOOLP384R1:
5967
                oid = ECC_BRAINPOOLP384R1_OID;
5968
                octets = 48;
5969
                break;
5970
        #endif /* HAVE_ECC_BRAINPOOL */
5971
0
    #endif
5972
0
#endif
5973
        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
5974
            case WOLFSSL_ECC_X448:
5975
                oid = ECC_X448_OID;
5976
                octets = 57;
5977
                break;
5978
        #endif /* HAVE_CURVE448 */
5979
0
#ifdef HAVE_ECC
5980
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
5981
        #ifdef HAVE_ECC_BRAINPOOL
5982
            case WOLFSSL_ECC_BRAINPOOLP512R1:
5983
                oid = ECC_BRAINPOOLP512R1_OID;
5984
                octets = 64;
5985
                break;
5986
        #endif /* HAVE_ECC_BRAINPOOL */
5987
0
    #endif
5988
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
5989
0
        #ifndef NO_ECC_SECP
5990
0
            case WOLFSSL_ECC_SECP521R1:
5991
0
                oid = ECC_SECP521R1_OID;
5992
0
                octets = 66;
5993
0
                break;
5994
0
        #endif /* !NO_ECC_SECP */
5995
0
    #endif
5996
0
#endif
5997
0
            default: continue; /* unsupported curve */
5998
0
        }
5999
6000
0
        foundCurve = 1;
6001
6002
0
    #ifdef HAVE_ECC
6003
        /* Set default Oid */
6004
0
        if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
6005
0
            defOid = oid;
6006
0
            defSz = octets;
6007
0
        }
6008
6009
        /* The eccTempKeySz is the preferred ephemeral key size */
6010
0
        if (currOid == 0 && ssl->eccTempKeySz == octets)
6011
0
            currOid = oid;
6012
0
        if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
6013
0
            nextOid = oid;
6014
0
            nextSz  = octets;
6015
0
        }
6016
    #else
6017
        if (defOid == 0 && defSz > octets) {
6018
            defOid = oid;
6019
            defSz = octets;
6020
        }
6021
6022
        if (currOid == 0)
6023
            currOid = oid;
6024
        if (nextOid == 0 || nextSz > octets) {
6025
            nextOid = oid;
6026
            nextSz  = octets;
6027
        }
6028
    #endif
6029
6030
0
        if (first == ECC_BYTE) {
6031
0
            switch (second) {
6032
0
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
6033
                /* ECDHE_ECDSA */
6034
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
6035
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
6036
0
                case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
6037
0
                case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
6038
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
6039
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
6040
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
6041
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
6042
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
6043
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
6044
0
                    key |= ssl->ecdhCurveOID == oid;
6045
0
                    ephmSuite = 1;
6046
0
                break;
6047
6048
    #ifdef WOLFSSL_STATIC_DH
6049
                /* ECDH_ECDSA */
6050
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
6051
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
6052
                case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
6053
                case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
6054
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
6055
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
6056
                case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
6057
                case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
6058
                    if (oid == ECC_X25519_OID && defOid == oid) {
6059
                        defOid = 0;
6060
                        defSz = 80;
6061
                    }
6062
                    if (oid == ECC_X448_OID && defOid == oid) {
6063
                        defOid = 0;
6064
                        defSz = 80;
6065
                    }
6066
                    key |= ssl->pkCurveOID == oid;
6067
                break;
6068
    #endif /* WOLFSSL_STATIC_DH */
6069
0
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
6070
0
#ifndef NO_RSA
6071
                /* ECDHE_RSA */
6072
0
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
6073
0
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
6074
0
                case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
6075
0
                case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
6076
0
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
6077
0
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
6078
0
                case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
6079
0
                case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
6080
0
                    key |= ssl->ecdhCurveOID == oid;
6081
0
                    ephmSuite = 1;
6082
0
                break;
6083
6084
    #if defined(HAVE_ECC) && defined(WOLFSSL_STATIC_DH)
6085
                /* ECDH_RSA */
6086
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
6087
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
6088
                case TLS_ECDH_RSA_WITH_RC4_128_SHA:
6089
                case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
6090
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
6091
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
6092
                case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
6093
                case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
6094
                    if (oid == ECC_X25519_OID && defOid == oid) {
6095
                        defOid = 0;
6096
                        defSz = 80;
6097
                    }
6098
                    if (oid == ECC_X448_OID && defOid == oid) {
6099
                        defOid = 0;
6100
                        defSz = 80;
6101
                    }
6102
                    key |= ssl->pkCurveOID == oid;
6103
                break;
6104
    #endif /* HAVE_ECC && WOLFSSL_STATIC_DH */
6105
0
#endif
6106
0
                default:
6107
0
                    if (oid == ECC_X25519_OID && defOid == oid) {
6108
0
                        defOid = 0;
6109
0
                        defSz = 80;
6110
0
                    }
6111
0
                    if (oid == ECC_X448_OID && defOid == oid) {
6112
0
                        defOid = 0;
6113
0
                        defSz = 80;
6114
0
                    }
6115
0
                    key = 1;
6116
0
                break;
6117
0
            }
6118
0
        }
6119
6120
        /* ChaCha20-Poly1305 ECC cipher suites */
6121
0
        if (first == CHACHA_BYTE) {
6122
0
            switch (second) {
6123
0
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
6124
                /* ECDHE_ECDSA */
6125
0
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
6126
0
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
6127
0
                    key |= ssl->ecdhCurveOID == oid;
6128
0
                    ephmSuite = 1;
6129
0
                break;
6130
0
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
6131
0
#ifndef NO_RSA
6132
                /* ECDHE_RSA */
6133
0
                case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
6134
0
                case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
6135
0
                    key |= ssl->ecdhCurveOID == oid;
6136
0
                    ephmSuite = 1;
6137
0
                break;
6138
0
#endif
6139
0
                default:
6140
0
                    key = 1;
6141
0
                break;
6142
0
            }
6143
0
        }
6144
0
    }
6145
6146
    /* Check we found at least one supported curve */
6147
0
    if (!foundCurve)
6148
0
        return 0;
6149
6150
0
    *ecdhCurveOID = ssl->ecdhCurveOID;
6151
    /* Choose the default if it is at the required strength. */
6152
0
#ifdef HAVE_ECC
6153
0
    if (*ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
6154
#else
6155
    if (*ecdhCurveOID == 0)
6156
#endif
6157
0
    {
6158
0
        key = 1;
6159
0
        *ecdhCurveOID = defOid;
6160
0
    }
6161
    /* Choose any curve at the required strength. */
6162
0
    if (*ecdhCurveOID == 0) {
6163
0
        key = 1;
6164
0
        *ecdhCurveOID = currOid;
6165
0
    }
6166
    /* Choose the default if it is at the next highest strength. */
6167
0
    if (*ecdhCurveOID == 0 && defSz == nextSz)
6168
0
        *ecdhCurveOID = defOid;
6169
    /* Choose any curve at the next highest strength. */
6170
0
    if (*ecdhCurveOID == 0)
6171
0
        *ecdhCurveOID = nextOid;
6172
    /* No curve and ephemeral ECC suite requires a matching curve. */
6173
0
    if (*ecdhCurveOID == 0 && ephmSuite)
6174
0
        key = 0;
6175
6176
0
    return key;
6177
0
}
6178
#endif
6179
6180
#endif /* NO_WOLFSSL_SERVER */
6181
6182
6183
int TLSX_SupportedCurve_Copy(TLSX* src, TLSX** dst, void* heap)
6184
0
{
6185
0
    TLSX* extension;
6186
0
    int ret;
6187
6188
0
    extension = TLSX_Find(src, TLSX_SUPPORTED_GROUPS);
6189
0
    if (extension != NULL) {
6190
0
        SupportedCurve* curve;
6191
0
        for (curve = (SupportedCurve*)extension->data; curve != NULL;
6192
0
                curve = curve->next) {
6193
            /* Copying an already validated list - don't drop a group based on
6194
             * the side, so accept when either side has the crypto support. */
6195
0
            ret = TLSX_UseSupportedCurve(dst, curve->name, heap,
6196
0
                                         WOLFSSL_NEITHER_END);
6197
0
            if (ret != WOLFSSL_SUCCESS)
6198
0
                return MEMORY_E;
6199
0
        }
6200
0
    }
6201
6202
0
    return 0;
6203
0
}
6204
6205
int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap, int side)
6206
0
{
6207
0
    TLSX* extension = NULL;
6208
0
    SupportedCurve* curve = NULL;
6209
0
    int ret;
6210
6211
0
    if (extensions == NULL) {
6212
0
        return BAD_FUNC_ARG;
6213
0
    }
6214
6215
0
    if (!TLSX_IsGroupSupported(name, side)) {
6216
0
        return BAD_FUNC_ARG;
6217
0
    }
6218
6219
0
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
6220
6221
0
    if (!extension) {
6222
0
        ret = TLSX_SupportedCurve_New(&curve, name, heap);
6223
0
        if (ret != 0)
6224
0
            return ret;
6225
6226
0
        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
6227
0
        if (ret != 0) {
6228
0
            XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
6229
0
            return ret;
6230
0
        }
6231
0
    }
6232
0
    else {
6233
0
        ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
6234
0
                                                                          heap);
6235
0
        if (ret != 0)
6236
0
            return ret;
6237
    #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
6238
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
6239
        if (name == WOLFSSL_SECP256R1MLKEM512) {
6240
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
6241
                WOLFSSL_P256_ML_KEM_512_OLD, heap);
6242
        }
6243
        else if (name == WOLFSSL_SECP384R1MLKEM768) {
6244
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
6245
                WOLFSSL_P384_ML_KEM_768_OLD, heap);
6246
        }
6247
        else if (name == WOLFSSL_SECP521R1MLKEM1024) {
6248
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
6249
                WOLFSSL_P521_ML_KEM_1024_OLD, heap);
6250
        }
6251
        if (ret != 0) {
6252
            return ret;
6253
        }
6254
    #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
6255
0
    }
6256
6257
0
    return WOLFSSL_SUCCESS;
6258
0
}
6259
6260
int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
6261
0
{
6262
0
    TLSX* extension = NULL;
6263
0
    PointFormat* point = NULL;
6264
0
    int ret = 0;
6265
6266
0
    if (extensions == NULL)
6267
0
        return BAD_FUNC_ARG;
6268
6269
0
    extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
6270
6271
0
    if (!extension) {
6272
0
        ret = TLSX_PointFormat_New(&point, format, heap);
6273
0
        if (ret != 0)
6274
0
            return ret;
6275
6276
0
        ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
6277
0
        if (ret != 0) {
6278
0
            XFREE(point, heap, DYNAMIC_TYPE_TLSX);
6279
0
            return ret;
6280
0
        }
6281
0
    }
6282
0
    else {
6283
0
        ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
6284
0
                                                                          heap);
6285
0
        if (ret != 0)
6286
0
            return ret;
6287
0
    }
6288
6289
0
    return WOLFSSL_SUCCESS;
6290
0
}
6291
6292
0
#define EC_FREE_ALL         TLSX_SupportedCurve_FreeAll
6293
0
#define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
6294
6295
/* In TLS 1.2 the server never sends supported curve extension, but in TLS 1.3
6296
 * the server can send supported groups extension to indicate what it will
6297
 * support for later connections. */
6298
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
6299
0
#define EC_GET_SIZE TLSX_SupportedCurve_GetSize
6300
0
#define EC_WRITE    TLSX_SupportedCurve_Write
6301
#else
6302
#define EC_GET_SIZE(list)         0
6303
#define EC_WRITE(a, b)            0
6304
#endif
6305
6306
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
6307
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
6308
0
#define EC_PARSE TLSX_SupportedCurve_Parse
6309
#else
6310
#define EC_PARSE(a, b, c, d, e)   0
6311
#endif
6312
6313
0
#define PF_FREE_ALL          TLSX_PointFormat_FreeAll
6314
0
#define PF_VALIDATE_REQUEST  TLSX_PointFormat_ValidateRequest
6315
0
#define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
6316
6317
0
#define PF_GET_SIZE TLSX_PointFormat_GetSize
6318
0
#define PF_WRITE    TLSX_PointFormat_Write
6319
6320
#ifndef NO_WOLFSSL_SERVER
6321
0
#define PF_PARSE TLSX_PointFormat_Parse
6322
#else
6323
#define PF_PARSE(a, b, c, d)      0
6324
#endif
6325
6326
#else
6327
6328
#define EC_FREE_ALL(list, heap) WC_DO_NOTHING
6329
#define EC_GET_SIZE(list)         0
6330
#define EC_WRITE(a, b)            0
6331
#define EC_PARSE(a, b, c, d, e)   0
6332
#define EC_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
6333
6334
#define PF_FREE_ALL(list, heap)   WC_DO_NOTHING
6335
#define PF_GET_SIZE(list)         0
6336
#define PF_WRITE(a, b)            0
6337
#define PF_PARSE(a, b, c, d)      0
6338
#define PF_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
6339
#define PF_VALIDATE_RESPONSE(a, b) WC_DO_NOTHING
6340
6341
#endif /* HAVE_SUPPORTED_CURVES */
6342
6343
/******************************************************************************/
6344
/* Renegotiation Indication                                                   */
6345
/******************************************************************************/
6346
6347
#if defined(HAVE_SECURE_RENEGOTIATION) \
6348
 || defined(HAVE_SERVER_RENEGOTIATION_INFO)
6349
6350
static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
6351
                                                                  int isRequest)
6352
0
{
6353
0
    byte length = OPAQUE8_LEN; /* empty info length */
6354
6355
    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
6356
0
    if (data && data->enabled && data->verifySet) {
6357
        /* client sends client_verify_data only */
6358
0
        length += TLS_FINISHED_SZ;
6359
6360
        /* server also sends server_verify_data */
6361
0
        if (!isRequest)
6362
0
            length += TLS_FINISHED_SZ;
6363
0
    }
6364
6365
0
    return length;
6366
0
}
6367
6368
static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
6369
                                                    byte* output, int isRequest)
6370
0
{
6371
0
    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
6372
0
    if (data && data->enabled && data->verifySet) {
6373
        /* client sends client_verify_data only */
6374
0
        XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
6375
0
        offset += TLS_FINISHED_SZ;
6376
6377
        /* server also sends server_verify_data */
6378
0
        if (!isRequest) {
6379
0
            XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
6380
0
            offset += TLS_FINISHED_SZ;
6381
0
        }
6382
0
    }
6383
6384
0
    output[0] = (byte)(offset - 1);  /* info length - self */
6385
6386
0
    return offset;
6387
0
}
6388
6389
static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input,
6390
                                          word16 length, byte isRequest)
6391
0
{
6392
0
    int ret = WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E);
6393
6394
0
    if (length >= OPAQUE8_LEN) {
6395
0
        if (isRequest) {
6396
0
        #ifndef NO_WOLFSSL_SERVER
6397
0
            if (ssl->secure_renegotiation == NULL) {
6398
0
                ret = wolfSSL_UseSecureRenegotiation(ssl);
6399
0
                if (ret == WOLFSSL_SUCCESS)
6400
0
                    ret = 0;
6401
0
            }
6402
            /* renegotiation_info seen (checked by DoClientHello, RFC 5746 3.7) */
6403
0
            if (ssl->secure_renegotiation != NULL)
6404
0
                ssl->secure_renegotiation->renegInfoSeen = 1;
6405
0
            if (ret != 0 && ret != WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E)) {
6406
0
            }
6407
0
            else if (ssl->secure_renegotiation == NULL) {
6408
0
            }
6409
0
            else if (!ssl->secure_renegotiation->enabled) {
6410
0
                if (*input == 0) {
6411
0
                    input++; /* get past size */
6412
6413
0
                    ssl->secure_renegotiation->enabled = 1;
6414
0
                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6415
0
                    ret = 0;
6416
0
                }
6417
0
                else {
6418
                    /* already in error state */
6419
0
                    WOLFSSL_MSG("SCR client verify data present");
6420
0
                }
6421
0
            }
6422
0
            else if (*input == TLS_FINISHED_SZ) {
6423
0
                if (length < TLS_FINISHED_SZ + 1) {
6424
0
                    WOLFSSL_MSG("SCR malformed buffer");
6425
0
                    ret = BUFFER_E;
6426
0
                }
6427
0
                else {
6428
0
                    input++; /* get past size */
6429
6430
                    /* validate client verify data */
6431
0
                    if (ConstantCompare(input,
6432
0
                            ssl->secure_renegotiation->client_verify_data,
6433
0
                            TLS_FINISHED_SZ) == 0) {
6434
0
                        WOLFSSL_MSG("SCR client verify data match");
6435
0
                        TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6436
0
                        ret = 0;  /* verified */
6437
0
                    }
6438
0
                    else {
6439
                        /* already in error state */
6440
0
                        WOLFSSL_MSG("SCR client verify data Failure");
6441
0
                    }
6442
0
                }
6443
0
            }
6444
0
        #endif
6445
0
        }
6446
0
        else if (ssl->secure_renegotiation != NULL) {
6447
0
        #ifndef NO_WOLFSSL_CLIENT
6448
0
            if (!ssl->secure_renegotiation->enabled) {
6449
0
                if (*input == 0) {
6450
0
                    ssl->secure_renegotiation->enabled = 1;
6451
0
                    ret = 0;
6452
0
                }
6453
0
            }
6454
0
            else if (*input == 2 * TLS_FINISHED_SZ &&
6455
0
                     length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
6456
0
                int cmpRes = 0;
6457
0
                input++;  /* get past size */
6458
0
                cmpRes |= ConstantCompare(input,
6459
0
                        ssl->secure_renegotiation->client_verify_data,
6460
0
                        TLS_FINISHED_SZ);
6461
0
                cmpRes |= ConstantCompare(input + TLS_FINISHED_SZ,
6462
0
                        ssl->secure_renegotiation->server_verify_data,
6463
0
                        TLS_FINISHED_SZ);
6464
                /* validate client and server verify data */
6465
0
                if (cmpRes == 0) {
6466
0
                    WOLFSSL_MSG("SCR client and server verify data match");
6467
0
                    ret = 0;  /* verified */
6468
0
                }
6469
0
                else {
6470
                    /* already in error state */
6471
0
                    WOLFSSL_MSG("SCR client and server verify data Failure");
6472
0
                }
6473
0
            }
6474
0
        #endif
6475
0
        }
6476
0
        else {
6477
0
            ret = SECURE_RENEGOTIATION_E;
6478
0
        }
6479
0
    }
6480
0
    else {
6481
0
        ret = SECURE_RENEGOTIATION_E;
6482
0
    }
6483
6484
0
    if (ret != 0) {
6485
0
        WOLFSSL_ERROR_VERBOSE(ret);
6486
0
        SendAlert(ssl, alert_fatal, handshake_failure);
6487
0
    }
6488
6489
0
    return ret;
6490
0
}
6491
6492
/* tmp_keys holds a copy of the session cipher and MAC keys, so wipe the
6493
 * struct before freeing it, matching the ForceZero of ssl->keys on connection
6494
 * teardown. */
6495
static void TLSX_SecureRenegotiation_Free(SecureRenegotiation* data, void* heap)
6496
0
{
6497
0
    if (data != NULL) {
6498
0
        ForceZero(data, sizeof(SecureRenegotiation));
6499
0
    }
6500
0
    XFREE(data, heap, DYNAMIC_TYPE_TLSX);
6501
0
    (void)heap;
6502
0
}
6503
6504
int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
6505
0
{
6506
0
    int ret = 0;
6507
0
    SecureRenegotiation* data;
6508
6509
0
    data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
6510
0
                                                             DYNAMIC_TYPE_TLSX);
6511
0
    if (data == NULL)
6512
0
        return MEMORY_E;
6513
6514
0
    XMEMSET(data, 0, sizeof(SecureRenegotiation));
6515
6516
0
    ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
6517
0
    if (ret != 0) {
6518
0
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
6519
0
        return ret;
6520
0
    }
6521
6522
0
    return WOLFSSL_SUCCESS;
6523
0
}
6524
6525
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
6526
6527
int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
6528
0
{
6529
0
    int ret;
6530
6531
    /* send empty renegotiation_info extension */
6532
0
    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6533
0
    if (ext == NULL) {
6534
0
        ret = TLSX_UseSecureRenegotiation(extensions, heap);
6535
0
        if (ret != WOLFSSL_SUCCESS)
6536
0
            return ret;
6537
6538
0
        ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6539
0
    }
6540
0
    if (ext)
6541
0
        ext->resp = 1;
6542
6543
0
    return WOLFSSL_SUCCESS;
6544
0
}
6545
6546
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
6547
6548
6549
0
#define SCR_FREE_ALL       TLSX_SecureRenegotiation_Free
6550
0
#define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
6551
0
#define SCR_WRITE          TLSX_SecureRenegotiation_Write
6552
0
#define SCR_PARSE          TLSX_SecureRenegotiation_Parse
6553
6554
#else
6555
6556
#define SCR_FREE_ALL(a, heap) WC_DO_NOTHING
6557
#define SCR_GET_SIZE(a, b)    0
6558
#define SCR_WRITE(a, b, c)    0
6559
#define SCR_PARSE(a, b, c, d) 0
6560
6561
#endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
6562
6563
/******************************************************************************/
6564
/* Session Tickets                                                            */
6565
/******************************************************************************/
6566
6567
#ifdef HAVE_SESSION_TICKET
6568
6569
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
6570
{
6571
    (void)isRequest;
6572
    return ticket ? ticket->size : 0;
6573
}
6574
6575
static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
6576
                                       int isRequest)
6577
{
6578
    word16 offset = 0; /* empty ticket */
6579
6580
    if (isRequest && ticket) {
6581
        XMEMCPY(output + offset, ticket->data, ticket->size);
6582
        offset += ticket->size;
6583
    }
6584
6585
    return offset;
6586
}
6587
6588
6589
static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, const byte* input,
6590
                                    word16 length, byte isRequest)
6591
{
6592
    int ret = 0;
6593
6594
    (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
6595
6596
    if (!isRequest) {
6597
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
6598
            return TLSX_HandleUnsupportedExtension(ssl);
6599
6600
        if (length != 0)
6601
            return BUFFER_ERROR;
6602
6603
#ifndef NO_WOLFSSL_CLIENT
6604
        ssl->expect_session_ticket = 1;
6605
#endif
6606
    }
6607
#ifndef NO_WOLFSSL_SERVER
6608
    else {
6609
        /* server side */
6610
        if (ssl->ctx->ticketEncCb == NULL) {
6611
            WOLFSSL_MSG("Client sent session ticket, server has no callback");
6612
            return 0;
6613
        }
6614
6615
#ifdef HAVE_SECURE_RENEGOTIATION
6616
        if (IsSCR(ssl)) {
6617
            WOLFSSL_MSG("Client sent session ticket during SCR. Ignoring.");
6618
            return 0;
6619
        }
6620
#endif
6621
6622
        if (length > SESSION_TICKET_LEN) {
6623
            ret = BAD_TICKET_MSG_SZ;
6624
            WOLFSSL_ERROR_VERBOSE(ret);
6625
        } else if (IsAtLeastTLSv1_3(ssl->version)) {
6626
            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
6627
            ssl->options.rejectTicket = 1;
6628
            ret = 0;  /* not fatal */
6629
        } else if (ssl->options.noTicketTls12) {
6630
            /* ignore ticket request */
6631
        } else if (length == 0) {
6632
            /* blank ticket */
6633
            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6634
            if (ret == WOLFSSL_SUCCESS) {
6635
                ret = 0;
6636
                /* send blank ticket */
6637
                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6638
                ssl->options.createTicket = 1;  /* will send ticket msg */
6639
                ssl->options.useTicket    = 1;
6640
                ssl->options.resuming     = 0;  /* no standard resumption */
6641
                ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
6642
            }
6643
        } else {
6644
            /* got actual ticket from client */
6645
            ret = DoClientTicket(ssl, input, length);
6646
            if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
6647
                WOLFSSL_MSG("Using existing client ticket");
6648
                ssl->options.useTicket    = 1;
6649
                ssl->options.resuming     = 1;
6650
                /* SERVER: ticket is peer auth. */
6651
                ssl->options.peerAuthGood = 1;
6652
            } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
6653
                WOLFSSL_MSG("Using existing client ticket, creating new one");
6654
                ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6655
                if (ret == WOLFSSL_SUCCESS) {
6656
                    ret = 0;
6657
                    TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6658
                                                    /* send blank ticket */
6659
                    ssl->options.createTicket = 1;  /* will send ticket msg */
6660
                    ssl->options.useTicket    = 1;
6661
                    ssl->options.resuming     = 1;
6662
                    /* SERVER: ticket is peer auth. */
6663
                    ssl->options.peerAuthGood = 1;
6664
                }
6665
            } else if (ret == WOLFSSL_TICKET_RET_REJECT ||
6666
                    ret == WC_NO_ERR_TRACE(VERSION_ERROR)) {
6667
                WOLFSSL_MSG("Process client ticket rejected, not using");
6668
                if (ret == WC_NO_ERR_TRACE(VERSION_ERROR))
6669
                    WOLFSSL_MSG("\tbad TLS version");
6670
                ret = 0;  /* not fatal */
6671
6672
                ssl->options.rejectTicket = 1;
6673
                /* If we have session tickets enabled then send a new ticket */
6674
                if (!TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET)) {
6675
                    ret = TLSX_UseSessionTicket(&ssl->extensions, NULL,
6676
                                                ssl->heap);
6677
                    if (ret == WOLFSSL_SUCCESS) {
6678
                        ret = 0;
6679
                        TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6680
                        ssl->options.createTicket = 1;
6681
                        ssl->options.useTicket    = 1;
6682
                    }
6683
                }
6684
            } else if (ret == WOLFSSL_TICKET_RET_FATAL) {
6685
                WOLFSSL_MSG("Process client ticket fatal error, not using");
6686
            } else if (ret < 0) {
6687
                WOLFSSL_MSG("Process client ticket unknown error, not using");
6688
            }
6689
        }
6690
    }
6691
#endif /* NO_WOLFSSL_SERVER */
6692
6693
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
6694
    (void)ssl;
6695
#endif
6696
6697
    return ret;
6698
}
6699
6700
WOLFSSL_TEST_VIS SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
6701
                                            byte* data, word16 size, void* heap)
6702
{
6703
    SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
6704
                                                       heap, DYNAMIC_TYPE_TLSX);
6705
    if (ticket) {
6706
        ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
6707
        if (ticket->data == NULL) {
6708
            XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
6709
            return NULL;
6710
        }
6711
6712
        XMEMCPY(ticket->data, data, size);
6713
        ticket->size     = size;
6714
        ticket->lifetime = lifetime;
6715
    }
6716
6717
    (void)heap;
6718
6719
    return ticket;
6720
}
6721
WOLFSSL_TEST_VIS void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
6722
{
6723
    if (ticket) {
6724
        XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
6725
        XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
6726
    }
6727
6728
    (void)heap;
6729
}
6730
6731
int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
6732
{
6733
    int ret = 0;
6734
6735
    if (extensions == NULL)
6736
        return BAD_FUNC_ARG;
6737
6738
    /* If the ticket is NULL, the client will request a new ticket from the
6739
       server. Otherwise, the client will use it in the next client hello. */
6740
    if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
6741
                                                                           != 0)
6742
        return ret;
6743
6744
    return WOLFSSL_SUCCESS;
6745
}
6746
6747
#define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
6748
#define WOLF_STK_WRITE            TLSX_SessionTicket_Write
6749
#define WOLF_STK_PARSE            TLSX_SessionTicket_Parse
6750
#define WOLF_STK_FREE(stk, heap)  TLSX_SessionTicket_Free((SessionTicket*)(stk),(heap))
6751
6752
#else
6753
6754
0
#define WOLF_STK_FREE(a, b) WC_DO_NOTHING
6755
#define WOLF_STK_VALIDATE_REQUEST(a) WC_DO_NOTHING
6756
0
#define WOLF_STK_GET_SIZE(a, b)      0
6757
0
#define WOLF_STK_WRITE(a, b, c)      0
6758
0
#define WOLF_STK_PARSE(a, b, c, d)   0
6759
6760
#endif /* HAVE_SESSION_TICKET */
6761
6762
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
6763
/******************************************************************************/
6764
/* Encrypt-then-MAC                                                           */
6765
/******************************************************************************/
6766
6767
#ifndef WOLFSSL_NO_TLS12
6768
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl);
6769
6770
/**
6771
 * Get the size of the Encrypt-Then-MAC extension.
6772
 *
6773
 * msgType  Type of message to put extension into.
6774
 * pSz      Size of extension data.
6775
 * return SANITY_MSG_E when the message is not allowed to have extension and
6776
 *        0 otherwise.
6777
 */
6778
static int TLSX_EncryptThenMac_GetSize(byte msgType, word16* pSz)
6779
0
{
6780
0
    (void)pSz;
6781
6782
0
    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
0
    return 0;
6790
0
}
6791
6792
/**
6793
 * Write the Encrypt-Then-MAC extension.
6794
 *
6795
 * data     Unused
6796
 * output   Extension data buffer. Unused.
6797
 * msgType  Type of message to put extension into.
6798
 * pSz      Size of extension data.
6799
 * return SANITY_MSG_E when the message is not allowed to have extension and
6800
 *        0 otherwise.
6801
 */
6802
static int TLSX_EncryptThenMac_Write(void* data, byte* output, byte msgType,
6803
                                     word16* pSz)
6804
0
{
6805
0
    (void)data;
6806
0
    (void)output;
6807
0
    (void)pSz;
6808
6809
0
    if (msgType != client_hello && msgType != server_hello) {
6810
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6811
0
        return SANITY_MSG_E;
6812
0
    }
6813
6814
    /* Empty extension */
6815
6816
0
    return 0;
6817
0
}
6818
6819
/**
6820
 * Parse the Encrypt-Then-MAC extension.
6821
 *
6822
 * ssl      SSL object
6823
 * input    Extension data buffer.
6824
 * length   Length of this extension's data.
6825
 * msgType  Type of message to extension appeared in.
6826
 * return SANITY_MSG_E when the message is not allowed to have extension,
6827
 *        BUFFER_ERROR when the extension's data is invalid,
6828
 *        MEMORY_E when unable to allocate memory and
6829
 *        0 otherwise.
6830
 */
6831
static int TLSX_EncryptThenMac_Parse(WOLFSSL* ssl, const byte* input,
6832
                                     word16 length, byte msgType)
6833
0
{
6834
0
    int ret;
6835
6836
0
    (void)input;
6837
6838
0
    if (msgType != client_hello && msgType != server_hello) {
6839
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6840
0
        return SANITY_MSG_E;
6841
0
    }
6842
6843
    /* Empty extension */
6844
0
    if (length != 0)
6845
0
        return BUFFER_ERROR;
6846
6847
0
    if (msgType == client_hello) {
6848
        /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
6849
0
        if (!ssl->options.disallowEncThenMac) {
6850
0
            ssl->options.encThenMac = 1;
6851
            /* Set the extension reply. */
6852
0
            ret = TLSX_EncryptThenMac_Use(ssl);
6853
0
            if (ret != 0)
6854
0
                return ret;
6855
0
        }
6856
0
        return 0;
6857
0
    }
6858
6859
    /* Server Hello */
6860
0
    if (ssl->options.disallowEncThenMac) {
6861
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6862
0
        return SANITY_MSG_E;
6863
0
    }
6864
6865
0
    ssl->options.encThenMac = 1;
6866
0
    return 0;
6867
6868
0
}
6869
6870
/**
6871
 * Add the Encrypt-Then-MAC extension to list.
6872
 *
6873
 * ssl      SSL object
6874
 * return MEMORY_E when unable to allocate memory and 0 otherwise.
6875
 */
6876
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl)
6877
0
{
6878
0
    int   ret = 0;
6879
0
    TLSX* extension;
6880
6881
    /* Find the Encrypt-Then-Mac extension if it exists. */
6882
0
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6883
0
    if (extension == NULL) {
6884
        /* Push new Encrypt-Then-Mac extension. */
6885
0
        ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
6886
0
            ssl->heap);
6887
0
        if (ret != 0)
6888
0
            return ret;
6889
0
    }
6890
6891
0
    return 0;
6892
0
}
6893
6894
/**
6895
 * Set the Encrypt-Then-MAC extension as one to respond too.
6896
 *
6897
 * ssl      SSL object
6898
 * return EXT_MISSING when EncryptThenMac extension not in list.
6899
 */
6900
int TLSX_EncryptThenMac_Respond(WOLFSSL* ssl)
6901
0
{
6902
0
    TLSX* extension;
6903
6904
0
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6905
0
    if (extension == NULL)
6906
0
        return EXT_MISSING;
6907
0
    extension->resp = 1;
6908
6909
0
    return 0;
6910
0
}
6911
6912
0
#define ETM_GET_SIZE  TLSX_EncryptThenMac_GetSize
6913
0
#define ETM_WRITE     TLSX_EncryptThenMac_Write
6914
0
#define ETM_PARSE     TLSX_EncryptThenMac_Parse
6915
6916
#else
6917
6918
#define ETM_GET_SIZE(a, b)    0
6919
#define ETM_WRITE(a, b, c, d) 0
6920
#define ETM_PARSE(a, b, c, d) 0
6921
6922
#endif /* !WOLFSSL_NO_TLS12 */
6923
6924
#endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
6925
6926
6927
#ifdef WOLFSSL_SRTP
6928
6929
/******************************************************************************/
6930
/* DTLS SRTP (Secure Real-time Transport Protocol)                            */
6931
/******************************************************************************/
6932
6933
/* Only support single SRTP profile */
6934
typedef struct TlsxSrtp {
6935
    word16 profileCount;
6936
    word16 ids; /* selected bits */
6937
} TlsxSrtp;
6938
6939
#ifndef NO_WOLFSSL_SERVER
6940
static int TLSX_UseSRTP_GetSize(TlsxSrtp *srtp)
6941
{
6942
    /*   SRTP Profile Len (2)
6943
     *      SRTP Profiles (2)
6944
     *   MKI (master key id) Length */
6945
    return (OPAQUE16_LEN + (srtp->profileCount * OPAQUE16_LEN) + 1);
6946
}
6947
#endif
6948
6949
static TlsxSrtp* TLSX_UseSRTP_New(word16 ids, void* heap)
6950
{
6951
    TlsxSrtp* srtp;
6952
    int i;
6953
6954
    srtp = (TlsxSrtp*)XMALLOC(sizeof(TlsxSrtp), heap, DYNAMIC_TYPE_TLSX);
6955
    if (srtp == NULL) {
6956
        WOLFSSL_MSG("TLSX SRTP Memory failure");
6957
        return NULL;
6958
    }
6959
6960
    /* count and test each bit set */
6961
    srtp->profileCount = 0;
6962
    for (i=0; i<16; i++) {
6963
        if (ids & (1 << i)) {
6964
            srtp->profileCount++;
6965
        }
6966
    }
6967
    srtp->ids = ids;
6968
6969
    return srtp;
6970
}
6971
6972
static void TLSX_UseSRTP_Free(TlsxSrtp *srtp, void* heap)
6973
{
6974
    XFREE(srtp, heap, DYNAMIC_TYPE_TLSX);
6975
    (void)heap;
6976
}
6977
6978
#ifndef NO_WOLFSSL_SERVER
6979
static int TLSX_UseSRTP_Parse(WOLFSSL* ssl, const byte* input, word16 length,
6980
    byte isRequest)
6981
{
6982
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
6983
    word16 profile_len = 0;
6984
    word16 profile_value = 0;
6985
    word16 offset = 0;
6986
    int i;
6987
    TlsxSrtp* srtp = NULL;
6988
6989
    if (length < OPAQUE16_LEN) {
6990
        return BUFFER_ERROR;
6991
    }
6992
6993
    /* reset selected DTLS SRTP profile ID */
6994
    ssl->dtlsSrtpId = 0;
6995
6996
    /* total length, not include itself */
6997
    ato16(input, &profile_len);
6998
    offset += OPAQUE16_LEN;
6999
    /* Check profile length is not bigger than remaining length. */
7000
    if (profile_len > length - offset) {
7001
        return BUFFER_ERROR;
7002
    }
7003
    /* Protection profiles are 2 bytes long - ensure not an odd no. bytes. */
7004
    if ((profile_len & 1) == 1) {
7005
        return BUFFER_ERROR;
7006
    }
7007
    /* Ignoring srtp_mki field - SRTP Make Key Identifier.
7008
     * Defined to be 0..255 bytes long.
7009
     */
7010
    if ((length - profile_len - offset) > 255) {
7011
        return BUFFER_ERROR;
7012
    }
7013
7014
    if (!isRequest) {
7015
#ifndef NO_WOLFSSL_CLIENT
7016
        /* Only one SRTP Protection Profile can be chosen. */
7017
        if (profile_len != OPAQUE16_LEN) {
7018
            return BUFFER_ERROR;
7019
        }
7020
7021
        ato16(input + offset, &profile_value);
7022
7023
        /* check that the profile received was in the ones we support */
7024
        if (profile_value < 16 &&
7025
                               (ssl->dtlsSrtpProfiles & (1 << profile_value))) {
7026
            ssl->dtlsSrtpId = profile_value;
7027
            ret = 0; /* success */
7028
        }
7029
#endif
7030
    }
7031
    else {
7032
        /* parse remainder one profile at a time, looking for match in CTX */
7033
        ret = 0;
7034
        for (i = 0; i < profile_len; i += OPAQUE16_LEN) {
7035
            ato16(input + offset + i, &profile_value);
7036
            /* find first match */
7037
            if (profile_value < 16 &&
7038
                                 ssl->dtlsSrtpProfiles & (1 << profile_value)) {
7039
                ssl->dtlsSrtpId = profile_value;
7040
7041
                /* make sure we respond with selected SRTP id selected */
7042
                srtp = TLSX_UseSRTP_New((1 << profile_value), ssl->heap);
7043
                if (srtp != NULL) {
7044
                    ret = TLSX_Push(&ssl->extensions, TLSX_USE_SRTP,
7045
                        (void*)srtp, ssl->heap);
7046
                    if (ret == 0) {
7047
                        TLSX_SetResponse(ssl, TLSX_USE_SRTP);
7048
                        /* successfully set extension */
7049
                    }
7050
                }
7051
                else {
7052
                    ret = MEMORY_E;
7053
                }
7054
                break;
7055
            }
7056
        }
7057
    }
7058
7059
    if (ret == 0 && ssl->dtlsSrtpId == 0) {
7060
        WOLFSSL_MSG("TLSX_UseSRTP_Parse profile not found!");
7061
        /* not fatal */
7062
    }
7063
    else if (ret != 0) {
7064
        ssl->dtlsSrtpId = 0;
7065
        TLSX_UseSRTP_Free(srtp, ssl->heap);
7066
    }
7067
7068
    return ret;
7069
}
7070
7071
static word16 TLSX_UseSRTP_Write(TlsxSrtp* srtp, byte* output)
7072
{
7073
    word16 offset = 0;
7074
    int i, j;
7075
7076
    c16toa(srtp->profileCount * 2, output + offset);
7077
    offset += OPAQUE16_LEN;
7078
    j = 0;
7079
    for (i = 0; i < srtp->profileCount; i++) {
7080
        for (; j < 16; j++) {
7081
            if (srtp->ids & (1 << j)) {
7082
                c16toa(j, output + offset);
7083
                offset += OPAQUE16_LEN;
7084
            }
7085
        }
7086
    }
7087
    output[offset++] = 0x00; /* MKI Length */
7088
7089
    return offset;
7090
}
7091
#endif
7092
7093
static int TLSX_UseSRTP(TLSX** extensions, word16 profiles, void* heap)
7094
{
7095
    int ret = 0;
7096
    TLSX* extension;
7097
7098
    if (extensions == NULL) {
7099
        return BAD_FUNC_ARG;
7100
    }
7101
7102
    extension = TLSX_Find(*extensions, TLSX_USE_SRTP);
7103
    if (extension == NULL) {
7104
        TlsxSrtp* srtp = TLSX_UseSRTP_New(profiles, heap);
7105
        if (srtp == NULL) {
7106
            return MEMORY_E;
7107
        }
7108
7109
        ret = TLSX_Push(extensions, TLSX_USE_SRTP, (void*)srtp, heap);
7110
        if (ret != 0) {
7111
            TLSX_UseSRTP_Free(srtp, heap);
7112
        }
7113
    }
7114
7115
    return ret;
7116
}
7117
7118
#ifndef NO_WOLFSSL_SERVER
7119
    #define SRTP_FREE     TLSX_UseSRTP_Free
7120
    #define SRTP_PARSE    TLSX_UseSRTP_Parse
7121
    #define SRTP_WRITE    TLSX_UseSRTP_Write
7122
    #define SRTP_GET_SIZE TLSX_UseSRTP_GetSize
7123
#else
7124
    #define SRTP_FREE(a, b) WC_DO_NOTHING
7125
    #define SRTP_PARSE(a, b, c, d)      0
7126
    #define SRTP_WRITE(a, b)            0
7127
    #define SRTP_GET_SIZE(a)            0
7128
#endif
7129
7130
#endif /* WOLFSSL_SRTP */
7131
7132
7133
/******************************************************************************/
7134
/* Supported Versions                                                         */
7135
/******************************************************************************/
7136
7137
#ifdef WOLFSSL_TLS13
7138
static WC_INLINE int versionIsGreater(byte isDtls, byte a, byte b)
7139
0
{
7140
0
    (void)isDtls;
7141
7142
#ifdef WOLFSSL_DTLS
7143
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7144
    if (isDtls)
7145
        return a < b;
7146
#endif /* WOLFSSL_DTLS */
7147
7148
0
    return a > b;
7149
0
}
7150
7151
static WC_INLINE int versionIsLesser(byte isDtls, byte a, byte b)
7152
0
{
7153
0
    (void)isDtls;
7154
7155
#ifdef WOLFSSL_DTLS
7156
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7157
    if (isDtls)
7158
        return a > b;
7159
#endif /* WOLFSSL_DTLS */
7160
7161
0
    return a < b;
7162
0
}
7163
7164
static WC_INLINE int versionIsAtLeast(byte isDtls, byte a, byte b)
7165
0
{
7166
0
    (void)isDtls;
7167
7168
#ifdef WOLFSSL_DTLS
7169
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7170
    if (isDtls)
7171
        return a <= b;
7172
#endif /* WOLFSSL_DTLS */
7173
7174
0
    return a >= b;
7175
0
}
7176
7177
static WC_INLINE int versionIsLessEqual(byte isDtls, byte a, byte b)
7178
0
{
7179
0
    (void)isDtls;
7180
7181
#ifdef WOLFSSL_DTLS
7182
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7183
    if (isDtls)
7184
        return a >= b;
7185
#endif /* WOLFSSL_DTLS */
7186
7187
0
    return a <= b;
7188
0
}
7189
7190
/* Return the size of the SupportedVersions extension's data.
7191
 *
7192
 * data       The SSL/TLS object.
7193
 * msgType The type of the message this extension is being written into.
7194
 * returns the length of data that will be in the extension.
7195
 */
7196
static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
7197
0
{
7198
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7199
0
    byte tls13Minor, tls12Minor, tls11Minor, isDtls;
7200
7201
0
    isDtls = !!ssl->options.dtls;
7202
0
    tls13Minor = (byte)(isDtls ? DTLSv1_3_MINOR : TLSv1_3_MINOR);
7203
0
    tls12Minor = (byte)(isDtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR);
7204
0
    tls11Minor = (byte)(isDtls ? DTLS_MINOR : TLSv1_1_MINOR);
7205
7206
    /* unused on some configuration */
7207
0
    (void)tls12Minor;
7208
0
    (void)tls13Minor;
7209
0
    (void)tls11Minor;
7210
7211
0
    if (msgType == client_hello) {
7212
        /* TLS v1.2 and TLS v1.3  */
7213
0
        int cnt = 0;
7214
7215
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13Minor)
7216
        #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7217
            defined(WOLFSSL_WPAS_SMALL)
7218
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
7219
        #endif
7220
0
        ) {
7221
0
            cnt++;
7222
0
        }
7223
7224
0
        if (ssl->options.downgrade) {
7225
0
    #ifndef WOLFSSL_NO_TLS12
7226
0
            if (versionIsLessEqual(
7227
0
                    isDtls, ssl->options.minDowngrade, tls12Minor)
7228
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
7229
    defined(WOLFSSL_WPAS_SMALL)
7230
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
7231
#endif
7232
0
            ) {
7233
0
                cnt++;
7234
0
            }
7235
0
#endif
7236
    #ifndef NO_OLD_TLS
7237
            if (versionIsLessEqual(
7238
                    isDtls, ssl->options.minDowngrade, tls11Minor)
7239
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7240
                defined(WOLFSSL_WPAS_SMALL)
7241
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
7242
            #endif
7243
            ) {
7244
                cnt++;
7245
            }
7246
        #ifdef WOLFSSL_ALLOW_TLSV10
7247
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
7248
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7249
                defined(WOLFSSL_WPAS_SMALL)
7250
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
7251
            #endif
7252
            ) {
7253
                cnt++;
7254
            }
7255
        #endif
7256
    #endif
7257
0
        }
7258
7259
0
        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
7260
0
    }
7261
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7262
0
        *pSz += OPAQUE16_LEN;
7263
0
    }
7264
0
    else {
7265
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7266
0
        return SANITY_MSG_E;
7267
0
    }
7268
7269
0
    return 0;
7270
0
}
7271
7272
/* Writes the SupportedVersions extension into the buffer.
7273
 *
7274
 * data    The SSL/TLS object.
7275
 * output  The buffer to write the extension into.
7276
 * msgType The type of the message this extension is being written into.
7277
 * returns the length of data that was written.
7278
 */
7279
static int TLSX_SupportedVersions_Write(void* data, byte* output,
7280
                                        byte msgType, word16* pSz)
7281
0
{
7282
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7283
0
    byte tls13minor, tls12minor, tls11minor, isDtls = 0;
7284
7285
0
    tls13minor = (byte)TLSv1_3_MINOR;
7286
0
    tls12minor = (byte)TLSv1_2_MINOR;
7287
0
    tls11minor = (byte)TLSv1_1_MINOR;
7288
7289
    /* unused in some configuration */
7290
0
    (void)tls11minor;
7291
0
    (void)tls12minor;
7292
7293
#ifdef WOLFSSL_DTLS13
7294
    if (ssl->options.dtls) {
7295
        tls13minor = (byte)DTLSv1_3_MINOR;
7296
    #ifndef WOLFSSL_NO_TLS12
7297
        tls12minor = (byte)DTLSv1_2_MINOR;
7298
    #endif
7299
    #ifndef NO_OLD_TLS
7300
        tls11minor = (byte)DTLS_MINOR;
7301
    #endif
7302
        isDtls = 1;
7303
    }
7304
#endif /* WOLFSSL_DTLS13 */
7305
7306
0
    if (msgType == client_hello) {
7307
0
        byte major = ssl->ctx->method->version.major;
7308
7309
0
        byte* cnt = output++;
7310
0
        *cnt = 0;
7311
7312
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13minor)
7313
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
7314
    defined(WOLFSSL_WPAS_SMALL)
7315
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
7316
#endif
7317
0
        ) {
7318
0
            *cnt += OPAQUE16_LEN;
7319
        #ifdef WOLFSSL_TLS13_DRAFT
7320
            /* The TLS draft major number. */
7321
            *(output++) = TLS_DRAFT_MAJOR;
7322
            /* Version of draft supported. */
7323
            *(output++) = TLS_DRAFT_MINOR;
7324
        #else
7325
0
            *(output++) = major;
7326
0
            *(output++) = tls13minor;
7327
0
        #endif
7328
0
        }
7329
7330
0
        if (ssl->options.downgrade) {
7331
0
        #ifndef WOLFSSL_NO_TLS12
7332
0
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls12minor)
7333
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7334
                defined(WOLFSSL_WPAS_SMALL)
7335
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
7336
            #endif
7337
0
            ) {
7338
0
                *cnt += OPAQUE16_LEN;
7339
0
                *(output++) = major;
7340
0
                *(output++) = tls12minor;
7341
0
            }
7342
0
        #endif
7343
7344
    #ifndef NO_OLD_TLS
7345
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls11minor)
7346
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7347
                defined(WOLFSSL_WPAS_SMALL)
7348
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
7349
            #endif
7350
            ) {
7351
                *cnt += OPAQUE16_LEN;
7352
                *(output++) = major;
7353
                *(output++) = tls11minor;
7354
            }
7355
        #ifdef WOLFSSL_ALLOW_TLSV10
7356
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
7357
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7358
                defined(WOLFSSL_WPAS_SMALL)
7359
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
7360
            #endif
7361
            ) {
7362
                *cnt += OPAQUE16_LEN;
7363
                *(output++) = major;
7364
                *(output++) = (byte)TLSv1_MINOR;
7365
            }
7366
        #endif
7367
    #endif
7368
0
        }
7369
7370
0
        *pSz += (word16)(OPAQUE8_LEN + *cnt);
7371
0
    }
7372
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7373
0
        output[0] = ssl->version.major;
7374
0
        output[1] = ssl->version.minor;
7375
7376
0
        *pSz += OPAQUE16_LEN;
7377
0
    }
7378
0
    else {
7379
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7380
0
        return SANITY_MSG_E;
7381
0
    }
7382
7383
0
    return 0;
7384
0
}
7385
7386
/* Parse the SupportedVersions extension.
7387
 *
7388
 * ssl     The SSL/TLS object.
7389
 * input   The buffer with the extension data.
7390
 * length  The length of the extension data.
7391
 * msgType The type of the message this extension is being parsed from.
7392
 * pv      The output ProtocolVersion for the negotiated version
7393
 * opts    The output options structure. Can be NULL.
7394
 * exts    The output extensions list. Can be NULL.
7395
 * returns 0 on success, otherwise failure.
7396
 */
7397
int TLSX_SupportedVersions_Parse(const WOLFSSL* ssl, const byte* input,
7398
        word16 length, byte msgType, ProtocolVersion* pv, Options* opts,
7399
        TLSX** exts)
7400
0
{
7401
    /* The client's greatest minor version that we support */
7402
0
    byte clientGreatestMinor = SSLv3_MINOR;
7403
0
    int ret;
7404
0
    byte major, minor;
7405
0
    byte tls13minor, tls12minor;
7406
0
    byte isDtls;
7407
7408
0
    tls13minor = TLSv1_3_MINOR;
7409
0
    tls12minor = TLSv1_2_MINOR;
7410
0
    isDtls = ssl->options.dtls == 1;
7411
7412
#ifdef WOLFSSL_DTLS13
7413
    if (ssl->options.dtls) {
7414
        tls13minor = DTLSv1_3_MINOR;
7415
        tls12minor = DTLSv1_2_MINOR;
7416
        clientGreatestMinor = DTLS_MINOR;
7417
    }
7418
#endif /* WOLFSSL_DTLS13 */
7419
7420
0
    if (msgType == client_hello) {
7421
0
        int i;
7422
0
        int len;
7423
0
        int set = 0;
7424
7425
        /* Must contain a length and at least one version. */
7426
0
        if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1
7427
0
            || length > MAX_SV_EXT_LEN) {
7428
0
            return BUFFER_ERROR;
7429
0
        }
7430
7431
0
        len = *input;
7432
7433
        /* Protocol version array must fill rest of data. */
7434
0
        if (length != (word16)OPAQUE8_LEN + len)
7435
0
            return BUFFER_ERROR;
7436
7437
0
        input++;
7438
7439
        /* Find first match. */
7440
0
        for (i = 0; i < len; i += OPAQUE16_LEN) {
7441
0
            major = input[i];
7442
0
            minor = input[i + OPAQUE8_LEN];
7443
7444
#ifdef WOLFSSL_TLS13_DRAFT
7445
            if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
7446
                major = SSLv3_MAJOR;
7447
                minor = TLSv1_3_MINOR;
7448
            }
7449
#else
7450
0
            if (major == TLS_DRAFT_MAJOR)
7451
0
                continue;
7452
0
#endif
7453
7454
0
            if (major != ssl->ctx->method->version.major)
7455
0
                continue;
7456
7457
            /* No upgrade allowed. */
7458
0
            if (versionIsGreater(isDtls, minor, ssl->version.minor))
7459
0
                continue;
7460
7461
            /* Check downgrade. */
7462
0
            if (versionIsLesser(isDtls, minor, ssl->version.minor)) {
7463
0
                if (!ssl->options.downgrade)
7464
0
                    continue;
7465
7466
0
                if (versionIsLesser(isDtls, minor, ssl->options.minDowngrade))
7467
0
                    continue;
7468
0
            }
7469
0
            if (versionIsGreater(isDtls, minor, clientGreatestMinor))
7470
0
                clientGreatestMinor = minor;
7471
7472
0
            set = 1;
7473
0
        }
7474
0
        if (!set) {
7475
            /* No common supported version was negotiated */
7476
0
            SendAlert((WOLFSSL*)ssl, alert_fatal,
7477
0
                      wolfssl_alert_protocol_version);
7478
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7479
0
            return VERSION_ERROR;
7480
0
        }
7481
0
        pv->minor = clientGreatestMinor;
7482
0
        if (versionIsAtLeast(isDtls, clientGreatestMinor, tls13minor)) {
7483
0
            if (opts != NULL)
7484
0
                opts->tls1_3 = 1;
7485
7486
            /* TLS v1.3 requires supported version extension */
7487
0
            if (exts != NULL &&
7488
0
                    TLSX_Find(*exts, TLSX_SUPPORTED_VERSIONS) == NULL) {
7489
0
                ret = TLSX_Push(exts,
7490
0
                          TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
7491
0
                if (ret != 0) {
7492
0
                    return ret;
7493
0
                }
7494
                /* *exts should be pointing to the TLSX_SUPPORTED_VERSIONS
7495
                 * ext in the list since it was pushed. */
7496
0
                (*exts)->resp = 1;
7497
0
            }
7498
0
        }
7499
7500
0
    }
7501
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7502
        /* Must contain one version. */
7503
0
        if (length != OPAQUE16_LEN)
7504
0
            return BUFFER_ERROR;
7505
7506
0
        major = input[0];
7507
0
        minor = input[OPAQUE8_LEN];
7508
7509
        /* RFC 8446 4.2.1: a version in the ServerHello supported_versions that
7510
         * the client did not offer, or one prior to TLS 1.3, must be rejected
7511
         * with illegal_parameter, so return INVALID_PARAMETER rather than
7512
         * VERSION_ERROR (which maps to protocol_version). */
7513
7514
0
        if (major != ssl->ctx->method->version.major) {
7515
0
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
7516
0
            return INVALID_PARAMETER;
7517
0
        }
7518
7519
        /* Can't downgrade with this extension below TLS v1.3. */
7520
0
        if (versionIsLesser(isDtls, minor, tls13minor)) {
7521
0
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
7522
0
            return INVALID_PARAMETER;
7523
0
        }
7524
7525
        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
7526
0
        if (ssl->options.downgrade && ssl->version.minor == tls12minor) {
7527
            /* Set minor version back to TLS v1.3+ */
7528
0
            pv->minor = ssl->ctx->method->version.minor;
7529
0
        }
7530
7531
        /* No upgrade allowed. */
7532
0
        if (versionIsLesser(isDtls, ssl->version.minor, minor)) {
7533
0
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
7534
0
            return INVALID_PARAMETER;
7535
0
        }
7536
7537
        /* Check downgrade. */
7538
0
        if (versionIsGreater(isDtls, ssl->version.minor, minor)) {
7539
0
            if (!ssl->options.downgrade) {
7540
0
                WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
7541
0
                return INVALID_PARAMETER;
7542
0
            }
7543
7544
0
            if (versionIsLesser(
7545
0
                    isDtls, minor, ssl->options.minDowngrade)) {
7546
0
                WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
7547
0
                return INVALID_PARAMETER;
7548
0
            }
7549
7550
            /* Downgrade the version. */
7551
0
            pv->minor = minor;
7552
0
        }
7553
0
    }
7554
0
    else {
7555
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7556
0
        return SANITY_MSG_E;
7557
0
    }
7558
7559
0
    return 0;
7560
0
}
7561
7562
/* Sets a new SupportedVersions extension into the extension list.
7563
 *
7564
 * extensions  The list of extensions.
7565
 * data        The extensions specific data.
7566
 * heap        The heap used for allocation.
7567
 * returns 0 on success, otherwise failure.
7568
 */
7569
static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
7570
                                     void* heap)
7571
0
{
7572
0
    if (extensions == NULL || data == NULL)
7573
0
        return BAD_FUNC_ARG;
7574
7575
0
    return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, data, heap);
7576
0
}
7577
7578
0
#define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
7579
0
#define SV_WRITE     TLSX_SupportedVersions_Write
7580
0
#define SV_PARSE     TLSX_SupportedVersions_Parse
7581
7582
#else
7583
7584
#define SV_GET_SIZE(a, b, c) 0
7585
#define SV_WRITE(a, b, c, d) 0
7586
#define SV_PARSE(a, b, c, d, e, f, g) 0
7587
7588
#endif /* WOLFSSL_TLS13 */
7589
7590
#ifdef WOLFSSL_TLS13_COOKIE
7591
7592
/******************************************************************************/
7593
/* Cookie                                                                     */
7594
/******************************************************************************/
7595
7596
/* Free the cookie data.
7597
 *
7598
 * cookie  Cookie data.
7599
 * heap    The heap used for allocation.
7600
 */
7601
static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
7602
0
{
7603
0
    (void)heap;
7604
7605
0
    XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
7606
0
}
7607
7608
/* Get the size of the encoded Cookie extension.
7609
 * In messages: ClientHello and HelloRetryRequest.
7610
 *
7611
 * cookie   The cookie to write.
7612
 * msgType  The type of the message this extension is being written into.
7613
 * returns the number of bytes of the encoded Cookie extension.
7614
 */
7615
static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
7616
0
{
7617
0
    if (msgType == client_hello || msgType == hello_retry_request) {
7618
0
        *pSz += OPAQUE16_LEN + cookie->len;
7619
0
    }
7620
0
    else {
7621
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7622
0
        return SANITY_MSG_E;
7623
0
    }
7624
0
    return 0;
7625
0
}
7626
7627
/* Writes the Cookie extension into the output buffer.
7628
 * Assumes that the the output buffer is big enough to hold data.
7629
 * In messages: ClientHello and HelloRetryRequest.
7630
 *
7631
 * cookie   The cookie to write.
7632
 * output   The buffer to write into.
7633
 * msgType  The type of the message this extension is being written into.
7634
 * returns the number of bytes written into the buffer.
7635
 */
7636
static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType,
7637
                             word16* pSz)
7638
0
{
7639
0
    if (msgType == client_hello || msgType == hello_retry_request) {
7640
0
        c16toa(cookie->len, output);
7641
0
        output += OPAQUE16_LEN;
7642
0
        XMEMCPY(output, cookie->data, cookie->len);
7643
0
        *pSz += OPAQUE16_LEN + cookie->len;
7644
0
    }
7645
0
    else {
7646
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7647
0
        return SANITY_MSG_E;
7648
0
    }
7649
0
    return 0;
7650
0
}
7651
7652
/* Parse the Cookie extension.
7653
 * In messages: ClientHello and HelloRetryRequest.
7654
 *
7655
 * ssl      The SSL/TLS object.
7656
 * input    The extension data.
7657
 * length   The length of the extension data.
7658
 * msgType  The type of the message this extension is being parsed from.
7659
 * returns 0 on success and other values indicate failure.
7660
 */
7661
static int TLSX_Cookie_Parse(WOLFSSL* ssl, const byte* input, word16 length,
7662
                             byte msgType)
7663
0
{
7664
0
    word16  len;
7665
0
    word16  idx = 0;
7666
#ifdef WOLFSSL_SEND_HRR_COOKIE
7667
    TLSX*   extension;
7668
    Cookie* cookie;
7669
#endif
7670
7671
0
    if (msgType != client_hello && msgType != hello_retry_request) {
7672
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7673
0
        return SANITY_MSG_E;
7674
0
    }
7675
7676
    /* Message contains length and Cookie which must be at least one byte
7677
     * in length.
7678
     */
7679
0
    if (length < OPAQUE16_LEN + 1)
7680
0
        return BUFFER_E;
7681
0
    ato16(input + idx, &len);
7682
0
    idx += OPAQUE16_LEN;
7683
0
    if (length - idx != len)
7684
0
        return BUFFER_E;
7685
7686
0
    if (msgType == hello_retry_request) {
7687
        /* RFC 8446 4.2.2 allows up to 2^16-1 bytes. Cap it lower to limit
7688
         * how much a server can make us hold and echo back. */
7689
0
        if (len > WOLFSSL_MAX_TLS13_COOKIE_SZ) {
7690
0
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7691
0
            return HRR_COOKIE_ERROR;
7692
0
        }
7693
7694
0
        ssl->options.hrrSentCookie = 1;
7695
0
        return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 1,
7696
0
                               &ssl->extensions);
7697
0
    }
7698
7699
    /* client_hello - the encoding is checked above in every build. Only a
7700
     * server that sends cookies holds one to compare the echoed cookie
7701
     * against, so otherwise the value is accepted and ignored. */
7702
#ifdef WOLFSSL_SEND_HRR_COOKIE
7703
    extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
7704
    if (extension == NULL) {
7705
#ifdef WOLFSSL_DTLS13
7706
        if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
7707
            /* Allow a cookie extension with DTLS 1.3 because it is possible
7708
             * that a different SSL instance sent the cookie but we are now
7709
             * receiving it. */
7710
            return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
7711
                                   &ssl->extensions);
7712
        else
7713
#endif
7714
        {
7715
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7716
            return HRR_COOKIE_ERROR;
7717
        }
7718
    }
7719
7720
    cookie = (Cookie*)extension->data;
7721
    if (cookie->len != len || XMEMCMP(cookie->data, input + idx, len) != 0) {
7722
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7723
        return HRR_COOKIE_ERROR;
7724
    }
7725
7726
    /* Request seen. */
7727
    extension->resp = 0;
7728
#endif
7729
7730
0
    return 0;
7731
0
}
7732
7733
/* Use the data to create a new Cookie object in the extensions.
7734
 *
7735
 * ssl    SSL/TLS object.
7736
 * data   Cookie data.
7737
 * len    Length of cookie data in bytes.
7738
 * mac    MAC data.
7739
 * macSz  Length of MAC data in bytes.
7740
 * resp   Indicates the extension will go into a response (HelloRetryRequest).
7741
 * returns 0 on success and other values indicate failure.
7742
 */
7743
int TLSX_Cookie_Use(const WOLFSSL* ssl, const byte* data, word16 len, byte* mac,
7744
                    byte macSz, int resp, TLSX** exts)
7745
0
{
7746
0
    int     ret = 0;
7747
0
    TLSX*   extension;
7748
0
    Cookie* cookie;
7749
7750
    /* Find the cookie extension if it exists. */
7751
0
    extension = TLSX_Find(*exts, TLSX_COOKIE);
7752
0
    if (extension == NULL) {
7753
        /* Push new cookie extension. */
7754
0
        ret = TLSX_Push(exts, TLSX_COOKIE, NULL, ssl->heap);
7755
0
        if (ret != 0)
7756
0
            return ret;
7757
7758
0
        extension = TLSX_Find(*exts, TLSX_COOKIE);
7759
0
        if (extension == NULL)
7760
0
            return MEMORY_E;
7761
0
    }
7762
7763
0
    cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz, ssl->heap,
7764
0
                              DYNAMIC_TYPE_TLSX);
7765
0
    if (cookie == NULL)
7766
0
        return MEMORY_E;
7767
7768
0
    cookie->len = len + macSz;
7769
0
    XMEMCPY(cookie->data, data, len);
7770
0
    if (mac != NULL)
7771
0
        XMEMCPY(cookie->data + len, mac, macSz);
7772
7773
0
    XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
7774
7775
0
    extension->data = (void*)cookie;
7776
0
    extension->resp = (byte)resp;
7777
7778
0
    return 0;
7779
0
}
7780
7781
0
#define CKE_FREE_ALL  TLSX_Cookie_FreeAll
7782
0
#define CKE_GET_SIZE  TLSX_Cookie_GetSize
7783
0
#define CKE_WRITE     TLSX_Cookie_Write
7784
0
#define CKE_PARSE     TLSX_Cookie_Parse
7785
7786
#else
7787
7788
#define CKE_FREE_ALL(a, b)    WC_DO_NOTHING
7789
#define CKE_GET_SIZE(a, b, c) 0
7790
#define CKE_WRITE(a, b, c, d) 0
7791
#define CKE_PARSE(a, b, c, d) 0
7792
7793
#endif
7794
7795
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && \
7796
    !defined(WOLFSSL_NO_CA_NAMES)
7797
/******************************************************************************/
7798
/* Certificate Authorities                                                    */
7799
/******************************************************************************/
7800
7801
/* Smallest legal authorities list from RFC 8446 section 4.2.4: a 2 byte
7802
 * length plus at least 1 byte of name. */
7803
#ifndef WC_CA_NAMES_MIN_SZ
7804
0
    #define WC_CA_NAMES_MIN_SZ 3
7805
#endif
7806
7807
/* Append a copy of dn/dnSz to the list so wire order matches call order.
7808
 * tail, when not NULL, caches the append point across calls: parsing a
7809
 * maximum sized extension adds thousands of entries and walking from the
7810
 * head each time would be quadratic. */
7811
int TLSX_CertificateAuthorities_Add_ex(CertificateAuthority** head,
7812
        CertificateAuthority** tail, const byte* dn, word16 dnSz, void* heap)
7813
0
{
7814
0
    CertificateAuthority* node;
7815
0
    size_t sz;
7816
7817
0
    if (head == NULL || dn == NULL || dnSz == 0)
7818
0
        return BAD_FUNC_ARG;
7819
7820
0
    sz = sizeof(*node) + (size_t)dnSz;
7821
0
    node = (CertificateAuthority*)XMALLOC(sz, heap, DYNAMIC_TYPE_TLSX);
7822
0
    if (node == NULL)
7823
0
        return MEMORY_ERROR;
7824
0
    XMEMCPY(node->dn, dn, dnSz);
7825
0
    node->dnSz = dnSz;
7826
0
    node->next = NULL;
7827
7828
0
    if ((tail != NULL) && (*tail != NULL)) {
7829
0
        (*tail)->next = node;
7830
0
    }
7831
0
    else {
7832
0
        CertificateAuthority** end = head;
7833
7834
0
        while (*end != NULL)
7835
0
            end = &(*end)->next;
7836
0
        *end = node;
7837
0
    }
7838
0
    if (tail != NULL)
7839
0
        *tail = node;
7840
0
    return 0;
7841
0
}
7842
7843
int TLSX_CertificateAuthorities_Add(CertificateAuthority** head,
7844
        const byte* dn, word16 dnSz, void* heap)
7845
0
{
7846
0
    return TLSX_CertificateAuthorities_Add_ex(head, NULL, dn, dnSz, heap);
7847
0
}
7848
7849
void TLSX_CertificateAuthorities_FreeAll(CertificateAuthority* head, void* heap)
7850
0
{
7851
0
    while (head != NULL) {
7852
0
        CertificateAuthority* next = head->next;
7853
0
        XFREE(head, heap, DYNAMIC_TYPE_TLSX);
7854
0
        head = next;
7855
0
    }
7856
0
}
7857
7858
/* Certificate_authorities extension emitter. Walks the optional OPENSSL_EXTRA
7859
 * compat stack and the native list and either accumulates the payload size
7860
 * into *pSz (output == NULL) or serializes the payload into output and
7861
 * accumulates the written length.
7862
 *
7863
 * RFC 8446 4.2.4:
7864
 *     opaque DistinguishedName<1..2^16-1>;
7865
 *     struct {
7866
 *         DistinguishedName authorities<3..2^16-1>;
7867
 *     } CertificateAuthoritiesExtension;
7868
 *
7869
 * Each DN entry is at most 2^16-1 bytes and the whole authorities vector is
7870
 * also at most 2^16-1 bytes. Returns 0 on success, BUFFER_ERROR if any entry
7871
 * or the combined total would exceed either cap. */
7872
static int TLSX_CA_Names_Write(const WOLFSSL* ssl, byte* output, word16* pSz)
7873
0
{
7874
0
    CertificateAuthority* cur;
7875
0
    word32 total = OPAQUE16_LEN;  /* outer 16-bit length */
7876
0
    byte* outerLen = output;
7877
7878
0
    if (output != NULL)
7879
0
        output += OPAQUE16_LEN;
7880
7881
#ifdef OPENSSL_EXTRA
7882
    {
7883
        WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7884
        for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL;
7885
                names = names->next) {
7886
            byte seq[MAX_SEQ_SZ];
7887
            word32 seqSz;
7888
            word32 entrySz;
7889
            WOLFSSL_X509_NAME* name = names->data.name;
7890
7891
            if (name == NULL || name->rawLen <= 0)
7892
                continue;
7893
            seqSz = SetSequence((word32)name->rawLen, seq);
7894
            entrySz = seqSz + (word32)name->rawLen;
7895
            /* Per-DN cap, and cumulative cap on the whole extension payload
7896
             * (outer length included) so *pSz below stays exact. */
7897
            if (entrySz > WOLFSSL_MAX_16BIT ||
7898
                    total + OPAQUE16_LEN + entrySz > WOLFSSL_MAX_16BIT)
7899
                return BUFFER_ERROR;
7900
            /* 16-bit entry length | SEQ hdr | DER of name */
7901
            total += OPAQUE16_LEN + entrySz;
7902
            if (output != NULL) {
7903
                c16toa((word16)entrySz, output);
7904
                output += OPAQUE16_LEN;
7905
                XMEMCPY(output, seq, seqSz);
7906
                output += seqSz;
7907
                XMEMCPY(output, name->raw, name->rawLen);
7908
                output += name->rawLen;
7909
            }
7910
        }
7911
    }
7912
#endif
7913
7914
    /* Native entries store the inner subject content; wrap with a SEQUENCE
7915
     * header to form the full DER Name expected on the wire. */
7916
0
    for (cur = WS_CA_NAMES(ssl); cur != NULL; cur = cur->next) {
7917
0
        byte seq[MAX_SEQ_SZ];
7918
0
        word32 seqSz = SetSequence(cur->dnSz, seq);
7919
0
        word32 entrySz = seqSz + (word32)cur->dnSz;
7920
0
        if (entrySz > WOLFSSL_MAX_16BIT ||
7921
0
                total + OPAQUE16_LEN + entrySz > WOLFSSL_MAX_16BIT)
7922
0
            return BUFFER_ERROR;
7923
0
        total += OPAQUE16_LEN + entrySz;
7924
0
        if (output != NULL) {
7925
0
            c16toa((word16)entrySz, output);
7926
0
            output += OPAQUE16_LEN;
7927
0
            XMEMCPY(output, seq, seqSz);
7928
0
            output += seqSz;
7929
0
            XMEMCPY(output, cur->dn, cur->dnSz);
7930
0
            output += cur->dnSz;
7931
0
        }
7932
0
    }
7933
7934
0
    if (outerLen != NULL)
7935
0
        c16toa((word16)(total - OPAQUE16_LEN), outerLen);
7936
0
    *pSz += (word16)total;
7937
0
    return 0;
7938
0
}
7939
7940
/* True if the emitter would produce at least one DN. Asks the emitter itself
7941
 * rather than restating its filtering, so the two cannot drift and an
7942
 * all-empty compat stack never yields an empty authorities vector. On error
7943
 * report true, so an oversized list fails at write time instead of silently
7944
 * dropping the extension. */
7945
static int HasAnyCANames(const WOLFSSL* ssl)
7946
0
{
7947
0
    word16 sz = 0;
7948
7949
0
    if (TLSX_CA_Names_Write(ssl, NULL, &sz) != 0)
7950
0
        return 1;
7951
0
    return sz > OPAQUE16_LEN;
7952
0
}
7953
7954
static int TLSX_CA_Names_Parse(WOLFSSL *ssl, const byte* input,
7955
                                  word16 length, byte isRequest)
7956
0
{
7957
0
    word16 extLen;
7958
0
    CertificateAuthority* tail = NULL;
7959
7960
0
    (void)isRequest;
7961
7962
    /* Reset the wolfSSL native peer list. */
7963
0
    TLSX_CertificateAuthorities_FreeAll(ssl->ws_peer_ca_names, ssl->heap);
7964
0
    ssl->ws_peer_ca_names = NULL;
7965
7966
#ifdef OPENSSL_EXTRA
7967
    wolfSSL_sk_X509_NAME_pop_free(ssl->peer_ca_names, NULL);
7968
    ssl->peer_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
7969
    if (ssl->peer_ca_names == NULL)
7970
        return MEMORY_ERROR;
7971
#endif
7972
7973
0
    if (length < OPAQUE16_LEN)
7974
0
        return BUFFER_ERROR;
7975
7976
0
    ato16(input, &extLen);
7977
0
    input += OPAQUE16_LEN;
7978
0
    length -= OPAQUE16_LEN;
7979
0
    if (extLen != length)
7980
0
        return BUFFER_ERROR;
7981
    /* authorities<3..2^16-1>: the extension is only parsed when present, so
7982
     * an empty vector is a framing error too. The size table in TLSX_Parse
7983
     * skips certificate_request; set WC_CA_NAMES_MIN_SZ to 0 to accept short
7984
     * lists the way older versions did. */
7985
0
#if WC_CA_NAMES_MIN_SZ > 0
7986
0
    if (extLen < WC_CA_NAMES_MIN_SZ)
7987
0
        return BUFFER_ERROR;
7988
0
#endif
7989
7990
0
    while (length) {
7991
0
        word16 entrySz;
7992
0
        word32 seqIdx = 0;
7993
0
        int    innerLen = 0;
7994
0
        int    ret;
7995
7996
0
        if (length < OPAQUE16_LEN)
7997
0
            return BUFFER_ERROR;
7998
0
        ato16(input, &entrySz);
7999
        /* DistinguishedName<1..2^16-1>: each entry must be at least 1 byte. */
8000
0
        if (entrySz == 0)
8001
0
            return BUFFER_ERROR;
8002
0
        if ((word16)(length - OPAQUE16_LEN) < entrySz)
8003
0
            return BUFFER_ERROR;
8004
8005
        /* Strip the outer SEQUENCE so that the native list stores subject
8006
         * content only, mirroring the send path. */
8007
0
        if (GetSequence(input + OPAQUE16_LEN, &seqIdx, &innerLen,
8008
0
                        entrySz) < 0)
8009
0
            return BUFFER_ERROR;
8010
0
        if ((word32)innerLen + seqIdx != entrySz)
8011
0
            return BUFFER_ERROR;
8012
8013
0
        ret = TLSX_CertificateAuthorities_Add_ex(&ssl->ws_peer_ca_names,
8014
0
                &tail, input + OPAQUE16_LEN + seqIdx, (word16)innerLen,
8015
0
                ssl->heap);
8016
0
        if (ret != 0)
8017
0
            return ret;
8018
8019
#ifdef OPENSSL_EXTRA
8020
        {
8021
            WOLFSSL_X509_NAME* name = NULL;
8022
            int didInit = FALSE;
8023
#ifdef WOLFSSL_SMALL_STACK
8024
            DecodedCert *cert = (DecodedCert *)XMALLOC(
8025
                sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
8026
            if (cert == NULL)
8027
                return MEMORY_ERROR;
8028
#else
8029
            DecodedCert cert[1];
8030
#endif
8031
            InitDecodedCert(cert, input + OPAQUE16_LEN, entrySz, ssl->heap);
8032
            didInit = TRUE;
8033
            ret = GetName(cert, ASN_SUBJECT, entrySz);
8034
8035
            if (ret == 0 && (name = wolfSSL_X509_NAME_new()) == NULL)
8036
                ret = MEMORY_ERROR;
8037
8038
            if (ret == 0) {
8039
                CopyDecodedName(name, cert, ASN_SUBJECT);
8040
                if (wolfSSL_sk_X509_NAME_push(ssl->peer_ca_names, name) <= 0) {
8041
                    wolfSSL_X509_NAME_free(name);
8042
                    ret = MEMORY_ERROR;
8043
                }
8044
            }
8045
8046
            if (didInit)
8047
                FreeDecodedCert(cert);
8048
8049
            WC_FREE_VAR_EX(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
8050
            if (ret != 0)
8051
                return ret;
8052
        }
8053
#endif /* OPENSSL_EXTRA */
8054
8055
0
        input += OPAQUE16_LEN + entrySz;
8056
0
        length -= OPAQUE16_LEN + entrySz;
8057
0
    }
8058
0
    return 0;
8059
0
}
8060
8061
0
#define CAN_GET_SIZE(ssl, pSz)       TLSX_CA_Names_Write(ssl, NULL, pSz)
8062
0
#define CAN_WRITE(ssl, output, pSz)  TLSX_CA_Names_Write(ssl, output, pSz)
8063
#define CAN_PARSE(ssl, input, length, isRequest) \
8064
0
                                TLSX_CA_Names_Parse(ssl, input, length, isRequest)
8065
8066
#else
8067
8068
#define CAN_GET_SIZE(ssl, pSz)                   0
8069
#define CAN_WRITE(ssl, output, pSz)              0
8070
#define CAN_PARSE(ssl, input, length, isRequest) 0
8071
8072
#endif
8073
8074
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
8075
/******************************************************************************/
8076
/* Signature Algorithms                                                       */
8077
/******************************************************************************/
8078
8079
/* Return the size of the SignatureAlgorithms extension's data.
8080
 *
8081
 * data  The SSL/TLS object.
8082
 * returns the length of data that will be in the extension.
8083
 */
8084
static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
8085
0
{
8086
0
    WOLFSSL* ssl = (WOLFSSL*)data;
8087
8088
0
    return OPAQUE16_LEN + WOLFSSL_SUITES(ssl)->hashSigAlgoSz;
8089
0
}
8090
8091
/* Creates a bit string of supported hash algorithms with RSA PSS.
8092
 * The bit string is used when determining which signature algorithm to use
8093
 * when creating the CertificateVerify message.
8094
 * Note: Valid data has an even length as each signature algorithm is two bytes.
8095
 *
8096
 * ssl     The SSL/TLS object.
8097
 * input   The buffer with the list of supported signature algorithms.
8098
 * length  The length of the list in bytes.
8099
 * returns 0 on success, BUFFER_ERROR when the length is not even.
8100
 */
8101
static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, const byte* input,
8102
                                           word16 length)
8103
0
{
8104
0
    word16 i;
8105
8106
0
    if ((length & 1) == 1)
8107
0
        return BUFFER_ERROR;
8108
8109
0
    ssl->pssAlgo = 0;
8110
0
    for (i = 0; i < length; i += 2) {
8111
0
        if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
8112
0
            ssl->pssAlgo |= 1 << input[i + 1];
8113
0
    #ifdef WOLFSSL_TLS13
8114
0
        if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
8115
0
                                                   input[i + 1] <= pss_sha512) {
8116
0
            ssl->pssAlgo |= 1 << input[i + 1];
8117
0
        }
8118
0
    #endif
8119
0
    }
8120
8121
0
    return 0;
8122
0
}
8123
8124
/* Writes the SignatureAlgorithms extension into the buffer.
8125
 *
8126
 * data    The SSL/TLS object.
8127
 * output  The buffer to write the extension into.
8128
 * returns the length of data that was written.
8129
 */
8130
static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
8131
0
{
8132
0
    WOLFSSL* ssl = (WOLFSSL*)data;
8133
0
    const Suites* suites = WOLFSSL_SUITES(ssl);
8134
8135
0
    c16toa(suites->hashSigAlgoSz, output);
8136
0
    XMEMCPY(output + OPAQUE16_LEN, suites->hashSigAlgo, suites->hashSigAlgoSz);
8137
8138
0
#ifndef NO_RSA
8139
0
    TLSX_SignatureAlgorithms_MapPss(ssl, output + OPAQUE16_LEN,
8140
0
            suites->hashSigAlgoSz);
8141
0
#endif
8142
8143
0
    return OPAQUE16_LEN + suites->hashSigAlgoSz;
8144
0
}
8145
8146
/* Parse the SignatureAlgorithms extension.
8147
 *
8148
 * ssl     The SSL/TLS object.
8149
 * input   The buffer with the extension data.
8150
 * length  The length of the extension data.
8151
 * returns 0 on success, otherwise failure.
8152
 */
8153
static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, const byte* input,
8154
                                  word16 length, byte isRequest, Suites* suites)
8155
0
{
8156
0
    word16 len;
8157
8158
0
    if (!isRequest)
8159
0
        return BUFFER_ERROR;
8160
8161
    /* Must contain a length and at least algorithm. */
8162
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
8163
0
        return BUFFER_ERROR;
8164
8165
0
    ato16(input, &len);
8166
0
    input += OPAQUE16_LEN;
8167
8168
    /* Algorithm array must fill rest of data. */
8169
0
    if (length != OPAQUE16_LEN + len)
8170
0
        return BUFFER_ERROR;
8171
8172
    /* Truncate hashSigAlgo list if too long. */
8173
0
    suites->hashSigAlgoSz = len;
8174
    /* Sig Algo list size must be even. */
8175
0
    if (suites->hashSigAlgoSz % 2 != 0)
8176
0
        return BUFFER_ERROR;
8177
0
    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
8178
0
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
8179
0
        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
8180
0
    }
8181
0
    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
8182
8183
0
    return TLSX_SignatureAlgorithms_MapPss(ssl, input, suites->hashSigAlgoSz);
8184
0
}
8185
8186
/* Sets a new SignatureAlgorithms extension into the extension list.
8187
 *
8188
 * extensions  The list of extensions.
8189
 * ssl         The SSL/TLS object. Not const: the write callback maps the PSS
8190
 *             algorithms through it.
8191
 * heap        The heap used for allocation.
8192
 * returns 0 on success, otherwise failure.
8193
 */
8194
static int TLSX_SetSignatureAlgorithms(TLSX** extensions, WOLFSSL* ssl,
8195
                                       void* heap)
8196
0
{
8197
0
    if (extensions == NULL)
8198
0
        return BAD_FUNC_ARG;
8199
8200
    /* Already present */
8201
0
    if (TLSX_Find(*extensions, TLSX_SIGNATURE_ALGORITHMS) != NULL)
8202
0
        return 0;
8203
8204
0
    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, ssl, heap);
8205
0
}
8206
8207
0
#define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
8208
0
#define SA_WRITE     TLSX_SignatureAlgorithms_Write
8209
0
#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
8210
#endif
8211
/******************************************************************************/
8212
/* Signature Algorithms Certificate                                           */
8213
/******************************************************************************/
8214
8215
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
8216
/* Return the size of the SignatureAlgorithmsCert extension's data.
8217
 *
8218
 * data  The SSL/TLS object.
8219
 * returns the length of data that will be in the extension.
8220
 */
8221
static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
8222
0
{
8223
0
    WOLFSSL* ssl = (WOLFSSL*)data;
8224
8225
0
    if (ssl->certHashSigAlgo == NULL)
8226
0
        return OPAQUE16_LEN;
8227
8228
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
8229
0
}
8230
8231
/* Writes the SignatureAlgorithmsCert extension into the buffer.
8232
 *
8233
 * data    The SSL/TLS object.
8234
 * output  The buffer to write the extension into.
8235
 * returns the length of data that was written.
8236
 */
8237
static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
8238
0
{
8239
0
    WOLFSSL* ssl = (WOLFSSL*)data;
8240
8241
0
    if (ssl->certHashSigAlgo == NULL) {
8242
0
        c16toa(0, output);
8243
0
        return OPAQUE16_LEN;
8244
0
    }
8245
8246
0
    c16toa(ssl->certHashSigAlgoSz, output);
8247
0
    XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
8248
0
            ssl->certHashSigAlgoSz);
8249
8250
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
8251
0
}
8252
8253
/* Parse the SignatureAlgorithmsCert extension.
8254
 *
8255
 * ssl     The SSL/TLS object.
8256
 * input   The buffer with the extension data.
8257
 * length  The length of the extension data.
8258
 * returns 0 on success, otherwise failure.
8259
 */
8260
static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, const byte* input,
8261
                                              word16 length, byte isRequest)
8262
0
{
8263
0
    word16 len;
8264
8265
0
    if (!isRequest)
8266
0
        return BUFFER_ERROR;
8267
8268
    /* Must contain a length and at least algorithm. */
8269
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
8270
0
        return BUFFER_ERROR;
8271
8272
0
    ato16(input, &len);
8273
0
    input += OPAQUE16_LEN;
8274
8275
    /* Algorithm array must fill rest of data. */
8276
0
    if (length != OPAQUE16_LEN + len)
8277
0
        return BUFFER_ERROR;
8278
8279
    /* truncate hashSigAlgo list if too long */
8280
0
    if (len > WOLFSSL_MAX_SIGALGO) {
8281
0
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
8282
0
        len = WOLFSSL_MAX_SIGALGO;
8283
0
    }
8284
8285
0
    XFREE(ssl->certHashSigAlgo, ssl->heap, DYNAMIC_TYPE_TLSX);
8286
0
    ssl->certHashSigAlgoSz = 0;
8287
0
    ssl->certHashSigAlgo = (byte*)XMALLOC(len, ssl->heap, DYNAMIC_TYPE_TLSX);
8288
0
    if (ssl->certHashSigAlgo == NULL)
8289
0
        return MEMORY_E;
8290
8291
0
    XMEMCPY(ssl->certHashSigAlgo, input, len);
8292
0
    ssl->certHashSigAlgoSz = len;
8293
8294
0
    return 0;
8295
0
}
8296
8297
/* Sets a new SignatureAlgorithmsCert extension into the extension list.
8298
 *
8299
 * extensions  The list of extensions.
8300
 * data        The extensions specific data.
8301
 * heap        The heap used for allocation.
8302
 * returns 0 on success, otherwise failure.
8303
 */
8304
static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions,
8305
        const WOLFSSL* ssl, void* heap)
8306
0
{
8307
0
    if (extensions == NULL)
8308
0
        return BAD_FUNC_ARG;
8309
8310
0
    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, ssl, heap);
8311
0
}
8312
8313
0
#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
8314
0
#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
8315
0
#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
8316
#endif /* WOLFSSL_TLS13 */
8317
8318
8319
/******************************************************************************/
8320
/* Key Share                                                                  */
8321
/******************************************************************************/
8322
8323
#ifndef MAX_KEYSHARE_NAMED_GROUPS
8324
    #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
8325
        !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
8326
0
        #define MAX_KEYSHARE_NAMED_GROUPS    24
8327
    #else
8328
        #define MAX_KEYSHARE_NAMED_GROUPS    12
8329
    #endif
8330
#endif
8331
8332
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
8333
/* Create a key share entry using named Diffie-Hellman parameters group.
8334
 * Generates a key pair.
8335
 *
8336
 * ssl   The SSL/TLS object.
8337
 * kse   The key share entry object.
8338
 * returns 0 on success, otherwise failure.
8339
 */
8340
static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
8341
0
{
8342
0
    int ret = 0;
8343
0
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
8344
0
    word32 pSz = 0, pvtSz = 0;
8345
0
    DhKey* dhKey = (DhKey*)kse->key;
8346
8347
    /* Pick the parameters from the named group. */
8348
0
#ifdef HAVE_PUBLIC_FFDHE
8349
0
    const DhParams* params = NULL;
8350
0
    switch (kse->group) {
8351
0
    #ifdef HAVE_FFDHE_2048
8352
0
        case WOLFSSL_FFDHE_2048:
8353
0
            params = wc_Dh_ffdhe2048_Get();
8354
0
            pvtSz = 29;
8355
0
            break;
8356
0
    #endif
8357
    #ifdef HAVE_FFDHE_3072
8358
        case WOLFSSL_FFDHE_3072:
8359
            params = wc_Dh_ffdhe3072_Get();
8360
            pvtSz = 34;
8361
            break;
8362
    #endif
8363
    #ifdef HAVE_FFDHE_4096
8364
        case WOLFSSL_FFDHE_4096:
8365
            params = wc_Dh_ffdhe4096_Get();
8366
            pvtSz = 39;
8367
            break;
8368
    #endif
8369
    #ifdef HAVE_FFDHE_6144
8370
        case WOLFSSL_FFDHE_6144:
8371
            params = wc_Dh_ffdhe6144_Get();
8372
            pvtSz = 46;
8373
            break;
8374
    #endif
8375
    #ifdef HAVE_FFDHE_8192
8376
        case WOLFSSL_FFDHE_8192:
8377
            params = wc_Dh_ffdhe8192_Get();
8378
            pvtSz = 52;
8379
            break;
8380
    #endif
8381
0
        default:
8382
0
            break;
8383
0
    }
8384
0
    if (params == NULL)
8385
0
        return BAD_FUNC_ARG;
8386
0
    pSz = params->p_len;
8387
#else
8388
    pvtSz = wc_DhGetNamedKeyMinSize(kse->group);
8389
    if (pvtSz == 0) {
8390
        return BAD_FUNC_ARG;
8391
    }
8392
    ret = wc_DhGetNamedKeyParamSize(kse->group, &pSz, NULL, NULL);
8393
    if (ret != 0) {
8394
        return BAD_FUNC_ARG;
8395
    }
8396
#endif
8397
8398
    /* Trigger Key Generation */
8399
0
    if (kse->pubKey == NULL || kse->privKey == NULL) {
8400
0
        if (kse->key == NULL) {
8401
0
            kse->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
8402
0
                DYNAMIC_TYPE_DH);
8403
0
            if (kse->key == NULL)
8404
0
                return MEMORY_E;
8405
8406
            /* Setup Key */
8407
0
            ret = wc_InitDhKey_ex((DhKey*)kse->key, ssl->heap, ssl->devId);
8408
0
#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)
8409
0
            if (ret != 0) {
8410
0
                XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
8411
0
                kse->key = NULL;
8412
0
                return ret;
8413
0
            }
8414
0
#endif
8415
0
            if (ret == 0) {
8416
0
                dhKey = (DhKey*)kse->key;
8417
0
            #ifdef HAVE_PUBLIC_FFDHE
8418
0
                ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
8419
0
                                                                 params->g_len);
8420
            #else
8421
                ret = wc_DhSetNamedKey(dhKey, kse->group);
8422
            #endif
8423
0
            }
8424
        #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8425
            defined(WC_ASYNC_ENABLE_DH)
8426
            /* Only set non-blocking context when async device is active. With
8427
             * INVALID_DEVID there is no async loop to retry on MP_WOULDBLOCK, so
8428
             * skip non-blocking setup and use blocking mode instead. */
8429
            if (ret == 0 && ssl->devId != INVALID_DEVID) {
8430
                DhNb* dhNb = (DhNb*)XMALLOC(sizeof(DhNb), ssl->heap,
8431
                                            DYNAMIC_TYPE_TMP_BUFFER);
8432
                if (dhNb == NULL) {
8433
                    ret = MEMORY_E;
8434
                }
8435
                else {
8436
                    ret = wc_DhSetNonBlock((DhKey*)kse->key, dhNb);
8437
                    if (ret != 0) {
8438
                        XFREE(dhNb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8439
                    }
8440
                }
8441
            }
8442
        #endif /* WC_DH_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8443
                  WC_ASYNC_ENABLE_DH */
8444
0
        }
8445
8446
        /* Allocate space for the private and public key */
8447
0
        if (ret == 0 && kse->pubKey == NULL) {
8448
0
            kse->pubKey = (byte*)XMALLOC(pSz, ssl->heap,
8449
0
                DYNAMIC_TYPE_PUBLIC_KEY);
8450
0
            if (kse->pubKey == NULL)
8451
0
                ret = MEMORY_E;
8452
0
        }
8453
8454
0
        if (ret == 0 && kse->privKey == NULL) {
8455
0
            kse->privKey = (byte*)XMALLOC(pvtSz, ssl->heap,
8456
0
                DYNAMIC_TYPE_PRIVATE_KEY);
8457
0
            if (kse->privKey == NULL)
8458
0
                ret = MEMORY_E;
8459
0
        }
8460
8461
0
        if (ret == 0) {
8462
        #if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
8463
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_DH, kse->key);
8464
            kse->pubKeyLen = pSz;
8465
            kse->keyLen = pvtSz;
8466
            if (ret == 0) {
8467
                ret = wc_DhExportKeyPair(dhKey,
8468
                    (byte*)kse->privKey, &kse->keyLen, /* private */
8469
                    kse->pubKey, &kse->pubKeyLen /* public */
8470
                );
8471
            }
8472
            else
8473
        #endif
8474
0
            {
8475
                /* Generate a new key pair */
8476
                /* For async this is called once and when event is done, the
8477
                 *   provided buffers will be populated.
8478
                 * Final processing is zero pad below. */
8479
0
                kse->pubKeyLen = pSz;
8480
0
                kse->keyLen = pvtSz;
8481
0
                ret = DhGenKeyPair(ssl, dhKey,
8482
0
                    (byte*)kse->privKey, &kse->keyLen, /* private */
8483
0
                    kse->pubKey, &kse->pubKeyLen /* public */
8484
0
                );
8485
            #ifdef WOLFSSL_ASYNC_CRYPT
8486
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8487
                    return ret;
8488
                }
8489
            #endif
8490
0
            }
8491
0
        }
8492
0
    }
8493
8494
0
    if (ret == 0) {
8495
0
        if (pSz != kse->pubKeyLen) {
8496
            /* Zero pad the front of the public key to match prime "p" size */
8497
0
            XMEMMOVE(kse->pubKey + pSz - kse->pubKeyLen, kse->pubKey,
8498
0
                kse->pubKeyLen);
8499
0
            XMEMSET(kse->pubKey, 0, pSz - kse->pubKeyLen);
8500
0
            kse->pubKeyLen = pSz;
8501
0
        }
8502
8503
0
        if (pvtSz != kse->keyLen) {
8504
            /* Zero pad the front of the private key */
8505
0
            XMEMMOVE(kse->privKey + pvtSz - kse->keyLen, kse->privKey,
8506
0
                kse->keyLen);
8507
0
            XMEMSET(kse->privKey, 0, pvtSz - kse->keyLen);
8508
0
            kse->keyLen = pvtSz;
8509
0
        }
8510
8511
    #ifdef WOLFSSL_DEBUG_TLS
8512
        WOLFSSL_MSG("Public DH Key");
8513
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8514
    #endif
8515
0
    }
8516
8517
    /* Always release the DH key to free up memory.
8518
     * The DhKey will be setup again in TLSX_KeyShare_ProcessDh */
8519
0
    if (dhKey != NULL) {
8520
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8521
        defined(WC_ASYNC_ENABLE_DH)
8522
        if (dhKey->nb != NULL) {
8523
            XFREE(dhKey->nb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8524
            dhKey->nb = NULL;
8525
        }
8526
    #endif
8527
0
        wc_FreeDhKey(dhKey);
8528
0
    }
8529
0
    XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
8530
0
    kse->key = NULL;
8531
8532
0
    if (ret != 0) {
8533
        /* Cleanup on error, otherwise data owned by key share entry */
8534
0
        if (kse->privKey) {
8535
0
            ForceZero(kse->privKey, pvtSz);
8536
0
            XFREE(kse->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8537
0
            kse->privKey = NULL;
8538
0
        }
8539
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8540
0
        kse->pubKey = NULL;
8541
0
    }
8542
#else
8543
    (void)ssl;
8544
    (void)kse;
8545
8546
    ret = NOT_COMPILED_IN;
8547
    WOLFSSL_ERROR_VERBOSE(ret);
8548
#endif
8549
8550
0
    return ret;
8551
0
}
8552
8553
/* Create a key share entry using X25519 parameters group.
8554
 * Generates a key pair.
8555
 *
8556
 * ssl   The SSL/TLS object.
8557
 * kse   The key share entry object.
8558
 * returns 0 on success, otherwise failure.
8559
 */
8560
static int TLSX_KeyShare_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
8561
0
{
8562
0
    int ret = 0;
8563
#ifdef HAVE_CURVE25519
8564
    curve25519_key* key = (curve25519_key*)kse->key;
8565
8566
    if (kse->key == NULL) {
8567
        /* Allocate a Curve25519 key to hold private key. */
8568
        kse->key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
8569
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8570
        if (kse->key == NULL) {
8571
            WOLFSSL_MSG("GenX25519Key memory error");
8572
            return MEMORY_E;
8573
        }
8574
8575
        /* Initialize the Curve25519 key. */
8576
        ret = wc_curve25519_init_ex((curve25519_key*)kse->key, ssl->heap,
8577
            ssl->devId);
8578
        if (ret == 0) {
8579
            /* setting "key" means okay to call wc_curve25519_free */
8580
            key = (curve25519_key*)kse->key;
8581
            kse->keyLen = CURVE25519_KEYSIZE;
8582
        }
8583
    #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8584
        defined(WC_ASYNC_ENABLE_X25519)
8585
        /* Only set non-blocking context when async device is active. With
8586
         * INVALID_DEVID there is no async loop to retry on FP_WOULDBLOCK, so
8587
         * skip non-blocking setup and use blocking mode instead. */
8588
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
8589
            x25519_nb_ctx_t* nb_ctx = (x25519_nb_ctx_t*)XMALLOC(
8590
                sizeof(x25519_nb_ctx_t), ssl->heap,
8591
                DYNAMIC_TYPE_TMP_BUFFER);
8592
            if (nb_ctx == NULL) {
8593
                ret = MEMORY_E;
8594
            }
8595
            else {
8596
                ret = wc_curve25519_set_nonblock(key, nb_ctx);
8597
                if (ret != 0) {
8598
                    XFREE(nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8599
                }
8600
            }
8601
        }
8602
    #endif /* WC_X25519_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8603
              WC_ASYNC_ENABLE_X25519 */
8604
    }
8605
8606
    /* Outside the allocation guard: a WC_PENDING_E retry must regenerate,
8607
     * not export an ungenerated key. pubKeyLen marks a completed export on
8608
     * every backend; pubSet stops the SW-async retry re-arming forever. */
8609
    if (ret == 0 && key != NULL && kse->pubKeyLen == 0 && !key->pubSet) {
8610
    #ifdef WOLFSSL_STATIC_EPHEMERAL
8611
        ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE25519,
8612
            kse->key);
8613
        if (ret != 0) /* on failure, fallback to local key generation */
8614
    #endif
8615
        {
8616
        #ifdef WOLFSSL_ASYNC_CRYPT
8617
            /* initialize event */
8618
            ret = wolfSSL_AsyncInit(ssl, &key->asyncDev, WC_ASYNC_FLAG_NONE);
8619
            if (ret != 0)
8620
                return ret;
8621
        #endif
8622
            ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
8623
8624
            /* Handle async pending response */
8625
        #ifdef WOLFSSL_ASYNC_CRYPT
8626
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8627
                return wolfSSL_AsyncPush(ssl, &key->asyncDev);
8628
            }
8629
        #endif /* WOLFSSL_ASYNC_CRYPT */
8630
        }
8631
    }
8632
8633
    if (ret == 0 && kse->pubKey == NULL) {
8634
        /* Allocate space for the public key. */
8635
        kse->pubKey = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
8636
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8637
        if (kse->pubKey == NULL) {
8638
            WOLFSSL_MSG("GenX25519Key pub memory error");
8639
            ret = MEMORY_E;
8640
        }
8641
    }
8642
8643
    if (ret == 0) {
8644
        /* Export Curve25519 public key. */
8645
        kse->pubKeyLen = CURVE25519_KEYSIZE;
8646
        if (wc_curve25519_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8647
                                                  EC25519_LITTLE_ENDIAN) != 0) {
8648
            ret = ECC_EXPORT_ERROR;
8649
            WOLFSSL_ERROR_VERBOSE(ret);
8650
        }
8651
        kse->pubKeyLen = CURVE25519_KEYSIZE; /* always CURVE25519_KEYSIZE */
8652
    }
8653
8654
#ifdef WOLFSSL_DEBUG_TLS
8655
    if (ret == 0) {
8656
        WOLFSSL_MSG("Public Curve25519 Key");
8657
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8658
    }
8659
#endif
8660
8661
    if (ret != 0) {
8662
        /* Data owned by key share entry otherwise. */
8663
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8664
        kse->pubKey = NULL;
8665
        if (key != NULL) {
8666
        #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
8667
            if (key->nb_ctx != NULL) {
8668
                XFREE(key->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8669
            }
8670
        #endif
8671
            wc_curve25519_free(key);
8672
        }
8673
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8674
        kse->key = NULL;
8675
    }
8676
#else
8677
0
    (void)ssl;
8678
0
    (void)kse;
8679
8680
0
    ret = NOT_COMPILED_IN;
8681
0
    WOLFSSL_ERROR_VERBOSE(ret);
8682
0
#endif /* HAVE_CURVE25519 */
8683
8684
0
    return ret;
8685
0
}
8686
8687
/* Create a key share entry using X448 parameters group.
8688
 * Generates a key pair.
8689
 *
8690
 * ssl   The SSL/TLS object.
8691
 * kse   The key share entry object.
8692
 * returns 0 on success, otherwise failure.
8693
 */
8694
static int TLSX_KeyShare_GenX448Key(WOLFSSL *ssl, KeyShareEntry* kse)
8695
0
{
8696
0
    int ret = 0;
8697
#ifdef HAVE_CURVE448
8698
    curve448_key* key = (curve448_key*)kse->key;
8699
8700
    if (kse->key == NULL) {
8701
        /* Allocate a Curve448 key to hold private key. */
8702
        kse->key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
8703
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8704
        if (kse->key == NULL) {
8705
            WOLFSSL_MSG("GenX448Key memory error");
8706
            return MEMORY_E;
8707
        }
8708
8709
        /* Make an Curve448 key. */
8710
        ret = wc_curve448_init_ex((curve448_key*)kse->key, ssl->heap,
8711
                                  ssl->devId);
8712
        if (ret == 0) {
8713
            key = (curve448_key*)kse->key;
8714
            kse->keyLen = CURVE448_KEY_SIZE;
8715
8716
            #ifdef WOLFSSL_STATIC_EPHEMERAL
8717
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE448, kse->key);
8718
            if (ret != 0)
8719
        #endif
8720
            {
8721
                ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
8722
            }
8723
        }
8724
    }
8725
8726
    if (ret == 0 && kse->pubKey == NULL) {
8727
        /* Allocate space for the public key. */
8728
        kse->pubKey = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
8729
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8730
        if (kse->pubKey == NULL) {
8731
            WOLFSSL_MSG("GenX448Key pub memory error");
8732
            ret = MEMORY_E;
8733
        }
8734
    }
8735
8736
    if (ret == 0) {
8737
        /* Export Curve448 public key. */
8738
        kse->pubKeyLen = CURVE448_KEY_SIZE;
8739
        if (wc_curve448_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8740
                                                    EC448_LITTLE_ENDIAN) != 0) {
8741
            ret = ECC_EXPORT_ERROR;
8742
        }
8743
        kse->pubKeyLen = CURVE448_KEY_SIZE; /* always CURVE448_KEY_SIZE */
8744
    }
8745
8746
#ifdef WOLFSSL_DEBUG_TLS
8747
    if (ret == 0) {
8748
        WOLFSSL_MSG("Public Curve448 Key");
8749
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8750
    }
8751
#endif
8752
8753
    if (ret != 0) {
8754
        /* Data owned by key share entry otherwise. */
8755
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8756
        kse->pubKey = NULL;
8757
        if (key != NULL)
8758
            wc_curve448_free(key);
8759
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8760
        kse->key = NULL;
8761
    }
8762
#else
8763
0
    (void)ssl;
8764
0
    (void)kse;
8765
8766
0
    ret = NOT_COMPILED_IN;
8767
0
    WOLFSSL_ERROR_VERBOSE(ret);
8768
0
#endif /* HAVE_CURVE448 */
8769
8770
0
    return ret;
8771
0
}
8772
8773
/* Create a key share entry using named elliptic curve parameters group.
8774
 * Generates a key pair.
8775
 *
8776
 * ssl   The SSL/TLS object.
8777
 * kse   The key share entry object.
8778
 * returns 0 on success, otherwise failure.
8779
 */
8780
static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
8781
0
{
8782
0
    int ret = 0;
8783
0
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
8784
0
    word32 keySize = 0;
8785
0
    word16 curveId = (word16) ECC_CURVE_INVALID;
8786
0
    ecc_key* eccKey = (ecc_key*)kse->key;
8787
8788
    /* Translate named group to a curve id. */
8789
0
    switch (kse->group) {
8790
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
8791
0
        #ifndef NO_ECC_SECP
8792
0
        case WOLFSSL_ECC_SECP256R1:
8793
0
            curveId = ECC_SECP256R1;
8794
0
            break;
8795
0
        #endif /* !NO_ECC_SECP */
8796
        #ifdef WOLFSSL_SM2
8797
        case WOLFSSL_ECC_SM2P256V1:
8798
            curveId = ECC_SM2P256V1;
8799
            break;
8800
        #endif /* !WOLFSSL_SM2 */
8801
        #ifdef HAVE_ECC_BRAINPOOL
8802
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
8803
            curveId = ECC_BRAINPOOLP256R1;
8804
            break;
8805
        #endif /* HAVE_ECC_BRAINPOOL */
8806
0
    #endif
8807
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
8808
0
        #ifndef NO_ECC_SECP
8809
0
        case WOLFSSL_ECC_SECP384R1:
8810
0
            curveId = ECC_SECP384R1;
8811
0
            break;
8812
0
        #endif /* !NO_ECC_SECP */
8813
        #ifdef HAVE_ECC_BRAINPOOL
8814
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
8815
            curveId = ECC_BRAINPOOLP384R1;
8816
            break;
8817
        #endif /* HAVE_ECC_BRAINPOOL */
8818
0
    #endif
8819
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
8820
        #ifdef HAVE_ECC_BRAINPOOL
8821
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
8822
            curveId = ECC_BRAINPOOLP512R1;
8823
            break;
8824
        #endif /* HAVE_ECC_BRAINPOOL */
8825
0
    #endif
8826
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
8827
0
        #ifndef NO_ECC_SECP
8828
0
        case WOLFSSL_ECC_SECP521R1:
8829
0
            curveId = ECC_SECP521R1;
8830
0
            break;
8831
0
        #endif /* !NO_ECC_SECP */
8832
0
    #endif
8833
0
        default:
8834
0
            WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
8835
0
            return BAD_FUNC_ARG;
8836
0
    }
8837
8838
0
    {
8839
0
        int size = wc_ecc_get_curve_size_from_id(curveId);
8840
0
        if (size < 0) {
8841
0
            WOLFSSL_ERROR_VERBOSE(size);
8842
0
            return size;
8843
0
        }
8844
0
        keySize = (word32)size;
8845
0
    }
8846
8847
0
    if (kse->key == NULL) {
8848
        /* Allocate an ECC key to hold private key. */
8849
0
        kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC);
8850
0
        if (kse->key == NULL) {
8851
0
            WOLFSSL_MSG_EX("Failed to allocate %d bytes, ssl->heap: %p",
8852
0
                           (int)sizeof(ecc_key), (wc_ptr_t)ssl->heap);
8853
0
            WOLFSSL_MSG("EccTempKey Memory error!");
8854
0
            return MEMORY_E;
8855
0
        }
8856
8857
        /* Initialize an ECC key struct for the ephemeral key */
8858
0
        ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
8859
0
        if (ret == 0) {
8860
            /* setting eccKey means okay to call wc_ecc_free */
8861
0
            eccKey = (ecc_key*)kse->key;
8862
0
        }
8863
8864
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8865
        defined(WC_ASYNC_ENABLE_ECC)
8866
        /* Only set non-blocking context when async device is active. With
8867
         * INVALID_DEVID there is no async loop to retry on FP_WOULDBLOCK, so
8868
         * skip non-blocking setup and use blocking mode instead. */
8869
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
8870
            ecc_nb_ctx_t* eccNbCtx = (ecc_nb_ctx_t*)XMALLOC(
8871
                sizeof(ecc_nb_ctx_t), ssl->heap,
8872
                DYNAMIC_TYPE_TMP_BUFFER);
8873
            if (eccNbCtx == NULL) {
8874
                ret = MEMORY_E;
8875
            }
8876
            else {
8877
                ret = wc_ecc_set_nonblock((ecc_key*)kse->key, eccNbCtx);
8878
                if (ret != 0) {
8879
                    XFREE(eccNbCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8880
                }
8881
            }
8882
        }
8883
    #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8884
              WC_ASYNC_ENABLE_ECC */
8885
0
    }
8886
8887
    /* Outside the allocation guard: a WC_PENDING_E retry must regenerate,
8888
     * not export an ungenerated key. The key type marks completion;
8889
     * kse->pubKey covers backends that never touch the ecc_key (TSIP). */
8890
0
    if (ret == 0 && eccKey != NULL) {
8891
        /* Outside the generation guard below: the export alloc reads
8892
         * pubKeyLen even when generation is skipped. */
8893
0
        kse->keyLen = keySize;
8894
0
        kse->pubKeyLen = keySize * 2 + 1;
8895
0
    }
8896
8897
0
    if (ret == 0 && eccKey != NULL && kse->pubKey == NULL &&
8898
0
            eccKey->type != ECC_PRIVATEKEY &&
8899
0
            eccKey->type != ECC_PRIVATEKEY_ONLY) {
8900
    #if defined(WOLFSSL_RENESAS_TSIP_TLS)
8901
        ret = tsip_Tls13GenEccKeyPair(ssl, kse);
8902
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
8903
            return ret;
8904
        }
8905
    #endif
8906
8907
    #ifdef WOLFSSL_STATIC_EPHEMERAL
8908
        ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_ECDH, kse->key);
8909
        if (ret != 0 || eccKey->dp->id != curveId)
8910
    #endif
8911
0
        {
8912
            /* set curve info for EccMakeKey "peer" info */
8913
0
            ret = wc_ecc_set_curve(eccKey, (int)kse->keyLen, curveId);
8914
0
            if (ret == 0) {
8915
                /* Generate ephemeral ECC key; a crypto callback retry
8916
                 * re-enters here, x963 export follows below. */
8917
0
                ret = EccMakeKey(ssl, eccKey, eccKey);
8918
0
            }
8919
        #ifdef WOLFSSL_ASYNC_CRYPT
8920
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
8921
                return ret;
8922
        #endif
8923
0
        }
8924
0
    }
8925
8926
0
    if (ret == 0 && kse->pubKey == NULL) {
8927
        /* Allocate space for the public key */
8928
0
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8929
0
            DYNAMIC_TYPE_PUBLIC_KEY);
8930
0
        if (kse->pubKey == NULL) {
8931
0
            WOLFSSL_MSG("Key data Memory error");
8932
0
            ret = MEMORY_E;
8933
0
        }
8934
0
    }
8935
8936
0
    if (ret == 0) {
8937
0
        XMEMSET(kse->pubKey, 0, kse->pubKeyLen);
8938
8939
        /* Export public key. */
8940
0
        PRIVATE_KEY_UNLOCK();
8941
0
        if (wc_ecc_export_x963(eccKey, kse->pubKey, &kse->pubKeyLen) != 0) {
8942
0
            ret = ECC_EXPORT_ERROR;
8943
0
            WOLFSSL_ERROR_VERBOSE(ret);
8944
0
        }
8945
0
        PRIVATE_KEY_LOCK();
8946
0
    }
8947
#ifdef WOLFSSL_DEBUG_TLS
8948
    if (ret == 0) {
8949
        WOLFSSL_MSG("Public ECC Key");
8950
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8951
    }
8952
#endif
8953
8954
0
    if (ret != 0) {
8955
        /* Cleanup on error, otherwise data owned by key share entry */
8956
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8957
0
        kse->pubKey = NULL;
8958
0
        if (eccKey != NULL) {
8959
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8960
        defined(WC_ASYNC_ENABLE_ECC)
8961
            if (eccKey->nb_ctx != NULL) {
8962
                XFREE(eccKey->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8963
            }
8964
    #endif
8965
0
            wc_ecc_free(eccKey);
8966
0
        }
8967
0
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8968
0
        kse->key = NULL;
8969
0
    }
8970
#else
8971
    (void)ssl;
8972
    (void)kse;
8973
8974
    ret = NOT_COMPILED_IN;
8975
    WOLFSSL_ERROR_VERBOSE(ret);
8976
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
8977
8978
0
    return ret;
8979
0
}
8980
8981
#ifdef WOLFSSL_HAVE_MLKEM
8982
#if (defined(WOLFSSL_MLKEM_CACHE_A) || \
8983
    (defined(HAVE_PKCS11) && !defined(NO_PKCS11_MLKEM))) && \
8984
    !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY)
8985
    /* Store MlKemKey object rather than private key bytes in key share entry.
8986
     * Improves performance at cost of more dynamic memory being used. */
8987
    #define WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8988
#endif
8989
#if defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY) && \
8990
    defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ)
8991
    #error "Choose WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY or "
8992
           "WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ"
8993
#endif
8994
8995
#if (!defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
8996
     !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)) || \
8997
    !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) || \
8998
    (!defined(WOLFSSL_MLKEM_NO_DECAPSULATE) && \
8999
     !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ))
9000
static int mlkem_id2type(int id, int *type)
9001
0
{
9002
0
    int ret = 0;
9003
9004
0
    switch (id) {
9005
0
#ifndef WOLFSSL_NO_ML_KEM
9006
0
    #ifndef WOLFSSL_NO_ML_KEM_512
9007
0
        case WOLFSSL_ML_KEM_512:
9008
0
            *type = WC_ML_KEM_512;
9009
0
            break;
9010
0
    #endif
9011
0
    #ifndef WOLFSSL_NO_ML_KEM_768
9012
0
        case WOLFSSL_ML_KEM_768:
9013
0
            *type = WC_ML_KEM_768;
9014
0
            break;
9015
0
    #endif
9016
0
    #ifndef WOLFSSL_NO_ML_KEM_1024
9017
0
        case WOLFSSL_ML_KEM_1024:
9018
0
            *type = WC_ML_KEM_1024;
9019
0
            break;
9020
0
    #endif
9021
0
#endif
9022
#ifdef WOLFSSL_MLKEM_KYBER
9023
    #ifdef WOLFSSL_KYBER512
9024
        case WOLFSSL_KYBER_LEVEL1:
9025
            *type = KYBER512;
9026
            break;
9027
    #endif
9028
    #ifdef WOLFSSL_KYBER768
9029
        case WOLFSSL_KYBER_LEVEL3:
9030
            *type = KYBER768;
9031
            break;
9032
    #endif
9033
    #ifdef WOLFSSL_KYBER1024
9034
        case WOLFSSL_KYBER_LEVEL5:
9035
            *type = KYBER1024;
9036
            break;
9037
    #endif
9038
#endif
9039
0
        default:
9040
0
            ret = NOT_COMPILED_IN;
9041
0
            break;
9042
0
    }
9043
9044
0
    return ret;
9045
0
}
9046
#endif
9047
9048
#if defined(WOLFSSL_NO_ML_KEM_768) && defined(WOLFSSL_NO_ML_KEM_1024) && \
9049
    defined(WOLFSSL_PQC_HYBRIDS)
9050
    #error "PQC hybrid combinations require either ML-KEM 768 or ML-KEM 1024"
9051
#endif
9052
9053
/* Structures and objects needed for hybrid key exchanges using both classic
9054
 * ECDHE and PQC KEM key material. */
9055
typedef struct PqcHybridMapping {
9056
    int hybrid;
9057
    int ecc;
9058
    int pqc;
9059
    int pqc_first;
9060
} PqcHybridMapping;
9061
9062
static const PqcHybridMapping pqc_hybrid_mapping[] = {
9063
#ifndef WOLFSSL_NO_ML_KEM
9064
#ifdef WOLFSSL_PQC_HYBRIDS
9065
    {WOLFSSL_SECP256R1MLKEM768, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_768, 0},
9066
    {WOLFSSL_SECP384R1MLKEM1024, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_1024, 0},
9067
#endif /* WOLFSSL_PQC_HYBRIDS */
9068
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
9069
    {WOLFSSL_SECP256R1MLKEM512, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
9070
    {WOLFSSL_SECP384R1MLKEM768, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
9071
    {WOLFSSL_SECP521R1MLKEM1024, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
9072
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
9073
    {WOLFSSL_P256_ML_KEM_512_OLD, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
9074
    {WOLFSSL_P384_ML_KEM_768_OLD, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
9075
    {WOLFSSL_P521_ML_KEM_1024_OLD, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
9076
#endif /* WOLFSSL_ML_KEM_USE_OLD_IDS */
9077
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
9078
#ifdef HAVE_CURVE25519
9079
#ifdef WOLFSSL_PQC_HYBRIDS
9080
    {WOLFSSL_X25519MLKEM768, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_768, 1},
9081
#endif /* WOLFSSL_PQC_HYBRIDS */
9082
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
9083
    {WOLFSSL_X25519MLKEM512, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_512, 1},
9084
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
9085
#endif /* HAVE_CURVE25519 */
9086
#ifdef HAVE_CURVE448
9087
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
9088
    {WOLFSSL_X448MLKEM768, WOLFSSL_ECC_X448, WOLFSSL_ML_KEM_768, 1},
9089
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
9090
#endif /* HAVE_CURVE448 */
9091
#endif /* WOLFSSL_NO_ML_KEM */
9092
#ifdef WOLFSSL_MLKEM_KYBER
9093
    {WOLFSSL_P256_KYBER_LEVEL1, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL1, 0},
9094
    {WOLFSSL_P384_KYBER_LEVEL3, WOLFSSL_ECC_SECP384R1, WOLFSSL_KYBER_LEVEL3, 0},
9095
    {WOLFSSL_P256_KYBER_LEVEL3, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL3, 0},
9096
    {WOLFSSL_P521_KYBER_LEVEL5, WOLFSSL_ECC_SECP521R1, WOLFSSL_KYBER_LEVEL5, 0},
9097
#ifdef HAVE_CURVE25519
9098
    {WOLFSSL_X25519_KYBER_LEVEL1, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL1, 0},
9099
    {WOLFSSL_X25519_KYBER_LEVEL3, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL3, 0},
9100
#endif
9101
#ifdef HAVE_CURVE448
9102
    {WOLFSSL_X448_KYBER_LEVEL3, WOLFSSL_ECC_X448, WOLFSSL_KYBER_LEVEL3, 0},
9103
#endif
9104
#endif /* WOLFSSL_MLKEM_KYBER */
9105
    {0, 0, 0, 0}
9106
};
9107
9108
/* Map an ecc-pqc hybrid group into its ecc group and pqc kem group. */
9109
static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group)
9110
0
{
9111
0
    int i;
9112
9113
0
    if (pqc != NULL)
9114
0
        *pqc = 0;
9115
0
    if (ecc != NULL)
9116
0
        *ecc = 0;
9117
0
    if (pqc_first != NULL)
9118
0
        *pqc_first = 0;
9119
9120
0
    for (i = 0; pqc_hybrid_mapping[i].hybrid != 0; i++) {
9121
0
        if (pqc_hybrid_mapping[i].hybrid == group) {
9122
0
            if (pqc != NULL)
9123
0
                *pqc = pqc_hybrid_mapping[i].pqc;
9124
0
            if (ecc != NULL)
9125
0
                *ecc = pqc_hybrid_mapping[i].ecc;
9126
0
            if (pqc_first != NULL)
9127
0
                *pqc_first = pqc_hybrid_mapping[i].pqc_first;
9128
0
            break;
9129
0
        }
9130
0
    }
9131
0
}
9132
9133
#if !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
9134
    !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9135
/* Create a key share entry using pqc parameters group on the client side.
9136
 * Generates a key pair.
9137
 *
9138
 * ssl   The SSL/TLS object.
9139
 * kse   The key share entry object.
9140
 * returns 0 on success, otherwise failure.
9141
 */
9142
static int TLSX_KeyShare_GenPqcKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
9143
0
{
9144
0
    int ret = 0;
9145
0
    int type = 0;
9146
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9147
0
        WC_DECLARE_VAR(kem, MlKemKey, 1, 0);
9148
0
    byte* privKey = NULL;
9149
0
    word32 privSz = 0;
9150
#else
9151
    MlKemKey* kem = NULL;
9152
#endif
9153
9154
    /* This gets called twice. Once during parsing of the key share and once
9155
     * during the population of the extension. No need to do work the second
9156
     * time. Just return success if its already been done. */
9157
0
    if (kse->pubKey != NULL) {
9158
0
        return ret;
9159
0
    }
9160
9161
    /* Get the type of key we need from the key share group. */
9162
0
    ret = mlkem_id2type(kse->group, &type);
9163
0
    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
9164
0
        WOLFSSL_MSG("Invalid ML-KEM algorithm specified.");
9165
0
        ret = BAD_FUNC_ARG;
9166
0
    }
9167
9168
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9169
9170
    #ifdef WOLFSSL_SMALL_STACK
9171
    if (ret == 0) {
9172
        kem = (MlKemKey *)XMALLOC(sizeof(*kem), ssl->heap,
9173
                                  DYNAMIC_TYPE_PRIVATE_KEY);
9174
        if (kem == NULL) {
9175
            WOLFSSL_MSG("KEM memory allocation failure");
9176
            ret = MEMORY_ERROR;
9177
        }
9178
    }
9179
    #endif /* WOLFSSL_SMALL_STACK */
9180
9181
0
    if (ret == 0) {
9182
0
        ret = wc_MlKemKey_Init(kem, type, ssl->heap, ssl->devId);
9183
0
        if (ret != 0) {
9184
0
            WOLFSSL_MSG("Failed to initialize ML-KEM Key.");
9185
0
        }
9186
0
    }
9187
9188
0
    if (ret == 0) {
9189
0
        ret = wc_MlKemKey_PrivateKeySize(kem, &privSz);
9190
0
    }
9191
0
    if (ret == 0) {
9192
0
        ret = wc_MlKemKey_PublicKeySize(kem, &kse->pubKeyLen);
9193
0
    }
9194
9195
0
    if (ret == 0) {
9196
0
        privKey = (byte*)XMALLOC(privSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9197
0
        if (privKey == NULL) {
9198
0
            WOLFSSL_MSG("privkey memory allocation failure");
9199
0
            ret = MEMORY_ERROR;
9200
0
        }
9201
0
    }
9202
#else
9203
    if (ret == 0) {
9204
        /* Allocate an ML-KEM key to hold private key. */
9205
        kem = (MlKemKey*)XMALLOC(sizeof(MlKemKey), ssl->heap,
9206
                                 DYNAMIC_TYPE_PRIVATE_KEY);
9207
        if (kem == NULL) {
9208
            WOLFSSL_MSG("KEM memory allocation failure");
9209
            ret = MEMORY_ERROR;
9210
        }
9211
    }
9212
    if (ret == 0) {
9213
        ret = wc_MlKemKey_Init(kem, type, ssl->heap, ssl->devId);
9214
        if (ret != 0) {
9215
            WOLFSSL_MSG("Failed to initialize ML-KEM Key.");
9216
        }
9217
    }
9218
    if (ret == 0) {
9219
        ret = wc_MlKemKey_PublicKeySize(kem, &kse->pubKeyLen);
9220
    }
9221
#endif
9222
9223
0
    if (ret == 0) {
9224
0
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
9225
0
                                     DYNAMIC_TYPE_PUBLIC_KEY);
9226
0
        if (kse->pubKey == NULL) {
9227
0
            WOLFSSL_MSG("pubkey memory allocation failure");
9228
0
            ret = MEMORY_ERROR;
9229
0
        }
9230
0
    }
9231
9232
0
    if (ret == 0) {
9233
0
        ret = wc_MlKemKey_MakeKey(kem, ssl->rng);
9234
0
        if (ret != 0) {
9235
0
            WOLFSSL_MSG("ML-KEM keygen failure");
9236
0
        }
9237
0
    }
9238
0
    if (ret == 0) {
9239
0
        ret = wc_MlKemKey_EncodePublicKey(kem, kse->pubKey,
9240
0
                                          kse->pubKeyLen);
9241
0
    }
9242
9243
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9244
0
    if (ret == 0) {
9245
0
        PRIVATE_KEY_UNLOCK();
9246
0
        ret = wc_MlKemKey_EncodePrivateKey(kem, privKey, privSz);
9247
0
        PRIVATE_KEY_LOCK();
9248
0
    }
9249
0
#endif
9250
9251
#ifdef WOLFSSL_DEBUG_TLS
9252
    WOLFSSL_MSG("Public ML-KEM Key");
9253
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
9254
#endif
9255
9256
0
    if (ret != 0) {
9257
        /* Data owned by key share entry otherwise. */
9258
0
        wc_MlKemKey_Free(kem);
9259
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9260
0
        kse->pubKey = NULL;
9261
0
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9262
0
        if (privKey) {
9263
0
            ForceZero(privKey, privSz);
9264
0
            XFREE(privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9265
0
            privKey = NULL;
9266
0
        }
9267
    #else
9268
        XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9269
        kse->key = NULL;
9270
    #endif
9271
0
    }
9272
0
    else {
9273
0
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9274
0
        wc_MlKemKey_Free(kem);
9275
0
        kse->privKey = (byte*)privKey;
9276
0
        kse->privKeyLen = privSz;
9277
    #else
9278
        kse->key = kem;
9279
    #endif
9280
0
    }
9281
9282
    #if !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ) && \
9283
        defined(WOLFSSL_SMALL_STACK)
9284
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9285
    #endif
9286
9287
0
    return ret;
9288
0
}
9289
9290
/* Create a key share entry using both ecdhe and pqc parameters groups.
9291
 * Generates two key pairs on the client side.
9292
 *
9293
 * ssl   The SSL/TLS object.
9294
 * kse   The key share entry object.
9295
 * returns 0 on success, otherwise failure.
9296
 */
9297
static int TLSX_KeyShare_GenPqcHybridKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
9298
0
{
9299
0
    int ret = 0;
9300
0
    KeyShareEntry *ecc_kse = NULL;
9301
0
    KeyShareEntry *pqc_kse = NULL;
9302
0
    int pqc_group = 0;
9303
0
    int ecc_group = 0;
9304
0
    int pqc_first = 0;
9305
9306
    /* This gets called twice. Once during parsing of the key share and once
9307
     * during the population of the extension. No need to do work the second
9308
     * time. Just return success if its already been done. */
9309
0
    if (kse->pubKey != NULL) {
9310
0
        return ret;
9311
0
    }
9312
9313
    /* Determine the ECC and PQC group of the hybrid combination */
9314
0
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, kse->group);
9315
0
    if (ecc_group == 0 || pqc_group == 0) {
9316
0
        WOLFSSL_MSG("Invalid hybrid group");
9317
0
        ret = BAD_FUNC_ARG;
9318
0
    }
9319
9320
0
    if (ret == 0) {
9321
0
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
9322
0
                   DYNAMIC_TYPE_TLSX);
9323
0
        if (ecc_kse == NULL) {
9324
0
            WOLFSSL_MSG("kse memory allocation failure");
9325
0
            ret = MEMORY_ERROR;
9326
0
        }
9327
0
        else {
9328
0
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
9329
0
        }
9330
0
    }
9331
0
    if (ret == 0) {
9332
0
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
9333
0
                   DYNAMIC_TYPE_TLSX);
9334
0
        if (pqc_kse == NULL) {
9335
0
            WOLFSSL_MSG("kse memory allocation failure");
9336
0
            ret = MEMORY_ERROR;
9337
0
        }
9338
0
        else {
9339
0
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
9340
0
        }
9341
0
    }
9342
9343
    /* Generate ECC key share part */
9344
0
    if (ret == 0) {
9345
0
        ecc_kse->group = ecc_group;
9346
9347
    #ifdef WOLFSSL_ASYNC_CRYPT
9348
        /* Check if the provided kse already contains an ECC key and the
9349
         * last error was WC_PENDING_E. In this case, we already tried to
9350
         * generate an ECC key. Hence, we have to restore it. */
9351
        if (kse->key != NULL && kse->keyLen > 0 &&
9352
            kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9353
            ecc_kse->key = kse->key;
9354
            ecc_kse->keyLen = kse->keyLen;
9355
            ecc_kse->pubKeyLen = kse->pubKeyLen;
9356
            ecc_kse->lastRet = kse->lastRet;
9357
            kse->key = NULL;
9358
        }
9359
    #endif
9360
9361
    #ifdef HAVE_CURVE25519
9362
        if (ecc_group == WOLFSSL_ECC_X25519) {
9363
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
9364
        }
9365
        else
9366
    #endif
9367
    #ifdef HAVE_CURVE448
9368
        if (ecc_group == WOLFSSL_ECC_X448) {
9369
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
9370
        }
9371
        else
9372
    #endif
9373
0
        {
9374
0
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
9375
0
        }
9376
9377
    #ifdef WOLFSSL_ASYNC_CRYPT
9378
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9379
            /* Store the generated ECC key in the provided kse to later
9380
             * restore it.*/
9381
            kse->key = ecc_kse->key;
9382
            kse->keyLen = ecc_kse->keyLen;
9383
            kse->pubKeyLen = ecc_kse->pubKeyLen;
9384
            ecc_kse->key = NULL;
9385
        }
9386
    #endif
9387
0
    }
9388
9389
    /* Generate PQC key share part */
9390
0
    if (ret == 0) {
9391
0
        pqc_kse->group = pqc_group;
9392
0
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, pqc_kse);
9393
        /* No error message, TLSX_KeyShare_GenPqcKeyClient will do it. */
9394
0
    }
9395
9396
    /* Allocate memory for combined public key */
9397
0
    if (ret == 0) {
9398
0
        kse->pubKey = (byte*)XMALLOC(ecc_kse->pubKeyLen + pqc_kse->pubKeyLen,
9399
0
                                     ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9400
0
        if (kse->pubKey == NULL) {
9401
0
            WOLFSSL_MSG("pubkey memory allocation failure");
9402
0
            ret = MEMORY_ERROR;
9403
0
        }
9404
0
    }
9405
9406
    /* Create combined public key. The order of classic/pqc key material is
9407
     * indicated by the pqc_first variable. */
9408
0
    if (ret == 0) {
9409
0
        if (pqc_first) {
9410
0
            XMEMCPY(kse->pubKey, pqc_kse->pubKey, pqc_kse->pubKeyLen);
9411
0
            XMEMCPY(kse->pubKey + pqc_kse->pubKeyLen, ecc_kse->pubKey,
9412
0
                    ecc_kse->pubKeyLen);
9413
0
        }
9414
0
        else {
9415
0
            XMEMCPY(kse->pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen);
9416
0
            XMEMCPY(kse->pubKey + ecc_kse->pubKeyLen, pqc_kse->pubKey,
9417
0
                    pqc_kse->pubKeyLen);
9418
0
        }
9419
0
        kse->pubKeyLen = ecc_kse->pubKeyLen + pqc_kse->pubKeyLen;
9420
0
    }
9421
9422
    /* Store the private keys.
9423
     * Note we are saving the PQC private key and ECC private key
9424
     * separately. That's because the ECC private key is not simply a
9425
     * buffer. Its is an ecc_key struct. */
9426
0
    if (ret == 0) {
9427
0
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9428
        /* PQC private key is an encoded byte array */
9429
0
        kse->privKey = pqc_kse->privKey;
9430
0
        kse->privKeyLen = pqc_kse->privKeyLen;
9431
0
        pqc_kse->privKey = NULL;
9432
    #else
9433
        /* PQC private key is a pointer to MlKemKey object */
9434
        kse->privKey = (byte*)pqc_kse->key;
9435
        kse->privKeyLen = 0;
9436
        pqc_kse->key = NULL;
9437
    #endif
9438
        /* ECC private key is a pointer to ecc_key object */
9439
0
        kse->key = ecc_kse->key;
9440
0
        kse->keyLen = ecc_kse->keyLen;
9441
0
        ecc_kse->key = NULL;
9442
0
    }
9443
9444
#ifdef WOLFSSL_DEBUG_TLS
9445
    WOLFSSL_MSG("Public ML-KEM Key");
9446
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
9447
#endif
9448
9449
0
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
9450
0
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
9451
9452
0
    return ret;
9453
0
}
9454
#endif /* !WOLFSSL_MLKEM_NO_MAKE_KEY && !WOLFSSL_MLKEM_NO_DECAPSULATE */
9455
#endif /* WOLFSSL_HAVE_MLKEM */
9456
9457
/* Generate a secret/key using the key share entry.
9458
 *
9459
 * ssl  The SSL/TLS object.
9460
 * kse  The key share entry holding peer data.
9461
 */
9462
int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
9463
0
{
9464
0
    int ret;
9465
    /* Named FFDHE groups have a bit set to identify them. */
9466
0
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(kse->group))
9467
0
        ret = TLSX_KeyShare_GenDhKey(ssl, kse);
9468
0
    else if (kse->group == WOLFSSL_ECC_X25519)
9469
0
        ret = TLSX_KeyShare_GenX25519Key(ssl, kse);
9470
0
    else if (kse->group == WOLFSSL_ECC_X448)
9471
0
        ret = TLSX_KeyShare_GenX448Key(ssl, kse);
9472
0
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
9473
0
    !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9474
0
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group))
9475
0
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, kse);
9476
0
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(kse->group))
9477
0
        ret = TLSX_KeyShare_GenPqcHybridKeyClient(ssl, kse);
9478
0
#endif
9479
0
    else
9480
0
        ret = TLSX_KeyShare_GenEccKey(ssl, kse);
9481
#ifdef WOLFSSL_ASYNC_CRYPT
9482
    kse->lastRet = ret;
9483
#endif
9484
0
    return ret;
9485
0
}
9486
9487
/* Free the key share dynamic data.
9488
 *
9489
 * list  The linked list of key share entry objects.
9490
 * heap  The heap used for allocation.
9491
 */
9492
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
9493
0
{
9494
0
    KeyShareEntry* current;
9495
9496
0
    while ((current = list) != NULL) {
9497
0
        list = current->next;
9498
0
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(current->group)) {
9499
0
#ifndef NO_DH
9500
        #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9501
            defined(WC_ASYNC_ENABLE_DH)
9502
            if (current->key != NULL &&
9503
                    ((DhKey*)current->key)->nb != NULL) {
9504
                XFREE(((DhKey*)current->key)->nb, heap,
9505
                    DYNAMIC_TYPE_TMP_BUFFER);
9506
                ((DhKey*)current->key)->nb = NULL;
9507
            }
9508
        #endif
9509
0
            wc_FreeDhKey((DhKey*)current->key);
9510
0
            if (current->privKey != NULL && current->privKeyLen > 0) {
9511
0
                ForceZero(current->privKey, current->privKeyLen);
9512
0
            }
9513
0
#endif
9514
0
        }
9515
0
        else if (current->group == WOLFSSL_ECC_X25519) {
9516
#ifdef HAVE_CURVE25519
9517
        #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
9518
            if (current->key != NULL &&
9519
                    ((curve25519_key*)current->key)->nb_ctx != NULL) {
9520
                XFREE(((curve25519_key*)current->key)->nb_ctx, heap,
9521
                    DYNAMIC_TYPE_TMP_BUFFER);
9522
            }
9523
        #endif
9524
            wc_curve25519_free((curve25519_key*)current->key);
9525
#endif
9526
0
        }
9527
0
        else if (current->group == WOLFSSL_ECC_X448) {
9528
#ifdef HAVE_CURVE448
9529
            wc_curve448_free((curve448_key*)current->key);
9530
#endif
9531
0
        }
9532
0
        else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
9533
0
#ifdef WOLFSSL_HAVE_MLKEM
9534
0
            wc_MlKemKey_Free((MlKemKey*)current->key);
9535
0
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9536
0
            if (current->privKey != NULL) {
9537
0
                ForceZero(current->privKey, current->privKeyLen);
9538
0
            }
9539
0
        #endif
9540
0
#endif
9541
0
        }
9542
0
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
9543
0
#ifdef WOLFSSL_HAVE_MLKEM
9544
0
            int ecc_group = 0;
9545
0
            findEccPqc(&ecc_group, NULL, NULL, current->group);
9546
9547
            /* Free PQC private key */
9548
        #ifdef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9549
            wc_MlKemKey_Free((MlKemKey*)current->privKey);
9550
        #else
9551
0
            if (current->privKey != NULL) {
9552
0
                ForceZero(current->privKey, current->privKeyLen);
9553
0
            }
9554
0
        #endif
9555
9556
            /* Free ECC private key */
9557
0
            if (ecc_group == WOLFSSL_ECC_X25519) {
9558
            #ifdef HAVE_CURVE25519
9559
                wc_curve25519_free((curve25519_key*)current->key);
9560
            #endif
9561
0
            }
9562
0
            else if (ecc_group == WOLFSSL_ECC_X448) {
9563
            #ifdef HAVE_CURVE448
9564
                wc_curve448_free((curve448_key*)current->key);
9565
            #endif
9566
0
            }
9567
0
            else {
9568
0
            #ifdef HAVE_ECC
9569
                #if defined(WC_ECC_NONBLOCK) && \
9570
                    defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9571
                    defined(WC_ASYNC_ENABLE_ECC)
9572
                if (current->key != NULL &&
9573
                        ((ecc_key*)current->key)->nb_ctx != NULL) {
9574
                    XFREE(((ecc_key*)current->key)->nb_ctx, heap,
9575
                        DYNAMIC_TYPE_TMP_BUFFER);
9576
                }
9577
                #endif
9578
0
                wc_ecc_free((ecc_key*)current->key);
9579
0
            #endif
9580
0
            }
9581
0
#endif
9582
0
        }
9583
0
        else {
9584
0
#ifdef HAVE_ECC
9585
        #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9586
            defined(WC_ASYNC_ENABLE_ECC)
9587
            if (current->key != NULL &&
9588
                    ((ecc_key*)current->key)->nb_ctx != NULL) {
9589
                XFREE(((ecc_key*)current->key)->nb_ctx, heap,
9590
                    DYNAMIC_TYPE_TMP_BUFFER);
9591
            }
9592
        #endif
9593
0
            wc_ecc_free((ecc_key*)current->key);
9594
0
#endif
9595
0
        }
9596
0
        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
9597
0
    #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
9598
0
        XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY);
9599
0
    #endif
9600
0
        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
9601
0
        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
9602
0
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
9603
0
    }
9604
9605
0
    (void)heap;
9606
0
}
9607
9608
/* Get the size of the encoded key share extension.
9609
 *
9610
 * list     The linked list of key share extensions.
9611
 * msgType  The type of the message this extension is being written into.
9612
 * returns the number of bytes of the encoded key share extension.
9613
 */
9614
static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
9615
0
{
9616
0
    word16         len = 0;
9617
0
    byte           isRequest = (msgType == client_hello);
9618
0
    KeyShareEntry* current;
9619
9620
    /* The named group the server wants to use. */
9621
0
    if (msgType == hello_retry_request)
9622
0
        return OPAQUE16_LEN;
9623
9624
    /* List of key exchange groups. */
9625
0
    if (isRequest)
9626
0
        len += OPAQUE16_LEN;
9627
0
    while ((current = list) != NULL) {
9628
0
        list = current->next;
9629
9630
0
        if (!isRequest && current->pubKey == NULL)
9631
0
            continue;
9632
9633
0
        len += (word16)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
9634
0
    }
9635
9636
0
    return len;
9637
0
}
9638
9639
/* Writes the key share extension into the output buffer.
9640
 * Assumes that the the output buffer is big enough to hold data.
9641
 *
9642
 * list     The linked list of key share entries.
9643
 * output   The buffer to write into.
9644
 * msgType  The type of the message this extension is being written into.
9645
 * returns the number of bytes written into the buffer.
9646
 */
9647
static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
9648
                                  byte msgType)
9649
0
{
9650
0
    word16         i = 0;
9651
0
    byte           isRequest = (msgType == client_hello);
9652
0
    KeyShareEntry* current;
9653
9654
0
    if (msgType == hello_retry_request) {
9655
0
        c16toa(list->group, output);
9656
0
        return OPAQUE16_LEN;
9657
0
    }
9658
9659
    /* ClientHello has a list but ServerHello is only the chosen. */
9660
0
    if (isRequest)
9661
0
        i += OPAQUE16_LEN;
9662
9663
    /* Write out all in the list. */
9664
0
    while ((current = list) != NULL) {
9665
0
        list = current->next;
9666
9667
0
        if (!isRequest && current->pubKey == NULL)
9668
0
            continue;
9669
9670
0
        c16toa(current->group, &output[i]);
9671
0
        i += KE_GROUP_LEN;
9672
0
        c16toa((word16)(current->pubKeyLen), &output[i]);
9673
0
        i += OPAQUE16_LEN;
9674
0
        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
9675
0
        i += (word16)current->pubKeyLen;
9676
0
    }
9677
    /* Write the length of the list if required. */
9678
0
    if (isRequest)
9679
0
        c16toa(i - OPAQUE16_LEN, output);
9680
9681
0
    return i;
9682
0
}
9683
9684
/* Process the DH key share extension on the client side.
9685
 *
9686
 * ssl            The SSL/TLS object.
9687
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9688
 * returns 0 on success and other values indicate failure.
9689
 */
9690
static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9691
0
{
9692
0
    int ret = 0;
9693
0
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
9694
0
    word32 pSz = 0;
9695
0
    DhKey* dhKey = (DhKey*)keyShareEntry->key;
9696
9697
0
#ifdef HAVE_PUBLIC_FFDHE
9698
0
    const DhParams* params = NULL;
9699
0
    switch (keyShareEntry->group) {
9700
0
    #ifdef HAVE_FFDHE_2048
9701
0
        case WOLFSSL_FFDHE_2048:
9702
0
            params = wc_Dh_ffdhe2048_Get();
9703
0
            break;
9704
0
    #endif
9705
    #ifdef HAVE_FFDHE_3072
9706
        case WOLFSSL_FFDHE_3072:
9707
            params = wc_Dh_ffdhe3072_Get();
9708
            break;
9709
    #endif
9710
    #ifdef HAVE_FFDHE_4096
9711
        case WOLFSSL_FFDHE_4096:
9712
            params = wc_Dh_ffdhe4096_Get();
9713
            break;
9714
    #endif
9715
    #ifdef HAVE_FFDHE_6144
9716
        case WOLFSSL_FFDHE_6144:
9717
            params = wc_Dh_ffdhe6144_Get();
9718
            break;
9719
    #endif
9720
    #ifdef HAVE_FFDHE_8192
9721
        case WOLFSSL_FFDHE_8192:
9722
            params = wc_Dh_ffdhe8192_Get();
9723
            break;
9724
    #endif
9725
0
        default:
9726
0
            break;
9727
0
    }
9728
0
    if (params == NULL) {
9729
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9730
0
        return PEER_KEY_ERROR;
9731
0
    }
9732
0
    pSz = params->p_len;
9733
#else
9734
    ret = wc_DhGetNamedKeyParamSize(keyShareEntry->group, &pSz, NULL, NULL);
9735
    if (ret != 0 || pSz == 0) {
9736
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9737
        return PEER_KEY_ERROR;
9738
    }
9739
#endif
9740
9741
    /* RFC 8446 Section 4.2.8.1: FFDHE key_exchange values are left-padded with
9742
     * zeros to the size of the named-group prime. Reject any peer key share
9743
     * whose byte length does not match the expected prime size. */
9744
0
    if (keyShareEntry->keLen != pSz) {
9745
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9746
0
        return PEER_KEY_ERROR;
9747
0
    }
9748
9749
    /* DhAgree() writes the whole prime and takes no capacity, so refuse here
9750
     * rather than truncate later. Not reachable today: MAX_PREMASTER_SZ
9751
     * covers every group compiled in. */
9752
0
    if (pSz > MAX_PREMASTER_SZ) {
9753
0
        WOLFSSL_MSG("FFDHE group larger than the pre-master secret buffer");
9754
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9755
0
        return PEER_KEY_ERROR;
9756
0
    }
9757
9758
    /* if DhKey is not setup, do it now */
9759
0
    if (keyShareEntry->key == NULL) {
9760
0
        keyShareEntry->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
9761
0
            DYNAMIC_TYPE_DH);
9762
0
        if (keyShareEntry->key == NULL)
9763
0
            return MEMORY_E;
9764
9765
        /* Setup Key */
9766
0
        ret = wc_InitDhKey_ex((DhKey*)keyShareEntry->key, ssl->heap, ssl->devId);
9767
0
#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(7,0,0)
9768
0
        if (ret != 0) {
9769
0
            XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
9770
0
            keyShareEntry->key = NULL;
9771
0
            return ret;
9772
0
        }
9773
0
#endif
9774
0
        if (ret == 0) {
9775
0
            dhKey = (DhKey*)keyShareEntry->key;
9776
        /* Set key */
9777
0
        #ifdef HAVE_PUBLIC_FFDHE
9778
0
            ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
9779
0
                                                                params->g_len);
9780
        #else
9781
            ret = wc_DhSetNamedKey(dhKey, keyShareEntry->group);
9782
        #endif
9783
0
        }
9784
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9785
        defined(WC_ASYNC_ENABLE_DH)
9786
        /* Only set non-blocking context when async device is active. With
9787
         * INVALID_DEVID there is no async loop to retry on MP_WOULDBLOCK, so
9788
         * skip non-blocking setup and use blocking mode instead. */
9789
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
9790
            DhNb* dhNb = (DhNb*)XMALLOC(sizeof(DhNb), ssl->heap,
9791
                                        DYNAMIC_TYPE_TMP_BUFFER);
9792
            if (dhNb == NULL) {
9793
                ret = MEMORY_E;
9794
            }
9795
            else {
9796
                ret = wc_DhSetNonBlock((DhKey*)keyShareEntry->key, dhNb);
9797
                if (ret != 0) {
9798
                    XFREE(dhNb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9799
                }
9800
            }
9801
        }
9802
    #endif /* WC_DH_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
9803
              WC_ASYNC_ENABLE_DH */
9804
0
    }
9805
9806
0
    if (ret == 0
9807
    #ifdef WOLFSSL_ASYNC_CRYPT
9808
        && keyShareEntry->lastRet == 0 /* don't enter here if WC_PENDING_E */
9809
    #endif
9810
0
    ) {
9811
    #ifdef WOLFSSL_DEBUG_TLS
9812
        WOLFSSL_MSG("Peer DH Key");
9813
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9814
    #endif
9815
9816
0
        ssl->options.dhKeySz = (word16)pSz;
9817
9818
        /* Derive secret from private key and peer's public key. */
9819
0
        ret = DhAgree(ssl, dhKey,
9820
0
            (const byte*)keyShareEntry->privKey, keyShareEntry->keyLen, /* our private */
9821
0
            keyShareEntry->ke, keyShareEntry->keLen,                    /* peer's public key */
9822
0
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,    /* secret */
9823
0
            NULL, 0
9824
0
        );
9825
    #ifdef WOLFSSL_ASYNC_CRYPT
9826
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9827
            return ret;
9828
        }
9829
    #endif
9830
0
    }
9831
9832
    /* RFC 8446 Section 7.4.1:
9833
     *     ... left-padded with zeros up to the size of the prime. ...
9834
     */
9835
0
    if (ret == 0 && (word32)ssl->options.dhKeySz > ssl->arrays->preMasterSz) {
9836
0
        word32 diff = (word32)ssl->options.dhKeySz - ssl->arrays->preMasterSz;
9837
0
        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
9838
0
                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9839
0
        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
9840
0
        ssl->arrays->preMasterSz = ssl->options.dhKeySz;
9841
0
    }
9842
9843
    /* done with key share, release resources */
9844
0
    if (dhKey) {
9845
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9846
        defined(WC_ASYNC_ENABLE_DH)
9847
        if (dhKey->nb != NULL) {
9848
            XFREE(dhKey->nb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9849
            dhKey->nb = NULL;
9850
        }
9851
    #endif
9852
0
        wc_FreeDhKey(dhKey);
9853
0
    }
9854
0
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
9855
0
    keyShareEntry->key = NULL;
9856
0
    if (keyShareEntry->privKey) {
9857
0
        ForceZero(keyShareEntry->privKey, keyShareEntry->keyLen);
9858
0
        XFREE(keyShareEntry->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9859
0
        keyShareEntry->privKey = NULL;
9860
0
    }
9861
0
    XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9862
0
    keyShareEntry->pubKey = NULL;
9863
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9864
0
    keyShareEntry->ke = NULL;
9865
#else
9866
    (void)ssl;
9867
    (void)keyShareEntry;
9868
    ret = PEER_KEY_ERROR;
9869
    WOLFSSL_ERROR_VERBOSE(ret);
9870
#endif
9871
0
    return ret;
9872
0
}
9873
9874
/* Process the X25519 key share extension on the client side.
9875
 *
9876
 * ssl            The SSL/TLS object.
9877
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9878
 * ssOutput       The destination buffer for the shared secret.
9879
 * ssOutSz        The size of the generated shared secret.
9880
 *
9881
 * returns 0 on success and other values indicate failure.
9882
 */
9883
static int TLSX_KeyShare_ProcessX25519_ex(WOLFSSL* ssl,
9884
                                          KeyShareEntry* keyShareEntry,
9885
                                          unsigned char* ssOutput,
9886
                                          word32* ssOutSz)
9887
0
{
9888
0
    int ret = 0;
9889
9890
#ifdef HAVE_CURVE25519
9891
    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
9892
    const byte* peerPub = keyShareEntry->ke;
9893
    word32 peerPubLen = keyShareEntry->keLen;
9894
#ifndef WOLFSSL_X25519_NO_MASK_PEER
9895
    byte maskedPub[CURVE25519_KEYSIZE];
9896
#endif
9897
9898
#ifdef WOLFSSL_ASYNC_CRYPT
9899
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9900
#endif
9901
    {
9902
    #ifdef HAVE_ECC
9903
        /* A reused WOLFSSL may already carry a retained peer key. FreeKey()
9904
         * rather than wc_ecc_free(), which leaves the allocation behind. */
9905
        FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
9906
        ssl->peerEccKeyPresent = 0;
9907
    #endif
9908
9909
        FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, (void**)&ssl->peerX25519Key);
9910
        ssl->peerX25519KeyPresent = 0;
9911
9912
        /* The key can outlive this function, and FreeKey() then releases it
9913
         * as DYNAMIC_TYPE_CURVE25519, so allocate it with that type. */
9914
        ssl->peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
9915
                                        ssl->heap, DYNAMIC_TYPE_CURVE25519);
9916
        if (ssl->peerX25519Key == NULL) {
9917
            WOLFSSL_MSG("PeerX25519Key Memory error");
9918
            return MEMORY_ERROR;
9919
        }
9920
        ret = wc_curve25519_init(ssl->peerX25519Key);
9921
        if (ret != 0) {
9922
            XFREE(ssl->peerX25519Key, ssl->heap, DYNAMIC_TYPE_CURVE25519);
9923
            ssl->peerX25519Key = NULL;
9924
            return ret;
9925
        }
9926
    #ifdef WOLFSSL_DEBUG_TLS
9927
        WOLFSSL_MSG("Peer Curve25519 Key");
9928
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9929
    #endif
9930
9931
    #ifndef WOLFSSL_X25519_NO_MASK_PEER
9932
        peerPub = MaskCurve25519PeerKey(peerPub, peerPubLen, maskedPub);
9933
    #endif
9934
9935
        if (wc_curve25519_check_public(peerPub, peerPubLen,
9936
                                                  EC25519_LITTLE_ENDIAN) != 0) {
9937
            ret = ECC_PEERKEY_ERROR;
9938
            WOLFSSL_ERROR_VERBOSE(ret);
9939
        }
9940
9941
        if (ret == 0) {
9942
            if (wc_curve25519_import_public_ex(peerPub, peerPubLen,
9943
                                        ssl->peerX25519Key,
9944
                                        EC25519_LITTLE_ENDIAN) != 0) {
9945
                ret = ECC_PEERKEY_ERROR;
9946
                WOLFSSL_ERROR_VERBOSE(ret);
9947
            }
9948
        }
9949
9950
        if (ret == 0) {
9951
            ssl->ecdhCurveOID = ECC_X25519_OID;
9952
            ssl->peerX25519KeyPresent = 1;
9953
        }
9954
    }
9955
9956
    if (ret == 0 && key == NULL)
9957
        ret = BAD_FUNC_ARG;
9958
    if (ret == 0) {
9959
    #ifdef WOLFSSL_CURVE25519_BLINDING
9960
        ret = wc_curve25519_set_rng(key, ssl->rng);
9961
    }
9962
    if (ret == 0) {
9963
    #endif
9964
    #ifdef WOLFSSL_ASYNC_CRYPT
9965
        if (keyShareEntry->lastRet != WC_NO_ERR_TRACE(WC_PENDING_E))
9966
    #endif
9967
        {
9968
        #ifdef WOLFSSL_ASYNC_CRYPT
9969
            /* initialize event */
9970
            ret = wolfSSL_AsyncInit(ssl, &key->asyncDev,
9971
                WC_ASYNC_FLAG_CALL_AGAIN);
9972
            if (ret != 0)
9973
                return ret;
9974
        #endif
9975
            ret = wc_curve25519_shared_secret_ex(key, ssl->peerX25519Key,
9976
                        ssOutput, ssOutSz, EC25519_LITTLE_ENDIAN);
9977
        #ifdef WOLFSSL_ASYNC_CRYPT
9978
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9979
                return wolfSSL_AsyncPush(ssl, &key->asyncDev);
9980
            }
9981
        #endif
9982
            /* RFC 9846 Section 7.4.2 requires aborting on an all-zero
9983
             * shared secret, which a small-order peer point gives. Report it
9984
             * as a bad peer key so that an illegal_parameter alert is sent,
9985
             * as RFC 10024 Section 4.3 requires for the hybrid groups. */
9986
            if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E)) {
9987
                ret = ECC_PEERKEY_ERROR;
9988
                WOLFSSL_ERROR_VERBOSE(ret);
9989
            }
9990
        }
9991
        /* On CALL_AGAIN re-entry (lastRet == PENDING): the block above
9992
         * is skipped entirely, so wc_curve25519_shared_secret_ex is not
9993
         * called again. ret stays 0 from initialization, and execution
9994
         * falls through to the cleanup code below. */
9995
    }
9996
9997
    /* done with key share, release resources unless the peer key was asked
9998
     * for - wolfSSL_get_peer_tmp_key() needs it after the handshake. A failed
9999
     * exchange keeps nothing, matching TLSX_KeyShare_ProcessX448_ex(). */
10000
    if ((ssl->peerX25519Key != NULL) &&
10001
            ((ret != 0) || !ssl->options.keepResources)) {
10002
        wc_curve25519_free(ssl->peerX25519Key);
10003
        XFREE(ssl->peerX25519Key, ssl->heap, DYNAMIC_TYPE_CURVE25519);
10004
        ssl->peerX25519Key = NULL;
10005
        ssl->peerX25519KeyPresent = 0;
10006
    }
10007
    if (keyShareEntry->key != NULL) {
10008
    #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
10009
        if (((curve25519_key*)keyShareEntry->key)->nb_ctx != NULL) {
10010
            XFREE(((curve25519_key*)keyShareEntry->key)->nb_ctx, ssl->heap,
10011
                DYNAMIC_TYPE_TMP_BUFFER);
10012
        }
10013
    #endif
10014
        wc_curve25519_free((curve25519_key*)keyShareEntry->key);
10015
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10016
        keyShareEntry->key = NULL;
10017
    }
10018
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10019
    keyShareEntry->ke = NULL;
10020
#else
10021
0
    (void)ssl;
10022
0
    (void)keyShareEntry;
10023
0
    (void)ssOutput;
10024
0
    (void)ssOutSz;
10025
10026
0
    ret = PEER_KEY_ERROR;
10027
0
    WOLFSSL_ERROR_VERBOSE(ret);
10028
0
#endif /* HAVE_CURVE25519 */
10029
10030
0
    return ret;
10031
0
}
10032
10033
/* Process the X25519 key share extension on the client side.
10034
 *
10035
 * ssl            The SSL/TLS object.
10036
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10037
 *
10038
 * returns 0 on success and other values indicate failure.
10039
 */
10040
static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
10041
                                       KeyShareEntry* keyShareEntry)
10042
0
{
10043
0
    return TLSX_KeyShare_ProcessX25519_ex(ssl, keyShareEntry,
10044
0
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
10045
0
}
10046
10047
/* Process the X448 key share extension on the client side.
10048
 *
10049
 * ssl            The SSL/TLS object.
10050
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10051
 * ssOutput       The destination buffer for the shared secret.
10052
 * ssOutSz        The size of the generated shared secret.
10053
 *
10054
 * returns 0 on success and other values indicate failure.
10055
 */
10056
static int TLSX_KeyShare_ProcessX448_ex(WOLFSSL* ssl,
10057
                                        KeyShareEntry* keyShareEntry,
10058
                                        unsigned char* ssOutput,
10059
                                        word32* ssOutSz)
10060
0
{
10061
0
    int ret;
10062
10063
#ifdef HAVE_CURVE448
10064
    curve448_key* key = (curve448_key*)keyShareEntry->key;
10065
    curve448_key* peerX448Key;
10066
10067
#ifdef HAVE_ECC
10068
    /* A reused WOLFSSL may already carry a retained peer key. FreeKey() rather
10069
     * than wc_ecc_free(), which leaves the allocation behind. */
10070
    FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccKey);
10071
    ssl->peerEccKeyPresent = 0;
10072
#endif
10073
10074
    /* The key can outlive this function, and FreeKey() then releases it as
10075
     * DYNAMIC_TYPE_CURVE448, so allocate it with that type. */
10076
    peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
10077
                                                        DYNAMIC_TYPE_CURVE448);
10078
    if (peerX448Key == NULL) {
10079
        WOLFSSL_MSG("PeerEccKey Memory error");
10080
        return MEMORY_ERROR;
10081
    }
10082
    ret = wc_curve448_init(peerX448Key);
10083
    if (ret != 0) {
10084
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_CURVE448);
10085
        return ret;
10086
    }
10087
#ifdef WOLFSSL_DEBUG_TLS
10088
    WOLFSSL_MSG("Peer Curve448 Key");
10089
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
10090
#endif
10091
10092
    if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
10093
                                                    EC448_LITTLE_ENDIAN) != 0) {
10094
        ret = ECC_PEERKEY_ERROR;
10095
        WOLFSSL_ERROR_VERBOSE(ret);
10096
    }
10097
10098
    if (ret == 0) {
10099
        if (wc_curve448_import_public_ex(keyShareEntry->ke,
10100
                                              keyShareEntry->keLen, peerX448Key,
10101
                                              EC448_LITTLE_ENDIAN) != 0) {
10102
            ret = ECC_PEERKEY_ERROR;
10103
            WOLFSSL_ERROR_VERBOSE(ret);
10104
        }
10105
    }
10106
10107
    if (ret == 0) {
10108
        ssl->ecdhCurveOID = ECC_X448_OID;
10109
10110
        ret = wc_curve448_shared_secret_ex(key, peerX448Key,
10111
                    ssOutput, ssOutSz, EC448_LITTLE_ENDIAN);
10112
    }
10113
10114
    /* Keep the peer key when it was asked for - wolfSSL_get_peer_tmp_key()
10115
     * needs it after the handshake. Freed with the other peer keys on
10116
     * teardown. */
10117
    if ((ret == 0) && ssl->options.keepResources) {
10118
        FreeKey(ssl, DYNAMIC_TYPE_CURVE448, (void**)&ssl->peerX448Key);
10119
        ssl->peerX448Key = peerX448Key;
10120
        ssl->peerX448KeyPresent = 1;
10121
    }
10122
    else {
10123
        wc_curve448_free(peerX448Key);
10124
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_CURVE448);
10125
    }
10126
    wc_curve448_free((curve448_key*)keyShareEntry->key);
10127
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10128
    keyShareEntry->key = NULL;
10129
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10130
    keyShareEntry->ke = NULL;
10131
#else
10132
0
    (void)ssl;
10133
0
    (void)keyShareEntry;
10134
0
    (void)ssOutput;
10135
0
    (void)ssOutSz;
10136
10137
0
    ret = PEER_KEY_ERROR;
10138
0
    WOLFSSL_ERROR_VERBOSE(ret);
10139
0
#endif /* HAVE_CURVE448 */
10140
10141
0
    return ret;
10142
0
}
10143
10144
/* Process the X448 key share extension on the client side.
10145
 *
10146
 * ssl            The SSL/TLS object.
10147
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10148
 * returns 0 on success and other values indicate failure.
10149
 */
10150
static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
10151
0
{
10152
0
    return TLSX_KeyShare_ProcessX448_ex(ssl, keyShareEntry,
10153
0
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
10154
0
}
10155
10156
/* Process the ECC key share extension on the client side.
10157
 *
10158
 * ssl            The SSL/TLS object.
10159
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10160
 * ssOutput       The destination buffer for the shared secret.
10161
 * ssOutSz        The size of the generated shared secret.
10162
 *
10163
 * returns 0 on success and other values indicate failure.
10164
 */
10165
static int TLSX_KeyShare_ProcessEcc_ex(WOLFSSL* ssl,
10166
                                       KeyShareEntry* keyShareEntry,
10167
                                       unsigned char* ssOutput,
10168
                                       word32* ssOutSz)
10169
0
{
10170
0
    int ret = 0;
10171
0
#ifdef HAVE_ECC
10172
0
    int curveId = ECC_CURVE_INVALID;
10173
0
    ecc_key* eccKey = (ecc_key*)keyShareEntry->key;
10174
10175
    /* find supported curve */
10176
0
    switch (keyShareEntry->group) {
10177
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
10178
0
        #ifndef NO_ECC_SECP
10179
0
        case WOLFSSL_ECC_SECP256R1:
10180
0
            curveId = ECC_SECP256R1;
10181
0
            break;
10182
0
        #endif /* !NO_ECC_SECP */
10183
        #ifdef WOLFSSL_SM2
10184
        case WOLFSSL_ECC_SM2P256V1:
10185
            curveId = ECC_SM2P256V1;
10186
            break;
10187
        #endif /* WOLFSSL_SM2 */
10188
        #ifdef HAVE_ECC_BRAINPOOL
10189
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
10190
            curveId = ECC_BRAINPOOLP256R1;
10191
            break;
10192
        #endif /* HAVE_ECC_BRAINPOOL */
10193
0
    #endif
10194
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
10195
0
        #ifndef NO_ECC_SECP
10196
0
        case WOLFSSL_ECC_SECP384R1:
10197
0
            curveId = ECC_SECP384R1;
10198
0
            break;
10199
0
        #endif /* !NO_ECC_SECP */
10200
        #ifdef HAVE_ECC_BRAINPOOL
10201
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
10202
            curveId = ECC_BRAINPOOLP384R1;
10203
            break;
10204
        #endif /* HAVE_ECC_BRAINPOOL */
10205
0
    #endif
10206
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
10207
        #ifdef HAVE_ECC_BRAINPOOL
10208
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
10209
            curveId = ECC_BRAINPOOLP512R1;
10210
            break;
10211
        #endif /* HAVE_ECC_BRAINPOOL */
10212
0
    #endif
10213
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
10214
0
        #ifndef NO_ECC_SECP
10215
0
        case WOLFSSL_ECC_SECP521R1:
10216
0
            curveId = ECC_SECP521R1;
10217
0
            break;
10218
0
        #endif /* !NO_ECC_SECP */
10219
0
    #endif
10220
    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
10221
        case WOLFSSL_ECC_X448:
10222
            curveId = ECC_X448;
10223
            break;
10224
    #endif
10225
0
        default:
10226
            /* unsupported curve */
10227
0
            WOLFSSL_ERROR_VERBOSE(ECC_PEERKEY_ERROR);
10228
0
            return ECC_PEERKEY_ERROR;
10229
0
    }
10230
10231
#ifdef WOLFSSL_ASYNC_CRYPT
10232
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
10233
#endif
10234
0
    {
10235
    #ifdef WOLFSSL_DEBUG_TLS
10236
        WOLFSSL_MSG("Peer ECC Key");
10237
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
10238
    #endif
10239
10240
0
        if (ssl->peerEccKey != NULL) {
10241
0
            wc_ecc_free(ssl->peerEccKey);
10242
0
            XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
10243
0
            ssl->peerEccKeyPresent = 0;
10244
0
        }
10245
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
10246
        ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry);
10247
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
10248
            return ret;
10249
        }
10250
        ret = 0;
10251
#endif
10252
10253
0
        ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
10254
0
                                            DYNAMIC_TYPE_ECC);
10255
0
        if (ssl->peerEccKey == NULL) {
10256
0
            WOLFSSL_MSG("PeerEccKey Memory error");
10257
0
            ret = MEMORY_ERROR;
10258
0
        }
10259
10260
0
        if (ret == 0) {
10261
0
            ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
10262
0
        }
10263
10264
        /* Point is validated by import function. */
10265
0
        if (ret == 0) {
10266
0
#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
10267
0
            ret = wc_ecc_import_x963_ex2(keyShareEntry->ke,
10268
0
                keyShareEntry->keLen, ssl->peerEccKey, curveId, 1);
10269
#else
10270
            /* FIPS has validation define on. */
10271
            ret = wc_ecc_import_x963_ex(keyShareEntry->ke,
10272
                keyShareEntry->keLen, ssl->peerEccKey, curveId);
10273
#endif
10274
0
            if (ret != 0) {
10275
0
                ret = ECC_PEERKEY_ERROR;
10276
0
                WOLFSSL_ERROR_VERBOSE(ret);
10277
0
            }
10278
0
        }
10279
10280
0
        if (ret == 0) {
10281
0
            ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
10282
0
            ssl->peerEccKeyPresent = 1;
10283
0
        }
10284
0
    }
10285
10286
0
    if (ret == 0 && eccKey == NULL)
10287
0
        ret = BAD_FUNC_ARG;
10288
0
    if (ret == 0) {
10289
0
        ret = EccSharedSecret(ssl, eccKey, ssl->peerEccKey,
10290
0
            keyShareEntry->ke, &keyShareEntry->keLen,
10291
0
            ssOutput, ssOutSz, ssl->options.side);
10292
    #ifdef WOLFSSL_ASYNC_CRYPT
10293
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
10294
            return ret;
10295
    #endif
10296
0
    }
10297
10298
    /* done with key share, release resources unless the peer key was asked
10299
     * for - wolfSSL_get_peer_tmp_key() needs it after the handshake */
10300
0
    if (ssl->peerEccKey != NULL
10301
    #ifdef HAVE_PK_CALLBACKS
10302
        && ssl->ctx->EccSharedSecretCb == NULL
10303
    #endif
10304
0
        && !ssl->options.keepResources
10305
0
    ) {
10306
0
        wc_ecc_free(ssl->peerEccKey);
10307
0
        XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
10308
0
        ssl->peerEccKey = NULL;
10309
0
        ssl->peerEccKeyPresent = 0;
10310
0
    }
10311
0
    if (eccKey != NULL) {
10312
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
10313
        defined(WC_ASYNC_ENABLE_ECC)
10314
        if (eccKey->nb_ctx != NULL) {
10315
            XFREE(eccKey->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
10316
        }
10317
    #endif
10318
0
        wc_ecc_free(eccKey);
10319
0
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_ECC);
10320
0
        keyShareEntry->key = NULL;
10321
0
    }
10322
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10323
0
    keyShareEntry->ke = NULL;
10324
#else
10325
    (void)ssl;
10326
    (void)keyShareEntry;
10327
    (void)ssOutput;
10328
    (void)ssOutSz;
10329
10330
    ret = PEER_KEY_ERROR;
10331
    WOLFSSL_ERROR_VERBOSE(ret);
10332
#endif /* HAVE_ECC */
10333
10334
0
    return ret;
10335
0
}
10336
10337
/* Process the ECC key share extension on the client side.
10338
 *
10339
 * ssl            The SSL/TLS object.
10340
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10341
 * returns 0 on success and other values indicate failure.
10342
 */
10343
static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
10344
0
{
10345
0
    return TLSX_KeyShare_ProcessEcc_ex(ssl, keyShareEntry,
10346
0
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
10347
0
}
10348
10349
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
10350
/* Process the ML-KEM key share extension on the client side.
10351
 *
10352
 * ssl            The SSL/TLS object.
10353
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10354
 * ssOutput       The destination buffer for the shared secret.
10355
 * ssOutSz        The size of the generated shared secret.
10356
 *
10357
 * returns 0 on success and other values indicate failure.
10358
 */
10359
static int TLSX_KeyShare_ProcessPqcClient_ex(WOLFSSL* ssl,
10360
                                             KeyShareEntry* keyShareEntry,
10361
                                             unsigned char* ssOutput,
10362
                                             word32* ssOutSz)
10363
0
{
10364
0
    int       ret = 0;
10365
0
    MlKemKey* kem = (MlKemKey*)keyShareEntry->key;
10366
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10367
0
    word32    privSz = 0;
10368
0
#endif
10369
0
    word32    ctSz = 0;
10370
0
    word32    ssSz = 0;
10371
10372
0
    if (ssl->options.side == WOLFSSL_SERVER_END) {
10373
        /* I am the server, the shared secret has already been generated and
10374
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
10375
0
        return 0;
10376
0
    }
10377
10378
0
    if (keyShareEntry->ke == NULL) {
10379
0
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
10380
0
        return BAD_FUNC_ARG;
10381
0
    }
10382
0
    if (ssOutSz == NULL)
10383
0
        return BAD_FUNC_ARG;
10384
10385
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10386
0
    if (kem == NULL) {
10387
0
        int type = 0;
10388
10389
        /* Allocate an ML-KEM key to hold private key. */
10390
0
        kem = (MlKemKey*) XMALLOC(sizeof(MlKemKey), ssl->heap,
10391
0
                                  DYNAMIC_TYPE_PRIVATE_KEY);
10392
0
        if (kem == NULL) {
10393
0
            WOLFSSL_MSG("GenPqcKey memory error");
10394
0
            ret = MEMORY_E;
10395
0
        }
10396
0
        else {
10397
            /* Zero so an unconditional wc_MlKemKey_Free is safe even if Init is
10398
             * skipped on an id2type failure. */
10399
0
            XMEMSET(kem, 0, sizeof(MlKemKey));
10400
0
        }
10401
0
        if (ret == 0) {
10402
0
            ret = mlkem_id2type(keyShareEntry->group, &type);
10403
0
        }
10404
0
        if (ret != 0) {
10405
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10406
0
            ret = BAD_FUNC_ARG;
10407
0
        }
10408
0
        if (ret == 0) {
10409
0
            ret = wc_MlKemKey_Init(kem, type, ssl->heap, ssl->devId);
10410
0
            if (ret != 0) {
10411
0
                WOLFSSL_MSG("Error creating ML-KEM key");
10412
0
            }
10413
0
        }
10414
0
    }
10415
#else
10416
    if (kem == NULL || keyShareEntry->privKeyLen != 0) {
10417
        WOLFSSL_MSG("Invalid ML-KEM key.");
10418
        ret = BAD_FUNC_ARG;
10419
    }
10420
#endif
10421
10422
0
    if (ret == 0) {
10423
0
        ret = wc_MlKemKey_SharedSecretSize(kem, &ssSz);
10424
0
    }
10425
0
    if (ret == 0) {
10426
0
        ret = wc_MlKemKey_CipherTextSize(kem, &ctSz);
10427
0
    }
10428
10429
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10430
0
    if (ret == 0) {
10431
0
        ret = wc_MlKemKey_PrivateKeySize(kem, &privSz);
10432
0
    }
10433
0
    if (ret == 0 && privSz != keyShareEntry->privKeyLen) {
10434
0
        WOLFSSL_MSG("Invalid private key size.");
10435
0
        ret = BAD_FUNC_ARG;
10436
0
    }
10437
0
    if (ret == 0) {
10438
0
        PRIVATE_KEY_UNLOCK();
10439
0
        ret = wc_MlKemKey_DecodePrivateKey(kem, keyShareEntry->privKey, privSz);
10440
0
        PRIVATE_KEY_LOCK();
10441
0
    }
10442
0
#endif
10443
10444
    /* FIPS 203 7.3 ciphertext type check. */
10445
0
    if (ret == 0 && keyShareEntry->keLen != ctSz) {
10446
0
        WOLFSSL_MSG("PQC key share data is not the ciphertext size.");
10447
0
        WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10448
0
        ret = BAD_KEY_SHARE_DATA;
10449
0
    }
10450
0
    if (ret == 0) {
10451
0
        PRIVATE_KEY_UNLOCK();
10452
0
        ret = wc_MlKemKey_Decapsulate(kem, ssOutput,
10453
0
                                      keyShareEntry->ke, ctSz);
10454
0
        PRIVATE_KEY_LOCK();
10455
0
        if (ret != 0) {
10456
0
            WOLFSSL_MSG("wc_MlKemKey decapsulation failure.");
10457
0
            ret = BAD_FUNC_ARG;
10458
0
        }
10459
0
    }
10460
0
    if (ret == 0) {
10461
0
        *ssOutSz = ssSz;
10462
0
    }
10463
10464
0
    wc_MlKemKey_Free(kem);
10465
10466
0
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10467
0
    keyShareEntry->key = NULL;
10468
10469
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10470
0
    keyShareEntry->ke = NULL;
10471
10472
0
    return ret;
10473
0
}
10474
10475
/* Process the ML-KEM key share extension on the client side.
10476
 *
10477
 * ssl            The SSL/TLS object.
10478
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10479
 *
10480
 * returns 0 on success and other values indicate failure.
10481
 */
10482
static int TLSX_KeyShare_ProcessPqcClient(WOLFSSL* ssl,
10483
                                          KeyShareEntry* keyShareEntry)
10484
0
{
10485
0
    return TLSX_KeyShare_ProcessPqcClient_ex(ssl, keyShareEntry,
10486
0
                                             ssl->arrays->preMasterSecret,
10487
0
                                             &ssl->arrays->preMasterSz);
10488
0
}
10489
10490
/* Process the hybrid key share extension on the client side.
10491
 *
10492
 * ssl            The SSL/TLS object.
10493
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10494
 * returns 0 on success and other values indicate failure.
10495
 */
10496
static int TLSX_KeyShare_ProcessPqcHybridClient(WOLFSSL* ssl,
10497
                                                KeyShareEntry* keyShareEntry)
10498
0
{
10499
0
    int      ret = 0;
10500
0
    int      pqc_group = 0;
10501
0
    int      ecc_group = 0;
10502
0
    int      pqc_first = 0;
10503
0
    KeyShareEntry* pqc_kse = NULL;
10504
0
    KeyShareEntry *ecc_kse = NULL;
10505
0
    word32   ctSz = 0;
10506
0
    word32   ssSzPqc = 0;
10507
10508
0
    if (ssl->options.side == WOLFSSL_SERVER_END) {
10509
        /* I am the server, the shared secret has already been generated and
10510
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
10511
0
        return 0;
10512
0
    }
10513
10514
0
    if (keyShareEntry->ke == NULL) {
10515
0
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
10516
0
        return BAD_FUNC_ARG;
10517
0
    }
10518
10519
    /* I am the client, both the PQC ciphertext and the ECHD public key are in
10520
     * keyShareEntry->ke */
10521
10522
    /* Determine the ECC and PQC group of the hybrid combination */
10523
0
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
10524
0
    if (ecc_group == 0 || pqc_group == 0) {
10525
0
        WOLFSSL_MSG("Invalid hybrid group");
10526
0
        ret = BAD_FUNC_ARG;
10527
0
    }
10528
10529
0
    if (ret == 0) {
10530
0
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
10531
0
                   DYNAMIC_TYPE_TLSX);
10532
0
        if (ecc_kse == NULL) {
10533
0
            WOLFSSL_MSG("kse memory allocation failure");
10534
0
            ret = MEMORY_ERROR;
10535
0
        }
10536
0
        else {
10537
0
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
10538
0
        }
10539
0
    }
10540
0
    if (ret == 0) {
10541
0
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
10542
0
                   DYNAMIC_TYPE_TLSX);
10543
0
        if (pqc_kse == NULL) {
10544
0
            WOLFSSL_MSG("kse memory allocation failure");
10545
0
            ret = MEMORY_ERROR;
10546
0
        }
10547
0
        else {
10548
0
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
10549
0
        }
10550
0
    }
10551
10552
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
10553
     * decode these sizes to separate the KEM ciphertext from the ECDH public
10554
     * key. */
10555
0
    if (ret == 0) {
10556
0
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10557
0
        int type;
10558
10559
0
        pqc_kse->privKey = keyShareEntry->privKey;
10560
10561
0
        ret = mlkem_id2type(pqc_group, &type);
10562
0
        if (ret != 0) {
10563
0
            WOLFSSL_MSG("Invalid ML-KEM algorithm specified.");
10564
0
            ret = BAD_FUNC_ARG;
10565
0
        }
10566
0
        if (ret == 0) {
10567
0
            pqc_kse->key = XMALLOC(sizeof(MlKemKey), ssl->heap,
10568
0
                                DYNAMIC_TYPE_PRIVATE_KEY);
10569
0
            if (pqc_kse->key == NULL) {
10570
0
                WOLFSSL_MSG("GenPqcKey memory error");
10571
0
                ret = MEMORY_E;
10572
0
            }
10573
0
        }
10574
0
        if (ret == 0) {
10575
0
            ret = wc_MlKemKey_Init((MlKemKey*)pqc_kse->key, type,
10576
0
                                   ssl->heap, ssl->devId);
10577
0
            if (ret != 0) {
10578
0
                WOLFSSL_MSG("Error creating ML-KEM key");
10579
0
            }
10580
0
        }
10581
    #else
10582
        pqc_kse->key = keyShareEntry->privKey;
10583
    #endif
10584
10585
0
        pqc_kse->group = pqc_group;
10586
0
        pqc_kse->privKeyLen = keyShareEntry->privKeyLen;
10587
10588
0
        if (ret == 0) {
10589
0
            ret = wc_MlKemKey_SharedSecretSize((MlKemKey*)pqc_kse->key,
10590
0
                                               &ssSzPqc);
10591
0
        }
10592
0
        if (ret == 0) {
10593
0
            ret = wc_MlKemKey_CipherTextSize((MlKemKey*)pqc_kse->key,
10594
0
                                             &ctSz);
10595
0
            if (ret == 0 && keyShareEntry->keLen <= ctSz) {
10596
0
                WOLFSSL_MSG("Invalid ciphertext size.");
10597
0
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10598
0
                ret = BAD_KEY_SHARE_DATA;
10599
0
            }
10600
0
        }
10601
0
        if (ret == 0) {
10602
0
            pqc_kse->keLen = ctSz;
10603
0
            pqc_kse->ke = (byte*)XMALLOC(pqc_kse->keLen, ssl->heap,
10604
0
                                         DYNAMIC_TYPE_PUBLIC_KEY);
10605
0
            if (pqc_kse->ke == NULL) {
10606
0
                WOLFSSL_MSG("pqc_kse memory allocation failure");
10607
0
                ret = MEMORY_ERROR;
10608
0
            }
10609
            /* Copy the PQC KEM ciphertext. Depending on the pqc_first flag,
10610
             * the KEM ciphertext comes before or after the ECDH public key. */
10611
0
            if (ret == 0) {
10612
0
                int offset = keyShareEntry->keLen - ctSz;
10613
10614
0
                if (pqc_first)
10615
0
                    offset = 0;
10616
10617
0
                XMEMCPY(pqc_kse->ke, keyShareEntry->ke + offset, ctSz);
10618
0
            }
10619
0
        }
10620
0
    }
10621
10622
0
    if (ret == 0) {
10623
0
        ecc_kse->group = ecc_group;
10624
0
        ecc_kse->keLen = keyShareEntry->keLen - ctSz;
10625
0
        ecc_kse->key = keyShareEntry->key;
10626
0
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
10627
0
                                        DYNAMIC_TYPE_PUBLIC_KEY);
10628
0
        if (ecc_kse->ke == NULL) {
10629
0
            WOLFSSL_MSG("ecc_kse memory allocation failure");
10630
0
            ret = MEMORY_ERROR;
10631
0
        }
10632
        /* Copy the ECDH public key. Depending on the pqc_first flag, the
10633
         * KEM ciphertext comes before or after the ECDH public key. */
10634
0
        if (ret == 0) {
10635
0
            int offset = 0;
10636
10637
0
            if (pqc_first)
10638
0
                offset = ctSz;
10639
10640
0
            XMEMCPY(ecc_kse->ke, keyShareEntry->ke + offset, ecc_kse->keLen);
10641
0
        }
10642
    #ifdef WOLFSSL_ASYNC_CRYPT
10643
        ecc_kse->lastRet = keyShareEntry->lastRet;
10644
    #endif
10645
0
    }
10646
10647
    /* Process ECDH key share part. The generated shared secret is directly
10648
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
10649
     * pqc_first flag, the ECDH shared secret part goes before or after the
10650
     * KEM part. */
10651
0
    if (ret == 0) {
10652
0
        int offset = 0;
10653
10654
0
        if (pqc_first)
10655
0
            offset = ssSzPqc;
10656
10657
    #ifdef HAVE_CURVE25519
10658
        if (ecc_group == WOLFSSL_ECC_X25519) {
10659
            ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
10660
                    ssl->arrays->preMasterSecret + offset,
10661
                    &ssl->arrays->preMasterSz);
10662
        }
10663
        else
10664
    #endif
10665
    #ifdef HAVE_CURVE448
10666
        if (ecc_group == WOLFSSL_ECC_X448) {
10667
            ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
10668
                    ssl->arrays->preMasterSecret + offset,
10669
                    &ssl->arrays->preMasterSz);
10670
        }
10671
        else
10672
    #endif
10673
0
        {
10674
0
            ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
10675
0
                    ssl->arrays->preMasterSecret + offset,
10676
0
                    &ssl->arrays->preMasterSz);
10677
0
        }
10678
10679
    #ifdef WOLFSSL_ASYNC_CRYPT
10680
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10681
            keyShareEntry->lastRet = WC_PENDING_E;
10682
            /* Prevent freeing of the ECC and ML-KEM private keys */
10683
            ecc_kse->key = NULL;
10684
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10685
            pqc_kse->privKey = NULL;
10686
        #else
10687
            pqc_kse->key = NULL;
10688
        #endif
10689
        }
10690
        else
10691
    #endif
10692
0
        {
10693
            /* Re-sync keyShareEntry->key with ecc_kse->key. ecc_kse->key was
10694
             * aliased to keyShareEntry->key above. The inner Process*_ex
10695
             * either ran its end-of-function cleanup and set ecc_kse->key
10696
             * to NULL (so the outer pointer must also become NULL to avoid
10697
             * UAF/double-free in TLSX_KeyShare_FreeAll), or returned early
10698
             * before cleanup with ecc_kse->key still pointing at the live
10699
             * key (so the outer pointer must keep that pointer for later
10700
             * freeing). Mirroring whatever the inner left in ecc_kse->key
10701
             * handles both cases correctly. */
10702
0
            keyShareEntry->key = ecc_kse->key;
10703
0
        }
10704
0
    }
10705
10706
0
    if (ret == 0) {
10707
0
        if ((ssl->arrays->preMasterSz + ssSzPqc) > MAX_PREMASTER_SZ) {
10708
0
            WOLFSSL_MSG("shared secret is too long.");
10709
0
            ret = LENGTH_ERROR;
10710
0
        }
10711
0
    }
10712
10713
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
10714
     * KEM shared secret part goes before or after the ECDH part. */
10715
0
    if (ret == 0) {
10716
0
        int offset = ssl->arrays->preMasterSz;
10717
10718
0
        if (pqc_first)
10719
0
            offset = 0;
10720
10721
0
        ret = TLSX_KeyShare_ProcessPqcClient_ex(ssl, pqc_kse,
10722
0
                ssl->arrays->preMasterSecret + offset, &ssSzPqc);
10723
0
    }
10724
10725
0
    if (ret == 0) {
10726
0
        keyShareEntry->privKey = (byte*)pqc_kse->key;
10727
10728
0
        ssl->arrays->preMasterSz += ssSzPqc;
10729
0
    }
10730
0
    else
10731
#ifdef WOLFSSL_ASYNC_CRYPT
10732
        if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
10733
#endif
10734
0
    {
10735
        /* Clear the pre master secret buffer to prevent leaking any
10736
         * intermediate keys in the error case. Do not use preMasterSz
10737
         * here as it may already been set to the ECC shared secret size,
10738
         * which would be too small due to the PQC offset case. */
10739
0
        ForceZero(ssl->arrays->preMasterSecret, MAX_PREMASTER_SZ);
10740
10741
        /* Prevent FreeAll from freeing pointers owned by keyShareEntry. */
10742
0
        if (ecc_kse != NULL)
10743
0
            ecc_kse->key = NULL;
10744
0
        if (pqc_kse != NULL) {
10745
0
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10746
0
            pqc_kse->privKey = NULL;
10747
        #else
10748
            pqc_kse->key = NULL;
10749
        #endif
10750
0
        }
10751
0
    }
10752
10753
0
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
10754
0
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
10755
10756
0
    return ret;
10757
0
}
10758
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_DECAPSULATE */
10759
10760
/* Process the key share extension on the client side.
10761
 *
10762
 * ssl            The SSL/TLS object.
10763
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10764
 * returns 0 on success and other values indicate failure.
10765
 */
10766
static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
10767
0
{
10768
0
    int ret;
10769
10770
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
10771
    keyShareEntry->session = ssl->session->namedGroup;
10772
    ssl->session->namedGroup = keyShareEntry->group;
10773
#endif
10774
    /* reset the pre master secret size */
10775
0
    if (ssl->arrays->preMasterSz == 0)
10776
0
        ssl->arrays->preMasterSz = MAX_PREMASTER_SZ;
10777
10778
    /* Use Key Share Data from server. */
10779
0
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(keyShareEntry->group))
10780
0
        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
10781
0
    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
10782
0
        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
10783
0
    else if (keyShareEntry->group == WOLFSSL_ECC_X448)
10784
0
        ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
10785
0
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
10786
0
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group))
10787
0
        ret = TLSX_KeyShare_ProcessPqcClient(ssl, keyShareEntry);
10788
0
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(keyShareEntry->group))
10789
0
        ret = TLSX_KeyShare_ProcessPqcHybridClient(ssl, keyShareEntry);
10790
0
#endif
10791
0
    else
10792
0
        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
10793
10794
#ifdef WOLFSSL_DEBUG_TLS
10795
    if (ret == 0) {
10796
        WOLFSSL_MSG("KE Secret");
10797
        WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
10798
    }
10799
#endif
10800
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) || \
10801
    defined(WOLFSSL_ASYNC_CRYPT)
10802
    keyShareEntry->derived = (ret == 0);
10803
#endif
10804
#ifdef WOLFSSL_ASYNC_CRYPT
10805
    keyShareEntry->lastRet = ret;
10806
#endif
10807
10808
0
    return ret;
10809
0
}
10810
10811
/* Parse an entry of the KeyShare extension.
10812
 *
10813
 * ssl     The SSL/TLS object.
10814
 * input   The extension data.
10815
 * length  The length of the extension data.
10816
 * kse     The new key share entry object.
10817
 * returns a positive number to indicate amount of data parsed and a negative
10818
 * number on error.
10819
 */
10820
static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
10821
            word16 length, KeyShareEntry **kse, word16* seenGroups,
10822
            int* seenGroupsCnt, TLSX** extensions)
10823
0
{
10824
0
    int    ret;
10825
0
    word16 group;
10826
0
    word16 keLen;
10827
0
    int    offset = 0;
10828
0
    byte*  ke;
10829
0
    int    i;
10830
10831
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN)
10832
0
        return BUFFER_ERROR;
10833
    /* Named group */
10834
0
    ato16(&input[offset], &group);
10835
0
    offset += OPAQUE16_LEN;
10836
    /* Key exchange data - public key. */
10837
0
    ato16(&input[offset], &keLen);
10838
0
    offset += OPAQUE16_LEN;
10839
0
    if (keLen == 0)
10840
0
        return BUFFER_ERROR;
10841
0
    if (keLen > length - offset)
10842
0
        return BUFFER_ERROR;
10843
10844
0
    if (seenGroups != NULL) {
10845
0
        if (*seenGroupsCnt >= MAX_KEYSHARE_NAMED_GROUPS) {
10846
0
            return BAD_KEY_SHARE_DATA;
10847
0
        }
10848
0
        for (i = 0; i < *seenGroupsCnt; i++) {
10849
0
            if (seenGroups[i] == group) {
10850
0
                return BAD_KEY_SHARE_DATA;
10851
0
            }
10852
0
        }
10853
0
        seenGroups[i] = group;
10854
0
        *seenGroupsCnt = i + 1;
10855
0
    }
10856
10857
    /* Store a copy in the key share object. */
10858
0
    ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10859
0
    if (ke == NULL)
10860
0
        return MEMORY_E;
10861
0
    XMEMCPY(ke, &input[offset], keLen);
10862
10863
    /* Populate a key share object in the extension. */
10864
0
    ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
10865
0
    if (ret != 0) {
10866
0
        XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10867
0
        return ret;
10868
0
    }
10869
10870
    /* Total length of the parsed data. */
10871
0
    return offset + keLen;
10872
0
}
10873
10874
/* Searches the groups sent for the specified named group.
10875
 *
10876
 * ssl    SSL/TLS object.
10877
 * name   Group name to match.
10878
 * returns 1 when the extension has the group name and 0 otherwise.
10879
 */
10880
static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
10881
0
{
10882
0
    TLSX*          extension;
10883
0
    KeyShareEntry* list;
10884
10885
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
10886
0
    if (extension == NULL) {
10887
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
10888
0
        if (extension == NULL)
10889
0
            return 0;
10890
0
    }
10891
10892
0
    list = (KeyShareEntry*)extension->data;
10893
0
    while (list != NULL) {
10894
0
        if (list->group == group)
10895
0
            return 1;
10896
0
        list = list->next;
10897
0
    }
10898
10899
0
    return 0;
10900
0
}
10901
10902
10903
/* Searches the supported groups extension for the specified named group.
10904
 *
10905
 * ssl   The SSL/TLS object.
10906
 * name  The group name to match.
10907
 * returns 1 when the extension has the group name and 0 otherwise.
10908
 */
10909
static int TLSX_SupportedGroups_Find(const WOLFSSL* ssl, word16 name,
10910
                                     TLSX* extensions)
10911
0
{
10912
0
#ifdef HAVE_SUPPORTED_CURVES
10913
0
    TLSX*          extension;
10914
0
    SupportedCurve* curve = NULL;
10915
10916
0
    if ((extension = TLSX_Find(extensions, TLSX_SUPPORTED_GROUPS)) == NULL) {
10917
0
        if ((extension = TLSX_Find(ssl->ctx->extensions,
10918
0
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
10919
0
            return 0;
10920
0
        }
10921
0
    }
10922
10923
0
    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
10924
0
        if (curve->name == name)
10925
0
            return 1;
10926
0
    }
10927
0
#endif
10928
10929
0
    (void)ssl;
10930
0
    (void)name;
10931
10932
0
    return 0;
10933
0
}
10934
10935
int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl,
10936
        const byte* input, word16 length, TLSX** extensions)
10937
0
{
10938
0
    int ret;
10939
0
    int    offset = 0;
10940
0
    word16 len;
10941
0
    TLSX*  extension;
10942
0
    word16 seenGroups[MAX_KEYSHARE_NAMED_GROUPS];
10943
0
    int    seenGroupsCnt = 0;
10944
10945
    /* Add a KeyShare extension if it doesn't exist even if peer sent no
10946
     * entries. The presence of this extension signals that the peer can be
10947
     * negotiated with. */
10948
0
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10949
0
    if (extension == NULL) {
10950
        /* Push new KeyShare extension. */
10951
0
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10952
0
        if (ret != 0)
10953
0
            return ret;
10954
0
    }
10955
10956
0
    if (length < OPAQUE16_LEN)
10957
0
        return BUFFER_ERROR;
10958
10959
    /* ClientHello contains zero or more key share entries. Limits extension
10960
     * length to 2^16-1 and subtracting 4 bytes for header size per RFC 8446 */
10961
0
    ato16(input, &len);
10962
0
    if ((len != length - OPAQUE16_LEN) ||
10963
0
         length > (MAX_EXT_DATA_LEN - HELLO_EXT_SZ)) {
10964
0
        return BUFFER_ERROR;
10965
0
    }
10966
0
    offset += OPAQUE16_LEN;
10967
10968
0
    while (offset < (int)length) {
10969
0
        ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset],
10970
0
                length - (word16)offset, NULL, seenGroups, &seenGroupsCnt,
10971
0
                extensions);
10972
0
        if (ret < 0)
10973
0
            return ret;
10974
10975
0
        offset += ret;
10976
0
    }
10977
10978
0
    return 0;
10979
0
}
10980
10981
/* Parse the KeyShare extension.
10982
 * Different formats in different messages.
10983
 *
10984
 * ssl      The SSL/TLS object.
10985
 * input    The extension data.
10986
 * length   The length of the extension data.
10987
 * msgType  The type of the message this extension is being parsed from.
10988
 * returns 0 on success and other values indicate failure.
10989
 */
10990
int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10991
                               byte msgType)
10992
0
{
10993
0
    int ret = 0;
10994
0
    KeyShareEntry *keyShareEntry = NULL;
10995
0
    word16 group;
10996
10997
0
    if (msgType == client_hello) {
10998
0
        ret = TLSX_KeyShare_Parse_ClientHello(ssl, input, length,
10999
0
                                              &ssl->extensions);
11000
0
    }
11001
0
    else if (msgType == server_hello) {
11002
0
        int len;
11003
11004
0
        if (length < OPAQUE16_LEN)
11005
0
            return BUFFER_ERROR;
11006
11007
0
        ssl->options.shSentKeyShare = 1;
11008
11009
        /* The data is the named group the server wants to use. */
11010
0
        ato16(input, &group);
11011
11012
        /* Check the selected group was supported by ClientHello extensions. */
11013
0
        if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
11014
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11015
0
            return BAD_KEY_SHARE_DATA;
11016
0
        }
11017
11018
        /* Check if the group was sent. */
11019
0
        if (!TLSX_KeyShare_Find(ssl, group)) {
11020
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11021
0
            return BAD_KEY_SHARE_DATA;
11022
0
        }
11023
11024
        /* ServerHello contains one key share entry. */
11025
0
        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry, NULL,
11026
0
                NULL, &ssl->extensions);
11027
0
        if (len != (int)length)
11028
0
            return BUFFER_ERROR;
11029
11030
        /* Not in list sent if there isn't a private key. */
11031
0
        if (keyShareEntry == NULL || (keyShareEntry->key == NULL
11032
0
        #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
11033
0
            && keyShareEntry->privKey == NULL
11034
0
        #endif
11035
0
        )) {
11036
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11037
0
            return BAD_KEY_SHARE_DATA;
11038
0
        }
11039
11040
        /* Process the entry to calculate the secret. */
11041
0
        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
11042
0
        if (ret == 0)
11043
0
            ssl->session->namedGroup = ssl->namedGroup = group;
11044
0
    }
11045
0
    else if (msgType == hello_retry_request) {
11046
0
        if (length != OPAQUE16_LEN)
11047
0
            return BUFFER_ERROR;
11048
11049
0
        ssl->options.hrrSentKeyShare = 1;
11050
11051
        /* The data is the named group the server wants to use. */
11052
0
        ato16(input, &group);
11053
11054
    #ifdef WOLFSSL_ASYNC_CRYPT
11055
        /* only perform find and clear TLSX if not returning from async */
11056
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
11057
    #endif
11058
0
        {
11059
            /* Check the selected group was supported by ClientHello extensions.
11060
             */
11061
0
            if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
11062
0
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11063
0
                return BAD_KEY_SHARE_DATA;
11064
0
            }
11065
11066
            /* Make sure KeyShare for server requested group was not sent in
11067
             * ClientHello. */
11068
0
            if (TLSX_KeyShare_Find(ssl, group)) {
11069
0
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11070
0
                return BAD_KEY_SHARE_DATA;
11071
0
            }
11072
11073
            /* Clear out unusable key shares. */
11074
0
            ret = TLSX_KeyShare_Empty(ssl);
11075
0
            if (ret != 0)
11076
0
                return ret;
11077
0
        }
11078
11079
0
        ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
11080
0
        if (ret == 0)
11081
0
            ssl->session->namedGroup = ssl->namedGroup = group;
11082
0
    }
11083
0
    else {
11084
        /* Not a message type that is allowed to have this extension. */
11085
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11086
0
        return SANITY_MSG_E;
11087
0
    }
11088
11089
0
    return ret;
11090
0
}
11091
11092
/* Create a new key share entry and put it into the list.
11093
 *
11094
 * list           The linked list of key share entries.
11095
 * group          The named group.
11096
 * heap           The memory to allocate with.
11097
 * keyShareEntry  The new key share entry object.
11098
 * returns 0 on success and other values indicate failure.
11099
 */
11100
static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
11101
                             KeyShareEntry** keyShareEntry)
11102
0
{
11103
0
    KeyShareEntry* kse;
11104
0
    KeyShareEntry** next;
11105
11106
0
    kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
11107
0
                                  DYNAMIC_TYPE_TLSX);
11108
0
    if (kse == NULL)
11109
0
        return MEMORY_E;
11110
11111
0
    XMEMSET(kse, 0, sizeof(*kse));
11112
0
    kse->group = (word16)group;
11113
11114
    /* Add it to the back and maintain the links. */
11115
0
    while (*list != NULL) {
11116
        /* Assign to temporary to work around compiler bug found by customer. */
11117
0
        next = &((*list)->next);
11118
0
        list = next;
11119
0
    }
11120
0
    *list = kse;
11121
0
    *keyShareEntry = kse;
11122
11123
0
    (void)heap;
11124
11125
0
    return 0;
11126
0
}
11127
11128
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
11129
/* Process the ML-KEM key share extension on the server side.
11130
 *
11131
 * ssl            The SSL/TLS object.
11132
 * keyShareEntry  The key share entry object to be sent to the client.
11133
 * data           The key share data received from the client.
11134
 * len            The length of the key share data from the client.
11135
 * ssOutput       The destination buffer for the shared secret.
11136
 * ssOutSz        The size of the generated shared secret.
11137
 *
11138
 * returns 0 on success and other values indicate failure.
11139
 */
11140
static int TLSX_KeyShare_HandlePqcKeyServer(WOLFSSL* ssl,
11141
    KeyShareEntry* keyShareEntry, byte* clientData, word16 clientLen,
11142
    unsigned char* ssOutput, word32* ssOutSz)
11143
0
{
11144
    /* We are on the server side. The key share contains a PQC KEM public key
11145
     * that we are using for an encapsulate operation. The resulting ciphertext
11146
     * is stored in the server key share. */
11147
0
    MlKemKey* kemKey = (MlKemKey*)keyShareEntry->key;
11148
0
    byte* ciphertext = NULL;
11149
0
    int ret = 0;
11150
0
    word32 pubSz = 0;
11151
0
    word32 ctSz = 0;
11152
0
    word32 ssSz = 0;
11153
11154
0
    if (clientData == NULL) {
11155
0
        WOLFSSL_MSG("No KEM public key from the client.");
11156
0
        return BAD_FUNC_ARG;
11157
0
    }
11158
11159
0
    if (kemKey == NULL) {
11160
0
        int type = 0;
11161
11162
        /* Allocate an ML-KEM key to hold private key. */
11163
0
        kemKey = (MlKemKey*) XMALLOC(sizeof(MlKemKey), ssl->heap,
11164
0
                                     DYNAMIC_TYPE_PRIVATE_KEY);
11165
0
        if (kemKey == NULL) {
11166
0
            WOLFSSL_MSG("GenPqcKey memory error");
11167
0
            ret = MEMORY_E;
11168
0
        }
11169
0
        if (ret == 0) {
11170
0
            ret = mlkem_id2type(keyShareEntry->group, &type);
11171
0
        }
11172
0
        if (ret != 0) {
11173
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
11174
0
            ret = BAD_FUNC_ARG;
11175
0
        }
11176
0
        if (ret == 0) {
11177
0
            ret = wc_MlKemKey_Init(kemKey, type, ssl->heap, ssl->devId);
11178
0
            if (ret != 0) {
11179
0
                WOLFSSL_MSG("Error creating ML-KEM key");
11180
0
            }
11181
0
        }
11182
0
    }
11183
11184
0
    if (ret == 0) {
11185
0
        ret = wc_MlKemKey_PublicKeySize(kemKey, &pubSz);
11186
0
    }
11187
0
    if (ret == 0) {
11188
0
        ret = wc_MlKemKey_CipherTextSize(kemKey, &ctSz);
11189
0
    }
11190
0
    if (ret == 0) {
11191
0
        ret = wc_MlKemKey_SharedSecretSize(kemKey, &ssSz);
11192
0
    }
11193
11194
    /* FIPS 203 7.2 encapsulation key type check. */
11195
0
    if (ret == 0 && clientLen != pubSz) {
11196
0
        WOLFSSL_MSG("Invalid public key.");
11197
0
        WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11198
0
        ret = BAD_KEY_SHARE_DATA;
11199
0
    }
11200
11201
0
    if (ret == 0) {
11202
0
        ciphertext = (byte*)XMALLOC(ctSz, ssl->heap, DYNAMIC_TYPE_TLSX);
11203
11204
0
        if (ciphertext == NULL) {
11205
0
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
11206
0
            ret = MEMORY_E;
11207
0
        }
11208
0
    }
11209
11210
0
    if (ret == 0) {
11211
0
        ret = wc_MlKemKey_DecodePublicKey(kemKey, clientData, pubSz);
11212
        /* FIPS 203 7.2 modulus check failed; the peer sent a bad key. */
11213
0
        if (ret == WC_NO_ERR_TRACE(PUBLIC_KEY_E)) {
11214
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11215
0
            ret = BAD_KEY_SHARE_DATA;
11216
0
        }
11217
0
    }
11218
0
    if (ret == 0) {
11219
0
        ret = wc_MlKemKey_Encapsulate(kemKey, ciphertext,
11220
0
                                      ssOutput, ssl->rng);
11221
0
        if (ret != 0) {
11222
0
            WOLFSSL_MSG("wc_MlKemKey encapsulation failure.");
11223
0
        }
11224
0
    }
11225
11226
0
    if (ret == 0) {
11227
0
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11228
11229
0
        *ssOutSz = ssSz;
11230
0
        keyShareEntry->ke = NULL;
11231
0
        keyShareEntry->keLen = 0;
11232
11233
0
        XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11234
0
        keyShareEntry->pubKey = ciphertext;
11235
0
        keyShareEntry->pubKeyLen = ctSz;
11236
0
        ciphertext = NULL;
11237
11238
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
11239
         * the server side. */
11240
0
        ssl->namedGroup = keyShareEntry->group;
11241
0
    }
11242
11243
0
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
11244
11245
0
    wc_MlKemKey_Free(kemKey);
11246
0
    XFREE(kemKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
11247
0
    keyShareEntry->key = NULL;
11248
0
    return ret;
11249
0
}
11250
11251
int TLSX_KeyShare_HandlePqcHybridKeyServer(WOLFSSL* ssl,
11252
    KeyShareEntry* keyShareEntry, byte* data, word16 len)
11253
0
{
11254
    /* I am the server. The data parameter is the concatenation of the client's
11255
     * ECDH public key and the KEM public key. I need to generate a matching
11256
     * public key for ECDH and encapsulate a shared secret using the KEM public
11257
     * key. We send the ECDH public key and the KEM ciphertext back to the
11258
     * client. Additionally, we create the ECDH shared secret here already.
11259
     */
11260
0
    int    type;
11261
0
    byte*  ciphertext = NULL;
11262
0
    int    ret = 0;
11263
0
    int    pqc_group = 0;
11264
0
    int    ecc_group = 0;
11265
0
    int    pqc_first = 0;
11266
0
    KeyShareEntry *ecc_kse = NULL;
11267
0
    KeyShareEntry *pqc_kse = NULL;
11268
0
    word32 pubSz = 0;
11269
0
    word32 ctSz = 0;
11270
0
    word32 ssSzPqc = 0;
11271
11272
0
    if (data == NULL) {
11273
0
        WOLFSSL_MSG("No hybrid key share data from the client.");
11274
0
        return BAD_FUNC_ARG;
11275
0
    }
11276
11277
    /* Determine the ECC and PQC group of the hybrid combination */
11278
0
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
11279
0
    if (ecc_group == 0 || pqc_group == 0) {
11280
0
        WOLFSSL_MSG("Invalid hybrid group");
11281
0
        ret = BAD_FUNC_ARG;
11282
0
    }
11283
11284
0
    if (ret == 0) {
11285
0
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
11286
0
                   DYNAMIC_TYPE_TLSX);
11287
0
        if (ecc_kse == NULL) {
11288
0
            WOLFSSL_MSG("kse memory allocation failure");
11289
0
            ret = MEMORY_ERROR;
11290
0
        }
11291
0
    }
11292
0
    if (ret == 0) {
11293
0
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
11294
0
        ecc_kse->group = ecc_group;
11295
11296
0
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
11297
0
                   DYNAMIC_TYPE_TLSX);
11298
0
        if (pqc_kse == NULL) {
11299
0
            WOLFSSL_MSG("kse memory allocation failure");
11300
0
            ret = MEMORY_ERROR;
11301
0
        }
11302
0
    }
11303
0
    if (ret == 0) {
11304
0
        XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
11305
0
        pqc_kse->group = pqc_group;
11306
0
    }
11307
11308
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
11309
     * decode these sizes to properly concatenate the KEM ciphertext with the
11310
     * ECDH public key. */
11311
0
    if (ret == 0) {
11312
        /* Allocate an ML-KEM key to hold private key. */
11313
0
        pqc_kse->key = (MlKemKey*) XMALLOC(sizeof(MlKemKey), ssl->heap,
11314
0
                                           DYNAMIC_TYPE_PRIVATE_KEY);
11315
0
        if (pqc_kse->key == NULL) {
11316
0
            WOLFSSL_MSG("GenPqcKey memory error");
11317
0
            ret = MEMORY_E;
11318
0
        }
11319
0
        if (ret == 0) {
11320
0
            ret = mlkem_id2type(pqc_kse->group, &type);
11321
0
        }
11322
0
        if (ret != 0) {
11323
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
11324
0
            ret = BAD_FUNC_ARG;
11325
0
        }
11326
0
        if (ret == 0) {
11327
0
            ret = wc_MlKemKey_Init((MlKemKey*)pqc_kse->key, type,
11328
0
                                   ssl->heap, ssl->devId);
11329
0
            if (ret != 0) {
11330
0
                WOLFSSL_MSG("Error creating ML-KEM key");
11331
0
            }
11332
0
        }
11333
0
        if (ret == 0) {
11334
0
            ret = wc_MlKemKey_SharedSecretSize((MlKemKey*)pqc_kse->key,
11335
0
                                               &ssSzPqc);
11336
0
        }
11337
0
        if (ret == 0) {
11338
0
            ret = wc_MlKemKey_CipherTextSize((MlKemKey*)pqc_kse->key,
11339
0
                                             &ctSz);
11340
0
        }
11341
0
        if (ret == 0) {
11342
0
            ret = wc_MlKemKey_PublicKeySize((MlKemKey*)pqc_kse->key,
11343
0
                                            &pubSz);
11344
0
        }
11345
0
    }
11346
11347
#ifdef WOLFSSL_ASYNC_CRYPT
11348
    if (ret == 0) {
11349
        /* Restore ECC state from a prior suspended pass. This is not gated on
11350
         * a still-pending lastRet: the async layer clears lastRet to 0 on
11351
         * completion, which would skip the restore and regenerate the key. */
11352
        if (keyShareEntry->key != NULL && keyShareEntry->keyLen > 0) {
11353
            ecc_kse->key = keyShareEntry->key;
11354
            ecc_kse->keyLen = keyShareEntry->keyLen;
11355
            ecc_kse->pubKey = keyShareEntry->pubKey;
11356
            ecc_kse->pubKeyLen = keyShareEntry->pubKeyLen;
11357
            ecc_kse->lastRet = keyShareEntry->lastRet;
11358
            keyShareEntry->key = NULL;
11359
            keyShareEntry->pubKey = NULL;
11360
        }
11361
    }
11362
#endif
11363
11364
    /* Generate the ECDH key share part to be sent to the client */
11365
0
    if (ret == 0 && ecc_group != 0 && ecc_kse->pubKey == NULL) {
11366
    #ifdef HAVE_CURVE25519
11367
        if (ecc_group == WOLFSSL_ECC_X25519) {
11368
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
11369
        }
11370
        else
11371
    #endif
11372
    #ifdef HAVE_CURVE448
11373
        if (ecc_group == WOLFSSL_ECC_X448) {
11374
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
11375
        }
11376
        else
11377
    #endif
11378
0
        {
11379
0
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
11380
0
        }
11381
    #ifdef WOLFSSL_ASYNC_CRYPT
11382
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11383
            /* Store the generated ECC key in the provided kse to later
11384
             * restore it.*/
11385
            keyShareEntry->key = ecc_kse->key;
11386
            keyShareEntry->keyLen = ecc_kse->keyLen;
11387
            keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen;
11388
            keyShareEntry->lastRet = WC_PENDING_E;
11389
            ecc_kse->key = NULL;
11390
        }
11391
        else if (ret == 0 &&
11392
                 keyShareEntry->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11393
            keyShareEntry->lastRet = 0;
11394
            ecc_kse->lastRet = 0;
11395
        }
11396
    #endif
11397
0
    }
11398
11399
0
    if (ret == 0 && len != pubSz + ecc_kse->pubKeyLen) {
11400
0
        WOLFSSL_MSG("Invalid public key.");
11401
0
        WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11402
0
        ret = BAD_KEY_SHARE_DATA;
11403
0
    }
11404
11405
    /* Allocate buffer for the concatenated client key share data
11406
     * (PQC KEM ciphertext + ECDH public key) */
11407
0
    if (ret == 0) {
11408
0
        ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap,
11409
0
            DYNAMIC_TYPE_TLSX);
11410
11411
0
        if (ciphertext == NULL) {
11412
0
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
11413
0
            ret = MEMORY_E;
11414
0
        }
11415
0
    }
11416
11417
    /* Process ECDH key share part. The generated shared secret is directly
11418
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
11419
     * pqc_first flag, the ECDH shared secret part goes before or after the
11420
     * KEM part. */
11421
0
    if (ret == 0) {
11422
0
        ecc_kse->keLen = len - pubSz;
11423
0
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
11424
0
                                     DYNAMIC_TYPE_PUBLIC_KEY);
11425
0
        if (ecc_kse->ke == NULL) {
11426
0
            WOLFSSL_MSG("ecc_kse memory allocation failure");
11427
0
            ret = MEMORY_ERROR;
11428
0
        }
11429
0
        if (ret == 0) {
11430
0
            int pubOffset = 0;
11431
0
            int ssOffset = 0;
11432
11433
0
            if (pqc_first) {
11434
0
                pubOffset = pubSz;
11435
0
                ssOffset = ssSzPqc;
11436
0
            }
11437
11438
0
            XMEMCPY(ecc_kse->ke, data + pubOffset, ecc_kse->keLen);
11439
11440
        #ifdef HAVE_CURVE25519
11441
            if (ecc_group == WOLFSSL_ECC_X25519) {
11442
                ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
11443
                        ssl->arrays->preMasterSecret + ssOffset,
11444
                        &ssl->arrays->preMasterSz);
11445
            }
11446
            else
11447
        #endif
11448
        #ifdef HAVE_CURVE448
11449
            if (ecc_group == WOLFSSL_ECC_X448) {
11450
                ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
11451
                        ssl->arrays->preMasterSecret + ssOffset,
11452
                        &ssl->arrays->preMasterSz);
11453
            }
11454
            else
11455
        #endif
11456
0
            {
11457
0
                ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
11458
0
                        ssl->arrays->preMasterSecret + ssOffset,
11459
0
                        &ssl->arrays->preMasterSz);
11460
0
            }
11461
0
        }
11462
0
        if (ret == 0) {
11463
0
            if (ssl->arrays->preMasterSz != ecc_kse->keyLen) {
11464
0
                WOLFSSL_MSG("Data length mismatch.");
11465
0
                ret = BAD_FUNC_ARG;
11466
0
            }
11467
0
        }
11468
    #ifdef WOLFSSL_ASYNC_CRYPT
11469
        else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11470
            keyShareEntry->lastRet = WC_PENDING_E;
11471
            keyShareEntry->key = ecc_kse->key;
11472
            keyShareEntry->keyLen = ecc_kse->keyLen;
11473
            keyShareEntry->pubKey = ecc_kse->pubKey;
11474
            keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen;
11475
            ecc_kse->key = NULL;
11476
            ecc_kse->pubKey = NULL;
11477
        }
11478
    #endif
11479
0
    }
11480
11481
0
    if (ret == 0 && ssl->arrays->preMasterSz + ssSzPqc > MAX_PREMASTER_SZ) {
11482
0
        WOLFSSL_MSG("shared secret is too long.");
11483
0
        ret = LENGTH_ERROR;
11484
0
    }
11485
11486
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
11487
     * KEM shared secret part goes before or after the ECDH part. */
11488
0
    if (ret == 0) {
11489
0
        int input_offset = ecc_kse->keLen;
11490
0
        int output_offset = ssl->arrays->preMasterSz;
11491
11492
0
        if (pqc_first) {
11493
0
            input_offset = 0;
11494
0
            output_offset = 0;
11495
0
        }
11496
11497
0
        ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, pqc_kse,
11498
0
                data + input_offset, pubSz,
11499
0
                ssl->arrays->preMasterSecret + output_offset, &ssSzPqc);
11500
0
    }
11501
11502
0
    if (ret == 0) {
11503
0
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11504
11505
0
        ssl->arrays->preMasterSz += ssSzPqc;
11506
0
        keyShareEntry->ke = NULL;
11507
0
        keyShareEntry->keLen = 0;
11508
    #ifdef WOLFSSL_ASYNC_CRYPT
11509
        /* Hybrid encapsulation is fully complete here. Clear the pending
11510
         * state so the TLS_ASYNC_VERIFY re-drive is skipped and does not
11511
         * re-enter this handler with the now-freed ke. */
11512
        keyShareEntry->lastRet = 0;
11513
    #endif
11514
11515
        /* Concatenate the ECDH public key and the PQC KEM ciphertext. Based on
11516
         * the pqc_first flag, the ECDH public key goes before or after the KEM
11517
         * ciphertext. */
11518
0
        if (pqc_first) {
11519
0
            XMEMCPY(ciphertext, pqc_kse->pubKey, ctSz);
11520
0
            XMEMCPY(ciphertext + ctSz, ecc_kse->pubKey, ecc_kse->pubKeyLen);
11521
0
        }
11522
0
        else {
11523
0
            XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen);
11524
0
            XMEMCPY(ciphertext + ecc_kse->pubKeyLen, pqc_kse->pubKey, ctSz);
11525
0
        }
11526
11527
0
        XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11528
0
        keyShareEntry->pubKey = ciphertext;
11529
0
        keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen + ctSz;
11530
0
        ciphertext = NULL;
11531
11532
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
11533
         * the server side. */
11534
0
        ssl->namedGroup = keyShareEntry->group;
11535
0
    }
11536
0
    else
11537
#ifdef WOLFSSL_ASYNC_CRYPT
11538
        if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
11539
#endif
11540
0
    {
11541
        /* Clear the pre master secret buffer to prevent leaking any
11542
         * intermediate keys in the error case. Do not use preMasterSz
11543
         * here as it may already been set to the ECC shared secret size,
11544
         * which would be too small due to the PQC offset case. */
11545
0
        ForceZero(ssl->arrays->preMasterSecret, MAX_PREMASTER_SZ);
11546
0
    }
11547
11548
0
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
11549
0
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
11550
0
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
11551
0
    return ret;
11552
0
}
11553
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_ENCAPSULATE */
11554
11555
/* Use the data to create a new key share object in the extensions.
11556
 *
11557
 * ssl    The SSL/TLS object.
11558
 * group  The named group.
11559
 * len    The length of the public key data.
11560
 * data   The public key data.
11561
 * kse    The new key share entry object.
11562
 * returns 0 on success and other values indicate failure.
11563
 */
11564
int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
11565
                      KeyShareEntry **kse, TLSX** extensions)
11566
0
{
11567
0
    int            ret = 0;
11568
0
    TLSX*          extension;
11569
0
    KeyShareEntry* keyShareEntry = NULL;
11570
11571
    /* Find the KeyShare extension if it exists. */
11572
0
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11573
0
    if (extension == NULL) {
11574
        /* Push new KeyShare extension. */
11575
0
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11576
0
        if (ret != 0)
11577
0
            return ret;
11578
11579
0
        extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11580
0
        if (extension == NULL)
11581
0
            return MEMORY_E;
11582
0
    }
11583
0
    extension->resp = 0;
11584
11585
    /* Try to find the key share entry with this group. */
11586
0
    keyShareEntry = (KeyShareEntry*)extension->data;
11587
0
    while (keyShareEntry != NULL) {
11588
    #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
11589
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
11590
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
11591
                keyShareEntry->group == WOLFSSL_SECP256R1MLKEM512) ||
11592
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
11593
                keyShareEntry->group == WOLFSSL_SECP384R1MLKEM768) ||
11594
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
11595
                keyShareEntry->group == WOLFSSL_SECP521R1MLKEM1024)) {
11596
            keyShareEntry->group = group;
11597
            break;
11598
        }
11599
        else
11600
    #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
11601
0
        if (keyShareEntry->group == group)
11602
0
            break;
11603
0
        keyShareEntry = keyShareEntry->next;
11604
0
    }
11605
11606
    /* Create a new key share entry if not found. */
11607
0
    if (keyShareEntry == NULL) {
11608
0
        ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
11609
0
                                ssl->heap, &keyShareEntry);
11610
0
        if (ret != 0)
11611
0
            return ret;
11612
0
    }
11613
11614
0
    if (data != NULL) {
11615
        /* Store the peer data in the key share object. */
11616
0
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11617
0
        keyShareEntry->ke = data;
11618
0
        keyShareEntry->keLen = len;
11619
0
    }
11620
0
    else {
11621
        /* Generate a key pair. Casting to non-const since changes inside are
11622
         * minimal but would require an extensive redesign to refactor. Also
11623
         * this path shouldn't be taken when parsing a ClientHello in stateless
11624
         * mode. */
11625
0
        ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, keyShareEntry);
11626
0
        if (ret != 0)
11627
0
            return ret;
11628
0
    }
11629
11630
0
    if (kse != NULL)
11631
0
        *kse = keyShareEntry;
11632
11633
0
    return 0;
11634
0
}
11635
11636
/* Set an empty Key Share extension.
11637
 *
11638
 * ssl  The SSL/TLS object.
11639
 * returns 0 on success and other values indicate failure.
11640
 */
11641
int TLSX_KeyShare_Empty(WOLFSSL* ssl)
11642
0
{
11643
0
    int   ret = 0;
11644
0
    TLSX* extension;
11645
11646
    /* Find the KeyShare extension if it exists. */
11647
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11648
0
    if (extension == NULL) {
11649
        /* Push new KeyShare extension. */
11650
0
        ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11651
0
    }
11652
0
    else if (extension->data != NULL) {
11653
0
        TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
11654
0
        extension->data = NULL;
11655
0
    }
11656
11657
0
    return ret;
11658
0
}
11659
11660
/* Compile-time gating must stay aligned with TLSX_PopulateSupportedGroups().
11661
 * Runtime-only conditions in that function (TLS 1.3 version check, FFDHE
11662
 * key-size bounds, session-resumption short-circuit, downgrade-aware
11663
 * Brainpool TLS 1.2 selection) are intentionally not represented here. */
11664
static const word16 preferredGroup[] = {
11665
    /* Sort by strength, but prefer non-experimental PQ/T hybrid groups */
11666
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11667
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS)
11668
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
11669
        ECC_MIN_KEY_SZ <= 256
11670
    WOLFSSL_X25519MLKEM768,
11671
    #endif
11672
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11673
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11674
        ECC_MIN_KEY_SZ <= 384
11675
    WOLFSSL_SECP384R1MLKEM1024,
11676
    #endif
11677
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11678
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11679
        ECC_MIN_KEY_SZ <= 256
11680
    WOLFSSL_SECP256R1MLKEM768,
11681
    #endif
11682
#endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && !WOLFSSL_NO_ML_KEM &&
11683
        * WOLFSSL_PQC_HYBRIDS */
11684
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11685
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_1024) && \
11686
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11687
    WOLFSSL_ML_KEM_1024,
11688
#endif
11689
#if defined(HAVE_ECC) && (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
11690
    !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
11691
    WOLFSSL_ECC_SECP521R1,
11692
#endif
11693
#if defined(HAVE_ECC) && (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && \
11694
    defined(HAVE_ECC_BRAINPOOL) && ECC_MIN_KEY_SZ <= 512
11695
    WOLFSSL_ECC_BRAINPOOLP512R1TLS13,
11696
    WOLFSSL_ECC_BRAINPOOLP512R1,
11697
#endif
11698
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11699
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_768) && \
11700
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11701
    WOLFSSL_ML_KEM_768,
11702
#endif
11703
#if defined(HAVE_ECC) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11704
    ECC_MIN_KEY_SZ <= 384
11705
    #ifndef NO_ECC_SECP
11706
    WOLFSSL_ECC_SECP384R1,
11707
    #endif
11708
    #ifdef HAVE_ECC_BRAINPOOL
11709
    WOLFSSL_ECC_BRAINPOOLP384R1TLS13,
11710
    WOLFSSL_ECC_BRAINPOOLP384R1,
11711
    #endif
11712
#endif
11713
#if !defined(HAVE_FIPS) && defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11714
    WOLFSSL_ECC_X448,
11715
#endif
11716
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11717
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_512) && \
11718
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11719
    WOLFSSL_ML_KEM_512,
11720
#endif
11721
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11722
    ECC_MIN_KEY_SZ <= 256
11723
    #ifndef NO_ECC_SECP
11724
    WOLFSSL_ECC_SECP256R1,
11725
    #endif
11726
    #ifdef HAVE_ECC_KOBLITZ
11727
    WOLFSSL_ECC_SECP256K1,
11728
    #endif
11729
    #ifdef HAVE_ECC_BRAINPOOL
11730
    WOLFSSL_ECC_BRAINPOOLP256R1TLS13,
11731
    WOLFSSL_ECC_BRAINPOOLP256R1,
11732
    #endif
11733
    #if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
11734
    WOLFSSL_ECC_SM2P256V1,
11735
    #endif
11736
#endif
11737
#if !defined(HAVE_FIPS) && defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11738
    WOLFSSL_ECC_X25519,
11739
#endif
11740
#if defined(HAVE_ECC) && (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && \
11741
    ECC_MIN_KEY_SZ <= 224
11742
    #ifndef NO_ECC_SECP
11743
    WOLFSSL_ECC_SECP224R1,
11744
    #endif
11745
    #ifdef HAVE_ECC_KOBLITZ
11746
    WOLFSSL_ECC_SECP224K1,
11747
    #endif
11748
#endif
11749
#if !defined(HAVE_FIPS) && defined(HAVE_ECC)
11750
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && \
11751
        ECC_MIN_KEY_SZ <= 192
11752
        #ifndef NO_ECC_SECP
11753
        WOLFSSL_ECC_SECP192R1,
11754
        #endif
11755
        #ifdef HAVE_ECC_KOBLITZ
11756
        WOLFSSL_ECC_SECP192K1,
11757
        #endif
11758
    #endif
11759
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && \
11760
        ECC_MIN_KEY_SZ <= 160
11761
        #ifndef NO_ECC_SECP
11762
        WOLFSSL_ECC_SECP160R1,
11763
        #endif
11764
        #ifdef HAVE_ECC_SECPR2
11765
        WOLFSSL_ECC_SECP160R2,
11766
        #endif
11767
        #ifdef HAVE_ECC_KOBLITZ
11768
        WOLFSSL_ECC_SECP160K1,
11769
        #endif
11770
    #endif
11771
#endif /* !HAVE_FIPS && HAVE_ECC */
11772
#if defined(HAVE_FFDHE_8192)
11773
    WOLFSSL_FFDHE_8192,
11774
#endif
11775
#if defined(HAVE_FFDHE_6144)
11776
    WOLFSSL_FFDHE_6144,
11777
#endif
11778
#if defined(HAVE_FFDHE_4096)
11779
    WOLFSSL_FFDHE_4096,
11780
#endif
11781
#if defined(HAVE_FFDHE_3072)
11782
    WOLFSSL_FFDHE_3072,
11783
#endif
11784
#if defined(HAVE_FFDHE_2048)
11785
    WOLFSSL_FFDHE_2048,
11786
#endif
11787
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11788
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
11789
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11790
        (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
11791
        ECC_MIN_KEY_SZ <= 521
11792
    WOLFSSL_SECP521R1MLKEM1024,
11793
    #endif
11794
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11795
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11796
        ECC_MIN_KEY_SZ <= 384
11797
    WOLFSSL_SECP384R1MLKEM768,
11798
    #endif
11799
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE448) && \
11800
        ECC_MIN_KEY_SZ <= 448
11801
    WOLFSSL_X448MLKEM768,
11802
    #endif
11803
    #if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_ECC) && \
11804
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11805
        ECC_MIN_KEY_SZ <= 256
11806
    WOLFSSL_SECP256R1MLKEM512,
11807
    #endif
11808
    #if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_CURVE25519) && \
11809
        ECC_MIN_KEY_SZ <= 256
11810
    WOLFSSL_X25519MLKEM512,
11811
    #endif
11812
#endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && !WOLFSSL_NO_ML_KEM &&
11813
        * WOLFSSL_EXTRA_PQC_HYBRIDS */
11814
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11815
    defined(WOLFSSL_MLKEM_KYBER)
11816
    #ifdef WOLFSSL_KYBER1024
11817
    WOLFSSL_KYBER_LEVEL5,
11818
    #if defined(HAVE_ECC) && (defined(HAVE_ECC521) || \
11819
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
11820
    WOLFSSL_P521_KYBER_LEVEL5,
11821
    #endif
11822
    #endif
11823
    #ifdef WOLFSSL_KYBER768
11824
    WOLFSSL_KYBER_LEVEL3,
11825
    #if defined(HAVE_ECC) && (defined(HAVE_ECC384) || \
11826
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
11827
    WOLFSSL_P384_KYBER_LEVEL3,
11828
    #endif
11829
    #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11830
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
11831
    WOLFSSL_P256_KYBER_LEVEL3,
11832
    #endif
11833
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11834
    WOLFSSL_X25519_KYBER_LEVEL3,
11835
    #endif
11836
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11837
    WOLFSSL_X448_KYBER_LEVEL3,
11838
    #endif
11839
    #endif
11840
    #ifdef WOLFSSL_KYBER512
11841
    WOLFSSL_KYBER_LEVEL1,
11842
    #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11843
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
11844
    WOLFSSL_P256_KYBER_LEVEL1,
11845
    #endif
11846
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11847
    WOLFSSL_X25519_KYBER_LEVEL1,
11848
    #endif
11849
    #endif
11850
#endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && WOLFSSL_MLKEM_KYBER */
11851
    WOLFSSL_NAMED_GROUP_INVALID
11852
};
11853
11854
#define PREFERRED_GROUP_SZ \
11855
0
    ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
11856
                                            /* -1 for the invalid group */
11857
11858
/* One past the worst rank TLSX_KeyShare_GroupRank() can return. It ranks
11859
 * against ssl->group[] when the user set a list and against preferredGroup[]
11860
 * otherwise, so the sentinel has to cover the longer of the two. */
11861
#define WOLFSSL_WORST_GROUP_RANK \
11862
0
    ((int)(((size_t)WOLFSSL_MAX_GROUP_COUNT > PREFERRED_GROUP_SZ) ? \
11863
0
        (size_t)WOLFSSL_MAX_GROUP_COUNT : PREFERRED_GROUP_SZ))
11864
11865
/* WOLFSSL_KEY_SHARE_DEFAULT_GROUP - group used for the speculative key share
11866
 * in ClientHello messages when the application has not selected one via
11867
 * wolfSSL_CTX_set_groups() / wolfSSL_set_groups() or wolfSSL_UseKeyShare().
11868
 *
11869
 * The default is optimized for the likelihood that the server will accept the
11870
 * speculative key share without forcing a HelloRetryRequest. It therefore
11871
 * differs from preferredGroup[] (which is sorted by strength): we pick the
11872
 * most widely deployed group at each tier rather than the strongest.
11873
 *
11874
 * Selection order when not user-defined:
11875
 *   1. A standardized PQ/T hybrid using X25519 or SECP256R1, if available.
11876
 *   2. SECP256R1, then X25519, then SECP384R1.
11877
 *   3. FFDHE 2048 or 3072, for DH-only TLS 1.3 builds.
11878
 *   4. preferredGroup[0] as a final fallback for any other configuration.
11879
 *
11880
 * Users can override the default by defining WOLFSSL_KEY_SHARE_DEFAULT_GROUP
11881
 * in user_settings.h to any of the WOLFSSL_* group identifiers from
11882
 * wolfssl/ssl.h (or the numeric IANA code point). The macro is substituted
11883
 * directly into an assignment, so wrap non-trivial expressions in parentheses.
11884
 */
11885
#ifndef WOLFSSL_KEY_SHARE_DEFAULT_GROUP
11886
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
11887
      !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11888
      !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
11889
      ECC_MIN_KEY_SZ <= 256
11890
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_X25519MLKEM768
11891
#elif defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
11892
      !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11893
      !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11894
      (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11895
      ECC_MIN_KEY_SZ <= 256
11896
0
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_SECP256R1MLKEM768
11897
#elif defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
11898
      !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11899
      !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11900
      (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11901
      ECC_MIN_KEY_SZ <= 384
11902
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_SECP384R1MLKEM1024
11903
#elif defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11904
      defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 && \
11905
      !defined(NO_ECC_SECP)
11906
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_SECP256R1
11907
#elif !defined(HAVE_FIPS) && defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11908
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_X25519
11909
#elif defined(HAVE_ECC) && (defined(HAVE_ECC384) || \
11910
      defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 && \
11911
      !defined(NO_ECC_SECP)
11912
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_SECP384R1
11913
#elif defined(HAVE_FFDHE_2048)
11914
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_FFDHE_2048
11915
#elif defined(HAVE_FFDHE_3072)
11916
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_FFDHE_3072
11917
#else
11918
    /* Fall back to whatever preferredGroup[] starts with. */
11919
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP (preferredGroup[0])
11920
#endif
11921
#endif /* !WOLFSSL_KEY_SHARE_DEFAULT_GROUP */
11922
11923
/* Examines the application specified group ranking and returns the rank of the
11924
 * group.
11925
 * If no group ranking set then all groups are rank 0 (highest).
11926
 *
11927
 * ssl    The SSL/TLS object.
11928
 * group  The group to check ranking for.
11929
 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
11930
 */
11931
static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
11932
0
{
11933
0
    byte i;
11934
0
    const word16* groups;
11935
0
    byte numGroups;
11936
11937
0
    if (ssl->numGroups == 0) {
11938
        /* If the user didn't specify a group list with a preferred order,
11939
         * use the internal preferred group list. */
11940
0
        groups = preferredGroup;
11941
0
        numGroups = PREFERRED_GROUP_SZ;
11942
0
    }
11943
0
    else {
11944
0
        groups = ssl->group;
11945
0
        numGroups = ssl->numGroups;
11946
0
    }
11947
11948
0
    for (i = 0; i < numGroups; i++) {
11949
#if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
11950
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
11951
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
11952
             groups[i] == WOLFSSL_SECP256R1MLKEM512) ||
11953
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
11954
             groups[i] == WOLFSSL_SECP384R1MLKEM768) ||
11955
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
11956
             groups[i] == WOLFSSL_SECP521R1MLKEM1024)) {
11957
            return i;
11958
        }
11959
#endif
11960
0
        if (groups[i] == (word16)group)
11961
0
            return i;
11962
0
    }
11963
11964
0
    return WOLFSSL_FATAL_ERROR;
11965
0
}
11966
11967
/* Set a key share that is supported by the client into extensions.
11968
 *
11969
 * ssl  The SSL/TLS object.
11970
 * returns 0 if a mutual group was found, KEY_SHARE_ERROR if no mutual
11971
 * group exists and other values indicate an error.
11972
 */
11973
int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, TLSX** extensions)
11974
0
{
11975
0
    int             ret;
11976
0
#ifdef HAVE_SUPPORTED_CURVES
11977
0
    TLSX*           extension;
11978
0
    SupportedCurve* curve = NULL;
11979
0
    SupportedCurve* preferredCurve = NULL;
11980
0
    word16          name = WOLFSSL_NAMED_GROUP_INVALID;
11981
0
    KeyShareEntry*  kse = NULL;
11982
0
    int             preferredRank = WOLFSSL_WORST_GROUP_RANK;
11983
0
    int             rank;
11984
11985
0
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
11986
0
    if (extension != NULL)
11987
0
        curve = (SupportedCurve*)extension->data;
11988
0
    for (; curve != NULL; curve = curve->next) {
11989
        /* Use server's preference order. Common group was found but key share
11990
         * was missing */
11991
0
        if (!TLSX_IsGroupSupported(curve->name, ssl->options.side))
11992
0
            continue;
11993
0
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
11994
0
            continue;
11995
11996
0
        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
11997
0
        if (rank == -1)
11998
0
            continue;
11999
0
        if (rank < preferredRank) {
12000
0
            preferredCurve = curve;
12001
0
            preferredRank = rank;
12002
0
        }
12003
0
    }
12004
0
    curve = preferredCurve;
12005
12006
0
    if (curve == NULL) {
12007
        /* No mutual group exists. An HRR may request only a group the
12008
         * client advertised in supported_groups, so it cannot recover.
12009
         * RFC 8446 4.2.1. */
12010
0
        WOLFSSL_ERROR_VERBOSE(KEY_SHARE_ERROR);
12011
0
        return KEY_SHARE_ERROR;
12012
0
    }
12013
0
    name = curve->name;
12014
12015
    #ifdef WOLFSSL_ASYNC_CRYPT
12016
    /* Check the old key share data list. */
12017
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
12018
    if (extension != NULL) {
12019
        kse = (KeyShareEntry*)extension->data;
12020
        /* We should not be computing keys if we are only going to advertise
12021
         * our choice here. */
12022
        if (kse != NULL && kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
12023
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
12024
            return BAD_KEY_SHARE_DATA;
12025
        }
12026
    }
12027
    #endif
12028
12029
    /* Push new KeyShare extension. This will also free the old one */
12030
0
    ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
12031
0
    if (ret != 0)
12032
0
        return ret;
12033
    /* Extension got pushed to head */
12034
0
    extension = *extensions;
12035
    /* Push the selected curve */
12036
0
    ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, name,
12037
0
                            ssl->heap, &kse);
12038
0
    if (ret != 0)
12039
0
        return ret;
12040
    /* Set extension to be in response. */
12041
0
    extension->resp = 1;
12042
#else
12043
12044
    (void)ssl;
12045
12046
    WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN);
12047
    ret = NOT_COMPILED_IN;
12048
#endif
12049
12050
0
    return ret;
12051
0
}
12052
12053
#ifdef WOLFSSL_DUAL_ALG_CERTS
12054
/* Writes the CKS objects of a list in a buffer. */
12055
static word16 CKS_WRITE(WOLFSSL* ssl, byte* output)
12056
{
12057
    XMEMCPY(output, ssl->sigSpec, ssl->sigSpecSz);
12058
    return ssl->sigSpecSz;
12059
}
12060
12061
static int TLSX_UseCKS(TLSX** extensions, WOLFSSL* ssl, void* heap)
12062
{
12063
    int ret = 0;
12064
    TLSX* extension;
12065
12066
    if (extensions == NULL) {
12067
        return BAD_FUNC_ARG;
12068
    }
12069
12070
    extension = TLSX_Find(*extensions, TLSX_CKS);
12071
    /* If it is already present, do nothing. */
12072
    if (extension == NULL) {
12073
        /* The data required is in the ssl struct, so push it in. */
12074
        ret = TLSX_Push(extensions, TLSX_CKS, (void*)ssl, heap);
12075
    }
12076
12077
    return ret;
12078
}
12079
12080
int TLSX_CKS_Set(WOLFSSL* ssl, TLSX** extensions)
12081
{
12082
    int ret;
12083
    TLSX* extension;
12084
    /* Push new KeyShare extension. This will also free the old one */
12085
    ret = TLSX_Push(extensions, TLSX_CKS, NULL, ssl->heap);
12086
    if (ret != 0)
12087
        return ret;
12088
    /* Extension got pushed to head */
12089
    extension = *extensions;
12090
    /* Need ssl->sigSpecSz during extension length calculation. */
12091
    extension->data = ssl;
12092
    /* Set extension to be in response. */
12093
    extension->resp = 1;
12094
    return ret;
12095
}
12096
12097
int TLSX_CKS_Parse(WOLFSSL* ssl, byte* input, word16 length,
12098
                   TLSX** extensions)
12099
{
12100
    int ret;
12101
    int i, j;
12102
12103
    (void) extensions;
12104
12105
    /* Validating the input. A well-formed CKS list carries at most one of each
12106
     * valid specifier, so reject anything longer than WOLFSSL_MAX_CKS_SIGSPEC_SZ
12107
     * to bound the peerSigSpec allocation below. */
12108
    if (length == 0 || length > WOLFSSL_MAX_CKS_SIGSPEC_SZ)
12109
        return BUFFER_ERROR;
12110
    for (i = 0; i < length; i++) {
12111
        switch (input[i])
12112
        {
12113
            case WOLFSSL_CKS_SIGSPEC_NATIVE:
12114
            case WOLFSSL_CKS_SIGSPEC_ALTERNATIVE:
12115
            case WOLFSSL_CKS_SIGSPEC_BOTH:
12116
                /* These are all valid values; do nothing */
12117
                break;
12118
            case WOLFSSL_CKS_SIGSPEC_EXTERNAL:
12119
            default:
12120
                /* All other values (including external) are not. */
12121
                return BAD_FUNC_ARG;
12122
        }
12123
    }
12124
12125
    /* This could be a situation where the client tried to start with TLS 1.3
12126
     * when it sent ClientHello and the server down-graded to TLS 1.2. In that
12127
     * case, erroring out because it is TLS 1.2 is not a reasonable thing to do.
12128
     * In the case of TLS 1.2, the CKS values will be ignored. */
12129
    if (!IsAtLeastTLSv1_3(ssl->version)) {
12130
        ssl->sigSpec = NULL;
12131
        ssl->sigSpecSz = 0;
12132
        return 0;
12133
    }
12134
12135
    /* Extension data is valid, but if we are the server and we don't have an
12136
     * alt private key, do not respond with CKS extension. */
12137
    if (wolfSSL_is_server(ssl) && ssl->buffers.altKey == NULL) {
12138
        ssl->sigSpec = NULL;
12139
        ssl->sigSpecSz = 0;
12140
        return 0;
12141
    }
12142
12143
    /* sigSpec may point at the previous copy. */
12144
    if (ssl->sigSpec == ssl->peerSigSpec) {
12145
        ssl->sigSpec = NULL;
12146
        ssl->sigSpecSz = 0;
12147
    }
12148
    XFREE(ssl->peerSigSpec, ssl->heap, DYNAMIC_TYPE_TLSX);
12149
12150
    /* Copy as the lifetime of input seems to be ephemeral. */
12151
    ssl->peerSigSpec = (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_TLSX);
12152
    if (ssl->peerSigSpec == NULL) {
12153
        return BUFFER_ERROR;
12154
    }
12155
    XMEMCPY(ssl->peerSigSpec, input, length);
12156
    ssl->peerSigSpecSz = length;
12157
12158
    /* If there is no preference set, use theirs... */
12159
    if (ssl->sigSpec == NULL) {
12160
        ret = wolfSSL_UseCKS(ssl, ssl->peerSigSpec, 1);
12161
        if (ret == WOLFSSL_SUCCESS) {
12162
            ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
12163
            TLSX_SetResponse(ssl, TLSX_CKS);
12164
        }
12165
        return ret;
12166
    }
12167
12168
    /* ...otherwise, prioritize our preference. */
12169
    for (i = 0; i < ssl->sigSpecSz; i++) {
12170
        for (j = 0; j < length; j++) {
12171
            if (ssl->sigSpec[i] == input[j]) {
12172
                /* Got the match, set to this one. */
12173
                ret = wolfSSL_UseCKS(ssl, &ssl->sigSpec[i], 1);
12174
                if (ret == WOLFSSL_SUCCESS) {
12175
                    ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
12176
                    TLSX_SetResponse(ssl, TLSX_CKS);
12177
                }
12178
                return ret;
12179
            }
12180
        }
12181
    }
12182
12183
    /* No match found. Cannot continue. */
12184
    return MATCH_SUITE_ERROR;
12185
}
12186
#endif /* WOLFSSL_DUAL_ALG_CERTS */
12187
12188
/* Server side KSE processing */
12189
int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
12190
    byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, byte* searched)
12191
0
{
12192
0
    TLSX*          extension;
12193
0
    KeyShareEntry* clientKSE = NULL;
12194
0
    KeyShareEntry* list = NULL;
12195
0
    KeyShareEntry* preferredKSE = NULL;
12196
0
    int preferredRank = WOLFSSL_WORST_GROUP_RANK;
12197
0
    int rank;
12198
12199
0
    (void)cipherSuite0;
12200
0
    (void)cipherSuite;
12201
12202
0
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
12203
0
        return BAD_FUNC_ARG;
12204
12205
0
    *searched = 0;
12206
12207
    /* Find the KeyShare extension if it exists. */
12208
0
    extension = TLSX_Find(extensions, TLSX_KEY_SHARE);
12209
0
    if (extension != NULL)
12210
0
        list = (KeyShareEntry*)extension->data;
12211
12212
0
    if (extension && extension->resp == 1) {
12213
        /* Outside of the async case this path should not be taken. */
12214
0
        int ret = WC_NO_ERR_TRACE(INCOMPLETE_DATA);
12215
    #ifdef WOLFSSL_ASYNC_CRYPT
12216
        /* in async case make sure key generation is finalized */
12217
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
12218
        if (serverKSE && serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
12219
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
12220
                *searched = 1;
12221
            ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
12222
        }
12223
        else
12224
    #endif
12225
0
        {
12226
0
            ret = INCOMPLETE_DATA;
12227
0
        }
12228
0
        return ret;
12229
0
    }
12230
12231
    /* Use server's preference order. */
12232
0
    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
12233
0
        if (clientKSE->ke == NULL)
12234
0
            continue;
12235
12236
#ifdef WOLFSSL_SM2
12237
        if ((cipherSuite0 == CIPHER_BYTE) &&
12238
            ((cipherSuite == TLS_SM4_GCM_SM3) ||
12239
             (cipherSuite == TLS_SM4_CCM_SM3))) {
12240
           if (clientKSE->group != WOLFSSL_ECC_SM2P256V1) {
12241
               continue;
12242
           }
12243
        }
12244
        else if (clientKSE->group == WOLFSSL_ECC_SM2P256V1) {
12245
           continue;
12246
        }
12247
#endif
12248
12249
        /* Check consistency now - extensions in any order. */
12250
0
        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions))
12251
0
            continue;
12252
12253
0
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(clientKSE->group)) {
12254
            /* Check max value supported. */
12255
0
            if (clientKSE->group > WOLFSSL_ECC_MAX) {
12256
0
#ifdef WOLFSSL_HAVE_MLKEM
12257
0
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) &&
12258
0
                    !WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group))
12259
0
#endif
12260
0
                    continue;
12261
0
            }
12262
0
            if (wolfSSL_curve_is_disabled(ssl, clientKSE->group))
12263
0
                continue;
12264
0
        }
12265
0
        if (!TLSX_IsGroupSupported(clientKSE->group, ssl->options.side))
12266
0
            continue;
12267
12268
0
        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
12269
0
        if (rank == -1)
12270
0
            continue;
12271
0
        if (rank < preferredRank) {
12272
0
            preferredKSE = clientKSE;
12273
0
            preferredRank = rank;
12274
0
        }
12275
0
    }
12276
0
    *kse = preferredKSE;
12277
0
    *searched = 1;
12278
0
    return 0;
12279
0
}
12280
12281
/* Server side KSE processing */
12282
int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
12283
0
{
12284
0
    int            ret;
12285
0
    TLSX*          extension;
12286
0
    KeyShareEntry* serverKSE;
12287
0
    KeyShareEntry* list = NULL;
12288
12289
0
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
12290
0
        return BAD_FUNC_ARG;
12291
12292
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
12293
0
    if (extension == NULL)
12294
0
        return BAD_STATE_E;
12295
12296
0
    if (clientKSE == NULL) {
12297
#ifdef WOLFSSL_ASYNC_CRYPT
12298
        /* Not necessarily an error. The key may have already been setup. */
12299
        if (extension != NULL && extension->resp == 1) {
12300
            serverKSE = (KeyShareEntry*)extension->data;
12301
            if (serverKSE != NULL) {
12302
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
12303
                /* Re-drive server hybrid encapsulation on resume. GenKey
12304
                 * routes a hybrid group to the client generator, and the
12305
                 * lastRet == 0 path treats the share as done after only the
12306
                 * ECDH part completed, dropping the KEM ciphertext. ke holds
12307
                 * the client share until the handler completes and clears it. */
12308
                if (serverKSE->ke != NULL &&
12309
                        WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(serverKSE->group)) {
12310
                    return TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
12311
                            serverKSE, serverKSE->ke, serverKSE->keLen);
12312
                }
12313
#endif
12314
                /* in async case make sure key generation is finalized */
12315
                if (serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E))
12316
                    return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
12317
                else if (serverKSE->lastRet == 0)
12318
                    return 0;
12319
            }
12320
        }
12321
#endif
12322
0
        return BAD_FUNC_ARG;
12323
0
    }
12324
12325
    /* Generate a new key pair except in the case of PQC KEM because we
12326
     * are going to encapsulate and that does not require us to generate a
12327
     * key pair.
12328
     */
12329
0
    ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
12330
0
    if (ret != 0)
12331
0
        return ret;
12332
12333
0
    if (clientKSE->key == NULL) {
12334
0
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
12335
0
        if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) {
12336
0
            ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, serverKSE,
12337
0
                    clientKSE->ke, clientKSE->keLen,
12338
0
                    ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
12339
0
        }
12340
0
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
12341
0
            ret = TLSX_KeyShare_HandlePqcHybridKeyServer(ssl, serverKSE,
12342
0
                    clientKSE->ke, clientKSE->keLen);
12343
0
        }
12344
0
        else
12345
0
#endif
12346
0
        {
12347
0
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
12348
0
        }
12349
12350
        /* for async do setup of serverKSE below, but return WC_PENDING_E */
12351
0
        if (ret != 0
12352
        #ifdef WOLFSSL_ASYNC_CRYPT
12353
            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
12354
        #endif
12355
0
        ) {
12356
0
            TLSX_KeyShare_FreeAll(list, ssl->heap);
12357
0
            return ret;
12358
0
        }
12359
0
    }
12360
0
    else {
12361
        /* transfer buffers to serverKSE */
12362
0
        serverKSE->key = clientKSE->key;
12363
0
        clientKSE->key = NULL;
12364
0
        serverKSE->keyLen = clientKSE->keyLen;
12365
0
        serverKSE->pubKey = clientKSE->pubKey;
12366
0
        clientKSE->pubKey = NULL;
12367
0
        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
12368
0
    #ifndef NO_DH
12369
0
        serverKSE->privKey = clientKSE->privKey;
12370
0
        clientKSE->privKey = NULL;
12371
0
    #endif
12372
0
    }
12373
0
    serverKSE->ke = clientKSE->ke;
12374
0
    serverKSE->keLen = clientKSE->keLen;
12375
0
    clientKSE->ke = NULL;
12376
0
    clientKSE->keLen = 0;
12377
0
    ssl->namedGroup = serverKSE->group;
12378
12379
0
    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
12380
0
    extension->data = (void *)serverKSE;
12381
12382
0
    extension->resp = 1;
12383
0
    return ret;
12384
0
}
12385
12386
/* Ensure there is a key pair that can be used for key exchange.
12387
 *
12388
 * ssl  The SSL/TLS object.
12389
 * doHelloRetry If set to non-zero will do hello_retry
12390
 * returns 0 on success and other values indicate failure.
12391
 */
12392
int TLSX_KeyShare_Establish(WOLFSSL *ssl, int* doHelloRetry)
12393
0
{
12394
0
    int            ret;
12395
0
    KeyShareEntry* clientKSE = NULL;
12396
0
    byte           searched = 0;
12397
12398
0
    *doHelloRetry = 0;
12399
12400
0
    ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, ssl->cipher.cipherSuite0,
12401
0
        ssl->cipher.cipherSuite, &clientKSE, &searched);
12402
0
    if (ret != 0 || !searched)
12403
0
        return ret;
12404
12405
    /* No supported group found - send HelloRetryRequest. */
12406
0
    if (clientKSE == NULL) {
12407
        /* HRR is only valid if it requests a group the client advertised.
12408
         * SetSupported fails when no mutual group exists. */
12409
0
        ret = TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
12410
0
        if (ret == 0)
12411
0
            *doHelloRetry = 1;
12412
0
        return ret;
12413
0
    }
12414
12415
0
    return TLSX_KeyShare_Setup(ssl, clientKSE);
12416
0
}
12417
12418
/* Derive the shared secret of the key exchange.
12419
 *
12420
 * ssl  The SSL/TLS object.
12421
 * returns 0 on success and other values indicate failure.
12422
 */
12423
int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
12424
0
{
12425
0
    int            ret;
12426
0
    TLSX*          extension;
12427
0
    KeyShareEntry* list = NULL;
12428
12429
    /* Find the KeyShare extension if it exists. */
12430
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
12431
0
    if (extension != NULL)
12432
0
        list = (KeyShareEntry*)extension->data;
12433
12434
0
    if (list == NULL) {
12435
        /* Unreachable once the handshake reached this accept state
12436
         * (TLSX_KeyShare_Setup installed the extension), so no async event
12437
         * can be stranded by returning before the pop below. */
12438
0
        return KEY_SHARE_ERROR;
12439
0
    }
12440
12441
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) || \
12442
    defined(WOLFSSL_ASYNC_CRYPT)
12443
    /* Already derived: a later pend's retry re-enters here with the peer
12444
     * key freed. Checked before the pop so the later operation's queued
12445
     * event is not stolen. */
12446
    if (list->derived)
12447
        return 0;
12448
#endif
12449
12450
#ifdef WOLFSSL_ASYNC_CRYPT
12451
    ret = wolfSSL_AsyncPop(ssl, NULL);
12452
    /* Check for error */
12453
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) && ret < 0) {
12454
        return ret;
12455
    }
12456
#endif
12457
12458
    /* Calculate secret. */
12459
0
    ret = TLSX_KeyShare_Process(ssl, list);
12460
12461
0
    return ret;
12462
0
}
12463
12464
0
#define KS_FREE_ALL  TLSX_KeyShare_FreeAll
12465
0
#define KS_GET_SIZE  TLSX_KeyShare_GetSize
12466
0
#define KS_WRITE     TLSX_KeyShare_Write
12467
0
#define KS_PARSE     TLSX_KeyShare_Parse
12468
12469
#else
12470
12471
#define KS_FREE_ALL(a, b) WC_DO_NOTHING
12472
#define KS_GET_SIZE(a, b)    0
12473
#define KS_WRITE(a, b, c)    0
12474
#define KS_PARSE(a, b, c, d) 0
12475
12476
#endif /* WOLFSSL_TLS13 */
12477
12478
/******************************************************************************/
12479
/* Pre-Shared Key                                                             */
12480
/******************************************************************************/
12481
12482
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
12483
/* Free the pre-shared key dynamic data.
12484
 *
12485
 * list  The linked list of key share entry objects.
12486
 * heap  The heap used for allocation.
12487
 */
12488
static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
12489
{
12490
    PreSharedKey* current;
12491
12492
    while ((current = list) != NULL) {
12493
        list = current->next;
12494
        /* identity may hold an in-place decrypted ticket whose bytes are the
12495
         * resumption master secret; wipe before returning it to the heap. */
12496
        if (current->identity != NULL)
12497
            ForceZero(current->identity, current->identityLen);
12498
        XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
12499
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
12500
    }
12501
12502
    (void)heap;
12503
}
12504
12505
/* Get the size of the encoded pre shared key extension.
12506
 *
12507
 * list     The linked list of pre-shared key extensions.
12508
 * msgType  The type of the message this extension is being written into.
12509
 * returns the number of bytes of the encoded pre-shared key extension or
12510
 * SANITY_MSG_E to indicate invalid message type.
12511
 */
12512
static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
12513
                                     word16* pSz)
12514
{
12515
    if (msgType == client_hello) {
12516
        /* Length of identities + Length of binders. */
12517
        word32 len = OPAQUE16_LEN + OPAQUE16_LEN;
12518
        while (list != NULL) {
12519
            /* Each entry has: identity, ticket age and binder. */
12520
            len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
12521
                   OPAQUE8_LEN + (word32)list->binderLen;
12522
            if (len > WOLFSSL_MAX_16BIT) {
12523
                WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12524
                return LENGTH_ERROR;
12525
            }
12526
            list = list->next;
12527
        }
12528
        if ((word32)*pSz + len > WOLFSSL_MAX_16BIT) {
12529
            WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12530
            return LENGTH_ERROR;
12531
        }
12532
        *pSz += (word16)len;
12533
        return 0;
12534
    }
12535
12536
    if (msgType == server_hello) {
12537
        *pSz += OPAQUE16_LEN;
12538
        return 0;
12539
    }
12540
12541
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12542
    return SANITY_MSG_E;
12543
}
12544
12545
/* The number of bytes to be written for the binders.
12546
 *
12547
 * list     The linked list of pre-shared key extensions.
12548
 * msgType  The type of the message this extension is being written into.
12549
 * returns the number of bytes of the encoded pre-shared key extension or
12550
 * SANITY_MSG_E to indicate invalid message type.
12551
 */
12552
int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
12553
                                     word16* pSz)
12554
{
12555
    word32 len;
12556
12557
    if (msgType != client_hello) {
12558
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12559
        return SANITY_MSG_E;
12560
    }
12561
12562
    /* Length of all binders. */
12563
    len = OPAQUE16_LEN;
12564
    while (list != NULL) {
12565
        len += OPAQUE8_LEN + (word32)list->binderLen;
12566
        if (len > WOLFSSL_MAX_16BIT) {
12567
            WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12568
            return LENGTH_ERROR;
12569
        }
12570
        list = list->next;
12571
    }
12572
12573
    *pSz = (word16)len;
12574
    return 0;
12575
}
12576
12577
/* Writes the pre-shared key extension into the output buffer - binders only.
12578
 * Assumes that the the output buffer is big enough to hold data.
12579
 *
12580
 * list     The linked list of key share entries.
12581
 * output   The buffer to write into.
12582
 * msgType  The type of the message this extension is being written into.
12583
 * returns the number of bytes written into the buffer.
12584
 */
12585
int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
12586
                                   byte msgType, word16* pSz)
12587
{
12588
    PreSharedKey* current = list;
12589
    word16 idx = 0;
12590
    word16 lenIdx;
12591
    word16 len;
12592
12593
    if (msgType != client_hello) {
12594
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12595
        return SANITY_MSG_E;
12596
    }
12597
12598
    /* Skip length of all binders. */
12599
    lenIdx = idx;
12600
    idx += OPAQUE16_LEN;
12601
    while (current != NULL) {
12602
        /* Binder data length. */
12603
        output[idx++] = (byte)current->binderLen;
12604
        /* Binder data. */
12605
        XMEMCPY(output + idx, current->binder, current->binderLen);
12606
        idx += (word16)current->binderLen;
12607
12608
        current = current->next;
12609
    }
12610
    /* Length of the binders. */
12611
    len = idx - lenIdx - OPAQUE16_LEN;
12612
    c16toa(len, output + lenIdx);
12613
12614
    *pSz = idx;
12615
    return 0;
12616
}
12617
12618
12619
/* Writes the pre-shared key extension into the output buffer.
12620
 * Assumes that the the output buffer is big enough to hold data.
12621
 *
12622
 * list     The linked list of key share entries.
12623
 * output   The buffer to write into.
12624
 * msgType  The type of the message this extension is being written into.
12625
 * returns the number of bytes written into the buffer.
12626
 */
12627
static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
12628
                                   byte msgType, word16* pSz)
12629
{
12630
    if (msgType == client_hello) {
12631
        PreSharedKey* current = list;
12632
        word16 idx = 0;
12633
        word16 lenIdx;
12634
        word16 len;
12635
        int ret;
12636
12637
        /* Write identities only. Binders after HMACing over this. */
12638
        lenIdx = idx;
12639
        idx += OPAQUE16_LEN;
12640
        while (current != NULL) {
12641
            /* Identity length */
12642
            c16toa(current->identityLen, output + idx);
12643
            idx += OPAQUE16_LEN;
12644
            /* Identity data */
12645
            XMEMCPY(output + idx, current->identity, current->identityLen);
12646
            idx += current->identityLen;
12647
12648
            /* Obfuscated ticket age. */
12649
            c32toa(current->ticketAge, output + idx);
12650
            idx += OPAQUE32_LEN;
12651
12652
            current = current->next;
12653
        }
12654
        /* Length of the identities. */
12655
        len = idx - lenIdx - OPAQUE16_LEN;
12656
        c16toa(len, output + lenIdx);
12657
12658
        /* Don't include binders here.
12659
         * The binders are based on the hash of all the ClientHello data up to
12660
         * and include the identities written above.
12661
         */
12662
        ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
12663
        if (ret < 0)
12664
            return ret;
12665
        /* Zero the reserved binder region rather than leaving it
12666
         * uninitialized.  For the outer ClientHello these bytes are
12667
         * overwritten by TLSX_PreSharedKey_WriteBinders(), but when ECH is
12668
         * enabled the inner ClientHello is hashed (expanded form), sealed
12669
         * (encoded form), and used as seal-time AAD (outer form) before
12670
         * WritePSKBinders() runs, so unwritten binder bytes would leak
12671
         * heap contents into the HPKE payload and taint the transcript. */
12672
        XMEMSET(output + idx, 0, len);
12673
        *pSz += idx + len;
12674
    }
12675
    else if (msgType == server_hello) {
12676
        word16 i;
12677
12678
        /* Find the index of the chosen identity. */
12679
        for (i=0; list != NULL && !list->chosen; i++)
12680
            list = list->next;
12681
        if (list == NULL) {
12682
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
12683
            return BUILD_MSG_ERROR;
12684
        }
12685
12686
        /* The index of the identity chosen by the server from the list supplied
12687
         * by the client.
12688
         */
12689
        c16toa(i, output);
12690
        *pSz += OPAQUE16_LEN;
12691
    }
12692
    else {
12693
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12694
        return SANITY_MSG_E;
12695
    }
12696
12697
    return 0;
12698
}
12699
12700
int TLSX_PreSharedKey_Parse_ClientHello(TLSX** extensions, const byte* input,
12701
                                        word16 length, void* heap)
12702
{
12703
12704
    int    ret;
12705
    word16 len;
12706
    word16 idx = 0;
12707
    TLSX*         extension;
12708
    PreSharedKey* list;
12709
12710
    TLSX_Remove(extensions, TLSX_PRE_SHARED_KEY, heap);
12711
12712
    /* Length of identities and of binders. */
12713
    if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
12714
        return BUFFER_E;
12715
12716
    /* Length of identities. */
12717
    ato16(input + idx, &len);
12718
    idx += OPAQUE16_LEN;
12719
    if (len < MIN_PSK_ID_LEN || length - idx < len)
12720
        return BUFFER_E;
12721
12722
    /* Create a pre-shared key object for each identity. */
12723
    while (len > 0) {
12724
        const byte* identity;
12725
        word16      identityLen;
12726
        word32      age;
12727
12728
        if (len < OPAQUE16_LEN)
12729
            return BUFFER_E;
12730
12731
        /* Length of identity. */
12732
        ato16(input + idx, &identityLen);
12733
        idx += OPAQUE16_LEN;
12734
        if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
12735
                identityLen > MAX_PSK_ID_LEN)
12736
            return BUFFER_E;
12737
        /* Cache identity pointer. */
12738
        identity = input + idx;
12739
        idx += identityLen;
12740
        /* Ticket age. */
12741
        ato32(input + idx, &age);
12742
        idx += OPAQUE32_LEN;
12743
12744
        ret = TLSX_PreSharedKey_Use(extensions, identity, identityLen, age, no_mac,
12745
                                    0, 0, 1, NULL, heap);
12746
        if (ret != 0)
12747
            return ret;
12748
12749
        /* Done with this identity. */
12750
        len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
12751
    }
12752
12753
    /* Find the list of identities sent to server. */
12754
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12755
    if (extension == NULL)
12756
        return PSK_KEY_ERROR;
12757
    list = (PreSharedKey*)extension->data;
12758
12759
    /* Length of binders. */
12760
    if (idx + OPAQUE16_LEN > length)
12761
        return BUFFER_E;
12762
    ato16(input + idx, &len);
12763
    idx += OPAQUE16_LEN;
12764
    if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
12765
        return BUFFER_E;
12766
12767
    /* Set binder for each identity. */
12768
    while (list != NULL && len > 0) {
12769
        /* Length of binder */
12770
        list->binderLen = input[idx++];
12771
        if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
12772
                list->binderLen > WC_MAX_DIGEST_SIZE)
12773
            return BUFFER_E;
12774
        if (len < OPAQUE8_LEN + list->binderLen)
12775
            return BUFFER_E;
12776
12777
        /* Copy binder into static buffer. */
12778
        XMEMCPY(list->binder, input + idx, list->binderLen);
12779
        idx += (word16)list->binderLen;
12780
12781
        /* Done with binder entry. */
12782
        len -= OPAQUE8_LEN + (word16)list->binderLen;
12783
12784
        /* Next identity. */
12785
        list = list->next;
12786
    }
12787
    if (list != NULL || len != 0)
12788
        return BUFFER_E;
12789
12790
    return 0;
12791
12792
}
12793
12794
/* Parse the pre-shared key extension.
12795
 * Different formats in different messages.
12796
 *
12797
 * ssl      The SSL/TLS object.
12798
 * input    The extension data.
12799
 * length   The length of the extension data.
12800
 * msgType  The type of the message this extension is being parsed from.
12801
 * returns 0 on success and other values indicate failure.
12802
 */
12803
static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, const byte* input,
12804
                                   word16 length, byte msgType)
12805
{
12806
12807
    if (msgType == client_hello) {
12808
        return TLSX_PreSharedKey_Parse_ClientHello(&ssl->extensions, input,
12809
                                                   length, ssl->heap);
12810
    }
12811
12812
    if (msgType == server_hello) {
12813
        word16 idx;
12814
        PreSharedKey* list;
12815
        TLSX*         extension;
12816
12817
        /* Index of identity chosen by server. */
12818
        if (length != OPAQUE16_LEN)
12819
            return BUFFER_E;
12820
        ato16(input, &idx);
12821
12822
    #ifdef WOLFSSL_EARLY_DATA
12823
        ssl->options.pskIdIndex = idx + 1;
12824
    #endif
12825
12826
        /* Find the list of identities sent to server. */
12827
        extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
12828
        if (extension == NULL)
12829
            return INCOMPLETE_DATA;
12830
        list = (PreSharedKey*)extension->data;
12831
12832
        /* Mark the identity as chosen. */
12833
        for (; list != NULL && idx > 0; idx--)
12834
            list = list->next;
12835
        if (list == NULL) {
12836
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12837
            return PSK_KEY_ERROR;
12838
        }
12839
        list->chosen = 1;
12840
12841
        if (list->resumption) {
12842
           /* Check that the session's details are the same as the server's. */
12843
           if (ssl->options.cipherSuite0  != ssl->session->cipherSuite0       ||
12844
               ssl->options.cipherSuite   != ssl->session->cipherSuite        ||
12845
               ssl->session->version.major != ssl->ctx->method->version.major ||
12846
               ssl->session->version.minor != ssl->ctx->method->version.minor) {
12847
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12848
               return PSK_KEY_ERROR;
12849
           }
12850
        }
12851
12852
        return 0;
12853
    }
12854
12855
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12856
    return SANITY_MSG_E;
12857
}
12858
12859
/* Create a new pre-shared key and put it into the list.
12860
 *
12861
 * list          The linked list of pre-shared key.
12862
 * identity      The identity.
12863
 * len           The length of the identity data.
12864
 * heap          The memory to allocate with.
12865
 * preSharedKey  The new pre-shared key object.
12866
 * returns 0 on success and other values indicate failure.
12867
 */
12868
static int TLSX_PreSharedKey_New(PreSharedKey** list, const byte* identity,
12869
                                 word16 len, void *heap,
12870
                                 PreSharedKey** preSharedKey)
12871
{
12872
    PreSharedKey* psk;
12873
    PreSharedKey** next;
12874
12875
    psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
12876
    if (psk == NULL)
12877
        return MEMORY_E;
12878
    XMEMSET(psk, 0, sizeof(*psk));
12879
12880
    /* Make a copy of the identity data. */
12881
    psk->identity = (byte*)XMALLOC(len + NULL_TERM_LEN, heap,
12882
                                   DYNAMIC_TYPE_TLSX);
12883
    if (psk->identity == NULL) {
12884
        XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
12885
        return MEMORY_E;
12886
    }
12887
    XMEMCPY(psk->identity, identity, len);
12888
    psk->identityLen = len;
12889
    /* Use a NULL terminator in case it is a C string */
12890
    psk->identity[psk->identityLen] = '\0';
12891
12892
    /* Add it to the end and maintain the links. */
12893
    while (*list != NULL) {
12894
        /* Assign to temporary to work around compiler bug found by customer. */
12895
        next = &((*list)->next);
12896
        list = next;
12897
    }
12898
    *list = psk;
12899
    *preSharedKey = psk;
12900
12901
    (void)heap;
12902
12903
    return 0;
12904
}
12905
12906
static WC_INLINE byte GetHmacLength(int hmac)
12907
{
12908
    switch (hmac) {
12909
    #ifndef NO_SHA256
12910
        case sha256_mac:
12911
            return WC_SHA256_DIGEST_SIZE;
12912
    #endif
12913
    #ifdef WOLFSSL_SHA384
12914
        case sha384_mac:
12915
            return WC_SHA384_DIGEST_SIZE;
12916
    #endif
12917
    #ifdef WOLFSSL_SHA512
12918
        case sha512_mac:
12919
            return WC_SHA512_DIGEST_SIZE;
12920
    #endif
12921
    #ifdef WOLFSSL_SM3
12922
        case sm3_mac:
12923
            return WC_SM3_DIGEST_SIZE;
12924
    #endif
12925
        default:
12926
            break;
12927
    }
12928
    return 0;
12929
}
12930
12931
/* Use the data to create a new pre-shared key object in the extensions.
12932
 *
12933
 * ssl           The SSL/TLS object.
12934
 * identity      The identity.
12935
 * len           The length of the identity data.
12936
 * age           The age of the identity.
12937
 * hmac          The HMAC algorithm.
12938
 * cipherSuite0  The first byte of the cipher suite to use.
12939
 * cipherSuite   The second byte of the cipher suite to use.
12940
 * resumption    The PSK is for resumption of a session.
12941
 * preSharedKey  The new pre-shared key object.
12942
 * returns 0 on success and other values indicate failure.
12943
 */
12944
int TLSX_PreSharedKey_Use(TLSX** extensions, const byte* identity, word16 len,
12945
                          word32 age, byte hmac, byte cipherSuite0,
12946
                          byte cipherSuite, byte resumption,
12947
                          PreSharedKey **preSharedKey, void* heap)
12948
{
12949
    int           ret = 0;
12950
    TLSX*         extension;
12951
    PreSharedKey* psk = NULL;
12952
12953
    /* Find the pre-shared key extension if it exists. */
12954
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12955
    if (extension == NULL) {
12956
        /* Push new pre-shared key extension. */
12957
        ret = TLSX_Push(extensions, TLSX_PRE_SHARED_KEY, NULL, heap);
12958
        if (ret != 0)
12959
            return ret;
12960
12961
        extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12962
        if (extension == NULL)
12963
            return MEMORY_E;
12964
    }
12965
12966
    /* Try to find the pre-shared key with this identity. */
12967
    psk = (PreSharedKey*)extension->data;
12968
    while (psk != NULL) {
12969
        if ((psk->identityLen == len) &&
12970
               (XMEMCMP(psk->identity, identity, len) == 0)) {
12971
            break;
12972
        }
12973
        psk = psk->next;
12974
    }
12975
12976
    /* Create a new pre-shared key object if not found. */
12977
    if (psk == NULL) {
12978
        ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
12979
                                    len, heap, &psk);
12980
        if (ret != 0)
12981
            return ret;
12982
    }
12983
12984
    /* Update/set age and HMAC algorithm. */
12985
    psk->ticketAge    = age;
12986
    psk->hmac         = hmac;
12987
    psk->cipherSuite0 = cipherSuite0;
12988
    psk->cipherSuite  = cipherSuite;
12989
    psk->resumption   = resumption;
12990
    psk->binderLen    = GetHmacLength(psk->hmac);
12991
12992
    if (preSharedKey != NULL)
12993
        *preSharedKey = psk;
12994
12995
    return 0;
12996
}
12997
12998
#define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
12999
#define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
13000
#define PSK_WRITE     TLSX_PreSharedKey_Write
13001
#define PSK_PARSE     TLSX_PreSharedKey_Parse
13002
13003
#else
13004
13005
#define PSK_FREE_ALL(a, b) WC_DO_NOTHING
13006
#define PSK_GET_SIZE(a, b, c) 0
13007
#define PSK_WRITE(a, b, c, d) 0
13008
#define PSK_PARSE(a, b, c, d) 0
13009
13010
#endif
13011
13012
/******************************************************************************/
13013
/* Certificate Authentication with External Pre-Shared Key                    */
13014
/******************************************************************************/
13015
13016
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
13017
    !defined(NO_PSK)
13018
13019
static int TLSX_CertWithExternPsk_GetSize(byte msgType, word16* pSz)
13020
{
13021
    (void)msgType;
13022
    (void)pSz;
13023
    /* Zero-length extension - nothing to add. */
13024
    return 0;
13025
}
13026
13027
static int TLSX_CertWithExternPsk_Write(byte* output, byte msgType,
13028
    word16* pSz)
13029
{
13030
    (void)output;
13031
    (void)msgType;
13032
    (void)pSz;
13033
    /* Zero-length extension - nothing to write. */
13034
    return 0;
13035
}
13036
13037
static int TLSX_CertWithExternPsk_Parse(WOLFSSL* ssl, byte msgType)
13038
{
13039
    if (msgType == client_hello) {
13040
        /* Server has not opted in - treat the extension as unknown. */
13041
        if (!ssl->options.certWithExternPsk)
13042
            return 0;
13043
        /* Record that the client offered the extension, leaving resp=0.
13044
         * CheckPreSharedKeys() is the sole writer that flips resp to 1, and
13045
         * only after confirming that a non-ticket PSK was matched. */
13046
        if (TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) == NULL) {
13047
            return TLSX_Push(&ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK,
13048
                NULL, ssl->heap);
13049
        }
13050
        return 0;
13051
    }
13052
13053
    if (msgType == server_hello) {
13054
        if (TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) == NULL) {
13055
            WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
13056
            return EXT_NOT_ALLOWED;
13057
        }
13058
        ssl->options.certWithExternPsk = 1;
13059
        return 0;
13060
    }
13061
13062
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13063
    return SANITY_MSG_E;
13064
}
13065
13066
int TLSX_CertWithExternPsk_Use(WOLFSSL* ssl)
13067
{
13068
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK);
13069
13070
    if (extension == NULL) {
13071
        int ret = TLSX_Push(&ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK, NULL,
13072
            ssl->heap);
13073
        if (ret != 0)
13074
            return ret;
13075
        extension = TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK);
13076
        if (extension == NULL)
13077
            return MEMORY_E;
13078
    }
13079
    extension->resp = 1;
13080
    return 0;
13081
}
13082
13083
#define PSK_WITH_CERT_GET_SIZE  TLSX_CertWithExternPsk_GetSize
13084
#define PSK_WITH_CERT_WRITE     TLSX_CertWithExternPsk_Write
13085
#define PSK_WITH_CERT_PARSE     TLSX_CertWithExternPsk_Parse
13086
13087
#else
13088
13089
#define PSK_WITH_CERT_GET_SIZE(a, b) 0
13090
#define PSK_WITH_CERT_WRITE(a, b, c) 0
13091
#define PSK_WITH_CERT_PARSE(a, b) 0
13092
13093
#endif /* WOLFSSL_TLS13 && WOLFSSL_CERT_WITH_EXTERN_PSK */
13094
13095
/******************************************************************************/
13096
/* PSK Key Exchange Modes                                                     */
13097
/******************************************************************************/
13098
13099
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
13100
/* Get the size of the encoded PSK KE modes extension.
13101
 * Only in ClientHello.
13102
 *
13103
 * modes    The PSK KE mode bit string.
13104
 * msgType  The type of the message this extension is being written into.
13105
 * returns the number of bytes of the encoded PSK KE mode extension.
13106
 */
13107
static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
13108
{
13109
    if (msgType == client_hello) {
13110
        /* Format: Len | Modes* */
13111
        word16 len = OPAQUE8_LEN;
13112
        /* Check whether each possible mode is to be written. */
13113
        if (modes & (1 << PSK_KE))
13114
            len += OPAQUE8_LEN;
13115
        if (modes & (1 << PSK_DHE_KE))
13116
            len += OPAQUE8_LEN;
13117
        *pSz += len;
13118
        return 0;
13119
    }
13120
13121
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13122
    return SANITY_MSG_E;
13123
}
13124
13125
/* Writes the PSK KE modes extension into the output buffer.
13126
 * Assumes that the the output buffer is big enough to hold data.
13127
 * Only in ClientHello.
13128
 *
13129
 * modes    The PSK KE mode bit string.
13130
 * output   The buffer to write into.
13131
 * msgType  The type of the message this extension is being written into.
13132
 * returns the number of bytes written into the buffer.
13133
 */
13134
static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
13135
                                 word16* pSz)
13136
{
13137
    if (msgType == client_hello) {
13138
        /* Format: Len | Modes* */
13139
        word16 idx = OPAQUE8_LEN;
13140
13141
        /* Write out each possible mode. */
13142
        if (modes & (1 << PSK_KE))
13143
            output[idx++] = PSK_KE;
13144
        if (modes & (1 << PSK_DHE_KE))
13145
            output[idx++] = PSK_DHE_KE;
13146
        /* Write out length of mode list. */
13147
        output[0] = (byte)(idx - OPAQUE8_LEN);
13148
13149
        *pSz += idx;
13150
        return 0;
13151
    }
13152
13153
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13154
    return SANITY_MSG_E;
13155
}
13156
13157
int TLSX_PskKeyModes_Parse_Modes(const byte* input, word16 length, byte msgType,
13158
                                byte* modes)
13159
{
13160
    if (msgType == client_hello) {
13161
        /* Format: Len | Modes* */
13162
        int   idx = 0;
13163
        word16 len;
13164
        *modes = 0;
13165
13166
        /* Ensure length byte exists. */
13167
        if (length < OPAQUE8_LEN)
13168
            return BUFFER_E;
13169
13170
        /* Get length of mode list and ensure that is the only data. */
13171
        len = input[0];
13172
        if (length - OPAQUE8_LEN != len)
13173
            return BUFFER_E;
13174
13175
        idx = OPAQUE8_LEN;
13176
        /* Set a bit for each recognized modes. */
13177
        while (len > 0) {
13178
            /* Ignore unrecognized modes.  */
13179
            if (input[idx] <= PSK_DHE_KE)
13180
               *modes |= 1 << input[idx];
13181
            idx++;
13182
            len--;
13183
        }
13184
        return 0;
13185
    }
13186
13187
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13188
    return SANITY_MSG_E;
13189
}
13190
13191
/* Parse the PSK KE modes extension.
13192
 * Only in ClientHello.
13193
 *
13194
 * ssl      The SSL/TLS object.
13195
 * input    The extension data.
13196
 * length   The length of the extension data.
13197
 * msgType  The type of the message this extension is being parsed from.
13198
 * returns 0 on success and other values indicate failure.
13199
 */
13200
static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, const byte* input, word16 length,
13201
                                 byte msgType)
13202
{
13203
    int    ret;
13204
    byte modes;
13205
13206
    ret = TLSX_PskKeyModes_Parse_Modes(input, length, msgType, &modes);
13207
    if (ret == 0) {
13208
#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \
13209
    defined(WOLFSSL_TLS13_TICKET_CHECK_PSK_MODES)
13210
        /* Keep the advertised modes for the NewSessionTicket decision. The
13211
         * extension object is dropped with the rest of the handshake state
13212
         * once the handshake is done. */
13213
        ssl->options.pskKeModes = modes;
13214
        ssl->options.pskKeModesRecvd = 1;
13215
#endif
13216
        ret = TLSX_PskKeyModes_Use(ssl, modes);
13217
    }
13218
13219
    if (ret != 0) {
13220
        WOLFSSL_ERROR_VERBOSE(ret);
13221
    }
13222
13223
    return ret;
13224
}
13225
13226
/* Use the data to create a new PSK Key Exchange Modes object in the extensions.
13227
 *
13228
 * ssl    The SSL/TLS object.
13229
 * modes  The PSK key exchange modes.
13230
 * returns 0 on success and other values indicate failure.
13231
 */
13232
int TLSX_PskKeyModes_Use(WOLFSSL* ssl, byte modes)
13233
{
13234
    int           ret = 0;
13235
    TLSX*         extension;
13236
13237
    /* Find the PSK key exchange modes extension if it exists. */
13238
    extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
13239
    if (extension == NULL) {
13240
        /* Push new PSK key exchange modes extension. */
13241
        ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
13242
            ssl->heap);
13243
        if (ret != 0)
13244
            return ret;
13245
13246
        extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
13247
        if (extension == NULL)
13248
            return MEMORY_E;
13249
    }
13250
13251
    extension->val = modes;
13252
13253
    return 0;
13254
}
13255
13256
#define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
13257
#define PKM_WRITE     TLSX_PskKeModes_Write
13258
#define PKM_PARSE     TLSX_PskKeModes_Parse
13259
13260
#else
13261
13262
#define PKM_GET_SIZE(a, b, c) 0
13263
#define PKM_WRITE(a, b, c, d) 0
13264
#define PKM_PARSE(a, b, c, d) 0
13265
13266
#endif
13267
13268
/******************************************************************************/
13269
/* Post-Handshake Authentication                                              */
13270
/******************************************************************************/
13271
13272
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
13273
/* Get the size of the encoded Post-Handshake Authentication extension.
13274
 * Only in ClientHello.
13275
 *
13276
 * msgType  The type of the message this extension is being written into.
13277
 * returns the number of bytes of the encoded Post-Handshake Authentication
13278
 * extension.
13279
 */
13280
static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
13281
{
13282
    if (msgType == client_hello) {
13283
        *pSz += 0;
13284
        return 0;
13285
    }
13286
13287
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13288
    return SANITY_MSG_E;
13289
}
13290
13291
/* Writes the Post-Handshake Authentication extension into the output buffer.
13292
 * Assumes that the the output buffer is big enough to hold data.
13293
 * Only in ClientHello.
13294
 *
13295
 * output   The buffer to write into.
13296
 * msgType  The type of the message this extension is being written into.
13297
 * returns the number of bytes written into the buffer.
13298
 */
13299
static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
13300
{
13301
    (void)output;
13302
13303
    if (msgType == client_hello) {
13304
        *pSz += 0;
13305
        return 0;
13306
    }
13307
13308
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13309
    return SANITY_MSG_E;
13310
}
13311
13312
/* Parse the Post-Handshake Authentication extension.
13313
 * Only in ClientHello.
13314
 *
13315
 * ssl      The SSL/TLS object.
13316
 * input    The extension data.
13317
 * length   The length of the extension data.
13318
 * msgType  The type of the message this extension is being parsed from.
13319
 * returns 0 on success and other values indicate failure.
13320
 */
13321
static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, const byte* input,
13322
                                   word16 length, byte msgType)
13323
{
13324
    (void)input;
13325
13326
    if (msgType == client_hello) {
13327
        /* Ensure extension is empty. */
13328
        if (length != 0)
13329
            return BUFFER_E;
13330
13331
        ssl->options.postHandshakeAuth = 1;
13332
        return 0;
13333
    }
13334
13335
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13336
    return SANITY_MSG_E;
13337
}
13338
13339
/* Create a new Post-handshake authentication object in the extensions.
13340
 *
13341
 * ssl    The SSL/TLS object.
13342
 * returns 0 on success and other values indicate failure.
13343
 */
13344
static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
13345
{
13346
    int   ret = 0;
13347
    TLSX* extension;
13348
13349
    /* Find the PSK key exchange modes extension if it exists. */
13350
    extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
13351
    if (extension == NULL) {
13352
        /* Push new Post-handshake Authentication extension. */
13353
        ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
13354
            ssl->heap);
13355
        if (ret != 0)
13356
            return ret;
13357
    }
13358
13359
    return 0;
13360
}
13361
13362
#define PHA_GET_SIZE  TLSX_PostHandAuth_GetSize
13363
#define PHA_WRITE     TLSX_PostHandAuth_Write
13364
#define PHA_PARSE     TLSX_PostHandAuth_Parse
13365
13366
#else
13367
13368
#define PHA_GET_SIZE(a, b)    0
13369
#define PHA_WRITE(a, b, c)    0
13370
#define PHA_PARSE(a, b, c, d) 0
13371
13372
#endif
13373
13374
/******************************************************************************/
13375
/* Early Data Indication                                                      */
13376
/******************************************************************************/
13377
13378
#ifdef WOLFSSL_EARLY_DATA
13379
/* Get the size of the encoded Early Data Indication extension.
13380
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
13381
 *
13382
 * msgType  The type of the message this extension is being written into.
13383
 * returns the number of bytes of the encoded Early Data Indication extension.
13384
 */
13385
static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
13386
{
13387
    int ret = 0;
13388
13389
    if (msgType == client_hello || msgType == encrypted_extensions)
13390
        *pSz += 0;
13391
    else if (msgType == session_ticket)
13392
        *pSz += OPAQUE32_LEN;
13393
    else {
13394
        ret = SANITY_MSG_E;
13395
        WOLFSSL_ERROR_VERBOSE(ret);
13396
    }
13397
13398
    return ret;
13399
}
13400
13401
/* Writes the Early Data Indicator extension into the output buffer.
13402
 * Assumes that the the output buffer is big enough to hold data.
13403
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
13404
 *
13405
 * maxSz    The maximum early data size.
13406
 * output   The buffer to write into.
13407
 * msgType  The type of the message this extension is being written into.
13408
 * returns the number of bytes written into the buffer.
13409
 */
13410
static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
13411
                                word16* pSz)
13412
{
13413
    if (msgType == client_hello || msgType == encrypted_extensions)
13414
        return 0;
13415
    else if (msgType == session_ticket) {
13416
        c32toa(maxSz, output);
13417
        *pSz += OPAQUE32_LEN;
13418
        return 0;
13419
    }
13420
13421
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13422
    return SANITY_MSG_E;
13423
}
13424
13425
/* Parse the Early Data Indicator extension.
13426
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
13427
 *
13428
 * ssl      The SSL/TLS object.
13429
 * input    The extension data.
13430
 * length   The length of the extension data.
13431
 * msgType  The type of the message this extension is being parsed from.
13432
 * returns 0 on success and other values indicate failure.
13433
 */
13434
static int TLSX_EarlyData_Parse(WOLFSSL* ssl, const byte* input, word16 length,
13435
                                 byte msgType)
13436
{
13437
    WOLFSSL_ENTER("TLSX_EarlyData_Parse");
13438
    if (msgType == client_hello) {
13439
        if (length != 0)
13440
            return BUFFER_E;
13441
13442
        if (ssl->earlyData == expecting_early_data) {
13443
13444
            if (ssl->options.maxEarlyDataSz != 0)
13445
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
13446
            else
13447
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
13448
13449
            return TLSX_EarlyData_Use(ssl, 0, 0);
13450
        }
13451
        ssl->earlyData = early_data_ext;
13452
13453
        return 0;
13454
    }
13455
    if (msgType == encrypted_extensions) {
13456
        if (length != 0)
13457
            return BUFFER_E;
13458
13459
        /* Ensure the index of PSK identity chosen by server is 0.
13460
         * Index is plus one to handle 'not set' value of 0.
13461
         */
13462
        if (ssl->options.pskIdIndex != 1) {
13463
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
13464
            return PSK_KEY_ERROR;
13465
        }
13466
13467
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
13468
            /* the extension from server comes in */
13469
            ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
13470
        }
13471
13472
        return TLSX_EarlyData_Use(ssl, 1, 1);
13473
    }
13474
    if (msgType == session_ticket) {
13475
        word32 maxSz;
13476
13477
        if (length != OPAQUE32_LEN)
13478
            return BUFFER_E;
13479
        ato32(input, &maxSz);
13480
13481
#ifdef WOLFSSL_QUIC
13482
        /* RFC 9001 Section 4.6.1: "Servers MUST NOT send the early_data
13483
         * extension with a max_early_data_size field set to any value other
13484
         * than 0xffffffff. A client MUST treat receipt of a NewSessionTicket
13485
         * that contains an early_data extension with any other value as a
13486
         * connection error of type PROTOCOL_VIOLATION." */
13487
        if (WOLFSSL_IS_QUIC(ssl) && maxSz != WOLFSSL_MAX_32BIT) {
13488
            WOLFSSL_MSG("QUIC ticket early data size not 0xffffffff");
13489
            wolfSSL_quic_send_alert(ssl, alert_fatal,
13490
                                    WOLFSSL_QUIC_ERR_CRYPTO_ERROR |
13491
                                    WOLFSSL_QUIC_ERR_PROTOCOL_VIOLATION);
13492
            WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
13493
            return INVALID_PARAMETER;
13494
        }
13495
#endif /* WOLFSSL_QUIC */
13496
13497
        ssl->session->maxEarlyDataSz = maxSz;
13498
        return 0;
13499
    }
13500
13501
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13502
    return SANITY_MSG_E;
13503
}
13504
13505
/* Use the data to create a new Early Data object in the extensions.
13506
 *
13507
 * ssl    The SSL/TLS object.
13508
 * maxSz  The maximum early data size.
13509
 * is_response   if this extension is part of a response
13510
 * returns 0 on success and other values indicate failure.
13511
 */
13512
int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz, int is_response)
13513
{
13514
    int   ret = 0;
13515
    TLSX* extension;
13516
13517
    /* Find the early data extension if it exists. */
13518
    extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
13519
    if (extension == NULL) {
13520
        /* Push new early data extension. */
13521
        ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
13522
        if (ret != 0)
13523
            return ret;
13524
13525
        extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
13526
        if (extension == NULL)
13527
            return MEMORY_E;
13528
    }
13529
13530
    extension->resp = is_response;
13531
    /* In QUIC, earlydata size is either 0 or 0xffffffff.
13532
     * Override any size between, possibly left from our initial value */
13533
    extension->val  = (WOLFSSL_IS_QUIC(ssl) && is_response && maxSz > 0) ?
13534
                       WOLFSSL_MAX_32BIT : maxSz;
13535
13536
    return 0;
13537
}
13538
13539
#define EDI_GET_SIZE  TLSX_EarlyData_GetSize
13540
#define EDI_WRITE     TLSX_EarlyData_Write
13541
#define EDI_PARSE     TLSX_EarlyData_Parse
13542
13543
#else
13544
13545
#define EDI_GET_SIZE(a, b)    0
13546
#define EDI_WRITE(a, b, c, d) 0
13547
#define EDI_PARSE(a, b, c, d) 0
13548
13549
#endif
13550
13551
/******************************************************************************/
13552
/* QUIC transport parameter extension                                         */
13553
/******************************************************************************/
13554
#ifdef WOLFSSL_QUIC
13555
13556
static word16 TLSX_QuicTP_GetSize(TLSX* extension)
13557
{
13558
    const QuicTransportParam *tp = (QuicTransportParam*)extension->data;
13559
13560
    return tp ? tp->len : 0;
13561
}
13562
13563
int TLSX_QuicTP_Use(WOLFSSL* ssl, TLSX_Type ext_type, int is_response)
13564
{
13565
    int ret = 0;
13566
    TLSX* extension;
13567
13568
    WOLFSSL_ENTER("TLSX_QuicTP_Use");
13569
    if (ssl->quic.transport_local == NULL) {
13570
        /* RFC9000, ch 7.3: "An endpoint MUST treat the absence of [...]
13571
         *     from either endpoint [...] as a connection error of type
13572
         *     TRANSPORT_PARAMETER_ERROR."
13573
         */
13574
        ret = QUIC_TP_MISSING_E;
13575
        goto cleanup;
13576
    }
13577
13578
    extension = TLSX_Find(ssl->extensions, ext_type);
13579
    if (extension == NULL) {
13580
        ret = TLSX_Push(&ssl->extensions, ext_type, NULL, ssl->heap);
13581
        if (ret != 0)
13582
            goto cleanup;
13583
13584
        extension = TLSX_Find(ssl->extensions, ext_type);
13585
        if (extension == NULL) {
13586
            ret = MEMORY_E;
13587
            goto cleanup;
13588
        }
13589
    }
13590
    if (extension->data) {
13591
        QuicTransportParam_free((QuicTransportParam*)extension->data, ssl->heap);
13592
        extension->data = NULL;
13593
    }
13594
    extension->resp = is_response;
13595
    extension->data = (void*)QuicTransportParam_dup(ssl->quic.transport_local, ssl->heap);
13596
    if (!extension->data) {
13597
        ret = MEMORY_E;
13598
        goto cleanup;
13599
    }
13600
13601
cleanup:
13602
    WOLFSSL_LEAVE("TLSX_QuicTP_Use", ret);
13603
    return ret;
13604
}
13605
13606
static word16 TLSX_QuicTP_Write(QuicTransportParam *tp, byte* output)
13607
{
13608
    word16 len = 0;
13609
13610
    WOLFSSL_ENTER("TLSX_QuicTP_Write");
13611
    if (tp && tp->len) {
13612
        XMEMCPY(output, tp->data, tp->len);
13613
        len = tp->len;
13614
    }
13615
    WOLFSSL_LEAVE("TLSX_QuicTP_Write", len);
13616
    return len;
13617
}
13618
13619
static int TLSX_QuicTP_Parse(WOLFSSL *ssl, const byte *input, size_t len, int ext_type, int msgType)
13620
{
13621
    const QuicTransportParam *tp, **ptp;
13622
13623
    (void)msgType;
13624
    tp = QuicTransportParam_new(input, len, ssl->heap);
13625
    if (!tp) {
13626
        return MEMORY_E;
13627
    }
13628
    ptp = (ext_type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT) ?
13629
        &ssl->quic.transport_peer_draft : &ssl->quic.transport_peer;
13630
    if (*ptp) {
13631
        QTP_FREE(*ptp, ssl->heap);
13632
    }
13633
    *ptp = tp;
13634
    return 0;
13635
}
13636
13637
#define QTP_GET_SIZE    TLSX_QuicTP_GetSize
13638
#define QTP_USE         TLSX_QuicTP_Use
13639
#define QTP_WRITE       TLSX_QuicTP_Write
13640
#define QTP_PARSE       TLSX_QuicTP_Parse
13641
13642
#endif /* WOLFSSL_QUIC */
13643
13644
#if defined(WOLFSSL_DTLS_CID)
13645
#define CID_GET_SIZE  TLSX_ConnectionID_GetSize
13646
#define CID_WRITE  TLSX_ConnectionID_Write
13647
#define CID_PARSE  TLSX_ConnectionID_Parse
13648
#define CID_FREE  TLSX_ConnectionID_Free
13649
#else
13650
#define CID_GET_SIZE(a) 0
13651
#define CID_WRITE(a, b) 0
13652
#define CID_PARSE(a, b, c, d) 0
13653
#define CID_FREE(a, b) 0
13654
#endif /* defined(WOLFSSL_DTLS_CID) */
13655
13656
#if defined(HAVE_RPK)
13657
/******************************************************************************/
13658
/* Client_Certificate_Type extension                                          */
13659
/******************************************************************************/
13660
/* return 1 if specified type is included in the given list, otherwise 0 */
13661
static int IsCertTypeListed(byte type, byte cnt, const byte* list)
13662
{
13663
    int ret = 0;
13664
    int i;
13665
13666
    if (cnt == 0 || list == NULL)
13667
        return ret;
13668
13669
    if (cnt > 0 && cnt <= MAX_CLIENT_CERT_TYPE_CNT) {
13670
        for (i = 0; i < cnt; i++) {
13671
            if (list[i] == type)
13672
                return 1;
13673
        }
13674
    }
13675
    return 0;
13676
}
13677
13678
/* Search both arrays from above to find a common value between the two given
13679
 * arrays(a and b). return 1 if it finds a common value, otherwise return 0.
13680
 */
13681
static int GetCommonItem(const byte* a, byte aLen, const byte* b, byte bLen,
13682
                                                                    byte* type)
13683
{
13684
    int i, j;
13685
13686
    if (a == NULL || b == NULL)
13687
        return 0;
13688
13689
    for (i = 0; i < aLen; i++) {
13690
        for (j = 0; j < bLen; j++) {
13691
            if (a[i] == b[j]) {
13692
                *type = a[i];
13693
                return 1;
13694
            }
13695
        }
13696
    }
13697
    return 0;
13698
}
13699
13700
/* Creates a "client certificate type" extension if necessary.
13701
 * Returns 0 if no error occurred, negative value otherwise.
13702
 * A return of 0, it does not indicae that the extension was created.
13703
 */
13704
static int TLSX_ClientCertificateType_Use(WOLFSSL* ssl, byte isServer)
13705
{
13706
    int ret = 0;
13707
13708
    if (ssl == NULL)
13709
        return BAD_FUNC_ARG;
13710
13711
    if (isServer) {
13712
        /* [in server side]
13713
         */
13714
13715
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13716
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13717
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
13718
13719
            WOLFSSL_MSG("Adding Client Certificate Type extension");
13720
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
13721
                                                                    ssl->heap);
13722
            if (ret == 0) {
13723
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
13724
            }
13725
        }
13726
    }
13727
    else {
13728
        /* [in client side]
13729
         * This extension MUST be omitted from the ClientHello unless the RPK
13730
         * certificate is preferred by the user and actually loaded.
13731
         */
13732
13733
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13734
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13735
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
13736
13737
            if (ssl->options.rpkState.isRPKLoaded) {
13738
13739
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
13740
                ssl->options.rpkState.sending_ClientCertTypes[0] =
13741
                                                        WOLFSSL_CERT_TYPE_RPK;
13742
13743
                /* Push new client_certificate_type extension. */
13744
                WOLFSSL_MSG("Adding Client Certificate Type extension");
13745
                ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE,
13746
                                                                ssl, ssl->heap);
13747
            }
13748
            else {
13749
                WOLFSSL_MSG("Willing to use RPK cert but not loaded it");
13750
            }
13751
        }
13752
        else {
13753
            WOLFSSL_MSG("No will to use RPK cert");
13754
        }
13755
    }
13756
    return ret;
13757
}
13758
13759
/* Parse a "client certificate type" extension received from peer.
13760
 * returns 0 on success and other values indicate failure.
13761
 */
13762
static int TLSX_ClientCertificateType_Parse(WOLFSSL* ssl, const byte* input,
13763
                                                word16 length, byte msgType)
13764
{
13765
    byte typeCnt;
13766
    int idx = 0;
13767
    int ret = 0;
13768
    int i;
13769
    int populate = 0;
13770
    byte  cmnType;
13771
13772
13773
    if (msgType == client_hello) {
13774
        /* [parse ClientHello in server end]
13775
         * case 1) if peer verify is disabled, this extension must be omitted
13776
         *         from ServerHello.
13777
         * case 2) if user have not set his preference, find X509 in parsed
13778
         *         result, then populate "Client Certificate Type" extension.
13779
         * case 3) if user have not set his preference and X509 isn't included
13780
         *         in parsed result, send "unsupported certificate" alert.
13781
         * case 4) if user have set his preference, find a common cert type
13782
         *         in users preference and received cert types.
13783
         * case 5) if user have set his preference, but no common cert type
13784
         *         found.
13785
         */
13786
13787
        /* case 1 */
13788
        if (ssl->options.verifyNone) {
13789
            return ret;
13790
        }
13791
13792
        /* parse extension */
13793
        if (length < OPAQUE8_LEN)
13794
            return BUFFER_E;
13795
13796
        typeCnt = input[idx];
13797
13798
        if (typeCnt > MAX_CLIENT_CERT_TYPE_CNT)
13799
            return BUFFER_E;
13800
13801
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
13802
            return BUFFER_E;
13803
        }
13804
13805
        ssl->options.rpkState.received_ClientCertTypeCnt = input[idx];
13806
        idx += OPAQUE8_LEN;
13807
13808
        for (i = 0; i < typeCnt; i++) {
13809
            ssl->options.rpkState.received_ClientCertTypes[i] = input[idx];
13810
            idx += OPAQUE8_LEN;
13811
        }
13812
13813
        if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt == 0) {
13814
            /* case 2 */
13815
            if (IsCertTypeListed(WOLFSSL_CERT_TYPE_X509,
13816
                            ssl->options.rpkState.received_ClientCertTypeCnt,
13817
                            ssl->options.rpkState.received_ClientCertTypes)) {
13818
13819
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
13820
                ssl->options.rpkState.sending_ClientCertTypes[0] =
13821
                                                        WOLFSSL_CERT_TYPE_X509;
13822
                populate = 1;
13823
            }
13824
            /* case 3 */
13825
            else {
13826
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
13827
                SendAlert(ssl, alert_fatal, unsupported_certificate);
13828
                return UNSUPPORTED_CERTIFICATE;
13829
            }
13830
        }
13831
        else if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt > 0) {
13832
            /* case 4 */
13833
            if (GetCommonItem(
13834
                            ssl->options.rpkConfig.preferred_ClientCertTypes,
13835
                            ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13836
                            ssl->options.rpkState.received_ClientCertTypes,
13837
                            ssl->options.rpkState.received_ClientCertTypeCnt,
13838
                            &cmnType)) {
13839
                ssl->options.rpkState.sending_ClientCertTypeCnt  = 1;
13840
                ssl->options.rpkState.sending_ClientCertTypes[0] = cmnType;
13841
                populate = 1;
13842
            }
13843
            /* case 5 */
13844
            else {
13845
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
13846
                SendAlert(ssl, alert_fatal, unsupported_certificate);
13847
                return UNSUPPORTED_CERTIFICATE;
13848
            }
13849
        }
13850
13851
        /* populate client_certificate_type extension */
13852
        if (populate) {
13853
            WOLFSSL_MSG("Adding Client Certificate Type extension");
13854
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
13855
                                                                    ssl->heap);
13856
            if (ret == 0) {
13857
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
13858
            }
13859
        }
13860
    }
13861
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13862
        /* parse it in client side */
13863
        if (length == 1) {
13864
            /* Same offered-vs-received binding as server_cert_type: an
13865
             * unsolicited value lets the peer pick the form this client
13866
             * presents its own credential in. */
13867
            if (ssl->options.rpkState.sending_ClientCertTypeCnt == 0) {
13868
                WOLFSSL_MSG("client_cert_type received but never offered");
13869
                SendAlert(ssl, alert_fatal, unsupported_extension);
13870
                WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
13871
                return UNSUPPORTED_EXTENSION;
13872
            }
13873
            if (!IsCertTypeListed(*input,
13874
                    ssl->options.rpkState.sending_ClientCertTypeCnt,
13875
                    ssl->options.rpkState.sending_ClientCertTypes)) {
13876
                WOLFSSL_MSG("client_cert_type value was not offered");
13877
                SendAlert(ssl, alert_fatal, unsupported_extension);
13878
                WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
13879
                return UNSUPPORTED_EXTENSION;
13880
            }
13881
13882
            ssl->options.rpkState.received_ClientCertTypeCnt  = 1;
13883
            ssl->options.rpkState.received_ClientCertTypes[0] = *input;
13884
        }
13885
        else {
13886
            return BUFFER_E;
13887
        }
13888
    }
13889
13890
    return ret;
13891
}
13892
13893
/* Write out the "client certificate type" extension data into the given buffer.
13894
 * return the size wrote in the buffer on success, negative value on error.
13895
 */
13896
static word16 TLSX_ClientCertificateType_Write(void* data, byte* output,
13897
                                              byte msgType)
13898
{
13899
    WOLFSSL* ssl = (WOLFSSL*)data;
13900
    word16 idx = 0;
13901
    byte cnt = 0;
13902
    int i;
13903
13904
    /* skip to write extension if count is zero */
13905
    cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
13906
13907
    if (cnt == 0)
13908
        return 0;
13909
13910
    if (msgType == client_hello) {
13911
        /* client side */
13912
13913
        *(output + idx) = cnt;
13914
        idx += OPAQUE8_LEN;
13915
13916
        for (i = 0; i < cnt; i++) {
13917
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[i];
13918
            idx += OPAQUE8_LEN;
13919
        }
13920
        return idx;
13921
    }
13922
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13923
        /* sever side */
13924
        if (cnt == 1) {
13925
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[0];
13926
            idx += OPAQUE8_LEN;
13927
        }
13928
    }
13929
    return idx;
13930
}
13931
13932
/* Calculate then return the size of the "client certificate type" extension
13933
 * data.
13934
 * return the extension data size on success, negative value on error.
13935
*/
13936
static int TLSX_ClientCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
13937
{
13938
    int ret = 0;
13939
    byte cnt;
13940
13941
    if (ssl == NULL)
13942
        return BAD_FUNC_ARG;
13943
13944
    if (msgType == client_hello) {
13945
        /* client side */
13946
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
13947
        ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
13948
    }
13949
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13950
        /* server side */
13951
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;/* must be one */
13952
        if (cnt != 1)
13953
            return SANITY_MSG_E;
13954
        ret = OPAQUE8_LEN;
13955
    }
13956
    else {
13957
        return SANITY_MSG_E;
13958
    }
13959
    return ret;
13960
}
13961
13962
    #define CCT_GET_SIZE  TLSX_ClientCertificateType_GetSize
13963
    #define CCT_WRITE     TLSX_ClientCertificateType_Write
13964
    #define CCT_PARSE     TLSX_ClientCertificateType_Parse
13965
#else
13966
    #define CCT_GET_SIZE(a)  0
13967
    #define CCT_WRITE(a, b)  0
13968
    #define CCT_PARSE(a, b, c, d) 0
13969
#endif /* HAVE_RPK */
13970
13971
#if defined(HAVE_RPK)
13972
/******************************************************************************/
13973
/* Server_Certificate_Type extension                                          */
13974
/******************************************************************************/
13975
/* Creates a "server certificate type" extension if necessary.
13976
 * Returns 0 if no error occurred, negative value otherwise.
13977
 * A return of 0, it does not indicae that the extension was created.
13978
 */
13979
static int TLSX_ServerCertificateType_Use(WOLFSSL* ssl, byte isServer)
13980
{
13981
    int ret = 0;
13982
    byte ctype;
13983
13984
    if (ssl == NULL)
13985
        return BAD_FUNC_ARG;
13986
13987
    if (isServer) {
13988
        /* [in server side] */
13989
        /* find common cert type to both end */
13990
        if (GetCommonItem(
13991
                ssl->options.rpkConfig.preferred_ServerCertTypes,
13992
                ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
13993
                ssl->options.rpkState.received_ServerCertTypes,
13994
                ssl->options.rpkState.received_ServerCertTypeCnt,
13995
                &ctype)) {
13996
            ssl->options.rpkState.sending_ServerCertTypeCnt = 1;
13997
            ssl->options.rpkState.sending_ServerCertTypes[0] = ctype;
13998
13999
            /* Push new server_certificate_type extension. */
14000
            WOLFSSL_MSG("Adding Server Certificate Type extension");
14001
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
14002
                                                                    ssl->heap);
14003
            if (ret == 0) {
14004
                TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
14005
            }
14006
        }
14007
        else {
14008
            /* no common cert type found */
14009
            WOLFSSL_MSG("No common cert type found in server_certificate_type ext");
14010
            SendAlert(ssl, alert_fatal, unsupported_certificate);
14011
            ret = UNSUPPORTED_CERTIFICATE;
14012
        }
14013
    }
14014
    else {
14015
        /* [in client side] */
14016
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
14017
                            ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
14018
                            ssl->options.rpkConfig.preferred_ServerCertTypes)) {
14019
14020
            ssl->options.rpkState.sending_ServerCertTypeCnt =
14021
                        ssl->options.rpkConfig.preferred_ServerCertTypeCnt;
14022
            XMEMCPY(ssl->options.rpkState.sending_ServerCertTypes,
14023
                    ssl->options.rpkConfig.preferred_ServerCertTypes,
14024
                    ssl->options.rpkConfig.preferred_ServerCertTypeCnt);
14025
14026
            /* Push new server_certificate_type extension. */
14027
            WOLFSSL_MSG("Adding Server Certificate Type extension");
14028
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
14029
                                                                    ssl->heap);
14030
        }
14031
        else {
14032
            WOLFSSL_MSG("No will to accept RPK cert");
14033
        }
14034
    }
14035
14036
    return ret;
14037
}
14038
14039
/* Parse a "server certificate type" extension received from peer.
14040
 * returns 0 on success and other values indicate failure.
14041
 */
14042
static int TLSX_ServerCertificateType_Parse(WOLFSSL* ssl, const byte* input,
14043
                                                word16 length, byte msgType)
14044
{
14045
    byte typeCnt;
14046
    int idx = 0;
14047
    int ret = 0;
14048
    int i;
14049
14050
    if (msgType == client_hello) {
14051
        /* in server side */
14052
14053
        if (length < OPAQUE8_LEN)
14054
            return BUFFER_E;
14055
14056
        typeCnt = input[idx];
14057
14058
        if (typeCnt > MAX_SERVER_CERT_TYPE_CNT)
14059
            return BUFFER_E;
14060
14061
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
14062
            return BUFFER_E;
14063
        }
14064
        ssl->options.rpkState.received_ServerCertTypeCnt = input[idx];
14065
        idx += OPAQUE8_LEN;
14066
14067
        for (i = 0; i < typeCnt; i++) {
14068
            ssl->options.rpkState.received_ServerCertTypes[i] = input[idx];
14069
            idx += OPAQUE8_LEN;
14070
        }
14071
14072
        ret = TLSX_ServerCertificateType_Use(ssl, 1);
14073
        if (ret == 0) {
14074
            TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
14075
        }
14076
    }
14077
    else if (msgType == server_hello || msgType == encrypted_extensions) {
14078
        /* in client side */
14079
        if (length != 1)                     /* length slould be 1 */
14080
            return BUFFER_E;
14081
14082
        /* RFC 7250 4.1, RFC 8446 4.2: the server may only answer with a type
14083
         * the client offered. ProcessPeerCertParse() treats the stored value as
14084
         * negotiated, so an unsolicited one lets the peer select RawPublicKey
14085
         * and skip chain verification. */
14086
        if (ssl->options.rpkState.sending_ServerCertTypeCnt == 0) {
14087
            WOLFSSL_MSG("server_cert_type received but never offered");
14088
            SendAlert(ssl, alert_fatal, unsupported_extension);
14089
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
14090
            return UNSUPPORTED_EXTENSION;
14091
        }
14092
        if (!IsCertTypeListed(*input,
14093
                ssl->options.rpkState.sending_ServerCertTypeCnt,
14094
                ssl->options.rpkState.sending_ServerCertTypes)) {
14095
            WOLFSSL_MSG("server_cert_type value was not offered");
14096
            SendAlert(ssl, alert_fatal, unsupported_extension);
14097
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
14098
            return UNSUPPORTED_EXTENSION;
14099
        }
14100
14101
        ssl->options.rpkState.received_ServerCertTypeCnt  = 1;
14102
        ssl->options.rpkState.received_ServerCertTypes[0] = *input;
14103
    }
14104
14105
    return 0;
14106
}
14107
14108
/* Write out the "server certificate type" extension data into the given buffer.
14109
 * return the size wrote in the buffer on success, negative value on error.
14110
 */
14111
static word16 TLSX_ServerCertificateType_Write(void* data, byte* output,
14112
                                                                byte msgType)
14113
{
14114
    WOLFSSL* ssl = (WOLFSSL*)data;
14115
    word16 idx = 0;
14116
    int cnt = 0;
14117
    int i;
14118
14119
    /* skip to write extension if count is zero */
14120
    cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
14121
14122
    if (cnt == 0)
14123
        return 0;
14124
14125
    if (msgType == client_hello) {
14126
        /* in client side */
14127
14128
        *(output + idx) = cnt;
14129
        idx += OPAQUE8_LEN;
14130
14131
        for (i = 0; i < cnt; i++) {
14132
            *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[i];
14133
            idx += OPAQUE8_LEN;
14134
        }
14135
    }
14136
    else if (msgType == server_hello || msgType == encrypted_extensions) {
14137
        /* in server side */
14138
        /* ensure cnt is one */
14139
        if (cnt != 1)
14140
            return 0;
14141
14142
        *(output + idx) =  ssl->options.rpkState.sending_ServerCertTypes[0];
14143
        idx += OPAQUE8_LEN;
14144
    }
14145
    return idx;
14146
}
14147
14148
/* Calculate then return the size of the "server certificate type" extension
14149
 * data.
14150
 * return the extension data size on success, negative value on error.
14151
*/
14152
static int TLSX_ServerCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
14153
{
14154
    int ret = 0;
14155
    int cnt;
14156
14157
    if (ssl == NULL)
14158
        return BAD_FUNC_ARG;
14159
14160
    if (msgType == client_hello) {
14161
        /* in clent side */
14162
        cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
14163
        if (cnt > 0) {
14164
            ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
14165
        }
14166
    }
14167
    else if (msgType == server_hello || msgType == encrypted_extensions) {
14168
        /* in server side */
14169
        ret = (int)OPAQUE8_LEN;
14170
    }
14171
    else {
14172
        return SANITY_MSG_E;
14173
    }
14174
    return ret;
14175
}
14176
14177
    #define SCT_GET_SIZE  TLSX_ServerCertificateType_GetSize
14178
    #define SCT_WRITE     TLSX_ServerCertificateType_Write
14179
    #define SCT_PARSE     TLSX_ServerCertificateType_Parse
14180
#else
14181
    #define SCT_GET_SIZE(a)  0
14182
    #define SCT_WRITE(a, b)  0
14183
    #define SCT_PARSE(a, b, c, d) 0
14184
#endif /* HAVE_RPK */
14185
14186
/******************************************************************************/
14187
/* TLS Extensions Framework                                                   */
14188
/******************************************************************************/
14189
14190
/** Finds an extension in the provided list. */
14191
TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
14192
0
{
14193
0
    TLSX* extension = list;
14194
14195
0
    while (extension && extension->type != type)
14196
0
        extension = extension->next;
14197
14198
0
    return extension;
14199
0
}
14200
14201
/** Remove an extension. */
14202
void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
14203
0
{
14204
0
    TLSX* extension;
14205
0
    TLSX** next;
14206
14207
0
    if (list == NULL)
14208
0
        return;
14209
14210
0
    extension = *list;
14211
0
    next = list;
14212
14213
0
    while (extension && extension->type != type) {
14214
0
        next = &extension->next;
14215
0
        extension = extension->next;
14216
0
    }
14217
14218
0
    if (extension) {
14219
0
        *next = extension->next;
14220
0
        extension->next = NULL;
14221
0
        TLSX_FreeAll(extension, heap);
14222
0
    }
14223
0
}
14224
14225
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
14226
#define GREASE_ECH_SIZE 160
14227
#define TLS_INFO_CONST_STRING "tls ech"
14228
#define TLS_INFO_CONST_STRING_SZ 7
14229
14230
/* return status after setting up ech to write a grease ech */
14231
static int TLSX_GreaseECH_Use(TLSX** extensions, void* heap, WC_RNG* rng)
14232
{
14233
    int ret = 0;
14234
    TLSX* echX;
14235
    WOLFSSL_ECH* ech;
14236
14237
    if (extensions == NULL)
14238
        return BAD_FUNC_ARG;
14239
    /* skip if we already have an ech extension, we will for hrr */
14240
    echX = TLSX_Find(*extensions, TLSX_ECH);
14241
    if (echX != NULL)
14242
        return 0;
14243
14244
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
14245
        DYNAMIC_TYPE_TMP_BUFFER);
14246
    if (ech == NULL)
14247
        return MEMORY_E;
14248
    XMEMSET(ech, 0, sizeof(WOLFSSL_ECH));
14249
14250
    ech->state = ECH_WRITE_GREASE;
14251
14252
    /* 0 for outer */
14253
    ech->type = ECH_TYPE_OUTER;
14254
    /* kemId */
14255
    ech->kemId = DHKEM_X25519_HKDF_SHA256;
14256
    /* cipherSuite kdf */
14257
    ech->cipherSuite.kdfId = HKDF_SHA256;
14258
    /* cipherSuite aead */
14259
    ech->cipherSuite.aeadId = HPKE_AES_128_GCM;
14260
14261
    /* random configId */
14262
    ret = wc_RNG_GenerateByte(rng, &(ech->configId));
14263
14264
    /* curve25519 encLen */
14265
    ech->encLen = DHKEM_X25519_ENC_LEN;
14266
14267
    if (ret == 0)
14268
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
14269
14270
    if (ret != 0) {
14271
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14272
    }
14273
14274
    return ret;
14275
}
14276
14277
/* return status after setting up ech to write real ech */
14278
static int TLSX_ECH_Use(WOLFSSL_EchConfig* echConfig, TLSX** extensions,
14279
    void* heap, WC_RNG* rng)
14280
{
14281
    int ret = 0;
14282
    int suiteIndex;
14283
    TLSX* echX;
14284
    WOLFSSL_ECH* ech;
14285
    if (extensions == NULL)
14286
        return BAD_FUNC_ARG;
14287
    /* skip if we already have an ech extension, we will for hrr */
14288
    echX = TLSX_Find(*extensions, TLSX_ECH);
14289
    if (echX != NULL)
14290
        return 0;
14291
    /* find a supported cipher suite */
14292
    suiteIndex = EchConfigGetSupportedCipherSuite(echConfig);
14293
    if (suiteIndex < 0)
14294
        return suiteIndex;
14295
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
14296
        DYNAMIC_TYPE_TMP_BUFFER);
14297
    if (ech == NULL)
14298
        return MEMORY_E;
14299
    XMEMSET(ech, 0, sizeof(WOLFSSL_ECH));
14300
    ech->state = ECH_WRITE_REAL;
14301
    ech->echConfig = echConfig;
14302
    /* 0 for outer */
14303
    ech->type = ECH_TYPE_OUTER;
14304
    /* kemId */
14305
    ech->kemId = echConfig->kemId;
14306
    /* cipherSuite kdf */
14307
    ech->cipherSuite.kdfId = echConfig->cipherSuites[suiteIndex].kdfId;
14308
    /* cipherSuite aead */
14309
    ech->cipherSuite.aeadId = echConfig->cipherSuites[suiteIndex].aeadId;
14310
    /* configId */
14311
    ech->configId = echConfig->configId;
14312
    /* encLen */
14313
    ech->encLen = wc_HpkeKemGetEncLen(echConfig->kemId);
14314
    if (ech->encLen == 0) {
14315
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14316
        return BAD_FUNC_ARG;
14317
    }
14318
    /* setup hpke */
14319
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
14320
    if (ech->hpke == NULL) {
14321
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14322
        return MEMORY_E;
14323
    }
14324
    ret = wc_HpkeInit(ech->hpke, ech->kemId, ech->cipherSuite.kdfId,
14325
        ech->cipherSuite.aeadId, heap);
14326
    /* setup the ephemeralKey */
14327
    if (ret == 0)
14328
        ret = wc_HpkeGenerateKeyPair(ech->hpke, &ech->ephemeralKey, rng);
14329
    if (ret == 0) {
14330
        /* use the chosen config's public name for the outer SNI */
14331
        ret = TLSX_UseSNI(&ech->extensions, WOLFSSL_SNI_HOST_NAME,
14332
            echConfig->publicName, (word16)XSTRLEN(echConfig->publicName),
14333
            heap);
14334
        if (ret != WOLFSSL_SUCCESS ||
14335
                (ret = TLSX_Push(extensions, TLSX_ECH, ech, heap)) != 0) {
14336
            TLSX_FreeAll(ech->extensions, heap);
14337
            wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
14338
                ech->hpke->heap);
14339
        }
14340
    }
14341
    if (ret != 0) {
14342
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
14343
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14344
    }
14345
    return ret;
14346
}
14347
14348
/* return status after setting up ech to read and decrypt */
14349
WOLFSSL_TEST_VIS int TLSX_ServerECH_Use(TLSX** extensions, void* heap,
14350
    WOLFSSL_EchConfig* configs)
14351
{
14352
    int ret;
14353
    WOLFSSL_ECH* ech;
14354
    TLSX* echX;
14355
    if (extensions == NULL)
14356
        return BAD_FUNC_ARG;
14357
    /* if we already have ech don't override it */
14358
    echX = TLSX_Find(*extensions, TLSX_ECH);
14359
    if (echX != NULL)
14360
        return 0;
14361
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
14362
        DYNAMIC_TYPE_TMP_BUFFER);
14363
    if (ech == NULL)
14364
        return MEMORY_E;
14365
    XMEMSET(ech, 0, sizeof(WOLFSSL_ECH));
14366
    ech->state = ECH_WRITE_NONE;
14367
    /* 0 for outer */
14368
    ech->type = ECH_TYPE_OUTER;
14369
    ech->echConfig = configs;
14370
    /* setup the rest of the settings when we receive ech from the client */
14371
    ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
14372
    if (ret != 0)
14373
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14374
    return ret;
14375
}
14376
14377
/* return status after writing the ech and updating offset */
14378
static int TLSX_ECH_Write(WOLFSSL_ECH* ech, byte msgType, byte* writeBuf,
14379
    word16* offset)
14380
{
14381
    int ret = 0;
14382
    int rngRet = -1;
14383
    word32 configsLen = 0;
14384
    void* ephemeralKey = NULL;
14385
    byte* writeBuf_p = writeBuf;
14386
    WC_DECLARE_VAR(hpke, Hpke, 1, DYNAMIC_TYPE_TMP_BUFFER);
14387
    WC_DECLARE_VAR(rng, WC_RNG, 1, DYNAMIC_TYPE_RNG);
14388
14389
    WOLFSSL_MSG("TLSX_ECH_Write");
14390
    if (msgType == hello_retry_request) {
14391
        WC_ALLOC_VAR_EX(rng, WC_RNG, 1, NULL, DYNAMIC_TYPE_RNG, ret = MEMORY_E);
14392
        if (ret == 0) {
14393
            ret = wc_InitRng(rng);
14394
        }
14395
        if (ret == 0) {
14396
            /* randomize confirmation in case ech is rejected */
14397
            ret = wc_RNG_GenerateBlock(rng, writeBuf,
14398
                    ECH_ACCEPT_CONFIRMATION_SZ);
14399
            wc_FreeRng(rng);
14400
        }
14401
        if (ret == 0) {
14402
            *offset += ECH_ACCEPT_CONFIRMATION_SZ;
14403
            ech->confBuf = writeBuf;
14404
        }
14405
14406
        WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
14407
        return ret;
14408
    }
14409
    if (ech->state == ECH_WRITE_NONE || ech->state == ECH_PARSED_INTERNAL)
14410
        return 0;
14411
    if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
14412
        /* get size then write */
14413
        ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen);
14414
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
14415
            return ret;
14416
        ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen);
14417
        if (ret != WOLFSSL_SUCCESS)
14418
            return ret;
14419
        *offset += configsLen;
14420
        return 0;
14421
    }
14422
    /* type */
14423
    *writeBuf_p = ech->type;
14424
    writeBuf_p += sizeof(ech->type);
14425
    /* outer has body, inner does not */
14426
    if (ech->type == ECH_TYPE_OUTER) {
14427
        /* kdfId */
14428
        c16toa(ech->cipherSuite.kdfId, writeBuf_p);
14429
        writeBuf_p += sizeof(ech->cipherSuite.kdfId);
14430
        /* aeadId */
14431
        c16toa(ech->cipherSuite.aeadId, writeBuf_p);
14432
        writeBuf_p += sizeof(ech->cipherSuite.aeadId);
14433
        /* configId */
14434
        *writeBuf_p = ech->configId;
14435
        writeBuf_p += sizeof(ech->configId);
14436
        /* encLen */
14437
        if (ech->innerCount == 0) {
14438
            c16toa(ech->encLen, writeBuf_p);
14439
        }
14440
        else {
14441
            /* set to 0 if this is clientInner 2 */
14442
            c16toa(0, writeBuf_p);
14443
        }
14444
        writeBuf_p += 2;
14445
        if (ech->state == ECH_WRITE_GREASE) {
14446
            word32 size;
14447
            WC_ALLOC_VAR_EX(rng, WC_RNG, 1, NULL, DYNAMIC_TYPE_RNG,
14448
                ret = MEMORY_E);
14449
14450
            if (ret == 0)
14451
                rngRet = ret = wc_InitRng(rng);
14452
            if (ret == 0 && ech->innerCount == 0) {
14453
                WC_ALLOC_VAR_EX(hpke, Hpke, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
14454
                    ret = MEMORY_E);
14455
14456
                /* hpke init */
14457
                if (ret == 0)
14458
                    ret = wc_HpkeInit(hpke, ech->kemId, ech->cipherSuite.kdfId,
14459
                        ech->cipherSuite.aeadId, NULL);
14460
                /* create the ephemeralKey */
14461
                if (ret == 0)
14462
                    ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng);
14463
                /* enc */
14464
                if (ret == 0) {
14465
                    ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey,
14466
                        writeBuf_p, &ech->encLen);
14467
                    writeBuf_p += ech->encLen;
14468
                }
14469
14470
                if (ephemeralKey != NULL)
14471
                    wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap);
14472
                WC_FREE_VAR_EX(hpke, NULL, DYNAMIC_TYPE_TMP_BUFFER);
14473
            }
14474
14475
            if (ret == 0) {
14476
                size = GREASE_ECH_SIZE + (ech->configId / 4);
14477
                size += ECH_PADDING_TO_32(size) + WC_AES_BLOCK_SIZE;
14478
14479
                /* innerClientHelloLen */
14480
                c16toa((word16)size, writeBuf_p);
14481
                writeBuf_p += 2;
14482
                /* innerClientHello */
14483
                ret = wc_RNG_GenerateBlock(rng, writeBuf_p, size);
14484
                writeBuf_p += size;
14485
            }
14486
14487
            if (rngRet == 0)
14488
                wc_FreeRng(rng);
14489
            WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
14490
        }
14491
        else {
14492
            if (ech->innerCount == 0) {
14493
                /* write enc to writeBuf_p */
14494
                ret = wc_HpkeSerializePublicKey(ech->hpke, ech->ephemeralKey,
14495
                    writeBuf_p, &ech->encLen);
14496
                writeBuf_p += ech->encLen;
14497
            }
14498
14499
            /* innerClientHelloLen */
14500
            c16toa((word16)ech->innerClientHelloLen, writeBuf_p);
14501
            writeBuf_p += 2;
14502
            /* set payload offset for when we finalize */
14503
            ech->outerClientPayload = writeBuf_p;
14504
            /* write zeros for payload */
14505
            XMEMSET(writeBuf_p, 0, ech->innerClientHelloLen);
14506
            writeBuf_p += ech->innerClientHelloLen;
14507
        }
14508
    }
14509
    if (ret == 0)
14510
        *offset += (writeBuf_p - writeBuf);
14511
    return ret;
14512
}
14513
14514
/* return the size needed for the ech extension */
14515
static int TLSX_ECH_GetSize(WOLFSSL_ECH* ech, byte msgType)
14516
{
14517
    int ret;
14518
    word32 size = 0;
14519
14520
    if (ech->state == ECH_WRITE_GREASE) {
14521
        word32 payload;
14522
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
14523
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16);
14524
        /* enc only printed on CH1 */
14525
        if (ech->innerCount == 0)
14526
            size += ech->encLen;
14527
        /* GREASE payload mimics the regular sealed inner:
14528
         *   plaintext length divisible by 32 and the AEAD tag
14529
         *   configId is used to randomize the GREASE length
14530
         *     (divide by 4 to save space) */
14531
        payload = GREASE_ECH_SIZE + (ech->configId / 4);
14532
        payload += ECH_PADDING_TO_32(payload) + WC_AES_BLOCK_SIZE;
14533
        size += payload;
14534
    }
14535
    else if (msgType == hello_retry_request) {
14536
        size = ECH_ACCEPT_CONFIRMATION_SZ;
14537
    }
14538
    else if (ech->state == ECH_WRITE_NONE ||
14539
        ech->state == ECH_PARSED_INTERNAL) {
14540
        size = 0;
14541
    }
14542
    else if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
14543
        /* get the size of the raw configs */
14544
        ret = GetEchConfigsEx(ech->echConfig, NULL, &size);
14545
14546
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
14547
            return ret;
14548
    }
14549
    else if (ech->type == ECH_TYPE_INNER)
14550
    {
14551
        size = sizeof(ech->type);
14552
    }
14553
    else
14554
    {
14555
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
14556
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16) +
14557
            ech->innerClientHelloLen;
14558
        /* enc only printed on CH1 */
14559
        if (ech->innerCount == 0)
14560
            size += ech->encLen;
14561
    }
14562
14563
    return (int)size;
14564
}
14565
14566
#ifdef HAVE_SECRET_CALLBACK
14567
/* log ECH_SECRET and ECH_CONFIG
14568
 * returns 0 on success, TLS13_SECRET_CB_E otherwise */
14569
static int EchWriteKeyLog(WOLFSSL* ssl, const byte* secret, word32 secretSz,
14570
    const byte* config, word32 configSz)
14571
{
14572
    int ret = 0;
14573
    if (ssl->tls13SecretCb != NULL) {
14574
        ret = ssl->tls13SecretCb(ssl, ECH_SECRET, secret, (int)secretSz,
14575
                ssl->tls13SecretCtx);
14576
        if (ret == 0) {
14577
            ret = ssl->tls13SecretCb(ssl, ECH_CONFIG, config, (int)configSz,
14578
                    ssl->tls13SecretCtx);
14579
        }
14580
        if (ret != 0) {
14581
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
14582
            ret = TLS13_SECRET_CB_E;
14583
        }
14584
    }
14585
#ifdef OPENSSL_EXTRA
14586
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
14587
        ret = ssl->tls13KeyLogCb(ssl, ECH_SECRET, secret, (int)secretSz, NULL);
14588
        if (ret == 0) {
14589
            ret = ssl->tls13KeyLogCb(ssl, ECH_CONFIG, config, (int)configSz,
14590
                    NULL);
14591
        }
14592
        if (ret != 0) {
14593
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
14594
            ret = TLS13_SECRET_CB_E;
14595
        }
14596
    }
14597
#endif /* OPENSSL_EXTRA */
14598
    return ret;
14599
}
14600
#endif /* HAVE_SECRET_CALLBACK */
14601
14602
/* rough check that inner hello fields do not exceed length of decrypted
14603
 * information. Additionally, this function will check that all padding bytes
14604
 * are zero and decrease the innerHelloLen accordingly if so.
14605
 * returns 0 on success and otherwise failure */
14606
static int TLSX_ECH_CheckInnerPadding(WOLFSSL* ssl, WOLFSSL_ECH* ech)
14607
{
14608
    int headerSz;
14609
    const byte* innerCh;
14610
    word32 innerChLen;
14611
    word32 idx;
14612
    byte sessionIdLen;
14613
    word16 cipherSuitesLen;
14614
    byte compressionLen;
14615
    word16 extLen;
14616
    byte acc = 0;
14617
    word32 i;
14618
14619
#ifdef WOLFSSL_DTLS13
14620
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
14621
                                   HANDSHAKE_HEADER_SZ;
14622
#else
14623
    (void)ssl;
14624
14625
    headerSz = HANDSHAKE_HEADER_SZ;
14626
#endif
14627
14628
    innerCh = ech->innerClientHello + headerSz;
14629
    innerChLen = ech->innerClientHelloLen;
14630
14631
    idx = OPAQUE16_LEN + RAN_LEN;
14632
    if (idx >= innerChLen)
14633
        return BUFFER_ERROR;
14634
14635
    sessionIdLen = innerCh[idx++];
14636
    /* innerHello sessionID must initially be empty */
14637
    if (sessionIdLen != 0)
14638
        return INVALID_PARAMETER;
14639
    idx += sessionIdLen;
14640
    if (idx + OPAQUE16_LEN > innerChLen)
14641
        return BUFFER_ERROR;
14642
14643
    ato16(innerCh + idx, &cipherSuitesLen);
14644
    idx += OPAQUE16_LEN + cipherSuitesLen;
14645
    if (idx >= innerChLen)
14646
        return BUFFER_ERROR;
14647
14648
    compressionLen = innerCh[idx++];
14649
    idx += compressionLen;
14650
    if (idx + OPAQUE16_LEN > innerChLen)
14651
        return BUFFER_ERROR;
14652
14653
    ato16(innerCh + idx, &extLen);
14654
    idx += OPAQUE16_LEN + extLen;
14655
    if (idx > innerChLen)
14656
        return BUFFER_ERROR;
14657
14658
    /* should now be at the end of the innerHello
14659
     * Per ECH spec all padding bytes MUST be 0 */
14660
    for (i = idx; i < innerChLen; i++) {
14661
        acc |= innerCh[i];
14662
    }
14663
    if (acc != 0) {
14664
        return INVALID_PARAMETER;
14665
    }
14666
14667
    ech->innerClientHelloLen -= i - idx;
14668
    return 0;
14669
}
14670
14671
/* Locate the given extension type, use the extOffset to start off after where a
14672
 * previous call to this function ended
14673
 *
14674
 * outerCh          The outer ClientHello buffer.
14675
 * chLen            Outer ClientHello length.
14676
 * extType          Extension type to look for.
14677
 * extLen           Out parameter, length of found extension.
14678
 * extOffset        Offset into outer ClientHello to look for extension from.
14679
 * extensionsStart  Start of outer ClientHello extensions.
14680
 * extensionsLen    Length of outer ClientHello extensions.
14681
 * returns 0 on success and otherwise failure.
14682
 */
14683
static const byte* TLSX_ECH_FindOuterExtension(const byte* outerCh,
14684
    word32 chLen, word16 extType, word32* extLen, word32* extOffset,
14685
    word16* extensionsStart, word16* extensionsLen)
14686
{
14687
    word32 idx = *extOffset;
14688
    byte sessionIdLen;
14689
    word16 cipherSuitesLen;
14690
    byte compressionLen;
14691
    word16 type;
14692
    word16 len;
14693
14694
    if (idx == 0) {
14695
        idx = OPAQUE16_LEN + RAN_LEN;
14696
        if (idx >= chLen)
14697
            return NULL;
14698
14699
        sessionIdLen = outerCh[idx++];
14700
        idx += sessionIdLen;
14701
        if (idx + OPAQUE16_LEN > chLen)
14702
            return NULL;
14703
14704
        ato16(outerCh + idx, &cipherSuitesLen);
14705
        idx += OPAQUE16_LEN + cipherSuitesLen;
14706
        if (idx >= chLen)
14707
            return NULL;
14708
14709
        compressionLen = outerCh[idx++];
14710
        idx += compressionLen;
14711
        if (idx + OPAQUE16_LEN > chLen)
14712
            return NULL;
14713
14714
        ato16(outerCh + idx, extensionsLen);
14715
        idx += OPAQUE16_LEN;
14716
        *extensionsStart = (word16)idx;
14717
14718
        if (idx + *extensionsLen > chLen)
14719
            return NULL;
14720
    }
14721
14722
    while (idx - *extensionsStart < *extensionsLen) {
14723
        if (idx + OPAQUE16_LEN + OPAQUE16_LEN > chLen)
14724
            return NULL;
14725
14726
        ato16(outerCh + idx, &type);
14727
        idx += OPAQUE16_LEN;
14728
        ato16(outerCh + idx, &len);
14729
        idx += OPAQUE16_LEN;
14730
14731
        if (idx + len - *extensionsStart > *extensionsLen)
14732
            return NULL;
14733
14734
        if (type == extType) {
14735
            *extLen = len + OPAQUE16_LEN + OPAQUE16_LEN;
14736
            *extOffset = idx + len;
14737
            return outerCh + idx - OPAQUE16_LEN - OPAQUE16_LEN;
14738
        }
14739
14740
        idx += len;
14741
    }
14742
14743
    return NULL;
14744
}
14745
14746
/* If newinnerCh is NULL, validate ordering and existence of references
14747
 *   - updates newInnerChLen with total length of selected extensions
14748
 * If newinnerCh is not NULL, copy extensions into newInnerCh
14749
 *
14750
 * outerCh          The outer ClientHello buffer.
14751
 * outerChLen       Outer ClientHello length.
14752
 * newInnerCh       The inner ClientHello buffer.
14753
 * newInnerChLen    Inner ClientHello length.
14754
 * numOuterRefs     Number of references described by OuterExtensions extension.
14755
 * OuterRefTypes    References described by OuterExtensions extension.
14756
 * returns 0 on success and otherwise failure.
14757
 */
14758
static int TLSX_ECH_CopyOuterExtensions(const byte* outerCh, word32 outerChLen,
14759
    byte** newInnerCh, word32* newInnerChLen,
14760
    word16 numOuterRefs, const byte* outerRefTypes)
14761
{
14762
    int ret = 0;
14763
    word16 refType;
14764
    word32 outerExtLen;
14765
    word32 outerExtOffset = 0;
14766
    word16 extsStart = 0;
14767
    word16 extsLen = 0;
14768
    const byte* outerExtData;
14769
14770
    if (newInnerCh == NULL) {
14771
        *newInnerChLen = 0;
14772
    }
14773
14774
    while (numOuterRefs-- > 0) {
14775
        ato16(outerRefTypes, &refType);
14776
14777
        if (refType == TLSXT_ECH) {
14778
            WOLFSSL_MSG("ECH: ech_outer_extensions references ECH");
14779
            ret = INVALID_PARAMETER;
14780
            break;
14781
        }
14782
14783
        outerExtData = TLSX_ECH_FindOuterExtension(outerCh, outerChLen,
14784
                            refType, &outerExtLen, &outerExtOffset,
14785
                            &extsStart, &extsLen);
14786
14787
        if (outerExtData == NULL) {
14788
            WOLFSSL_MSG("ECH: referenced extension not in outer CH or out "
14789
                        "of order");
14790
            ret = INVALID_PARAMETER;
14791
            break;
14792
        }
14793
14794
        if (newInnerCh == NULL) {
14795
            *newInnerChLen += outerExtLen;
14796
        }
14797
        else {
14798
            XMEMCPY(*newInnerCh, outerExtData, outerExtLen);
14799
            *newInnerCh += outerExtLen;
14800
        }
14801
14802
        outerRefTypes += OPAQUE16_LEN;
14803
    }
14804
14805
    return ret;
14806
}
14807
14808
/* Expand ech_outer_extensions in the inner ClientHello by copying referenced
14809
 * extensions from the outer ClientHello.
14810
 * If the sessionID exists in the outer ClientHello then also copy that into the
14811
 * expanded inner ClientHello.
14812
 *
14813
 * ssl      SSL/TLS object.
14814
 * ech      ECH object.
14815
 * heap     Heap hint.
14816
 * returns 0 on success and otherwise failure.
14817
 */
14818
static int TLSX_ECH_ExpandOuterExtensions(WOLFSSL* ssl, WOLFSSL_ECH* ech,
14819
    void* heap)
14820
{
14821
    int ret = 0;
14822
    int headerSz;
14823
    const byte* innerCh;
14824
    word32 innerChLen;
14825
    const byte* outerCh;
14826
    word32 outerChLen;
14827
    word32 idx;
14828
    byte sessionIdLen;
14829
    word16 cipherSuitesLen;
14830
    byte compressionLen;
14831
14832
    word32 innerExtIdx;
14833
    word16 innerExtLen;
14834
    word32 echOuterExtIdx = 0;
14835
    word16 echOuterExtLen = 0;
14836
    int foundEchOuter = 0;
14837
    word16 numOuterRefs = 0;
14838
    const byte* outerRefTypes = NULL;
14839
    word32 extraSize = 0;
14840
    byte* newInnerCh = NULL;
14841
    byte* newInnerChRef;
14842
    word32 newInnerChLen;
14843
    word32 copyLen;
14844
14845
    WOLFSSL_ENTER("TLSX_ExpandEchOuterExtensions");
14846
14847
    if (ech == NULL || ech->innerClientHello == NULL || ech->aad == NULL)
14848
        return BAD_FUNC_ARG;
14849
14850
#ifdef WOLFSSL_DTLS13
14851
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
14852
                                   HANDSHAKE_HEADER_SZ;
14853
#else
14854
    headerSz = HANDSHAKE_HEADER_SZ;
14855
#endif
14856
14857
    innerCh = ech->innerClientHello + headerSz;
14858
    innerChLen = ech->innerClientHelloLen;
14859
    outerCh = ech->aad;
14860
    outerChLen = ech->aadLen;
14861
14862
    /* don't need to check for buffer overflows here since they are caught by
14863
     * TLSX_ECH_CheckInnerPadding */
14864
    idx = OPAQUE16_LEN + RAN_LEN;
14865
14866
    sessionIdLen = innerCh[idx++];
14867
    idx += sessionIdLen;
14868
14869
    ato16(innerCh + idx, &cipherSuitesLen);
14870
    idx += OPAQUE16_LEN + cipherSuitesLen;
14871
14872
    compressionLen = innerCh[idx++];
14873
    idx += compressionLen;
14874
14875
    ato16(innerCh + idx, &innerExtLen);
14876
    idx += OPAQUE16_LEN;
14877
    innerExtIdx = idx;
14878
14879
    /* validate ech_outer_extensions and calculate extra size */
14880
    while (idx < innerChLen && (idx - innerExtIdx) < innerExtLen) {
14881
        word16 type;
14882
        word16 len;
14883
        byte outerExtListLen;
14884
14885
        if (idx + OPAQUE16_LEN + OPAQUE16_LEN > innerChLen)
14886
            return BUFFER_ERROR;
14887
14888
        ato16(innerCh + idx, &type);
14889
        idx += OPAQUE16_LEN;
14890
        ato16(innerCh + idx, &len);
14891
        idx += OPAQUE16_LEN;
14892
14893
        if (idx + len > innerChLen)
14894
            return BUFFER_ERROR;
14895
14896
        if (type == TLSXT_ECH_OUTER_EXTENSIONS) {
14897
            if (foundEchOuter) {
14898
                WOLFSSL_MSG("ECH: duplicate ech_outer_extensions");
14899
                return INVALID_PARAMETER;
14900
            }
14901
            foundEchOuter = 1;
14902
            echOuterExtIdx = idx - OPAQUE16_LEN - OPAQUE16_LEN;
14903
            echOuterExtLen = len + OPAQUE16_LEN + OPAQUE16_LEN;
14904
14905
            /* ech_outer_extensions data format: 1-byte length + extension types
14906
             * ExtensionType OuterExtensions<2..254>; */
14907
            if (len < 1)
14908
                return BUFFER_ERROR;
14909
            outerExtListLen = innerCh[idx];
14910
            if (outerExtListLen + 1 != len || outerExtListLen < 2 ||
14911
                    outerExtListLen == 255)
14912
                return BUFFER_ERROR;
14913
14914
            outerRefTypes = innerCh + idx + 1;
14915
            numOuterRefs = outerExtListLen / OPAQUE16_LEN;
14916
14917
            ret = TLSX_ECH_CopyOuterExtensions(outerCh, outerChLen, NULL,
14918
                    &extraSize, numOuterRefs, outerRefTypes);
14919
            if (ret != 0)
14920
                return ret;
14921
        }
14922
14923
        idx += len;
14924
    }
14925
14926
    newInnerChLen = innerChLen - echOuterExtLen + extraSize - sessionIdLen +
14927
                        ssl->session->sessionIDSz;
14928
    if (newInnerChLen > 0xFFFF) {
14929
        return BUFFER_E;
14930
    }
14931
14932
    if (!foundEchOuter && sessionIdLen == ssl->session->sessionIDSz) {
14933
        /* no extensions + no sessionID to copy */
14934
        WOLFSSL_MSG("ECH: no EchOuterExtensions extension found");
14935
        return ret;
14936
    }
14937
    else {
14938
        newInnerCh = (byte*)XMALLOC(newInnerChLen + headerSz, heap,
14939
                                    DYNAMIC_TYPE_TMP_BUFFER);
14940
        if (newInnerCh == NULL)
14941
            return MEMORY_E;
14942
    }
14943
14944
    /* note: The first HANDSHAKE_HEADER_SZ bytes are reserved for the header
14945
     * but not initialized here. The header will be properly set later by
14946
     * AddTls13HandShakeHeader() in DoTls13ClientHello(). */
14947
14948
    /* copy everything up to EchOuterExtensions */
14949
    newInnerChRef = newInnerCh + headerSz;
14950
    copyLen = OPAQUE16_LEN + RAN_LEN;
14951
    XMEMCPY(newInnerChRef, innerCh, copyLen);
14952
    newInnerChRef += copyLen;
14953
14954
    *newInnerChRef = ssl->session->sessionIDSz;
14955
    newInnerChRef += OPAQUE8_LEN;
14956
14957
    copyLen = ssl->session->sessionIDSz;
14958
    XMEMCPY(newInnerChRef, ssl->session->sessionID, copyLen);
14959
    newInnerChRef += copyLen;
14960
14961
    if (!foundEchOuter) {
14962
        WOLFSSL_MSG("ECH: no EchOuterExtensions extension found");
14963
14964
        copyLen = innerChLen - OPAQUE16_LEN - RAN_LEN - OPAQUE8_LEN -
14965
                sessionIdLen;
14966
        XMEMCPY(newInnerChRef, innerCh + OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN +
14967
                sessionIdLen, copyLen);
14968
    }
14969
    else {
14970
        innerExtIdx = headerSz + innerExtIdx - OPAQUE16_LEN -
14971
            sessionIdLen + ssl->session->sessionIDSz;
14972
14973
        copyLen = echOuterExtIdx - OPAQUE16_LEN - RAN_LEN - OPAQUE8_LEN -
14974
                sessionIdLen;
14975
        XMEMCPY(newInnerChRef, innerCh + OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN +
14976
                sessionIdLen, copyLen);
14977
        newInnerChRef += copyLen;
14978
14979
        /* update extensions length in the new ClientHello */
14980
        c16toa(innerExtLen - echOuterExtLen + (word16)extraSize,
14981
                newInnerCh + innerExtIdx);
14982
14983
        ret = TLSX_ECH_CopyOuterExtensions(outerCh, outerChLen, &newInnerChRef,
14984
                &newInnerChLen, numOuterRefs, outerRefTypes);
14985
        if (ret == 0) {
14986
            /* copy remaining extensions after ech_outer_extensions */
14987
            copyLen = innerChLen - (echOuterExtIdx + echOuterExtLen);
14988
            XMEMCPY(newInnerChRef, innerCh + echOuterExtIdx + echOuterExtLen,
14989
                    copyLen);
14990
14991
            WOLFSSL_MSG("ECH: expanded ech_outer_extensions successfully");
14992
        }
14993
    }
14994
14995
    if (ret == 0) {
14996
        XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
14997
        ech->innerClientHello = newInnerCh;
14998
        ech->innerClientHelloLen = newInnerChLen;
14999
        newInnerCh = NULL;
15000
    }
15001
15002
    if (newInnerCh != NULL)
15003
        XFREE(newInnerCh, heap, DYNAMIC_TYPE_TMP_BUFFER);
15004
15005
    return ret;
15006
}
15007
15008
/* Header bytes reserved before the ECH inner ClientHello (DTLS uses a larger handshake header than TLS). */
15009
static word32 TLSX_EchInnerHeaderSz(const WOLFSSL* ssl)
15010
{
15011
#ifdef WOLFSSL_DTLS13
15012
    return ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ : HANDSHAKE_HEADER_SZ;
15013
#else
15014
    (void)ssl;
15015
    return HANDSHAKE_HEADER_SZ;
15016
#endif
15017
}
15018
15019
/* return status after attempting to open the hpke encrypted ech extension, if
15020
 * successful the inner client hello will be stored in
15021
 * ech->innerClientHelloLen */
15022
static int TLSX_ExtractEch(WOLFSSL* ssl, WOLFSSL_ECH* ech,
15023
    WOLFSSL_EchConfig* echConfig, byte* aad, word32 aadLen)
15024
{
15025
    int ret = 0;
15026
    int i;
15027
    int allocatedHpke = 0;
15028
    word32 rawConfigLen = 0;
15029
    byte* info = NULL;
15030
    word32 infoLen = 0;
15031
    if (ssl == NULL || ech == NULL || echConfig == NULL || aad == NULL)
15032
        return BAD_FUNC_ARG;
15033
    /* verify the kem and key len */
15034
    if (wc_HpkeKemGetEncLen(echConfig->kemId) != ech->encLen)
15035
        return BAD_FUNC_ARG;
15036
    /* verify the cipher suite */
15037
    for (i = 0; i < echConfig->numCipherSuites; i++) {
15038
        if (echConfig->cipherSuites[i].kdfId == ech->cipherSuite.kdfId &&
15039
            echConfig->cipherSuites[i].aeadId == ech->cipherSuite.aeadId) {
15040
            break;
15041
        }
15042
    }
15043
    if (i >= echConfig->numCipherSuites) {
15044
        return BAD_FUNC_ARG;
15045
    }
15046
    /* check if hpke already exists, may if HelloRetryRequest */
15047
    if (ech->hpke == NULL) {
15048
        allocatedHpke = 1;
15049
        ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), ssl->heap,
15050
            DYNAMIC_TYPE_TMP_BUFFER);
15051
        if (ech->hpke == NULL)
15052
            ret = MEMORY_E;
15053
        /* init the hpke struct */
15054
        if (ret == 0) {
15055
            ret = wc_HpkeInit(ech->hpke, echConfig->kemId,
15056
                ech->cipherSuite.kdfId, ech->cipherSuite.aeadId, ssl->heap);
15057
        }
15058
        if (ret == 0) {
15059
            /* allocate hpkeContext */
15060
            ech->hpkeContext =
15061
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
15062
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
15063
            if (ech->hpkeContext == NULL)
15064
                ret = MEMORY_E;
15065
        }
15066
        /* get the rawConfigLen */
15067
        if (ret == 0)
15068
            ret = GetEchConfig(echConfig, NULL, &rawConfigLen);
15069
        if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
15070
            ret = 0;
15071
        /* create info */
15072
        if (ret == 0) {
15073
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + rawConfigLen;
15074
            info = (byte*)XMALLOC(infoLen, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15075
15076
            if (info == NULL)
15077
                ret = MEMORY_E;
15078
            else {
15079
                XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
15080
                    TLS_INFO_CONST_STRING_SZ + 1);
15081
                ret = GetEchConfig(echConfig, info +
15082
                    TLS_INFO_CONST_STRING_SZ + 1, &rawConfigLen);
15083
            }
15084
        }
15085
#ifdef HAVE_SECRET_CALLBACK
15086
        /* allocate secret buffer for wc_HpkeInitOpenContext to copy into */
15087
        if (ret == 0 && (ssl->tls13SecretCb != NULL
15088
#ifdef OPENSSL_EXTRA
15089
                || ssl->tls13KeyLogCb != NULL
15090
#endif
15091
                )) {
15092
            ret = wc_HpkeInitEchSecret(ech->hpke);
15093
        }
15094
#endif /* HAVE_SECRET_CALLBACK */
15095
        /* init the context for opening */
15096
        if (ret == 0) {
15097
            ret = wc_HpkeInitOpenContext(ech->hpke, ech->hpkeContext,
15098
                echConfig->receiverPrivkey, ech->enc, ech->encLen, info,
15099
                infoLen);
15100
        }
15101
    }
15102
    /* decrypt the ech payload */
15103
    if (ret == 0) {
15104
        ret = wc_HpkeContextOpenBase(ech->hpke, ech->hpkeContext, aad, aadLen,
15105
            ech->outerClientPayload, ech->innerClientHelloLen,
15106
            ech->innerClientHello + TLSX_EchInnerHeaderSz(ssl));
15107
    }
15108
15109
#ifdef HAVE_SECRET_CALLBACK
15110
    if (ret == 0 && ech->hpke->echSecret != NULL) {
15111
        ret = EchWriteKeyLog(ssl, ech->hpke->echSecret, ech->hpke->Nsecret,
15112
                info + TLS_INFO_CONST_STRING_SZ + 1, rawConfigLen);
15113
    }
15114
    wc_HpkeFreeEchSecret(ech->hpke);
15115
#endif /* HAVE_SECRET_CALLBACK */
15116
15117
    /* only free hpke/hpkeContext if allocated in this call; otherwise preserve
15118
     * them for clientHello2 */
15119
    if (ret != 0 && allocatedHpke) {
15120
        XFREE(ech->hpke, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15121
        ech->hpke = NULL;
15122
        if (ech->hpkeContext != NULL) {
15123
            ForceZero(ech->hpkeContext, sizeof(HpkeBaseContext));
15124
            XFREE(ech->hpkeContext, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15125
            ech->hpkeContext = NULL;
15126
        }
15127
    }
15128
15129
    if (info != NULL)
15130
        XFREE(info, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15131
15132
    return ret;
15133
}
15134
15135
/* parse the ech extension, if internal update ech->state and return, if
15136
 * external attempt to extract the inner client_hello, return the status */
15137
static int TLSX_ECH_Parse(WOLFSSL* ssl, const byte* readBuf, word16 size,
15138
    byte msgType)
15139
{
15140
    int ret = 0;
15141
    TLSX* echX;
15142
    WOLFSSL_ECH* ech;
15143
    WOLFSSL_EchConfig* echConfig;
15144
    byte* aadCopy;
15145
    byte* readBuf_p = (byte*)readBuf;
15146
    word32 offset = 0;
15147
    word16 len;
15148
    word16 tmpVal16;
15149
    word16 lenCh;
15150
15151
    WOLFSSL_MSG("TLSX_ECH_Parse");
15152
    if (ssl->options.disableECH) {
15153
        WOLFSSL_MSG("TLSX_ECH_Parse: ECH disabled. Ignoring.");
15154
        return 0;
15155
    }
15156
    if (size == 0)
15157
        return BAD_FUNC_ARG;
15158
15159
    /* retry configs */
15160
    if (msgType == encrypted_extensions) {
15161
        /* configs must only be sent on ECH rejection (RFC9849, Section 5) */
15162
        if (ssl->options.echAccepted) {
15163
            SendAlert(ssl, alert_fatal, unsupported_extension);
15164
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
15165
            return UNSUPPORTED_EXTENSION;
15166
        }
15167
15168
        ret = SetRetryConfigs(ssl, readBuf, (word32)size);
15169
        if (ret == WC_NO_ERR_TRACE(UNSUPPORTED_SUITE) ||
15170
                ret == WC_NO_ERR_TRACE(UNSUPPORTED_PROTO_VERSION)) {
15171
            WOLFSSL_MSG("ECH retry configs had 'bad version' or 'bad suite'");
15172
            ret = 0;
15173
        }
15174
15175
        if (ssl->echConfigs == NULL) {
15176
            /* on GREASE connection configs must be checked syntactically and
15177
             * must not be saved (RFC 9849, Section 6.2.1) */
15178
            FreeEchConfigs(ssl->echRetryConfigs, ssl->heap);
15179
            ssl->echRetryConfigs = NULL;
15180
        }
15181
15182
        /* retry configs may only be accepted at the point when ECH_REQUIRED is
15183
         * sent */
15184
        ssl->options.echRetryConfigsAccepted = 0;
15185
    }
15186
    /* HRR with special confirmation */
15187
    else if (msgType == hello_retry_request && ssl->echConfigs != NULL) {
15188
        /* length must be 8 */
15189
        if (size != ECH_ACCEPT_CONFIRMATION_SZ)
15190
            return BUFFER_ERROR;
15191
15192
        /* get extension */
15193
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
15194
        if (echX == NULL)
15195
            return BAD_FUNC_ARG;
15196
        ech = (WOLFSSL_ECH*)echX->data;
15197
15198
        ech->confBuf = (byte*)readBuf;
15199
    }
15200
    else if (msgType == client_hello && ssl->ctx->echConfigs != NULL) {
15201
        /* get extension */
15202
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
15203
        if (echX == NULL)
15204
            return BAD_FUNC_ARG;
15205
        ech = (WOLFSSL_ECH*)echX->data;
15206
15207
        /* if the first ECH was rejected or CH1 did not have ECH then there is
15208
         * no need to decrypt this one */
15209
        if (!ssl->options.echAccepted && ssl->options.serverState ==
15210
                SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
15211
            ech->state = ECH_WRITE_RETRY_CONFIGS;
15212
            return 0;
15213
        }
15214
15215
        /* read the ech parameters before the payload */
15216
        ech->type = *readBuf_p;
15217
        readBuf_p++;
15218
        offset += 1;
15219
        if (ssl->options.echProcessingInner && ech->type == ECH_TYPE_INNER) {
15220
            ech->state = ECH_PARSED_INTERNAL;
15221
            return 0;
15222
        }
15223
        else if ((!ssl->options.echProcessingInner &&
15224
                  ech->type != ECH_TYPE_OUTER) ||
15225
                 (ssl->options.echProcessingInner &&
15226
                  ech->type != ECH_TYPE_INNER)) {
15227
            /* MUST process INNER in inner hello and OUTER in outer hello */
15228
            return INVALID_PARAMETER;
15229
        }
15230
        /* Must have kdfId, aeadId, configId, enc len and payload len. */
15231
        if (size < offset + 2 + 2 + 1 + 2 + 2) {
15232
            return BUFFER_ERROR;
15233
        }
15234
        /* only get enc if we don't already have the hpke context */
15235
        if (ech->hpkeContext == NULL) {
15236
            /* kdfId */
15237
            ato16(readBuf_p, &ech->cipherSuite.kdfId);
15238
            readBuf_p += 2;
15239
            offset += 2;
15240
            /* aeadId */
15241
            ato16(readBuf_p, &ech->cipherSuite.aeadId);
15242
            readBuf_p += 2;
15243
            offset += 2;
15244
            /* configId */
15245
            ech->configId = *readBuf_p;
15246
            readBuf_p++;
15247
            offset++;
15248
            /* encLen */
15249
            ato16(readBuf_p, &len);
15250
            readBuf_p += 2;
15251
            offset += 2;
15252
            /* Check encLen isn't more than remaining bytes minus
15253
             * payload length. */
15254
            if (len > size - offset - 2) {
15255
                return BUFFER_ERROR;
15256
            }
15257
            if (len > HPKE_Npk_MAX) {
15258
                return BUFFER_ERROR;
15259
            }
15260
            /* read enc */
15261
            XMEMCPY(ech->enc, readBuf_p, len);
15262
            ech->encLen = len;
15263
        }
15264
        else {
15265
            /* kdfId, aeadId, and configId must be the same as last time */
15266
            /* kdfId */
15267
            ato16(readBuf_p, &tmpVal16);
15268
            if (tmpVal16 != ech->cipherSuite.kdfId) {
15269
                return INVALID_PARAMETER;
15270
            }
15271
            readBuf_p += 2;
15272
            offset += 2;
15273
            /* aeadId */
15274
            ato16(readBuf_p, &tmpVal16);
15275
            if (tmpVal16 != ech->cipherSuite.aeadId) {
15276
                return INVALID_PARAMETER;
15277
            }
15278
            readBuf_p += 2;
15279
            offset += 2;
15280
            /* configId */
15281
            if (*readBuf_p != ech->configId) {
15282
                return INVALID_PARAMETER;
15283
            }
15284
            readBuf_p++;
15285
            offset++;
15286
            /* on an HRR the enc value MUST be empty */
15287
            ato16(readBuf_p, &len);
15288
            if (len != 0) {
15289
                return INVALID_PARAMETER;
15290
            }
15291
            readBuf_p += 2;
15292
            offset += 2;
15293
        }
15294
        readBuf_p += len;
15295
        offset += len;
15296
        /* read payload (encrypted CH) len */
15297
        ato16(readBuf_p, &lenCh);
15298
        ech->innerClientHelloLen = lenCh;
15299
        readBuf_p += 2;
15300
        offset += 2;
15301
        /* Check payload is no bigger than remaining bytes. */
15302
        if (ech->innerClientHelloLen > size - offset) {
15303
            return BUFFER_ERROR;
15304
        }
15305
        if (ech->innerClientHelloLen < WC_AES_BLOCK_SIZE) {
15306
            return BUFFER_ERROR;
15307
        }
15308
        ech->innerClientHelloLen -= WC_AES_BLOCK_SIZE;
15309
        ech->outerClientPayload = readBuf_p;
15310
        /* make a copy of the aad */
15311
        aadCopy = (byte*)XMALLOC(ech->aadLen, ssl->heap,
15312
            DYNAMIC_TYPE_TMP_BUFFER);
15313
        if (aadCopy == NULL)
15314
            return MEMORY_E;
15315
        XMEMCPY(aadCopy, ech->aad, ech->aadLen);
15316
        /* set the ech payload of the copy to zeros */
15317
        XMEMSET(aadCopy + (readBuf_p - ech->aad), 0,
15318
            ech->innerClientHelloLen + WC_AES_BLOCK_SIZE);
15319
        /* free the old ech when this is the second client hello */
15320
        if (ech->innerClientHello != NULL)
15321
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15322
        /* allocate the inner payload buffer */
15323
        ech->innerClientHello =
15324
            (byte*)XMALLOC(ech->innerClientHelloLen + TLSX_EchInnerHeaderSz(ssl),
15325
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15326
        if (ech->innerClientHello == NULL) {
15327
            XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15328
            return MEMORY_E;
15329
        }
15330
        /* try to decrypt with matching configId */
15331
        echConfig = ssl->ctx->echConfigs;
15332
        while (echConfig != NULL) {
15333
            if (echConfig->configId == ech->configId) {
15334
                ret = TLSX_ExtractEch(ssl, ech, echConfig, aadCopy,
15335
                        ech->aadLen);
15336
                if (ret == 0 || ret == WC_NO_ERR_TRACE(TLS13_SECRET_CB_E))
15337
                    break;
15338
            }
15339
            echConfig = echConfig->next;
15340
        }
15341
        /* otherwise, try to decrypt with all configs (trial decryption) */
15342
        if (echConfig == NULL && ssl->options.enableEchTrialDecrypt) {
15343
            echConfig = ssl->ctx->echConfigs;
15344
            while (echConfig != NULL) {
15345
                if (echConfig->configId != ech->configId) {
15346
                    ret = TLSX_ExtractEch(ssl, ech, echConfig, aadCopy,
15347
                            ech->aadLen);
15348
                    if (ret == 0 || ret == WC_NO_ERR_TRACE(TLS13_SECRET_CB_E))
15349
                        break;
15350
                }
15351
                echConfig = echConfig->next;
15352
            }
15353
        }
15354
        /* TLS13_SECRET_CB_E isn't correlated with ECH acceptance so skip both
15355
         * paths */
15356
        if (ret != WC_NO_ERR_TRACE(TLS13_SECRET_CB_E)) {
15357
            /* if we failed to extract/expand */
15358
            if (ret != 0 || echConfig == NULL) {
15359
                WOLFSSL_MSG("ECH rejected");
15360
15361
                if (ssl->options.echAccepted == 0) {
15362
                    /* on SH1 prepare to write retry configs */
15363
                    XFREE(ech->innerClientHello, ssl->heap,
15364
                        DYNAMIC_TYPE_TMP_BUFFER);
15365
                    ech->innerClientHello = NULL;
15366
                    ech->state = ECH_WRITE_RETRY_CONFIGS;
15367
                    ret = 0;
15368
                }
15369
                else {
15370
                    /* on SH2 failure to decrypt is fatal */
15371
                    SendAlert(ssl, alert_fatal, decrypt_error);
15372
                    WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
15373
                    ret = DECRYPT_ERROR;
15374
                }
15375
            }
15376
            else {
15377
                WOLFSSL_MSG("ECH accepted");
15378
                ssl->options.echAccepted = 1;
15379
15380
                ret = TLSX_ECH_CheckInnerPadding(ssl, ech);
15381
                if (ret == 0) {
15382
                    /* expand EchOuterExtensions if present.
15383
                    * Also, if it exists, copy sessionID from outer hello */
15384
                    ret = TLSX_ECH_ExpandOuterExtensions(ssl, ech, ssl->heap);
15385
                }
15386
            }
15387
        }
15388
        if (ret != 0) {
15389
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15390
            ech->innerClientHello = NULL;
15391
        }
15392
15393
        XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15394
    }
15395
15396
    return ret;
15397
}
15398
15399
/* free the ech struct and the dynamic buffer it uses */
15400
static void TLSX_ECH_Free(WOLFSSL_ECH* ech, void* heap)
15401
{
15402
    XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
15403
    if (ech->hpke != NULL) {
15404
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
15405
            ech->hpke->heap);
15406
        /* wc_HpkeFreeEchSecret is intentionally not here, free it in
15407
         * TLSX_ExtractEch / TLSX_FinalizeEch */
15408
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
15409
    }
15410
    if (ech->hpkeContext != NULL) {
15411
        ForceZero(ech->hpkeContext, sizeof(HpkeBaseContext));
15412
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
15413
    }
15414
15415
    XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
15416
    (void)heap;
15417
}
15418
15419
/* encrypt the client hello and store it in ech->outerClientPayload, return
15420
 * status */
15421
int TLSX_FinalizeEch(WOLFSSL* ssl, WOLFSSL_ECH* ech, byte* aad, word32 aadLen)
15422
{
15423
    int ret = 0;
15424
    void* receiverPubkey = NULL;
15425
    byte* info = NULL;
15426
    int infoLen = 0;
15427
    byte* aadCopy = NULL;
15428
    if (ssl == NULL || ech == NULL || aad == NULL)
15429
        return BAD_FUNC_ARG;
15430
    /* setup hpke context to seal, should be done at most once per connection */
15431
    if (ech->hpkeContext == NULL) {
15432
        /* import the server public key */
15433
        ret = wc_HpkeDeserializePublicKey(ech->hpke, &receiverPubkey,
15434
            ech->echConfig->receiverPubkey, ech->encLen);
15435
        if (ret == 0) {
15436
            /* allocate hpke context */
15437
            ech->hpkeContext =
15438
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
15439
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
15440
            if (ech->hpkeContext == NULL)
15441
                ret = MEMORY_E;
15442
        }
15443
        if (ret == 0) {
15444
            /* create info */
15445
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + ech->echConfig->rawLen;
15446
            info = (byte*)XMALLOC(infoLen, ech->hpke->heap,
15447
                DYNAMIC_TYPE_TMP_BUFFER);
15448
            if (info == NULL)
15449
                ret = MEMORY_E;
15450
        }
15451
        if (ret == 0) {
15452
            /* puts the null byte in for me */
15453
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
15454
                TLS_INFO_CONST_STRING_SZ + 1);
15455
            XMEMCPY(info + TLS_INFO_CONST_STRING_SZ + 1,
15456
                ech->echConfig->raw, ech->echConfig->rawLen);
15457
        }
15458
#ifdef HAVE_SECRET_CALLBACK
15459
        /* allocate secret buffer for wc_HpkeInitSealContext to copy into */
15460
        if (ret == 0 && (ssl->tls13SecretCb != NULL
15461
#ifdef OPENSSL_EXTRA
15462
                || ssl->tls13KeyLogCb != NULL
15463
#endif
15464
                )) {
15465
            ret = wc_HpkeInitEchSecret(ech->hpke);
15466
        }
15467
#endif /* HAVE_SECRET_CALLBACK */
15468
        if (ret == 0) {
15469
            /* init the context for seal with info and keys */
15470
            ret = wc_HpkeInitSealContext(ech->hpke, ech->hpkeContext,
15471
                ech->ephemeralKey, receiverPubkey, info, infoLen);
15472
        }
15473
    }
15474
    if (ret == 0) {
15475
        /* make a copy of the aad since we overwrite it */
15476
        aadCopy = (byte*)XMALLOC(aadLen, ech->hpke->heap,
15477
            DYNAMIC_TYPE_TMP_BUFFER);
15478
        if (aadCopy == NULL) {
15479
            ret = MEMORY_E;
15480
        }
15481
    }
15482
    if (ret == 0) {
15483
        XMEMCPY(aadCopy, aad, aadLen);
15484
        /* seal the payload with context */
15485
        ret = wc_HpkeContextSealBase(ech->hpke, ech->hpkeContext, aadCopy,
15486
            aadLen, ech->innerClientHello,
15487
            ech->innerClientHelloLen - ech->hpke->Nt, ech->outerClientPayload);
15488
    }
15489
15490
#ifdef HAVE_SECRET_CALLBACK
15491
    if (ret == 0 && ech->hpke->echSecret != NULL) {
15492
        ret = EchWriteKeyLog(ssl, ech->hpke->echSecret, ech->hpke->Nsecret,
15493
            ech->echConfig->raw, ech->echConfig->rawLen);
15494
    }
15495
    wc_HpkeFreeEchSecret(ech->hpke);
15496
#endif /* HAVE_SECRET_CALLBACK */
15497
15498
    if (info != NULL)
15499
        XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
15500
    if (aadCopy != NULL)
15501
        XFREE(aadCopy, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
15502
    if (receiverPubkey != NULL)
15503
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, receiverPubkey,
15504
            ech->hpke->heap);
15505
    return ret;
15506
}
15507
15508
#define GREASE_ECH_USE TLSX_GreaseECH_Use
15509
#define ECH_USE TLSX_ECH_Use
15510
#define SERVER_ECH_USE TLSX_ServerECH_Use
15511
#define ECH_WRITE TLSX_ECH_Write
15512
#define ECH_GET_SIZE TLSX_ECH_GetSize
15513
#define ECH_PARSE TLSX_ECH_Parse
15514
#define ECH_FREE TLSX_ECH_Free
15515
15516
#endif /* WOLFSSL_TLS13 && HAVE_ECH */
15517
15518
/** Releases all extensions in the provided list. */
15519
void TLSX_FreeAll(TLSX* list, void* heap)
15520
0
{
15521
0
    TLSX* extension;
15522
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15523
    TLSX* echList;
15524
    TLSX* tail;
15525
#endif
15526
15527
0
    while ((extension = list)) {
15528
0
        list = extension->next;
15529
15530
0
        switch (extension->type) {
15531
#if defined(HAVE_RPK)
15532
            case TLSX_CLIENT_CERTIFICATE_TYPE:
15533
                WOLFSSL_MSG("Client Certificate Type extension free");
15534
                /* nothing to do */
15535
                break;
15536
            case TLSX_SERVER_CERTIFICATE_TYPE:
15537
                WOLFSSL_MSG("Server Certificate Type extension free");
15538
                /* nothing to do */
15539
                break;
15540
#endif
15541
15542
0
#ifdef HAVE_SNI
15543
0
            case TLSX_SERVER_NAME:
15544
0
                WOLFSSL_MSG("SNI extension free");
15545
0
                SNI_FREE_ALL((SNI*)extension->data, heap);
15546
0
                break;
15547
0
#endif
15548
15549
0
            case TLSX_TRUSTED_CA_KEYS:
15550
0
                WOLFSSL_MSG("Trusted CA Indication extension free");
15551
0
                TCA_FREE_ALL((TCA*)extension->data, heap);
15552
0
                break;
15553
15554
0
            case TLSX_MAX_FRAGMENT_LENGTH:
15555
0
                WOLFSSL_MSG("Max Fragment Length extension free");
15556
0
                MFL_FREE_ALL(extension->data, heap);
15557
0
                break;
15558
15559
0
            case TLSX_EXTENDED_MASTER_SECRET:
15560
0
                WOLFSSL_MSG("Extended Master Secret free");
15561
                /* Nothing to do. */
15562
0
                break;
15563
0
            case TLSX_TRUNCATED_HMAC:
15564
0
                WOLFSSL_MSG("Truncated HMAC extension free");
15565
                /* Nothing to do. */
15566
0
                break;
15567
15568
0
            case TLSX_SUPPORTED_GROUPS:
15569
0
                WOLFSSL_MSG("Supported Groups extension free");
15570
0
                EC_FREE_ALL((SupportedCurve*)extension->data, heap);
15571
0
                break;
15572
15573
0
            case TLSX_EC_POINT_FORMATS:
15574
0
                WOLFSSL_MSG("Point Formats extension free");
15575
0
                PF_FREE_ALL((PointFormat*)extension->data, heap);
15576
0
                break;
15577
15578
0
            case TLSX_STATUS_REQUEST:
15579
0
                WOLFSSL_MSG("Certificate Status Request extension free");
15580
0
                CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
15581
0
                break;
15582
15583
0
            case TLSX_STATUS_REQUEST_V2:
15584
0
                WOLFSSL_MSG("Certificate Status Request v2 extension free");
15585
0
                CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
15586
0
                        heap);
15587
0
                break;
15588
15589
0
            case TLSX_RENEGOTIATION_INFO:
15590
0
                WOLFSSL_MSG("Secure Renegotiation extension free");
15591
0
                SCR_FREE_ALL((SecureRenegotiation*)extension->data, heap);
15592
0
                break;
15593
15594
0
            case TLSX_SESSION_TICKET:
15595
0
                WOLFSSL_MSG("Session Ticket extension free");
15596
0
                WOLF_STK_FREE(extension->data, heap);
15597
0
                break;
15598
15599
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
15600
0
                WOLFSSL_MSG("ALPN extension free");
15601
0
                ALPN_FREE_ALL((ALPN*)extension->data, heap);
15602
0
                break;
15603
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15604
0
            case TLSX_SIGNATURE_ALGORITHMS:
15605
0
                WOLFSSL_MSG("Signature Algorithms extension free");
15606
0
                break;
15607
0
#endif
15608
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
15609
0
            case TLSX_ENCRYPT_THEN_MAC:
15610
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension free");
15611
0
                break;
15612
0
#endif
15613
15614
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15615
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15616
            case TLSX_PRE_SHARED_KEY:
15617
                WOLFSSL_MSG("Pre-Shared Key extension free");
15618
                PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
15619
                break;
15620
15621
        #ifdef WOLFSSL_TLS13
15622
            case TLSX_PSK_KEY_EXCHANGE_MODES:
15623
                WOLFSSL_MSG("PSK Key Exchange Modes extension free");
15624
                break;
15625
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
15626
            case TLSX_CERT_WITH_EXTERN_PSK:
15627
                WOLFSSL_MSG("Cert with external PSK extension free");
15628
                break;
15629
        #endif
15630
        #endif
15631
    #endif
15632
15633
0
            case TLSX_KEY_SHARE:
15634
0
                WOLFSSL_MSG("Key Share extension free");
15635
0
                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
15636
0
                break;
15637
0
#endif
15638
0
#ifdef WOLFSSL_TLS13
15639
0
            case TLSX_SUPPORTED_VERSIONS:
15640
0
                WOLFSSL_MSG("Supported Versions extension free");
15641
0
                break;
15642
15643
0
            case TLSX_COOKIE:
15644
0
                WOLFSSL_MSG("Cookie extension free");
15645
0
                CKE_FREE_ALL((Cookie*)extension->data, heap);
15646
0
                break;
15647
15648
    #ifdef WOLFSSL_EARLY_DATA
15649
            case TLSX_EARLY_DATA:
15650
                WOLFSSL_MSG("Early Data extension free");
15651
                break;
15652
    #endif
15653
15654
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15655
            case TLSX_POST_HANDSHAKE_AUTH:
15656
                WOLFSSL_MSG("Post-Handshake Authentication extension free");
15657
                break;
15658
    #endif
15659
15660
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15661
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
15662
0
                WOLFSSL_MSG("Signature Algorithms extension free");
15663
0
                break;
15664
0
    #endif
15665
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15666
0
            case TLSX_CERTIFICATE_AUTHORITIES:
15667
0
                WOLFSSL_MSG("Certificate Authorities extension free");
15668
0
                break;
15669
0
    #endif
15670
0
#endif
15671
#ifdef WOLFSSL_SRTP
15672
            case TLSX_USE_SRTP:
15673
                WOLFSSL_MSG("SRTP extension free");
15674
                SRTP_FREE((TlsxSrtp*)extension->data, heap);
15675
                break;
15676
#endif
15677
15678
    #ifdef WOLFSSL_QUIC
15679
            case TLSX_KEY_QUIC_TP_PARAMS:
15680
                FALL_THROUGH;
15681
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
15682
                WOLFSSL_MSG("QUIC transport parameter free");
15683
                QTP_FREE((QuicTransportParam*)extension->data, heap);
15684
                break;
15685
    #endif
15686
15687
#ifdef WOLFSSL_DTLS_CID
15688
            case TLSX_CONNECTION_ID:
15689
                WOLFSSL_MSG("Connection ID extension free");
15690
                CID_FREE((byte*)extension->data, heap);
15691
                break;
15692
#endif /* WOLFSSL_DTLS_CID */
15693
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15694
            case TLSX_ECH:
15695
                WOLFSSL_MSG("ECH extension free");
15696
                /* append the ech extensions to the tail of the list so a
15697
                 * recursive TLSX_FreeAll is not necessary */
15698
                echList = ((WOLFSSL_ECH*)extension->data)->extensions;
15699
                if (echList != NULL) {
15700
                    if (list == NULL) {
15701
                        list = echList;
15702
                    }
15703
                    else {
15704
                        tail = list;
15705
                        while (tail->next != NULL)
15706
                            tail = tail->next;
15707
                        tail->next = echList;
15708
                    }
15709
                }
15710
                ECH_FREE((WOLFSSL_ECH*)extension->data, heap);
15711
                break;
15712
#endif
15713
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
15714
            case TLSX_CKS:
15715
                WOLFSSL_MSG("CKS extension free");
15716
                /* nothing to do */
15717
                break;
15718
#endif
15719
0
            default:
15720
0
                break;
15721
0
        }
15722
15723
0
        XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
15724
0
    }
15725
15726
0
    (void)heap;
15727
0
}
15728
15729
/** Checks if the tls extensions are supported based on the protocol version. */
15730
0
int TLSX_SupportExtensions(WOLFSSL* ssl) {
15731
0
    return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
15732
0
}
15733
15734
/** Tells the buffered size of the extensions in a list. */
15735
static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
15736
                        word16* pLength)
15737
0
{
15738
0
    int    ret = 0;
15739
0
    TLSX*  extension;
15740
    /* Use a word32 accumulator so that an extension whose contribution
15741
     * pushes the running total past 0xFFFF is detected rather than
15742
     * silently wrapped (the TLS extensions block length prefix on the
15743
     * wire is a 2-byte field). Callees that take a word16* accumulator
15744
     * are invoked via a per-iteration shim (`cbShim`) and their delta
15745
     * is added back into the word32 total.
15746
     *
15747
     * MAINTAINER NOTE: do NOT pass &length to any *_GET_SIZE function
15748
     * that expects a `word16*` out-parameter -- that would be a type
15749
     * mismatch (UB) and would silently bypass the overflow detection
15750
     * below. When adding a new extension case, either:
15751
     *   - use `length += FOO_GET_SIZE(...)` when the helper returns a
15752
     *     word16 by value, or
15753
     *   - use the cbShim pattern: `cbShim = 0; ret = FOO_GET_SIZE(...,
15754
     *     &cbShim); length += cbShim;`
15755
     */
15756
0
    word32 length = 0;
15757
0
    word16 cbShim = 0;
15758
0
    byte   isRequest = (msgType == client_hello ||
15759
0
                        msgType == certificate_request);
15760
0
    (void)cbShim;
15761
15762
0
    while ((extension = list)) {
15763
0
        list = extension->next;
15764
15765
        /* only extensions marked as response are sent back to the client. */
15766
0
        if (!isRequest && !extension->resp)
15767
0
            continue; /* skip! */
15768
15769
        /* ssl level extensions are expected to override ctx level ones. */
15770
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
15771
0
            continue; /* skip! */
15772
15773
        /* extension type + extension data length. */
15774
0
        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
15775
15776
0
        switch (extension->type) {
15777
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
15778
            case TLSX_CKS:
15779
                length += ((WOLFSSL*)extension->data)->sigSpecSz ;
15780
                break;
15781
#endif
15782
0
#ifdef HAVE_SNI
15783
0
            case TLSX_SERVER_NAME:
15784
                /* SNI only sends the name on the request. */
15785
0
                if (isRequest)
15786
0
                    length += SNI_GET_SIZE((SNI*)extension->data);
15787
0
                break;
15788
0
#endif
15789
15790
0
            case TLSX_TRUSTED_CA_KEYS:
15791
                /* TCA only sends the list on the request. */
15792
0
                if (isRequest) {
15793
0
                    word16 tcaSz = TCA_GET_SIZE((TCA*)extension->data);
15794
                    /* 0 on non-empty list means 16-bit overflow. */
15795
0
                    if (tcaSz == 0 && extension->data != NULL) {
15796
0
                        ret = LENGTH_ERROR;
15797
0
                        break;
15798
0
                    }
15799
0
                    length += tcaSz;
15800
0
                }
15801
0
                break;
15802
15803
0
            case TLSX_MAX_FRAGMENT_LENGTH:
15804
0
                length += MFL_GET_SIZE(extension->data);
15805
0
                break;
15806
15807
0
            case TLSX_EXTENDED_MASTER_SECRET:
15808
0
            case TLSX_TRUNCATED_HMAC:
15809
                /* always empty. */
15810
0
                break;
15811
15812
0
            case TLSX_SUPPORTED_GROUPS:
15813
0
                length += EC_GET_SIZE((SupportedCurve*)extension->data);
15814
0
                break;
15815
15816
0
            case TLSX_EC_POINT_FORMATS:
15817
0
                length += PF_GET_SIZE((PointFormat*)extension->data);
15818
0
                break;
15819
15820
0
            case TLSX_STATUS_REQUEST:
15821
0
                if (msgType != certificate_request)
15822
0
                    length += CSR_GET_SIZE(
15823
0
                            (CertificateStatusRequest*)extension->data, isRequest);
15824
0
                break;
15825
15826
0
            case TLSX_STATUS_REQUEST_V2:
15827
0
                length += CSR2_GET_SIZE(
15828
0
                        (CertificateStatusRequestItemV2*)extension->data,
15829
0
                        isRequest);
15830
0
                break;
15831
15832
0
            case TLSX_RENEGOTIATION_INFO:
15833
0
                length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
15834
0
                        isRequest);
15835
0
                break;
15836
15837
0
            case TLSX_SESSION_TICKET:
15838
0
                length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
15839
0
                        isRequest);
15840
0
                break;
15841
15842
0
            case TLSX_APPLICATION_LAYER_PROTOCOL: {
15843
0
                word16 alpnSz = ALPN_GET_SIZE((ALPN*)extension->data);
15844
                /* 0 on non-empty list means 16-bit overflow. */
15845
0
                if (alpnSz == 0 && extension->data != NULL) {
15846
0
                    ret = LENGTH_ERROR;
15847
0
                    break;
15848
0
                }
15849
0
                length += alpnSz;
15850
0
                break;
15851
0
            }
15852
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15853
0
            case TLSX_SIGNATURE_ALGORITHMS:
15854
0
                length += SA_GET_SIZE(extension->data);
15855
0
                break;
15856
0
#endif
15857
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
15858
0
            case TLSX_ENCRYPT_THEN_MAC:
15859
0
                cbShim = 0;
15860
0
                ret = ETM_GET_SIZE(msgType, &cbShim);
15861
0
                length += cbShim;
15862
0
                break;
15863
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
15864
15865
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15866
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15867
            case TLSX_PRE_SHARED_KEY:
15868
                cbShim = 0;
15869
                ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
15870
                                                                       &cbShim);
15871
                length += cbShim;
15872
                break;
15873
        #ifdef WOLFSSL_TLS13
15874
            case TLSX_PSK_KEY_EXCHANGE_MODES:
15875
                cbShim = 0;
15876
                ret = PKM_GET_SIZE((byte)extension->val, msgType, &cbShim);
15877
                length += cbShim;
15878
                break;
15879
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
15880
            case TLSX_CERT_WITH_EXTERN_PSK:
15881
                cbShim = 0;
15882
                ret = PSK_WITH_CERT_GET_SIZE(msgType, &cbShim);
15883
                length += cbShim;
15884
                break;
15885
        #endif
15886
        #endif
15887
    #endif
15888
0
            case TLSX_KEY_SHARE:
15889
0
                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
15890
0
                break;
15891
0
#endif
15892
15893
0
#ifdef WOLFSSL_TLS13
15894
0
            case TLSX_SUPPORTED_VERSIONS:
15895
0
                cbShim = 0;
15896
0
                ret = SV_GET_SIZE(extension->data, msgType, &cbShim);
15897
0
                length += cbShim;
15898
0
                break;
15899
15900
0
            case TLSX_COOKIE:
15901
0
                cbShim = 0;
15902
0
                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &cbShim);
15903
0
                length += cbShim;
15904
0
                break;
15905
15906
    #ifdef WOLFSSL_EARLY_DATA
15907
            case TLSX_EARLY_DATA:
15908
                cbShim = 0;
15909
                ret = EDI_GET_SIZE(msgType, &cbShim);
15910
                length += cbShim;
15911
                break;
15912
    #endif
15913
15914
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15915
            case TLSX_POST_HANDSHAKE_AUTH:
15916
                cbShim = 0;
15917
                ret = PHA_GET_SIZE(msgType, &cbShim);
15918
                length += cbShim;
15919
                break;
15920
    #endif
15921
15922
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15923
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
15924
0
                length += SAC_GET_SIZE(extension->data);
15925
0
                break;
15926
0
    #endif
15927
15928
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15929
0
            case TLSX_CERTIFICATE_AUTHORITIES:
15930
0
                cbShim = 0;
15931
0
                ret = CAN_GET_SIZE((WOLFSSL*)extension->data, &cbShim);
15932
0
                length += cbShim;
15933
0
                break;
15934
0
    #endif
15935
0
#endif
15936
#ifdef WOLFSSL_SRTP
15937
            case TLSX_USE_SRTP:
15938
                length += SRTP_GET_SIZE((TlsxSrtp*)extension->data);
15939
                break;
15940
#endif
15941
15942
#ifdef HAVE_RPK
15943
            case TLSX_CLIENT_CERTIFICATE_TYPE:
15944
                length += CCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
15945
                break;
15946
15947
            case TLSX_SERVER_CERTIFICATE_TYPE:
15948
                length += SCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
15949
                break;
15950
#endif /* HAVE_RPK */
15951
15952
#ifdef WOLFSSL_QUIC
15953
            case TLSX_KEY_QUIC_TP_PARAMS:
15954
                FALL_THROUGH; /* followed by */
15955
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
15956
                length += QTP_GET_SIZE(extension);
15957
                break;
15958
#endif
15959
#ifdef WOLFSSL_DTLS_CID
15960
            case TLSX_CONNECTION_ID:
15961
                length += CID_GET_SIZE((byte*)extension->data);
15962
                break;
15963
#endif /* WOLFSSL_DTLS_CID */
15964
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15965
            case TLSX_ECH:
15966
                length += ECH_GET_SIZE((WOLFSSL_ECH*)extension->data, msgType);
15967
                break;
15968
#endif
15969
0
            default:
15970
0
                break;
15971
0
        }
15972
15973
0
        if (ret != 0)
15974
0
            return ret;
15975
15976
        /* Early exit: stop accumulating as soon as the running total
15977
         * cannot possibly fit the 2-byte wire length. Check *before*
15978
         * marking the extension as processed so the semaphore is not
15979
         * left in an inconsistent state on the error path. */
15980
0
        if (length > WOLFSSL_MAX_16BIT) {
15981
0
            WOLFSSL_MSG("TLSX_GetSize extension length exceeds word16");
15982
0
            return BUFFER_E;
15983
0
        }
15984
15985
        /* marks the extension as processed so ctx level */
15986
        /* extensions don't overlap with ssl level ones. */
15987
0
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
15988
15989
0
    }
15990
15991
0
    if ((word32)*pLength + length > WOLFSSL_MAX_16BIT) {
15992
0
        WOLFSSL_MSG("TLSX_GetSize total extensions length exceeds word16");
15993
0
        return BUFFER_E;
15994
0
    }
15995
15996
0
    *pLength += (word16)length;
15997
15998
0
    return ret;
15999
0
}
16000
16001
/** Writes the extensions of a list in a buffer. */
16002
static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
16003
                         byte msgType, word16* pOffset)
16004
0
{
16005
0
    int    ret = 0;
16006
0
    TLSX*  extension;
16007
    /* Use word32 to symmetrize with TLSX_GetSize -- a single extension can
16008
     * contribute up to 0x10003 bytes (4-byte type/length header + 0xFFFF
16009
     * payload), which would word16-overflow undetectably (e.g. wrap to a
16010
     * value still above prevOffset). Per-iteration and aggregate bounds are
16011
     * checked below before truncating back into the word16 wire fields.
16012
     * Callees that take a word16* offset use the cbShim pattern (init to 0,
16013
     * then add the returned delta to the word32 accumulator). */
16014
0
    word32 offset = 0;
16015
0
    word32 length_offset = 0;
16016
0
    word32 prevOffset;
16017
0
    word16 cbShim = 0;
16018
0
    byte   isRequest = (msgType == client_hello ||
16019
0
                        msgType == certificate_request);
16020
0
    (void)cbShim;
16021
16022
0
    while ((extension = list)) {
16023
0
        list = extension->next;
16024
16025
        /* only extensions marked as response are written in a response. */
16026
0
        if (!isRequest && !extension->resp)
16027
0
            continue; /* skip! */
16028
16029
        /* ssl level extensions are expected to override ctx level ones. */
16030
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
16031
0
            continue; /* skip! */
16032
16033
        /* Snapshot offset to detect word16 wrap within this iteration;
16034
         * see matching comment in TLSX_GetSize. */
16035
0
        prevOffset = offset;
16036
16037
        /* writes extension type. */
16038
0
        c16toa((word16)extension->type, output + offset);
16039
0
        offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
16040
0
        length_offset = offset;
16041
16042
        /* extension data should be written internally. */
16043
0
        switch (extension->type) {
16044
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
16045
            case TLSX_CKS:
16046
                WOLFSSL_MSG("CKS extension to write");
16047
                offset += CKS_WRITE(((WOLFSSL*)extension->data),
16048
                                    output + offset);
16049
                break;
16050
#endif
16051
0
#ifdef HAVE_SNI
16052
0
            case TLSX_SERVER_NAME:
16053
0
                if (isRequest) {
16054
0
                    WOLFSSL_MSG("SNI extension to write");
16055
0
                    offset += SNI_WRITE((SNI*)extension->data, output + offset);
16056
0
                }
16057
0
                break;
16058
0
#endif
16059
16060
0
            case TLSX_TRUSTED_CA_KEYS:
16061
0
                WOLFSSL_MSG("Trusted CA Indication extension to write");
16062
0
                if (isRequest) {
16063
0
                    offset += TCA_WRITE((TCA*)extension->data, output + offset);
16064
0
                }
16065
0
                break;
16066
16067
0
            case TLSX_MAX_FRAGMENT_LENGTH:
16068
0
                WOLFSSL_MSG("Max Fragment Length extension to write");
16069
0
                offset += MFL_WRITE((byte*)extension->data, output + offset);
16070
0
                break;
16071
16072
0
            case TLSX_EXTENDED_MASTER_SECRET:
16073
0
                WOLFSSL_MSG("Extended Master Secret");
16074
                /* always empty. */
16075
0
                break;
16076
16077
0
            case TLSX_TRUNCATED_HMAC:
16078
0
                WOLFSSL_MSG("Truncated HMAC extension to write");
16079
                /* always empty. */
16080
0
                break;
16081
16082
0
            case TLSX_SUPPORTED_GROUPS:
16083
0
                WOLFSSL_MSG("Supported Groups extension to write");
16084
0
                offset += EC_WRITE((SupportedCurve*)extension->data,
16085
0
                                    output + offset);
16086
0
                break;
16087
16088
0
            case TLSX_EC_POINT_FORMATS:
16089
0
                WOLFSSL_MSG("Point Formats extension to write");
16090
0
                offset += PF_WRITE((PointFormat*)extension->data,
16091
0
                                    output + offset);
16092
0
                break;
16093
16094
0
            case TLSX_STATUS_REQUEST:
16095
0
                WOLFSSL_MSG("Certificate Status Request extension to write");
16096
0
                if (msgType == certificate_request) {
16097
0
                    ret = 0;
16098
0
                } else {
16099
0
                    ret = CSR_WRITE((CertificateStatusRequest*)extension->data,
16100
0
                            output + offset, isRequest);
16101
0
                    if (ret > 0) {
16102
0
                        offset += (word16)ret;
16103
0
                        ret = 0;
16104
0
                    }
16105
0
                }
16106
0
                break;
16107
16108
0
            case TLSX_STATUS_REQUEST_V2:
16109
0
                WOLFSSL_MSG("Certificate Status Request v2 extension to write");
16110
0
                ret = CSR2_WRITE(
16111
0
                        (CertificateStatusRequestItemV2*)extension->data,
16112
0
                        output + offset, isRequest);
16113
0
                if (ret > 0) {
16114
0
                    offset += (word16)ret;
16115
0
                    ret = 0;
16116
0
                }
16117
0
                break;
16118
16119
0
            case TLSX_RENEGOTIATION_INFO:
16120
0
                WOLFSSL_MSG("Secure Renegotiation extension to write");
16121
0
                offset += SCR_WRITE((SecureRenegotiation*)extension->data,
16122
0
                        output + offset, isRequest);
16123
0
                break;
16124
16125
0
            case TLSX_SESSION_TICKET:
16126
0
                WOLFSSL_MSG("Session Ticket extension to write");
16127
0
                offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
16128
0
                        output + offset, isRequest);
16129
0
                break;
16130
16131
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
16132
0
                WOLFSSL_MSG("ALPN extension to write");
16133
0
                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
16134
0
                break;
16135
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16136
0
            case TLSX_SIGNATURE_ALGORITHMS:
16137
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
16138
0
                offset += SA_WRITE(extension->data, output + offset);
16139
0
                break;
16140
0
#endif
16141
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
16142
0
            case TLSX_ENCRYPT_THEN_MAC:
16143
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
16144
0
                cbShim = 0;
16145
0
                ret = ETM_WRITE(extension->data, output, msgType, &cbShim);
16146
0
                offset += cbShim;
16147
0
                break;
16148
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
16149
16150
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
16151
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16152
            case TLSX_PRE_SHARED_KEY:
16153
                WOLFSSL_MSG("Pre-Shared Key extension to write");
16154
                cbShim = 0;
16155
                ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
16156
                                                              msgType, &cbShim);
16157
                offset += cbShim;
16158
                break;
16159
16160
        #ifdef WOLFSSL_TLS13
16161
            case TLSX_PSK_KEY_EXCHANGE_MODES:
16162
                WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
16163
                cbShim = 0;
16164
                ret = PKM_WRITE((byte)extension->val, output + offset, msgType,
16165
                                                                       &cbShim);
16166
                offset += cbShim;
16167
                break;
16168
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
16169
            case TLSX_CERT_WITH_EXTERN_PSK:
16170
                WOLFSSL_MSG("Cert with external PSK extension to write");
16171
                cbShim = 0;
16172
                ret = PSK_WITH_CERT_WRITE(output + offset, msgType, &cbShim);
16173
                offset += cbShim;
16174
                break;
16175
        #endif
16176
        #endif
16177
    #endif
16178
0
            case TLSX_KEY_SHARE:
16179
0
                WOLFSSL_MSG("Key Share extension to write");
16180
0
                offset += KS_WRITE((KeyShareEntry*)extension->data,
16181
0
                                                      output + offset, msgType);
16182
0
                break;
16183
0
#endif
16184
0
#ifdef WOLFSSL_TLS13
16185
0
            case TLSX_SUPPORTED_VERSIONS:
16186
0
                WOLFSSL_MSG("Supported Versions extension to write");
16187
0
                cbShim = 0;
16188
0
                ret = SV_WRITE(extension->data, output + offset, msgType,
16189
0
                                                                       &cbShim);
16190
0
                offset += cbShim;
16191
0
                break;
16192
16193
0
            case TLSX_COOKIE:
16194
0
                WOLFSSL_MSG("Cookie extension to write");
16195
0
                cbShim = 0;
16196
0
                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
16197
0
                                msgType, &cbShim);
16198
0
                offset += cbShim;
16199
0
                break;
16200
16201
    #ifdef WOLFSSL_EARLY_DATA
16202
            case TLSX_EARLY_DATA:
16203
                WOLFSSL_MSG("Early Data extension to write");
16204
                cbShim = 0;
16205
                ret = EDI_WRITE(extension->val, output + offset, msgType,
16206
                                                                       &cbShim);
16207
                offset += cbShim;
16208
                break;
16209
    #endif
16210
16211
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
16212
            case TLSX_POST_HANDSHAKE_AUTH:
16213
                WOLFSSL_MSG("Post-Handshake Authentication extension to write");
16214
                cbShim = 0;
16215
                ret = PHA_WRITE(output + offset, msgType, &cbShim);
16216
                offset += cbShim;
16217
                break;
16218
    #endif
16219
16220
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16221
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
16222
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
16223
0
                offset += SAC_WRITE(extension->data, output + offset);
16224
0
                break;
16225
0
    #endif
16226
16227
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16228
0
            case TLSX_CERTIFICATE_AUTHORITIES:
16229
0
                WOLFSSL_MSG("Certificate Authorities extension to write");
16230
0
                cbShim = 0;
16231
0
                ret = CAN_WRITE((WOLFSSL*)extension->data,
16232
0
                        output + offset, &cbShim);
16233
0
                offset += cbShim;
16234
0
                break;
16235
0
    #endif
16236
0
#endif
16237
#ifdef WOLFSSL_SRTP
16238
            case TLSX_USE_SRTP:
16239
                WOLFSSL_MSG("SRTP extension to write");
16240
                offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset);
16241
                break;
16242
#endif
16243
16244
#ifdef HAVE_RPK
16245
            case TLSX_CLIENT_CERTIFICATE_TYPE:
16246
                WOLFSSL_MSG("Client Certificate Type extension to write");
16247
                offset += CCT_WRITE(extension->data, output + offset, msgType);
16248
                break;
16249
16250
            case TLSX_SERVER_CERTIFICATE_TYPE:
16251
                WOLFSSL_MSG("Server Certificate Type extension to write");
16252
                offset += SCT_WRITE(extension->data, output + offset, msgType);
16253
                break;
16254
#endif /* HAVE_RPK */
16255
16256
#ifdef WOLFSSL_QUIC
16257
            case TLSX_KEY_QUIC_TP_PARAMS:
16258
                FALL_THROUGH;
16259
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
16260
                WOLFSSL_MSG("QUIC transport parameter to write");
16261
                offset += QTP_WRITE((QuicTransportParam*)extension->data,
16262
                                    output + offset);
16263
                break;
16264
#endif
16265
#ifdef WOLFSSL_DTLS_CID
16266
            case TLSX_CONNECTION_ID:
16267
                WOLFSSL_MSG("Connection ID extension to write");
16268
                offset += CID_WRITE((byte*)extension->data, output+offset);
16269
                break;
16270
16271
#endif /* WOLFSSL_DTLS_CID */
16272
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
16273
            case TLSX_ECH:
16274
                WOLFSSL_MSG("ECH extension to write");
16275
                cbShim = 0;
16276
                ret = ECH_WRITE((WOLFSSL_ECH*)extension->data, msgType,
16277
                    output + offset, &cbShim);
16278
                offset += cbShim;
16279
                break;
16280
#endif
16281
0
            default:
16282
0
                break;
16283
0
        }
16284
16285
        /* Per-extension data length is a 2-byte wire field; reject any
16286
         * single extension whose payload exceeds that before truncating. */
16287
0
        if (offset - length_offset > WOLFSSL_MAX_16BIT) {
16288
0
            WOLFSSL_MSG("TLSX_Write single extension length exceeds word16");
16289
0
            return BUFFER_E;
16290
0
        }
16291
16292
        /* writes extension data length. */
16293
0
        c16toa((word16)(offset - length_offset),
16294
0
               output + length_offset - OPAQUE16_LEN);
16295
16296
        /* marks the extension as processed so ctx level */
16297
        /* extensions don't overlap with ssl level ones. */
16298
0
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
16299
16300
        /* if we encountered an error propagate it */
16301
0
        if (ret != 0)
16302
0
            break;
16303
16304
0
        if (offset <= prevOffset) {
16305
0
            WOLFSSL_MSG("TLSX_Write extension made no progress");
16306
0
            return BUFFER_E;
16307
0
        }
16308
0
    }
16309
16310
    /* Only validate and commit the aggregate offset when the loop
16311
     * completed without error; on the error path, leave *pOffset
16312
     * unchanged and return the original failure reason so callers
16313
     * see the real error instead of a masking BUFFER_E. */
16314
0
    if (ret == 0) {
16315
0
        if ((word32)*pOffset + offset > WOLFSSL_MAX_16BIT) {
16316
0
            WOLFSSL_MSG("TLSX_Write total extensions length exceeds word16");
16317
0
            return BUFFER_E;
16318
0
        }
16319
0
        *pOffset += (word16)offset;
16320
0
    }
16321
16322
0
    return ret;
16323
0
}
16324
16325
#ifdef HAVE_SUPPORTED_CURVES
16326
16327
/* Populates the default supported groups / curves */
16328
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
16329
0
{
16330
0
    int ret = WOLFSSL_SUCCESS;
16331
0
#ifdef WOLFSSL_TLS13
16332
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16333
    if (ssl->options.resuming && ssl->session->namedGroup != 0) {
16334
        return TLSX_UseSupportedCurve(extensions, ssl->session->namedGroup,
16335
                                                  ssl->heap, ssl->options.side);
16336
    }
16337
#endif
16338
16339
0
    if (ssl->numGroups != 0) {
16340
0
        int i;
16341
0
        for (i = 0; i < ssl->numGroups; i++) {
16342
0
            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap,
16343
0
                                                             ssl->options.side);
16344
0
            if (ret != WOLFSSL_SUCCESS)
16345
0
                return ret;
16346
0
        }
16347
0
        return WOLFSSL_SUCCESS;
16348
0
    }
16349
0
#endif /* WOLFSSL_TLS13 */
16350
16351
0
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
16352
0
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS)
16353
    /* Prefer non-experimental PQ/T hybrid groups (only for TLS 1.3) */
16354
0
    if (IsAtLeastTLSv1_3(ssl->version) &&
16355
0
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16356
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
16357
        ECC_MIN_KEY_SZ <= 256
16358
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM768,
16359
            ssl->heap, ssl->options.side);
16360
        if (ret != WOLFSSL_SUCCESS) return ret;
16361
    #endif
16362
0
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
16363
0
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
16364
0
        ECC_MIN_KEY_SZ <= 384
16365
0
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM1024,
16366
0
            ssl->heap, ssl->options.side);
16367
0
        if (ret != WOLFSSL_SUCCESS) return ret;
16368
0
    #endif
16369
0
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
16370
0
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
16371
0
        ECC_MIN_KEY_SZ <= 256
16372
0
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM768,
16373
0
            ssl->heap, ssl->options.side);
16374
0
        if (ret != WOLFSSL_SUCCESS) return ret;
16375
0
    #endif
16376
0
    }
16377
0
#endif
16378
16379
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
16380
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_1024) && \
16381
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
16382
    if (IsAtLeastTLSv1_3(ssl->version) &&
16383
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16384
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
16385
                                     ssl->heap, ssl->options.side);
16386
        if (ret != WOLFSSL_SUCCESS) return ret;
16387
    }
16388
#endif
16389
16390
0
#if defined(HAVE_ECC)
16391
    /* list in order by strength, since not all servers choose by strength */
16392
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
16393
0
        #ifndef NO_ECC_SECP
16394
0
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP521R1,
16395
0
                                     ssl->heap, ssl->options.side);
16396
0
        if (ret != WOLFSSL_SUCCESS) return ret;
16397
0
        #endif
16398
0
    #endif
16399
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
16400
        #ifdef HAVE_ECC_BRAINPOOL
16401
        if (IsAtLeastTLSv1_3(ssl->version)) {
16402
            /* TLS 1.3 BrainpoolP512 curve */
16403
            ret = TLSX_UseSupportedCurve(extensions,
16404
                WOLFSSL_ECC_BRAINPOOLP512R1TLS13, ssl->heap, ssl->options.side);
16405
            if (ret != WOLFSSL_SUCCESS) return ret;
16406
16407
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
16408
            if (ssl->options.downgrade &&
16409
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
16410
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
16411
                ret = TLSX_UseSupportedCurve(extensions,
16412
                    WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap, ssl->options.side);
16413
                if (ret != WOLFSSL_SUCCESS) return ret;
16414
            }
16415
        }
16416
        else {
16417
            /* TLS 1.2 only */
16418
            ret = TLSX_UseSupportedCurve(extensions,
16419
                WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap, ssl->options.side);
16420
            if (ret != WOLFSSL_SUCCESS) return ret;
16421
        }
16422
        #endif
16423
0
    #endif
16424
0
#endif
16425
16426
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16427
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_768) && \
16428
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
16429
    if (IsAtLeastTLSv1_3(ssl->version) &&
16430
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16431
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
16432
                                     ssl->heap, ssl->options.side);
16433
        if (ret != WOLFSSL_SUCCESS) return ret;
16434
    }
16435
#endif
16436
16437
0
#if defined(HAVE_ECC)
16438
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
16439
0
        #ifndef NO_ECC_SECP
16440
0
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP384R1,
16441
0
            ssl->heap, ssl->options.side);
16442
0
        if (ret != WOLFSSL_SUCCESS) return ret;
16443
0
        #endif
16444
        #ifdef HAVE_ECC_BRAINPOOL
16445
        if (IsAtLeastTLSv1_3(ssl->version)) {
16446
            /* TLS 1.3 BrainpoolP384 curve */
16447
            ret = TLSX_UseSupportedCurve(extensions,
16448
                WOLFSSL_ECC_BRAINPOOLP384R1TLS13, ssl->heap, ssl->options.side);
16449
            if (ret != WOLFSSL_SUCCESS) return ret;
16450
16451
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
16452
            if (ssl->options.downgrade &&
16453
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
16454
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
16455
                ret = TLSX_UseSupportedCurve(extensions,
16456
                    WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap, ssl->options.side);
16457
                if (ret != WOLFSSL_SUCCESS) return ret;
16458
            }
16459
        }
16460
        else {
16461
            /* TLS 1.2 only */
16462
            ret = TLSX_UseSupportedCurve(extensions,
16463
                WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap, ssl->options.side);
16464
            if (ret != WOLFSSL_SUCCESS) return ret;
16465
        }
16466
        #endif
16467
0
    #endif
16468
0
#endif /* HAVE_ECC */
16469
16470
0
#ifndef HAVE_FIPS
16471
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
16472
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_X448, ssl->heap,
16473
            ssl->options.side);
16474
        if (ret != WOLFSSL_SUCCESS) return ret;
16475
    #endif
16476
0
#endif /* HAVE_FIPS */
16477
16478
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16479
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_512) && \
16480
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
16481
    if (IsAtLeastTLSv1_3(ssl->version) &&
16482
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16483
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512, ssl->heap,
16484
            ssl->options.side);
16485
        if (ret != WOLFSSL_SUCCESS) return ret;
16486
    }
16487
#endif
16488
16489
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
16490
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
16491
0
        #ifndef NO_ECC_SECP
16492
0
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP256R1,
16493
0
            ssl->heap, ssl->options.side);
16494
0
        if (ret != WOLFSSL_SUCCESS) return ret;
16495
0
        #endif
16496
        #ifdef HAVE_ECC_KOBLITZ
16497
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP256K1,
16498
            ssl->heap, ssl->options.side);
16499
        if (ret != WOLFSSL_SUCCESS) return ret;
16500
        #endif
16501
        #ifdef HAVE_ECC_BRAINPOOL
16502
        if (IsAtLeastTLSv1_3(ssl->version)) {
16503
            /* TLS 1.3 BrainpoolP256 curve */
16504
            ret = TLSX_UseSupportedCurve(extensions,
16505
                WOLFSSL_ECC_BRAINPOOLP256R1TLS13, ssl->heap, ssl->options.side);
16506
            if (ret != WOLFSSL_SUCCESS) return ret;
16507
16508
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
16509
            if (ssl->options.downgrade &&
16510
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
16511
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
16512
                ret = TLSX_UseSupportedCurve(extensions,
16513
                    WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap, ssl->options.side);
16514
                if (ret != WOLFSSL_SUCCESS) return ret;
16515
            }
16516
        }
16517
        else {
16518
            /* TLS 1.2 only */
16519
            ret = TLSX_UseSupportedCurve(extensions,
16520
                WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap, ssl->options.side);
16521
            if (ret != WOLFSSL_SUCCESS) return ret;
16522
        }
16523
        #endif
16524
        #if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
16525
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SM2P256V1,
16526
            ssl->heap, ssl->options.side);
16527
        if (ret != WOLFSSL_SUCCESS) return ret;
16528
        #endif
16529
0
    #endif
16530
0
#endif /* HAVE_ECC */
16531
16532
0
#ifndef HAVE_FIPS
16533
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
16534
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_X25519,
16535
            ssl->heap, ssl->options.side);
16536
        if (ret != WOLFSSL_SUCCESS) return ret;
16537
    #endif
16538
0
#endif /* HAVE_FIPS */
16539
16540
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
16541
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
16542
0
        #ifndef NO_ECC_SECP
16543
0
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP224R1,
16544
0
            ssl->heap, ssl->options.side);
16545
0
        if (ret != WOLFSSL_SUCCESS) return ret;
16546
0
        #endif
16547
        #ifdef HAVE_ECC_KOBLITZ
16548
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP224K1,
16549
            ssl->heap, ssl->options.side);
16550
        if (ret != WOLFSSL_SUCCESS) return ret;
16551
        #endif
16552
0
    #endif
16553
16554
0
    #ifndef HAVE_FIPS
16555
        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
16556
            #ifndef NO_ECC_SECP
16557
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP192R1,
16558
                    ssl->heap, ssl->options.side);
16559
                if (ret != WOLFSSL_SUCCESS) return ret;
16560
            #endif
16561
            #ifdef HAVE_ECC_KOBLITZ
16562
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP192K1,
16563
                    ssl->heap, ssl->options.side);
16564
                if (ret != WOLFSSL_SUCCESS) return ret;
16565
            #endif
16566
        #endif
16567
        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
16568
            #ifndef NO_ECC_SECP
16569
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP160R1,
16570
                    ssl->heap, ssl->options.side);
16571
                if (ret != WOLFSSL_SUCCESS) return ret;
16572
            #endif
16573
            #ifdef HAVE_ECC_SECPR2
16574
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP160R2,
16575
                    ssl->heap, ssl->options.side);
16576
                if (ret != WOLFSSL_SUCCESS) return ret;
16577
            #endif
16578
            #ifdef HAVE_ECC_KOBLITZ
16579
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP160K1,
16580
                    ssl->heap, ssl->options.side);
16581
                if (ret != WOLFSSL_SUCCESS) return ret;
16582
            #endif
16583
        #endif
16584
0
    #endif /* HAVE_FIPS */
16585
0
#endif /* HAVE_ECC */
16586
16587
0
#ifndef NO_DH
16588
        /* Add FFDHE supported groups. */
16589
    #ifdef HAVE_FFDHE_8192
16590
        if (8192/8 >= ssl->options.minDhKeySz &&
16591
                                        8192/8 <= ssl->options.maxDhKeySz) {
16592
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_8192,
16593
                ssl->heap, ssl->options.side);
16594
            if (ret != WOLFSSL_SUCCESS)
16595
                return ret;
16596
        }
16597
    #endif
16598
    #ifdef HAVE_FFDHE_6144
16599
        if (6144/8 >= ssl->options.minDhKeySz &&
16600
                                        6144/8 <= ssl->options.maxDhKeySz) {
16601
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_6144,
16602
                ssl->heap, ssl->options.side);
16603
            if (ret != WOLFSSL_SUCCESS)
16604
                return ret;
16605
        }
16606
    #endif
16607
    #ifdef HAVE_FFDHE_4096
16608
        if (4096/8 >= ssl->options.minDhKeySz &&
16609
                                        4096/8 <= ssl->options.maxDhKeySz) {
16610
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_4096,
16611
                ssl->heap, ssl->options.side);
16612
            if (ret != WOLFSSL_SUCCESS)
16613
                return ret;
16614
        }
16615
    #endif
16616
    #ifdef HAVE_FFDHE_3072
16617
        if (3072/8 >= ssl->options.minDhKeySz &&
16618
                                        3072/8 <= ssl->options.maxDhKeySz) {
16619
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_3072,
16620
                ssl->heap, ssl->options.side);
16621
            if (ret != WOLFSSL_SUCCESS)
16622
                return ret;
16623
        }
16624
    #endif
16625
0
    #ifdef HAVE_FFDHE_2048
16626
0
        if (2048/8 >= ssl->options.minDhKeySz &&
16627
0
                                        2048/8 <= ssl->options.maxDhKeySz) {
16628
0
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_2048,
16629
0
                ssl->heap, ssl->options.side);
16630
0
            if (ret != WOLFSSL_SUCCESS)
16631
0
                return ret;
16632
0
        }
16633
0
    #endif
16634
0
#endif
16635
16636
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16637
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
16638
    if (IsAtLeastTLSv1_3(ssl->version) &&
16639
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16640
#if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
16641
    (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
16642
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP521R1MLKEM1024,
16643
                                     ssl->heap, ssl->options.side);
16644
        if (ret != WOLFSSL_SUCCESS) return ret;
16645
#endif
16646
#if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
16647
    (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
16648
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM768,
16649
                                     ssl->heap, ssl->options.side);
16650
        if (ret != WOLFSSL_SUCCESS) return ret;
16651
#endif
16652
#if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE448) && \
16653
    ECC_MIN_KEY_SZ <= 448
16654
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448MLKEM768,
16655
                                     ssl->heap, ssl->options.side);
16656
        if (ret != WOLFSSL_SUCCESS) return ret;
16657
#endif
16658
#if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_ECC) && \
16659
    (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
16660
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM512,
16661
                                     ssl->heap, ssl->options.side);
16662
        if (ret != WOLFSSL_SUCCESS) return ret;
16663
#endif
16664
#if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_CURVE25519) && \
16665
    ECC_MIN_KEY_SZ <= 256
16666
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM512,
16667
                                     ssl->heap, ssl->options.side);
16668
        if (ret != WOLFSSL_SUCCESS) return ret;
16669
#endif
16670
    }
16671
#endif
16672
16673
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16674
    defined(WOLFSSL_MLKEM_KYBER)
16675
    if (IsAtLeastTLSv1_3(ssl->version) &&
16676
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16677
#ifdef WOLFSSL_KYBER1024
16678
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
16679
                                     ssl->heap, ssl->options.side);
16680
        if (ret != WOLFSSL_SUCCESS) return ret;
16681
#if defined(HAVE_ECC) && (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
16682
    ECC_MIN_KEY_SZ <= 521
16683
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
16684
                                     ssl->heap, ssl->options.side);
16685
        if (ret != WOLFSSL_SUCCESS) return ret;
16686
#endif
16687
#endif
16688
#ifdef WOLFSSL_KYBER768
16689
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
16690
                                     ssl->heap, ssl->options.side);
16691
        if (ret != WOLFSSL_SUCCESS) return ret;
16692
#if defined(HAVE_ECC) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
16693
        ECC_MIN_KEY_SZ <= 384
16694
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
16695
                                     ssl->heap, ssl->options.side);
16696
        if (ret != WOLFSSL_SUCCESS) return ret;
16697
#endif
16698
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
16699
    ECC_MIN_KEY_SZ <= 256
16700
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
16701
                                     ssl->heap, ssl->options.side);
16702
        if (ret != WOLFSSL_SUCCESS) return ret;
16703
#endif
16704
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
16705
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
16706
                                     ssl->heap, ssl->options.side);
16707
        if (ret != WOLFSSL_SUCCESS) return ret;
16708
#endif
16709
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
16710
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
16711
                                     ssl->heap, ssl->options.side);
16712
        if (ret != WOLFSSL_SUCCESS) return ret;
16713
#endif
16714
#endif
16715
#ifdef WOLFSSL_KYBER512
16716
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1,
16717
                                     ssl->heap, ssl->options.side);
16718
        if (ret != WOLFSSL_SUCCESS) return ret;
16719
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
16720
    ECC_MIN_KEY_SZ <= 256
16721
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
16722
                                     ssl->heap, ssl->options.side);
16723
        if (ret != WOLFSSL_SUCCESS) return ret;
16724
#endif
16725
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
16726
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
16727
                                     ssl->heap, ssl->options.side);
16728
        if (ret != WOLFSSL_SUCCESS) return ret;
16729
#endif
16730
#endif
16731
    }
16732
#endif
16733
16734
0
    (void)ssl;
16735
0
    (void)extensions;
16736
16737
0
    return ret;
16738
0
}
16739
16740
#endif /* HAVE_SUPPORTED_CURVES */
16741
16742
int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
16743
0
{
16744
0
    int ret = 0;
16745
0
    byte* public_key      = NULL;
16746
0
    word16 public_key_len = 0;
16747
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
16748
    int usingPSK = 0;
16749
#endif
16750
0
#if defined(HAVE_SUPPORTED_CURVES) && defined(WOLFSSL_TLS13)
16751
0
    TLSX* extension = NULL;
16752
0
    word16 namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
16753
0
#endif
16754
16755
    /* server will add extension depending on what is parsed from client */
16756
0
    if (!isServer) {
16757
#if defined(HAVE_RPK)
16758
        ret = TLSX_ClientCertificateType_Use(ssl, isServer);
16759
        if (ret != 0)
16760
            return ret;
16761
16762
        ret = TLSX_ServerCertificateType_Use(ssl, isServer);
16763
        if (ret != 0)
16764
            return ret;
16765
#endif /* HAVE_RPK */
16766
16767
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) && \
16768
0
    !defined(WOLFSSL_NO_TLS12)
16769
0
        if (!ssl->options.disallowEncThenMac) {
16770
0
            ret = TLSX_EncryptThenMac_Use(ssl);
16771
0
            if (ret != 0)
16772
0
                return ret;
16773
0
        }
16774
0
#endif
16775
16776
0
#if defined(HAVE_SUPPORTED_CURVES)
16777
0
        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
16778
0
            if (TLSX_Find(ssl->ctx->extensions,
16779
0
                                               TLSX_SUPPORTED_GROUPS) == NULL) {
16780
0
                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
16781
0
                if (ret != WOLFSSL_SUCCESS)
16782
0
                    return ret;
16783
0
            }
16784
0
        }
16785
0
    #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
16786
0
        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
16787
0
               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
16788
0
               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
16789
0
            ret = TLSX_UsePointFormat(&ssl->extensions,
16790
0
                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
16791
0
            if (ret != WOLFSSL_SUCCESS)
16792
0
                return ret;
16793
0
        }
16794
0
    #endif
16795
0
#endif /* HAVE_SUPPORTED_CURVES */
16796
16797
#ifdef WOLFSSL_SRTP
16798
        if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
16799
            WOLFSSL_MSG("Adding DTLS SRTP extension");
16800
            if ((ret = TLSX_UseSRTP(&ssl->extensions, ssl->dtlsSrtpProfiles,
16801
                                                                ssl->heap)) != 0) {
16802
                return ret;
16803
            }
16804
        }
16805
#endif
16806
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
16807
        if ((IsAtLeastTLSv1_3(ssl->version)) && (ssl->sigSpec != NULL)) {
16808
            WOLFSSL_MSG("Adding CKS extension");
16809
            if ((ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap)) != 0) {
16810
                return ret;
16811
            }
16812
        }
16813
#endif
16814
0
    } /* is not server */
16815
16816
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16817
0
    WOLFSSL_MSG("Adding signature algorithms extension");
16818
0
    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
16819
0
                                                                         != 0) {
16820
0
            return ret;
16821
0
    }
16822
#else
16823
    ret = 0;
16824
#endif
16825
0
#ifdef WOLFSSL_TLS13
16826
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16827
0
        if (IsAtLeastTLSv1_3(ssl->version) && HasAnyCANames(ssl)) {
16828
0
            WOLFSSL_MSG("Adding certificate authorities extension");
16829
0
            if ((ret = TLSX_Push(&ssl->extensions,
16830
0
                    TLSX_CERTIFICATE_AUTHORITIES, ssl, ssl->heap)) != 0) {
16831
0
                    return ret;
16832
0
            }
16833
0
        }
16834
0
    #endif
16835
0
        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
16836
            /* Add mandatory TLS v1.3 extension: supported version */
16837
0
            WOLFSSL_MSG("Adding supported versions extension");
16838
0
            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
16839
0
                                                             ssl->heap)) != 0) {
16840
0
                return ret;
16841
0
            }
16842
16843
0
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16844
0
            if (ssl->certHashSigAlgoSz > 0) {
16845
0
                WOLFSSL_MSG("Adding signature algorithms cert extension");
16846
0
                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
16847
0
                                                        ssl, ssl->heap)) != 0) {
16848
0
                    return ret;
16849
0
                }
16850
0
            }
16851
0
        #endif
16852
16853
0
        #if defined(HAVE_SUPPORTED_CURVES)
16854
0
            extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
16855
0
            if (extension == NULL) {
16856
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16857
                if (ssl->options.resuming && ssl->session->namedGroup != 0)
16858
                    namedGroup = ssl->session->namedGroup;
16859
                else
16860
            #endif
16861
0
                if (ssl->numGroups > 0) {
16862
0
                    int set = 0;
16863
0
                    int i, j;
16864
16865
                    /* Find the first element of ssl->group[] that is also
16866
                     * present in preferredGroup[]. The user's ranking wins;
16867
                     * if nothing intersects, send no key share and let the
16868
                     * server drive group selection via HRR. */
16869
0
                    namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
16870
0
                    for (i = 0; i < ssl->numGroups && !set; i++) {
16871
0
                        for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
16872
0
                            if (preferredGroup[j] == ssl->group[i]) {
16873
0
                                namedGroup = ssl->group[i];
16874
0
                                set = 1;
16875
0
                                break;
16876
0
                            }
16877
0
                        }
16878
0
                    }
16879
0
                }
16880
0
                else {
16881
                    /* Choose the most preferred group. */
16882
0
                    namedGroup = WOLFSSL_KEY_SHARE_DEFAULT_GROUP;
16883
0
                }
16884
0
            }
16885
0
            else {
16886
0
                KeyShareEntry* kse = (KeyShareEntry*)extension->data;
16887
0
                if (kse)
16888
0
                    namedGroup = kse->group;
16889
0
            }
16890
0
            if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
16891
0
                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
16892
0
                        &ssl->extensions);
16893
0
            }
16894
0
            else {
16895
                /* No suitable key share group found, send no key share to
16896
                 * trigger a HRR with the server's preferred group. */
16897
0
                WOLFSSL_MSG("Sending no key share to trigger HRR");
16898
0
                ret = TLSX_KeyShare_Empty(ssl);
16899
0
            }
16900
0
            if (ret != 0)
16901
0
                return ret;
16902
0
        #endif /* HAVE_SUPPORTED_CURVES */
16903
16904
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16905
            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
16906
        #endif
16907
        #if defined(HAVE_SESSION_TICKET)
16908
            if (ssl->options.resuming && ssl->session->ticketLen > 0
16909
        #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
16910
                && !ssl->options.certWithExternPsk
16911
        #endif
16912
            ) {
16913
                WOLFSSL_SESSION* sess = ssl->session;
16914
            #ifdef WOLFSSL_32BIT_MILLI_TIME
16915
                word32 now, milli;
16916
            #else
16917
                word64 now, milli;
16918
            #endif
16919
16920
                /* Determine the MAC algorithm for the cipher suite used. */
16921
                ssl->options.cipherSuite0 = sess->cipherSuite0;
16922
                ssl->options.cipherSuite  = sess->cipherSuite;
16923
                ret = SetCipherSpecs(ssl);
16924
                if (ret != 0)
16925
                    return ret;
16926
                now = (word64)TimeNowInMilliseconds();
16927
                if (now == 0)
16928
                    return GETTIME_ERROR;
16929
            #ifdef WOLFSSL_32BIT_MILLI_TIME
16930
                if (now < sess->ticketSeen)
16931
                    milli = (0xFFFFFFFFU - sess->ticketSeen) + 1 + now;
16932
                else
16933
                    milli = now - sess->ticketSeen;
16934
                milli += sess->ticketAdd;
16935
16936
                /* Pre-shared key is mandatory extension for resumption. */
16937
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
16938
                    sess->ticketLen, milli, ssl->specs.mac_algorithm,
16939
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
16940
                    NULL, ssl->heap);
16941
            #else
16942
                milli = now - sess->ticketSeen + sess->ticketAdd;
16943
16944
                /* Pre-shared key is mandatory extension for resumption. */
16945
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
16946
                    sess->ticketLen, (word32)milli, ssl->specs.mac_algorithm,
16947
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
16948
                    NULL, ssl->heap);
16949
            #endif
16950
                if (ret != 0)
16951
                    return ret;
16952
16953
                usingPSK = 1;
16954
            }
16955
        #endif
16956
    #ifndef NO_PSK
16957
        #ifndef WOLFSSL_PSK_ONE_ID
16958
            if (ssl->options.client_psk_cs_cb != NULL) {
16959
                int i;
16960
                const Suites* suites = WOLFSSL_SUITES(ssl);
16961
                for (i = 0; i < suites->suiteSz; i += 2) {
16962
                    byte cipherSuite0 = suites->suites[i + 0];
16963
                    byte cipherSuite = suites->suites[i + 1];
16964
                    unsigned int keySz;
16965
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16966
                    int cnt = 0;
16967
                #endif
16968
16969
                #ifdef HAVE_NULL_CIPHER
16970
                    if (cipherSuite0 == ECC_BYTE ||
16971
                        cipherSuite0 == ECDHE_PSK_BYTE) {
16972
                        if (cipherSuite != TLS_SHA256_SHA256 &&
16973
                                             cipherSuite != TLS_SHA384_SHA384) {
16974
                            continue;
16975
                        }
16976
                    }
16977
                    else
16978
                #endif
16979
                #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
16980
                    defined(WOLFSSL_SM3)
16981
                    if (cipherSuite0 == CIPHER_BYTE) {
16982
                        if ((cipherSuite != TLS_SM4_GCM_SM3) &&
16983
                            (cipherSuite != TLS_SM4_CCM_SM3)) {
16984
                            continue;
16985
                        }
16986
                    }
16987
                    else
16988
                #endif
16989
                    if (cipherSuite0 != TLS13_BYTE)
16990
                        continue;
16991
16992
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16993
                    do {
16994
                        ssl->arrays->client_identity[0] = cnt;
16995
                #endif
16996
16997
                        ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
16998
                        keySz = ssl->options.client_psk_cs_cb(
16999
                            ssl, ssl->arrays->server_hint,
17000
                            ssl->arrays->client_identity, MAX_PSK_ID_LEN,
17001
                            ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
17002
                            GetCipherNameInternal(cipherSuite0, cipherSuite));
17003
                        if (keySz > 0) {
17004
                            ssl->arrays->psk_keySz = keySz;
17005
                            ret = TLSX_PreSharedKey_Use(&ssl->extensions,
17006
                                (byte*)ssl->arrays->client_identity,
17007
                                (word16)XSTRLEN(ssl->arrays->client_identity),
17008
                                0, SuiteMac(WOLFSSL_SUITES(ssl)->suites + i),
17009
                                cipherSuite0, cipherSuite, 0, NULL, ssl->heap);
17010
                            if (ret != 0)
17011
                                return ret;
17012
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
17013
                            cnt++;
17014
                #endif
17015
                        }
17016
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
17017
                    }
17018
                    while (keySz > 0);
17019
                #endif
17020
                }
17021
17022
                usingPSK = 1;
17023
            }
17024
            else
17025
        #endif
17026
            if (ssl->options.client_psk_cb != NULL ||
17027
                ssl->options.client_psk_tls13_cb != NULL) {
17028
                /* Default cipher suite. */
17029
                byte cipherSuite0 = TLS13_BYTE;
17030
                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
17031
                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
17032
                const char* cipherName = NULL;
17033
17034
                if (ssl->options.client_psk_tls13_cb != NULL) {
17035
                    ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
17036
                        ssl, ssl->arrays->server_hint,
17037
                        ssl->arrays->client_identity, MAX_PSK_ID_LEN,
17038
                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
17039
                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
17040
                            &cipherSuite, NULL, NULL, &cipherSuiteFlags) != 0) {
17041
                        return PSK_KEY_ERROR;
17042
                    }
17043
                }
17044
                else {
17045
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
17046
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
17047
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
17048
                }
17049
                if (
17050
                #ifdef OPENSSL_EXTRA
17051
                    /* OpenSSL treats a PSK key length of 0
17052
                     * to indicate no PSK available.
17053
                     */
17054
                    ssl->arrays->psk_keySz == 0 ||
17055
                #endif
17056
                         (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
17057
                     (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
17058
                #ifndef OPENSSL_EXTRA
17059
                    ret = PSK_KEY_ERROR;
17060
                #endif
17061
                }
17062
                else {
17063
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
17064
17065
                    ssl->options.cipherSuite0 = cipherSuite0;
17066
                    ssl->options.cipherSuite  = cipherSuite;
17067
                    (void)cipherSuiteFlags;
17068
                    ret = SetCipherSpecs(ssl);
17069
                    if (ret == 0) {
17070
                        ret = TLSX_PreSharedKey_Use(
17071
                            &ssl->extensions,
17072
                                     (byte*)ssl->arrays->client_identity,
17073
                            (word16)XSTRLEN(ssl->arrays->client_identity),
17074
                            0, ssl->specs.mac_algorithm,
17075
                            cipherSuite0, cipherSuite, 0,
17076
                            NULL, ssl->heap);
17077
                    }
17078
                    if (ret == 0)
17079
                        usingPSK = 1;
17080
                }
17081
                if (ret != 0)
17082
                    return ret;
17083
            }
17084
    #endif /* !NO_PSK */
17085
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17086
17087
            /* Some servers do not generate session tickets unless
17088
             * the extension is seen in a non-resume client hello.
17089
             * We used to send it only if we were otherwise using PSK.
17090
             * Now always send it. Define NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
17091
             * to revert to the old behaviour. */
17092
            #ifdef NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
17093
            if (usingPSK)
17094
            #endif
17095
            {
17096
                byte modes = 0;
17097
17098
                (void)usingPSK;
17099
                /* Pre-shared key modes: mandatory extension for resumption. */
17100
            #ifdef HAVE_SUPPORTED_CURVES
17101
                if (!ssl->options.onlyPskDheKe)
17102
            #endif
17103
                {
17104
                    modes = 1 << PSK_KE;
17105
                }
17106
            #if !defined(NO_DH) || defined(HAVE_ECC) || \
17107
                          defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) || \
17108
                          (defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
17109
                           !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE))
17110
                if (!ssl->options.noPskDheKe) {
17111
                    modes |= 1 << PSK_DHE_KE;
17112
                }
17113
            #endif
17114
            #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
17115
                if (ssl->options.certWithExternPsk) {
17116
                    /* RFC 9973 requires psk_dhe_ke with cert_with_extern_psk. */
17117
                    modes |= 1 << PSK_DHE_KE;
17118
                }
17119
            #endif
17120
                ret = TLSX_PskKeyModes_Use(ssl, modes);
17121
                if (ret != 0)
17122
                    return ret;
17123
            }
17124
17125
        #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
17126
            if (usingPSK && ssl->options.certWithExternPsk) {
17127
                ret = TLSX_CertWithExternPsk_Use(ssl);
17128
                if (ret != 0)
17129
                    return ret;
17130
                /* Require server confirmation before using cert-with-PSK path. */
17131
                ssl->options.certWithExternPsk = 0;
17132
            }
17133
        #endif
17134
        #endif
17135
        #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
17136
            if (!isServer && ssl->options.postHandshakeAuth) {
17137
                ret = TLSX_PostHandAuth_Use(ssl);
17138
                if (ret != 0)
17139
                    return ret;
17140
            }
17141
        #endif
17142
#if defined(HAVE_ECH)
17143
            /* GREASE ECH */
17144
            if (!ssl->options.disableECH) {
17145
                if (ssl->echConfigs == NULL) {
17146
                    ret = GREASE_ECH_USE(&(ssl->extensions), ssl->heap,
17147
                            ssl->rng);
17148
                }
17149
                else if (ssl->echConfigs != NULL) {
17150
                    ret = ECH_USE(ssl->echConfigs, &(ssl->extensions),
17151
                            ssl->heap, ssl->rng);
17152
                }
17153
            }
17154
#endif
17155
0
        }
17156
#if defined(HAVE_ECH)
17157
        else if (IsAtLeastTLSv1_3(ssl->version)) {
17158
            if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
17159
                ret = SERVER_ECH_USE(&(ssl->extensions), ssl->heap,
17160
                    ssl->ctx->echConfigs);
17161
17162
                if (ret == 0)
17163
                    TLSX_SetResponse(ssl, TLSX_ECH);
17164
            }
17165
        }
17166
#endif
17167
17168
0
#endif
17169
17170
0
    (void)isServer;
17171
0
    (void)public_key;
17172
0
    (void)public_key_len;
17173
0
    (void)ssl;
17174
17175
0
    return ret;
17176
0
}
17177
17178
17179
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
17180
17181
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
17182
/* Returns 1 if the extensions should be hidden for this write */
17183
static int TLSX_EchShouldHideInner(WOLFSSL_ECH* ech)
17184
{
17185
    return ech != NULL && ech->type == ECH_TYPE_OUTER &&
17186
        ech->state != ECH_WRITE_GREASE;
17187
}
17188
17189
/* Swap matching extension types between *sslExts and *echExts.
17190
 *   Non-matched extensions in *echExts are appended to the tail of *sslExts
17191
 *
17192
 * Extensions are stored in reverse wire order, so non-matched extensions are
17193
 * appended to the tail rather than the head; this avoids displacing the leading
17194
 * extension (e.g. pre_shared_key, which must stay last on the wire).
17195
 *
17196
 * *appended is in/out:
17197
 *  in  -> number of trailing extensions to move from *sslExts to *echExts
17198
 *  out -> the number of extensions appended to the tail of *sslExts
17199
 *
17200
 * Returns 0 on success, error otherwise. */
17201
WOLFSSL_TEST_VIS int TLSX_EchSwapExtensions(TLSX** sslExts, TLSX** echExts,
17202
    word16* appended)
17203
{
17204
    TLSX* chunk = NULL;
17205
    TLSX* node;
17206
    TLSX* outer;
17207
    TLSX* inner;
17208
    TLSX** outerLink;
17209
    TLSX** innerLink;
17210
    TLSX** sslTail;
17211
    word16 len = 0;
17212
17213
    if (*appended > 0) {
17214
        for (node = *sslExts; node != NULL; node = node->next)
17215
            len++;
17216
        if (*appended >= len)
17217
            return BAD_FUNC_ARG;
17218
        sslTail = sslExts;
17219
        while (len > *appended) {
17220
            sslTail = &(*sslTail)->next;
17221
            len--;
17222
        }
17223
        chunk = *sslTail;
17224
        *sslTail = NULL;
17225
    }
17226
17227
    *appended = 0;
17228
17229
    outerLink = echExts;
17230
    while (*outerLink != NULL) {
17231
        innerLink = sslExts;
17232
        outer = *outerLink;
17233
17234
        while (*innerLink != NULL && (*innerLink)->type != outer->type)
17235
            innerLink = &(*innerLink)->next;
17236
17237
        if (*innerLink != NULL) {
17238
            inner = *innerLink;
17239
17240
            *innerLink  = outer;
17241
            *outerLink  = inner;
17242
            node        = outer->next;
17243
            outer->next = inner->next;
17244
            inner->next = node;
17245
17246
            outerLink = &inner->next;
17247
        }
17248
        else {
17249
            *outerLink  = outer->next;
17250
            *innerLink  = outer;
17251
            outer->next = NULL;
17252
            *appended   += 1;
17253
        }
17254
    }
17255
17256
    /* outerLink is at the tail of *echExts; append the chunk */
17257
    *outerLink = chunk;
17258
17259
    return 0;
17260
}
17261
17262
/* sets installed if extensions were concealed, clears it otherwise.
17263
 * updates appended with the number of extensions appended.
17264
 * returns 0 on success, error otherwise */
17265
static int TLSX_EchConcealExtensions(WOLFSSL* ssl, WOLFSSL_ECH* ech,
17266
    word16* appended, int* installed)
17267
{
17268
    int ret = 0;
17269
17270
    *installed = 0;
17271
    *appended = 0;
17272
    if (TLSX_EchShouldHideInner(ech)) {
17273
        ret = TLSX_EchSwapExtensions(&ssl->extensions, &ech->extensions,
17274
                appended);
17275
        if (ret == 0)
17276
            *installed = 1;
17277
    }
17278
17279
    return ret;
17280
}
17281
17282
/* reverses TLSX_EchConcealExtensions
17283
 * returns 0 on success, error otherwise */
17284
static int TLSX_EchExposeExtensions(WOLFSSL* ssl, WOLFSSL_ECH* ech,
17285
    word16 appended, int installed)
17286
{
17287
    int ret = 0;
17288
17289
    if (installed) {
17290
        /* this is expected to always succeed, but in the case that it does not
17291
         * the handshake should be aborted and the ssl should not be reused. */
17292
        ret = TLSX_EchSwapExtensions(&ssl->extensions, &ech->extensions,
17293
            &appended);
17294
        if (ret == 0 && appended != 0) {
17295
            WOLFSSL_MSG("Bad restore with TLSX_EchSwapExtensions");
17296
            ret = BAD_STATE_E;
17297
        }
17298
    }
17299
17300
    return ret;
17301
}
17302
17303
/* If ECH is accepted, delete ech->extensions
17304
 * If rejected, replace matching ssl->extensions with ech->extensions,
17305
 *   appending to the tail if necessary */
17306
int TLSX_EchReplaceExtensions(WOLFSSL* ssl, byte accepted)
17307
{
17308
    int ret = 0;
17309
    TLSX* echX;
17310
    WOLFSSL_ECH* ech;
17311
    word16 appended = 0;
17312
17313
    echX = TLSX_Find(ssl->extensions, TLSX_ECH);
17314
    if (echX == NULL || echX->data == NULL)
17315
        return 0;
17316
    ech = (WOLFSSL_ECH*)echX->data;
17317
17318
    if (!accepted)
17319
        ret = TLSX_EchSwapExtensions(&ssl->extensions, &ech->extensions,
17320
            &appended);
17321
17322
    if (ret == 0) {
17323
        TLSX_FreeAll(ech->extensions, ssl->heap);
17324
        ech->extensions = NULL;
17325
    }
17326
17327
    return ret;
17328
}
17329
17330
/* Returns 1 if the extension may be encoded into ech_outer_extensions,
17331
 * 0 otherwise */
17332
static int TLSX_ECH_IsEncodable(word16 type)
17333
{
17334
    /* supported_versions being here prevents the inner hello from advertising
17335
     * a version less than TLS1.3 */
17336
    switch (type) {
17337
        case TLSX_SERVER_NAME:
17338
        case TLSX_APPLICATION_LAYER_PROTOCOL:
17339
        case TLSX_SUPPORTED_VERSIONS:
17340
        case TLSX_ECH:
17341
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17342
        case TLSX_PRE_SHARED_KEY:
17343
#endif
17344
#ifdef WOLFSSL_EARLY_DATA
17345
        case TLSX_EARLY_DATA:
17346
#endif
17347
            return 0;
17348
        default:
17349
            return 1;
17350
    }
17351
}
17352
17353
/* find extensions that can be encoded into ech_outer_extensions.
17354
 * If output is non-NULL, then write the encoded form.
17355
 *
17356
 * Layout of OuterExtensions (RFC 9849, S5.1):
17357
 *   2-byte extension_type + 2-byte extension_data length +
17358
 *   1-byte list length    + 2*count bytes of extension types
17359
 */
17360
static int TLSX_ECH_BuildOuterExtensions(WOLFSSL* ssl, const byte* semaphore,
17361
    byte msgType, byte* output, word16* pOffset, word16* outCount,
17362
    byte* encodeMask)
17363
{
17364
    TLSX* list;
17365
    TLSX* extension;
17366
    byte* typesStart = NULL;
17367
    int listIdx;
17368
    word16 count = 0;
17369
    byte isRequest = (msgType == client_hello ||
17370
                      msgType == certificate_request);
17371
    byte seen[SEMAPHORE_SIZE];
17372
17373
    /* backup semaphore so it can be aliased by encodeMask */
17374
    XMEMCPY(seen, semaphore, SEMAPHORE_SIZE);
17375
17376
    if (output != NULL && pOffset != NULL) {
17377
        typesStart = output + *pOffset
17378
                     + HELLO_EXT_TYPE_SZ + OPAQUE16_LEN + OPAQUE8_LEN;
17379
    }
17380
17381
    for (listIdx = 0; listIdx < 2; listIdx++) {
17382
        list = (listIdx == 0) ? ssl->extensions :
17383
            (ssl->ctx != NULL ? ssl->ctx->extensions : NULL);
17384
        for (extension = list; extension != NULL; extension = extension->next) {
17385
            word16 type = (word16)extension->type;
17386
            word16 semIdx = TLSX_ToSemaphore(type);
17387
17388
            /* OuterExtensions is <2..254>, so reference at most 127 types */
17389
            if (count >= 127) {
17390
                WOLFSSL_MSG("ECH: cannot encode more than 127 extensions");
17391
                break;
17392
            }
17393
17394
            if (!isRequest && !extension->resp)
17395
                continue;
17396
            if (!IS_OFF(seen, semIdx))
17397
                continue;
17398
            TURN_ON(seen, semIdx);
17399
            if (!TLSX_ECH_IsEncodable(type))
17400
                continue;
17401
17402
            if (typesStart != NULL)
17403
                c16toa(type, typesStart + count * OPAQUE16_LEN);
17404
            count++;
17405
            TURN_ON(encodeMask, semIdx);
17406
        }
17407
    }
17408
17409
    if (count > 0 && pOffset != NULL) {
17410
        word16 listLen = (word16)(OPAQUE16_LEN * count);
17411
        word16 blockSz = (word16)(HELLO_EXT_TYPE_SZ + OPAQUE16_LEN
17412
                                + OPAQUE8_LEN + listLen);
17413
        if ((word32)*pOffset + blockSz > WOLFSSL_MAX_16BIT) {
17414
            WOLFSSL_MSG("ECH OuterExtensions overflows extensions length");
17415
            return BUFFER_E;
17416
        }
17417
        if (output != NULL) {
17418
            byte* hdr = output + *pOffset;
17419
            c16toa(TLSXT_ECH_OUTER_EXTENSIONS, hdr);
17420
            c16toa((word16)(OPAQUE8_LEN + listLen), hdr + OPAQUE16_LEN);
17421
            hdr[OPAQUE16_LEN + OPAQUE16_LEN] = (byte)listLen;
17422
        }
17423
17424
        /* accumulate offset even if nothing is written */
17425
        *pOffset += blockSz;
17426
    }
17427
17428
    *outCount = count;
17429
    return 0;
17430
}
17431
17432
/* because the size of ech depends on the size of other extensions we need to
17433
 * get the size with ech special and process ech last, return status */
17434
static int TLSX_GetSizeWithEch(WOLFSSL* ssl, byte* semaphore, byte msgType,
17435
    word16* pLength)
17436
{
17437
    int ret = 0;
17438
    int retC;
17439
    int installed = 0;
17440
    TLSX* echX = NULL;
17441
    WOLFSSL_ECH* ech = NULL;
17442
    word16 count = 0;
17443
    word16 appended = 0;
17444
17445
    if (ssl->extensions)
17446
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
17447
    if (echX != NULL)
17448
        ech = (WOLFSSL_ECH*)echX->data;
17449
17450
    ret = retC = TLSX_EchConcealExtensions(ssl, ech, &appended, &installed);
17451
17452
    /* if encoding, then count encoded form of inner ClientHello.
17453
     * `semaphore` is in/out so encodable extensions will later be ignored */
17454
    if (ret == 0 &&
17455
            ech != NULL && ech->type == ECH_TYPE_INNER && ech->writeEncoded) {
17456
        ret = TLSX_ECH_BuildOuterExtensions(ssl, semaphore, msgType,
17457
            NULL, pLength, &count, semaphore);
17458
    }
17459
    if (ret == 0 && ssl->extensions)
17460
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, pLength);
17461
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions)
17462
        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, pLength);
17463
17464
    /* always try to restore extensions to a good state */
17465
    if (retC == 0)
17466
        retC = TLSX_EchExposeExtensions(ssl, ech, appended, installed);
17467
17468
    if (ret == 0)
17469
        ret = retC;
17470
    return ret;
17471
}
17472
#endif
17473
17474
#if defined(HAVE_TLS_EXTENSIONS) && defined(OPENSSL_EXTRA)
17475
/* OpenSSL-compatible application-defined ("custom") TLS extensions.
17476
 *
17477
 * Unlike the standard extensions above, custom extensions carry arbitrary
17478
 * IANA types chosen by the application, so they cannot live in the TLSX list
17479
 * (which keys every extension on a fixed semaphore index). They are kept in a
17480
 * separate list on the WOLFSSL_CTX and processed alongside the unknown
17481
 * extension handling. Only the client side, for TLS 1.2 and below, is wired up
17482
 * here, matching the legacy SSL_CTX_add_client_custom_ext() contract. */
17483
17484
/* Returns 1 if ext_type is an extension wolfSSL handles internally, which the
17485
 * application is therefore not allowed to register a custom handler for. */
17486
static int TLSX_CustomExt_IsKnown(word16 ext_type)
17487
{
17488
    switch (ext_type) {
17489
        case TLSXT_SERVER_NAME:
17490
        case TLSXT_MAX_FRAGMENT_LENGTH:
17491
        case TLSXT_TRUSTED_CA_KEYS:
17492
        case TLSXT_TRUNCATED_HMAC:
17493
        case TLSXT_STATUS_REQUEST:
17494
        case TLSXT_SUPPORTED_GROUPS:
17495
        case TLSXT_EC_POINT_FORMATS:
17496
        case TLSXT_SIGNATURE_ALGORITHMS:
17497
        case TLSXT_USE_SRTP:
17498
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
17499
        case TLSXT_STATUS_REQUEST_V2:
17500
        case TLSXT_CLIENT_CERTIFICATE:
17501
        case TLSXT_SERVER_CERTIFICATE:
17502
        case TLSXT_ENCRYPT_THEN_MAC:
17503
        case TLSXT_EXTENDED_MASTER_SECRET:
17504
        case TLSXT_CERT_WITH_EXTERN_PSK:
17505
        case TLSXT_SESSION_TICKET:
17506
        case TLSXT_PRE_SHARED_KEY:
17507
        case TLSXT_EARLY_DATA:
17508
        case TLSXT_SUPPORTED_VERSIONS:
17509
        case TLSXT_COOKIE:
17510
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
17511
        case TLSXT_CERTIFICATE_AUTHORITIES:
17512
        case TLSXT_POST_HANDSHAKE_AUTH:
17513
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
17514
        case TLSXT_KEY_SHARE:
17515
        case TLSXT_CONNECTION_ID:
17516
        case TLSXT_KEY_QUIC_TP_PARAMS:
17517
        case TLSXT_ECH:
17518
        case TLSXT_ECH_OUTER_EXTENSIONS:
17519
        case TLSXT_CKS:
17520
        case TLSXT_RENEGOTIATION_INFO:
17521
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
17522
            return 1;
17523
        default:
17524
            return 0;
17525
    }
17526
}
17527
17528
/**
17529
 * Registers an application-defined client extension on the context. Mirrors
17530
 * OpenSSL's SSL_CTX_add_client_custom_ext(): returns WOLFSSL_SUCCESS (1) on
17531
 * success, WOLFSSL_FAILURE (0) on failure.
17532
 *
17533
 * In this legacy API, wolfSSL supports custom extensions on the client side
17534
 * for TLS 1.2 and below.
17535
 *
17536
 * @param ctx        Context on which to register the custom extension.
17537
 * @param ext_type   IANA extension type to register. Must fit in 16 bits,
17538
 *                   must not name an extension wolfSSL already handles
17539
 *                   internally, and must not already be registered on @p ctx.
17540
 * @param add_cb     Callback used to build the outgoing extension. If NULL, a
17541
 *                   zero-length extension is sent.
17542
 * @param free_cb    Optional callback used to release data produced by
17543
 *                   @p add_cb. Must be NULL when @p add_cb is NULL.
17544
 * @param add_arg    Opaque application pointer for @p add_cb and @p free_cb.
17545
 * @param parse_cb   Optional callback used to parse the echoed extension.
17546
 * @param parse_arg  Opaque application pointer for @p parse_cb.
17547
 * @return WOLFSSL_SUCCESS on successful registration, otherwise
17548
 *         WOLFSSL_FAILURE.
17549
 */
17550
int wolfSSL_CTX_add_client_custom_ext(WOLFSSL_CTX* ctx, unsigned int ext_type,
17551
        wolfSSL_custom_ext_add_cb add_cb, wolfSSL_custom_ext_free_cb free_cb,
17552
        void* add_arg, wolfSSL_custom_ext_parse_cb parse_cb, void* parse_arg)
17553
{
17554
    WOLFSSL_CustomExt* meth;
17555
17556
    WOLFSSL_ENTER("wolfSSL_CTX_add_client_custom_ext");
17557
17558
    if (ctx == NULL || ext_type > 0xffff)
17559
        return WOLFSSL_FAILURE;
17560
17561
    /* free_cb without add_cb is meaningless: there is nothing to free. */
17562
    if (add_cb == NULL && free_cb != NULL)
17563
        return WOLFSSL_FAILURE;
17564
17565
    /* Don't allow shadowing of internally handled extensions. */
17566
    if (TLSX_CustomExt_IsKnown((word16)ext_type))
17567
        return WOLFSSL_FAILURE;
17568
17569
    /* Reject duplicate registrations for the same type. */
17570
    for (meth = ctx->customExt; meth != NULL; meth = meth->next) {
17571
        if (meth->ext_type == (word16)ext_type)
17572
            return WOLFSSL_FAILURE;
17573
    }
17574
17575
    meth = (WOLFSSL_CustomExt*)XMALLOC(sizeof(WOLFSSL_CustomExt), ctx->heap,
17576
                                       DYNAMIC_TYPE_TLSX);
17577
    if (meth == NULL)
17578
        return WOLFSSL_FAILURE;
17579
17580
    meth->ext_type  = (word16)ext_type;
17581
    meth->add_cb    = add_cb;
17582
    meth->free_cb   = free_cb;
17583
    meth->parse_cb  = parse_cb;
17584
    meth->add_arg   = add_arg;
17585
    meth->parse_arg = parse_arg;
17586
    meth->next      = ctx->customExt;
17587
    ctx->customExt  = meth;
17588
17589
    return WOLFSSL_SUCCESS;
17590
}
17591
17592
/* Frees a list of registered custom extension methods. */
17593
void TLSX_CustomExt_FreeAll(WOLFSSL_CustomExt* list, void* heap)
17594
{
17595
    WOLFSSL_CustomExt* meth;
17596
17597
    while ((meth = list) != NULL) {
17598
        list = meth->next;
17599
        XFREE(meth, heap, DYNAMIC_TYPE_TLSX);
17600
    }
17601
}
17602
17603
/* Builds one custom extension via its add callback and appends it (type,
17604
 * length, data) to the buffer tracked by *pData / *pDataSz, recording the type
17605
 * in ssl->customExtSent. Runs the matching free callback for the add. Returns 0
17606
 * when the extension was appended or intentionally omitted, otherwise a
17607
 * negative error. */
17608
static int TLSX_CustomExt_AddOne(WOLFSSL* ssl, WOLFSSL_CustomExt* meth,
17609
        byte** pData, word32* pDataSz)
17610
{
17611
    const unsigned char* out = NULL;
17612
    size_t outlen = 0;
17613
    int al = unsupported_extension;
17614
    int addRet = 1; /* no add_cb => add a zero-length extension */
17615
    word32 need = 0;
17616
    byte* tmp = NULL;
17617
    word16* sent = NULL;
17618
    byte* data = *pData;
17619
    word32 dataSz = *pDataSz;
17620
    int ret = 0;
17621
17622
    if (meth->add_cb != NULL) {
17623
        addRet = meth->add_cb(ssl, meth->ext_type, &out, &outlen, &al,
17624
                              meth->add_arg);
17625
    }
17626
17627
    if (addRet < 0) {
17628
        /* Fatal: callback requested the connection be aborted. add_cb
17629
         * returned < 0, so free_cb is not run (skips free_ext). */
17630
        SendAlert(ssl, alert_fatal, (byte)al);
17631
        return WOLFSSL_FATAL_ERROR;
17632
    }
17633
    if (addRet == 0)
17634
        return 0; /* extension omitted for this message */
17635
17636
    if (out == NULL && outlen > 0) {
17637
        ret = BAD_FUNC_ARG;
17638
    }
17639
    else if (outlen > WOLFSSL_MAX_16BIT) {
17640
        ret = BUFFER_ERROR;
17641
    }
17642
    else {
17643
        need = HELLO_EXT_TYPE_SZ + OPAQUE16_LEN + (word32)outlen;
17644
        if (dataSz + need > (word32)WOLFSSL_MAX_16BIT)
17645
            ret = BUFFER_ERROR;
17646
    }
17647
    if (ret != 0)
17648
        goto free_ext;
17649
17650
    tmp = (byte*)XREALLOC(data, dataSz + need, ssl->heap,
17651
                          DYNAMIC_TYPE_TMP_BUFFER);
17652
    if (tmp == NULL) {
17653
        ret = MEMORY_E;
17654
        goto free_ext;
17655
    }
17656
    data = tmp;
17657
17658
    c16toa(meth->ext_type, data + dataSz);
17659
    dataSz += HELLO_EXT_TYPE_SZ;
17660
    c16toa((word16)outlen, data + dataSz);
17661
    dataSz += OPAQUE16_LEN;
17662
    if (outlen > 0) {
17663
        XMEMCPY(data + dataSz, out, outlen);
17664
        dataSz += (word32)outlen;
17665
    }
17666
17667
    /* Record the type as sent so the server may legitimately echo it. */
17668
    sent = (word16*)XREALLOC(ssl->customExtSent,
17669
            (ssl->customExtSentCnt + 1) * (word32)sizeof(word16),
17670
            ssl->heap, DYNAMIC_TYPE_TLSX);
17671
    if (sent == NULL) {
17672
        ret = MEMORY_E;
17673
        goto free_ext;
17674
    }
17675
    ssl->customExtSent = sent;
17676
    ssl->customExtSent[ssl->customExtSentCnt++] = meth->ext_type;
17677
17678
free_ext:
17679
    if (meth->free_cb != NULL)
17680
        meth->free_cb(ssl, meth->ext_type, out, meth->add_arg);
17681
17682
    *pData = data;
17683
    *pDataSz = dataSz;
17684
    return ret;
17685
}
17686
17687
/* Invokes the registered add callbacks and serializes the resulting custom
17688
 * extensions for the ClientHello into ssl->customExtData. The total wire size
17689
 * (type + length + data for each included extension) is returned in *pSz. The
17690
 * buffer is consumed and released by TLSX_WriteRequest. */
17691
WOLFSSL_TEST_VIS int TLSX_CustomExt_BuildRequest(WOLFSSL* ssl, word16* pSz)
17692
{
17693
    WOLFSSL_CustomExt* meth;
17694
    byte*  data = NULL;
17695
    word32 dataSz = 0;  /* word32 to detect a word16 wire-field overflow */
17696
    int    ret = 0;
17697
17698
    if (ssl == NULL || pSz == NULL)
17699
        return BAD_FUNC_ARG;
17700
17701
    *pSz = 0;
17702
17703
    XFREE(ssl->customExtData, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
17704
    ssl->customExtData = NULL;
17705
    ssl->customExtSz = 0;
17706
    XFREE(ssl->customExtSent, ssl->heap, DYNAMIC_TYPE_TLSX);
17707
    ssl->customExtSent = NULL;
17708
    ssl->customExtSentCnt = 0;
17709
17710
    if (ssl->ctx == NULL || ssl->ctx->customExt == NULL)
17711
        return 0;
17712
17713
    for (meth = ssl->ctx->customExt; meth != NULL && ret == 0;
17714
            meth = meth->next) {
17715
        ret = TLSX_CustomExt_AddOne(ssl, meth, &data, &dataSz);
17716
    }
17717
17718
    if (ret != 0) {
17719
        XFREE(data, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
17720
        if (ssl->customExtSent != NULL) {
17721
            XFREE(ssl->customExtSent, ssl->heap, DYNAMIC_TYPE_TLSX);
17722
            ssl->customExtSent = NULL;
17723
            ssl->customExtSentCnt = 0;
17724
        }
17725
        return ret;
17726
    }
17727
17728
    ssl->customExtData = data;
17729
    ssl->customExtSz = (word16)dataSz;
17730
    *pSz = (word16)dataSz;
17731
17732
    return 0;
17733
}
17734
17735
/* Returns 1 if a custom extension handler is registered for the given type. */
17736
static int TLSX_CustomExt_IsRegistered(const WOLFSSL* ssl, word16 type)
17737
{
17738
    WOLFSSL_CustomExt* meth;
17739
17740
    if (ssl->ctx == NULL)
17741
        return 0;
17742
    for (meth = ssl->ctx->customExt; meth != NULL; meth = meth->next) {
17743
        if (meth->ext_type == type)
17744
            return 1;
17745
    }
17746
    return 0;
17747
}
17748
17749
/* Returns 1 if the given custom extension type was emitted in our ClientHello. */
17750
static int TLSX_CustomExt_WasSent(const WOLFSSL* ssl, word16 type)
17751
{
17752
    word16 i;
17753
17754
    for (i = 0; i < ssl->customExtSentCnt; i++) {
17755
        if (ssl->customExtSent[i] == type)
17756
            return 1;
17757
    }
17758
    return 0;
17759
}
17760
17761
/* Looks up a registered custom extension matching the received type and, if
17762
 * found, invokes its parse callback. *found is set to 1 when a handler matched
17763
 * (whether it succeeded or failed). Returns 0 on success, or a negative error
17764
 * (after sending the appropriate alert) when the extension is unsolicited or
17765
 * the callback rejects the data. */
17766
int TLSX_CustomExt_Parse(WOLFSSL* ssl, byte msgType, word16 type,
17767
        const byte* input, word16 size, int* found)
17768
{
17769
    WOLFSSL_CustomExt* meth;
17770
17771
    *found = 0;
17772
17773
    if (ssl->ctx == NULL || ssl->ctx->customExt == NULL)
17774
        return 0;
17775
17776
    /* Legacy client custom extensions only apply to the ServerHello of a
17777
     * TLS 1.2 (or below) handshake. For TLS 1.3, fall through so the unknown
17778
     * extension is handled per RFC 8446 (unsupported_extension alert). */
17779
    if (msgType != server_hello || IsAtLeastTLSv1_3(ssl->version))
17780
        return 0;
17781
17782
    /* OpenSSL registers the legacy API with SSL_EXT_IGNORE_ON_RESUMPTION, so on
17783
     * a resumed handshake the extension is not processed (the server echo is
17784
     * silently ignored). Only ignore when the server has actually confirmed
17785
     * resumption by echoing our session ID -- the RFC 5246 / RFC 5077 (tickets,
17786
     * non-empty session ID) signal. A cached ticket alone is not enough: if the
17787
     * server falls back to a full handshake it will not echo our session ID, so
17788
     * the extension is still parsed/validated below (and an unsolicited one is
17789
     * rejected). These fields are set from the ServerHello before this point. */
17790
    if (ssl->options.resuming && ssl->options.haveSessionId &&
17791
            ssl->arrays != NULL && ssl->session != NULL &&
17792
            ssl->arrays->sessionIDSz > 0 &&
17793
            ssl->arrays->sessionIDSz == ssl->session->sessionIDSz &&
17794
            XMEMCMP(ssl->arrays->sessionID, ssl->session->sessionID,
17795
                    ssl->arrays->sessionIDSz) == 0) {
17796
        return 0;
17797
    }
17798
17799
    for (meth = ssl->ctx->customExt; meth != NULL; meth = meth->next) {
17800
        if (meth->ext_type != type)
17801
            continue;
17802
17803
        *found = 1;
17804
17805
        /* RFC 5246 7.4.1.4: the server must not send an extension the client
17806
         * did not request. add_cb may decline to send for a given handshake,
17807
         * so reject a response for any type we did not actually emit. */
17808
        if (!TLSX_CustomExt_WasSent(ssl, type)) {
17809
            WOLFSSL_MSG("Unsolicited custom extension in ServerHello");
17810
            SendAlert(ssl, alert_fatal, unsupported_extension);
17811
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
17812
            return UNSUPPORTED_EXTENSION;
17813
        }
17814
17815
        if (meth->parse_cb != NULL) {
17816
            int al = unsupported_extension;
17817
            int parseRet = meth->parse_cb(ssl, type, input, (size_t)size, &al,
17818
                                          meth->parse_arg);
17819
            if (parseRet <= 0) {
17820
                SendAlert(ssl, alert_fatal, (byte)al);
17821
                WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
17822
                return UNSUPPORTED_EXTENSION;
17823
            }
17824
        }
17825
        break;
17826
    }
17827
17828
    return 0;
17829
}
17830
#endif /* HAVE_TLS_EXTENSIONS && OPENSSL_EXTRA */
17831
17832
/** Tells the buffered size of extensions to be sent into the client hello. */
17833
int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word32* pLength)
17834
0
{
17835
0
    int ret = 0;
17836
0
    word16 length = 0;
17837
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
17838
17839
0
    if (!TLSX_SupportExtensions(ssl))
17840
0
        return 0;
17841
0
    if (msgType == client_hello) {
17842
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
17843
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
17844
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17845
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
17846
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
17847
0
    #ifdef WOLFSSL_TLS13
17848
        /* RFC 8446 4.2.3: the list may not be empty, so drop the extension. */
17849
0
        if ((ssl->certHashSigAlgo == NULL) || (ssl->certHashSigAlgoSz == 0)) {
17850
0
            TURN_ON(semaphore,
17851
0
                    TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS_CERT));
17852
0
        }
17853
0
    #endif
17854
0
#endif
17855
0
#if defined(WOLFSSL_TLS13)
17856
0
        if (!IsAtLeastTLSv1_2(ssl)) {
17857
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17858
0
        }
17859
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
17860
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
17861
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17862
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17863
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17864
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
17865
        #endif
17866
        #ifdef WOLFSSL_EARLY_DATA
17867
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
17868
        #endif
17869
0
        #ifdef WOLFSSL_TLS13_COOKIE
17870
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
17871
0
        #endif
17872
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
17873
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
17874
        #endif
17875
0
        }
17876
0
    #endif
17877
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
17878
0
        if (!IsAtLeastTLSv1_3(ssl->version) || !HasAnyCANames(ssl)) {
17879
0
            TURN_ON(semaphore,
17880
0
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
17881
0
        }
17882
0
    #endif
17883
0
#endif /* WOLFSSL_TLS13 */
17884
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
17885
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17886
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
17887
            /* mark already sent, so it won't send it */
17888
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17889
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
17890
        }
17891
    #endif
17892
0
    }
17893
17894
0
#ifdef WOLFSSL_TLS13
17895
0
    #ifndef NO_CERTS
17896
0
    else if (msgType == certificate_request) {
17897
        /* Don't send out any extension except those that are turned off. */
17898
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17899
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17900
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
17901
0
#endif
17902
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
17903
0
        if (HasAnyCANames(ssl)) {
17904
0
            TURN_OFF(semaphore,
17905
0
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
17906
0
        }
17907
0
#endif
17908
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, OID_FILTERS */
17909
        /* TLSX_STATUS_REQUEST is enabled: the server may request the client
17910
         * to staple an OCSP response with its CertificateRequest. */
17911
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17912
0
    }
17913
0
    #endif
17914
#if defined(HAVE_ECH)
17915
    if (!ssl->options.disableECH && msgType == client_hello) {
17916
        ret = TLSX_GetSizeWithEch(ssl, semaphore, msgType, &length);
17917
        if (ret != 0)
17918
            return ret;
17919
    }
17920
    else
17921
#endif /* HAVE_ECH */
17922
0
#endif /* WOLFSSL_TLS13 */
17923
0
    {
17924
0
        if (ssl->extensions) {
17925
0
            ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
17926
0
            if (ret != 0)
17927
0
                return ret;
17928
0
        }
17929
0
        if (ssl->ctx && ssl->ctx->extensions) {
17930
0
            ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType,
17931
0
                &length);
17932
0
            if (ret != 0)
17933
0
                return ret;
17934
0
        }
17935
0
    }
17936
17937
0
#ifdef HAVE_EXTENDED_MASTER
17938
0
    if (msgType == client_hello && ssl->options.haveEMS &&
17939
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
17940
0
        length += HELLO_EXT_SZ;
17941
0
    }
17942
0
#endif
17943
17944
#if defined(HAVE_TLS_EXTENSIONS) && defined(OPENSSL_EXTRA)
17945
    /* Custom (application-defined) extensions. These are always offered in the
17946
     * ClientHello regardless of the client's maximum version (matching OpenSSL,
17947
     * whose is_tls13 check is false while constructing the ClientHello), so
17948
     * they work with flexible client methods that go on to negotiate TLS 1.2.
17949
     * The negotiated-version restriction is enforced on the parse side. The add
17950
     * callbacks run here and the resulting bytes are cached for
17951
     * TLSX_WriteRequest. */
17952
    if (msgType == client_hello) {
17953
        word16 customSz = 0;
17954
        ret = TLSX_CustomExt_BuildRequest(ssl, &customSz);
17955
        if (ret != 0)
17956
            return ret;
17957
        if ((word32)length + customSz > (WOLFSSL_MAX_16BIT - OPAQUE16_LEN)) {
17958
            WOLFSSL_MSG("TLSX_GetRequestSize extensions exceed word16");
17959
            return BUFFER_E;
17960
        }
17961
        length += customSz;
17962
    }
17963
#endif
17964
17965
    /* The TLS extensions block length prefix is a 2-byte field, so any
17966
     * accumulated total above 0xFFFF must be rejected rather than silently
17967
     * truncating and producing a short, malformed handshake message. */
17968
0
    if (length > (word16)(WOLFSSL_MAX_16BIT - OPAQUE16_LEN)) {
17969
0
        WOLFSSL_MSG("TLSX_GetRequestSize extensions exceed word16");
17970
0
        return BUFFER_E;
17971
0
    }
17972
0
    if (length)
17973
0
        length += OPAQUE16_LEN; /* for total length storage. */
17974
17975
0
    *pLength += length;
17976
17977
0
    return ret;
17978
0
}
17979
17980
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
17981
/* return status after writing the extensions with ech written last */
17982
static int TLSX_WriteWithEch(WOLFSSL* ssl, byte* output, byte* semaphore,
17983
    byte msgType, word16* pOffset)
17984
{
17985
    int ret = 0;
17986
    int retC;
17987
    int installed = 0;
17988
    TLSX* echX = NULL;
17989
    WOLFSSL_ECH* ech = NULL;
17990
    word16 appended = 0;
17991
17992
    if (ssl->extensions)
17993
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
17994
    if (echX != NULL)
17995
        ech = (WOLFSSL_ECH*)echX->data;
17996
17997
    ret = retC = TLSX_EchConcealExtensions(ssl, ech, &appended, &installed);
17998
17999
    if (ret == 0 && echX != NULL) {
18000
        /* turn ech on so it doesn't write, then write it last */
18001
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
18002
    }
18003
18004
    /* for ECH inner, print the encodable block first, then the non-encodables.
18005
     * This allows the same transcript to be produced on either side
18006
     * (the transcript is over the expanded form). */
18007
    if (ret == 0 && ech != NULL && ech->type == ECH_TYPE_INNER) {
18008
        byte encodeMask[SEMAPHORE_SIZE];
18009
        byte* mask = ech->writeEncoded ? semaphore : encodeMask;
18010
        word16 count = 0;
18011
        int i;
18012
18013
        XMEMSET(encodeMask, 0, SEMAPHORE_SIZE);
18014
18015
        ret = TLSX_ECH_BuildOuterExtensions(ssl, semaphore, msgType,
18016
            ech->writeEncoded ? output : NULL,
18017
            ech->writeEncoded ? pOffset : NULL,
18018
            &count, mask);
18019
        if (ret == 0 && count >= 1 && !ech->writeEncoded) {
18020
            /* expanded: print encodable block normally */
18021
            for (i = 0; i < SEMAPHORE_SIZE; i++) {
18022
                semaphore[i] |= encodeMask[i];
18023
                encodeMask[i] = (byte)~encodeMask[i];
18024
            }
18025
            if (ssl->extensions) {
18026
                ret = TLSX_Write(ssl->extensions, output + *pOffset,
18027
                        encodeMask, msgType, pOffset);
18028
            }
18029
            if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
18030
                ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset,
18031
                        encodeMask, msgType, pOffset);
18032
            }
18033
        }
18034
    }
18035
18036
    /* print non-encodable block */
18037
    if (ret == 0 && ssl->extensions) {
18038
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
18039
                         msgType, pOffset);
18040
    }
18041
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
18042
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
18043
                         msgType, pOffset);
18044
    }
18045
18046
    /* write ECH last */
18047
    if (ret == 0 && echX != NULL) {
18048
        /* turn off and write it last */
18049
        TURN_OFF(semaphore, TLSX_ToSemaphore(echX->type));
18050
18051
        if (ssl->extensions) {
18052
            ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
18053
                msgType, pOffset);
18054
        }
18055
18056
        if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
18057
            ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
18058
                msgType, pOffset);
18059
        }
18060
    }
18061
18062
    /* always try to restore extensions to a good state */
18063
    if (retC == 0)
18064
        retC = TLSX_EchExposeExtensions(ssl, ech, appended, installed);
18065
18066
    if (ret == 0)
18067
        ret = retC;
18068
    return ret;
18069
}
18070
#endif
18071
18072
/** Writes the extensions to be sent into the client hello. */
18073
int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word32* pOffset)
18074
0
{
18075
0
    int ret = 0;
18076
0
    word16 offset = 0;
18077
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
18078
18079
0
    if (!TLSX_SupportExtensions(ssl) || output == NULL)
18080
0
        return 0;
18081
18082
0
    offset += OPAQUE16_LEN; /* extensions length */
18083
18084
0
    if (msgType == client_hello) {
18085
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
18086
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
18087
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
18088
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
18089
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
18090
0
    #ifdef WOLFSSL_TLS13
18091
        /* RFC 8446 4.2.3: the list may not be empty, so drop the extension. */
18092
0
        if ((ssl->certHashSigAlgo == NULL) || (ssl->certHashSigAlgoSz == 0)) {
18093
0
            TURN_ON(semaphore,
18094
0
                    TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS_CERT));
18095
0
        }
18096
0
    #endif
18097
0
#endif
18098
0
#ifdef WOLFSSL_TLS13
18099
0
        if (!IsAtLeastTLSv1_2(ssl)) {
18100
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18101
0
        }
18102
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
18103
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
18104
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18105
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18106
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
18107
        #endif
18108
        #ifdef WOLFSSL_EARLY_DATA
18109
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
18110
        #endif
18111
0
        #ifdef WOLFSSL_TLS13_COOKIE
18112
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
18113
0
        #endif
18114
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
18115
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
18116
        #endif
18117
        #ifdef WOLFSSL_DUAL_ALG_CERTS
18118
            TURN_ON(semaphore,
18119
                    TLSX_ToSemaphore(TLSX_CKS));
18120
        #endif
18121
0
        }
18122
0
    #endif
18123
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
18124
0
        if (!IsAtLeastTLSv1_3(ssl->version) || !HasAnyCANames(ssl)) {
18125
0
            TURN_ON(semaphore,
18126
0
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
18127
0
        }
18128
0
    #endif
18129
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18130
        /* Must write Pre-shared Key extension at the end in TLS v1.3.
18131
         * Must not write out Pre-shared Key extension in earlier versions of
18132
         * protocol.
18133
         */
18134
        TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18135
    #endif
18136
0
#endif /* WOLFSSL_TLS13 */
18137
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
18138
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
18139
         /* mark already sent, so it won't send it */
18140
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
18141
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
18142
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
18143
        }
18144
    #endif
18145
0
    }
18146
0
#ifdef WOLFSSL_TLS13
18147
0
    #ifndef NO_CERTS
18148
0
    else if (msgType == certificate_request) {
18149
        /* Don't send out any extension except those that are turned off. */
18150
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18151
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
18152
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
18153
0
#endif
18154
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
18155
0
        if (HasAnyCANames(ssl)) {
18156
0
            TURN_OFF(semaphore,
18157
0
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
18158
0
        }
18159
0
#endif
18160
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, TLSX_OID_FILTERS */
18161
        /* TLSX_STATUS_REQUEST is enabled: the server may request the client
18162
         * to staple an OCSP response with its CertificateRequest. */
18163
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
18164
0
    }
18165
0
#endif
18166
0
#endif
18167
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
18168
    if (!ssl->options.disableECH && msgType == client_hello) {
18169
        ret = TLSX_WriteWithEch(ssl, output, semaphore, msgType, &offset);
18170
        if (ret != 0)
18171
            return ret;
18172
    }
18173
    else
18174
#endif
18175
0
    {
18176
0
        if (ssl->extensions) {
18177
0
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
18178
0
                             msgType, &offset);
18179
0
            if (ret != 0)
18180
0
                return ret;
18181
0
        }
18182
0
        if (ssl->ctx && ssl->ctx->extensions) {
18183
0
            ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
18184
0
                             msgType, &offset);
18185
0
            if (ret != 0)
18186
0
                return ret;
18187
0
        }
18188
0
    }
18189
18190
0
#ifdef HAVE_EXTENDED_MASTER
18191
0
    if (msgType == client_hello && ssl->options.haveEMS &&
18192
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
18193
0
        WOLFSSL_MSG("EMS extension to write");
18194
0
        c16toa(HELLO_EXT_EXTMS, output + offset);
18195
0
        offset += HELLO_EXT_TYPE_SZ;
18196
0
        c16toa(0, output + offset);
18197
0
        offset += HELLO_EXT_SZ_SZ;
18198
0
    }
18199
0
#endif
18200
18201
#if defined(HAVE_TLS_EXTENSIONS) && defined(OPENSSL_EXTRA)
18202
    /* Copy out the custom (application-defined) extension bytes built during
18203
     * TLSX_GetRequestSize, then release the cached buffer. */
18204
    if (msgType == client_hello && ssl->customExtData != NULL) {
18205
        WOLFSSL_MSG("Custom extensions to write");
18206
        XMEMCPY(output + offset, ssl->customExtData, ssl->customExtSz);
18207
        offset += ssl->customExtSz;
18208
        XFREE(ssl->customExtData, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
18209
        ssl->customExtData = NULL;
18210
        ssl->customExtSz = 0;
18211
    }
18212
#endif
18213
18214
0
#ifdef WOLFSSL_TLS13
18215
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18216
    if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
18217
        /* Write out what we can of Pre-shared key extension.  */
18218
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18219
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
18220
                         client_hello, &offset);
18221
        if (ret != 0)
18222
            return ret;
18223
    }
18224
    #endif
18225
0
#endif
18226
18227
    /* Wrap detection for the TLSX_Write calls above is handled inside
18228
     * TLSX_Write itself: any iteration that would push the local word16
18229
     * offset past 0xFFFF returns BUFFER_E so we never reach here with a
18230
     * truncated value. The TLS extensions block length prefix on the
18231
     * wire is a 2-byte field, matching this invariant. */
18232
18233
0
    if (offset > OPAQUE16_LEN || msgType != client_hello)
18234
0
        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
18235
18236
0
     *pOffset += offset;
18237
18238
0
    return ret;
18239
0
}
18240
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
18241
18242
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
18243
18244
/** Tells the buffered size of extensions to be sent into the server hello. */
18245
int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
18246
0
{
18247
0
    int ret = 0;
18248
0
    word16 length = 0;
18249
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
18250
18251
0
    switch (msgType) {
18252
0
#ifndef NO_WOLFSSL_SERVER
18253
0
        case server_hello:
18254
0
            PF_VALIDATE_RESPONSE(ssl, semaphore);
18255
0
        #ifdef WOLFSSL_TLS13
18256
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18257
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18258
0
                    TURN_OFF(semaphore,
18259
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18260
0
                #if defined(HAVE_SUPPORTED_CURVES)
18261
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18262
                    if (!ssl->options.noPskDheKe)
18263
                #endif
18264
0
                    {
18265
                        /* Expect KeyShare extension in ServerHello. */
18266
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18267
0
                    }
18268
0
                #endif
18269
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18270
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18271
                #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
18272
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
18273
                #endif
18274
                #endif
18275
0
                }
18276
0
            #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
18277
0
                else {
18278
0
                #ifdef HAVE_SUPPORTED_CURVES
18279
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18280
0
                #endif
18281
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18282
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18283
                #endif
18284
0
                }
18285
0
            #endif
18286
            #ifdef WOLFSSL_DTLS_CID
18287
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
18288
            #endif
18289
0
        #endif /* WOLFSSL_TLS13 */
18290
0
            break;
18291
18292
0
    #ifdef WOLFSSL_TLS13
18293
0
        case hello_retry_request:
18294
0
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18295
0
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18296
0
        #ifdef HAVE_SUPPORTED_CURVES
18297
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18298
            if (!ssl->options.noPskDheKe)
18299
        #endif
18300
0
            {
18301
                /* Expect KeyShare extension in HelloRetryRequest. */
18302
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18303
0
            }
18304
0
        #endif
18305
        #ifdef WOLFSSL_SEND_HRR_COOKIE
18306
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
18307
        #endif
18308
#ifdef HAVE_ECH
18309
            /* send the special confirmation */
18310
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
18311
#endif
18312
0
            break;
18313
0
    #endif
18314
18315
0
    #ifdef WOLFSSL_TLS13
18316
0
        case encrypted_extensions:
18317
            /* Send out all extension except those that are turned on. */
18318
0
        #ifdef HAVE_ECC
18319
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
18320
0
        #endif
18321
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18322
        #ifdef HAVE_SESSION_TICKET
18323
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
18324
        #endif
18325
0
        #ifdef HAVE_SUPPORTED_CURVES
18326
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18327
0
        #endif
18328
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18329
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18330
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
18331
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
18332
        #endif
18333
        #endif
18334
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
18335
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
18336
        #endif
18337
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
18338
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
18339
        #endif
18340
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
18341
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
18342
0
        #endif
18343
        #ifdef WOLFSSL_DTLS_CID
18344
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
18345
        #endif /* WOLFSSL_DTLS_CID */
18346
0
            break;
18347
18348
        #ifdef WOLFSSL_EARLY_DATA
18349
        case session_ticket:
18350
            if (ssl->options.tls1_3) {
18351
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18352
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
18353
            }
18354
            break;
18355
        #endif
18356
0
    #endif
18357
0
#endif
18358
18359
0
#ifdef WOLFSSL_TLS13
18360
0
    #ifndef NO_CERTS
18361
0
        case certificate:
18362
            /* Don't send out any extension except those that are turned off. */
18363
0
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18364
0
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
18365
            /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
18366
             *       TLSX_SERVER_CERTIFICATE_TYPE
18367
             */
18368
0
            break;
18369
0
    #endif
18370
0
#endif
18371
0
    }
18372
18373
0
#ifdef HAVE_EXTENDED_MASTER
18374
0
    if (ssl->options.haveEMS && msgType == server_hello &&
18375
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
18376
0
        length += HELLO_EXT_SZ;
18377
0
    }
18378
0
#endif
18379
18380
0
    if (TLSX_SupportExtensions(ssl)) {
18381
0
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
18382
0
        if (ret != 0)
18383
0
            return ret;
18384
0
    }
18385
18386
    /* All the response data is set at the ssl object only, so no ctx here. */
18387
18388
0
    if (length || msgType != server_hello)
18389
0
        length += OPAQUE16_LEN; /* for total length storage. */
18390
18391
0
    *pLength += length;
18392
18393
0
    return ret;
18394
0
}
18395
18396
/** Writes the server hello extensions into a buffer. */
18397
int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
18398
0
{
18399
0
    int ret = 0;
18400
0
    word16 offset = 0;
18401
18402
0
    if (TLSX_SupportExtensions(ssl) && output) {
18403
0
        byte semaphore[SEMAPHORE_SIZE] = {0};
18404
18405
0
        switch (msgType) {
18406
0
#ifndef NO_WOLFSSL_SERVER
18407
0
            case server_hello:
18408
0
                PF_VALIDATE_RESPONSE(ssl, semaphore);
18409
0
        #ifdef WOLFSSL_TLS13
18410
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18411
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18412
0
                    TURN_OFF(semaphore,
18413
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18414
0
            #ifdef HAVE_SUPPORTED_CURVES
18415
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18416
                    if (!ssl->options.noPskDheKe)
18417
                #endif
18418
0
                    {
18419
                        /* Write out KeyShare in ServerHello. */
18420
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18421
0
                    }
18422
0
            #endif
18423
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18424
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18425
            #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
18426
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
18427
            #endif
18428
            #endif
18429
0
                }
18430
0
                else
18431
0
        #endif /* WOLFSSL_TLS13 */
18432
0
                {
18433
0
        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
18434
0
            #ifdef HAVE_SUPPORTED_CURVES
18435
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18436
0
            #endif
18437
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18438
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18439
            #endif
18440
0
        #endif
18441
0
                    WC_DO_NOTHING; /* avoid empty brackets */
18442
0
                }
18443
        #ifdef WOLFSSL_DTLS_CID
18444
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
18445
        #endif /* WOLFSSL_DTLS_CID */
18446
0
                break;
18447
18448
0
    #ifdef WOLFSSL_TLS13
18449
0
            case hello_retry_request:
18450
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18451
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18452
0
        #ifdef HAVE_SUPPORTED_CURVES
18453
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18454
                if (!ssl->options.noPskDheKe)
18455
            #endif
18456
0
                {
18457
                    /* Write out KeyShare in HelloRetryRequest. */
18458
0
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18459
0
                }
18460
0
        #endif
18461
0
                break;
18462
0
    #endif
18463
18464
0
    #ifdef WOLFSSL_TLS13
18465
0
            case encrypted_extensions:
18466
                /* Send out all extension except those that are turned on. */
18467
0
        #ifdef HAVE_ECC
18468
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
18469
0
        #endif
18470
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
18471
        #ifdef HAVE_SESSION_TICKET
18472
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
18473
        #endif
18474
0
        #ifdef HAVE_SUPPORTED_CURVES
18475
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18476
0
        #endif
18477
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18478
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18479
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
18480
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
18481
        #endif
18482
        #endif
18483
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
18484
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
18485
        #endif
18486
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
18487
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
18488
        #endif
18489
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
18490
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
18491
0
        #endif
18492
        #ifdef WOLFSSL_DTLS_CID
18493
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
18494
        #endif /* WOLFSSL_DTLS_CID */
18495
0
                break;
18496
18497
        #ifdef WOLFSSL_EARLY_DATA
18498
            case session_ticket:
18499
                if (ssl->options.tls1_3) {
18500
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18501
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
18502
                }
18503
                break;
18504
        #endif
18505
0
    #endif
18506
0
#endif
18507
18508
0
    #ifdef WOLFSSL_TLS13
18509
0
        #ifndef NO_CERTS
18510
0
            case certificate:
18511
                /* Don't send out any extension except those that are turned
18512
                 * off. */
18513
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18514
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
18515
                /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
18516
                 *       TLSX_SERVER_CERTIFICATE_TYPE
18517
                 */
18518
0
                break;
18519
0
        #endif
18520
0
    #endif
18521
18522
0
            default:
18523
0
                break;
18524
0
        }
18525
18526
0
        offset += OPAQUE16_LEN; /* extensions length */
18527
18528
0
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
18529
0
                         msgType, &offset);
18530
0
        if (ret != 0)
18531
0
            return ret;
18532
18533
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
18534
        if (msgType == hello_retry_request) {
18535
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18536
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
18537
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
18538
                             msgType, &offset);
18539
            if (ret != 0)
18540
                return ret;
18541
        }
18542
#endif
18543
18544
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
18545
        /* write ECH last to promote interop with other implementations */
18546
        if (msgType == hello_retry_request) {
18547
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
18548
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
18549
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
18550
                             msgType, &offset);
18551
            if (ret != 0)
18552
                return ret;
18553
        }
18554
#endif
18555
18556
0
#ifdef HAVE_EXTENDED_MASTER
18557
0
        if (ssl->options.haveEMS && msgType == server_hello &&
18558
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
18559
0
            WOLFSSL_MSG("EMS extension to write");
18560
0
            c16toa(HELLO_EXT_EXTMS, output + offset);
18561
0
            offset += HELLO_EXT_TYPE_SZ;
18562
0
            c16toa(0, output + offset);
18563
0
            offset += HELLO_EXT_SZ_SZ;
18564
0
        }
18565
0
#endif
18566
18567
0
        if (offset > OPAQUE16_LEN || msgType != server_hello)
18568
0
            c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
18569
0
    }
18570
18571
0
    if (pOffset)
18572
0
        *pOffset += offset;
18573
18574
0
    return ret;
18575
0
}
18576
18577
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
18578
18579
#ifdef WOLFSSL_TLS13
18580
int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
18581
                      byte msgType, int* found)
18582
0
{
18583
0
    int ret = 0;
18584
0
    int offset = 0;
18585
18586
0
    *found = 0;
18587
0
    while (offset < (int)length) {
18588
0
        word16 type;
18589
0
        word16 size;
18590
18591
0
        if (offset + (2 * OPAQUE16_LEN) > length) {
18592
0
            ret = BUFFER_ERROR;
18593
0
            break;
18594
0
        }
18595
18596
0
        ato16(input + offset, &type);
18597
0
        offset += HELLO_EXT_TYPE_SZ;
18598
18599
0
        ato16(input + offset, &size);
18600
0
        offset += OPAQUE16_LEN;
18601
18602
0
        if (offset + size > length) {
18603
0
            ret = BUFFER_ERROR;
18604
0
            break;
18605
0
        }
18606
18607
0
        if (type == TLSX_SUPPORTED_VERSIONS) {
18608
0
            *found = 1;
18609
18610
0
            WOLFSSL_MSG("Supported Versions extension received");
18611
18612
0
            ret = SV_PARSE(ssl, input + offset, size, msgType, &ssl->version,
18613
0
                           &ssl->options, &ssl->extensions);
18614
0
            break;
18615
0
        }
18616
18617
0
        offset += size;
18618
0
    }
18619
18620
#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_DTLS_CID)
18621
    ssl->options.haveSupportedVersions = (ret == 0 && *found);
18622
#endif
18623
0
    return ret;
18624
0
}
18625
#endif
18626
/* Jump Table to check minimum size values for client case in TLSX_Parse */
18627
#ifndef NO_WOLFSSL_SERVER
18628
static word16 TLSX_GetMinSize_Client(word16* type)
18629
0
{
18630
0
    switch (*type) {
18631
0
        case TLSXT_SERVER_NAME:
18632
0
            return WOLFSSL_SNI_MIN_SIZE_CLIENT;
18633
0
        case TLSXT_EARLY_DATA:
18634
0
            return WOLFSSL_EDI_MIN_SIZE_CLIENT;
18635
0
        case TLSXT_MAX_FRAGMENT_LENGTH:
18636
0
            return WOLFSSL_MFL_MIN_SIZE_CLIENT;
18637
0
        case TLSXT_TRUSTED_CA_KEYS:
18638
0
            return WOLFSSL_TCA_MIN_SIZE_CLIENT;
18639
0
        case TLSXT_TRUNCATED_HMAC:
18640
0
            return WOLFSSL_THM_MIN_SIZE_CLIENT;
18641
0
        case TLSXT_STATUS_REQUEST:
18642
0
            return WOLFSSL_CSR_MIN_SIZE_CLIENT;
18643
0
        case TLSXT_SUPPORTED_GROUPS:
18644
0
            return WOLFSSL_EC_MIN_SIZE_CLIENT;
18645
0
        case TLSXT_EC_POINT_FORMATS:
18646
0
            return WOLFSSL_PF_MIN_SIZE_CLIENT;
18647
0
        case TLSXT_SIGNATURE_ALGORITHMS:
18648
0
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
18649
0
        case TLSXT_USE_SRTP:
18650
0
            return WOLFSSL_SRTP_MIN_SIZE_CLIENT;
18651
0
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
18652
0
            return WOLFSSL_ALPN_MIN_SIZE_CLIENT;
18653
0
        case TLSXT_STATUS_REQUEST_V2:
18654
0
            return WOLFSSL_CSR2_MIN_SIZE_CLIENT;
18655
0
        case TLSXT_CLIENT_CERTIFICATE:
18656
0
            return WOLFSSL_CCT_MIN_SIZE_CLIENT;
18657
0
        case TLSXT_SERVER_CERTIFICATE:
18658
0
            return WOLFSSL_SCT_MIN_SIZE_CLIENT;
18659
0
        case TLSXT_ENCRYPT_THEN_MAC:
18660
0
            return WOLFSSL_ETM_MIN_SIZE_CLIENT;
18661
0
        case TLSXT_SESSION_TICKET:
18662
0
            return WOLFSSL_STK_MIN_SIZE_CLIENT;
18663
0
        case TLSXT_PRE_SHARED_KEY:
18664
0
            return WOLFSSL_PSK_MIN_SIZE_CLIENT;
18665
0
        case TLSXT_COOKIE:
18666
0
            return WOLFSSL_CKE_MIN_SIZE_CLIENT;
18667
0
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
18668
0
            return WOLFSSL_PKM_MIN_SIZE_CLIENT;
18669
0
        case TLSXT_CERT_WITH_EXTERN_PSK:
18670
0
            return WOLFSSL_CWEP_MIN_SIZE_CLIENT;
18671
0
        case TLSXT_CERTIFICATE_AUTHORITIES:
18672
0
            return WOLFSSL_CAN_MIN_SIZE_CLIENT;
18673
0
        case TLSXT_POST_HANDSHAKE_AUTH:
18674
0
            return WOLFSSL_PHA_MIN_SIZE_CLIENT;
18675
0
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
18676
0
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
18677
0
        case TLSXT_KEY_SHARE:
18678
0
            return WOLFSSL_KS_MIN_SIZE_CLIENT;
18679
0
        case TLSXT_CONNECTION_ID:
18680
0
            return WOLFSSL_CID_MIN_SIZE_CLIENT;
18681
0
        case TLSXT_RENEGOTIATION_INFO:
18682
0
            return WOLFSSL_SCR_MIN_SIZE_CLIENT;
18683
0
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
18684
0
            return WOLFSSL_QTP_MIN_SIZE_CLIENT;
18685
0
        case TLSXT_ECH:
18686
0
            return WOLFSSL_ECH_MIN_SIZE_CLIENT;
18687
0
        default:
18688
0
            return 0;
18689
0
    }
18690
0
}
18691
0
    #define TLSX_GET_MIN_SIZE_CLIENT(type) TLSX_GetMinSize_Client(type)
18692
#else
18693
    #define TLSX_GET_MIN_SIZE_CLIENT(type) 0
18694
#endif
18695
18696
18697
#ifndef NO_WOLFSSL_CLIENT
18698
/* Jump Table to check minimum size values for server case in TLSX_Parse */
18699
static word16 TLSX_GetMinSize_Server(const word16 *type)
18700
0
{
18701
0
    switch (*type) {
18702
0
        case TLSXT_SERVER_NAME:
18703
0
            return WOLFSSL_SNI_MIN_SIZE_SERVER;
18704
0
        case TLSXT_EARLY_DATA:
18705
0
            return WOLFSSL_EDI_MIN_SIZE_SERVER;
18706
0
        case TLSXT_MAX_FRAGMENT_LENGTH:
18707
0
            return WOLFSSL_MFL_MIN_SIZE_SERVER;
18708
0
        case TLSXT_TRUSTED_CA_KEYS:
18709
0
            return WOLFSSL_TCA_MIN_SIZE_SERVER;
18710
0
        case TLSXT_TRUNCATED_HMAC:
18711
0
            return WOLFSSL_THM_MIN_SIZE_SERVER;
18712
0
        case TLSXT_STATUS_REQUEST:
18713
0
            return WOLFSSL_CSR_MIN_SIZE_SERVER;
18714
0
        case TLSXT_SUPPORTED_GROUPS:
18715
0
            return WOLFSSL_EC_MIN_SIZE_SERVER;
18716
0
        case TLSXT_EC_POINT_FORMATS:
18717
0
            return WOLFSSL_PF_MIN_SIZE_SERVER;
18718
0
        case TLSXT_SIGNATURE_ALGORITHMS:
18719
0
            return WOLFSSL_SA_MIN_SIZE_SERVER;
18720
0
        case TLSXT_USE_SRTP:
18721
0
            return WOLFSSL_SRTP_MIN_SIZE_SERVER;
18722
0
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
18723
0
            return WOLFSSL_ALPN_MIN_SIZE_SERVER;
18724
0
        case TLSXT_STATUS_REQUEST_V2:
18725
0
            return WOLFSSL_CSR2_MIN_SIZE_SERVER;
18726
0
        case TLSXT_CLIENT_CERTIFICATE:
18727
0
            return WOLFSSL_CCT_MIN_SIZE_SERVER;
18728
0
        case TLSXT_SERVER_CERTIFICATE:
18729
0
            return WOLFSSL_SCT_MIN_SIZE_SERVER;
18730
0
        case TLSXT_ENCRYPT_THEN_MAC:
18731
0
            return WOLFSSL_ETM_MIN_SIZE_SERVER;
18732
0
        case TLSXT_SESSION_TICKET:
18733
0
            return WOLFSSL_STK_MIN_SIZE_SERVER;
18734
0
        case TLSXT_PRE_SHARED_KEY:
18735
0
            return WOLFSSL_PSK_MIN_SIZE_SERVER;
18736
0
        case TLSXT_COOKIE:
18737
0
            return WOLFSSL_CKE_MIN_SIZE_SERVER;
18738
0
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
18739
0
            return WOLFSSL_PKM_MIN_SIZE_SERVER;
18740
0
        case TLSXT_CERT_WITH_EXTERN_PSK:
18741
0
            return WOLFSSL_CWEP_MIN_SIZE_SERVER;
18742
0
        case TLSXT_CERTIFICATE_AUTHORITIES:
18743
0
            return WOLFSSL_CAN_MIN_SIZE_SERVER;
18744
0
        case TLSXT_POST_HANDSHAKE_AUTH:
18745
0
            return WOLFSSL_PHA_MIN_SIZE_SERVER;
18746
0
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
18747
0
            return WOLFSSL_SA_MIN_SIZE_SERVER;
18748
0
        case TLSXT_KEY_SHARE:
18749
0
            return WOLFSSL_KS_MIN_SIZE_SERVER;
18750
0
        case TLSXT_CONNECTION_ID:
18751
0
            return WOLFSSL_CID_MIN_SIZE_SERVER;
18752
0
        case TLSXT_RENEGOTIATION_INFO:
18753
0
            return WOLFSSL_SCR_MIN_SIZE_SERVER;
18754
0
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
18755
0
            return WOLFSSL_QTP_MIN_SIZE_SERVER;
18756
0
        case TLSXT_ECH:
18757
0
            return WOLFSSL_ECH_MIN_SIZE_SERVER;
18758
0
        default:
18759
0
            return 0;
18760
0
    }
18761
0
}
18762
0
    #define TLSX_GET_MIN_SIZE_SERVER(type) TLSX_GetMinSize_Server(type)
18763
#else
18764
    #define TLSX_GET_MIN_SIZE_SERVER(type) 0
18765
#endif
18766
18767
18768
/** Parses a buffer of TLS extensions. */
18769
WOLFSSL_TEST_VIS int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length,
18770
                                byte msgType, Suites *suites)
18771
0
{
18772
0
    int ret = 0;
18773
0
    word16 offset = 0;
18774
0
    byte isRequest = (msgType == client_hello ||
18775
0
                      msgType == certificate_request);
18776
18777
0
#ifdef HAVE_EXTENDED_MASTER
18778
0
    byte pendingEMS = 0;
18779
0
#endif
18780
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
18781
    int pskDone = 0;
18782
#endif
18783
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
18784
    !defined(NO_PSK)
18785
    int secondClientHello = 0;
18786
    int prevHasPskWithCert = 0;
18787
#endif
18788
0
    byte seenType[SEMAPHORE_SIZE];  /* Seen known extensions. */
18789
18790
0
    if (!ssl || !input || (isRequest && !suites))
18791
0
        return BAD_FUNC_ARG;
18792
18793
    /* No known extensions seen yet. */
18794
0
    XMEMSET(seenType, 0, sizeof(seenType));
18795
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
18796
    !defined(NO_PSK)
18797
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == client_hello &&
18798
            ssl->msgsReceived.got_client_hello == 2) {
18799
        secondClientHello = 1;
18800
        prevHasPskWithCert =
18801
            TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) != NULL;
18802
    }
18803
#endif
18804
18805
0
    while (ret == 0 && offset < length) {
18806
0
        word16 type;
18807
0
        word16 size;
18808
18809
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
18810
        if (msgType == client_hello && pskDone) {
18811
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
18812
            return PSK_KEY_ERROR;
18813
        }
18814
#endif
18815
18816
0
        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
18817
0
            return BUFFER_ERROR;
18818
18819
0
        ato16(input + offset, &type);
18820
0
        offset += HELLO_EXT_TYPE_SZ;
18821
18822
0
        ato16(input + offset, &size);
18823
0
        offset += OPAQUE16_LEN;
18824
18825
        /* Check we have a bit for extension type. */
18826
0
        if ((type <= SEMAPHORE_MAX_DIRECT_TYPE)
18827
0
            || (type == TLSX_RENEGOTIATION_INFO)
18828
        #ifdef WOLFSSL_QUIC
18829
            || (type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT)
18830
        #endif
18831
        #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
18832
            || (type == TLSX_ECH)
18833
        #endif
18834
        #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
18835
            || (type == TLSX_CKS)
18836
        #endif
18837
0
            )
18838
0
        {
18839
            /* Detect duplicate recognized extensions. */
18840
0
            if (IS_OFF(seenType, TLSX_ToSemaphore(type))) {
18841
0
                TURN_ON(seenType, TLSX_ToSemaphore(type));
18842
0
            }
18843
0
            else {
18844
0
                return DUPLICATE_TLS_EXT_E;
18845
0
            }
18846
0
        }
18847
#if defined(HAVE_TLS_EXTENSIONS) && defined(OPENSSL_EXTRA)
18848
        /* The semaphore-based duplicate detection above does not cover
18849
         * application-registered custom extensions whose arbitrary type is
18850
         * above the semaphore range. Match OpenSSL, which gives each registered
18851
         * custom extension its own slot and rejects repeats: scan the
18852
         * already-parsed portion of this message for an earlier extension of
18853
         * the same type. (Types <= SEMAPHORE_MAX_DIRECT_TYPE are handled by
18854
         * the block above.) */
18855
        else if (type > SEMAPHORE_MAX_DIRECT_TYPE &&
18856
                TLSX_CustomExt_IsRegistered(ssl, type)) {
18857
            word32 scan = 0;
18858
            word32 upto = (word32)offset - HELLO_EXT_TYPE_SZ - OPAQUE16_LEN;
18859
            while (scan + HELLO_EXT_TYPE_SZ + OPAQUE16_LEN <= upto) {
18860
                word16 sT, sS;
18861
                ato16(input + scan, &sT);
18862
                ato16(input + scan + HELLO_EXT_TYPE_SZ, &sS);
18863
                if (sT == type)
18864
                    return DUPLICATE_TLS_EXT_E;
18865
                scan += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN + sS;
18866
            }
18867
        }
18868
#endif
18869
18870
0
        if (length - offset < size)
18871
0
            return BUFFER_ERROR;
18872
18873
#ifdef OPENSSL_EXTRA
18874
        /* Report the extension to the debug callback, like OpenSSL does in
18875
         * tls1_handle_extensions(). client_server is 1 when this SSL object
18876
         * is a client. */
18877
        if (ssl->tlsextDebugCb != NULL) {
18878
            ssl->tlsextDebugCb(ssl,
18879
                    (int)(ssl->options.side == WOLFSSL_CLIENT_END), (int)type,
18880
                    input + offset, (int)size, ssl->tlsextDebugArg);
18881
        }
18882
#endif
18883
18884
        /* Check minimum size required for TLSX, even if disabled */
18885
0
        switch (msgType) {
18886
0
            #ifndef NO_WOLFSSL_SERVER
18887
0
            case client_hello:
18888
0
                if (size < TLSX_GET_MIN_SIZE_CLIENT(&type)){
18889
0
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
18890
0
                    return BUFFER_ERROR;
18891
0
                }
18892
0
            break;
18893
0
            #endif
18894
0
            #ifndef NO_WOLFSSL_CLIENT
18895
0
            case server_hello:
18896
0
            case hello_retry_request:
18897
0
                if (size < TLSX_GET_MIN_SIZE_SERVER(&type)){
18898
0
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
18899
0
                    return BUFFER_ERROR;
18900
0
                }
18901
0
            break;
18902
0
            #endif
18903
0
            default:
18904
0
            break;
18905
0
        }
18906
18907
0
#ifdef WOLFSSL_TLS13
18908
        /* RFC 8446 4.4.2: extensions in a Certificate message MUST
18909
         * correspond to ones offered in our prior ClientHello (client) or
18910
         * CertificateRequest (server). Reject anything we did not offer, but a
18911
         * CTX-level API leaves the extension on ctx->extensions, so look there
18912
         * too before concluding it was never offered. */
18913
0
        if (msgType == certificate &&
18914
0
            IsAtLeastTLSv1_3(ssl->version) &&
18915
0
            TLSX_Find(ssl->extensions, (TLSX_Type)type) == NULL &&
18916
0
            (ssl->ctx == NULL ||
18917
0
             TLSX_Find(ssl->ctx->extensions, (TLSX_Type)type) == NULL)) {
18918
0
            WOLFSSL_MSG("Cert-msg extension not offered in CH/CR");
18919
0
            SendAlert(ssl, alert_fatal, unsupported_extension);
18920
0
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
18921
0
            return UNSUPPORTED_EXTENSION;
18922
0
        }
18923
0
#endif
18924
18925
0
        switch (type) {
18926
0
#ifdef HAVE_SNI
18927
0
            case TLSX_SERVER_NAME:
18928
0
                WOLFSSL_MSG("SNI extension received");
18929
            #ifdef WOLFSSL_DEBUG_TLS
18930
                WOLFSSL_BUFFER(input + offset, size);
18931
            #endif
18932
18933
0
#ifdef WOLFSSL_TLS13
18934
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18935
0
                    if (msgType != client_hello &&
18936
0
                        msgType != encrypted_extensions)
18937
0
                        return EXT_NOT_ALLOWED;
18938
0
                }
18939
0
                else
18940
0
#endif
18941
0
                {
18942
0
                    if (msgType != client_hello &&
18943
0
                        msgType != server_hello)
18944
0
                        return EXT_NOT_ALLOWED;
18945
0
                }
18946
0
                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
18947
0
                break;
18948
0
#endif
18949
18950
0
            case TLSX_TRUSTED_CA_KEYS:
18951
0
                WOLFSSL_MSG("Trusted CA extension received");
18952
            #ifdef WOLFSSL_DEBUG_TLS
18953
                WOLFSSL_BUFFER(input + offset, size);
18954
            #endif
18955
18956
0
#ifdef WOLFSSL_TLS13
18957
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18958
0
                    if (msgType != client_hello) {
18959
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18960
0
                        return EXT_NOT_ALLOWED;
18961
0
                    }
18962
0
                    break;
18963
0
                }
18964
0
                else
18965
0
#endif
18966
0
                {
18967
0
                    if (msgType != client_hello &&
18968
0
                        msgType != server_hello)
18969
0
                        return EXT_NOT_ALLOWED;
18970
0
                }
18971
0
                ret = TCA_PARSE(ssl, input + offset, size, isRequest);
18972
0
                break;
18973
18974
0
            case TLSX_MAX_FRAGMENT_LENGTH:
18975
0
                WOLFSSL_MSG("Max Fragment Length extension received");
18976
            #ifdef WOLFSSL_DEBUG_TLS
18977
                WOLFSSL_BUFFER(input + offset, size);
18978
            #endif
18979
18980
0
#ifdef WOLFSSL_TLS13
18981
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18982
0
                    if (msgType != client_hello &&
18983
0
                        msgType != encrypted_extensions) {
18984
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18985
0
                        return EXT_NOT_ALLOWED;
18986
0
                    }
18987
0
                }
18988
0
                else
18989
0
#endif
18990
0
                {
18991
0
                    if (msgType != client_hello &&
18992
0
                        msgType != server_hello) {
18993
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18994
0
                        return EXT_NOT_ALLOWED;
18995
0
                    }
18996
0
                }
18997
0
                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
18998
0
                break;
18999
19000
0
            case TLSX_TRUNCATED_HMAC:
19001
0
                WOLFSSL_MSG("Truncated HMAC extension received");
19002
            #ifdef WOLFSSL_DEBUG_TLS
19003
                WOLFSSL_BUFFER(input + offset, size);
19004
            #endif
19005
19006
0
#ifdef WOLFSSL_TLS13
19007
0
                if (IsAtLeastTLSv1_3(ssl->version))
19008
0
                    break;
19009
0
#endif
19010
0
                if (msgType != client_hello)
19011
0
                    return EXT_NOT_ALLOWED;
19012
0
                ret = THM_PARSE(ssl, input + offset, size, isRequest);
19013
0
                break;
19014
19015
0
            case TLSX_SUPPORTED_GROUPS:
19016
0
                WOLFSSL_MSG("Supported Groups extension received");
19017
            #ifdef WOLFSSL_DEBUG_TLS
19018
                WOLFSSL_BUFFER(input + offset, size);
19019
            #endif
19020
19021
0
#ifdef WOLFSSL_TLS13
19022
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
19023
0
                    if (msgType != client_hello &&
19024
0
                        msgType != encrypted_extensions) {
19025
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19026
0
                        return EXT_NOT_ALLOWED;
19027
0
                    }
19028
0
                }
19029
0
                else
19030
0
#endif
19031
0
                {
19032
0
                    if (msgType != client_hello) {
19033
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19034
0
                        return EXT_NOT_ALLOWED;
19035
0
                    }
19036
0
                }
19037
0
                ret = EC_PARSE(ssl, input + offset, size, isRequest,
19038
0
                        &ssl->extensions);
19039
0
                break;
19040
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
19041
            case TLSX_CKS:
19042
                WOLFSSL_MSG("CKS extension received");
19043
                if (msgType != client_hello &&
19044
                     msgType != encrypted_extensions) {
19045
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19046
                        return EXT_NOT_ALLOWED;
19047
                }
19048
                ret = TLSX_CKS_Parse(ssl, (byte *)(input + offset), size,
19049
                                     &ssl->extensions);
19050
            break;
19051
#endif /* WOLFSSL_DUAL_ALG_CERTS */
19052
0
            case TLSX_EC_POINT_FORMATS:
19053
0
                WOLFSSL_MSG("Point Formats extension received");
19054
            #ifdef WOLFSSL_DEBUG_TLS
19055
                WOLFSSL_BUFFER(input + offset, size);
19056
            #endif
19057
19058
0
#ifdef WOLFSSL_TLS13
19059
0
                if (IsAtLeastTLSv1_3(ssl->version))
19060
0
                    break;
19061
0
#endif
19062
0
                if (msgType != client_hello &&
19063
0
                    msgType != server_hello) {
19064
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19065
0
                    return EXT_NOT_ALLOWED;
19066
0
                }
19067
19068
0
                ret = PF_PARSE(ssl, input + offset, size, isRequest);
19069
0
                break;
19070
19071
0
            case TLSX_STATUS_REQUEST:
19072
0
                WOLFSSL_MSG("Certificate Status Request extension received");
19073
            #ifdef WOLFSSL_DEBUG_TLS
19074
                WOLFSSL_BUFFER(input + offset, size);
19075
            #endif
19076
19077
0
#ifdef WOLFSSL_TLS13
19078
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
19079
0
                    if (msgType != client_hello &&
19080
0
                        msgType != certificate_request &&
19081
0
                        msgType != certificate)
19082
0
                        return EXT_NOT_ALLOWED;
19083
0
                }
19084
0
                else
19085
0
 #endif
19086
0
                {
19087
0
                    if (msgType != client_hello &&
19088
0
                        msgType != server_hello)
19089
0
                        return EXT_NOT_ALLOWED;
19090
0
                }
19091
0
                ret = CSR_PARSE(ssl, input + offset, size, isRequest);
19092
0
                break;
19093
19094
0
            case TLSX_STATUS_REQUEST_V2:
19095
0
                WOLFSSL_MSG("Certificate Status Request v2 extension received");
19096
            #ifdef WOLFSSL_DEBUG_TLS
19097
                WOLFSSL_BUFFER(input + offset, size);
19098
            #endif
19099
19100
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
19101
                if (IsAtLeastTLSv1_3(ssl->version)) {
19102
                    /* RFC 8446 Section 4.4.2.1: a TLS 1.3 server must not send
19103
                     * this extension in EncryptedExtensions, CertificateRequest
19104
                     * or Certificate. ClientHello stays allowed because the
19105
                     * peer may still negotiate a lower version, where the
19106
                     * extension does apply. */
19107
                    if (msgType != client_hello)
19108
                        return EXT_NOT_ALLOWED;
19109
                }
19110
                else
19111
#endif
19112
0
                {
19113
0
                    if (msgType != client_hello &&
19114
0
                        msgType != server_hello)
19115
0
                        return EXT_NOT_ALLOWED;
19116
0
                }
19117
0
                ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
19118
0
                break;
19119
19120
0
#ifdef HAVE_EXTENDED_MASTER
19121
0
            case HELLO_EXT_EXTMS:
19122
0
                WOLFSSL_MSG("Extended Master Secret extension received");
19123
            #ifdef WOLFSSL_DEBUG_TLS
19124
                WOLFSSL_BUFFER(input + offset, size);
19125
            #endif
19126
19127
0
#if defined(WOLFSSL_TLS13)
19128
0
                if (IsAtLeastTLSv1_3(ssl->version))
19129
0
                    break;
19130
0
#endif
19131
0
                if (msgType != client_hello &&
19132
0
                    msgType != server_hello)
19133
0
                    return EXT_NOT_ALLOWED;
19134
0
                if (size != 0)
19135
0
                    return BUFFER_ERROR;
19136
19137
                /* Honor a user request to disable EMS by ignoring the peer's
19138
                 * extension rather than enabling it. */
19139
0
                if (!ssl->options.disableEMS) {
19140
0
#ifndef NO_WOLFSSL_SERVER
19141
0
                    if (isRequest)
19142
0
                        ssl->options.haveEMS = 1;
19143
0
#endif
19144
0
                    pendingEMS = 1;
19145
0
                }
19146
0
                break;
19147
0
#endif
19148
19149
0
            case TLSX_RENEGOTIATION_INFO:
19150
0
                WOLFSSL_MSG("Secure Renegotiation extension received");
19151
            #ifdef WOLFSSL_DEBUG_TLS
19152
                WOLFSSL_BUFFER(input + offset, size);
19153
            #endif
19154
19155
0
#ifdef WOLFSSL_TLS13
19156
0
                if (IsAtLeastTLSv1_3(ssl->version))
19157
0
                    break;
19158
0
#endif
19159
0
                if (msgType != client_hello &&
19160
0
                    msgType != server_hello)
19161
0
                    return EXT_NOT_ALLOWED;
19162
0
                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
19163
0
                break;
19164
19165
0
            case TLSX_SESSION_TICKET:
19166
0
                WOLFSSL_MSG("Session Ticket extension received");
19167
            #ifdef WOLFSSL_DEBUG_TLS
19168
                WOLFSSL_BUFFER(input + offset, size);
19169
            #endif
19170
19171
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
19172
                if (IsAtLeastTLSv1_3(ssl->version)) {
19173
                    if (msgType != client_hello)
19174
                        return EXT_NOT_ALLOWED;
19175
                }
19176
                else
19177
#endif
19178
0
                {
19179
0
                    if (msgType != client_hello &&
19180
0
                        msgType != server_hello)
19181
0
                        return EXT_NOT_ALLOWED;
19182
0
                }
19183
0
                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
19184
0
                break;
19185
19186
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
19187
0
                WOLFSSL_MSG("ALPN extension received");
19188
19189
            #ifdef WOLFSSL_DEBUG_TLS
19190
                WOLFSSL_BUFFER(input + offset, size);
19191
            #endif
19192
19193
#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
19194
                if (IsAtLeastTLSv1_3(ssl->version)) {
19195
                    if (msgType != client_hello &&
19196
                        msgType != encrypted_extensions)
19197
                        return EXT_NOT_ALLOWED;
19198
                }
19199
                else
19200
#endif
19201
0
                {
19202
0
                    if (msgType != client_hello &&
19203
0
                        msgType != server_hello)
19204
0
                        return EXT_NOT_ALLOWED;
19205
0
                }
19206
0
                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
19207
0
                break;
19208
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
19209
0
            case TLSX_SIGNATURE_ALGORITHMS:
19210
0
                WOLFSSL_MSG("Signature Algorithms extension received");
19211
            #ifdef WOLFSSL_DEBUG_TLS
19212
                WOLFSSL_BUFFER(input + offset, size);
19213
            #endif
19214
19215
0
                if (!IsAtLeastTLSv1_2(ssl))
19216
0
                    break;
19217
0
            #ifdef WOLFSSL_TLS13
19218
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
19219
0
                    if (msgType != client_hello &&
19220
0
                        msgType != certificate_request)
19221
0
                        return EXT_NOT_ALLOWED;
19222
0
                }
19223
0
                else
19224
0
            #endif
19225
0
                {
19226
0
                    if (msgType != client_hello)
19227
0
                        return EXT_NOT_ALLOWED;
19228
0
                }
19229
0
                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
19230
0
                break;
19231
0
#endif
19232
19233
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
19234
0
            case TLSX_ENCRYPT_THEN_MAC:
19235
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension received");
19236
19237
                /* Ignore for TLS 1.3+ */
19238
0
                if (IsAtLeastTLSv1_3(ssl->version))
19239
0
                    break;
19240
0
                if (msgType != client_hello &&
19241
0
                    msgType != server_hello)
19242
0
                    return EXT_NOT_ALLOWED;
19243
19244
0
                ret = ETM_PARSE(ssl, input + offset, size, msgType);
19245
0
                break;
19246
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
19247
19248
0
#ifdef WOLFSSL_TLS13
19249
0
            case TLSX_SUPPORTED_VERSIONS:
19250
            #ifdef WOLFSSL_DEBUG_TLS
19251
                WOLFSSL_BUFFER(input + offset, size);
19252
            #endif
19253
0
                if (msgType != client_hello &&
19254
0
                    msgType != server_hello &&
19255
0
                    msgType != hello_retry_request)
19256
0
                    return EXT_NOT_ALLOWED;
19257
19258
                /* RFC 8446 Section 4.2.1: "A server which negotiates a version
19259
                 * of TLS prior to TLS 1.3 MUST set ServerHello.version and MUST
19260
                 * NOT send the "supported_versions" extension."  If TLS version
19261
                 * is <1.3, supported_versions is invalid. */
19262
0
                if (msgType == server_hello &&
19263
0
                        !IsAtLeastTLSv1_3(ssl->version)) {
19264
0
                    WOLFSSL_MSG("Supported Versions in older ServerHello");
19265
0
                    WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
19266
0
                    return VERSION_ERROR;
19267
0
                }
19268
19269
0
                WOLFSSL_MSG("Skipping Supported Versions - already processed");
19270
0
                break;
19271
19272
0
            case TLSX_COOKIE:
19273
0
                WOLFSSL_MSG("Cookie extension received");
19274
            #ifdef WOLFSSL_DEBUG_TLS
19275
                WOLFSSL_BUFFER(input + offset, size);
19276
            #endif
19277
0
                if (!IsAtLeastTLSv1_3(ssl->version))
19278
0
                    break;
19279
19280
0
                if (msgType != client_hello &&
19281
0
                    msgType != hello_retry_request) {
19282
0
                    return EXT_NOT_ALLOWED;
19283
0
                }
19284
19285
0
                ret = CKE_PARSE(ssl, input + offset, size, msgType);
19286
0
                break;
19287
19288
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
19289
            case TLSX_PRE_SHARED_KEY:
19290
                WOLFSSL_MSG("Pre-Shared Key extension received");
19291
            #ifdef WOLFSSL_DEBUG_TLS
19292
                WOLFSSL_BUFFER(input + offset, size);
19293
            #endif
19294
19295
                if (!IsAtLeastTLSv1_3(ssl->version))
19296
                    break;
19297
19298
                if (msgType != client_hello &&
19299
                    msgType != server_hello) {
19300
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19301
                    return EXT_NOT_ALLOWED;
19302
                }
19303
19304
                ret = PSK_PARSE(ssl, input + offset, size, msgType);
19305
                pskDone = 1;
19306
                break;
19307
19308
            case TLSX_PSK_KEY_EXCHANGE_MODES:
19309
                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
19310
            #ifdef WOLFSSL_DEBUG_TLS
19311
                WOLFSSL_BUFFER(input + offset, size);
19312
            #endif
19313
19314
                if (!IsAtLeastTLSv1_3(ssl->version))
19315
                    break;
19316
19317
                if (msgType != client_hello) {
19318
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19319
                    return EXT_NOT_ALLOWED;
19320
                }
19321
19322
                ret = PKM_PARSE(ssl, input + offset, size, msgType);
19323
                break;
19324
19325
    #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
19326
            case TLSX_CERT_WITH_EXTERN_PSK:
19327
                WOLFSSL_MSG("Cert with external PSK extension received");
19328
            #ifdef WOLFSSL_DEBUG_TLS
19329
                WOLFSSL_BUFFER(input + offset, size);
19330
            #endif
19331
19332
                if (!IsAtLeastTLSv1_3(ssl->version))
19333
                    break;
19334
19335
                if (msgType != client_hello && msgType != server_hello) {
19336
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19337
                    return EXT_NOT_ALLOWED;
19338
                }
19339
                if (size != 0) {
19340
                    WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
19341
                    return BUFFER_ERROR;
19342
                }
19343
19344
                ret = PSK_WITH_CERT_PARSE(ssl, msgType);
19345
                break;
19346
    #endif
19347
    #endif
19348
19349
    #ifdef WOLFSSL_EARLY_DATA
19350
            case TLSX_EARLY_DATA:
19351
                WOLFSSL_MSG("Early Data extension received");
19352
            #ifdef WOLFSSL_DEBUG_TLS
19353
                WOLFSSL_BUFFER(input + offset, size);
19354
            #endif
19355
19356
                if (!IsAtLeastTLSv1_3(ssl->version))
19357
                    break;
19358
19359
                if (msgType != client_hello && msgType != session_ticket &&
19360
                    msgType != encrypted_extensions) {
19361
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19362
                    return EXT_NOT_ALLOWED;
19363
                }
19364
                ret = EDI_PARSE(ssl, input + offset, size, msgType);
19365
                break;
19366
    #endif
19367
19368
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
19369
            case TLSX_POST_HANDSHAKE_AUTH:
19370
                WOLFSSL_MSG("Post Handshake Authentication extension received");
19371
            #ifdef WOLFSSL_DEBUG_TLS
19372
                WOLFSSL_BUFFER(input + offset, size);
19373
            #endif
19374
19375
                if (!IsAtLeastTLSv1_3(ssl->version))
19376
                    break;
19377
19378
                if (msgType != client_hello) {
19379
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19380
                    return EXT_NOT_ALLOWED;
19381
                }
19382
19383
                ret = PHA_PARSE(ssl, input + offset, size, msgType);
19384
                break;
19385
    #endif
19386
19387
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
19388
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
19389
0
                WOLFSSL_MSG("Signature Algorithms extension received");
19390
            #ifdef WOLFSSL_DEBUG_TLS
19391
                WOLFSSL_BUFFER(input + offset, size);
19392
            #endif
19393
19394
0
                if (!IsAtLeastTLSv1_3(ssl->version))
19395
0
                    break;
19396
19397
0
                if (msgType != client_hello &&
19398
0
                        msgType != certificate_request) {
19399
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19400
0
                    return EXT_NOT_ALLOWED;
19401
0
                }
19402
19403
0
                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
19404
0
                break;
19405
0
    #endif
19406
19407
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
19408
0
            case TLSX_CERTIFICATE_AUTHORITIES:
19409
0
                WOLFSSL_MSG("Certificate Authorities extension received");
19410
            #ifdef WOLFSSL_DEBUG_TLS
19411
                WOLFSSL_BUFFER(input + offset, size);
19412
            #endif
19413
19414
0
                if (!IsAtLeastTLSv1_3(ssl->version))
19415
0
                    break;
19416
19417
0
                if (msgType != client_hello &&
19418
0
                        msgType != certificate_request) {
19419
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19420
0
                    return EXT_NOT_ALLOWED;
19421
0
                }
19422
19423
0
                ret = CAN_PARSE(ssl, input + offset, size, isRequest);
19424
0
                break;
19425
0
    #endif
19426
19427
0
            case TLSX_KEY_SHARE:
19428
0
                WOLFSSL_MSG("Key Share extension received");
19429
            #ifdef WOLFSSL_DEBUG_TLS
19430
                WOLFSSL_BUFFER(input + offset, size);
19431
            #endif
19432
19433
0
    #ifdef HAVE_SUPPORTED_CURVES
19434
0
                if (!IsAtLeastTLSv1_3(ssl->version))
19435
0
                    break;
19436
19437
0
                if (msgType != client_hello && msgType != server_hello &&
19438
0
                        msgType != hello_retry_request) {
19439
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19440
0
                    return EXT_NOT_ALLOWED;
19441
0
                }
19442
0
    #endif
19443
19444
0
                ret = KS_PARSE(ssl, input + offset, size, msgType);
19445
0
                break;
19446
0
#endif
19447
#ifdef WOLFSSL_SRTP
19448
            case TLSX_USE_SRTP:
19449
                WOLFSSL_MSG("Use SRTP extension received");
19450
19451
#if defined(WOLFSSL_TLS13)
19452
                if (IsAtLeastTLSv1_3(ssl->version)) {
19453
                    if (msgType != client_hello &&
19454
                        msgType != encrypted_extensions)
19455
                        return EXT_NOT_ALLOWED;
19456
                }
19457
                else
19458
#endif
19459
                {
19460
                    if (msgType != client_hello &&
19461
                        msgType != server_hello)
19462
                        return EXT_NOT_ALLOWED;
19463
                }
19464
                ret = SRTP_PARSE(ssl, input + offset, size, isRequest);
19465
                break;
19466
#endif
19467
#ifdef WOLFSSL_QUIC
19468
            case TLSX_KEY_QUIC_TP_PARAMS:
19469
                FALL_THROUGH;
19470
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
19471
                WOLFSSL_MSG("QUIC transport parameter received");
19472
            #ifdef WOLFSSL_DEBUG_TLS
19473
                WOLFSSL_BUFFER(input + offset, size);
19474
            #endif
19475
19476
                if (IsAtLeastTLSv1_3(ssl->version) &&
19477
                        msgType != client_hello &&
19478
                        msgType != encrypted_extensions) {
19479
                    return EXT_NOT_ALLOWED;
19480
                }
19481
                else if (!IsAtLeastTLSv1_3(ssl->version) &&
19482
                         msgType == encrypted_extensions) {
19483
                    return EXT_NOT_ALLOWED;
19484
                }
19485
                else if (WOLFSSL_IS_QUIC(ssl)) {
19486
                    ret = QTP_PARSE(ssl, input + offset, size, type, msgType);
19487
                }
19488
                else {
19489
                    WOLFSSL_MSG("QUIC transport param TLS extension type, but no QUIC");
19490
                    SendAlert(ssl, alert_fatal, unsupported_extension);
19491
                    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
19492
                    return UNSUPPORTED_EXTENSION;
19493
                }
19494
                break;
19495
#endif /* WOLFSSL_QUIC */
19496
#if defined(WOLFSSL_DTLS_CID)
19497
            case TLSX_CONNECTION_ID:
19498
                if (msgType != client_hello && msgType != server_hello)
19499
                    return EXT_NOT_ALLOWED;
19500
19501
                WOLFSSL_MSG("ConnectionID extension received");
19502
                ret = CID_PARSE(ssl, input + offset, size, isRequest);
19503
                break;
19504
19505
#endif /* defined(WOLFSSL_DTLS_CID) */
19506
#if defined(HAVE_RPK)
19507
            case TLSX_CLIENT_CERTIFICATE_TYPE:
19508
                WOLFSSL_MSG("Client Certificate Type extension received");
19509
#if defined(WOLFSSL_TLS13)
19510
                /* RFC 8446, Section 4.2 (Extensions), client_certificate_type
19511
                   and server_certificate_type MUST be sent in ClientHello(CH)
19512
                   or EncryptedExtensions(EE) */
19513
                if (IsAtLeastTLSv1_3(ssl->version)) {
19514
                    if (msgType != client_hello &&
19515
                        msgType != encrypted_extensions) {
19516
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19517
                        return EXT_NOT_ALLOWED;
19518
                    }
19519
                }
19520
                else
19521
#endif
19522
                {
19523
                    /* TLS 1.2: allowed in CH and SH (RFC 7250) */
19524
                    if (msgType != client_hello &&
19525
                        msgType != server_hello) {
19526
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19527
                        return EXT_NOT_ALLOWED;
19528
                    }
19529
                }
19530
                ret = CCT_PARSE(ssl, input + offset, size, msgType);
19531
                break;
19532
19533
            case TLSX_SERVER_CERTIFICATE_TYPE:
19534
                WOLFSSL_MSG("Server Certificate Type extension received");
19535
#if defined(WOLFSSL_TLS13)
19536
                /* RFC 8446, Section 4.2 (Extensions) */
19537
                if (IsAtLeastTLSv1_3(ssl->version)) {
19538
                    if (msgType != client_hello &&
19539
                        msgType != encrypted_extensions) {
19540
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19541
                        return EXT_NOT_ALLOWED;
19542
                    }
19543
                }
19544
                else
19545
#endif
19546
                {
19547
                    /* TLS 1.2: allowed in CH and SH (RFC 7250) */
19548
                    if (msgType != client_hello &&
19549
                        msgType != server_hello) {
19550
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19551
                        return EXT_NOT_ALLOWED;
19552
                    }
19553
                }
19554
                ret = SCT_PARSE(ssl, input + offset, size, msgType);
19555
                break;
19556
#endif /* HAVE_RPK */
19557
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
19558
            case TLSX_ECH:
19559
                WOLFSSL_MSG("ECH extension received");
19560
                if (!IsAtLeastTLSv1_3(ssl->version))
19561
                    break;
19562
19563
                if (msgType != client_hello &&
19564
                    msgType != encrypted_extensions &&
19565
                    msgType != hello_retry_request) {
19566
                    return EXT_NOT_ALLOWED;
19567
                }
19568
19569
                ret = ECH_PARSE(ssl, input + offset, size, msgType);
19570
                break;
19571
            case TLSXT_ECH_OUTER_EXTENSIONS:
19572
                /* RFC 9849 s5.1: ech_outer_extensions MUST only appear in
19573
                 * the EncodedClientHelloInner */
19574
                WOLFSSL_MSG("ech_outer_extensions in plaintext message");
19575
                WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
19576
                return INVALID_PARAMETER;
19577
#endif
19578
0
            default:
19579
#if defined(HAVE_TLS_EXTENSIONS) && defined(OPENSSL_EXTRA)
19580
                {
19581
                    /* Custom (application-defined) extension handler, if one
19582
                     * was registered for this type. */
19583
                    int customFound = 0;
19584
                    ret = TLSX_CustomExt_Parse(ssl, msgType, type,
19585
                                               input + offset, size,
19586
                                               &customFound);
19587
                    if (ret != 0)
19588
                        return ret;
19589
                    if (customFound)
19590
                        break;
19591
                }
19592
#endif
19593
0
                WOLFSSL_MSG("Unknown TLS extension type");
19594
0
#if defined(WOLFSSL_TLS13)
19595
                /* RFC 8446 Sec. 4.2: a TLS 1.3 client MUST abort with an
19596
                 * unsupported_extension alert when it receives an extension
19597
                 * "response" that was not advertised in the ClientHello. The
19598
                 * rule applies only to messages whose extensions are responses
19599
                 * to the ClientHello: ServerHello, HelloRetryRequest,
19600
                 * EncryptedExtensions and Certificate.
19601
                 *
19602
                 * Extensions in CertificateRequest and NewSessionTicket are
19603
                 * independent server-initiated payloads, not responses, and
19604
                 * per RFC 8701 (GREASE) the server MAY include unknown
19605
                 * (GREASE) extension types there which the client MUST treat
19606
                 * like any other unknown value (i.e. ignore them). */
19607
0
                if (IsAtLeastTLSv1_3(ssl->version) &&
19608
0
                        (msgType == server_hello ||
19609
0
                         msgType == hello_retry_request ||
19610
0
                         msgType == encrypted_extensions ||
19611
0
                         msgType == certificate)) {
19612
0
                    SendAlert((WOLFSSL*)ssl, alert_fatal, unsupported_extension);
19613
0
                    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
19614
0
                    return UNSUPPORTED_EXTENSION;
19615
0
                }
19616
0
#endif
19617
0
        }
19618
19619
        /* offset should be updated here! */
19620
0
        offset += size;
19621
0
    }
19622
19623
0
#ifdef HAVE_EXTENDED_MASTER
19624
0
    if (IsAtLeastTLSv1_3(ssl->version) &&
19625
0
        (msgType == hello_retry_request || msgType == hello_verify_request ||
19626
0
         msgType == session_ticket)) {
19627
        /* Don't change EMS status until server_hello received.
19628
         * Second ClientHello must have same extensions.
19629
         * NewSessionTicket is post-handshake and never carries the extension,
19630
         * so its absence there says nothing about what was negotiated.
19631
         */
19632
0
    }
19633
0
    else if (!isRequest && ssl->options.haveEMS && !pendingEMS)
19634
0
        ssl->options.haveEMS = 0;
19635
0
#endif
19636
#if defined(WOLFSSL_TLS13) && !defined(NO_PSK)
19637
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == server_hello &&
19638
        IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE))) {
19639
        ssl->options.noPskDheKe = 1;
19640
    }
19641
#endif
19642
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
19643
    !defined(NO_PSK)
19644
    if (IsAtLeastTLSv1_3(ssl->version)) {
19645
        int hasPskWithCert = !IS_OFF(seenType,
19646
            TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
19647
        if (hasPskWithCert && ssl->options.certWithExternPsk) {
19648
            int hasPsk = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
19649
            int hasPskModes = !IS_OFF(seenType,
19650
                TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
19651
            int hasKeyShare = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE));
19652
            int hasSg = !IS_OFF(seenType,
19653
                TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
19654
            int hasSigAlg = !IS_OFF(seenType,
19655
                TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
19656
#ifdef WOLFSSL_EARLY_DATA
19657
            int hasEarlyData = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_EARLY_DATA));
19658
#endif
19659
19660
            if (msgType == client_hello && isRequest) {
19661
                TLSX* pskm;
19662
                /* RFC 9973: CH2 after HRR must keep CH1's extension set. */
19663
                if (secondClientHello && !prevHasPskWithCert) {
19664
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19665
                    return EXT_NOT_ALLOWED;
19666
                }
19667
                /* RFC 9973: cert_with_extern_psk depends on these extensions. */
19668
                if (!hasPsk || !hasPskModes || !hasKeyShare || !hasSg ||
19669
                    !hasSigAlg) {
19670
                    WOLFSSL_ERROR_VERBOSE(EXT_MISSING);
19671
                    return EXT_MISSING;
19672
                }
19673
#ifdef WOLFSSL_EARLY_DATA
19674
                /* External PSK + certificate mode forbids 0-RTT in CH.
19675
                 * When WOLFSSL_EARLY_DATA is not defined there is no parser
19676
                 * case for TLSX_EARLY_DATA, so an incoming early_data
19677
                 * extension is treated as unknown and ignored per RFC 8446
19678
                 * Sect. 4.2 - no additional check is needed in that case. */
19679
                if (hasEarlyData) {
19680
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19681
                    return EXT_NOT_ALLOWED;
19682
                }
19683
#endif
19684
                pskm = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
19685
                /* RFC 9973 requires client support for psk_dhe_ke mode. */
19686
                if (pskm == NULL || (pskm->val & (1 << PSK_DHE_KE)) == 0) {
19687
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19688
                    return EXT_NOT_ALLOWED;
19689
                }
19690
            }
19691
            else if (msgType == server_hello && !isRequest) {
19692
                /* SH confirming cert_with_extern_psk must also confirm PSK and KSE. */
19693
                if (!hasPsk || !hasKeyShare) {
19694
                    WOLFSSL_ERROR_VERBOSE(EXT_MISSING);
19695
                    return EXT_MISSING;
19696
                }
19697
            }
19698
        }
19699
        else if (msgType == client_hello && isRequest && secondClientHello &&
19700
                prevHasPskWithCert) {
19701
            /* RFC 9973: reject dropping the extension in CH2 after HRR. */
19702
            WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
19703
            return EXT_NOT_ALLOWED;
19704
        }
19705
    }
19706
#endif
19707
0
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
19708
    /* RFC 8446 Section 9.2: ClientHello with KeyShare must
19709
     * contain SupportedGroups and vice-versa. */
19710
0
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == client_hello && isRequest) {
19711
0
        int hasKeyShare = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE));
19712
0
        int hasSupportedGroups = !IS_OFF(seenType,
19713
0
            TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
19714
19715
0
        if (hasKeyShare && !hasSupportedGroups) {
19716
0
            WOLFSSL_MSG("ClientHello with KeyShare extension missing required "
19717
0
                        "SupportedGroups extension");
19718
0
            return INCOMPLETE_DATA;
19719
0
        }
19720
0
        if (hasSupportedGroups && !hasKeyShare) {
19721
0
            WOLFSSL_MSG("ClientHello with SupportedGroups extension missing "
19722
0
                        "required KeyShare extension");
19723
0
            return INCOMPLETE_DATA;
19724
0
        }
19725
0
    }
19726
0
#endif
19727
19728
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
19729
    /* Reconcile ECH inner/outer extensions before verifying SNI so the verify
19730
     * pass sees the authoritative list */
19731
    if (ret == 0 && msgType == client_hello && isRequest &&
19732
            !ssl->options.echProcessingInner &&
19733
            ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
19734
        TLSX* echX = TLSX_Find(ssl->extensions, TLSX_ECH);
19735
        WOLFSSL_ECH* ech = NULL;
19736
        if (echX != NULL)
19737
            ech = (WOLFSSL_ECH*)echX->data;
19738
19739
        if (ech != NULL) {
19740
            if (ech->state == ECH_WRITE_NONE && ech->innerClientHello != NULL) {
19741
                /* ECH accepted: use private extensions
19742
                 * return early, inner hello needs to be parsed before VERIFY */
19743
                return TLSX_EchReplaceExtensions(ssl, ssl->options.echAccepted);
19744
            }
19745
            else {
19746
                /* If ECH was accepted in CH1 then CH2 MUST contain an ECH
19747
                 * extension */
19748
                if (ssl->options.serverState ==
19749
                            SERVER_HELLO_RETRY_REQUEST_COMPLETE &&
19750
                        ssl->options.echAccepted) {
19751
                    WOLFSSL_MSG("Client did not send an EncryptedClientHello "
19752
                                "extension");
19753
                    WOLFSSL_ERROR_VERBOSE(INCOMPLETE_DATA);
19754
                    return INCOMPLETE_DATA;
19755
                }
19756
                /* Otherwise ECH rejected: use public extensions */
19757
                if (ech->state == ECH_WRITE_NONE ||
19758
                        ech->state == ECH_WRITE_RETRY_CONFIGS) {
19759
                    ret = TLSX_EchReplaceExtensions(ssl,
19760
                        ssl->options.echAccepted);
19761
                    if (ret == 0 && ech->state == ECH_WRITE_NONE) {
19762
                        echX->resp = 0;
19763
                    }
19764
                }
19765
            }
19766
        }
19767
    }
19768
#endif
19769
19770
0
    if (ret == 0)
19771
0
        ret = SNI_VERIFY_PARSE(ssl, isRequest);
19772
0
    if (ret == 0)
19773
0
        ret = TCA_VERIFY_PARSE(ssl, isRequest);
19774
19775
0
    WOLFSSL_LEAVE("Leaving TLSX_Parse", ret);
19776
0
    return ret;
19777
0
}
19778
19779
/* undefining semaphore macros */
19780
#undef IS_OFF
19781
#undef TURN_ON
19782
#undef SEMAPHORE_SIZE
19783
19784
#endif /* HAVE_TLS_EXTENSIONS */
19785
19786
#ifndef NO_WOLFSSL_CLIENT
19787
19788
    WOLFSSL_METHOD* wolfTLS_client_method(void)
19789
0
    {
19790
0
        return wolfTLS_client_method_ex(NULL);
19791
0
    }
19792
    WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
19793
0
    {
19794
0
        WOLFSSL_METHOD* method =
19795
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19796
0
                                                     heap, DYNAMIC_TYPE_METHOD);
19797
0
        (void)heap;
19798
0
        WOLFSSL_ENTER("TLS_client_method_ex");
19799
0
        if (method) {
19800
0
        #if defined(WOLFSSL_TLS13)
19801
0
            InitSSL_Method(method, MakeTLSv1_3());
19802
        #elif !defined(WOLFSSL_NO_TLS12)
19803
            InitSSL_Method(method, MakeTLSv1_2());
19804
        #elif !defined(NO_OLD_TLS)
19805
            InitSSL_Method(method, MakeTLSv1_1());
19806
        #elif defined(WOLFSSL_ALLOW_TLSV10)
19807
            InitSSL_Method(method, MakeTLSv1());
19808
        #else
19809
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
19810
        #endif
19811
19812
0
            method->downgrade = 1;
19813
0
            method->side      = WOLFSSL_CLIENT_END;
19814
0
        }
19815
0
        return method;
19816
0
    }
19817
19818
#ifndef NO_OLD_TLS
19819
    #ifdef WOLFSSL_ALLOW_TLSV10
19820
    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
19821
    {
19822
        return wolfTLSv1_client_method_ex(NULL);
19823
    }
19824
    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
19825
    {
19826
        WOLFSSL_METHOD* method =
19827
                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19828
                                                     heap, DYNAMIC_TYPE_METHOD);
19829
        (void)heap;
19830
        WOLFSSL_ENTER("TLSv1_client_method_ex");
19831
        if (method)
19832
            InitSSL_Method(method, MakeTLSv1());
19833
        return method;
19834
    }
19835
    #endif /* WOLFSSL_ALLOW_TLSV10 */
19836
19837
    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
19838
    {
19839
        return wolfTLSv1_1_client_method_ex(NULL);
19840
    }
19841
    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
19842
    {
19843
        WOLFSSL_METHOD* method =
19844
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19845
                                                     heap, DYNAMIC_TYPE_METHOD);
19846
        (void)heap;
19847
        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
19848
        if (method)
19849
            InitSSL_Method(method, MakeTLSv1_1());
19850
        return method;
19851
    }
19852
#endif /* !NO_OLD_TLS */
19853
19854
#ifndef WOLFSSL_NO_TLS12
19855
    WOLFSSL_ABI
19856
    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
19857
0
    {
19858
0
        return wolfTLSv1_2_client_method_ex(NULL);
19859
0
    }
19860
    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
19861
0
    {
19862
0
        WOLFSSL_METHOD* method =
19863
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19864
0
                                                     heap, DYNAMIC_TYPE_METHOD);
19865
0
        (void)heap;
19866
0
        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
19867
0
        if (method)
19868
0
            InitSSL_Method(method, MakeTLSv1_2());
19869
0
        return method;
19870
0
    }
19871
#endif /* WOLFSSL_NO_TLS12 */
19872
19873
#ifdef WOLFSSL_TLS13
19874
    /* The TLS v1.3 client method data.
19875
     *
19876
     * returns the method data for a TLS v1.3 client.
19877
     */
19878
    WOLFSSL_ABI
19879
    WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
19880
0
    {
19881
0
        return wolfTLSv1_3_client_method_ex(NULL);
19882
0
    }
19883
19884
    /* The TLS v1.3 client method data.
19885
     *
19886
     * heap  The heap used for allocation.
19887
     * returns the method data for a TLS v1.3 client.
19888
     */
19889
    WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
19890
0
    {
19891
0
        WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
19892
0
                                 XMALLOC(sizeof(WOLFSSL_METHOD), heap,
19893
0
                                         DYNAMIC_TYPE_METHOD);
19894
0
        (void)heap;
19895
0
        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
19896
0
        if (method)
19897
0
            InitSSL_Method(method, MakeTLSv1_3());
19898
0
        return method;
19899
0
    }
19900
#endif /* WOLFSSL_TLS13 */
19901
19902
#ifdef WOLFSSL_DTLS
19903
19904
    WOLFSSL_METHOD* wolfDTLS_client_method(void)
19905
    {
19906
        return wolfDTLS_client_method_ex(NULL);
19907
    }
19908
    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
19909
    {
19910
        WOLFSSL_METHOD* method =
19911
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19912
                                                     heap, DYNAMIC_TYPE_METHOD);
19913
        (void)heap;
19914
        WOLFSSL_ENTER("DTLS_client_method_ex");
19915
        if (method) {
19916
        #if defined(WOLFSSL_DTLS13)
19917
            InitSSL_Method(method, MakeDTLSv1_3());
19918
        #elif !defined(WOLFSSL_NO_TLS12)
19919
            InitSSL_Method(method, MakeDTLSv1_2());
19920
        #elif !defined(NO_OLD_TLS)
19921
            InitSSL_Method(method, MakeDTLSv1());
19922
        #else
19923
            #error No DTLS version enabled!
19924
        #endif
19925
19926
            method->downgrade = 1;
19927
            method->side      = WOLFSSL_CLIENT_END;
19928
        }
19929
        return method;
19930
    }
19931
19932
    #ifndef NO_OLD_TLS
19933
    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
19934
    {
19935
        return wolfDTLSv1_client_method_ex(NULL);
19936
    }
19937
    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
19938
    {
19939
        WOLFSSL_METHOD* method =
19940
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19941
                                                 heap, DYNAMIC_TYPE_METHOD);
19942
        (void)heap;
19943
        WOLFSSL_ENTER("DTLSv1_client_method_ex");
19944
        if (method)
19945
            InitSSL_Method(method, MakeDTLSv1());
19946
        return method;
19947
    }
19948
    #endif  /* NO_OLD_TLS */
19949
19950
    #ifndef WOLFSSL_NO_TLS12
19951
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
19952
    {
19953
        return wolfDTLSv1_2_client_method_ex(NULL);
19954
    }
19955
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
19956
    {
19957
        WOLFSSL_METHOD* method =
19958
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19959
                                                 heap, DYNAMIC_TYPE_METHOD);
19960
        (void)heap;
19961
        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
19962
        if (method)
19963
            InitSSL_Method(method, MakeDTLSv1_2());
19964
        (void)heap;
19965
        return method;
19966
    }
19967
    #endif /* !WOLFSSL_NO_TLS12 */
19968
#endif /* WOLFSSL_DTLS */
19969
19970
#endif /* NO_WOLFSSL_CLIENT */
19971
19972
19973
/* EITHER SIDE METHODS */
19974
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
19975
    #ifndef NO_OLD_TLS
19976
    #ifdef WOLFSSL_ALLOW_TLSV10
19977
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
19978
     *
19979
     * Returns a pointer to a WOLFSSL_METHOD struct
19980
     */
19981
    WOLFSSL_METHOD* wolfTLSv1_method(void)
19982
    {
19983
        return wolfTLSv1_method_ex(NULL);
19984
    }
19985
    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
19986
    {
19987
        WOLFSSL_METHOD* m;
19988
        WOLFSSL_ENTER("TLSv1_method");
19989
    #ifndef NO_WOLFSSL_CLIENT
19990
        m = wolfTLSv1_client_method_ex(heap);
19991
    #else
19992
        m = wolfTLSv1_server_method_ex(heap);
19993
    #endif
19994
        if (m != NULL) {
19995
            m->side = WOLFSSL_NEITHER_END;
19996
        }
19997
19998
        return m;
19999
    }
20000
    #endif /* WOLFSSL_ALLOW_TLSV10 */
20001
20002
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
20003
     *
20004
     * Returns a pointer to a WOLFSSL_METHOD struct
20005
     */
20006
    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
20007
    {
20008
        return wolfTLSv1_1_method_ex(NULL);
20009
    }
20010
    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
20011
    {
20012
        WOLFSSL_METHOD* m;
20013
        WOLFSSL_ENTER("TLSv1_1_method");
20014
    #ifndef NO_WOLFSSL_CLIENT
20015
        m = wolfTLSv1_1_client_method_ex(heap);
20016
    #else
20017
        m = wolfTLSv1_1_server_method_ex(heap);
20018
    #endif
20019
        if (m != NULL) {
20020
            m->side = WOLFSSL_NEITHER_END;
20021
        }
20022
        return m;
20023
    }
20024
    #endif /* !NO_OLD_TLS */
20025
20026
    #ifndef WOLFSSL_NO_TLS12
20027
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
20028
     *
20029
     * Returns a pointer to a WOLFSSL_METHOD struct
20030
     */
20031
    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
20032
    {
20033
        return wolfTLSv1_2_method_ex(NULL);
20034
    }
20035
    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
20036
    {
20037
        WOLFSSL_METHOD* m;
20038
        WOLFSSL_ENTER("TLSv1_2_method");
20039
    #ifndef NO_WOLFSSL_CLIENT
20040
        m = wolfTLSv1_2_client_method_ex(heap);
20041
    #else
20042
        m = wolfTLSv1_2_server_method_ex(heap);
20043
    #endif
20044
        if (m != NULL) {
20045
            m->side = WOLFSSL_NEITHER_END;
20046
        }
20047
        return m;
20048
    }
20049
    #endif /* !WOLFSSL_NO_TLS12 */
20050
20051
    #ifdef WOLFSSL_TLS13
20052
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
20053
     *
20054
     * Returns a pointer to a WOLFSSL_METHOD struct
20055
     */
20056
    WOLFSSL_METHOD* wolfTLSv1_3_method(void)
20057
    {
20058
        return wolfTLSv1_3_method_ex(NULL);
20059
    }
20060
    WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
20061
    {
20062
        WOLFSSL_METHOD* m;
20063
        WOLFSSL_ENTER("TLSv1_3_method");
20064
    #ifndef NO_WOLFSSL_CLIENT
20065
        m = wolfTLSv1_3_client_method_ex(heap);
20066
    #else
20067
        m = wolfTLSv1_3_server_method_ex(heap);
20068
    #endif
20069
        if (m != NULL) {
20070
            m->side = WOLFSSL_NEITHER_END;
20071
        }
20072
        return m;
20073
    }
20074
    #endif /* WOLFSSL_TLS13 */
20075
20076
#ifdef WOLFSSL_DTLS
20077
    WOLFSSL_METHOD* wolfDTLS_method(void)
20078
    {
20079
        return wolfDTLS_method_ex(NULL);
20080
    }
20081
    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
20082
    {
20083
        WOLFSSL_METHOD* m;
20084
        WOLFSSL_ENTER("DTLS_method_ex");
20085
    #ifndef NO_WOLFSSL_CLIENT
20086
        m = wolfDTLS_client_method_ex(heap);
20087
    #else
20088
        m = wolfDTLS_server_method_ex(heap);
20089
    #endif
20090
        if (m != NULL) {
20091
            m->side = WOLFSSL_NEITHER_END;
20092
        }
20093
        return m;
20094
    }
20095
20096
    #ifndef NO_OLD_TLS
20097
    WOLFSSL_METHOD* wolfDTLSv1_method(void)
20098
    {
20099
        return wolfDTLSv1_method_ex(NULL);
20100
    }
20101
    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
20102
    {
20103
        WOLFSSL_METHOD* m;
20104
        WOLFSSL_ENTER("DTLSv1_method_ex");
20105
    #ifndef NO_WOLFSSL_CLIENT
20106
        m = wolfDTLSv1_client_method_ex(heap);
20107
    #else
20108
        m = wolfDTLSv1_server_method_ex(heap);
20109
    #endif
20110
        if (m != NULL) {
20111
            m->side = WOLFSSL_NEITHER_END;
20112
        }
20113
        return m;
20114
    }
20115
    #endif /* !NO_OLD_TLS */
20116
    #ifndef WOLFSSL_NO_TLS12
20117
    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
20118
    {
20119
        return wolfDTLSv1_2_method_ex(NULL);
20120
    }
20121
    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
20122
    {
20123
        WOLFSSL_METHOD* m;
20124
        WOLFSSL_ENTER("DTLSv1_2_method");
20125
    #ifndef NO_WOLFSSL_CLIENT
20126
        m = wolfDTLSv1_2_client_method_ex(heap);
20127
    #else
20128
        m = wolfDTLSv1_2_server_method_ex(heap);
20129
    #endif
20130
        if (m != NULL) {
20131
            m->side = WOLFSSL_NEITHER_END;
20132
        }
20133
        return m;
20134
    }
20135
    #endif /* !WOLFSSL_NO_TLS12 */
20136
    #ifdef WOLFSSL_DTLS13
20137
    WOLFSSL_METHOD* wolfDTLSv1_3_method(void)
20138
    {
20139
        return wolfDTLSv1_3_method_ex(NULL);
20140
    }
20141
    WOLFSSL_METHOD* wolfDTLSv1_3_method_ex(void* heap)
20142
    {
20143
        WOLFSSL_METHOD* m;
20144
        WOLFSSL_ENTER("DTLSv1_3_method");
20145
    #ifndef NO_WOLFSSL_CLIENT
20146
        m = wolfDTLSv1_3_client_method_ex(heap);
20147
    #else
20148
        m = wolfDTLSv1_3_server_method_ex(heap);
20149
    #endif
20150
        if (m != NULL) {
20151
            m->side = WOLFSSL_NEITHER_END;
20152
        }
20153
        return m;
20154
    }
20155
    #endif /* WOLFSSL_DTLS13 */
20156
#endif /* WOLFSSL_DTLS */
20157
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
20158
20159
20160
#ifndef NO_WOLFSSL_SERVER
20161
20162
    WOLFSSL_METHOD* wolfTLS_server_method(void)
20163
0
    {
20164
0
        return wolfTLS_server_method_ex(NULL);
20165
0
    }
20166
20167
    WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
20168
0
    {
20169
0
        WOLFSSL_METHOD* method =
20170
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20171
0
                                                     heap, DYNAMIC_TYPE_METHOD);
20172
0
        (void)heap;
20173
0
        WOLFSSL_ENTER("TLS_server_method_ex");
20174
0
        if (method) {
20175
0
        #if defined(WOLFSSL_TLS13)
20176
0
            InitSSL_Method(method, MakeTLSv1_3());
20177
        #elif !defined(WOLFSSL_NO_TLS12)
20178
            InitSSL_Method(method, MakeTLSv1_2());
20179
        #elif !defined(NO_OLD_TLS)
20180
            InitSSL_Method(method, MakeTLSv1_1());
20181
        #elif defined(WOLFSSL_ALLOW_TLSV10)
20182
            InitSSL_Method(method, MakeTLSv1());
20183
        #else
20184
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
20185
        #endif
20186
20187
0
            method->downgrade = 1;
20188
0
            method->side      = WOLFSSL_SERVER_END;
20189
0
        }
20190
0
        return method;
20191
0
    }
20192
20193
#ifndef NO_OLD_TLS
20194
    #ifdef WOLFSSL_ALLOW_TLSV10
20195
    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
20196
    {
20197
        return wolfTLSv1_server_method_ex(NULL);
20198
    }
20199
    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
20200
    {
20201
        WOLFSSL_METHOD* method =
20202
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20203
                                                     heap, DYNAMIC_TYPE_METHOD);
20204
        (void)heap;
20205
        WOLFSSL_ENTER("TLSv1_server_method_ex");
20206
        if (method) {
20207
            InitSSL_Method(method, MakeTLSv1());
20208
            method->side = WOLFSSL_SERVER_END;
20209
        }
20210
        return method;
20211
    }
20212
    #endif /* WOLFSSL_ALLOW_TLSV10 */
20213
20214
    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
20215
    {
20216
        return wolfTLSv1_1_server_method_ex(NULL);
20217
    }
20218
    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
20219
    {
20220
        WOLFSSL_METHOD* method =
20221
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20222
                                                     heap, DYNAMIC_TYPE_METHOD);
20223
        (void)heap;
20224
        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
20225
        if (method) {
20226
            InitSSL_Method(method, MakeTLSv1_1());
20227
            method->side = WOLFSSL_SERVER_END;
20228
        }
20229
        return method;
20230
    }
20231
#endif /* !NO_OLD_TLS */
20232
20233
20234
#ifndef WOLFSSL_NO_TLS12
20235
    WOLFSSL_ABI
20236
    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
20237
0
    {
20238
0
        return wolfTLSv1_2_server_method_ex(NULL);
20239
0
    }
20240
    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
20241
0
    {
20242
0
        WOLFSSL_METHOD* method =
20243
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20244
0
                                                     heap, DYNAMIC_TYPE_METHOD);
20245
0
        (void)heap;
20246
0
        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
20247
0
        if (method) {
20248
0
            InitSSL_Method(method, MakeTLSv1_2());
20249
0
            method->side = WOLFSSL_SERVER_END;
20250
0
        }
20251
0
        return method;
20252
0
    }
20253
#endif /* !WOLFSSL_NO_TLS12 */
20254
20255
#ifdef WOLFSSL_TLS13
20256
    /* The TLS v1.3 server method data.
20257
     *
20258
     * returns the method data for a TLS v1.3 server.
20259
     */
20260
    WOLFSSL_ABI
20261
    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
20262
0
    {
20263
0
        return wolfTLSv1_3_server_method_ex(NULL);
20264
0
    }
20265
20266
    /* The TLS v1.3 server method data.
20267
     *
20268
     * heap  The heap used for allocation.
20269
     * returns the method data for a TLS v1.3 server.
20270
     */
20271
    WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
20272
0
    {
20273
0
        WOLFSSL_METHOD* method =
20274
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20275
0
                                                     heap, DYNAMIC_TYPE_METHOD);
20276
0
        (void)heap;
20277
0
        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
20278
0
        if (method) {
20279
0
            InitSSL_Method(method, MakeTLSv1_3());
20280
0
            method->side = WOLFSSL_SERVER_END;
20281
0
        }
20282
0
        return method;
20283
0
    }
20284
#endif /* WOLFSSL_TLS13 */
20285
20286
#ifdef WOLFSSL_DTLS
20287
    WOLFSSL_METHOD* wolfDTLS_server_method(void)
20288
    {
20289
        return wolfDTLS_server_method_ex(NULL);
20290
    }
20291
    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
20292
    {
20293
        WOLFSSL_METHOD* method =
20294
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20295
                                                     heap, DYNAMIC_TYPE_METHOD);
20296
        (void)heap;
20297
        WOLFSSL_ENTER("DTLS_server_method_ex");
20298
        if (method) {
20299
        #if defined(WOLFSSL_DTLS13)
20300
            InitSSL_Method(method, MakeDTLSv1_3());
20301
        #elif !defined(WOLFSSL_NO_TLS12)
20302
            InitSSL_Method(method, MakeDTLSv1_2());
20303
        #elif !defined(NO_OLD_TLS)
20304
            InitSSL_Method(method, MakeDTLSv1());
20305
        #else
20306
            #error No DTLS version enabled!
20307
        #endif
20308
20309
            method->downgrade = 1;
20310
            method->side      = WOLFSSL_SERVER_END;
20311
        }
20312
        return method;
20313
    }
20314
20315
    #ifndef NO_OLD_TLS
20316
    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
20317
    {
20318
        return wolfDTLSv1_server_method_ex(NULL);
20319
    }
20320
    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
20321
    {
20322
        WOLFSSL_METHOD* method =
20323
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20324
                                                 heap, DYNAMIC_TYPE_METHOD);
20325
        (void)heap;
20326
        WOLFSSL_ENTER("DTLSv1_server_method_ex");
20327
        if (method) {
20328
            InitSSL_Method(method, MakeDTLSv1());
20329
            method->side = WOLFSSL_SERVER_END;
20330
        }
20331
        return method;
20332
    }
20333
    #endif /* !NO_OLD_TLS */
20334
20335
    #ifndef WOLFSSL_NO_TLS12
20336
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
20337
    {
20338
        return wolfDTLSv1_2_server_method_ex(NULL);
20339
    }
20340
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
20341
    {
20342
        WOLFSSL_METHOD* method =
20343
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
20344
                                                 heap, DYNAMIC_TYPE_METHOD);
20345
        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
20346
        (void)heap;
20347
        if (method) {
20348
            InitSSL_Method(method, MakeDTLSv1_2());
20349
            method->side = WOLFSSL_SERVER_END;
20350
        }
20351
        (void)heap;
20352
        return method;
20353
    }
20354
    #endif /* !WOLFSSL_NO_TLS12 */
20355
#endif /* WOLFSSL_DTLS */
20356
20357
#endif /* NO_WOLFSSL_SERVER */
20358
20359
#endif /* NO_TLS */
20360
20361
#endif /* WOLFCRYPT_ONLY */