Coverage Report

Created: 2026-07-22 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-fastmath/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
 *
77
 * Post-Quantum:
78
 * WOLFSSL_HAVE_MLKEM:       Enable ML-KEM (Kyber) support         default: off
79
 * WOLFSSL_MLKEM_KYBER:      Use Kyber round 3 parameters          default: off
80
 * WOLFSSL_KYBER512:         Enable Kyber/ML-KEM-512               default: off
81
 * WOLFSSL_KYBER768:         Enable Kyber/ML-KEM-768               default: off
82
 * WOLFSSL_KYBER1024:        Enable Kyber/ML-KEM-1024              default: off
83
 * WOLFSSL_NO_ML_KEM:        Disable all ML-KEM support            default: off
84
 * WOLFSSL_NO_ML_KEM_512:    Disable ML-KEM-512                    default: off
85
 * WOLFSSL_NO_ML_KEM_768:    Disable ML-KEM-768                    default: off
86
 * WOLFSSL_NO_ML_KEM_1024:   Disable ML-KEM-1024                  default: off
87
 * WOLFSSL_ML_KEM_USE_OLD_IDS: Use old IANA IDs for ML-KEM        default: off
88
 * WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ: Store ML-KEM object in ext   default: off
89
 * WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY: Store ML-KEM priv key   default: off
90
 * WOLFSSL_MLKEM_CACHE_A:    Cache ML-KEM A matrix                 default: off
91
 * WOLFSSL_MLKEM_NO_MAKE_KEY: Disable ML-KEM key generation       default: off
92
 * WOLFSSL_MLKEM_NO_ENCAPSULATE: Disable ML-KEM encapsulation     default: off
93
 * WOLFSSL_MLKEM_NO_DECAPSULATE: Disable ML-KEM decapsulation     default: off
94
 * HAVE_LIBOQS:              Use liboqs for PQ algorithms          default: off
95
 *
96
 * Curves:
97
 * HAVE_SECRET_CALLBACK:     Enable TLS secret callback            default: off
98
 * HAVE_PK_CALLBACKS:        Enable public key callbacks           default: off
99
 * HAVE_FUZZER:              Enable fuzzing callback support        default: off
100
 *
101
 * Features:
102
 * WOLFSSL_SNIFFER:          Enable TLS packet sniffing support    default: off
103
 * WOLFSSL_SNIFFER_KEYLOGFILE: Sniffer keylog file support         default: off
104
 * WOLFSSL_SSLKEYLOGFILE:    Enable SSL key log file output        default: off
105
 * WOLFSSL_SSLKEYLOGFILE_USE_ENV: Use SSLKEYLOGFILE env var path   default: off
106
 * WOLFSSL_SRTP:             Enable SRTP extension support         default: off
107
 * WOLFSSL_DUAL_ALG_CERTS:   Enable dual algorithm certificates   default: off
108
 * WOLFSSL_HAVE_PRF:         Enable TLS PRF function access        default: off
109
 * WOLFSSL_DEBUG_TLS:        Debug TLS protocol messages            default: off
110
 * WOLFSSL_32BIT_MILLI_TIME: 32-bit millisecond time function      default: off
111
 * WOLFSSL_REQUIRE_TCA:      Require Trusted CA extension          default: off
112
 * WOLFSSL_DH_EXTRA:         Extra DH key info in SSL object       default: off
113
 * WOLFSSL_CURVE25519_BLINDING: Curve25519 blinding in TLS         default: off
114
 * HAVE_NULL_CIPHER:         Allow NULL cipher suites               default: off
115
 * HAVE_WEBSERVER:           Enable web server features             default: off
116
 * NO_CERTS:                 Disable certificate processing        default: off
117
 */
118
119
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
120
121
#ifndef WOLFCRYPT_ONLY
122
123
#include <wolfssl/ssl.h>
124
#include <wolfssl/internal.h>
125
#include <wolfssl/error-ssl.h>
126
#include <wolfssl/wolfcrypt/hash.h>
127
#include <wolfssl/wolfcrypt/hmac.h>
128
#include <wolfssl/wolfcrypt/kdf.h>
129
#ifdef NO_INLINE
130
    #include <wolfssl/wolfcrypt/misc.h>
131
#else
132
    #define WOLFSSL_MISC_INCLUDED
133
    #include <wolfcrypt/src/misc.c>
134
#endif
135
136
#ifdef HAVE_CURVE25519
137
    #include <wolfssl/wolfcrypt/curve25519.h>
138
#endif
139
#ifdef HAVE_CURVE448
140
    #include <wolfssl/wolfcrypt/curve448.h>
141
#endif
142
#ifdef WOLFSSL_HAVE_MLKEM
143
    #include <wolfssl/wolfcrypt/wc_mlkem.h>
144
#endif
145
146
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
147
    #include <wolfssl/wolfcrypt/port/Renesas/renesas_tsip_internal.h>
148
#endif
149
150
#include <wolfssl/wolfcrypt/hpke.h>
151
152
#ifndef NO_TLS
153
154
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
155
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap);
156
#endif
157
158
#ifdef HAVE_SUPPORTED_CURVES
159
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions);
160
#endif
161
162
/* Digest enable checks */
163
#ifdef NO_OLD_TLS /* TLS 1.2 only */
164
    #if defined(NO_SHA256) && !defined(WOLFSSL_SHA384) && \
165
            !defined(WOLFSSL_SHA512)
166
        #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
167
    #endif
168
#else  /* TLS 1.1 or older */
169
    #if defined(NO_MD5) && defined(NO_SHA)
170
        #error Must have SHA1 and MD5 enabled for old TLS
171
    #endif
172
#endif
173
174
#ifdef WOLFSSL_TLS13
175
    #if !defined(NO_DH) && \
176
        !defined(HAVE_FFDHE_2048) && !defined(HAVE_FFDHE_3072) && \
177
        !defined(HAVE_FFDHE_4096) && !defined(HAVE_FFDHE_6144) && \
178
        !defined(HAVE_FFDHE_8192)
179
        #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
180
    #endif
181
    #if !defined(NO_RSA) && !defined(WC_RSA_PSS)
182
        #error The build option WC_RSA_PSS is required for TLS 1.3 with RSA
183
    #endif
184
    #ifndef HAVE_TLS_EXTENSIONS
185
        #if !defined(_MSC_VER) && !defined(__TASKING__)
186
            #error "The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3"
187
        #else
188
            #pragma message("Error: The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3")
189
        #endif
190
    #endif
191
#endif
192
193
/* Warn if secrets logging is enabled */
194
#if (defined(SHOW_SECRETS) || defined(WOLFSSL_SSLKEYLOGFILE)) && \
195
    !defined(WOLFSSL_KEYLOG_EXPORT_WARNED)
196
    #if !defined(_MSC_VER) && !defined(__TASKING__)
197
        #warning The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment
198
    #else
199
        #pragma message("Warning: The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment")
200
    #endif
201
#endif
202
203
#ifndef WOLFSSL_NO_TLS12
204
205
#ifdef WOLFSSL_SHA384
206
1.53k
    #define HSHASH_SZ WC_SHA384_DIGEST_SIZE
207
#else
208
    #define HSHASH_SZ FINISHED_SZ
209
#endif
210
211
int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
212
0
{
213
0
    int ret = 0;
214
0
    word32 hashSz = FINISHED_SZ;
215
216
0
    if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
217
0
        return BAD_FUNC_ARG;
218
219
    /* for constant timing perform these even if error */
220
#ifndef NO_OLD_TLS
221
    ret |= wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
222
    ret |= wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
223
#endif
224
225
0
    if (IsAtLeastTLSv1_2(ssl)) {
226
0
#ifndef NO_SHA256
227
0
        if (ssl->specs.mac_algorithm <= sha256_mac ||
228
0
            ssl->specs.mac_algorithm == blake2b_mac) {
229
0
            ret |= wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
230
0
            hashSz = WC_SHA256_DIGEST_SIZE;
231
0
        }
232
0
#endif
233
0
#ifdef WOLFSSL_SHA384
234
0
        if (ssl->specs.mac_algorithm == sha384_mac) {
235
0
            ret |= wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
236
0
            hashSz = WC_SHA384_DIGEST_SIZE;
237
0
        }
238
0
#endif
239
0
#ifdef WOLFSSL_SM3
240
0
        if (ssl->specs.mac_algorithm == sm3_mac) {
241
0
            ret |= wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
242
0
            hashSz = WC_SM3_DIGEST_SIZE;
243
0
        }
244
0
#endif
245
0
    }
246
247
0
    *hashLen = hashSz;
248
#ifdef WOLFSSL_CHECK_MEM_ZERO
249
     wc_MemZero_Add("TLS handshake hash", hash, hashSz);
250
#endif
251
252
0
    if (ret != 0) {
253
0
        ret = BUILD_MSG_ERROR;
254
0
        WOLFSSL_ERROR_VERBOSE(ret);
255
0
    }
256
257
0
    return ret;
258
0
}
259
260
261
int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
262
1.49k
{
263
1.49k
    int ret;
264
1.49k
    const byte* side = NULL;
265
1.49k
    word32 hashSz = HSHASH_SZ;
266
1.49k
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
267
1.49k
    byte handshake_hash[HSHASH_SZ];
268
#else
269
    byte* handshake_hash = NULL;
270
    handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap, DYNAMIC_TYPE_DIGEST);
271
    if (handshake_hash == NULL)
272
        return MEMORY_E;
273
#endif
274
275
1.49k
    XMEMSET(handshake_hash, 0, HSHASH_SZ);
276
1.49k
    ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
277
1.49k
    if (ret == 0) {
278
1.48k
        if (XSTRNCMP((const char*)sender, (const char*)kTlsClientStr,
279
1.48k
                                                          SIZEOF_SENDER) == 0) {
280
1.08k
            side = kTlsClientFinStr;
281
1.08k
        }
282
400
        else if (XSTRNCMP((const char*)sender, (const char*)kTlsServerStr,
283
400
                                                          SIZEOF_SENDER) == 0) {
284
400
            side = kTlsServerFinStr;
285
400
        }
286
0
        else {
287
0
            ret = BAD_FUNC_ARG;
288
0
            WOLFSSL_MSG("Unexpected sender value");
289
0
        }
290
1.48k
    }
291
292
1.49k
    if (ret == 0) {
293
1.48k
#ifdef WOLFSSL_HAVE_PRF
294
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
295
        if (ssl->ctx->TlsFinishedCb) {
296
            void* ctx = wolfSSL_GetTlsFinishedCtx(ssl);
297
            ret = ssl->ctx->TlsFinishedCb(ssl, side, handshake_hash, hashSz,
298
                                          (byte*)hashes, ctx);
299
        }
300
        if (!ssl->ctx->TlsFinishedCb ||
301
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
302
#endif
303
1.48k
        {
304
1.48k
            PRIVATE_KEY_UNLOCK();
305
1.48k
            ret = wc_PRF_TLS((byte*)hashes, TLS_FINISHED_SZ,
306
1.48k
                      ssl->arrays->masterSecret, SECRET_LEN, side,
307
1.48k
                      FINISHED_LABEL_SZ, handshake_hash, hashSz,
308
1.48k
                      IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
309
1.48k
                      ssl->heap, ssl->devId);
310
1.48k
            PRIVATE_KEY_LOCK();
311
1.48k
        }
312
1.48k
        ForceZero(handshake_hash, hashSz);
313
#else
314
        /* Pseudo random function must be enabled in the configuration. */
315
        ret = PRF_MISSING;
316
        WOLFSSL_ERROR_VERBOSE(ret);
317
        WOLFSSL_MSG("Pseudo-random function is not enabled");
318
319
        (void)side;
320
        (void)hashes;
321
#endif
322
1.48k
    }
323
324
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
325
    XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
326
#elif defined(WOLFSSL_CHECK_MEM_ZERO)
327
    wc_MemZero_Check(handshake_hash, HSHASH_SZ);
328
#endif
329
330
1.49k
    return ret;
331
1.49k
}
332
333
#endif /* !WOLFSSL_NO_TLS12 */
334
335
#ifndef NO_OLD_TLS
336
337
#ifdef WOLFSSL_ALLOW_TLSV10
338
ProtocolVersion MakeTLSv1(void)
339
{
340
    ProtocolVersion pv;
341
    pv.major = SSLv3_MAJOR;
342
    pv.minor = TLSv1_MINOR;
343
344
    return pv;
345
}
346
#endif /* WOLFSSL_ALLOW_TLSV10 */
347
348
349
ProtocolVersion MakeTLSv1_1(void)
350
{
351
    ProtocolVersion pv;
352
    pv.major = SSLv3_MAJOR;
353
    pv.minor = TLSv1_1_MINOR;
354
355
    return pv;
356
}
357
358
#endif /* !NO_OLD_TLS */
359
360
361
#ifndef WOLFSSL_NO_TLS12
362
363
ProtocolVersion MakeTLSv1_2(void)
364
5.47k
{
365
5.47k
    ProtocolVersion pv;
366
5.47k
    pv.major = SSLv3_MAJOR;
367
5.47k
    pv.minor = TLSv1_2_MINOR;
368
369
5.47k
    return pv;
370
5.47k
}
371
372
#endif /* !WOLFSSL_NO_TLS12 */
373
374
#ifdef WOLFSSL_TLS13
375
/* The TLS v1.3 protocol version.
376
 *
377
 * returns the protocol version data for TLS v1.3.
378
 */
379
ProtocolVersion MakeTLSv1_3(void)
380
8
{
381
8
    ProtocolVersion pv;
382
8
    pv.major = SSLv3_MAJOR;
383
8
    pv.minor = TLSv1_3_MINOR;
384
385
8
    return pv;
386
8
}
387
#endif
388
389
#if defined(HAVE_SUPPORTED_CURVES)
390
/* Sets the key exchange groups in rank order on a context.
391
 *
392
 * ctx     SSL/TLS context object.
393
 * groups  Array of groups.
394
 * count   Number of groups in array.
395
 * returns BAD_FUNC_ARG when ctx or groups is NULL, not using TLS v1.3, count is
396
 * not positive or count is greater than WOLFSSL_MAX_GROUP_COUNT and
397
 * WOLFSSL_SUCCESS on success.
398
 */
399
int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count)
400
0
{
401
0
    int ret, i;
402
403
0
    WOLFSSL_ENTER("wolfSSL_CTX_set_groups");
404
0
    if (ctx == NULL || groups == NULL || count <= 0 ||
405
0
            count > WOLFSSL_MAX_GROUP_COUNT)
406
0
        return BAD_FUNC_ARG;
407
0
    if (!IsTLS_ex(ctx->method->version))
408
0
        return BAD_FUNC_ARG;
409
410
0
    #ifdef WOLFSSL_TLS13
411
0
    ctx->numGroups = 0;
412
0
    #endif
413
0
    #if !defined(NO_TLS)
414
0
    TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
415
0
    #endif /* !NO_TLS */
416
0
    for (i = 0; i < count; i++) {
417
        /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups
418
         * are valid */
419
0
        if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, (word16)groups[i]))
420
0
                != WOLFSSL_SUCCESS) {
421
0
    #if !defined(NO_TLS)
422
0
            TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
423
0
    #endif /* !NO_TLS */
424
0
            return ret;
425
0
        }
426
0
        #ifdef WOLFSSL_TLS13
427
0
        ctx->group[i] = (word16)groups[i];
428
0
        #endif
429
0
    }
430
0
    #ifdef WOLFSSL_TLS13
431
0
    ctx->numGroups = (byte)count;
432
0
    #endif
433
434
0
    return WOLFSSL_SUCCESS;
435
0
}
436
437
/* Sets the key exchange groups in rank order.
438
 *
439
 * ssl     SSL/TLS object.
440
 * groups  Array of groups.
441
 * count   Number of groups in array.
442
 * returns BAD_FUNC_ARG when ssl or groups is NULL, not using TLS v1.3, count is
443
 * not positive or count is greater than WOLFSSL_MAX_GROUP_COUNT and
444
 * WOLFSSL_SUCCESS on success.
445
 */
446
int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count)
447
0
{
448
0
    int ret, i;
449
450
0
    WOLFSSL_ENTER("wolfSSL_set_groups");
451
0
    if (ssl == NULL || groups == NULL || count <= 0 ||
452
0
            count > WOLFSSL_MAX_GROUP_COUNT)
453
0
        return BAD_FUNC_ARG;
454
0
    if (!IsTLS_ex(ssl->version))
455
0
        return BAD_FUNC_ARG;
456
457
0
    #ifdef WOLFSSL_TLS13
458
0
    ssl->numGroups = 0;
459
0
    #endif
460
0
    #if !defined(NO_TLS)
461
0
    TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
462
0
    #endif /* !NO_TLS */
463
0
    for (i = 0; i < count; i++) {
464
        /* Call to wolfSSL_UseSupportedCurve also checks if input groups
465
                 * are valid */
466
0
        if ((ret = wolfSSL_UseSupportedCurve(ssl, (word16)groups[i]))
467
0
                != WOLFSSL_SUCCESS) {
468
0
    #if !defined(NO_TLS)
469
0
            TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
470
0
    #endif /* !NO_TLS */
471
0
            return ret;
472
0
        }
473
0
        #ifdef WOLFSSL_TLS13
474
0
        ssl->group[i] = (word16)groups[i];
475
0
        #endif
476
0
    }
477
0
    #ifdef WOLFSSL_TLS13
478
0
    ssl->numGroups = (byte)count;
479
0
    #endif
480
481
0
    return WOLFSSL_SUCCESS;
482
0
}
483
#endif /* HAVE_SUPPORTED_CURVES */
484
485
#ifndef WOLFSSL_NO_TLS12
486
487
#ifdef HAVE_EXTENDED_MASTER
488
static const byte ext_master_label[EXT_MASTER_LABEL_SZ + 1] =
489
                                                      "extended master secret";
490
#endif
491
static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
492
static const byte key_label   [KEY_LABEL_SZ + 1]    = "key expansion";
493
494
static int _DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
495
                         const byte* ms, word32 msLen,
496
                         const byte* sr, const byte* cr,
497
                         int tls1_2, int hash_type,
498
                         void* heap, int devId)
499
1.70k
{
500
1.70k
    int ret;
501
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
502
    byte* seed = NULL;
503
    seed = (byte*)XMALLOC(SEED_LEN, heap, DYNAMIC_TYPE_SEED);
504
    if (seed == NULL)
505
        return MEMORY_E;
506
#else
507
1.70k
    byte seed[SEED_LEN];
508
1.70k
#endif
509
510
1.70k
    XMEMCPY(seed,           sr, RAN_LEN);
511
1.70k
    XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
512
513
1.70k
#ifdef WOLFSSL_HAVE_PRF
514
1.70k
    PRIVATE_KEY_UNLOCK();
515
1.70k
    ret = wc_PRF_TLS(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
516
1.70k
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
517
1.70k
    PRIVATE_KEY_LOCK();
518
#else
519
    /* Pseudo random function must be enabled in the configuration. */
520
    ret = PRF_MISSING;
521
    WOLFSSL_ERROR_VERBOSE(ret);
522
    WOLFSSL_MSG("Pseudo-random function is not enabled");
523
524
    (void)key_dig;
525
    (void)key_dig_len;
526
    (void)ms;
527
    (void)msLen;
528
    (void)tls1_2;
529
    (void)hash_type;
530
    (void)heap;
531
    (void)devId;
532
    (void)key_label;
533
    (void)master_label;
534
#ifdef HAVE_EXTENDED_MASTER
535
    (void)ext_master_label;
536
#endif
537
#endif
538
539
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
540
    XFREE(seed, heap, DYNAMIC_TYPE_SEED);
541
#endif
542
543
1.70k
    return ret;
544
1.70k
}
545
546
/* External facing wrapper so user can call as well, 0 on success */
547
int wolfSSL_DeriveTlsKeys(byte* key_data, word32 keyLen,
548
                         const byte* ms, word32 msLen,
549
                         const byte* sr, const byte* cr,
550
                         int tls1_2, int hash_type)
551
0
{
552
0
    return _DeriveTlsKeys(key_data, keyLen, ms, msLen, sr, cr, tls1_2,
553
0
        hash_type, NULL, INVALID_DEVID);
554
0
}
555
556
557
int DeriveTlsKeys(WOLFSSL* ssl)
558
1.70k
{
559
1.70k
    int   ret;
560
1.70k
    int   key_dig_len = 2 * ssl->specs.hash_size +
561
1.70k
                        2 * ssl->specs.key_size  +
562
1.70k
                        2 * ssl->specs.iv_size;
563
1.70k
    WC_DECLARE_VAR(key_dig, byte, MAX_PRF_DIG, 0);
564
565
1.70k
    WC_ALLOC_VAR_EX(key_dig, byte, MAX_PRF_DIG, ssl->heap,
566
1.70k
        DYNAMIC_TYPE_DIGEST, return MEMORY_E);
567
568
1.70k
    XMEMSET(key_dig, 0, MAX_PRF_DIG);
569
570
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
571
    ret = PROTOCOLCB_UNAVAILABLE;
572
    if (ssl->ctx->GenSessionKeyCb) {
573
        void* ctx = wolfSSL_GetGenSessionKeyCtx(ssl);
574
        ret = ssl->ctx->GenSessionKeyCb(ssl, ctx);
575
    }
576
    if (!ssl->ctx->GenSessionKeyCb ||
577
        ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
578
#endif
579
1.70k
    ret = _DeriveTlsKeys(key_dig, (word32)key_dig_len,
580
1.70k
                     ssl->arrays->masterSecret, SECRET_LEN,
581
1.70k
                     ssl->arrays->serverRandom, ssl->arrays->clientRandom,
582
1.70k
                     IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
583
1.70k
                     ssl->heap, ssl->devId);
584
1.70k
    if (ret == 0)
585
1.66k
        ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
586
587
#ifdef WOLFSSL_CHECK_MEM_ZERO
588
    wc_MemZero_Add("DeriveTlsKeys key_dig", key_dig, MAX_PRF_DIG);
589
#endif
590
1.70k
    ForceZero(key_dig, MAX_PRF_DIG);
591
#ifdef WOLFSSL_CHECK_MEM_ZERO
592
    wc_MemZero_Check(key_dig, MAX_PRF_DIG);
593
#endif
594
595
1.70k
    WC_FREE_VAR_EX(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
596
597
1.70k
    return ret;
598
1.70k
}
599
600
static int _MakeTlsMasterSecret(byte* ms, word32 msLen,
601
                               const byte* pms, word32 pmsLen,
602
                               const byte* cr, const byte* sr,
603
                               int tls1_2, int hash_type,
604
                               void* heap, int devId)
605
1.69k
{
606
1.69k
    int ret;
607
1.69k
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
608
1.69k
    byte seed[SEED_LEN];
609
#else
610
    byte* seed = NULL;
611
    seed = (byte*)XMALLOC(SEED_LEN, heap, DYNAMIC_TYPE_SEED);
612
    if (seed == NULL)
613
        return MEMORY_E;
614
#endif
615
616
1.69k
    XMEMCPY(seed,           cr, RAN_LEN);
617
1.69k
    XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
618
619
1.69k
#ifdef WOLFSSL_HAVE_PRF
620
1.69k
    PRIVATE_KEY_UNLOCK();
621
1.69k
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
622
1.69k
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
623
1.69k
    PRIVATE_KEY_LOCK();
624
#else
625
    /* Pseudo random function must be enabled in the configuration. */
626
    ret = PRF_MISSING;
627
    WOLFSSL_MSG("Pseudo-random function is not enabled");
628
629
    (void)ms;
630
    (void)msLen;
631
    (void)pms;
632
    (void)pmsLen;
633
    (void)tls1_2;
634
    (void)hash_type;
635
    (void)heap;
636
    (void)devId;
637
#endif
638
639
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
640
    XFREE(seed, heap, DYNAMIC_TYPE_SEED);
641
#endif
642
643
1.69k
    return ret;
644
1.69k
}
645
646
/* External facing wrapper so user can call as well, 0 on success */
647
int wolfSSL_MakeTlsMasterSecret(byte* ms, word32 msLen,
648
                               const byte* pms, word32 pmsLen,
649
                               const byte* cr, const byte* sr,
650
                               int tls1_2, int hash_type)
651
0
{
652
0
    return _MakeTlsMasterSecret(ms, msLen, pms, pmsLen, cr, sr, tls1_2,
653
0
        hash_type, NULL, INVALID_DEVID);
654
0
}
655
656
657
#ifdef HAVE_EXTENDED_MASTER
658
659
static int _MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
660
                                        const byte* pms, word32 pmsLen,
661
                                        const byte* sHash, word32 sHashLen,
662
                                        int tls1_2, int hash_type,
663
                                        void* heap, int devId)
664
37
{
665
37
    int ret;
666
667
37
#ifdef WOLFSSL_HAVE_PRF
668
37
    PRIVATE_KEY_UNLOCK();
669
37
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
670
37
               sHash, sHashLen, tls1_2, hash_type, heap, devId);
671
37
    PRIVATE_KEY_LOCK();
672
#else
673
    /* Pseudo random function must be enabled in the configuration. */
674
    ret = PRF_MISSING;
675
    WOLFSSL_MSG("Pseudo-random function is not enabled");
676
677
    (void)ms;
678
    (void)msLen;
679
    (void)pms;
680
    (void)pmsLen;
681
    (void)sHash;
682
    (void)sHashLen;
683
    (void)tls1_2;
684
    (void)hash_type;
685
    (void)heap;
686
    (void)devId;
687
#endif
688
37
    return ret;
689
37
}
690
691
/* External facing wrapper so user can call as well, 0 on success */
692
int wolfSSL_MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
693
                                        const byte* pms, word32 pmsLen,
694
                                        const byte* sHash, word32 sHashLen,
695
                                        int tls1_2, int hash_type)
696
0
{
697
0
    return _MakeTlsExtendedMasterSecret(ms, msLen, pms, pmsLen, sHash, sHashLen,
698
0
        tls1_2, hash_type, NULL, INVALID_DEVID);
699
0
}
700
701
#endif /* HAVE_EXTENDED_MASTER */
702
703
704
int MakeTlsMasterSecret(WOLFSSL* ssl)
705
1.73k
{
706
1.73k
    int ret;
707
708
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
709
    /* If this is called from a sniffer session with keylog file support, obtain
710
     * the master secret from the callback */
711
    if (ssl->snifferSecretCb != NULL) {
712
        ret = ssl->snifferSecretCb(ssl->arrays->clientRandom,
713
                                   SNIFFER_SECRET_TLS12_MASTER_SECRET,
714
                                   ssl->arrays->masterSecret);
715
        if (ret != 0) {
716
            return ret;
717
        }
718
        ret = DeriveTlsKeys(ssl);
719
        return ret;
720
    }
721
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
722
723
1.73k
#ifdef HAVE_EXTENDED_MASTER
724
1.73k
    if (ssl->options.haveEMS) {
725
37
        word32 hashSz = HSHASH_SZ;
726
37
    #ifdef WOLFSSL_SMALL_STACK
727
37
        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
728
37
                                              DYNAMIC_TYPE_DIGEST);
729
37
        if (handshake_hash == NULL)
730
0
            return MEMORY_E;
731
    #else
732
        byte handshake_hash[HSHASH_SZ];
733
    #endif
734
735
37
        XMEMSET(handshake_hash, 0, HSHASH_SZ);
736
37
        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
737
37
        if (ret == 0) {
738
        #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
739
            ret = PROTOCOLCB_UNAVAILABLE;
740
            if (ssl->ctx->GenExtMasterCb) {
741
                void* ctx = wolfSSL_GetGenExtMasterSecretCtx(ssl);
742
                ret = ssl->ctx->GenExtMasterCb(ssl, handshake_hash, hashSz,
743
                                                ctx);
744
            }
745
            if (!ssl->ctx->GenExtMasterCb ||
746
                ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
747
        #endif /* (HAVE_SECRET_CALLBACK) && (HAVE_EXT_SECRET_CALLBACK) */
748
37
            {
749
37
                ret = _MakeTlsExtendedMasterSecret(
750
37
                    ssl->arrays->masterSecret, SECRET_LEN,
751
37
                    ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
752
37
                    handshake_hash, hashSz,
753
37
                    IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
754
37
                    ssl->heap, ssl->devId);
755
37
            }
756
37
            ForceZero(handshake_hash, hashSz);
757
37
        }
758
759
37
    #ifdef WOLFSSL_SMALL_STACK
760
37
        XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
761
    #elif defined(WOLFSSL_CHECK_MEM_ZERO)
762
        wc_MemZero_Check(handshake_hash, HSHASH_SZ);
763
    #endif
764
37
    }
765
1.69k
    else
766
1.69k
#endif /* HAVE_EXTENDED_MASTER */
767
1.69k
    {
768
769
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
770
        ret = PROTOCOLCB_UNAVAILABLE;
771
        if (ssl->ctx->GenMasterCb) {
772
            void* ctx = wolfSSL_GetGenMasterSecretCtx(ssl);
773
            ret = ssl->ctx->GenMasterCb(ssl, ctx);
774
        }
775
        if (!ssl->ctx->GenMasterCb ||
776
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
777
#endif
778
1.69k
        {
779
1.69k
            ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret,
780
1.69k
                      SECRET_LEN, ssl->arrays->preMasterSecret,
781
1.69k
                      ssl->arrays->preMasterSz, ssl->arrays->clientRandom,
782
1.69k
                      ssl->arrays->serverRandom, IsAtLeastTLSv1_2(ssl),
783
1.69k
                      ssl->specs.mac_algorithm, ssl->heap, ssl->devId);
784
1.69k
        }
785
1.69k
    }
786
#ifdef HAVE_SECRET_CALLBACK
787
    if (ret == 0 && ssl->tlsSecretCb != NULL) {
788
        ret = ssl->tlsSecretCb(ssl, ssl->arrays->masterSecret,
789
                SECRET_LEN, ssl->tlsSecretCtx);
790
    }
791
#endif /* HAVE_SECRET_CALLBACK */
792
1.73k
    if (ret == 0) {
793
1.70k
        ret = DeriveTlsKeys(ssl);
794
1.70k
    }
795
796
1.73k
    return ret;
797
1.73k
}
798
799
800
/* Used by EAP-TLS and EAP-TTLS to derive keying material from
801
 * the master_secret. */
802
int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* key, unsigned int len,
803
                                                              const char* label)
804
0
{
805
0
    int   ret;
806
0
    WC_DECLARE_VAR(seed, byte, SEED_LEN, 0);
807
808
0
    WC_ALLOC_VAR_EX(seed, byte, SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED,
809
0
        return MEMORY_E);
810
811
    /*
812
     * As per RFC-5281, the order of the client and server randoms is reversed
813
     * from that used by the TLS protocol to derive keys.
814
     */
815
0
    XMEMCPY(seed,           ssl->arrays->clientRandom, RAN_LEN);
816
0
    XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
817
818
0
#ifdef WOLFSSL_HAVE_PRF
819
0
    PRIVATE_KEY_UNLOCK();
820
0
    ret = wc_PRF_TLS((byte*)key, len, ssl->arrays->masterSecret, SECRET_LEN,
821
0
              (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
822
0
              IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
823
0
              ssl->heap, ssl->devId);
824
0
    PRIVATE_KEY_LOCK();
825
#else
826
    /* Pseudo random function must be enabled in the configuration. */
827
    ret = PRF_MISSING;
828
    WOLFSSL_MSG("Pseudo-random function is not enabled");
829
830
    (void)key;
831
    (void)len;
832
    (void)label;
833
#endif
834
835
0
    WC_FREE_VAR_EX(seed, ssl->heap, DYNAMIC_TYPE_SEED);
836
837
0
    return ret;
838
0
}
839
840
/* return HMAC digest type in wolfSSL format */
841
int wolfSSL_GetHmacType(WOLFSSL* ssl)
842
1.02k
{
843
1.02k
    if (ssl == NULL)
844
0
        return BAD_FUNC_ARG;
845
846
1.02k
    return wolfSSL_GetHmacType_ex(&ssl->specs);
847
1.02k
}
848
849
850
int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
851
                           int verify)
852
{
853
    if (ssl == NULL || inner == NULL)
854
        return BAD_FUNC_ARG;
855
856
    if (content == dtls12_cid
857
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
858
       || (ssl->options.dtls && DtlsGetCidTxSize(ssl) > 0)
859
#endif
860
    ) {
861
        WOLFSSL_MSG("wolfSSL_SetTlsHmacInner doesn't support CID");
862
        return BAD_FUNC_ARG;
863
    }
864
865
    XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
866
867
    WriteSEQ(ssl, verify, inner);
868
    inner[SEQ_SZ] = (byte)content;
869
    inner[SEQ_SZ + ENUM_LEN]            = ssl->version.major;
870
    inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
871
    c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
872
873
    return 0;
874
}
875
876
877
#ifndef WOLFSSL_AEAD_ONLY
878
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
879
    !defined(HAVE_SELFTEST)
880
881
/* Update the hash in the HMAC.
882
 *
883
 * hmac  HMAC object.
884
 * data  Data to be hashed.
885
 * sz    Size of data to hash.
886
 * returns 0 on success, otherwise failure.
887
 */
888
static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz)
889
0
{
890
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
891
892
0
    switch (hmac->macType) {
893
0
    #ifndef NO_SHA
894
0
        case WC_SHA:
895
0
            ret = wc_ShaUpdate(&hmac->hash.sha, data, sz);
896
0
            break;
897
0
    #endif /* !NO_SHA */
898
899
0
    #ifndef NO_SHA256
900
0
        case WC_SHA256:
901
0
            ret = wc_Sha256Update(&hmac->hash.sha256, data, sz);
902
0
            break;
903
0
    #endif /* !NO_SHA256 */
904
905
0
    #ifdef WOLFSSL_SHA384
906
0
        case WC_SHA384:
907
0
            ret = wc_Sha384Update(&hmac->hash.sha384, data, sz);
908
0
            break;
909
0
    #endif /* WOLFSSL_SHA384 */
910
911
0
    #ifdef WOLFSSL_SHA512
912
0
        case WC_SHA512:
913
0
            ret = wc_Sha512Update(&hmac->hash.sha512, data, sz);
914
0
            break;
915
0
    #endif /* WOLFSSL_SHA512 */
916
917
0
    #ifdef WOLFSSL_SM3
918
0
        case WC_SM3:
919
0
            ret = wc_Sm3Update(&hmac->hash.sm3, data, sz);
920
0
            break;
921
0
    #endif /* WOLFSSL_SM3 */
922
923
0
        default:
924
0
            ret = BAD_FUNC_ARG;
925
0
            break;
926
0
    }
927
928
0
    return ret;
929
0
}
930
931
/* Finalize the hash but don't put the EOC, padding or length in.
932
 *
933
 * hmac  HMAC object.
934
 * hash  Hash result.
935
 * returns 0 on success, otherwise failure.
936
 */
937
static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash)
938
0
{
939
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
940
941
0
    switch (hmac->macType) {
942
0
    #ifndef NO_SHA
943
0
        case WC_SHA:
944
0
            ret = wc_ShaFinalRaw(&hmac->hash.sha, hash);
945
0
            break;
946
0
    #endif /* !NO_SHA */
947
948
0
    #ifndef NO_SHA256
949
0
        case WC_SHA256:
950
0
            ret = wc_Sha256FinalRaw(&hmac->hash.sha256, hash);
951
0
            break;
952
0
    #endif /* !NO_SHA256 */
953
954
0
    #ifdef WOLFSSL_SHA384
955
0
        case WC_SHA384:
956
0
            ret = wc_Sha384FinalRaw(&hmac->hash.sha384, hash);
957
0
            break;
958
0
    #endif /* WOLFSSL_SHA384 */
959
960
0
    #ifdef WOLFSSL_SHA512
961
0
        case WC_SHA512:
962
0
            ret = wc_Sha512FinalRaw(&hmac->hash.sha512, hash);
963
0
            break;
964
0
    #endif /* WOLFSSL_SHA512 */
965
966
0
    #ifdef WOLFSSL_SM3
967
0
        case WC_SM3:
968
0
            ret = wc_Sm3FinalRaw(&hmac->hash.sm3, hash);
969
0
            break;
970
0
    #endif /* WOLFSSL_SM3 */
971
972
0
        default:
973
0
            ret = BAD_FUNC_ARG;
974
0
            break;
975
0
    }
976
977
0
    return ret;
978
0
}
979
980
/* Finalize the HMAC by performing outer hash.
981
 *
982
 * hmac  HMAC object.
983
 * mac   MAC result.
984
 * returns 0 on success, otherwise failure.
985
 */
986
static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac)
987
90
{
988
90
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
989
90
    WC_DECLARE_VAR(hash, wc_HashAlg, 1, hmac ? hmac->heap : NULL);
990
90
    enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
991
90
    int digestSz = wc_HashGetDigestSize(hashType);
992
90
    int blockSz = wc_HashGetBlockSize(hashType);
993
994
90
    WC_ALLOC_VAR_EX(hash, wc_HashAlg, 1, hmac->heap, DYNAMIC_TYPE_HASHES,
995
90
                    return MEMORY_E);
996
997
78
    if ((digestSz >= 0) && (blockSz >= 0)) {
998
78
        ret = wc_HashInit(hash, hashType);
999
78
    }
1000
0
    else {
1001
0
        ret = BAD_FUNC_ARG;
1002
0
    }
1003
1004
78
    if (ret == 0) {
1005
78
        ret = wc_HashUpdate(hash, hashType, (byte*)hmac->opad,
1006
78
            (word32)blockSz);
1007
78
        if (ret == 0)
1008
76
            ret = wc_HashUpdate(hash, hashType, (byte*)hmac->innerHash,
1009
76
                (word32)digestSz);
1010
78
        if (ret == 0)
1011
76
            ret = wc_HashFinal(hash, hashType, mac);
1012
78
        wc_HashFree(hash, hashType);
1013
78
    }
1014
1015
78
    WC_FREE_VAR_EX(hash, hmac->heap, DYNAMIC_TYPE_HASHES);
1016
78
    return ret;
1017
90
}
1018
1019
/* Calculate the HMAC of the header + message data.
1020
 * Constant time implementation using wc_Sha*FinalRaw().
1021
 *
1022
 * hmac    HMAC object.
1023
 * digest  MAC result.
1024
 * in      Message data.
1025
 * sz      Size of the message data.
1026
 * header  Constructed record header with length of handshake data.
1027
 * headerSz Length of header
1028
 * returns 0 on success, otherwise failure.
1029
 */
1030
static int Hmac_UpdateFinal_CT(Hmac* hmac, byte* digest, const byte* in,
1031
                           word32 sz, int macLen, byte* header, word32 headerSz)
1032
0
{
1033
0
    byte         lenBytes[8];
1034
0
    int          i, j;
1035
0
    unsigned int k;
1036
0
    int          blockBits, blockMask;
1037
0
    int          lastBlockLen, extraLen, eocIndex;
1038
0
    int          blocks;
1039
0
    int          safeBlocks;
1040
0
    int          lenBlock;
1041
0
    int          eocBlock;
1042
0
    word32       maxLen;
1043
0
    int          blockSz, padSz;
1044
0
    int          ret;
1045
0
    word32       realLen;
1046
0
    byte         extraBlock;
1047
1048
0
    if (macLen <= 0 || macLen > (int)sizeof(hmac->innerHash))
1049
0
        return BAD_FUNC_ARG;
1050
1051
0
    switch (hmac->macType) {
1052
0
    #ifndef NO_SHA
1053
0
        case WC_SHA:
1054
0
            blockSz = WC_SHA_BLOCK_SIZE;
1055
0
            blockBits = 6;
1056
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1057
0
            break;
1058
0
    #endif /* !NO_SHA */
1059
1060
0
    #ifndef NO_SHA256
1061
0
        case WC_SHA256:
1062
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1063
0
            blockBits = 6;
1064
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1065
0
            break;
1066
0
    #endif /* !NO_SHA256 */
1067
1068
0
    #ifdef WOLFSSL_SHA384
1069
0
        case WC_SHA384:
1070
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1071
0
            blockBits = 7;
1072
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1073
0
            break;
1074
0
    #endif /* WOLFSSL_SHA384 */
1075
1076
0
    #ifdef WOLFSSL_SHA512
1077
0
        case WC_SHA512:
1078
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1079
0
            blockBits = 7;
1080
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1081
0
            break;
1082
0
    #endif /* WOLFSSL_SHA512 */
1083
1084
0
    #ifdef WOLFSSL_SM3
1085
0
        case WC_SM3:
1086
0
            blockSz = WC_SM3_BLOCK_SIZE;
1087
0
            blockBits = 6;
1088
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1089
0
            break;
1090
0
    #endif /* WOLFSSL_SM3 */
1091
1092
0
        default:
1093
0
            return BAD_FUNC_ARG;
1094
0
    }
1095
0
    blockMask = blockSz - 1;
1096
1097
    /* Size of data to HMAC if padding length byte is zero. */
1098
0
    maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - (word32)macLen;
1099
1100
    /* Complete data (including padding) has block for EOC and/or length. */
1101
0
    extraBlock = ctSetLTE(((int)maxLen + padSz) & blockMask, padSz);
1102
    /* Total number of blocks for data including padding. */
1103
0
    blocks = ((int)(maxLen + (word32)blockSz - 1) >> blockBits) + extraBlock;
1104
    /* Up to last 6 blocks can be hashed safely. */
1105
0
    safeBlocks = blocks - 6;
1106
1107
    /* Length of message data. */
1108
0
    realLen = maxLen - in[sz - 1];
1109
    /* Number of message bytes in last block. */
1110
0
    lastBlockLen = (int)realLen & blockMask;
1111
    /* Number of padding bytes in last block. */
1112
0
    extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
1113
    /* Number of blocks to create for hash. */
1114
0
    lenBlock = ((int)realLen + extraLen) >> blockBits;
1115
    /* Block containing EOC byte. */
1116
0
    eocBlock = (int)(realLen >> (word32)blockBits);
1117
    /* Index of EOC byte in block. */
1118
0
    eocIndex = (int)(realLen & (word32)blockMask);
1119
1120
    /* Add length of hmac's ipad to total length. */
1121
0
    realLen += (word32)blockSz;
1122
    /* Length as bits - 8 bytes bigendian. */
1123
0
    c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
1124
0
    c32toa(realLen << 3, lenBytes + sizeof(word32));
1125
1126
0
    ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, (word32)blockSz);
1127
0
    if (ret != 0)
1128
0
        return ret;
1129
1130
0
    XMEMSET(hmac->innerHash, 0, (size_t)macLen);
1131
1132
0
    if (safeBlocks > 0) {
1133
0
        ret = Hmac_HashUpdate(hmac, header, headerSz);
1134
0
        if (ret != 0)
1135
0
            return ret;
1136
0
        ret = Hmac_HashUpdate(hmac, in, (word32)(safeBlocks * blockSz -
1137
0
                                WOLFSSL_TLS_HMAC_INNER_SZ));
1138
1139
0
        if (ret != 0)
1140
0
            return ret;
1141
0
    }
1142
0
    else
1143
0
        safeBlocks = 0;
1144
1145
0
    XMEMSET(digest, 0, (size_t)macLen);
1146
0
    k = (unsigned int)(safeBlocks * blockSz);
1147
0
    for (i = safeBlocks; i < blocks; i++) {
1148
0
        unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
1149
0
        unsigned char isEocBlock = ctMaskEq(i, eocBlock);
1150
0
        unsigned char isOutBlock = ctMaskEq(i, lenBlock);
1151
1152
0
        for (j = 0; j < blockSz; j++) {
1153
0
            unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
1154
0
            volatile unsigned char maskPastEoc = ctMaskGT(j, eocIndex);
1155
0
            volatile unsigned char pastEoc = maskPastEoc & isEocBlock;
1156
0
            unsigned char b = 0;
1157
1158
0
            if (k < headerSz)
1159
0
                b = header[k];
1160
0
            else if (k < maxLen)
1161
0
                b = in[k - headerSz];
1162
0
            k++;
1163
1164
0
            b = ctMaskSel(atEoc, 0x80, b);
1165
0
            b &= (unsigned char)~(word32)pastEoc;
1166
0
            b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
1167
1168
0
            if (j >= blockSz - 8) {
1169
0
                b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
1170
0
            }
1171
1172
0
            hashBlock[j] = b;
1173
0
        }
1174
1175
        /* cppcheck-suppress uninitvar */
1176
0
        ret = Hmac_HashUpdate(hmac, hashBlock, (word32)blockSz);
1177
0
        if (ret != 0)
1178
0
            return ret;
1179
0
        ret = Hmac_HashFinalRaw(hmac, hashBlock);
1180
0
        if (ret != 0)
1181
0
            return ret;
1182
0
        for (j = 0; j < macLen; j++)
1183
0
            ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
1184
0
    }
1185
1186
0
    ret = Hmac_OuterHash(hmac, digest);
1187
1188
0
    return ret;
1189
0
}
1190
1191
#endif
1192
1193
#if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
1194
    defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2B)
1195
1196
/* Calculate the HMAC of the header + message data.
1197
 * Constant time implementation using normal hashing operations.
1198
 * Update-Final need to be constant time.
1199
 *
1200
 * hmac    HMAC object.
1201
 * digest  MAC result.
1202
 * in      Message data.
1203
 * sz      Size of the message data.
1204
 * header  Constructed record header with length of handshake data.
1205
 * headerSz Length of header
1206
 * returns 0 on success, otherwise failure.
1207
 */
1208
static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
1209
                            word32 sz, byte* header, word32 headerSz)
1210
0
{
1211
0
    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
1212
0
    int        ret = 0;
1213
0
    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
1214
0
    word32     offset = 0;
1215
0
    int        msgBlocks, blocks, blockBits;
1216
0
    int        i;
1217
1218
0
    switch (hmac->macType) {
1219
0
    #ifndef NO_SHA
1220
0
        case WC_SHA:
1221
0
            blockSz = WC_SHA_BLOCK_SIZE;
1222
0
            blockBits = 6;
1223
0
            macSz = WC_SHA_DIGEST_SIZE;
1224
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1225
0
            break;
1226
0
    #endif /* !NO_SHA */
1227
1228
0
    #ifndef NO_SHA256
1229
0
        case WC_SHA256:
1230
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1231
0
            blockBits = 6;
1232
0
            macSz = WC_SHA256_DIGEST_SIZE;
1233
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1234
0
            break;
1235
0
    #endif /* !NO_SHA256 */
1236
1237
0
    #ifdef WOLFSSL_SHA384
1238
0
        case WC_SHA384:
1239
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1240
0
            blockBits = 7;
1241
0
            macSz = WC_SHA384_DIGEST_SIZE;
1242
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1243
0
            break;
1244
0
    #endif /* WOLFSSL_SHA384 */
1245
1246
0
    #ifdef WOLFSSL_SHA512
1247
0
        case WC_SHA512:
1248
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1249
0
            blockBits = 7;
1250
0
            macSz = WC_SHA512_DIGEST_SIZE;
1251
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1252
0
            break;
1253
0
    #endif /* WOLFSSL_SHA512 */
1254
1255
0
    #ifdef HAVE_BLAKE2B
1256
0
        case WC_HASH_TYPE_BLAKE2B:
1257
0
            blockSz = BLAKE2B_BLOCKBYTES;
1258
0
            blockBits = 7;
1259
0
            macSz = BLAKE2B_256;
1260
0
            padSz = 0;
1261
0
            break;
1262
0
    #endif /* HAVE_BLAKE2B */
1263
1264
0
    #ifdef WOLFSSL_SM3
1265
0
        case WC_SM3:
1266
0
            blockSz = WC_SM3_BLOCK_SIZE;
1267
0
            blockBits = 6;
1268
0
            macSz = WC_SM3_DIGEST_SIZE;
1269
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1270
0
            break;
1271
0
    #endif
1272
1273
0
        default:
1274
0
            WOLFSSL_MSG("ERROR: Hmac_UpdateFinal failed, no hmac->macType");
1275
0
            return BAD_FUNC_ARG;
1276
0
    }
1277
1278
0
    msgSz = sz - (1 + in[sz - 1] + macSz);
1279
    /* Make negative result 0 */
1280
0
    msgSz &= ~(0 - (msgSz >> 31));
1281
0
    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
1282
0
    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
1283
    /* Make negative result 0 */
1284
0
    maxSz &= ~(0 - (maxSz >> 31));
1285
1286
    /* Calculate #blocks processed in HMAC for max and real data. */
1287
0
    blocks      = (int)(maxSz >> blockBits);
1288
0
    blocks     += ((maxSz + padSz) % blockSz) < padSz;
1289
0
    msgBlocks   = (int)(realSz >> blockBits);
1290
    /* #Extra blocks to process. */
1291
0
    blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0);
1292
    /* Calculate whole blocks. */
1293
0
    msgBlocks--;
1294
1295
0
    ret = wc_HmacUpdate(hmac, header, headerSz);
1296
0
    if (ret == 0) {
1297
        /* Fill the rest of the block with any available data. */
1298
0
        word32 currSz = ctMaskLT((int)msgSz, (int)blockSz) & msgSz;
1299
0
        currSz |= ctMaskGTE((int)msgSz, (int)blockSz) & blockSz;
1300
0
        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
1301
0
        currSz &= ~(0 - (currSz >> 31));
1302
0
        ret = wc_HmacUpdate(hmac, in, currSz);
1303
0
        offset = currSz;
1304
0
    }
1305
0
    if (ret == 0) {
1306
        /* Do the hash operations on a block basis. */
1307
0
        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
1308
0
            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
1309
0
            if (ret != 0)
1310
0
                break;
1311
0
        }
1312
0
    }
1313
0
    if (ret == 0)
1314
0
        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
1315
0
    if (ret == 0)
1316
0
        ret = wc_HmacFinal(hmac, digest);
1317
0
    if (ret == 0) {
1318
        /* Do the dummy hash operations. Do at least one. */
1319
0
        for (i = 0; i < blocks + 1; i++) {
1320
0
            ret = wc_HmacUpdate(hmac, dummy, blockSz);
1321
0
            if (ret != 0)
1322
0
                break;
1323
0
        }
1324
0
    }
1325
1326
0
    return ret;
1327
0
}
1328
1329
#endif
1330
1331
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1332
#define TLS_HMAC_CID_SZ(s, v) \
1333
                ((v) ? DtlsGetCidRxSize((s)) \
1334
                     : DtlsGetCidTxSize((s)))
1335
#define TLS_HMAC_CID(s, v, b, c) \
1336
                ((v) ? wolfSSL_dtls_cid_get_rx((s), (b), (c)) \
1337
                     : wolfSSL_dtls_cid_get_tx((s), (b), (c)))
1338
#endif
1339
1340
static int TLS_hmac_SetInner(WOLFSSL* ssl, byte* inner, word32* innerSz,
1341
        word32 sz, int content, int verify, int epochOrder)
1342
{
1343
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1344
    unsigned int cidSz = 0;
1345
    if (ssl->options.dtls && (cidSz = TLS_HMAC_CID_SZ(ssl, verify)) > 0) {
1346
        word32 idx = 0;
1347
        if (cidSz > DTLS_CID_MAX_SIZE) {
1348
            WOLFSSL_MSG("DTLS CID too large");
1349
            return DTLS_CID_ERROR;
1350
        }
1351
1352
        XMEMSET(inner + idx, 0xFF, SEQ_SZ);
1353
        idx += SEQ_SZ;
1354
        inner[idx++] = dtls12_cid;
1355
        inner[idx++] = (byte)cidSz;
1356
        inner[idx++] = dtls12_cid;
1357
        inner[idx++] = ssl->version.major;
1358
        inner[idx++] = ssl->version.minor;
1359
        WriteSEQ(ssl, epochOrder, inner + idx);
1360
        idx += SEQ_SZ;
1361
        if (TLS_HMAC_CID(ssl, verify, inner + idx, cidSz) ==
1362
                WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
1363
            WOLFSSL_MSG("DTLS CID write failed");
1364
            return DTLS_CID_ERROR;
1365
        }
1366
        idx += cidSz;
1367
        c16toa((word16)sz, inner + idx);
1368
        idx += LENGTH_SZ;
1369
1370
        *innerSz = idx;
1371
        return 0;
1372
    }
1373
#endif
1374
    *innerSz = WOLFSSL_TLS_HMAC_INNER_SZ;
1375
    return wolfSSL_SetTlsHmacInner(ssl, inner, sz, content,
1376
            !ssl->options.dtls ? verify : epochOrder);
1377
}
1378
1379
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1380
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_CID_INNER_SZ
1381
#else
1382
0
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_INNER_SZ
1383
#endif
1384
1385
int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
1386
             int content, int verify, int epochOrder)
1387
0
{
1388
0
    WC_DECLARE_VAR(hmac, Hmac, 1, ssl ? ssl->heap : NULL);
1389
0
    byte   myInner[TLS_HMAC_INNER_SZ];
1390
0
    word32 innerSz = TLS_HMAC_INNER_SZ;
1391
0
    int    ret = 0;
1392
0
    const byte* macSecret = NULL;
1393
0
    word32 hashSz = 0;
1394
0
    word32 totalSz = 0;
1395
1396
0
    if (ssl == NULL)
1397
0
        return BAD_FUNC_ARG;
1398
1399
0
    WC_ALLOC_VAR_EX(hmac, Hmac, 1, ssl->heap, DYNAMIC_TYPE_HMAC,
1400
0
                    return MEMORY_E);
1401
1402
#ifdef HAVE_TRUNCATED_HMAC
1403
    hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
1404
                                        : ssl->specs.hash_size;
1405
#else
1406
0
    hashSz = ssl->specs.hash_size;
1407
0
#endif
1408
1409
    /* Pre-compute sz + hashSz + padSz + 1 with overflow checking.
1410
     * Used by fuzzer callback and Hmac_UpdateFinal* in the verify path. */
1411
0
    if (verify && padSz >= 0) {
1412
0
        word32 hmacSz = 0;
1413
0
        if (!WC_SAFE_SUM_WORD32(sz, hashSz, hmacSz) ||
1414
0
            !WC_SAFE_SUM_WORD32(hmacSz, (word32)padSz, hmacSz) ||
1415
0
            !WC_SAFE_SUM_WORD32(hmacSz, 1, hmacSz)) {
1416
0
            WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1417
0
            return BUFFER_E;
1418
0
        }
1419
0
        totalSz = hmacSz;
1420
0
    }
1421
1422
#ifdef HAVE_FUZZER
1423
    /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
1424
    if (ssl->fuzzerCb) {
1425
        if (verify && padSz >= 0) {
1426
            ssl->fuzzerCb(ssl, in, totalSz, FUZZ_HMAC,
1427
                          ssl->fuzzerCtx);
1428
        }
1429
        else {
1430
            ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
1431
        }
1432
    }
1433
#endif
1434
1435
0
    ret = TLS_hmac_SetInner(ssl, myInner, &innerSz, sz, content, verify,
1436
0
                            epochOrder);
1437
0
    if (ret != 0) {
1438
0
        WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1439
0
        return ret;
1440
0
    }
1441
1442
0
    ret = wc_HmacInit(hmac, ssl->heap, ssl->devId);
1443
0
    if (ret != 0) {
1444
0
        WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1445
0
        return ret;
1446
0
    }
1447
1448
1449
#ifdef WOLFSSL_DTLS
1450
    if (ssl->options.dtls)
1451
        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
1452
    else
1453
#endif
1454
0
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
1455
0
    ret = wc_HmacSetKey(hmac, wolfSSL_GetHmacType(ssl),
1456
0
                                              macSecret,
1457
0
                                              ssl->specs.hash_size);
1458
1459
0
    if (ret == 0) {
1460
        /* Constant time verification required. */
1461
0
        if (verify && padSz >= 0) {
1462
0
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
1463
0
    !defined(HAVE_SELFTEST)
1464
0
    #ifdef HAVE_BLAKE2B
1465
0
            if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
1466
0
                ret = Hmac_UpdateFinal(hmac, digest, in,
1467
0
                        totalSz, myInner, innerSz);
1468
0
            }
1469
0
            else
1470
0
    #endif
1471
0
            {
1472
0
                ret = Hmac_UpdateFinal_CT(hmac, digest, in,
1473
0
                                      totalSz,
1474
0
                                      (int)hashSz, myInner, innerSz);
1475
1476
0
            }
1477
#else
1478
            ret = Hmac_UpdateFinal(hmac, digest, in, totalSz,
1479
                                        myInner, innerSz);
1480
#endif
1481
0
        }
1482
0
        else {
1483
0
            ret = wc_HmacUpdate(hmac, myInner, innerSz);
1484
0
            if (ret == 0)
1485
0
                ret = wc_HmacUpdate(hmac, in, sz);                /* content */
1486
0
            if (ret == 0)
1487
0
                ret = wc_HmacFinal(hmac, digest);
1488
0
        }
1489
0
    }
1490
1491
0
    wc_HmacFree(hmac);
1492
0
    WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1493
1494
0
    return ret;
1495
0
}
1496
#endif /* WOLFSSL_AEAD_ONLY */
1497
1498
#endif /* !WOLFSSL_NO_TLS12 */
1499
1500
int wolfSSL_GetHmacType_ex(CipherSpecs* specs)
1501
0
{
1502
0
    if (specs == NULL)
1503
0
        return BAD_FUNC_ARG;
1504
1505
0
    switch (specs->mac_algorithm) {
1506
0
        #ifndef NO_MD5
1507
0
        case md5_mac:
1508
0
        {
1509
0
            return WC_MD5;
1510
0
        }
1511
0
        #endif
1512
0
        #ifndef NO_SHA256
1513
0
        case sha256_mac:
1514
0
        {
1515
0
            return WC_SHA256;
1516
0
        }
1517
0
        #endif
1518
0
        #ifdef WOLFSSL_SHA384
1519
0
        case sha384_mac:
1520
0
        {
1521
0
            return WC_SHA384;
1522
0
        }
1523
0
        #endif
1524
0
        #ifdef WOLFSSL_SM3
1525
0
        case sm3_mac:
1526
0
        {
1527
0
            return WC_SM3;
1528
0
        }
1529
0
        #endif
1530
0
        #ifndef NO_SHA
1531
0
        case sha_mac:
1532
0
        {
1533
0
            return WC_SHA;
1534
0
        }
1535
0
        #endif
1536
0
        #ifdef HAVE_BLAKE2B
1537
0
        case blake2b_mac:
1538
0
        {
1539
0
            return BLAKE2B_ID;
1540
0
        }
1541
0
        #endif
1542
0
        default:
1543
0
        {
1544
0
            return WOLFSSL_FATAL_ERROR;
1545
0
        }
1546
0
    }
1547
0
}
1548
1549
#ifdef HAVE_TLS_EXTENSIONS
1550
1551
/**
1552
 * The TLSX semaphore is used to calculate the size of the extensions to be sent
1553
 * from one peer to another.
1554
 */
1555
1556
/** Supports up to 72 flags. Increase as needed. */
1557
#define SEMAPHORE_SIZE 9
1558
1559
/**
1560
 * Converts the extension type (id) to an index in the semaphore.
1561
 *
1562
 * Official reference for TLS extension types:
1563
 *   http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
1564
 *
1565
 * Motivation:
1566
 *   Previously, we used the extension type itself as the index of that
1567
 *   extension in the semaphore as the extension types were declared
1568
 *   sequentially, but maintain a semaphore as big as the number of available
1569
 *   extensions is no longer an option since the release of renegotiation_info.
1570
 *
1571
 * How to update:
1572
 *   Assign extension types that extrapolate the number of available semaphores
1573
 *   to the first available index going backwards in the semaphore array.
1574
 *   When adding a new extension type that don't extrapolate the number of
1575
 *   available semaphores, check for a possible collision with with a
1576
 *   'remapped' extension type.
1577
 *
1578
 * Update TLSX_Parse for duplicate detection if more added above 62.
1579
 */
1580
static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
1581
{
1582
    switch (type) {
1583
1584
        case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
1585
            return 63;
1586
#ifdef WOLFSSL_QUIC
1587
        case TLSX_KEY_QUIC_TP_PARAMS_DRAFT: /* 0xffa5 */
1588
            return 64;
1589
#endif
1590
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
1591
        case TLSX_ECH: /* 0xfe0d */
1592
            return 65;
1593
#endif
1594
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
1595
        case TLSX_CKS:
1596
            return 66;
1597
#endif
1598
        default:
1599
            if (type > 62) {
1600
                /* This message SHOULD only happens during the adding of
1601
                   new TLS extensions in which its IANA number overflows
1602
                   the current semaphore's range, or if its number already
1603
                   is assigned to be used by another extension.
1604
                   Use this check value for the new extension and decrement
1605
                   the check value by one. */
1606
                WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
1607
            }
1608
    }
1609
1610
    return type;
1611
}
1612
1613
/** Checks if a specific light (tls extension) is not set in the semaphore. */
1614
#define IS_OFF(semaphore, light) \
1615
0
    (!(((semaphore)[(light) / 8] &  (byte) (0x01 << ((light) % 8)))))
1616
1617
/** Turn on a specific light (tls extension) in the semaphore. */
1618
/* the semaphore marks the extensions already written to the message */
1619
#define TURN_ON(semaphore, light) \
1620
0
    ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
1621
1622
/** Turn off a specific light (tls extension) in the semaphore. */
1623
#define TURN_OFF(semaphore, light) \
1624
0
    ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
1625
1626
/** Creates a new extension. */
1627
static TLSX* TLSX_New(TLSX_Type type, const void* data, void* heap)
1628
143k
{
1629
143k
    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
1630
1631
143k
    (void)heap;
1632
1633
143k
    if (extension) {
1634
143k
        extension->type = type;
1635
143k
        extension->data = (void*)data;
1636
143k
        extension->resp = 0;
1637
143k
        extension->next = NULL;
1638
143k
    }
1639
1640
143k
    return extension;
1641
143k
}
1642
1643
/**
1644
 * Creates a new extension and appends it to the provided list.
1645
 * Checks for duplicate extensions, keeps the newest.
1646
 */
1647
int TLSX_Append(TLSX** list, TLSX_Type type, const void* data, void* heap)
1648
0
{
1649
0
    TLSX* extension = TLSX_New(type, data, heap);
1650
0
    TLSX* cur;
1651
0
    TLSX** prevNext = list;
1652
1653
0
    if (extension == NULL)
1654
0
        return MEMORY_E;
1655
1656
0
    for (cur = *list; cur != NULL;) {
1657
0
        if (cur->type == type) {
1658
0
            *prevNext = cur->next;
1659
0
            cur->next = NULL;
1660
0
            TLSX_FreeAll(cur, heap);
1661
0
            cur = *prevNext;
1662
0
        }
1663
0
        else {
1664
0
            prevNext = &cur->next;
1665
0
            cur = cur->next;
1666
0
        }
1667
0
    }
1668
1669
    /* Append the extension to the list */
1670
0
    *prevNext = extension;
1671
1672
0
    return 0;
1673
0
}
1674
1675
/**
1676
 * Creates a new extension and pushes it to the provided list.
1677
 * Checks for duplicate extensions, keeps the newest.
1678
 */
1679
int TLSX_Push(TLSX** list, TLSX_Type type, const void* data, void* heap)
1680
143k
{
1681
143k
    TLSX* extension = TLSX_New(type, data, heap);
1682
1683
143k
    if (extension == NULL)
1684
437
        return MEMORY_E;
1685
1686
    /* pushes the new extension on the list. */
1687
143k
    extension->next = *list;
1688
143k
    *list = extension;
1689
1690
    /* remove duplicate extensions, there should be only one of each type. */
1691
436k
    do {
1692
436k
        if (extension->next && extension->next->type == type) {
1693
398
            TLSX *next = extension->next;
1694
1695
398
            extension->next = next->next;
1696
398
            next->next = NULL;
1697
1698
398
            TLSX_FreeAll(next, heap);
1699
1700
            /* there is no way to occur more than
1701
             * two extensions of the same type.
1702
             */
1703
398
            break;
1704
398
        }
1705
436k
    } while ((extension = extension->next));
1706
1707
143k
    return 0;
1708
143k
}
1709
1710
#ifndef NO_WOLFSSL_CLIENT
1711
1712
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
1713
1714
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
1715
193
{
1716
193
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1717
1718
193
    if (!extension)
1719
193
        extension = TLSX_Find(ssl->ctx->extensions, type);
1720
1721
193
    return extension == NULL;
1722
193
}
1723
1724
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
1725
1726
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
1727
9
{
1728
9
    SendAlert(ssl, alert_fatal, unsupported_extension);
1729
9
    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
1730
9
    return UNSUPPORTED_EXTENSION;
1731
9
}
1732
1733
#else
1734
1735
#define TLSX_CheckUnsupportedExtension(ssl, type) 0
1736
#define TLSX_HandleUnsupportedExtension(ssl) 0
1737
1738
#endif
1739
1740
#if !defined(NO_WOLFSSL_SERVER) || defined(WOLFSSL_TLS13)
1741
static void TLSX_SetResponseInList(TLSX* list, TLSX_Type type);
1742
/** Mark an extension to be sent back to the client.
1743
 *  Operates on a list instead of the ssl.
1744
 *      (Should only be used on ssl->extensions or ech->extensions) */
1745
static void TLSX_SetResponseInList(TLSX* list, TLSX_Type type)
1746
2.27k
{
1747
2.27k
    TLSX *extension = TLSX_Find(list, type);
1748
1749
2.27k
    if (extension)
1750
2.27k
        extension->resp = 1;
1751
2.27k
}
1752
1753
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
1754
/** Mark an extension to be sent back to the client. */
1755
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
1756
2.27k
{
1757
2.27k
    TLSX_SetResponseInList(ssl->extensions, type);
1758
2.27k
}
1759
#endif
1760
1761
/******************************************************************************/
1762
/* Application-Layer Protocol Negotiation                                     */
1763
/******************************************************************************/
1764
1765
#ifdef HAVE_ALPN
1766
/** Creates a new ALPN object, providing protocol name to use. */
1767
static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
1768
                                                                     void* heap)
1769
{
1770
    ALPN *alpn;
1771
1772
    WOLFSSL_ENTER("TLSX_ALPN_New");
1773
1774
    if (protocol_name == NULL ||
1775
        protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
1776
        WOLFSSL_MSG("Invalid arguments");
1777
        return NULL;
1778
    }
1779
1780
    alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
1781
    if (alpn == NULL) {
1782
        WOLFSSL_MSG("Memory failure");
1783
        return NULL;
1784
    }
1785
1786
    alpn->next = NULL;
1787
    alpn->negotiated = 0;
1788
    alpn->options = 0;
1789
1790
    alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
1791
                                         heap, DYNAMIC_TYPE_TLSX);
1792
    if (alpn->protocol_name == NULL) {
1793
        WOLFSSL_MSG("Memory failure");
1794
        XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1795
        return NULL;
1796
    }
1797
1798
    XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
1799
    alpn->protocol_name[protocol_nameSz] = 0;
1800
1801
    (void)heap;
1802
1803
    return alpn;
1804
}
1805
1806
/** Releases an ALPN object. */
1807
static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
1808
{
1809
    (void)heap;
1810
1811
    if (alpn == NULL)
1812
        return;
1813
1814
    XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
1815
    XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1816
}
1817
1818
/** Releases all ALPN objects in the provided list. */
1819
static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
1820
{
1821
    ALPN* alpn;
1822
1823
    while ((alpn = list)) {
1824
        list = alpn->next;
1825
        TLSX_ALPN_Free(alpn, heap);
1826
    }
1827
}
1828
1829
/** Tells the buffered size of the ALPN objects in a list. */
1830
static word16 TLSX_ALPN_GetSize(ALPN *list)
1831
{
1832
    ALPN* alpn;
1833
    word32 length = OPAQUE16_LEN; /* list length */
1834
1835
    while ((alpn = list)) {
1836
        list = alpn->next;
1837
1838
        length++; /* protocol name length is on one byte */
1839
        length += (word32)XSTRLEN(alpn->protocol_name);
1840
1841
        if (length > WOLFSSL_MAX_16BIT) {
1842
            return 0;
1843
        }
1844
    }
1845
1846
    return (word16)length;
1847
}
1848
1849
/** Writes the ALPN objects of a list in a buffer. */
1850
static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
1851
{
1852
    ALPN* alpn;
1853
    word16 length = 0;
1854
    word16 offset = OPAQUE16_LEN; /* list length offset */
1855
1856
    while ((alpn = list)) {
1857
        list = alpn->next;
1858
1859
        length = (word16)XSTRLEN(alpn->protocol_name);
1860
1861
        /* protocol name length */
1862
        output[offset++] = (byte)length;
1863
1864
        /* protocol name value */
1865
        XMEMCPY(output + offset, alpn->protocol_name, length);
1866
1867
        offset += length;
1868
    }
1869
1870
    /* writing list length */
1871
    c16toa(offset - OPAQUE16_LEN, output);
1872
1873
    return offset;
1874
}
1875
1876
/** Finds a protocol name in the provided ALPN list */
1877
static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
1878
{
1879
    ALPN *alpn;
1880
1881
    if (list == NULL || protocol_name == NULL)
1882
        return NULL;
1883
1884
    alpn = list;
1885
    while (alpn != NULL && (
1886
           (word16)XSTRLEN(alpn->protocol_name) != size ||
1887
           XSTRNCMP(alpn->protocol_name, protocol_name, size)))
1888
        alpn = alpn->next;
1889
1890
    return alpn;
1891
}
1892
1893
/** Set the ALPN matching client and server requirements */
1894
static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
1895
                                                                     void* heap)
1896
{
1897
    ALPN *alpn;
1898
    int  ret;
1899
1900
    if (extensions == NULL || data == NULL)
1901
        return BAD_FUNC_ARG;
1902
1903
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1904
    if (alpn == NULL) {
1905
        WOLFSSL_MSG("Memory failure");
1906
        return MEMORY_E;
1907
    }
1908
1909
    alpn->negotiated = 1;
1910
1911
    ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
1912
                                                                          heap);
1913
    if (ret != 0) {
1914
        TLSX_ALPN_Free(alpn, heap);
1915
        return ret;
1916
    }
1917
1918
    return WOLFSSL_SUCCESS;
1919
}
1920
1921
static int ALPN_find_match(WOLFSSL *ssl, TLSX **pextension,
1922
                           const byte **psel, byte *psel_len,
1923
                           const byte *alpn_val, word16 alpn_val_len)
1924
{
1925
    TLSX    *extension;
1926
    ALPN    *alpn, *list;
1927
    const byte *sel = NULL, *s;
1928
    byte sel_len = 0, wlen;
1929
1930
    extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1931
    if (extension == NULL)
1932
        extension = TLSX_Find(ssl->ctx->extensions,
1933
                              TLSX_APPLICATION_LAYER_PROTOCOL);
1934
1935
    /* No ALPN configured here */
1936
    if (extension == NULL || extension->data == NULL) {
1937
        *pextension = NULL;
1938
        *psel = NULL;
1939
        *psel_len = 0;
1940
        return 0;
1941
    }
1942
1943
    list = (ALPN*)extension->data;
1944
    for (s = alpn_val;
1945
         (s - alpn_val) < alpn_val_len;
1946
         s += wlen) {
1947
        wlen = *s++; /* bounds already checked on save */
1948
        alpn = TLSX_ALPN_Find(list, (char*)s, wlen);
1949
        if (alpn != NULL) {
1950
            WOLFSSL_MSG("ALPN protocol match");
1951
            sel = s,
1952
            sel_len = wlen;
1953
            break;
1954
        }
1955
    }
1956
1957
    if (sel == NULL) {
1958
        WOLFSSL_MSG("No ALPN protocol match");
1959
1960
        /* do nothing if no protocol match between client and server and option
1961
         is set to continue (like OpenSSL) */
1962
        if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
1963
            WOLFSSL_MSG("Continue on mismatch");
1964
        }
1965
        else {
1966
            SendAlert(ssl, alert_fatal, no_application_protocol);
1967
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1968
            return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1969
        }
1970
    }
1971
1972
    *pextension = extension;
1973
    *psel = sel;
1974
    *psel_len = sel_len;
1975
    return 0;
1976
}
1977
1978
int ALPN_Select(WOLFSSL *ssl)
1979
{
1980
    TLSX *extension;
1981
    const byte *sel = NULL;
1982
    byte sel_len = 0;
1983
    int r = 0;
1984
1985
    WOLFSSL_ENTER("ALPN_Select");
1986
    if (ssl->alpn_peer_requested == NULL)
1987
        return 0;
1988
1989
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
1990
    if (ssl->alpnSelect != NULL && ssl->options.side == WOLFSSL_SERVER_END) {
1991
        r = ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested,
1992
                ssl->alpn_peer_requested_length, ssl->alpnSelectArg);
1993
        switch (r) {
1994
            case SSL_TLSEXT_ERR_OK:
1995
                WOLFSSL_MSG("ALPN protocol match");
1996
                break;
1997
            case SSL_TLSEXT_ERR_NOACK:
1998
                WOLFSSL_MSG("ALPN cb no match but not fatal");
1999
                sel = NULL;
2000
                sel_len = 0;
2001
                break;
2002
            case SSL_TLSEXT_ERR_ALERT_FATAL:
2003
            default:
2004
                WOLFSSL_MSG("ALPN cb no match and fatal");
2005
                SendAlert(ssl, alert_fatal, no_application_protocol);
2006
                WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
2007
                return UNKNOWN_ALPN_PROTOCOL_NAME_E;
2008
        }
2009
    }
2010
    else
2011
#endif
2012
    {
2013
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len,
2014
                            ssl->alpn_peer_requested,
2015
                            ssl->alpn_peer_requested_length);
2016
        if (r != 0)
2017
            return r;
2018
    }
2019
2020
    if (sel != NULL) {
2021
        /* set the matching negotiated protocol */
2022
        r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
2023
        if (r != WOLFSSL_SUCCESS) {
2024
            WOLFSSL_MSG("TLSX_SetALPN failed");
2025
            return BUFFER_ERROR;
2026
        }
2027
        /* reply to ALPN extension sent from peer */
2028
#ifndef NO_WOLFSSL_SERVER
2029
        TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
2030
#endif
2031
    }
2032
    return 0;
2033
}
2034
2035
/** Parses a buffer of ALPN extensions and set the first one matching
2036
 * client and server requirements */
2037
static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, const byte *input, word16 length,
2038
                                 byte isRequest)
2039
{
2040
    word16  size = 0, offset = 0, wlen;
2041
    int     r = WC_NO_ERR_TRACE(BUFFER_ERROR);
2042
    const byte *s;
2043
    word16  entryCount = 0;
2044
2045
    if (OPAQUE16_LEN > length)
2046
        return BUFFER_ERROR;
2047
2048
    ato16(input, &size);
2049
    offset += OPAQUE16_LEN;
2050
2051
    /* validating alpn list length */
2052
    if (size == 0 || length != OPAQUE16_LEN + size)
2053
        return BUFFER_ERROR;
2054
2055
    /* validating length of entries before accepting */
2056
    for (s = input + offset; (s - input) < length; s += wlen) {
2057
        wlen = *s++;
2058
        if (wlen == 0 || (s + wlen - input) > length)
2059
            return BUFFER_ERROR;
2060
        entryCount++;
2061
    }
2062
2063
    /* RFC 7301 Section 3.1: the server's ProtocolNameList in its ALPN
2064
     * response MUST contain exactly one ProtocolName. */
2065
    if (!isRequest && entryCount != 1) {
2066
        SendAlert(ssl, alert_fatal, decode_error);
2067
        WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
2068
        return BUFFER_ERROR;
2069
    }
2070
2071
    if (isRequest) {
2072
        /* keep the list sent by peer, if this is from a request. We
2073
         * use it later in ALPN_Select() for evaluation. */
2074
        if (ssl->alpn_peer_requested != NULL) {
2075
            XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
2076
            ssl->alpn_peer_requested_length = 0;
2077
        }
2078
        ssl->alpn_peer_requested = (byte *)XMALLOC(size, ssl->heap,
2079
                                                   DYNAMIC_TYPE_ALPN);
2080
        if (ssl->alpn_peer_requested == NULL) {
2081
            return MEMORY_ERROR;
2082
        }
2083
        ssl->alpn_peer_requested_length = size;
2084
        XMEMCPY(ssl->alpn_peer_requested, (char*)input + offset, size);
2085
    }
2086
    else {
2087
        /* a response, we should find the value in our config */
2088
        const byte *sel = NULL;
2089
        byte sel_len = 0;
2090
        TLSX *extension = NULL;
2091
2092
        /* RFC 7301 Section 3.1: a ServerHello ALPN extension MUST contain
2093
         * exactly one protocol name. The first name's length byte plus its
2094
         * payload must therefore span the whole list. */
2095
        if ((word16)(input[offset] + OPAQUE8_LEN) != size) {
2096
            SendAlert(ssl, alert_fatal, illegal_parameter);
2097
            WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
2098
            return BUFFER_ERROR;
2099
        }
2100
2101
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len, input + offset, size);
2102
        if (r != 0)
2103
            return r;
2104
2105
        if (sel != NULL) {
2106
            /* set the matching negotiated protocol */
2107
            r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
2108
            if (r != WOLFSSL_SUCCESS) {
2109
                WOLFSSL_MSG("TLSX_SetALPN failed");
2110
                return BUFFER_ERROR;
2111
            }
2112
        }
2113
        /* If we had nothing configured, the response is unexpected */
2114
        else if (extension == NULL) {
2115
            r = TLSX_HandleUnsupportedExtension(ssl);
2116
            if (r != 0)
2117
                return r;
2118
        }
2119
    }
2120
    return 0;
2121
}
2122
2123
/** Add a protocol name to the list of accepted usable ones */
2124
int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
2125
                                                                     void* heap)
2126
{
2127
    ALPN *alpn;
2128
    TLSX *extension;
2129
    int  ret;
2130
2131
    if (extensions == NULL || data == NULL)
2132
        return BAD_FUNC_ARG;
2133
2134
    alpn = TLSX_ALPN_New((char *)data, size, heap);
2135
    if (alpn == NULL) {
2136
        WOLFSSL_MSG("Memory failure");
2137
        return MEMORY_E;
2138
    }
2139
2140
    /* Set Options of ALPN */
2141
    alpn->options = options;
2142
2143
    extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2144
    if (extension == NULL) {
2145
        ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
2146
                                                             (void*)alpn, heap);
2147
        if (ret != 0) {
2148
            TLSX_ALPN_Free(alpn, heap);
2149
            return ret;
2150
        }
2151
    }
2152
    else {
2153
        /* push new ALPN object to extension data. */
2154
        alpn->next = (ALPN*)extension->data;
2155
        extension->data = (void*)alpn;
2156
    }
2157
2158
    return WOLFSSL_SUCCESS;
2159
}
2160
2161
/** Get the protocol name set by the server */
2162
int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
2163
{
2164
    TLSX *extension;
2165
    ALPN *alpn;
2166
2167
    if (extensions == NULL || data == NULL || dataSz == NULL)
2168
        return BAD_FUNC_ARG;
2169
2170
    *data = NULL;
2171
    *dataSz = 0;
2172
2173
    extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2174
    if (extension == NULL) {
2175
        WOLFSSL_MSG("TLS extension not found");
2176
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2177
        return WOLFSSL_ALPN_NOT_FOUND;
2178
    }
2179
2180
    alpn = (ALPN *)extension->data;
2181
    if (alpn == NULL) {
2182
        WOLFSSL_MSG("ALPN extension not found");
2183
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2184
        return WOLFSSL_FATAL_ERROR;
2185
    }
2186
2187
    if (alpn->negotiated != 1) {
2188
2189
        /* consider as an error */
2190
        if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
2191
            WOLFSSL_MSG("No protocol match with peer -> Failed");
2192
            WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2193
            return WOLFSSL_FATAL_ERROR;
2194
        }
2195
2196
        /* continue without negotiated protocol */
2197
        WOLFSSL_MSG("No protocol match with peer -> Continue");
2198
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2199
        return WOLFSSL_ALPN_NOT_FOUND;
2200
    }
2201
2202
    if (alpn->next != NULL) {
2203
        WOLFSSL_MSG("Only one protocol name must be accepted");
2204
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2205
        return WOLFSSL_FATAL_ERROR;
2206
    }
2207
2208
    *data = alpn->protocol_name;
2209
    *dataSz = (word16)XSTRLEN((char*)*data);
2210
2211
    return WOLFSSL_SUCCESS;
2212
}
2213
2214
#define ALPN_FREE_ALL     TLSX_ALPN_FreeAll
2215
#define ALPN_GET_SIZE     TLSX_ALPN_GetSize
2216
#define ALPN_WRITE        TLSX_ALPN_Write
2217
#define ALPN_PARSE        TLSX_ALPN_ParseAndSet
2218
2219
#else /* HAVE_ALPN */
2220
2221
0
#define ALPN_FREE_ALL(list, heap) WC_DO_NOTHING
2222
0
#define ALPN_GET_SIZE(list)     0
2223
#define ALPN_WRITE(a, b)        0
2224
0
#define ALPN_PARSE(a, b, c, d)  0
2225
2226
#endif /* HAVE_ALPN */
2227
2228
/******************************************************************************/
2229
/* Server Name Indication                                                     */
2230
/******************************************************************************/
2231
2232
#ifdef HAVE_SNI
2233
2234
/** Creates a new SNI object. */
2235
static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
2236
28
{
2237
28
    SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
2238
2239
28
    (void)heap;
2240
2241
28
    if (sni) {
2242
28
        sni->type = type;
2243
28
        sni->next = NULL;
2244
2245
28
    #ifndef NO_WOLFSSL_SERVER
2246
28
        sni->options = 0;
2247
28
        sni->status  = WOLFSSL_SNI_NO_MATCH;
2248
28
    #endif
2249
2250
28
        switch (sni->type) {
2251
28
            case WOLFSSL_SNI_HOST_NAME:
2252
28
                sni->data.host_name = (char*)XMALLOC(size + 1, heap,
2253
28
                                                     DYNAMIC_TYPE_TLSX);
2254
28
                if (sni->data.host_name) {
2255
28
                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
2256
28
                    sni->data.host_name[size] = '\0';
2257
28
                } else {
2258
0
                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2259
0
                    sni = NULL;
2260
0
                }
2261
28
            break;
2262
2263
0
            default: /* invalid type */
2264
0
                XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2265
0
                sni = NULL;
2266
28
        }
2267
28
    }
2268
2269
28
    return sni;
2270
28
}
2271
2272
/** Releases a SNI object. */
2273
static void TLSX_SNI_Free(SNI* sni, void* heap)
2274
0
{
2275
0
    if (sni) {
2276
0
        switch (sni->type) {
2277
0
            case WOLFSSL_SNI_HOST_NAME:
2278
0
                XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
2279
0
            break;
2280
0
        }
2281
2282
0
        XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2283
0
    }
2284
0
    (void)heap;
2285
0
}
2286
2287
/** Releases all SNI objects in the provided list. */
2288
static void TLSX_SNI_FreeAll(SNI* list, void* heap)
2289
0
{
2290
0
    SNI* sni;
2291
2292
0
    while ((sni = list)) {
2293
0
        list = sni->next;
2294
0
        TLSX_SNI_Free(sni, heap);
2295
0
    }
2296
0
}
2297
2298
/** Tells the buffered size of the SNI objects in a list. */
2299
WOLFSSL_TEST_VIS word16 TLSX_SNI_GetSize(SNI* list)
2300
20.4k
{
2301
20.4k
    SNI* sni;
2302
20.4k
    word32 length = OPAQUE16_LEN; /* list length */
2303
2304
40.8k
    while ((sni = list)) {
2305
20.4k
        list = sni->next;
2306
2307
20.4k
        length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
2308
2309
20.4k
        switch (sni->type) {
2310
20.4k
            case WOLFSSL_SNI_HOST_NAME:
2311
20.4k
                length += (word32)XSTRLEN((char*)sni->data.host_name);
2312
20.4k
            break;
2313
20.4k
        }
2314
2315
20.4k
        if (length > WOLFSSL_MAX_16BIT) {
2316
0
            return 0;
2317
0
        }
2318
20.4k
    }
2319
2320
20.4k
    return (word16)length;
2321
20.4k
}
2322
2323
/** Writes the SNI objects of a list in a buffer. */
2324
static word16 TLSX_SNI_Write(SNI* list, byte* output)
2325
18.3k
{
2326
18.3k
    SNI* sni;
2327
18.3k
    word16 length = 0;
2328
18.3k
    word16 offset = OPAQUE16_LEN; /* list length offset */
2329
2330
36.6k
    while ((sni = list)) {
2331
18.3k
        list = sni->next;
2332
2333
18.3k
        output[offset++] = sni->type; /* sni type */
2334
2335
18.3k
        switch (sni->type) {
2336
18.3k
            case WOLFSSL_SNI_HOST_NAME:
2337
18.3k
                length = (word16)XSTRLEN((char*)sni->data.host_name);
2338
2339
18.3k
                c16toa(length, output + offset); /* sni length */
2340
18.3k
                offset += OPAQUE16_LEN;
2341
2342
18.3k
                XMEMCPY(output + offset, sni->data.host_name, length);
2343
2344
18.3k
                offset += length;
2345
18.3k
            break;
2346
18.3k
        }
2347
18.3k
    }
2348
2349
18.3k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2350
2351
18.3k
    return offset;
2352
18.3k
}
2353
2354
/** Finds a SNI object in the provided list. */
2355
static SNI* TLSX_SNI_Find(SNI *list, byte type)
2356
983
{
2357
983
    SNI* sni = list;
2358
2359
983
    while (sni && sni->type != type)
2360
0
        sni = sni->next;
2361
2362
983
    return sni;
2363
983
}
2364
2365
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
2366
/** Sets the status of a SNI object. */
2367
static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
2368
40
{
2369
40
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2370
40
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2371
2372
40
    if (sni)
2373
0
        sni->status = status;
2374
40
}
2375
#endif
2376
2377
/** Gets the status of a SNI object. */
2378
byte TLSX_SNI_Status(TLSX* extensions, byte type)
2379
0
{
2380
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2381
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2382
2383
0
    if (sni)
2384
0
        return sni->status;
2385
2386
0
    return 0;
2387
0
}
2388
2389
/** Parses a buffer of SNI extensions. */
2390
static int TLSX_SNI_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2391
                          byte isRequest)
2392
787
{
2393
787
#ifndef NO_WOLFSSL_SERVER
2394
787
    word16 size = 0;
2395
787
    word16 offset = 0;
2396
787
    int cacheOnly = 0;
2397
787
    int checkPublic = 0;
2398
787
    SNI* sni = NULL;
2399
787
    byte type;
2400
787
    byte matched = 0;
2401
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2402
    TLSX* echX = NULL;
2403
    WOLFSSL_ECH* ech = NULL;
2404
    WOLFSSL_EchConfig* workingConfig = NULL;
2405
#endif
2406
787
#endif /* !NO_WOLFSSL_SERVER */
2407
787
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
2408
2409
787
    if (!extension)
2410
787
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2411
2412
787
    if (!isRequest) {
2413
48
        #ifndef NO_WOLFSSL_CLIENT
2414
48
            if (!extension || !extension->data)
2415
0
                return TLSX_HandleUnsupportedExtension(ssl);
2416
2417
48
            if (length > 0)
2418
8
                return BUFFER_ERROR; /* SNI response MUST be empty. */
2419
2420
            /* This call enables wolfSSL_SNI_GetRequest() to be called in the
2421
             * client side to fetch the used SNI. It will only work if the SNI
2422
             * was set at the SSL object level. Right now we only support one
2423
             * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
2424
             * inclusion of other name types will turn this method inaccurate,
2425
             * as the extension response doesn't contains information of which
2426
             * name was accepted.
2427
             */
2428
40
            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
2429
40
                                                        WOLFSSL_SNI_REAL_MATCH);
2430
2431
40
            return 0;
2432
48
        #endif
2433
48
    }
2434
2435
739
#ifndef NO_WOLFSSL_SERVER
2436
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2437
    if (!ssl->options.disableECH && !ssl->options.echProcessingInner) {
2438
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
2439
        if (echX != NULL) {
2440
            ech = (WOLFSSL_ECH*)(echX->data);
2441
        }
2442
    }
2443
#endif
2444
2445
739
    if (!extension || !extension->data) {
2446
        /* This will keep SNI even though TLSX_UseSNI has not been called.
2447
         * Enable it so that the received sni is available to functions
2448
         * that use a custom callback when SNI is received.
2449
         */
2450
    #ifdef WOLFSSL_ALWAYS_KEEP_SNI
2451
        cacheOnly = 1;
2452
    #endif
2453
739
        if (ssl->ctx->sniRecvCb) {
2454
0
            cacheOnly = 1;
2455
0
        }
2456
2457
739
        if (cacheOnly) {
2458
0
            WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
2459
0
        }
2460
739
        else {
2461
        #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2462
            if (ech == NULL)
2463
        #endif
2464
739
            {
2465
                /* Skipping, SNI not enabled at server side. */
2466
739
                return 0;
2467
739
            }
2468
2469
        #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2470
            /* No server SNI configured but ECH is active:
2471
             * the outer SNI still needs to be matched against the echConfig
2472
             * publicName and recorded on ech->extensions. */
2473
            checkPublic = 1;
2474
        #endif
2475
739
        }
2476
739
    }
2477
2478
0
    if (OPAQUE16_LEN > length)
2479
0
        return BUFFER_ERROR;
2480
2481
0
    ato16(input, &size);
2482
0
    offset += OPAQUE16_LEN;
2483
2484
    /* validating sni list length */
2485
0
    if (length != OPAQUE16_LEN + size || size == 0)
2486
0
        return BUFFER_ERROR;
2487
2488
    /* SNI was badly specified and only one type is now recognized and allowed.
2489
     * Only one SNI value per type (RFC6066), so, no loop. */
2490
0
    type = input[offset++];
2491
0
    if (type != WOLFSSL_SNI_HOST_NAME)
2492
0
        return BUFFER_ERROR;
2493
2494
0
    if (offset + OPAQUE16_LEN > length)
2495
0
        return BUFFER_ERROR;
2496
0
    ato16(input + offset, &size);
2497
0
    offset += OPAQUE16_LEN;
2498
2499
0
    if (offset + size != length || size == 0)
2500
0
        return BUFFER_ERROR;
2501
2502
0
    if (!cacheOnly && !checkPublic &&
2503
0
            !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
2504
0
        return 0; /* not using this type of SNI. */
2505
2506
0
#if defined(WOLFSSL_TLS13)
2507
    /* Don't process the second ClientHello SNI extension if there
2508
     * was problems with the first.
2509
     */
2510
0
    if (!cacheOnly && sni != NULL && sni->status != WOLFSSL_SNI_NO_MATCH)
2511
0
        return 0;
2512
0
#endif
2513
2514
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2515
    /* While parsing the outer CH accept a match against any
2516
     * echConfig publicName */
2517
    if (ech != NULL) {
2518
        workingConfig = ech->echConfig;
2519
        while (workingConfig != NULL) {
2520
            if (XSTRLEN(workingConfig->publicName) == size &&
2521
                    XSTRNCMP(workingConfig->publicName,
2522
                    (const char*)input + offset, size) == 0) {
2523
                matched = 1;
2524
                break;
2525
            }
2526
            workingConfig = workingConfig->next;
2527
        }
2528
2529
        /* If a publicName is matched then this SNI is not something that should
2530
         * be forcibly cached. This allows an SNI response to be given for the
2531
         * public name */
2532
        if (matched)
2533
            cacheOnly = 0;
2534
    }
2535
    if (!matched)
2536
#endif
2537
0
    {
2538
0
        const char* hostName;
2539
0
        hostName = (sni != NULL) ? sni->data.host_name : NULL;
2540
0
        matched = cacheOnly || (hostName != NULL &&
2541
0
            XSTRLEN(hostName) == size &&
2542
0
            XSTRNCMP(hostName, (const char*)input + offset, size) == 0);
2543
0
    }
2544
2545
    /* No server SNI configured and the outer name did not match a publicName:
2546
     * stay permissive and record nothing. If ECH is accepted, the absent
2547
     * publicName match is caught after the outer parse. */
2548
0
    if (!matched && checkPublic)
2549
0
        return 0;
2550
2551
0
    if (matched ||
2552
0
            (sni != NULL && (sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH))) {
2553
0
        int matchStat;
2554
0
        int r;
2555
0
        TLSX** writeList = &ssl->extensions;
2556
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2557
        /* install onto ech->extensions if the public name was matched */
2558
        if (workingConfig != NULL)
2559
            writeList = &ech->extensions;
2560
#endif
2561
2562
0
        r = TLSX_UseSNI(writeList, type, input + offset, size, ssl->heap);
2563
2564
0
        if (r != WOLFSSL_SUCCESS)
2565
0
            return r; /* throws error. */
2566
2567
0
        if (cacheOnly) {
2568
0
            WOLFSSL_MSG("Forcing storage of SNI, Fake match");
2569
0
            matchStat = WOLFSSL_SNI_FORCE_KEEP;
2570
0
        }
2571
0
        else if (matched) {
2572
0
            WOLFSSL_MSG("SNI did match!");
2573
0
            matchStat = WOLFSSL_SNI_REAL_MATCH;
2574
0
        }
2575
0
        else {
2576
0
            WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
2577
0
            matchStat = WOLFSSL_SNI_FAKE_MATCH;
2578
0
        }
2579
2580
0
        TLSX_SNI_SetStatus(*writeList, type, (byte)matchStat);
2581
2582
0
        if (!cacheOnly)
2583
0
            TLSX_SetResponseInList(*writeList, TLSX_SERVER_NAME);
2584
0
    }
2585
0
    else if ((sni == NULL) ||
2586
0
            !(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
2587
0
        SendAlert(ssl, alert_fatal, unrecognized_name);
2588
0
        WOLFSSL_ERROR_VERBOSE(UNKNOWN_SNI_HOST_NAME_E);
2589
0
        return UNKNOWN_SNI_HOST_NAME_E;
2590
0
    }
2591
#else
2592
    (void)input;
2593
#endif /* !NO_WOLFSSL_SERVER */
2594
2595
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
2596
    (void)length;
2597
#endif
2598
2599
0
    return 0;
2600
0
}
2601
2602
static int TLSX_SNI_VerifyParse(WOLFSSL* ssl,  byte isRequest)
2603
14.7k
{
2604
14.7k
    (void)ssl;
2605
2606
14.7k
    if (isRequest) {
2607
8.82k
    #ifndef NO_WOLFSSL_SERVER
2608
8.82k
        TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2609
8.82k
        TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
2610
8.82k
        SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
2611
8.82k
        SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
2612
8.82k
        SNI* sni = NULL;
2613
2614
8.82k
        for (; ctx_sni; ctx_sni = ctx_sni->next) {
2615
0
            if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2616
0
                sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
2617
2618
0
                if (sni) {
2619
0
                    if (sni->status != WOLFSSL_SNI_NO_MATCH)
2620
0
                        continue;
2621
2622
                    /* if ssl level overrides ctx level, it is ok. */
2623
0
                    if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
2624
0
                        continue;
2625
0
                }
2626
2627
0
                SendAlert(ssl, alert_fatal,
2628
0
                          IsAtLeastTLSv1_3(ssl->version)
2629
0
                              ? missing_extension
2630
0
                              : handshake_failure);
2631
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2632
0
                return SNI_ABSENT_ERROR;
2633
0
            }
2634
0
        }
2635
2636
8.82k
        for (; ssl_sni; ssl_sni = ssl_sni->next) {
2637
0
            if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2638
0
                if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
2639
0
                    continue;
2640
2641
0
                SendAlert(ssl, alert_fatal,
2642
0
                          IsAtLeastTLSv1_3(ssl->version)
2643
0
                              ? missing_extension
2644
0
                              : handshake_failure);
2645
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2646
0
                return SNI_ABSENT_ERROR;
2647
0
            }
2648
0
        }
2649
8.82k
    #endif /* NO_WOLFSSL_SERVER */
2650
8.82k
    }
2651
2652
14.7k
    return 0;
2653
14.7k
}
2654
2655
int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
2656
                                                                     void* heap)
2657
28
{
2658
28
    TLSX* extension;
2659
28
    SNI* sni = NULL;
2660
2661
28
    if (extensions == NULL || data == NULL)
2662
0
        return BAD_FUNC_ARG;
2663
2664
28
    if ((type == WOLFSSL_SNI_HOST_NAME) && (size >= WOLFSSL_HOST_NAME_MAX))
2665
0
        return BAD_LENGTH_E;
2666
2667
28
    if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
2668
0
        return MEMORY_E;
2669
2670
28
    extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
2671
28
    if (!extension) {
2672
28
        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
2673
2674
28
        if (ret != 0) {
2675
0
            TLSX_SNI_Free(sni, heap);
2676
0
            return ret;
2677
0
        }
2678
28
    }
2679
0
    else {
2680
        /* push new SNI object to extension data. */
2681
0
        sni->next = (SNI*)extension->data;
2682
0
        extension->data = (void*)sni;
2683
2684
        /* remove duplicate SNI, there should be only one of each type. */
2685
0
        do {
2686
0
            if (sni->next && sni->next->type == type) {
2687
0
                SNI* next = sni->next;
2688
2689
0
                sni->next = next->next;
2690
0
                TLSX_SNI_Free(next, heap);
2691
2692
                /* there is no way to occur more than
2693
                 * two SNIs of the same type.
2694
                 */
2695
0
                break;
2696
0
            }
2697
0
        } while ((sni = sni->next));
2698
0
    }
2699
2700
28
    return WOLFSSL_SUCCESS;
2701
28
}
2702
2703
/* client-side needs this function when ECH is enabled */
2704
#if !defined(NO_WOLFSSL_SERVER) || defined(HAVE_ECH)
2705
/** Tells the SNI requested by the client. */
2706
word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data,
2707
        byte ignoreStatus)
2708
943
{
2709
943
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2710
943
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2711
2712
943
    if (sni && (ignoreStatus || sni->status != WOLFSSL_SNI_NO_MATCH)) {
2713
0
        switch (sni->type) {
2714
0
            case WOLFSSL_SNI_HOST_NAME:
2715
0
                if (data) {
2716
0
                    *data = sni->data.host_name;
2717
0
                    return (word16)XSTRLEN((char*)*data);
2718
0
                }
2719
0
        }
2720
0
    }
2721
2722
943
    return 0;
2723
943
}
2724
#endif
2725
2726
#ifndef NO_WOLFSSL_SERVER
2727
/** Sets the options for a SNI object. */
2728
void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
2729
0
{
2730
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2731
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2732
2733
0
    if (sni)
2734
0
        sni->options = options;
2735
0
}
2736
2737
/** Retrieves a SNI request from a client hello buffer. */
2738
int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
2739
                           byte type, byte* sni, word32* inOutSz)
2740
0
{
2741
0
    word32 offset = 0;
2742
0
    word32 len32 = 0;
2743
0
    word16 len16 = 0;
2744
2745
0
    if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
2746
0
        return INCOMPLETE_DATA;
2747
2748
    /* TLS record header */
2749
0
    if ((enum ContentType) clientHello[offset++] != handshake) {
2750
2751
        /* checking for SSLv2.0 client hello according to: */
2752
        /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
2753
0
        if ((enum HandShakeType) clientHello[++offset] == client_hello) {
2754
0
            offset += ENUM_LEN + VERSION_SZ; /* skip version */
2755
2756
0
            ato16(clientHello + offset, &len16);
2757
0
            offset += OPAQUE16_LEN;
2758
2759
0
            if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
2760
0
                return BUFFER_ERROR;
2761
2762
0
            ato16(clientHello + offset, &len16);
2763
            /* Returning SNI_UNSUPPORTED do not increment offset here */
2764
2765
0
            if (len16 != 0) /* session_id_length must be 0 */
2766
0
                return BUFFER_ERROR;
2767
2768
0
            WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2769
0
            return SNI_UNSUPPORTED;
2770
0
        }
2771
2772
0
        return BUFFER_ERROR;
2773
0
    }
2774
2775
0
    if (clientHello[offset++] != SSLv3_MAJOR)
2776
0
        return BUFFER_ERROR;
2777
2778
0
    if (clientHello[offset++] < TLSv1_MINOR) {
2779
0
        WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2780
0
        return SNI_UNSUPPORTED;
2781
0
    }
2782
2783
0
    ato16(clientHello + offset, &len16);
2784
0
    offset += OPAQUE16_LEN;
2785
2786
0
    if (offset + len16 > helloSz)
2787
0
        return INCOMPLETE_DATA;
2788
2789
    /* Handshake header */
2790
0
    if ((enum HandShakeType) clientHello[offset] != client_hello)
2791
0
        return BUFFER_ERROR;
2792
2793
0
    c24to32(clientHello + offset + 1, &len32);
2794
0
    offset += HANDSHAKE_HEADER_SZ;
2795
2796
0
    if (offset + len32 > helloSz)
2797
0
        return BUFFER_ERROR;
2798
2799
    /* client hello */
2800
0
    offset += VERSION_SZ + RAN_LEN; /* version, random */
2801
2802
0
    if (helloSz < offset + clientHello[offset])
2803
0
        return BUFFER_ERROR;
2804
2805
0
    offset += ENUM_LEN + clientHello[offset]; /* skip session id */
2806
2807
    /* cypher suites */
2808
0
    if (helloSz < offset + OPAQUE16_LEN)
2809
0
        return BUFFER_ERROR;
2810
2811
0
    ato16(clientHello + offset, &len16);
2812
0
    offset += OPAQUE16_LEN;
2813
2814
0
    if (helloSz < offset + len16)
2815
0
        return BUFFER_ERROR;
2816
2817
0
    offset += len16; /* skip cypher suites */
2818
2819
    /* compression methods */
2820
0
    if (helloSz < offset + 1)
2821
0
        return BUFFER_ERROR;
2822
2823
0
    if (helloSz < offset + clientHello[offset])
2824
0
        return BUFFER_ERROR;
2825
2826
0
    offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
2827
2828
    /* extensions */
2829
0
    if (helloSz < offset + OPAQUE16_LEN)
2830
0
        return 0; /* no extensions in client hello. */
2831
2832
0
    ato16(clientHello + offset, &len16);
2833
0
    offset += OPAQUE16_LEN;
2834
2835
0
    if (helloSz < offset + len16)
2836
0
        return BUFFER_ERROR;
2837
2838
0
    while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
2839
0
        word16 extType;
2840
0
        word16 extLen;
2841
2842
0
        ato16(clientHello + offset, &extType);
2843
0
        offset += OPAQUE16_LEN;
2844
2845
0
        ato16(clientHello + offset, &extLen);
2846
0
        offset += OPAQUE16_LEN;
2847
2848
0
        if (helloSz < offset + extLen)
2849
0
            return BUFFER_ERROR;
2850
2851
0
        if (extType != TLSX_SERVER_NAME) {
2852
0
            offset += extLen; /* skip extension */
2853
0
        } else {
2854
0
            word16 listLen;
2855
2856
0
            if (extLen < OPAQUE16_LEN)
2857
0
                return BUFFER_ERROR;
2858
2859
0
            ato16(clientHello + offset, &listLen);
2860
0
            offset += OPAQUE16_LEN;
2861
2862
0
            if (listLen != extLen - OPAQUE16_LEN)
2863
0
                return BUFFER_ERROR;
2864
2865
0
            if (helloSz < offset + listLen)
2866
0
                return BUFFER_ERROR;
2867
2868
0
            while (listLen > ENUM_LEN + OPAQUE16_LEN) {
2869
0
                byte   sniType = clientHello[offset++];
2870
0
                word16 sniLen;
2871
2872
0
                ato16(clientHello + offset, &sniLen);
2873
0
                offset += OPAQUE16_LEN;
2874
2875
0
                if (sniLen > listLen - (ENUM_LEN + OPAQUE16_LEN))
2876
0
                    return BUFFER_ERROR;
2877
2878
0
                if (helloSz < offset + sniLen)
2879
0
                    return BUFFER_ERROR;
2880
2881
0
                if (sniType != type) {
2882
0
                    offset  += sniLen;
2883
0
                    listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
2884
0
                    continue;
2885
0
                }
2886
2887
0
                *inOutSz = min(sniLen, *inOutSz);
2888
0
                XMEMCPY(sni, clientHello + offset, *inOutSz);
2889
2890
0
                return WOLFSSL_SUCCESS;
2891
0
            }
2892
0
        }
2893
2894
0
        len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
2895
0
    }
2896
2897
0
    return len16 ? BUFFER_ERROR : 0;
2898
0
}
2899
2900
#endif
2901
2902
0
#define SNI_FREE_ALL     TLSX_SNI_FreeAll
2903
0
#define SNI_GET_SIZE     TLSX_SNI_GetSize
2904
#define SNI_WRITE        TLSX_SNI_Write
2905
0
#define SNI_PARSE        TLSX_SNI_Parse
2906
0
#define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
2907
2908
#else
2909
2910
#define SNI_FREE_ALL(list, heap) WC_DO_NOTHING
2911
#define SNI_GET_SIZE(list)     0
2912
#define SNI_WRITE(a, b)        0
2913
#define SNI_PARSE(a, b, c, d)  0
2914
#define SNI_VERIFY_PARSE(a, b) 0
2915
2916
#endif /* HAVE_SNI */
2917
2918
/******************************************************************************/
2919
/* Trusted CA Key Indication                                                  */
2920
/******************************************************************************/
2921
2922
#ifdef HAVE_TRUSTED_CA
2923
2924
/** Creates a new TCA object. */
2925
static TCA* TLSX_TCA_New(byte type, const byte* id, word16 idSz, void* heap)
2926
{
2927
    TCA* tca = (TCA*)XMALLOC(sizeof(TCA), heap, DYNAMIC_TYPE_TLSX);
2928
2929
    if (tca) {
2930
        XMEMSET(tca, 0, sizeof(TCA));
2931
        tca->type = type;
2932
2933
        switch (type) {
2934
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2935
                break;
2936
2937
            #ifndef NO_SHA
2938
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2939
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2940
                if (idSz == WC_SHA_DIGEST_SIZE &&
2941
                        (tca->id =
2942
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2943
                    XMEMCPY(tca->id, id, idSz);
2944
                    tca->idSz = idSz;
2945
                }
2946
                else {
2947
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2948
                    tca = NULL;
2949
                }
2950
                break;
2951
            #endif
2952
2953
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2954
                if (idSz > 0 &&
2955
                        (tca->id =
2956
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2957
                    XMEMCPY(tca->id, id, idSz);
2958
                    tca->idSz = idSz;
2959
                }
2960
                else {
2961
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2962
                    tca = NULL;
2963
                }
2964
                break;
2965
2966
            default: /* invalid type */
2967
                XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2968
                tca = NULL;
2969
        }
2970
    }
2971
2972
    (void)heap;
2973
2974
    return tca;
2975
}
2976
2977
/** Releases a TCA object. */
2978
static void TLSX_TCA_Free(TCA* tca, void* heap)
2979
{
2980
    (void)heap;
2981
2982
    if (tca) {
2983
        XFREE(tca->id, heap, DYNAMIC_TYPE_TLSX);
2984
        XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2985
    }
2986
}
2987
2988
/** Releases all TCA objects in the provided list. */
2989
static void TLSX_TCA_FreeAll(TCA* list, void* heap)
2990
{
2991
    TCA* tca;
2992
2993
    while ((tca = list)) {
2994
        list = tca->next;
2995
        TLSX_TCA_Free(tca, heap);
2996
    }
2997
}
2998
2999
/** Tells the buffered size of the TCA objects in a list. */
3000
static word16 TLSX_TCA_GetSize(TCA* list)
3001
{
3002
    TCA* tca;
3003
    word32 length = OPAQUE16_LEN; /* list length */
3004
3005
    while ((tca = list)) {
3006
        list = tca->next;
3007
3008
        length += ENUM_LEN; /* tca type */
3009
3010
        switch (tca->type) {
3011
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
3012
                break;
3013
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3014
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3015
                length += tca->idSz;
3016
                break;
3017
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3018
                length += OPAQUE16_LEN + tca->idSz;
3019
                break;
3020
        }
3021
3022
        if (length > WOLFSSL_MAX_16BIT) {
3023
            return 0;
3024
        }
3025
    }
3026
3027
    return (word16)length;
3028
}
3029
3030
/** Writes the TCA objects of a list in a buffer. */
3031
static word16 TLSX_TCA_Write(TCA* list, byte* output)
3032
{
3033
    TCA* tca;
3034
    word16 offset = OPAQUE16_LEN; /* list length offset */
3035
3036
    while ((tca = list)) {
3037
        list = tca->next;
3038
3039
        output[offset++] = tca->type; /* tca type */
3040
3041
        switch (tca->type) {
3042
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
3043
                break;
3044
            #ifndef NO_SHA
3045
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3046
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3047
                if (tca->id != NULL) {
3048
                    XMEMCPY(output + offset, tca->id, tca->idSz);
3049
                    offset += tca->idSz;
3050
                }
3051
                else {
3052
                    /* ID missing. Set to an empty string. */
3053
                    c16toa(0, output + offset);
3054
                    offset += OPAQUE16_LEN;
3055
                }
3056
                break;
3057
            #endif
3058
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3059
                if (tca->id != NULL) {
3060
                    c16toa(tca->idSz, output + offset); /* tca length */
3061
                    offset += OPAQUE16_LEN;
3062
                    XMEMCPY(output + offset, tca->id, tca->idSz);
3063
                    offset += tca->idSz;
3064
                }
3065
                else {
3066
                    /* ID missing. Set to an empty string. */
3067
                    c16toa(0, output + offset);
3068
                    offset += OPAQUE16_LEN;
3069
                }
3070
                break;
3071
            default:
3072
                /* ID unknown. Set to an empty string. */
3073
                c16toa(0, output + offset);
3074
                offset += OPAQUE16_LEN;
3075
        }
3076
    }
3077
3078
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
3079
3080
    return offset;
3081
}
3082
3083
#ifndef NO_WOLFSSL_SERVER
3084
static TCA* TLSX_TCA_Find(TCA *list, byte type, const byte* id, word16 idSz)
3085
{
3086
    TCA* tca = list;
3087
3088
    while (tca) {
3089
        if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED)
3090
            break;
3091
        if (tca->type == type && idSz == tca->idSz &&
3092
                XMEMCMP(id, tca->id, idSz) == 0)
3093
            break;
3094
        tca = tca->next;
3095
    }
3096
3097
    return tca;
3098
}
3099
#endif /* NO_WOLFSSL_SERVER */
3100
3101
/** Parses a buffer of TCA extensions. */
3102
static int TLSX_TCA_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3103
                          byte isRequest)
3104
{
3105
#ifndef NO_WOLFSSL_SERVER
3106
    word16 size = 0;
3107
    word16 offset = 0;
3108
#endif
3109
3110
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
3111
3112
    if (!extension)
3113
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_TRUSTED_CA_KEYS);
3114
3115
    if (!isRequest) {
3116
        #ifndef NO_WOLFSSL_CLIENT
3117
            if (!extension || !extension->data)
3118
                return TLSX_HandleUnsupportedExtension(ssl);
3119
3120
            if (length > 0)
3121
                return BUFFER_ERROR; /* TCA response MUST be empty. */
3122
3123
            /* Set the flag that we're good for keys */
3124
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
3125
3126
            return 0;
3127
        #endif
3128
    }
3129
3130
#ifndef NO_WOLFSSL_SERVER
3131
    if (!extension || !extension->data) {
3132
        /* Skipping, TCA not enabled at server side. */
3133
        return 0;
3134
    }
3135
3136
    if (OPAQUE16_LEN > length)
3137
        return BUFFER_ERROR;
3138
3139
    ato16(input, &size);
3140
    offset += OPAQUE16_LEN;
3141
3142
    /* validating tca list length */
3143
    if (length != OPAQUE16_LEN + size)
3144
        return BUFFER_ERROR;
3145
3146
    for (size = 0; offset < length; offset += size) {
3147
        TCA *tca = NULL;
3148
        byte type;
3149
        const byte* id = NULL;
3150
        word16 idSz = 0;
3151
3152
        if (offset + ENUM_LEN > length)
3153
            return BUFFER_ERROR;
3154
3155
        type = input[offset++];
3156
3157
        switch (type) {
3158
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
3159
                break;
3160
            #ifndef NO_SHA
3161
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3162
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3163
                if (offset + WC_SHA_DIGEST_SIZE > length)
3164
                    return BUFFER_ERROR;
3165
                idSz = WC_SHA_DIGEST_SIZE;
3166
                id = input + offset;
3167
                offset += idSz;
3168
                break;
3169
            #endif
3170
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3171
                if (offset + OPAQUE16_LEN > length)
3172
                    return BUFFER_ERROR;
3173
                ato16(input + offset, &idSz);
3174
                offset += OPAQUE16_LEN;
3175
                if ((offset > length) || (idSz > length - offset))
3176
                    return BUFFER_ERROR;
3177
                id = input + offset;
3178
                offset += idSz;
3179
                break;
3180
            default:
3181
                WOLFSSL_ERROR_VERBOSE(TCA_INVALID_ID_TYPE);
3182
                return TCA_INVALID_ID_TYPE;
3183
        }
3184
3185
        /* Find the type/ID in the TCA list. */
3186
        tca = TLSX_TCA_Find((TCA*)extension->data, type, id, idSz);
3187
        if (tca != NULL) {
3188
            /* Found it. Set the response flag and break out of the loop. */
3189
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
3190
            break;
3191
        }
3192
    }
3193
#else
3194
    (void)input;
3195
#endif
3196
3197
    return 0;
3198
}
3199
3200
/* Checks to see if the server sent a response for the TCA. */
3201
static int TLSX_TCA_VerifyParse(WOLFSSL* ssl, byte isRequest)
3202
{
3203
    (void)ssl;
3204
3205
    if (!isRequest) {
3206
        /* RFC 6066 section 6 states that the server responding
3207
         * to trusted_ca_keys is optional.  Do not error out unless
3208
         * opted into with the define WOLFSSL_REQUIRE_TCA. */
3209
    #if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_REQUIRE_TCA)
3210
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
3211
3212
        if (extension && !extension->resp) {
3213
            SendAlert(ssl, alert_fatal, handshake_failure);
3214
            WOLFSSL_ERROR_VERBOSE(TCA_ABSENT_ERROR);
3215
            return TCA_ABSENT_ERROR;
3216
        }
3217
    #else
3218
        WOLFSSL_MSG("No response received for trusted_ca_keys.  Continuing.");
3219
    #endif /* !NO_WOLFSSL_CLIENT && WOLFSSL_REQUIRE_TCA */
3220
    }
3221
3222
    return 0;
3223
}
3224
3225
int TLSX_UseTrustedCA(TLSX** extensions, byte type,
3226
                    const byte* id, word16 idSz, void* heap)
3227
{
3228
    TLSX* extension;
3229
    TCA* tca = NULL;
3230
3231
    if (extensions == NULL)
3232
        return BAD_FUNC_ARG;
3233
3234
    if ((tca = TLSX_TCA_New(type, id, idSz, heap)) == NULL)
3235
        return MEMORY_E;
3236
3237
    extension = TLSX_Find(*extensions, TLSX_TRUSTED_CA_KEYS);
3238
    if (!extension) {
3239
        int ret = TLSX_Push(extensions, TLSX_TRUSTED_CA_KEYS, (void*)tca, heap);
3240
3241
        if (ret != 0) {
3242
            TLSX_TCA_Free(tca, heap);
3243
            return ret;
3244
        }
3245
    }
3246
    else {
3247
        /* push new TCA object to extension data. */
3248
        tca->next = (TCA*)extension->data;
3249
        extension->data = (void*)tca;
3250
    }
3251
3252
    return WOLFSSL_SUCCESS;
3253
}
3254
3255
#define TCA_FREE_ALL     TLSX_TCA_FreeAll
3256
#define TCA_GET_SIZE     TLSX_TCA_GetSize
3257
#define TCA_WRITE        TLSX_TCA_Write
3258
#define TCA_PARSE        TLSX_TCA_Parse
3259
#define TCA_VERIFY_PARSE TLSX_TCA_VerifyParse
3260
3261
#else /* HAVE_TRUSTED_CA */
3262
3263
0
#define TCA_FREE_ALL(list, heap) WC_DO_NOTHING
3264
0
#define TCA_GET_SIZE(list)     0
3265
#define TCA_WRITE(a, b)        0
3266
0
#define TCA_PARSE(a, b, c, d)  0
3267
0
#define TCA_VERIFY_PARSE(a, b) 0
3268
3269
#endif /* HAVE_TRUSTED_CA */
3270
3271
/******************************************************************************/
3272
/* Max Fragment Length Negotiation                                            */
3273
/******************************************************************************/
3274
3275
#ifdef HAVE_MAX_FRAGMENT
3276
3277
static word16 TLSX_MFL_Write(byte* data, byte* output)
3278
{
3279
    output[0] = data[0];
3280
3281
    return ENUM_LEN;
3282
}
3283
3284
static int TLSX_MFL_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3285
                          byte isRequest)
3286
{
3287
    if (length != ENUM_LEN)
3288
        return BUFFER_ERROR;
3289
3290
#ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3291
    (void) isRequest;
3292
#else
3293
    if (!isRequest) {
3294
        TLSX* extension;
3295
3296
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
3297
            return TLSX_HandleUnsupportedExtension(ssl);
3298
3299
        /* RFC 6066 Section 4: the server's response value must match the
3300
         * value the client requested. The request may have been configured on
3301
         * the WOLFSSL object or inherited from the WOLFSSL_CTX. */
3302
        extension = TLSX_Find(ssl->extensions, TLSX_MAX_FRAGMENT_LENGTH);
3303
        if (extension == NULL) {
3304
            extension = TLSX_Find(ssl->ctx->extensions,
3305
                    TLSX_MAX_FRAGMENT_LENGTH);
3306
        }
3307
        if (extension == NULL || extension->data == NULL ||
3308
                ((byte*)extension->data)[0] != *input) {
3309
            SendAlert(ssl, alert_fatal, illegal_parameter);
3310
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
3311
            return UNKNOWN_MAX_FRAG_LEN_E;
3312
        }
3313
    }
3314
#endif
3315
3316
    switch (*input) {
3317
        case WOLFSSL_MFL_2_8 : ssl->max_fragment =  256; break;
3318
        case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
3319
        case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
3320
        case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
3321
        case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
3322
        case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
3323
3324
        default:
3325
            SendAlert(ssl, alert_fatal, illegal_parameter);
3326
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
3327
            return UNKNOWN_MAX_FRAG_LEN_E;
3328
    }
3329
    if (ssl->session != NULL) {
3330
        ssl->session->mfl = *input;
3331
    }
3332
3333
#ifndef NO_WOLFSSL_SERVER
3334
    if (isRequest) {
3335
        int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
3336
3337
        if (ret != WOLFSSL_SUCCESS)
3338
            return ret; /* throw error */
3339
3340
        TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
3341
    }
3342
#endif
3343
3344
    return 0;
3345
}
3346
3347
int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
3348
{
3349
    byte* data = NULL;
3350
    int ret = 0;
3351
3352
    if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
3353
        return BAD_FUNC_ARG;
3354
3355
    data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
3356
    if (data == NULL)
3357
        return MEMORY_E;
3358
3359
    data[0] = mfl;
3360
3361
    ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
3362
    if (ret != 0) {
3363
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
3364
        return ret;
3365
    }
3366
3367
    return WOLFSSL_SUCCESS;
3368
}
3369
3370
3371
#define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
3372
#define MFL_GET_SIZE(data) ENUM_LEN
3373
#define MFL_WRITE          TLSX_MFL_Write
3374
#define MFL_PARSE          TLSX_MFL_Parse
3375
3376
#else
3377
3378
0
#define MFL_FREE_ALL(a, b) WC_DO_NOTHING
3379
0
#define MFL_GET_SIZE(a)       0
3380
#define MFL_WRITE(a, b)       0
3381
0
#define MFL_PARSE(a, b, c, d) 0
3382
3383
#endif /* HAVE_MAX_FRAGMENT */
3384
3385
/******************************************************************************/
3386
/* Truncated HMAC                                                             */
3387
/******************************************************************************/
3388
3389
#ifdef HAVE_TRUNCATED_HMAC
3390
3391
static int TLSX_THM_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3392
                          byte isRequest)
3393
{
3394
    if (length != 0 || input == NULL)
3395
        return BUFFER_ERROR;
3396
3397
    if (!isRequest) {
3398
    #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3399
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
3400
            return TLSX_HandleUnsupportedExtension(ssl);
3401
    #endif
3402
    }
3403
    else {
3404
        #ifndef NO_WOLFSSL_SERVER
3405
            int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
3406
3407
            if (ret != WOLFSSL_SUCCESS)
3408
                return ret; /* throw error */
3409
3410
            TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
3411
        #endif
3412
    }
3413
3414
    ssl->truncated_hmac = 1;
3415
3416
    return 0;
3417
}
3418
3419
int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
3420
{
3421
    int ret = 0;
3422
3423
    if (extensions == NULL)
3424
        return BAD_FUNC_ARG;
3425
3426
    ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
3427
    if (ret != 0)
3428
        return ret;
3429
3430
    return WOLFSSL_SUCCESS;
3431
}
3432
3433
#define THM_PARSE TLSX_THM_Parse
3434
3435
#else
3436
3437
0
#define THM_PARSE(a, b, c, d) 0
3438
3439
#endif /* HAVE_TRUNCATED_HMAC */
3440
3441
/******************************************************************************/
3442
/* Certificate Status Request                                                 */
3443
/******************************************************************************/
3444
3445
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3446
3447
static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
3448
{
3449
    int i;
3450
3451
    switch (csr->status_type) {
3452
        case WOLFSSL_CSR_OCSP:
3453
            for (i = 0; i < csr->requests; i++) {
3454
                FreeOcspRequest(&csr->request.ocsp[i]);
3455
            }
3456
        break;
3457
    }
3458
#ifdef WOLFSSL_TLS13
3459
    for (i = 0; i < MAX_CERT_EXTENSIONS; i++) {
3460
        if (csr->responses[i].buffer != NULL) {
3461
            XFREE(csr->responses[i].buffer, heap,
3462
                DYNAMIC_TYPE_TMP_BUFFER);
3463
        }
3464
    }
3465
#endif
3466
    XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3467
    (void)heap;
3468
}
3469
3470
word16 TLSX_CSR_GetSize_ex(CertificateStatusRequest* csr, byte isRequest,
3471
                                                             int idx)
3472
{
3473
    word32 size = 0;
3474
3475
    /* shut up compiler warnings */
3476
    (void) csr; (void) isRequest;
3477
#ifndef NO_WOLFSSL_CLIENT
3478
    if (isRequest) {
3479
        switch (csr->status_type) {
3480
            case WOLFSSL_CSR_OCSP:
3481
                size += ENUM_LEN + 2 * OPAQUE16_LEN;
3482
3483
                if (csr->request.ocsp[0].nonceSz)
3484
                    size += OCSP_NONCE_EXT_SZ;
3485
            break;
3486
        }
3487
    }
3488
#endif
3489
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3490
    if (!isRequest && IsAtLeastTLSv1_3(csr->ssl->version)) {
3491
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3492
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3493
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3494
            if (WOLFSSL_MAX_16BIT - OPAQUE8_LEN - OPAQUE24_LEN <
3495
                    csr->ssl->ocspCsrResp[idx].length) {
3496
                return 0;
3497
            }
3498
            size = OPAQUE8_LEN + OPAQUE24_LEN +
3499
                    csr->ssl->ocspCsrResp[idx].length;
3500
            return (word16)size;
3501
        }
3502
        if (WOLFSSL_MAX_16BIT - OPAQUE8_LEN - OPAQUE24_LEN <
3503
                csr->responses[idx].length) {
3504
            return 0;
3505
        }
3506
        size = OPAQUE8_LEN + OPAQUE24_LEN + csr->responses[idx].length;
3507
        return (word16)size;
3508
    }
3509
#else
3510
    (void)idx;
3511
#endif
3512
    return (word16)size;
3513
}
3514
3515
#if (defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER))
3516
int TLSX_CSR_SetResponseWithStatusCB(WOLFSSL *ssl)
3517
{
3518
    WOLFSSL_OCSP *ocsp;
3519
    int ret;
3520
3521
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3522
        return BAD_FUNC_ARG;
3523
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3524
    if (ocsp == NULL || ocsp->statusCb == NULL)
3525
        return BAD_FUNC_ARG;
3526
    ret = ocsp->statusCb(ssl, ocsp->statusCbArg);
3527
    switch (ret) {
3528
        case WOLFSSL_OCSP_STATUS_CB_OK: {
3529
            size_t i;
3530
            for (i = 0; i < XELEM_CNT(ssl->ocspCsrResp); i++) {
3531
                if (ssl->ocspCsrResp[i].length > 0) {
3532
                    /* ack the extension, status cb provided the response in
3533
                     * ssl->ocspCsrResp */
3534
                    TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3535
                    ssl->status_request = WOLFSSL_CSR_OCSP;
3536
                    break;
3537
                }
3538
            }
3539
            ret = 0;
3540
            break;
3541
        }
3542
        case WOLFSSL_OCSP_STATUS_CB_NOACK:
3543
            /* suppressing as not critical */
3544
            ret = 0;
3545
            break;
3546
        case WOLFSSL_OCSP_STATUS_CB_ALERT_FATAL:
3547
        default:
3548
            ret = WOLFSSL_FATAL_ERROR;
3549
            break;
3550
    }
3551
    return ret;
3552
}
3553
3554
static int TLSX_CSR_WriteWithStatusCB(CertificateStatusRequest* csr,
3555
    byte* output, int idx)
3556
{
3557
    WOLFSSL *ssl = csr->ssl;
3558
    WOLFSSL_OCSP *ocsp;
3559
    word16 offset = 0;
3560
    byte *response;
3561
    int respSz;
3562
3563
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3564
        return BAD_FUNC_ARG;
3565
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3566
    if (ocsp == NULL || ocsp->statusCb == NULL)
3567
        return BAD_FUNC_ARG;
3568
    response = ssl->ocspCsrResp[idx].buffer;
3569
    respSz = ssl->ocspCsrResp[idx].length;
3570
    if (response == NULL || respSz == 0)
3571
        return BAD_FUNC_ARG;
3572
    output[offset++] = WOLFSSL_CSR_OCSP;
3573
    c32to24(respSz, output + offset);
3574
    offset += OPAQUE24_LEN;
3575
    XMEMCPY(output + offset, response, respSz);
3576
    return offset + respSz;
3577
}
3578
#endif /* (TLS13 && !NO_WOLFSLL_SERVER) */
3579
3580
static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
3581
{
3582
    return TLSX_CSR_GetSize_ex(csr, isRequest, 0);
3583
}
3584
3585
int TLSX_CSR_Write_ex(CertificateStatusRequest* csr, byte* output,
3586
                          byte isRequest, int idx)
3587
{
3588
    /* shut up compiler warnings */
3589
    (void) csr; (void) output; (void) isRequest;
3590
3591
#ifndef NO_WOLFSSL_CLIENT
3592
    if (isRequest) {
3593
        int ret = 0;
3594
        word16 offset = 0;
3595
        word16 length = 0;
3596
3597
        /* type */
3598
        output[offset++] = csr->status_type;
3599
3600
        switch (csr->status_type) {
3601
            case WOLFSSL_CSR_OCSP:
3602
                /* responder id list */
3603
                c16toa(0, output + offset);
3604
                offset += OPAQUE16_LEN;
3605
3606
                /* request extensions */
3607
                if (csr->request.ocsp[0].nonceSz) {
3608
                    ret = (int)EncodeOcspRequestExtensions(&csr->request.ocsp[0],
3609
                                                 output + offset + OPAQUE16_LEN,
3610
                                                 OCSP_NONCE_EXT_SZ);
3611
3612
                    if (ret > 0) {
3613
                        length = (word16)ret;
3614
                    }
3615
                    else {
3616
                        return ret;
3617
                    }
3618
                }
3619
3620
                c16toa(length, output + offset);
3621
                offset += OPAQUE16_LEN + length;
3622
3623
            break;
3624
        }
3625
3626
        return (int)offset;
3627
    }
3628
#endif
3629
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3630
    if (!isRequest && IsAtLeastTLSv1_3(csr->ssl->version)) {
3631
        word16 offset = 0;
3632
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3633
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3634
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3635
            return TLSX_CSR_WriteWithStatusCB(csr, output, idx);
3636
        }
3637
        output[offset++] = csr->status_type;
3638
        c32to24(csr->responses[idx].length, output + offset);
3639
        offset += OPAQUE24_LEN;
3640
        XMEMCPY(output + offset, csr->responses[idx].buffer,
3641
                                        csr->responses[idx].length);
3642
        offset += (word16)csr->responses[idx].length;
3643
        return offset;
3644
    }
3645
#else
3646
    (void)idx;
3647
#endif
3648
3649
    return 0;
3650
}
3651
3652
static int TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
3653
                          byte isRequest)
3654
{
3655
    return TLSX_CSR_Write_ex(csr, output, isRequest, 0);
3656
}
3657
3658
#if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
3659
    defined(WOLFSSL_TLS_OCSP_MULTI)
3660
/* Process OCSP request certificate chain
3661
 *
3662
 * ssl       SSL/TLS object.
3663
 * returns 0 on success, otherwise failure.
3664
 */
3665
int ProcessChainOCSPRequest(WOLFSSL* ssl)
3666
{
3667
    DecodedCert* cert;
3668
    OcspRequest* request;
3669
    TLSX* extension;
3670
    CertificateStatusRequest* csr;
3671
    DerBuffer* chain;
3672
    word32 pos = 0;
3673
    buffer der;
3674
    int i = 1;
3675
    int ret = 0;
3676
    byte ctxOwnsRequest = 0;
3677
3678
    /* use certChain if available, otherwise use peer certificate */
3679
    chain = ssl->buffers.certChain;
3680
    if (chain == NULL) {
3681
        chain = ssl->buffers.certificate;
3682
    }
3683
3684
    extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3685
    csr = extension ?
3686
                (CertificateStatusRequest*)extension->data : NULL;
3687
    if (csr == NULL)
3688
        return MEMORY_ERROR;
3689
3690
    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
3691
                                         DYNAMIC_TYPE_DCERT);
3692
    if (cert == NULL) {
3693
        return MEMORY_E;
3694
    }
3695
3696
    if (chain && chain->buffer) {
3697
        while (ret == 0 && pos + OPAQUE24_LEN < chain->length) {
3698
            if (i >= MAX_CERT_EXTENSIONS) {
3699
                WOLFSSL_MSG_EX(
3700
                    "OCSP request cert chain exceeds maximum length: "
3701
                    "i=%d, MAX_CERT_EXTENSIONS=%d", i, MAX_CERT_EXTENSIONS);
3702
                ret = MAX_CERT_EXTENSIONS_ERR;
3703
                break;
3704
            }
3705
3706
            c24to32(chain->buffer + pos, &der.length);
3707
            pos += OPAQUE24_LEN;
3708
            der.buffer = chain->buffer + pos;
3709
            pos += der.length;
3710
3711
            if (pos > chain->length)
3712
                break;
3713
            request = &csr->request.ocsp[i];
3714
            if (ret == 0) {
3715
                ret = CreateOcspRequest(ssl, request, cert,
3716
                        der.buffer, der.length, &ctxOwnsRequest);
3717
                if (ctxOwnsRequest) {
3718
                    wolfSSL_Mutex* ocspLock =
3719
                        &SSL_CM(ssl)->ocsp_stapling->ocspLock;
3720
                    if (wc_LockMutex(ocspLock) == 0) {
3721
                        /* the request is ours */
3722
                        ssl->ctx->certOcspRequest = NULL;
3723
                    }
3724
                    wc_UnLockMutex(ocspLock);
3725
                }
3726
            }
3727
3728
            if (ret == 0) {
3729
                request->ssl = ssl;
3730
                ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
3731
                                 request, &csr->responses[i], ssl->heap);
3732
                /* Suppressing soft-fail responder errors. OCSP_CERT_REVOKED
3733
                 * is an explicit positive assertion of revocation and must
3734
                 * not be ignored. OCSP_NO_URL just means there is no
3735
                 * responder to staple from; stapling stays best-effort. */
3736
                if (ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) ||
3737
                    ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL) ||
3738
                    ret == WC_NO_ERR_TRACE(OCSP_NO_URL)) {
3739
                    ret = 0;
3740
                }
3741
                i++;
3742
                csr->requests++;
3743
            }
3744
        }
3745
    }
3746
    XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3747
3748
    return ret;
3749
}
3750
#endif
3751
3752
static int TLSX_CSR_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3753
                          byte isRequest)
3754
{
3755
    int ret;
3756
#if !defined(NO_WOLFSSL_SERVER)
3757
    byte status_type;
3758
    word16 size = 0;
3759
#endif
3760
3761
#if !defined(NO_WOLFSSL_CLIENT)
3762
    OcspRequest* request;
3763
    TLSX* extension;
3764
    CertificateStatusRequest* csr;
3765
#endif
3766
3767
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
3768
 || !defined(NO_WOLFSSL_SERVER)
3769
    word32 offset = 0;
3770
#endif
3771
3772
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
3773
    word32 resp_length = 0;
3774
#endif
3775
3776
    /* shut up compiler warnings */
3777
    (void) ssl; (void) input;
3778
3779
    if (!isRequest) {
3780
#ifndef NO_WOLFSSL_CLIENT
3781
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3782
        csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3783
3784
        if (!csr) {
3785
            /* look at context level */
3786
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
3787
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3788
3789
            if (!csr) /* unexpected extension */
3790
                return TLSX_HandleUnsupportedExtension(ssl);
3791
3792
            /* enable extension at ssl level */
3793
            ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
3794
                                     csr->status_type, csr->options, ssl,
3795
                                     ssl->heap, ssl->devId);
3796
            if (ret != WOLFSSL_SUCCESS)
3797
                return ret == 0 ? -1 : ret;
3798
3799
            switch (csr->status_type) {
3800
                case WOLFSSL_CSR_OCSP:
3801
                    /* propagate nonce */
3802
                    if (csr->request.ocsp[0].nonceSz) {
3803
                        request =
3804
                            (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
3805
3806
                        if (request) {
3807
                            XMEMCPY(request->nonce, csr->request.ocsp[0].nonce,
3808
                                        (size_t)csr->request.ocsp[0].nonceSz);
3809
                            request->nonceSz = csr->request.ocsp[0].nonceSz;
3810
                        }
3811
                    }
3812
                break;
3813
            }
3814
        }
3815
3816
        ssl->status_request = 1;
3817
3818
    #ifdef WOLFSSL_TLS13
3819
        if (ssl->options.tls1_3) {
3820
            /* Get the new extension potentially created above. */
3821
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3822
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3823
            if (csr == NULL)
3824
                return MEMORY_ERROR;
3825
3826
            ret = 0;
3827
            if (OPAQUE8_LEN + OPAQUE24_LEN > length)
3828
                ret = BUFFER_ERROR;
3829
            if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP) {
3830
                ret = BAD_CERTIFICATE_STATUS_ERROR;
3831
                WOLFSSL_ERROR_VERBOSE(ret);
3832
            }
3833
            if (ret == 0) {
3834
                c24to32(input + offset, &resp_length);
3835
                offset += OPAQUE24_LEN;
3836
                if (offset + resp_length != length)
3837
                    ret = BUFFER_ERROR;
3838
            }
3839
            if (ret == 0) {
3840
                if (ssl->response_idx < (1 + MAX_CHAIN_DEPTH))
3841
                    csr->responses[ssl->response_idx].buffer =
3842
                    (byte*)XMALLOC(resp_length, ssl->heap,
3843
                        DYNAMIC_TYPE_TMP_BUFFER);
3844
                else
3845
                    ret = BAD_FUNC_ARG;
3846
3847
                if (ret == 0 &&
3848
                        csr->responses[ssl->response_idx].buffer == NULL)
3849
                    ret = MEMORY_ERROR;
3850
            }
3851
            if (ret == 0) {
3852
                XMEMCPY(csr->responses[ssl->response_idx].buffer,
3853
                                            input + offset, resp_length);
3854
                csr->responses[ssl->response_idx].length = resp_length;
3855
            }
3856
3857
            return ret;
3858
        }
3859
        else
3860
    #endif
3861
        {
3862
            /* extension_data MUST be empty. */
3863
            return length ? BUFFER_ERROR : 0;
3864
        }
3865
#endif
3866
    }
3867
    else {
3868
#ifndef NO_WOLFSSL_SERVER
3869
        if (length == 0)
3870
            return 0;
3871
3872
        status_type = input[offset++];
3873
3874
        switch (status_type) {
3875
            case WOLFSSL_CSR_OCSP: {
3876
3877
                /* skip responder_id_list */
3878
                if ((int)(length - offset) < OPAQUE16_LEN)
3879
                    return BUFFER_ERROR;
3880
3881
                ato16(input + offset, &size);
3882
                offset += OPAQUE16_LEN + size;
3883
3884
                /* skip request_extensions */
3885
                if ((int)(length - offset) < OPAQUE16_LEN)
3886
                    return BUFFER_ERROR;
3887
3888
                ato16(input + offset, &size);
3889
                offset += OPAQUE16_LEN + size;
3890
3891
                if (offset > length)
3892
                    return BUFFER_ERROR;
3893
3894
                /* is able to send OCSP response? */
3895
                if (SSL_CM(ssl) == NULL || !SSL_CM(ssl)->ocspStaplingEnabled)
3896
                    return 0;
3897
            }
3898
            break;
3899
3900
            /* unknown status type */
3901
            default:
3902
                return 0;
3903
        }
3904
3905
        /* if using status_request and already sending it, skip this one */
3906
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3907
        if (ssl->status_request_v2)
3908
            return 0;
3909
        #endif
3910
3911
        /* accept the first good status_type and return */
3912
        ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
3913
                                                 0, ssl, ssl->heap, ssl->devId);
3914
        if (ret != WOLFSSL_SUCCESS)
3915
            return ret == 0 ? -1 : ret; /* throw error */
3916
3917
        TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3918
        ssl->status_request = status_type;
3919
#endif
3920
    }
3921
3922
    return 0;
3923
}
3924
3925
int TLSX_CSR_InitRequest_ex(TLSX* extensions, DecodedCert* cert,
3926
                                                            void* heap, int idx)
3927
{
3928
     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3929
    CertificateStatusRequest* csr = extension ?
3930
        (CertificateStatusRequest*)extension->data : NULL;
3931
    int ret = 0;
3932
3933
    if (csr) {
3934
        switch (csr->status_type) {
3935
            case WOLFSSL_CSR_OCSP: {
3936
                byte nonce[MAX_OCSP_NONCE_SZ];
3937
                int  req_cnt = idx == -1 ? csr->requests : idx;
3938
                int  nonceSz = csr->request.ocsp[0].nonceSz;
3939
                OcspRequest* request;
3940
3941
                request = &csr->request.ocsp[req_cnt];
3942
                if (request->serial != NULL) {
3943
                    /* clear request contents before reuse */
3944
                    FreeOcspRequest(request);
3945
                    if (csr->requests > 0)
3946
                        csr->requests--;
3947
                }
3948
                /* preserve nonce */
3949
                XMEMCPY(nonce, csr->request.ocsp->nonce, (size_t)nonceSz);
3950
3951
                if (req_cnt < MAX_CERT_EXTENSIONS) {
3952
                    if ((ret = InitOcspRequest(request, cert, 0, heap)) != 0)
3953
                        return ret;
3954
3955
                    /* restore nonce */
3956
                    XMEMCPY(csr->request.ocsp->nonce, nonce, (size_t)nonceSz);
3957
                    request->nonceSz = nonceSz;
3958
                    csr->requests++;
3959
                }
3960
                else {
3961
                    WOLFSSL_ERROR_VERBOSE(MAX_CERT_EXTENSIONS_ERR);
3962
                    return MAX_CERT_EXTENSIONS_ERR;
3963
                }
3964
            }
3965
            break;
3966
        }
3967
    }
3968
3969
    return ret;
3970
}
3971
3972
int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
3973
{
3974
    return TLSX_CSR_InitRequest_ex(extensions, cert, heap, -1);
3975
}
3976
3977
void* TLSX_CSR_GetRequest_ex(TLSX* extensions, int idx)
3978
{
3979
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3980
    CertificateStatusRequest* csr = extension ?
3981
                              (CertificateStatusRequest*)extension->data : NULL;
3982
3983
    if (csr && csr->ssl) {
3984
        switch (csr->status_type) {
3985
            case WOLFSSL_CSR_OCSP:
3986
                if (IsAtLeastTLSv1_3(csr->ssl->version)) {
3987
                    return idx < csr->requests ? &csr->request.ocsp[idx] : NULL;
3988
                }
3989
                else {
3990
                    return idx == 0 ? &csr->request.ocsp[0] : NULL;
3991
                }
3992
        }
3993
    }
3994
3995
    return NULL;
3996
}
3997
3998
void* TLSX_CSR_GetRequest(TLSX* extensions)
3999
{
4000
    return TLSX_CSR_GetRequest_ex(extensions, 0);
4001
}
4002
4003
int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
4004
{
4005
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
4006
    CertificateStatusRequest* csr = extension ?
4007
                              (CertificateStatusRequest*)extension->data : NULL;
4008
4009
    if (csr) {
4010
        switch (csr->status_type) {
4011
            case WOLFSSL_CSR_OCSP:
4012
                if (SSL_CM(ssl)->ocspEnabled) {
4013
                    int ret;
4014
                    csr->request.ocsp[0].ssl = ssl;
4015
                    ret = CheckOcspRequest(SSL_CM(ssl)->ocsp,
4016
                                              &csr->request.ocsp[0], NULL, NULL);
4017
                    /* This is the client's fallback leaf lookup on the
4018
                     * verification instance, so honor the no-responder policy
4019
                     * just like the non-stapling leaf path. Default stays
4020
                     * best-effort; FAIL_IF_NOT_SUPPORTED makes it fail closed. */
4021
                    if (ret == WC_NO_ERR_TRACE(OCSP_NO_URL))
4022
                        ret = OcspNoUrlPolicy(SSL_CM(ssl));
4023
                    return ret;
4024
                }
4025
                else {
4026
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
4027
                    return OCSP_LOOKUP_FAIL;
4028
                }
4029
        }
4030
    }
4031
4032
    return 0;
4033
}
4034
4035
int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
4036
                                         byte options, WOLFSSL* ssl, void* heap,
4037
                                                                      int devId)
4038
{
4039
    CertificateStatusRequest* csr = NULL;
4040
    int ret = 0;
4041
4042
    if (!extensions || status_type != WOLFSSL_CSR_OCSP)
4043
        return BAD_FUNC_ARG;
4044
4045
    csr = (CertificateStatusRequest*)
4046
             XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
4047
    if (!csr)
4048
        return MEMORY_E;
4049
4050
    ForceZero(csr, sizeof(CertificateStatusRequest));
4051
#if defined(WOLFSSL_TLS13)
4052
    XMEMSET(csr->responses, 0, sizeof(csr->responses));
4053
#endif
4054
    csr->status_type = status_type;
4055
    csr->options     = options;
4056
    csr->ssl         = ssl;
4057
4058
    switch (csr->status_type) {
4059
        case WOLFSSL_CSR_OCSP:
4060
            if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
4061
                WC_RNG rng;
4062
4063
            #ifndef HAVE_FIPS
4064
                ret = wc_InitRng_ex(&rng, heap, devId);
4065
            #else
4066
                ret = wc_InitRng(&rng);
4067
                (void)devId;
4068
            #endif
4069
                if (ret == 0) {
4070
                    if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp[0].nonce,
4071
                                                        MAX_OCSP_NONCE_SZ) == 0)
4072
                        csr->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4073
4074
                    wc_FreeRng(&rng);
4075
                }
4076
            }
4077
        break;
4078
    }
4079
4080
    if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
4081
        XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
4082
        return ret;
4083
    }
4084
4085
    return WOLFSSL_SUCCESS;
4086
}
4087
4088
#define CSR_FREE_ALL TLSX_CSR_Free
4089
#define CSR_GET_SIZE TLSX_CSR_GetSize
4090
#define CSR_WRITE    TLSX_CSR_Write
4091
#define CSR_PARSE    TLSX_CSR_Parse
4092
4093
#else
4094
4095
0
#define CSR_FREE_ALL(data, heap) WC_DO_NOTHING
4096
0
#define CSR_GET_SIZE(a, b)    0
4097
#define CSR_WRITE(a, b, c)    0
4098
0
#define CSR_PARSE(a, b, c, d) 0
4099
4100
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
4101
4102
/******************************************************************************/
4103
/* Certificate Status Request v2                                              */
4104
/******************************************************************************/
4105
4106
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
4107
4108
static void TLSX_CSR2_FreePendingSigners(Signer *s, void* heap)
4109
{
4110
    Signer* next;
4111
    while(s) {
4112
        next = s->next;
4113
        FreeSigner(s, heap);
4114
        s = next;
4115
    }
4116
}
4117
static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
4118
{
4119
    CertificateStatusRequestItemV2* next;
4120
4121
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, heap);
4122
    for (; csr2; csr2 = next) {
4123
        next = csr2->next;
4124
4125
        switch (csr2->status_type) {
4126
            case WOLFSSL_CSR2_OCSP:
4127
            case WOLFSSL_CSR2_OCSP_MULTI:
4128
                while(csr2->requests--)
4129
                    FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
4130
            break;
4131
        }
4132
4133
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4134
    }
4135
    (void)heap;
4136
}
4137
4138
static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
4139
                                                                 byte isRequest)
4140
{
4141
    word32 size = 0;
4142
4143
    /* shut up compiler warnings */
4144
    (void) csr2; (void) isRequest;
4145
4146
#ifndef NO_WOLFSSL_CLIENT
4147
    if (isRequest) {
4148
        CertificateStatusRequestItemV2* next;
4149
4150
        for (size = OPAQUE16_LEN; csr2; csr2 = next) {
4151
            next = csr2->next;
4152
4153
            switch (csr2->status_type) {
4154
                case WOLFSSL_CSR2_OCSP:
4155
                case WOLFSSL_CSR2_OCSP_MULTI:
4156
                    size += ENUM_LEN + 3 * OPAQUE16_LEN;
4157
4158
                    if (csr2->request.ocsp[0].nonceSz)
4159
                        size += OCSP_NONCE_EXT_SZ;
4160
                break;
4161
            }
4162
4163
            if (size > WOLFSSL_MAX_16BIT) {
4164
                return 0;
4165
            }
4166
        }
4167
    }
4168
#endif
4169
4170
    return (word16)size;
4171
}
4172
4173
static int TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
4174
                                                   byte* output, byte isRequest)
4175
{
4176
    /* shut up compiler warnings */
4177
    (void) csr2; (void) output; (void) isRequest;
4178
4179
#ifndef NO_WOLFSSL_CLIENT
4180
    if (isRequest) {
4181
        int ret = 0;
4182
        word16 offset;
4183
        word16 length;
4184
4185
        for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
4186
            /* status_type */
4187
            output[offset++] = csr2->status_type;
4188
4189
            /* request */
4190
            switch (csr2->status_type) {
4191
                case WOLFSSL_CSR2_OCSP:
4192
                case WOLFSSL_CSR2_OCSP_MULTI:
4193
                    /* request_length */
4194
                    length = 2 * OPAQUE16_LEN;
4195
4196
                    if (csr2->request.ocsp[0].nonceSz)
4197
                        length += OCSP_NONCE_EXT_SZ;
4198
4199
                    c16toa(length, output + offset);
4200
                    offset += OPAQUE16_LEN;
4201
4202
                    /* responder id list */
4203
                    c16toa(0, output + offset);
4204
                    offset += OPAQUE16_LEN;
4205
4206
                    /* request extensions */
4207
                    length = 0;
4208
4209
                    if (csr2->request.ocsp[0].nonceSz) {
4210
                        ret = (int)EncodeOcspRequestExtensions(
4211
                                                 &csr2->request.ocsp[0],
4212
                                                 output + offset + OPAQUE16_LEN,
4213
                                                 OCSP_NONCE_EXT_SZ);
4214
4215
                        if (ret > 0) {
4216
                            length = (word16)ret;
4217
                        }
4218
                        else {
4219
                            return ret;
4220
                        }
4221
                    }
4222
4223
                    c16toa(length, output + offset);
4224
                    offset += OPAQUE16_LEN + length;
4225
                break;
4226
            }
4227
        }
4228
4229
        /* list size */
4230
        c16toa(offset - OPAQUE16_LEN, output);
4231
4232
        return (int)offset;
4233
    }
4234
#endif
4235
4236
    return 0;
4237
}
4238
4239
static int TLSX_CSR2_Parse(WOLFSSL* ssl, const byte* input, word16 length,
4240
                           byte isRequest)
4241
{
4242
    int ret;
4243
4244
    /* shut up compiler warnings */
4245
    (void) ssl; (void) input;
4246
4247
    if (!isRequest) {
4248
#ifndef NO_WOLFSSL_CLIENT
4249
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4250
        CertificateStatusRequestItemV2* csr2 = extension ?
4251
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4252
4253
        if (!csr2) {
4254
            /* look at context level */
4255
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
4256
            csr2 = extension ?
4257
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4258
4259
            if (!csr2) /* unexpected extension */
4260
                return TLSX_HandleUnsupportedExtension(ssl);
4261
4262
            /* enable extension at ssl level */
4263
            for (; csr2; csr2 = csr2->next) {
4264
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4265
                                    csr2->status_type, csr2->options, ssl->heap,
4266
                                                                    ssl->devId);
4267
                if (ret != WOLFSSL_SUCCESS)
4268
                    return ret;
4269
4270
                switch (csr2->status_type) {
4271
                    case WOLFSSL_CSR2_OCSP:
4272
                        /* followed by */
4273
                    case WOLFSSL_CSR2_OCSP_MULTI:
4274
                        /* propagate nonce */
4275
                        if (csr2->request.ocsp[0].nonceSz) {
4276
                            OcspRequest* request =
4277
                             (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
4278
                                                          csr2->status_type, 0);
4279
4280
                            if (request) {
4281
                                XMEMCPY(request->nonce,
4282
                                        csr2->request.ocsp[0].nonce,
4283
                                        (size_t)csr2->request.ocsp[0].nonceSz);
4284
4285
                                request->nonceSz =
4286
                                                  csr2->request.ocsp[0].nonceSz;
4287
                            }
4288
                        }
4289
                    break;
4290
                }
4291
            }
4292
        }
4293
4294
        ssl->status_request_v2 = 1;
4295
4296
        return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
4297
#endif
4298
    }
4299
    else {
4300
#ifndef NO_WOLFSSL_SERVER
4301
        byte   status_type;
4302
        word16 request_length;
4303
        word16 offset = 0;
4304
        word16 size = 0;
4305
4306
        /* list size */
4307
        if (offset + OPAQUE16_LEN >= length) {
4308
            return BUFFER_E;
4309
        }
4310
4311
        ato16(input + offset, &request_length);
4312
        offset += OPAQUE16_LEN;
4313
4314
        if (length - OPAQUE16_LEN != request_length)
4315
            return BUFFER_ERROR;
4316
4317
        while (length > offset) {
4318
            if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
4319
                return BUFFER_ERROR;
4320
4321
            status_type = input[offset++];
4322
4323
            ato16(input + offset, &request_length);
4324
            offset += OPAQUE16_LEN;
4325
4326
            if (length - offset < request_length)
4327
                return BUFFER_ERROR;
4328
4329
            switch (status_type) {
4330
                case WOLFSSL_CSR2_OCSP:
4331
                case WOLFSSL_CSR2_OCSP_MULTI:
4332
                    /* skip responder_id_list */
4333
                    if ((int)(length - offset) < OPAQUE16_LEN)
4334
                        return BUFFER_ERROR;
4335
4336
                    ato16(input + offset, &size);
4337
                    if (length - offset - OPAQUE16_LEN < size)
4338
                        return BUFFER_ERROR;
4339
4340
                    offset += OPAQUE16_LEN + size;
4341
                    /* skip request_extensions */
4342
                    if ((int)(length - offset) < OPAQUE16_LEN)
4343
                        return BUFFER_ERROR;
4344
4345
                    ato16(input + offset, &size);
4346
                    if (length - offset < size)
4347
                        return BUFFER_ERROR;
4348
4349
                    offset += OPAQUE16_LEN + size;
4350
                    if (offset > length)
4351
                        return BUFFER_ERROR;
4352
4353
                    /* is able to send OCSP response? */
4354
                    if (SSL_CM(ssl) == NULL
4355
                    || !SSL_CM(ssl)->ocspStaplingEnabled)
4356
                        continue;
4357
                break;
4358
4359
                default:
4360
                    /* unknown status type, skipping! */
4361
                    offset += request_length;
4362
                    continue;
4363
            }
4364
4365
            /* if using status_request and already sending it, remove it
4366
             * and prefer to use the v2 version */
4367
            #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
4368
            if (ssl->status_request) {
4369
                ssl->status_request = 0;
4370
                TLSX_Remove(&ssl->extensions, TLSX_STATUS_REQUEST, ssl->heap);
4371
            }
4372
            #endif
4373
4374
            /* TLS 1.3 servers MUST NOT act upon presence or information in
4375
             * this extension (RFC 8448 Section 4.4.2.1).
4376
             */
4377
            if (!IsAtLeastTLSv1_3(ssl->version)) {
4378
                /* accept the first good status_type and return */
4379
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4380
                                         status_type, 0, ssl->heap, ssl->devId);
4381
                if (ret != WOLFSSL_SUCCESS)
4382
                    return ret; /* throw error */
4383
4384
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
4385
                ssl->status_request_v2 = status_type;
4386
            }
4387
4388
            return 0;
4389
        }
4390
#endif
4391
    }
4392
4393
    return 0;
4394
}
4395
4396
static CertificateStatusRequestItemV2* TLSX_CSR2_GetMulti(TLSX *extensions)
4397
{
4398
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4399
    CertificateStatusRequestItemV2* csr2 = extension ?
4400
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4401
4402
    for (; csr2; csr2 = csr2->next) {
4403
        if (csr2->status_type == WOLFSSL_CSR2_OCSP_MULTI)
4404
            return csr2;
4405
    }
4406
    return NULL;
4407
}
4408
4409
int TLSX_CSR2_IsMulti(TLSX *extensions)
4410
{
4411
    return TLSX_CSR2_GetMulti(extensions) != NULL;
4412
}
4413
4414
int TLSX_CSR2_AddPendingSigner(TLSX *extensions, Signer *s)
4415
{
4416
    CertificateStatusRequestItemV2* csr2;
4417
4418
    csr2 = TLSX_CSR2_GetMulti(extensions);
4419
    if (!csr2)
4420
        return WOLFSSL_FATAL_ERROR;
4421
4422
    s->next = csr2->pendingSigners;
4423
    csr2->pendingSigners = s;
4424
    return 0;
4425
}
4426
4427
Signer* TLSX_CSR2_GetPendingSigners(TLSX *extensions)
4428
{
4429
    CertificateStatusRequestItemV2* csr2;
4430
4431
    csr2 = TLSX_CSR2_GetMulti(extensions);
4432
    if (!csr2)
4433
        return NULL;
4434
4435
    return csr2->pendingSigners;
4436
}
4437
4438
int TLSX_CSR2_ClearPendingCA(WOLFSSL *ssl)
4439
{
4440
    CertificateStatusRequestItemV2* csr2;
4441
4442
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4443
    if (csr2 == NULL)
4444
        return 0;
4445
4446
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, SSL_CM(ssl)->heap);
4447
    csr2->pendingSigners = NULL;
4448
    return 0;
4449
}
4450
4451
int TLSX_CSR2_MergePendingCA(WOLFSSL* ssl)
4452
{
4453
    CertificateStatusRequestItemV2* csr2;
4454
    Signer *s, *next;
4455
    int r = 0;
4456
4457
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4458
    if (csr2 == NULL)
4459
        return 0;
4460
4461
    s = csr2->pendingSigners;
4462
    while (s != NULL) {
4463
        next = s->next;
4464
        r = AddSigner(SSL_CM(ssl), s);
4465
        if (r != 0)
4466
            FreeSigner(s, SSL_CM(ssl)->heap);
4467
        s = next;
4468
    }
4469
    csr2->pendingSigners = NULL;
4470
    return r;
4471
}
4472
4473
int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
4474
                                                                     void* heap)
4475
{
4476
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4477
    CertificateStatusRequestItemV2* csr2 = extension ?
4478
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4479
    int ret = 0;
4480
4481
    for (; csr2; csr2 = csr2->next) {
4482
        switch (csr2->status_type) {
4483
            case WOLFSSL_CSR2_OCSP:
4484
                if (!isPeer || csr2->requests != 0)
4485
                    break;
4486
4487
                FALL_THROUGH; /* followed by */
4488
4489
            case WOLFSSL_CSR2_OCSP_MULTI: {
4490
                if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
4491
                    byte nonce[MAX_OCSP_NONCE_SZ];
4492
                    int  nonceSz = csr2->request.ocsp[0].nonceSz;
4493
4494
                    /* preserve nonce, replicating nonce of ocsp[0] */
4495
                    XMEMCPY(nonce, csr2->request.ocsp[0].nonce,
4496
                    (size_t)nonceSz);
4497
4498
                    if ((ret = InitOcspRequest(
4499
                                      &csr2->request.ocsp[csr2->requests], cert,
4500
                                                                 0, heap)) != 0)
4501
                        return ret;
4502
4503
                    /* restore nonce */
4504
                    XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
4505
                                                        nonce, (size_t)nonceSz);
4506
                    csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
4507
                    csr2->requests++;
4508
                }
4509
            }
4510
            break;
4511
        }
4512
    }
4513
4514
    (void)cert;
4515
    return ret;
4516
}
4517
4518
void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
4519
{
4520
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4521
    CertificateStatusRequestItemV2* csr2 = extension ?
4522
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4523
4524
    for (; csr2; csr2 = csr2->next) {
4525
        if (csr2->status_type == status_type) {
4526
            switch (csr2->status_type) {
4527
                case WOLFSSL_CSR2_OCSP:
4528
                    /* followed by */
4529
4530
                case WOLFSSL_CSR2_OCSP_MULTI:
4531
                    /* requests are initialized in the reverse order */
4532
                    return idx < csr2->requests
4533
                         ? &csr2->request.ocsp[csr2->requests - idx - 1]
4534
                         : NULL;
4535
            }
4536
        }
4537
    }
4538
4539
    return NULL;
4540
}
4541
4542
int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
4543
{
4544
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4545
    CertificateStatusRequestItemV2* csr2 = extension ?
4546
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4547
4548
    /* forces only the first one */
4549
    if (csr2) {
4550
        switch (csr2->status_type) {
4551
            case WOLFSSL_CSR2_OCSP:
4552
                /* followed by */
4553
4554
            case WOLFSSL_CSR2_OCSP_MULTI:
4555
                if (SSL_CM(ssl)->ocspEnabled && csr2->requests >= 1) {
4556
                    int ret;
4557
                    csr2->request.ocsp[csr2->requests-1].ssl = ssl;
4558
                    ret = CheckOcspRequest(SSL_CM(ssl)->ocsp,
4559
                                          &csr2->request.ocsp[csr2->requests-1], NULL, NULL);
4560
                    /* This is the client's fallback leaf lookup on the
4561
                     * verification instance, so honor the no-responder policy
4562
                     * just like the non-stapling leaf path. Default stays
4563
                     * best-effort; FAIL_IF_NOT_SUPPORTED makes it fail closed. */
4564
                    if (ret == WC_NO_ERR_TRACE(OCSP_NO_URL))
4565
                        ret = OcspNoUrlPolicy(SSL_CM(ssl));
4566
                    return ret;
4567
                }
4568
                else {
4569
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
4570
                    return OCSP_LOOKUP_FAIL;
4571
                }
4572
        }
4573
    }
4574
4575
    return 0;
4576
}
4577
4578
int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
4579
                                           byte options, void* heap, int devId)
4580
{
4581
    TLSX* extension = NULL;
4582
    CertificateStatusRequestItemV2* csr2 = NULL;
4583
    int ret = 0;
4584
4585
    if (!extensions)
4586
        return BAD_FUNC_ARG;
4587
4588
    if (status_type != WOLFSSL_CSR2_OCSP
4589
    &&  status_type != WOLFSSL_CSR2_OCSP_MULTI)
4590
        return BAD_FUNC_ARG;
4591
4592
    csr2 = (CertificateStatusRequestItemV2*)
4593
       XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
4594
    if (!csr2)
4595
        return MEMORY_E;
4596
4597
    ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
4598
4599
    csr2->status_type = status_type;
4600
    csr2->options     = options;
4601
    csr2->next        = NULL;
4602
4603
    switch (csr2->status_type) {
4604
        case WOLFSSL_CSR2_OCSP:
4605
        case WOLFSSL_CSR2_OCSP_MULTI:
4606
            if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
4607
                WC_RNG rng;
4608
4609
            #ifndef HAVE_FIPS
4610
                ret = wc_InitRng_ex(&rng, heap, devId);
4611
            #else
4612
                ret = wc_InitRng(&rng);
4613
                (void)devId;
4614
            #endif
4615
                if (ret == 0) {
4616
                    if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
4617
                                                        MAX_OCSP_NONCE_SZ) == 0)
4618
                        csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4619
4620
                    wc_FreeRng(&rng);
4621
                }
4622
            }
4623
        break;
4624
    }
4625
4626
    /* append new item */
4627
    if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
4628
        CertificateStatusRequestItemV2* last =
4629
                               (CertificateStatusRequestItemV2*)extension->data;
4630
4631
        if (last == NULL) {
4632
            XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4633
            return BAD_FUNC_ARG;
4634
        }
4635
4636
        for (; last->next; last = last->next);
4637
4638
        last->next = csr2;
4639
    }
4640
    else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
4641
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4642
        return ret;
4643
    }
4644
4645
    return WOLFSSL_SUCCESS;
4646
}
4647
4648
#define CSR2_FREE_ALL TLSX_CSR2_FreeAll
4649
#define CSR2_GET_SIZE TLSX_CSR2_GetSize
4650
#define CSR2_WRITE    TLSX_CSR2_Write
4651
#define CSR2_PARSE    TLSX_CSR2_Parse
4652
4653
#else
4654
4655
0
#define CSR2_FREE_ALL(data, heap) WC_DO_NOTHING
4656
0
#define CSR2_GET_SIZE(a, b)    0
4657
#define CSR2_WRITE(a, b, c)    0
4658
0
#define CSR2_PARSE(a, b, c, d) 0
4659
4660
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
4661
4662
/* ML-KEM client support requires generating a key pair (encapsulation key) and
4663
 * decapsulating the server's ciphertext. */
4664
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
4665
     !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
4666
    #define WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT
4667
#endif
4668
/* ML-KEM server support requires encapsulating to the client's key. */
4669
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
4670
    #define WOLFSSL_HAVE_MLKEM_SERVER_SUPPORT
4671
#endif
4672
4673
#if defined(HAVE_SUPPORTED_CURVES) || \
4674
    (defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES))
4675
4676
#ifdef WOLFSSL_HAVE_MLKEM
4677
/* Returns whether ML-KEM groups are supported for the given side.
4678
 *
4679
 * ML-KEM groups require side specific crypto support. The client needs to
4680
 * generate a key and decapsulate, while the server needs to encapsulate.
4681
 *
4682
 * side  The side of the connection the check is for: WOLFSSL_CLIENT_END,
4683
 *       WOLFSSL_SERVER_END or WOLFSSL_NEITHER_END when the side is not known.
4684
 * returns 1 when supported or 0 otherwise.
4685
 */
4686
static int TLSX_IsMlKemGroupSupported(int side)
4687
17.7k
{
4688
17.7k
    if (side == WOLFSSL_CLIENT_END) {
4689
15.4k
    #ifdef WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT
4690
15.4k
        return 1;
4691
    #else
4692
        return 0;
4693
    #endif
4694
15.4k
    }
4695
2.23k
    else if (side == WOLFSSL_SERVER_END) {
4696
2.23k
    #ifdef WOLFSSL_HAVE_MLKEM_SERVER_SUPPORT
4697
2.23k
        return 1;
4698
    #else
4699
        return 0;
4700
    #endif
4701
2.23k
    }
4702
0
    else {
4703
        /* Side not known - supported if either side has the crypto support. */
4704
0
    #if defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) || \
4705
0
        defined(WOLFSSL_HAVE_MLKEM_SERVER_SUPPORT)
4706
0
        return 1;
4707
    #else
4708
        return 0;
4709
    #endif
4710
0
    }
4711
17.7k
}
4712
#endif /* WOLFSSL_HAVE_MLKEM */
4713
4714
/* Returns whether this group is supported.
4715
 *
4716
 * namedGroup  The named group to check.
4717
 * side        The side of the connection the check is for: WOLFSSL_CLIENT_END,
4718
 *             WOLFSSL_SERVER_END or WOLFSSL_NEITHER_END when the side is not
4719
 *             known. Used to determine whether the local side has the crypto
4720
 *             support required to use the group (e.g. ML-KEM requires
4721
 *             decapsulation on the client and encapsulation on the server).
4722
 * returns 1 when supported or 0 otherwise.
4723
 */
4724
int TLSX_IsGroupSupported(int namedGroup, int side)
4725
{
4726
    (void)side;
4727
4728
    switch (namedGroup) {
4729
    #ifdef HAVE_FFDHE_2048
4730
        case WOLFSSL_FFDHE_2048:
4731
            break;
4732
    #endif
4733
    #ifdef HAVE_FFDHE_3072
4734
        case WOLFSSL_FFDHE_3072:
4735
            break;
4736
    #endif
4737
    #ifdef HAVE_FFDHE_4096
4738
        case WOLFSSL_FFDHE_4096:
4739
            break;
4740
    #endif
4741
    #ifdef HAVE_FFDHE_6144
4742
        case WOLFSSL_FFDHE_6144:
4743
            break;
4744
    #endif
4745
    #ifdef HAVE_FFDHE_8192
4746
        case WOLFSSL_FFDHE_8192:
4747
            break;
4748
    #endif
4749
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4750
        #ifdef HAVE_ECC_KOBLITZ
4751
        case WOLFSSL_ECC_SECP256K1:
4752
            break;
4753
        #endif
4754
        #ifndef NO_ECC_SECP
4755
        case WOLFSSL_ECC_SECP256R1:
4756
            break;
4757
        #endif /* !NO_ECC_SECP */
4758
        #ifdef HAVE_ECC_BRAINPOOL
4759
        case WOLFSSL_ECC_BRAINPOOLP256R1:
4760
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
4761
            break;
4762
        #endif
4763
        #ifdef WOLFSSL_SM2
4764
        case WOLFSSL_ECC_SM2P256V1:
4765
            break;
4766
        #endif /* WOLFSSL_SM2 */
4767
    #endif
4768
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4769
        case WOLFSSL_ECC_X25519:
4770
            break;
4771
    #endif
4772
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4773
        case WOLFSSL_ECC_X448:
4774
            break;
4775
    #endif
4776
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
4777
        #ifndef NO_ECC_SECP
4778
        case WOLFSSL_ECC_SECP384R1:
4779
            break;
4780
        #endif /* !NO_ECC_SECP */
4781
        #ifdef HAVE_ECC_BRAINPOOL
4782
        case WOLFSSL_ECC_BRAINPOOLP384R1:
4783
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
4784
            break;
4785
        #endif
4786
    #endif
4787
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
4788
        #ifndef NO_ECC_SECP
4789
        case WOLFSSL_ECC_SECP521R1:
4790
            break;
4791
        #endif /* !NO_ECC_SECP */
4792
    #endif
4793
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
4794
        #ifdef HAVE_ECC_KOBLITZ
4795
        case WOLFSSL_ECC_SECP160K1:
4796
            break;
4797
        #endif
4798
        #ifndef NO_ECC_SECP
4799
        case WOLFSSL_ECC_SECP160R1:
4800
            break;
4801
        #endif
4802
        #ifdef HAVE_ECC_SECPR2
4803
        case WOLFSSL_ECC_SECP160R2:
4804
            break;
4805
        #endif
4806
    #endif
4807
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
4808
        #ifdef HAVE_ECC_KOBLITZ
4809
        case WOLFSSL_ECC_SECP192K1:
4810
            break;
4811
        #endif
4812
        #ifndef NO_ECC_SECP
4813
        case WOLFSSL_ECC_SECP192R1:
4814
            break;
4815
        #endif
4816
    #endif
4817
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
4818
        #ifdef HAVE_ECC_KOBLITZ
4819
        case WOLFSSL_ECC_SECP224K1:
4820
            break;
4821
        #endif
4822
        #ifndef NO_ECC_SECP
4823
        case WOLFSSL_ECC_SECP224R1:
4824
            break;
4825
        #endif
4826
    #endif
4827
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
4828
        #ifdef HAVE_ECC_BRAINPOOL
4829
        case WOLFSSL_ECC_BRAINPOOLP512R1:
4830
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
4831
            break;
4832
        #endif
4833
    #endif
4834
#ifdef WOLFSSL_HAVE_MLKEM
4835
#ifndef WOLFSSL_NO_ML_KEM
4836
        #ifndef WOLFSSL_NO_ML_KEM_512
4837
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4838
            case WOLFSSL_ML_KEM_512:
4839
                return TLSX_IsMlKemGroupSupported(side);
4840
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4841
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4842
            case WOLFSSL_SECP256R1MLKEM512:
4843
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4844
            case WOLFSSL_X25519MLKEM512:
4845
            #endif /* HAVE_CURVE25519 */
4846
                return TLSX_IsMlKemGroupSupported(side);
4847
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4848
        #endif /* WOLFSSL_NO_ML_KEM_512 */
4849
        #ifndef WOLFSSL_NO_ML_KEM_768
4850
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4851
            case WOLFSSL_ML_KEM_768:
4852
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4853
            #ifdef WOLFSSL_PQC_HYBRIDS
4854
            case WOLFSSL_SECP256R1MLKEM768:
4855
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4856
            case WOLFSSL_X25519MLKEM768:
4857
            #endif /* HAVE_CURVE25519 */
4858
            #endif /* WOLFSSL_PQC_HYBRIDS */
4859
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4860
            case WOLFSSL_SECP384R1MLKEM768:
4861
            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4862
            case WOLFSSL_X448MLKEM768:
4863
            #endif /* HAVE_CURVE448 */
4864
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4865
                return TLSX_IsMlKemGroupSupported(side);
4866
        #endif /* WOLFSSL_NO_ML_KEM_768 */
4867
        #ifndef WOLFSSL_NO_ML_KEM_1024
4868
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4869
            case WOLFSSL_ML_KEM_1024:
4870
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4871
            #ifdef WOLFSSL_PQC_HYBRIDS
4872
            case WOLFSSL_SECP384R1MLKEM1024:
4873
            #endif /* WOLFSSL_PQC_HYBRIDS */
4874
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4875
            case WOLFSSL_SECP521R1MLKEM1024:
4876
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4877
                return TLSX_IsMlKemGroupSupported(side);
4878
        #endif
4879
        #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
4880
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
4881
            case WOLFSSL_P256_ML_KEM_512_OLD:
4882
            case WOLFSSL_P384_ML_KEM_768_OLD:
4883
            case WOLFSSL_P521_ML_KEM_1024_OLD:
4884
                return TLSX_IsMlKemGroupSupported(side);
4885
        #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
4886
#endif /* WOLFSSL_NO_ML_KEM */
4887
#ifdef WOLFSSL_MLKEM_KYBER
4888
        #ifdef WOLFSSL_KYBER512
4889
            case WOLFSSL_KYBER_LEVEL1:
4890
            case WOLFSSL_P256_KYBER_LEVEL1:
4891
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4892
            case WOLFSSL_X25519_KYBER_LEVEL1:
4893
        #endif
4894
        #endif
4895
        #ifdef WOLFSSL_KYBER768
4896
            case WOLFSSL_KYBER_LEVEL3:
4897
            case WOLFSSL_P384_KYBER_LEVEL3:
4898
            case WOLFSSL_P256_KYBER_LEVEL3:
4899
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4900
            case WOLFSSL_X25519_KYBER_LEVEL3:
4901
        #endif
4902
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4903
            case WOLFSSL_X448_KYBER_LEVEL3:
4904
        #endif
4905
        #endif
4906
        #ifdef WOLFSSL_KYBER1024
4907
            case WOLFSSL_KYBER_LEVEL5:
4908
            case WOLFSSL_P521_KYBER_LEVEL5:
4909
        #endif
4910
                return TLSX_IsMlKemGroupSupported(side);
4911
#endif
4912
#endif /* WOLFSSL_HAVE_MLKEM */
4913
        default:
4914
            return 0;
4915
    }
4916
4917
    return 1;
4918
}
4919
#endif
4920
4921
/******************************************************************************/
4922
/* Supported Elliptic Curves                                                  */
4923
/******************************************************************************/
4924
4925
#ifdef HAVE_SUPPORTED_CURVES
4926
4927
#if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \
4928
                       && !defined(HAVE_FFDHE) && !defined(WOLFSSL_HAVE_MLKEM)
4929
#error Elliptic Curves Extension requires Elliptic Curve Cryptography or liboqs groups. \
4930
       Use --enable-ecc and/or --enable-liboqs in the configure script or \
4931
       define HAVE_ECC. Alternatively use FFDHE for DH cipher suites.
4932
#endif
4933
4934
static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
4935
                                                                     void* heap)
4936
375k
{
4937
375k
    if (curve == NULL)
4938
0
        return BAD_FUNC_ARG;
4939
4940
375k
    (void)heap;
4941
4942
375k
    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
4943
375k
                                                             DYNAMIC_TYPE_TLSX);
4944
375k
    if (*curve == NULL)
4945
280
        return MEMORY_E;
4946
4947
375k
    (*curve)->name = name;
4948
375k
    (*curve)->next = NULL;
4949
4950
375k
    return 0;
4951
375k
}
4952
4953
static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
4954
15.7k
{
4955
15.7k
    if (point == NULL)
4956
0
        return BAD_FUNC_ARG;
4957
4958
15.7k
    (void)heap;
4959
4960
15.7k
    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
4961
15.7k
                                                             DYNAMIC_TYPE_TLSX);
4962
15.7k
    if (*point == NULL)
4963
18
        return MEMORY_E;
4964
4965
15.7k
    (*point)->format = format;
4966
15.7k
    (*point)->next = NULL;
4967
4968
15.7k
    return 0;
4969
15.7k
}
4970
4971
static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
4972
29.9k
{
4973
29.9k
    SupportedCurve* curve;
4974
4975
405k
    while ((curve = list)) {
4976
375k
        list = curve->next;
4977
375k
        XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
4978
375k
    }
4979
29.9k
    (void)heap;
4980
29.9k
}
4981
4982
static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
4983
15.7k
{
4984
15.7k
    PointFormat* point;
4985
4986
31.4k
    while ((point = list)) {
4987
15.7k
        list = point->next;
4988
15.7k
        XFREE(point, heap, DYNAMIC_TYPE_TLSX);
4989
15.7k
    }
4990
15.7k
    (void)heap;
4991
15.7k
}
4992
4993
static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
4994
                                                                     void* heap)
4995
348k
{
4996
348k
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
4997
4998
3.05M
    while (list) {
4999
3.05M
        if (list->name == name) {
5000
2.28k
            ret = 0; /* curve already in use */
5001
2.28k
            break;
5002
2.28k
        }
5003
5004
3.04M
        if (list->next == NULL) {
5005
346k
            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
5006
346k
            break;
5007
346k
        }
5008
5009
2.70M
        list = list->next;
5010
2.70M
    }
5011
5012
348k
    return ret;
5013
348k
}
5014
5015
static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
5016
0
{
5017
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
5018
5019
0
    while (list) {
5020
0
        if (list->format == format) {
5021
0
            ret = 0; /* format already in use */
5022
0
            break;
5023
0
        }
5024
5025
0
        if (list->next == NULL) {
5026
0
            ret = TLSX_PointFormat_New(&list->next, format, heap);
5027
0
            break;
5028
0
        }
5029
5030
0
        list = list->next;
5031
0
    }
5032
5033
0
    return ret;
5034
0
}
5035
5036
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
5037
5038
#if defined(HAVE_FFDHE) && (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5039
                                                         defined(HAVE_CURVE448))
5040
static void TLSX_SupportedCurve_ValidateRequest(const WOLFSSL* ssl,
5041
                                                const byte* semaphore)
5042
38.7k
{
5043
    /* If all pre-defined parameter types for key exchange are supported then
5044
     * always send SupportedGroups extension.
5045
     */
5046
38.7k
    (void)ssl;
5047
38.7k
    (void)semaphore;
5048
38.7k
}
5049
#else
5050
static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
5051
{
5052
    word16 i;
5053
    const Suites* suites = WOLFSSL_SUITES(ssl);
5054
5055
    for (i = 0; i < suites->suiteSz; i += 2) {
5056
        if (suites->suites[i] == TLS13_BYTE)
5057
            return;
5058
    #ifdef BUILD_TLS_SM4_GCM_SM3
5059
        if ((suites->suites[i] == CIPHER_BYTE) &&
5060
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
5061
            return;
5062
    #endif
5063
    #ifdef BUILD_TLS_SM4_CCM_SM3
5064
        if ((suites->suites[i] == CIPHER_BYTE) &&
5065
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
5066
            return;
5067
    #endif
5068
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5069
        if ((suites->suites[i] == SM_BYTE) &&
5070
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
5071
            return;
5072
    #endif
5073
        if ((suites->suites[i] == ECC_BYTE) ||
5074
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
5075
            (suites->suites[i] == CHACHA_BYTE)) {
5076
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5077
                                                          defined(HAVE_CURVE448)
5078
            return;
5079
        #endif
5080
        }
5081
        #ifdef HAVE_FFDHE
5082
        else {
5083
            return;
5084
        }
5085
        #endif
5086
    }
5087
5088
    /* turns semaphore on to avoid sending this extension. */
5089
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
5090
}
5091
#endif
5092
5093
/* Only send PointFormats if TLSv13, ECC or CHACHA cipher suite present.
5094
 */
5095
static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
5096
38.7k
{
5097
38.7k
#ifdef HAVE_FFDHE
5098
38.7k
    (void)ssl;
5099
38.7k
    (void)semaphore;
5100
#else
5101
    word16 i;
5102
    const Suites* suites = WOLFSSL_SUITES(ssl);
5103
5104
    if (suites == NULL)
5105
        return;
5106
5107
    for (i = 0; i < suites->suiteSz; i += 2) {
5108
        if (suites->suites[i] == TLS13_BYTE)
5109
            return;
5110
    #ifdef BUILD_TLS_SM4_GCM_SM3
5111
        if ((suites->suites[i] == CIPHER_BYTE) &&
5112
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
5113
            return;
5114
    #endif
5115
    #ifdef BUILD_TLS_SM4_CCM_SM3
5116
        if ((suites->suites[i] == CIPHER_BYTE) &&
5117
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
5118
            return;
5119
    #endif
5120
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5121
        if ((suites->suites[i] == SM_BYTE) &&
5122
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
5123
            return;
5124
    #endif
5125
        if ((suites->suites[i] == ECC_BYTE) ||
5126
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
5127
            (suites->suites[i] == CHACHA_BYTE)) {
5128
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5129
                                                          defined(HAVE_CURVE448)
5130
            return;
5131
        #endif
5132
        }
5133
    }
5134
   /* turns semaphore on to avoid sending this extension. */
5135
   TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
5136
#endif
5137
38.7k
}
5138
5139
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
5140
5141
#ifndef NO_WOLFSSL_SERVER
5142
5143
static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
5144
{
5145
#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5146
                                                          defined(HAVE_CURVE448)
5147
    (void)semaphore;
5148
#endif
5149
5150
    if (ssl->options.cipherSuite0 == TLS13_BYTE)
5151
        return;
5152
#ifdef BUILD_TLS_SM4_GCM_SM3
5153
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
5154
        (ssl->options.cipherSuite == TLS_SM4_GCM_SM3))
5155
        return;
5156
#endif
5157
#ifdef BUILD_TLS_SM4_CCM_SM3
5158
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
5159
        (ssl->options.cipherSuite == TLS_SM4_CCM_SM3))
5160
        return;
5161
#endif
5162
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5163
    if ((ssl->options.cipherSuite0 == SM_BYTE) &&
5164
        (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
5165
        return;
5166
#endif
5167
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5168
    if (ssl->options.cipherSuite0 == ECC_BYTE ||
5169
        ssl->options.cipherSuite0 == ECDHE_PSK_BYTE ||
5170
        ssl->options.cipherSuite0 == CHACHA_BYTE) {
5171
        return;
5172
    }
5173
#endif
5174
5175
    /* turns semaphore on to avoid sending this extension. */
5176
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
5177
}
5178
5179
#endif /* !NO_WOLFSSL_SERVER */
5180
5181
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5182
5183
static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
5184
20.7k
{
5185
20.7k
    SupportedCurve* curve;
5186
20.7k
    word16 length = OPAQUE16_LEN; /* list length */
5187
5188
392k
    while ((curve = list)) {
5189
372k
        list = curve->next;
5190
372k
        length += OPAQUE16_LEN; /* curve length */
5191
372k
    }
5192
5193
20.7k
    return length;
5194
20.7k
}
5195
5196
#endif
5197
5198
static word16 TLSX_PointFormat_GetSize(PointFormat* list)
5199
14.8k
{
5200
14.8k
    PointFormat* point;
5201
14.8k
    word16 length = ENUM_LEN; /* list length */
5202
5203
29.7k
    while ((point = list)) {
5204
14.8k
        list = point->next;
5205
14.8k
        length += ENUM_LEN; /* format length */
5206
14.8k
    }
5207
5208
14.8k
    return length;
5209
14.8k
}
5210
5211
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5212
5213
static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
5214
18.6k
{
5215
18.6k
    word16 offset = OPAQUE16_LEN;
5216
5217
348k
    while (list) {
5218
330k
        c16toa(list->name, output + offset);
5219
330k
        offset += OPAQUE16_LEN;
5220
330k
        list = list->next;
5221
330k
    }
5222
5223
18.6k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
5224
5225
18.6k
    return offset;
5226
18.6k
}
5227
5228
#endif
5229
5230
static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
5231
14.8k
{
5232
14.8k
    word16 offset = ENUM_LEN;
5233
5234
29.6k
    while (list) {
5235
14.8k
        output[offset++] = list->format;
5236
14.8k
        list = list->next;
5237
14.8k
    }
5238
5239
14.8k
    output[0] = (byte)(offset - ENUM_LEN);
5240
5241
14.8k
    return offset;
5242
14.8k
}
5243
5244
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
5245
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
5246
5247
int TLSX_SupportedCurve_Parse(const WOLFSSL* ssl, const byte* input,
5248
                              word16 length, byte isRequest, TLSX** extensions)
5249
9.95k
{
5250
9.95k
    word16 offset;
5251
9.95k
    word16 name;
5252
9.95k
    int ret = 0;
5253
9.95k
    TLSX* extension;
5254
5255
9.95k
    if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
5256
#ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
5257
        return 0;
5258
#else
5259
0
        return BUFFER_ERROR; /* servers doesn't send this extension. */
5260
0
#endif
5261
0
    }
5262
9.95k
    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
5263
574
        return BUFFER_ERROR;
5264
9.38k
    ato16(input, &offset);
5265
    /* validating curve list length */
5266
9.38k
    if (length != OPAQUE16_LEN + offset)
5267
89
        return BUFFER_ERROR;
5268
9.29k
    offset = OPAQUE16_LEN;
5269
9.29k
    if (offset == length) {
5270
        /* An empty named group list is malformed (named_group_list<2..2^16-1>,
5271
         * RFC 8422 / RFC 8446). BUFFER_ERROR yields a decode_error alert (see
5272
         * TranslateErrorToAlert()). Accepting it would also make an explicit
5273
         * empty extension look absent and impose no group restriction. */
5274
12
        return BUFFER_ERROR;
5275
12
    }
5276
5277
9.28k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5278
9.28k
    if (extension == NULL) {
5279
        /* Just accept what the peer wants to use */
5280
45.8k
        for (; offset < length; offset += OPAQUE16_LEN) {
5281
36.6k
            ato16(input + offset, &name);
5282
5283
36.6k
            ret = TLSX_UseSupportedCurve(extensions, name, ssl->heap,
5284
36.6k
                                         ssl->options.side);
5285
            /* If it is BAD_FUNC_ARG then it is a group we do not support, but
5286
             * that is fine. */
5287
36.6k
            if (ret != WOLFSSL_SUCCESS &&
5288
23.4k
                    ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
5289
108
                break;
5290
36.5k
            ret = 0;
5291
36.5k
        }
5292
        /* All advertised groups are unsupported, so no node was added above.
5293
         * Record an empty node so suite selection still sees the restriction
5294
         * (e.g. ECC/ECDHE must not be chosen) instead of treating the
5295
         * extension as absent. */
5296
9.27k
        if (ret == 0 && isRequest &&
5297
9.16k
                TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
5298
593
            ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, NULL, ssl->heap);
5299
593
        }
5300
9.27k
    }
5301
9
    else {
5302
        /* Find the intersection with what the user has set */
5303
9
        SupportedCurve* commonCurves = NULL;
5304
31
        for (; offset < length; offset += OPAQUE16_LEN) {
5305
22
            SupportedCurve* foundCurve = (SupportedCurve*)extension->data;
5306
22
            ato16(input + offset, &name);
5307
5308
46
            while (foundCurve != NULL && foundCurve->name != name)
5309
24
                foundCurve = foundCurve->next;
5310
5311
22
            if (foundCurve != NULL) {
5312
5
                ret = commonCurves == NULL ?
5313
4
                      TLSX_SupportedCurve_New(&commonCurves, name, ssl->heap) :
5314
5
                      TLSX_SupportedCurve_Append(commonCurves, name, ssl->heap);
5315
5
                if (ret != 0)
5316
0
                    break;
5317
5
            }
5318
22
        }
5319
        /* If no common curves return error. In TLS 1.3 we can still try to save
5320
         * this by using HRR. */
5321
9
        if (ret == 0 && commonCurves == NULL &&
5322
5
                !IsAtLeastTLSv1_3(ssl->version))
5323
0
            ret = ECC_CURVE_ERROR;
5324
9
        if (ret == 0) {
5325
            /* Now swap out the curves in the extension */
5326
9
            TLSX_SupportedCurve_FreeAll((SupportedCurve*)extension->data,
5327
9
                                        ssl->heap);
5328
9
            extension->data = commonCurves;
5329
9
            commonCurves = NULL;
5330
9
        }
5331
9
        TLSX_SupportedCurve_FreeAll(commonCurves, ssl->heap);
5332
9
    }
5333
5334
9.28k
    return ret;
5335
9.29k
}
5336
#endif
5337
5338
#if !defined(NO_WOLFSSL_SERVER)
5339
5340
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5341
5342
/* Checks the priority of the groups on the server and set the supported groups
5343
 * response if there is a group not advertised by the client that is preferred.
5344
 *
5345
 * ssl  SSL/TLS object.
5346
 * returns 0 on success, otherwise an error.
5347
 */
5348
int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
5349
494
{
5350
494
    int ret;
5351
494
    TLSX* extension;
5352
494
    TLSX* priority = NULL;
5353
494
    TLSX* ext = NULL;
5354
494
    word16 name;
5355
494
    SupportedCurve* curve;
5356
5357
494
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5358
    /* May be doing PSK with no key exchange. */
5359
494
    if (extension == NULL)
5360
0
        return 0;
5361
5362
494
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5363
494
    if (ret != WOLFSSL_SUCCESS) {
5364
18
        TLSX_FreeAll(priority, ssl->heap);
5365
18
        return ret;
5366
18
    }
5367
5368
476
    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5369
476
    if (ext == NULL) {
5370
0
        WOLFSSL_MSG("Could not find supported groups extension");
5371
0
        TLSX_FreeAll(priority, ssl->heap);
5372
0
        return 0;
5373
0
    }
5374
5375
476
    curve = (SupportedCurve*)ext->data;
5376
476
    name = curve->name;
5377
5378
476
    curve = (SupportedCurve*)extension->data;
5379
1.21k
    while (curve != NULL) {
5380
742
        if (curve->name == name)
5381
8
            break;
5382
734
        curve = curve->next;
5383
734
    }
5384
5385
476
    if (curve == NULL) {
5386
        /* Couldn't find the preferred group in client list. */
5387
468
        extension->resp = 1;
5388
5389
        /* Send server list back and free client list. */
5390
468
        curve = (SupportedCurve*)extension->data;
5391
468
        extension->data = ext->data;
5392
468
        ext->data = curve;
5393
468
    }
5394
5395
476
    TLSX_FreeAll(priority, ssl->heap);
5396
5397
476
    return 0;
5398
476
}
5399
5400
#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
5401
5402
#if defined(HAVE_FFDHE) && !defined(WOLFSSL_NO_TLS12)
5403
#ifdef HAVE_PUBLIC_FFDHE
5404
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5405
    SupportedCurve* serverGroup)
5406
1.47k
{
5407
1.47k
    int ret = 0;
5408
1.47k
    SupportedCurve* group;
5409
1.47k
    const DhParams* params = NULL;
5410
5411
25.0k
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5412
25.0k
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5413
23.5k
            continue;
5414
5415
2.60k
        for (group = clientGroup; group != NULL; group = group->next) {
5416
2.60k
            if (serverGroup->name != group->name)
5417
1.13k
                continue;
5418
5419
1.47k
            switch (serverGroup->name) {
5420
0
            #ifdef HAVE_FFDHE_2048
5421
1.47k
                case WOLFSSL_FFDHE_2048:
5422
1.47k
                    params = wc_Dh_ffdhe2048_Get();
5423
1.47k
                    break;
5424
0
            #endif
5425
            #ifdef HAVE_FFDHE_3072
5426
                case WOLFSSL_FFDHE_3072:
5427
                    params = wc_Dh_ffdhe3072_Get();
5428
                    break;
5429
            #endif
5430
            #ifdef HAVE_FFDHE_4096
5431
                case WOLFSSL_FFDHE_4096:
5432
                    params = wc_Dh_ffdhe4096_Get();
5433
                    break;
5434
            #endif
5435
            #ifdef HAVE_FFDHE_6144
5436
                case WOLFSSL_FFDHE_6144:
5437
                    params = wc_Dh_ffdhe6144_Get();
5438
                    break;
5439
            #endif
5440
            #ifdef HAVE_FFDHE_8192
5441
                case WOLFSSL_FFDHE_8192:
5442
                    params = wc_Dh_ffdhe8192_Get();
5443
                    break;
5444
            #endif
5445
0
                default:
5446
0
                    break;
5447
1.47k
            }
5448
1.47k
            if (params == NULL) {
5449
0
                ret = BAD_FUNC_ARG;
5450
0
                break;
5451
0
            }
5452
1.47k
            if (params->p_len >= ssl->options.minDhKeySz &&
5453
1.47k
                                     params->p_len <= ssl->options.maxDhKeySz) {
5454
1.47k
                break;
5455
1.47k
            }
5456
1.47k
        }
5457
5458
1.47k
        if (ret != 0)
5459
0
            break;
5460
1.47k
        if ((group != NULL) && (serverGroup->name == group->name))
5461
1.47k
            break;
5462
1.47k
    }
5463
5464
1.47k
    if ((ret == 0) && (serverGroup != NULL) && (params != NULL)) {
5465
1.47k
        ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
5466
1.47k
        ssl->buffers.serverDH_P.length = params->p_len;
5467
1.47k
        ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
5468
1.47k
        ssl->buffers.serverDH_G.length = params->g_len;
5469
5470
1.47k
        ssl->namedGroup = serverGroup->name;
5471
1.47k
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5472
1.47k
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5473
1.47k
        ssl->options.dhDoKeyTest = 0;
5474
1.47k
    #endif
5475
1.47k
        ssl->options.haveDH = 1;
5476
1.47k
    }
5477
5478
1.47k
    return ret;
5479
1.47k
}
5480
#else
5481
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5482
    SupportedCurve* serverGroup)
5483
{
5484
    int ret = 0;
5485
    SupportedCurve* group;
5486
    word32 p_len;
5487
5488
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5489
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5490
            continue;
5491
5492
        for (group = clientGroup; group != NULL; group = group->next) {
5493
            if (serverGroup->name != group->name)
5494
                continue;
5495
5496
            ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &p_len, NULL, NULL);
5497
            if (ret == 0) {
5498
                if (p_len == 0) {
5499
                    ret = BAD_FUNC_ARG;
5500
                    break;
5501
                }
5502
                if (p_len >= ssl->options.minDhKeySz &&
5503
                                                p_len <= ssl->options.maxDhKeySz) {
5504
                    break;
5505
                }
5506
            }
5507
        }
5508
5509
        if (ret != 0)
5510
            break;
5511
        if ((group != NULL) && (serverGroup->name == group->name))
5512
            break;
5513
    }
5514
5515
    if ((ret == 0) && (serverGroup != NULL)) {
5516
        word32 pSz, gSz;
5517
5518
        ssl->buffers.serverDH_P.buffer = NULL;
5519
        ssl->buffers.serverDH_G.buffer = NULL;
5520
        ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &pSz, &gSz, NULL);
5521
        if (ret == 0) {
5522
            ssl->buffers.serverDH_P.buffer =
5523
                (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5524
            if (ssl->buffers.serverDH_P.buffer == NULL)
5525
                ret = MEMORY_E;
5526
            else
5527
                ssl->buffers.serverDH_P.length = pSz;
5528
        }
5529
        if (ret == 0) {
5530
            ssl->buffers.serverDH_G.buffer =
5531
                (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5532
            if (ssl->buffers.serverDH_G.buffer == NULL) {
5533
                ret = MEMORY_E;
5534
            } else
5535
                ssl->buffers.serverDH_G.length = gSz;
5536
        }
5537
        if (ret == 0) {
5538
            ret = wc_DhCopyNamedKey(serverGroup->name,
5539
                              ssl->buffers.serverDH_P.buffer, &pSz,
5540
                              ssl->buffers.serverDH_G.buffer, &gSz,
5541
                              NULL, NULL);
5542
        }
5543
        if (ret == 0) {
5544
            ssl->buffers.weOwnDH = 1;
5545
5546
            ssl->namedGroup = serverGroup->name;
5547
        #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5548
            !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5549
            ssl->options.dhDoKeyTest = 0;
5550
        #endif
5551
            ssl->options.haveDH = 1;
5552
        }
5553
        else {
5554
            if (ssl->buffers.serverDH_P.buffer != NULL) {
5555
                XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5556
                    DYNAMIC_TYPE_PUBLIC_KEY);
5557
                ssl->buffers.serverDH_P.length = 0;
5558
                ssl->buffers.serverDH_P.buffer = NULL;
5559
            }
5560
            if (ssl->buffers.serverDH_G.buffer != NULL) {
5561
                XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5562
                    DYNAMIC_TYPE_PUBLIC_KEY);
5563
                ssl->buffers.serverDH_G.length = 0;
5564
                ssl->buffers.serverDH_G.buffer = NULL;
5565
            }
5566
        }
5567
    }
5568
5569
    return ret;
5570
}
5571
#endif
5572
5573
/* Set the highest priority common FFDHE group on the server as compared to
5574
 * client extensions.
5575
 *
5576
 * ssl    SSL/TLS object.
5577
 * returns 0 on success, otherwise an error.
5578
 */
5579
int TLSX_SupportedFFDHE_Set(WOLFSSL* ssl)
5580
6.34k
{
5581
6.34k
    int ret;
5582
6.34k
    TLSX* priority = NULL;
5583
6.34k
    TLSX* ext = NULL;
5584
6.34k
    TLSX* extension;
5585
6.34k
    SupportedCurve* clientGroup;
5586
6.34k
    SupportedCurve* group;
5587
6.34k
    int found = 0;
5588
5589
6.34k
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5590
    /* May be doing PSK with no key exchange. */
5591
6.34k
    if (extension == NULL)
5592
0
        return 0;
5593
6.34k
    clientGroup = (SupportedCurve*)extension->data;
5594
12.7k
    for (group = clientGroup; group != NULL; group = group->next) {
5595
8.02k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(group->name)) {
5596
1.64k
            found = 1;
5597
1.64k
            break;
5598
1.64k
        }
5599
8.02k
    }
5600
6.34k
    if (!found)
5601
4.70k
        return 0;
5602
5603
1.64k
    if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
5604
0
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5605
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5606
0
    }
5607
1.64k
    if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
5608
0
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5609
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5610
0
    }
5611
1.64k
    ssl->buffers.serverDH_P.buffer = NULL;
5612
1.64k
    ssl->buffers.serverDH_G.buffer = NULL;
5613
1.64k
    ssl->buffers.weOwnDH = 0;
5614
1.64k
    ssl->options.haveDH = 0;
5615
5616
1.64k
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5617
1.64k
    if (ret == WOLFSSL_SUCCESS) {
5618
1.47k
        SupportedCurve* serverGroup;
5619
5620
1.47k
        ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5621
1.47k
        if (ext == NULL) {
5622
0
            WOLFSSL_MSG("Could not find supported groups extension");
5623
0
            ret = 0;
5624
0
        }
5625
1.47k
        else {
5626
1.47k
            serverGroup = (SupportedCurve*)ext->data;
5627
1.47k
            ret = tlsx_ffdhe_find_group(ssl, clientGroup, serverGroup);
5628
1.47k
        }
5629
1.47k
    }
5630
5631
1.64k
    TLSX_FreeAll(priority, ssl->heap);
5632
5633
1.64k
    return ret;
5634
6.34k
}
5635
#endif /* HAVE_FFDHE && !WOLFSSL_NO_TLS12 */
5636
#endif /* !NO_WOLFSSL_SERVER */
5637
5638
/* Check if the given curve is present in the supported groups extension.
5639
 *
5640
 * ssl             SSL/TLS object.
5641
 * name            The curve name to check.
5642
 * returns 1 if present, 0 otherwise.
5643
 */
5644
int TLSX_SupportedCurve_IsSupported(WOLFSSL* ssl, word16 name)
5645
0
{
5646
0
    TLSX* extension;
5647
0
    SupportedCurve* curve;
5648
5649
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5650
0
    if (extension == NULL)
5651
0
        return 0;
5652
5653
0
    curve = (SupportedCurve*)extension->data;
5654
0
    while (curve != NULL) {
5655
0
        if (curve->name == name)
5656
0
            return 1;
5657
0
        curve = curve->next;
5658
0
    }
5659
5660
0
    return 0;
5661
0
}
5662
5663
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5664
/* Return the preferred group.
5665
 *
5666
 * ssl             SSL/TLS object.
5667
 * checkSupported  Whether to check for the first supported group.
5668
 * returns BAD_FUNC_ARG if no group found, otherwise the group.
5669
 */
5670
int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
5671
0
{
5672
0
    TLSX* extension;
5673
0
    SupportedCurve* curve;
5674
5675
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5676
0
    if (extension == NULL)
5677
0
        return BAD_FUNC_ARG;
5678
5679
0
    curve = (SupportedCurve*)extension->data;
5680
0
    while (curve != NULL) {
5681
0
        if (!checkSupported ||
5682
0
                TLSX_IsGroupSupported(curve->name, ssl->options.side))
5683
0
            return curve->name;
5684
0
        curve = curve->next;
5685
0
    }
5686
5687
0
    return BAD_FUNC_ARG;
5688
0
}
5689
5690
#endif /* HAVE_SUPPORTED_CURVES */
5691
5692
#ifndef NO_WOLFSSL_SERVER
5693
5694
static int TLSX_PointFormat_Parse(WOLFSSL* ssl, const byte* input,
5695
                                  word16 length, byte isRequest)
5696
1.05k
{
5697
1.05k
    int ret;
5698
5699
    /* validating formats list length */
5700
1.05k
    if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
5701
94
        return BUFFER_ERROR;
5702
5703
962
    if (isRequest) {
5704
960
    #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SUPPORTED_CURVES)
5705
        /* RFC 8422 Section 5.1.2: a client that sends the ec_point_formats
5706
         * extension MUST include the uncompressed (0) format. Record whether
5707
         * it is missing so DoClientHello() can abort with an illegal_parameter
5708
         * alert if the client also advertised ECC named groups. The decision
5709
         * is deferred to after all extensions are parsed so it does not depend
5710
         * on the relative order of the supported_groups and ec_point_formats
5711
         * extensions in the ClientHello. */
5712
960
        word16 i;
5713
960
        int found = 0;
5714
5715
2.25k
        for (i = 0; i < input[0]; i++) {
5716
2.12k
            if (input[ENUM_LEN + i] == WOLFSSL_EC_PF_UNCOMPRESSED) {
5717
826
                found = 1;
5718
826
                break;
5719
826
            }
5720
2.12k
        }
5721
960
        ssl->options.peerNoUncompPF = (found == 0);
5722
960
    #endif
5723
5724
        /* adding uncompressed point format to response */
5725
960
        ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
5726
960
                                                                     ssl->heap);
5727
960
        if (ret != WOLFSSL_SUCCESS)
5728
22
            return ret; /* throw error */
5729
5730
938
        TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
5731
938
    }
5732
5733
940
    return 0;
5734
962
}
5735
5736
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5737
int TLSX_ValidateSupportedCurves(const WOLFSSL* ssl, byte first, byte second,
5738
                                 word32* ecdhCurveOID) {
5739
    TLSX*           extension = NULL;
5740
    SupportedCurve* curve     = NULL;
5741
    word32          oid       = 0;
5742
    word32          defOid    = 0;
5743
    word32          defSz     = 80; /* Maximum known curve size is 66. */
5744
    word32          nextOid   = 0;
5745
    word32          nextSz    = 80; /* Maximum known curve size is 66. */
5746
    word32          currOid   = ssl->ecdhCurveOID;
5747
    int             ephmSuite = 0;
5748
    word16          octets    = 0; /* according to 'ecc_set_type ecc_sets[];' */
5749
    int             key       = 0; /* validate key       */
5750
    int             foundCurve = 0; /* Found at least one supported curve */
5751
5752
    (void)oid;
5753
5754
    if (first == CHACHA_BYTE) {
5755
        switch (second) {
5756
            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5757
            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
5758
            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5759
            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5760
                return 1; /* no suite restriction */
5761
            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5762
            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5763
            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5764
                break;
5765
        }
5766
    }
5767
    if (first == ECC_BYTE || first == ECDHE_PSK_BYTE || first == CHACHA_BYTE)
5768
        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5769
    if (!extension)
5770
        return 1; /* no suite restriction */
5771
5772
    for (curve = (SupportedCurve*)extension->data;
5773
         curve && !key;
5774
         curve = curve->next) {
5775
5776
    #ifdef OPENSSL_EXTRA
5777
        /* skip if name is not in supported ECC range
5778
         * or disabled by user */
5779
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
5780
            continue;
5781
    #endif
5782
5783
        /* find supported curve */
5784
        switch (curve->name) {
5785
#ifdef HAVE_ECC
5786
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
5787
        #ifndef NO_ECC_SECP
5788
            case WOLFSSL_ECC_SECP160R1:
5789
                oid = ECC_SECP160R1_OID;
5790
                octets = 20;
5791
                break;
5792
        #endif /* !NO_ECC_SECP */
5793
        #ifdef HAVE_ECC_SECPR2
5794
            case WOLFSSL_ECC_SECP160R2:
5795
                oid = ECC_SECP160R2_OID;
5796
                octets = 20;
5797
                break;
5798
        #endif /* HAVE_ECC_SECPR2 */
5799
        #ifdef HAVE_ECC_KOBLITZ
5800
            case WOLFSSL_ECC_SECP160K1:
5801
                oid = ECC_SECP160K1_OID;
5802
                octets = 20;
5803
                break;
5804
        #endif /* HAVE_ECC_KOBLITZ */
5805
        #endif
5806
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
5807
        #ifndef NO_ECC_SECP
5808
            case WOLFSSL_ECC_SECP192R1:
5809
                oid = ECC_SECP192R1_OID;
5810
                octets = 24;
5811
                break;
5812
        #endif /* !NO_ECC_SECP */
5813
        #ifdef HAVE_ECC_KOBLITZ
5814
            case WOLFSSL_ECC_SECP192K1:
5815
                oid = ECC_SECP192K1_OID;
5816
                octets = 24;
5817
                break;
5818
        #endif /* HAVE_ECC_KOBLITZ */
5819
    #endif
5820
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
5821
        #ifndef NO_ECC_SECP
5822
            case WOLFSSL_ECC_SECP224R1:
5823
                oid = ECC_SECP224R1_OID;
5824
                octets = 28;
5825
                break;
5826
        #endif /* !NO_ECC_SECP */
5827
        #ifdef HAVE_ECC_KOBLITZ
5828
            case WOLFSSL_ECC_SECP224K1:
5829
                oid = ECC_SECP224K1_OID;
5830
                octets = 28;
5831
                break;
5832
        #endif /* HAVE_ECC_KOBLITZ */
5833
    #endif
5834
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5835
        #ifndef NO_ECC_SECP
5836
            case WOLFSSL_ECC_SECP256R1:
5837
                oid = ECC_SECP256R1_OID;
5838
                octets = 32;
5839
                break;
5840
        #endif /* !NO_ECC_SECP */
5841
    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
5842
#endif
5843
        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
5844
            case WOLFSSL_ECC_X25519:
5845
                oid = ECC_X25519_OID;
5846
                octets = 32;
5847
                break;
5848
        #endif /* HAVE_CURVE25519 */
5849
#ifdef HAVE_ECC
5850
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5851
        #ifdef HAVE_ECC_KOBLITZ
5852
            case WOLFSSL_ECC_SECP256K1:
5853
                oid = ECC_SECP256K1_OID;
5854
                octets = 32;
5855
                break;
5856
        #endif /* HAVE_ECC_KOBLITZ */
5857
        #ifdef HAVE_ECC_BRAINPOOL
5858
            case WOLFSSL_ECC_BRAINPOOLP256R1:
5859
                oid = ECC_BRAINPOOLP256R1_OID;
5860
                octets = 32;
5861
                break;
5862
        #endif /* HAVE_ECC_BRAINPOOL */
5863
        #ifdef WOLFSSL_SM2
5864
            case WOLFSSL_ECC_SM2P256V1:
5865
                oid = ECC_SM2P256V1_OID;
5866
                octets = 32;
5867
                break;
5868
        #endif /* WOLFSSL_SM2 */
5869
    #endif
5870
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
5871
        #ifndef NO_ECC_SECP
5872
            case WOLFSSL_ECC_SECP384R1:
5873
                oid = ECC_SECP384R1_OID;
5874
                octets = 48;
5875
                break;
5876
        #endif /* !NO_ECC_SECP */
5877
        #ifdef HAVE_ECC_BRAINPOOL
5878
            case WOLFSSL_ECC_BRAINPOOLP384R1:
5879
                oid = ECC_BRAINPOOLP384R1_OID;
5880
                octets = 48;
5881
                break;
5882
        #endif /* HAVE_ECC_BRAINPOOL */
5883
    #endif
5884
#endif
5885
        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
5886
            case WOLFSSL_ECC_X448:
5887
                oid = ECC_X448_OID;
5888
                octets = 57;
5889
                break;
5890
        #endif /* HAVE_CURVE448 */
5891
#ifdef HAVE_ECC
5892
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
5893
        #ifdef HAVE_ECC_BRAINPOOL
5894
            case WOLFSSL_ECC_BRAINPOOLP512R1:
5895
                oid = ECC_BRAINPOOLP512R1_OID;
5896
                octets = 64;
5897
                break;
5898
        #endif /* HAVE_ECC_BRAINPOOL */
5899
    #endif
5900
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
5901
        #ifndef NO_ECC_SECP
5902
            case WOLFSSL_ECC_SECP521R1:
5903
                oid = ECC_SECP521R1_OID;
5904
                octets = 66;
5905
                break;
5906
        #endif /* !NO_ECC_SECP */
5907
    #endif
5908
#endif
5909
            default: continue; /* unsupported curve */
5910
        }
5911
5912
        foundCurve = 1;
5913
5914
    #ifdef HAVE_ECC
5915
        /* Set default Oid */
5916
        if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
5917
            defOid = oid;
5918
            defSz = octets;
5919
        }
5920
5921
        /* The eccTempKeySz is the preferred ephemeral key size */
5922
        if (currOid == 0 && ssl->eccTempKeySz == octets)
5923
            currOid = oid;
5924
        if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
5925
            nextOid = oid;
5926
            nextSz  = octets;
5927
        }
5928
    #else
5929
        if (defOid == 0 && defSz > octets) {
5930
            defOid = oid;
5931
            defSz = octets;
5932
        }
5933
5934
        if (currOid == 0)
5935
            currOid = oid;
5936
        if (nextOid == 0 || nextSz > octets) {
5937
            nextOid = oid;
5938
            nextSz  = octets;
5939
        }
5940
    #endif
5941
5942
        if (first == ECC_BYTE) {
5943
            switch (second) {
5944
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
5945
                /* ECDHE_ECDSA */
5946
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
5947
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
5948
                case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
5949
                case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
5950
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
5951
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
5952
                case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
5953
                case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
5954
                case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
5955
                case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
5956
                    key |= ssl->ecdhCurveOID == oid;
5957
                    ephmSuite = 1;
5958
                break;
5959
5960
    #ifdef WOLFSSL_STATIC_DH
5961
                /* ECDH_ECDSA */
5962
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
5963
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
5964
                case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
5965
                case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
5966
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
5967
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
5968
                case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
5969
                case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
5970
                    if (oid == ECC_X25519_OID && defOid == oid) {
5971
                        defOid = 0;
5972
                        defSz = 80;
5973
                    }
5974
                    if (oid == ECC_X448_OID && defOid == oid) {
5975
                        defOid = 0;
5976
                        defSz = 80;
5977
                    }
5978
                    key |= ssl->pkCurveOID == oid;
5979
                break;
5980
    #endif /* WOLFSSL_STATIC_DH */
5981
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
5982
#ifndef NO_RSA
5983
                /* ECDHE_RSA */
5984
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
5985
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
5986
                case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
5987
                case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
5988
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
5989
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
5990
                case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
5991
                case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
5992
                    key |= ssl->ecdhCurveOID == oid;
5993
                    ephmSuite = 1;
5994
                break;
5995
5996
    #if defined(HAVE_ECC) && defined(WOLFSSL_STATIC_DH)
5997
                /* ECDH_RSA */
5998
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
5999
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
6000
                case TLS_ECDH_RSA_WITH_RC4_128_SHA:
6001
                case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
6002
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
6003
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
6004
                case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
6005
                case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
6006
                    if (oid == ECC_X25519_OID && defOid == oid) {
6007
                        defOid = 0;
6008
                        defSz = 80;
6009
                    }
6010
                    if (oid == ECC_X448_OID && defOid == oid) {
6011
                        defOid = 0;
6012
                        defSz = 80;
6013
                    }
6014
                    key |= ssl->pkCurveOID == oid;
6015
                break;
6016
    #endif /* HAVE_ECC && WOLFSSL_STATIC_DH */
6017
#endif
6018
                default:
6019
                    if (oid == ECC_X25519_OID && defOid == oid) {
6020
                        defOid = 0;
6021
                        defSz = 80;
6022
                    }
6023
                    if (oid == ECC_X448_OID && defOid == oid) {
6024
                        defOid = 0;
6025
                        defSz = 80;
6026
                    }
6027
                    key = 1;
6028
                break;
6029
            }
6030
        }
6031
6032
        /* ChaCha20-Poly1305 ECC cipher suites */
6033
        if (first == CHACHA_BYTE) {
6034
            switch (second) {
6035
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
6036
                /* ECDHE_ECDSA */
6037
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
6038
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
6039
                    key |= ssl->ecdhCurveOID == oid;
6040
                    ephmSuite = 1;
6041
                break;
6042
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
6043
#ifndef NO_RSA
6044
                /* ECDHE_RSA */
6045
                case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
6046
                case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
6047
                    key |= ssl->ecdhCurveOID == oid;
6048
                    ephmSuite = 1;
6049
                break;
6050
#endif
6051
                default:
6052
                    key = 1;
6053
                break;
6054
            }
6055
        }
6056
    }
6057
6058
    /* Check we found at least one supported curve */
6059
    if (!foundCurve)
6060
        return 0;
6061
6062
    *ecdhCurveOID = ssl->ecdhCurveOID;
6063
    /* Choose the default if it is at the required strength. */
6064
#ifdef HAVE_ECC
6065
    if (*ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
6066
#else
6067
    if (*ecdhCurveOID == 0)
6068
#endif
6069
    {
6070
        key = 1;
6071
        *ecdhCurveOID = defOid;
6072
    }
6073
    /* Choose any curve at the required strength. */
6074
    if (*ecdhCurveOID == 0) {
6075
        key = 1;
6076
        *ecdhCurveOID = currOid;
6077
    }
6078
    /* Choose the default if it is at the next highest strength. */
6079
    if (*ecdhCurveOID == 0 && defSz == nextSz)
6080
        *ecdhCurveOID = defOid;
6081
    /* Choose any curve at the next highest strength. */
6082
    if (*ecdhCurveOID == 0)
6083
        *ecdhCurveOID = nextOid;
6084
    /* No curve and ephemeral ECC suite requires a matching curve. */
6085
    if (*ecdhCurveOID == 0 && ephmSuite)
6086
        key = 0;
6087
6088
    return key;
6089
}
6090
#endif
6091
6092
#endif /* NO_WOLFSSL_SERVER */
6093
6094
6095
int TLSX_SupportedCurve_Copy(TLSX* src, TLSX** dst, void* heap)
6096
1.32k
{
6097
1.32k
    TLSX* extension;
6098
1.32k
    int ret;
6099
6100
1.32k
    extension = TLSX_Find(src, TLSX_SUPPORTED_GROUPS);
6101
1.32k
    if (extension != NULL) {
6102
0
        SupportedCurve* curve;
6103
0
        for (curve = (SupportedCurve*)extension->data; curve != NULL;
6104
0
                curve = curve->next) {
6105
            /* Copying an already validated list - don't drop a group based on
6106
             * the side, so accept when either side has the crypto support. */
6107
0
            ret = TLSX_UseSupportedCurve(dst, curve->name, heap,
6108
0
                                         WOLFSSL_NEITHER_END);
6109
0
            if (ret != WOLFSSL_SUCCESS)
6110
0
                return MEMORY_E;
6111
0
        }
6112
0
    }
6113
6114
1.32k
    return 0;
6115
1.32k
}
6116
6117
int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap, int side)
6118
401k
{
6119
401k
    TLSX* extension = NULL;
6120
401k
    SupportedCurve* curve = NULL;
6121
401k
    int ret;
6122
6123
401k
    if (extensions == NULL) {
6124
0
        return BAD_FUNC_ARG;
6125
0
    }
6126
6127
401k
    if (!TLSX_IsGroupSupported(name, side)) {
6128
23.3k
        return BAD_FUNC_ARG;
6129
23.3k
    }
6130
6131
378k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
6132
6133
378k
    if (!extension) {
6134
29.4k
        ret = TLSX_SupportedCurve_New(&curve, name, heap);
6135
29.4k
        if (ret != 0)
6136
64
            return ret;
6137
6138
29.3k
        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
6139
29.3k
        if (ret != 0) {
6140
58
            XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
6141
58
            return ret;
6142
58
        }
6143
29.3k
    }
6144
348k
    else {
6145
348k
        ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
6146
348k
                                                                          heap);
6147
348k
        if (ret != 0)
6148
216
            return ret;
6149
    #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
6150
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
6151
        if (name == WOLFSSL_SECP256R1MLKEM512) {
6152
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
6153
                WOLFSSL_P256_ML_KEM_512_OLD, heap);
6154
        }
6155
        else if (name == WOLFSSL_SECP384R1MLKEM768) {
6156
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
6157
                WOLFSSL_P384_ML_KEM_768_OLD, heap);
6158
        }
6159
        else if (name == WOLFSSL_SECP521R1MLKEM1024) {
6160
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
6161
                WOLFSSL_P521_ML_KEM_1024_OLD, heap);
6162
        }
6163
        if (ret != 0) {
6164
            return ret;
6165
        }
6166
    #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
6167
348k
    }
6168
6169
377k
    return WOLFSSL_SUCCESS;
6170
378k
}
6171
6172
int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
6173
15.7k
{
6174
15.7k
    TLSX* extension = NULL;
6175
15.7k
    PointFormat* point = NULL;
6176
15.7k
    int ret = 0;
6177
6178
15.7k
    if (extensions == NULL)
6179
0
        return BAD_FUNC_ARG;
6180
6181
15.7k
    extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
6182
6183
15.7k
    if (!extension) {
6184
15.7k
        ret = TLSX_PointFormat_New(&point, format, heap);
6185
15.7k
        if (ret != 0)
6186
18
            return ret;
6187
6188
15.7k
        ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
6189
15.7k
        if (ret != 0) {
6190
6
            XFREE(point, heap, DYNAMIC_TYPE_TLSX);
6191
6
            return ret;
6192
6
        }
6193
15.7k
    }
6194
0
    else {
6195
0
        ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
6196
0
                                                                          heap);
6197
0
        if (ret != 0)
6198
0
            return ret;
6199
0
    }
6200
6201
15.7k
    return WOLFSSL_SUCCESS;
6202
15.7k
}
6203
6204
0
#define EC_FREE_ALL         TLSX_SupportedCurve_FreeAll
6205
#define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
6206
6207
/* In TLS 1.2 the server never sends supported curve extension, but in TLS 1.3
6208
 * the server can send supported groups extension to indicate what it will
6209
 * support for later connections. */
6210
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
6211
0
#define EC_GET_SIZE TLSX_SupportedCurve_GetSize
6212
#define EC_WRITE    TLSX_SupportedCurve_Write
6213
#else
6214
#define EC_GET_SIZE(list)         0
6215
#define EC_WRITE(a, b)            0
6216
#endif
6217
6218
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
6219
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
6220
0
#define EC_PARSE TLSX_SupportedCurve_Parse
6221
#else
6222
#define EC_PARSE(a, b, c, d, e)   0
6223
#endif
6224
6225
0
#define PF_FREE_ALL          TLSX_PointFormat_FreeAll
6226
#define PF_VALIDATE_REQUEST  TLSX_PointFormat_ValidateRequest
6227
0
#define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
6228
6229
0
#define PF_GET_SIZE TLSX_PointFormat_GetSize
6230
#define PF_WRITE    TLSX_PointFormat_Write
6231
6232
#ifndef NO_WOLFSSL_SERVER
6233
0
#define PF_PARSE TLSX_PointFormat_Parse
6234
#else
6235
#define PF_PARSE(a, b, c, d)      0
6236
#endif
6237
6238
#else
6239
6240
#define EC_FREE_ALL(list, heap) WC_DO_NOTHING
6241
#define EC_GET_SIZE(list)         0
6242
#define EC_WRITE(a, b)            0
6243
#define EC_PARSE(a, b, c, d, e)   0
6244
#define EC_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
6245
6246
#define PF_FREE_ALL(list, heap)   WC_DO_NOTHING
6247
#define PF_GET_SIZE(list)         0
6248
#define PF_WRITE(a, b)            0
6249
#define PF_PARSE(a, b, c, d)      0
6250
#define PF_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
6251
#define PF_VALIDATE_RESPONSE(a, b) WC_DO_NOTHING
6252
6253
#endif /* HAVE_SUPPORTED_CURVES */
6254
6255
/******************************************************************************/
6256
/* Renegotiation Indication                                                   */
6257
/******************************************************************************/
6258
6259
#if defined(HAVE_SECURE_RENEGOTIATION) \
6260
 || defined(HAVE_SERVER_RENEGOTIATION_INFO)
6261
6262
static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
6263
                                                                  int isRequest)
6264
1.88k
{
6265
1.88k
    byte length = OPAQUE8_LEN; /* empty info length */
6266
6267
    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
6268
1.88k
    if (data && data->enabled && data->verifySet) {
6269
        /* client sends client_verify_data only */
6270
0
        length += TLS_FINISHED_SZ;
6271
6272
        /* server also sends server_verify_data */
6273
0
        if (!isRequest)
6274
0
            length += TLS_FINISHED_SZ;
6275
0
    }
6276
6277
1.88k
    return length;
6278
1.88k
}
6279
6280
static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
6281
                                                    byte* output, int isRequest)
6282
1.72k
{
6283
1.72k
    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
6284
1.72k
    if (data && data->enabled && data->verifySet) {
6285
        /* client sends client_verify_data only */
6286
0
        XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
6287
0
        offset += TLS_FINISHED_SZ;
6288
6289
        /* server also sends server_verify_data */
6290
0
        if (!isRequest) {
6291
0
            XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
6292
0
            offset += TLS_FINISHED_SZ;
6293
0
        }
6294
0
    }
6295
6296
1.72k
    output[0] = (byte)(offset - 1);  /* info length - self */
6297
6298
1.72k
    return offset;
6299
1.72k
}
6300
6301
static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input,
6302
                                          word16 length, byte isRequest)
6303
252
{
6304
252
    int ret = WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E);
6305
6306
252
    if (length >= OPAQUE8_LEN) {
6307
252
        if (isRequest) {
6308
243
        #ifndef NO_WOLFSSL_SERVER
6309
243
            if (ssl->secure_renegotiation == NULL) {
6310
206
                ret = wolfSSL_UseSecureRenegotiation(ssl);
6311
206
                if (ret == WOLFSSL_SUCCESS)
6312
199
                    ret = 0;
6313
206
            }
6314
            /* renegotiation_info seen (checked by DoClientHello, RFC 5746 3.7) */
6315
243
            if (ssl->secure_renegotiation != NULL)
6316
236
                ssl->secure_renegotiation->renegInfoSeen = 1;
6317
243
            if (ret != 0 && ret != WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E)) {
6318
7
            }
6319
236
            else if (ssl->secure_renegotiation == NULL) {
6320
0
            }
6321
236
            else if (!ssl->secure_renegotiation->enabled) {
6322
199
                if (*input == 0) {
6323
112
                    input++; /* get past size */
6324
6325
112
                    ssl->secure_renegotiation->enabled = 1;
6326
112
                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6327
112
                    ret = 0;
6328
112
                }
6329
87
                else {
6330
                    /* already in error state */
6331
87
                    WOLFSSL_MSG("SCR client verify data present");
6332
87
                }
6333
199
            }
6334
37
            else if (*input == TLS_FINISHED_SZ) {
6335
27
                if (length < TLS_FINISHED_SZ + 1) {
6336
8
                    WOLFSSL_MSG("SCR malformed buffer");
6337
8
                    ret = BUFFER_E;
6338
8
                }
6339
19
                else {
6340
19
                    input++; /* get past size */
6341
6342
                    /* validate client verify data */
6343
19
                    if (ConstantCompare(input,
6344
19
                            ssl->secure_renegotiation->client_verify_data,
6345
19
                            TLS_FINISHED_SZ) == 0) {
6346
11
                        WOLFSSL_MSG("SCR client verify data match");
6347
11
                        TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6348
11
                        ret = 0;  /* verified */
6349
11
                    }
6350
8
                    else {
6351
                        /* already in error state */
6352
8
                        WOLFSSL_MSG("SCR client verify data Failure");
6353
8
                    }
6354
19
                }
6355
27
            }
6356
243
        #endif
6357
243
        }
6358
9
        else if (ssl->secure_renegotiation != NULL) {
6359
0
        #ifndef NO_WOLFSSL_CLIENT
6360
0
            if (!ssl->secure_renegotiation->enabled) {
6361
0
                if (*input == 0) {
6362
0
                    ssl->secure_renegotiation->enabled = 1;
6363
0
                    ret = 0;
6364
0
                }
6365
0
            }
6366
0
            else if (*input == 2 * TLS_FINISHED_SZ &&
6367
0
                     length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
6368
0
                int cmpRes = 0;
6369
0
                input++;  /* get past size */
6370
0
                cmpRes |= ConstantCompare(input,
6371
0
                        ssl->secure_renegotiation->client_verify_data,
6372
0
                        TLS_FINISHED_SZ);
6373
0
                cmpRes |= ConstantCompare(input + TLS_FINISHED_SZ,
6374
0
                        ssl->secure_renegotiation->server_verify_data,
6375
0
                        TLS_FINISHED_SZ);
6376
                /* validate client and server verify data */
6377
0
                if (cmpRes == 0) {
6378
0
                    WOLFSSL_MSG("SCR client and server verify data match");
6379
0
                    ret = 0;  /* verified */
6380
0
                }
6381
0
                else {
6382
                    /* already in error state */
6383
0
                    WOLFSSL_MSG("SCR client and server verify data Failure");
6384
0
                }
6385
0
            }
6386
0
        #endif
6387
0
        }
6388
9
        else {
6389
9
            ret = SECURE_RENEGOTIATION_E;
6390
9
        }
6391
252
    }
6392
0
    else {
6393
0
        ret = SECURE_RENEGOTIATION_E;
6394
0
    }
6395
6396
252
    if (ret != 0) {
6397
42
        WOLFSSL_ERROR_VERBOSE(ret);
6398
42
        SendAlert(ssl, alert_fatal, handshake_failure);
6399
42
    }
6400
6401
252
    return ret;
6402
252
}
6403
6404
int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
6405
3.70k
{
6406
3.70k
    int ret = 0;
6407
3.70k
    SecureRenegotiation* data;
6408
6409
3.70k
    data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
6410
3.70k
                                                             DYNAMIC_TYPE_TLSX);
6411
3.70k
    if (data == NULL)
6412
25
        return MEMORY_E;
6413
6414
3.67k
    XMEMSET(data, 0, sizeof(SecureRenegotiation));
6415
6416
3.67k
    ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
6417
3.67k
    if (ret != 0) {
6418
17
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
6419
17
        return ret;
6420
17
    }
6421
6422
3.65k
    return WOLFSSL_SUCCESS;
6423
3.67k
}
6424
6425
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
6426
6427
int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
6428
3.49k
{
6429
3.49k
    int ret;
6430
6431
    /* send empty renegotiation_info extension */
6432
3.49k
    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6433
3.49k
    if (ext == NULL) {
6434
3.49k
        ret = TLSX_UseSecureRenegotiation(extensions, heap);
6435
3.49k
        if (ret != WOLFSSL_SUCCESS)
6436
35
            return ret;
6437
6438
3.45k
        ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6439
3.45k
    }
6440
3.45k
    if (ext)
6441
3.45k
        ext->resp = 1;
6442
6443
3.45k
    return WOLFSSL_SUCCESS;
6444
3.49k
}
6445
6446
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
6447
6448
6449
0
#define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
6450
0
#define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
6451
#define SCR_WRITE          TLSX_SecureRenegotiation_Write
6452
0
#define SCR_PARSE          TLSX_SecureRenegotiation_Parse
6453
6454
#else
6455
6456
#define SCR_FREE_ALL(a, heap) WC_DO_NOTHING
6457
#define SCR_GET_SIZE(a, b)    0
6458
#define SCR_WRITE(a, b, c)    0
6459
#define SCR_PARSE(a, b, c, d) 0
6460
6461
#endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
6462
6463
/******************************************************************************/
6464
/* Session Tickets                                                            */
6465
/******************************************************************************/
6466
6467
#ifdef HAVE_SESSION_TICKET
6468
6469
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
6470
{
6471
    (void)isRequest;
6472
    return ticket ? ticket->size : 0;
6473
}
6474
6475
static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
6476
                                       int isRequest)
6477
{
6478
    word16 offset = 0; /* empty ticket */
6479
6480
    if (isRequest && ticket) {
6481
        XMEMCPY(output + offset, ticket->data, ticket->size);
6482
        offset += ticket->size;
6483
    }
6484
6485
    return offset;
6486
}
6487
6488
6489
static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, const byte* input,
6490
                                    word16 length, byte isRequest)
6491
{
6492
    int ret = 0;
6493
6494
    (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
6495
6496
    if (!isRequest) {
6497
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
6498
            return TLSX_HandleUnsupportedExtension(ssl);
6499
6500
        if (length != 0)
6501
            return BUFFER_ERROR;
6502
6503
#ifndef NO_WOLFSSL_CLIENT
6504
        ssl->expect_session_ticket = 1;
6505
#endif
6506
    }
6507
#ifndef NO_WOLFSSL_SERVER
6508
    else {
6509
        /* server side */
6510
        if (ssl->ctx->ticketEncCb == NULL) {
6511
            WOLFSSL_MSG("Client sent session ticket, server has no callback");
6512
            return 0;
6513
        }
6514
6515
#ifdef HAVE_SECURE_RENEGOTIATION
6516
        if (IsSCR(ssl)) {
6517
            WOLFSSL_MSG("Client sent session ticket during SCR. Ignoring.");
6518
            return 0;
6519
        }
6520
#endif
6521
6522
        if (length > SESSION_TICKET_LEN) {
6523
            ret = BAD_TICKET_MSG_SZ;
6524
            WOLFSSL_ERROR_VERBOSE(ret);
6525
        } else if (IsAtLeastTLSv1_3(ssl->version)) {
6526
            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
6527
            ssl->options.rejectTicket = 1;
6528
            ret = 0;  /* not fatal */
6529
        } else if (ssl->options.noTicketTls12) {
6530
            /* ignore ticket request */
6531
        } else if (length == 0) {
6532
            /* blank ticket */
6533
            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6534
            if (ret == WOLFSSL_SUCCESS) {
6535
                ret = 0;
6536
                /* send blank ticket */
6537
                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6538
                ssl->options.createTicket = 1;  /* will send ticket msg */
6539
                ssl->options.useTicket    = 1;
6540
                ssl->options.resuming     = 0;  /* no standard resumption */
6541
                ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
6542
            }
6543
        } else {
6544
            /* got actual ticket from client */
6545
            ret = DoClientTicket(ssl, input, length);
6546
            if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
6547
                WOLFSSL_MSG("Using existing client ticket");
6548
                ssl->options.useTicket    = 1;
6549
                ssl->options.resuming     = 1;
6550
                /* SERVER: ticket is peer auth. */
6551
                ssl->options.peerAuthGood = 1;
6552
            } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
6553
                WOLFSSL_MSG("Using existing client ticket, creating new one");
6554
                ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6555
                if (ret == WOLFSSL_SUCCESS) {
6556
                    ret = 0;
6557
                    TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6558
                                                    /* send blank ticket */
6559
                    ssl->options.createTicket = 1;  /* will send ticket msg */
6560
                    ssl->options.useTicket    = 1;
6561
                    ssl->options.resuming     = 1;
6562
                    /* SERVER: ticket is peer auth. */
6563
                    ssl->options.peerAuthGood = 1;
6564
                }
6565
            } else if (ret == WOLFSSL_TICKET_RET_REJECT ||
6566
                    ret == WC_NO_ERR_TRACE(VERSION_ERROR)) {
6567
                WOLFSSL_MSG("Process client ticket rejected, not using");
6568
                if (ret == WC_NO_ERR_TRACE(VERSION_ERROR))
6569
                    WOLFSSL_MSG("\tbad TLS version");
6570
                ret = 0;  /* not fatal */
6571
6572
                ssl->options.rejectTicket = 1;
6573
                /* If we have session tickets enabled then send a new ticket */
6574
                if (!TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET)) {
6575
                    ret = TLSX_UseSessionTicket(&ssl->extensions, NULL,
6576
                                                ssl->heap);
6577
                    if (ret == WOLFSSL_SUCCESS) {
6578
                        ret = 0;
6579
                        TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6580
                        ssl->options.createTicket = 1;
6581
                        ssl->options.useTicket    = 1;
6582
                    }
6583
                }
6584
            } else if (ret == WOLFSSL_TICKET_RET_FATAL) {
6585
                WOLFSSL_MSG("Process client ticket fatal error, not using");
6586
            } else if (ret < 0) {
6587
                WOLFSSL_MSG("Process client ticket unknown error, not using");
6588
            }
6589
        }
6590
    }
6591
#endif /* NO_WOLFSSL_SERVER */
6592
6593
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
6594
    (void)ssl;
6595
#endif
6596
6597
    return ret;
6598
}
6599
6600
WOLFSSL_TEST_VIS SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
6601
                                            byte* data, word16 size, void* heap)
6602
{
6603
    SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
6604
                                                       heap, DYNAMIC_TYPE_TLSX);
6605
    if (ticket) {
6606
        ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
6607
        if (ticket->data == NULL) {
6608
            XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
6609
            return NULL;
6610
        }
6611
6612
        XMEMCPY(ticket->data, data, size);
6613
        ticket->size     = size;
6614
        ticket->lifetime = lifetime;
6615
    }
6616
6617
    (void)heap;
6618
6619
    return ticket;
6620
}
6621
WOLFSSL_TEST_VIS void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
6622
{
6623
    if (ticket) {
6624
        XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
6625
        XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
6626
    }
6627
6628
    (void)heap;
6629
}
6630
6631
int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
6632
{
6633
    int ret = 0;
6634
6635
    if (extensions == NULL)
6636
        return BAD_FUNC_ARG;
6637
6638
    /* If the ticket is NULL, the client will request a new ticket from the
6639
       server. Otherwise, the client will use it in the next client hello. */
6640
    if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
6641
                                                                           != 0)
6642
        return ret;
6643
6644
    return WOLFSSL_SUCCESS;
6645
}
6646
6647
#define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
6648
#define WOLF_STK_WRITE            TLSX_SessionTicket_Write
6649
#define WOLF_STK_PARSE            TLSX_SessionTicket_Parse
6650
#define WOLF_STK_FREE(stk, heap)  TLSX_SessionTicket_Free((SessionTicket*)(stk),(heap))
6651
6652
#else
6653
6654
0
#define WOLF_STK_FREE(a, b) WC_DO_NOTHING
6655
#define WOLF_STK_VALIDATE_REQUEST(a) WC_DO_NOTHING
6656
0
#define WOLF_STK_GET_SIZE(a, b)      0
6657
#define WOLF_STK_WRITE(a, b, c)      0
6658
0
#define WOLF_STK_PARSE(a, b, c, d)   0
6659
6660
#endif /* HAVE_SESSION_TICKET */
6661
6662
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
6663
/******************************************************************************/
6664
/* Encrypt-then-MAC                                                           */
6665
/******************************************************************************/
6666
6667
#ifndef WOLFSSL_NO_TLS12
6668
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl);
6669
6670
/**
6671
 * Get the size of the Encrypt-Then-MAC extension.
6672
 *
6673
 * msgType  Type of message to put extension into.
6674
 * pSz      Size of extension data.
6675
 * return SANITY_MSG_E when the message is not allowed to have extension and
6676
 *        0 otherwise.
6677
 */
6678
static int TLSX_EncryptThenMac_GetSize(byte msgType, word16* pSz)
6679
21.2k
{
6680
21.2k
    (void)pSz;
6681
6682
21.2k
    if (msgType != client_hello && msgType != server_hello) {
6683
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6684
0
        return SANITY_MSG_E;
6685
0
    }
6686
6687
    /* Empty extension */
6688
6689
21.2k
    return 0;
6690
21.2k
}
6691
6692
/**
6693
 * Write the Encrypt-Then-MAC extension.
6694
 *
6695
 * data     Unused
6696
 * output   Extension data buffer. Unused.
6697
 * msgType  Type of message to put extension into.
6698
 * pSz      Size of extension data.
6699
 * return SANITY_MSG_E when the message is not allowed to have extension and
6700
 *        0 otherwise.
6701
 */
6702
static int TLSX_EncryptThenMac_Write(void* data, byte* output, byte msgType,
6703
                                     word16* pSz)
6704
19.1k
{
6705
19.1k
    (void)data;
6706
19.1k
    (void)output;
6707
19.1k
    (void)pSz;
6708
6709
19.1k
    if (msgType != client_hello && msgType != server_hello) {
6710
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6711
0
        return SANITY_MSG_E;
6712
0
    }
6713
6714
    /* Empty extension */
6715
6716
19.1k
    return 0;
6717
19.1k
}
6718
6719
/**
6720
 * Parse the Encrypt-Then-MAC extension.
6721
 *
6722
 * ssl      SSL object
6723
 * input    Extension data buffer.
6724
 * length   Length of this extension's data.
6725
 * msgType  Type of message to extension appeared in.
6726
 * return SANITY_MSG_E when the message is not allowed to have extension,
6727
 *        BUFFER_ERROR when the extension's data is invalid,
6728
 *        MEMORY_E when unable to allocate memory and
6729
 *        0 otherwise.
6730
 */
6731
static int TLSX_EncryptThenMac_Parse(WOLFSSL* ssl, const byte* input,
6732
                                     word16 length, byte msgType)
6733
1.38k
{
6734
1.38k
    int ret;
6735
6736
1.38k
    (void)input;
6737
6738
1.38k
    if (msgType != client_hello && msgType != server_hello) {
6739
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6740
0
        return SANITY_MSG_E;
6741
0
    }
6742
6743
    /* Empty extension */
6744
1.38k
    if (length != 0)
6745
16
        return BUFFER_ERROR;
6746
6747
1.37k
    if (msgType == client_hello) {
6748
        /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
6749
1.36k
        if (!ssl->options.disallowEncThenMac) {
6750
1.36k
            ssl->options.encThenMac = 1;
6751
            /* Set the extension reply. */
6752
1.36k
            ret = TLSX_EncryptThenMac_Use(ssl);
6753
1.36k
            if (ret != 0)
6754
13
                return ret;
6755
1.36k
        }
6756
1.35k
        return 0;
6757
1.36k
    }
6758
6759
    /* Server Hello */
6760
10
    if (ssl->options.disallowEncThenMac) {
6761
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6762
0
        return SANITY_MSG_E;
6763
0
    }
6764
6765
10
    ssl->options.encThenMac = 1;
6766
10
    return 0;
6767
6768
10
}
6769
6770
/**
6771
 * Add the Encrypt-Then-MAC extension to list.
6772
 *
6773
 * ssl      SSL object
6774
 * return MEMORY_E when unable to allocate memory and 0 otherwise.
6775
 */
6776
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl)
6777
20.0k
{
6778
20.0k
    int   ret = 0;
6779
20.0k
    TLSX* extension;
6780
6781
    /* Find the Encrypt-Then-Mac extension if it exists. */
6782
20.0k
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6783
20.0k
    if (extension == NULL) {
6784
        /* Push new Encrypt-Then-Mac extension. */
6785
20.0k
        ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
6786
20.0k
            ssl->heap);
6787
20.0k
        if (ret != 0)
6788
19
            return ret;
6789
20.0k
    }
6790
6791
20.0k
    return 0;
6792
20.0k
}
6793
6794
/**
6795
 * Set the Encrypt-Then-MAC extension as one to respond too.
6796
 *
6797
 * ssl      SSL object
6798
 * return EXT_MISSING when EncryptThenMac extension not in list.
6799
 */
6800
int TLSX_EncryptThenMac_Respond(WOLFSSL* ssl)
6801
864
{
6802
864
    TLSX* extension;
6803
6804
864
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6805
864
    if (extension == NULL)
6806
0
        return EXT_MISSING;
6807
864
    extension->resp = 1;
6808
6809
864
    return 0;
6810
864
}
6811
6812
0
#define ETM_GET_SIZE  TLSX_EncryptThenMac_GetSize
6813
#define ETM_WRITE     TLSX_EncryptThenMac_Write
6814
0
#define ETM_PARSE     TLSX_EncryptThenMac_Parse
6815
6816
#else
6817
6818
#define ETM_GET_SIZE(a, b)    0
6819
#define ETM_WRITE(a, b, c, d) 0
6820
#define ETM_PARSE(a, b, c, d) 0
6821
6822
#endif /* !WOLFSSL_NO_TLS12 */
6823
6824
#endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
6825
6826
6827
#ifdef WOLFSSL_SRTP
6828
6829
/******************************************************************************/
6830
/* DTLS SRTP (Secure Real-time Transport Protocol)                            */
6831
/******************************************************************************/
6832
6833
/* Only support single SRTP profile */
6834
typedef struct TlsxSrtp {
6835
    word16 profileCount;
6836
    word16 ids; /* selected bits */
6837
} TlsxSrtp;
6838
6839
#ifndef NO_WOLFSSL_SERVER
6840
static int TLSX_UseSRTP_GetSize(TlsxSrtp *srtp)
6841
{
6842
    /*   SRTP Profile Len (2)
6843
     *      SRTP Profiles (2)
6844
     *   MKI (master key id) Length */
6845
    return (OPAQUE16_LEN + (srtp->profileCount * OPAQUE16_LEN) + 1);
6846
}
6847
#endif
6848
6849
static TlsxSrtp* TLSX_UseSRTP_New(word16 ids, void* heap)
6850
{
6851
    TlsxSrtp* srtp;
6852
    int i;
6853
6854
    srtp = (TlsxSrtp*)XMALLOC(sizeof(TlsxSrtp), heap, DYNAMIC_TYPE_TLSX);
6855
    if (srtp == NULL) {
6856
        WOLFSSL_MSG("TLSX SRTP Memory failure");
6857
        return NULL;
6858
    }
6859
6860
    /* count and test each bit set */
6861
    srtp->profileCount = 0;
6862
    for (i=0; i<16; i++) {
6863
        if (ids & (1 << i)) {
6864
            srtp->profileCount++;
6865
        }
6866
    }
6867
    srtp->ids = ids;
6868
6869
    return srtp;
6870
}
6871
6872
static void TLSX_UseSRTP_Free(TlsxSrtp *srtp, void* heap)
6873
{
6874
    XFREE(srtp, heap, DYNAMIC_TYPE_TLSX);
6875
    (void)heap;
6876
}
6877
6878
#ifndef NO_WOLFSSL_SERVER
6879
static int TLSX_UseSRTP_Parse(WOLFSSL* ssl, const byte* input, word16 length,
6880
    byte isRequest)
6881
{
6882
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
6883
    word16 profile_len = 0;
6884
    word16 profile_value = 0;
6885
    word16 offset = 0;
6886
    int i;
6887
    TlsxSrtp* srtp = NULL;
6888
6889
    if (length < OPAQUE16_LEN) {
6890
        return BUFFER_ERROR;
6891
    }
6892
6893
    /* reset selected DTLS SRTP profile ID */
6894
    ssl->dtlsSrtpId = 0;
6895
6896
    /* total length, not include itself */
6897
    ato16(input, &profile_len);
6898
    offset += OPAQUE16_LEN;
6899
    /* Check profile length is not bigger than remaining length. */
6900
    if (profile_len > length - offset) {
6901
        return BUFFER_ERROR;
6902
    }
6903
    /* Protection profiles are 2 bytes long - ensure not an odd no. bytes. */
6904
    if ((profile_len & 1) == 1) {
6905
        return BUFFER_ERROR;
6906
    }
6907
    /* Ignoring srtp_mki field - SRTP Make Key Identifier.
6908
     * Defined to be 0..255 bytes long.
6909
     */
6910
    if ((length - profile_len - offset) > 255) {
6911
        return BUFFER_ERROR;
6912
    }
6913
6914
    if (!isRequest) {
6915
#ifndef NO_WOLFSSL_CLIENT
6916
        /* Only one SRTP Protection Profile can be chosen. */
6917
        if (profile_len != OPAQUE16_LEN) {
6918
            return BUFFER_ERROR;
6919
        }
6920
6921
        ato16(input + offset, &profile_value);
6922
6923
        /* check that the profile received was in the ones we support */
6924
        if (profile_value < 16 &&
6925
                               (ssl->dtlsSrtpProfiles & (1 << profile_value))) {
6926
            ssl->dtlsSrtpId = profile_value;
6927
            ret = 0; /* success */
6928
        }
6929
#endif
6930
    }
6931
    else {
6932
        /* parse remainder one profile at a time, looking for match in CTX */
6933
        ret = 0;
6934
        for (i = 0; i < profile_len; i += OPAQUE16_LEN) {
6935
            ato16(input + offset + i, &profile_value);
6936
            /* find first match */
6937
            if (profile_value < 16 &&
6938
                                 ssl->dtlsSrtpProfiles & (1 << profile_value)) {
6939
                ssl->dtlsSrtpId = profile_value;
6940
6941
                /* make sure we respond with selected SRTP id selected */
6942
                srtp = TLSX_UseSRTP_New((1 << profile_value), ssl->heap);
6943
                if (srtp != NULL) {
6944
                    ret = TLSX_Push(&ssl->extensions, TLSX_USE_SRTP,
6945
                        (void*)srtp, ssl->heap);
6946
                    if (ret == 0) {
6947
                        TLSX_SetResponse(ssl, TLSX_USE_SRTP);
6948
                        /* successfully set extension */
6949
                    }
6950
                }
6951
                else {
6952
                    ret = MEMORY_E;
6953
                }
6954
                break;
6955
            }
6956
        }
6957
    }
6958
6959
    if (ret == 0 && ssl->dtlsSrtpId == 0) {
6960
        WOLFSSL_MSG("TLSX_UseSRTP_Parse profile not found!");
6961
        /* not fatal */
6962
    }
6963
    else if (ret != 0) {
6964
        ssl->dtlsSrtpId = 0;
6965
        TLSX_UseSRTP_Free(srtp, ssl->heap);
6966
    }
6967
6968
    return ret;
6969
}
6970
6971
static word16 TLSX_UseSRTP_Write(TlsxSrtp* srtp, byte* output)
6972
{
6973
    word16 offset = 0;
6974
    int i, j;
6975
6976
    c16toa(srtp->profileCount * 2, output + offset);
6977
    offset += OPAQUE16_LEN;
6978
    j = 0;
6979
    for (i = 0; i < srtp->profileCount; i++) {
6980
        for (; j < 16; j++) {
6981
            if (srtp->ids & (1 << j)) {
6982
                c16toa(j, output + offset);
6983
                offset += OPAQUE16_LEN;
6984
            }
6985
        }
6986
    }
6987
    output[offset++] = 0x00; /* MKI Length */
6988
6989
    return offset;
6990
}
6991
#endif
6992
6993
static int TLSX_UseSRTP(TLSX** extensions, word16 profiles, void* heap)
6994
{
6995
    int ret = 0;
6996
    TLSX* extension;
6997
6998
    if (extensions == NULL) {
6999
        return BAD_FUNC_ARG;
7000
    }
7001
7002
    extension = TLSX_Find(*extensions, TLSX_USE_SRTP);
7003
    if (extension == NULL) {
7004
        TlsxSrtp* srtp = TLSX_UseSRTP_New(profiles, heap);
7005
        if (srtp == NULL) {
7006
            return MEMORY_E;
7007
        }
7008
7009
        ret = TLSX_Push(extensions, TLSX_USE_SRTP, (void*)srtp, heap);
7010
        if (ret != 0) {
7011
            TLSX_UseSRTP_Free(srtp, heap);
7012
        }
7013
    }
7014
7015
    return ret;
7016
}
7017
7018
#ifndef NO_WOLFSSL_SERVER
7019
    #define SRTP_FREE     TLSX_UseSRTP_Free
7020
    #define SRTP_PARSE    TLSX_UseSRTP_Parse
7021
    #define SRTP_WRITE    TLSX_UseSRTP_Write
7022
    #define SRTP_GET_SIZE TLSX_UseSRTP_GetSize
7023
#else
7024
    #define SRTP_FREE(a, b) WC_DO_NOTHING
7025
    #define SRTP_PARSE(a, b, c, d)      0
7026
    #define SRTP_WRITE(a, b)            0
7027
    #define SRTP_GET_SIZE(a)            0
7028
#endif
7029
7030
#endif /* WOLFSSL_SRTP */
7031
7032
7033
/******************************************************************************/
7034
/* Supported Versions                                                         */
7035
/******************************************************************************/
7036
7037
#ifdef WOLFSSL_TLS13
7038
static WC_INLINE int versionIsGreater(byte isDtls, byte a, byte b)
7039
{
7040
    (void)isDtls;
7041
7042
#ifdef WOLFSSL_DTLS
7043
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7044
    if (isDtls)
7045
        return a < b;
7046
#endif /* WOLFSSL_DTLS */
7047
7048
    return a > b;
7049
}
7050
7051
static WC_INLINE int versionIsLesser(byte isDtls, byte a, byte b)
7052
{
7053
    (void)isDtls;
7054
7055
#ifdef WOLFSSL_DTLS
7056
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7057
    if (isDtls)
7058
        return a > b;
7059
#endif /* WOLFSSL_DTLS */
7060
7061
    return a < b;
7062
}
7063
7064
static WC_INLINE int versionIsAtLeast(byte isDtls, byte a, byte b)
7065
{
7066
    (void)isDtls;
7067
7068
#ifdef WOLFSSL_DTLS
7069
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7070
    if (isDtls)
7071
        return a <= b;
7072
#endif /* WOLFSSL_DTLS */
7073
7074
    return a >= b;
7075
}
7076
7077
static WC_INLINE int versionIsLessEqual(byte isDtls, byte a, byte b)
7078
{
7079
    (void)isDtls;
7080
7081
#ifdef WOLFSSL_DTLS
7082
    /* DTLS version increases backwards (-1,-2,-3,etc) */
7083
    if (isDtls)
7084
        return a >= b;
7085
#endif /* WOLFSSL_DTLS */
7086
7087
    return a <= b;
7088
}
7089
7090
/* Return the size of the SupportedVersions extension's data.
7091
 *
7092
 * data       The SSL/TLS object.
7093
 * msgType The type of the message this extension is being written into.
7094
 * returns the length of data that will be in the extension.
7095
 */
7096
static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
7097
0
{
7098
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7099
0
    byte tls13Minor, tls12Minor, tls11Minor, isDtls;
7100
7101
0
    isDtls = !!ssl->options.dtls;
7102
0
    tls13Minor = (byte)(isDtls ? DTLSv1_3_MINOR : TLSv1_3_MINOR);
7103
0
    tls12Minor = (byte)(isDtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR);
7104
0
    tls11Minor = (byte)(isDtls ? DTLS_MINOR : TLSv1_1_MINOR);
7105
7106
    /* unused on some configuration */
7107
0
    (void)tls12Minor;
7108
0
    (void)tls13Minor;
7109
0
    (void)tls11Minor;
7110
7111
0
    if (msgType == client_hello) {
7112
        /* TLS v1.2 and TLS v1.3  */
7113
0
        int cnt = 0;
7114
7115
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13Minor)
7116
        #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7117
            defined(WOLFSSL_WPAS_SMALL)
7118
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
7119
        #endif
7120
0
        ) {
7121
0
            cnt++;
7122
0
        }
7123
7124
0
        if (ssl->options.downgrade) {
7125
0
    #ifndef WOLFSSL_NO_TLS12
7126
0
            if (versionIsLessEqual(
7127
0
                    isDtls, ssl->options.minDowngrade, tls12Minor)
7128
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
7129
    defined(WOLFSSL_WPAS_SMALL)
7130
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
7131
#endif
7132
0
            ) {
7133
0
                cnt++;
7134
0
            }
7135
0
#endif
7136
    #ifndef NO_OLD_TLS
7137
            if (versionIsLessEqual(
7138
                    isDtls, ssl->options.minDowngrade, tls11Minor)
7139
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7140
                defined(WOLFSSL_WPAS_SMALL)
7141
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
7142
            #endif
7143
            ) {
7144
                cnt++;
7145
            }
7146
        #ifdef WOLFSSL_ALLOW_TLSV10
7147
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
7148
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7149
                defined(WOLFSSL_WPAS_SMALL)
7150
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
7151
            #endif
7152
            ) {
7153
                cnt++;
7154
            }
7155
        #endif
7156
    #endif
7157
0
        }
7158
7159
0
        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
7160
0
    }
7161
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7162
0
        *pSz += OPAQUE16_LEN;
7163
0
    }
7164
0
    else {
7165
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7166
0
        return SANITY_MSG_E;
7167
0
    }
7168
7169
0
    return 0;
7170
0
}
7171
7172
/* Writes the SupportedVersions extension into the buffer.
7173
 *
7174
 * data    The SSL/TLS object.
7175
 * output  The buffer to write the extension into.
7176
 * msgType The type of the message this extension is being written into.
7177
 * returns the length of data that was written.
7178
 */
7179
static int TLSX_SupportedVersions_Write(void* data, byte* output,
7180
                                        byte msgType, word16* pSz)
7181
0
{
7182
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7183
0
    byte tls13minor, tls12minor, tls11minor, isDtls = 0;
7184
7185
0
    tls13minor = (byte)TLSv1_3_MINOR;
7186
0
    tls12minor = (byte)TLSv1_2_MINOR;
7187
0
    tls11minor = (byte)TLSv1_1_MINOR;
7188
7189
    /* unused in some configuration */
7190
0
    (void)tls11minor;
7191
0
    (void)tls12minor;
7192
7193
#ifdef WOLFSSL_DTLS13
7194
    if (ssl->options.dtls) {
7195
        tls13minor = (byte)DTLSv1_3_MINOR;
7196
    #ifndef WOLFSSL_NO_TLS12
7197
        tls12minor = (byte)DTLSv1_2_MINOR;
7198
    #endif
7199
    #ifndef NO_OLD_TLS
7200
        tls11minor = (byte)DTLS_MINOR;
7201
    #endif
7202
        isDtls = 1;
7203
    }
7204
#endif /* WOLFSSL_DTLS13 */
7205
7206
0
    if (msgType == client_hello) {
7207
0
        byte major = ssl->ctx->method->version.major;
7208
7209
0
        byte* cnt = output++;
7210
0
        *cnt = 0;
7211
7212
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13minor)
7213
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
7214
    defined(WOLFSSL_WPAS_SMALL)
7215
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
7216
#endif
7217
0
        ) {
7218
0
            *cnt += OPAQUE16_LEN;
7219
        #ifdef WOLFSSL_TLS13_DRAFT
7220
            /* The TLS draft major number. */
7221
            *(output++) = TLS_DRAFT_MAJOR;
7222
            /* Version of draft supported. */
7223
            *(output++) = TLS_DRAFT_MINOR;
7224
        #else
7225
0
            *(output++) = major;
7226
0
            *(output++) = tls13minor;
7227
0
        #endif
7228
0
        }
7229
7230
0
        if (ssl->options.downgrade) {
7231
0
        #ifndef WOLFSSL_NO_TLS12
7232
0
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls12minor)
7233
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7234
                defined(WOLFSSL_WPAS_SMALL)
7235
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
7236
            #endif
7237
0
            ) {
7238
0
                *cnt += OPAQUE16_LEN;
7239
0
                *(output++) = major;
7240
0
                *(output++) = tls12minor;
7241
0
            }
7242
0
        #endif
7243
7244
    #ifndef NO_OLD_TLS
7245
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls11minor)
7246
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7247
                defined(WOLFSSL_WPAS_SMALL)
7248
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
7249
            #endif
7250
            ) {
7251
                *cnt += OPAQUE16_LEN;
7252
                *(output++) = major;
7253
                *(output++) = tls11minor;
7254
            }
7255
        #ifdef WOLFSSL_ALLOW_TLSV10
7256
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
7257
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7258
                defined(WOLFSSL_WPAS_SMALL)
7259
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
7260
            #endif
7261
            ) {
7262
                *cnt += OPAQUE16_LEN;
7263
                *(output++) = major;
7264
                *(output++) = (byte)TLSv1_MINOR;
7265
            }
7266
        #endif
7267
    #endif
7268
0
        }
7269
7270
0
        *pSz += (word16)(OPAQUE8_LEN + *cnt);
7271
0
    }
7272
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7273
0
        output[0] = ssl->version.major;
7274
0
        output[1] = ssl->version.minor;
7275
7276
0
        *pSz += OPAQUE16_LEN;
7277
0
    }
7278
0
    else {
7279
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7280
0
        return SANITY_MSG_E;
7281
0
    }
7282
7283
0
    return 0;
7284
0
}
7285
7286
/* Parse the SupportedVersions extension.
7287
 *
7288
 * ssl     The SSL/TLS object.
7289
 * input   The buffer with the extension data.
7290
 * length  The length of the extension data.
7291
 * msgType The type of the message this extension is being parsed from.
7292
 * pv      The output ProtocolVersion for the negotiated version
7293
 * opts    The output options structure. Can be NULL.
7294
 * exts    The output extensions list. Can be NULL.
7295
 * returns 0 on success, otherwise failure.
7296
 */
7297
int TLSX_SupportedVersions_Parse(const WOLFSSL* ssl, const byte* input,
7298
        word16 length, byte msgType, ProtocolVersion* pv, Options* opts,
7299
        TLSX** exts)
7300
0
{
7301
    /* The client's greatest minor version that we support */
7302
0
    byte clientGreatestMinor = SSLv3_MINOR;
7303
0
    int ret;
7304
0
    byte major, minor;
7305
0
    byte tls13minor, tls12minor;
7306
0
    byte isDtls;
7307
7308
0
    tls13minor = TLSv1_3_MINOR;
7309
0
    tls12minor = TLSv1_2_MINOR;
7310
0
    isDtls = ssl->options.dtls == 1;
7311
7312
#ifdef WOLFSSL_DTLS13
7313
    if (ssl->options.dtls) {
7314
        tls13minor = DTLSv1_3_MINOR;
7315
        tls12minor = DTLSv1_2_MINOR;
7316
        clientGreatestMinor = DTLS_MINOR;
7317
    }
7318
#endif /* WOLFSSL_DTLS13 */
7319
7320
0
    if (msgType == client_hello) {
7321
0
        int i;
7322
0
        int len;
7323
0
        int set = 0;
7324
7325
        /* Must contain a length and at least one version. */
7326
0
        if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1
7327
0
            || length > MAX_SV_EXT_LEN) {
7328
0
            return BUFFER_ERROR;
7329
0
        }
7330
7331
0
        len = *input;
7332
7333
        /* Protocol version array must fill rest of data. */
7334
0
        if (length != (word16)OPAQUE8_LEN + len)
7335
0
            return BUFFER_ERROR;
7336
7337
0
        input++;
7338
7339
        /* Find first match. */
7340
0
        for (i = 0; i < len; i += OPAQUE16_LEN) {
7341
0
            major = input[i];
7342
0
            minor = input[i + OPAQUE8_LEN];
7343
7344
#ifdef WOLFSSL_TLS13_DRAFT
7345
            if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
7346
                major = SSLv3_MAJOR;
7347
                minor = TLSv1_3_MINOR;
7348
            }
7349
#else
7350
0
            if (major == TLS_DRAFT_MAJOR)
7351
0
                continue;
7352
0
#endif
7353
7354
0
            if (major != ssl->ctx->method->version.major)
7355
0
                continue;
7356
7357
            /* No upgrade allowed. */
7358
0
            if (versionIsGreater(isDtls, minor, ssl->version.minor))
7359
0
                continue;
7360
7361
            /* Check downgrade. */
7362
0
            if (versionIsLesser(isDtls, minor, ssl->version.minor)) {
7363
0
                if (!ssl->options.downgrade)
7364
0
                    continue;
7365
7366
0
                if (versionIsLesser(isDtls, minor, ssl->options.minDowngrade))
7367
0
                    continue;
7368
0
            }
7369
0
            if (versionIsGreater(isDtls, minor, clientGreatestMinor))
7370
0
                clientGreatestMinor = minor;
7371
7372
0
            set = 1;
7373
0
        }
7374
0
        if (!set) {
7375
            /* No common supported version was negotiated */
7376
0
            SendAlert((WOLFSSL*)ssl, alert_fatal,
7377
0
                      wolfssl_alert_protocol_version);
7378
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7379
0
            return VERSION_ERROR;
7380
0
        }
7381
0
        pv->minor = clientGreatestMinor;
7382
0
        if (versionIsAtLeast(isDtls, clientGreatestMinor, tls13minor)) {
7383
0
            if (opts != NULL)
7384
0
                opts->tls1_3 = 1;
7385
7386
            /* TLS v1.3 requires supported version extension */
7387
0
            if (exts != NULL &&
7388
0
                    TLSX_Find(*exts, TLSX_SUPPORTED_VERSIONS) == NULL) {
7389
0
                ret = TLSX_Push(exts,
7390
0
                          TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
7391
0
                if (ret != 0) {
7392
0
                    return ret;
7393
0
                }
7394
                /* *exts should be pointing to the TLSX_SUPPORTED_VERSIONS
7395
                 * ext in the list since it was pushed. */
7396
0
                (*exts)->resp = 1;
7397
0
            }
7398
0
        }
7399
7400
0
    }
7401
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7402
        /* Must contain one version. */
7403
0
        if (length != OPAQUE16_LEN)
7404
0
            return BUFFER_ERROR;
7405
7406
0
        major = input[0];
7407
0
        minor = input[OPAQUE8_LEN];
7408
7409
0
        if (major != ssl->ctx->method->version.major) {
7410
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7411
0
            return VERSION_ERROR;
7412
0
        }
7413
7414
        /* Can't downgrade with this extension below TLS v1.3. */
7415
0
        if (versionIsLesser(isDtls, minor, tls13minor)) {
7416
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7417
0
            return VERSION_ERROR;
7418
0
        }
7419
7420
        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
7421
0
        if (ssl->options.downgrade && ssl->version.minor == tls12minor) {
7422
            /* Set minor version back to TLS v1.3+ */
7423
0
            pv->minor = ssl->ctx->method->version.minor;
7424
0
        }
7425
7426
        /* No upgrade allowed. */
7427
0
        if (versionIsLesser(isDtls, ssl->version.minor, minor)) {
7428
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7429
0
            return VERSION_ERROR;
7430
0
        }
7431
7432
        /* Check downgrade. */
7433
0
        if (versionIsGreater(isDtls, ssl->version.minor, minor)) {
7434
0
            if (!ssl->options.downgrade) {
7435
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7436
0
                return VERSION_ERROR;
7437
0
            }
7438
7439
0
            if (versionIsLesser(
7440
0
                    isDtls, minor, ssl->options.minDowngrade)) {
7441
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7442
0
                return VERSION_ERROR;
7443
0
            }
7444
7445
            /* Downgrade the version. */
7446
0
            pv->minor = minor;
7447
0
        }
7448
0
    }
7449
0
    else {
7450
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7451
0
        return SANITY_MSG_E;
7452
0
    }
7453
7454
0
    return 0;
7455
0
}
7456
7457
/* Sets a new SupportedVersions extension into the extension list.
7458
 *
7459
 * extensions  The list of extensions.
7460
 * data        The extensions specific data.
7461
 * heap        The heap used for allocation.
7462
 * returns 0 on success, otherwise failure.
7463
 */
7464
static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
7465
                                     void* heap)
7466
3.85k
{
7467
3.85k
    if (extensions == NULL || data == NULL)
7468
0
        return BAD_FUNC_ARG;
7469
7470
3.85k
    return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, data, heap);
7471
3.85k
}
7472
7473
0
#define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
7474
#define SV_WRITE     TLSX_SupportedVersions_Write
7475
3.50k
#define SV_PARSE     TLSX_SupportedVersions_Parse
7476
7477
#else
7478
7479
#define SV_GET_SIZE(a, b, c) 0
7480
#define SV_WRITE(a, b, c, d) 0
7481
#define SV_PARSE(a, b, c, d, e, f, g) 0
7482
7483
#endif /* WOLFSSL_TLS13 */
7484
7485
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
7486
7487
/******************************************************************************/
7488
/* Cookie                                                                     */
7489
/******************************************************************************/
7490
7491
/* Free the cookie data.
7492
 *
7493
 * cookie  Cookie data.
7494
 * heap    The heap used for allocation.
7495
 */
7496
static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
7497
{
7498
    (void)heap;
7499
7500
    XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
7501
}
7502
7503
/* Get the size of the encoded Cookie extension.
7504
 * In messages: ClientHello and HelloRetryRequest.
7505
 *
7506
 * cookie   The cookie to write.
7507
 * msgType  The type of the message this extension is being written into.
7508
 * returns the number of bytes of the encoded Cookie extension.
7509
 */
7510
static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
7511
{
7512
    if (msgType == client_hello || msgType == hello_retry_request) {
7513
        *pSz += OPAQUE16_LEN + cookie->len;
7514
    }
7515
    else {
7516
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7517
        return SANITY_MSG_E;
7518
    }
7519
    return 0;
7520
}
7521
7522
/* Writes the Cookie extension into the output buffer.
7523
 * Assumes that the the output buffer is big enough to hold data.
7524
 * In messages: ClientHello and HelloRetryRequest.
7525
 *
7526
 * cookie   The cookie to write.
7527
 * output   The buffer to write into.
7528
 * msgType  The type of the message this extension is being written into.
7529
 * returns the number of bytes written into the buffer.
7530
 */
7531
static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType,
7532
                             word16* pSz)
7533
{
7534
    if (msgType == client_hello || msgType == hello_retry_request) {
7535
        c16toa(cookie->len, output);
7536
        output += OPAQUE16_LEN;
7537
        XMEMCPY(output, cookie->data, cookie->len);
7538
        *pSz += OPAQUE16_LEN + cookie->len;
7539
    }
7540
    else {
7541
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7542
        return SANITY_MSG_E;
7543
    }
7544
    return 0;
7545
}
7546
7547
/* Parse the Cookie extension.
7548
 * In messages: ClientHello and HelloRetryRequest.
7549
 *
7550
 * ssl      The SSL/TLS object.
7551
 * input    The extension data.
7552
 * length   The length of the extension data.
7553
 * msgType  The type of the message this extension is being parsed from.
7554
 * returns 0 on success and other values indicate failure.
7555
 */
7556
static int TLSX_Cookie_Parse(WOLFSSL* ssl, const byte* input, word16 length,
7557
                             byte msgType)
7558
{
7559
    word16  len;
7560
    word16  idx = 0;
7561
    TLSX*   extension;
7562
    Cookie* cookie;
7563
7564
    if (msgType != client_hello && msgType != hello_retry_request) {
7565
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7566
        return SANITY_MSG_E;
7567
    }
7568
7569
    /* Message contains length and Cookie which must be at least one byte
7570
     * in length.
7571
     */
7572
    if (length < OPAQUE16_LEN + 1)
7573
        return BUFFER_E;
7574
    ato16(input + idx, &len);
7575
    idx += OPAQUE16_LEN;
7576
    if (length - idx != len)
7577
        return BUFFER_E;
7578
7579
    if (msgType == hello_retry_request) {
7580
        ssl->options.hrrSentCookie = 1;
7581
        return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 1,
7582
                               &ssl->extensions);
7583
    }
7584
7585
    /* client_hello */
7586
    extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
7587
    if (extension == NULL) {
7588
#ifdef WOLFSSL_DTLS13
7589
        if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
7590
            /* Allow a cookie extension with DTLS 1.3 because it is possible
7591
             * that a different SSL instance sent the cookie but we are now
7592
             * receiving it. */
7593
            return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
7594
                                   &ssl->extensions);
7595
        else
7596
#endif
7597
        {
7598
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7599
            return HRR_COOKIE_ERROR;
7600
        }
7601
    }
7602
7603
    cookie = (Cookie*)extension->data;
7604
    if (cookie->len != len || XMEMCMP(cookie->data, input + idx, len) != 0) {
7605
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7606
        return HRR_COOKIE_ERROR;
7607
    }
7608
7609
    /* Request seen. */
7610
    extension->resp = 0;
7611
7612
    return 0;
7613
}
7614
7615
/* Use the data to create a new Cookie object in the extensions.
7616
 *
7617
 * ssl    SSL/TLS object.
7618
 * data   Cookie data.
7619
 * len    Length of cookie data in bytes.
7620
 * mac    MAC data.
7621
 * macSz  Length of MAC data in bytes.
7622
 * resp   Indicates the extension will go into a response (HelloRetryRequest).
7623
 * returns 0 on success and other values indicate failure.
7624
 */
7625
int TLSX_Cookie_Use(const WOLFSSL* ssl, const byte* data, word16 len, byte* mac,
7626
                    byte macSz, int resp, TLSX** exts)
7627
{
7628
    int     ret = 0;
7629
    TLSX*   extension;
7630
    Cookie* cookie;
7631
7632
    /* Find the cookie extension if it exists. */
7633
    extension = TLSX_Find(*exts, TLSX_COOKIE);
7634
    if (extension == NULL) {
7635
        /* Push new cookie extension. */
7636
        ret = TLSX_Push(exts, TLSX_COOKIE, NULL, ssl->heap);
7637
        if (ret != 0)
7638
            return ret;
7639
7640
        extension = TLSX_Find(*exts, TLSX_COOKIE);
7641
        if (extension == NULL)
7642
            return MEMORY_E;
7643
    }
7644
7645
    cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz, ssl->heap,
7646
                              DYNAMIC_TYPE_TLSX);
7647
    if (cookie == NULL)
7648
        return MEMORY_E;
7649
7650
    cookie->len = len + macSz;
7651
    XMEMCPY(cookie->data, data, len);
7652
    if (mac != NULL)
7653
        XMEMCPY(cookie->data + len, mac, macSz);
7654
7655
    XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
7656
7657
    extension->data = (void*)cookie;
7658
    extension->resp = (byte)resp;
7659
7660
    return 0;
7661
}
7662
7663
#define CKE_FREE_ALL  TLSX_Cookie_FreeAll
7664
#define CKE_GET_SIZE  TLSX_Cookie_GetSize
7665
#define CKE_WRITE     TLSX_Cookie_Write
7666
#define CKE_PARSE     TLSX_Cookie_Parse
7667
7668
#else
7669
7670
0
#define CKE_FREE_ALL(a, b)    WC_DO_NOTHING
7671
0
#define CKE_GET_SIZE(a, b, c) 0
7672
#define CKE_WRITE(a, b, c, d) 0
7673
0
#define CKE_PARSE(a, b, c, d) 0
7674
7675
#endif
7676
7677
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && \
7678
    !defined(WOLFSSL_NO_CA_NAMES) && defined(OPENSSL_EXTRA)
7679
/* Currently only settable through compatibility API */
7680
/******************************************************************************/
7681
/* Certificate Authorities                                                       */
7682
/******************************************************************************/
7683
7684
static word16 TLSX_CA_Names_GetSize(void* data)
7685
{
7686
    WOLFSSL* ssl = (WOLFSSL*)data;
7687
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7688
    word32 size = 0;
7689
7690
    /* Length of names */
7691
    size += OPAQUE16_LEN;
7692
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL; names = names->next) {
7693
        byte seq[MAX_SEQ_SZ];
7694
        WOLFSSL_X509_NAME* name = names->data.name;
7695
7696
        if (name != NULL) {
7697
            /* 16-bit length | SEQ | Len | DER of name */
7698
            size += (word32)(OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
7699
                             name->rawLen);
7700
            if (size > WOLFSSL_MAX_16BIT) {
7701
                return 0;
7702
            }
7703
        }
7704
    }
7705
    return (word16)size;
7706
}
7707
7708
static word16 TLSX_CA_Names_Write(void* data, byte* output)
7709
{
7710
    WOLFSSL* ssl = (WOLFSSL*)data;
7711
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7712
    byte* len;
7713
7714
    /* Reserve space for the length value */
7715
    len = output;
7716
    output += OPAQUE16_LEN;
7717
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL; names = names->next) {
7718
        byte seq[MAX_SEQ_SZ];
7719
        WOLFSSL_X509_NAME* name = names->data.name;
7720
7721
        if (name != NULL) {
7722
            c16toa((word16)name->rawLen +
7723
                   (word16)SetSequence(name->rawLen, seq), output);
7724
            output += OPAQUE16_LEN;
7725
            output += SetSequence(name->rawLen, output);
7726
            XMEMCPY(output, name->raw, name->rawLen);
7727
            output += name->rawLen;
7728
        }
7729
    }
7730
    /* Write the total length */
7731
    c16toa((word16)(output - len - OPAQUE16_LEN), len);
7732
    return (word16)(output - len);
7733
}
7734
7735
static int TLSX_CA_Names_Parse(WOLFSSL *ssl, const byte* input,
7736
                                  word16 length, byte isRequest)
7737
{
7738
    word16 extLen;
7739
7740
    (void)isRequest;
7741
7742
    wolfSSL_sk_X509_NAME_pop_free(ssl->peer_ca_names, NULL);
7743
    ssl->peer_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
7744
    if (ssl->peer_ca_names == NULL)
7745
        return MEMORY_ERROR;
7746
7747
    if (length < OPAQUE16_LEN)
7748
        return BUFFER_ERROR;
7749
7750
    ato16(input, &extLen);
7751
    input += OPAQUE16_LEN;
7752
    length -= OPAQUE16_LEN;
7753
    if (extLen != length)
7754
        return BUFFER_ERROR;
7755
7756
    while (length) {
7757
        word16 idx = 0;
7758
        WOLFSSL_X509_NAME* name = NULL;
7759
        int ret = 0;
7760
        int didInit = FALSE;
7761
        /* Use a DecodedCert struct to get access to GetName to
7762
         * parse DN name */
7763
#ifdef WOLFSSL_SMALL_STACK
7764
        DecodedCert *cert = (DecodedCert *)XMALLOC(
7765
            sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
7766
        if (cert == NULL)
7767
            return MEMORY_ERROR;
7768
#else
7769
        DecodedCert cert[1];
7770
#endif
7771
7772
        if (length < OPAQUE16_LEN) {
7773
            ret = BUFFER_ERROR;
7774
        }
7775
7776
        if (ret == 0) {
7777
            ato16(input, &extLen);
7778
            idx += OPAQUE16_LEN;
7779
7780
            if (extLen > length - idx)
7781
                ret = BUFFER_ERROR;
7782
        }
7783
7784
        if (ret == 0) {
7785
            InitDecodedCert(cert, input + idx, extLen, ssl->heap);
7786
            didInit = TRUE;
7787
            idx += extLen;
7788
            ret = GetName(cert, ASN_SUBJECT, extLen);
7789
        }
7790
7791
        if (ret == 0 && (name = wolfSSL_X509_NAME_new()) == NULL)
7792
            ret = MEMORY_ERROR;
7793
7794
        if (ret == 0) {
7795
            CopyDecodedName(name, cert, ASN_SUBJECT);
7796
            if (wolfSSL_sk_X509_NAME_push(ssl->peer_ca_names, name) <= 0) {
7797
                wolfSSL_X509_NAME_free(name);
7798
                ret = MEMORY_ERROR;
7799
            }
7800
        }
7801
7802
        if (didInit)
7803
            FreeDecodedCert(cert);
7804
7805
        WC_FREE_VAR_EX(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
7806
        if (ret != 0)
7807
            return ret;
7808
7809
        input += idx;
7810
        length -= idx;
7811
    }
7812
    return 0;
7813
}
7814
7815
#define CAN_GET_SIZE(data)      TLSX_CA_Names_GetSize(data)
7816
#define CAN_WRITE(data, output) TLSX_CA_Names_Write(data, output)
7817
#define CAN_PARSE(ssl, input, length, isRequest) \
7818
                                TLSX_CA_Names_Parse(ssl, input, length, isRequest)
7819
7820
#else
7821
7822
#define CAN_GET_SIZE(data)                       0
7823
#define CAN_WRITE(data, output)                  0
7824
#define CAN_PARSE(ssl, input, length, isRequest) 0
7825
7826
#endif
7827
7828
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
7829
/******************************************************************************/
7830
/* Signature Algorithms                                                       */
7831
/******************************************************************************/
7832
7833
/* Return the size of the SignatureAlgorithms extension's data.
7834
 *
7835
 * data  Unused
7836
 * returns the length of data that will be in the extension.
7837
 */
7838
7839
static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
7840
20.4k
{
7841
20.4k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7842
7843
20.4k
    if (sa->hashSigAlgoSz == 0)
7844
20.4k
        return OPAQUE16_LEN + WOLFSSL_SUITES(sa->ssl)->hashSigAlgoSz;
7845
0
    else
7846
0
        return OPAQUE16_LEN + sa->hashSigAlgoSz;
7847
20.4k
}
7848
7849
/* Creates a bit string of supported hash algorithms with RSA PSS.
7850
 * The bit string is used when determining which signature algorithm to use
7851
 * when creating the CertificateVerify message.
7852
 * Note: Valid data has an even length as each signature algorithm is two bytes.
7853
 *
7854
 * ssl     The SSL/TLS object.
7855
 * input   The buffer with the list of supported signature algorithms.
7856
 * length  The length of the list in bytes.
7857
 * returns 0 on success, BUFFER_ERROR when the length is not even.
7858
 */
7859
static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, const byte* input,
7860
                                           word16 length)
7861
21.9k
{
7862
21.9k
    word16 i;
7863
7864
21.9k
    if ((length & 1) == 1)
7865
0
        return BUFFER_ERROR;
7866
7867
21.9k
    ssl->pssAlgo = 0;
7868
438k
    for (i = 0; i < length; i += 2) {
7869
416k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
7870
58.7k
            ssl->pssAlgo |= 1 << input[i + 1];
7871
416k
    #ifdef WOLFSSL_TLS13
7872
416k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
7873
112k
                                                   input[i + 1] <= pss_sha512) {
7874
55.2k
            ssl->pssAlgo |= 1 << input[i + 1];
7875
55.2k
        }
7876
416k
    #endif
7877
416k
    }
7878
7879
21.9k
    return 0;
7880
21.9k
}
7881
7882
/* Writes the SignatureAlgorithms extension into the buffer.
7883
 *
7884
 * data    Unused
7885
 * output  The buffer to write the extension into.
7886
 * returns the length of data that was written.
7887
 */
7888
static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
7889
18.3k
{
7890
18.3k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7891
18.3k
    const Suites* suites = WOLFSSL_SUITES(sa->ssl);
7892
18.3k
    word16 hashSigAlgoSz;
7893
7894
18.3k
    if (sa->hashSigAlgoSz == 0) {
7895
18.3k
        c16toa(suites->hashSigAlgoSz, output);
7896
18.3k
        XMEMCPY(output + OPAQUE16_LEN, suites->hashSigAlgo,
7897
18.3k
                suites->hashSigAlgoSz);
7898
18.3k
        hashSigAlgoSz = suites->hashSigAlgoSz;
7899
18.3k
    }
7900
0
    else {
7901
0
        c16toa(sa->hashSigAlgoSz, output);
7902
0
        XMEMCPY(output + OPAQUE16_LEN, sa->hashSigAlgo,
7903
0
                sa->hashSigAlgoSz);
7904
0
        hashSigAlgoSz = sa->hashSigAlgoSz;
7905
0
    }
7906
7907
18.3k
#ifndef NO_RSA
7908
18.3k
    TLSX_SignatureAlgorithms_MapPss(sa->ssl, output + OPAQUE16_LEN,
7909
18.3k
            hashSigAlgoSz);
7910
18.3k
#endif
7911
7912
18.3k
    return OPAQUE16_LEN + hashSigAlgoSz;
7913
18.3k
}
7914
7915
/* Parse the SignatureAlgorithms extension.
7916
 *
7917
 * ssl     The SSL/TLS object.
7918
 * input   The buffer with the extension data.
7919
 * length  The length of the extension data.
7920
 * returns 0 on success, otherwise failure.
7921
 */
7922
static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, const byte* input,
7923
                                  word16 length, byte isRequest, Suites* suites)
7924
3.72k
{
7925
3.72k
    word16 len;
7926
7927
3.72k
    if (!isRequest)
7928
0
        return BUFFER_ERROR;
7929
7930
    /* Must contain a length and at least algorithm. */
7931
3.72k
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7932
43
        return BUFFER_ERROR;
7933
7934
3.67k
    ato16(input, &len);
7935
3.67k
    input += OPAQUE16_LEN;
7936
7937
    /* Algorithm array must fill rest of data. */
7938
3.67k
    if (length != OPAQUE16_LEN + len)
7939
68
        return BUFFER_ERROR;
7940
7941
    /* Truncate hashSigAlgo list if too long. */
7942
3.60k
    suites->hashSigAlgoSz = len;
7943
    /* Sig Algo list size must be even. */
7944
3.60k
    if (suites->hashSigAlgoSz % 2 != 0)
7945
0
        return BUFFER_ERROR;
7946
3.60k
    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7947
17
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7948
17
        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7949
17
    }
7950
3.60k
    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
7951
7952
3.60k
    return TLSX_SignatureAlgorithms_MapPss(ssl, input, suites->hashSigAlgoSz);
7953
3.60k
}
7954
7955
/* Sets a new SignatureAlgorithms extension into the extension list.
7956
 *
7957
 * extensions  The list of extensions.
7958
 * data        The extensions specific data.
7959
 * heap        The heap used for allocation.
7960
 * returns 0 on success, otherwise failure.
7961
 */
7962
static int TLSX_SetSignatureAlgorithms(TLSX** extensions, WOLFSSL* ssl,
7963
                                       void* heap)
7964
31.8k
{
7965
31.8k
    SignatureAlgorithms* sa;
7966
31.8k
    int ret;
7967
7968
31.8k
    if (extensions == NULL)
7969
0
        return BAD_FUNC_ARG;
7970
7971
    /* Already present */
7972
31.8k
    if (TLSX_Find(*extensions, TLSX_SIGNATURE_ALGORITHMS) != NULL)
7973
60
        return 0;
7974
7975
31.8k
    sa = TLSX_SignatureAlgorithms_New(ssl, 0, heap);
7976
31.8k
    if (sa == NULL)
7977
54
        return MEMORY_ERROR;
7978
7979
31.7k
    ret = TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, sa, heap);
7980
31.7k
    if (ret != 0)
7981
189
        TLSX_SignatureAlgorithms_FreeAll(sa, heap);
7982
31.7k
    return ret;
7983
31.8k
}
7984
7985
SignatureAlgorithms* TLSX_SignatureAlgorithms_New(WOLFSSL* ssl,
7986
        word16 hashSigAlgoSz, void* heap)
7987
31.8k
{
7988
31.8k
    SignatureAlgorithms* sa;
7989
31.8k
    (void)heap;
7990
7991
31.8k
    sa = (SignatureAlgorithms*)XMALLOC(sizeof(*sa) + hashSigAlgoSz, heap,
7992
31.8k
                                       DYNAMIC_TYPE_TLSX);
7993
31.8k
    if (sa != NULL) {
7994
31.7k
        XMEMSET(sa, 0, sizeof(*sa) + hashSigAlgoSz);
7995
31.7k
        sa->ssl = ssl;
7996
31.7k
        sa->hashSigAlgoSz = hashSigAlgoSz;
7997
31.7k
    }
7998
31.8k
    return sa;
7999
31.8k
}
8000
8001
void TLSX_SignatureAlgorithms_FreeAll(SignatureAlgorithms* sa,
8002
                                             void* heap)
8003
31.7k
{
8004
31.7k
    XFREE(sa, heap, DYNAMIC_TYPE_TLSX);
8005
31.7k
    (void)heap;
8006
31.7k
}
8007
8008
0
#define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
8009
#define SA_WRITE     TLSX_SignatureAlgorithms_Write
8010
0
#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
8011
0
#define SA_FREE_ALL  TLSX_SignatureAlgorithms_FreeAll
8012
#endif
8013
/******************************************************************************/
8014
/* Signature Algorithms Certificate                                           */
8015
/******************************************************************************/
8016
8017
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
8018
/* Return the size of the SignatureAlgorithms extension's data.
8019
 *
8020
 * data  Unused
8021
 * returns the length of data that will be in the extension.
8022
 */
8023
static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
8024
0
{
8025
0
    WOLFSSL* ssl = (WOLFSSL*)data;
8026
8027
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
8028
0
}
8029
8030
/* Writes the SignatureAlgorithmsCert extension into the buffer.
8031
 *
8032
 * data    Unused
8033
 * output  The buffer to write the extension into.
8034
 * returns the length of data that was written.
8035
 */
8036
static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
8037
0
{
8038
0
    WOLFSSL* ssl = (WOLFSSL*)data;
8039
8040
0
    c16toa(ssl->certHashSigAlgoSz, output);
8041
0
    XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
8042
0
            ssl->certHashSigAlgoSz);
8043
8044
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
8045
0
}
8046
8047
/* Parse the SignatureAlgorithmsCert extension.
8048
 *
8049
 * ssl     The SSL/TLS object.
8050
 * input   The buffer with the extension data.
8051
 * length  The length of the extension data.
8052
 * returns 0 on success, otherwise failure.
8053
 */
8054
static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, const byte* input,
8055
                                              word16 length, byte isRequest)
8056
83
{
8057
83
    word16 len;
8058
8059
83
    if (!isRequest)
8060
0
        return BUFFER_ERROR;
8061
8062
    /* Must contain a length and at least algorithm. */
8063
83
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
8064
10
        return BUFFER_ERROR;
8065
8066
73
    ato16(input, &len);
8067
73
    input += OPAQUE16_LEN;
8068
8069
    /* Algorithm array must fill rest of data. */
8070
73
    if (length != OPAQUE16_LEN + len)
8071
42
        return BUFFER_ERROR;
8072
8073
    /* truncate hashSigAlgo list if too long */
8074
31
    ssl->certHashSigAlgoSz = len;
8075
31
    if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
8076
2
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
8077
2
        ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
8078
2
    }
8079
31
    XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
8080
8081
31
    return 0;
8082
73
}
8083
8084
/* Sets a new SignatureAlgorithmsCert extension into the extension list.
8085
 *
8086
 * extensions  The list of extensions.
8087
 * data        The extensions specific data.
8088
 * heap        The heap used for allocation.
8089
 * returns 0 on success, otherwise failure.
8090
 */
8091
static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions,
8092
        const WOLFSSL* data, void* heap)
8093
0
{
8094
0
    if (extensions == NULL)
8095
0
        return BAD_FUNC_ARG;
8096
8097
0
    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, data, heap);
8098
0
}
8099
8100
0
#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
8101
#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
8102
0
#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
8103
#endif /* WOLFSSL_TLS13 */
8104
8105
8106
/******************************************************************************/
8107
/* Key Share                                                                  */
8108
/******************************************************************************/
8109
8110
#ifndef MAX_KEYSHARE_NAMED_GROUPS
8111
    #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
8112
        !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
8113
2.21k
        #define MAX_KEYSHARE_NAMED_GROUPS    24
8114
    #else
8115
        #define MAX_KEYSHARE_NAMED_GROUPS    12
8116
    #endif
8117
#endif
8118
8119
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
8120
/* Create a key share entry using named Diffie-Hellman parameters group.
8121
 * Generates a key pair.
8122
 *
8123
 * ssl   The SSL/TLS object.
8124
 * kse   The key share entry object.
8125
 * returns 0 on success, otherwise failure.
8126
 */
8127
static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
8128
320
{
8129
320
    int ret = 0;
8130
320
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
8131
320
    word32 pSz = 0, pvtSz = 0;
8132
320
    DhKey* dhKey = (DhKey*)kse->key;
8133
8134
    /* Pick the parameters from the named group. */
8135
320
#ifdef HAVE_PUBLIC_FFDHE
8136
320
    const DhParams* params = NULL;
8137
320
    switch (kse->group) {
8138
0
    #ifdef HAVE_FFDHE_2048
8139
320
        case WOLFSSL_FFDHE_2048:
8140
320
            params = wc_Dh_ffdhe2048_Get();
8141
320
            pvtSz = 29;
8142
320
            break;
8143
0
    #endif
8144
    #ifdef HAVE_FFDHE_3072
8145
        case WOLFSSL_FFDHE_3072:
8146
            params = wc_Dh_ffdhe3072_Get();
8147
            pvtSz = 34;
8148
            break;
8149
    #endif
8150
    #ifdef HAVE_FFDHE_4096
8151
        case WOLFSSL_FFDHE_4096:
8152
            params = wc_Dh_ffdhe4096_Get();
8153
            pvtSz = 39;
8154
            break;
8155
    #endif
8156
    #ifdef HAVE_FFDHE_6144
8157
        case WOLFSSL_FFDHE_6144:
8158
            params = wc_Dh_ffdhe6144_Get();
8159
            pvtSz = 46;
8160
            break;
8161
    #endif
8162
    #ifdef HAVE_FFDHE_8192
8163
        case WOLFSSL_FFDHE_8192:
8164
            params = wc_Dh_ffdhe8192_Get();
8165
            pvtSz = 52;
8166
            break;
8167
    #endif
8168
0
        default:
8169
0
            break;
8170
320
    }
8171
320
    if (params == NULL)
8172
0
        return BAD_FUNC_ARG;
8173
320
    pSz = params->p_len;
8174
#else
8175
    pvtSz = wc_DhGetNamedKeyMinSize(kse->group);
8176
    if (pvtSz == 0) {
8177
        return BAD_FUNC_ARG;
8178
    }
8179
    ret = wc_DhGetNamedKeyParamSize(kse->group, &pSz, NULL, NULL);
8180
    if (ret != 0) {
8181
        return BAD_FUNC_ARG;
8182
    }
8183
#endif
8184
8185
    /* Trigger Key Generation */
8186
320
    if (kse->pubKey == NULL || kse->privKey == NULL) {
8187
298
        if (kse->key == NULL) {
8188
298
            kse->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
8189
298
                DYNAMIC_TYPE_DH);
8190
298
            if (kse->key == NULL)
8191
2
                return MEMORY_E;
8192
8193
            /* Setup Key */
8194
296
            ret = wc_InitDhKey_ex((DhKey*)kse->key, ssl->heap, ssl->devId);
8195
296
            if (ret == 0) {
8196
296
                dhKey = (DhKey*)kse->key;
8197
296
            #ifdef HAVE_PUBLIC_FFDHE
8198
296
                ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
8199
296
                                                                 params->g_len);
8200
            #else
8201
                ret = wc_DhSetNamedKey(dhKey, kse->group);
8202
            #endif
8203
296
            }
8204
        #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8205
            defined(WC_ASYNC_ENABLE_DH)
8206
            /* Only set non-blocking context when async device is active. With
8207
             * INVALID_DEVID there is no async loop to retry on MP_WOULDBLOCK, so
8208
             * skip non-blocking setup and use blocking mode instead. */
8209
            if (ret == 0 && ssl->devId != INVALID_DEVID) {
8210
                DhNb* dhNb = (DhNb*)XMALLOC(sizeof(DhNb), ssl->heap,
8211
                                            DYNAMIC_TYPE_TMP_BUFFER);
8212
                if (dhNb == NULL) {
8213
                    ret = MEMORY_E;
8214
                }
8215
                else {
8216
                    ret = wc_DhSetNonBlock((DhKey*)kse->key, dhNb);
8217
                    if (ret != 0) {
8218
                        XFREE(dhNb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8219
                    }
8220
                }
8221
            }
8222
        #endif /* WC_DH_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8223
                  WC_ASYNC_ENABLE_DH */
8224
296
        }
8225
8226
        /* Allocate space for the private and public key */
8227
296
        if (ret == 0 && kse->pubKey == NULL) {
8228
296
            kse->pubKey = (byte*)XMALLOC(pSz, ssl->heap,
8229
296
                DYNAMIC_TYPE_PUBLIC_KEY);
8230
296
            if (kse->pubKey == NULL)
8231
2
                ret = MEMORY_E;
8232
296
        }
8233
8234
296
        if (ret == 0 && kse->privKey == NULL) {
8235
294
            kse->privKey = (byte*)XMALLOC(pvtSz, ssl->heap,
8236
294
                DYNAMIC_TYPE_PRIVATE_KEY);
8237
294
            if (kse->privKey == NULL)
8238
2
                ret = MEMORY_E;
8239
294
        }
8240
8241
296
        if (ret == 0) {
8242
        #if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
8243
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_DH, kse->key);
8244
            kse->pubKeyLen = pSz;
8245
            kse->keyLen = pvtSz;
8246
            if (ret == 0) {
8247
                ret = wc_DhExportKeyPair(dhKey,
8248
                    (byte*)kse->privKey, &kse->keyLen, /* private */
8249
                    kse->pubKey, &kse->pubKeyLen /* public */
8250
                );
8251
            }
8252
            else
8253
        #endif
8254
292
            {
8255
                /* Generate a new key pair */
8256
                /* For async this is called once and when event is done, the
8257
                 *   provided buffers will be populated.
8258
                 * Final processing is zero pad below. */
8259
292
                kse->pubKeyLen = pSz;
8260
292
                kse->keyLen = pvtSz;
8261
292
                ret = DhGenKeyPair(ssl, dhKey,
8262
292
                    (byte*)kse->privKey, &kse->keyLen, /* private */
8263
292
                    kse->pubKey, &kse->pubKeyLen /* public */
8264
292
                );
8265
            #ifdef WOLFSSL_ASYNC_CRYPT
8266
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8267
                    return ret;
8268
                }
8269
            #endif
8270
292
            }
8271
292
        }
8272
296
    }
8273
8274
318
    if (ret == 0) {
8275
163
        if (pSz != kse->pubKeyLen) {
8276
            /* Zero pad the front of the public key to match prime "p" size */
8277
0
            XMEMMOVE(kse->pubKey + pSz - kse->pubKeyLen, kse->pubKey,
8278
0
                kse->pubKeyLen);
8279
0
            XMEMSET(kse->pubKey, 0, pSz - kse->pubKeyLen);
8280
0
            kse->pubKeyLen = pSz;
8281
0
        }
8282
8283
163
        if (pvtSz != kse->keyLen) {
8284
            /* Zero pad the front of the private key */
8285
0
            XMEMMOVE(kse->privKey + pvtSz - kse->keyLen, kse->privKey,
8286
0
                kse->keyLen);
8287
0
            XMEMSET(kse->privKey, 0, pvtSz - kse->keyLen);
8288
0
            kse->keyLen = pvtSz;
8289
0
        }
8290
8291
    #ifdef WOLFSSL_DEBUG_TLS
8292
        WOLFSSL_MSG("Public DH Key");
8293
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8294
    #endif
8295
163
    }
8296
8297
    /* Always release the DH key to free up memory.
8298
     * The DhKey will be setup again in TLSX_KeyShare_ProcessDh */
8299
318
    if (dhKey != NULL) {
8300
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8301
        defined(WC_ASYNC_ENABLE_DH)
8302
        if (dhKey->nb != NULL) {
8303
            XFREE(dhKey->nb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8304
            dhKey->nb = NULL;
8305
        }
8306
    #endif
8307
296
        wc_FreeDhKey(dhKey);
8308
296
    }
8309
318
    XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
8310
318
    kse->key = NULL;
8311
8312
318
    if (ret != 0) {
8313
        /* Cleanup on error, otherwise data owned by key share entry */
8314
155
        if (kse->privKey) {
8315
151
            ForceZero(kse->privKey, pvtSz);
8316
151
            XFREE(kse->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8317
151
            kse->privKey = NULL;
8318
151
        }
8319
155
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8320
155
        kse->pubKey = NULL;
8321
155
    }
8322
#else
8323
    (void)ssl;
8324
    (void)kse;
8325
8326
    ret = NOT_COMPILED_IN;
8327
    WOLFSSL_ERROR_VERBOSE(ret);
8328
#endif
8329
8330
318
    return ret;
8331
320
}
8332
8333
/* Create a key share entry using X25519 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_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
8341
4.34k
{
8342
4.34k
    int ret = 0;
8343
4.34k
#ifdef HAVE_CURVE25519
8344
4.34k
    curve25519_key* key = (curve25519_key*)kse->key;
8345
8346
4.34k
    if (kse->key == NULL) {
8347
        /* Allocate a Curve25519 key to hold private key. */
8348
4.34k
        kse->key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
8349
4.34k
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8350
4.34k
        if (kse->key == NULL) {
8351
4
            WOLFSSL_MSG("GenX25519Key memory error");
8352
4
            return MEMORY_E;
8353
4
        }
8354
8355
        /* Make an Curve25519 key. */
8356
4.33k
        ret = wc_curve25519_init_ex((curve25519_key*)kse->key, ssl->heap,
8357
4.33k
            ssl->devId);
8358
4.33k
        if (ret == 0) {
8359
            /* setting "key" means okay to call wc_curve25519_free */
8360
4.33k
            key = (curve25519_key*)kse->key;
8361
4.33k
            kse->keyLen = CURVE25519_KEYSIZE;
8362
4.33k
        }
8363
    #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8364
        defined(WC_ASYNC_ENABLE_X25519)
8365
        /* Only set non-blocking context when async device is active. With
8366
         * INVALID_DEVID there is no async loop to retry on FP_WOULDBLOCK, so
8367
         * skip non-blocking setup and use blocking mode instead. */
8368
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
8369
            x25519_nb_ctx_t* nb_ctx = (x25519_nb_ctx_t*)XMALLOC(
8370
                sizeof(x25519_nb_ctx_t), ssl->heap,
8371
                DYNAMIC_TYPE_TMP_BUFFER);
8372
            if (nb_ctx == NULL) {
8373
                ret = MEMORY_E;
8374
            }
8375
            else {
8376
                ret = wc_curve25519_set_nonblock(key, nb_ctx);
8377
                if (ret != 0) {
8378
                    XFREE(nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8379
                }
8380
            }
8381
        }
8382
    #endif /* WC_X25519_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8383
              WC_ASYNC_ENABLE_X25519 */
8384
4.33k
        if (ret == 0) {
8385
        #ifdef WOLFSSL_STATIC_EPHEMERAL
8386
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE25519, kse->key);
8387
            if (ret != 0) /* on failure, fallback to local key generation */
8388
        #endif
8389
4.33k
            {
8390
            #ifdef WOLFSSL_ASYNC_CRYPT
8391
                /* initialize event */
8392
                ret = wolfSSL_AsyncInit(ssl, &key->asyncDev,
8393
                    WC_ASYNC_FLAG_NONE);
8394
                if (ret != 0)
8395
                    return ret;
8396
            #endif
8397
4.33k
                ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
8398
8399
                /* Handle async pending response */
8400
            #ifdef WOLFSSL_ASYNC_CRYPT
8401
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8402
                    return wolfSSL_AsyncPush(ssl, &key->asyncDev);
8403
                }
8404
            #endif /* WOLFSSL_ASYNC_CRYPT */
8405
4.33k
            }
8406
4.33k
        }
8407
4.33k
    }
8408
8409
4.33k
    if (ret == 0 && kse->pubKey == NULL) {
8410
        /* Allocate space for the public key. */
8411
4.30k
        kse->pubKey = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
8412
4.30k
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8413
4.30k
        if (kse->pubKey == NULL) {
8414
10
            WOLFSSL_MSG("GenX25519Key pub memory error");
8415
10
            ret = MEMORY_E;
8416
10
        }
8417
4.30k
    }
8418
8419
4.33k
    if (ret == 0) {
8420
        /* Export Curve25519 public key. */
8421
4.29k
        kse->pubKeyLen = CURVE25519_KEYSIZE;
8422
4.29k
        if (wc_curve25519_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8423
4.29k
                                                  EC25519_LITTLE_ENDIAN) != 0) {
8424
0
            ret = ECC_EXPORT_ERROR;
8425
0
            WOLFSSL_ERROR_VERBOSE(ret);
8426
0
        }
8427
4.29k
        kse->pubKeyLen = CURVE25519_KEYSIZE; /* always CURVE25519_KEYSIZE */
8428
4.29k
    }
8429
8430
#ifdef WOLFSSL_DEBUG_TLS
8431
    if (ret == 0) {
8432
        WOLFSSL_MSG("Public Curve25519 Key");
8433
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8434
    }
8435
#endif
8436
8437
4.33k
    if (ret != 0) {
8438
        /* Data owned by key share entry otherwise. */
8439
38
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8440
38
        kse->pubKey = NULL;
8441
38
        if (key != NULL) {
8442
        #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
8443
            if (key->nb_ctx != NULL) {
8444
                XFREE(key->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8445
            }
8446
        #endif
8447
38
            wc_curve25519_free(key);
8448
38
        }
8449
38
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8450
38
        kse->key = NULL;
8451
38
    }
8452
#else
8453
    (void)ssl;
8454
    (void)kse;
8455
8456
    ret = NOT_COMPILED_IN;
8457
    WOLFSSL_ERROR_VERBOSE(ret);
8458
#endif /* HAVE_CURVE25519 */
8459
8460
4.33k
    return ret;
8461
4.34k
}
8462
8463
/* Create a key share entry using X448 parameters group.
8464
 * Generates a key pair.
8465
 *
8466
 * ssl   The SSL/TLS object.
8467
 * kse   The key share entry object.
8468
 * returns 0 on success, otherwise failure.
8469
 */
8470
static int TLSX_KeyShare_GenX448Key(WOLFSSL *ssl, KeyShareEntry* kse)
8471
25
{
8472
25
    int ret = 0;
8473
25
#ifdef HAVE_CURVE448
8474
25
    curve448_key* key = (curve448_key*)kse->key;
8475
8476
25
    if (kse->key == NULL) {
8477
        /* Allocate a Curve448 key to hold private key. */
8478
24
        kse->key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
8479
24
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8480
24
        if (kse->key == NULL) {
8481
2
            WOLFSSL_MSG("GenX448Key memory error");
8482
2
            return MEMORY_E;
8483
2
        }
8484
8485
        /* Make an Curve448 key. */
8486
22
        ret = wc_curve448_init((curve448_key*)kse->key);
8487
22
        if (ret == 0) {
8488
22
            key = (curve448_key*)kse->key;
8489
22
            kse->keyLen = CURVE448_KEY_SIZE;
8490
8491
            #ifdef WOLFSSL_STATIC_EPHEMERAL
8492
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE448, kse->key);
8493
            if (ret != 0)
8494
        #endif
8495
22
            {
8496
22
                ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
8497
22
            }
8498
22
        }
8499
22
    }
8500
8501
23
    if (ret == 0 && kse->pubKey == NULL) {
8502
        /* Allocate space for the public key. */
8503
20
        kse->pubKey = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
8504
20
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8505
20
        if (kse->pubKey == NULL) {
8506
2
            WOLFSSL_MSG("GenX448Key pub memory error");
8507
2
            ret = MEMORY_E;
8508
2
        }
8509
20
    }
8510
8511
23
    if (ret == 0) {
8512
        /* Export Curve448 public key. */
8513
19
        kse->pubKeyLen = CURVE448_KEY_SIZE;
8514
19
        if (wc_curve448_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8515
19
                                                    EC448_LITTLE_ENDIAN) != 0) {
8516
0
            ret = ECC_EXPORT_ERROR;
8517
0
        }
8518
19
        kse->pubKeyLen = CURVE448_KEY_SIZE; /* always CURVE448_KEY_SIZE */
8519
19
    }
8520
8521
#ifdef WOLFSSL_DEBUG_TLS
8522
    if (ret == 0) {
8523
        WOLFSSL_MSG("Public Curve448 Key");
8524
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8525
    }
8526
#endif
8527
8528
23
    if (ret != 0) {
8529
        /* Data owned by key share entry otherwise. */
8530
4
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8531
4
        kse->pubKey = NULL;
8532
4
        if (key != NULL)
8533
4
            wc_curve448_free(key);
8534
4
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8535
4
        kse->key = NULL;
8536
4
    }
8537
#else
8538
    (void)ssl;
8539
    (void)kse;
8540
8541
    ret = NOT_COMPILED_IN;
8542
    WOLFSSL_ERROR_VERBOSE(ret);
8543
#endif /* HAVE_CURVE448 */
8544
8545
23
    return ret;
8546
25
}
8547
8548
/* Create a key share entry using named elliptic curve parameters group.
8549
 * Generates a key pair.
8550
 *
8551
 * ssl   The SSL/TLS object.
8552
 * kse   The key share entry object.
8553
 * returns 0 on success, otherwise failure.
8554
 */
8555
static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
8556
0
{
8557
0
    int ret = 0;
8558
0
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
8559
0
    word32 keySize = 0;
8560
0
    word16 curveId = (word16) ECC_CURVE_INVALID;
8561
0
    ecc_key* eccKey = (ecc_key*)kse->key;
8562
8563
    /* Translate named group to a curve id. */
8564
0
    switch (kse->group) {
8565
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
8566
0
        #ifndef NO_ECC_SECP
8567
0
        case WOLFSSL_ECC_SECP256R1:
8568
0
            curveId = ECC_SECP256R1;
8569
0
            break;
8570
0
        #endif /* !NO_ECC_SECP */
8571
0
        #ifdef WOLFSSL_SM2
8572
0
        case WOLFSSL_ECC_SM2P256V1:
8573
0
            curveId = ECC_SM2P256V1;
8574
0
            break;
8575
0
        #endif /* !WOLFSSL_SM2 */
8576
0
        #ifdef HAVE_ECC_BRAINPOOL
8577
0
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
8578
0
            curveId = ECC_BRAINPOOLP256R1;
8579
0
            break;
8580
0
        #endif /* HAVE_ECC_BRAINPOOL */
8581
0
    #endif
8582
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
8583
0
        #ifndef NO_ECC_SECP
8584
0
        case WOLFSSL_ECC_SECP384R1:
8585
0
            curveId = ECC_SECP384R1;
8586
0
            break;
8587
0
        #endif /* !NO_ECC_SECP */
8588
0
        #ifdef HAVE_ECC_BRAINPOOL
8589
0
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
8590
0
            curveId = ECC_BRAINPOOLP384R1;
8591
0
            break;
8592
0
        #endif /* HAVE_ECC_BRAINPOOL */
8593
0
    #endif
8594
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
8595
0
        #ifdef HAVE_ECC_BRAINPOOL
8596
0
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
8597
0
            curveId = ECC_BRAINPOOLP512R1;
8598
0
            break;
8599
0
        #endif /* HAVE_ECC_BRAINPOOL */
8600
0
    #endif
8601
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
8602
0
        #ifndef NO_ECC_SECP
8603
0
        case WOLFSSL_ECC_SECP521R1:
8604
0
            curveId = ECC_SECP521R1;
8605
0
            break;
8606
0
        #endif /* !NO_ECC_SECP */
8607
0
    #endif
8608
0
        default:
8609
0
            WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
8610
0
            return BAD_FUNC_ARG;
8611
0
    }
8612
8613
0
    {
8614
0
        int size = wc_ecc_get_curve_size_from_id(curveId);
8615
0
        if (size < 0) {
8616
0
            WOLFSSL_ERROR_VERBOSE(size);
8617
0
            return size;
8618
0
        }
8619
0
        keySize = (word32)size;
8620
0
    }
8621
8622
0
    if (kse->key == NULL) {
8623
        /* Allocate an ECC key to hold private key. */
8624
0
        kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC);
8625
0
        if (kse->key == NULL) {
8626
0
            WOLFSSL_MSG_EX("Failed to allocate %d bytes, ssl->heap: %p",
8627
0
                           (int)sizeof(ecc_key), (wc_ptr_t)ssl->heap);
8628
0
            WOLFSSL_MSG("EccTempKey Memory error!");
8629
0
            return MEMORY_E;
8630
0
        }
8631
8632
        /* Initialize an ECC key struct for the ephemeral key */
8633
0
        ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
8634
8635
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8636
        defined(WC_ASYNC_ENABLE_ECC)
8637
        /* Only set non-blocking context when async device is active. With
8638
         * INVALID_DEVID there is no async loop to retry on FP_WOULDBLOCK, so
8639
         * skip non-blocking setup and use blocking mode instead. */
8640
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
8641
            ecc_nb_ctx_t* eccNbCtx = (ecc_nb_ctx_t*)XMALLOC(
8642
                sizeof(ecc_nb_ctx_t), ssl->heap,
8643
                DYNAMIC_TYPE_TMP_BUFFER);
8644
            if (eccNbCtx == NULL) {
8645
                ret = MEMORY_E;
8646
            }
8647
            else {
8648
                ret = wc_ecc_set_nonblock((ecc_key*)kse->key, eccNbCtx);
8649
                if (ret != 0) {
8650
                    XFREE(eccNbCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8651
                }
8652
            }
8653
        }
8654
    #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8655
              WC_ASYNC_ENABLE_ECC */
8656
8657
0
        if (ret == 0) {
8658
0
            kse->keyLen = keySize;
8659
0
            kse->pubKeyLen = keySize * 2 + 1;
8660
8661
        #if defined(WOLFSSL_RENESAS_TSIP_TLS)
8662
            ret = tsip_Tls13GenEccKeyPair(ssl, kse);
8663
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
8664
                return ret;
8665
            }
8666
        #endif
8667
            /* setting eccKey means okay to call wc_ecc_free */
8668
0
            eccKey = (ecc_key*)kse->key;
8669
8670
        #ifdef WOLFSSL_STATIC_EPHEMERAL
8671
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_ECDH, kse->key);
8672
            if (ret != 0 || eccKey->dp->id != curveId)
8673
        #endif
8674
0
            {
8675
                /* set curve info for EccMakeKey "peer" info */
8676
0
                ret = wc_ecc_set_curve(eccKey, (int)kse->keyLen, curveId);
8677
0
                if (ret == 0) {
8678
            #ifdef WOLFSSL_ASYNC_CRYPT
8679
                    /* Detect when private key generation is done */
8680
                    if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) &&
8681
                            eccKey->type == ECC_PRIVATEKEY) {
8682
                        ret = 0; /* ECC Key Generation is done */
8683
                    }
8684
                    else
8685
            #endif
8686
0
                    {
8687
                        /* Generate ephemeral ECC key */
8688
                        /* For async this is called once and when event is done, the
8689
                        *   provided buffers in key be populated.
8690
                        * Final processing is x963 key export below. */
8691
0
                        ret = EccMakeKey(ssl, eccKey, eccKey);
8692
0
                    }
8693
0
                }
8694
            #ifdef WOLFSSL_ASYNC_CRYPT
8695
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
8696
                    return ret;
8697
            #endif
8698
0
            }
8699
0
        }
8700
0
    }
8701
8702
0
    if (ret == 0 && kse->pubKey == NULL) {
8703
        /* Allocate space for the public key */
8704
0
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8705
0
            DYNAMIC_TYPE_PUBLIC_KEY);
8706
0
        if (kse->pubKey == NULL) {
8707
0
            WOLFSSL_MSG("Key data Memory error");
8708
0
            ret = MEMORY_E;
8709
0
        }
8710
0
    }
8711
8712
0
    if (ret == 0) {
8713
0
        XMEMSET(kse->pubKey, 0, kse->pubKeyLen);
8714
8715
        /* Export public key. */
8716
0
        PRIVATE_KEY_UNLOCK();
8717
0
        if (wc_ecc_export_x963(eccKey, kse->pubKey, &kse->pubKeyLen) != 0) {
8718
0
            ret = ECC_EXPORT_ERROR;
8719
0
            WOLFSSL_ERROR_VERBOSE(ret);
8720
0
        }
8721
0
        PRIVATE_KEY_LOCK();
8722
0
    }
8723
#ifdef WOLFSSL_DEBUG_TLS
8724
    if (ret == 0) {
8725
        WOLFSSL_MSG("Public ECC Key");
8726
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8727
    }
8728
#endif
8729
8730
0
    if (ret != 0) {
8731
        /* Cleanup on error, otherwise data owned by key share entry */
8732
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8733
0
        kse->pubKey = NULL;
8734
0
        if (eccKey != NULL) {
8735
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8736
        defined(WC_ASYNC_ENABLE_ECC)
8737
            if (eccKey->nb_ctx != NULL) {
8738
                XFREE(eccKey->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8739
            }
8740
    #endif
8741
0
            wc_ecc_free(eccKey);
8742
0
        }
8743
0
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8744
0
        kse->key = NULL;
8745
0
    }
8746
#else
8747
    (void)ssl;
8748
    (void)kse;
8749
8750
    ret = NOT_COMPILED_IN;
8751
    WOLFSSL_ERROR_VERBOSE(ret);
8752
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
8753
8754
0
    return ret;
8755
0
}
8756
8757
#ifdef WOLFSSL_HAVE_MLKEM
8758
#if (defined(WOLFSSL_MLKEM_CACHE_A) || \
8759
    (defined(HAVE_PKCS11) && !defined(NO_PKCS11_MLKEM))) && \
8760
    !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY)
8761
    /* Store MlKemKey object rather than private key bytes in key share entry.
8762
     * Improves performance at cost of more dynamic memory being used. */
8763
    #define WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8764
#endif
8765
#if defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY) && \
8766
    defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ)
8767
    #error "Choose WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY or "
8768
           "WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ"
8769
#endif
8770
8771
#if (!defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
8772
     !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)) || \
8773
    !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) || \
8774
    (!defined(WOLFSSL_MLKEM_NO_DECAPSULATE) && \
8775
     !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ))
8776
static int mlkem_id2type(int id, int *type)
8777
3.83k
{
8778
3.83k
    int ret = 0;
8779
8780
3.83k
    switch (id) {
8781
0
#ifndef WOLFSSL_NO_ML_KEM
8782
0
    #ifndef WOLFSSL_NO_ML_KEM_512
8783
0
        case WOLFSSL_ML_KEM_512:
8784
0
            *type = WC_ML_KEM_512;
8785
0
            break;
8786
0
    #endif
8787
0
    #ifndef WOLFSSL_NO_ML_KEM_768
8788
3.81k
        case WOLFSSL_ML_KEM_768:
8789
3.81k
            *type = WC_ML_KEM_768;
8790
3.81k
            break;
8791
0
    #endif
8792
0
    #ifndef WOLFSSL_NO_ML_KEM_1024
8793
14
        case WOLFSSL_ML_KEM_1024:
8794
14
            *type = WC_ML_KEM_1024;
8795
14
            break;
8796
0
    #endif
8797
0
#endif
8798
#ifdef WOLFSSL_MLKEM_KYBER
8799
    #ifdef WOLFSSL_KYBER512
8800
        case WOLFSSL_KYBER_LEVEL1:
8801
            *type = KYBER512;
8802
            break;
8803
    #endif
8804
    #ifdef WOLFSSL_KYBER768
8805
        case WOLFSSL_KYBER_LEVEL3:
8806
            *type = KYBER768;
8807
            break;
8808
    #endif
8809
    #ifdef WOLFSSL_KYBER1024
8810
        case WOLFSSL_KYBER_LEVEL5:
8811
            *type = KYBER1024;
8812
            break;
8813
    #endif
8814
#endif
8815
0
        default:
8816
0
            ret = NOT_COMPILED_IN;
8817
0
            break;
8818
3.83k
    }
8819
8820
3.83k
    return ret;
8821
3.83k
}
8822
#endif
8823
8824
#if defined(WOLFSSL_NO_ML_KEM_768) && defined(WOLFSSL_NO_ML_KEM_1024) && \
8825
    defined(WOLFSSL_PQC_HYBRIDS)
8826
    #error "PQC hybrid combinations require either ML-KEM 768 or ML-KEM 1024"
8827
#endif
8828
8829
/* Structures and objects needed for hybrid key exchanges using both classic
8830
 * ECDHE and PQC KEM key material. */
8831
typedef struct PqcHybridMapping {
8832
    int hybrid;
8833
    int ecc;
8834
    int pqc;
8835
    int pqc_first;
8836
} PqcHybridMapping;
8837
8838
static const PqcHybridMapping pqc_hybrid_mapping[] = {
8839
#ifndef WOLFSSL_NO_ML_KEM
8840
#ifdef WOLFSSL_PQC_HYBRIDS
8841
    {WOLFSSL_SECP256R1MLKEM768, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_768, 0},
8842
    {WOLFSSL_SECP384R1MLKEM1024, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_1024, 0},
8843
#endif /* WOLFSSL_PQC_HYBRIDS */
8844
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
8845
    {WOLFSSL_SECP256R1MLKEM512, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8846
    {WOLFSSL_SECP384R1MLKEM768, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8847
    {WOLFSSL_SECP521R1MLKEM1024, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8848
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
8849
    {WOLFSSL_P256_ML_KEM_512_OLD, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8850
    {WOLFSSL_P384_ML_KEM_768_OLD, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8851
    {WOLFSSL_P521_ML_KEM_1024_OLD, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8852
#endif /* WOLFSSL_ML_KEM_USE_OLD_IDS */
8853
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
8854
#ifdef HAVE_CURVE25519
8855
#ifdef WOLFSSL_PQC_HYBRIDS
8856
    {WOLFSSL_X25519MLKEM768, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_768, 1},
8857
#endif /* WOLFSSL_PQC_HYBRIDS */
8858
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
8859
    {WOLFSSL_X25519MLKEM512, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_512, 1},
8860
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
8861
#endif /* HAVE_CURVE25519 */
8862
#ifdef HAVE_CURVE448
8863
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
8864
    {WOLFSSL_X448MLKEM768, WOLFSSL_ECC_X448, WOLFSSL_ML_KEM_768, 1},
8865
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
8866
#endif /* HAVE_CURVE448 */
8867
#endif /* WOLFSSL_NO_ML_KEM */
8868
#ifdef WOLFSSL_MLKEM_KYBER
8869
    {WOLFSSL_P256_KYBER_LEVEL1, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL1, 0},
8870
    {WOLFSSL_P384_KYBER_LEVEL3, WOLFSSL_ECC_SECP384R1, WOLFSSL_KYBER_LEVEL3, 0},
8871
    {WOLFSSL_P256_KYBER_LEVEL3, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL3, 0},
8872
    {WOLFSSL_P521_KYBER_LEVEL5, WOLFSSL_ECC_SECP521R1, WOLFSSL_KYBER_LEVEL5, 0},
8873
#ifdef HAVE_CURVE25519
8874
    {WOLFSSL_X25519_KYBER_LEVEL1, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL1, 0},
8875
    {WOLFSSL_X25519_KYBER_LEVEL3, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL3, 0},
8876
#endif
8877
#ifdef HAVE_CURVE448
8878
    {WOLFSSL_X448_KYBER_LEVEL3, WOLFSSL_ECC_X448, WOLFSSL_KYBER_LEVEL3, 0},
8879
#endif
8880
#endif /* WOLFSSL_MLKEM_KYBER */
8881
    {0, 0, 0, 0}
8882
};
8883
8884
/* Map an ecc-pqc hybrid group into its ecc group and pqc kem group. */
8885
static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group)
8886
7.81k
{
8887
7.81k
    int i;
8888
8889
7.81k
    if (pqc != NULL)
8890
3.86k
        *pqc = 0;
8891
7.81k
    if (ecc != NULL)
8892
7.81k
        *ecc = 0;
8893
7.81k
    if (pqc_first != NULL)
8894
3.86k
        *pqc_first = 0;
8895
8896
23.2k
    for (i = 0; pqc_hybrid_mapping[i].hybrid != 0; i++) {
8897
23.2k
        if (pqc_hybrid_mapping[i].hybrid == group) {
8898
7.79k
            if (pqc != NULL)
8899
3.86k
                *pqc = pqc_hybrid_mapping[i].pqc;
8900
7.79k
            if (ecc != NULL)
8901
7.79k
                *ecc = pqc_hybrid_mapping[i].ecc;
8902
7.79k
            if (pqc_first != NULL)
8903
3.86k
                *pqc_first = pqc_hybrid_mapping[i].pqc_first;
8904
7.79k
            break;
8905
7.79k
        }
8906
23.2k
    }
8907
7.81k
}
8908
8909
#if !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
8910
    !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
8911
/* Create a key share entry using pqc parameters group on the client side.
8912
 * Generates a key pair.
8913
 *
8914
 * ssl   The SSL/TLS object.
8915
 * kse   The key share entry object.
8916
 * returns 0 on success, otherwise failure.
8917
 */
8918
static int TLSX_KeyShare_GenPqcKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
8919
3.82k
{
8920
3.82k
    int ret = 0;
8921
3.82k
    int type = 0;
8922
3.82k
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8923
3.82k
        WC_DECLARE_VAR(kem, MlKemKey, 1, 0);
8924
3.82k
    byte* privKey = NULL;
8925
3.82k
    word32 privSz = 0;
8926
#else
8927
    MlKemKey* kem = NULL;
8928
#endif
8929
8930
    /* This gets called twice. Once during parsing of the key share and once
8931
     * during the population of the extension. No need to do work the second
8932
     * time. Just return success if its already been done. */
8933
3.82k
    if (kse->pubKey != NULL) {
8934
0
        return ret;
8935
0
    }
8936
8937
    /* Get the type of key we need from the key share group. */
8938
3.82k
    ret = mlkem_id2type(kse->group, &type);
8939
3.82k
    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
8940
0
        WOLFSSL_MSG("Invalid ML-KEM algorithm specified.");
8941
0
        ret = BAD_FUNC_ARG;
8942
0
    }
8943
8944
3.82k
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8945
8946
3.82k
    #ifdef WOLFSSL_SMALL_STACK
8947
3.82k
    if (ret == 0) {
8948
3.82k
        kem = (MlKemKey *)XMALLOC(sizeof(*kem), ssl->heap,
8949
3.82k
                                  DYNAMIC_TYPE_PRIVATE_KEY);
8950
3.82k
        if (kem == NULL) {
8951
2
            WOLFSSL_MSG("KEM memory allocation failure");
8952
2
            ret = MEMORY_ERROR;
8953
2
        }
8954
3.82k
    }
8955
3.82k
    #endif /* WOLFSSL_SMALL_STACK */
8956
8957
3.82k
    if (ret == 0) {
8958
3.82k
        ret = wc_MlKemKey_Init(kem, type, ssl->heap, ssl->devId);
8959
3.82k
        if (ret != 0) {
8960
0
            WOLFSSL_MSG("Failed to initialize ML-KEM Key.");
8961
0
        }
8962
3.82k
    }
8963
8964
3.82k
    if (ret == 0) {
8965
3.82k
        ret = wc_MlKemKey_PrivateKeySize(kem, &privSz);
8966
3.82k
    }
8967
3.82k
    if (ret == 0) {
8968
3.82k
        ret = wc_MlKemKey_PublicKeySize(kem, &kse->pubKeyLen);
8969
3.82k
    }
8970
8971
3.82k
    if (ret == 0) {
8972
3.82k
        privKey = (byte*)XMALLOC(privSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8973
3.82k
        if (privKey == NULL) {
8974
3
            WOLFSSL_MSG("privkey memory allocation failure");
8975
3
            ret = MEMORY_ERROR;
8976
3
        }
8977
3.82k
    }
8978
#else
8979
    if (ret == 0) {
8980
        /* Allocate an ML-KEM key to hold private key. */
8981
        kem = (MlKemKey*)XMALLOC(sizeof(MlKemKey), ssl->heap,
8982
                                 DYNAMIC_TYPE_PRIVATE_KEY);
8983
        if (kem == NULL) {
8984
            WOLFSSL_MSG("KEM memory allocation failure");
8985
            ret = MEMORY_ERROR;
8986
        }
8987
    }
8988
    if (ret == 0) {
8989
        ret = wc_MlKemKey_Init(kem, type, ssl->heap, ssl->devId);
8990
        if (ret != 0) {
8991
            WOLFSSL_MSG("Failed to initialize ML-KEM Key.");
8992
        }
8993
    }
8994
    if (ret == 0) {
8995
        ret = wc_MlKemKey_PublicKeySize(kem, &kse->pubKeyLen);
8996
    }
8997
#endif
8998
8999
3.82k
    if (ret == 0) {
9000
3.82k
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
9001
3.82k
                                     DYNAMIC_TYPE_PUBLIC_KEY);
9002
3.82k
        if (kse->pubKey == NULL) {
9003
1
            WOLFSSL_MSG("pubkey memory allocation failure");
9004
1
            ret = MEMORY_ERROR;
9005
1
        }
9006
3.82k
    }
9007
9008
3.82k
    if (ret == 0) {
9009
3.82k
        ret = wc_MlKemKey_MakeKey(kem, ssl->rng);
9010
3.82k
        if (ret != 0) {
9011
9
            WOLFSSL_MSG("ML-KEM keygen failure");
9012
9
        }
9013
3.82k
    }
9014
3.82k
    if (ret == 0) {
9015
3.81k
        ret = wc_MlKemKey_EncodePublicKey(kem, kse->pubKey,
9016
3.81k
                                          kse->pubKeyLen);
9017
3.81k
    }
9018
9019
3.82k
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9020
3.82k
    if (ret == 0) {
9021
3.81k
        PRIVATE_KEY_UNLOCK();
9022
3.81k
        ret = wc_MlKemKey_EncodePrivateKey(kem, privKey, privSz);
9023
3.81k
        PRIVATE_KEY_LOCK();
9024
3.81k
    }
9025
3.82k
#endif
9026
9027
#ifdef WOLFSSL_DEBUG_TLS
9028
    WOLFSSL_MSG("Public ML-KEM Key");
9029
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
9030
#endif
9031
9032
3.82k
    if (ret != 0) {
9033
        /* Data owned by key share entry otherwise. */
9034
15
        wc_MlKemKey_Free(kem);
9035
15
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9036
15
        kse->pubKey = NULL;
9037
15
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9038
15
        if (privKey) {
9039
10
            ForceZero(privKey, privSz);
9040
10
            XFREE(privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9041
10
            privKey = NULL;
9042
10
        }
9043
    #else
9044
        XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9045
        kse->key = NULL;
9046
    #endif
9047
15
    }
9048
3.81k
    else {
9049
3.81k
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9050
3.81k
        wc_MlKemKey_Free(kem);
9051
3.81k
        kse->privKey = (byte*)privKey;
9052
3.81k
        kse->privKeyLen = privSz;
9053
    #else
9054
        kse->key = kem;
9055
    #endif
9056
3.81k
    }
9057
9058
3.82k
    #if !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ) && \
9059
3.82k
        defined(WOLFSSL_SMALL_STACK)
9060
3.82k
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9061
3.82k
    #endif
9062
9063
3.82k
    return ret;
9064
3.82k
}
9065
9066
/* Create a key share entry using both ecdhe and pqc parameters groups.
9067
 * Generates two key pairs on the client side.
9068
 *
9069
 * ssl   The SSL/TLS object.
9070
 * kse   The key share entry object.
9071
 * returns 0 on success, otherwise failure.
9072
 */
9073
static int TLSX_KeyShare_GenPqcHybridKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
9074
3.86k
{
9075
3.86k
    int ret = 0;
9076
3.86k
    KeyShareEntry *ecc_kse = NULL;
9077
3.86k
    KeyShareEntry *pqc_kse = NULL;
9078
3.86k
    int pqc_group = 0;
9079
3.86k
    int ecc_group = 0;
9080
3.86k
    int pqc_first = 0;
9081
9082
    /* This gets called twice. Once during parsing of the key share and once
9083
     * during the population of the extension. No need to do work the second
9084
     * time. Just return success if its already been done. */
9085
3.86k
    if (kse->pubKey != NULL) {
9086
8
        return ret;
9087
8
    }
9088
9089
    /* Determine the ECC and PQC group of the hybrid combination */
9090
3.86k
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, kse->group);
9091
3.86k
    if (ecc_group == 0 || pqc_group == 0) {
9092
0
        WOLFSSL_MSG("Invalid hybrid group");
9093
0
        ret = BAD_FUNC_ARG;
9094
0
    }
9095
9096
3.86k
    if (ret == 0) {
9097
3.86k
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
9098
3.86k
                   DYNAMIC_TYPE_TLSX);
9099
3.86k
        if (ecc_kse == NULL) {
9100
2
            WOLFSSL_MSG("kse memory allocation failure");
9101
2
            ret = MEMORY_ERROR;
9102
2
        }
9103
3.85k
        else {
9104
3.85k
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
9105
3.85k
        }
9106
3.86k
    }
9107
3.86k
    if (ret == 0) {
9108
3.85k
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
9109
3.85k
                   DYNAMIC_TYPE_TLSX);
9110
3.85k
        if (pqc_kse == NULL) {
9111
2
            WOLFSSL_MSG("kse memory allocation failure");
9112
2
            ret = MEMORY_ERROR;
9113
2
        }
9114
3.85k
        else {
9115
3.85k
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
9116
3.85k
        }
9117
3.85k
    }
9118
9119
    /* Generate ECC key share part */
9120
3.86k
    if (ret == 0) {
9121
3.85k
        ecc_kse->group = ecc_group;
9122
9123
    #ifdef WOLFSSL_ASYNC_CRYPT
9124
        /* Check if the provided kse already contains an ECC key and the
9125
         * last error was WC_PENDING_E. In this case, we already tried to
9126
         * generate an ECC key. Hence, we have to restore it. */
9127
        if (kse->key != NULL && kse->keyLen > 0 &&
9128
            kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9129
            ecc_kse->key = kse->key;
9130
            ecc_kse->keyLen = kse->keyLen;
9131
            ecc_kse->pubKeyLen = kse->pubKeyLen;
9132
            ecc_kse->lastRet = kse->lastRet;
9133
            kse->key = NULL;
9134
        }
9135
    #endif
9136
9137
3.85k
    #ifdef HAVE_CURVE25519
9138
3.85k
        if (ecc_group == WOLFSSL_ECC_X25519) {
9139
3.81k
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
9140
3.81k
        }
9141
46
        else
9142
46
    #endif
9143
46
    #ifdef HAVE_CURVE448
9144
46
        if (ecc_group == WOLFSSL_ECC_X448) {
9145
0
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
9146
0
        }
9147
46
        else
9148
46
    #endif
9149
46
        {
9150
46
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
9151
46
        }
9152
9153
    #ifdef WOLFSSL_ASYNC_CRYPT
9154
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9155
            /* Store the generated ECC key in the provided kse to later
9156
             * restore it.*/
9157
            kse->key = ecc_kse->key;
9158
            kse->keyLen = ecc_kse->keyLen;
9159
            kse->pubKeyLen = ecc_kse->pubKeyLen;
9160
            ecc_kse->key = NULL;
9161
        }
9162
    #endif
9163
3.85k
    }
9164
9165
    /* Generate PQC key share part */
9166
3.86k
    if (ret == 0) {
9167
3.82k
        pqc_kse->group = pqc_group;
9168
3.82k
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, pqc_kse);
9169
        /* No error message, TLSX_KeyShare_GenPqcKeyClient will do it. */
9170
3.82k
    }
9171
9172
    /* Allocate memory for combined public key */
9173
3.86k
    if (ret == 0) {
9174
3.81k
        kse->pubKey = (byte*)XMALLOC(ecc_kse->pubKeyLen + pqc_kse->pubKeyLen,
9175
3.81k
                                     ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9176
3.81k
        if (kse->pubKey == NULL) {
9177
20
            WOLFSSL_MSG("pubkey memory allocation failure");
9178
20
            ret = MEMORY_ERROR;
9179
20
        }
9180
3.81k
    }
9181
9182
    /* Create combined public key. The order of classic/pqc key material is
9183
     * indicated by the pqc_first variable. */
9184
3.86k
    if (ret == 0) {
9185
3.79k
        if (pqc_first) {
9186
3.75k
            XMEMCPY(kse->pubKey, pqc_kse->pubKey, pqc_kse->pubKeyLen);
9187
3.75k
            XMEMCPY(kse->pubKey + pqc_kse->pubKeyLen, ecc_kse->pubKey,
9188
3.75k
                    ecc_kse->pubKeyLen);
9189
3.75k
        }
9190
35
        else {
9191
35
            XMEMCPY(kse->pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen);
9192
35
            XMEMCPY(kse->pubKey + ecc_kse->pubKeyLen, pqc_kse->pubKey,
9193
35
                    pqc_kse->pubKeyLen);
9194
35
        }
9195
3.79k
        kse->pubKeyLen = ecc_kse->pubKeyLen + pqc_kse->pubKeyLen;
9196
3.79k
    }
9197
9198
    /* Store the private keys.
9199
     * Note we are saving the PQC private key and ECC private key
9200
     * separately. That's because the ECC private key is not simply a
9201
     * buffer. Its is an ecc_key struct. */
9202
3.86k
    if (ret == 0) {
9203
3.79k
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9204
        /* PQC private key is an encoded byte array */
9205
3.79k
        kse->privKey = pqc_kse->privKey;
9206
3.79k
        kse->privKeyLen = pqc_kse->privKeyLen;
9207
3.79k
        pqc_kse->privKey = NULL;
9208
    #else
9209
        /* PQC private key is a pointer to MlKemKey object */
9210
        kse->privKey = (byte*)pqc_kse->key;
9211
        kse->privKeyLen = 0;
9212
        pqc_kse->key = NULL;
9213
    #endif
9214
        /* ECC private key is a pointer to ecc_key object */
9215
3.79k
        kse->key = ecc_kse->key;
9216
3.79k
        kse->keyLen = ecc_kse->keyLen;
9217
3.79k
        ecc_kse->key = NULL;
9218
3.79k
    }
9219
9220
#ifdef WOLFSSL_DEBUG_TLS
9221
    WOLFSSL_MSG("Public ML-KEM Key");
9222
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
9223
#endif
9224
9225
3.86k
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
9226
3.86k
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
9227
9228
3.86k
    return ret;
9229
3.86k
}
9230
#endif /* !WOLFSSL_MLKEM_NO_MAKE_KEY && !WOLFSSL_MLKEM_NO_DECAPSULATE */
9231
#endif /* WOLFSSL_HAVE_MLKEM */
9232
9233
/* Generate a secret/key using the key share entry.
9234
 *
9235
 * ssl  The SSL/TLS object.
9236
 * kse  The key share entry holding peer data.
9237
 */
9238
int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
9239
5.20k
{
9240
5.20k
    int ret;
9241
    /* Named FFDHE groups have a bit set to identify them. */
9242
5.20k
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(kse->group))
9243
320
        ret = TLSX_KeyShare_GenDhKey(ssl, kse);
9244
4.88k
    else if (kse->group == WOLFSSL_ECC_X25519)
9245
531
        ret = TLSX_KeyShare_GenX25519Key(ssl, kse);
9246
4.35k
    else if (kse->group == WOLFSSL_ECC_X448)
9247
25
        ret = TLSX_KeyShare_GenX448Key(ssl, kse);
9248
4.32k
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \
9249
4.32k
    !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9250
4.32k
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group))
9251
0
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, kse);
9252
4.32k
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(kse->group))
9253
3.86k
        ret = TLSX_KeyShare_GenPqcHybridKeyClient(ssl, kse);
9254
457
#endif
9255
457
    else
9256
457
        ret = TLSX_KeyShare_GenEccKey(ssl, kse);
9257
#ifdef WOLFSSL_ASYNC_CRYPT
9258
    kse->lastRet = ret;
9259
#endif
9260
5.20k
    return ret;
9261
5.20k
}
9262
9263
/* Free the key share dynamic data.
9264
 *
9265
 * list  The linked list of key share entry objects.
9266
 * heap  The heap used for allocation.
9267
 */
9268
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
9269
17.2k
{
9270
17.2k
    KeyShareEntry* current;
9271
9272
32.6k
    while ((current = list) != NULL) {
9273
15.4k
        list = current->next;
9274
15.4k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(current->group)) {
9275
621
#ifndef NO_DH
9276
        #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9277
            defined(WC_ASYNC_ENABLE_DH)
9278
            if (current->key != NULL &&
9279
                    ((DhKey*)current->key)->nb != NULL) {
9280
                XFREE(((DhKey*)current->key)->nb, heap,
9281
                    DYNAMIC_TYPE_TMP_BUFFER);
9282
                ((DhKey*)current->key)->nb = NULL;
9283
            }
9284
        #endif
9285
621
            wc_FreeDhKey((DhKey*)current->key);
9286
621
            if (current->privKey != NULL && current->privKeyLen > 0) {
9287
0
                ForceZero(current->privKey, current->privKeyLen);
9288
0
            }
9289
621
#endif
9290
621
        }
9291
14.7k
        else if (current->group == WOLFSSL_ECC_X25519) {
9292
5.42k
#ifdef HAVE_CURVE25519
9293
        #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
9294
            if (current->key != NULL &&
9295
                    ((curve25519_key*)current->key)->nb_ctx != NULL) {
9296
                XFREE(((curve25519_key*)current->key)->nb_ctx, heap,
9297
                    DYNAMIC_TYPE_TMP_BUFFER);
9298
            }
9299
        #endif
9300
5.42k
            wc_curve25519_free((curve25519_key*)current->key);
9301
5.42k
#endif
9302
5.42k
        }
9303
9.35k
        else if (current->group == WOLFSSL_ECC_X448) {
9304
56
#ifdef HAVE_CURVE448
9305
56
            wc_curve448_free((curve448_key*)current->key);
9306
56
#endif
9307
56
        }
9308
9.30k
        else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
9309
3.84k
#ifdef WOLFSSL_HAVE_MLKEM
9310
3.84k
            wc_MlKemKey_Free((MlKemKey*)current->key);
9311
3.84k
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9312
3.84k
            if (current->privKey != NULL) {
9313
20
                ForceZero(current->privKey, current->privKeyLen);
9314
20
            }
9315
3.84k
        #endif
9316
3.84k
#endif
9317
3.84k
        }
9318
5.45k
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
9319
3.95k
#ifdef WOLFSSL_HAVE_MLKEM
9320
3.95k
            int ecc_group = 0;
9321
3.95k
            findEccPqc(&ecc_group, NULL, NULL, current->group);
9322
9323
            /* Free PQC private key */
9324
        #ifdef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9325
            wc_MlKemKey_Free((MlKemKey*)current->privKey);
9326
        #else
9327
3.95k
            if (current->privKey != NULL) {
9328
3.79k
                ForceZero(current->privKey, current->privKeyLen);
9329
3.79k
            }
9330
3.95k
        #endif
9331
9332
            /* Free ECC private key */
9333
3.95k
            if (ecc_group == WOLFSSL_ECC_X25519) {
9334
3.87k
            #ifdef HAVE_CURVE25519
9335
3.87k
                wc_curve25519_free((curve25519_key*)current->key);
9336
3.87k
            #endif
9337
3.87k
            }
9338
72
            else if (ecc_group == WOLFSSL_ECC_X448) {
9339
0
            #ifdef HAVE_CURVE448
9340
0
                wc_curve448_free((curve448_key*)current->key);
9341
0
            #endif
9342
0
            }
9343
72
            else {
9344
72
            #ifdef HAVE_ECC
9345
                #if defined(WC_ECC_NONBLOCK) && \
9346
                    defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9347
                    defined(WC_ASYNC_ENABLE_ECC)
9348
                if (current->key != NULL &&
9349
                        ((ecc_key*)current->key)->nb_ctx != NULL) {
9350
                    XFREE(((ecc_key*)current->key)->nb_ctx, heap,
9351
                        DYNAMIC_TYPE_TMP_BUFFER);
9352
                }
9353
                #endif
9354
72
                wc_ecc_free((ecc_key*)current->key);
9355
72
            #endif
9356
72
            }
9357
3.95k
#endif
9358
3.95k
        }
9359
1.50k
        else {
9360
1.50k
#ifdef HAVE_ECC
9361
        #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9362
            defined(WC_ASYNC_ENABLE_ECC)
9363
            if (current->key != NULL &&
9364
                    ((ecc_key*)current->key)->nb_ctx != NULL) {
9365
                XFREE(((ecc_key*)current->key)->nb_ctx, heap,
9366
                    DYNAMIC_TYPE_TMP_BUFFER);
9367
            }
9368
        #endif
9369
1.50k
            wc_ecc_free((ecc_key*)current->key);
9370
1.50k
#endif
9371
1.50k
        }
9372
15.4k
        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
9373
15.4k
    #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
9374
15.4k
        XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY);
9375
15.4k
    #endif
9376
15.4k
        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
9377
15.4k
        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
9378
15.4k
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
9379
15.4k
    }
9380
9381
17.2k
    (void)heap;
9382
17.2k
}
9383
9384
/* Get the size of the encoded key share extension.
9385
 *
9386
 * list     The linked list of key share extensions.
9387
 * msgType  The type of the message this extension is being written into.
9388
 * returns the number of bytes of the encoded key share extension.
9389
 */
9390
static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
9391
6.79k
{
9392
6.79k
    word16         len = 0;
9393
6.79k
    byte           isRequest = (msgType == client_hello);
9394
6.79k
    KeyShareEntry* current;
9395
9396
    /* The named group the server wants to use. */
9397
6.79k
    if (msgType == hello_retry_request)
9398
324
        return OPAQUE16_LEN;
9399
9400
    /* List of key exchange groups. */
9401
6.46k
    if (isRequest)
9402
5.85k
        len += OPAQUE16_LEN;
9403
10.8k
    while ((current = list) != NULL) {
9404
4.39k
        list = current->next;
9405
9406
4.39k
        if (!isRequest && current->pubKey == NULL)
9407
0
            continue;
9408
9409
4.39k
        len += (word16)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
9410
4.39k
    }
9411
9412
6.46k
    return len;
9413
6.79k
}
9414
9415
/* Writes the key share extension into the output buffer.
9416
 * Assumes that the the output buffer is big enough to hold data.
9417
 *
9418
 * list     The linked list of key share entries.
9419
 * output   The buffer to write into.
9420
 * msgType  The type of the message this extension is being written into.
9421
 * returns the number of bytes written into the buffer.
9422
 */
9423
static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
9424
                                  byte msgType)
9425
4.70k
{
9426
4.70k
    word16         i = 0;
9427
4.70k
    byte           isRequest = (msgType == client_hello);
9428
4.70k
    KeyShareEntry* current;
9429
9430
4.70k
    if (msgType == hello_retry_request) {
9431
322
        c16toa(list->group, output);
9432
322
        return OPAQUE16_LEN;
9433
322
    }
9434
9435
    /* ClientHello has a list but ServerHello is only the chosen. */
9436
4.38k
    if (isRequest)
9437
3.78k
        i += OPAQUE16_LEN;
9438
9439
    /* Write out all in the list. */
9440
6.70k
    while ((current = list) != NULL) {
9441
2.32k
        list = current->next;
9442
9443
2.32k
        if (!isRequest && current->pubKey == NULL)
9444
0
            continue;
9445
9446
2.32k
        c16toa(current->group, &output[i]);
9447
2.32k
        i += KE_GROUP_LEN;
9448
2.32k
        c16toa((word16)(current->pubKeyLen), &output[i]);
9449
2.32k
        i += OPAQUE16_LEN;
9450
2.32k
        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
9451
2.32k
        i += (word16)current->pubKeyLen;
9452
2.32k
    }
9453
    /* Write the length of the list if required. */
9454
4.38k
    if (isRequest)
9455
3.78k
        c16toa(i - OPAQUE16_LEN, output);
9456
9457
4.38k
    return i;
9458
4.70k
}
9459
9460
/* Process the DH key share extension on the client side.
9461
 *
9462
 * ssl            The SSL/TLS object.
9463
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9464
 * returns 0 on success and other values indicate failure.
9465
 */
9466
static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9467
19
{
9468
19
    int ret = 0;
9469
19
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
9470
19
    word32 pSz = 0;
9471
19
    DhKey* dhKey = (DhKey*)keyShareEntry->key;
9472
9473
19
#ifdef HAVE_PUBLIC_FFDHE
9474
19
    const DhParams* params = NULL;
9475
19
    switch (keyShareEntry->group) {
9476
0
    #ifdef HAVE_FFDHE_2048
9477
19
        case WOLFSSL_FFDHE_2048:
9478
19
            params = wc_Dh_ffdhe2048_Get();
9479
19
            break;
9480
0
    #endif
9481
    #ifdef HAVE_FFDHE_3072
9482
        case WOLFSSL_FFDHE_3072:
9483
            params = wc_Dh_ffdhe3072_Get();
9484
            break;
9485
    #endif
9486
    #ifdef HAVE_FFDHE_4096
9487
        case WOLFSSL_FFDHE_4096:
9488
            params = wc_Dh_ffdhe4096_Get();
9489
            break;
9490
    #endif
9491
    #ifdef HAVE_FFDHE_6144
9492
        case WOLFSSL_FFDHE_6144:
9493
            params = wc_Dh_ffdhe6144_Get();
9494
            break;
9495
    #endif
9496
    #ifdef HAVE_FFDHE_8192
9497
        case WOLFSSL_FFDHE_8192:
9498
            params = wc_Dh_ffdhe8192_Get();
9499
            break;
9500
    #endif
9501
0
        default:
9502
0
            break;
9503
19
    }
9504
19
    if (params == NULL) {
9505
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9506
0
        return PEER_KEY_ERROR;
9507
0
    }
9508
19
    pSz = params->p_len;
9509
#else
9510
    ret = wc_DhGetNamedKeyParamSize(keyShareEntry->group, &pSz, NULL, NULL);
9511
    if (ret != 0 || pSz == 0) {
9512
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9513
        return PEER_KEY_ERROR;
9514
    }
9515
#endif
9516
9517
    /* RFC 8446 Section 4.2.8.1: FFDHE key_exchange values are left-padded with
9518
     * zeros to the size of the named-group prime. Reject any peer key share
9519
     * whose byte length does not match the expected prime size. */
9520
19
    if (keyShareEntry->keLen != pSz) {
9521
19
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9522
19
        return PEER_KEY_ERROR;
9523
19
    }
9524
9525
    /* if DhKey is not setup, do it now */
9526
0
    if (keyShareEntry->key == NULL) {
9527
0
        keyShareEntry->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
9528
0
            DYNAMIC_TYPE_DH);
9529
0
        if (keyShareEntry->key == NULL)
9530
0
            return MEMORY_E;
9531
9532
        /* Setup Key */
9533
0
        ret = wc_InitDhKey_ex((DhKey*)keyShareEntry->key, ssl->heap, ssl->devId);
9534
0
        if (ret == 0) {
9535
0
            dhKey = (DhKey*)keyShareEntry->key;
9536
        /* Set key */
9537
0
        #ifdef HAVE_PUBLIC_FFDHE
9538
0
            ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
9539
0
                                                                params->g_len);
9540
        #else
9541
            ret = wc_DhSetNamedKey(dhKey, keyShareEntry->group);
9542
        #endif
9543
0
        }
9544
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9545
        defined(WC_ASYNC_ENABLE_DH)
9546
        /* Only set non-blocking context when async device is active. With
9547
         * INVALID_DEVID there is no async loop to retry on MP_WOULDBLOCK, so
9548
         * skip non-blocking setup and use blocking mode instead. */
9549
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
9550
            DhNb* dhNb = (DhNb*)XMALLOC(sizeof(DhNb), ssl->heap,
9551
                                        DYNAMIC_TYPE_TMP_BUFFER);
9552
            if (dhNb == NULL) {
9553
                ret = MEMORY_E;
9554
            }
9555
            else {
9556
                ret = wc_DhSetNonBlock((DhKey*)keyShareEntry->key, dhNb);
9557
                if (ret != 0) {
9558
                    XFREE(dhNb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9559
                }
9560
            }
9561
        }
9562
    #endif /* WC_DH_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
9563
              WC_ASYNC_ENABLE_DH */
9564
0
    }
9565
9566
0
    if (ret == 0
9567
    #ifdef WOLFSSL_ASYNC_CRYPT
9568
        && keyShareEntry->lastRet == 0 /* don't enter here if WC_PENDING_E */
9569
    #endif
9570
0
    ) {
9571
    #ifdef WOLFSSL_DEBUG_TLS
9572
        WOLFSSL_MSG("Peer DH Key");
9573
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9574
    #endif
9575
9576
0
        ssl->options.dhKeySz = (word16)pSz;
9577
9578
        /* Derive secret from private key and peer's public key. */
9579
0
        ret = DhAgree(ssl, dhKey,
9580
0
            (const byte*)keyShareEntry->privKey, keyShareEntry->keyLen, /* our private */
9581
0
            keyShareEntry->ke, keyShareEntry->keLen,                    /* peer's public key */
9582
0
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,    /* secret */
9583
0
            NULL, 0
9584
0
        );
9585
    #ifdef WOLFSSL_ASYNC_CRYPT
9586
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9587
            return ret;
9588
        }
9589
    #endif
9590
0
    }
9591
9592
    /* RFC 8446 Section 7.4.1:
9593
     *     ... left-padded with zeros up to the size of the prime. ...
9594
     */
9595
0
    if (ret == 0 && (word32)ssl->options.dhKeySz > ssl->arrays->preMasterSz) {
9596
0
        word32 diff = (word32)ssl->options.dhKeySz - ssl->arrays->preMasterSz;
9597
0
        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
9598
0
                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9599
0
        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
9600
0
        ssl->arrays->preMasterSz = ssl->options.dhKeySz;
9601
0
    }
9602
9603
    /* done with key share, release resources */
9604
0
    if (dhKey) {
9605
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9606
        defined(WC_ASYNC_ENABLE_DH)
9607
        if (dhKey->nb != NULL) {
9608
            XFREE(dhKey->nb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9609
            dhKey->nb = NULL;
9610
        }
9611
    #endif
9612
0
        wc_FreeDhKey(dhKey);
9613
0
    }
9614
0
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
9615
0
    keyShareEntry->key = NULL;
9616
0
    if (keyShareEntry->privKey) {
9617
0
        ForceZero(keyShareEntry->privKey, keyShareEntry->keyLen);
9618
0
        XFREE(keyShareEntry->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9619
0
        keyShareEntry->privKey = NULL;
9620
0
    }
9621
0
    XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9622
0
    keyShareEntry->pubKey = NULL;
9623
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9624
0
    keyShareEntry->ke = NULL;
9625
#else
9626
    (void)ssl;
9627
    (void)keyShareEntry;
9628
    ret = PEER_KEY_ERROR;
9629
    WOLFSSL_ERROR_VERBOSE(ret);
9630
#endif
9631
0
    return ret;
9632
0
}
9633
9634
/* Process the X25519 key share extension on the client side.
9635
 *
9636
 * ssl            The SSL/TLS object.
9637
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9638
 * ssOutput       The destination buffer for the shared secret.
9639
 * ssOutSz        The size of the generated shared secret.
9640
 *
9641
 * returns 0 on success and other values indicate failure.
9642
 */
9643
static int TLSX_KeyShare_ProcessX25519_ex(WOLFSSL* ssl,
9644
                                          KeyShareEntry* keyShareEntry,
9645
                                          unsigned char* ssOutput,
9646
                                          word32* ssOutSz)
9647
489
{
9648
489
    int ret = 0;
9649
9650
489
#ifdef HAVE_CURVE25519
9651
489
    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
9652
9653
#ifdef WOLFSSL_ASYNC_CRYPT
9654
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9655
#endif
9656
489
    {
9657
489
    #ifdef HAVE_ECC
9658
489
        if (ssl->peerEccKey != NULL) {
9659
0
            wc_ecc_free(ssl->peerEccKey);
9660
0
            ssl->peerEccKey = NULL;
9661
0
            ssl->peerEccKeyPresent = 0;
9662
0
        }
9663
489
    #endif
9664
9665
489
        ssl->peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
9666
489
                                        ssl->heap, DYNAMIC_TYPE_TLSX);
9667
489
        if (ssl->peerX25519Key == NULL) {
9668
2
            WOLFSSL_MSG("PeerX25519Key Memory error");
9669
2
            return MEMORY_ERROR;
9670
2
        }
9671
487
        ret = wc_curve25519_init(ssl->peerX25519Key);
9672
487
        if (ret != 0) {
9673
0
            XFREE(ssl->peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9674
0
            ssl->peerX25519Key = NULL;
9675
0
            return ret;
9676
0
        }
9677
    #ifdef WOLFSSL_DEBUG_TLS
9678
        WOLFSSL_MSG("Peer Curve25519 Key");
9679
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9680
    #endif
9681
9682
487
        if (wc_curve25519_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9683
487
                                                  EC25519_LITTLE_ENDIAN) != 0) {
9684
6
            ret = ECC_PEERKEY_ERROR;
9685
6
            WOLFSSL_ERROR_VERBOSE(ret);
9686
6
        }
9687
9688
487
        if (ret == 0) {
9689
481
            if (wc_curve25519_import_public_ex(keyShareEntry->ke,
9690
481
                                        keyShareEntry->keLen,
9691
481
                                        ssl->peerX25519Key,
9692
481
                                        EC25519_LITTLE_ENDIAN) != 0) {
9693
0
                ret = ECC_PEERKEY_ERROR;
9694
0
                WOLFSSL_ERROR_VERBOSE(ret);
9695
0
            }
9696
481
        }
9697
9698
487
        if (ret == 0) {
9699
481
            ssl->ecdhCurveOID = ECC_X25519_OID;
9700
481
            ssl->peerX25519KeyPresent = 1;
9701
481
        }
9702
487
    }
9703
9704
487
    if (ret == 0 && key == NULL)
9705
0
        ret = BAD_FUNC_ARG;
9706
487
    if (ret == 0) {
9707
481
    #ifdef WOLFSSL_CURVE25519_BLINDING
9708
481
        ret = wc_curve25519_set_rng(key, ssl->rng);
9709
481
    }
9710
487
    if (ret == 0) {
9711
481
    #endif
9712
    #ifdef WOLFSSL_ASYNC_CRYPT
9713
        if (keyShareEntry->lastRet != WC_NO_ERR_TRACE(WC_PENDING_E))
9714
    #endif
9715
481
        {
9716
        #ifdef WOLFSSL_ASYNC_CRYPT
9717
            /* initialize event */
9718
            ret = wolfSSL_AsyncInit(ssl, &key->asyncDev,
9719
                WC_ASYNC_FLAG_CALL_AGAIN);
9720
            if (ret != 0)
9721
                return ret;
9722
        #endif
9723
481
            ret = wc_curve25519_shared_secret_ex(key, ssl->peerX25519Key,
9724
481
                        ssOutput, ssOutSz, EC25519_LITTLE_ENDIAN);
9725
        #ifdef WOLFSSL_ASYNC_CRYPT
9726
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9727
                return wolfSSL_AsyncPush(ssl, &key->asyncDev);
9728
            }
9729
        #endif
9730
481
        }
9731
        /* On CALL_AGAIN re-entry (lastRet == PENDING): the block above
9732
         * is skipped entirely, so wc_curve25519_shared_secret_ex is not
9733
         * called again. ret stays 0 from initialization, and execution
9734
         * falls through to the cleanup code below. */
9735
481
    }
9736
9737
    /* done with key share, release resources */
9738
487
    if (ssl->peerX25519Key != NULL) {
9739
487
        wc_curve25519_free(ssl->peerX25519Key);
9740
487
        XFREE(ssl->peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9741
487
        ssl->peerX25519Key = NULL;
9742
487
        ssl->peerX25519KeyPresent = 0;
9743
487
    }
9744
487
    if (keyShareEntry->key != NULL) {
9745
    #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
9746
        if (((curve25519_key*)keyShareEntry->key)->nb_ctx != NULL) {
9747
            XFREE(((curve25519_key*)keyShareEntry->key)->nb_ctx, ssl->heap,
9748
                DYNAMIC_TYPE_TMP_BUFFER);
9749
        }
9750
    #endif
9751
487
        wc_curve25519_free((curve25519_key*)keyShareEntry->key);
9752
487
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9753
487
        keyShareEntry->key = NULL;
9754
487
    }
9755
487
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9756
487
    keyShareEntry->ke = NULL;
9757
#else
9758
    (void)ssl;
9759
    (void)keyShareEntry;
9760
    (void)ssOutput;
9761
    (void)ssOutSz;
9762
9763
    ret = PEER_KEY_ERROR;
9764
    WOLFSSL_ERROR_VERBOSE(ret);
9765
#endif /* HAVE_CURVE25519 */
9766
9767
487
    return ret;
9768
487
}
9769
9770
/* Process the X25519 key share extension on the client side.
9771
 *
9772
 * ssl            The SSL/TLS object.
9773
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9774
 *
9775
 * returns 0 on success and other values indicate failure.
9776
 */
9777
static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
9778
                                       KeyShareEntry* keyShareEntry)
9779
489
{
9780
489
    return TLSX_KeyShare_ProcessX25519_ex(ssl, keyShareEntry,
9781
489
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9782
489
}
9783
9784
/* Process the X448 key share extension on the client side.
9785
 *
9786
 * ssl            The SSL/TLS object.
9787
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9788
 * ssOutput       The destination buffer for the shared secret.
9789
 * ssOutSz        The size of the generated shared secret.
9790
 *
9791
 * returns 0 on success and other values indicate failure.
9792
 */
9793
static int TLSX_KeyShare_ProcessX448_ex(WOLFSSL* ssl,
9794
                                        KeyShareEntry* keyShareEntry,
9795
                                        unsigned char* ssOutput,
9796
                                        word32* ssOutSz)
9797
12
{
9798
12
    int ret;
9799
9800
12
#ifdef HAVE_CURVE448
9801
12
    curve448_key* key = (curve448_key*)keyShareEntry->key;
9802
12
    curve448_key* peerX448Key;
9803
9804
12
#ifdef HAVE_ECC
9805
12
    if (ssl->peerEccKey != NULL) {
9806
0
        wc_ecc_free(ssl->peerEccKey);
9807
0
        ssl->peerEccKey = NULL;
9808
0
        ssl->peerEccKeyPresent = 0;
9809
0
    }
9810
12
#endif
9811
9812
12
    peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
9813
12
                                                             DYNAMIC_TYPE_TLSX);
9814
12
    if (peerX448Key == NULL) {
9815
1
        WOLFSSL_MSG("PeerEccKey Memory error");
9816
1
        return MEMORY_ERROR;
9817
1
    }
9818
11
    ret = wc_curve448_init(peerX448Key);
9819
11
    if (ret != 0) {
9820
0
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9821
0
        return ret;
9822
0
    }
9823
#ifdef WOLFSSL_DEBUG_TLS
9824
    WOLFSSL_MSG("Peer Curve448 Key");
9825
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9826
#endif
9827
9828
11
    if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9829
11
                                                    EC448_LITTLE_ENDIAN) != 0) {
9830
3
        ret = ECC_PEERKEY_ERROR;
9831
3
        WOLFSSL_ERROR_VERBOSE(ret);
9832
3
    }
9833
9834
11
    if (ret == 0) {
9835
8
        if (wc_curve448_import_public_ex(keyShareEntry->ke,
9836
8
                                              keyShareEntry->keLen, peerX448Key,
9837
8
                                              EC448_LITTLE_ENDIAN) != 0) {
9838
0
            ret = ECC_PEERKEY_ERROR;
9839
0
            WOLFSSL_ERROR_VERBOSE(ret);
9840
0
        }
9841
8
    }
9842
9843
11
    if (ret == 0) {
9844
8
        ssl->ecdhCurveOID = ECC_X448_OID;
9845
9846
8
        ret = wc_curve448_shared_secret_ex(key, peerX448Key,
9847
8
                    ssOutput, ssOutSz, EC448_LITTLE_ENDIAN);
9848
8
    }
9849
9850
11
    wc_curve448_free(peerX448Key);
9851
11
    XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9852
11
    wc_curve448_free((curve448_key*)keyShareEntry->key);
9853
11
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9854
11
    keyShareEntry->key = NULL;
9855
11
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9856
11
    keyShareEntry->ke = NULL;
9857
#else
9858
    (void)ssl;
9859
    (void)keyShareEntry;
9860
    (void)ssOutput;
9861
    (void)ssOutSz;
9862
9863
    ret = PEER_KEY_ERROR;
9864
    WOLFSSL_ERROR_VERBOSE(ret);
9865
#endif /* HAVE_CURVE448 */
9866
9867
11
    return ret;
9868
11
}
9869
9870
/* Process the X448 key share extension on the client side.
9871
 *
9872
 * ssl            The SSL/TLS object.
9873
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9874
 * returns 0 on success and other values indicate failure.
9875
 */
9876
static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9877
12
{
9878
12
    return TLSX_KeyShare_ProcessX448_ex(ssl, keyShareEntry,
9879
12
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9880
12
}
9881
9882
/* Process the ECC key share extension on the client side.
9883
 *
9884
 * ssl            The SSL/TLS object.
9885
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9886
 * ssOutput       The destination buffer for the shared secret.
9887
 * ssOutSz        The size of the generated shared secret.
9888
 *
9889
 * returns 0 on success and other values indicate failure.
9890
 */
9891
static int TLSX_KeyShare_ProcessEcc_ex(WOLFSSL* ssl,
9892
                                       KeyShareEntry* keyShareEntry,
9893
                                       unsigned char* ssOutput,
9894
                                       word32* ssOutSz)
9895
{
9896
    int ret = 0;
9897
#ifdef HAVE_ECC
9898
    int curveId = ECC_CURVE_INVALID;
9899
    ecc_key* eccKey = (ecc_key*)keyShareEntry->key;
9900
9901
    /* find supported curve */
9902
    switch (keyShareEntry->group) {
9903
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
9904
        #ifndef NO_ECC_SECP
9905
        case WOLFSSL_ECC_SECP256R1:
9906
            curveId = ECC_SECP256R1;
9907
            break;
9908
        #endif /* !NO_ECC_SECP */
9909
        #ifdef WOLFSSL_SM2
9910
        case WOLFSSL_ECC_SM2P256V1:
9911
            curveId = ECC_SM2P256V1;
9912
            break;
9913
        #endif /* WOLFSSL_SM2 */
9914
        #ifdef HAVE_ECC_BRAINPOOL
9915
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
9916
            curveId = ECC_BRAINPOOLP256R1;
9917
            break;
9918
        #endif /* HAVE_ECC_BRAINPOOL */
9919
    #endif
9920
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
9921
        #ifndef NO_ECC_SECP
9922
        case WOLFSSL_ECC_SECP384R1:
9923
            curveId = ECC_SECP384R1;
9924
            break;
9925
        #endif /* !NO_ECC_SECP */
9926
        #ifdef HAVE_ECC_BRAINPOOL
9927
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
9928
            curveId = ECC_BRAINPOOLP384R1;
9929
            break;
9930
        #endif /* HAVE_ECC_BRAINPOOL */
9931
    #endif
9932
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
9933
        #ifdef HAVE_ECC_BRAINPOOL
9934
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
9935
            curveId = ECC_BRAINPOOLP512R1;
9936
            break;
9937
        #endif /* HAVE_ECC_BRAINPOOL */
9938
    #endif
9939
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
9940
        #ifndef NO_ECC_SECP
9941
        case WOLFSSL_ECC_SECP521R1:
9942
            curveId = ECC_SECP521R1;
9943
            break;
9944
        #endif /* !NO_ECC_SECP */
9945
    #endif
9946
    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
9947
        case WOLFSSL_ECC_X448:
9948
            curveId = ECC_X448;
9949
            break;
9950
    #endif
9951
        default:
9952
            /* unsupported curve */
9953
            WOLFSSL_ERROR_VERBOSE(ECC_PEERKEY_ERROR);
9954
            return ECC_PEERKEY_ERROR;
9955
    }
9956
9957
#ifdef WOLFSSL_ASYNC_CRYPT
9958
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9959
#endif
9960
    {
9961
    #ifdef WOLFSSL_DEBUG_TLS
9962
        WOLFSSL_MSG("Peer ECC Key");
9963
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9964
    #endif
9965
9966
        if (ssl->peerEccKey != NULL) {
9967
            wc_ecc_free(ssl->peerEccKey);
9968
            XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9969
            ssl->peerEccKeyPresent = 0;
9970
        }
9971
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
9972
        ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry);
9973
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
9974
            return ret;
9975
        }
9976
        ret = 0;
9977
#endif
9978
9979
        ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
9980
                                            DYNAMIC_TYPE_ECC);
9981
        if (ssl->peerEccKey == NULL) {
9982
            WOLFSSL_MSG("PeerEccKey Memory error");
9983
            ret = MEMORY_ERROR;
9984
        }
9985
9986
        if (ret == 0) {
9987
            ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
9988
        }
9989
9990
        /* Point is validated by import function. */
9991
        if (ret == 0) {
9992
#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
9993
            ret = wc_ecc_import_x963_ex2(keyShareEntry->ke,
9994
                keyShareEntry->keLen, ssl->peerEccKey, curveId, 1);
9995
#else
9996
            /* FIPS has validation define on. */
9997
            ret = wc_ecc_import_x963_ex(keyShareEntry->ke,
9998
                keyShareEntry->keLen, ssl->peerEccKey, curveId);
9999
#endif
10000
            if (ret != 0) {
10001
                ret = ECC_PEERKEY_ERROR;
10002
                WOLFSSL_ERROR_VERBOSE(ret);
10003
            }
10004
        }
10005
10006
        if (ret == 0) {
10007
            ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
10008
            ssl->peerEccKeyPresent = 1;
10009
        }
10010
    }
10011
10012
    if (ret == 0 && eccKey == NULL)
10013
        ret = BAD_FUNC_ARG;
10014
    if (ret == 0) {
10015
        ret = EccSharedSecret(ssl, eccKey, ssl->peerEccKey,
10016
            keyShareEntry->ke, &keyShareEntry->keLen,
10017
            ssOutput, ssOutSz, ssl->options.side);
10018
    #ifdef WOLFSSL_ASYNC_CRYPT
10019
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
10020
            return ret;
10021
    #endif
10022
    }
10023
10024
    /* done with key share, release resources */
10025
    if (ssl->peerEccKey != NULL
10026
    #ifdef HAVE_PK_CALLBACKS
10027
        && ssl->ctx->EccSharedSecretCb == NULL
10028
    #endif
10029
    ) {
10030
        wc_ecc_free(ssl->peerEccKey);
10031
        XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
10032
        ssl->peerEccKey = NULL;
10033
        ssl->peerEccKeyPresent = 0;
10034
    }
10035
    if (eccKey != NULL) {
10036
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
10037
        defined(WC_ASYNC_ENABLE_ECC)
10038
        if (eccKey->nb_ctx != NULL) {
10039
            XFREE(eccKey->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
10040
        }
10041
    #endif
10042
        wc_ecc_free(eccKey);
10043
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_ECC);
10044
        keyShareEntry->key = NULL;
10045
    }
10046
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10047
    keyShareEntry->ke = NULL;
10048
#else
10049
    (void)ssl;
10050
    (void)keyShareEntry;
10051
    (void)ssOutput;
10052
    (void)ssOutSz;
10053
10054
    ret = PEER_KEY_ERROR;
10055
    WOLFSSL_ERROR_VERBOSE(ret);
10056
#endif /* HAVE_ECC */
10057
10058
    return ret;
10059
}
10060
10061
/* Process the ECC key share extension on the client side.
10062
 *
10063
 * ssl            The SSL/TLS object.
10064
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10065
 * returns 0 on success and other values indicate failure.
10066
 */
10067
static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
10068
76
{
10069
76
    return TLSX_KeyShare_ProcessEcc_ex(ssl, keyShareEntry,
10070
76
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
10071
76
}
10072
10073
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
10074
/* Process the ML-KEM key share extension on the client side.
10075
 *
10076
 * ssl            The SSL/TLS object.
10077
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10078
 * ssOutput       The destination buffer for the shared secret.
10079
 * ssOutSz        The size of the generated shared secret.
10080
 *
10081
 * returns 0 on success and other values indicate failure.
10082
 */
10083
static int TLSX_KeyShare_ProcessPqcClient_ex(WOLFSSL* ssl,
10084
                                             KeyShareEntry* keyShareEntry,
10085
                                             unsigned char* ssOutput,
10086
                                             word32* ssOutSz)
10087
0
{
10088
0
    int       ret = 0;
10089
0
    MlKemKey* kem = (MlKemKey*)keyShareEntry->key;
10090
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10091
0
    word32    privSz = 0;
10092
0
#endif
10093
0
    word32    ctSz = 0;
10094
0
    word32    ssSz = 0;
10095
10096
0
    if (ssl->options.side == WOLFSSL_SERVER_END) {
10097
        /* I am the server, the shared secret has already been generated and
10098
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
10099
0
        return 0;
10100
0
    }
10101
10102
0
    if (keyShareEntry->ke == NULL) {
10103
0
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
10104
0
        return BAD_FUNC_ARG;
10105
0
    }
10106
0
    if (ssOutSz == NULL)
10107
0
        return BAD_FUNC_ARG;
10108
10109
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10110
0
    if (kem == NULL) {
10111
0
        int type = 0;
10112
10113
        /* Allocate an ML-KEM key to hold private key. */
10114
0
        kem = (MlKemKey*) XMALLOC(sizeof(MlKemKey), ssl->heap,
10115
0
                                  DYNAMIC_TYPE_PRIVATE_KEY);
10116
0
        if (kem == NULL) {
10117
0
            WOLFSSL_MSG("GenPqcKey memory error");
10118
0
            ret = MEMORY_E;
10119
0
        }
10120
0
        if (ret == 0) {
10121
0
            ret = mlkem_id2type(keyShareEntry->group, &type);
10122
0
        }
10123
0
        if (ret != 0) {
10124
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10125
0
            ret = BAD_FUNC_ARG;
10126
0
        }
10127
0
        if (ret == 0) {
10128
0
            ret = wc_MlKemKey_Init(kem, type, ssl->heap, ssl->devId);
10129
0
            if (ret != 0) {
10130
0
                WOLFSSL_MSG("Error creating ML-KEM key");
10131
0
            }
10132
0
        }
10133
0
    }
10134
#else
10135
    if (kem == NULL || keyShareEntry->privKeyLen != 0) {
10136
        WOLFSSL_MSG("Invalid ML-KEM key.");
10137
        ret = BAD_FUNC_ARG;
10138
    }
10139
#endif
10140
10141
0
    if (ret == 0) {
10142
0
        ret = wc_MlKemKey_SharedSecretSize(kem, &ssSz);
10143
0
    }
10144
0
    if (ret == 0) {
10145
0
        ret = wc_MlKemKey_CipherTextSize(kem, &ctSz);
10146
0
    }
10147
10148
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10149
0
    if (ret == 0) {
10150
0
        ret = wc_MlKemKey_PrivateKeySize(kem, &privSz);
10151
0
    }
10152
0
    if (ret == 0 && privSz != keyShareEntry->privKeyLen) {
10153
0
        WOLFSSL_MSG("Invalid private key size.");
10154
0
        ret = BAD_FUNC_ARG;
10155
0
    }
10156
0
    if (ret == 0) {
10157
0
        PRIVATE_KEY_UNLOCK();
10158
0
        ret = wc_MlKemKey_DecodePrivateKey(kem, keyShareEntry->privKey, privSz);
10159
0
        PRIVATE_KEY_LOCK();
10160
0
    }
10161
0
#endif
10162
10163
0
    if (ret == 0 && keyShareEntry->keLen < ctSz) {
10164
0
        WOLFSSL_MSG("PQC key share data too short for ciphertext.");
10165
0
        ret = BUFFER_E;
10166
0
    }
10167
0
    if (ret == 0) {
10168
0
        PRIVATE_KEY_UNLOCK();
10169
0
        ret = wc_MlKemKey_Decapsulate(kem, ssOutput,
10170
0
                                      keyShareEntry->ke, ctSz);
10171
0
        PRIVATE_KEY_LOCK();
10172
0
        if (ret != 0) {
10173
0
            WOLFSSL_MSG("wc_MlKemKey decapsulation failure.");
10174
0
            ret = BAD_FUNC_ARG;
10175
0
        }
10176
0
    }
10177
0
    if (ret == 0) {
10178
0
        *ssOutSz = ssSz;
10179
0
    }
10180
10181
0
    wc_MlKemKey_Free(kem);
10182
10183
0
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10184
0
    keyShareEntry->key = NULL;
10185
10186
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10187
0
    keyShareEntry->ke = NULL;
10188
10189
0
    return ret;
10190
0
}
10191
10192
/* Process the ML-KEM key share extension on the client side.
10193
 *
10194
 * ssl            The SSL/TLS object.
10195
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10196
 *
10197
 * returns 0 on success and other values indicate failure.
10198
 */
10199
static int TLSX_KeyShare_ProcessPqcClient(WOLFSSL* ssl,
10200
                                          KeyShareEntry* keyShareEntry)
10201
0
{
10202
0
    return TLSX_KeyShare_ProcessPqcClient_ex(ssl, keyShareEntry,
10203
0
                                             ssl->arrays->preMasterSecret,
10204
0
                                             &ssl->arrays->preMasterSz);
10205
0
}
10206
10207
/* Process the hybrid key share extension on the client side.
10208
 *
10209
 * ssl            The SSL/TLS object.
10210
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10211
 * returns 0 on success and other values indicate failure.
10212
 */
10213
static int TLSX_KeyShare_ProcessPqcHybridClient(WOLFSSL* ssl,
10214
                                                KeyShareEntry* keyShareEntry)
10215
1
{
10216
1
    int      ret = 0;
10217
1
    int      pqc_group = 0;
10218
1
    int      ecc_group = 0;
10219
1
    int      pqc_first = 0;
10220
1
    KeyShareEntry* pqc_kse = NULL;
10221
1
    KeyShareEntry *ecc_kse = NULL;
10222
1
    word32   ctSz = 0;
10223
1
    word32   ssSzPqc = 0;
10224
10225
1
    if (ssl->options.side == WOLFSSL_SERVER_END) {
10226
        /* I am the server, the shared secret has already been generated and
10227
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
10228
0
        return 0;
10229
0
    }
10230
10231
1
    if (keyShareEntry->ke == NULL) {
10232
0
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
10233
0
        return BAD_FUNC_ARG;
10234
0
    }
10235
10236
    /* I am the client, both the PQC ciphertext and the ECHD public key are in
10237
     * keyShareEntry->ke */
10238
10239
    /* Determine the ECC and PQC group of the hybrid combination */
10240
1
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
10241
1
    if (ecc_group == 0 || pqc_group == 0) {
10242
0
        WOLFSSL_MSG("Invalid hybrid group");
10243
0
        ret = BAD_FUNC_ARG;
10244
0
    }
10245
10246
1
    if (ret == 0) {
10247
1
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
10248
1
                   DYNAMIC_TYPE_TLSX);
10249
1
        if (ecc_kse == NULL) {
10250
0
            WOLFSSL_MSG("kse memory allocation failure");
10251
0
            ret = MEMORY_ERROR;
10252
0
        }
10253
1
        else {
10254
1
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
10255
1
        }
10256
1
    }
10257
1
    if (ret == 0) {
10258
1
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
10259
1
                   DYNAMIC_TYPE_TLSX);
10260
1
        if (pqc_kse == NULL) {
10261
0
            WOLFSSL_MSG("kse memory allocation failure");
10262
0
            ret = MEMORY_ERROR;
10263
0
        }
10264
1
        else {
10265
1
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
10266
1
        }
10267
1
    }
10268
10269
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
10270
     * decode these sizes to separate the KEM ciphertext from the ECDH public
10271
     * key. */
10272
1
    if (ret == 0) {
10273
1
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10274
1
        int type;
10275
10276
1
        pqc_kse->privKey = keyShareEntry->privKey;
10277
10278
1
        ret = mlkem_id2type(pqc_group, &type);
10279
1
        if (ret != 0) {
10280
0
            WOLFSSL_MSG("Invalid ML-KEM algorithm specified.");
10281
0
            ret = BAD_FUNC_ARG;
10282
0
        }
10283
1
        if (ret == 0) {
10284
1
            pqc_kse->key = XMALLOC(sizeof(MlKemKey), ssl->heap,
10285
1
                                DYNAMIC_TYPE_PRIVATE_KEY);
10286
1
            if (pqc_kse->key == NULL) {
10287
0
                WOLFSSL_MSG("GenPqcKey memory error");
10288
0
                ret = MEMORY_E;
10289
0
            }
10290
1
        }
10291
1
        if (ret == 0) {
10292
1
            ret = wc_MlKemKey_Init((MlKemKey*)pqc_kse->key, type,
10293
1
                                   ssl->heap, ssl->devId);
10294
1
            if (ret != 0) {
10295
0
                WOLFSSL_MSG("Error creating ML-KEM key");
10296
0
            }
10297
1
        }
10298
    #else
10299
        pqc_kse->key = keyShareEntry->privKey;
10300
    #endif
10301
10302
1
        pqc_kse->group = pqc_group;
10303
1
        pqc_kse->privKeyLen = keyShareEntry->privKeyLen;
10304
10305
1
        if (ret == 0) {
10306
1
            ret = wc_MlKemKey_SharedSecretSize((MlKemKey*)pqc_kse->key,
10307
1
                                               &ssSzPqc);
10308
1
        }
10309
1
        if (ret == 0) {
10310
1
            ret = wc_MlKemKey_CipherTextSize((MlKemKey*)pqc_kse->key,
10311
1
                                             &ctSz);
10312
1
            if (ret == 0 && keyShareEntry->keLen <= ctSz) {
10313
1
                WOLFSSL_MSG("Invalid ciphertext size.");
10314
1
                ret = BAD_FUNC_ARG;
10315
1
            }
10316
1
        }
10317
1
        if (ret == 0) {
10318
0
            pqc_kse->keLen = ctSz;
10319
0
            pqc_kse->ke = (byte*)XMALLOC(pqc_kse->keLen, ssl->heap,
10320
0
                                         DYNAMIC_TYPE_PUBLIC_KEY);
10321
0
            if (pqc_kse->ke == NULL) {
10322
0
                WOLFSSL_MSG("pqc_kse memory allocation failure");
10323
0
                ret = MEMORY_ERROR;
10324
0
            }
10325
            /* Copy the PQC KEM ciphertext. Depending on the pqc_first flag,
10326
             * the KEM ciphertext comes before or after the ECDH public key. */
10327
0
            if (ret == 0) {
10328
0
                int offset = keyShareEntry->keLen - ctSz;
10329
10330
0
                if (pqc_first)
10331
0
                    offset = 0;
10332
10333
0
                XMEMCPY(pqc_kse->ke, keyShareEntry->ke + offset, ctSz);
10334
0
            }
10335
0
        }
10336
1
    }
10337
10338
1
    if (ret == 0) {
10339
0
        ecc_kse->group = ecc_group;
10340
0
        ecc_kse->keLen = keyShareEntry->keLen - ctSz;
10341
0
        ecc_kse->key = keyShareEntry->key;
10342
0
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
10343
0
                                        DYNAMIC_TYPE_PUBLIC_KEY);
10344
0
        if (ecc_kse->ke == NULL) {
10345
0
            WOLFSSL_MSG("ecc_kse memory allocation failure");
10346
0
            ret = MEMORY_ERROR;
10347
0
        }
10348
        /* Copy the ECDH public key. Depending on the pqc_first flag, the
10349
         * KEM ciphertext comes before or after the ECDH public key. */
10350
0
        if (ret == 0) {
10351
0
            int offset = 0;
10352
10353
0
            if (pqc_first)
10354
0
                offset = ctSz;
10355
10356
0
            XMEMCPY(ecc_kse->ke, keyShareEntry->ke + offset, ecc_kse->keLen);
10357
0
        }
10358
    #ifdef WOLFSSL_ASYNC_CRYPT
10359
        ecc_kse->lastRet = keyShareEntry->lastRet;
10360
    #endif
10361
0
    }
10362
10363
    /* Process ECDH key share part. The generated shared secret is directly
10364
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
10365
     * pqc_first flag, the ECDH shared secret part goes before or after the
10366
     * KEM part. */
10367
1
    if (ret == 0) {
10368
0
        int offset = 0;
10369
10370
0
        if (pqc_first)
10371
0
            offset = ssSzPqc;
10372
10373
0
    #ifdef HAVE_CURVE25519
10374
0
        if (ecc_group == WOLFSSL_ECC_X25519) {
10375
0
            ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
10376
0
                    ssl->arrays->preMasterSecret + offset,
10377
0
                    &ssl->arrays->preMasterSz);
10378
0
        }
10379
0
        else
10380
0
    #endif
10381
0
    #ifdef HAVE_CURVE448
10382
0
        if (ecc_group == WOLFSSL_ECC_X448) {
10383
0
            ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
10384
0
                    ssl->arrays->preMasterSecret + offset,
10385
0
                    &ssl->arrays->preMasterSz);
10386
0
        }
10387
0
        else
10388
0
    #endif
10389
0
        {
10390
0
            ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
10391
0
                    ssl->arrays->preMasterSecret + offset,
10392
0
                    &ssl->arrays->preMasterSz);
10393
0
        }
10394
10395
    #ifdef WOLFSSL_ASYNC_CRYPT
10396
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10397
            keyShareEntry->lastRet = WC_PENDING_E;
10398
            /* Prevent freeing of the ECC and ML-KEM private keys */
10399
            ecc_kse->key = NULL;
10400
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10401
            pqc_kse->privKey = NULL;
10402
        #else
10403
            pqc_kse->key = NULL;
10404
        #endif
10405
        }
10406
        else
10407
    #endif
10408
0
        {
10409
            /* Re-sync keyShareEntry->key with ecc_kse->key. ecc_kse->key was
10410
             * aliased to keyShareEntry->key above. The inner Process*_ex
10411
             * either ran its end-of-function cleanup and set ecc_kse->key
10412
             * to NULL (so the outer pointer must also become NULL to avoid
10413
             * UAF/double-free in TLSX_KeyShare_FreeAll), or returned early
10414
             * before cleanup with ecc_kse->key still pointing at the live
10415
             * key (so the outer pointer must keep that pointer for later
10416
             * freeing). Mirroring whatever the inner left in ecc_kse->key
10417
             * handles both cases correctly. */
10418
0
            keyShareEntry->key = ecc_kse->key;
10419
0
        }
10420
0
    }
10421
10422
1
    if (ret == 0) {
10423
0
        if ((ssl->arrays->preMasterSz + ssSzPqc) > ENCRYPT_LEN) {
10424
0
            WOLFSSL_MSG("shared secret is too long.");
10425
0
            ret = LENGTH_ERROR;
10426
0
        }
10427
0
    }
10428
10429
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
10430
     * KEM shared secret part goes before or after the ECDH part. */
10431
1
    if (ret == 0) {
10432
0
        int offset = ssl->arrays->preMasterSz;
10433
10434
0
        if (pqc_first)
10435
0
            offset = 0;
10436
10437
0
        ret = TLSX_KeyShare_ProcessPqcClient_ex(ssl, pqc_kse,
10438
0
                ssl->arrays->preMasterSecret + offset, &ssSzPqc);
10439
0
    }
10440
10441
1
    if (ret == 0) {
10442
0
        keyShareEntry->privKey = (byte*)pqc_kse->key;
10443
10444
0
        ssl->arrays->preMasterSz += ssSzPqc;
10445
0
    }
10446
1
    else
10447
#ifdef WOLFSSL_ASYNC_CRYPT
10448
        if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
10449
#endif
10450
1
    {
10451
        /* Clear the pre master secret buffer to prevent leaking any
10452
         * intermediate keys in the error case. Do not use preMasterSz
10453
         * here as it may already been set to the ECC shared secret size,
10454
         * which would be too small due to the PQC offset case. */
10455
1
        ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
10456
10457
        /* Prevent FreeAll from freeing pointers owned by keyShareEntry. */
10458
1
        if (ecc_kse != NULL)
10459
1
            ecc_kse->key = NULL;
10460
1
        if (pqc_kse != NULL) {
10461
1
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10462
1
            pqc_kse->privKey = NULL;
10463
        #else
10464
            pqc_kse->key = NULL;
10465
        #endif
10466
1
        }
10467
1
    }
10468
10469
1
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
10470
1
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
10471
10472
1
    return ret;
10473
1
}
10474
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_DECAPSULATE */
10475
10476
/* Process the key share extension on the client side.
10477
 *
10478
 * ssl            The SSL/TLS object.
10479
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10480
 * returns 0 on success and other values indicate failure.
10481
 */
10482
static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
10483
{
10484
    int ret;
10485
10486
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
10487
    keyShareEntry->session = ssl->session->namedGroup;
10488
    ssl->session->namedGroup = keyShareEntry->group;
10489
#endif
10490
    /* reset the pre master secret size */
10491
    if (ssl->arrays->preMasterSz == 0)
10492
        ssl->arrays->preMasterSz = ENCRYPT_LEN;
10493
10494
    /* Use Key Share Data from server. */
10495
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(keyShareEntry->group))
10496
        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
10497
    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
10498
        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
10499
    else if (keyShareEntry->group == WOLFSSL_ECC_X448)
10500
        ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
10501
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
10502
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group))
10503
        ret = TLSX_KeyShare_ProcessPqcClient(ssl, keyShareEntry);
10504
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(keyShareEntry->group))
10505
        ret = TLSX_KeyShare_ProcessPqcHybridClient(ssl, keyShareEntry);
10506
#endif
10507
    else
10508
        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
10509
10510
#ifdef WOLFSSL_DEBUG_TLS
10511
    if (ret == 0) {
10512
        WOLFSSL_MSG("KE Secret");
10513
        WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
10514
    }
10515
#endif
10516
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
10517
    keyShareEntry->derived = (ret == 0);
10518
#endif
10519
#ifdef WOLFSSL_ASYNC_CRYPT
10520
    keyShareEntry->lastRet = ret;
10521
#endif
10522
10523
    return ret;
10524
}
10525
10526
/* Parse an entry of the KeyShare extension.
10527
 *
10528
 * ssl     The SSL/TLS object.
10529
 * input   The extension data.
10530
 * length  The length of the extension data.
10531
 * kse     The new key share entry object.
10532
 * returns a positive number to indicate amount of data parsed and a negative
10533
 * number on error.
10534
 */
10535
static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
10536
            word16 length, KeyShareEntry **kse, word16* seenGroups,
10537
            int* seenGroupsCnt, TLSX** extensions)
10538
2.35k
{
10539
2.35k
    int    ret;
10540
2.35k
    word16 group;
10541
2.35k
    word16 keLen;
10542
2.35k
    int    offset = 0;
10543
2.35k
    byte*  ke;
10544
2.35k
    int    i;
10545
10546
2.35k
    if (length < OPAQUE16_LEN + OPAQUE16_LEN)
10547
22
        return BUFFER_ERROR;
10548
    /* Named group */
10549
2.33k
    ato16(&input[offset], &group);
10550
2.33k
    offset += OPAQUE16_LEN;
10551
    /* Key exchange data - public key. */
10552
2.33k
    ato16(&input[offset], &keLen);
10553
2.33k
    offset += OPAQUE16_LEN;
10554
2.33k
    if (keLen == 0)
10555
16
        return BUFFER_ERROR;
10556
2.31k
    if (keLen > length - offset)
10557
98
        return BUFFER_ERROR;
10558
10559
2.21k
    if (seenGroups != NULL) {
10560
2.21k
        if (*seenGroupsCnt >= MAX_KEYSHARE_NAMED_GROUPS) {
10561
1
            return BAD_KEY_SHARE_DATA;
10562
1
        }
10563
3.31k
        for (i = 0; i < *seenGroupsCnt; i++) {
10564
1.11k
            if (seenGroups[i] == group) {
10565
11
                return BAD_KEY_SHARE_DATA;
10566
11
            }
10567
1.11k
        }
10568
2.20k
        seenGroups[i] = group;
10569
2.20k
        *seenGroupsCnt = i + 1;
10570
2.20k
    }
10571
10572
    /* Store a copy in the key share object. */
10573
2.20k
    ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10574
2.20k
    if (ke == NULL)
10575
18
        return MEMORY_E;
10576
2.18k
    XMEMCPY(ke, &input[offset], keLen);
10577
10578
    /* Populate a key share object in the extension. */
10579
2.18k
    ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
10580
2.18k
    if (ret != 0) {
10581
11
        XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10582
11
        return ret;
10583
11
    }
10584
10585
    /* Total length of the parsed data. */
10586
2.17k
    return offset + keLen;
10587
2.18k
}
10588
10589
/* Searches the groups sent for the specified named group.
10590
 *
10591
 * ssl    SSL/TLS object.
10592
 * name   Group name to match.
10593
 * returns 1 when the extension has the group name and 0 otherwise.
10594
 */
10595
static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
10596
517
{
10597
517
    TLSX*          extension;
10598
517
    KeyShareEntry* list;
10599
10600
517
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
10601
517
    if (extension == NULL) {
10602
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
10603
0
        if (extension == NULL)
10604
0
            return 0;
10605
0
    }
10606
10607
517
    list = (KeyShareEntry*)extension->data;
10608
1.01k
    while (list != NULL) {
10609
517
        if (list->group == group)
10610
17
            return 1;
10611
500
        list = list->next;
10612
500
    }
10613
10614
500
    return 0;
10615
517
}
10616
10617
10618
/* Searches the supported groups extension for the specified named group.
10619
 *
10620
 * ssl   The SSL/TLS object.
10621
 * name  The group name to match.
10622
 * returns 1 when the extension has the group name and 0 otherwise.
10623
 */
10624
static int TLSX_SupportedGroups_Find(const WOLFSSL* ssl, word16 name,
10625
                                     TLSX* extensions)
10626
1.98k
{
10627
1.98k
#ifdef HAVE_SUPPORTED_CURVES
10628
1.98k
    TLSX*          extension;
10629
1.98k
    SupportedCurve* curve = NULL;
10630
10631
1.98k
    if ((extension = TLSX_Find(extensions, TLSX_SUPPORTED_GROUPS)) == NULL) {
10632
0
        if ((extension = TLSX_Find(ssl->ctx->extensions,
10633
0
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
10634
0
            return 0;
10635
0
        }
10636
0
    }
10637
10638
7.90k
    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
10639
7.40k
        if (curve->name == name)
10640
1.48k
            return 1;
10641
7.40k
    }
10642
501
#endif
10643
10644
501
    (void)ssl;
10645
501
    (void)name;
10646
10647
501
    return 0;
10648
1.98k
}
10649
10650
int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl,
10651
        const byte* input, word16 length, TLSX** extensions)
10652
1.94k
{
10653
1.94k
    int ret;
10654
1.94k
    int    offset = 0;
10655
1.94k
    word16 len;
10656
1.94k
    TLSX*  extension;
10657
1.94k
    word16 seenGroups[MAX_KEYSHARE_NAMED_GROUPS];
10658
1.94k
    int    seenGroupsCnt = 0;
10659
10660
    /* Add a KeyShare extension if it doesn't exist even if peer sent no
10661
     * entries. The presence of this extension signals that the peer can be
10662
     * negotiated with. */
10663
1.94k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10664
1.94k
    if (extension == NULL) {
10665
        /* Push new KeyShare extension. */
10666
1.93k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10667
1.93k
        if (ret != 0)
10668
6
            return ret;
10669
1.93k
    }
10670
10671
1.93k
    if (length < OPAQUE16_LEN)
10672
20
        return BUFFER_ERROR;
10673
10674
    /* ClientHello contains zero or more key share entries. Limits extension
10675
     * length to 2^16-1 and subtracting 4 bytes for header size per RFC 8446 */
10676
1.91k
    ato16(input, &len);
10677
1.91k
    if ((len != length - OPAQUE16_LEN) ||
10678
1.88k
         length > (MAX_EXT_DATA_LEN - HELLO_EXT_SZ)) {
10679
34
        return BUFFER_ERROR;
10680
34
    }
10681
1.88k
    offset += OPAQUE16_LEN;
10682
10683
4.05k
    while (offset < (int)length) {
10684
2.33k
        ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset],
10685
2.33k
                length - (word16)offset, NULL, seenGroups, &seenGroupsCnt,
10686
2.33k
                extensions);
10687
2.33k
        if (ret < 0)
10688
165
            return ret;
10689
10690
2.17k
        offset += ret;
10691
2.17k
    }
10692
10693
1.71k
    return 0;
10694
1.88k
}
10695
10696
/* Parse the KeyShare extension.
10697
 * Different formats in different messages.
10698
 *
10699
 * ssl      The SSL/TLS object.
10700
 * input    The extension data.
10701
 * length   The length of the extension data.
10702
 * msgType  The type of the message this extension is being parsed from.
10703
 * returns 0 on success and other values indicate failure.
10704
 */
10705
int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10706
                               byte msgType)
10707
2.01k
{
10708
2.01k
    int ret = 0;
10709
2.01k
    KeyShareEntry *keyShareEntry = NULL;
10710
2.01k
    word16 group;
10711
10712
2.01k
    if (msgType == client_hello) {
10713
1.48k
        ret = TLSX_KeyShare_Parse_ClientHello(ssl, input, length,
10714
1.48k
                                              &ssl->extensions);
10715
1.48k
    }
10716
526
    else if (msgType == server_hello) {
10717
37
        int len;
10718
10719
37
        if (length < OPAQUE16_LEN)
10720
2
            return BUFFER_ERROR;
10721
10722
35
        ssl->options.shSentKeyShare = 1;
10723
10724
        /* The data is the named group the server wants to use. */
10725
35
        ato16(input, &group);
10726
10727
        /* Check the selected group was supported by ClientHello extensions. */
10728
35
        if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10729
3
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10730
3
            return BAD_KEY_SHARE_DATA;
10731
3
        }
10732
10733
        /* Check if the group was sent. */
10734
32
        if (!TLSX_KeyShare_Find(ssl, group)) {
10735
17
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10736
17
            return BAD_KEY_SHARE_DATA;
10737
17
        }
10738
10739
        /* ServerHello contains one key share entry. */
10740
15
        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry, NULL,
10741
15
                NULL, &ssl->extensions);
10742
15
        if (len != (int)length)
10743
14
            return BUFFER_ERROR;
10744
10745
        /* Not in list sent if there isn't a private key. */
10746
1
        if (keyShareEntry == NULL || (keyShareEntry->key == NULL
10747
0
        #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
10748
0
            && keyShareEntry->privKey == NULL
10749
1
        #endif
10750
1
        )) {
10751
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10752
0
            return BAD_KEY_SHARE_DATA;
10753
0
        }
10754
10755
        /* Process the entry to calculate the secret. */
10756
1
        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
10757
1
        if (ret == 0)
10758
0
            ssl->session->namedGroup = ssl->namedGroup = group;
10759
1
    }
10760
489
    else if (msgType == hello_retry_request) {
10761
489
        if (length != OPAQUE16_LEN)
10762
2
            return BUFFER_ERROR;
10763
10764
487
        ssl->options.hrrSentKeyShare = 1;
10765
10766
        /* The data is the named group the server wants to use. */
10767
487
        ato16(input, &group);
10768
10769
    #ifdef WOLFSSL_ASYNC_CRYPT
10770
        /* only perform find and clear TLSX if not returning from async */
10771
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
10772
    #endif
10773
487
        {
10774
            /* Check the selected group was supported by ClientHello extensions.
10775
             */
10776
487
            if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10777
2
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10778
2
                return BAD_KEY_SHARE_DATA;
10779
2
            }
10780
10781
            /* Make sure KeyShare for server requested group was not sent in
10782
             * ClientHello. */
10783
485
            if (TLSX_KeyShare_Find(ssl, group)) {
10784
2
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10785
2
                return BAD_KEY_SHARE_DATA;
10786
2
            }
10787
10788
            /* Clear out unusable key shares. */
10789
483
            ret = TLSX_KeyShare_Empty(ssl);
10790
483
            if (ret != 0)
10791
0
                return ret;
10792
483
        }
10793
10794
483
        ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
10795
483
        if (ret == 0)
10796
215
            ssl->session->namedGroup = ssl->namedGroup = group;
10797
483
    }
10798
0
    else {
10799
        /* Not a message type that is allowed to have this extension. */
10800
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10801
0
        return SANITY_MSG_E;
10802
0
    }
10803
10804
1.96k
    return ret;
10805
2.01k
}
10806
10807
/* Create a new key share entry and put it into the list.
10808
 *
10809
 * list           The linked list of key share entries.
10810
 * group          The named group.
10811
 * heap           The memory to allocate with.
10812
 * keyShareEntry  The new key share entry object.
10813
 * returns 0 on success and other values indicate failure.
10814
 */
10815
static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
10816
                             KeyShareEntry** keyShareEntry)
10817
7.71k
{
10818
7.71k
    KeyShareEntry* kse;
10819
7.71k
    KeyShareEntry** next;
10820
10821
7.71k
    kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
10822
7.71k
                                  DYNAMIC_TYPE_TLSX);
10823
7.71k
    if (kse == NULL)
10824
27
        return MEMORY_E;
10825
10826
7.68k
    XMEMSET(kse, 0, sizeof(*kse));
10827
7.68k
    kse->group = (word16)group;
10828
10829
    /* Add it to the back and maintain the links. */
10830
8.72k
    while (*list != NULL) {
10831
        /* Assign to temporary to work around compiler bug found by customer. */
10832
1.04k
        next = &((*list)->next);
10833
1.04k
        list = next;
10834
1.04k
    }
10835
7.68k
    *list = kse;
10836
7.68k
    *keyShareEntry = kse;
10837
10838
7.68k
    (void)heap;
10839
10840
7.68k
    return 0;
10841
7.71k
}
10842
10843
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
10844
/* Process the ML-KEM key share extension on the server side.
10845
 *
10846
 * ssl            The SSL/TLS object.
10847
 * keyShareEntry  The key share entry object to be sent to the client.
10848
 * data           The key share data received from the client.
10849
 * len            The length of the key share data from the client.
10850
 * ssOutput       The destination buffer for the shared secret.
10851
 * ssOutSz        The size of the generated shared secret.
10852
 *
10853
 * returns 0 on success and other values indicate failure.
10854
 */
10855
static int TLSX_KeyShare_HandlePqcKeyServer(WOLFSSL* ssl,
10856
    KeyShareEntry* keyShareEntry, byte* clientData, word16 clientLen,
10857
    unsigned char* ssOutput, word32* ssOutSz)
10858
0
{
10859
    /* We are on the server side. The key share contains a PQC KEM public key
10860
     * that we are using for an encapsulate operation. The resulting ciphertext
10861
     * is stored in the server key share. */
10862
0
    MlKemKey* kemKey = (MlKemKey*)keyShareEntry->key;
10863
0
    byte* ciphertext = NULL;
10864
0
    int ret = 0;
10865
0
    word32 pubSz = 0;
10866
0
    word32 ctSz = 0;
10867
0
    word32 ssSz = 0;
10868
10869
0
    if (clientData == NULL) {
10870
0
        WOLFSSL_MSG("No KEM public key from the client.");
10871
0
        return BAD_FUNC_ARG;
10872
0
    }
10873
10874
0
    if (kemKey == NULL) {
10875
0
        int type = 0;
10876
10877
        /* Allocate an ML-KEM key to hold private key. */
10878
0
        kemKey = (MlKemKey*) XMALLOC(sizeof(MlKemKey), ssl->heap,
10879
0
                                     DYNAMIC_TYPE_PRIVATE_KEY);
10880
0
        if (kemKey == NULL) {
10881
0
            WOLFSSL_MSG("GenPqcKey memory error");
10882
0
            ret = MEMORY_E;
10883
0
        }
10884
0
        if (ret == 0) {
10885
0
            ret = mlkem_id2type(keyShareEntry->group, &type);
10886
0
        }
10887
0
        if (ret != 0) {
10888
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10889
0
            ret = BAD_FUNC_ARG;
10890
0
        }
10891
0
        if (ret == 0) {
10892
0
            ret = wc_MlKemKey_Init(kemKey, type, ssl->heap, ssl->devId);
10893
0
            if (ret != 0) {
10894
0
                WOLFSSL_MSG("Error creating ML-KEM key");
10895
0
            }
10896
0
        }
10897
0
    }
10898
10899
0
    if (ret == 0) {
10900
0
        ret = wc_MlKemKey_PublicKeySize(kemKey, &pubSz);
10901
0
    }
10902
0
    if (ret == 0) {
10903
0
        ret = wc_MlKemKey_CipherTextSize(kemKey, &ctSz);
10904
0
    }
10905
0
    if (ret == 0) {
10906
0
        ret = wc_MlKemKey_SharedSecretSize(kemKey, &ssSz);
10907
0
    }
10908
10909
0
    if (ret == 0 && clientLen != pubSz) {
10910
0
        WOLFSSL_MSG("Invalid public key.");
10911
0
        ret = BAD_FUNC_ARG;
10912
0
    }
10913
10914
0
    if (ret == 0) {
10915
0
        ciphertext = (byte*)XMALLOC(ctSz, ssl->heap, DYNAMIC_TYPE_TLSX);
10916
10917
0
        if (ciphertext == NULL) {
10918
0
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10919
0
            ret = MEMORY_E;
10920
0
        }
10921
0
    }
10922
10923
0
    if (ret == 0) {
10924
0
        ret = wc_MlKemKey_DecodePublicKey(kemKey, clientData, pubSz);
10925
0
    }
10926
0
    if (ret == 0) {
10927
0
        ret = wc_MlKemKey_Encapsulate(kemKey, ciphertext,
10928
0
                                      ssOutput, ssl->rng);
10929
0
        if (ret != 0) {
10930
0
            WOLFSSL_MSG("wc_MlKemKey encapsulation failure.");
10931
0
        }
10932
0
    }
10933
10934
0
    if (ret == 0) {
10935
0
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10936
10937
0
        *ssOutSz = ssSz;
10938
0
        keyShareEntry->ke = NULL;
10939
0
        keyShareEntry->keLen = 0;
10940
10941
0
        XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10942
0
        keyShareEntry->pubKey = ciphertext;
10943
0
        keyShareEntry->pubKeyLen = ctSz;
10944
0
        ciphertext = NULL;
10945
10946
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
10947
         * the server side. */
10948
0
        ssl->namedGroup = keyShareEntry->group;
10949
0
    }
10950
10951
0
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
10952
10953
0
    wc_MlKemKey_Free(kemKey);
10954
0
    XFREE(kemKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10955
0
    keyShareEntry->key = NULL;
10956
0
    return ret;
10957
0
}
10958
10959
int TLSX_KeyShare_HandlePqcHybridKeyServer(WOLFSSL* ssl,
10960
    KeyShareEntry* keyShareEntry, byte* data, word16 len)
10961
0
{
10962
    /* I am the server. The data parameter is the concatenation of the client's
10963
     * ECDH public key and the KEM public key. I need to generate a matching
10964
     * public key for ECDH and encapsulate a shared secret using the KEM public
10965
     * key. We send the ECDH public key and the KEM ciphertext back to the
10966
     * client. Additionally, we create the ECDH shared secret here already.
10967
     */
10968
0
    int    type;
10969
0
    byte*  ciphertext = NULL;
10970
0
    int    ret = 0;
10971
0
    int    pqc_group = 0;
10972
0
    int    ecc_group = 0;
10973
0
    int    pqc_first = 0;
10974
0
    KeyShareEntry *ecc_kse = NULL;
10975
0
    KeyShareEntry *pqc_kse = NULL;
10976
0
    word32 pubSz = 0;
10977
0
    word32 ctSz = 0;
10978
0
    word32 ssSzPqc = 0;
10979
10980
0
    if (data == NULL) {
10981
0
        WOLFSSL_MSG("No hybrid key share data from the client.");
10982
0
        return BAD_FUNC_ARG;
10983
0
    }
10984
10985
    /* Determine the ECC and PQC group of the hybrid combination */
10986
0
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
10987
0
    if (ecc_group == 0 || pqc_group == 0) {
10988
0
        WOLFSSL_MSG("Invalid hybrid group");
10989
0
        ret = BAD_FUNC_ARG;
10990
0
    }
10991
10992
0
    if (ret == 0) {
10993
0
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
10994
0
                   DYNAMIC_TYPE_TLSX);
10995
0
        if (ecc_kse == NULL) {
10996
0
            WOLFSSL_MSG("kse memory allocation failure");
10997
0
            ret = MEMORY_ERROR;
10998
0
        }
10999
0
    }
11000
0
    if (ret == 0) {
11001
0
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
11002
0
        ecc_kse->group = ecc_group;
11003
11004
0
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
11005
0
                   DYNAMIC_TYPE_TLSX);
11006
0
        if (pqc_kse == NULL) {
11007
0
            WOLFSSL_MSG("kse memory allocation failure");
11008
0
            ret = MEMORY_ERROR;
11009
0
        }
11010
0
    }
11011
0
    if (ret == 0) {
11012
0
        XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
11013
0
        pqc_kse->group = pqc_group;
11014
0
    }
11015
11016
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
11017
     * decode these sizes to properly concatenate the KEM ciphertext with the
11018
     * ECDH public key. */
11019
0
    if (ret == 0) {
11020
        /* Allocate an ML-KEM key to hold private key. */
11021
0
        pqc_kse->key = (MlKemKey*) XMALLOC(sizeof(MlKemKey), ssl->heap,
11022
0
                                           DYNAMIC_TYPE_PRIVATE_KEY);
11023
0
        if (pqc_kse->key == NULL) {
11024
0
            WOLFSSL_MSG("GenPqcKey memory error");
11025
0
            ret = MEMORY_E;
11026
0
        }
11027
0
        if (ret == 0) {
11028
0
            ret = mlkem_id2type(pqc_kse->group, &type);
11029
0
        }
11030
0
        if (ret != 0) {
11031
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
11032
0
            ret = BAD_FUNC_ARG;
11033
0
        }
11034
0
        if (ret == 0) {
11035
0
            ret = wc_MlKemKey_Init((MlKemKey*)pqc_kse->key, type,
11036
0
                                   ssl->heap, ssl->devId);
11037
0
            if (ret != 0) {
11038
0
                WOLFSSL_MSG("Error creating ML-KEM key");
11039
0
            }
11040
0
        }
11041
0
        if (ret == 0) {
11042
0
            ret = wc_MlKemKey_SharedSecretSize((MlKemKey*)pqc_kse->key,
11043
0
                                               &ssSzPqc);
11044
0
        }
11045
0
        if (ret == 0) {
11046
0
            ret = wc_MlKemKey_CipherTextSize((MlKemKey*)pqc_kse->key,
11047
0
                                             &ctSz);
11048
0
        }
11049
0
        if (ret == 0) {
11050
0
            ret = wc_MlKemKey_PublicKeySize((MlKemKey*)pqc_kse->key,
11051
0
                                            &pubSz);
11052
0
        }
11053
0
    }
11054
11055
#ifdef WOLFSSL_ASYNC_CRYPT
11056
    if (ret == 0) {
11057
        /* Restore ECC state from a prior suspended pass. This is not gated on
11058
         * a still-pending lastRet: the async layer clears lastRet to 0 on
11059
         * completion, which would skip the restore and regenerate the key. */
11060
        if (keyShareEntry->key != NULL && keyShareEntry->keyLen > 0) {
11061
            ecc_kse->key = keyShareEntry->key;
11062
            ecc_kse->keyLen = keyShareEntry->keyLen;
11063
            ecc_kse->pubKey = keyShareEntry->pubKey;
11064
            ecc_kse->pubKeyLen = keyShareEntry->pubKeyLen;
11065
            ecc_kse->lastRet = keyShareEntry->lastRet;
11066
            keyShareEntry->key = NULL;
11067
            keyShareEntry->pubKey = NULL;
11068
        }
11069
    }
11070
#endif
11071
11072
    /* Generate the ECDH key share part to be sent to the client */
11073
0
    if (ret == 0 && ecc_group != 0 && ecc_kse->pubKey == NULL) {
11074
0
    #ifdef HAVE_CURVE25519
11075
0
        if (ecc_group == WOLFSSL_ECC_X25519) {
11076
0
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
11077
0
        }
11078
0
        else
11079
0
    #endif
11080
0
    #ifdef HAVE_CURVE448
11081
0
        if (ecc_group == WOLFSSL_ECC_X448) {
11082
0
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
11083
0
        }
11084
0
        else
11085
0
    #endif
11086
0
        {
11087
0
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
11088
0
        }
11089
    #ifdef WOLFSSL_ASYNC_CRYPT
11090
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11091
            /* Store the generated ECC key in the provided kse to later
11092
             * restore it.*/
11093
            keyShareEntry->key = ecc_kse->key;
11094
            keyShareEntry->keyLen = ecc_kse->keyLen;
11095
            keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen;
11096
            keyShareEntry->lastRet = WC_PENDING_E;
11097
            ecc_kse->key = NULL;
11098
        }
11099
        else if (ret == 0 &&
11100
                 keyShareEntry->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11101
            keyShareEntry->lastRet = 0;
11102
            ecc_kse->lastRet = 0;
11103
        }
11104
    #endif
11105
0
    }
11106
11107
0
    if (ret == 0 && len != pubSz + ecc_kse->pubKeyLen) {
11108
0
        WOLFSSL_MSG("Invalid public key.");
11109
0
        ret = BAD_FUNC_ARG;
11110
0
    }
11111
11112
    /* Allocate buffer for the concatenated client key share data
11113
     * (PQC KEM ciphertext + ECDH public key) */
11114
0
    if (ret == 0) {
11115
0
        ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap,
11116
0
            DYNAMIC_TYPE_TLSX);
11117
11118
0
        if (ciphertext == NULL) {
11119
0
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
11120
0
            ret = MEMORY_E;
11121
0
        }
11122
0
    }
11123
11124
    /* Process ECDH key share part. The generated shared secret is directly
11125
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
11126
     * pqc_first flag, the ECDH shared secret part goes before or after the
11127
     * KEM part. */
11128
0
    if (ret == 0) {
11129
0
        ecc_kse->keLen = len - pubSz;
11130
0
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
11131
0
                                     DYNAMIC_TYPE_PUBLIC_KEY);
11132
0
        if (ecc_kse->ke == NULL) {
11133
0
            WOLFSSL_MSG("ecc_kse memory allocation failure");
11134
0
            ret = MEMORY_ERROR;
11135
0
        }
11136
0
        if (ret == 0) {
11137
0
            int pubOffset = 0;
11138
0
            int ssOffset = 0;
11139
11140
0
            if (pqc_first) {
11141
0
                pubOffset = pubSz;
11142
0
                ssOffset = ssSzPqc;
11143
0
            }
11144
11145
0
            XMEMCPY(ecc_kse->ke, data + pubOffset, ecc_kse->keLen);
11146
11147
0
        #ifdef HAVE_CURVE25519
11148
0
            if (ecc_group == WOLFSSL_ECC_X25519) {
11149
0
                ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
11150
0
                        ssl->arrays->preMasterSecret + ssOffset,
11151
0
                        &ssl->arrays->preMasterSz);
11152
0
            }
11153
0
            else
11154
0
        #endif
11155
0
        #ifdef HAVE_CURVE448
11156
0
            if (ecc_group == WOLFSSL_ECC_X448) {
11157
0
                ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
11158
0
                        ssl->arrays->preMasterSecret + ssOffset,
11159
0
                        &ssl->arrays->preMasterSz);
11160
0
            }
11161
0
            else
11162
0
        #endif
11163
0
            {
11164
0
                ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
11165
0
                        ssl->arrays->preMasterSecret + ssOffset,
11166
0
                        &ssl->arrays->preMasterSz);
11167
0
            }
11168
0
        }
11169
0
        if (ret == 0) {
11170
0
            if (ssl->arrays->preMasterSz != ecc_kse->keyLen) {
11171
0
                WOLFSSL_MSG("Data length mismatch.");
11172
0
                ret = BAD_FUNC_ARG;
11173
0
            }
11174
0
        }
11175
    #ifdef WOLFSSL_ASYNC_CRYPT
11176
        else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11177
            keyShareEntry->lastRet = WC_PENDING_E;
11178
            keyShareEntry->key = ecc_kse->key;
11179
            keyShareEntry->keyLen = ecc_kse->keyLen;
11180
            keyShareEntry->pubKey = ecc_kse->pubKey;
11181
            keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen;
11182
            ecc_kse->key = NULL;
11183
            ecc_kse->pubKey = NULL;
11184
        }
11185
    #endif
11186
0
    }
11187
11188
0
    if (ret == 0 && ssl->arrays->preMasterSz + ssSzPqc > ENCRYPT_LEN) {
11189
0
        WOLFSSL_MSG("shared secret is too long.");
11190
0
        ret = LENGTH_ERROR;
11191
0
    }
11192
11193
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
11194
     * KEM shared secret part goes before or after the ECDH part. */
11195
0
    if (ret == 0) {
11196
0
        int input_offset = ecc_kse->keLen;
11197
0
        int output_offset = ssl->arrays->preMasterSz;
11198
11199
0
        if (pqc_first) {
11200
0
            input_offset = 0;
11201
0
            output_offset = 0;
11202
0
        }
11203
11204
0
        ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, pqc_kse,
11205
0
                data + input_offset, pubSz,
11206
0
                ssl->arrays->preMasterSecret + output_offset, &ssSzPqc);
11207
0
    }
11208
11209
0
    if (ret == 0) {
11210
0
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11211
11212
0
        ssl->arrays->preMasterSz += ssSzPqc;
11213
0
        keyShareEntry->ke = NULL;
11214
0
        keyShareEntry->keLen = 0;
11215
    #ifdef WOLFSSL_ASYNC_CRYPT
11216
        /* Hybrid encapsulation is fully complete here. Clear the pending
11217
         * state so the TLS_ASYNC_VERIFY re-drive is skipped and does not
11218
         * re-enter this handler with the now-freed ke. */
11219
        keyShareEntry->lastRet = 0;
11220
    #endif
11221
11222
        /* Concatenate the ECDH public key and the PQC KEM ciphertext. Based on
11223
         * the pqc_first flag, the ECDH public key goes before or after the KEM
11224
         * ciphertext. */
11225
0
        if (pqc_first) {
11226
0
            XMEMCPY(ciphertext, pqc_kse->pubKey, ctSz);
11227
0
            XMEMCPY(ciphertext + ctSz, ecc_kse->pubKey, ecc_kse->pubKeyLen);
11228
0
        }
11229
0
        else {
11230
0
            XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen);
11231
0
            XMEMCPY(ciphertext + ecc_kse->pubKeyLen, pqc_kse->pubKey, ctSz);
11232
0
        }
11233
11234
0
        XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11235
0
        keyShareEntry->pubKey = ciphertext;
11236
0
        keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen + ctSz;
11237
0
        ciphertext = NULL;
11238
11239
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
11240
         * the server side. */
11241
0
        ssl->namedGroup = keyShareEntry->group;
11242
0
    }
11243
0
    else
11244
#ifdef WOLFSSL_ASYNC_CRYPT
11245
        if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
11246
#endif
11247
0
    {
11248
        /* Clear the pre master secret buffer to prevent leaking any
11249
         * intermediate keys in the error case. Do not use preMasterSz
11250
         * here as it may already been set to the ECC shared secret size,
11251
         * which would be too small due to the PQC offset case. */
11252
0
        ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
11253
0
    }
11254
11255
0
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
11256
0
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
11257
0
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
11258
0
    return ret;
11259
0
}
11260
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_ENCAPSULATE */
11261
11262
/* Use the data to create a new key share object in the extensions.
11263
 *
11264
 * ssl    The SSL/TLS object.
11265
 * group  The named group.
11266
 * len    The length of the public key data.
11267
 * data   The public key data.
11268
 * kse    The new key share entry object.
11269
 * returns 0 on success and other values indicate failure.
11270
 */
11271
int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
11272
                      KeyShareEntry **kse, TLSX** extensions)
11273
6.52k
{
11274
6.52k
    int            ret = 0;
11275
6.52k
    TLSX*          extension;
11276
6.52k
    KeyShareEntry* keyShareEntry = NULL;
11277
11278
    /* Find the KeyShare extension if it exists. */
11279
6.52k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11280
6.52k
    if (extension == NULL) {
11281
        /* Push new KeyShare extension. */
11282
3.81k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11283
3.81k
        if (ret != 0)
11284
1
            return ret;
11285
11286
3.81k
        extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11287
3.81k
        if (extension == NULL)
11288
0
            return MEMORY_E;
11289
3.81k
    }
11290
6.52k
    extension->resp = 0;
11291
11292
    /* Try to find the key share entry with this group. */
11293
6.52k
    keyShareEntry = (KeyShareEntry*)extension->data;
11294
7.58k
    while (keyShareEntry != NULL) {
11295
    #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
11296
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
11297
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
11298
                keyShareEntry->group == WOLFSSL_SECP256R1MLKEM512) ||
11299
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
11300
                keyShareEntry->group == WOLFSSL_SECP384R1MLKEM768) ||
11301
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
11302
                keyShareEntry->group == WOLFSSL_SECP521R1MLKEM1024)) {
11303
            keyShareEntry->group = group;
11304
            break;
11305
        }
11306
        else
11307
    #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
11308
1.10k
        if (keyShareEntry->group == group)
11309
44
            break;
11310
1.06k
        keyShareEntry = keyShareEntry->next;
11311
1.06k
    }
11312
11313
    /* Create a new key share entry if not found. */
11314
6.52k
    if (keyShareEntry == NULL) {
11315
6.47k
        ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
11316
6.47k
                                ssl->heap, &keyShareEntry);
11317
6.47k
        if (ret != 0)
11318
12
            return ret;
11319
6.47k
    }
11320
11321
6.51k
    if (data != NULL) {
11322
        /* Store the peer data in the key share object. */
11323
2.17k
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11324
2.17k
        keyShareEntry->ke = data;
11325
2.17k
        keyShareEntry->keLen = len;
11326
2.17k
    }
11327
4.33k
    else {
11328
        /* Generate a key pair. Casting to non-const since changes inside are
11329
         * minimal but would require an extensive redesign to refactor. Also
11330
         * this path shouldn't be taken when parsing a ClientHello in stateless
11331
         * mode. */
11332
4.33k
        ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, keyShareEntry);
11333
4.33k
        if (ret != 0)
11334
321
            return ret;
11335
4.33k
    }
11336
11337
6.19k
    if (kse != NULL)
11338
3
        *kse = keyShareEntry;
11339
11340
6.19k
    return 0;
11341
6.51k
}
11342
11343
/* Set an empty Key Share extension.
11344
 *
11345
 * ssl  The SSL/TLS object.
11346
 * returns 0 on success and other values indicate failure.
11347
 */
11348
int TLSX_KeyShare_Empty(WOLFSSL* ssl)
11349
2.55k
{
11350
2.55k
    int   ret = 0;
11351
2.55k
    TLSX* extension;
11352
11353
    /* Find the KeyShare extension if it exists. */
11354
2.55k
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11355
2.55k
    if (extension == NULL) {
11356
        /* Push new KeyShare extension. */
11357
0
        ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11358
0
    }
11359
2.55k
    else if (extension->data != NULL) {
11360
2.55k
        TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
11361
2.55k
        extension->data = NULL;
11362
2.55k
    }
11363
11364
2.55k
    return ret;
11365
2.55k
}
11366
11367
/* Compile-time gating must stay aligned with TLSX_PopulateSupportedGroups().
11368
 * Runtime-only conditions in that function (TLS 1.3 version check, FFDHE
11369
 * key-size bounds, session-resumption short-circuit, downgrade-aware
11370
 * Brainpool TLS 1.2 selection) are intentionally not represented here. */
11371
static const word16 preferredGroup[] = {
11372
    /* Sort by strength, but prefer non-experimental PQ/T hybrid groups */
11373
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11374
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS)
11375
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
11376
        ECC_MIN_KEY_SZ <= 256
11377
    WOLFSSL_X25519MLKEM768,
11378
    #endif
11379
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11380
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11381
        ECC_MIN_KEY_SZ <= 384
11382
    WOLFSSL_SECP384R1MLKEM1024,
11383
    #endif
11384
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11385
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11386
        ECC_MIN_KEY_SZ <= 256
11387
    WOLFSSL_SECP256R1MLKEM768,
11388
    #endif
11389
#endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && !WOLFSSL_NO_ML_KEM &&
11390
        * WOLFSSL_PQC_HYBRIDS */
11391
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11392
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_1024) && \
11393
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11394
    WOLFSSL_ML_KEM_1024,
11395
#endif
11396
#if defined(HAVE_ECC) && (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
11397
    !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
11398
    WOLFSSL_ECC_SECP521R1,
11399
#endif
11400
#if defined(HAVE_ECC) && (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && \
11401
    defined(HAVE_ECC_BRAINPOOL) && ECC_MIN_KEY_SZ <= 512
11402
    WOLFSSL_ECC_BRAINPOOLP512R1TLS13,
11403
    WOLFSSL_ECC_BRAINPOOLP512R1,
11404
#endif
11405
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11406
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_768) && \
11407
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11408
    WOLFSSL_ML_KEM_768,
11409
#endif
11410
#if defined(HAVE_ECC) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11411
    ECC_MIN_KEY_SZ <= 384
11412
    #ifndef NO_ECC_SECP
11413
    WOLFSSL_ECC_SECP384R1,
11414
    #endif
11415
    #ifdef HAVE_ECC_BRAINPOOL
11416
    WOLFSSL_ECC_BRAINPOOLP384R1TLS13,
11417
    WOLFSSL_ECC_BRAINPOOLP384R1,
11418
    #endif
11419
#endif
11420
#if !defined(HAVE_FIPS) && defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11421
    WOLFSSL_ECC_X448,
11422
#endif
11423
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11424
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_512) && \
11425
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11426
    WOLFSSL_ML_KEM_512,
11427
#endif
11428
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11429
    ECC_MIN_KEY_SZ <= 256
11430
    #ifndef NO_ECC_SECP
11431
    WOLFSSL_ECC_SECP256R1,
11432
    #endif
11433
    #ifdef HAVE_ECC_KOBLITZ
11434
    WOLFSSL_ECC_SECP256K1,
11435
    #endif
11436
    #ifdef HAVE_ECC_BRAINPOOL
11437
    WOLFSSL_ECC_BRAINPOOLP256R1TLS13,
11438
    WOLFSSL_ECC_BRAINPOOLP256R1,
11439
    #endif
11440
    #if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
11441
    WOLFSSL_ECC_SM2P256V1,
11442
    #endif
11443
#endif
11444
#if !defined(HAVE_FIPS) && defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11445
    WOLFSSL_ECC_X25519,
11446
#endif
11447
#if defined(HAVE_ECC) && (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && \
11448
    ECC_MIN_KEY_SZ <= 224
11449
    #ifndef NO_ECC_SECP
11450
    WOLFSSL_ECC_SECP224R1,
11451
    #endif
11452
    #ifdef HAVE_ECC_KOBLITZ
11453
    WOLFSSL_ECC_SECP224K1,
11454
    #endif
11455
#endif
11456
#if !defined(HAVE_FIPS) && defined(HAVE_ECC)
11457
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && \
11458
        ECC_MIN_KEY_SZ <= 192
11459
        #ifndef NO_ECC_SECP
11460
        WOLFSSL_ECC_SECP192R1,
11461
        #endif
11462
        #ifdef HAVE_ECC_KOBLITZ
11463
        WOLFSSL_ECC_SECP192K1,
11464
        #endif
11465
    #endif
11466
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && \
11467
        ECC_MIN_KEY_SZ <= 160
11468
        #ifndef NO_ECC_SECP
11469
        WOLFSSL_ECC_SECP160R1,
11470
        #endif
11471
        #ifdef HAVE_ECC_SECPR2
11472
        WOLFSSL_ECC_SECP160R2,
11473
        #endif
11474
        #ifdef HAVE_ECC_KOBLITZ
11475
        WOLFSSL_ECC_SECP160K1,
11476
        #endif
11477
    #endif
11478
#endif /* !HAVE_FIPS && HAVE_ECC */
11479
#if defined(HAVE_FFDHE_8192)
11480
    WOLFSSL_FFDHE_8192,
11481
#endif
11482
#if defined(HAVE_FFDHE_6144)
11483
    WOLFSSL_FFDHE_6144,
11484
#endif
11485
#if defined(HAVE_FFDHE_4096)
11486
    WOLFSSL_FFDHE_4096,
11487
#endif
11488
#if defined(HAVE_FFDHE_3072)
11489
    WOLFSSL_FFDHE_3072,
11490
#endif
11491
#if defined(HAVE_FFDHE_2048)
11492
    WOLFSSL_FFDHE_2048,
11493
#endif
11494
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11495
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
11496
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11497
        (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
11498
        ECC_MIN_KEY_SZ <= 521
11499
    WOLFSSL_SECP521R1MLKEM1024,
11500
    #endif
11501
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11502
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11503
        ECC_MIN_KEY_SZ <= 384
11504
    WOLFSSL_SECP384R1MLKEM768,
11505
    #endif
11506
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE448) && \
11507
        ECC_MIN_KEY_SZ <= 448
11508
    WOLFSSL_X448MLKEM768,
11509
    #endif
11510
    #if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_ECC) && \
11511
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11512
        ECC_MIN_KEY_SZ <= 256
11513
    WOLFSSL_SECP256R1MLKEM512,
11514
    #endif
11515
    #if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_CURVE25519) && \
11516
        ECC_MIN_KEY_SZ <= 256
11517
    WOLFSSL_X25519MLKEM512,
11518
    #endif
11519
#endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && !WOLFSSL_NO_ML_KEM &&
11520
        * WOLFSSL_EXTRA_PQC_HYBRIDS */
11521
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11522
    defined(WOLFSSL_MLKEM_KYBER)
11523
    #ifdef WOLFSSL_KYBER1024
11524
    WOLFSSL_KYBER_LEVEL5,
11525
    #if defined(HAVE_ECC) && (defined(HAVE_ECC521) || \
11526
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
11527
    WOLFSSL_P521_KYBER_LEVEL5,
11528
    #endif
11529
    #endif
11530
    #ifdef WOLFSSL_KYBER768
11531
    WOLFSSL_KYBER_LEVEL3,
11532
    #if defined(HAVE_ECC) && (defined(HAVE_ECC384) || \
11533
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
11534
    WOLFSSL_P384_KYBER_LEVEL3,
11535
    #endif
11536
    #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11537
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
11538
    WOLFSSL_P256_KYBER_LEVEL3,
11539
    #endif
11540
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11541
    WOLFSSL_X25519_KYBER_LEVEL3,
11542
    #endif
11543
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11544
    WOLFSSL_X448_KYBER_LEVEL3,
11545
    #endif
11546
    #endif
11547
    #ifdef WOLFSSL_KYBER512
11548
    WOLFSSL_KYBER_LEVEL1,
11549
    #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11550
        defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
11551
    WOLFSSL_P256_KYBER_LEVEL1,
11552
    #endif
11553
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11554
    WOLFSSL_X25519_KYBER_LEVEL1,
11555
    #endif
11556
    #endif
11557
#endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && WOLFSSL_MLKEM_KYBER */
11558
    WOLFSSL_NAMED_GROUP_INVALID
11559
};
11560
11561
#define PREFERRED_GROUP_SZ \
11562
1.52k
    ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
11563
                                            /* -1 for the invalid group */
11564
11565
/* WOLFSSL_KEY_SHARE_DEFAULT_GROUP - group used for the speculative key share
11566
 * in ClientHello messages when the application has not selected one via
11567
 * wolfSSL_CTX_set_groups() / wolfSSL_set_groups() or wolfSSL_UseKeyShare().
11568
 *
11569
 * The default is optimized for the likelihood that the server will accept the
11570
 * speculative key share without forcing a HelloRetryRequest. It therefore
11571
 * differs from preferredGroup[] (which is sorted by strength): we pick the
11572
 * most widely deployed group at each tier rather than the strongest.
11573
 *
11574
 * Selection order when not user-defined:
11575
 *   1. A standardized PQ/T hybrid using X25519 or SECP256R1, if available.
11576
 *   2. SECP256R1, then X25519, then SECP384R1.
11577
 *   3. FFDHE 2048 or 3072, for DH-only TLS 1.3 builds.
11578
 *   4. preferredGroup[0] as a final fallback for any other configuration.
11579
 *
11580
 * Users can override the default by defining WOLFSSL_KEY_SHARE_DEFAULT_GROUP
11581
 * in user_settings.h to any of the WOLFSSL_* group identifiers from
11582
 * wolfssl/ssl.h (or the numeric IANA code point). The macro is substituted
11583
 * directly into an assignment, so wrap non-trivial expressions in parentheses.
11584
 */
11585
#ifndef WOLFSSL_KEY_SHARE_DEFAULT_GROUP
11586
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
11587
      !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11588
      !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
11589
      ECC_MIN_KEY_SZ <= 256
11590
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_X25519MLKEM768
11591
#elif defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
11592
      !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11593
      !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11594
      (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11595
      ECC_MIN_KEY_SZ <= 256
11596
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_SECP256R1MLKEM768
11597
#elif defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
11598
      !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11599
      !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11600
      (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11601
      ECC_MIN_KEY_SZ <= 384
11602
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_SECP384R1MLKEM1024
11603
#elif defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11604
      defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 && \
11605
      !defined(NO_ECC_SECP)
11606
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_SECP256R1
11607
#elif !defined(HAVE_FIPS) && defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11608
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_X25519
11609
#elif defined(HAVE_ECC) && (defined(HAVE_ECC384) || \
11610
      defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 && \
11611
      !defined(NO_ECC_SECP)
11612
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_SECP384R1
11613
#elif defined(HAVE_FFDHE_2048)
11614
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_FFDHE_2048
11615
#elif defined(HAVE_FFDHE_3072)
11616
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_FFDHE_3072
11617
#else
11618
    /* Fall back to whatever preferredGroup[] starts with. */
11619
    #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP (preferredGroup[0])
11620
#endif
11621
#endif /* !WOLFSSL_KEY_SHARE_DEFAULT_GROUP */
11622
11623
/* Examines the application specified group ranking and returns the rank of the
11624
 * group.
11625
 * If no group ranking set then all groups are rank 0 (highest).
11626
 *
11627
 * ssl    The SSL/TLS object.
11628
 * group  The group to check ranking for.
11629
 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
11630
 */
11631
static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
11632
1.52k
{
11633
1.52k
    byte i;
11634
1.52k
    const word16* groups;
11635
1.52k
    byte numGroups;
11636
11637
1.52k
    if (ssl->numGroups == 0) {
11638
        /* If the user didn't specify a group list with a preferred order,
11639
         * use the internal preferred group list. */
11640
1.52k
        groups = preferredGroup;
11641
1.52k
        numGroups = PREFERRED_GROUP_SZ;
11642
1.52k
    }
11643
0
    else {
11644
0
        groups = ssl->group;
11645
0
        numGroups = ssl->numGroups;
11646
0
    }
11647
11648
19.7k
    for (i = 0; i < numGroups; i++) {
11649
#if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
11650
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
11651
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
11652
             groups[i] == WOLFSSL_SECP256R1MLKEM512) ||
11653
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
11654
             groups[i] == WOLFSSL_SECP384R1MLKEM768) ||
11655
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
11656
             groups[i] == WOLFSSL_SECP521R1MLKEM1024)) {
11657
            return i;
11658
        }
11659
#endif
11660
19.7k
        if (groups[i] == (word16)group)
11661
1.52k
            return i;
11662
19.7k
    }
11663
11664
0
    return WOLFSSL_FATAL_ERROR;
11665
1.52k
}
11666
11667
/* Set a key share that is supported by the client into extensions.
11668
 *
11669
 * ssl  The SSL/TLS object.
11670
 * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
11671
 * 0 if a supported group has a key share and other values indicate an error.
11672
 */
11673
int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, TLSX** extensions)
11674
411
{
11675
411
    int             ret;
11676
411
#ifdef HAVE_SUPPORTED_CURVES
11677
411
    TLSX*           extension;
11678
411
    SupportedCurve* curve = NULL;
11679
411
    SupportedCurve* preferredCurve = NULL;
11680
411
    word16          name = WOLFSSL_NAMED_GROUP_INVALID;
11681
411
    KeyShareEntry*  kse = NULL;
11682
411
    int             preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11683
411
    int             rank;
11684
11685
411
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
11686
411
    if (extension != NULL)
11687
411
        curve = (SupportedCurve*)extension->data;
11688
962
    for (; curve != NULL; curve = curve->next) {
11689
        /* Use server's preference order. Common group was found but key share
11690
         * was missing */
11691
551
        if (!TLSX_IsGroupSupported(curve->name, ssl->options.side))
11692
0
            continue;
11693
551
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
11694
0
            continue;
11695
11696
551
        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
11697
551
        if (rank == -1)
11698
0
            continue;
11699
551
        if (rank < preferredRank) {
11700
462
            preferredCurve = curve;
11701
462
            preferredRank = rank;
11702
462
        }
11703
551
    }
11704
411
    curve = preferredCurve;
11705
11706
411
    if (curve == NULL) {
11707
31
        byte i;
11708
        /* Fallback to user selected group */
11709
31
        preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11710
31
        for (i = 0; i < ssl->numGroups; i++) {
11711
0
            rank = TLSX_KeyShare_GroupRank(ssl, ssl->group[i]);
11712
0
            if (rank == -1)
11713
0
                continue;
11714
0
            if (rank < preferredRank) {
11715
0
                name = ssl->group[i];
11716
0
                preferredRank = rank;
11717
0
            }
11718
0
        }
11719
31
        if (name == WOLFSSL_NAMED_GROUP_INVALID) {
11720
            /* No group selected or specified by the server */
11721
31
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11722
31
            return BAD_KEY_SHARE_DATA;
11723
31
        }
11724
31
    }
11725
380
    else {
11726
380
        name = curve->name;
11727
380
    }
11728
11729
    #ifdef WOLFSSL_ASYNC_CRYPT
11730
    /* Check the old key share data list. */
11731
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11732
    if (extension != NULL) {
11733
        kse = (KeyShareEntry*)extension->data;
11734
        /* We should not be computing keys if we are only going to advertise
11735
         * our choice here. */
11736
        if (kse != NULL && kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11737
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11738
            return BAD_KEY_SHARE_DATA;
11739
        }
11740
    }
11741
    #endif
11742
11743
    /* Push new KeyShare extension. This will also free the old one */
11744
380
    ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11745
380
    if (ret != 0)
11746
23
        return ret;
11747
    /* Extension got pushed to head */
11748
357
    extension = *extensions;
11749
    /* Push the selected curve */
11750
357
    ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, name,
11751
357
                            ssl->heap, &kse);
11752
357
    if (ret != 0)
11753
5
        return ret;
11754
    /* Set extension to be in response. */
11755
352
    extension->resp = 1;
11756
#else
11757
11758
    (void)ssl;
11759
11760
    WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN);
11761
    ret = NOT_COMPILED_IN;
11762
#endif
11763
11764
352
    return ret;
11765
357
}
11766
11767
#ifdef WOLFSSL_DUAL_ALG_CERTS
11768
/* Writes the CKS objects of a list in a buffer. */
11769
static word16 CKS_WRITE(WOLFSSL* ssl, byte* output)
11770
{
11771
    XMEMCPY(output, ssl->sigSpec, ssl->sigSpecSz);
11772
    return ssl->sigSpecSz;
11773
}
11774
11775
static int TLSX_UseCKS(TLSX** extensions, WOLFSSL* ssl, void* heap)
11776
{
11777
    int ret = 0;
11778
    TLSX* extension;
11779
11780
    if (extensions == NULL) {
11781
        return BAD_FUNC_ARG;
11782
    }
11783
11784
    extension = TLSX_Find(*extensions, TLSX_CKS);
11785
    /* If it is already present, do nothing. */
11786
    if (extension == NULL) {
11787
        /* The data required is in the ssl struct, so push it in. */
11788
        ret = TLSX_Push(extensions, TLSX_CKS, (void*)ssl, heap);
11789
    }
11790
11791
    return ret;
11792
}
11793
11794
int TLSX_CKS_Set(WOLFSSL* ssl, TLSX** extensions)
11795
{
11796
    int ret;
11797
    TLSX* extension;
11798
    /* Push new KeyShare extension. This will also free the old one */
11799
    ret = TLSX_Push(extensions, TLSX_CKS, NULL, ssl->heap);
11800
    if (ret != 0)
11801
        return ret;
11802
    /* Extension got pushed to head */
11803
    extension = *extensions;
11804
    /* Need ssl->sigSpecSz during extension length calculation. */
11805
    extension->data = ssl;
11806
    /* Set extension to be in response. */
11807
    extension->resp = 1;
11808
    return ret;
11809
}
11810
11811
int TLSX_CKS_Parse(WOLFSSL* ssl, byte* input, word16 length,
11812
                   TLSX** extensions)
11813
{
11814
    int ret;
11815
    int i, j;
11816
11817
    (void) extensions;
11818
11819
    /* Validating the input. */
11820
    if (length == 0)
11821
        return BUFFER_ERROR;
11822
    for (i = 0; i < length; i++) {
11823
        switch (input[i])
11824
        {
11825
            case WOLFSSL_CKS_SIGSPEC_NATIVE:
11826
            case WOLFSSL_CKS_SIGSPEC_ALTERNATIVE:
11827
            case WOLFSSL_CKS_SIGSPEC_BOTH:
11828
                /* These are all valid values; do nothing */
11829
                break;
11830
            case WOLFSSL_CKS_SIGSPEC_EXTERNAL:
11831
            default:
11832
                /* All other values (including external) are not. */
11833
                return BAD_FUNC_ARG;
11834
        }
11835
    }
11836
11837
    /* This could be a situation where the client tried to start with TLS 1.3
11838
     * when it sent ClientHello and the server down-graded to TLS 1.2. In that
11839
     * case, erroring out because it is TLS 1.2 is not a reasonable thing to do.
11840
     * In the case of TLS 1.2, the CKS values will be ignored. */
11841
    if (!IsAtLeastTLSv1_3(ssl->version)) {
11842
        ssl->sigSpec = NULL;
11843
        ssl->sigSpecSz = 0;
11844
        return 0;
11845
    }
11846
11847
    /* Extension data is valid, but if we are the server and we don't have an
11848
     * alt private key, do not respond with CKS extension. */
11849
    if (wolfSSL_is_server(ssl) && ssl->buffers.altKey == NULL) {
11850
        ssl->sigSpec = NULL;
11851
        ssl->sigSpecSz = 0;
11852
        return 0;
11853
    }
11854
11855
    /* Copy as the lifetime of input seems to be ephemeral. */
11856
    ssl->peerSigSpec = (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_TLSX);
11857
    if (ssl->peerSigSpec == NULL) {
11858
        return BUFFER_ERROR;
11859
    }
11860
    XMEMCPY(ssl->peerSigSpec, input, length);
11861
    ssl->peerSigSpecSz = length;
11862
11863
    /* If there is no preference set, use theirs... */
11864
    if (ssl->sigSpec == NULL) {
11865
        ret = wolfSSL_UseCKS(ssl, ssl->peerSigSpec, 1);
11866
        if (ret == WOLFSSL_SUCCESS) {
11867
            ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11868
            TLSX_SetResponse(ssl, TLSX_CKS);
11869
        }
11870
        return ret;
11871
    }
11872
11873
    /* ...otherwise, prioritize our preference. */
11874
    for (i = 0; i < ssl->sigSpecSz; i++) {
11875
        for (j = 0; j < length; j++) {
11876
            if (ssl->sigSpec[i] == input[j]) {
11877
                /* Got the match, set to this one. */
11878
                ret = wolfSSL_UseCKS(ssl, &ssl->sigSpec[i], 1);
11879
                if (ret == WOLFSSL_SUCCESS) {
11880
                    ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11881
                    TLSX_SetResponse(ssl, TLSX_CKS);
11882
                }
11883
                return ret;
11884
            }
11885
        }
11886
    }
11887
11888
    /* No match found. Cannot continue. */
11889
    return MATCH_SUITE_ERROR;
11890
}
11891
#endif /* WOLFSSL_DUAL_ALG_CERTS */
11892
11893
/* Server side KSE processing */
11894
int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
11895
    byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, byte* searched)
11896
{
11897
    TLSX*          extension;
11898
    KeyShareEntry* clientKSE = NULL;
11899
    KeyShareEntry* list = NULL;
11900
    KeyShareEntry* preferredKSE = NULL;
11901
    int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11902
    int rank;
11903
11904
    (void)cipherSuite0;
11905
    (void)cipherSuite;
11906
11907
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11908
        return BAD_FUNC_ARG;
11909
11910
    *searched = 0;
11911
11912
    /* Find the KeyShare extension if it exists. */
11913
    extension = TLSX_Find(extensions, TLSX_KEY_SHARE);
11914
    if (extension != NULL)
11915
        list = (KeyShareEntry*)extension->data;
11916
11917
    if (extension && extension->resp == 1) {
11918
        /* Outside of the async case this path should not be taken. */
11919
        int ret = WC_NO_ERR_TRACE(INCOMPLETE_DATA);
11920
    #ifdef WOLFSSL_ASYNC_CRYPT
11921
        /* in async case make sure key generation is finalized */
11922
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
11923
        if (serverKSE && serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11924
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
11925
                *searched = 1;
11926
            ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11927
        }
11928
        else
11929
    #endif
11930
        {
11931
            ret = INCOMPLETE_DATA;
11932
        }
11933
        return ret;
11934
    }
11935
11936
    /* Use server's preference order. */
11937
    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
11938
        if (clientKSE->ke == NULL)
11939
            continue;
11940
11941
#ifdef WOLFSSL_SM2
11942
        if ((cipherSuite0 == CIPHER_BYTE) &&
11943
            ((cipherSuite == TLS_SM4_GCM_SM3) ||
11944
             (cipherSuite == TLS_SM4_CCM_SM3))) {
11945
           if (clientKSE->group != WOLFSSL_ECC_SM2P256V1) {
11946
               continue;
11947
           }
11948
        }
11949
        else if (clientKSE->group == WOLFSSL_ECC_SM2P256V1) {
11950
           continue;
11951
        }
11952
#endif
11953
11954
        /* Check consistency now - extensions in any order. */
11955
        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions))
11956
            continue;
11957
11958
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(clientKSE->group)) {
11959
            /* Check max value supported. */
11960
            if (clientKSE->group > WOLFSSL_ECC_MAX) {
11961
#ifdef WOLFSSL_HAVE_MLKEM
11962
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) &&
11963
                    !WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group))
11964
#endif
11965
                    continue;
11966
            }
11967
            if (wolfSSL_curve_is_disabled(ssl, clientKSE->group))
11968
                continue;
11969
        }
11970
        if (!TLSX_IsGroupSupported(clientKSE->group, ssl->options.side))
11971
            continue;
11972
11973
        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
11974
        if (rank == -1)
11975
            continue;
11976
        if (rank < preferredRank) {
11977
            preferredKSE = clientKSE;
11978
            preferredRank = rank;
11979
        }
11980
    }
11981
    *kse = preferredKSE;
11982
    *searched = 1;
11983
    return 0;
11984
}
11985
11986
/* Server side KSE processing */
11987
int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
11988
875
{
11989
875
    int            ret;
11990
875
    TLSX*          extension;
11991
875
    KeyShareEntry* serverKSE;
11992
875
    KeyShareEntry* list = NULL;
11993
11994
875
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11995
0
        return BAD_FUNC_ARG;
11996
11997
875
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11998
875
    if (extension == NULL)
11999
0
        return BAD_STATE_E;
12000
12001
875
    if (clientKSE == NULL) {
12002
#ifdef WOLFSSL_ASYNC_CRYPT
12003
        /* Not necessarily an error. The key may have already been setup. */
12004
        if (extension != NULL && extension->resp == 1) {
12005
            serverKSE = (KeyShareEntry*)extension->data;
12006
            if (serverKSE != NULL) {
12007
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
12008
                /* Re-drive server hybrid encapsulation on resume. GenKey
12009
                 * routes a hybrid group to the client generator, and the
12010
                 * lastRet == 0 path treats the share as done after only the
12011
                 * ECDH part completed, dropping the KEM ciphertext. ke holds
12012
                 * the client share until the handler completes and clears it. */
12013
                if (serverKSE->ke != NULL &&
12014
                        WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(serverKSE->group)) {
12015
                    return TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
12016
                            serverKSE, serverKSE->ke, serverKSE->keLen);
12017
                }
12018
#endif
12019
                /* in async case make sure key generation is finalized */
12020
                if (serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E))
12021
                    return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
12022
                else if (serverKSE->lastRet == 0)
12023
                    return 0;
12024
            }
12025
        }
12026
#endif
12027
0
        return BAD_FUNC_ARG;
12028
0
    }
12029
12030
    /* Generate a new key pair except in the case of PQC KEM because we
12031
     * are going to encapsulate and that does not require us to generate a
12032
     * key pair.
12033
     */
12034
875
    ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
12035
875
    if (ret != 0)
12036
10
        return ret;
12037
12038
865
    if (clientKSE->key == NULL) {
12039
865
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
12040
865
        if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) {
12041
0
            ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, serverKSE,
12042
0
                    clientKSE->ke, clientKSE->keLen,
12043
0
                    ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
12044
0
        }
12045
865
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
12046
0
            ret = TLSX_KeyShare_HandlePqcHybridKeyServer(ssl, serverKSE,
12047
0
                    clientKSE->ke, clientKSE->keLen);
12048
0
        }
12049
865
        else
12050
865
#endif
12051
865
        {
12052
865
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
12053
865
        }
12054
12055
        /* for async do setup of serverKSE below, but return WC_PENDING_E */
12056
865
        if (ret != 0
12057
        #ifdef WOLFSSL_ASYNC_CRYPT
12058
            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
12059
        #endif
12060
865
        ) {
12061
234
            TLSX_KeyShare_FreeAll(list, ssl->heap);
12062
234
            return ret;
12063
234
        }
12064
865
    }
12065
0
    else {
12066
        /* transfer buffers to serverKSE */
12067
0
        serverKSE->key = clientKSE->key;
12068
0
        clientKSE->key = NULL;
12069
0
        serverKSE->keyLen = clientKSE->keyLen;
12070
0
        serverKSE->pubKey = clientKSE->pubKey;
12071
0
        clientKSE->pubKey = NULL;
12072
0
        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
12073
0
    #ifndef NO_DH
12074
0
        serverKSE->privKey = clientKSE->privKey;
12075
0
        clientKSE->privKey = NULL;
12076
0
    #endif
12077
0
    }
12078
631
    serverKSE->ke = clientKSE->ke;
12079
631
    serverKSE->keLen = clientKSE->keLen;
12080
631
    clientKSE->ke = NULL;
12081
631
    clientKSE->keLen = 0;
12082
631
    ssl->namedGroup = serverKSE->group;
12083
12084
631
    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
12085
631
    extension->data = (void *)serverKSE;
12086
12087
631
    extension->resp = 1;
12088
631
    return ret;
12089
865
}
12090
12091
/* Ensure there is a key pair that can be used for key exchange.
12092
 *
12093
 * ssl  The SSL/TLS object.
12094
 * doHelloRetry If set to non-zero will do hello_retry
12095
 * returns 0 on success and other values indicate failure.
12096
 */
12097
int TLSX_KeyShare_Establish(WOLFSSL *ssl, int* doHelloRetry)
12098
0
{
12099
0
    int            ret;
12100
0
    KeyShareEntry* clientKSE = NULL;
12101
0
    byte           searched = 0;
12102
12103
0
    *doHelloRetry = 0;
12104
12105
0
    ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, ssl->cipher.cipherSuite0,
12106
0
        ssl->cipher.cipherSuite, &clientKSE, &searched);
12107
0
    if (ret != 0 || !searched)
12108
0
        return ret;
12109
12110
    /* No supported group found - send HelloRetryRequest. */
12111
0
    if (clientKSE == NULL) {
12112
        /* Set KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
12113
0
        *doHelloRetry = 1;
12114
0
        return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
12115
0
    }
12116
12117
0
    return TLSX_KeyShare_Setup(ssl, clientKSE);
12118
0
}
12119
12120
/* Derive the shared secret of the key exchange.
12121
 *
12122
 * ssl  The SSL/TLS object.
12123
 * returns 0 on success and other values indicate failure.
12124
 */
12125
int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
12126
596
{
12127
596
    int            ret;
12128
596
    TLSX*          extension;
12129
596
    KeyShareEntry* list = NULL;
12130
12131
#ifdef WOLFSSL_ASYNC_CRYPT
12132
    ret = wolfSSL_AsyncPop(ssl, NULL);
12133
    /* Check for error */
12134
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) && ret < 0) {
12135
        return ret;
12136
    }
12137
#endif
12138
12139
    /* Find the KeyShare extension if it exists. */
12140
596
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
12141
596
    if (extension != NULL)
12142
596
        list = (KeyShareEntry*)extension->data;
12143
12144
596
    if (list == NULL)
12145
0
        return KEY_SHARE_ERROR;
12146
12147
    /* Calculate secret. */
12148
596
    ret = TLSX_KeyShare_Process(ssl, list);
12149
12150
596
    return ret;
12151
596
}
12152
12153
0
#define KS_FREE_ALL  TLSX_KeyShare_FreeAll
12154
0
#define KS_GET_SIZE  TLSX_KeyShare_GetSize
12155
#define KS_WRITE     TLSX_KeyShare_Write
12156
0
#define KS_PARSE     TLSX_KeyShare_Parse
12157
12158
#else
12159
12160
#define KS_FREE_ALL(a, b) WC_DO_NOTHING
12161
#define KS_GET_SIZE(a, b)    0
12162
#define KS_WRITE(a, b, c)    0
12163
#define KS_PARSE(a, b, c, d) 0
12164
12165
#endif /* WOLFSSL_TLS13 */
12166
12167
/******************************************************************************/
12168
/* Pre-Shared Key                                                             */
12169
/******************************************************************************/
12170
12171
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
12172
/* Free the pre-shared key dynamic data.
12173
 *
12174
 * list  The linked list of key share entry objects.
12175
 * heap  The heap used for allocation.
12176
 */
12177
static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
12178
{
12179
    PreSharedKey* current;
12180
12181
    while ((current = list) != NULL) {
12182
        list = current->next;
12183
        XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
12184
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
12185
    }
12186
12187
    (void)heap;
12188
}
12189
12190
/* Get the size of the encoded pre shared key extension.
12191
 *
12192
 * list     The linked list of pre-shared key extensions.
12193
 * msgType  The type of the message this extension is being written into.
12194
 * returns the number of bytes of the encoded pre-shared key extension or
12195
 * SANITY_MSG_E to indicate invalid message type.
12196
 */
12197
static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
12198
                                     word16* pSz)
12199
{
12200
    if (msgType == client_hello) {
12201
        /* Length of identities + Length of binders. */
12202
        word32 len = OPAQUE16_LEN + OPAQUE16_LEN;
12203
        while (list != NULL) {
12204
            /* Each entry has: identity, ticket age and binder. */
12205
            len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
12206
                   OPAQUE8_LEN + (word32)list->binderLen;
12207
            if (len > WOLFSSL_MAX_16BIT) {
12208
                WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12209
                return LENGTH_ERROR;
12210
            }
12211
            list = list->next;
12212
        }
12213
        if ((word32)*pSz + len > WOLFSSL_MAX_16BIT) {
12214
            WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12215
            return LENGTH_ERROR;
12216
        }
12217
        *pSz += (word16)len;
12218
        return 0;
12219
    }
12220
12221
    if (msgType == server_hello) {
12222
        *pSz += OPAQUE16_LEN;
12223
        return 0;
12224
    }
12225
12226
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12227
    return SANITY_MSG_E;
12228
}
12229
12230
/* The number of bytes to be written for the binders.
12231
 *
12232
 * list     The linked list of pre-shared key extensions.
12233
 * msgType  The type of the message this extension is being written into.
12234
 * returns the number of bytes of the encoded pre-shared key extension or
12235
 * SANITY_MSG_E to indicate invalid message type.
12236
 */
12237
int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
12238
                                     word16* pSz)
12239
{
12240
    word32 len;
12241
12242
    if (msgType != client_hello) {
12243
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12244
        return SANITY_MSG_E;
12245
    }
12246
12247
    /* Length of all binders. */
12248
    len = OPAQUE16_LEN;
12249
    while (list != NULL) {
12250
        len += OPAQUE8_LEN + (word32)list->binderLen;
12251
        if (len > WOLFSSL_MAX_16BIT) {
12252
            WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
12253
            return LENGTH_ERROR;
12254
        }
12255
        list = list->next;
12256
    }
12257
12258
    *pSz = (word16)len;
12259
    return 0;
12260
}
12261
12262
/* Writes the pre-shared key extension into the output buffer - binders only.
12263
 * Assumes that the the output buffer is big enough to hold data.
12264
 *
12265
 * list     The linked list of key share entries.
12266
 * output   The buffer to write into.
12267
 * msgType  The type of the message this extension is being written into.
12268
 * returns the number of bytes written into the buffer.
12269
 */
12270
int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
12271
                                   byte msgType, word16* pSz)
12272
{
12273
    PreSharedKey* current = list;
12274
    word16 idx = 0;
12275
    word16 lenIdx;
12276
    word16 len;
12277
12278
    if (msgType != client_hello) {
12279
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12280
        return SANITY_MSG_E;
12281
    }
12282
12283
    /* Skip length of all binders. */
12284
    lenIdx = idx;
12285
    idx += OPAQUE16_LEN;
12286
    while (current != NULL) {
12287
        /* Binder data length. */
12288
        output[idx++] = (byte)current->binderLen;
12289
        /* Binder data. */
12290
        XMEMCPY(output + idx, current->binder, current->binderLen);
12291
        idx += (word16)current->binderLen;
12292
12293
        current = current->next;
12294
    }
12295
    /* Length of the binders. */
12296
    len = idx - lenIdx - OPAQUE16_LEN;
12297
    c16toa(len, output + lenIdx);
12298
12299
    *pSz = idx;
12300
    return 0;
12301
}
12302
12303
12304
/* Writes the pre-shared key extension into the output buffer.
12305
 * Assumes that the the output buffer is big enough to hold data.
12306
 *
12307
 * list     The linked list of key share entries.
12308
 * output   The buffer to write into.
12309
 * msgType  The type of the message this extension is being written into.
12310
 * returns the number of bytes written into the buffer.
12311
 */
12312
static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
12313
                                   byte msgType, word16* pSz)
12314
{
12315
    if (msgType == client_hello) {
12316
        PreSharedKey* current = list;
12317
        word16 idx = 0;
12318
        word16 lenIdx;
12319
        word16 len;
12320
        int ret;
12321
12322
        /* Write identities only. Binders after HMACing over this. */
12323
        lenIdx = idx;
12324
        idx += OPAQUE16_LEN;
12325
        while (current != NULL) {
12326
            /* Identity length */
12327
            c16toa(current->identityLen, output + idx);
12328
            idx += OPAQUE16_LEN;
12329
            /* Identity data */
12330
            XMEMCPY(output + idx, current->identity, current->identityLen);
12331
            idx += current->identityLen;
12332
12333
            /* Obfuscated ticket age. */
12334
            c32toa(current->ticketAge, output + idx);
12335
            idx += OPAQUE32_LEN;
12336
12337
            current = current->next;
12338
        }
12339
        /* Length of the identities. */
12340
        len = idx - lenIdx - OPAQUE16_LEN;
12341
        c16toa(len, output + lenIdx);
12342
12343
        /* Don't include binders here.
12344
         * The binders are based on the hash of all the ClientHello data up to
12345
         * and include the identities written above.
12346
         */
12347
        ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
12348
        if (ret < 0)
12349
            return ret;
12350
        *pSz += idx + len;
12351
    }
12352
    else if (msgType == server_hello) {
12353
        word16 i;
12354
12355
        /* Find the index of the chosen identity. */
12356
        for (i=0; list != NULL && !list->chosen; i++)
12357
            list = list->next;
12358
        if (list == NULL) {
12359
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
12360
            return BUILD_MSG_ERROR;
12361
        }
12362
12363
        /* The index of the identity chosen by the server from the list supplied
12364
         * by the client.
12365
         */
12366
        c16toa(i, output);
12367
        *pSz += OPAQUE16_LEN;
12368
    }
12369
    else {
12370
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12371
        return SANITY_MSG_E;
12372
    }
12373
12374
    return 0;
12375
}
12376
12377
int TLSX_PreSharedKey_Parse_ClientHello(TLSX** extensions, const byte* input,
12378
                                        word16 length, void* heap)
12379
{
12380
12381
    int    ret;
12382
    word16 len;
12383
    word16 idx = 0;
12384
    TLSX*         extension;
12385
    PreSharedKey* list;
12386
12387
    TLSX_Remove(extensions, TLSX_PRE_SHARED_KEY, heap);
12388
12389
    /* Length of identities and of binders. */
12390
    if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
12391
        return BUFFER_E;
12392
12393
    /* Length of identities. */
12394
    ato16(input + idx, &len);
12395
    idx += OPAQUE16_LEN;
12396
    if (len < MIN_PSK_ID_LEN || length - idx < len)
12397
        return BUFFER_E;
12398
12399
    /* Create a pre-shared key object for each identity. */
12400
    while (len > 0) {
12401
        const byte* identity;
12402
        word16      identityLen;
12403
        word32      age;
12404
12405
        if (len < OPAQUE16_LEN)
12406
            return BUFFER_E;
12407
12408
        /* Length of identity. */
12409
        ato16(input + idx, &identityLen);
12410
        idx += OPAQUE16_LEN;
12411
        if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
12412
                identityLen > MAX_PSK_ID_LEN)
12413
            return BUFFER_E;
12414
        /* Cache identity pointer. */
12415
        identity = input + idx;
12416
        idx += identityLen;
12417
        /* Ticket age. */
12418
        ato32(input + idx, &age);
12419
        idx += OPAQUE32_LEN;
12420
12421
        ret = TLSX_PreSharedKey_Use(extensions, identity, identityLen, age, no_mac,
12422
                                    0, 0, 1, NULL, heap);
12423
        if (ret != 0)
12424
            return ret;
12425
12426
        /* Done with this identity. */
12427
        len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
12428
    }
12429
12430
    /* Find the list of identities sent to server. */
12431
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12432
    if (extension == NULL)
12433
        return PSK_KEY_ERROR;
12434
    list = (PreSharedKey*)extension->data;
12435
12436
    /* Length of binders. */
12437
    if (idx + OPAQUE16_LEN > length)
12438
        return BUFFER_E;
12439
    ato16(input + idx, &len);
12440
    idx += OPAQUE16_LEN;
12441
    if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
12442
        return BUFFER_E;
12443
12444
    /* Set binder for each identity. */
12445
    while (list != NULL && len > 0) {
12446
        /* Length of binder */
12447
        list->binderLen = input[idx++];
12448
        if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
12449
                list->binderLen > WC_MAX_DIGEST_SIZE)
12450
            return BUFFER_E;
12451
        if (len < OPAQUE8_LEN + list->binderLen)
12452
            return BUFFER_E;
12453
12454
        /* Copy binder into static buffer. */
12455
        XMEMCPY(list->binder, input + idx, list->binderLen);
12456
        idx += (word16)list->binderLen;
12457
12458
        /* Done with binder entry. */
12459
        len -= OPAQUE8_LEN + (word16)list->binderLen;
12460
12461
        /* Next identity. */
12462
        list = list->next;
12463
    }
12464
    if (list != NULL || len != 0)
12465
        return BUFFER_E;
12466
12467
    return 0;
12468
12469
}
12470
12471
/* Parse the pre-shared key extension.
12472
 * Different formats in different messages.
12473
 *
12474
 * ssl      The SSL/TLS object.
12475
 * input    The extension data.
12476
 * length   The length of the extension data.
12477
 * msgType  The type of the message this extension is being parsed from.
12478
 * returns 0 on success and other values indicate failure.
12479
 */
12480
static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, const byte* input,
12481
                                   word16 length, byte msgType)
12482
{
12483
12484
    if (msgType == client_hello) {
12485
        return TLSX_PreSharedKey_Parse_ClientHello(&ssl->extensions, input,
12486
                                                   length, ssl->heap);
12487
    }
12488
12489
    if (msgType == server_hello) {
12490
        word16 idx;
12491
        PreSharedKey* list;
12492
        TLSX*         extension;
12493
12494
        /* Index of identity chosen by server. */
12495
        if (length != OPAQUE16_LEN)
12496
            return BUFFER_E;
12497
        ato16(input, &idx);
12498
12499
    #ifdef WOLFSSL_EARLY_DATA
12500
        ssl->options.pskIdIndex = idx + 1;
12501
    #endif
12502
12503
        /* Find the list of identities sent to server. */
12504
        extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
12505
        if (extension == NULL)
12506
            return INCOMPLETE_DATA;
12507
        list = (PreSharedKey*)extension->data;
12508
12509
        /* Mark the identity as chosen. */
12510
        for (; list != NULL && idx > 0; idx--)
12511
            list = list->next;
12512
        if (list == NULL) {
12513
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12514
            return PSK_KEY_ERROR;
12515
        }
12516
        list->chosen = 1;
12517
12518
        if (list->resumption) {
12519
           /* Check that the session's details are the same as the server's. */
12520
           if (ssl->options.cipherSuite0  != ssl->session->cipherSuite0       ||
12521
               ssl->options.cipherSuite   != ssl->session->cipherSuite        ||
12522
               ssl->session->version.major != ssl->ctx->method->version.major ||
12523
               ssl->session->version.minor != ssl->ctx->method->version.minor) {
12524
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12525
               return PSK_KEY_ERROR;
12526
           }
12527
        }
12528
12529
        return 0;
12530
    }
12531
12532
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12533
    return SANITY_MSG_E;
12534
}
12535
12536
/* Create a new pre-shared key and put it into the list.
12537
 *
12538
 * list          The linked list of pre-shared key.
12539
 * identity      The identity.
12540
 * len           The length of the identity data.
12541
 * heap          The memory to allocate with.
12542
 * preSharedKey  The new pre-shared key object.
12543
 * returns 0 on success and other values indicate failure.
12544
 */
12545
static int TLSX_PreSharedKey_New(PreSharedKey** list, const byte* identity,
12546
                                 word16 len, void *heap,
12547
                                 PreSharedKey** preSharedKey)
12548
{
12549
    PreSharedKey* psk;
12550
    PreSharedKey** next;
12551
12552
    psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
12553
    if (psk == NULL)
12554
        return MEMORY_E;
12555
    XMEMSET(psk, 0, sizeof(*psk));
12556
12557
    /* Make a copy of the identity data. */
12558
    psk->identity = (byte*)XMALLOC(len + NULL_TERM_LEN, heap,
12559
                                   DYNAMIC_TYPE_TLSX);
12560
    if (psk->identity == NULL) {
12561
        XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
12562
        return MEMORY_E;
12563
    }
12564
    XMEMCPY(psk->identity, identity, len);
12565
    psk->identityLen = len;
12566
    /* Use a NULL terminator in case it is a C string */
12567
    psk->identity[psk->identityLen] = '\0';
12568
12569
    /* Add it to the end and maintain the links. */
12570
    while (*list != NULL) {
12571
        /* Assign to temporary to work around compiler bug found by customer. */
12572
        next = &((*list)->next);
12573
        list = next;
12574
    }
12575
    *list = psk;
12576
    *preSharedKey = psk;
12577
12578
    (void)heap;
12579
12580
    return 0;
12581
}
12582
12583
static WC_INLINE byte GetHmacLength(int hmac)
12584
{
12585
    switch (hmac) {
12586
    #ifndef NO_SHA256
12587
        case sha256_mac:
12588
            return WC_SHA256_DIGEST_SIZE;
12589
    #endif
12590
    #ifdef WOLFSSL_SHA384
12591
        case sha384_mac:
12592
            return WC_SHA384_DIGEST_SIZE;
12593
    #endif
12594
    #ifdef WOLFSSL_SHA512
12595
        case sha512_mac:
12596
            return WC_SHA512_DIGEST_SIZE;
12597
    #endif
12598
    #ifdef WOLFSSL_SM3
12599
        case sm3_mac:
12600
            return WC_SM3_DIGEST_SIZE;
12601
    #endif
12602
        default:
12603
            break;
12604
    }
12605
    return 0;
12606
}
12607
12608
/* Use the data to create a new pre-shared key object in the extensions.
12609
 *
12610
 * ssl           The SSL/TLS object.
12611
 * identity      The identity.
12612
 * len           The length of the identity data.
12613
 * age           The age of the identity.
12614
 * hmac          The HMAC algorithm.
12615
 * cipherSuite0  The first byte of the cipher suite to use.
12616
 * cipherSuite   The second byte of the cipher suite to use.
12617
 * resumption    The PSK is for resumption of a session.
12618
 * preSharedKey  The new pre-shared key object.
12619
 * returns 0 on success and other values indicate failure.
12620
 */
12621
int TLSX_PreSharedKey_Use(TLSX** extensions, const byte* identity, word16 len,
12622
                          word32 age, byte hmac, byte cipherSuite0,
12623
                          byte cipherSuite, byte resumption,
12624
                          PreSharedKey **preSharedKey, void* heap)
12625
{
12626
    int           ret = 0;
12627
    TLSX*         extension;
12628
    PreSharedKey* psk = NULL;
12629
12630
    /* Find the pre-shared key extension if it exists. */
12631
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12632
    if (extension == NULL) {
12633
        /* Push new pre-shared key extension. */
12634
        ret = TLSX_Push(extensions, TLSX_PRE_SHARED_KEY, NULL, heap);
12635
        if (ret != 0)
12636
            return ret;
12637
12638
        extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12639
        if (extension == NULL)
12640
            return MEMORY_E;
12641
    }
12642
12643
    /* Try to find the pre-shared key with this identity. */
12644
    psk = (PreSharedKey*)extension->data;
12645
    while (psk != NULL) {
12646
        if ((psk->identityLen == len) &&
12647
               (XMEMCMP(psk->identity, identity, len) == 0)) {
12648
            break;
12649
        }
12650
        psk = psk->next;
12651
    }
12652
12653
    /* Create a new pre-shared key object if not found. */
12654
    if (psk == NULL) {
12655
        ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
12656
                                    len, heap, &psk);
12657
        if (ret != 0)
12658
            return ret;
12659
    }
12660
12661
    /* Update/set age and HMAC algorithm. */
12662
    psk->ticketAge    = age;
12663
    psk->hmac         = hmac;
12664
    psk->cipherSuite0 = cipherSuite0;
12665
    psk->cipherSuite  = cipherSuite;
12666
    psk->resumption   = resumption;
12667
    psk->binderLen    = GetHmacLength(psk->hmac);
12668
12669
    if (preSharedKey != NULL)
12670
        *preSharedKey = psk;
12671
12672
    return 0;
12673
}
12674
12675
#define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
12676
#define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
12677
#define PSK_WRITE     TLSX_PreSharedKey_Write
12678
#define PSK_PARSE     TLSX_PreSharedKey_Parse
12679
12680
#else
12681
12682
#define PSK_FREE_ALL(a, b) WC_DO_NOTHING
12683
#define PSK_GET_SIZE(a, b, c) 0
12684
#define PSK_WRITE(a, b, c, d) 0
12685
#define PSK_PARSE(a, b, c, d) 0
12686
12687
#endif
12688
12689
/******************************************************************************/
12690
/* Certificate Authentication with External Pre-Shared Key                    */
12691
/******************************************************************************/
12692
12693
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
12694
    !defined(NO_PSK)
12695
12696
static int TLSX_CertWithExternPsk_GetSize(byte msgType, word16* pSz)
12697
{
12698
    (void)msgType;
12699
    (void)pSz;
12700
    /* Zero-length extension - nothing to add. */
12701
    return 0;
12702
}
12703
12704
static int TLSX_CertWithExternPsk_Write(byte* output, byte msgType,
12705
    word16* pSz)
12706
{
12707
    (void)output;
12708
    (void)msgType;
12709
    (void)pSz;
12710
    /* Zero-length extension - nothing to write. */
12711
    return 0;
12712
}
12713
12714
static int TLSX_CertWithExternPsk_Parse(WOLFSSL* ssl, byte msgType)
12715
{
12716
    if (msgType == client_hello) {
12717
        /* Server has not opted in - treat the extension as unknown. */
12718
        if (!ssl->options.certWithExternPsk)
12719
            return 0;
12720
        /* Record that the client offered the extension, leaving resp=0.
12721
         * CheckPreSharedKeys() is the sole writer that flips resp to 1, and
12722
         * only after confirming that a non-ticket PSK was matched. */
12723
        if (TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) == NULL) {
12724
            return TLSX_Push(&ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK,
12725
                NULL, ssl->heap);
12726
        }
12727
        return 0;
12728
    }
12729
12730
    if (msgType == server_hello) {
12731
        if (TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) == NULL) {
12732
            WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
12733
            return EXT_NOT_ALLOWED;
12734
        }
12735
        ssl->options.certWithExternPsk = 1;
12736
        return 0;
12737
    }
12738
12739
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12740
    return SANITY_MSG_E;
12741
}
12742
12743
int TLSX_CertWithExternPsk_Use(WOLFSSL* ssl)
12744
{
12745
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK);
12746
12747
    if (extension == NULL) {
12748
        int ret = TLSX_Push(&ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK, NULL,
12749
            ssl->heap);
12750
        if (ret != 0)
12751
            return ret;
12752
        extension = TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK);
12753
        if (extension == NULL)
12754
            return MEMORY_E;
12755
    }
12756
    extension->resp = 1;
12757
    return 0;
12758
}
12759
12760
#define PSK_WITH_CERT_GET_SIZE  TLSX_CertWithExternPsk_GetSize
12761
#define PSK_WITH_CERT_WRITE     TLSX_CertWithExternPsk_Write
12762
#define PSK_WITH_CERT_PARSE     TLSX_CertWithExternPsk_Parse
12763
12764
#else
12765
12766
#define PSK_WITH_CERT_GET_SIZE(a, b) 0
12767
#define PSK_WITH_CERT_WRITE(a, b, c) 0
12768
#define PSK_WITH_CERT_PARSE(a, b) 0
12769
12770
#endif /* WOLFSSL_TLS13 && WOLFSSL_CERT_WITH_EXTERN_PSK */
12771
12772
/******************************************************************************/
12773
/* PSK Key Exchange Modes                                                     */
12774
/******************************************************************************/
12775
12776
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
12777
/* Get the size of the encoded PSK KE modes extension.
12778
 * Only in ClientHello.
12779
 *
12780
 * modes    The PSK KE mode bit string.
12781
 * msgType  The type of the message this extension is being written into.
12782
 * returns the number of bytes of the encoded PSK KE mode extension.
12783
 */
12784
static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
12785
{
12786
    if (msgType == client_hello) {
12787
        /* Format: Len | Modes* */
12788
        word16 len = OPAQUE8_LEN;
12789
        /* Check whether each possible mode is to be written. */
12790
        if (modes & (1 << PSK_KE))
12791
            len += OPAQUE8_LEN;
12792
        if (modes & (1 << PSK_DHE_KE))
12793
            len += OPAQUE8_LEN;
12794
        *pSz += len;
12795
        return 0;
12796
    }
12797
12798
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12799
    return SANITY_MSG_E;
12800
}
12801
12802
/* Writes the PSK KE modes extension into the output buffer.
12803
 * Assumes that the the output buffer is big enough to hold data.
12804
 * Only in ClientHello.
12805
 *
12806
 * modes    The PSK KE mode bit string.
12807
 * output   The buffer to write into.
12808
 * msgType  The type of the message this extension is being written into.
12809
 * returns the number of bytes written into the buffer.
12810
 */
12811
static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
12812
                                 word16* pSz)
12813
{
12814
    if (msgType == client_hello) {
12815
        /* Format: Len | Modes* */
12816
        word16 idx = OPAQUE8_LEN;
12817
12818
        /* Write out each possible mode. */
12819
        if (modes & (1 << PSK_KE))
12820
            output[idx++] = PSK_KE;
12821
        if (modes & (1 << PSK_DHE_KE))
12822
            output[idx++] = PSK_DHE_KE;
12823
        /* Write out length of mode list. */
12824
        output[0] = (byte)(idx - OPAQUE8_LEN);
12825
12826
        *pSz += idx;
12827
        return 0;
12828
    }
12829
12830
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12831
    return SANITY_MSG_E;
12832
}
12833
12834
int TLSX_PskKeyModes_Parse_Modes(const byte* input, word16 length, byte msgType,
12835
                                byte* modes)
12836
{
12837
    if (msgType == client_hello) {
12838
        /* Format: Len | Modes* */
12839
        int   idx = 0;
12840
        word16 len;
12841
        *modes = 0;
12842
12843
        /* Ensure length byte exists. */
12844
        if (length < OPAQUE8_LEN)
12845
            return BUFFER_E;
12846
12847
        /* Get length of mode list and ensure that is the only data. */
12848
        len = input[0];
12849
        if (length - OPAQUE8_LEN != len)
12850
            return BUFFER_E;
12851
12852
        idx = OPAQUE8_LEN;
12853
        /* Set a bit for each recognized modes. */
12854
        while (len > 0) {
12855
            /* Ignore unrecognized modes.  */
12856
            if (input[idx] <= PSK_DHE_KE)
12857
               *modes |= 1 << input[idx];
12858
            idx++;
12859
            len--;
12860
        }
12861
        return 0;
12862
    }
12863
12864
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12865
    return SANITY_MSG_E;
12866
}
12867
12868
/* Parse the PSK KE modes extension.
12869
 * Only in ClientHello.
12870
 *
12871
 * ssl      The SSL/TLS object.
12872
 * input    The extension data.
12873
 * length   The length of the extension data.
12874
 * msgType  The type of the message this extension is being parsed from.
12875
 * returns 0 on success and other values indicate failure.
12876
 */
12877
static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, const byte* input, word16 length,
12878
                                 byte msgType)
12879
{
12880
    int    ret;
12881
    byte modes;
12882
12883
    ret = TLSX_PskKeyModes_Parse_Modes(input, length, msgType, &modes);
12884
    if (ret == 0)
12885
        ret = TLSX_PskKeyModes_Use(ssl, modes);
12886
12887
    if (ret != 0) {
12888
        WOLFSSL_ERROR_VERBOSE(ret);
12889
    }
12890
12891
    return ret;
12892
}
12893
12894
/* Use the data to create a new PSK Key Exchange Modes object in the extensions.
12895
 *
12896
 * ssl    The SSL/TLS object.
12897
 * modes  The PSK key exchange modes.
12898
 * returns 0 on success and other values indicate failure.
12899
 */
12900
int TLSX_PskKeyModes_Use(WOLFSSL* ssl, byte modes)
12901
{
12902
    int           ret = 0;
12903
    TLSX*         extension;
12904
12905
    /* Find the PSK key exchange modes extension if it exists. */
12906
    extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
12907
    if (extension == NULL) {
12908
        /* Push new PSK key exchange modes extension. */
12909
        ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
12910
            ssl->heap);
12911
        if (ret != 0)
12912
            return ret;
12913
12914
        extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
12915
        if (extension == NULL)
12916
            return MEMORY_E;
12917
    }
12918
12919
    extension->val = modes;
12920
12921
    return 0;
12922
}
12923
12924
#define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
12925
#define PKM_WRITE     TLSX_PskKeModes_Write
12926
#define PKM_PARSE     TLSX_PskKeModes_Parse
12927
12928
#else
12929
12930
#define PKM_GET_SIZE(a, b, c) 0
12931
#define PKM_WRITE(a, b, c, d) 0
12932
#define PKM_PARSE(a, b, c, d) 0
12933
12934
#endif
12935
12936
/******************************************************************************/
12937
/* Post-Handshake Authentication                                              */
12938
/******************************************************************************/
12939
12940
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
12941
/* Get the size of the encoded Post-Handshake Authentication extension.
12942
 * Only in ClientHello.
12943
 *
12944
 * msgType  The type of the message this extension is being written into.
12945
 * returns the number of bytes of the encoded Post-Handshake Authentication
12946
 * extension.
12947
 */
12948
static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
12949
{
12950
    if (msgType == client_hello) {
12951
        *pSz += 0;
12952
        return 0;
12953
    }
12954
12955
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12956
    return SANITY_MSG_E;
12957
}
12958
12959
/* Writes the Post-Handshake Authentication extension into the output buffer.
12960
 * Assumes that the the output buffer is big enough to hold data.
12961
 * Only in ClientHello.
12962
 *
12963
 * output   The buffer to write into.
12964
 * msgType  The type of the message this extension is being written into.
12965
 * returns the number of bytes written into the buffer.
12966
 */
12967
static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
12968
{
12969
    (void)output;
12970
12971
    if (msgType == client_hello) {
12972
        *pSz += 0;
12973
        return 0;
12974
    }
12975
12976
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12977
    return SANITY_MSG_E;
12978
}
12979
12980
/* Parse the Post-Handshake Authentication extension.
12981
 * Only in ClientHello.
12982
 *
12983
 * ssl      The SSL/TLS object.
12984
 * input    The extension data.
12985
 * length   The length of the extension data.
12986
 * msgType  The type of the message this extension is being parsed from.
12987
 * returns 0 on success and other values indicate failure.
12988
 */
12989
static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, const byte* input,
12990
                                   word16 length, byte msgType)
12991
{
12992
    (void)input;
12993
12994
    if (msgType == client_hello) {
12995
        /* Ensure extension is empty. */
12996
        if (length != 0)
12997
            return BUFFER_E;
12998
12999
        ssl->options.postHandshakeAuth = 1;
13000
        return 0;
13001
    }
13002
13003
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13004
    return SANITY_MSG_E;
13005
}
13006
13007
/* Create a new Post-handshake authentication object in the extensions.
13008
 *
13009
 * ssl    The SSL/TLS object.
13010
 * returns 0 on success and other values indicate failure.
13011
 */
13012
static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
13013
{
13014
    int   ret = 0;
13015
    TLSX* extension;
13016
13017
    /* Find the PSK key exchange modes extension if it exists. */
13018
    extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
13019
    if (extension == NULL) {
13020
        /* Push new Post-handshake Authentication extension. */
13021
        ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
13022
            ssl->heap);
13023
        if (ret != 0)
13024
            return ret;
13025
    }
13026
13027
    return 0;
13028
}
13029
13030
#define PHA_GET_SIZE  TLSX_PostHandAuth_GetSize
13031
#define PHA_WRITE     TLSX_PostHandAuth_Write
13032
#define PHA_PARSE     TLSX_PostHandAuth_Parse
13033
13034
#else
13035
13036
#define PHA_GET_SIZE(a, b)    0
13037
#define PHA_WRITE(a, b, c)    0
13038
#define PHA_PARSE(a, b, c, d) 0
13039
13040
#endif
13041
13042
/******************************************************************************/
13043
/* Early Data Indication                                                      */
13044
/******************************************************************************/
13045
13046
#ifdef WOLFSSL_EARLY_DATA
13047
/* Get the size of the encoded Early Data Indication extension.
13048
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
13049
 *
13050
 * msgType  The type of the message this extension is being written into.
13051
 * returns the number of bytes of the encoded Early Data Indication extension.
13052
 */
13053
static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
13054
{
13055
    int ret = 0;
13056
13057
    if (msgType == client_hello || msgType == encrypted_extensions)
13058
        *pSz += 0;
13059
    else if (msgType == session_ticket)
13060
        *pSz += OPAQUE32_LEN;
13061
    else {
13062
        ret = SANITY_MSG_E;
13063
        WOLFSSL_ERROR_VERBOSE(ret);
13064
    }
13065
13066
    return ret;
13067
}
13068
13069
/* Writes the Early Data Indicator extension into the output buffer.
13070
 * Assumes that the the output buffer is big enough to hold data.
13071
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
13072
 *
13073
 * maxSz    The maximum early data size.
13074
 * output   The buffer to write into.
13075
 * msgType  The type of the message this extension is being written into.
13076
 * returns the number of bytes written into the buffer.
13077
 */
13078
static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
13079
                                word16* pSz)
13080
{
13081
    if (msgType == client_hello || msgType == encrypted_extensions)
13082
        return 0;
13083
    else if (msgType == session_ticket) {
13084
        c32toa(maxSz, output);
13085
        *pSz += OPAQUE32_LEN;
13086
        return 0;
13087
    }
13088
13089
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13090
    return SANITY_MSG_E;
13091
}
13092
13093
/* Parse the Early Data Indicator extension.
13094
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
13095
 *
13096
 * ssl      The SSL/TLS object.
13097
 * input    The extension data.
13098
 * length   The length of the extension data.
13099
 * msgType  The type of the message this extension is being parsed from.
13100
 * returns 0 on success and other values indicate failure.
13101
 */
13102
static int TLSX_EarlyData_Parse(WOLFSSL* ssl, const byte* input, word16 length,
13103
                                 byte msgType)
13104
{
13105
    WOLFSSL_ENTER("TLSX_EarlyData_Parse");
13106
    if (msgType == client_hello) {
13107
        if (length != 0)
13108
            return BUFFER_E;
13109
13110
        if (ssl->earlyData == expecting_early_data) {
13111
13112
            if (ssl->options.maxEarlyDataSz != 0)
13113
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
13114
            else
13115
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
13116
13117
            return TLSX_EarlyData_Use(ssl, 0, 0);
13118
        }
13119
        ssl->earlyData = early_data_ext;
13120
13121
        return 0;
13122
    }
13123
    if (msgType == encrypted_extensions) {
13124
        if (length != 0)
13125
            return BUFFER_E;
13126
13127
        /* Ensure the index of PSK identity chosen by server is 0.
13128
         * Index is plus one to handle 'not set' value of 0.
13129
         */
13130
        if (ssl->options.pskIdIndex != 1) {
13131
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
13132
            return PSK_KEY_ERROR;
13133
        }
13134
13135
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
13136
            /* the extension from server comes in */
13137
            ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
13138
        }
13139
13140
        return TLSX_EarlyData_Use(ssl, 1, 1);
13141
    }
13142
    if (msgType == session_ticket) {
13143
        word32 maxSz;
13144
13145
        if (length != OPAQUE32_LEN)
13146
            return BUFFER_E;
13147
        ato32(input, &maxSz);
13148
13149
        ssl->session->maxEarlyDataSz = maxSz;
13150
        return 0;
13151
    }
13152
13153
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
13154
    return SANITY_MSG_E;
13155
}
13156
13157
/* Use the data to create a new Early Data object in the extensions.
13158
 *
13159
 * ssl    The SSL/TLS object.
13160
 * maxSz  The maximum early data size.
13161
 * is_response   if this extension is part of a response
13162
 * returns 0 on success and other values indicate failure.
13163
 */
13164
int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz, int is_response)
13165
{
13166
    int   ret = 0;
13167
    TLSX* extension;
13168
13169
    /* Find the early data extension if it exists. */
13170
    extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
13171
    if (extension == NULL) {
13172
        /* Push new early data extension. */
13173
        ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
13174
        if (ret != 0)
13175
            return ret;
13176
13177
        extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
13178
        if (extension == NULL)
13179
            return MEMORY_E;
13180
    }
13181
13182
    extension->resp = is_response;
13183
    /* In QUIC, earlydata size is either 0 or 0xffffffff.
13184
     * Override any size between, possibly left from our initial value */
13185
    extension->val  = (WOLFSSL_IS_QUIC(ssl) && is_response && maxSz > 0) ?
13186
                       WOLFSSL_MAX_32BIT : maxSz;
13187
13188
    return 0;
13189
}
13190
13191
#define EDI_GET_SIZE  TLSX_EarlyData_GetSize
13192
#define EDI_WRITE     TLSX_EarlyData_Write
13193
#define EDI_PARSE     TLSX_EarlyData_Parse
13194
13195
#else
13196
13197
#define EDI_GET_SIZE(a, b)    0
13198
#define EDI_WRITE(a, b, c, d) 0
13199
#define EDI_PARSE(a, b, c, d) 0
13200
13201
#endif
13202
13203
/******************************************************************************/
13204
/* QUIC transport parameter extension                                         */
13205
/******************************************************************************/
13206
#ifdef WOLFSSL_QUIC
13207
13208
static word16 TLSX_QuicTP_GetSize(TLSX* extension)
13209
{
13210
    const QuicTransportParam *tp = (QuicTransportParam*)extension->data;
13211
13212
    return tp ? tp->len : 0;
13213
}
13214
13215
int TLSX_QuicTP_Use(WOLFSSL* ssl, TLSX_Type ext_type, int is_response)
13216
{
13217
    int ret = 0;
13218
    TLSX* extension;
13219
13220
    WOLFSSL_ENTER("TLSX_QuicTP_Use");
13221
    if (ssl->quic.transport_local == NULL) {
13222
        /* RFC9000, ch 7.3: "An endpoint MUST treat the absence of [...]
13223
         *     from either endpoint [...] as a connection error of type
13224
         *     TRANSPORT_PARAMETER_ERROR."
13225
         */
13226
        ret = QUIC_TP_MISSING_E;
13227
        goto cleanup;
13228
    }
13229
13230
    extension = TLSX_Find(ssl->extensions, ext_type);
13231
    if (extension == NULL) {
13232
        ret = TLSX_Push(&ssl->extensions, ext_type, NULL, ssl->heap);
13233
        if (ret != 0)
13234
            goto cleanup;
13235
13236
        extension = TLSX_Find(ssl->extensions, ext_type);
13237
        if (extension == NULL) {
13238
            ret = MEMORY_E;
13239
            goto cleanup;
13240
        }
13241
    }
13242
    if (extension->data) {
13243
        QuicTransportParam_free((QuicTransportParam*)extension->data, ssl->heap);
13244
        extension->data = NULL;
13245
    }
13246
    extension->resp = is_response;
13247
    extension->data = (void*)QuicTransportParam_dup(ssl->quic.transport_local, ssl->heap);
13248
    if (!extension->data) {
13249
        ret = MEMORY_E;
13250
        goto cleanup;
13251
    }
13252
13253
cleanup:
13254
    WOLFSSL_LEAVE("TLSX_QuicTP_Use", ret);
13255
    return ret;
13256
}
13257
13258
static word16 TLSX_QuicTP_Write(QuicTransportParam *tp, byte* output)
13259
{
13260
    word16 len = 0;
13261
13262
    WOLFSSL_ENTER("TLSX_QuicTP_Write");
13263
    if (tp && tp->len) {
13264
        XMEMCPY(output, tp->data, tp->len);
13265
        len = tp->len;
13266
    }
13267
    WOLFSSL_LEAVE("TLSX_QuicTP_Write", len);
13268
    return len;
13269
}
13270
13271
static int TLSX_QuicTP_Parse(WOLFSSL *ssl, const byte *input, size_t len, int ext_type, int msgType)
13272
{
13273
    const QuicTransportParam *tp, **ptp;
13274
13275
    (void)msgType;
13276
    tp = QuicTransportParam_new(input, len, ssl->heap);
13277
    if (!tp) {
13278
        return MEMORY_E;
13279
    }
13280
    ptp = (ext_type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT) ?
13281
        &ssl->quic.transport_peer_draft : &ssl->quic.transport_peer;
13282
    if (*ptp) {
13283
        QTP_FREE(*ptp, ssl->heap);
13284
    }
13285
    *ptp = tp;
13286
    return 0;
13287
}
13288
13289
#define QTP_GET_SIZE    TLSX_QuicTP_GetSize
13290
#define QTP_USE         TLSX_QuicTP_Use
13291
#define QTP_WRITE       TLSX_QuicTP_Write
13292
#define QTP_PARSE       TLSX_QuicTP_Parse
13293
13294
#endif /* WOLFSSL_QUIC */
13295
13296
#if defined(WOLFSSL_DTLS_CID)
13297
#define CID_GET_SIZE  TLSX_ConnectionID_GetSize
13298
#define CID_WRITE  TLSX_ConnectionID_Write
13299
#define CID_PARSE  TLSX_ConnectionID_Parse
13300
#define CID_FREE  TLSX_ConnectionID_Free
13301
#else
13302
#define CID_GET_SIZE(a) 0
13303
#define CID_WRITE(a, b) 0
13304
#define CID_PARSE(a, b, c, d) 0
13305
#define CID_FREE(a, b) 0
13306
#endif /* defined(WOLFSSL_DTLS_CID) */
13307
13308
#if defined(HAVE_RPK)
13309
/******************************************************************************/
13310
/* Client_Certificate_Type extension                                          */
13311
/******************************************************************************/
13312
/* return 1 if specified type is included in the given list, otherwise 0 */
13313
static int IsCertTypeListed(byte type, byte cnt, const byte* list)
13314
{
13315
    int ret = 0;
13316
    int i;
13317
13318
    if (cnt == 0 || list == NULL)
13319
        return ret;
13320
13321
    if (cnt > 0 && cnt <= MAX_CLIENT_CERT_TYPE_CNT) {
13322
        for (i = 0; i < cnt; i++) {
13323
            if (list[i] == type)
13324
                return 1;
13325
        }
13326
    }
13327
    return 0;
13328
}
13329
13330
/* Search both arrays from above to find a common value between the two given
13331
 * arrays(a and b). return 1 if it finds a common value, otherwise return 0.
13332
 */
13333
static int GetCommonItem(const byte* a, byte aLen, const byte* b, byte bLen,
13334
                                                                    byte* type)
13335
{
13336
    int i, j;
13337
13338
    if (a == NULL || b == NULL)
13339
        return 0;
13340
13341
    for (i = 0; i < aLen; i++) {
13342
        for (j = 0; j < bLen; j++) {
13343
            if (a[i] == b[j]) {
13344
                *type = a[i];
13345
                return 1;
13346
            }
13347
        }
13348
    }
13349
    return 0;
13350
}
13351
13352
/* Creates a "client certificate type" extension if necessary.
13353
 * Returns 0 if no error occurred, negative value otherwise.
13354
 * A return of 0, it does not indicae that the extension was created.
13355
 */
13356
static int TLSX_ClientCertificateType_Use(WOLFSSL* ssl, byte isServer)
13357
{
13358
    int ret = 0;
13359
13360
    if (ssl == NULL)
13361
        return BAD_FUNC_ARG;
13362
13363
    if (isServer) {
13364
        /* [in server side]
13365
         */
13366
13367
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13368
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13369
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
13370
13371
            WOLFSSL_MSG("Adding Client Certificate Type extension");
13372
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
13373
                                                                    ssl->heap);
13374
            if (ret == 0) {
13375
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
13376
            }
13377
        }
13378
    }
13379
    else {
13380
        /* [in client side]
13381
         * This extension MUST be omitted from the ClientHello unless the RPK
13382
         * certificate is preferred by the user and actually loaded.
13383
         */
13384
13385
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13386
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13387
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
13388
13389
            if (ssl->options.rpkState.isRPKLoaded) {
13390
13391
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
13392
                ssl->options.rpkState.sending_ClientCertTypes[0] =
13393
                                                        WOLFSSL_CERT_TYPE_RPK;
13394
13395
                /* Push new client_certificate_type extension. */
13396
                WOLFSSL_MSG("Adding Client Certificate Type extension");
13397
                ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE,
13398
                                                                ssl, ssl->heap);
13399
            }
13400
            else {
13401
                WOLFSSL_MSG("Willing to use RPK cert but not loaded it");
13402
            }
13403
        }
13404
        else {
13405
            WOLFSSL_MSG("No will to use RPK cert");
13406
        }
13407
    }
13408
    return ret;
13409
}
13410
13411
/* Parse a "client certificate type" extension received from peer.
13412
 * returns 0 on success and other values indicate failure.
13413
 */
13414
static int TLSX_ClientCertificateType_Parse(WOLFSSL* ssl, const byte* input,
13415
                                                word16 length, byte msgType)
13416
{
13417
    byte typeCnt;
13418
    int idx = 0;
13419
    int ret = 0;
13420
    int i;
13421
    int populate = 0;
13422
    byte  cmnType;
13423
13424
13425
    if (msgType == client_hello) {
13426
        /* [parse ClientHello in server end]
13427
         * case 1) if peer verify is disabled, this extension must be omitted
13428
         *         from ServerHello.
13429
         * case 2) if user have not set his preference, find X509 in parsed
13430
         *         result, then populate "Client Certificate Type" extension.
13431
         * case 3) if user have not set his preference and X509 isn't included
13432
         *         in parsed result, send "unsupported certificate" alert.
13433
         * case 4) if user have set his preference, find a common cert type
13434
         *         in users preference and received cert types.
13435
         * case 5) if user have set his preference, but no common cert type
13436
         *         found.
13437
         */
13438
13439
        /* case 1 */
13440
        if (ssl->options.verifyNone) {
13441
            return ret;
13442
        }
13443
13444
        /* parse extension */
13445
        if (length < OPAQUE8_LEN)
13446
            return BUFFER_E;
13447
13448
        typeCnt = input[idx];
13449
13450
        if (typeCnt > MAX_CLIENT_CERT_TYPE_CNT)
13451
            return BUFFER_E;
13452
13453
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
13454
            return BUFFER_E;
13455
        }
13456
13457
        ssl->options.rpkState.received_ClientCertTypeCnt = input[idx];
13458
        idx += OPAQUE8_LEN;
13459
13460
        for (i = 0; i < typeCnt; i++) {
13461
            ssl->options.rpkState.received_ClientCertTypes[i] = input[idx];
13462
            idx += OPAQUE8_LEN;
13463
        }
13464
13465
        if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt == 0) {
13466
            /* case 2 */
13467
            if (IsCertTypeListed(WOLFSSL_CERT_TYPE_X509,
13468
                            ssl->options.rpkState.received_ClientCertTypeCnt,
13469
                            ssl->options.rpkState.received_ClientCertTypes)) {
13470
13471
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
13472
                ssl->options.rpkState.sending_ClientCertTypes[0] =
13473
                                                        WOLFSSL_CERT_TYPE_X509;
13474
                populate = 1;
13475
            }
13476
            /* case 3 */
13477
            else {
13478
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
13479
                SendAlert(ssl, alert_fatal, unsupported_certificate);
13480
                return UNSUPPORTED_CERTIFICATE;
13481
            }
13482
        }
13483
        else if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt > 0) {
13484
            /* case 4 */
13485
            if (GetCommonItem(
13486
                            ssl->options.rpkConfig.preferred_ClientCertTypes,
13487
                            ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13488
                            ssl->options.rpkState.received_ClientCertTypes,
13489
                            ssl->options.rpkState.received_ClientCertTypeCnt,
13490
                            &cmnType)) {
13491
                ssl->options.rpkState.sending_ClientCertTypeCnt  = 1;
13492
                ssl->options.rpkState.sending_ClientCertTypes[0] = cmnType;
13493
                populate = 1;
13494
            }
13495
            /* case 5 */
13496
            else {
13497
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
13498
                SendAlert(ssl, alert_fatal, unsupported_certificate);
13499
                return UNSUPPORTED_CERTIFICATE;
13500
            }
13501
        }
13502
13503
        /* populate client_certificate_type extension */
13504
        if (populate) {
13505
            WOLFSSL_MSG("Adding Client Certificate Type extension");
13506
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
13507
                                                                    ssl->heap);
13508
            if (ret == 0) {
13509
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
13510
            }
13511
        }
13512
    }
13513
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13514
        /* parse it in client side */
13515
        if (length == 1) {
13516
            ssl->options.rpkState.received_ClientCertTypeCnt  = 1;
13517
            ssl->options.rpkState.received_ClientCertTypes[0] = *input;
13518
        }
13519
        else {
13520
            return BUFFER_E;
13521
        }
13522
    }
13523
13524
    return ret;
13525
}
13526
13527
/* Write out the "client certificate type" extension data into the given buffer.
13528
 * return the size wrote in the buffer on success, negative value on error.
13529
 */
13530
static word16 TLSX_ClientCertificateType_Write(void* data, byte* output,
13531
                                              byte msgType)
13532
{
13533
    WOLFSSL* ssl = (WOLFSSL*)data;
13534
    word16 idx = 0;
13535
    byte cnt = 0;
13536
    int i;
13537
13538
    /* skip to write extension if count is zero */
13539
    cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
13540
13541
    if (cnt == 0)
13542
        return 0;
13543
13544
    if (msgType == client_hello) {
13545
        /* client side */
13546
13547
        *(output + idx) = cnt;
13548
        idx += OPAQUE8_LEN;
13549
13550
        for (i = 0; i < cnt; i++) {
13551
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[i];
13552
            idx += OPAQUE8_LEN;
13553
        }
13554
        return idx;
13555
    }
13556
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13557
        /* sever side */
13558
        if (cnt == 1) {
13559
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[0];
13560
            idx += OPAQUE8_LEN;
13561
        }
13562
    }
13563
    return idx;
13564
}
13565
13566
/* Calculate then return the size of the "client certificate type" extension
13567
 * data.
13568
 * return the extension data size on success, negative value on error.
13569
*/
13570
static int TLSX_ClientCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
13571
{
13572
    int ret = 0;
13573
    byte cnt;
13574
13575
    if (ssl == NULL)
13576
        return BAD_FUNC_ARG;
13577
13578
    if (msgType == client_hello) {
13579
        /* client side */
13580
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
13581
        ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
13582
    }
13583
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13584
        /* server side */
13585
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;/* must be one */
13586
        if (cnt != 1)
13587
            return SANITY_MSG_E;
13588
        ret = OPAQUE8_LEN;
13589
    }
13590
    else {
13591
        return SANITY_MSG_E;
13592
    }
13593
    return ret;
13594
}
13595
13596
    #define CCT_GET_SIZE  TLSX_ClientCertificateType_GetSize
13597
    #define CCT_WRITE     TLSX_ClientCertificateType_Write
13598
    #define CCT_PARSE     TLSX_ClientCertificateType_Parse
13599
#else
13600
    #define CCT_GET_SIZE(a)  0
13601
    #define CCT_WRITE(a, b)  0
13602
    #define CCT_PARSE(a, b, c, d) 0
13603
#endif /* HAVE_RPK */
13604
13605
#if defined(HAVE_RPK)
13606
/******************************************************************************/
13607
/* Server_Certificate_Type extension                                          */
13608
/******************************************************************************/
13609
/* Creates a "server certificate type" extension if necessary.
13610
 * Returns 0 if no error occurred, negative value otherwise.
13611
 * A return of 0, it does not indicae that the extension was created.
13612
 */
13613
static int TLSX_ServerCertificateType_Use(WOLFSSL* ssl, byte isServer)
13614
{
13615
    int ret = 0;
13616
    byte ctype;
13617
13618
    if (ssl == NULL)
13619
        return BAD_FUNC_ARG;
13620
13621
    if (isServer) {
13622
        /* [in server side] */
13623
        /* find common cert type to both end */
13624
        if (GetCommonItem(
13625
                ssl->options.rpkConfig.preferred_ServerCertTypes,
13626
                ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
13627
                ssl->options.rpkState.received_ServerCertTypes,
13628
                ssl->options.rpkState.received_ServerCertTypeCnt,
13629
                &ctype)) {
13630
            ssl->options.rpkState.sending_ServerCertTypeCnt = 1;
13631
            ssl->options.rpkState.sending_ServerCertTypes[0] = ctype;
13632
13633
            /* Push new server_certificate_type extension. */
13634
            WOLFSSL_MSG("Adding Server Certificate Type extension");
13635
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
13636
                                                                    ssl->heap);
13637
            if (ret == 0) {
13638
                TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
13639
            }
13640
        }
13641
        else {
13642
            /* no common cert type found */
13643
            WOLFSSL_MSG("No common cert type found in server_certificate_type ext");
13644
            SendAlert(ssl, alert_fatal, unsupported_certificate);
13645
            ret = UNSUPPORTED_CERTIFICATE;
13646
        }
13647
    }
13648
    else {
13649
        /* [in client side] */
13650
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13651
                            ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
13652
                            ssl->options.rpkConfig.preferred_ServerCertTypes)) {
13653
13654
            ssl->options.rpkState.sending_ServerCertTypeCnt =
13655
                        ssl->options.rpkConfig.preferred_ServerCertTypeCnt;
13656
            XMEMCPY(ssl->options.rpkState.sending_ServerCertTypes,
13657
                    ssl->options.rpkConfig.preferred_ServerCertTypes,
13658
                    ssl->options.rpkConfig.preferred_ServerCertTypeCnt);
13659
13660
            /* Push new server_certificate_type extension. */
13661
            WOLFSSL_MSG("Adding Server Certificate Type extension");
13662
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
13663
                                                                    ssl->heap);
13664
        }
13665
        else {
13666
            WOLFSSL_MSG("No will to accept RPK cert");
13667
        }
13668
    }
13669
13670
    return ret;
13671
}
13672
13673
/* Parse a "server certificate type" extension received from peer.
13674
 * returns 0 on success and other values indicate failure.
13675
 */
13676
static int TLSX_ServerCertificateType_Parse(WOLFSSL* ssl, const byte* input,
13677
                                                word16 length, byte msgType)
13678
{
13679
    byte typeCnt;
13680
    int idx = 0;
13681
    int ret = 0;
13682
    int i;
13683
13684
    if (msgType == client_hello) {
13685
        /* in server side */
13686
13687
        if (length < OPAQUE8_LEN)
13688
            return BUFFER_E;
13689
13690
        typeCnt = input[idx];
13691
13692
        if (typeCnt > MAX_SERVER_CERT_TYPE_CNT)
13693
            return BUFFER_E;
13694
13695
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
13696
            return BUFFER_E;
13697
        }
13698
        ssl->options.rpkState.received_ServerCertTypeCnt = input[idx];
13699
        idx += OPAQUE8_LEN;
13700
13701
        for (i = 0; i < typeCnt; i++) {
13702
            ssl->options.rpkState.received_ServerCertTypes[i] = input[idx];
13703
            idx += OPAQUE8_LEN;
13704
        }
13705
13706
        ret = TLSX_ServerCertificateType_Use(ssl, 1);
13707
        if (ret == 0) {
13708
            TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
13709
        }
13710
    }
13711
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13712
        /* in client side */
13713
        if (length != 1)                     /* length slould be 1 */
13714
            return BUFFER_E;
13715
13716
        ssl->options.rpkState.received_ServerCertTypeCnt  = 1;
13717
        ssl->options.rpkState.received_ServerCertTypes[0] = *input;
13718
    }
13719
13720
    return 0;
13721
}
13722
13723
/* Write out the "server certificate type" extension data into the given buffer.
13724
 * return the size wrote in the buffer on success, negative value on error.
13725
 */
13726
static word16 TLSX_ServerCertificateType_Write(void* data, byte* output,
13727
                                                                byte msgType)
13728
{
13729
    WOLFSSL* ssl = (WOLFSSL*)data;
13730
    word16 idx = 0;
13731
    int cnt = 0;
13732
    int i;
13733
13734
    /* skip to write extension if count is zero */
13735
    cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
13736
13737
    if (cnt == 0)
13738
        return 0;
13739
13740
    if (msgType == client_hello) {
13741
        /* in client side */
13742
13743
        *(output + idx) = cnt;
13744
        idx += OPAQUE8_LEN;
13745
13746
        for (i = 0; i < cnt; i++) {
13747
            *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[i];
13748
            idx += OPAQUE8_LEN;
13749
        }
13750
    }
13751
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13752
        /* in server side */
13753
        /* ensure cnt is one */
13754
        if (cnt != 1)
13755
            return 0;
13756
13757
        *(output + idx) =  ssl->options.rpkState.sending_ServerCertTypes[0];
13758
        idx += OPAQUE8_LEN;
13759
    }
13760
    return idx;
13761
}
13762
13763
/* Calculate then return the size of the "server certificate type" extension
13764
 * data.
13765
 * return the extension data size on success, negative value on error.
13766
*/
13767
static int TLSX_ServerCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
13768
{
13769
    int ret = 0;
13770
    int cnt;
13771
13772
    if (ssl == NULL)
13773
        return BAD_FUNC_ARG;
13774
13775
    if (msgType == client_hello) {
13776
        /* in clent side */
13777
        cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
13778
        if (cnt > 0) {
13779
            ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
13780
        }
13781
    }
13782
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13783
        /* in server side */
13784
        ret = (int)OPAQUE8_LEN;
13785
    }
13786
    else {
13787
        return SANITY_MSG_E;
13788
    }
13789
    return ret;
13790
}
13791
13792
    #define SCT_GET_SIZE  TLSX_ServerCertificateType_GetSize
13793
    #define SCT_WRITE     TLSX_ServerCertificateType_Write
13794
    #define SCT_PARSE     TLSX_ServerCertificateType_Parse
13795
#else
13796
    #define SCT_GET_SIZE(a)  0
13797
    #define SCT_WRITE(a, b)  0
13798
    #define SCT_PARSE(a, b, c, d) 0
13799
#endif /* HAVE_RPK */
13800
13801
/******************************************************************************/
13802
/* TLS Extensions Framework                                                   */
13803
/******************************************************************************/
13804
13805
/** Finds an extension in the provided list. */
13806
TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
13807
660k
{
13808
660k
    TLSX* extension = list;
13809
13810
1.21M
    while (extension && extension->type != type)
13811
551k
        extension = extension->next;
13812
13813
660k
    return extension;
13814
660k
}
13815
13816
/** Remove an extension. */
13817
void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
13818
8.35k
{
13819
8.35k
    TLSX* extension;
13820
8.35k
    TLSX** next;
13821
13822
8.35k
    if (list == NULL)
13823
0
        return;
13824
13825
8.35k
    extension = *list;
13826
8.35k
    next = list;
13827
13828
63.3k
    while (extension && extension->type != type) {
13829
55.0k
        next = &extension->next;
13830
55.0k
        extension = extension->next;
13831
55.0k
    }
13832
13833
8.35k
    if (extension) {
13834
118
        *next = extension->next;
13835
118
        extension->next = NULL;
13836
118
        TLSX_FreeAll(extension, heap);
13837
118
    }
13838
8.35k
}
13839
13840
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13841
#define GREASE_ECH_SIZE 160
13842
#define TLS_INFO_CONST_STRING "tls ech"
13843
#define TLS_INFO_CONST_STRING_SZ 7
13844
13845
/* return status after setting up ech to write a grease ech */
13846
static int TLSX_GreaseECH_Use(TLSX** extensions, void* heap, WC_RNG* rng)
13847
{
13848
    int ret = 0;
13849
    TLSX* echX;
13850
    WOLFSSL_ECH* ech;
13851
13852
    if (extensions == NULL)
13853
        return BAD_FUNC_ARG;
13854
    /* skip if we already have an ech extension, we will for hrr */
13855
    echX = TLSX_Find(*extensions, TLSX_ECH);
13856
    if (echX != NULL)
13857
        return 0;
13858
13859
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13860
        DYNAMIC_TYPE_TMP_BUFFER);
13861
    if (ech == NULL)
13862
        return MEMORY_E;
13863
    XMEMSET(ech, 0, sizeof(WOLFSSL_ECH));
13864
13865
    ech->state = ECH_WRITE_GREASE;
13866
13867
    /* 0 for outer */
13868
    ech->type = ECH_TYPE_OUTER;
13869
    /* kemId */
13870
    ech->kemId = DHKEM_X25519_HKDF_SHA256;
13871
    /* cipherSuite kdf */
13872
    ech->cipherSuite.kdfId = HKDF_SHA256;
13873
    /* cipherSuite aead */
13874
    ech->cipherSuite.aeadId = HPKE_AES_128_GCM;
13875
13876
    /* random configId */
13877
    ret = wc_RNG_GenerateByte(rng, &(ech->configId));
13878
13879
    /* curve25519 encLen */
13880
    ech->encLen = DHKEM_X25519_ENC_LEN;
13881
13882
    if (ret == 0)
13883
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13884
13885
    if (ret != 0) {
13886
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13887
    }
13888
13889
    return ret;
13890
}
13891
13892
/* return status after setting up ech to write real ech */
13893
static int TLSX_ECH_Use(WOLFSSL_EchConfig* echConfig, TLSX** extensions,
13894
    void* heap, WC_RNG* rng)
13895
{
13896
    int ret = 0;
13897
    int suiteIndex;
13898
    TLSX* echX;
13899
    WOLFSSL_ECH* ech;
13900
    if (extensions == NULL)
13901
        return BAD_FUNC_ARG;
13902
    /* skip if we already have an ech extension, we will for hrr */
13903
    echX = TLSX_Find(*extensions, TLSX_ECH);
13904
    if (echX != NULL)
13905
        return 0;
13906
    /* find a supported cipher suite */
13907
    suiteIndex = EchConfigGetSupportedCipherSuite(echConfig);
13908
    if (suiteIndex < 0)
13909
        return suiteIndex;
13910
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13911
        DYNAMIC_TYPE_TMP_BUFFER);
13912
    if (ech == NULL)
13913
        return MEMORY_E;
13914
    XMEMSET(ech, 0, sizeof(WOLFSSL_ECH));
13915
    ech->state = ECH_WRITE_REAL;
13916
    ech->echConfig = echConfig;
13917
    /* 0 for outer */
13918
    ech->type = ECH_TYPE_OUTER;
13919
    /* kemId */
13920
    ech->kemId = echConfig->kemId;
13921
    /* cipherSuite kdf */
13922
    ech->cipherSuite.kdfId = echConfig->cipherSuites[suiteIndex].kdfId;
13923
    /* cipherSuite aead */
13924
    ech->cipherSuite.aeadId = echConfig->cipherSuites[suiteIndex].aeadId;
13925
    /* configId */
13926
    ech->configId = echConfig->configId;
13927
    /* encLen */
13928
    ech->encLen = wc_HpkeKemGetEncLen(echConfig->kemId);
13929
    if (ech->encLen == 0) {
13930
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13931
        return BAD_FUNC_ARG;
13932
    }
13933
    /* setup hpke */
13934
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
13935
    if (ech->hpke == NULL) {
13936
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13937
        return MEMORY_E;
13938
    }
13939
    ret = wc_HpkeInit(ech->hpke, ech->kemId, ech->cipherSuite.kdfId,
13940
        ech->cipherSuite.aeadId, heap);
13941
    /* setup the ephemeralKey */
13942
    if (ret == 0)
13943
        ret = wc_HpkeGenerateKeyPair(ech->hpke, &ech->ephemeralKey, rng);
13944
    if (ret == 0) {
13945
        /* use the chosen config's public name for the outer SNI */
13946
        ret = TLSX_UseSNI(&ech->extensions, WOLFSSL_SNI_HOST_NAME,
13947
            echConfig->publicName, (word16)XSTRLEN(echConfig->publicName),
13948
            heap);
13949
        if (ret != WOLFSSL_SUCCESS ||
13950
                (ret = TLSX_Push(extensions, TLSX_ECH, ech, heap)) != 0) {
13951
            TLSX_FreeAll(ech->extensions, heap);
13952
            wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
13953
                ech->hpke->heap);
13954
        }
13955
    }
13956
    if (ret != 0) {
13957
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13958
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13959
    }
13960
    return ret;
13961
}
13962
13963
/* return status after setting up ech to read and decrypt */
13964
WOLFSSL_TEST_VIS int TLSX_ServerECH_Use(TLSX** extensions, void* heap,
13965
    WOLFSSL_EchConfig* configs)
13966
{
13967
    int ret;
13968
    WOLFSSL_ECH* ech;
13969
    TLSX* echX;
13970
    if (extensions == NULL)
13971
        return BAD_FUNC_ARG;
13972
    /* if we already have ech don't override it */
13973
    echX = TLSX_Find(*extensions, TLSX_ECH);
13974
    if (echX != NULL)
13975
        return 0;
13976
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13977
        DYNAMIC_TYPE_TMP_BUFFER);
13978
    if (ech == NULL)
13979
        return MEMORY_E;
13980
    XMEMSET(ech, 0, sizeof(WOLFSSL_ECH));
13981
    ech->state = ECH_WRITE_NONE;
13982
    /* 0 for outer */
13983
    ech->type = ECH_TYPE_OUTER;
13984
    ech->echConfig = configs;
13985
    /* setup the rest of the settings when we receive ech from the client */
13986
    ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13987
    if (ret != 0)
13988
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13989
    return ret;
13990
}
13991
13992
/* return status after writing the ech and updating offset */
13993
static int TLSX_ECH_Write(WOLFSSL_ECH* ech, byte msgType, byte* writeBuf,
13994
    word16* offset)
13995
{
13996
    int ret = 0;
13997
    int rngRet = -1;
13998
    word32 configsLen = 0;
13999
    void* ephemeralKey = NULL;
14000
    byte* writeBuf_p = writeBuf;
14001
    WC_DECLARE_VAR(hpke, Hpke, 1, DYNAMIC_TYPE_TMP_BUFFER);
14002
    WC_DECLARE_VAR(rng, WC_RNG, 1, DYNAMIC_TYPE_RNG);
14003
14004
    WOLFSSL_MSG("TLSX_ECH_Write");
14005
    if (msgType == hello_retry_request) {
14006
        WC_ALLOC_VAR_EX(rng, WC_RNG, 1, NULL, DYNAMIC_TYPE_RNG, ret = MEMORY_E);
14007
        if (ret == 0) {
14008
            ret = wc_InitRng(rng);
14009
        }
14010
        if (ret == 0) {
14011
            /* randomize confirmation in case ech is rejected */
14012
            ret = wc_RNG_GenerateBlock(rng, writeBuf,
14013
                    ECH_ACCEPT_CONFIRMATION_SZ);
14014
            wc_FreeRng(rng);
14015
        }
14016
        if (ret == 0) {
14017
            *offset += ECH_ACCEPT_CONFIRMATION_SZ;
14018
            ech->confBuf = writeBuf;
14019
        }
14020
14021
        WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
14022
        return ret;
14023
    }
14024
    if (ech->state == ECH_WRITE_NONE || ech->state == ECH_PARSED_INTERNAL)
14025
        return 0;
14026
    if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
14027
        /* get size then write */
14028
        ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen);
14029
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
14030
            return ret;
14031
        ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen);
14032
        if (ret != WOLFSSL_SUCCESS)
14033
            return ret;
14034
        *offset += configsLen;
14035
        return 0;
14036
    }
14037
    /* type */
14038
    *writeBuf_p = ech->type;
14039
    writeBuf_p += sizeof(ech->type);
14040
    /* outer has body, inner does not */
14041
    if (ech->type == ECH_TYPE_OUTER) {
14042
        /* kdfId */
14043
        c16toa(ech->cipherSuite.kdfId, writeBuf_p);
14044
        writeBuf_p += sizeof(ech->cipherSuite.kdfId);
14045
        /* aeadId */
14046
        c16toa(ech->cipherSuite.aeadId, writeBuf_p);
14047
        writeBuf_p += sizeof(ech->cipherSuite.aeadId);
14048
        /* configId */
14049
        *writeBuf_p = ech->configId;
14050
        writeBuf_p += sizeof(ech->configId);
14051
        /* encLen */
14052
        if (ech->innerCount == 0) {
14053
            c16toa(ech->encLen, writeBuf_p);
14054
        }
14055
        else {
14056
            /* set to 0 if this is clientInner 2 */
14057
            c16toa(0, writeBuf_p);
14058
        }
14059
        writeBuf_p += 2;
14060
        if (ech->state == ECH_WRITE_GREASE) {
14061
            word32 size;
14062
            WC_ALLOC_VAR_EX(rng, WC_RNG, 1, NULL, DYNAMIC_TYPE_RNG,
14063
                ret = MEMORY_E);
14064
14065
            if (ret == 0)
14066
                rngRet = ret = wc_InitRng(rng);
14067
            if (ret == 0 && ech->innerCount == 0) {
14068
                WC_ALLOC_VAR_EX(hpke, Hpke, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER,
14069
                    ret = MEMORY_E);
14070
14071
                /* hpke init */
14072
                if (ret == 0)
14073
                    ret = wc_HpkeInit(hpke, ech->kemId, ech->cipherSuite.kdfId,
14074
                        ech->cipherSuite.aeadId, NULL);
14075
                /* create the ephemeralKey */
14076
                if (ret == 0)
14077
                    ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng);
14078
                /* enc */
14079
                if (ret == 0) {
14080
                    ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey,
14081
                        writeBuf_p, &ech->encLen);
14082
                    writeBuf_p += ech->encLen;
14083
                }
14084
14085
                if (ephemeralKey != NULL)
14086
                    wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap);
14087
                WC_FREE_VAR_EX(hpke, NULL, DYNAMIC_TYPE_TMP_BUFFER);
14088
            }
14089
14090
            if (ret == 0) {
14091
                size = GREASE_ECH_SIZE + (ech->configId / 4);
14092
                size += ECH_PADDING_TO_32(size) + WC_AES_BLOCK_SIZE;
14093
14094
                /* innerClientHelloLen */
14095
                c16toa((word16)size, writeBuf_p);
14096
                writeBuf_p += 2;
14097
                /* innerClientHello */
14098
                ret = wc_RNG_GenerateBlock(rng, writeBuf_p, size);
14099
                writeBuf_p += size;
14100
            }
14101
14102
            if (rngRet == 0)
14103
                wc_FreeRng(rng);
14104
            WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
14105
        }
14106
        else {
14107
            if (ech->innerCount == 0) {
14108
                /* write enc to writeBuf_p */
14109
                ret = wc_HpkeSerializePublicKey(ech->hpke, ech->ephemeralKey,
14110
                    writeBuf_p, &ech->encLen);
14111
                writeBuf_p += ech->encLen;
14112
            }
14113
14114
            /* innerClientHelloLen */
14115
            c16toa((word16)ech->innerClientHelloLen, writeBuf_p);
14116
            writeBuf_p += 2;
14117
            /* set payload offset for when we finalize */
14118
            ech->outerClientPayload = writeBuf_p;
14119
            /* write zeros for payload */
14120
            XMEMSET(writeBuf_p, 0, ech->innerClientHelloLen);
14121
            writeBuf_p += ech->innerClientHelloLen;
14122
        }
14123
    }
14124
    if (ret == 0)
14125
        *offset += (writeBuf_p - writeBuf);
14126
    return ret;
14127
}
14128
14129
/* return the size needed for the ech extension */
14130
static int TLSX_ECH_GetSize(WOLFSSL_ECH* ech, byte msgType)
14131
{
14132
    int ret;
14133
    word32 size = 0;
14134
14135
    if (ech->state == ECH_WRITE_GREASE) {
14136
        word32 payload;
14137
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
14138
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16);
14139
        /* enc only printed on CH1 */
14140
        if (ech->innerCount == 0)
14141
            size += ech->encLen;
14142
        /* GREASE payload mimics the regular sealed inner:
14143
         *   plaintext length divisible by 32 and the AEAD tag
14144
         *   configId is used to randomize the GREASE length
14145
         *     (divide by 4 to save space) */
14146
        payload = GREASE_ECH_SIZE + (ech->configId / 4);
14147
        payload += ECH_PADDING_TO_32(payload) + WC_AES_BLOCK_SIZE;
14148
        size += payload;
14149
    }
14150
    else if (msgType == hello_retry_request) {
14151
        size = ECH_ACCEPT_CONFIRMATION_SZ;
14152
    }
14153
    else if (ech->state == ECH_WRITE_NONE ||
14154
        ech->state == ECH_PARSED_INTERNAL) {
14155
        size = 0;
14156
    }
14157
    else if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
14158
        /* get the size of the raw configs */
14159
        ret = GetEchConfigsEx(ech->echConfig, NULL, &size);
14160
14161
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
14162
            return ret;
14163
    }
14164
    else if (ech->type == ECH_TYPE_INNER)
14165
    {
14166
        size = sizeof(ech->type);
14167
    }
14168
    else
14169
    {
14170
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
14171
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16) +
14172
            ech->innerClientHelloLen;
14173
        /* enc only printed on CH1 */
14174
        if (ech->innerCount == 0)
14175
            size += ech->encLen;
14176
    }
14177
14178
    return (int)size;
14179
}
14180
14181
#ifdef HAVE_SECRET_CALLBACK
14182
/* log ECH_SECRET and ECH_CONFIG
14183
 * returns 0 on success, TLS13_SECRET_CB_E otherwise */
14184
static int EchWriteKeyLog(WOLFSSL* ssl, const byte* secret, word32 secretSz,
14185
    const byte* config, word32 configSz)
14186
{
14187
    int ret = 0;
14188
    if (ssl->tls13SecretCb != NULL) {
14189
        ret = ssl->tls13SecretCb(ssl, ECH_SECRET, secret, (int)secretSz,
14190
                ssl->tls13SecretCtx);
14191
        if (ret == 0) {
14192
            ret = ssl->tls13SecretCb(ssl, ECH_CONFIG, config, (int)configSz,
14193
                    ssl->tls13SecretCtx);
14194
        }
14195
        if (ret != 0) {
14196
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
14197
            ret = TLS13_SECRET_CB_E;
14198
        }
14199
    }
14200
#ifdef OPENSSL_EXTRA
14201
    if (ret == 0 && ssl->tls13KeyLogCb != NULL) {
14202
        ret = ssl->tls13KeyLogCb(ssl, ECH_SECRET, secret, (int)secretSz, NULL);
14203
        if (ret == 0) {
14204
            ret = ssl->tls13KeyLogCb(ssl, ECH_CONFIG, config, (int)configSz,
14205
                    NULL);
14206
        }
14207
        if (ret != 0) {
14208
            WOLFSSL_ERROR_VERBOSE(TLS13_SECRET_CB_E);
14209
            ret = TLS13_SECRET_CB_E;
14210
        }
14211
    }
14212
#endif /* OPENSSL_EXTRA */
14213
    return ret;
14214
}
14215
#endif /* HAVE_SECRET_CALLBACK */
14216
14217
/* rough check that inner hello fields do not exceed length of decrypted
14218
 * information. Additionally, this function will check that all padding bytes
14219
 * are zero and decrease the innerHelloLen accordingly if so.
14220
 * returns 0 on success and otherwise failure */
14221
static int TLSX_ECH_CheckInnerPadding(WOLFSSL* ssl, WOLFSSL_ECH* ech)
14222
{
14223
    int headerSz;
14224
    const byte* innerCh;
14225
    word32 innerChLen;
14226
    word32 idx;
14227
    byte sessionIdLen;
14228
    word16 cipherSuitesLen;
14229
    byte compressionLen;
14230
    word16 extLen;
14231
    byte acc = 0;
14232
    word32 i;
14233
14234
#ifdef WOLFSSL_DTLS13
14235
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
14236
                                   HANDSHAKE_HEADER_SZ;
14237
#else
14238
    (void)ssl;
14239
14240
    headerSz = HANDSHAKE_HEADER_SZ;
14241
#endif
14242
14243
    innerCh = ech->innerClientHello + headerSz;
14244
    innerChLen = ech->innerClientHelloLen;
14245
14246
    idx = OPAQUE16_LEN + RAN_LEN;
14247
    if (idx >= innerChLen)
14248
        return BUFFER_ERROR;
14249
14250
    sessionIdLen = innerCh[idx++];
14251
    /* innerHello sessionID must initially be empty */
14252
    if (sessionIdLen != 0)
14253
        return INVALID_PARAMETER;
14254
    idx += sessionIdLen;
14255
    if (idx + OPAQUE16_LEN > innerChLen)
14256
        return BUFFER_ERROR;
14257
14258
    ato16(innerCh + idx, &cipherSuitesLen);
14259
    idx += OPAQUE16_LEN + cipherSuitesLen;
14260
    if (idx >= innerChLen)
14261
        return BUFFER_ERROR;
14262
14263
    compressionLen = innerCh[idx++];
14264
    idx += compressionLen;
14265
    if (idx + OPAQUE16_LEN > innerChLen)
14266
        return BUFFER_ERROR;
14267
14268
    ato16(innerCh + idx, &extLen);
14269
    idx += OPAQUE16_LEN + extLen;
14270
    if (idx > innerChLen)
14271
        return BUFFER_ERROR;
14272
14273
    /* should now be at the end of the innerHello
14274
     * Per ECH spec all padding bytes MUST be 0 */
14275
    for (i = idx; i < innerChLen; i++) {
14276
        acc |= innerCh[i];
14277
    }
14278
    if (acc != 0) {
14279
        return INVALID_PARAMETER;
14280
    }
14281
14282
    ech->innerClientHelloLen -= i - idx;
14283
    return 0;
14284
}
14285
14286
/* Locate the given extension type, use the extOffset to start off after where a
14287
 * previous call to this function ended
14288
 *
14289
 * outerCh          The outer ClientHello buffer.
14290
 * chLen            Outer ClientHello length.
14291
 * extType          Extension type to look for.
14292
 * extLen           Out parameter, length of found extension.
14293
 * extOffset        Offset into outer ClientHello to look for extension from.
14294
 * extensionsStart  Start of outer ClientHello extensions.
14295
 * extensionsLen    Length of outer ClientHello extensions.
14296
 * returns 0 on success and otherwise failure.
14297
 */
14298
static const byte* TLSX_ECH_FindOuterExtension(const byte* outerCh,
14299
    word32 chLen, word16 extType, word32* extLen, word32* extOffset,
14300
    word16* extensionsStart, word16* extensionsLen)
14301
{
14302
    word32 idx = *extOffset;
14303
    byte sessionIdLen;
14304
    word16 cipherSuitesLen;
14305
    byte compressionLen;
14306
    word16 type;
14307
    word16 len;
14308
14309
    if (idx == 0) {
14310
        idx = OPAQUE16_LEN + RAN_LEN;
14311
        if (idx >= chLen)
14312
            return NULL;
14313
14314
        sessionIdLen = outerCh[idx++];
14315
        idx += sessionIdLen;
14316
        if (idx + OPAQUE16_LEN > chLen)
14317
            return NULL;
14318
14319
        ato16(outerCh + idx, &cipherSuitesLen);
14320
        idx += OPAQUE16_LEN + cipherSuitesLen;
14321
        if (idx >= chLen)
14322
            return NULL;
14323
14324
        compressionLen = outerCh[idx++];
14325
        idx += compressionLen;
14326
        if (idx + OPAQUE16_LEN > chLen)
14327
            return NULL;
14328
14329
        ato16(outerCh + idx, extensionsLen);
14330
        idx += OPAQUE16_LEN;
14331
        *extensionsStart = (word16)idx;
14332
14333
        if (idx + *extensionsLen > chLen)
14334
            return NULL;
14335
    }
14336
14337
    while (idx - *extensionsStart < *extensionsLen) {
14338
        if (idx + OPAQUE16_LEN + OPAQUE16_LEN > chLen)
14339
            return NULL;
14340
14341
        ato16(outerCh + idx, &type);
14342
        idx += OPAQUE16_LEN;
14343
        ato16(outerCh + idx, &len);
14344
        idx += OPAQUE16_LEN;
14345
14346
        if (idx + len - *extensionsStart > *extensionsLen)
14347
            return NULL;
14348
14349
        if (type == extType) {
14350
            *extLen = len + OPAQUE16_LEN + OPAQUE16_LEN;
14351
            *extOffset = idx + len;
14352
            return outerCh + idx - OPAQUE16_LEN - OPAQUE16_LEN;
14353
        }
14354
14355
        idx += len;
14356
    }
14357
14358
    return NULL;
14359
}
14360
14361
/* If newinnerCh is NULL, validate ordering and existence of references
14362
 *   - updates newInnerChLen with total length of selected extensions
14363
 * If newinnerCh is not NULL, copy extensions into newInnerCh
14364
 *
14365
 * outerCh          The outer ClientHello buffer.
14366
 * outerChLen       Outer ClientHello length.
14367
 * newInnerCh       The inner ClientHello buffer.
14368
 * newInnerChLen    Inner ClientHello length.
14369
 * numOuterRefs     Number of references described by OuterExtensions extension.
14370
 * OuterRefTypes    References described by OuterExtensions extension.
14371
 * returns 0 on success and otherwise failure.
14372
 */
14373
static int TLSX_ECH_CopyOuterExtensions(const byte* outerCh, word32 outerChLen,
14374
    byte** newInnerCh, word32* newInnerChLen,
14375
    word16 numOuterRefs, const byte* outerRefTypes)
14376
{
14377
    int ret = 0;
14378
    word16 refType;
14379
    word32 outerExtLen;
14380
    word32 outerExtOffset = 0;
14381
    word16 extsStart = 0;
14382
    word16 extsLen = 0;
14383
    const byte* outerExtData;
14384
14385
    if (newInnerCh == NULL) {
14386
        *newInnerChLen = 0;
14387
    }
14388
14389
    while (numOuterRefs-- > 0) {
14390
        ato16(outerRefTypes, &refType);
14391
14392
        if (refType == TLSXT_ECH) {
14393
            WOLFSSL_MSG("ECH: ech_outer_extensions references ECH");
14394
            ret = INVALID_PARAMETER;
14395
            break;
14396
        }
14397
14398
        outerExtData = TLSX_ECH_FindOuterExtension(outerCh, outerChLen,
14399
                            refType, &outerExtLen, &outerExtOffset,
14400
                            &extsStart, &extsLen);
14401
14402
        if (outerExtData == NULL) {
14403
            WOLFSSL_MSG("ECH: referenced extension not in outer CH or out "
14404
                        "of order");
14405
            ret = INVALID_PARAMETER;
14406
            break;
14407
        }
14408
14409
        if (newInnerCh == NULL) {
14410
            *newInnerChLen += outerExtLen;
14411
        }
14412
        else {
14413
            XMEMCPY(*newInnerCh, outerExtData, outerExtLen);
14414
            *newInnerCh += outerExtLen;
14415
        }
14416
14417
        outerRefTypes += OPAQUE16_LEN;
14418
    }
14419
14420
    return ret;
14421
}
14422
14423
/* Expand ech_outer_extensions in the inner ClientHello by copying referenced
14424
 * extensions from the outer ClientHello.
14425
 * If the sessionID exists in the outer ClientHello then also copy that into the
14426
 * expanded inner ClientHello.
14427
 *
14428
 * ssl      SSL/TLS object.
14429
 * ech      ECH object.
14430
 * heap     Heap hint.
14431
 * returns 0 on success and otherwise failure.
14432
 */
14433
static int TLSX_ECH_ExpandOuterExtensions(WOLFSSL* ssl, WOLFSSL_ECH* ech,
14434
    void* heap)
14435
{
14436
    int ret = 0;
14437
    int headerSz;
14438
    const byte* innerCh;
14439
    word32 innerChLen;
14440
    const byte* outerCh;
14441
    word32 outerChLen;
14442
    word32 idx;
14443
    byte sessionIdLen;
14444
    word16 cipherSuitesLen;
14445
    byte compressionLen;
14446
14447
    word32 innerExtIdx;
14448
    word16 innerExtLen;
14449
    word32 echOuterExtIdx = 0;
14450
    word16 echOuterExtLen = 0;
14451
    int foundEchOuter = 0;
14452
    word16 numOuterRefs = 0;
14453
    const byte* outerRefTypes = NULL;
14454
    word32 extraSize = 0;
14455
    byte* newInnerCh = NULL;
14456
    byte* newInnerChRef;
14457
    word32 newInnerChLen;
14458
    word32 copyLen;
14459
14460
    WOLFSSL_ENTER("TLSX_ExpandEchOuterExtensions");
14461
14462
    if (ech == NULL || ech->innerClientHello == NULL || ech->aad == NULL)
14463
        return BAD_FUNC_ARG;
14464
14465
#ifdef WOLFSSL_DTLS13
14466
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
14467
                                   HANDSHAKE_HEADER_SZ;
14468
#else
14469
    headerSz = HANDSHAKE_HEADER_SZ;
14470
#endif
14471
14472
    innerCh = ech->innerClientHello + headerSz;
14473
    innerChLen = ech->innerClientHelloLen;
14474
    outerCh = ech->aad;
14475
    outerChLen = ech->aadLen;
14476
14477
    /* don't need to check for buffer overflows here since they are caught by
14478
     * TLSX_ECH_CheckInnerPadding */
14479
    idx = OPAQUE16_LEN + RAN_LEN;
14480
14481
    sessionIdLen = innerCh[idx++];
14482
    idx += sessionIdLen;
14483
14484
    ato16(innerCh + idx, &cipherSuitesLen);
14485
    idx += OPAQUE16_LEN + cipherSuitesLen;
14486
14487
    compressionLen = innerCh[idx++];
14488
    idx += compressionLen;
14489
14490
    ato16(innerCh + idx, &innerExtLen);
14491
    idx += OPAQUE16_LEN;
14492
    innerExtIdx = idx;
14493
14494
    /* validate ech_outer_extensions and calculate extra size */
14495
    while (idx < innerChLen && (idx - innerExtIdx) < innerExtLen) {
14496
        word16 type;
14497
        word16 len;
14498
        byte outerExtListLen;
14499
14500
        if (idx + OPAQUE16_LEN + OPAQUE16_LEN > innerChLen)
14501
            return BUFFER_ERROR;
14502
14503
        ato16(innerCh + idx, &type);
14504
        idx += OPAQUE16_LEN;
14505
        ato16(innerCh + idx, &len);
14506
        idx += OPAQUE16_LEN;
14507
14508
        if (idx + len > innerChLen)
14509
            return BUFFER_ERROR;
14510
14511
        if (type == TLSXT_ECH_OUTER_EXTENSIONS) {
14512
            if (foundEchOuter) {
14513
                WOLFSSL_MSG("ECH: duplicate ech_outer_extensions");
14514
                return INVALID_PARAMETER;
14515
            }
14516
            foundEchOuter = 1;
14517
            echOuterExtIdx = idx - OPAQUE16_LEN - OPAQUE16_LEN;
14518
            echOuterExtLen = len + OPAQUE16_LEN + OPAQUE16_LEN;
14519
14520
            /* ech_outer_extensions data format: 1-byte length + extension types
14521
             * ExtensionType OuterExtensions<2..254>; */
14522
            if (len < 1)
14523
                return BUFFER_ERROR;
14524
            outerExtListLen = innerCh[idx];
14525
            if (outerExtListLen + 1 != len || outerExtListLen < 2 ||
14526
                    outerExtListLen == 255)
14527
                return BUFFER_ERROR;
14528
14529
            outerRefTypes = innerCh + idx + 1;
14530
            numOuterRefs = outerExtListLen / OPAQUE16_LEN;
14531
14532
            ret = TLSX_ECH_CopyOuterExtensions(outerCh, outerChLen, NULL,
14533
                    &extraSize, numOuterRefs, outerRefTypes);
14534
            if (ret != 0)
14535
                return ret;
14536
        }
14537
14538
        idx += len;
14539
    }
14540
14541
    newInnerChLen = innerChLen - echOuterExtLen + extraSize - sessionIdLen +
14542
                        ssl->session->sessionIDSz;
14543
    if (newInnerChLen > 0xFFFF) {
14544
        return BUFFER_E;
14545
    }
14546
14547
    if (!foundEchOuter && sessionIdLen == ssl->session->sessionIDSz) {
14548
        /* no extensions + no sessionID to copy */
14549
        WOLFSSL_MSG("ECH: no EchOuterExtensions extension found");
14550
        return ret;
14551
    }
14552
    else {
14553
        newInnerCh = (byte*)XMALLOC(newInnerChLen + headerSz, heap,
14554
                                    DYNAMIC_TYPE_TMP_BUFFER);
14555
        if (newInnerCh == NULL)
14556
            return MEMORY_E;
14557
    }
14558
14559
    /* note: The first HANDSHAKE_HEADER_SZ bytes are reserved for the header
14560
     * but not initialized here. The header will be properly set later by
14561
     * AddTls13HandShakeHeader() in DoTls13ClientHello(). */
14562
14563
    /* copy everything up to EchOuterExtensions */
14564
    newInnerChRef = newInnerCh + headerSz;
14565
    copyLen = OPAQUE16_LEN + RAN_LEN;
14566
    XMEMCPY(newInnerChRef, innerCh, copyLen);
14567
    newInnerChRef += copyLen;
14568
14569
    *newInnerChRef = ssl->session->sessionIDSz;
14570
    newInnerChRef += OPAQUE8_LEN;
14571
14572
    copyLen = ssl->session->sessionIDSz;
14573
    XMEMCPY(newInnerChRef, ssl->session->sessionID, copyLen);
14574
    newInnerChRef += copyLen;
14575
14576
    if (!foundEchOuter) {
14577
        WOLFSSL_MSG("ECH: no EchOuterExtensions extension found");
14578
14579
        copyLen = innerChLen - OPAQUE16_LEN - RAN_LEN - OPAQUE8_LEN -
14580
                sessionIdLen;
14581
        XMEMCPY(newInnerChRef, innerCh + OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN +
14582
                sessionIdLen, copyLen);
14583
    }
14584
    else {
14585
        innerExtIdx = headerSz + innerExtIdx - OPAQUE16_LEN -
14586
            sessionIdLen + ssl->session->sessionIDSz;
14587
14588
        copyLen = echOuterExtIdx - OPAQUE16_LEN - RAN_LEN - OPAQUE8_LEN -
14589
                sessionIdLen;
14590
        XMEMCPY(newInnerChRef, innerCh + OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN +
14591
                sessionIdLen, copyLen);
14592
        newInnerChRef += copyLen;
14593
14594
        /* update extensions length in the new ClientHello */
14595
        c16toa(innerExtLen - echOuterExtLen + (word16)extraSize,
14596
                newInnerCh + innerExtIdx);
14597
14598
        ret = TLSX_ECH_CopyOuterExtensions(outerCh, outerChLen, &newInnerChRef,
14599
                &newInnerChLen, numOuterRefs, outerRefTypes);
14600
        if (ret == 0) {
14601
            /* copy remaining extensions after ech_outer_extensions */
14602
            copyLen = innerChLen - (echOuterExtIdx + echOuterExtLen);
14603
            XMEMCPY(newInnerChRef, innerCh + echOuterExtIdx + echOuterExtLen,
14604
                    copyLen);
14605
14606
            WOLFSSL_MSG("ECH: expanded ech_outer_extensions successfully");
14607
        }
14608
    }
14609
14610
    if (ret == 0) {
14611
        XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
14612
        ech->innerClientHello = newInnerCh;
14613
        ech->innerClientHelloLen = newInnerChLen;
14614
        newInnerCh = NULL;
14615
    }
14616
14617
    if (newInnerCh != NULL)
14618
        XFREE(newInnerCh, heap, DYNAMIC_TYPE_TMP_BUFFER);
14619
14620
    return ret;
14621
}
14622
14623
/* return status after attempting to open the hpke encrypted ech extension, if
14624
 * successful the inner client hello will be stored in
14625
 * ech->innerClientHelloLen */
14626
static int TLSX_ExtractEch(WOLFSSL* ssl, WOLFSSL_ECH* ech,
14627
    WOLFSSL_EchConfig* echConfig, byte* aad, word32 aadLen)
14628
{
14629
    int ret = 0;
14630
    int i;
14631
    int allocatedHpke = 0;
14632
    word32 rawConfigLen = 0;
14633
    byte* info = NULL;
14634
    word32 infoLen = 0;
14635
    if (ssl == NULL || ech == NULL || echConfig == NULL || aad == NULL)
14636
        return BAD_FUNC_ARG;
14637
    /* verify the kem and key len */
14638
    if (wc_HpkeKemGetEncLen(echConfig->kemId) != ech->encLen)
14639
        return BAD_FUNC_ARG;
14640
    /* verify the cipher suite */
14641
    for (i = 0; i < echConfig->numCipherSuites; i++) {
14642
        if (echConfig->cipherSuites[i].kdfId == ech->cipherSuite.kdfId &&
14643
            echConfig->cipherSuites[i].aeadId == ech->cipherSuite.aeadId) {
14644
            break;
14645
        }
14646
    }
14647
    if (i >= echConfig->numCipherSuites) {
14648
        return BAD_FUNC_ARG;
14649
    }
14650
    /* check if hpke already exists, may if HelloRetryRequest */
14651
    if (ech->hpke == NULL) {
14652
        allocatedHpke = 1;
14653
        ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), ssl->heap,
14654
            DYNAMIC_TYPE_TMP_BUFFER);
14655
        if (ech->hpke == NULL)
14656
            ret = MEMORY_E;
14657
        /* init the hpke struct */
14658
        if (ret == 0) {
14659
            ret = wc_HpkeInit(ech->hpke, echConfig->kemId,
14660
                ech->cipherSuite.kdfId, ech->cipherSuite.aeadId, ssl->heap);
14661
        }
14662
        if (ret == 0) {
14663
            /* allocate hpkeContext */
14664
            ech->hpkeContext =
14665
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
14666
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
14667
            if (ech->hpkeContext == NULL)
14668
                ret = MEMORY_E;
14669
        }
14670
        /* get the rawConfigLen */
14671
        if (ret == 0)
14672
            ret = GetEchConfig(echConfig, NULL, &rawConfigLen);
14673
        if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
14674
            ret = 0;
14675
        /* create info */
14676
        if (ret == 0) {
14677
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + rawConfigLen;
14678
            info = (byte*)XMALLOC(infoLen, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14679
14680
            if (info == NULL)
14681
                ret = MEMORY_E;
14682
            else {
14683
                XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
14684
                    TLS_INFO_CONST_STRING_SZ + 1);
14685
                ret = GetEchConfig(echConfig, info +
14686
                    TLS_INFO_CONST_STRING_SZ + 1, &rawConfigLen);
14687
            }
14688
        }
14689
#ifdef HAVE_SECRET_CALLBACK
14690
        /* allocate secret buffer for wc_HpkeInitOpenContext to copy into */
14691
        if (ret == 0 && (ssl->tls13SecretCb != NULL
14692
#ifdef OPENSSL_EXTRA
14693
                || ssl->tls13KeyLogCb != NULL
14694
#endif
14695
                )) {
14696
            ret = wc_HpkeInitEchSecret(ech->hpke);
14697
        }
14698
#endif /* HAVE_SECRET_CALLBACK */
14699
        /* init the context for opening */
14700
        if (ret == 0) {
14701
            ret = wc_HpkeInitOpenContext(ech->hpke, ech->hpkeContext,
14702
                echConfig->receiverPrivkey, ech->enc, ech->encLen, info,
14703
                infoLen);
14704
        }
14705
    }
14706
    /* decrypt the ech payload */
14707
    if (ret == 0) {
14708
        ret = wc_HpkeContextOpenBase(ech->hpke, ech->hpkeContext, aad, aadLen,
14709
            ech->outerClientPayload, ech->innerClientHelloLen,
14710
            ech->innerClientHello + HANDSHAKE_HEADER_SZ);
14711
    }
14712
14713
#ifdef HAVE_SECRET_CALLBACK
14714
    if (ret == 0 && ech->hpke->echSecret != NULL) {
14715
        ret = EchWriteKeyLog(ssl, ech->hpke->echSecret, ech->hpke->Nsecret,
14716
                info + TLS_INFO_CONST_STRING_SZ + 1, rawConfigLen);
14717
    }
14718
    wc_HpkeFreeEchSecret(ech->hpke);
14719
#endif /* HAVE_SECRET_CALLBACK */
14720
14721
    /* only free hpke/hpkeContext if allocated in this call; otherwise preserve
14722
     * them for clientHello2 */
14723
    if (ret != 0 && allocatedHpke) {
14724
        XFREE(ech->hpke, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14725
        ech->hpke = NULL;
14726
        if (ech->hpkeContext != NULL) {
14727
            ForceZero(ech->hpkeContext, sizeof(HpkeBaseContext));
14728
            XFREE(ech->hpkeContext, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14729
            ech->hpkeContext = NULL;
14730
        }
14731
    }
14732
14733
    if (info != NULL)
14734
        XFREE(info, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14735
14736
    return ret;
14737
}
14738
14739
/* parse the ech extension, if internal update ech->state and return, if
14740
 * external attempt to extract the inner client_hello, return the status */
14741
static int TLSX_ECH_Parse(WOLFSSL* ssl, const byte* readBuf, word16 size,
14742
    byte msgType)
14743
{
14744
    int ret = 0;
14745
    TLSX* echX;
14746
    WOLFSSL_ECH* ech;
14747
    WOLFSSL_EchConfig* echConfig;
14748
    byte* aadCopy;
14749
    byte* readBuf_p = (byte*)readBuf;
14750
    word32 offset = 0;
14751
    word16 len;
14752
    word16 tmpVal16;
14753
    word16 lenCh;
14754
14755
    WOLFSSL_MSG("TLSX_ECH_Parse");
14756
    if (ssl->options.disableECH) {
14757
        WOLFSSL_MSG("TLSX_ECH_Parse: ECH disabled. Ignoring.");
14758
        return 0;
14759
    }
14760
    if (size == 0)
14761
        return BAD_FUNC_ARG;
14762
14763
    /* retry configs */
14764
    if (msgType == encrypted_extensions) {
14765
        /* configs must only be sent on ECH rejection (RFC9849, Section 5) */
14766
        if (ssl->options.echAccepted) {
14767
            SendAlert(ssl, alert_fatal, unsupported_extension);
14768
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
14769
            return UNSUPPORTED_EXTENSION;
14770
        }
14771
14772
        ret = SetRetryConfigs(ssl, readBuf, (word32)size);
14773
        if (ret == WC_NO_ERR_TRACE(UNSUPPORTED_SUITE) ||
14774
                ret == WC_NO_ERR_TRACE(UNSUPPORTED_PROTO_VERSION)) {
14775
            WOLFSSL_MSG("ECH retry configs had 'bad version' or 'bad suite'");
14776
            ret = 0;
14777
        }
14778
14779
        if (ssl->echConfigs == NULL) {
14780
            /* on GREASE connection configs must be checked syntactically and
14781
             * must not be saved (RFC 9849, Section 6.2.1) */
14782
            FreeEchConfigs(ssl->echRetryConfigs, ssl->heap);
14783
            ssl->echRetryConfigs = NULL;
14784
        }
14785
14786
        /* retry configs may only be accepted at the point when ECH_REQUIRED is
14787
         * sent */
14788
        ssl->options.echRetryConfigsAccepted = 0;
14789
    }
14790
    /* HRR with special confirmation */
14791
    else if (msgType == hello_retry_request && ssl->echConfigs != NULL) {
14792
        /* length must be 8 */
14793
        if (size != ECH_ACCEPT_CONFIRMATION_SZ)
14794
            return BUFFER_ERROR;
14795
14796
        /* get extension */
14797
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
14798
        if (echX == NULL)
14799
            return BAD_FUNC_ARG;
14800
        ech = (WOLFSSL_ECH*)echX->data;
14801
14802
        ech->confBuf = (byte*)readBuf;
14803
    }
14804
    else if (msgType == client_hello && ssl->ctx->echConfigs != NULL) {
14805
        /* get extension */
14806
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
14807
        if (echX == NULL)
14808
            return BAD_FUNC_ARG;
14809
        ech = (WOLFSSL_ECH*)echX->data;
14810
14811
        /* if the first ECH was rejected or CH1 did not have ECH then there is
14812
         * no need to decrypt this one */
14813
        if (!ssl->options.echAccepted && ssl->options.serverState ==
14814
                SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
14815
            ech->state = ECH_WRITE_RETRY_CONFIGS;
14816
            return 0;
14817
        }
14818
14819
        /* read the ech parameters before the payload */
14820
        ech->type = *readBuf_p;
14821
        readBuf_p++;
14822
        offset += 1;
14823
        if (ssl->options.echProcessingInner && ech->type == ECH_TYPE_INNER) {
14824
            ech->state = ECH_PARSED_INTERNAL;
14825
            return 0;
14826
        }
14827
        else if ((!ssl->options.echProcessingInner &&
14828
                  ech->type != ECH_TYPE_OUTER) ||
14829
                 (ssl->options.echProcessingInner &&
14830
                  ech->type != ECH_TYPE_INNER)) {
14831
            /* MUST process INNER in inner hello and OUTER in outer hello */
14832
            return INVALID_PARAMETER;
14833
        }
14834
        /* Must have kdfId, aeadId, configId, enc len and payload len. */
14835
        if (size < offset + 2 + 2 + 1 + 2 + 2) {
14836
            return BUFFER_ERROR;
14837
        }
14838
        /* only get enc if we don't already have the hpke context */
14839
        if (ech->hpkeContext == NULL) {
14840
            /* kdfId */
14841
            ato16(readBuf_p, &ech->cipherSuite.kdfId);
14842
            readBuf_p += 2;
14843
            offset += 2;
14844
            /* aeadId */
14845
            ato16(readBuf_p, &ech->cipherSuite.aeadId);
14846
            readBuf_p += 2;
14847
            offset += 2;
14848
            /* configId */
14849
            ech->configId = *readBuf_p;
14850
            readBuf_p++;
14851
            offset++;
14852
            /* encLen */
14853
            ato16(readBuf_p, &len);
14854
            readBuf_p += 2;
14855
            offset += 2;
14856
            /* Check encLen isn't more than remaining bytes minus
14857
             * payload length. */
14858
            if (len > size - offset - 2) {
14859
                return BUFFER_ERROR;
14860
            }
14861
            if (len > HPKE_Npk_MAX) {
14862
                return BUFFER_ERROR;
14863
            }
14864
            /* read enc */
14865
            XMEMCPY(ech->enc, readBuf_p, len);
14866
            ech->encLen = len;
14867
        }
14868
        else {
14869
            /* kdfId, aeadId, and configId must be the same as last time */
14870
            /* kdfId */
14871
            ato16(readBuf_p, &tmpVal16);
14872
            if (tmpVal16 != ech->cipherSuite.kdfId) {
14873
                return INVALID_PARAMETER;
14874
            }
14875
            readBuf_p += 2;
14876
            offset += 2;
14877
            /* aeadId */
14878
            ato16(readBuf_p, &tmpVal16);
14879
            if (tmpVal16 != ech->cipherSuite.aeadId) {
14880
                return INVALID_PARAMETER;
14881
            }
14882
            readBuf_p += 2;
14883
            offset += 2;
14884
            /* configId */
14885
            if (*readBuf_p != ech->configId) {
14886
                return INVALID_PARAMETER;
14887
            }
14888
            readBuf_p++;
14889
            offset++;
14890
            /* on an HRR the enc value MUST be empty */
14891
            ato16(readBuf_p, &len);
14892
            if (len != 0) {
14893
                return INVALID_PARAMETER;
14894
            }
14895
            readBuf_p += 2;
14896
            offset += 2;
14897
        }
14898
        readBuf_p += len;
14899
        offset += len;
14900
        /* read payload (encrypted CH) len */
14901
        ato16(readBuf_p, &lenCh);
14902
        ech->innerClientHelloLen = lenCh;
14903
        readBuf_p += 2;
14904
        offset += 2;
14905
        /* Check payload is no bigger than remaining bytes. */
14906
        if (ech->innerClientHelloLen > size - offset) {
14907
            return BUFFER_ERROR;
14908
        }
14909
        if (ech->innerClientHelloLen < WC_AES_BLOCK_SIZE) {
14910
            return BUFFER_ERROR;
14911
        }
14912
        ech->innerClientHelloLen -= WC_AES_BLOCK_SIZE;
14913
        ech->outerClientPayload = readBuf_p;
14914
        /* make a copy of the aad */
14915
        aadCopy = (byte*)XMALLOC(ech->aadLen, ssl->heap,
14916
            DYNAMIC_TYPE_TMP_BUFFER);
14917
        if (aadCopy == NULL)
14918
            return MEMORY_E;
14919
        XMEMCPY(aadCopy, ech->aad, ech->aadLen);
14920
        /* set the ech payload of the copy to zeros */
14921
        XMEMSET(aadCopy + (readBuf_p - ech->aad), 0,
14922
            ech->innerClientHelloLen + WC_AES_BLOCK_SIZE);
14923
        /* free the old ech when this is the second client hello */
14924
        if (ech->innerClientHello != NULL)
14925
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14926
        /* allocate the inner payload buffer */
14927
        ech->innerClientHello =
14928
            (byte*)XMALLOC(ech->innerClientHelloLen + HANDSHAKE_HEADER_SZ,
14929
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14930
        if (ech->innerClientHello == NULL) {
14931
            XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14932
            return MEMORY_E;
14933
        }
14934
        /* try to decrypt with matching configId */
14935
        echConfig = ssl->ctx->echConfigs;
14936
        while (echConfig != NULL) {
14937
            if (echConfig->configId == ech->configId) {
14938
                ret = TLSX_ExtractEch(ssl, ech, echConfig, aadCopy,
14939
                        ech->aadLen);
14940
                if (ret == 0 || ret == WC_NO_ERR_TRACE(TLS13_SECRET_CB_E))
14941
                    break;
14942
            }
14943
            echConfig = echConfig->next;
14944
        }
14945
        /* otherwise, try to decrypt with all configs (trial decryption) */
14946
        if (echConfig == NULL && ssl->options.enableEchTrialDecrypt) {
14947
            echConfig = ssl->ctx->echConfigs;
14948
            while (echConfig != NULL) {
14949
                if (echConfig->configId != ech->configId) {
14950
                    ret = TLSX_ExtractEch(ssl, ech, echConfig, aadCopy,
14951
                            ech->aadLen);
14952
                    if (ret == 0 || ret == WC_NO_ERR_TRACE(TLS13_SECRET_CB_E))
14953
                        break;
14954
                }
14955
                echConfig = echConfig->next;
14956
            }
14957
        }
14958
        /* TLS13_SECRET_CB_E isn't correlated with ECH acceptance so skip both
14959
         * paths */
14960
        if (ret != WC_NO_ERR_TRACE(TLS13_SECRET_CB_E)) {
14961
            /* if we failed to extract/expand */
14962
            if (ret != 0 || echConfig == NULL) {
14963
                WOLFSSL_MSG("ECH rejected");
14964
14965
                if (ssl->options.echAccepted == 0) {
14966
                    /* on SH1 prepare to write retry configs */
14967
                    XFREE(ech->innerClientHello, ssl->heap,
14968
                        DYNAMIC_TYPE_TMP_BUFFER);
14969
                    ech->innerClientHello = NULL;
14970
                    ech->state = ECH_WRITE_RETRY_CONFIGS;
14971
                    ret = 0;
14972
                }
14973
                else {
14974
                    /* on SH2 failure to decrypt is fatal */
14975
                    SendAlert(ssl, alert_fatal, decrypt_error);
14976
                    WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
14977
                    ret = DECRYPT_ERROR;
14978
                }
14979
            }
14980
            else {
14981
                WOLFSSL_MSG("ECH accepted");
14982
                ssl->options.echAccepted = 1;
14983
14984
                ret = TLSX_ECH_CheckInnerPadding(ssl, ech);
14985
                if (ret == 0) {
14986
                    /* expand EchOuterExtensions if present.
14987
                    * Also, if it exists, copy sessionID from outer hello */
14988
                    ret = TLSX_ECH_ExpandOuterExtensions(ssl, ech, ssl->heap);
14989
                }
14990
            }
14991
        }
14992
        if (ret != 0) {
14993
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14994
            ech->innerClientHello = NULL;
14995
        }
14996
14997
        XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14998
    }
14999
15000
    return ret;
15001
}
15002
15003
/* free the ech struct and the dynamic buffer it uses */
15004
static void TLSX_ECH_Free(WOLFSSL_ECH* ech, void* heap)
15005
{
15006
    XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
15007
    if (ech->hpke != NULL) {
15008
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
15009
            ech->hpke->heap);
15010
        /* wc_HpkeFreeEchSecret is intentionally not here, free it in
15011
         * TLSX_ExtractEch / TLSX_FinalizeEch */
15012
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
15013
    }
15014
    if (ech->hpkeContext != NULL) {
15015
        ForceZero(ech->hpkeContext, sizeof(HpkeBaseContext));
15016
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
15017
    }
15018
15019
    XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
15020
    (void)heap;
15021
}
15022
15023
/* encrypt the client hello and store it in ech->outerClientPayload, return
15024
 * status */
15025
int TLSX_FinalizeEch(WOLFSSL* ssl, WOLFSSL_ECH* ech, byte* aad, word32 aadLen)
15026
{
15027
    int ret = 0;
15028
    void* receiverPubkey = NULL;
15029
    byte* info = NULL;
15030
    int infoLen = 0;
15031
    byte* aadCopy = NULL;
15032
    if (ssl == NULL || ech == NULL || aad == NULL)
15033
        return BAD_FUNC_ARG;
15034
    /* setup hpke context to seal, should be done at most once per connection */
15035
    if (ech->hpkeContext == NULL) {
15036
        /* import the server public key */
15037
        ret = wc_HpkeDeserializePublicKey(ech->hpke, &receiverPubkey,
15038
            ech->echConfig->receiverPubkey, ech->encLen);
15039
        if (ret == 0) {
15040
            /* allocate hpke context */
15041
            ech->hpkeContext =
15042
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
15043
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
15044
            if (ech->hpkeContext == NULL)
15045
                ret = MEMORY_E;
15046
        }
15047
        if (ret == 0) {
15048
            /* create info */
15049
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + ech->echConfig->rawLen;
15050
            info = (byte*)XMALLOC(infoLen, ech->hpke->heap,
15051
                DYNAMIC_TYPE_TMP_BUFFER);
15052
            if (info == NULL)
15053
                ret = MEMORY_E;
15054
        }
15055
        if (ret == 0) {
15056
            /* puts the null byte in for me */
15057
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
15058
                TLS_INFO_CONST_STRING_SZ + 1);
15059
            XMEMCPY(info + TLS_INFO_CONST_STRING_SZ + 1,
15060
                ech->echConfig->raw, ech->echConfig->rawLen);
15061
        }
15062
#ifdef HAVE_SECRET_CALLBACK
15063
        /* allocate secret buffer for wc_HpkeInitSealContext to copy into */
15064
        if (ret == 0 && (ssl->tls13SecretCb != NULL
15065
#ifdef OPENSSL_EXTRA
15066
                || ssl->tls13KeyLogCb != NULL
15067
#endif
15068
                )) {
15069
            ret = wc_HpkeInitEchSecret(ech->hpke);
15070
        }
15071
#endif /* HAVE_SECRET_CALLBACK */
15072
        if (ret == 0) {
15073
            /* init the context for seal with info and keys */
15074
            ret = wc_HpkeInitSealContext(ech->hpke, ech->hpkeContext,
15075
                ech->ephemeralKey, receiverPubkey, info, infoLen);
15076
        }
15077
    }
15078
    if (ret == 0) {
15079
        /* make a copy of the aad since we overwrite it */
15080
        aadCopy = (byte*)XMALLOC(aadLen, ech->hpke->heap,
15081
            DYNAMIC_TYPE_TMP_BUFFER);
15082
        if (aadCopy == NULL) {
15083
            ret = MEMORY_E;
15084
        }
15085
    }
15086
    if (ret == 0) {
15087
        XMEMCPY(aadCopy, aad, aadLen);
15088
        /* seal the payload with context */
15089
        ret = wc_HpkeContextSealBase(ech->hpke, ech->hpkeContext, aadCopy,
15090
            aadLen, ech->innerClientHello,
15091
            ech->innerClientHelloLen - ech->hpke->Nt, ech->outerClientPayload);
15092
    }
15093
15094
#ifdef HAVE_SECRET_CALLBACK
15095
    if (ret == 0 && ech->hpke->echSecret != NULL) {
15096
        ret = EchWriteKeyLog(ssl, ech->hpke->echSecret, ech->hpke->Nsecret,
15097
            ech->echConfig->raw, ech->echConfig->rawLen);
15098
    }
15099
    wc_HpkeFreeEchSecret(ech->hpke);
15100
#endif /* HAVE_SECRET_CALLBACK */
15101
15102
    if (info != NULL)
15103
        XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
15104
    if (aadCopy != NULL)
15105
        XFREE(aadCopy, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
15106
    if (receiverPubkey != NULL)
15107
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, receiverPubkey,
15108
            ech->hpke->heap);
15109
    return ret;
15110
}
15111
15112
#define GREASE_ECH_USE TLSX_GreaseECH_Use
15113
#define ECH_USE TLSX_ECH_Use
15114
#define SERVER_ECH_USE TLSX_ServerECH_Use
15115
#define ECH_WRITE TLSX_ECH_Write
15116
#define ECH_GET_SIZE TLSX_ECH_GetSize
15117
#define ECH_PARSE TLSX_ECH_Parse
15118
#define ECH_FREE TLSX_ECH_Free
15119
15120
#endif /* WOLFSSL_TLS13 && HAVE_ECH */
15121
15122
/** Releases all extensions in the provided list. */
15123
void TLSX_FreeAll(TLSX* list, void* heap)
15124
5.46k
{
15125
5.46k
    TLSX* extension;
15126
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15127
    TLSX* echList;
15128
    TLSX* tail;
15129
#endif
15130
15131
5.46k
    while ((extension = list)) {
15132
0
        list = extension->next;
15133
15134
0
        switch (extension->type) {
15135
#if defined(HAVE_RPK)
15136
            case TLSX_CLIENT_CERTIFICATE_TYPE:
15137
                WOLFSSL_MSG("Client Certificate Type extension free");
15138
                /* nothing to do */
15139
                break;
15140
            case TLSX_SERVER_CERTIFICATE_TYPE:
15141
                WOLFSSL_MSG("Server Certificate Type extension free");
15142
                /* nothing to do */
15143
                break;
15144
#endif
15145
15146
0
#ifdef HAVE_SNI
15147
0
            case TLSX_SERVER_NAME:
15148
0
                WOLFSSL_MSG("SNI extension free");
15149
0
                SNI_FREE_ALL((SNI*)extension->data, heap);
15150
0
                break;
15151
0
#endif
15152
15153
0
            case TLSX_TRUSTED_CA_KEYS:
15154
0
                WOLFSSL_MSG("Trusted CA Indication extension free");
15155
0
                TCA_FREE_ALL((TCA*)extension->data, heap);
15156
0
                break;
15157
15158
0
            case TLSX_MAX_FRAGMENT_LENGTH:
15159
0
                WOLFSSL_MSG("Max Fragment Length extension free");
15160
0
                MFL_FREE_ALL(extension->data, heap);
15161
0
                break;
15162
15163
0
            case TLSX_EXTENDED_MASTER_SECRET:
15164
0
                WOLFSSL_MSG("Extended Master Secret free");
15165
                /* Nothing to do. */
15166
0
                break;
15167
0
            case TLSX_TRUNCATED_HMAC:
15168
0
                WOLFSSL_MSG("Truncated HMAC extension free");
15169
                /* Nothing to do. */
15170
0
                break;
15171
15172
0
            case TLSX_SUPPORTED_GROUPS:
15173
0
                WOLFSSL_MSG("Supported Groups extension free");
15174
0
                EC_FREE_ALL((SupportedCurve*)extension->data, heap);
15175
0
                break;
15176
15177
0
            case TLSX_EC_POINT_FORMATS:
15178
0
                WOLFSSL_MSG("Point Formats extension free");
15179
0
                PF_FREE_ALL((PointFormat*)extension->data, heap);
15180
0
                break;
15181
15182
0
            case TLSX_STATUS_REQUEST:
15183
0
                WOLFSSL_MSG("Certificate Status Request extension free");
15184
0
                CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
15185
0
                break;
15186
15187
0
            case TLSX_STATUS_REQUEST_V2:
15188
0
                WOLFSSL_MSG("Certificate Status Request v2 extension free");
15189
0
                CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
15190
0
                        heap);
15191
0
                break;
15192
15193
0
            case TLSX_RENEGOTIATION_INFO:
15194
0
                WOLFSSL_MSG("Secure Renegotiation extension free");
15195
0
                SCR_FREE_ALL(extension->data, heap);
15196
0
                break;
15197
15198
0
            case TLSX_SESSION_TICKET:
15199
0
                WOLFSSL_MSG("Session Ticket extension free");
15200
0
                WOLF_STK_FREE(extension->data, heap);
15201
0
                break;
15202
15203
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
15204
0
                WOLFSSL_MSG("ALPN extension free");
15205
0
                ALPN_FREE_ALL((ALPN*)extension->data, heap);
15206
0
                break;
15207
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15208
0
            case TLSX_SIGNATURE_ALGORITHMS:
15209
0
                WOLFSSL_MSG("Signature Algorithms extension to free");
15210
0
                SA_FREE_ALL((SignatureAlgorithms*)extension->data, heap);
15211
0
                break;
15212
0
#endif
15213
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
15214
0
            case TLSX_ENCRYPT_THEN_MAC:
15215
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension free");
15216
0
                break;
15217
0
#endif
15218
15219
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15220
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15221
            case TLSX_PRE_SHARED_KEY:
15222
                WOLFSSL_MSG("Pre-Shared Key extension free");
15223
                PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
15224
                break;
15225
15226
        #ifdef WOLFSSL_TLS13
15227
            case TLSX_PSK_KEY_EXCHANGE_MODES:
15228
                WOLFSSL_MSG("PSK Key Exchange Modes extension free");
15229
                break;
15230
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
15231
            case TLSX_CERT_WITH_EXTERN_PSK:
15232
                WOLFSSL_MSG("Cert with external PSK extension free");
15233
                break;
15234
        #endif
15235
        #endif
15236
    #endif
15237
15238
0
            case TLSX_KEY_SHARE:
15239
0
                WOLFSSL_MSG("Key Share extension free");
15240
0
                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
15241
0
                break;
15242
0
#endif
15243
0
#ifdef WOLFSSL_TLS13
15244
0
            case TLSX_SUPPORTED_VERSIONS:
15245
0
                WOLFSSL_MSG("Supported Versions extension free");
15246
0
                break;
15247
15248
0
            case TLSX_COOKIE:
15249
0
                WOLFSSL_MSG("Cookie extension free");
15250
0
                CKE_FREE_ALL((Cookie*)extension->data, heap);
15251
0
                break;
15252
15253
    #ifdef WOLFSSL_EARLY_DATA
15254
            case TLSX_EARLY_DATA:
15255
                WOLFSSL_MSG("Early Data extension free");
15256
                break;
15257
    #endif
15258
15259
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15260
            case TLSX_POST_HANDSHAKE_AUTH:
15261
                WOLFSSL_MSG("Post-Handshake Authentication extension free");
15262
                break;
15263
    #endif
15264
15265
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15266
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
15267
0
                WOLFSSL_MSG("Signature Algorithms extension free");
15268
0
                break;
15269
0
    #endif
15270
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15271
            case TLSX_CERTIFICATE_AUTHORITIES:
15272
                WOLFSSL_MSG("Certificate Authorities extension free");
15273
                break;
15274
    #endif
15275
0
#endif
15276
#ifdef WOLFSSL_SRTP
15277
            case TLSX_USE_SRTP:
15278
                WOLFSSL_MSG("SRTP extension free");
15279
                SRTP_FREE((TlsxSrtp*)extension->data, heap);
15280
                break;
15281
#endif
15282
15283
    #ifdef WOLFSSL_QUIC
15284
            case TLSX_KEY_QUIC_TP_PARAMS:
15285
                FALL_THROUGH;
15286
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
15287
                WOLFSSL_MSG("QUIC transport parameter free");
15288
                QTP_FREE((QuicTransportParam*)extension->data, heap);
15289
                break;
15290
    #endif
15291
15292
#ifdef WOLFSSL_DTLS_CID
15293
            case TLSX_CONNECTION_ID:
15294
                WOLFSSL_MSG("Connection ID extension free");
15295
                CID_FREE((byte*)extension->data, heap);
15296
                break;
15297
#endif /* WOLFSSL_DTLS_CID */
15298
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15299
            case TLSX_ECH:
15300
                WOLFSSL_MSG("ECH extension free");
15301
                /* append the ech extensions to the tail of the list so a
15302
                 * recursive TLSX_FreeAll is not necessary */
15303
                echList = ((WOLFSSL_ECH*)extension->data)->extensions;
15304
                if (echList != NULL) {
15305
                    if (list == NULL) {
15306
                        list = echList;
15307
                    }
15308
                    else {
15309
                        tail = list;
15310
                        while (tail->next != NULL)
15311
                            tail = tail->next;
15312
                        tail->next = echList;
15313
                    }
15314
                }
15315
                ECH_FREE((WOLFSSL_ECH*)extension->data, heap);
15316
                break;
15317
#endif
15318
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
15319
            case TLSX_CKS:
15320
                WOLFSSL_MSG("CKS extension free");
15321
                /* nothing to do */
15322
                break;
15323
#endif
15324
0
            default:
15325
0
                break;
15326
0
        }
15327
15328
0
        XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
15329
0
    }
15330
15331
5.46k
    (void)heap;
15332
5.46k
}
15333
15334
/** Checks if the tls extensions are supported based on the protocol version. */
15335
79.3k
int TLSX_SupportExtensions(WOLFSSL* ssl) {
15336
79.3k
    return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
15337
79.3k
}
15338
15339
/** Tells the buffered size of the extensions in a list. */
15340
static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
15341
                        word16* pLength)
15342
0
{
15343
0
    int    ret = 0;
15344
0
    TLSX*  extension;
15345
    /* Use a word32 accumulator so that an extension whose contribution
15346
     * pushes the running total past 0xFFFF is detected rather than
15347
     * silently wrapped (the TLS extensions block length prefix on the
15348
     * wire is a 2-byte field). Callees that take a word16* accumulator
15349
     * are invoked via a per-iteration shim (`cbShim`) and their delta
15350
     * is added back into the word32 total.
15351
     *
15352
     * MAINTAINER NOTE: do NOT pass &length to any *_GET_SIZE function
15353
     * that expects a `word16*` out-parameter -- that would be a type
15354
     * mismatch (UB) and would silently bypass the overflow detection
15355
     * below. When adding a new extension case, either:
15356
     *   - use `length += FOO_GET_SIZE(...)` when the helper returns a
15357
     *     word16 by value, or
15358
     *   - use the cbShim pattern: `cbShim = 0; ret = FOO_GET_SIZE(...,
15359
     *     &cbShim); length += cbShim;`
15360
     */
15361
0
    word32 length = 0;
15362
0
    word16 cbShim = 0;
15363
0
    byte   isRequest = (msgType == client_hello ||
15364
0
                        msgType == certificate_request);
15365
0
    (void)cbShim;
15366
15367
0
    while ((extension = list)) {
15368
0
        list = extension->next;
15369
15370
        /* only extensions marked as response are sent back to the client. */
15371
0
        if (!isRequest && !extension->resp)
15372
0
            continue; /* skip! */
15373
15374
        /* ssl level extensions are expected to override ctx level ones. */
15375
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
15376
0
            continue; /* skip! */
15377
15378
        /* extension type + extension data length. */
15379
0
        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
15380
15381
0
        switch (extension->type) {
15382
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
15383
            case TLSX_CKS:
15384
                length += ((WOLFSSL*)extension->data)->sigSpecSz ;
15385
                break;
15386
#endif
15387
0
#ifdef HAVE_SNI
15388
0
            case TLSX_SERVER_NAME:
15389
                /* SNI only sends the name on the request. */
15390
0
                if (isRequest)
15391
0
                    length += SNI_GET_SIZE((SNI*)extension->data);
15392
0
                break;
15393
0
#endif
15394
15395
0
            case TLSX_TRUSTED_CA_KEYS:
15396
                /* TCA only sends the list on the request. */
15397
0
                if (isRequest) {
15398
0
                    word16 tcaSz = TCA_GET_SIZE((TCA*)extension->data);
15399
                    /* 0 on non-empty list means 16-bit overflow. */
15400
0
                    if (tcaSz == 0 && extension->data != NULL) {
15401
0
                        ret = LENGTH_ERROR;
15402
0
                        break;
15403
0
                    }
15404
0
                    length += tcaSz;
15405
0
                }
15406
0
                break;
15407
15408
0
            case TLSX_MAX_FRAGMENT_LENGTH:
15409
0
                length += MFL_GET_SIZE(extension->data);
15410
0
                break;
15411
15412
0
            case TLSX_EXTENDED_MASTER_SECRET:
15413
0
            case TLSX_TRUNCATED_HMAC:
15414
                /* always empty. */
15415
0
                break;
15416
15417
0
            case TLSX_SUPPORTED_GROUPS:
15418
0
                length += EC_GET_SIZE((SupportedCurve*)extension->data);
15419
0
                break;
15420
15421
0
            case TLSX_EC_POINT_FORMATS:
15422
0
                length += PF_GET_SIZE((PointFormat*)extension->data);
15423
0
                break;
15424
15425
0
            case TLSX_STATUS_REQUEST:
15426
0
                length += CSR_GET_SIZE(
15427
0
                         (CertificateStatusRequest*)extension->data, isRequest);
15428
0
                break;
15429
15430
0
            case TLSX_STATUS_REQUEST_V2:
15431
0
                length += CSR2_GET_SIZE(
15432
0
                        (CertificateStatusRequestItemV2*)extension->data,
15433
0
                        isRequest);
15434
0
                break;
15435
15436
0
            case TLSX_RENEGOTIATION_INFO:
15437
0
                length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
15438
0
                        isRequest);
15439
0
                break;
15440
15441
0
            case TLSX_SESSION_TICKET:
15442
0
                length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
15443
0
                        isRequest);
15444
0
                break;
15445
15446
0
            case TLSX_APPLICATION_LAYER_PROTOCOL: {
15447
0
                word16 alpnSz = ALPN_GET_SIZE((ALPN*)extension->data);
15448
                /* 0 on non-empty list means 16-bit overflow. */
15449
0
                if (alpnSz == 0 && extension->data != NULL) {
15450
0
                    ret = LENGTH_ERROR;
15451
0
                    break;
15452
0
                }
15453
0
                length += alpnSz;
15454
0
                break;
15455
0
            }
15456
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15457
0
            case TLSX_SIGNATURE_ALGORITHMS:
15458
0
                length += SA_GET_SIZE(extension->data);
15459
0
                break;
15460
0
#endif
15461
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
15462
0
            case TLSX_ENCRYPT_THEN_MAC:
15463
0
                cbShim = 0;
15464
0
                ret = ETM_GET_SIZE(msgType, &cbShim);
15465
0
                length += cbShim;
15466
0
                break;
15467
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
15468
15469
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15470
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15471
            case TLSX_PRE_SHARED_KEY:
15472
                cbShim = 0;
15473
                ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
15474
                                                                       &cbShim);
15475
                length += cbShim;
15476
                break;
15477
        #ifdef WOLFSSL_TLS13
15478
            case TLSX_PSK_KEY_EXCHANGE_MODES:
15479
                cbShim = 0;
15480
                ret = PKM_GET_SIZE((byte)extension->val, msgType, &cbShim);
15481
                length += cbShim;
15482
                break;
15483
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
15484
            case TLSX_CERT_WITH_EXTERN_PSK:
15485
                cbShim = 0;
15486
                ret = PSK_WITH_CERT_GET_SIZE(msgType, &cbShim);
15487
                length += cbShim;
15488
                break;
15489
        #endif
15490
        #endif
15491
    #endif
15492
0
            case TLSX_KEY_SHARE:
15493
0
                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
15494
0
                break;
15495
0
#endif
15496
15497
0
#ifdef WOLFSSL_TLS13
15498
0
            case TLSX_SUPPORTED_VERSIONS:
15499
0
                cbShim = 0;
15500
0
                ret = SV_GET_SIZE(extension->data, msgType, &cbShim);
15501
0
                length += cbShim;
15502
0
                break;
15503
15504
0
            case TLSX_COOKIE:
15505
0
                cbShim = 0;
15506
0
                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &cbShim);
15507
0
                length += cbShim;
15508
0
                break;
15509
15510
    #ifdef WOLFSSL_EARLY_DATA
15511
            case TLSX_EARLY_DATA:
15512
                cbShim = 0;
15513
                ret = EDI_GET_SIZE(msgType, &cbShim);
15514
                length += cbShim;
15515
                break;
15516
    #endif
15517
15518
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15519
            case TLSX_POST_HANDSHAKE_AUTH:
15520
                cbShim = 0;
15521
                ret = PHA_GET_SIZE(msgType, &cbShim);
15522
                length += cbShim;
15523
                break;
15524
    #endif
15525
15526
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15527
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
15528
0
                length += SAC_GET_SIZE(extension->data);
15529
0
                break;
15530
0
    #endif
15531
15532
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15533
            case TLSX_CERTIFICATE_AUTHORITIES: {
15534
                word16 canSz = CAN_GET_SIZE(extension->data);
15535
                /* 0 on non-empty list means 16-bit overflow. */
15536
                if (canSz == 0) {
15537
                    ret = LENGTH_ERROR;
15538
                    break;
15539
                }
15540
                length += canSz;
15541
                break;
15542
            }
15543
    #endif
15544
0
#endif
15545
#ifdef WOLFSSL_SRTP
15546
            case TLSX_USE_SRTP:
15547
                length += SRTP_GET_SIZE((TlsxSrtp*)extension->data);
15548
                break;
15549
#endif
15550
15551
#ifdef HAVE_RPK
15552
            case TLSX_CLIENT_CERTIFICATE_TYPE:
15553
                length += CCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
15554
                break;
15555
15556
            case TLSX_SERVER_CERTIFICATE_TYPE:
15557
                length += SCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
15558
                break;
15559
#endif /* HAVE_RPK */
15560
15561
#ifdef WOLFSSL_QUIC
15562
            case TLSX_KEY_QUIC_TP_PARAMS:
15563
                FALL_THROUGH; /* followed by */
15564
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
15565
                length += QTP_GET_SIZE(extension);
15566
                break;
15567
#endif
15568
#ifdef WOLFSSL_DTLS_CID
15569
            case TLSX_CONNECTION_ID:
15570
                length += CID_GET_SIZE((byte*)extension->data);
15571
                break;
15572
#endif /* WOLFSSL_DTLS_CID */
15573
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15574
            case TLSX_ECH:
15575
                length += ECH_GET_SIZE((WOLFSSL_ECH*)extension->data, msgType);
15576
                break;
15577
#endif
15578
0
            default:
15579
0
                break;
15580
0
        }
15581
15582
0
        if (ret != 0)
15583
0
            return ret;
15584
15585
        /* Early exit: stop accumulating as soon as the running total
15586
         * cannot possibly fit the 2-byte wire length. Check *before*
15587
         * marking the extension as processed so the semaphore is not
15588
         * left in an inconsistent state on the error path. */
15589
0
        if (length > WOLFSSL_MAX_16BIT) {
15590
0
            WOLFSSL_MSG("TLSX_GetSize extension length exceeds word16");
15591
0
            return BUFFER_E;
15592
0
        }
15593
15594
        /* marks the extension as processed so ctx level */
15595
        /* extensions don't overlap with ssl level ones. */
15596
0
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
15597
0
    }
15598
15599
0
    if ((word32)*pLength + length > WOLFSSL_MAX_16BIT) {
15600
0
        WOLFSSL_MSG("TLSX_GetSize total extensions length exceeds word16");
15601
0
        return BUFFER_E;
15602
0
    }
15603
15604
0
    *pLength += (word16)length;
15605
15606
0
    return ret;
15607
0
}
15608
15609
/** Writes the extensions of a list in a buffer. */
15610
static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
15611
                         byte msgType, word16* pOffset)
15612
{
15613
    int    ret = 0;
15614
    TLSX*  extension;
15615
    /* Use word32 to symmetrize with TLSX_GetSize -- a single extension can
15616
     * contribute up to 0x10003 bytes (4-byte type/length header + 0xFFFF
15617
     * payload), which would word16-overflow undetectably (e.g. wrap to a
15618
     * value still above prevOffset). Per-iteration and aggregate bounds are
15619
     * checked below before truncating back into the word16 wire fields.
15620
     * Callees that take a word16* offset use the cbShim pattern (init to 0,
15621
     * then add the returned delta to the word32 accumulator). */
15622
    word32 offset = 0;
15623
    word32 length_offset = 0;
15624
    word32 prevOffset;
15625
    word16 cbShim = 0;
15626
    byte   isRequest = (msgType == client_hello ||
15627
                        msgType == certificate_request);
15628
    (void)cbShim;
15629
15630
    while ((extension = list)) {
15631
        list = extension->next;
15632
15633
        /* only extensions marked as response are written in a response. */
15634
        if (!isRequest && !extension->resp)
15635
            continue; /* skip! */
15636
15637
        /* ssl level extensions are expected to override ctx level ones. */
15638
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
15639
            continue; /* skip! */
15640
15641
        /* Snapshot offset to detect word16 wrap within this iteration;
15642
         * see matching comment in TLSX_GetSize. */
15643
        prevOffset = offset;
15644
15645
        /* writes extension type. */
15646
        c16toa((word16)extension->type, output + offset);
15647
        offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
15648
        length_offset = offset;
15649
15650
        /* extension data should be written internally. */
15651
        switch (extension->type) {
15652
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
15653
            case TLSX_CKS:
15654
                WOLFSSL_MSG("CKS extension to write");
15655
                offset += CKS_WRITE(((WOLFSSL*)extension->data),
15656
                                    output + offset);
15657
                break;
15658
#endif
15659
#ifdef HAVE_SNI
15660
            case TLSX_SERVER_NAME:
15661
                if (isRequest) {
15662
                    WOLFSSL_MSG("SNI extension to write");
15663
                    offset += SNI_WRITE((SNI*)extension->data, output + offset);
15664
                }
15665
                break;
15666
#endif
15667
15668
            case TLSX_TRUSTED_CA_KEYS:
15669
                WOLFSSL_MSG("Trusted CA Indication extension to write");
15670
                if (isRequest) {
15671
                    offset += TCA_WRITE((TCA*)extension->data, output + offset);
15672
                }
15673
                break;
15674
15675
            case TLSX_MAX_FRAGMENT_LENGTH:
15676
                WOLFSSL_MSG("Max Fragment Length extension to write");
15677
                offset += MFL_WRITE((byte*)extension->data, output + offset);
15678
                break;
15679
15680
            case TLSX_EXTENDED_MASTER_SECRET:
15681
                WOLFSSL_MSG("Extended Master Secret");
15682
                /* always empty. */
15683
                break;
15684
15685
            case TLSX_TRUNCATED_HMAC:
15686
                WOLFSSL_MSG("Truncated HMAC extension to write");
15687
                /* always empty. */
15688
                break;
15689
15690
            case TLSX_SUPPORTED_GROUPS:
15691
                WOLFSSL_MSG("Supported Groups extension to write");
15692
                offset += EC_WRITE((SupportedCurve*)extension->data,
15693
                                    output + offset);
15694
                break;
15695
15696
            case TLSX_EC_POINT_FORMATS:
15697
                WOLFSSL_MSG("Point Formats extension to write");
15698
                offset += PF_WRITE((PointFormat*)extension->data,
15699
                                    output + offset);
15700
                break;
15701
15702
            case TLSX_STATUS_REQUEST:
15703
                WOLFSSL_MSG("Certificate Status Request extension to write");
15704
                ret = CSR_WRITE((CertificateStatusRequest*)extension->data,
15705
                        output + offset, isRequest);
15706
                if (ret > 0) {
15707
                    offset += (word16)ret;
15708
                    ret = 0;
15709
                }
15710
                break;
15711
15712
            case TLSX_STATUS_REQUEST_V2:
15713
                WOLFSSL_MSG("Certificate Status Request v2 extension to write");
15714
                ret = CSR2_WRITE(
15715
                        (CertificateStatusRequestItemV2*)extension->data,
15716
                        output + offset, isRequest);
15717
                if (ret > 0) {
15718
                    offset += (word16)ret;
15719
                    ret = 0;
15720
                }
15721
                break;
15722
15723
            case TLSX_RENEGOTIATION_INFO:
15724
                WOLFSSL_MSG("Secure Renegotiation extension to write");
15725
                offset += SCR_WRITE((SecureRenegotiation*)extension->data,
15726
                        output + offset, isRequest);
15727
                break;
15728
15729
            case TLSX_SESSION_TICKET:
15730
                WOLFSSL_MSG("Session Ticket extension to write");
15731
                offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
15732
                        output + offset, isRequest);
15733
                break;
15734
15735
            case TLSX_APPLICATION_LAYER_PROTOCOL:
15736
                WOLFSSL_MSG("ALPN extension to write");
15737
                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
15738
                break;
15739
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15740
            case TLSX_SIGNATURE_ALGORITHMS:
15741
                WOLFSSL_MSG("Signature Algorithms extension to write");
15742
                offset += SA_WRITE(extension->data, output + offset);
15743
                break;
15744
#endif
15745
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
15746
            case TLSX_ENCRYPT_THEN_MAC:
15747
                WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
15748
                cbShim = 0;
15749
                ret = ETM_WRITE(extension->data, output, msgType, &cbShim);
15750
                offset += cbShim;
15751
                break;
15752
#endif /* HAVE_ENCRYPT_THEN_MAC */
15753
15754
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15755
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15756
            case TLSX_PRE_SHARED_KEY:
15757
                WOLFSSL_MSG("Pre-Shared Key extension to write");
15758
                cbShim = 0;
15759
                ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
15760
                                                              msgType, &cbShim);
15761
                offset += cbShim;
15762
                break;
15763
15764
        #ifdef WOLFSSL_TLS13
15765
            case TLSX_PSK_KEY_EXCHANGE_MODES:
15766
                WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
15767
                cbShim = 0;
15768
                ret = PKM_WRITE((byte)extension->val, output + offset, msgType,
15769
                                                                       &cbShim);
15770
                offset += cbShim;
15771
                break;
15772
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
15773
            case TLSX_CERT_WITH_EXTERN_PSK:
15774
                WOLFSSL_MSG("Cert with external PSK extension to write");
15775
                cbShim = 0;
15776
                ret = PSK_WITH_CERT_WRITE(output + offset, msgType, &cbShim);
15777
                offset += cbShim;
15778
                break;
15779
        #endif
15780
        #endif
15781
    #endif
15782
            case TLSX_KEY_SHARE:
15783
                WOLFSSL_MSG("Key Share extension to write");
15784
                offset += KS_WRITE((KeyShareEntry*)extension->data,
15785
                                                      output + offset, msgType);
15786
                break;
15787
#endif
15788
#ifdef WOLFSSL_TLS13
15789
            case TLSX_SUPPORTED_VERSIONS:
15790
                WOLFSSL_MSG("Supported Versions extension to write");
15791
                cbShim = 0;
15792
                ret = SV_WRITE(extension->data, output + offset, msgType,
15793
                                                                       &cbShim);
15794
                offset += cbShim;
15795
                break;
15796
15797
            case TLSX_COOKIE:
15798
                WOLFSSL_MSG("Cookie extension to write");
15799
                cbShim = 0;
15800
                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
15801
                                msgType, &cbShim);
15802
                offset += cbShim;
15803
                break;
15804
15805
    #ifdef WOLFSSL_EARLY_DATA
15806
            case TLSX_EARLY_DATA:
15807
                WOLFSSL_MSG("Early Data extension to write");
15808
                cbShim = 0;
15809
                ret = EDI_WRITE(extension->val, output + offset, msgType,
15810
                                                                       &cbShim);
15811
                offset += cbShim;
15812
                break;
15813
    #endif
15814
15815
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15816
            case TLSX_POST_HANDSHAKE_AUTH:
15817
                WOLFSSL_MSG("Post-Handshake Authentication extension to write");
15818
                cbShim = 0;
15819
                ret = PHA_WRITE(output + offset, msgType, &cbShim);
15820
                offset += cbShim;
15821
                break;
15822
    #endif
15823
15824
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15825
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
15826
                WOLFSSL_MSG("Signature Algorithms extension to write");
15827
                offset += SAC_WRITE(extension->data, output + offset);
15828
                break;
15829
    #endif
15830
15831
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15832
            case TLSX_CERTIFICATE_AUTHORITIES:
15833
                WOLFSSL_MSG("Certificate Authorities extension to write");
15834
                offset += CAN_WRITE(extension->data, output + offset);
15835
                break;
15836
    #endif
15837
#endif
15838
#ifdef WOLFSSL_SRTP
15839
            case TLSX_USE_SRTP:
15840
                WOLFSSL_MSG("SRTP extension to write");
15841
                offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset);
15842
                break;
15843
#endif
15844
15845
#ifdef HAVE_RPK
15846
            case TLSX_CLIENT_CERTIFICATE_TYPE:
15847
                WOLFSSL_MSG("Client Certificate Type extension to write");
15848
                offset += CCT_WRITE(extension->data, output + offset, msgType);
15849
                break;
15850
15851
            case TLSX_SERVER_CERTIFICATE_TYPE:
15852
                WOLFSSL_MSG("Server Certificate Type extension to write");
15853
                offset += SCT_WRITE(extension->data, output + offset, msgType);
15854
                break;
15855
#endif /* HAVE_RPK */
15856
15857
#ifdef WOLFSSL_QUIC
15858
            case TLSX_KEY_QUIC_TP_PARAMS:
15859
                FALL_THROUGH;
15860
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
15861
                WOLFSSL_MSG("QUIC transport parameter to write");
15862
                offset += QTP_WRITE((QuicTransportParam*)extension->data,
15863
                                    output + offset);
15864
                break;
15865
#endif
15866
#ifdef WOLFSSL_DTLS_CID
15867
            case TLSX_CONNECTION_ID:
15868
                WOLFSSL_MSG("Connection ID extension to write");
15869
                offset += CID_WRITE((byte*)extension->data, output+offset);
15870
                break;
15871
15872
#endif /* WOLFSSL_DTLS_CID */
15873
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15874
            case TLSX_ECH:
15875
                WOLFSSL_MSG("ECH extension to write");
15876
                cbShim = 0;
15877
                ret = ECH_WRITE((WOLFSSL_ECH*)extension->data, msgType,
15878
                    output + offset, &cbShim);
15879
                offset += cbShim;
15880
                break;
15881
#endif
15882
            default:
15883
                break;
15884
        }
15885
15886
        /* Per-extension data length is a 2-byte wire field; reject any
15887
         * single extension whose payload exceeds that before truncating. */
15888
        if (offset - length_offset > WOLFSSL_MAX_16BIT) {
15889
            WOLFSSL_MSG("TLSX_Write single extension length exceeds word16");
15890
            return BUFFER_E;
15891
        }
15892
15893
        /* writes extension data length. */
15894
        c16toa((word16)(offset - length_offset),
15895
               output + length_offset - OPAQUE16_LEN);
15896
15897
        /* marks the extension as processed so ctx level */
15898
        /* extensions don't overlap with ssl level ones. */
15899
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
15900
15901
        /* if we encountered an error propagate it */
15902
        if (ret != 0)
15903
            break;
15904
15905
        if (offset <= prevOffset) {
15906
            WOLFSSL_MSG("TLSX_Write extension made no progress");
15907
            return BUFFER_E;
15908
        }
15909
    }
15910
15911
    /* Only validate and commit the aggregate offset when the loop
15912
     * completed without error; on the error path, leave *pOffset
15913
     * unchanged and return the original failure reason so callers
15914
     * see the real error instead of a masking BUFFER_E. */
15915
    if (ret == 0) {
15916
        if ((word32)*pOffset + offset > WOLFSSL_MAX_16BIT) {
15917
            WOLFSSL_MSG("TLSX_Write total extensions length exceeds word16");
15918
            return BUFFER_E;
15919
        }
15920
        *pOffset += (word16)offset;
15921
    }
15922
15923
    return ret;
15924
}
15925
15926
#ifdef HAVE_SUPPORTED_CURVES
15927
15928
/* Populates the default supported groups / curves */
15929
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
15930
{
15931
    int ret = WOLFSSL_SUCCESS;
15932
#ifdef WOLFSSL_TLS13
15933
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15934
    if (ssl->options.resuming && ssl->session->namedGroup != 0) {
15935
        return TLSX_UseSupportedCurve(extensions, ssl->session->namedGroup,
15936
                                                  ssl->heap, ssl->options.side);
15937
    }
15938
#endif
15939
15940
    if (ssl->numGroups != 0) {
15941
        int i;
15942
        for (i = 0; i < ssl->numGroups; i++) {
15943
            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap,
15944
                                                             ssl->options.side);
15945
            if (ret != WOLFSSL_SUCCESS)
15946
                return ret;
15947
        }
15948
        return WOLFSSL_SUCCESS;
15949
    }
15950
#endif /* WOLFSSL_TLS13 */
15951
15952
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
15953
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS)
15954
    /* Prefer non-experimental PQ/T hybrid groups (only for TLS 1.3) */
15955
    if (IsAtLeastTLSv1_3(ssl->version) &&
15956
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
15957
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
15958
        ECC_MIN_KEY_SZ <= 256
15959
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM768,
15960
            ssl->heap, ssl->options.side);
15961
        if (ret != WOLFSSL_SUCCESS) return ret;
15962
    #endif
15963
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
15964
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
15965
        ECC_MIN_KEY_SZ <= 384
15966
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM1024,
15967
            ssl->heap, ssl->options.side);
15968
        if (ret != WOLFSSL_SUCCESS) return ret;
15969
    #endif
15970
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
15971
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
15972
        ECC_MIN_KEY_SZ <= 256
15973
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM768,
15974
            ssl->heap, ssl->options.side);
15975
        if (ret != WOLFSSL_SUCCESS) return ret;
15976
    #endif
15977
    }
15978
#endif
15979
15980
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM_CLIENT_SUPPORT) && \
15981
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_1024) && \
15982
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
15983
    if (IsAtLeastTLSv1_3(ssl->version) &&
15984
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
15985
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
15986
                                     ssl->heap, ssl->options.side);
15987
        if (ret != WOLFSSL_SUCCESS) return ret;
15988
    }
15989
#endif
15990
15991
#if defined(HAVE_ECC)
15992
    /* list in order by strength, since not all servers choose by strength */
15993
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
15994
        #ifndef NO_ECC_SECP
15995
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP521R1,
15996
                                     ssl->heap, ssl->options.side);
15997
        if (ret != WOLFSSL_SUCCESS) return ret;
15998
        #endif
15999
    #endif
16000
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
16001
        #ifdef HAVE_ECC_BRAINPOOL
16002
        if (IsAtLeastTLSv1_3(ssl->version)) {
16003
            /* TLS 1.3 BrainpoolP512 curve */
16004
            ret = TLSX_UseSupportedCurve(extensions,
16005
                WOLFSSL_ECC_BRAINPOOLP512R1TLS13, ssl->heap, ssl->options.side);
16006
            if (ret != WOLFSSL_SUCCESS) return ret;
16007
16008
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
16009
            if (ssl->options.downgrade &&
16010
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
16011
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
16012
                ret = TLSX_UseSupportedCurve(extensions,
16013
                    WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap, ssl->options.side);
16014
                if (ret != WOLFSSL_SUCCESS) return ret;
16015
            }
16016
        }
16017
        else {
16018
            /* TLS 1.2 only */
16019
            ret = TLSX_UseSupportedCurve(extensions,
16020
                WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap, ssl->options.side);
16021
            if (ret != WOLFSSL_SUCCESS) return ret;
16022
        }
16023
        #endif
16024
    #endif
16025
#endif
16026
16027
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16028
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_768) && \
16029
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
16030
    if (IsAtLeastTLSv1_3(ssl->version) &&
16031
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16032
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
16033
                                     ssl->heap, ssl->options.side);
16034
        if (ret != WOLFSSL_SUCCESS) return ret;
16035
    }
16036
#endif
16037
16038
#if defined(HAVE_ECC)
16039
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
16040
        #ifndef NO_ECC_SECP
16041
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP384R1,
16042
            ssl->heap, ssl->options.side);
16043
        if (ret != WOLFSSL_SUCCESS) return ret;
16044
        #endif
16045
        #ifdef HAVE_ECC_BRAINPOOL
16046
        if (IsAtLeastTLSv1_3(ssl->version)) {
16047
            /* TLS 1.3 BrainpoolP384 curve */
16048
            ret = TLSX_UseSupportedCurve(extensions,
16049
                WOLFSSL_ECC_BRAINPOOLP384R1TLS13, ssl->heap, ssl->options.side);
16050
            if (ret != WOLFSSL_SUCCESS) return ret;
16051
16052
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
16053
            if (ssl->options.downgrade &&
16054
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
16055
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
16056
                ret = TLSX_UseSupportedCurve(extensions,
16057
                    WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap, ssl->options.side);
16058
                if (ret != WOLFSSL_SUCCESS) return ret;
16059
            }
16060
        }
16061
        else {
16062
            /* TLS 1.2 only */
16063
            ret = TLSX_UseSupportedCurve(extensions,
16064
                WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap, ssl->options.side);
16065
            if (ret != WOLFSSL_SUCCESS) return ret;
16066
        }
16067
        #endif
16068
    #endif
16069
#endif /* HAVE_ECC */
16070
16071
#ifndef HAVE_FIPS
16072
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
16073
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_X448, ssl->heap,
16074
            ssl->options.side);
16075
        if (ret != WOLFSSL_SUCCESS) return ret;
16076
    #endif
16077
#endif /* HAVE_FIPS */
16078
16079
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16080
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_512) && \
16081
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
16082
    if (IsAtLeastTLSv1_3(ssl->version) &&
16083
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16084
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512, ssl->heap,
16085
            ssl->options.side);
16086
        if (ret != WOLFSSL_SUCCESS) return ret;
16087
    }
16088
#endif
16089
16090
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
16091
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
16092
        #ifndef NO_ECC_SECP
16093
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP256R1,
16094
            ssl->heap, ssl->options.side);
16095
        if (ret != WOLFSSL_SUCCESS) return ret;
16096
        #endif
16097
        #ifdef HAVE_ECC_KOBLITZ
16098
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP256K1,
16099
            ssl->heap, ssl->options.side);
16100
        if (ret != WOLFSSL_SUCCESS) return ret;
16101
        #endif
16102
        #ifdef HAVE_ECC_BRAINPOOL
16103
        if (IsAtLeastTLSv1_3(ssl->version)) {
16104
            /* TLS 1.3 BrainpoolP256 curve */
16105
            ret = TLSX_UseSupportedCurve(extensions,
16106
                WOLFSSL_ECC_BRAINPOOLP256R1TLS13, ssl->heap, ssl->options.side);
16107
            if (ret != WOLFSSL_SUCCESS) return ret;
16108
16109
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
16110
            if (ssl->options.downgrade &&
16111
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
16112
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
16113
                ret = TLSX_UseSupportedCurve(extensions,
16114
                    WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap, ssl->options.side);
16115
                if (ret != WOLFSSL_SUCCESS) return ret;
16116
            }
16117
        }
16118
        else {
16119
            /* TLS 1.2 only */
16120
            ret = TLSX_UseSupportedCurve(extensions,
16121
                WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap, ssl->options.side);
16122
            if (ret != WOLFSSL_SUCCESS) return ret;
16123
        }
16124
        #endif
16125
        #if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
16126
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SM2P256V1,
16127
            ssl->heap, ssl->options.side);
16128
        if (ret != WOLFSSL_SUCCESS) return ret;
16129
        #endif
16130
    #endif
16131
#endif /* HAVE_ECC */
16132
16133
#ifndef HAVE_FIPS
16134
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
16135
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_X25519,
16136
            ssl->heap, ssl->options.side);
16137
        if (ret != WOLFSSL_SUCCESS) return ret;
16138
    #endif
16139
#endif /* HAVE_FIPS */
16140
16141
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
16142
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
16143
        #ifndef NO_ECC_SECP
16144
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP224R1,
16145
            ssl->heap, ssl->options.side);
16146
        if (ret != WOLFSSL_SUCCESS) return ret;
16147
        #endif
16148
        #ifdef HAVE_ECC_KOBLITZ
16149
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP224K1,
16150
            ssl->heap, ssl->options.side);
16151
        if (ret != WOLFSSL_SUCCESS) return ret;
16152
        #endif
16153
    #endif
16154
16155
    #ifndef HAVE_FIPS
16156
        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
16157
            #ifndef NO_ECC_SECP
16158
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP192R1,
16159
                    ssl->heap, ssl->options.side);
16160
                if (ret != WOLFSSL_SUCCESS) return ret;
16161
            #endif
16162
            #ifdef HAVE_ECC_KOBLITZ
16163
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP192K1,
16164
                    ssl->heap, ssl->options.side);
16165
                if (ret != WOLFSSL_SUCCESS) return ret;
16166
            #endif
16167
        #endif
16168
        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
16169
            #ifndef NO_ECC_SECP
16170
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP160R1,
16171
                    ssl->heap, ssl->options.side);
16172
                if (ret != WOLFSSL_SUCCESS) return ret;
16173
            #endif
16174
            #ifdef HAVE_ECC_SECPR2
16175
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP160R2,
16176
                    ssl->heap, ssl->options.side);
16177
                if (ret != WOLFSSL_SUCCESS) return ret;
16178
            #endif
16179
            #ifdef HAVE_ECC_KOBLITZ
16180
                ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP160K1,
16181
                    ssl->heap, ssl->options.side);
16182
                if (ret != WOLFSSL_SUCCESS) return ret;
16183
            #endif
16184
        #endif
16185
    #endif /* HAVE_FIPS */
16186
#endif /* HAVE_ECC */
16187
16188
#ifndef NO_DH
16189
        /* Add FFDHE supported groups. */
16190
    #ifdef HAVE_FFDHE_8192
16191
        if (8192/8 >= ssl->options.minDhKeySz &&
16192
                                        8192/8 <= ssl->options.maxDhKeySz) {
16193
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_8192,
16194
                ssl->heap, ssl->options.side);
16195
            if (ret != WOLFSSL_SUCCESS)
16196
                return ret;
16197
        }
16198
    #endif
16199
    #ifdef HAVE_FFDHE_6144
16200
        if (6144/8 >= ssl->options.minDhKeySz &&
16201
                                        6144/8 <= ssl->options.maxDhKeySz) {
16202
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_6144,
16203
                ssl->heap, ssl->options.side);
16204
            if (ret != WOLFSSL_SUCCESS)
16205
                return ret;
16206
        }
16207
    #endif
16208
    #ifdef HAVE_FFDHE_4096
16209
        if (4096/8 >= ssl->options.minDhKeySz &&
16210
                                        4096/8 <= ssl->options.maxDhKeySz) {
16211
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_4096,
16212
                ssl->heap, ssl->options.side);
16213
            if (ret != WOLFSSL_SUCCESS)
16214
                return ret;
16215
        }
16216
    #endif
16217
    #ifdef HAVE_FFDHE_3072
16218
        if (3072/8 >= ssl->options.minDhKeySz &&
16219
                                        3072/8 <= ssl->options.maxDhKeySz) {
16220
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_3072,
16221
                ssl->heap, ssl->options.side);
16222
            if (ret != WOLFSSL_SUCCESS)
16223
                return ret;
16224
        }
16225
    #endif
16226
    #ifdef HAVE_FFDHE_2048
16227
        if (2048/8 >= ssl->options.minDhKeySz &&
16228
                                        2048/8 <= ssl->options.maxDhKeySz) {
16229
            ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_FFDHE_2048,
16230
                ssl->heap, ssl->options.side);
16231
            if (ret != WOLFSSL_SUCCESS)
16232
                return ret;
16233
        }
16234
    #endif
16235
#endif
16236
16237
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16238
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
16239
    if (IsAtLeastTLSv1_3(ssl->version) &&
16240
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16241
#if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
16242
    (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
16243
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP521R1MLKEM1024,
16244
                                     ssl->heap, ssl->options.side);
16245
        if (ret != WOLFSSL_SUCCESS) return ret;
16246
#endif
16247
#if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
16248
    (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
16249
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM768,
16250
                                     ssl->heap, ssl->options.side);
16251
        if (ret != WOLFSSL_SUCCESS) return ret;
16252
#endif
16253
#if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE448) && \
16254
    ECC_MIN_KEY_SZ <= 448
16255
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448MLKEM768,
16256
                                     ssl->heap, ssl->options.side);
16257
        if (ret != WOLFSSL_SUCCESS) return ret;
16258
#endif
16259
#if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_ECC) && \
16260
    (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
16261
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM512,
16262
                                     ssl->heap, ssl->options.side);
16263
        if (ret != WOLFSSL_SUCCESS) return ret;
16264
#endif
16265
#if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_CURVE25519) && \
16266
    ECC_MIN_KEY_SZ <= 256
16267
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM512,
16268
                                     ssl->heap, ssl->options.side);
16269
        if (ret != WOLFSSL_SUCCESS) return ret;
16270
#endif
16271
    }
16272
#endif
16273
16274
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
16275
    defined(WOLFSSL_MLKEM_KYBER)
16276
    if (IsAtLeastTLSv1_3(ssl->version) &&
16277
            TLSX_IsMlKemGroupSupported(ssl->options.side)) {
16278
#ifdef WOLFSSL_KYBER1024
16279
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
16280
                                     ssl->heap, ssl->options.side);
16281
        if (ret != WOLFSSL_SUCCESS) return ret;
16282
#if defined(HAVE_ECC) && (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
16283
    ECC_MIN_KEY_SZ <= 521
16284
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
16285
                                     ssl->heap, ssl->options.side);
16286
        if (ret != WOLFSSL_SUCCESS) return ret;
16287
#endif
16288
#endif
16289
#ifdef WOLFSSL_KYBER768
16290
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
16291
                                     ssl->heap, ssl->options.side);
16292
        if (ret != WOLFSSL_SUCCESS) return ret;
16293
#if defined(HAVE_ECC) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
16294
        ECC_MIN_KEY_SZ <= 384
16295
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
16296
                                     ssl->heap, ssl->options.side);
16297
        if (ret != WOLFSSL_SUCCESS) return ret;
16298
#endif
16299
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
16300
    ECC_MIN_KEY_SZ <= 256
16301
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
16302
                                     ssl->heap, ssl->options.side);
16303
        if (ret != WOLFSSL_SUCCESS) return ret;
16304
#endif
16305
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
16306
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
16307
                                     ssl->heap, ssl->options.side);
16308
        if (ret != WOLFSSL_SUCCESS) return ret;
16309
#endif
16310
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
16311
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
16312
                                     ssl->heap, ssl->options.side);
16313
        if (ret != WOLFSSL_SUCCESS) return ret;
16314
#endif
16315
#endif
16316
#ifdef WOLFSSL_KYBER512
16317
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1,
16318
                                     ssl->heap, ssl->options.side);
16319
        if (ret != WOLFSSL_SUCCESS) return ret;
16320
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
16321
    ECC_MIN_KEY_SZ <= 256
16322
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
16323
                                     ssl->heap, ssl->options.side);
16324
        if (ret != WOLFSSL_SUCCESS) return ret;
16325
#endif
16326
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
16327
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
16328
                                     ssl->heap, ssl->options.side);
16329
        if (ret != WOLFSSL_SUCCESS) return ret;
16330
#endif
16331
#endif
16332
    }
16333
#endif
16334
16335
    (void)ssl;
16336
    (void)extensions;
16337
16338
    return ret;
16339
}
16340
16341
#endif /* HAVE_SUPPORTED_CURVES */
16342
16343
int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
16344
{
16345
    int ret = 0;
16346
    byte* public_key      = NULL;
16347
    word16 public_key_len = 0;
16348
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
16349
    int usingPSK = 0;
16350
#endif
16351
#if defined(HAVE_SUPPORTED_CURVES) && defined(WOLFSSL_TLS13)
16352
    TLSX* extension = NULL;
16353
    word16 namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
16354
#endif
16355
16356
    /* server will add extension depending on what is parsed from client */
16357
    if (!isServer) {
16358
#if defined(HAVE_RPK)
16359
        ret = TLSX_ClientCertificateType_Use(ssl, isServer);
16360
        if (ret != 0)
16361
            return ret;
16362
16363
        ret = TLSX_ServerCertificateType_Use(ssl, isServer);
16364
        if (ret != 0)
16365
            return ret;
16366
#endif /* HAVE_RPK */
16367
16368
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) && \
16369
    !defined(WOLFSSL_NO_TLS12)
16370
        if (!ssl->options.disallowEncThenMac) {
16371
            ret = TLSX_EncryptThenMac_Use(ssl);
16372
            if (ret != 0)
16373
                return ret;
16374
        }
16375
#endif
16376
16377
#if defined(HAVE_SUPPORTED_CURVES)
16378
        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
16379
            if (TLSX_Find(ssl->ctx->extensions,
16380
                                               TLSX_SUPPORTED_GROUPS) == NULL) {
16381
                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
16382
                if (ret != WOLFSSL_SUCCESS)
16383
                    return ret;
16384
            }
16385
        }
16386
    #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
16387
        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
16388
               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
16389
               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
16390
            ret = TLSX_UsePointFormat(&ssl->extensions,
16391
                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
16392
            if (ret != WOLFSSL_SUCCESS)
16393
                return ret;
16394
        }
16395
    #endif
16396
#endif /* HAVE_SUPPORTED_CURVES */
16397
16398
#ifdef WOLFSSL_SRTP
16399
        if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
16400
            WOLFSSL_MSG("Adding DTLS SRTP extension");
16401
            if ((ret = TLSX_UseSRTP(&ssl->extensions, ssl->dtlsSrtpProfiles,
16402
                                                                ssl->heap)) != 0) {
16403
                return ret;
16404
            }
16405
        }
16406
#endif
16407
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
16408
        if ((IsAtLeastTLSv1_3(ssl->version)) && (ssl->sigSpec != NULL)) {
16409
            WOLFSSL_MSG("Adding CKS extension");
16410
            if ((ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap)) != 0) {
16411
                return ret;
16412
            }
16413
        }
16414
#endif
16415
    } /* is not server */
16416
16417
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16418
    WOLFSSL_MSG("Adding signature algorithms extension");
16419
    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
16420
                                                                         != 0) {
16421
            return ret;
16422
    }
16423
#else
16424
    ret = 0;
16425
#endif
16426
#ifdef WOLFSSL_TLS13
16427
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16428
        if (IsAtLeastTLSv1_3(ssl->version) &&
16429
                SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
16430
            WOLFSSL_MSG("Adding certificate authorities extension");
16431
            if ((ret = TLSX_Push(&ssl->extensions,
16432
                    TLSX_CERTIFICATE_AUTHORITIES, ssl, ssl->heap)) != 0) {
16433
                    return ret;
16434
            }
16435
        }
16436
    #endif
16437
        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
16438
            /* Add mandatory TLS v1.3 extension: supported version */
16439
            WOLFSSL_MSG("Adding supported versions extension");
16440
            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
16441
                                                             ssl->heap)) != 0) {
16442
                return ret;
16443
            }
16444
16445
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16446
            if (ssl->certHashSigAlgoSz > 0) {
16447
                WOLFSSL_MSG("Adding signature algorithms cert extension");
16448
                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
16449
                                                        ssl, ssl->heap)) != 0) {
16450
                    return ret;
16451
                }
16452
            }
16453
        #endif
16454
16455
        #if defined(HAVE_SUPPORTED_CURVES)
16456
            extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
16457
            if (extension == NULL) {
16458
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16459
                if (ssl->options.resuming && ssl->session->namedGroup != 0)
16460
                    namedGroup = ssl->session->namedGroup;
16461
                else
16462
            #endif
16463
                if (ssl->numGroups > 0) {
16464
                    int set = 0;
16465
                    int i, j;
16466
16467
                    /* Find the first element of ssl->group[] that is also
16468
                     * present in preferredGroup[]. The user's ranking wins;
16469
                     * if nothing intersects, send no key share and let the
16470
                     * server drive group selection via HRR. */
16471
                    namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
16472
                    for (i = 0; i < ssl->numGroups && !set; i++) {
16473
                        for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
16474
                            if (preferredGroup[j] == ssl->group[i]) {
16475
                                namedGroup = ssl->group[i];
16476
                                set = 1;
16477
                                break;
16478
                            }
16479
                        }
16480
                    }
16481
                }
16482
                else {
16483
                    /* Choose the most preferred group. */
16484
                    namedGroup = WOLFSSL_KEY_SHARE_DEFAULT_GROUP;
16485
                }
16486
            }
16487
            else {
16488
                KeyShareEntry* kse = (KeyShareEntry*)extension->data;
16489
                if (kse)
16490
                    namedGroup = kse->group;
16491
            }
16492
            if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
16493
                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
16494
                        &ssl->extensions);
16495
            }
16496
            else {
16497
                /* No suitable key share group found, send no key share to
16498
                 * trigger a HRR with the server's preferred group. */
16499
                WOLFSSL_MSG("Sending no key share to trigger HRR");
16500
                ret = TLSX_KeyShare_Empty(ssl);
16501
            }
16502
            if (ret != 0)
16503
                return ret;
16504
        #endif /* HAVE_SUPPORTED_CURVES */
16505
16506
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16507
            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
16508
        #endif
16509
        #if defined(HAVE_SESSION_TICKET)
16510
            if (ssl->options.resuming && ssl->session->ticketLen > 0
16511
        #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
16512
                && !ssl->options.certWithExternPsk
16513
        #endif
16514
            ) {
16515
                WOLFSSL_SESSION* sess = ssl->session;
16516
            #ifdef WOLFSSL_32BIT_MILLI_TIME
16517
                word32 now, milli;
16518
            #else
16519
                word64 now, milli;
16520
            #endif
16521
16522
                /* Determine the MAC algorithm for the cipher suite used. */
16523
                ssl->options.cipherSuite0 = sess->cipherSuite0;
16524
                ssl->options.cipherSuite  = sess->cipherSuite;
16525
                ret = SetCipherSpecs(ssl);
16526
                if (ret != 0)
16527
                    return ret;
16528
                now = (word64)TimeNowInMilliseconds();
16529
                if (now == 0)
16530
                    return GETTIME_ERROR;
16531
            #ifdef WOLFSSL_32BIT_MILLI_TIME
16532
                if (now < sess->ticketSeen)
16533
                    milli = (0xFFFFFFFFU - sess->ticketSeen) + 1 + now;
16534
                else
16535
                    milli = now - sess->ticketSeen;
16536
                milli += sess->ticketAdd;
16537
16538
                /* Pre-shared key is mandatory extension for resumption. */
16539
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
16540
                    sess->ticketLen, milli, ssl->specs.mac_algorithm,
16541
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
16542
                    NULL, ssl->heap);
16543
            #else
16544
                milli = now - sess->ticketSeen + sess->ticketAdd;
16545
16546
                /* Pre-shared key is mandatory extension for resumption. */
16547
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
16548
                    sess->ticketLen, (word32)milli, ssl->specs.mac_algorithm,
16549
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
16550
                    NULL, ssl->heap);
16551
            #endif
16552
                if (ret != 0)
16553
                    return ret;
16554
16555
                usingPSK = 1;
16556
            }
16557
        #endif
16558
    #ifndef NO_PSK
16559
        #ifndef WOLFSSL_PSK_ONE_ID
16560
            if (ssl->options.client_psk_cs_cb != NULL) {
16561
                int i;
16562
                const Suites* suites = WOLFSSL_SUITES(ssl);
16563
                for (i = 0; i < suites->suiteSz; i += 2) {
16564
                    byte cipherSuite0 = suites->suites[i + 0];
16565
                    byte cipherSuite = suites->suites[i + 1];
16566
                    unsigned int keySz;
16567
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16568
                    int cnt = 0;
16569
                #endif
16570
16571
                #ifdef HAVE_NULL_CIPHER
16572
                    if (cipherSuite0 == ECC_BYTE ||
16573
                        cipherSuite0 == ECDHE_PSK_BYTE) {
16574
                        if (cipherSuite != TLS_SHA256_SHA256 &&
16575
                                             cipherSuite != TLS_SHA384_SHA384) {
16576
                            continue;
16577
                        }
16578
                    }
16579
                    else
16580
                #endif
16581
                #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
16582
                    defined(WOLFSSL_SM3)
16583
                    if (cipherSuite0 == CIPHER_BYTE) {
16584
                        if ((cipherSuite != TLS_SM4_GCM_SM3) &&
16585
                            (cipherSuite != TLS_SM4_CCM_SM3)) {
16586
                            continue;
16587
                        }
16588
                    }
16589
                    else
16590
                #endif
16591
                    if (cipherSuite0 != TLS13_BYTE)
16592
                        continue;
16593
16594
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16595
                    do {
16596
                        ssl->arrays->client_identity[0] = cnt;
16597
                #endif
16598
16599
                        ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
16600
                        keySz = ssl->options.client_psk_cs_cb(
16601
                            ssl, ssl->arrays->server_hint,
16602
                            ssl->arrays->client_identity, MAX_PSK_ID_LEN,
16603
                            ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
16604
                            GetCipherNameInternal(cipherSuite0, cipherSuite));
16605
                        if (keySz > 0) {
16606
                            ssl->arrays->psk_keySz = keySz;
16607
                            ret = TLSX_PreSharedKey_Use(&ssl->extensions,
16608
                                (byte*)ssl->arrays->client_identity,
16609
                                (word16)XSTRLEN(ssl->arrays->client_identity),
16610
                                0, SuiteMac(WOLFSSL_SUITES(ssl)->suites + i),
16611
                                cipherSuite0, cipherSuite, 0, NULL, ssl->heap);
16612
                            if (ret != 0)
16613
                                return ret;
16614
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16615
                            cnt++;
16616
                #endif
16617
                        }
16618
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16619
                    }
16620
                    while (keySz > 0);
16621
                #endif
16622
                }
16623
16624
                usingPSK = 1;
16625
            }
16626
            else
16627
        #endif
16628
            if (ssl->options.client_psk_cb != NULL ||
16629
                ssl->options.client_psk_tls13_cb != NULL) {
16630
                /* Default cipher suite. */
16631
                byte cipherSuite0 = TLS13_BYTE;
16632
                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
16633
                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
16634
                const char* cipherName = NULL;
16635
16636
                if (ssl->options.client_psk_tls13_cb != NULL) {
16637
                    ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
16638
                        ssl, ssl->arrays->server_hint,
16639
                        ssl->arrays->client_identity, MAX_PSK_ID_LEN,
16640
                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
16641
                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
16642
                            &cipherSuite, NULL, NULL, &cipherSuiteFlags) != 0) {
16643
                        return PSK_KEY_ERROR;
16644
                    }
16645
                }
16646
                else {
16647
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
16648
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
16649
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
16650
                }
16651
                if (
16652
                #ifdef OPENSSL_EXTRA
16653
                    /* OpenSSL treats a PSK key length of 0
16654
                     * to indicate no PSK available.
16655
                     */
16656
                    ssl->arrays->psk_keySz == 0 ||
16657
                #endif
16658
                         (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
16659
                     (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
16660
                #ifndef OPENSSL_EXTRA
16661
                    ret = PSK_KEY_ERROR;
16662
                #endif
16663
                }
16664
                else {
16665
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
16666
16667
                    ssl->options.cipherSuite0 = cipherSuite0;
16668
                    ssl->options.cipherSuite  = cipherSuite;
16669
                    (void)cipherSuiteFlags;
16670
                    ret = SetCipherSpecs(ssl);
16671
                    if (ret == 0) {
16672
                        ret = TLSX_PreSharedKey_Use(
16673
                            &ssl->extensions,
16674
                                     (byte*)ssl->arrays->client_identity,
16675
                            (word16)XSTRLEN(ssl->arrays->client_identity),
16676
                            0, ssl->specs.mac_algorithm,
16677
                            cipherSuite0, cipherSuite, 0,
16678
                            NULL, ssl->heap);
16679
                    }
16680
                    if (ret == 0)
16681
                        usingPSK = 1;
16682
                }
16683
                if (ret != 0)
16684
                    return ret;
16685
            }
16686
    #endif /* !NO_PSK */
16687
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16688
16689
            /* Some servers do not generate session tickets unless
16690
             * the extension is seen in a non-resume client hello.
16691
             * We used to send it only if we were otherwise using PSK.
16692
             * Now always send it. Define NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
16693
             * to revert to the old behaviour. */
16694
            #ifdef NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
16695
            if (usingPSK)
16696
            #endif
16697
            {
16698
                byte modes = 0;
16699
16700
                (void)usingPSK;
16701
                /* Pre-shared key modes: mandatory extension for resumption. */
16702
            #ifdef HAVE_SUPPORTED_CURVES
16703
                if (!ssl->options.onlyPskDheKe)
16704
            #endif
16705
                {
16706
                    modes = 1 << PSK_KE;
16707
                }
16708
            #if !defined(NO_DH) || defined(HAVE_ECC) || \
16709
                          defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
16710
                if (!ssl->options.noPskDheKe) {
16711
                    modes |= 1 << PSK_DHE_KE;
16712
                }
16713
            #endif
16714
            #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
16715
                if (ssl->options.certWithExternPsk) {
16716
                    /* RFC 9973 requires psk_dhe_ke with cert_with_extern_psk. */
16717
                    modes |= 1 << PSK_DHE_KE;
16718
                }
16719
            #endif
16720
                ret = TLSX_PskKeyModes_Use(ssl, modes);
16721
                if (ret != 0)
16722
                    return ret;
16723
            }
16724
16725
        #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
16726
            if (usingPSK && ssl->options.certWithExternPsk) {
16727
                ret = TLSX_CertWithExternPsk_Use(ssl);
16728
                if (ret != 0)
16729
                    return ret;
16730
                /* Require server confirmation before using cert-with-PSK path. */
16731
                ssl->options.certWithExternPsk = 0;
16732
            }
16733
        #endif
16734
        #endif
16735
        #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
16736
            if (!isServer && ssl->options.postHandshakeAuth) {
16737
                ret = TLSX_PostHandAuth_Use(ssl);
16738
                if (ret != 0)
16739
                    return ret;
16740
            }
16741
        #endif
16742
#if defined(HAVE_ECH)
16743
            /* GREASE ECH */
16744
            if (!ssl->options.disableECH) {
16745
                if (ssl->echConfigs == NULL) {
16746
                    ret = GREASE_ECH_USE(&(ssl->extensions), ssl->heap,
16747
                            ssl->rng);
16748
                }
16749
                else if (ssl->echConfigs != NULL) {
16750
                    ret = ECH_USE(ssl->echConfigs, &(ssl->extensions),
16751
                            ssl->heap, ssl->rng);
16752
                }
16753
            }
16754
#endif
16755
        }
16756
#if defined(HAVE_ECH)
16757
        else if (IsAtLeastTLSv1_3(ssl->version)) {
16758
            if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
16759
                ret = SERVER_ECH_USE(&(ssl->extensions), ssl->heap,
16760
                    ssl->ctx->echConfigs);
16761
16762
                if (ret == 0)
16763
                    TLSX_SetResponse(ssl, TLSX_ECH);
16764
            }
16765
        }
16766
#endif
16767
16768
#endif
16769
16770
    (void)isServer;
16771
    (void)public_key;
16772
    (void)public_key_len;
16773
    (void)ssl;
16774
16775
    return ret;
16776
}
16777
16778
16779
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
16780
16781
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
16782
/* Returns 1 if the extensions should be hidden for this write */
16783
static int TLSX_EchShouldHideInner(WOLFSSL_ECH* ech)
16784
{
16785
    return ech != NULL && ech->type == ECH_TYPE_OUTER &&
16786
        ech->state != ECH_WRITE_GREASE;
16787
}
16788
16789
/* Swap matching extension types between *sslExts and *echExts.
16790
 *   Non-matched extensions in *echExts are appended to the tail of *sslExts
16791
 *
16792
 * Extensions are stored in reverse wire order, so non-matched extensions are
16793
 * appended to the tail rather than the head; this avoids displacing the leading
16794
 * extension (e.g. pre_shared_key, which must stay last on the wire).
16795
 *
16796
 * *appended is in/out:
16797
 *  in  -> number of trailing extensions to move from *sslExts to *echExts
16798
 *  out -> the number of extensions appended to the tail of *sslExts
16799
 *
16800
 * Returns 0 on success, error otherwise. */
16801
WOLFSSL_TEST_VIS int TLSX_EchSwapExtensions(TLSX** sslExts, TLSX** echExts,
16802
    word16* appended)
16803
{
16804
    TLSX* chunk = NULL;
16805
    TLSX* node;
16806
    TLSX* outer;
16807
    TLSX* inner;
16808
    TLSX** outerLink;
16809
    TLSX** innerLink;
16810
    TLSX** sslTail;
16811
    word16 len = 0;
16812
16813
    if (*appended > 0) {
16814
        for (node = *sslExts; node != NULL; node = node->next)
16815
            len++;
16816
        if (*appended >= len)
16817
            return BAD_FUNC_ARG;
16818
        sslTail = sslExts;
16819
        while (len > *appended) {
16820
            sslTail = &(*sslTail)->next;
16821
            len--;
16822
        }
16823
        chunk = *sslTail;
16824
        *sslTail = NULL;
16825
    }
16826
16827
    *appended = 0;
16828
16829
    outerLink = echExts;
16830
    while (*outerLink != NULL) {
16831
        innerLink = sslExts;
16832
        outer = *outerLink;
16833
16834
        while (*innerLink != NULL && (*innerLink)->type != outer->type)
16835
            innerLink = &(*innerLink)->next;
16836
16837
        if (*innerLink != NULL) {
16838
            inner = *innerLink;
16839
16840
            *innerLink  = outer;
16841
            *outerLink  = inner;
16842
            node        = outer->next;
16843
            outer->next = inner->next;
16844
            inner->next = node;
16845
16846
            outerLink = &inner->next;
16847
        }
16848
        else {
16849
            *outerLink  = outer->next;
16850
            *innerLink  = outer;
16851
            outer->next = NULL;
16852
            *appended   += 1;
16853
        }
16854
    }
16855
16856
    /* outerLink is at the tail of *echExts; append the chunk */
16857
    *outerLink = chunk;
16858
16859
    return 0;
16860
}
16861
16862
/* sets installed if extensions were concealed, clears it otherwise.
16863
 * updates appended with the number of extensions appended.
16864
 * returns 0 on success, error otherwise */
16865
static int TLSX_EchConcealExtensions(WOLFSSL* ssl, WOLFSSL_ECH* ech,
16866
    word16* appended, int* installed)
16867
{
16868
    int ret = 0;
16869
16870
    *installed = 0;
16871
    *appended = 0;
16872
    if (TLSX_EchShouldHideInner(ech)) {
16873
        ret = TLSX_EchSwapExtensions(&ssl->extensions, &ech->extensions,
16874
                appended);
16875
        if (ret == 0)
16876
            *installed = 1;
16877
    }
16878
16879
    return ret;
16880
}
16881
16882
/* reverses TLSX_EchConcealExtensions
16883
 * returns 0 on success, error otherwise */
16884
static int TLSX_EchExposeExtensions(WOLFSSL* ssl, WOLFSSL_ECH* ech,
16885
    word16 appended, int installed)
16886
{
16887
    int ret = 0;
16888
16889
    if (installed) {
16890
        /* this is expected to always succeed, but in the case that it does not
16891
         * the handshake should be aborted and the ssl should not be reused. */
16892
        ret = TLSX_EchSwapExtensions(&ssl->extensions, &ech->extensions,
16893
            &appended);
16894
        if (ret == 0 && appended != 0) {
16895
            WOLFSSL_MSG("Bad restore with TLSX_EchSwapExtensions");
16896
            ret = BAD_STATE_E;
16897
        }
16898
    }
16899
16900
    return ret;
16901
}
16902
16903
/* If ECH is accepted, delete ech->extensions
16904
 * If rejected, replace matching ssl->extensions with ech->extensions,
16905
 *   appending to the tail if necessary */
16906
int TLSX_EchReplaceExtensions(WOLFSSL* ssl, byte accepted)
16907
{
16908
    int ret = 0;
16909
    TLSX* echX;
16910
    WOLFSSL_ECH* ech;
16911
    word16 appended = 0;
16912
16913
    echX = TLSX_Find(ssl->extensions, TLSX_ECH);
16914
    if (echX == NULL || echX->data == NULL)
16915
        return 0;
16916
    ech = (WOLFSSL_ECH*)echX->data;
16917
16918
    if (!accepted)
16919
        ret = TLSX_EchSwapExtensions(&ssl->extensions, &ech->extensions,
16920
            &appended);
16921
16922
    if (ret == 0) {
16923
        TLSX_FreeAll(ech->extensions, ssl->heap);
16924
        ech->extensions = NULL;
16925
    }
16926
16927
    return ret;
16928
}
16929
16930
/* Returns 1 if the extension may be encoded into ech_outer_extensions,
16931
 * 0 otherwise */
16932
static int TLSX_ECH_IsEncodable(word16 type)
16933
{
16934
    /* supported_versions being here prevents the inner hello from advertising
16935
     * a version less than TLS1.3 */
16936
    switch (type) {
16937
        case TLSX_SERVER_NAME:
16938
        case TLSX_APPLICATION_LAYER_PROTOCOL:
16939
        case TLSX_SUPPORTED_VERSIONS:
16940
        case TLSX_ECH:
16941
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16942
        case TLSX_PRE_SHARED_KEY:
16943
#endif
16944
#ifdef WOLFSSL_EARLY_DATA
16945
        case TLSX_EARLY_DATA:
16946
#endif
16947
            return 0;
16948
        default:
16949
            return 1;
16950
    }
16951
}
16952
16953
/* find extensions that can be encoded into ech_outer_extensions.
16954
 * If output is non-NULL, then write the encoded form.
16955
 *
16956
 * Layout of OuterExtensions (RFC 9849, S5.1):
16957
 *   2-byte extension_type + 2-byte extension_data length +
16958
 *   1-byte list length    + 2*count bytes of extension types
16959
 */
16960
static int TLSX_ECH_BuildOuterExtensions(WOLFSSL* ssl, const byte* semaphore,
16961
    byte msgType, byte* output, word16* pOffset, word16* outCount,
16962
    byte* encodeMask)
16963
{
16964
    TLSX* list;
16965
    TLSX* extension;
16966
    byte* typesStart = NULL;
16967
    int listIdx;
16968
    word16 count = 0;
16969
    byte isRequest = (msgType == client_hello ||
16970
                      msgType == certificate_request);
16971
    byte seen[SEMAPHORE_SIZE];
16972
16973
    /* backup semaphore so it can be aliased by encodeMask */
16974
    XMEMCPY(seen, semaphore, SEMAPHORE_SIZE);
16975
16976
    if (output != NULL && pOffset != NULL) {
16977
        typesStart = output + *pOffset
16978
                     + HELLO_EXT_TYPE_SZ + OPAQUE16_LEN + OPAQUE8_LEN;
16979
    }
16980
16981
    for (listIdx = 0; listIdx < 2; listIdx++) {
16982
        list = (listIdx == 0) ? ssl->extensions :
16983
            (ssl->ctx != NULL ? ssl->ctx->extensions : NULL);
16984
        for (extension = list; extension != NULL; extension = extension->next) {
16985
            word16 type = (word16)extension->type;
16986
            word16 semIdx = TLSX_ToSemaphore(type);
16987
16988
            /* OuterExtensions is <2..254>, so reference at most 127 types */
16989
            if (count >= 127) {
16990
                WOLFSSL_MSG("ECH: cannot encode more than 127 extensions");
16991
                break;
16992
            }
16993
16994
            if (!isRequest && !extension->resp)
16995
                continue;
16996
            if (!IS_OFF(seen, semIdx))
16997
                continue;
16998
            TURN_ON(seen, semIdx);
16999
            if (!TLSX_ECH_IsEncodable(type))
17000
                continue;
17001
17002
            if (typesStart != NULL)
17003
                c16toa(type, typesStart + count * OPAQUE16_LEN);
17004
            count++;
17005
            TURN_ON(encodeMask, semIdx);
17006
        }
17007
    }
17008
17009
    if (count > 0 && pOffset != NULL) {
17010
        word16 listLen = (word16)(OPAQUE16_LEN * count);
17011
        word16 blockSz = (word16)(HELLO_EXT_TYPE_SZ + OPAQUE16_LEN
17012
                                + OPAQUE8_LEN + listLen);
17013
        if ((word32)*pOffset + blockSz > WOLFSSL_MAX_16BIT) {
17014
            WOLFSSL_MSG("ECH OuterExtensions overflows extensions length");
17015
            return BUFFER_E;
17016
        }
17017
        if (output != NULL) {
17018
            byte* hdr = output + *pOffset;
17019
            c16toa(TLSXT_ECH_OUTER_EXTENSIONS, hdr);
17020
            c16toa((word16)(OPAQUE8_LEN + listLen), hdr + OPAQUE16_LEN);
17021
            hdr[OPAQUE16_LEN + OPAQUE16_LEN] = (byte)listLen;
17022
        }
17023
17024
        /* accumulate offset even if nothing is written */
17025
        *pOffset += blockSz;
17026
    }
17027
17028
    *outCount = count;
17029
    return 0;
17030
}
17031
17032
/* because the size of ech depends on the size of other extensions we need to
17033
 * get the size with ech special and process ech last, return status */
17034
static int TLSX_GetSizeWithEch(WOLFSSL* ssl, byte* semaphore, byte msgType,
17035
    word16* pLength)
17036
{
17037
    int ret = 0;
17038
    int retC;
17039
    int installed = 0;
17040
    TLSX* echX = NULL;
17041
    WOLFSSL_ECH* ech = NULL;
17042
    word16 count = 0;
17043
    word16 appended = 0;
17044
17045
    if (ssl->extensions)
17046
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
17047
    if (echX != NULL)
17048
        ech = (WOLFSSL_ECH*)echX->data;
17049
17050
    ret = retC = TLSX_EchConcealExtensions(ssl, ech, &appended, &installed);
17051
17052
    /* if encoding, then count encoded form of inner ClientHello.
17053
     * `semaphore` is in/out so encodable extensions will later be ignored */
17054
    if (ret == 0 &&
17055
            ech != NULL && ech->type == ECH_TYPE_INNER && ech->writeEncoded) {
17056
        ret = TLSX_ECH_BuildOuterExtensions(ssl, semaphore, msgType,
17057
            NULL, pLength, &count, semaphore);
17058
    }
17059
    if (ret == 0 && ssl->extensions)
17060
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, pLength);
17061
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions)
17062
        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, pLength);
17063
17064
    /* always try to restore extensions to a good state */
17065
    if (retC == 0)
17066
        retC = TLSX_EchExposeExtensions(ssl, ech, appended, installed);
17067
17068
    if (ret == 0)
17069
        ret = retC;
17070
    return ret;
17071
}
17072
#endif
17073
17074
/** Tells the buffered size of extensions to be sent into the client hello. */
17075
int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word32* pLength)
17076
{
17077
    int ret = 0;
17078
    word16 length = 0;
17079
    byte semaphore[SEMAPHORE_SIZE] = {0};
17080
17081
    if (!TLSX_SupportExtensions(ssl))
17082
        return 0;
17083
    if (msgType == client_hello) {
17084
        EC_VALIDATE_REQUEST(ssl, semaphore);
17085
        PF_VALIDATE_REQUEST(ssl, semaphore);
17086
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17087
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
17088
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
17089
#endif
17090
#if defined(WOLFSSL_TLS13)
17091
        if (!IsAtLeastTLSv1_2(ssl)) {
17092
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17093
        }
17094
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
17095
        if (!IsAtLeastTLSv1_3(ssl->version)) {
17096
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17097
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17098
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17099
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
17100
        #endif
17101
        #ifdef WOLFSSL_EARLY_DATA
17102
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
17103
        #endif
17104
        #ifdef WOLFSSL_SEND_HRR_COOKIE
17105
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
17106
        #endif
17107
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
17108
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
17109
        #endif
17110
        }
17111
    #endif
17112
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
17113
        if (!IsAtLeastTLSv1_3(ssl->version) ||
17114
                SSL_CA_NAMES(ssl) == NULL) {
17115
            TURN_ON(semaphore,
17116
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
17117
        }
17118
    #endif
17119
#endif /* WOLFSSL_TLS13 */
17120
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
17121
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17122
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
17123
            /* mark already sent, so it won't send it */
17124
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17125
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
17126
        }
17127
    #endif
17128
    }
17129
17130
#ifdef WOLFSSL_TLS13
17131
    #ifndef NO_CERTS
17132
    else if (msgType == certificate_request) {
17133
        /* Don't send out any extension except those that are turned off. */
17134
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17135
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17136
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
17137
#endif
17138
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
17139
        if (SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
17140
            TURN_OFF(semaphore,
17141
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
17142
        }
17143
#endif
17144
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, OID_FILTERS
17145
         *       TLSX_STATUS_REQUEST
17146
         */
17147
    }
17148
    #endif
17149
#if defined(HAVE_ECH)
17150
    if (!ssl->options.disableECH && msgType == client_hello) {
17151
        ret = TLSX_GetSizeWithEch(ssl, semaphore, msgType, &length);
17152
        if (ret != 0)
17153
            return ret;
17154
    }
17155
    else
17156
#endif /* HAVE_ECH */
17157
#endif /* WOLFSSL_TLS13 */
17158
    {
17159
        if (ssl->extensions) {
17160
            ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
17161
            if (ret != 0)
17162
                return ret;
17163
        }
17164
        if (ssl->ctx && ssl->ctx->extensions) {
17165
            ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType,
17166
                &length);
17167
            if (ret != 0)
17168
                return ret;
17169
        }
17170
    }
17171
17172
#ifdef HAVE_EXTENDED_MASTER
17173
    if (msgType == client_hello && ssl->options.haveEMS &&
17174
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
17175
        length += HELLO_EXT_SZ;
17176
    }
17177
#endif
17178
17179
    /* The TLS extensions block length prefix is a 2-byte field, so any
17180
     * accumulated total above 0xFFFF must be rejected rather than silently
17181
     * truncating and producing a short, malformed handshake message. */
17182
    if (length > (word16)(WOLFSSL_MAX_16BIT - OPAQUE16_LEN)) {
17183
        WOLFSSL_MSG("TLSX_GetRequestSize extensions exceed word16");
17184
        return BUFFER_E;
17185
    }
17186
    if (length)
17187
        length += OPAQUE16_LEN; /* for total length storage. */
17188
17189
    *pLength += length;
17190
17191
    return ret;
17192
}
17193
17194
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
17195
/* return status after writing the extensions with ech written last */
17196
static int TLSX_WriteWithEch(WOLFSSL* ssl, byte* output, byte* semaphore,
17197
    byte msgType, word16* pOffset)
17198
{
17199
    int ret = 0;
17200
    int retC;
17201
    int installed = 0;
17202
    TLSX* echX = NULL;
17203
    WOLFSSL_ECH* ech = NULL;
17204
    word16 appended = 0;
17205
17206
    if (ssl->extensions)
17207
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
17208
    if (echX != NULL)
17209
        ech = (WOLFSSL_ECH*)echX->data;
17210
17211
    ret = retC = TLSX_EchConcealExtensions(ssl, ech, &appended, &installed);
17212
17213
    if (ret == 0 && echX != NULL) {
17214
        /* turn ech on so it doesn't write, then write it last */
17215
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
17216
    }
17217
17218
    /* for ECH inner, print the encodable block first, then the non-encodables.
17219
     * This allows the same transcript to be produced on either side
17220
     * (the transcript is over the expanded form). */
17221
    if (ret == 0 && ech != NULL && ech->type == ECH_TYPE_INNER) {
17222
        byte encodeMask[SEMAPHORE_SIZE];
17223
        byte* mask = ech->writeEncoded ? semaphore : encodeMask;
17224
        word16 count = 0;
17225
        int i;
17226
17227
        XMEMSET(encodeMask, 0, SEMAPHORE_SIZE);
17228
17229
        ret = TLSX_ECH_BuildOuterExtensions(ssl, semaphore, msgType,
17230
            ech->writeEncoded ? output : NULL,
17231
            ech->writeEncoded ? pOffset : NULL,
17232
            &count, mask);
17233
        if (ret == 0 && count >= 1 && !ech->writeEncoded) {
17234
            /* expanded: print encodable block normally */
17235
            for (i = 0; i < SEMAPHORE_SIZE; i++) {
17236
                semaphore[i] |= encodeMask[i];
17237
                encodeMask[i] = (byte)~encodeMask[i];
17238
            }
17239
            if (ssl->extensions) {
17240
                ret = TLSX_Write(ssl->extensions, output + *pOffset,
17241
                        encodeMask, msgType, pOffset);
17242
            }
17243
            if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
17244
                ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset,
17245
                        encodeMask, msgType, pOffset);
17246
            }
17247
        }
17248
    }
17249
17250
    /* print non-encodable block */
17251
    if (ret == 0 && ssl->extensions) {
17252
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
17253
                         msgType, pOffset);
17254
    }
17255
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
17256
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
17257
                         msgType, pOffset);
17258
    }
17259
17260
    /* write ECH last */
17261
    if (ret == 0 && echX != NULL) {
17262
        /* turn off and write it last */
17263
        TURN_OFF(semaphore, TLSX_ToSemaphore(echX->type));
17264
17265
        if (ssl->extensions) {
17266
            ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
17267
                msgType, pOffset);
17268
        }
17269
17270
        if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
17271
            ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
17272
                msgType, pOffset);
17273
        }
17274
    }
17275
17276
    /* always try to restore extensions to a good state */
17277
    if (retC == 0)
17278
        retC = TLSX_EchExposeExtensions(ssl, ech, appended, installed);
17279
17280
    if (ret == 0)
17281
        ret = retC;
17282
    return ret;
17283
}
17284
#endif
17285
17286
/** Writes the extensions to be sent into the client hello. */
17287
int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word32* pOffset)
17288
{
17289
    int ret = 0;
17290
    word16 offset = 0;
17291
    byte semaphore[SEMAPHORE_SIZE] = {0};
17292
17293
    if (!TLSX_SupportExtensions(ssl) || output == NULL)
17294
        return 0;
17295
17296
    offset += OPAQUE16_LEN; /* extensions length */
17297
17298
    if (msgType == client_hello) {
17299
        EC_VALIDATE_REQUEST(ssl, semaphore);
17300
        PF_VALIDATE_REQUEST(ssl, semaphore);
17301
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17302
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
17303
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
17304
#endif
17305
#ifdef WOLFSSL_TLS13
17306
        if (!IsAtLeastTLSv1_2(ssl)) {
17307
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17308
        }
17309
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
17310
        if (!IsAtLeastTLSv1_3(ssl->version)) {
17311
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17312
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17313
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
17314
        #endif
17315
        #ifdef WOLFSSL_EARLY_DATA
17316
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
17317
        #endif
17318
        #ifdef WOLFSSL_SEND_HRR_COOKIE
17319
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
17320
        #endif
17321
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
17322
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
17323
        #endif
17324
        #ifdef WOLFSSL_DUAL_ALG_CERTS
17325
            TURN_ON(semaphore,
17326
                    TLSX_ToSemaphore(TLSX_CKS));
17327
        #endif
17328
        }
17329
    #endif
17330
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
17331
        if (!IsAtLeastTLSv1_3(ssl->version) || SSL_CA_NAMES(ssl) == NULL) {
17332
            TURN_ON(semaphore,
17333
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
17334
        }
17335
    #endif
17336
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17337
        /* Must write Pre-shared Key extension at the end in TLS v1.3.
17338
         * Must not write out Pre-shared Key extension in earlier versions of
17339
         * protocol.
17340
         */
17341
        TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17342
    #endif
17343
#endif /* WOLFSSL_TLS13 */
17344
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
17345
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17346
         /* mark already sent, so it won't send it */
17347
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
17348
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17349
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
17350
        }
17351
    #endif
17352
    }
17353
#ifdef WOLFSSL_TLS13
17354
    #ifndef NO_CERTS
17355
    else if (msgType == certificate_request) {
17356
        /* Don't send out any extension except those that are turned off. */
17357
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17358
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17359
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
17360
#endif
17361
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
17362
        if (SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
17363
            TURN_OFF(semaphore,
17364
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
17365
        }
17366
#endif
17367
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, TLSX_OID_FILTERS
17368
         *       TLSX_STATUS_REQUEST
17369
         */
17370
    }
17371
    #endif
17372
#endif
17373
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
17374
    if (!ssl->options.disableECH && msgType == client_hello) {
17375
        ret = TLSX_WriteWithEch(ssl, output, semaphore, msgType, &offset);
17376
        if (ret != 0)
17377
            return ret;
17378
    }
17379
    else
17380
#endif
17381
    {
17382
        if (ssl->extensions) {
17383
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
17384
                             msgType, &offset);
17385
            if (ret != 0)
17386
                return ret;
17387
        }
17388
        if (ssl->ctx && ssl->ctx->extensions) {
17389
            ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
17390
                             msgType, &offset);
17391
            if (ret != 0)
17392
                return ret;
17393
        }
17394
    }
17395
17396
#ifdef HAVE_EXTENDED_MASTER
17397
    if (msgType == client_hello && ssl->options.haveEMS &&
17398
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
17399
        WOLFSSL_MSG("EMS extension to write");
17400
        c16toa(HELLO_EXT_EXTMS, output + offset);
17401
        offset += HELLO_EXT_TYPE_SZ;
17402
        c16toa(0, output + offset);
17403
        offset += HELLO_EXT_SZ_SZ;
17404
    }
17405
#endif
17406
17407
#ifdef WOLFSSL_TLS13
17408
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17409
    if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
17410
        /* Write out what we can of Pre-shared key extension.  */
17411
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17412
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
17413
                         client_hello, &offset);
17414
        if (ret != 0)
17415
            return ret;
17416
    }
17417
    #endif
17418
#endif
17419
17420
    /* Wrap detection for the TLSX_Write calls above is handled inside
17421
     * TLSX_Write itself: any iteration that would push the local word16
17422
     * offset past 0xFFFF returns BUFFER_E so we never reach here with a
17423
     * truncated value. The TLS extensions block length prefix on the
17424
     * wire is a 2-byte field, matching this invariant. */
17425
17426
    if (offset > OPAQUE16_LEN || msgType != client_hello)
17427
        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
17428
17429
     *pOffset += offset;
17430
17431
    return ret;
17432
}
17433
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
17434
17435
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
17436
17437
/** Tells the buffered size of extensions to be sent into the server hello. */
17438
int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
17439
{
17440
    int ret = 0;
17441
    word16 length = 0;
17442
    byte semaphore[SEMAPHORE_SIZE] = {0};
17443
17444
    switch (msgType) {
17445
#ifndef NO_WOLFSSL_SERVER
17446
        case server_hello:
17447
            PF_VALIDATE_RESPONSE(ssl, semaphore);
17448
        #ifdef WOLFSSL_TLS13
17449
                if (IsAtLeastTLSv1_3(ssl->version)) {
17450
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17451
                    TURN_OFF(semaphore,
17452
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17453
                #if defined(HAVE_SUPPORTED_CURVES)
17454
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17455
                    if (!ssl->options.noPskDheKe)
17456
                #endif
17457
                    {
17458
                        /* Expect KeyShare extension in ServerHello. */
17459
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17460
                    }
17461
                #endif
17462
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17463
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17464
                #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
17465
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
17466
                #endif
17467
                #endif
17468
                }
17469
            #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
17470
                else {
17471
                #ifdef HAVE_SUPPORTED_CURVES
17472
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17473
                #endif
17474
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17475
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17476
                #endif
17477
                }
17478
            #endif
17479
            #ifdef WOLFSSL_DTLS_CID
17480
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
17481
            #endif
17482
        #endif /* WOLFSSL_TLS13 */
17483
            break;
17484
17485
    #ifdef WOLFSSL_TLS13
17486
        case hello_retry_request:
17487
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17488
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17489
        #ifdef HAVE_SUPPORTED_CURVES
17490
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17491
            if (!ssl->options.noPskDheKe)
17492
        #endif
17493
            {
17494
                /* Expect KeyShare extension in HelloRetryRequest. */
17495
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17496
            }
17497
        #endif
17498
        #ifdef WOLFSSL_SEND_HRR_COOKIE
17499
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
17500
        #endif
17501
#ifdef HAVE_ECH
17502
            /* send the special confirmation */
17503
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
17504
#endif
17505
            break;
17506
    #endif
17507
17508
    #ifdef WOLFSSL_TLS13
17509
        case encrypted_extensions:
17510
            /* Send out all extension except those that are turned on. */
17511
        #ifdef HAVE_ECC
17512
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
17513
        #endif
17514
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17515
        #ifdef HAVE_SESSION_TICKET
17516
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
17517
        #endif
17518
        #ifdef HAVE_SUPPORTED_CURVES
17519
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17520
        #endif
17521
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17522
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17523
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
17524
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
17525
        #endif
17526
        #endif
17527
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
17528
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17529
        #endif
17530
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
17531
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
17532
        #endif
17533
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
17534
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
17535
        #endif
17536
        #ifdef WOLFSSL_DTLS_CID
17537
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
17538
        #endif /* WOLFSSL_DTLS_CID */
17539
            break;
17540
17541
        #ifdef WOLFSSL_EARLY_DATA
17542
        case session_ticket:
17543
            if (ssl->options.tls1_3) {
17544
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17545
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
17546
            }
17547
            break;
17548
        #endif
17549
    #endif
17550
#endif
17551
17552
#ifdef WOLFSSL_TLS13
17553
    #ifndef NO_CERTS
17554
        case certificate:
17555
            /* Don't send out any extension except those that are turned off. */
17556
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17557
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17558
            /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
17559
             *       TLSX_SERVER_CERTIFICATE_TYPE
17560
             */
17561
            break;
17562
    #endif
17563
#endif
17564
    }
17565
17566
#ifdef HAVE_EXTENDED_MASTER
17567
    if (ssl->options.haveEMS && msgType == server_hello &&
17568
                                              !IsAtLeastTLSv1_3(ssl->version)) {
17569
        length += HELLO_EXT_SZ;
17570
    }
17571
#endif
17572
17573
    if (TLSX_SupportExtensions(ssl)) {
17574
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
17575
        if (ret != 0)
17576
            return ret;
17577
    }
17578
17579
    /* All the response data is set at the ssl object only, so no ctx here. */
17580
17581
    if (length || msgType != server_hello)
17582
        length += OPAQUE16_LEN; /* for total length storage. */
17583
17584
    *pLength += length;
17585
17586
    return ret;
17587
}
17588
17589
/** Writes the server hello extensions into a buffer. */
17590
int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
17591
0
{
17592
0
    int ret = 0;
17593
0
    word16 offset = 0;
17594
17595
0
    if (TLSX_SupportExtensions(ssl) && output) {
17596
0
        byte semaphore[SEMAPHORE_SIZE] = {0};
17597
17598
0
        switch (msgType) {
17599
0
#ifndef NO_WOLFSSL_SERVER
17600
0
            case server_hello:
17601
0
                PF_VALIDATE_RESPONSE(ssl, semaphore);
17602
0
        #ifdef WOLFSSL_TLS13
17603
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
17604
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17605
0
                    TURN_OFF(semaphore,
17606
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17607
0
            #ifdef HAVE_SUPPORTED_CURVES
17608
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17609
                    if (!ssl->options.noPskDheKe)
17610
                #endif
17611
0
                    {
17612
                        /* Write out KeyShare in ServerHello. */
17613
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17614
0
                    }
17615
0
            #endif
17616
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17617
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17618
            #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
17619
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
17620
            #endif
17621
            #endif
17622
0
                }
17623
0
                else
17624
0
        #endif /* WOLFSSL_TLS13 */
17625
0
                {
17626
0
        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
17627
0
            #ifdef HAVE_SUPPORTED_CURVES
17628
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17629
0
            #endif
17630
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17631
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17632
            #endif
17633
0
        #endif
17634
0
                    WC_DO_NOTHING; /* avoid empty brackets */
17635
0
                }
17636
        #ifdef WOLFSSL_DTLS_CID
17637
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
17638
        #endif /* WOLFSSL_DTLS_CID */
17639
0
                break;
17640
17641
0
    #ifdef WOLFSSL_TLS13
17642
0
            case hello_retry_request:
17643
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17644
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17645
0
        #ifdef HAVE_SUPPORTED_CURVES
17646
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17647
                if (!ssl->options.noPskDheKe)
17648
            #endif
17649
0
                {
17650
                    /* Write out KeyShare in HelloRetryRequest. */
17651
0
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17652
0
                }
17653
0
        #endif
17654
0
                break;
17655
0
    #endif
17656
17657
0
    #ifdef WOLFSSL_TLS13
17658
0
            case encrypted_extensions:
17659
                /* Send out all extension except those that are turned on. */
17660
0
        #ifdef HAVE_ECC
17661
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
17662
0
        #endif
17663
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17664
        #ifdef HAVE_SESSION_TICKET
17665
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
17666
        #endif
17667
0
        #ifdef HAVE_SUPPORTED_CURVES
17668
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17669
0
        #endif
17670
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17671
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17672
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
17673
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
17674
        #endif
17675
        #endif
17676
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
17677
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17678
        #endif
17679
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
17680
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
17681
        #endif
17682
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
17683
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
17684
0
        #endif
17685
        #ifdef WOLFSSL_DTLS_CID
17686
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
17687
        #endif /* WOLFSSL_DTLS_CID */
17688
0
                break;
17689
17690
        #ifdef WOLFSSL_EARLY_DATA
17691
            case session_ticket:
17692
                if (ssl->options.tls1_3) {
17693
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17694
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
17695
                }
17696
                break;
17697
        #endif
17698
0
    #endif
17699
0
#endif
17700
17701
0
    #ifdef WOLFSSL_TLS13
17702
0
        #ifndef NO_CERTS
17703
0
            case certificate:
17704
                /* Don't send out any extension except those that are turned
17705
                 * off. */
17706
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17707
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17708
                /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
17709
                 *       TLSX_SERVER_CERTIFICATE_TYPE
17710
                 */
17711
0
                break;
17712
0
        #endif
17713
0
    #endif
17714
17715
0
            default:
17716
0
                break;
17717
0
        }
17718
17719
0
        offset += OPAQUE16_LEN; /* extensions length */
17720
17721
0
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
17722
0
                         msgType, &offset);
17723
0
        if (ret != 0)
17724
0
            return ret;
17725
17726
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
17727
        if (msgType == hello_retry_request) {
17728
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17729
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
17730
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
17731
                             msgType, &offset);
17732
            if (ret != 0)
17733
                return ret;
17734
        }
17735
#endif
17736
17737
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
17738
        /* write ECH last to promote interop with other implementations */
17739
        if (msgType == hello_retry_request) {
17740
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17741
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
17742
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
17743
                             msgType, &offset);
17744
            if (ret != 0)
17745
                return ret;
17746
        }
17747
#endif
17748
17749
0
#ifdef HAVE_EXTENDED_MASTER
17750
0
        if (ssl->options.haveEMS && msgType == server_hello &&
17751
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
17752
0
            WOLFSSL_MSG("EMS extension to write");
17753
0
            c16toa(HELLO_EXT_EXTMS, output + offset);
17754
0
            offset += HELLO_EXT_TYPE_SZ;
17755
0
            c16toa(0, output + offset);
17756
0
            offset += HELLO_EXT_SZ_SZ;
17757
0
        }
17758
0
#endif
17759
17760
0
        if (offset > OPAQUE16_LEN || msgType != server_hello)
17761
0
            c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
17762
0
    }
17763
17764
0
    if (pOffset)
17765
0
        *pOffset += offset;
17766
17767
0
    return ret;
17768
0
}
17769
17770
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
17771
17772
#ifdef WOLFSSL_TLS13
17773
int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
17774
                      byte msgType, int* found)
17775
3.99k
{
17776
3.99k
    int ret = 0;
17777
3.99k
    int offset = 0;
17778
17779
3.99k
    *found = 0;
17780
24.0k
    while (offset < (int)length) {
17781
23.8k
        word16 type;
17782
23.8k
        word16 size;
17783
17784
23.8k
        if (offset + (2 * OPAQUE16_LEN) > length) {
17785
31
            ret = BUFFER_ERROR;
17786
31
            break;
17787
31
        }
17788
17789
23.8k
        ato16(input + offset, &type);
17790
23.8k
        offset += HELLO_EXT_TYPE_SZ;
17791
17792
23.8k
        ato16(input + offset, &size);
17793
23.8k
        offset += OPAQUE16_LEN;
17794
17795
23.8k
        if (offset + size > length) {
17796
297
            ret = BUFFER_ERROR;
17797
297
            break;
17798
297
        }
17799
17800
23.5k
        if (type == TLSX_SUPPORTED_VERSIONS) {
17801
3.50k
            *found = 1;
17802
17803
3.50k
            WOLFSSL_MSG("Supported Versions extension received");
17804
17805
3.50k
            ret = SV_PARSE(ssl, input + offset, size, msgType, &ssl->version,
17806
3.50k
                           &ssl->options, &ssl->extensions);
17807
3.50k
            break;
17808
3.50k
        }
17809
17810
20.0k
        offset += size;
17811
20.0k
    }
17812
17813
3.99k
    return ret;
17814
3.99k
}
17815
#endif
17816
/* Jump Table to check minimum size values for client case in TLSX_Parse */
17817
#ifndef NO_WOLFSSL_SERVER
17818
static word16 TLSX_GetMinSize_Client(word16* type)
17819
77.8k
{
17820
77.8k
    switch (*type) {
17821
933
        case TLSXT_SERVER_NAME:
17822
933
            return WOLFSSL_SNI_MIN_SIZE_CLIENT;
17823
2.95k
        case TLSXT_EARLY_DATA:
17824
2.95k
            return WOLFSSL_EDI_MIN_SIZE_CLIENT;
17825
261
        case TLSXT_MAX_FRAGMENT_LENGTH:
17826
261
            return WOLFSSL_MFL_MIN_SIZE_CLIENT;
17827
194
        case TLSXT_TRUSTED_CA_KEYS:
17828
194
            return WOLFSSL_TCA_MIN_SIZE_CLIENT;
17829
554
        case TLSXT_TRUNCATED_HMAC:
17830
554
            return WOLFSSL_THM_MIN_SIZE_CLIENT;
17831
558
        case TLSXT_STATUS_REQUEST:
17832
558
            return WOLFSSL_CSR_MIN_SIZE_CLIENT;
17833
8.94k
        case TLSXT_SUPPORTED_GROUPS:
17834
8.94k
            return WOLFSSL_EC_MIN_SIZE_CLIENT;
17835
1.37k
        case TLSXT_EC_POINT_FORMATS:
17836
1.37k
            return WOLFSSL_PF_MIN_SIZE_CLIENT;
17837
6.02k
        case TLSXT_SIGNATURE_ALGORITHMS:
17838
6.02k
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
17839
198
        case TLSXT_USE_SRTP:
17840
198
            return WOLFSSL_SRTP_MIN_SIZE_CLIENT;
17841
234
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
17842
234
            return WOLFSSL_ALPN_MIN_SIZE_CLIENT;
17843
230
        case TLSXT_STATUS_REQUEST_V2:
17844
230
            return WOLFSSL_CSR2_MIN_SIZE_CLIENT;
17845
94
        case TLSXT_CLIENT_CERTIFICATE:
17846
94
            return WOLFSSL_CCT_MIN_SIZE_CLIENT;
17847
55
        case TLSXT_SERVER_CERTIFICATE:
17848
55
            return WOLFSSL_SCT_MIN_SIZE_CLIENT;
17849
2.01k
        case TLSXT_ENCRYPT_THEN_MAC:
17850
2.01k
            return WOLFSSL_ETM_MIN_SIZE_CLIENT;
17851
1.04k
        case TLSXT_SESSION_TICKET:
17852
1.04k
            return WOLFSSL_STK_MIN_SIZE_CLIENT;
17853
1.35k
        case TLSXT_PRE_SHARED_KEY:
17854
1.35k
            return WOLFSSL_PSK_MIN_SIZE_CLIENT;
17855
86
        case TLSXT_COOKIE:
17856
86
            return WOLFSSL_CKE_MIN_SIZE_CLIENT;
17857
1.20k
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
17858
1.20k
            return WOLFSSL_PKM_MIN_SIZE_CLIENT;
17859
61
        case TLSXT_CERT_WITH_EXTERN_PSK:
17860
61
            return WOLFSSL_CWEP_MIN_SIZE_CLIENT;
17861
565
        case TLSXT_CERTIFICATE_AUTHORITIES:
17862
565
            return WOLFSSL_CAN_MIN_SIZE_CLIENT;
17863
269
        case TLSXT_POST_HANDSHAKE_AUTH:
17864
269
            return WOLFSSL_PHA_MIN_SIZE_CLIENT;
17865
269
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
17866
269
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
17867
4.30k
        case TLSXT_KEY_SHARE:
17868
4.30k
            return WOLFSSL_KS_MIN_SIZE_CLIENT;
17869
107
        case TLSXT_CONNECTION_ID:
17870
107
            return WOLFSSL_CID_MIN_SIZE_CLIENT;
17871
263
        case TLSXT_RENEGOTIATION_INFO:
17872
263
            return WOLFSSL_SCR_MIN_SIZE_CLIENT;
17873
14
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
17874
14
            return WOLFSSL_QTP_MIN_SIZE_CLIENT;
17875
42
        case TLSXT_ECH:
17876
42
            return WOLFSSL_ECH_MIN_SIZE_CLIENT;
17877
43.6k
        default:
17878
43.6k
            return 0;
17879
77.8k
    }
17880
77.8k
}
17881
0
    #define TLSX_GET_MIN_SIZE_CLIENT(type) TLSX_GetMinSize_Client(type)
17882
#else
17883
    #define TLSX_GET_MIN_SIZE_CLIENT(type) 0
17884
#endif
17885
17886
17887
#ifndef NO_WOLFSSL_CLIENT
17888
/* Jump Table to check minimum size values for server case in TLSX_Parse */
17889
static word16 TLSX_GetMinSize_Server(const word16 *type)
17890
5.62k
{
17891
5.62k
    switch (*type) {
17892
52
        case TLSXT_SERVER_NAME:
17893
52
            return WOLFSSL_SNI_MIN_SIZE_SERVER;
17894
5
        case TLSXT_EARLY_DATA:
17895
5
            return WOLFSSL_EDI_MIN_SIZE_SERVER;
17896
7
        case TLSXT_MAX_FRAGMENT_LENGTH:
17897
7
            return WOLFSSL_MFL_MIN_SIZE_SERVER;
17898
43
        case TLSXT_TRUSTED_CA_KEYS:
17899
43
            return WOLFSSL_TCA_MIN_SIZE_SERVER;
17900
7
        case TLSXT_TRUNCATED_HMAC:
17901
7
            return WOLFSSL_THM_MIN_SIZE_SERVER;
17902
2.52k
        case TLSXT_STATUS_REQUEST:
17903
2.52k
            return WOLFSSL_CSR_MIN_SIZE_SERVER;
17904
6
        case TLSXT_SUPPORTED_GROUPS:
17905
6
            return WOLFSSL_EC_MIN_SIZE_SERVER;
17906
24
        case TLSXT_EC_POINT_FORMATS:
17907
24
            return WOLFSSL_PF_MIN_SIZE_SERVER;
17908
7
        case TLSXT_SIGNATURE_ALGORITHMS:
17909
7
            return WOLFSSL_SA_MIN_SIZE_SERVER;
17910
33
        case TLSXT_USE_SRTP:
17911
33
            return WOLFSSL_SRTP_MIN_SIZE_SERVER;
17912
80
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
17913
80
            return WOLFSSL_ALPN_MIN_SIZE_SERVER;
17914
4
        case TLSXT_STATUS_REQUEST_V2:
17915
4
            return WOLFSSL_CSR2_MIN_SIZE_SERVER;
17916
2
        case TLSXT_CLIENT_CERTIFICATE:
17917
2
            return WOLFSSL_CCT_MIN_SIZE_SERVER;
17918
3
        case TLSXT_SERVER_CERTIFICATE:
17919
3
            return WOLFSSL_SCT_MIN_SIZE_SERVER;
17920
49
        case TLSXT_ENCRYPT_THEN_MAC:
17921
49
            return WOLFSSL_ETM_MIN_SIZE_SERVER;
17922
49
        case TLSXT_SESSION_TICKET:
17923
49
            return WOLFSSL_STK_MIN_SIZE_SERVER;
17924
48
        case TLSXT_PRE_SHARED_KEY:
17925
48
            return WOLFSSL_PSK_MIN_SIZE_SERVER;
17926
36
        case TLSXT_COOKIE:
17927
36
            return WOLFSSL_CKE_MIN_SIZE_SERVER;
17928
12
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
17929
12
            return WOLFSSL_PKM_MIN_SIZE_SERVER;
17930
0
        case TLSXT_CERT_WITH_EXTERN_PSK:
17931
0
            return WOLFSSL_CWEP_MIN_SIZE_SERVER;
17932
6
        case TLSXT_CERTIFICATE_AUTHORITIES:
17933
6
            return WOLFSSL_CAN_MIN_SIZE_SERVER;
17934
7
        case TLSXT_POST_HANDSHAKE_AUTH:
17935
7
            return WOLFSSL_PHA_MIN_SIZE_SERVER;
17936
6
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
17937
6
            return WOLFSSL_SA_MIN_SIZE_SERVER;
17938
531
        case TLSXT_KEY_SHARE:
17939
531
            return WOLFSSL_KS_MIN_SIZE_SERVER;
17940
8
        case TLSXT_CONNECTION_ID:
17941
8
            return WOLFSSL_CID_MIN_SIZE_SERVER;
17942
13
        case TLSXT_RENEGOTIATION_INFO:
17943
13
            return WOLFSSL_SCR_MIN_SIZE_SERVER;
17944
2
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
17945
2
            return WOLFSSL_QTP_MIN_SIZE_SERVER;
17946
0
        case TLSXT_ECH:
17947
0
            return WOLFSSL_ECH_MIN_SIZE_SERVER;
17948
2.05k
        default:
17949
2.05k
            return 0;
17950
5.62k
    }
17951
5.62k
}
17952
0
    #define TLSX_GET_MIN_SIZE_SERVER(type) TLSX_GetMinSize_Server(type)
17953
#else
17954
    #define TLSX_GET_MIN_SIZE_SERVER(type) 0
17955
#endif
17956
17957
17958
/** Parses a buffer of TLS extensions. */
17959
WOLFSSL_TEST_VIS int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length,
17960
                                byte msgType, Suites *suites)
17961
0
{
17962
0
    int ret = 0;
17963
0
    word16 offset = 0;
17964
0
    byte isRequest = (msgType == client_hello ||
17965
0
                      msgType == certificate_request);
17966
17967
0
#ifdef HAVE_EXTENDED_MASTER
17968
0
    byte pendingEMS = 0;
17969
0
#endif
17970
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
17971
    int pskDone = 0;
17972
#endif
17973
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
17974
    !defined(NO_PSK)
17975
    int secondClientHello = 0;
17976
    int prevHasPskWithCert = 0;
17977
#endif
17978
0
    byte seenType[SEMAPHORE_SIZE];  /* Seen known extensions. */
17979
17980
0
    if (!ssl || !input || (isRequest && !suites))
17981
0
        return BAD_FUNC_ARG;
17982
17983
    /* No known extensions seen yet. */
17984
0
    XMEMSET(seenType, 0, sizeof(seenType));
17985
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
17986
    !defined(NO_PSK)
17987
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == client_hello &&
17988
            ssl->msgsReceived.got_client_hello == 2) {
17989
        secondClientHello = 1;
17990
        prevHasPskWithCert =
17991
            TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) != NULL;
17992
    }
17993
#endif
17994
17995
0
    while (ret == 0 && offset < length) {
17996
0
        word16 type;
17997
0
        word16 size;
17998
17999
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
18000
        if (msgType == client_hello && pskDone) {
18001
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
18002
            return PSK_KEY_ERROR;
18003
        }
18004
#endif
18005
18006
0
        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
18007
0
            return BUFFER_ERROR;
18008
18009
0
        ato16(input + offset, &type);
18010
0
        offset += HELLO_EXT_TYPE_SZ;
18011
18012
0
        ato16(input + offset, &size);
18013
0
        offset += OPAQUE16_LEN;
18014
18015
        /* Check we have a bit for extension type. */
18016
0
        if ((type <= 62) || (type == TLSX_RENEGOTIATION_INFO)
18017
        #ifdef WOLFSSL_QUIC
18018
            || (type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT)
18019
        #endif
18020
        #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
18021
            || (type == TLSX_ECH)
18022
        #endif
18023
        #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
18024
            || (type == TLSX_CKS)
18025
        #endif
18026
0
            )
18027
0
        {
18028
            /* Detect duplicate recognized extensions. */
18029
0
            if (IS_OFF(seenType, TLSX_ToSemaphore(type))) {
18030
0
                TURN_ON(seenType, TLSX_ToSemaphore(type));
18031
0
            }
18032
0
            else {
18033
0
                return DUPLICATE_TLS_EXT_E;
18034
0
            }
18035
0
        }
18036
18037
0
        if (length - offset < size)
18038
0
            return BUFFER_ERROR;
18039
18040
        /* Check minimum size required for TLSX, even if disabled */
18041
0
        switch (msgType) {
18042
0
            #ifndef NO_WOLFSSL_SERVER
18043
0
            case client_hello:
18044
0
                if (size < TLSX_GET_MIN_SIZE_CLIENT(&type)){
18045
0
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
18046
0
                    return BUFFER_ERROR;
18047
0
                }
18048
0
            break;
18049
0
            #endif
18050
0
            #ifndef NO_WOLFSSL_CLIENT
18051
0
            case server_hello:
18052
0
            case hello_retry_request:
18053
0
                if (size < TLSX_GET_MIN_SIZE_SERVER(&type)){
18054
0
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
18055
0
                    return BUFFER_ERROR;
18056
0
                }
18057
0
            break;
18058
0
            #endif
18059
0
            default:
18060
0
            break;
18061
0
        }
18062
18063
0
#ifdef WOLFSSL_TLS13
18064
        /* RFC 8446 4.4.2: extensions in a Certificate message MUST
18065
         * correspond to ones offered in our prior ClientHello (client) or
18066
         * CertificateRequest (server). Reject anything we did not offer, but a
18067
         * CTX-level API leaves the extension on ctx->extensions, so look there
18068
         * too before concluding it was never offered. */
18069
0
        if (msgType == certificate &&
18070
0
            IsAtLeastTLSv1_3(ssl->version) &&
18071
0
            TLSX_Find(ssl->extensions, (TLSX_Type)type) == NULL &&
18072
0
            (ssl->ctx == NULL ||
18073
0
             TLSX_Find(ssl->ctx->extensions, (TLSX_Type)type) == NULL)) {
18074
0
            WOLFSSL_MSG("Cert-msg extension not offered in CH/CR");
18075
0
            SendAlert(ssl, alert_fatal, unsupported_extension);
18076
0
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
18077
0
            return UNSUPPORTED_EXTENSION;
18078
0
        }
18079
0
#endif
18080
18081
0
        switch (type) {
18082
0
#ifdef HAVE_SNI
18083
0
            case TLSX_SERVER_NAME:
18084
0
                WOLFSSL_MSG("SNI extension received");
18085
            #ifdef WOLFSSL_DEBUG_TLS
18086
                WOLFSSL_BUFFER(input + offset, size);
18087
            #endif
18088
18089
0
#ifdef WOLFSSL_TLS13
18090
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18091
0
                    if (msgType != client_hello &&
18092
0
                        msgType != encrypted_extensions)
18093
0
                        return EXT_NOT_ALLOWED;
18094
0
                }
18095
0
                else
18096
0
#endif
18097
0
                {
18098
0
                    if (msgType != client_hello &&
18099
0
                        msgType != server_hello)
18100
0
                        return EXT_NOT_ALLOWED;
18101
0
                }
18102
0
                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
18103
0
                break;
18104
0
#endif
18105
18106
0
            case TLSX_TRUSTED_CA_KEYS:
18107
0
                WOLFSSL_MSG("Trusted CA extension received");
18108
            #ifdef WOLFSSL_DEBUG_TLS
18109
                WOLFSSL_BUFFER(input + offset, size);
18110
            #endif
18111
18112
0
#ifdef WOLFSSL_TLS13
18113
                /* RFC 8446 4.2.4 states trusted_ca_keys is not used
18114
                   in TLS 1.3. */
18115
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18116
0
                    break;
18117
0
                }
18118
0
                else
18119
0
#endif
18120
0
                {
18121
0
                    if (msgType != client_hello &&
18122
0
                        msgType != server_hello)
18123
0
                        return EXT_NOT_ALLOWED;
18124
0
                }
18125
0
                ret = TCA_PARSE(ssl, input + offset, size, isRequest);
18126
0
                break;
18127
18128
0
            case TLSX_MAX_FRAGMENT_LENGTH:
18129
0
                WOLFSSL_MSG("Max Fragment Length extension received");
18130
            #ifdef WOLFSSL_DEBUG_TLS
18131
                WOLFSSL_BUFFER(input + offset, size);
18132
            #endif
18133
18134
0
#ifdef WOLFSSL_TLS13
18135
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18136
0
                    if (msgType != client_hello &&
18137
0
                        msgType != encrypted_extensions) {
18138
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18139
0
                        return EXT_NOT_ALLOWED;
18140
0
                    }
18141
0
                }
18142
0
                else
18143
0
#endif
18144
0
                {
18145
0
                    if (msgType != client_hello &&
18146
0
                        msgType != server_hello) {
18147
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18148
0
                        return EXT_NOT_ALLOWED;
18149
0
                    }
18150
0
                }
18151
0
                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
18152
0
                break;
18153
18154
0
            case TLSX_TRUNCATED_HMAC:
18155
0
                WOLFSSL_MSG("Truncated HMAC extension received");
18156
            #ifdef WOLFSSL_DEBUG_TLS
18157
                WOLFSSL_BUFFER(input + offset, size);
18158
            #endif
18159
18160
0
#ifdef WOLFSSL_TLS13
18161
0
                if (IsAtLeastTLSv1_3(ssl->version))
18162
0
                    break;
18163
0
#endif
18164
0
                if (msgType != client_hello)
18165
0
                    return EXT_NOT_ALLOWED;
18166
0
                ret = THM_PARSE(ssl, input + offset, size, isRequest);
18167
0
                break;
18168
18169
0
            case TLSX_SUPPORTED_GROUPS:
18170
0
                WOLFSSL_MSG("Supported Groups extension received");
18171
            #ifdef WOLFSSL_DEBUG_TLS
18172
                WOLFSSL_BUFFER(input + offset, size);
18173
            #endif
18174
18175
0
#ifdef WOLFSSL_TLS13
18176
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18177
0
                    if (msgType != client_hello &&
18178
0
                        msgType != encrypted_extensions) {
18179
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18180
0
                        return EXT_NOT_ALLOWED;
18181
0
                    }
18182
0
                }
18183
0
                else
18184
0
#endif
18185
0
                {
18186
0
                    if (msgType != client_hello) {
18187
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18188
0
                        return EXT_NOT_ALLOWED;
18189
0
                    }
18190
0
                }
18191
0
                ret = EC_PARSE(ssl, input + offset, size, isRequest,
18192
0
                        &ssl->extensions);
18193
0
                break;
18194
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
18195
            case TLSX_CKS:
18196
                WOLFSSL_MSG("CKS extension received");
18197
                if (msgType != client_hello &&
18198
                     msgType != encrypted_extensions) {
18199
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18200
                        return EXT_NOT_ALLOWED;
18201
                }
18202
                ret = TLSX_CKS_Parse(ssl, (byte *)(input + offset), size,
18203
                                     &ssl->extensions);
18204
            break;
18205
#endif /* WOLFSSL_DUAL_ALG_CERTS */
18206
0
            case TLSX_EC_POINT_FORMATS:
18207
0
                WOLFSSL_MSG("Point Formats extension received");
18208
            #ifdef WOLFSSL_DEBUG_TLS
18209
                WOLFSSL_BUFFER(input + offset, size);
18210
            #endif
18211
18212
0
#ifdef WOLFSSL_TLS13
18213
0
                if (IsAtLeastTLSv1_3(ssl->version))
18214
0
                    break;
18215
0
#endif
18216
0
                if (msgType != client_hello &&
18217
0
                    msgType != server_hello) {
18218
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18219
0
                    return EXT_NOT_ALLOWED;
18220
0
                }
18221
18222
0
                ret = PF_PARSE(ssl, input + offset, size, isRequest);
18223
0
                break;
18224
18225
0
            case TLSX_STATUS_REQUEST:
18226
0
                WOLFSSL_MSG("Certificate Status Request extension received");
18227
            #ifdef WOLFSSL_DEBUG_TLS
18228
                WOLFSSL_BUFFER(input + offset, size);
18229
            #endif
18230
18231
0
#ifdef WOLFSSL_TLS13
18232
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18233
0
                    if (msgType != client_hello &&
18234
0
                        msgType != certificate_request &&
18235
0
                        msgType != certificate)
18236
0
                        return EXT_NOT_ALLOWED;
18237
0
                }
18238
0
                else
18239
0
 #endif
18240
0
                {
18241
0
                    if (msgType != client_hello &&
18242
0
                        msgType != server_hello)
18243
0
                        return EXT_NOT_ALLOWED;
18244
0
                }
18245
0
                ret = CSR_PARSE(ssl, input + offset, size, isRequest);
18246
0
                break;
18247
18248
0
            case TLSX_STATUS_REQUEST_V2:
18249
0
                WOLFSSL_MSG("Certificate Status Request v2 extension received");
18250
            #ifdef WOLFSSL_DEBUG_TLS
18251
                WOLFSSL_BUFFER(input + offset, size);
18252
            #endif
18253
18254
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
18255
                if (IsAtLeastTLSv1_3(ssl->version)) {
18256
                    if (msgType != client_hello &&
18257
                        msgType != certificate_request &&
18258
                        msgType != certificate)
18259
                        return EXT_NOT_ALLOWED;
18260
                }
18261
                else
18262
#endif
18263
0
                {
18264
0
                    if (msgType != client_hello &&
18265
0
                        msgType != server_hello)
18266
0
                        return EXT_NOT_ALLOWED;
18267
0
                }
18268
0
                ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
18269
0
                break;
18270
18271
0
#ifdef HAVE_EXTENDED_MASTER
18272
0
            case HELLO_EXT_EXTMS:
18273
0
                WOLFSSL_MSG("Extended Master Secret extension received");
18274
            #ifdef WOLFSSL_DEBUG_TLS
18275
                WOLFSSL_BUFFER(input + offset, size);
18276
            #endif
18277
18278
0
#if defined(WOLFSSL_TLS13)
18279
0
                if (IsAtLeastTLSv1_3(ssl->version))
18280
0
                    break;
18281
0
#endif
18282
0
                if (msgType != client_hello &&
18283
0
                    msgType != server_hello)
18284
0
                    return EXT_NOT_ALLOWED;
18285
0
                if (size != 0)
18286
0
                    return BUFFER_ERROR;
18287
18288
0
#ifndef NO_WOLFSSL_SERVER
18289
0
                if (isRequest)
18290
0
                    ssl->options.haveEMS = 1;
18291
0
#endif
18292
0
                pendingEMS = 1;
18293
0
                break;
18294
0
#endif
18295
18296
0
            case TLSX_RENEGOTIATION_INFO:
18297
0
                WOLFSSL_MSG("Secure Renegotiation extension received");
18298
            #ifdef WOLFSSL_DEBUG_TLS
18299
                WOLFSSL_BUFFER(input + offset, size);
18300
            #endif
18301
18302
0
#ifdef WOLFSSL_TLS13
18303
0
                if (IsAtLeastTLSv1_3(ssl->version))
18304
0
                    break;
18305
0
#endif
18306
0
                if (msgType != client_hello &&
18307
0
                    msgType != server_hello)
18308
0
                    return EXT_NOT_ALLOWED;
18309
0
                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
18310
0
                break;
18311
18312
0
            case TLSX_SESSION_TICKET:
18313
0
                WOLFSSL_MSG("Session Ticket extension received");
18314
            #ifdef WOLFSSL_DEBUG_TLS
18315
                WOLFSSL_BUFFER(input + offset, size);
18316
            #endif
18317
18318
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
18319
                if (IsAtLeastTLSv1_3(ssl->version)) {
18320
                    if (msgType != client_hello)
18321
                        return EXT_NOT_ALLOWED;
18322
                }
18323
                else
18324
#endif
18325
0
                {
18326
0
                    if (msgType != client_hello &&
18327
0
                        msgType != server_hello)
18328
0
                        return EXT_NOT_ALLOWED;
18329
0
                }
18330
0
                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
18331
0
                break;
18332
18333
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
18334
0
                WOLFSSL_MSG("ALPN extension received");
18335
18336
            #ifdef WOLFSSL_DEBUG_TLS
18337
                WOLFSSL_BUFFER(input + offset, size);
18338
            #endif
18339
18340
#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
18341
                if (IsAtLeastTLSv1_3(ssl->version)) {
18342
                    if (msgType != client_hello &&
18343
                        msgType != encrypted_extensions)
18344
                        return EXT_NOT_ALLOWED;
18345
                }
18346
                else
18347
#endif
18348
0
                {
18349
0
                    if (msgType != client_hello &&
18350
0
                        msgType != server_hello)
18351
0
                        return EXT_NOT_ALLOWED;
18352
0
                }
18353
0
                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
18354
0
                break;
18355
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
18356
0
            case TLSX_SIGNATURE_ALGORITHMS:
18357
0
                WOLFSSL_MSG("Signature Algorithms extension received");
18358
            #ifdef WOLFSSL_DEBUG_TLS
18359
                WOLFSSL_BUFFER(input + offset, size);
18360
            #endif
18361
18362
0
                if (!IsAtLeastTLSv1_2(ssl))
18363
0
                    break;
18364
0
            #ifdef WOLFSSL_TLS13
18365
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
18366
0
                    if (msgType != client_hello &&
18367
0
                        msgType != certificate_request)
18368
0
                        return EXT_NOT_ALLOWED;
18369
0
                }
18370
0
                else
18371
0
            #endif
18372
0
                {
18373
0
                    if (msgType != client_hello)
18374
0
                        return EXT_NOT_ALLOWED;
18375
0
                }
18376
0
                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
18377
0
                break;
18378
0
#endif
18379
18380
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
18381
0
            case TLSX_ENCRYPT_THEN_MAC:
18382
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension received");
18383
18384
                /* Ignore for TLS 1.3+ */
18385
0
                if (IsAtLeastTLSv1_3(ssl->version))
18386
0
                    break;
18387
0
                if (msgType != client_hello &&
18388
0
                    msgType != server_hello)
18389
0
                    return EXT_NOT_ALLOWED;
18390
18391
0
                ret = ETM_PARSE(ssl, input + offset, size, msgType);
18392
0
                break;
18393
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
18394
18395
0
#ifdef WOLFSSL_TLS13
18396
0
            case TLSX_SUPPORTED_VERSIONS:
18397
0
                WOLFSSL_MSG("Skipping Supported Versions - already processed");
18398
            #ifdef WOLFSSL_DEBUG_TLS
18399
                WOLFSSL_BUFFER(input + offset, size);
18400
            #endif
18401
0
                if (msgType != client_hello &&
18402
0
                    msgType != server_hello &&
18403
0
                    msgType != hello_retry_request)
18404
0
                    return EXT_NOT_ALLOWED;
18405
18406
0
                break;
18407
18408
0
            case TLSX_COOKIE:
18409
0
                WOLFSSL_MSG("Cookie extension received");
18410
            #ifdef WOLFSSL_DEBUG_TLS
18411
                WOLFSSL_BUFFER(input + offset, size);
18412
            #endif
18413
0
                if (!IsAtLeastTLSv1_3(ssl->version))
18414
0
                    break;
18415
18416
0
                if (msgType != client_hello &&
18417
0
                    msgType != hello_retry_request) {
18418
0
                    return EXT_NOT_ALLOWED;
18419
0
                }
18420
18421
0
                ret = CKE_PARSE(ssl, input + offset, size, msgType);
18422
0
                break;
18423
18424
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
18425
            case TLSX_PRE_SHARED_KEY:
18426
                WOLFSSL_MSG("Pre-Shared Key extension received");
18427
            #ifdef WOLFSSL_DEBUG_TLS
18428
                WOLFSSL_BUFFER(input + offset, size);
18429
            #endif
18430
18431
                if (!IsAtLeastTLSv1_3(ssl->version))
18432
                    break;
18433
18434
                if (msgType != client_hello &&
18435
                    msgType != server_hello) {
18436
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18437
                    return EXT_NOT_ALLOWED;
18438
                }
18439
18440
                ret = PSK_PARSE(ssl, input + offset, size, msgType);
18441
                pskDone = 1;
18442
                break;
18443
18444
            case TLSX_PSK_KEY_EXCHANGE_MODES:
18445
                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
18446
            #ifdef WOLFSSL_DEBUG_TLS
18447
                WOLFSSL_BUFFER(input + offset, size);
18448
            #endif
18449
18450
                if (!IsAtLeastTLSv1_3(ssl->version))
18451
                    break;
18452
18453
                if (msgType != client_hello) {
18454
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18455
                    return EXT_NOT_ALLOWED;
18456
                }
18457
18458
                ret = PKM_PARSE(ssl, input + offset, size, msgType);
18459
                break;
18460
18461
    #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
18462
            case TLSX_CERT_WITH_EXTERN_PSK:
18463
                WOLFSSL_MSG("Cert with external PSK extension received");
18464
            #ifdef WOLFSSL_DEBUG_TLS
18465
                WOLFSSL_BUFFER(input + offset, size);
18466
            #endif
18467
18468
                if (!IsAtLeastTLSv1_3(ssl->version))
18469
                    break;
18470
18471
                if (msgType != client_hello && msgType != server_hello) {
18472
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18473
                    return EXT_NOT_ALLOWED;
18474
                }
18475
                if (size != 0) {
18476
                    WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
18477
                    return BUFFER_ERROR;
18478
                }
18479
18480
                ret = PSK_WITH_CERT_PARSE(ssl, msgType);
18481
                break;
18482
    #endif
18483
    #endif
18484
18485
    #ifdef WOLFSSL_EARLY_DATA
18486
            case TLSX_EARLY_DATA:
18487
                WOLFSSL_MSG("Early Data extension received");
18488
            #ifdef WOLFSSL_DEBUG_TLS
18489
                WOLFSSL_BUFFER(input + offset, size);
18490
            #endif
18491
18492
                if (!IsAtLeastTLSv1_3(ssl->version))
18493
                    break;
18494
18495
                if (msgType != client_hello && msgType != session_ticket &&
18496
                    msgType != encrypted_extensions) {
18497
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18498
                    return EXT_NOT_ALLOWED;
18499
                }
18500
                ret = EDI_PARSE(ssl, input + offset, size, msgType);
18501
                break;
18502
    #endif
18503
18504
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
18505
            case TLSX_POST_HANDSHAKE_AUTH:
18506
                WOLFSSL_MSG("Post Handshake Authentication extension received");
18507
            #ifdef WOLFSSL_DEBUG_TLS
18508
                WOLFSSL_BUFFER(input + offset, size);
18509
            #endif
18510
18511
                if (!IsAtLeastTLSv1_3(ssl->version))
18512
                    break;
18513
18514
                if (msgType != client_hello) {
18515
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18516
                    return EXT_NOT_ALLOWED;
18517
                }
18518
18519
                ret = PHA_PARSE(ssl, input + offset, size, msgType);
18520
                break;
18521
    #endif
18522
18523
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
18524
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
18525
0
                WOLFSSL_MSG("Signature Algorithms extension received");
18526
            #ifdef WOLFSSL_DEBUG_TLS
18527
                WOLFSSL_BUFFER(input + offset, size);
18528
            #endif
18529
18530
0
                if (!IsAtLeastTLSv1_3(ssl->version))
18531
0
                    break;
18532
18533
0
                if (msgType != client_hello &&
18534
0
                        msgType != certificate_request) {
18535
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18536
0
                    return EXT_NOT_ALLOWED;
18537
0
                }
18538
18539
0
                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
18540
0
                break;
18541
0
    #endif
18542
18543
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
18544
            case TLSX_CERTIFICATE_AUTHORITIES:
18545
                WOLFSSL_MSG("Certificate Authorities extension received");
18546
            #ifdef WOLFSSL_DEBUG_TLS
18547
                WOLFSSL_BUFFER(input + offset, size);
18548
            #endif
18549
18550
                if (!IsAtLeastTLSv1_3(ssl->version))
18551
                    break;
18552
18553
                if (msgType != client_hello &&
18554
                        msgType != certificate_request) {
18555
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18556
                    return EXT_NOT_ALLOWED;
18557
                }
18558
18559
                ret = CAN_PARSE(ssl, input + offset, size, isRequest);
18560
                break;
18561
    #endif
18562
18563
0
            case TLSX_KEY_SHARE:
18564
0
                WOLFSSL_MSG("Key Share extension received");
18565
            #ifdef WOLFSSL_DEBUG_TLS
18566
                WOLFSSL_BUFFER(input + offset, size);
18567
            #endif
18568
18569
0
    #ifdef HAVE_SUPPORTED_CURVES
18570
0
                if (!IsAtLeastTLSv1_3(ssl->version))
18571
0
                    break;
18572
18573
0
                if (msgType != client_hello && msgType != server_hello &&
18574
0
                        msgType != hello_retry_request) {
18575
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18576
0
                    return EXT_NOT_ALLOWED;
18577
0
                }
18578
0
    #endif
18579
18580
0
                ret = KS_PARSE(ssl, input + offset, size, msgType);
18581
0
                break;
18582
0
#endif
18583
#ifdef WOLFSSL_SRTP
18584
            case TLSX_USE_SRTP:
18585
                WOLFSSL_MSG("Use SRTP extension received");
18586
18587
#if defined(WOLFSSL_TLS13)
18588
                if (IsAtLeastTLSv1_3(ssl->version)) {
18589
                    if (msgType != client_hello &&
18590
                        msgType != encrypted_extensions)
18591
                        return EXT_NOT_ALLOWED;
18592
                }
18593
                else
18594
#endif
18595
                {
18596
                    if (msgType != client_hello &&
18597
                        msgType != server_hello)
18598
                        return EXT_NOT_ALLOWED;
18599
                }
18600
                ret = SRTP_PARSE(ssl, input + offset, size, isRequest);
18601
                break;
18602
#endif
18603
#ifdef WOLFSSL_QUIC
18604
            case TLSX_KEY_QUIC_TP_PARAMS:
18605
                FALL_THROUGH;
18606
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
18607
                WOLFSSL_MSG("QUIC transport parameter received");
18608
            #ifdef WOLFSSL_DEBUG_TLS
18609
                WOLFSSL_BUFFER(input + offset, size);
18610
            #endif
18611
18612
                if (IsAtLeastTLSv1_3(ssl->version) &&
18613
                        msgType != client_hello &&
18614
                        msgType != encrypted_extensions) {
18615
                    return EXT_NOT_ALLOWED;
18616
                }
18617
                else if (!IsAtLeastTLSv1_3(ssl->version) &&
18618
                         msgType == encrypted_extensions) {
18619
                    return EXT_NOT_ALLOWED;
18620
                }
18621
                else if (WOLFSSL_IS_QUIC(ssl)) {
18622
                    ret = QTP_PARSE(ssl, input + offset, size, type, msgType);
18623
                }
18624
                else {
18625
                    WOLFSSL_MSG("QUIC transport param TLS extension type, but no QUIC");
18626
                    return EXT_NOT_ALLOWED; /* be safe, this should not happen */
18627
                }
18628
                break;
18629
#endif /* WOLFSSL_QUIC */
18630
#if defined(WOLFSSL_DTLS_CID)
18631
            case TLSX_CONNECTION_ID:
18632
                if (msgType != client_hello && msgType != server_hello)
18633
                    return EXT_NOT_ALLOWED;
18634
18635
                WOLFSSL_MSG("ConnectionID extension received");
18636
                ret = CID_PARSE(ssl, input + offset, size, isRequest);
18637
                break;
18638
18639
#endif /* defined(WOLFSSL_DTLS_CID) */
18640
#if defined(HAVE_RPK)
18641
            case TLSX_CLIENT_CERTIFICATE_TYPE:
18642
                WOLFSSL_MSG("Client Certificate Type extension received");
18643
#if defined(WOLFSSL_TLS13)
18644
                /* RFC 8446, Section 4.2 (Extensions), client_certificate_type
18645
                   and server_certificate_type MUST be sent in ClientHello(CH)
18646
                   or EncryptedExtensions(EE) */
18647
                if (IsAtLeastTLSv1_3(ssl->version)) {
18648
                    if (msgType != client_hello &&
18649
                        msgType != encrypted_extensions) {
18650
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18651
                        return EXT_NOT_ALLOWED;
18652
                    }
18653
                }
18654
                else
18655
#endif
18656
                {
18657
                    /* TLS 1.2: allowed in CH and SH (RFC 7250) */
18658
                    if (msgType != client_hello &&
18659
                        msgType != server_hello) {
18660
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18661
                        return EXT_NOT_ALLOWED;
18662
                    }
18663
                }
18664
                ret = CCT_PARSE(ssl, input + offset, size, msgType);
18665
                break;
18666
18667
            case TLSX_SERVER_CERTIFICATE_TYPE:
18668
                WOLFSSL_MSG("Server Certificate Type extension received");
18669
#if defined(WOLFSSL_TLS13)
18670
                /* RFC 8446, Section 4.2 (Extensions) */
18671
                if (IsAtLeastTLSv1_3(ssl->version)) {
18672
                    if (msgType != client_hello &&
18673
                        msgType != encrypted_extensions) {
18674
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18675
                        return EXT_NOT_ALLOWED;
18676
                    }
18677
                }
18678
                else
18679
#endif
18680
                {
18681
                    /* TLS 1.2: allowed in CH and SH (RFC 7250) */
18682
                    if (msgType != client_hello &&
18683
                        msgType != server_hello) {
18684
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18685
                        return EXT_NOT_ALLOWED;
18686
                    }
18687
                }
18688
                ret = SCT_PARSE(ssl, input + offset, size, msgType);
18689
                break;
18690
#endif /* HAVE_RPK */
18691
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
18692
            case TLSX_ECH:
18693
                WOLFSSL_MSG("ECH extension received");
18694
                if (!IsAtLeastTLSv1_3(ssl->version))
18695
                    break;
18696
18697
                if (msgType != client_hello &&
18698
                    msgType != encrypted_extensions &&
18699
                    msgType != hello_retry_request) {
18700
                    return EXT_NOT_ALLOWED;
18701
                }
18702
18703
                ret = ECH_PARSE(ssl, input + offset, size, msgType);
18704
                break;
18705
            case TLSXT_ECH_OUTER_EXTENSIONS:
18706
                /* RFC 9849 s5.1: ech_outer_extensions MUST only appear in
18707
                 * the EncodedClientHelloInner */
18708
                WOLFSSL_MSG("ech_outer_extensions in plaintext message");
18709
                WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
18710
                return INVALID_PARAMETER;
18711
#endif
18712
0
            default:
18713
0
                WOLFSSL_MSG("Unknown TLS extension type");
18714
0
#if defined(WOLFSSL_TLS13)
18715
                /* RFC 8446 Sec. 4.2: a TLS 1.3 client MUST abort with an
18716
                 * unsupported_extension alert when it receives an extension
18717
                 * "response" that was not advertised in the ClientHello. The
18718
                 * rule applies only to messages whose extensions are responses
18719
                 * to the ClientHello: ServerHello, HelloRetryRequest,
18720
                 * EncryptedExtensions and Certificate.
18721
                 *
18722
                 * Extensions in CertificateRequest and NewSessionTicket are
18723
                 * independent server-initiated payloads, not responses, and
18724
                 * per RFC 8701 (GREASE) the server MAY include unknown
18725
                 * (GREASE) extension types there which the client MUST treat
18726
                 * like any other unknown value (i.e. ignore them). */
18727
0
                if (IsAtLeastTLSv1_3(ssl->version) &&
18728
0
                        (msgType == server_hello ||
18729
0
                         msgType == hello_retry_request ||
18730
0
                         msgType == encrypted_extensions ||
18731
0
                         msgType == certificate)) {
18732
0
                    SendAlert((WOLFSSL*)ssl, alert_fatal, unsupported_extension);
18733
0
                    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
18734
0
                    return UNSUPPORTED_EXTENSION;
18735
0
                }
18736
0
#endif
18737
0
        }
18738
18739
        /* offset should be updated here! */
18740
0
        offset += size;
18741
0
    }
18742
18743
0
#ifdef HAVE_EXTENDED_MASTER
18744
0
    if (IsAtLeastTLSv1_3(ssl->version) &&
18745
0
        (msgType == hello_retry_request || msgType == hello_verify_request)) {
18746
        /* Don't change EMS status until server_hello received.
18747
         * Second ClientHello must have same extensions.
18748
         */
18749
0
    }
18750
0
    else if (!isRequest && ssl->options.haveEMS && !pendingEMS)
18751
0
        ssl->options.haveEMS = 0;
18752
0
#endif
18753
#if defined(WOLFSSL_TLS13) && !defined(NO_PSK)
18754
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == server_hello &&
18755
        IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE))) {
18756
        ssl->options.noPskDheKe = 1;
18757
    }
18758
#endif
18759
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
18760
    !defined(NO_PSK)
18761
    if (IsAtLeastTLSv1_3(ssl->version)) {
18762
        int hasPskWithCert = !IS_OFF(seenType,
18763
            TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
18764
        if (hasPskWithCert && ssl->options.certWithExternPsk) {
18765
            int hasPsk = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18766
            int hasPskModes = !IS_OFF(seenType,
18767
                TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
18768
            int hasKeyShare = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18769
            int hasSg = !IS_OFF(seenType,
18770
                TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
18771
            int hasSigAlg = !IS_OFF(seenType,
18772
                TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
18773
#ifdef WOLFSSL_EARLY_DATA
18774
            int hasEarlyData = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_EARLY_DATA));
18775
#endif
18776
18777
            if (msgType == client_hello && isRequest) {
18778
                TLSX* pskm;
18779
                /* RFC 9973: CH2 after HRR must keep CH1's extension set. */
18780
                if (secondClientHello && !prevHasPskWithCert) {
18781
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18782
                    return EXT_NOT_ALLOWED;
18783
                }
18784
                /* RFC 9973: cert_with_extern_psk depends on these extensions. */
18785
                if (!hasPsk || !hasPskModes || !hasKeyShare || !hasSg ||
18786
                    !hasSigAlg) {
18787
                    WOLFSSL_ERROR_VERBOSE(EXT_MISSING);
18788
                    return EXT_MISSING;
18789
                }
18790
#ifdef WOLFSSL_EARLY_DATA
18791
                /* External PSK + certificate mode forbids 0-RTT in CH.
18792
                 * When WOLFSSL_EARLY_DATA is not defined there is no parser
18793
                 * case for TLSX_EARLY_DATA, so an incoming early_data
18794
                 * extension is treated as unknown and ignored per RFC 8446
18795
                 * Sect. 4.2 - no additional check is needed in that case. */
18796
                if (hasEarlyData) {
18797
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18798
                    return EXT_NOT_ALLOWED;
18799
                }
18800
#endif
18801
                pskm = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
18802
                /* RFC 9973 requires client support for psk_dhe_ke mode. */
18803
                if (pskm == NULL || (pskm->val & (1 << PSK_DHE_KE)) == 0) {
18804
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18805
                    return EXT_NOT_ALLOWED;
18806
                }
18807
            }
18808
            else if (msgType == server_hello && !isRequest) {
18809
                /* SH confirming cert_with_extern_psk must also confirm PSK and KSE. */
18810
                if (!hasPsk || !hasKeyShare) {
18811
                    WOLFSSL_ERROR_VERBOSE(EXT_MISSING);
18812
                    return EXT_MISSING;
18813
                }
18814
            }
18815
        }
18816
        else if (msgType == client_hello && isRequest && secondClientHello &&
18817
                prevHasPskWithCert) {
18818
            /* RFC 9973: reject dropping the extension in CH2 after HRR. */
18819
            WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18820
            return EXT_NOT_ALLOWED;
18821
        }
18822
    }
18823
#endif
18824
0
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
18825
    /* RFC 8446 Section 9.2: ClientHello with KeyShare must
18826
     * contain SupportedGroups and vice-versa. */
18827
0
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == client_hello && isRequest) {
18828
0
        int hasKeyShare = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18829
0
        int hasSupportedGroups = !IS_OFF(seenType,
18830
0
            TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
18831
18832
0
        if (hasKeyShare && !hasSupportedGroups) {
18833
0
            WOLFSSL_MSG("ClientHello with KeyShare extension missing required "
18834
0
                        "SupportedGroups extension");
18835
0
            return INCOMPLETE_DATA;
18836
0
        }
18837
0
        if (hasSupportedGroups && !hasKeyShare) {
18838
0
            WOLFSSL_MSG("ClientHello with SupportedGroups extension missing "
18839
0
                        "required KeyShare extension");
18840
0
            return INCOMPLETE_DATA;
18841
0
        }
18842
0
    }
18843
0
#endif
18844
18845
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
18846
    /* Reconcile ECH inner/outer extensions before verifying SNI so the verify
18847
     * pass sees the authoritative list */
18848
    if (ret == 0 && msgType == client_hello && isRequest &&
18849
            !ssl->options.echProcessingInner &&
18850
            ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
18851
        TLSX* echX = TLSX_Find(ssl->extensions, TLSX_ECH);
18852
        WOLFSSL_ECH* ech = NULL;
18853
        if (echX != NULL)
18854
            ech = (WOLFSSL_ECH*)echX->data;
18855
18856
        if (ech != NULL) {
18857
            if (ech->state == ECH_WRITE_NONE && ech->innerClientHello != NULL) {
18858
                /* ECH accepted: use private extensions
18859
                 * return early, inner hello needs to be parsed before VERIFY */
18860
                return TLSX_EchReplaceExtensions(ssl, ssl->options.echAccepted);
18861
            }
18862
            else {
18863
                /* If ECH was accepted in CH1 then CH2 MUST contain an ECH
18864
                 * extension */
18865
                if (ssl->options.serverState ==
18866
                            SERVER_HELLO_RETRY_REQUEST_COMPLETE &&
18867
                        ssl->options.echAccepted) {
18868
                    WOLFSSL_MSG("Client did not send an EncryptedClientHello "
18869
                                "extension");
18870
                    WOLFSSL_ERROR_VERBOSE(INCOMPLETE_DATA);
18871
                    return INCOMPLETE_DATA;
18872
                }
18873
                /* Otherwise ECH rejected: use public extensions */
18874
                if (ech->state == ECH_WRITE_NONE ||
18875
                        ech->state == ECH_WRITE_RETRY_CONFIGS) {
18876
                    ret = TLSX_EchReplaceExtensions(ssl,
18877
                        ssl->options.echAccepted);
18878
                    if (ret == 0 && ech->state == ECH_WRITE_NONE) {
18879
                        echX->resp = 0;
18880
                    }
18881
                }
18882
            }
18883
        }
18884
    }
18885
#endif
18886
18887
0
    if (ret == 0)
18888
0
        ret = SNI_VERIFY_PARSE(ssl, isRequest);
18889
0
    if (ret == 0)
18890
0
        ret = TCA_VERIFY_PARSE(ssl, isRequest);
18891
18892
0
    WOLFSSL_LEAVE("Leaving TLSX_Parse", ret);
18893
0
    return ret;
18894
0
}
18895
18896
/* undefining semaphore macros */
18897
#undef IS_OFF
18898
#undef TURN_ON
18899
#undef SEMAPHORE_SIZE
18900
18901
#endif /* HAVE_TLS_EXTENSIONS */
18902
18903
#ifndef NO_WOLFSSL_CLIENT
18904
18905
    WOLFSSL_METHOD* wolfTLS_client_method(void)
18906
0
    {
18907
0
        return wolfTLS_client_method_ex(NULL);
18908
0
    }
18909
    WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
18910
0
    {
18911
0
        WOLFSSL_METHOD* method =
18912
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18913
0
                                                     heap, DYNAMIC_TYPE_METHOD);
18914
0
        (void)heap;
18915
0
        WOLFSSL_ENTER("TLS_client_method_ex");
18916
0
        if (method) {
18917
0
        #if defined(WOLFSSL_TLS13)
18918
0
            InitSSL_Method(method, MakeTLSv1_3());
18919
        #elif !defined(WOLFSSL_NO_TLS12)
18920
            InitSSL_Method(method, MakeTLSv1_2());
18921
        #elif !defined(NO_OLD_TLS)
18922
            InitSSL_Method(method, MakeTLSv1_1());
18923
        #elif defined(WOLFSSL_ALLOW_TLSV10)
18924
            InitSSL_Method(method, MakeTLSv1());
18925
        #else
18926
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
18927
        #endif
18928
18929
0
            method->downgrade = 1;
18930
0
            method->side      = WOLFSSL_CLIENT_END;
18931
0
        }
18932
0
        return method;
18933
0
    }
18934
18935
#ifndef NO_OLD_TLS
18936
    #ifdef WOLFSSL_ALLOW_TLSV10
18937
    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
18938
    {
18939
        return wolfTLSv1_client_method_ex(NULL);
18940
    }
18941
    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
18942
    {
18943
        WOLFSSL_METHOD* method =
18944
                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18945
                                                     heap, DYNAMIC_TYPE_METHOD);
18946
        (void)heap;
18947
        WOLFSSL_ENTER("TLSv1_client_method_ex");
18948
        if (method)
18949
            InitSSL_Method(method, MakeTLSv1());
18950
        return method;
18951
    }
18952
    #endif /* WOLFSSL_ALLOW_TLSV10 */
18953
18954
    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
18955
    {
18956
        return wolfTLSv1_1_client_method_ex(NULL);
18957
    }
18958
    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
18959
    {
18960
        WOLFSSL_METHOD* method =
18961
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18962
                                                     heap, DYNAMIC_TYPE_METHOD);
18963
        (void)heap;
18964
        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
18965
        if (method)
18966
            InitSSL_Method(method, MakeTLSv1_1());
18967
        return method;
18968
    }
18969
#endif /* !NO_OLD_TLS */
18970
18971
#ifndef WOLFSSL_NO_TLS12
18972
    WOLFSSL_ABI
18973
    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
18974
4
    {
18975
4
        return wolfTLSv1_2_client_method_ex(NULL);
18976
4
    }
18977
    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
18978
4
    {
18979
4
        WOLFSSL_METHOD* method =
18980
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18981
4
                                                     heap, DYNAMIC_TYPE_METHOD);
18982
4
        (void)heap;
18983
4
        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
18984
4
        if (method)
18985
4
            InitSSL_Method(method, MakeTLSv1_2());
18986
4
        return method;
18987
4
    }
18988
#endif /* WOLFSSL_NO_TLS12 */
18989
18990
#ifdef WOLFSSL_TLS13
18991
    /* The TLS v1.3 client method data.
18992
     *
18993
     * returns the method data for a TLS v1.3 client.
18994
     */
18995
    WOLFSSL_ABI
18996
    WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
18997
4
    {
18998
4
        return wolfTLSv1_3_client_method_ex(NULL);
18999
4
    }
19000
19001
    /* The TLS v1.3 client method data.
19002
     *
19003
     * heap  The heap used for allocation.
19004
     * returns the method data for a TLS v1.3 client.
19005
     */
19006
    WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
19007
4
    {
19008
4
        WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
19009
4
                                 XMALLOC(sizeof(WOLFSSL_METHOD), heap,
19010
4
                                         DYNAMIC_TYPE_METHOD);
19011
4
        (void)heap;
19012
4
        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
19013
4
        if (method)
19014
4
            InitSSL_Method(method, MakeTLSv1_3());
19015
4
        return method;
19016
4
    }
19017
#endif /* WOLFSSL_TLS13 */
19018
19019
#ifdef WOLFSSL_DTLS
19020
19021
    WOLFSSL_METHOD* wolfDTLS_client_method(void)
19022
    {
19023
        return wolfDTLS_client_method_ex(NULL);
19024
    }
19025
    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
19026
    {
19027
        WOLFSSL_METHOD* method =
19028
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19029
                                                     heap, DYNAMIC_TYPE_METHOD);
19030
        (void)heap;
19031
        WOLFSSL_ENTER("DTLS_client_method_ex");
19032
        if (method) {
19033
        #if defined(WOLFSSL_DTLS13)
19034
            InitSSL_Method(method, MakeDTLSv1_3());
19035
        #elif !defined(WOLFSSL_NO_TLS12)
19036
            InitSSL_Method(method, MakeDTLSv1_2());
19037
        #elif !defined(NO_OLD_TLS)
19038
            InitSSL_Method(method, MakeDTLSv1());
19039
        #else
19040
            #error No DTLS version enabled!
19041
        #endif
19042
19043
            method->downgrade = 1;
19044
            method->side      = WOLFSSL_CLIENT_END;
19045
        }
19046
        return method;
19047
    }
19048
19049
    #ifndef NO_OLD_TLS
19050
    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
19051
    {
19052
        return wolfDTLSv1_client_method_ex(NULL);
19053
    }
19054
    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
19055
    {
19056
        WOLFSSL_METHOD* method =
19057
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19058
                                                 heap, DYNAMIC_TYPE_METHOD);
19059
        (void)heap;
19060
        WOLFSSL_ENTER("DTLSv1_client_method_ex");
19061
        if (method)
19062
            InitSSL_Method(method, MakeDTLSv1());
19063
        return method;
19064
    }
19065
    #endif  /* NO_OLD_TLS */
19066
19067
    #ifndef WOLFSSL_NO_TLS12
19068
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
19069
    {
19070
        return wolfDTLSv1_2_client_method_ex(NULL);
19071
    }
19072
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
19073
    {
19074
        WOLFSSL_METHOD* method =
19075
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19076
                                                 heap, DYNAMIC_TYPE_METHOD);
19077
        (void)heap;
19078
        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
19079
        if (method)
19080
            InitSSL_Method(method, MakeDTLSv1_2());
19081
        (void)heap;
19082
        return method;
19083
    }
19084
    #endif /* !WOLFSSL_NO_TLS12 */
19085
#endif /* WOLFSSL_DTLS */
19086
19087
#endif /* NO_WOLFSSL_CLIENT */
19088
19089
19090
/* EITHER SIDE METHODS */
19091
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
19092
    #ifndef NO_OLD_TLS
19093
    #ifdef WOLFSSL_ALLOW_TLSV10
19094
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
19095
     *
19096
     * Returns a pointer to a WOLFSSL_METHOD struct
19097
     */
19098
    WOLFSSL_METHOD* wolfTLSv1_method(void)
19099
    {
19100
        return wolfTLSv1_method_ex(NULL);
19101
    }
19102
    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
19103
    {
19104
        WOLFSSL_METHOD* m;
19105
        WOLFSSL_ENTER("TLSv1_method");
19106
    #ifndef NO_WOLFSSL_CLIENT
19107
        m = wolfTLSv1_client_method_ex(heap);
19108
    #else
19109
        m = wolfTLSv1_server_method_ex(heap);
19110
    #endif
19111
        if (m != NULL) {
19112
            m->side = WOLFSSL_NEITHER_END;
19113
        }
19114
19115
        return m;
19116
    }
19117
    #endif /* WOLFSSL_ALLOW_TLSV10 */
19118
19119
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
19120
     *
19121
     * Returns a pointer to a WOLFSSL_METHOD struct
19122
     */
19123
    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
19124
    {
19125
        return wolfTLSv1_1_method_ex(NULL);
19126
    }
19127
    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
19128
    {
19129
        WOLFSSL_METHOD* m;
19130
        WOLFSSL_ENTER("TLSv1_1_method");
19131
    #ifndef NO_WOLFSSL_CLIENT
19132
        m = wolfTLSv1_1_client_method_ex(heap);
19133
    #else
19134
        m = wolfTLSv1_1_server_method_ex(heap);
19135
    #endif
19136
        if (m != NULL) {
19137
            m->side = WOLFSSL_NEITHER_END;
19138
        }
19139
        return m;
19140
    }
19141
    #endif /* !NO_OLD_TLS */
19142
19143
    #ifndef WOLFSSL_NO_TLS12
19144
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
19145
     *
19146
     * Returns a pointer to a WOLFSSL_METHOD struct
19147
     */
19148
    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
19149
    {
19150
        return wolfTLSv1_2_method_ex(NULL);
19151
    }
19152
    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
19153
    {
19154
        WOLFSSL_METHOD* m;
19155
        WOLFSSL_ENTER("TLSv1_2_method");
19156
    #ifndef NO_WOLFSSL_CLIENT
19157
        m = wolfTLSv1_2_client_method_ex(heap);
19158
    #else
19159
        m = wolfTLSv1_2_server_method_ex(heap);
19160
    #endif
19161
        if (m != NULL) {
19162
            m->side = WOLFSSL_NEITHER_END;
19163
        }
19164
        return m;
19165
    }
19166
    #endif /* !WOLFSSL_NO_TLS12 */
19167
19168
    #ifdef WOLFSSL_TLS13
19169
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
19170
     *
19171
     * Returns a pointer to a WOLFSSL_METHOD struct
19172
     */
19173
    WOLFSSL_METHOD* wolfTLSv1_3_method(void)
19174
    {
19175
        return wolfTLSv1_3_method_ex(NULL);
19176
    }
19177
    WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
19178
    {
19179
        WOLFSSL_METHOD* m;
19180
        WOLFSSL_ENTER("TLSv1_3_method");
19181
    #ifndef NO_WOLFSSL_CLIENT
19182
        m = wolfTLSv1_3_client_method_ex(heap);
19183
    #else
19184
        m = wolfTLSv1_3_server_method_ex(heap);
19185
    #endif
19186
        if (m != NULL) {
19187
            m->side = WOLFSSL_NEITHER_END;
19188
        }
19189
        return m;
19190
    }
19191
    #endif /* WOLFSSL_TLS13 */
19192
19193
#ifdef WOLFSSL_DTLS
19194
    WOLFSSL_METHOD* wolfDTLS_method(void)
19195
    {
19196
        return wolfDTLS_method_ex(NULL);
19197
    }
19198
    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
19199
    {
19200
        WOLFSSL_METHOD* m;
19201
        WOLFSSL_ENTER("DTLS_method_ex");
19202
    #ifndef NO_WOLFSSL_CLIENT
19203
        m = wolfDTLS_client_method_ex(heap);
19204
    #else
19205
        m = wolfDTLS_server_method_ex(heap);
19206
    #endif
19207
        if (m != NULL) {
19208
            m->side = WOLFSSL_NEITHER_END;
19209
        }
19210
        return m;
19211
    }
19212
19213
    #ifndef NO_OLD_TLS
19214
    WOLFSSL_METHOD* wolfDTLSv1_method(void)
19215
    {
19216
        return wolfDTLSv1_method_ex(NULL);
19217
    }
19218
    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
19219
    {
19220
        WOLFSSL_METHOD* m;
19221
        WOLFSSL_ENTER("DTLSv1_method_ex");
19222
    #ifndef NO_WOLFSSL_CLIENT
19223
        m = wolfDTLSv1_client_method_ex(heap);
19224
    #else
19225
        m = wolfDTLSv1_server_method_ex(heap);
19226
    #endif
19227
        if (m != NULL) {
19228
            m->side = WOLFSSL_NEITHER_END;
19229
        }
19230
        return m;
19231
    }
19232
    #endif /* !NO_OLD_TLS */
19233
    #ifndef WOLFSSL_NO_TLS12
19234
    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
19235
    {
19236
        return wolfDTLSv1_2_method_ex(NULL);
19237
    }
19238
    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
19239
    {
19240
        WOLFSSL_METHOD* m;
19241
        WOLFSSL_ENTER("DTLSv1_2_method");
19242
    #ifndef NO_WOLFSSL_CLIENT
19243
        m = wolfDTLSv1_2_client_method_ex(heap);
19244
    #else
19245
        m = wolfDTLSv1_2_server_method_ex(heap);
19246
    #endif
19247
        if (m != NULL) {
19248
            m->side = WOLFSSL_NEITHER_END;
19249
        }
19250
        return m;
19251
    }
19252
    #endif /* !WOLFSSL_NO_TLS12 */
19253
    #ifdef WOLFSSL_DTLS13
19254
    WOLFSSL_METHOD* wolfDTLSv1_3_method(void)
19255
    {
19256
        return wolfDTLSv1_3_method_ex(NULL);
19257
    }
19258
    WOLFSSL_METHOD* wolfDTLSv1_3_method_ex(void* heap)
19259
    {
19260
        WOLFSSL_METHOD* m;
19261
        WOLFSSL_ENTER("DTLSv1_3_method");
19262
    #ifndef NO_WOLFSSL_CLIENT
19263
        m = wolfDTLSv1_3_client_method_ex(heap);
19264
    #else
19265
        m = wolfDTLSv1_3_server_method_ex(heap);
19266
    #endif
19267
        if (m != NULL) {
19268
            m->side = WOLFSSL_NEITHER_END;
19269
        }
19270
        return m;
19271
    }
19272
    #endif /* WOLFSSL_DTLS13 */
19273
#endif /* WOLFSSL_DTLS */
19274
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
19275
19276
19277
#ifndef NO_WOLFSSL_SERVER
19278
19279
    WOLFSSL_METHOD* wolfTLS_server_method(void)
19280
0
    {
19281
0
        return wolfTLS_server_method_ex(NULL);
19282
0
    }
19283
19284
    WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
19285
0
    {
19286
0
        WOLFSSL_METHOD* method =
19287
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19288
0
                                                     heap, DYNAMIC_TYPE_METHOD);
19289
0
        (void)heap;
19290
0
        WOLFSSL_ENTER("TLS_server_method_ex");
19291
0
        if (method) {
19292
0
        #if defined(WOLFSSL_TLS13)
19293
0
            InitSSL_Method(method, MakeTLSv1_3());
19294
        #elif !defined(WOLFSSL_NO_TLS12)
19295
            InitSSL_Method(method, MakeTLSv1_2());
19296
        #elif !defined(NO_OLD_TLS)
19297
            InitSSL_Method(method, MakeTLSv1_1());
19298
        #elif defined(WOLFSSL_ALLOW_TLSV10)
19299
            InitSSL_Method(method, MakeTLSv1());
19300
        #else
19301
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
19302
        #endif
19303
19304
0
            method->downgrade = 1;
19305
0
            method->side      = WOLFSSL_SERVER_END;
19306
0
        }
19307
0
        return method;
19308
0
    }
19309
19310
#ifndef NO_OLD_TLS
19311
    #ifdef WOLFSSL_ALLOW_TLSV10
19312
    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
19313
    {
19314
        return wolfTLSv1_server_method_ex(NULL);
19315
    }
19316
    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
19317
    {
19318
        WOLFSSL_METHOD* method =
19319
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19320
                                                     heap, DYNAMIC_TYPE_METHOD);
19321
        (void)heap;
19322
        WOLFSSL_ENTER("TLSv1_server_method_ex");
19323
        if (method) {
19324
            InitSSL_Method(method, MakeTLSv1());
19325
            method->side = WOLFSSL_SERVER_END;
19326
        }
19327
        return method;
19328
    }
19329
    #endif /* WOLFSSL_ALLOW_TLSV10 */
19330
19331
    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
19332
    {
19333
        return wolfTLSv1_1_server_method_ex(NULL);
19334
    }
19335
    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
19336
    {
19337
        WOLFSSL_METHOD* method =
19338
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19339
                                                     heap, DYNAMIC_TYPE_METHOD);
19340
        (void)heap;
19341
        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
19342
        if (method) {
19343
            InitSSL_Method(method, MakeTLSv1_1());
19344
            method->side = WOLFSSL_SERVER_END;
19345
        }
19346
        return method;
19347
    }
19348
#endif /* !NO_OLD_TLS */
19349
19350
19351
#ifndef WOLFSSL_NO_TLS12
19352
    WOLFSSL_ABI
19353
    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
19354
5.46k
    {
19355
5.46k
        return wolfTLSv1_2_server_method_ex(NULL);
19356
5.46k
    }
19357
    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
19358
5.46k
    {
19359
5.46k
        WOLFSSL_METHOD* method =
19360
5.46k
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19361
5.46k
                                                     heap, DYNAMIC_TYPE_METHOD);
19362
5.46k
        (void)heap;
19363
5.46k
        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
19364
5.46k
        if (method) {
19365
5.46k
            InitSSL_Method(method, MakeTLSv1_2());
19366
5.46k
            method->side = WOLFSSL_SERVER_END;
19367
5.46k
        }
19368
5.46k
        return method;
19369
5.46k
    }
19370
#endif /* !WOLFSSL_NO_TLS12 */
19371
19372
#ifdef WOLFSSL_TLS13
19373
    /* The TLS v1.3 server method data.
19374
     *
19375
     * returns the method data for a TLS v1.3 server.
19376
     */
19377
    WOLFSSL_ABI
19378
    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
19379
4
    {
19380
4
        return wolfTLSv1_3_server_method_ex(NULL);
19381
4
    }
19382
19383
    /* The TLS v1.3 server method data.
19384
     *
19385
     * heap  The heap used for allocation.
19386
     * returns the method data for a TLS v1.3 server.
19387
     */
19388
    WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
19389
4
    {
19390
4
        WOLFSSL_METHOD* method =
19391
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19392
4
                                                     heap, DYNAMIC_TYPE_METHOD);
19393
4
        (void)heap;
19394
4
        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
19395
4
        if (method) {
19396
4
            InitSSL_Method(method, MakeTLSv1_3());
19397
4
            method->side = WOLFSSL_SERVER_END;
19398
4
        }
19399
4
        return method;
19400
4
    }
19401
#endif /* WOLFSSL_TLS13 */
19402
19403
#ifdef WOLFSSL_DTLS
19404
    WOLFSSL_METHOD* wolfDTLS_server_method(void)
19405
    {
19406
        return wolfDTLS_server_method_ex(NULL);
19407
    }
19408
    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
19409
    {
19410
        WOLFSSL_METHOD* method =
19411
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19412
                                                     heap, DYNAMIC_TYPE_METHOD);
19413
        (void)heap;
19414
        WOLFSSL_ENTER("DTLS_server_method_ex");
19415
        if (method) {
19416
        #if defined(WOLFSSL_DTLS13)
19417
            InitSSL_Method(method, MakeDTLSv1_3());
19418
        #elif !defined(WOLFSSL_NO_TLS12)
19419
            InitSSL_Method(method, MakeDTLSv1_2());
19420
        #elif !defined(NO_OLD_TLS)
19421
            InitSSL_Method(method, MakeDTLSv1());
19422
        #else
19423
            #error No DTLS version enabled!
19424
        #endif
19425
19426
            method->downgrade = 1;
19427
            method->side      = WOLFSSL_SERVER_END;
19428
        }
19429
        return method;
19430
    }
19431
19432
    #ifndef NO_OLD_TLS
19433
    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
19434
    {
19435
        return wolfDTLSv1_server_method_ex(NULL);
19436
    }
19437
    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
19438
    {
19439
        WOLFSSL_METHOD* method =
19440
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19441
                                                 heap, DYNAMIC_TYPE_METHOD);
19442
        (void)heap;
19443
        WOLFSSL_ENTER("DTLSv1_server_method_ex");
19444
        if (method) {
19445
            InitSSL_Method(method, MakeDTLSv1());
19446
            method->side = WOLFSSL_SERVER_END;
19447
        }
19448
        return method;
19449
    }
19450
    #endif /* !NO_OLD_TLS */
19451
19452
    #ifndef WOLFSSL_NO_TLS12
19453
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
19454
    {
19455
        return wolfDTLSv1_2_server_method_ex(NULL);
19456
    }
19457
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
19458
    {
19459
        WOLFSSL_METHOD* method =
19460
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
19461
                                                 heap, DYNAMIC_TYPE_METHOD);
19462
        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
19463
        (void)heap;
19464
        if (method) {
19465
            InitSSL_Method(method, MakeDTLSv1_2());
19466
            method->side = WOLFSSL_SERVER_END;
19467
        }
19468
        (void)heap;
19469
        return method;
19470
    }
19471
    #endif /* !WOLFSSL_NO_TLS12 */
19472
#endif /* WOLFSSL_DTLS */
19473
19474
#endif /* NO_WOLFSSL_SERVER */
19475
19476
#endif /* NO_TLS */
19477
19478
#endif /* WOLFCRYPT_ONLY */