Coverage Report

Created: 2026-05-18 06:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-heapmath/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_SRTP:             Enable SRTP extension support         default: off
106
 * WOLFSSL_DUAL_ALG_CERTS:   Enable dual algorithm certificates   default: off
107
 * WOLFSSL_HAVE_PRF:         Enable TLS PRF function access        default: off
108
 * WOLFSSL_DEBUG_TLS:        Debug TLS protocol messages            default: off
109
 * WOLFSSL_32BIT_MILLI_TIME: 32-bit millisecond time function      default: off
110
 * WOLFSSL_REQUIRE_TCA:      Require Trusted CA extension          default: off
111
 * WOLFSSL_DH_EXTRA:         Extra DH key info in SSL object       default: off
112
 * WOLFSSL_CURVE25519_BLINDING: Curve25519 blinding in TLS         default: off
113
 * HAVE_NULL_CIPHER:         Allow NULL cipher suites               default: off
114
 * HAVE_WEBSERVER:           Enable web server features             default: off
115
 * NO_CERTS:                 Disable certificate processing        default: off
116
 */
117
118
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
119
120
#ifndef WOLFCRYPT_ONLY
121
122
#include <wolfssl/ssl.h>
123
#include <wolfssl/internal.h>
124
#include <wolfssl/error-ssl.h>
125
#include <wolfssl/wolfcrypt/hash.h>
126
#include <wolfssl/wolfcrypt/hmac.h>
127
#include <wolfssl/wolfcrypt/kdf.h>
128
#ifdef NO_INLINE
129
    #include <wolfssl/wolfcrypt/misc.h>
130
#else
131
    #define WOLFSSL_MISC_INCLUDED
132
    #include <wolfcrypt/src/misc.c>
133
#endif
134
135
#ifdef HAVE_CURVE25519
136
    #include <wolfssl/wolfcrypt/curve25519.h>
137
#endif
138
#ifdef HAVE_CURVE448
139
    #include <wolfssl/wolfcrypt/curve448.h>
140
#endif
141
#ifdef WOLFSSL_HAVE_MLKEM
142
    #include <wolfssl/wolfcrypt/wc_mlkem.h>
143
#endif
144
145
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
146
    #include <wolfssl/wolfcrypt/port/Renesas/renesas_tsip_internal.h>
147
#endif
148
149
#include <wolfssl/wolfcrypt/hpke.h>
150
151
#ifndef NO_TLS
152
153
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
154
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap);
155
#endif
156
157
#ifdef HAVE_SUPPORTED_CURVES
158
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions);
159
#endif
160
161
/* Digest enable checks */
162
#ifdef NO_OLD_TLS /* TLS 1.2 only */
163
    #if defined(NO_SHA256) && !defined(WOLFSSL_SHA384) && \
164
            !defined(WOLFSSL_SHA512)
165
        #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
166
    #endif
167
#else  /* TLS 1.1 or older */
168
    #if defined(NO_MD5) && defined(NO_SHA)
169
        #error Must have SHA1 and MD5 enabled for old TLS
170
    #endif
171
#endif
172
173
#ifdef WOLFSSL_TLS13
174
    #if !defined(NO_DH) && \
175
        !defined(HAVE_FFDHE_2048) && !defined(HAVE_FFDHE_3072) && \
176
        !defined(HAVE_FFDHE_4096) && !defined(HAVE_FFDHE_6144) && \
177
        !defined(HAVE_FFDHE_8192)
178
        #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
179
    #endif
180
    #if !defined(NO_RSA) && !defined(WC_RSA_PSS)
181
        #error The build option WC_RSA_PSS is required for TLS 1.3 with RSA
182
    #endif
183
    #ifndef HAVE_TLS_EXTENSIONS
184
        #if !defined(_MSC_VER) && !defined(__TASKING__)
185
            #error "The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3"
186
        #else
187
            #pragma message("Error: The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3")
188
        #endif
189
    #endif
190
#endif
191
192
/* Warn if secrets logging is enabled */
193
#if (defined(SHOW_SECRETS) || defined(WOLFSSL_SSLKEYLOGFILE)) && \
194
    !defined(WOLFSSL_KEYLOG_EXPORT_WARNED)
195
    #if !defined(_MSC_VER) && !defined(__TASKING__)
196
        #warning The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment
197
    #else
198
        #pragma message("Warning: The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment")
199
    #endif
200
#endif
201
202
#ifndef WOLFSSL_NO_TLS12
203
204
#ifdef WOLFSSL_SHA384
205
1.08k
    #define HSHASH_SZ WC_SHA384_DIGEST_SIZE
206
#else
207
    #define HSHASH_SZ FINISHED_SZ
208
#endif
209
210
int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
211
0
{
212
0
    int ret = 0;
213
0
    word32 hashSz = FINISHED_SZ;
214
215
0
    if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
216
0
        return BAD_FUNC_ARG;
217
218
    /* for constant timing perform these even if error */
219
#ifndef NO_OLD_TLS
220
    ret |= wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
221
    ret |= wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
222
#endif
223
224
0
    if (IsAtLeastTLSv1_2(ssl)) {
225
0
#ifndef NO_SHA256
226
0
        if (ssl->specs.mac_algorithm <= sha256_mac ||
227
0
            ssl->specs.mac_algorithm == blake2b_mac) {
228
0
            ret |= wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
229
0
            hashSz = WC_SHA256_DIGEST_SIZE;
230
0
        }
231
0
#endif
232
0
#ifdef WOLFSSL_SHA384
233
0
        if (ssl->specs.mac_algorithm == sha384_mac) {
234
0
            ret |= wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
235
0
            hashSz = WC_SHA384_DIGEST_SIZE;
236
0
        }
237
0
#endif
238
0
#ifdef WOLFSSL_SM3
239
0
        if (ssl->specs.mac_algorithm == sm3_mac) {
240
0
            ret |= wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
241
0
            hashSz = WC_SM3_DIGEST_SIZE;
242
0
        }
243
0
#endif
244
0
    }
245
246
0
    *hashLen = hashSz;
247
#ifdef WOLFSSL_CHECK_MEM_ZERO
248
     wc_MemZero_Add("TLS handshake hash", hash, hashSz);
249
#endif
250
251
0
    if (ret != 0) {
252
0
        ret = BUILD_MSG_ERROR;
253
0
        WOLFSSL_ERROR_VERBOSE(ret);
254
0
    }
255
256
0
    return ret;
257
0
}
258
259
260
int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
261
1.05k
{
262
1.05k
    int ret;
263
1.05k
    const byte* side = NULL;
264
1.05k
    word32 hashSz = HSHASH_SZ;
265
1.05k
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
266
1.05k
    byte handshake_hash[HSHASH_SZ];
267
#else
268
    byte* handshake_hash = NULL;
269
    handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap, DYNAMIC_TYPE_DIGEST);
270
    if (handshake_hash == NULL)
271
        return MEMORY_E;
272
#endif
273
274
1.05k
    XMEMSET(handshake_hash, 0, HSHASH_SZ);
275
1.05k
    ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
276
1.05k
    if (ret == 0) {
277
1.05k
        if (XSTRNCMP((const char*)sender, (const char*)kTlsClientStr,
278
1.05k
                                                          SIZEOF_SENDER) == 0) {
279
835
            side = kTlsClientFinStr;
280
835
        }
281
217
        else if (XSTRNCMP((const char*)sender, (const char*)kTlsServerStr,
282
217
                                                          SIZEOF_SENDER) == 0) {
283
217
            side = kTlsServerFinStr;
284
217
        }
285
0
        else {
286
0
            ret = BAD_FUNC_ARG;
287
0
            WOLFSSL_MSG("Unexpected sender value");
288
0
        }
289
1.05k
    }
290
291
1.05k
    if (ret == 0) {
292
1.05k
#ifdef WOLFSSL_HAVE_PRF
293
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
294
        if (ssl->ctx->TlsFinishedCb) {
295
            void* ctx = wolfSSL_GetTlsFinishedCtx(ssl);
296
            ret = ssl->ctx->TlsFinishedCb(ssl, side, handshake_hash, hashSz,
297
                                          (byte*)hashes, ctx);
298
        }
299
        if (!ssl->ctx->TlsFinishedCb ||
300
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
301
#endif
302
1.05k
        {
303
1.05k
            PRIVATE_KEY_UNLOCK();
304
1.05k
            ret = wc_PRF_TLS((byte*)hashes, TLS_FINISHED_SZ,
305
1.05k
                      ssl->arrays->masterSecret, SECRET_LEN, side,
306
1.05k
                      FINISHED_LABEL_SZ, handshake_hash, hashSz,
307
1.05k
                      IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
308
1.05k
                      ssl->heap, ssl->devId);
309
1.05k
            PRIVATE_KEY_LOCK();
310
1.05k
        }
311
1.05k
        ForceZero(handshake_hash, hashSz);
312
#else
313
        /* Pseudo random function must be enabled in the configuration. */
314
        ret = PRF_MISSING;
315
        WOLFSSL_ERROR_VERBOSE(ret);
316
        WOLFSSL_MSG("Pseudo-random function is not enabled");
317
318
        (void)side;
319
        (void)hashes;
320
#endif
321
1.05k
    }
322
323
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
324
    XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
325
#elif defined(WOLFSSL_CHECK_MEM_ZERO)
326
    wc_MemZero_Check(handshake_hash, HSHASH_SZ);
327
#endif
328
329
1.05k
    return ret;
330
1.05k
}
331
332
#endif /* !WOLFSSL_NO_TLS12 */
333
334
#ifndef NO_OLD_TLS
335
336
#ifdef WOLFSSL_ALLOW_TLSV10
337
ProtocolVersion MakeTLSv1(void)
338
{
339
    ProtocolVersion pv;
340
    pv.major = SSLv3_MAJOR;
341
    pv.minor = TLSv1_MINOR;
342
343
    return pv;
344
}
345
#endif /* WOLFSSL_ALLOW_TLSV10 */
346
347
348
ProtocolVersion MakeTLSv1_1(void)
349
{
350
    ProtocolVersion pv;
351
    pv.major = SSLv3_MAJOR;
352
    pv.minor = TLSv1_1_MINOR;
353
354
    return pv;
355
}
356
357
#endif /* !NO_OLD_TLS */
358
359
360
#ifndef WOLFSSL_NO_TLS12
361
362
ProtocolVersion MakeTLSv1_2(void)
363
5.31k
{
364
5.31k
    ProtocolVersion pv;
365
5.31k
    pv.major = SSLv3_MAJOR;
366
5.31k
    pv.minor = TLSv1_2_MINOR;
367
368
5.31k
    return pv;
369
5.31k
}
370
371
#endif /* !WOLFSSL_NO_TLS12 */
372
373
#ifdef WOLFSSL_TLS13
374
/* The TLS v1.3 protocol version.
375
 *
376
 * returns the protocol version data for TLS v1.3.
377
 */
378
ProtocolVersion MakeTLSv1_3(void)
379
8
{
380
8
    ProtocolVersion pv;
381
8
    pv.major = SSLv3_MAJOR;
382
8
    pv.minor = TLSv1_3_MINOR;
383
384
8
    return pv;
385
8
}
386
#endif
387
388
#if defined(HAVE_SUPPORTED_CURVES)
389
/* Sets the key exchange groups in rank order on a context.
390
 *
391
 * ctx     SSL/TLS context object.
392
 * groups  Array of groups.
393
 * count   Number of groups in array.
394
 * returns BAD_FUNC_ARG when ctx or groups is NULL, not using TLS v1.3 or
395
 * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success.
396
 */
397
int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count)
398
0
{
399
0
    int ret, i;
400
401
0
    WOLFSSL_ENTER("wolfSSL_CTX_set_groups");
402
0
    if (ctx == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT)
403
0
        return BAD_FUNC_ARG;
404
0
    if (!IsTLS_ex(ctx->method->version))
405
0
        return BAD_FUNC_ARG;
406
407
0
    #ifdef WOLFSSL_TLS13
408
0
    ctx->numGroups = 0;
409
0
    #endif
410
0
    #if !defined(NO_TLS)
411
0
    TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
412
0
    #endif /* !NO_TLS */
413
0
    for (i = 0; i < count; i++) {
414
        /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups
415
         * are valid */
416
0
        if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, (word16)groups[i]))
417
0
                != WOLFSSL_SUCCESS) {
418
0
    #if !defined(NO_TLS)
419
0
            TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
420
0
    #endif /* !NO_TLS */
421
0
            return ret;
422
0
        }
423
0
        #ifdef WOLFSSL_TLS13
424
0
        ctx->group[i] = (word16)groups[i];
425
0
        #endif
426
0
    }
427
0
    #ifdef WOLFSSL_TLS13
428
0
    ctx->numGroups = (byte)count;
429
0
    #endif
430
431
0
    return WOLFSSL_SUCCESS;
432
0
}
433
434
/* Sets the key exchange groups in rank order.
435
 *
436
 * ssl     SSL/TLS object.
437
 * groups  Array of groups.
438
 * count   Number of groups in array.
439
 * returns BAD_FUNC_ARG when ssl or groups is NULL, not using TLS v1.3 or
440
 * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success.
441
 */
442
int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count)
443
0
{
444
0
    int ret, i;
445
446
0
    WOLFSSL_ENTER("wolfSSL_set_groups");
447
0
    if (ssl == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT)
448
0
        return BAD_FUNC_ARG;
449
0
    if (!IsTLS_ex(ssl->version))
450
0
        return BAD_FUNC_ARG;
451
452
0
    #ifdef WOLFSSL_TLS13
453
0
    ssl->numGroups = 0;
454
0
    #endif
455
0
    #if !defined(NO_TLS)
456
0
    TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
457
0
    #endif /* !NO_TLS */
458
0
    for (i = 0; i < count; i++) {
459
        /* Call to wolfSSL_UseSupportedCurve also checks if input groups
460
                 * are valid */
461
0
        if ((ret = wolfSSL_UseSupportedCurve(ssl, (word16)groups[i]))
462
0
                != WOLFSSL_SUCCESS) {
463
0
    #if !defined(NO_TLS)
464
0
            TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
465
0
    #endif /* !NO_TLS */
466
0
            return ret;
467
0
        }
468
0
        #ifdef WOLFSSL_TLS13
469
0
        ssl->group[i] = (word16)groups[i];
470
0
        #endif
471
0
    }
472
0
    #ifdef WOLFSSL_TLS13
473
0
    ssl->numGroups = (byte)count;
474
0
    #endif
475
476
0
    return WOLFSSL_SUCCESS;
477
0
}
478
#endif /* HAVE_SUPPORTED_CURVES */
479
480
#ifndef WOLFSSL_NO_TLS12
481
482
#ifdef HAVE_EXTENDED_MASTER
483
static const byte ext_master_label[EXT_MASTER_LABEL_SZ + 1] =
484
                                                      "extended master secret";
485
#endif
486
static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
487
static const byte key_label   [KEY_LABEL_SZ + 1]    = "key expansion";
488
489
static int _DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
490
                         const byte* ms, word32 msLen,
491
                         const byte* sr, const byte* cr,
492
                         int tls1_2, int hash_type,
493
                         void* heap, int devId)
494
1.39k
{
495
1.39k
    int ret;
496
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
497
    byte* seed = NULL;
498
    seed = (byte*)XMALLOC(SEED_LEN, heap, DYNAMIC_TYPE_SEED);
499
    if (seed == NULL)
500
        return MEMORY_E;
501
#else
502
1.39k
    byte seed[SEED_LEN];
503
1.39k
#endif
504
505
1.39k
    XMEMCPY(seed,           sr, RAN_LEN);
506
1.39k
    XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
507
508
1.39k
#ifdef WOLFSSL_HAVE_PRF
509
1.39k
    PRIVATE_KEY_UNLOCK();
510
1.39k
    ret = wc_PRF_TLS(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
511
1.39k
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
512
1.39k
    PRIVATE_KEY_LOCK();
513
#else
514
    /* Pseudo random function must be enabled in the configuration. */
515
    ret = PRF_MISSING;
516
    WOLFSSL_ERROR_VERBOSE(ret);
517
    WOLFSSL_MSG("Pseudo-random function is not enabled");
518
519
    (void)key_dig;
520
    (void)key_dig_len;
521
    (void)ms;
522
    (void)msLen;
523
    (void)tls1_2;
524
    (void)hash_type;
525
    (void)heap;
526
    (void)devId;
527
    (void)key_label;
528
    (void)master_label;
529
#ifdef HAVE_EXTENDED_MASTER
530
    (void)ext_master_label;
531
#endif
532
#endif
533
534
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
535
    XFREE(seed, heap, DYNAMIC_TYPE_SEED);
536
#endif
537
538
1.39k
    return ret;
539
1.39k
}
540
541
/* External facing wrapper so user can call as well, 0 on success */
542
int wolfSSL_DeriveTlsKeys(byte* key_data, word32 keyLen,
543
                         const byte* ms, word32 msLen,
544
                         const byte* sr, const byte* cr,
545
                         int tls1_2, int hash_type)
546
0
{
547
0
    return _DeriveTlsKeys(key_data, keyLen, ms, msLen, sr, cr, tls1_2,
548
0
        hash_type, NULL, INVALID_DEVID);
549
0
}
550
551
552
int DeriveTlsKeys(WOLFSSL* ssl)
553
1.39k
{
554
1.39k
    int   ret;
555
1.39k
    int   key_dig_len = 2 * ssl->specs.hash_size +
556
1.39k
                        2 * ssl->specs.key_size  +
557
1.39k
                        2 * ssl->specs.iv_size;
558
1.39k
    WC_DECLARE_VAR(key_dig, byte, MAX_PRF_DIG, 0);
559
560
1.39k
    WC_ALLOC_VAR_EX(key_dig, byte, MAX_PRF_DIG, ssl->heap,
561
1.39k
        DYNAMIC_TYPE_DIGEST, return MEMORY_E);
562
563
1.39k
    XMEMSET(key_dig, 0, MAX_PRF_DIG);
564
565
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
566
    ret = PROTOCOLCB_UNAVAILABLE;
567
    if (ssl->ctx->GenSessionKeyCb) {
568
        void* ctx = wolfSSL_GetGenSessionKeyCtx(ssl);
569
        ret = ssl->ctx->GenSessionKeyCb(ssl, ctx);
570
    }
571
    if (!ssl->ctx->GenSessionKeyCb ||
572
        ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
573
#endif
574
1.39k
    ret = _DeriveTlsKeys(key_dig, (word32)key_dig_len,
575
1.39k
                     ssl->arrays->masterSecret, SECRET_LEN,
576
1.39k
                     ssl->arrays->serverRandom, ssl->arrays->clientRandom,
577
1.39k
                     IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
578
1.39k
                     ssl->heap, ssl->devId);
579
1.39k
    if (ret == 0)
580
1.39k
        ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
581
582
#ifdef WOLFSSL_CHECK_MEM_ZERO
583
    wc_MemZero_Add("DeriveTlsKeys key_dig", key_dig, MAX_PRF_DIG);
584
#endif
585
1.39k
    ForceZero(key_dig, MAX_PRF_DIG);
586
#ifdef WOLFSSL_CHECK_MEM_ZERO
587
    wc_MemZero_Check(key_dig, MAX_PRF_DIG);
588
#endif
589
590
1.39k
    WC_FREE_VAR_EX(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
591
592
1.39k
    return ret;
593
1.39k
}
594
595
static int _MakeTlsMasterSecret(byte* ms, word32 msLen,
596
                               const byte* pms, word32 pmsLen,
597
                               const byte* cr, const byte* sr,
598
                               int tls1_2, int hash_type,
599
                               void* heap, int devId)
600
1.36k
{
601
1.36k
    int ret;
602
1.36k
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
603
1.36k
    byte seed[SEED_LEN];
604
#else
605
    byte* seed = NULL;
606
    seed = (byte*)XMALLOC(SEED_LEN, heap, DYNAMIC_TYPE_SEED);
607
    if (seed == NULL)
608
        return MEMORY_E;
609
#endif
610
611
1.36k
    XMEMCPY(seed,           cr, RAN_LEN);
612
1.36k
    XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
613
614
1.36k
#ifdef WOLFSSL_HAVE_PRF
615
1.36k
    PRIVATE_KEY_UNLOCK();
616
1.36k
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
617
1.36k
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
618
1.36k
    PRIVATE_KEY_LOCK();
619
#else
620
    /* Pseudo random function must be enabled in the configuration. */
621
    ret = PRF_MISSING;
622
    WOLFSSL_MSG("Pseudo-random function is not enabled");
623
624
    (void)ms;
625
    (void)msLen;
626
    (void)pms;
627
    (void)pmsLen;
628
    (void)tls1_2;
629
    (void)hash_type;
630
    (void)heap;
631
    (void)devId;
632
#endif
633
634
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
635
    XFREE(seed, heap, DYNAMIC_TYPE_SEED);
636
#endif
637
638
1.36k
    return ret;
639
1.36k
}
640
641
/* External facing wrapper so user can call as well, 0 on success */
642
int wolfSSL_MakeTlsMasterSecret(byte* ms, word32 msLen,
643
                               const byte* pms, word32 pmsLen,
644
                               const byte* cr, const byte* sr,
645
                               int tls1_2, int hash_type)
646
0
{
647
0
    return _MakeTlsMasterSecret(ms, msLen, pms, pmsLen, cr, sr, tls1_2,
648
0
        hash_type, NULL, INVALID_DEVID);
649
0
}
650
651
652
#ifdef HAVE_EXTENDED_MASTER
653
654
static int _MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
655
                                        const byte* pms, word32 pmsLen,
656
                                        const byte* sHash, word32 sHashLen,
657
                                        int tls1_2, int hash_type,
658
                                        void* heap, int devId)
659
30
{
660
30
    int ret;
661
662
30
#ifdef WOLFSSL_HAVE_PRF
663
30
    PRIVATE_KEY_UNLOCK();
664
30
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
665
30
               sHash, sHashLen, tls1_2, hash_type, heap, devId);
666
30
    PRIVATE_KEY_LOCK();
667
#else
668
    /* Pseudo random function must be enabled in the configuration. */
669
    ret = PRF_MISSING;
670
    WOLFSSL_MSG("Pseudo-random function is not enabled");
671
672
    (void)ms;
673
    (void)msLen;
674
    (void)pms;
675
    (void)pmsLen;
676
    (void)sHash;
677
    (void)sHashLen;
678
    (void)tls1_2;
679
    (void)hash_type;
680
    (void)heap;
681
    (void)devId;
682
#endif
683
30
    return ret;
684
30
}
685
686
/* External facing wrapper so user can call as well, 0 on success */
687
int wolfSSL_MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
688
                                        const byte* pms, word32 pmsLen,
689
                                        const byte* sHash, word32 sHashLen,
690
                                        int tls1_2, int hash_type)
691
0
{
692
0
    return _MakeTlsExtendedMasterSecret(ms, msLen, pms, pmsLen, sHash, sHashLen,
693
0
        tls1_2, hash_type, NULL, INVALID_DEVID);
694
0
}
695
696
#endif /* HAVE_EXTENDED_MASTER */
697
698
699
int MakeTlsMasterSecret(WOLFSSL* ssl)
700
1.39k
{
701
1.39k
    int ret;
702
703
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
704
    /* If this is called from a sniffer session with keylog file support, obtain
705
     * the master secret from the callback */
706
    if (ssl->snifferSecretCb != NULL) {
707
        ret = ssl->snifferSecretCb(ssl->arrays->clientRandom,
708
                                   SNIFFER_SECRET_TLS12_MASTER_SECRET,
709
                                   ssl->arrays->masterSecret);
710
        if (ret != 0) {
711
            return ret;
712
        }
713
        ret = DeriveTlsKeys(ssl);
714
        return ret;
715
    }
716
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
717
718
1.39k
#ifdef HAVE_EXTENDED_MASTER
719
1.39k
    if (ssl->options.haveEMS) {
720
30
        word32 hashSz = HSHASH_SZ;
721
30
    #ifdef WOLFSSL_SMALL_STACK
722
30
        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
723
30
                                              DYNAMIC_TYPE_DIGEST);
724
30
        if (handshake_hash == NULL)
725
0
            return MEMORY_E;
726
    #else
727
        byte handshake_hash[HSHASH_SZ];
728
    #endif
729
730
30
        XMEMSET(handshake_hash, 0, HSHASH_SZ);
731
30
        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
732
30
        if (ret == 0) {
733
        #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
734
            ret = PROTOCOLCB_UNAVAILABLE;
735
            if (ssl->ctx->GenExtMasterCb) {
736
                void* ctx = wolfSSL_GetGenExtMasterSecretCtx(ssl);
737
                ret = ssl->ctx->GenExtMasterCb(ssl, handshake_hash, hashSz,
738
                                                ctx);
739
            }
740
            if (!ssl->ctx->GenExtMasterCb ||
741
                ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
742
        #endif /* (HAVE_SECRET_CALLBACK) && (HAVE_EXT_SECRET_CALLBACK) */
743
30
            {
744
30
                ret = _MakeTlsExtendedMasterSecret(
745
30
                    ssl->arrays->masterSecret, SECRET_LEN,
746
30
                    ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
747
30
                    handshake_hash, hashSz,
748
30
                    IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
749
30
                    ssl->heap, ssl->devId);
750
30
            }
751
30
            ForceZero(handshake_hash, hashSz);
752
30
        }
753
754
30
    #ifdef WOLFSSL_SMALL_STACK
755
30
        XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
756
    #elif defined(WOLFSSL_CHECK_MEM_ZERO)
757
        wc_MemZero_Check(handshake_hash, HSHASH_SZ);
758
    #endif
759
30
    }
760
1.36k
    else
761
1.36k
#endif /* HAVE_EXTENDED_MASTER */
762
1.36k
    {
763
764
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
765
        ret = PROTOCOLCB_UNAVAILABLE;
766
        if (ssl->ctx->GenMasterCb) {
767
            void* ctx = wolfSSL_GetGenMasterSecretCtx(ssl);
768
            ret = ssl->ctx->GenMasterCb(ssl, ctx);
769
        }
770
        if (!ssl->ctx->GenMasterCb ||
771
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
772
#endif
773
1.36k
        {
774
1.36k
            ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret,
775
1.36k
                      SECRET_LEN, ssl->arrays->preMasterSecret,
776
1.36k
                      ssl->arrays->preMasterSz, ssl->arrays->clientRandom,
777
1.36k
                      ssl->arrays->serverRandom, IsAtLeastTLSv1_2(ssl),
778
1.36k
                      ssl->specs.mac_algorithm, ssl->heap, ssl->devId);
779
1.36k
        }
780
1.36k
    }
781
#ifdef HAVE_SECRET_CALLBACK
782
    if (ret == 0 && ssl->tlsSecretCb != NULL) {
783
        ret = ssl->tlsSecretCb(ssl, ssl->arrays->masterSecret,
784
                SECRET_LEN, ssl->tlsSecretCtx);
785
    }
786
#endif /* HAVE_SECRET_CALLBACK */
787
1.39k
    if (ret == 0) {
788
1.39k
        ret = DeriveTlsKeys(ssl);
789
1.39k
    }
790
791
1.39k
    return ret;
792
1.39k
}
793
794
795
/* Used by EAP-TLS and EAP-TTLS to derive keying material from
796
 * the master_secret. */
797
int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* key, unsigned int len,
798
                                                              const char* label)
799
0
{
800
0
    int   ret;
801
0
    WC_DECLARE_VAR(seed, byte, SEED_LEN, 0);
802
803
0
    WC_ALLOC_VAR_EX(seed, byte, SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED,
804
0
        return MEMORY_E);
805
806
    /*
807
     * As per RFC-5281, the order of the client and server randoms is reversed
808
     * from that used by the TLS protocol to derive keys.
809
     */
810
0
    XMEMCPY(seed,           ssl->arrays->clientRandom, RAN_LEN);
811
0
    XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
812
813
0
#ifdef WOLFSSL_HAVE_PRF
814
0
    PRIVATE_KEY_UNLOCK();
815
0
    ret = wc_PRF_TLS((byte*)key, len, ssl->arrays->masterSecret, SECRET_LEN,
816
0
              (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
817
0
              IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
818
0
              ssl->heap, ssl->devId);
819
0
    PRIVATE_KEY_LOCK();
820
#else
821
    /* Pseudo random function must be enabled in the configuration. */
822
    ret = PRF_MISSING;
823
    WOLFSSL_MSG("Pseudo-random function is not enabled");
824
825
    (void)key;
826
    (void)len;
827
    (void)label;
828
#endif
829
830
0
    WC_FREE_VAR_EX(seed, ssl->heap, DYNAMIC_TYPE_SEED);
831
832
0
    return ret;
833
0
}
834
835
/* return HMAC digest type in wolfSSL format */
836
int wolfSSL_GetHmacType(WOLFSSL* ssl)
837
683
{
838
683
    if (ssl == NULL)
839
0
        return BAD_FUNC_ARG;
840
841
683
    return wolfSSL_GetHmacType_ex(&ssl->specs);
842
683
}
843
844
845
int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
846
                           int verify)
847
{
848
    if (ssl == NULL || inner == NULL)
849
        return BAD_FUNC_ARG;
850
851
    if (content == dtls12_cid
852
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
853
       || (ssl->options.dtls && DtlsGetCidTxSize(ssl) > 0)
854
#endif
855
    ) {
856
        WOLFSSL_MSG("wolfSSL_SetTlsHmacInner doesn't support CID");
857
        return BAD_FUNC_ARG;
858
    }
859
860
    XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
861
862
    WriteSEQ(ssl, verify, inner);
863
    inner[SEQ_SZ] = (byte)content;
864
    inner[SEQ_SZ + ENUM_LEN]            = ssl->version.major;
865
    inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
866
    c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
867
868
    return 0;
869
}
870
871
872
#ifndef WOLFSSL_AEAD_ONLY
873
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
874
    !defined(HAVE_SELFTEST)
875
876
/* Update the hash in the HMAC.
877
 *
878
 * hmac  HMAC object.
879
 * data  Data to be hashed.
880
 * sz    Size of data to hash.
881
 * returns 0 on success, otherwise failure.
882
 */
883
static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz)
884
0
{
885
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
886
887
0
    switch (hmac->macType) {
888
0
    #ifndef NO_SHA
889
0
        case WC_SHA:
890
0
            ret = wc_ShaUpdate(&hmac->hash.sha, data, sz);
891
0
            break;
892
0
    #endif /* !NO_SHA */
893
894
0
    #ifndef NO_SHA256
895
0
        case WC_SHA256:
896
0
            ret = wc_Sha256Update(&hmac->hash.sha256, data, sz);
897
0
            break;
898
0
    #endif /* !NO_SHA256 */
899
900
0
    #ifdef WOLFSSL_SHA384
901
0
        case WC_SHA384:
902
0
            ret = wc_Sha384Update(&hmac->hash.sha384, data, sz);
903
0
            break;
904
0
    #endif /* WOLFSSL_SHA384 */
905
906
0
    #ifdef WOLFSSL_SHA512
907
0
        case WC_SHA512:
908
0
            ret = wc_Sha512Update(&hmac->hash.sha512, data, sz);
909
0
            break;
910
0
    #endif /* WOLFSSL_SHA512 */
911
912
0
    #ifdef WOLFSSL_SM3
913
0
        case WC_SM3:
914
0
            ret = wc_Sm3Update(&hmac->hash.sm3, data, sz);
915
0
            break;
916
0
    #endif /* WOLFSSL_SM3 */
917
918
0
        default:
919
0
            ret = BAD_FUNC_ARG;
920
0
            break;
921
0
    }
922
923
0
    return ret;
924
0
}
925
926
/* Finalize the hash but don't put the EOC, padding or length in.
927
 *
928
 * hmac  HMAC object.
929
 * hash  Hash result.
930
 * returns 0 on success, otherwise failure.
931
 */
932
static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash)
933
0
{
934
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
935
936
0
    switch (hmac->macType) {
937
0
    #ifndef NO_SHA
938
0
        case WC_SHA:
939
0
            ret = wc_ShaFinalRaw(&hmac->hash.sha, hash);
940
0
            break;
941
0
    #endif /* !NO_SHA */
942
943
0
    #ifndef NO_SHA256
944
0
        case WC_SHA256:
945
0
            ret = wc_Sha256FinalRaw(&hmac->hash.sha256, hash);
946
0
            break;
947
0
    #endif /* !NO_SHA256 */
948
949
0
    #ifdef WOLFSSL_SHA384
950
0
        case WC_SHA384:
951
0
            ret = wc_Sha384FinalRaw(&hmac->hash.sha384, hash);
952
0
            break;
953
0
    #endif /* WOLFSSL_SHA384 */
954
955
0
    #ifdef WOLFSSL_SHA512
956
0
        case WC_SHA512:
957
0
            ret = wc_Sha512FinalRaw(&hmac->hash.sha512, hash);
958
0
            break;
959
0
    #endif /* WOLFSSL_SHA512 */
960
961
0
    #ifdef WOLFSSL_SM3
962
0
        case WC_SM3:
963
0
            ret = wc_Sm3FinalRaw(&hmac->hash.sm3, hash);
964
0
            break;
965
0
    #endif /* WOLFSSL_SM3 */
966
967
0
        default:
968
0
            ret = BAD_FUNC_ARG;
969
0
            break;
970
0
    }
971
972
0
    return ret;
973
0
}
974
975
/* Finalize the HMAC by performing outer hash.
976
 *
977
 * hmac  HMAC object.
978
 * mac   MAC result.
979
 * returns 0 on success, otherwise failure.
980
 */
981
static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac)
982
64
{
983
64
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
984
64
    WC_DECLARE_VAR(hash, wc_HashAlg, 1, hmac ? hmac->heap : NULL);
985
64
    enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
986
64
    int digestSz = wc_HashGetDigestSize(hashType);
987
64
    int blockSz = wc_HashGetBlockSize(hashType);
988
989
64
    WC_ALLOC_VAR_EX(hash, wc_HashAlg, 1, hmac->heap, DYNAMIC_TYPE_HASHES,
990
64
                    return MEMORY_E);
991
992
64
    if ((digestSz >= 0) && (blockSz >= 0)) {
993
64
        ret = wc_HashInit(hash, hashType);
994
64
    }
995
0
    else {
996
0
        ret = BAD_FUNC_ARG;
997
0
    }
998
999
64
    if (ret == 0) {
1000
64
        ret = wc_HashUpdate(hash, hashType, (byte*)hmac->opad,
1001
64
            (word32)blockSz);
1002
64
        if (ret == 0)
1003
64
            ret = wc_HashUpdate(hash, hashType, (byte*)hmac->innerHash,
1004
64
                (word32)digestSz);
1005
64
        if (ret == 0)
1006
64
            ret = wc_HashFinal(hash, hashType, mac);
1007
64
        wc_HashFree(hash, hashType);
1008
64
    }
1009
1010
64
    WC_FREE_VAR_EX(hash, hmac->heap, DYNAMIC_TYPE_HASHES);
1011
64
    return ret;
1012
64
}
1013
1014
/* Calculate the HMAC of the header + message data.
1015
 * Constant time implementation using wc_Sha*FinalRaw().
1016
 *
1017
 * hmac    HMAC object.
1018
 * digest  MAC result.
1019
 * in      Message data.
1020
 * sz      Size of the message data.
1021
 * header  Constructed record header with length of handshake data.
1022
 * headerSz Length of header
1023
 * returns 0 on success, otherwise failure.
1024
 */
1025
static int Hmac_UpdateFinal_CT(Hmac* hmac, byte* digest, const byte* in,
1026
                           word32 sz, int macLen, byte* header, word32 headerSz)
1027
0
{
1028
0
    byte         lenBytes[8];
1029
0
    int          i, j;
1030
0
    unsigned int k;
1031
0
    int          blockBits, blockMask;
1032
0
    int          lastBlockLen, extraLen, eocIndex;
1033
0
    int          blocks;
1034
0
    int          safeBlocks;
1035
0
    int          lenBlock;
1036
0
    int          eocBlock;
1037
0
    word32       maxLen;
1038
0
    int          blockSz, padSz;
1039
0
    int          ret;
1040
0
    word32       realLen;
1041
0
    byte         extraBlock;
1042
1043
0
    if (macLen <= 0 || macLen > (int)sizeof(hmac->innerHash))
1044
0
        return BAD_FUNC_ARG;
1045
1046
0
    switch (hmac->macType) {
1047
0
    #ifndef NO_SHA
1048
0
        case WC_SHA:
1049
0
            blockSz = WC_SHA_BLOCK_SIZE;
1050
0
            blockBits = 6;
1051
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1052
0
            break;
1053
0
    #endif /* !NO_SHA */
1054
1055
0
    #ifndef NO_SHA256
1056
0
        case WC_SHA256:
1057
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1058
0
            blockBits = 6;
1059
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1060
0
            break;
1061
0
    #endif /* !NO_SHA256 */
1062
1063
0
    #ifdef WOLFSSL_SHA384
1064
0
        case WC_SHA384:
1065
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1066
0
            blockBits = 7;
1067
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1068
0
            break;
1069
0
    #endif /* WOLFSSL_SHA384 */
1070
1071
0
    #ifdef WOLFSSL_SHA512
1072
0
        case WC_SHA512:
1073
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1074
0
            blockBits = 7;
1075
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1076
0
            break;
1077
0
    #endif /* WOLFSSL_SHA512 */
1078
1079
0
    #ifdef WOLFSSL_SM3
1080
0
        case WC_SM3:
1081
0
            blockSz = WC_SM3_BLOCK_SIZE;
1082
0
            blockBits = 6;
1083
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1084
0
            break;
1085
0
    #endif /* WOLFSSL_SM3 */
1086
1087
0
        default:
1088
0
            return BAD_FUNC_ARG;
1089
0
    }
1090
0
    blockMask = blockSz - 1;
1091
1092
    /* Size of data to HMAC if padding length byte is zero. */
1093
0
    maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - (word32)macLen;
1094
1095
    /* Complete data (including padding) has block for EOC and/or length. */
1096
0
    extraBlock = ctSetLTE(((int)maxLen + padSz) & blockMask, padSz);
1097
    /* Total number of blocks for data including padding. */
1098
0
    blocks = ((int)(maxLen + (word32)blockSz - 1) >> blockBits) + extraBlock;
1099
    /* Up to last 6 blocks can be hashed safely. */
1100
0
    safeBlocks = blocks - 6;
1101
1102
    /* Length of message data. */
1103
0
    realLen = maxLen - in[sz - 1];
1104
    /* Number of message bytes in last block. */
1105
0
    lastBlockLen = (int)realLen & blockMask;
1106
    /* Number of padding bytes in last block. */
1107
0
    extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
1108
    /* Number of blocks to create for hash. */
1109
0
    lenBlock = ((int)realLen + extraLen) >> blockBits;
1110
    /* Block containing EOC byte. */
1111
0
    eocBlock = (int)(realLen >> (word32)blockBits);
1112
    /* Index of EOC byte in block. */
1113
0
    eocIndex = (int)(realLen & (word32)blockMask);
1114
1115
    /* Add length of hmac's ipad to total length. */
1116
0
    realLen += (word32)blockSz;
1117
    /* Length as bits - 8 bytes bigendian. */
1118
0
    c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
1119
0
    c32toa(realLen << 3, lenBytes + sizeof(word32));
1120
1121
0
    ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, (word32)blockSz);
1122
0
    if (ret != 0)
1123
0
        return ret;
1124
1125
0
    XMEMSET(hmac->innerHash, 0, (size_t)macLen);
1126
1127
0
    if (safeBlocks > 0) {
1128
0
        ret = Hmac_HashUpdate(hmac, header, headerSz);
1129
0
        if (ret != 0)
1130
0
            return ret;
1131
0
        ret = Hmac_HashUpdate(hmac, in, (word32)(safeBlocks * blockSz -
1132
0
                                WOLFSSL_TLS_HMAC_INNER_SZ));
1133
1134
0
        if (ret != 0)
1135
0
            return ret;
1136
0
    }
1137
0
    else
1138
0
        safeBlocks = 0;
1139
1140
0
    XMEMSET(digest, 0, (size_t)macLen);
1141
0
    k = (unsigned int)(safeBlocks * blockSz);
1142
0
    for (i = safeBlocks; i < blocks; i++) {
1143
0
        unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
1144
0
        unsigned char isEocBlock = ctMaskEq(i, eocBlock);
1145
0
        unsigned char isOutBlock = ctMaskEq(i, lenBlock);
1146
1147
0
        for (j = 0; j < blockSz; j++) {
1148
0
            unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
1149
0
            volatile unsigned char maskPastEoc = ctMaskGT(j, eocIndex);
1150
0
            volatile unsigned char pastEoc = maskPastEoc & isEocBlock;
1151
0
            unsigned char b = 0;
1152
1153
0
            if (k < headerSz)
1154
0
                b = header[k];
1155
0
            else if (k < maxLen)
1156
0
                b = in[k - headerSz];
1157
0
            k++;
1158
1159
0
            b = ctMaskSel(atEoc, 0x80, b);
1160
0
            b &= (unsigned char)~(word32)pastEoc;
1161
0
            b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
1162
1163
0
            if (j >= blockSz - 8) {
1164
0
                b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
1165
0
            }
1166
1167
0
            hashBlock[j] = b;
1168
0
        }
1169
1170
        /* cppcheck-suppress uninitvar */
1171
0
        ret = Hmac_HashUpdate(hmac, hashBlock, (word32)blockSz);
1172
0
        if (ret != 0)
1173
0
            return ret;
1174
0
        ret = Hmac_HashFinalRaw(hmac, hashBlock);
1175
0
        if (ret != 0)
1176
0
            return ret;
1177
0
        for (j = 0; j < macLen; j++)
1178
0
            ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
1179
0
    }
1180
1181
0
    ret = Hmac_OuterHash(hmac, digest);
1182
1183
0
    return ret;
1184
0
}
1185
1186
#endif
1187
1188
#if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
1189
    defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2B)
1190
1191
/* Calculate the HMAC of the header + message data.
1192
 * Constant time implementation using normal hashing operations.
1193
 * Update-Final need to be constant time.
1194
 *
1195
 * hmac    HMAC object.
1196
 * digest  MAC result.
1197
 * in      Message data.
1198
 * sz      Size of the message data.
1199
 * header  Constructed record header with length of handshake data.
1200
 * headerSz Length of header
1201
 * returns 0 on success, otherwise failure.
1202
 */
1203
static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
1204
                            word32 sz, byte* header, word32 headerSz)
1205
0
{
1206
0
    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
1207
0
    int        ret = 0;
1208
0
    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
1209
0
    word32     offset = 0;
1210
0
    int        msgBlocks, blocks, blockBits;
1211
0
    int        i;
1212
1213
0
    switch (hmac->macType) {
1214
0
    #ifndef NO_SHA
1215
0
        case WC_SHA:
1216
0
            blockSz = WC_SHA_BLOCK_SIZE;
1217
0
            blockBits = 6;
1218
0
            macSz = WC_SHA_DIGEST_SIZE;
1219
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1220
0
            break;
1221
0
    #endif /* !NO_SHA */
1222
1223
0
    #ifndef NO_SHA256
1224
0
        case WC_SHA256:
1225
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1226
0
            blockBits = 6;
1227
0
            macSz = WC_SHA256_DIGEST_SIZE;
1228
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1229
0
            break;
1230
0
    #endif /* !NO_SHA256 */
1231
1232
0
    #ifdef WOLFSSL_SHA384
1233
0
        case WC_SHA384:
1234
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1235
0
            blockBits = 7;
1236
0
            macSz = WC_SHA384_DIGEST_SIZE;
1237
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1238
0
            break;
1239
0
    #endif /* WOLFSSL_SHA384 */
1240
1241
0
    #ifdef WOLFSSL_SHA512
1242
0
        case WC_SHA512:
1243
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1244
0
            blockBits = 7;
1245
0
            macSz = WC_SHA512_DIGEST_SIZE;
1246
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1247
0
            break;
1248
0
    #endif /* WOLFSSL_SHA512 */
1249
1250
0
    #ifdef HAVE_BLAKE2B
1251
0
        case WC_HASH_TYPE_BLAKE2B:
1252
0
            blockSz = BLAKE2B_BLOCKBYTES;
1253
0
            blockBits = 7;
1254
0
            macSz = BLAKE2B_256;
1255
0
            padSz = 0;
1256
0
            break;
1257
0
    #endif /* HAVE_BLAKE2B */
1258
1259
0
    #ifdef WOLFSSL_SM3
1260
0
        case WC_SM3:
1261
0
            blockSz = WC_SM3_BLOCK_SIZE;
1262
0
            blockBits = 6;
1263
0
            macSz = WC_SM3_DIGEST_SIZE;
1264
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1265
0
            break;
1266
0
    #endif
1267
1268
0
        default:
1269
0
            WOLFSSL_MSG("ERROR: Hmac_UpdateFinal failed, no hmac->macType");
1270
0
            return BAD_FUNC_ARG;
1271
0
    }
1272
1273
0
    msgSz = sz - (1 + in[sz - 1] + macSz);
1274
    /* Make negative result 0 */
1275
0
    msgSz &= ~(0 - (msgSz >> 31));
1276
0
    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
1277
0
    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
1278
    /* Make negative result 0 */
1279
0
    maxSz &= ~(0 - (maxSz >> 31));
1280
1281
    /* Calculate #blocks processed in HMAC for max and real data. */
1282
0
    blocks      = (int)(maxSz >> blockBits);
1283
0
    blocks     += ((maxSz + padSz) % blockSz) < padSz;
1284
0
    msgBlocks   = (int)(realSz >> blockBits);
1285
    /* #Extra blocks to process. */
1286
0
    blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0);
1287
    /* Calculate whole blocks. */
1288
0
    msgBlocks--;
1289
1290
0
    ret = wc_HmacUpdate(hmac, header, headerSz);
1291
0
    if (ret == 0) {
1292
        /* Fill the rest of the block with any available data. */
1293
0
        word32 currSz = ctMaskLT((int)msgSz, (int)blockSz) & msgSz;
1294
0
        currSz |= ctMaskGTE((int)msgSz, (int)blockSz) & blockSz;
1295
0
        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
1296
0
        currSz &= ~(0 - (currSz >> 31));
1297
0
        ret = wc_HmacUpdate(hmac, in, currSz);
1298
0
        offset = currSz;
1299
0
    }
1300
0
    if (ret == 0) {
1301
        /* Do the hash operations on a block basis. */
1302
0
        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
1303
0
            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
1304
0
            if (ret != 0)
1305
0
                break;
1306
0
        }
1307
0
    }
1308
0
    if (ret == 0)
1309
0
        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
1310
0
    if (ret == 0)
1311
0
        ret = wc_HmacFinal(hmac, digest);
1312
0
    if (ret == 0) {
1313
        /* Do the dummy hash operations. Do at least one. */
1314
0
        for (i = 0; i < blocks + 1; i++) {
1315
0
            ret = wc_HmacUpdate(hmac, dummy, blockSz);
1316
0
            if (ret != 0)
1317
0
                break;
1318
0
        }
1319
0
    }
1320
1321
0
    return ret;
1322
0
}
1323
1324
#endif
1325
1326
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1327
#define TLS_HMAC_CID_SZ(s, v) \
1328
                ((v) ? DtlsGetCidRxSize((s)) \
1329
                     : DtlsGetCidTxSize((s)))
1330
#define TLS_HMAC_CID(s, v, b, c) \
1331
                ((v) ? wolfSSL_dtls_cid_get_rx((s), (b), (c)) \
1332
                     : wolfSSL_dtls_cid_get_tx((s), (b), (c)))
1333
#endif
1334
1335
static int TLS_hmac_SetInner(WOLFSSL* ssl, byte* inner, word32* innerSz,
1336
        word32 sz, int content, int verify, int epochOrder)
1337
{
1338
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1339
    unsigned int cidSz = 0;
1340
    if (ssl->options.dtls && (cidSz = TLS_HMAC_CID_SZ(ssl, verify)) > 0) {
1341
        word32 idx = 0;
1342
        if (cidSz > DTLS_CID_MAX_SIZE) {
1343
            WOLFSSL_MSG("DTLS CID too large");
1344
            return DTLS_CID_ERROR;
1345
        }
1346
1347
        XMEMSET(inner + idx, 0xFF, SEQ_SZ);
1348
        idx += SEQ_SZ;
1349
        inner[idx++] = dtls12_cid;
1350
        inner[idx++] = (byte)cidSz;
1351
        inner[idx++] = dtls12_cid;
1352
        inner[idx++] = ssl->version.major;
1353
        inner[idx++] = ssl->version.minor;
1354
        WriteSEQ(ssl, epochOrder, inner + idx);
1355
        idx += SEQ_SZ;
1356
        if (TLS_HMAC_CID(ssl, verify, inner + idx, cidSz) ==
1357
                WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
1358
            WOLFSSL_MSG("DTLS CID write failed");
1359
            return DTLS_CID_ERROR;
1360
        }
1361
        idx += cidSz;
1362
        c16toa((word16)sz, inner + idx);
1363
        idx += LENGTH_SZ;
1364
1365
        *innerSz = idx;
1366
        return 0;
1367
    }
1368
#endif
1369
    *innerSz = WOLFSSL_TLS_HMAC_INNER_SZ;
1370
    return wolfSSL_SetTlsHmacInner(ssl, inner, sz, content,
1371
            !ssl->options.dtls ? verify : epochOrder);
1372
}
1373
1374
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1375
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_CID_INNER_SZ
1376
#else
1377
0
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_INNER_SZ
1378
#endif
1379
1380
int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
1381
             int content, int verify, int epochOrder)
1382
0
{
1383
0
    WC_DECLARE_VAR(hmac, Hmac, 1, ssl ? ssl->heap : NULL);
1384
0
    byte   myInner[TLS_HMAC_INNER_SZ];
1385
0
    word32 innerSz = TLS_HMAC_INNER_SZ;
1386
0
    int    ret = 0;
1387
0
    const byte* macSecret = NULL;
1388
0
    word32 hashSz = 0;
1389
0
    word32 totalSz = 0;
1390
1391
0
    if (ssl == NULL)
1392
0
        return BAD_FUNC_ARG;
1393
1394
0
    WC_ALLOC_VAR_EX(hmac, Hmac, 1, ssl->heap, DYNAMIC_TYPE_HMAC,
1395
0
                    return MEMORY_E);
1396
1397
#ifdef HAVE_TRUNCATED_HMAC
1398
    hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
1399
                                        : ssl->specs.hash_size;
1400
#else
1401
0
    hashSz = ssl->specs.hash_size;
1402
0
#endif
1403
1404
    /* Pre-compute sz + hashSz + padSz + 1 with overflow checking.
1405
     * Used by fuzzer callback and Hmac_UpdateFinal* in the verify path. */
1406
0
    if (verify && padSz >= 0) {
1407
0
        word32 hmacSz = 0;
1408
0
        if (!WC_SAFE_SUM_WORD32(sz, hashSz, hmacSz) ||
1409
0
            !WC_SAFE_SUM_WORD32(hmacSz, (word32)padSz, hmacSz) ||
1410
0
            !WC_SAFE_SUM_WORD32(hmacSz, 1, hmacSz)) {
1411
0
            WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1412
0
            return BUFFER_E;
1413
0
        }
1414
0
        totalSz = hmacSz;
1415
0
    }
1416
1417
#ifdef HAVE_FUZZER
1418
    /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
1419
    if (ssl->fuzzerCb) {
1420
        if (verify && padSz >= 0) {
1421
            ssl->fuzzerCb(ssl, in, totalSz, FUZZ_HMAC,
1422
                          ssl->fuzzerCtx);
1423
        }
1424
        else {
1425
            ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
1426
        }
1427
    }
1428
#endif
1429
1430
0
    ret = TLS_hmac_SetInner(ssl, myInner, &innerSz, sz, content, verify,
1431
0
                            epochOrder);
1432
0
    if (ret != 0) {
1433
0
        WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1434
0
        return ret;
1435
0
    }
1436
1437
0
    ret = wc_HmacInit(hmac, ssl->heap, ssl->devId);
1438
0
    if (ret != 0) {
1439
0
        WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1440
0
        return ret;
1441
0
    }
1442
1443
1444
#ifdef WOLFSSL_DTLS
1445
    if (ssl->options.dtls)
1446
        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
1447
    else
1448
#endif
1449
0
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
1450
0
    ret = wc_HmacSetKey(hmac, wolfSSL_GetHmacType(ssl),
1451
0
                                              macSecret,
1452
0
                                              ssl->specs.hash_size);
1453
1454
0
    if (ret == 0) {
1455
        /* Constant time verification required. */
1456
0
        if (verify && padSz >= 0) {
1457
0
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
1458
0
    !defined(HAVE_SELFTEST)
1459
0
    #ifdef HAVE_BLAKE2B
1460
0
            if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
1461
0
                ret = Hmac_UpdateFinal(hmac, digest, in,
1462
0
                        totalSz, myInner, innerSz);
1463
0
            }
1464
0
            else
1465
0
    #endif
1466
0
            {
1467
0
                ret = Hmac_UpdateFinal_CT(hmac, digest, in,
1468
0
                                      totalSz,
1469
0
                                      (int)hashSz, myInner, innerSz);
1470
1471
0
            }
1472
#else
1473
            ret = Hmac_UpdateFinal(hmac, digest, in, totalSz,
1474
                                        myInner, innerSz);
1475
#endif
1476
0
        }
1477
0
        else {
1478
0
            ret = wc_HmacUpdate(hmac, myInner, innerSz);
1479
0
            if (ret == 0)
1480
0
                ret = wc_HmacUpdate(hmac, in, sz);                /* content */
1481
0
            if (ret == 0)
1482
0
                ret = wc_HmacFinal(hmac, digest);
1483
0
        }
1484
0
    }
1485
1486
0
    wc_HmacFree(hmac);
1487
0
    WC_FREE_VAR_EX(hmac, ssl->heap, DYNAMIC_TYPE_HMAC);
1488
1489
0
    return ret;
1490
0
}
1491
#endif /* WOLFSSL_AEAD_ONLY */
1492
1493
#endif /* !WOLFSSL_NO_TLS12 */
1494
1495
int wolfSSL_GetHmacType_ex(CipherSpecs* specs)
1496
0
{
1497
0
    if (specs == NULL)
1498
0
        return BAD_FUNC_ARG;
1499
1500
0
    switch (specs->mac_algorithm) {
1501
0
        #ifndef NO_MD5
1502
0
        case md5_mac:
1503
0
        {
1504
0
            return WC_MD5;
1505
0
        }
1506
0
        #endif
1507
0
        #ifndef NO_SHA256
1508
0
        case sha256_mac:
1509
0
        {
1510
0
            return WC_SHA256;
1511
0
        }
1512
0
        #endif
1513
0
        #ifdef WOLFSSL_SHA384
1514
0
        case sha384_mac:
1515
0
        {
1516
0
            return WC_SHA384;
1517
0
        }
1518
0
        #endif
1519
0
        #ifdef WOLFSSL_SM3
1520
0
        case sm3_mac:
1521
0
        {
1522
0
            return WC_SM3;
1523
0
        }
1524
0
        #endif
1525
0
        #ifndef NO_SHA
1526
0
        case sha_mac:
1527
0
        {
1528
0
            return WC_SHA;
1529
0
        }
1530
0
        #endif
1531
0
        #ifdef HAVE_BLAKE2B
1532
0
        case blake2b_mac:
1533
0
        {
1534
0
            return BLAKE2B_ID;
1535
0
        }
1536
0
        #endif
1537
0
        default:
1538
0
        {
1539
0
            return WOLFSSL_FATAL_ERROR;
1540
0
        }
1541
0
    }
1542
0
}
1543
1544
#ifdef HAVE_TLS_EXTENSIONS
1545
1546
/**
1547
 * The TLSX semaphore is used to calculate the size of the extensions to be sent
1548
 * from one peer to another.
1549
 */
1550
1551
/** Supports up to 72 flags. Increase as needed. */
1552
#define SEMAPHORE_SIZE 9
1553
1554
/**
1555
 * Converts the extension type (id) to an index in the semaphore.
1556
 *
1557
 * Official reference for TLS extension types:
1558
 *   http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
1559
 *
1560
 * Motivation:
1561
 *   Previously, we used the extension type itself as the index of that
1562
 *   extension in the semaphore as the extension types were declared
1563
 *   sequentially, but maintain a semaphore as big as the number of available
1564
 *   extensions is no longer an option since the release of renegotiation_info.
1565
 *
1566
 * How to update:
1567
 *   Assign extension types that extrapolate the number of available semaphores
1568
 *   to the first available index going backwards in the semaphore array.
1569
 *   When adding a new extension type that don't extrapolate the number of
1570
 *   available semaphores, check for a possible collision with with a
1571
 *   'remapped' extension type.
1572
 *
1573
 * Update TLSX_Parse for duplicate detection if more added above 62.
1574
 */
1575
static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
1576
{
1577
    switch (type) {
1578
1579
        case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
1580
            return 63;
1581
#ifdef WOLFSSL_QUIC
1582
        case TLSX_KEY_QUIC_TP_PARAMS_DRAFT: /* 0xffa5 */
1583
            return 64;
1584
#endif
1585
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
1586
        case TLSX_ECH: /* 0xfe0d */
1587
            return 65;
1588
#endif
1589
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
1590
        case TLSX_CKS:
1591
            return 66;
1592
#endif
1593
        default:
1594
            if (type > 62) {
1595
                /* This message SHOULD only happens during the adding of
1596
                   new TLS extensions in which its IANA number overflows
1597
                   the current semaphore's range, or if its number already
1598
                   is assigned to be used by another extension.
1599
                   Use this check value for the new extension and decrement
1600
                   the check value by one. */
1601
                WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
1602
            }
1603
    }
1604
1605
    return type;
1606
}
1607
1608
/** Checks if a specific light (tls extension) is not set in the semaphore. */
1609
#define IS_OFF(semaphore, light) \
1610
0
    (!(((semaphore)[(light) / 8] &  (byte) (0x01 << ((light) % 8)))))
1611
1612
/** Turn on a specific light (tls extension) in the semaphore. */
1613
/* the semaphore marks the extensions already written to the message */
1614
#define TURN_ON(semaphore, light) \
1615
0
    ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
1616
1617
/** Turn off a specific light (tls extension) in the semaphore. */
1618
#define TURN_OFF(semaphore, light) \
1619
0
    ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
1620
1621
/** Creates a new extension. */
1622
static TLSX* TLSX_New(TLSX_Type type, const void* data, void* heap)
1623
105k
{
1624
105k
    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
1625
1626
105k
    (void)heap;
1627
1628
105k
    if (extension) {
1629
105k
        extension->type = type;
1630
105k
        extension->data = (void*)data;
1631
105k
        extension->resp = 0;
1632
105k
        extension->next = NULL;
1633
105k
    }
1634
1635
105k
    return extension;
1636
105k
}
1637
1638
/**
1639
 * Creates a new extension and appends it to the provided list.
1640
 * Checks for duplicate extensions, keeps the newest.
1641
 */
1642
int TLSX_Append(TLSX** list, TLSX_Type type, const void* data, void* heap)
1643
0
{
1644
0
    TLSX* extension = TLSX_New(type, data, heap);
1645
0
    TLSX* cur;
1646
0
    TLSX** prevNext = list;
1647
1648
0
    if (extension == NULL)
1649
0
        return MEMORY_E;
1650
1651
0
    for (cur = *list; cur != NULL;) {
1652
0
        if (cur->type == type) {
1653
0
            *prevNext = cur->next;
1654
0
            cur->next = NULL;
1655
0
            TLSX_FreeAll(cur, heap);
1656
0
            cur = *prevNext;
1657
0
        }
1658
0
        else {
1659
0
            prevNext = &cur->next;
1660
0
            cur = cur->next;
1661
0
        }
1662
0
    }
1663
1664
    /* Append the extension to the list */
1665
0
    *prevNext = extension;
1666
1667
0
    return 0;
1668
0
}
1669
1670
/**
1671
 * Creates a new extension and pushes it to the provided list.
1672
 * Checks for duplicate extensions, keeps the newest.
1673
 */
1674
int TLSX_Push(TLSX** list, TLSX_Type type, const void* data, void* heap)
1675
105k
{
1676
105k
    TLSX* extension = TLSX_New(type, data, heap);
1677
1678
105k
    if (extension == NULL)
1679
66
        return MEMORY_E;
1680
1681
    /* pushes the new extension on the list. */
1682
105k
    extension->next = *list;
1683
105k
    *list = extension;
1684
1685
    /* remove duplicate extensions, there should be only one of each type. */
1686
319k
    do {
1687
319k
        if (extension->next && extension->next->type == type) {
1688
145
            TLSX *next = extension->next;
1689
1690
145
            extension->next = next->next;
1691
145
            next->next = NULL;
1692
1693
145
            TLSX_FreeAll(next, heap);
1694
1695
            /* there is no way to occur more than
1696
             * two extensions of the same type.
1697
             */
1698
145
            break;
1699
145
        }
1700
319k
    } while ((extension = extension->next));
1701
1702
105k
    return 0;
1703
105k
}
1704
1705
#ifndef NO_WOLFSSL_CLIENT
1706
1707
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
1708
1709
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
1710
125
{
1711
125
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1712
1713
125
    if (!extension)
1714
125
        extension = TLSX_Find(ssl->ctx->extensions, type);
1715
1716
125
    return extension == NULL;
1717
125
}
1718
1719
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
1720
1721
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
1722
7
{
1723
7
    SendAlert(ssl, alert_fatal, unsupported_extension);
1724
7
    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
1725
7
    return UNSUPPORTED_EXTENSION;
1726
7
}
1727
1728
#else
1729
1730
#define TLSX_CheckUnsupportedExtension(ssl, type) 0
1731
#define TLSX_HandleUnsupportedExtension(ssl) 0
1732
1733
#endif
1734
1735
#if !defined(NO_WOLFSSL_SERVER) || defined(WOLFSSL_TLS13)
1736
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
1737
/** Mark an extension to be sent back to the client. */
1738
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
1739
1.65k
{
1740
1.65k
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1741
1742
1.65k
    if (extension)
1743
1.65k
        extension->resp = 1;
1744
1.65k
}
1745
#endif
1746
1747
/******************************************************************************/
1748
/* Application-Layer Protocol Negotiation                                     */
1749
/******************************************************************************/
1750
1751
#ifdef HAVE_ALPN
1752
/** Creates a new ALPN object, providing protocol name to use. */
1753
static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
1754
                                                                     void* heap)
1755
{
1756
    ALPN *alpn;
1757
1758
    WOLFSSL_ENTER("TLSX_ALPN_New");
1759
1760
    if (protocol_name == NULL ||
1761
        protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
1762
        WOLFSSL_MSG("Invalid arguments");
1763
        return NULL;
1764
    }
1765
1766
    alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
1767
    if (alpn == NULL) {
1768
        WOLFSSL_MSG("Memory failure");
1769
        return NULL;
1770
    }
1771
1772
    alpn->next = NULL;
1773
    alpn->negotiated = 0;
1774
    alpn->options = 0;
1775
1776
    alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
1777
                                         heap, DYNAMIC_TYPE_TLSX);
1778
    if (alpn->protocol_name == NULL) {
1779
        WOLFSSL_MSG("Memory failure");
1780
        XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1781
        return NULL;
1782
    }
1783
1784
    XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
1785
    alpn->protocol_name[protocol_nameSz] = 0;
1786
1787
    (void)heap;
1788
1789
    return alpn;
1790
}
1791
1792
/** Releases an ALPN object. */
1793
static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
1794
{
1795
    (void)heap;
1796
1797
    if (alpn == NULL)
1798
        return;
1799
1800
    XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
1801
    XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1802
}
1803
1804
/** Releases all ALPN objects in the provided list. */
1805
static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
1806
{
1807
    ALPN* alpn;
1808
1809
    while ((alpn = list)) {
1810
        list = alpn->next;
1811
        TLSX_ALPN_Free(alpn, heap);
1812
    }
1813
}
1814
1815
/** Tells the buffered size of the ALPN objects in a list. */
1816
static word16 TLSX_ALPN_GetSize(ALPN *list)
1817
{
1818
    ALPN* alpn;
1819
    word32 length = OPAQUE16_LEN; /* list length */
1820
1821
    while ((alpn = list)) {
1822
        list = alpn->next;
1823
1824
        length++; /* protocol name length is on one byte */
1825
        length += (word32)XSTRLEN(alpn->protocol_name);
1826
1827
        if (length > WOLFSSL_MAX_16BIT) {
1828
            return 0;
1829
        }
1830
    }
1831
1832
    return (word16)length;
1833
}
1834
1835
/** Writes the ALPN objects of a list in a buffer. */
1836
static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
1837
{
1838
    ALPN* alpn;
1839
    word16 length = 0;
1840
    word16 offset = OPAQUE16_LEN; /* list length offset */
1841
1842
    while ((alpn = list)) {
1843
        list = alpn->next;
1844
1845
        length = (word16)XSTRLEN(alpn->protocol_name);
1846
1847
        /* protocol name length */
1848
        output[offset++] = (byte)length;
1849
1850
        /* protocol name value */
1851
        XMEMCPY(output + offset, alpn->protocol_name, length);
1852
1853
        offset += length;
1854
    }
1855
1856
    /* writing list length */
1857
    c16toa(offset - OPAQUE16_LEN, output);
1858
1859
    return offset;
1860
}
1861
1862
/** Finds a protocol name in the provided ALPN list */
1863
static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
1864
{
1865
    ALPN *alpn;
1866
1867
    if (list == NULL || protocol_name == NULL)
1868
        return NULL;
1869
1870
    alpn = list;
1871
    while (alpn != NULL && (
1872
           (word16)XSTRLEN(alpn->protocol_name) != size ||
1873
           XSTRNCMP(alpn->protocol_name, protocol_name, size)))
1874
        alpn = alpn->next;
1875
1876
    return alpn;
1877
}
1878
1879
/** Set the ALPN matching client and server requirements */
1880
static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
1881
                                                                     void* heap)
1882
{
1883
    ALPN *alpn;
1884
    int  ret;
1885
1886
    if (extensions == NULL || data == NULL)
1887
        return BAD_FUNC_ARG;
1888
1889
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1890
    if (alpn == NULL) {
1891
        WOLFSSL_MSG("Memory failure");
1892
        return MEMORY_E;
1893
    }
1894
1895
    alpn->negotiated = 1;
1896
1897
    ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
1898
                                                                          heap);
1899
    if (ret != 0) {
1900
        TLSX_ALPN_Free(alpn, heap);
1901
        return ret;
1902
    }
1903
1904
    return WOLFSSL_SUCCESS;
1905
}
1906
1907
static int ALPN_find_match(WOLFSSL *ssl, TLSX **pextension,
1908
                           const byte **psel, byte *psel_len,
1909
                           const byte *alpn_val, word16 alpn_val_len)
1910
{
1911
    TLSX    *extension;
1912
    ALPN    *alpn, *list;
1913
    const byte *sel = NULL, *s;
1914
    byte sel_len = 0, wlen;
1915
1916
    extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1917
    if (extension == NULL)
1918
        extension = TLSX_Find(ssl->ctx->extensions,
1919
                              TLSX_APPLICATION_LAYER_PROTOCOL);
1920
1921
    /* No ALPN configured here */
1922
    if (extension == NULL || extension->data == NULL) {
1923
        *pextension = NULL;
1924
        *psel = NULL;
1925
        *psel_len = 0;
1926
        return 0;
1927
    }
1928
1929
    list = (ALPN*)extension->data;
1930
    for (s = alpn_val;
1931
         (s - alpn_val) < alpn_val_len;
1932
         s += wlen) {
1933
        wlen = *s++; /* bounds already checked on save */
1934
        alpn = TLSX_ALPN_Find(list, (char*)s, wlen);
1935
        if (alpn != NULL) {
1936
            WOLFSSL_MSG("ALPN protocol match");
1937
            sel = s,
1938
            sel_len = wlen;
1939
            break;
1940
        }
1941
    }
1942
1943
    if (sel == NULL) {
1944
        WOLFSSL_MSG("No ALPN protocol match");
1945
1946
        /* do nothing if no protocol match between client and server and option
1947
         is set to continue (like OpenSSL) */
1948
        if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
1949
            WOLFSSL_MSG("Continue on mismatch");
1950
        }
1951
        else {
1952
            SendAlert(ssl, alert_fatal, no_application_protocol);
1953
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1954
            return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1955
        }
1956
    }
1957
1958
    *pextension = extension;
1959
    *psel = sel;
1960
    *psel_len = sel_len;
1961
    return 0;
1962
}
1963
1964
int ALPN_Select(WOLFSSL *ssl)
1965
{
1966
    TLSX *extension;
1967
    const byte *sel = NULL;
1968
    byte sel_len = 0;
1969
    int r = 0;
1970
1971
    WOLFSSL_ENTER("ALPN_Select");
1972
    if (ssl->alpn_peer_requested == NULL)
1973
        return 0;
1974
1975
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
1976
    if (ssl->alpnSelect != NULL && ssl->options.side == WOLFSSL_SERVER_END) {
1977
        r = ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested,
1978
                ssl->alpn_peer_requested_length, ssl->alpnSelectArg);
1979
        switch (r) {
1980
            case SSL_TLSEXT_ERR_OK:
1981
                WOLFSSL_MSG("ALPN protocol match");
1982
                break;
1983
            case SSL_TLSEXT_ERR_NOACK:
1984
                WOLFSSL_MSG("ALPN cb no match but not fatal");
1985
                sel = NULL;
1986
                sel_len = 0;
1987
                break;
1988
            case SSL_TLSEXT_ERR_ALERT_FATAL:
1989
            default:
1990
                WOLFSSL_MSG("ALPN cb no match and fatal");
1991
                SendAlert(ssl, alert_fatal, no_application_protocol);
1992
                WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1993
                return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1994
        }
1995
    }
1996
    else
1997
#endif
1998
    {
1999
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len,
2000
                            ssl->alpn_peer_requested,
2001
                            ssl->alpn_peer_requested_length);
2002
        if (r != 0)
2003
            return r;
2004
    }
2005
2006
    if (sel != NULL) {
2007
        /* set the matching negotiated protocol */
2008
        r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
2009
        if (r != WOLFSSL_SUCCESS) {
2010
            WOLFSSL_MSG("TLSX_SetALPN failed");
2011
            return BUFFER_ERROR;
2012
        }
2013
        /* reply to ALPN extension sent from peer */
2014
#ifndef NO_WOLFSSL_SERVER
2015
        TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
2016
#endif
2017
    }
2018
    return 0;
2019
}
2020
2021
/** Parses a buffer of ALPN extensions and set the first one matching
2022
 * client and server requirements */
2023
static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, const byte *input, word16 length,
2024
                                 byte isRequest)
2025
{
2026
    word16  size = 0, offset = 0, wlen;
2027
    int     r = WC_NO_ERR_TRACE(BUFFER_ERROR);
2028
    const byte *s;
2029
2030
    if (OPAQUE16_LEN > length)
2031
        return BUFFER_ERROR;
2032
2033
    ato16(input, &size);
2034
    offset += OPAQUE16_LEN;
2035
2036
    /* validating alpn list length */
2037
    if (size == 0 || length != OPAQUE16_LEN + size)
2038
        return BUFFER_ERROR;
2039
2040
    /* validating length of entries before accepting */
2041
    for (s = input + offset; (s - input) < length; s += wlen) {
2042
        wlen = *s++;
2043
        if (wlen == 0 || (s + wlen - input) > length)
2044
            return BUFFER_ERROR;
2045
    }
2046
2047
    if (isRequest) {
2048
        /* keep the list sent by peer, if this is from a request. We
2049
         * use it later in ALPN_Select() for evaluation. */
2050
        if (ssl->alpn_peer_requested != NULL) {
2051
            XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
2052
            ssl->alpn_peer_requested_length = 0;
2053
        }
2054
        ssl->alpn_peer_requested = (byte *)XMALLOC(size, ssl->heap,
2055
                                                   DYNAMIC_TYPE_ALPN);
2056
        if (ssl->alpn_peer_requested == NULL) {
2057
            return MEMORY_ERROR;
2058
        }
2059
        ssl->alpn_peer_requested_length = size;
2060
        XMEMCPY(ssl->alpn_peer_requested, (char*)input + offset, size);
2061
    }
2062
    else {
2063
        /* a response, we should find the value in our config */
2064
        const byte *sel = NULL;
2065
        byte sel_len = 0;
2066
        TLSX *extension = NULL;
2067
2068
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len, input + offset, size);
2069
        if (r != 0)
2070
            return r;
2071
2072
        if (sel != NULL) {
2073
            /* set the matching negotiated protocol */
2074
            r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
2075
            if (r != WOLFSSL_SUCCESS) {
2076
                WOLFSSL_MSG("TLSX_SetALPN failed");
2077
                return BUFFER_ERROR;
2078
            }
2079
        }
2080
        /* If we had nothing configured, the response is unexpected */
2081
        else if (extension == NULL) {
2082
            r = TLSX_HandleUnsupportedExtension(ssl);
2083
            if (r != 0)
2084
                return r;
2085
        }
2086
    }
2087
    return 0;
2088
}
2089
2090
/** Add a protocol name to the list of accepted usable ones */
2091
int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
2092
                                                                     void* heap)
2093
{
2094
    ALPN *alpn;
2095
    TLSX *extension;
2096
    int  ret;
2097
2098
    if (extensions == NULL || data == NULL)
2099
        return BAD_FUNC_ARG;
2100
2101
    alpn = TLSX_ALPN_New((char *)data, size, heap);
2102
    if (alpn == NULL) {
2103
        WOLFSSL_MSG("Memory failure");
2104
        return MEMORY_E;
2105
    }
2106
2107
    /* Set Options of ALPN */
2108
    alpn->options = options;
2109
2110
    extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2111
    if (extension == NULL) {
2112
        ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
2113
                                                             (void*)alpn, heap);
2114
        if (ret != 0) {
2115
            TLSX_ALPN_Free(alpn, heap);
2116
            return ret;
2117
        }
2118
    }
2119
    else {
2120
        /* push new ALPN object to extension data. */
2121
        alpn->next = (ALPN*)extension->data;
2122
        extension->data = (void*)alpn;
2123
    }
2124
2125
    return WOLFSSL_SUCCESS;
2126
}
2127
2128
/** Get the protocol name set by the server */
2129
int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
2130
{
2131
    TLSX *extension;
2132
    ALPN *alpn;
2133
2134
    if (extensions == NULL || data == NULL || dataSz == NULL)
2135
        return BAD_FUNC_ARG;
2136
2137
    *data = NULL;
2138
    *dataSz = 0;
2139
2140
    extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2141
    if (extension == NULL) {
2142
        WOLFSSL_MSG("TLS extension not found");
2143
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2144
        return WOLFSSL_ALPN_NOT_FOUND;
2145
    }
2146
2147
    alpn = (ALPN *)extension->data;
2148
    if (alpn == NULL) {
2149
        WOLFSSL_MSG("ALPN extension not found");
2150
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2151
        return WOLFSSL_FATAL_ERROR;
2152
    }
2153
2154
    if (alpn->negotiated != 1) {
2155
2156
        /* consider as an error */
2157
        if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
2158
            WOLFSSL_MSG("No protocol match with peer -> Failed");
2159
            WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2160
            return WOLFSSL_FATAL_ERROR;
2161
        }
2162
2163
        /* continue without negotiated protocol */
2164
        WOLFSSL_MSG("No protocol match with peer -> Continue");
2165
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2166
        return WOLFSSL_ALPN_NOT_FOUND;
2167
    }
2168
2169
    if (alpn->next != NULL) {
2170
        WOLFSSL_MSG("Only one protocol name must be accepted");
2171
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2172
        return WOLFSSL_FATAL_ERROR;
2173
    }
2174
2175
    *data = alpn->protocol_name;
2176
    *dataSz = (word16)XSTRLEN((char*)*data);
2177
2178
    return WOLFSSL_SUCCESS;
2179
}
2180
2181
#define ALPN_FREE_ALL     TLSX_ALPN_FreeAll
2182
#define ALPN_GET_SIZE     TLSX_ALPN_GetSize
2183
#define ALPN_WRITE        TLSX_ALPN_Write
2184
#define ALPN_PARSE        TLSX_ALPN_ParseAndSet
2185
2186
#else /* HAVE_ALPN */
2187
2188
0
#define ALPN_FREE_ALL(list, heap) WC_DO_NOTHING
2189
0
#define ALPN_GET_SIZE(list)     0
2190
#define ALPN_WRITE(a, b)        0
2191
0
#define ALPN_PARSE(a, b, c, d)  0
2192
2193
#endif /* HAVE_ALPN */
2194
2195
/******************************************************************************/
2196
/* Server Name Indication                                                     */
2197
/******************************************************************************/
2198
2199
#ifdef HAVE_SNI
2200
2201
/** Creates a new SNI object. */
2202
static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
2203
28
{
2204
28
    SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
2205
2206
28
    (void)heap;
2207
2208
28
    if (sni) {
2209
28
        sni->type = type;
2210
28
        sni->next = NULL;
2211
2212
28
    #ifndef NO_WOLFSSL_SERVER
2213
28
        sni->options = 0;
2214
28
        sni->status  = WOLFSSL_SNI_NO_MATCH;
2215
28
    #endif
2216
2217
28
        switch (sni->type) {
2218
28
            case WOLFSSL_SNI_HOST_NAME:
2219
28
                sni->data.host_name = (char*)XMALLOC(size + 1, heap,
2220
28
                                                     DYNAMIC_TYPE_TLSX);
2221
28
                if (sni->data.host_name) {
2222
28
                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
2223
28
                    sni->data.host_name[size] = '\0';
2224
28
                } else {
2225
0
                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2226
0
                    sni = NULL;
2227
0
                }
2228
28
            break;
2229
2230
0
            default: /* invalid type */
2231
0
                XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2232
0
                sni = NULL;
2233
28
        }
2234
28
    }
2235
2236
28
    return sni;
2237
28
}
2238
2239
/** Releases a SNI object. */
2240
static void TLSX_SNI_Free(SNI* sni, void* heap)
2241
0
{
2242
0
    if (sni) {
2243
0
        switch (sni->type) {
2244
0
            case WOLFSSL_SNI_HOST_NAME:
2245
0
                XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
2246
0
            break;
2247
0
        }
2248
2249
0
        XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2250
0
    }
2251
0
    (void)heap;
2252
0
}
2253
2254
/** Releases all SNI objects in the provided list. */
2255
static void TLSX_SNI_FreeAll(SNI* list, void* heap)
2256
0
{
2257
0
    SNI* sni;
2258
2259
0
    while ((sni = list)) {
2260
0
        list = sni->next;
2261
0
        TLSX_SNI_Free(sni, heap);
2262
0
    }
2263
0
}
2264
2265
/** Tells the buffered size of the SNI objects in a list. */
2266
WOLFSSL_TEST_VIS word16 TLSX_SNI_GetSize(SNI* list)
2267
15.1k
{
2268
15.1k
    SNI* sni;
2269
15.1k
    word32 length = OPAQUE16_LEN; /* list length */
2270
2271
30.2k
    while ((sni = list)) {
2272
15.1k
        list = sni->next;
2273
2274
15.1k
        length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
2275
2276
15.1k
        switch (sni->type) {
2277
15.1k
            case WOLFSSL_SNI_HOST_NAME:
2278
15.1k
                length += (word32)XSTRLEN((char*)sni->data.host_name);
2279
15.1k
            break;
2280
15.1k
        }
2281
2282
15.1k
        if (length > WOLFSSL_MAX_16BIT) {
2283
0
            return 0;
2284
0
        }
2285
15.1k
    }
2286
2287
15.1k
    return (word16)length;
2288
15.1k
}
2289
2290
/** Writes the SNI objects of a list in a buffer. */
2291
static word16 TLSX_SNI_Write(SNI* list, byte* output)
2292
13.1k
{
2293
13.1k
    SNI* sni;
2294
13.1k
    word16 length = 0;
2295
13.1k
    word16 offset = OPAQUE16_LEN; /* list length offset */
2296
2297
26.3k
    while ((sni = list)) {
2298
13.1k
        list = sni->next;
2299
2300
13.1k
        output[offset++] = sni->type; /* sni type */
2301
2302
13.1k
        switch (sni->type) {
2303
13.1k
            case WOLFSSL_SNI_HOST_NAME:
2304
13.1k
                length = (word16)XSTRLEN((char*)sni->data.host_name);
2305
2306
13.1k
                c16toa(length, output + offset); /* sni length */
2307
13.1k
                offset += OPAQUE16_LEN;
2308
2309
13.1k
                XMEMCPY(output + offset, sni->data.host_name, length);
2310
2311
13.1k
                offset += length;
2312
13.1k
            break;
2313
13.1k
        }
2314
13.1k
    }
2315
2316
13.1k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2317
2318
13.1k
    return offset;
2319
13.1k
}
2320
2321
/** Finds a SNI object in the provided list. */
2322
static SNI* TLSX_SNI_Find(SNI *list, byte type)
2323
60
{
2324
60
    SNI* sni = list;
2325
2326
60
    while (sni && sni->type != type)
2327
0
        sni = sni->next;
2328
2329
60
    return sni;
2330
60
}
2331
2332
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
2333
/** Sets the status of a SNI object. */
2334
static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
2335
60
{
2336
60
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2337
60
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2338
2339
60
    if (sni)
2340
0
        sni->status = status;
2341
60
}
2342
#endif
2343
2344
/** Gets the status of a SNI object. */
2345
byte TLSX_SNI_Status(TLSX* extensions, byte type)
2346
0
{
2347
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2348
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2349
2350
0
    if (sni)
2351
0
        return sni->status;
2352
2353
0
    return 0;
2354
0
}
2355
2356
/** Parses a buffer of SNI extensions. */
2357
static int TLSX_SNI_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2358
                          byte isRequest)
2359
684
{
2360
684
#ifndef NO_WOLFSSL_SERVER
2361
684
    word16 size = 0;
2362
684
    word16 offset = 0;
2363
684
    int cacheOnly = 0;
2364
684
    SNI *sni = NULL;
2365
684
    byte type;
2366
684
    byte matched;
2367
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2368
    TLSX* echX = NULL;
2369
    WOLFSSL_ECH* ech = NULL;
2370
    WOLFSSL_EchConfig* workingConfig;
2371
    word16 privateNameLen;
2372
#endif
2373
684
#endif /* !NO_WOLFSSL_SERVER */
2374
684
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
2375
2376
684
    if (!extension)
2377
684
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2378
2379
684
    if (!isRequest) {
2380
67
        #ifndef NO_WOLFSSL_CLIENT
2381
67
            if (!extension || !extension->data)
2382
0
                return TLSX_HandleUnsupportedExtension(ssl);
2383
2384
67
            if (length > 0)
2385
7
                return BUFFER_ERROR; /* SNI response MUST be empty. */
2386
2387
            /* This call enables wolfSSL_SNI_GetRequest() to be called in the
2388
             * client side to fetch the used SNI. It will only work if the SNI
2389
             * was set at the SSL object level. Right now we only support one
2390
             * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
2391
             * inclusion of other name types will turn this method inaccurate,
2392
             * as the extension response doesn't contains information of which
2393
             * name was accepted.
2394
             */
2395
60
            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
2396
60
                                                        WOLFSSL_SNI_REAL_MATCH);
2397
2398
60
            return 0;
2399
67
        #endif
2400
67
    }
2401
2402
617
#ifndef NO_WOLFSSL_SERVER
2403
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2404
    if (!ssl->options.disableECH) {
2405
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
2406
        if (echX != NULL) {
2407
            ech = (WOLFSSL_ECH*)(echX->data);
2408
        }
2409
    }
2410
#endif
2411
2412
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2413
    if ((!extension || !extension->data) ||
2414
            (ech != NULL && ech->sniState == ECH_INNER_SNI &&
2415
             ech->privateName == NULL)) {
2416
#else
2417
617
    if (!extension || !extension->data) {
2418
617
#endif
2419
        /* This will keep SNI even though TLSX_UseSNI has not been called.
2420
         * Enable it so that the received sni is available to functions
2421
         * that use a custom callback when SNI is received.
2422
         */
2423
    #ifdef WOLFSSL_ALWAYS_KEEP_SNI
2424
        cacheOnly = 1;
2425
    #endif
2426
617
        if (ssl->ctx->sniRecvCb) {
2427
0
            cacheOnly = 1;
2428
0
        }
2429
2430
617
        if (cacheOnly) {
2431
0
            WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
2432
0
        }
2433
617
        else {
2434
            /* Skipping, SNI not enabled at server side. */
2435
617
            return 0;
2436
617
        }
2437
617
    }
2438
2439
0
    if (OPAQUE16_LEN > length)
2440
0
        return BUFFER_ERROR;
2441
2442
0
    ato16(input, &size);
2443
0
    offset += OPAQUE16_LEN;
2444
2445
    /* validating sni list length */
2446
0
    if (length != OPAQUE16_LEN + size || size == 0)
2447
0
        return BUFFER_ERROR;
2448
2449
    /* SNI was badly specified and only one type is now recognized and allowed.
2450
     * Only one SNI value per type (RFC6066), so, no loop. */
2451
0
    type = input[offset++];
2452
0
    if (type != WOLFSSL_SNI_HOST_NAME)
2453
0
        return BUFFER_ERROR;
2454
2455
0
    if (offset + OPAQUE16_LEN > length)
2456
0
        return BUFFER_ERROR;
2457
0
    ato16(input + offset, &size);
2458
0
    offset += OPAQUE16_LEN;
2459
2460
0
    if (offset + size != length || size == 0)
2461
0
        return BUFFER_ERROR;
2462
2463
0
    if (!cacheOnly && !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
2464
0
        return 0; /* not using this type of SNI. */
2465
2466
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2467
    if (ech != NULL && ech->sniState == ECH_INNER_SNI){
2468
        /* SNI status is carried over from processing the outer hello so it is
2469
         * necessary to clear it before processing the inner hello */
2470
        ech->sniState = ECH_INNER_SNI_ATTEMPT;
2471
        if (sni != NULL){
2472
            sni->status = WOLFSSL_SNI_NO_MATCH;
2473
        }
2474
    }
2475
    else if (ech != NULL && ech->sniState == ECH_OUTER_SNI &&
2476
            ech->privateName == NULL && sni != NULL){
2477
        /* save the private SNI before it is overwritten by the public SNI */
2478
        privateNameLen = (word16)XSTRLEN(sni->data.host_name) + 1;
2479
        ech->privateName = (char*)XMALLOC(privateNameLen, ssl->heap,
2480
            DYNAMIC_TYPE_TMP_BUFFER);
2481
        if (ech->privateName == NULL)
2482
            return MEMORY_E;
2483
        XMEMCPY((char*)ech->privateName, sni->data.host_name,
2484
            privateNameLen);
2485
    }
2486
#endif
2487
2488
0
#if defined(WOLFSSL_TLS13)
2489
    /* Don't process the second ClientHello SNI extension if there
2490
     * was problems with the first.
2491
     */
2492
0
    if (!cacheOnly && sni != NULL && sni->status != WOLFSSL_SNI_NO_MATCH)
2493
0
        return 0;
2494
0
#endif
2495
2496
#if defined(HAVE_ECH)
2497
    if (ech != NULL && ech->sniState == ECH_INNER_SNI_ATTEMPT &&
2498
            ech->privateName != NULL) {
2499
        matched = cacheOnly || (XSTRLEN(ech->privateName) == size &&
2500
            XSTRNCMP(ech->privateName, (const char*)input + offset, size) == 0);
2501
    }
2502
    else
2503
#endif
2504
0
    {
2505
0
        const char* hostName = (sni != NULL) ? sni->data.host_name : NULL;
2506
0
        matched = cacheOnly || (hostName != NULL &&
2507
0
            XSTRLEN(hostName) == size &&
2508
0
            XSTRNCMP(hostName, (const char*)input + offset, size) == 0);
2509
0
    }
2510
2511
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2512
    if (!matched && ech != NULL && ech->sniState == ECH_OUTER_SNI) {
2513
        workingConfig = ech->echConfig;
2514
        while (workingConfig != NULL) {
2515
            matched = XSTRLEN(workingConfig->publicName) == size &&
2516
                XSTRNCMP(workingConfig->publicName,
2517
                (const char*)input + offset, size) == 0;
2518
2519
            if (matched)
2520
                break;
2521
2522
            workingConfig = workingConfig->next;
2523
        }
2524
    }
2525
#endif
2526
2527
0
    if (matched ||
2528
0
            (sni != NULL && (sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH))) {
2529
0
        int matchStat;
2530
0
        int r = TLSX_UseSNI(&ssl->extensions, type, input + offset, size,
2531
0
                                                                     ssl->heap);
2532
2533
0
        if (r != WOLFSSL_SUCCESS)
2534
0
            return r; /* throws error. */
2535
2536
0
        if (cacheOnly) {
2537
0
            WOLFSSL_MSG("Forcing storage of SNI, Fake match");
2538
0
            matchStat = WOLFSSL_SNI_FORCE_KEEP;
2539
0
        }
2540
0
        else if (matched) {
2541
0
            WOLFSSL_MSG("SNI did match!");
2542
0
            matchStat = WOLFSSL_SNI_REAL_MATCH;
2543
0
        }
2544
0
        else {
2545
0
            WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
2546
0
            matchStat = WOLFSSL_SNI_FAKE_MATCH;
2547
0
        }
2548
2549
0
        TLSX_SNI_SetStatus(ssl->extensions, type, (byte)matchStat);
2550
2551
0
        if (!cacheOnly)
2552
0
            TLSX_SetResponse(ssl, TLSX_SERVER_NAME);
2553
0
    }
2554
0
    else if ((sni == NULL) ||
2555
0
            !(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
2556
0
        SendAlert(ssl, alert_fatal, unrecognized_name);
2557
0
        WOLFSSL_ERROR_VERBOSE(UNKNOWN_SNI_HOST_NAME_E);
2558
0
        return UNKNOWN_SNI_HOST_NAME_E;
2559
0
    }
2560
#else
2561
    (void)input;
2562
#endif /* !NO_WOLFSSL_SERVER */
2563
2564
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
2565
    (void)length;
2566
#endif
2567
2568
0
    return 0;
2569
0
}
2570
2571
static int TLSX_SNI_VerifyParse(WOLFSSL* ssl,  byte isRequest)
2572
9.54k
{
2573
9.54k
    (void)ssl;
2574
2575
9.54k
    if (isRequest) {
2576
3.97k
    #ifndef NO_WOLFSSL_SERVER
2577
3.97k
        TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2578
3.97k
        TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
2579
3.97k
        SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
2580
3.97k
        SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
2581
3.97k
        SNI* sni = NULL;
2582
2583
3.97k
        for (; ctx_sni; ctx_sni = ctx_sni->next) {
2584
0
            if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2585
0
                sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
2586
2587
0
                if (sni) {
2588
0
                    if (sni->status != WOLFSSL_SNI_NO_MATCH)
2589
0
                        continue;
2590
2591
                    /* if ssl level overrides ctx level, it is ok. */
2592
0
                    if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
2593
0
                        continue;
2594
0
                }
2595
2596
0
                SendAlert(ssl, alert_fatal, handshake_failure);
2597
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2598
0
                return SNI_ABSENT_ERROR;
2599
0
            }
2600
0
        }
2601
2602
3.97k
        for (; ssl_sni; ssl_sni = ssl_sni->next) {
2603
0
            if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2604
0
                if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
2605
0
                    continue;
2606
2607
0
                SendAlert(ssl, alert_fatal, handshake_failure);
2608
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2609
0
                return SNI_ABSENT_ERROR;
2610
0
            }
2611
0
        }
2612
3.97k
    #endif /* NO_WOLFSSL_SERVER */
2613
3.97k
    }
2614
2615
9.54k
    return 0;
2616
9.54k
}
2617
2618
int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
2619
                                                                     void* heap)
2620
28
{
2621
28
    TLSX* extension;
2622
28
    SNI* sni = NULL;
2623
2624
28
    if (extensions == NULL || data == NULL)
2625
0
        return BAD_FUNC_ARG;
2626
2627
28
    if ((type == WOLFSSL_SNI_HOST_NAME) && (size >= WOLFSSL_HOST_NAME_MAX))
2628
0
        return BAD_LENGTH_E;
2629
2630
28
    if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
2631
0
        return MEMORY_E;
2632
2633
28
    extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
2634
28
    if (!extension) {
2635
28
        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
2636
2637
28
        if (ret != 0) {
2638
0
            TLSX_SNI_Free(sni, heap);
2639
0
            return ret;
2640
0
        }
2641
28
    }
2642
0
    else {
2643
        /* push new SNI object to extension data. */
2644
0
        sni->next = (SNI*)extension->data;
2645
0
        extension->data = (void*)sni;
2646
2647
        /* remove duplicate SNI, there should be only one of each type. */
2648
0
        do {
2649
0
            if (sni->next && sni->next->type == type) {
2650
0
                SNI* next = sni->next;
2651
2652
0
                sni->next = next->next;
2653
0
                TLSX_SNI_Free(next, heap);
2654
2655
                /* there is no way to occur more than
2656
                 * two SNIs of the same type.
2657
                 */
2658
0
                break;
2659
0
            }
2660
0
        } while ((sni = sni->next));
2661
0
    }
2662
2663
28
    return WOLFSSL_SUCCESS;
2664
28
}
2665
2666
#ifndef NO_WOLFSSL_SERVER
2667
2668
/** Tells the SNI requested by the client. */
2669
word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data,
2670
        byte ignoreStatus)
2671
0
{
2672
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2673
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2674
2675
0
    if (sni && (ignoreStatus || sni->status != WOLFSSL_SNI_NO_MATCH)) {
2676
0
        switch (sni->type) {
2677
0
            case WOLFSSL_SNI_HOST_NAME:
2678
0
                if (data) {
2679
0
                    *data = sni->data.host_name;
2680
0
                    return (word16)XSTRLEN((char*)*data);
2681
0
                }
2682
0
        }
2683
0
    }
2684
2685
0
    return 0;
2686
0
}
2687
2688
/** Sets the options for a SNI object. */
2689
void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
2690
0
{
2691
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2692
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2693
2694
0
    if (sni)
2695
0
        sni->options = options;
2696
0
}
2697
2698
/** Retrieves a SNI request from a client hello buffer. */
2699
int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
2700
                           byte type, byte* sni, word32* inOutSz)
2701
0
{
2702
0
    word32 offset = 0;
2703
0
    word32 len32 = 0;
2704
0
    word16 len16 = 0;
2705
2706
0
    if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
2707
0
        return INCOMPLETE_DATA;
2708
2709
    /* TLS record header */
2710
0
    if ((enum ContentType) clientHello[offset++] != handshake) {
2711
2712
        /* checking for SSLv2.0 client hello according to: */
2713
        /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
2714
0
        if ((enum HandShakeType) clientHello[++offset] == client_hello) {
2715
0
            offset += ENUM_LEN + VERSION_SZ; /* skip version */
2716
2717
0
            ato16(clientHello + offset, &len16);
2718
0
            offset += OPAQUE16_LEN;
2719
2720
0
            if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
2721
0
                return BUFFER_ERROR;
2722
2723
0
            ato16(clientHello + offset, &len16);
2724
            /* Returning SNI_UNSUPPORTED do not increment offset here */
2725
2726
0
            if (len16 != 0) /* session_id_length must be 0 */
2727
0
                return BUFFER_ERROR;
2728
2729
0
            WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2730
0
            return SNI_UNSUPPORTED;
2731
0
        }
2732
2733
0
        return BUFFER_ERROR;
2734
0
    }
2735
2736
0
    if (clientHello[offset++] != SSLv3_MAJOR)
2737
0
        return BUFFER_ERROR;
2738
2739
0
    if (clientHello[offset++] < TLSv1_MINOR) {
2740
0
        WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2741
0
        return SNI_UNSUPPORTED;
2742
0
    }
2743
2744
0
    ato16(clientHello + offset, &len16);
2745
0
    offset += OPAQUE16_LEN;
2746
2747
0
    if (offset + len16 > helloSz)
2748
0
        return INCOMPLETE_DATA;
2749
2750
    /* Handshake header */
2751
0
    if ((enum HandShakeType) clientHello[offset] != client_hello)
2752
0
        return BUFFER_ERROR;
2753
2754
0
    c24to32(clientHello + offset + 1, &len32);
2755
0
    offset += HANDSHAKE_HEADER_SZ;
2756
2757
0
    if (offset + len32 > helloSz)
2758
0
        return BUFFER_ERROR;
2759
2760
    /* client hello */
2761
0
    offset += VERSION_SZ + RAN_LEN; /* version, random */
2762
2763
0
    if (helloSz < offset + clientHello[offset])
2764
0
        return BUFFER_ERROR;
2765
2766
0
    offset += ENUM_LEN + clientHello[offset]; /* skip session id */
2767
2768
    /* cypher suites */
2769
0
    if (helloSz < offset + OPAQUE16_LEN)
2770
0
        return BUFFER_ERROR;
2771
2772
0
    ato16(clientHello + offset, &len16);
2773
0
    offset += OPAQUE16_LEN;
2774
2775
0
    if (helloSz < offset + len16)
2776
0
        return BUFFER_ERROR;
2777
2778
0
    offset += len16; /* skip cypher suites */
2779
2780
    /* compression methods */
2781
0
    if (helloSz < offset + 1)
2782
0
        return BUFFER_ERROR;
2783
2784
0
    if (helloSz < offset + clientHello[offset])
2785
0
        return BUFFER_ERROR;
2786
2787
0
    offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
2788
2789
    /* extensions */
2790
0
    if (helloSz < offset + OPAQUE16_LEN)
2791
0
        return 0; /* no extensions in client hello. */
2792
2793
0
    ato16(clientHello + offset, &len16);
2794
0
    offset += OPAQUE16_LEN;
2795
2796
0
    if (helloSz < offset + len16)
2797
0
        return BUFFER_ERROR;
2798
2799
0
    while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
2800
0
        word16 extType;
2801
0
        word16 extLen;
2802
2803
0
        ato16(clientHello + offset, &extType);
2804
0
        offset += OPAQUE16_LEN;
2805
2806
0
        ato16(clientHello + offset, &extLen);
2807
0
        offset += OPAQUE16_LEN;
2808
2809
0
        if (helloSz < offset + extLen)
2810
0
            return BUFFER_ERROR;
2811
2812
0
        if (extType != TLSX_SERVER_NAME) {
2813
0
            offset += extLen; /* skip extension */
2814
0
        } else {
2815
0
            word16 listLen;
2816
2817
0
            if (extLen < OPAQUE16_LEN)
2818
0
                return BUFFER_ERROR;
2819
2820
0
            ato16(clientHello + offset, &listLen);
2821
0
            offset += OPAQUE16_LEN;
2822
2823
0
            if (helloSz < offset + listLen)
2824
0
                return BUFFER_ERROR;
2825
2826
0
            while (listLen > ENUM_LEN + OPAQUE16_LEN) {
2827
0
                byte   sniType = clientHello[offset++];
2828
0
                word16 sniLen;
2829
2830
0
                ato16(clientHello + offset, &sniLen);
2831
0
                offset += OPAQUE16_LEN;
2832
2833
0
                if (helloSz < offset + sniLen)
2834
0
                    return BUFFER_ERROR;
2835
2836
0
                if (sniType != type) {
2837
0
                    offset  += sniLen;
2838
0
                    listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
2839
0
                    continue;
2840
0
                }
2841
2842
0
                *inOutSz = min(sniLen, *inOutSz);
2843
0
                XMEMCPY(sni, clientHello + offset, *inOutSz);
2844
2845
0
                return WOLFSSL_SUCCESS;
2846
0
            }
2847
0
        }
2848
2849
0
        len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
2850
0
    }
2851
2852
0
    return len16 ? BUFFER_ERROR : 0;
2853
0
}
2854
2855
#endif
2856
2857
0
#define SNI_FREE_ALL     TLSX_SNI_FreeAll
2858
0
#define SNI_GET_SIZE     TLSX_SNI_GetSize
2859
#define SNI_WRITE        TLSX_SNI_Write
2860
0
#define SNI_PARSE        TLSX_SNI_Parse
2861
0
#define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
2862
2863
#else
2864
2865
#define SNI_FREE_ALL(list, heap) WC_DO_NOTHING
2866
#define SNI_GET_SIZE(list)     0
2867
#define SNI_WRITE(a, b)        0
2868
#define SNI_PARSE(a, b, c, d)  0
2869
#define SNI_VERIFY_PARSE(a, b) 0
2870
2871
#endif /* HAVE_SNI */
2872
2873
/******************************************************************************/
2874
/* Trusted CA Key Indication                                                  */
2875
/******************************************************************************/
2876
2877
#ifdef HAVE_TRUSTED_CA
2878
2879
/** Creates a new TCA object. */
2880
static TCA* TLSX_TCA_New(byte type, const byte* id, word16 idSz, void* heap)
2881
{
2882
    TCA* tca = (TCA*)XMALLOC(sizeof(TCA), heap, DYNAMIC_TYPE_TLSX);
2883
2884
    if (tca) {
2885
        XMEMSET(tca, 0, sizeof(TCA));
2886
        tca->type = type;
2887
2888
        switch (type) {
2889
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2890
                break;
2891
2892
            #ifndef NO_SHA
2893
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2894
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2895
                if (idSz == WC_SHA_DIGEST_SIZE &&
2896
                        (tca->id =
2897
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2898
                    XMEMCPY(tca->id, id, idSz);
2899
                    tca->idSz = idSz;
2900
                }
2901
                else {
2902
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2903
                    tca = NULL;
2904
                }
2905
                break;
2906
            #endif
2907
2908
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2909
                if (idSz > 0 &&
2910
                        (tca->id =
2911
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2912
                    XMEMCPY(tca->id, id, idSz);
2913
                    tca->idSz = idSz;
2914
                }
2915
                else {
2916
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2917
                    tca = NULL;
2918
                }
2919
                break;
2920
2921
            default: /* invalid type */
2922
                XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2923
                tca = NULL;
2924
        }
2925
    }
2926
2927
    (void)heap;
2928
2929
    return tca;
2930
}
2931
2932
/** Releases a TCA object. */
2933
static void TLSX_TCA_Free(TCA* tca, void* heap)
2934
{
2935
    (void)heap;
2936
2937
    if (tca) {
2938
        XFREE(tca->id, heap, DYNAMIC_TYPE_TLSX);
2939
        XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2940
    }
2941
}
2942
2943
/** Releases all TCA objects in the provided list. */
2944
static void TLSX_TCA_FreeAll(TCA* list, void* heap)
2945
{
2946
    TCA* tca;
2947
2948
    while ((tca = list)) {
2949
        list = tca->next;
2950
        TLSX_TCA_Free(tca, heap);
2951
    }
2952
}
2953
2954
/** Tells the buffered size of the TCA objects in a list. */
2955
static word16 TLSX_TCA_GetSize(TCA* list)
2956
{
2957
    TCA* tca;
2958
    word32 length = OPAQUE16_LEN; /* list length */
2959
2960
    while ((tca = list)) {
2961
        list = tca->next;
2962
2963
        length += ENUM_LEN; /* tca type */
2964
2965
        switch (tca->type) {
2966
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2967
                break;
2968
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2969
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2970
                length += tca->idSz;
2971
                break;
2972
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2973
                length += OPAQUE16_LEN + tca->idSz;
2974
                break;
2975
        }
2976
2977
        if (length > WOLFSSL_MAX_16BIT) {
2978
            return 0;
2979
        }
2980
    }
2981
2982
    return (word16)length;
2983
}
2984
2985
/** Writes the TCA objects of a list in a buffer. */
2986
static word16 TLSX_TCA_Write(TCA* list, byte* output)
2987
{
2988
    TCA* tca;
2989
    word16 offset = OPAQUE16_LEN; /* list length offset */
2990
2991
    while ((tca = list)) {
2992
        list = tca->next;
2993
2994
        output[offset++] = tca->type; /* tca type */
2995
2996
        switch (tca->type) {
2997
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2998
                break;
2999
            #ifndef NO_SHA
3000
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3001
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3002
                if (tca->id != NULL) {
3003
                    XMEMCPY(output + offset, tca->id, tca->idSz);
3004
                    offset += tca->idSz;
3005
                }
3006
                else {
3007
                    /* ID missing. Set to an empty string. */
3008
                    c16toa(0, output + offset);
3009
                    offset += OPAQUE16_LEN;
3010
                }
3011
                break;
3012
            #endif
3013
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3014
                if (tca->id != NULL) {
3015
                    c16toa(tca->idSz, output + offset); /* tca length */
3016
                    offset += OPAQUE16_LEN;
3017
                    XMEMCPY(output + offset, tca->id, tca->idSz);
3018
                    offset += tca->idSz;
3019
                }
3020
                else {
3021
                    /* ID missing. Set to an empty string. */
3022
                    c16toa(0, output + offset);
3023
                    offset += OPAQUE16_LEN;
3024
                }
3025
                break;
3026
            default:
3027
                /* ID unknown. Set to an empty string. */
3028
                c16toa(0, output + offset);
3029
                offset += OPAQUE16_LEN;
3030
        }
3031
    }
3032
3033
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
3034
3035
    return offset;
3036
}
3037
3038
#ifndef NO_WOLFSSL_SERVER
3039
static TCA* TLSX_TCA_Find(TCA *list, byte type, const byte* id, word16 idSz)
3040
{
3041
    TCA* tca = list;
3042
3043
    while (tca) {
3044
        if (type == WOLFSSL_TRUSTED_CA_PRE_AGREED)
3045
            break;
3046
        if (tca->type == type && idSz == tca->idSz &&
3047
                XMEMCMP(id, tca->id, idSz) == 0)
3048
            break;
3049
        tca = tca->next;
3050
    }
3051
3052
    return tca;
3053
}
3054
#endif /* NO_WOLFSSL_SERVER */
3055
3056
/** Parses a buffer of TCA extensions. */
3057
static int TLSX_TCA_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3058
                          byte isRequest)
3059
{
3060
#ifndef NO_WOLFSSL_SERVER
3061
    word16 size = 0;
3062
    word16 offset = 0;
3063
#endif
3064
3065
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
3066
3067
    if (!extension)
3068
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_TRUSTED_CA_KEYS);
3069
3070
    if (!isRequest) {
3071
        #ifndef NO_WOLFSSL_CLIENT
3072
            if (!extension || !extension->data)
3073
                return TLSX_HandleUnsupportedExtension(ssl);
3074
3075
            if (length > 0)
3076
                return BUFFER_ERROR; /* TCA response MUST be empty. */
3077
3078
            /* Set the flag that we're good for keys */
3079
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
3080
3081
            return 0;
3082
        #endif
3083
    }
3084
3085
#ifndef NO_WOLFSSL_SERVER
3086
    if (!extension || !extension->data) {
3087
        /* Skipping, TCA not enabled at server side. */
3088
        return 0;
3089
    }
3090
3091
    if (OPAQUE16_LEN > length)
3092
        return BUFFER_ERROR;
3093
3094
    ato16(input, &size);
3095
    offset += OPAQUE16_LEN;
3096
3097
    /* validating tca list length */
3098
    if (length != OPAQUE16_LEN + size)
3099
        return BUFFER_ERROR;
3100
3101
    for (size = 0; offset < length; offset += size) {
3102
        TCA *tca = NULL;
3103
        byte type;
3104
        const byte* id = NULL;
3105
        word16 idSz = 0;
3106
3107
        if (offset + ENUM_LEN > length)
3108
            return BUFFER_ERROR;
3109
3110
        type = input[offset++];
3111
3112
        switch (type) {
3113
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
3114
                break;
3115
            #ifndef NO_SHA
3116
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
3117
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
3118
                if (offset + WC_SHA_DIGEST_SIZE > length)
3119
                    return BUFFER_ERROR;
3120
                idSz = WC_SHA_DIGEST_SIZE;
3121
                id = input + offset;
3122
                offset += idSz;
3123
                break;
3124
            #endif
3125
            case WOLFSSL_TRUSTED_CA_X509_NAME:
3126
                if (offset + OPAQUE16_LEN > length)
3127
                    return BUFFER_ERROR;
3128
                ato16(input + offset, &idSz);
3129
                offset += OPAQUE16_LEN;
3130
                if ((offset > length) || (idSz > length - offset))
3131
                    return BUFFER_ERROR;
3132
                id = input + offset;
3133
                offset += idSz;
3134
                break;
3135
            default:
3136
                WOLFSSL_ERROR_VERBOSE(TCA_INVALID_ID_TYPE);
3137
                return TCA_INVALID_ID_TYPE;
3138
        }
3139
3140
        /* Find the type/ID in the TCA list. */
3141
        tca = TLSX_TCA_Find((TCA*)extension->data, type, id, idSz);
3142
        if (tca != NULL) {
3143
            /* Found it. Set the response flag and break out of the loop. */
3144
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
3145
            break;
3146
        }
3147
    }
3148
#else
3149
    (void)input;
3150
#endif
3151
3152
    return 0;
3153
}
3154
3155
/* Checks to see if the server sent a response for the TCA. */
3156
static int TLSX_TCA_VerifyParse(WOLFSSL* ssl, byte isRequest)
3157
{
3158
    (void)ssl;
3159
3160
    if (!isRequest) {
3161
        /* RFC 6066 section 6 states that the server responding
3162
         * to trusted_ca_keys is optional.  Do not error out unless
3163
         * opted into with the define WOLFSSL_REQUIRE_TCA. */
3164
    #if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_REQUIRE_TCA)
3165
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
3166
3167
        if (extension && !extension->resp) {
3168
            SendAlert(ssl, alert_fatal, handshake_failure);
3169
            WOLFSSL_ERROR_VERBOSE(TCA_ABSENT_ERROR);
3170
            return TCA_ABSENT_ERROR;
3171
        }
3172
    #else
3173
        WOLFSSL_MSG("No response received for trusted_ca_keys.  Continuing.");
3174
    #endif /* !NO_WOLFSSL_CLIENT && WOLFSSL_REQUIRE_TCA */
3175
    }
3176
3177
    return 0;
3178
}
3179
3180
int TLSX_UseTrustedCA(TLSX** extensions, byte type,
3181
                    const byte* id, word16 idSz, void* heap)
3182
{
3183
    TLSX* extension;
3184
    TCA* tca = NULL;
3185
3186
    if (extensions == NULL)
3187
        return BAD_FUNC_ARG;
3188
3189
    if ((tca = TLSX_TCA_New(type, id, idSz, heap)) == NULL)
3190
        return MEMORY_E;
3191
3192
    extension = TLSX_Find(*extensions, TLSX_TRUSTED_CA_KEYS);
3193
    if (!extension) {
3194
        int ret = TLSX_Push(extensions, TLSX_TRUSTED_CA_KEYS, (void*)tca, heap);
3195
3196
        if (ret != 0) {
3197
            TLSX_TCA_Free(tca, heap);
3198
            return ret;
3199
        }
3200
    }
3201
    else {
3202
        /* push new TCA object to extension data. */
3203
        tca->next = (TCA*)extension->data;
3204
        extension->data = (void*)tca;
3205
    }
3206
3207
    return WOLFSSL_SUCCESS;
3208
}
3209
3210
#define TCA_FREE_ALL     TLSX_TCA_FreeAll
3211
#define TCA_GET_SIZE     TLSX_TCA_GetSize
3212
#define TCA_WRITE        TLSX_TCA_Write
3213
#define TCA_PARSE        TLSX_TCA_Parse
3214
#define TCA_VERIFY_PARSE TLSX_TCA_VerifyParse
3215
3216
#else /* HAVE_TRUSTED_CA */
3217
3218
0
#define TCA_FREE_ALL(list, heap) WC_DO_NOTHING
3219
0
#define TCA_GET_SIZE(list)     0
3220
#define TCA_WRITE(a, b)        0
3221
0
#define TCA_PARSE(a, b, c, d)  0
3222
0
#define TCA_VERIFY_PARSE(a, b) 0
3223
3224
#endif /* HAVE_TRUSTED_CA */
3225
3226
/******************************************************************************/
3227
/* Max Fragment Length Negotiation                                            */
3228
/******************************************************************************/
3229
3230
#ifdef HAVE_MAX_FRAGMENT
3231
3232
static word16 TLSX_MFL_Write(byte* data, byte* output)
3233
{
3234
    output[0] = data[0];
3235
3236
    return ENUM_LEN;
3237
}
3238
3239
static int TLSX_MFL_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3240
                          byte isRequest)
3241
{
3242
    if (length != ENUM_LEN)
3243
        return BUFFER_ERROR;
3244
3245
#ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3246
    (void) isRequest;
3247
#else
3248
    if (!isRequest)
3249
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
3250
            return TLSX_HandleUnsupportedExtension(ssl);
3251
#endif
3252
3253
    switch (*input) {
3254
        case WOLFSSL_MFL_2_8 : ssl->max_fragment =  256; break;
3255
        case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
3256
        case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
3257
        case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
3258
        case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
3259
        case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
3260
3261
        default:
3262
            SendAlert(ssl, alert_fatal, illegal_parameter);
3263
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
3264
            return UNKNOWN_MAX_FRAG_LEN_E;
3265
    }
3266
    if (ssl->session != NULL) {
3267
        ssl->session->mfl = *input;
3268
    }
3269
3270
#ifndef NO_WOLFSSL_SERVER
3271
    if (isRequest) {
3272
        int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
3273
3274
        if (ret != WOLFSSL_SUCCESS)
3275
            return ret; /* throw error */
3276
3277
        TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
3278
    }
3279
#endif
3280
3281
    return 0;
3282
}
3283
3284
int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
3285
{
3286
    byte* data = NULL;
3287
    int ret = 0;
3288
3289
    if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
3290
        return BAD_FUNC_ARG;
3291
3292
    data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
3293
    if (data == NULL)
3294
        return MEMORY_E;
3295
3296
    data[0] = mfl;
3297
3298
    ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
3299
    if (ret != 0) {
3300
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
3301
        return ret;
3302
    }
3303
3304
    return WOLFSSL_SUCCESS;
3305
}
3306
3307
3308
#define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
3309
#define MFL_GET_SIZE(data) ENUM_LEN
3310
#define MFL_WRITE          TLSX_MFL_Write
3311
#define MFL_PARSE          TLSX_MFL_Parse
3312
3313
#else
3314
3315
0
#define MFL_FREE_ALL(a, b) WC_DO_NOTHING
3316
0
#define MFL_GET_SIZE(a)       0
3317
#define MFL_WRITE(a, b)       0
3318
0
#define MFL_PARSE(a, b, c, d) 0
3319
3320
#endif /* HAVE_MAX_FRAGMENT */
3321
3322
/******************************************************************************/
3323
/* Truncated HMAC                                                             */
3324
/******************************************************************************/
3325
3326
#ifdef HAVE_TRUNCATED_HMAC
3327
3328
static int TLSX_THM_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3329
                          byte isRequest)
3330
{
3331
    if (length != 0 || input == NULL)
3332
        return BUFFER_ERROR;
3333
3334
    if (!isRequest) {
3335
    #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3336
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
3337
            return TLSX_HandleUnsupportedExtension(ssl);
3338
    #endif
3339
    }
3340
    else {
3341
        #ifndef NO_WOLFSSL_SERVER
3342
            int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
3343
3344
            if (ret != WOLFSSL_SUCCESS)
3345
                return ret; /* throw error */
3346
3347
            TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
3348
        #endif
3349
    }
3350
3351
    ssl->truncated_hmac = 1;
3352
3353
    return 0;
3354
}
3355
3356
int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
3357
{
3358
    int ret = 0;
3359
3360
    if (extensions == NULL)
3361
        return BAD_FUNC_ARG;
3362
3363
    ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
3364
    if (ret != 0)
3365
        return ret;
3366
3367
    return WOLFSSL_SUCCESS;
3368
}
3369
3370
#define THM_PARSE TLSX_THM_Parse
3371
3372
#else
3373
3374
0
#define THM_PARSE(a, b, c, d) 0
3375
3376
#endif /* HAVE_TRUNCATED_HMAC */
3377
3378
/******************************************************************************/
3379
/* Certificate Status Request                                                 */
3380
/******************************************************************************/
3381
3382
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3383
3384
static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
3385
{
3386
    int i;
3387
3388
    switch (csr->status_type) {
3389
        case WOLFSSL_CSR_OCSP:
3390
            for (i = 0; i <= csr->requests; i++) {
3391
                FreeOcspRequest(&csr->request.ocsp[i]);
3392
            }
3393
        break;
3394
    }
3395
#ifdef WOLFSSL_TLS13
3396
    for (i = 0; i < MAX_CERT_EXTENSIONS; i++) {
3397
        if (csr->responses[i].buffer != NULL) {
3398
            XFREE(csr->responses[i].buffer, heap,
3399
                DYNAMIC_TYPE_TMP_BUFFER);
3400
        }
3401
    }
3402
#endif
3403
    XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3404
    (void)heap;
3405
}
3406
3407
word16 TLSX_CSR_GetSize_ex(CertificateStatusRequest* csr, byte isRequest,
3408
                                                             int idx)
3409
{
3410
    word32 size = 0;
3411
3412
    /* shut up compiler warnings */
3413
    (void) csr; (void) isRequest;
3414
#ifndef NO_WOLFSSL_CLIENT
3415
    if (isRequest) {
3416
        switch (csr->status_type) {
3417
            case WOLFSSL_CSR_OCSP:
3418
                size += ENUM_LEN + 2 * OPAQUE16_LEN;
3419
3420
                if (csr->request.ocsp[0].nonceSz)
3421
                    size += OCSP_NONCE_EXT_SZ;
3422
            break;
3423
        }
3424
    }
3425
#endif
3426
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3427
    if (!isRequest && IsAtLeastTLSv1_3(csr->ssl->version)) {
3428
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3429
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3430
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3431
            if (WOLFSSL_MAX_16BIT - OPAQUE8_LEN - OPAQUE24_LEN <
3432
                    csr->ssl->ocspCsrResp[idx].length) {
3433
                return 0;
3434
            }
3435
            size = OPAQUE8_LEN + OPAQUE24_LEN +
3436
                    csr->ssl->ocspCsrResp[idx].length;
3437
            return (word16)size;
3438
        }
3439
        if (WOLFSSL_MAX_16BIT - OPAQUE8_LEN - OPAQUE24_LEN <
3440
                csr->responses[idx].length) {
3441
            return 0;
3442
        }
3443
        size = OPAQUE8_LEN + OPAQUE24_LEN + csr->responses[idx].length;
3444
        return (word16)size;
3445
    }
3446
#else
3447
    (void)idx;
3448
#endif
3449
    return (word16)size;
3450
}
3451
3452
#if (defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER))
3453
int TLSX_CSR_SetResponseWithStatusCB(WOLFSSL *ssl)
3454
{
3455
    WOLFSSL_OCSP *ocsp;
3456
    int ret;
3457
3458
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3459
        return BAD_FUNC_ARG;
3460
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3461
    if (ocsp == NULL || ocsp->statusCb == NULL)
3462
        return BAD_FUNC_ARG;
3463
    ret = ocsp->statusCb(ssl, ocsp->statusCbArg);
3464
    switch (ret) {
3465
        case WOLFSSL_OCSP_STATUS_CB_OK: {
3466
            size_t i;
3467
            for (i = 0; i < XELEM_CNT(ssl->ocspCsrResp); i++) {
3468
                if (ssl->ocspCsrResp[i].length > 0) {
3469
                    /* ack the extension, status cb provided the response in
3470
                     * ssl->ocspCsrResp */
3471
                    TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3472
                    ssl->status_request = WOLFSSL_CSR_OCSP;
3473
                    break;
3474
                }
3475
            }
3476
            ret = 0;
3477
            break;
3478
        }
3479
        case WOLFSSL_OCSP_STATUS_CB_NOACK:
3480
            /* suppressing as not critical */
3481
            ret = 0;
3482
            break;
3483
        case WOLFSSL_OCSP_STATUS_CB_ALERT_FATAL:
3484
        default:
3485
            ret = WOLFSSL_FATAL_ERROR;
3486
            break;
3487
    }
3488
    return ret;
3489
}
3490
3491
static int TLSX_CSR_WriteWithStatusCB(CertificateStatusRequest* csr,
3492
    byte* output, int idx)
3493
{
3494
    WOLFSSL *ssl = csr->ssl;
3495
    WOLFSSL_OCSP *ocsp;
3496
    word16 offset = 0;
3497
    byte *response;
3498
    int respSz;
3499
3500
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3501
        return BAD_FUNC_ARG;
3502
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3503
    if (ocsp == NULL || ocsp->statusCb == NULL)
3504
        return BAD_FUNC_ARG;
3505
    response = ssl->ocspCsrResp[idx].buffer;
3506
    respSz = ssl->ocspCsrResp[idx].length;
3507
    if (response == NULL || respSz == 0)
3508
        return BAD_FUNC_ARG;
3509
    output[offset++] = WOLFSSL_CSR_OCSP;
3510
    c32to24(respSz, output + offset);
3511
    offset += OPAQUE24_LEN;
3512
    XMEMCPY(output + offset, response, respSz);
3513
    return offset + respSz;
3514
}
3515
#endif /* (TLS13 && !NO_WOLFSLL_SERVER) */
3516
3517
static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
3518
{
3519
    return TLSX_CSR_GetSize_ex(csr, isRequest, 0);
3520
}
3521
3522
int TLSX_CSR_Write_ex(CertificateStatusRequest* csr, byte* output,
3523
                          byte isRequest, int idx)
3524
{
3525
    /* shut up compiler warnings */
3526
    (void) csr; (void) output; (void) isRequest;
3527
3528
#ifndef NO_WOLFSSL_CLIENT
3529
    if (isRequest) {
3530
        int ret = 0;
3531
        word16 offset = 0;
3532
        word16 length = 0;
3533
3534
        /* type */
3535
        output[offset++] = csr->status_type;
3536
3537
        switch (csr->status_type) {
3538
            case WOLFSSL_CSR_OCSP:
3539
                /* responder id list */
3540
                c16toa(0, output + offset);
3541
                offset += OPAQUE16_LEN;
3542
3543
                /* request extensions */
3544
                if (csr->request.ocsp[0].nonceSz) {
3545
                    ret = (int)EncodeOcspRequestExtensions(&csr->request.ocsp[0],
3546
                                                 output + offset + OPAQUE16_LEN,
3547
                                                 OCSP_NONCE_EXT_SZ);
3548
3549
                    if (ret > 0) {
3550
                        length = (word16)ret;
3551
                    }
3552
                    else {
3553
                        return ret;
3554
                    }
3555
                }
3556
3557
                c16toa(length, output + offset);
3558
                offset += OPAQUE16_LEN + length;
3559
3560
            break;
3561
        }
3562
3563
        return (int)offset;
3564
    }
3565
#endif
3566
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3567
    if (!isRequest && IsAtLeastTLSv1_3(csr->ssl->version)) {
3568
        word16 offset = 0;
3569
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3570
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3571
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3572
            return TLSX_CSR_WriteWithStatusCB(csr, output, idx);
3573
        }
3574
        output[offset++] = csr->status_type;
3575
        c32to24(csr->responses[idx].length, output + offset);
3576
        offset += OPAQUE24_LEN;
3577
        XMEMCPY(output + offset, csr->responses[idx].buffer,
3578
                                        csr->responses[idx].length);
3579
        offset += (word16)csr->responses[idx].length;
3580
        return offset;
3581
    }
3582
#else
3583
    (void)idx;
3584
#endif
3585
3586
    return 0;
3587
}
3588
3589
static int TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
3590
                          byte isRequest)
3591
{
3592
    return TLSX_CSR_Write_ex(csr, output, isRequest, 0);
3593
}
3594
3595
#if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
3596
    defined(WOLFSSL_TLS_OCSP_MULTI)
3597
/* Process OCSP request certificate chain
3598
 *
3599
 * ssl       SSL/TLS object.
3600
 * returns 0 on success, otherwise failure.
3601
 */
3602
int ProcessChainOCSPRequest(WOLFSSL* ssl)
3603
{
3604
    DecodedCert* cert;
3605
    OcspRequest* request;
3606
    TLSX* extension;
3607
    CertificateStatusRequest* csr;
3608
    DerBuffer* chain;
3609
    word32 pos = 0;
3610
    buffer der;
3611
    int i = 1;
3612
    int ret = 0;
3613
    byte ctxOwnsRequest = 0;
3614
3615
    /* use certChain if available, otherwise use peer certificate */
3616
    chain = ssl->buffers.certChain;
3617
    if (chain == NULL) {
3618
        chain = ssl->buffers.certificate;
3619
    }
3620
3621
    extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3622
    csr = extension ?
3623
                (CertificateStatusRequest*)extension->data : NULL;
3624
    if (csr == NULL)
3625
        return MEMORY_ERROR;
3626
3627
    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
3628
                                         DYNAMIC_TYPE_DCERT);
3629
    if (cert == NULL) {
3630
        return MEMORY_E;
3631
    }
3632
3633
    if (chain && chain->buffer) {
3634
        while (ret == 0 && pos + OPAQUE24_LEN < chain->length) {
3635
            if (i >= MAX_CERT_EXTENSIONS) {
3636
                WOLFSSL_MSG_EX(
3637
                    "OCSP request cert chain exceeds maximum length: "
3638
                    "i=%d, MAX_CERT_EXTENSIONS=%d", i, MAX_CERT_EXTENSIONS);
3639
                ret = MAX_CERT_EXTENSIONS_ERR;
3640
                break;
3641
            }
3642
3643
            c24to32(chain->buffer + pos, &der.length);
3644
            pos += OPAQUE24_LEN;
3645
            der.buffer = chain->buffer + pos;
3646
            pos += der.length;
3647
3648
            if (pos > chain->length)
3649
                break;
3650
            request = &csr->request.ocsp[i];
3651
            if (ret == 0) {
3652
                ret = CreateOcspRequest(ssl, request, cert,
3653
                        der.buffer, der.length, &ctxOwnsRequest);
3654
                if (ctxOwnsRequest) {
3655
                    wolfSSL_Mutex* ocspLock =
3656
                        &SSL_CM(ssl)->ocsp_stapling->ocspLock;
3657
                    if (wc_LockMutex(ocspLock) == 0) {
3658
                        /* the request is ours */
3659
                        ssl->ctx->certOcspRequest = NULL;
3660
                    }
3661
                    wc_UnLockMutex(ocspLock);
3662
                }
3663
            }
3664
3665
            if (ret == 0) {
3666
                request->ssl = ssl;
3667
                ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
3668
                                 request, &csr->responses[i], ssl->heap);
3669
                /* Suppressing soft-fail responder errors. OCSP_CERT_REVOKED
3670
                 * is an explicit positive assertion of revocation and must
3671
                 * not be ignored. */
3672
                if (ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) ||
3673
                    ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL)) {
3674
                    ret = 0;
3675
                }
3676
                i++;
3677
                csr->requests++;
3678
            }
3679
        }
3680
    }
3681
    XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3682
3683
    return ret;
3684
}
3685
#endif
3686
3687
static int TLSX_CSR_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3688
                          byte isRequest)
3689
{
3690
    int ret;
3691
#if !defined(NO_WOLFSSL_SERVER)
3692
    byte status_type;
3693
    word16 size = 0;
3694
#endif
3695
3696
#if !defined(NO_WOLFSSL_CLIENT)
3697
    OcspRequest* request;
3698
    TLSX* extension;
3699
    CertificateStatusRequest* csr;
3700
#endif
3701
3702
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
3703
 || !defined(NO_WOLFSSL_SERVER)
3704
    word32 offset = 0;
3705
#endif
3706
3707
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
3708
    word32 resp_length = 0;
3709
#endif
3710
3711
    /* shut up compiler warnings */
3712
    (void) ssl; (void) input;
3713
3714
    if (!isRequest) {
3715
#ifndef NO_WOLFSSL_CLIENT
3716
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3717
        csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3718
3719
        if (!csr) {
3720
            /* look at context level */
3721
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
3722
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3723
3724
            if (!csr) /* unexpected extension */
3725
                return TLSX_HandleUnsupportedExtension(ssl);
3726
3727
            /* enable extension at ssl level */
3728
            ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
3729
                                     csr->status_type, csr->options, ssl,
3730
                                     ssl->heap, ssl->devId);
3731
            if (ret != WOLFSSL_SUCCESS)
3732
                return ret == 0 ? -1 : ret;
3733
3734
            switch (csr->status_type) {
3735
                case WOLFSSL_CSR_OCSP:
3736
                    /* propagate nonce */
3737
                    if (csr->request.ocsp[0].nonceSz) {
3738
                        request =
3739
                            (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
3740
3741
                        if (request) {
3742
                            XMEMCPY(request->nonce, csr->request.ocsp[0].nonce,
3743
                                        (size_t)csr->request.ocsp[0].nonceSz);
3744
                            request->nonceSz = csr->request.ocsp[0].nonceSz;
3745
                        }
3746
                    }
3747
                break;
3748
            }
3749
        }
3750
3751
        ssl->status_request = 1;
3752
3753
    #ifdef WOLFSSL_TLS13
3754
        if (ssl->options.tls1_3) {
3755
            /* Get the new extension potentially created above. */
3756
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3757
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3758
            if (csr == NULL)
3759
                return MEMORY_ERROR;
3760
3761
            ret = 0;
3762
            if (OPAQUE8_LEN + OPAQUE24_LEN > length)
3763
                ret = BUFFER_ERROR;
3764
            if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP) {
3765
                ret = BAD_CERTIFICATE_STATUS_ERROR;
3766
                WOLFSSL_ERROR_VERBOSE(ret);
3767
            }
3768
            if (ret == 0) {
3769
                c24to32(input + offset, &resp_length);
3770
                offset += OPAQUE24_LEN;
3771
                if (offset + resp_length != length)
3772
                    ret = BUFFER_ERROR;
3773
            }
3774
            if (ret == 0) {
3775
                if (ssl->response_idx < (1 + MAX_CHAIN_DEPTH))
3776
                    csr->responses[ssl->response_idx].buffer =
3777
                    (byte*)XMALLOC(resp_length, ssl->heap,
3778
                        DYNAMIC_TYPE_TMP_BUFFER);
3779
                else
3780
                    ret = BAD_FUNC_ARG;
3781
3782
                if (ret == 0 &&
3783
                        csr->responses[ssl->response_idx].buffer == NULL)
3784
                    ret = MEMORY_ERROR;
3785
            }
3786
            if (ret == 0) {
3787
                XMEMCPY(csr->responses[ssl->response_idx].buffer,
3788
                                            input + offset, resp_length);
3789
                csr->responses[ssl->response_idx].length = resp_length;
3790
            }
3791
3792
            return ret;
3793
        }
3794
        else
3795
    #endif
3796
        {
3797
            /* extension_data MUST be empty. */
3798
            return length ? BUFFER_ERROR : 0;
3799
        }
3800
#endif
3801
    }
3802
    else {
3803
#ifndef NO_WOLFSSL_SERVER
3804
        if (length == 0)
3805
            return 0;
3806
3807
        status_type = input[offset++];
3808
3809
        switch (status_type) {
3810
            case WOLFSSL_CSR_OCSP: {
3811
3812
                /* skip responder_id_list */
3813
                if ((int)(length - offset) < OPAQUE16_LEN)
3814
                    return BUFFER_ERROR;
3815
3816
                ato16(input + offset, &size);
3817
                offset += OPAQUE16_LEN + size;
3818
3819
                /* skip request_extensions */
3820
                if ((int)(length - offset) < OPAQUE16_LEN)
3821
                    return BUFFER_ERROR;
3822
3823
                ato16(input + offset, &size);
3824
                offset += OPAQUE16_LEN + size;
3825
3826
                if (offset > length)
3827
                    return BUFFER_ERROR;
3828
3829
                /* is able to send OCSP response? */
3830
                if (SSL_CM(ssl) == NULL || !SSL_CM(ssl)->ocspStaplingEnabled)
3831
                    return 0;
3832
            }
3833
            break;
3834
3835
            /* unknown status type */
3836
            default:
3837
                return 0;
3838
        }
3839
3840
        /* if using status_request and already sending it, skip this one */
3841
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3842
        if (ssl->status_request_v2)
3843
            return 0;
3844
        #endif
3845
3846
        /* accept the first good status_type and return */
3847
        ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
3848
                                                 0, ssl, ssl->heap, ssl->devId);
3849
        if (ret != WOLFSSL_SUCCESS)
3850
            return ret == 0 ? -1 : ret; /* throw error */
3851
3852
        TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3853
        ssl->status_request = status_type;
3854
#endif
3855
    }
3856
3857
    return 0;
3858
}
3859
3860
int TLSX_CSR_InitRequest_ex(TLSX* extensions, DecodedCert* cert,
3861
                                                            void* heap, int idx)
3862
{
3863
     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3864
    CertificateStatusRequest* csr = extension ?
3865
        (CertificateStatusRequest*)extension->data : NULL;
3866
    int ret = 0;
3867
3868
    if (csr) {
3869
        switch (csr->status_type) {
3870
            case WOLFSSL_CSR_OCSP: {
3871
                byte nonce[MAX_OCSP_NONCE_SZ];
3872
                int  req_cnt = idx == -1 ? csr->requests : idx;
3873
                int  nonceSz = csr->request.ocsp[0].nonceSz;
3874
                OcspRequest* request;
3875
3876
                request = &csr->request.ocsp[req_cnt];
3877
                if (request->serial != NULL) {
3878
                    /* clear request contents before reuse */
3879
                    FreeOcspRequest(request);
3880
                    if (csr->requests > 0)
3881
                        csr->requests--;
3882
                }
3883
                /* preserve nonce */
3884
                XMEMCPY(nonce, csr->request.ocsp->nonce, (size_t)nonceSz);
3885
3886
                if (req_cnt < MAX_CERT_EXTENSIONS) {
3887
                    if ((ret = InitOcspRequest(request, cert, 0, heap)) != 0)
3888
                        return ret;
3889
3890
                    /* restore nonce */
3891
                    XMEMCPY(csr->request.ocsp->nonce, nonce, (size_t)nonceSz);
3892
                    request->nonceSz = nonceSz;
3893
                    csr->requests++;
3894
                }
3895
                else {
3896
                    WOLFSSL_ERROR_VERBOSE(MAX_CERT_EXTENSIONS_ERR);
3897
                    return MAX_CERT_EXTENSIONS_ERR;
3898
                }
3899
            }
3900
            break;
3901
        }
3902
    }
3903
3904
    return ret;
3905
}
3906
3907
int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
3908
{
3909
    return TLSX_CSR_InitRequest_ex(extensions, cert, heap, -1);
3910
}
3911
3912
void* TLSX_CSR_GetRequest_ex(TLSX* extensions, int idx)
3913
{
3914
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3915
    CertificateStatusRequest* csr = extension ?
3916
                              (CertificateStatusRequest*)extension->data : NULL;
3917
3918
    if (csr && csr->ssl) {
3919
        switch (csr->status_type) {
3920
            case WOLFSSL_CSR_OCSP:
3921
                if (IsAtLeastTLSv1_3(csr->ssl->version)) {
3922
                    return idx < csr->requests ? &csr->request.ocsp[idx] : NULL;
3923
                }
3924
                else {
3925
                    return idx == 0 ? &csr->request.ocsp[0] : NULL;
3926
                }
3927
        }
3928
    }
3929
3930
    return NULL;
3931
}
3932
3933
void* TLSX_CSR_GetRequest(TLSX* extensions)
3934
{
3935
    return TLSX_CSR_GetRequest_ex(extensions, 0);
3936
}
3937
3938
int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
3939
{
3940
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3941
    CertificateStatusRequest* csr = extension ?
3942
                              (CertificateStatusRequest*)extension->data : NULL;
3943
3944
    if (csr) {
3945
        switch (csr->status_type) {
3946
            case WOLFSSL_CSR_OCSP:
3947
                if (SSL_CM(ssl)->ocspEnabled) {
3948
                    csr->request.ocsp[0].ssl = ssl;
3949
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
3950
                                              &csr->request.ocsp[0], NULL, NULL);
3951
                }
3952
                else {
3953
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
3954
                    return OCSP_LOOKUP_FAIL;
3955
                }
3956
        }
3957
    }
3958
3959
    return 0;
3960
}
3961
3962
int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
3963
                                         byte options, WOLFSSL* ssl, void* heap,
3964
                                                                      int devId)
3965
{
3966
    CertificateStatusRequest* csr = NULL;
3967
    int ret = 0;
3968
3969
    if (!extensions || status_type != WOLFSSL_CSR_OCSP)
3970
        return BAD_FUNC_ARG;
3971
3972
    csr = (CertificateStatusRequest*)
3973
             XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
3974
    if (!csr)
3975
        return MEMORY_E;
3976
3977
    ForceZero(csr, sizeof(CertificateStatusRequest));
3978
#if defined(WOLFSSL_TLS13)
3979
    XMEMSET(csr->responses, 0, sizeof(csr->responses));
3980
#endif
3981
    csr->status_type = status_type;
3982
    csr->options     = options;
3983
    csr->ssl         = ssl;
3984
3985
    switch (csr->status_type) {
3986
        case WOLFSSL_CSR_OCSP:
3987
            if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
3988
                WC_RNG rng;
3989
3990
            #ifndef HAVE_FIPS
3991
                ret = wc_InitRng_ex(&rng, heap, devId);
3992
            #else
3993
                ret = wc_InitRng(&rng);
3994
                (void)devId;
3995
            #endif
3996
                if (ret == 0) {
3997
                    if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp[0].nonce,
3998
                                                        MAX_OCSP_NONCE_SZ) == 0)
3999
                        csr->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4000
4001
                    wc_FreeRng(&rng);
4002
                }
4003
            }
4004
        break;
4005
    }
4006
4007
    if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
4008
        XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
4009
        return ret;
4010
    }
4011
4012
    return WOLFSSL_SUCCESS;
4013
}
4014
4015
#define CSR_FREE_ALL TLSX_CSR_Free
4016
#define CSR_GET_SIZE TLSX_CSR_GetSize
4017
#define CSR_WRITE    TLSX_CSR_Write
4018
#define CSR_PARSE    TLSX_CSR_Parse
4019
4020
#else
4021
4022
0
#define CSR_FREE_ALL(data, heap) WC_DO_NOTHING
4023
0
#define CSR_GET_SIZE(a, b)    0
4024
#define CSR_WRITE(a, b, c)    0
4025
0
#define CSR_PARSE(a, b, c, d) 0
4026
4027
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
4028
4029
/******************************************************************************/
4030
/* Certificate Status Request v2                                              */
4031
/******************************************************************************/
4032
4033
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
4034
4035
static void TLSX_CSR2_FreePendingSigners(Signer *s, void* heap)
4036
{
4037
    Signer* next;
4038
    while(s) {
4039
        next = s->next;
4040
        FreeSigner(s, heap);
4041
        s = next;
4042
    }
4043
}
4044
static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
4045
{
4046
    CertificateStatusRequestItemV2* next;
4047
4048
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, heap);
4049
    for (; csr2; csr2 = next) {
4050
        next = csr2->next;
4051
4052
        switch (csr2->status_type) {
4053
            case WOLFSSL_CSR2_OCSP:
4054
            case WOLFSSL_CSR2_OCSP_MULTI:
4055
                while(csr2->requests--)
4056
                    FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
4057
            break;
4058
        }
4059
4060
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4061
    }
4062
    (void)heap;
4063
}
4064
4065
static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
4066
                                                                 byte isRequest)
4067
{
4068
    word32 size = 0;
4069
4070
    /* shut up compiler warnings */
4071
    (void) csr2; (void) isRequest;
4072
4073
#ifndef NO_WOLFSSL_CLIENT
4074
    if (isRequest) {
4075
        CertificateStatusRequestItemV2* next;
4076
4077
        for (size = OPAQUE16_LEN; csr2; csr2 = next) {
4078
            next = csr2->next;
4079
4080
            switch (csr2->status_type) {
4081
                case WOLFSSL_CSR2_OCSP:
4082
                case WOLFSSL_CSR2_OCSP_MULTI:
4083
                    size += ENUM_LEN + 3 * OPAQUE16_LEN;
4084
4085
                    if (csr2->request.ocsp[0].nonceSz)
4086
                        size += OCSP_NONCE_EXT_SZ;
4087
                break;
4088
            }
4089
4090
            if (size > WOLFSSL_MAX_16BIT) {
4091
                return 0;
4092
            }
4093
        }
4094
    }
4095
#endif
4096
4097
    return (word16)size;
4098
}
4099
4100
static int TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
4101
                                                   byte* output, byte isRequest)
4102
{
4103
    /* shut up compiler warnings */
4104
    (void) csr2; (void) output; (void) isRequest;
4105
4106
#ifndef NO_WOLFSSL_CLIENT
4107
    if (isRequest) {
4108
        int ret = 0;
4109
        word16 offset;
4110
        word16 length;
4111
4112
        for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
4113
            /* status_type */
4114
            output[offset++] = csr2->status_type;
4115
4116
            /* request */
4117
            switch (csr2->status_type) {
4118
                case WOLFSSL_CSR2_OCSP:
4119
                case WOLFSSL_CSR2_OCSP_MULTI:
4120
                    /* request_length */
4121
                    length = 2 * OPAQUE16_LEN;
4122
4123
                    if (csr2->request.ocsp[0].nonceSz)
4124
                        length += OCSP_NONCE_EXT_SZ;
4125
4126
                    c16toa(length, output + offset);
4127
                    offset += OPAQUE16_LEN;
4128
4129
                    /* responder id list */
4130
                    c16toa(0, output + offset);
4131
                    offset += OPAQUE16_LEN;
4132
4133
                    /* request extensions */
4134
                    length = 0;
4135
4136
                    if (csr2->request.ocsp[0].nonceSz) {
4137
                        ret = (int)EncodeOcspRequestExtensions(
4138
                                                 &csr2->request.ocsp[0],
4139
                                                 output + offset + OPAQUE16_LEN,
4140
                                                 OCSP_NONCE_EXT_SZ);
4141
4142
                        if (ret > 0) {
4143
                            length = (word16)ret;
4144
                        }
4145
                        else {
4146
                            return ret;
4147
                        }
4148
                    }
4149
4150
                    c16toa(length, output + offset);
4151
                    offset += OPAQUE16_LEN + length;
4152
                break;
4153
            }
4154
        }
4155
4156
        /* list size */
4157
        c16toa(offset - OPAQUE16_LEN, output);
4158
4159
        return (int)offset;
4160
    }
4161
#endif
4162
4163
    return 0;
4164
}
4165
4166
static int TLSX_CSR2_Parse(WOLFSSL* ssl, const byte* input, word16 length,
4167
                           byte isRequest)
4168
{
4169
    int ret;
4170
4171
    /* shut up compiler warnings */
4172
    (void) ssl; (void) input;
4173
4174
    if (!isRequest) {
4175
#ifndef NO_WOLFSSL_CLIENT
4176
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4177
        CertificateStatusRequestItemV2* csr2 = extension ?
4178
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4179
4180
        if (!csr2) {
4181
            /* look at context level */
4182
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
4183
            csr2 = extension ?
4184
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4185
4186
            if (!csr2) /* unexpected extension */
4187
                return TLSX_HandleUnsupportedExtension(ssl);
4188
4189
            /* enable extension at ssl level */
4190
            for (; csr2; csr2 = csr2->next) {
4191
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4192
                                    csr2->status_type, csr2->options, ssl->heap,
4193
                                                                    ssl->devId);
4194
                if (ret != WOLFSSL_SUCCESS)
4195
                    return ret;
4196
4197
                switch (csr2->status_type) {
4198
                    case WOLFSSL_CSR2_OCSP:
4199
                        /* followed by */
4200
                    case WOLFSSL_CSR2_OCSP_MULTI:
4201
                        /* propagate nonce */
4202
                        if (csr2->request.ocsp[0].nonceSz) {
4203
                            OcspRequest* request =
4204
                             (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
4205
                                                          csr2->status_type, 0);
4206
4207
                            if (request) {
4208
                                XMEMCPY(request->nonce,
4209
                                        csr2->request.ocsp[0].nonce,
4210
                                        (size_t)csr2->request.ocsp[0].nonceSz);
4211
4212
                                request->nonceSz =
4213
                                                  csr2->request.ocsp[0].nonceSz;
4214
                            }
4215
                        }
4216
                    break;
4217
                }
4218
            }
4219
        }
4220
4221
        ssl->status_request_v2 = 1;
4222
4223
        return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
4224
#endif
4225
    }
4226
    else {
4227
#ifndef NO_WOLFSSL_SERVER
4228
        byte   status_type;
4229
        word16 request_length;
4230
        word16 offset = 0;
4231
        word16 size = 0;
4232
4233
        /* list size */
4234
        if (offset + OPAQUE16_LEN >= length) {
4235
            return BUFFER_E;
4236
        }
4237
4238
        ato16(input + offset, &request_length);
4239
        offset += OPAQUE16_LEN;
4240
4241
        if (length - OPAQUE16_LEN != request_length)
4242
            return BUFFER_ERROR;
4243
4244
        while (length > offset) {
4245
            if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
4246
                return BUFFER_ERROR;
4247
4248
            status_type = input[offset++];
4249
4250
            ato16(input + offset, &request_length);
4251
            offset += OPAQUE16_LEN;
4252
4253
            if (length - offset < request_length)
4254
                return BUFFER_ERROR;
4255
4256
            switch (status_type) {
4257
                case WOLFSSL_CSR2_OCSP:
4258
                case WOLFSSL_CSR2_OCSP_MULTI:
4259
                    /* skip responder_id_list */
4260
                    if ((int)(length - offset) < OPAQUE16_LEN)
4261
                        return BUFFER_ERROR;
4262
4263
                    ato16(input + offset, &size);
4264
                    if (length - offset - OPAQUE16_LEN < size)
4265
                        return BUFFER_ERROR;
4266
4267
                    offset += OPAQUE16_LEN + size;
4268
                    /* skip request_extensions */
4269
                    if ((int)(length - offset) < OPAQUE16_LEN)
4270
                        return BUFFER_ERROR;
4271
4272
                    ato16(input + offset, &size);
4273
                    if (length - offset < size)
4274
                        return BUFFER_ERROR;
4275
4276
                    offset += OPAQUE16_LEN + size;
4277
                    if (offset > length)
4278
                        return BUFFER_ERROR;
4279
4280
                    /* is able to send OCSP response? */
4281
                    if (SSL_CM(ssl) == NULL
4282
                    || !SSL_CM(ssl)->ocspStaplingEnabled)
4283
                        continue;
4284
                break;
4285
4286
                default:
4287
                    /* unknown status type, skipping! */
4288
                    offset += request_length;
4289
                    continue;
4290
            }
4291
4292
            /* if using status_request and already sending it, remove it
4293
             * and prefer to use the v2 version */
4294
            #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
4295
            if (ssl->status_request) {
4296
                ssl->status_request = 0;
4297
                TLSX_Remove(&ssl->extensions, TLSX_STATUS_REQUEST, ssl->heap);
4298
            }
4299
            #endif
4300
4301
            /* TLS 1.3 servers MUST NOT act upon presence or information in
4302
             * this extension (RFC 8448 Section 4.4.2.1).
4303
             */
4304
            if (!IsAtLeastTLSv1_3(ssl->version)) {
4305
                /* accept the first good status_type and return */
4306
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4307
                                         status_type, 0, ssl->heap, ssl->devId);
4308
                if (ret != WOLFSSL_SUCCESS)
4309
                    return ret; /* throw error */
4310
4311
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
4312
                ssl->status_request_v2 = status_type;
4313
            }
4314
4315
            return 0;
4316
        }
4317
#endif
4318
    }
4319
4320
    return 0;
4321
}
4322
4323
static CertificateStatusRequestItemV2* TLSX_CSR2_GetMulti(TLSX *extensions)
4324
{
4325
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4326
    CertificateStatusRequestItemV2* csr2 = extension ?
4327
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4328
4329
    for (; csr2; csr2 = csr2->next) {
4330
        if (csr2->status_type == WOLFSSL_CSR2_OCSP_MULTI)
4331
            return csr2;
4332
    }
4333
    return NULL;
4334
}
4335
4336
int TLSX_CSR2_IsMulti(TLSX *extensions)
4337
{
4338
    return TLSX_CSR2_GetMulti(extensions) != NULL;
4339
}
4340
4341
int TLSX_CSR2_AddPendingSigner(TLSX *extensions, Signer *s)
4342
{
4343
    CertificateStatusRequestItemV2* csr2;
4344
4345
    csr2 = TLSX_CSR2_GetMulti(extensions);
4346
    if (!csr2)
4347
        return WOLFSSL_FATAL_ERROR;
4348
4349
    s->next = csr2->pendingSigners;
4350
    csr2->pendingSigners = s;
4351
    return 0;
4352
}
4353
4354
Signer* TLSX_CSR2_GetPendingSigners(TLSX *extensions)
4355
{
4356
    CertificateStatusRequestItemV2* csr2;
4357
4358
    csr2 = TLSX_CSR2_GetMulti(extensions);
4359
    if (!csr2)
4360
        return NULL;
4361
4362
    return csr2->pendingSigners;
4363
}
4364
4365
int TLSX_CSR2_ClearPendingCA(WOLFSSL *ssl)
4366
{
4367
    CertificateStatusRequestItemV2* csr2;
4368
4369
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4370
    if (csr2 == NULL)
4371
        return 0;
4372
4373
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, SSL_CM(ssl)->heap);
4374
    csr2->pendingSigners = NULL;
4375
    return 0;
4376
}
4377
4378
int TLSX_CSR2_MergePendingCA(WOLFSSL* ssl)
4379
{
4380
    CertificateStatusRequestItemV2* csr2;
4381
    Signer *s, *next;
4382
    int r = 0;
4383
4384
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4385
    if (csr2 == NULL)
4386
        return 0;
4387
4388
    s = csr2->pendingSigners;
4389
    while (s != NULL) {
4390
        next = s->next;
4391
        r = AddSigner(SSL_CM(ssl), s);
4392
        if (r != 0)
4393
            FreeSigner(s, SSL_CM(ssl)->heap);
4394
        s = next;
4395
    }
4396
    csr2->pendingSigners = NULL;
4397
    return r;
4398
}
4399
4400
int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
4401
                                                                     void* heap)
4402
{
4403
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4404
    CertificateStatusRequestItemV2* csr2 = extension ?
4405
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4406
    int ret = 0;
4407
4408
    for (; csr2; csr2 = csr2->next) {
4409
        switch (csr2->status_type) {
4410
            case WOLFSSL_CSR2_OCSP:
4411
                if (!isPeer || csr2->requests != 0)
4412
                    break;
4413
4414
                FALL_THROUGH; /* followed by */
4415
4416
            case WOLFSSL_CSR2_OCSP_MULTI: {
4417
                if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
4418
                    byte nonce[MAX_OCSP_NONCE_SZ];
4419
                    int  nonceSz = csr2->request.ocsp[0].nonceSz;
4420
4421
                    /* preserve nonce, replicating nonce of ocsp[0] */
4422
                    XMEMCPY(nonce, csr2->request.ocsp[0].nonce,
4423
                    (size_t)nonceSz);
4424
4425
                    if ((ret = InitOcspRequest(
4426
                                      &csr2->request.ocsp[csr2->requests], cert,
4427
                                                                 0, heap)) != 0)
4428
                        return ret;
4429
4430
                    /* restore nonce */
4431
                    XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
4432
                                                        nonce, (size_t)nonceSz);
4433
                    csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
4434
                    csr2->requests++;
4435
                }
4436
            }
4437
            break;
4438
        }
4439
    }
4440
4441
    (void)cert;
4442
    return ret;
4443
}
4444
4445
void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
4446
{
4447
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4448
    CertificateStatusRequestItemV2* csr2 = extension ?
4449
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4450
4451
    for (; csr2; csr2 = csr2->next) {
4452
        if (csr2->status_type == status_type) {
4453
            switch (csr2->status_type) {
4454
                case WOLFSSL_CSR2_OCSP:
4455
                    /* followed by */
4456
4457
                case WOLFSSL_CSR2_OCSP_MULTI:
4458
                    /* requests are initialized in the reverse order */
4459
                    return idx < csr2->requests
4460
                         ? &csr2->request.ocsp[csr2->requests - idx - 1]
4461
                         : NULL;
4462
            }
4463
        }
4464
    }
4465
4466
    return NULL;
4467
}
4468
4469
int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
4470
{
4471
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4472
    CertificateStatusRequestItemV2* csr2 = extension ?
4473
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4474
4475
    /* forces only the first one */
4476
    if (csr2) {
4477
        switch (csr2->status_type) {
4478
            case WOLFSSL_CSR2_OCSP:
4479
                /* followed by */
4480
4481
            case WOLFSSL_CSR2_OCSP_MULTI:
4482
                if (SSL_CM(ssl)->ocspEnabled && csr2->requests >= 1) {
4483
                    csr2->request.ocsp[csr2->requests-1].ssl = ssl;
4484
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
4485
                                          &csr2->request.ocsp[csr2->requests-1], NULL, NULL);
4486
                }
4487
                else {
4488
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
4489
                    return OCSP_LOOKUP_FAIL;
4490
                }
4491
        }
4492
    }
4493
4494
    return 0;
4495
}
4496
4497
int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
4498
                                           byte options, void* heap, int devId)
4499
{
4500
    TLSX* extension = NULL;
4501
    CertificateStatusRequestItemV2* csr2 = NULL;
4502
    int ret = 0;
4503
4504
    if (!extensions)
4505
        return BAD_FUNC_ARG;
4506
4507
    if (status_type != WOLFSSL_CSR2_OCSP
4508
    &&  status_type != WOLFSSL_CSR2_OCSP_MULTI)
4509
        return BAD_FUNC_ARG;
4510
4511
    csr2 = (CertificateStatusRequestItemV2*)
4512
       XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
4513
    if (!csr2)
4514
        return MEMORY_E;
4515
4516
    ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
4517
4518
    csr2->status_type = status_type;
4519
    csr2->options     = options;
4520
    csr2->next        = NULL;
4521
4522
    switch (csr2->status_type) {
4523
        case WOLFSSL_CSR2_OCSP:
4524
        case WOLFSSL_CSR2_OCSP_MULTI:
4525
            if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
4526
                WC_RNG rng;
4527
4528
            #ifndef HAVE_FIPS
4529
                ret = wc_InitRng_ex(&rng, heap, devId);
4530
            #else
4531
                ret = wc_InitRng(&rng);
4532
                (void)devId;
4533
            #endif
4534
                if (ret == 0) {
4535
                    if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
4536
                                                        MAX_OCSP_NONCE_SZ) == 0)
4537
                        csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4538
4539
                    wc_FreeRng(&rng);
4540
                }
4541
            }
4542
        break;
4543
    }
4544
4545
    /* append new item */
4546
    if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
4547
        CertificateStatusRequestItemV2* last =
4548
                               (CertificateStatusRequestItemV2*)extension->data;
4549
4550
        if (last == NULL) {
4551
            XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4552
            return BAD_FUNC_ARG;
4553
        }
4554
4555
        for (; last->next; last = last->next);
4556
4557
        last->next = csr2;
4558
    }
4559
    else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
4560
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4561
        return ret;
4562
    }
4563
4564
    return WOLFSSL_SUCCESS;
4565
}
4566
4567
#define CSR2_FREE_ALL TLSX_CSR2_FreeAll
4568
#define CSR2_GET_SIZE TLSX_CSR2_GetSize
4569
#define CSR2_WRITE    TLSX_CSR2_Write
4570
#define CSR2_PARSE    TLSX_CSR2_Parse
4571
4572
#else
4573
4574
0
#define CSR2_FREE_ALL(data, heap) WC_DO_NOTHING
4575
0
#define CSR2_GET_SIZE(a, b)    0
4576
#define CSR2_WRITE(a, b, c)    0
4577
0
#define CSR2_PARSE(a, b, c, d) 0
4578
4579
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
4580
4581
#if defined(HAVE_SUPPORTED_CURVES) || \
4582
    (defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES))
4583
4584
/* Returns whether this group is supported.
4585
 *
4586
 * namedGroup  The named group to check.
4587
 * returns 1 when supported or 0 otherwise.
4588
 */
4589
int TLSX_IsGroupSupported(int namedGroup)
4590
{
4591
    switch (namedGroup) {
4592
    #ifdef HAVE_FFDHE_2048
4593
        case WOLFSSL_FFDHE_2048:
4594
            break;
4595
    #endif
4596
    #ifdef HAVE_FFDHE_3072
4597
        case WOLFSSL_FFDHE_3072:
4598
            break;
4599
    #endif
4600
    #ifdef HAVE_FFDHE_4096
4601
        case WOLFSSL_FFDHE_4096:
4602
            break;
4603
    #endif
4604
    #ifdef HAVE_FFDHE_6144
4605
        case WOLFSSL_FFDHE_6144:
4606
            break;
4607
    #endif
4608
    #ifdef HAVE_FFDHE_8192
4609
        case WOLFSSL_FFDHE_8192:
4610
            break;
4611
    #endif
4612
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4613
        #ifdef HAVE_ECC_KOBLITZ
4614
        case WOLFSSL_ECC_SECP256K1:
4615
            break;
4616
        #endif
4617
        #ifndef NO_ECC_SECP
4618
        case WOLFSSL_ECC_SECP256R1:
4619
            break;
4620
        #endif /* !NO_ECC_SECP */
4621
        #ifdef HAVE_ECC_BRAINPOOL
4622
        case WOLFSSL_ECC_BRAINPOOLP256R1:
4623
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
4624
            break;
4625
        #endif
4626
        #ifdef WOLFSSL_SM2
4627
        case WOLFSSL_ECC_SM2P256V1:
4628
            break;
4629
        #endif /* WOLFSSL_SM2 */
4630
    #endif
4631
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4632
        case WOLFSSL_ECC_X25519:
4633
            break;
4634
    #endif
4635
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4636
        case WOLFSSL_ECC_X448:
4637
            break;
4638
    #endif
4639
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
4640
        #ifndef NO_ECC_SECP
4641
        case WOLFSSL_ECC_SECP384R1:
4642
            break;
4643
        #endif /* !NO_ECC_SECP */
4644
        #ifdef HAVE_ECC_BRAINPOOL
4645
        case WOLFSSL_ECC_BRAINPOOLP384R1:
4646
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
4647
            break;
4648
        #endif
4649
    #endif
4650
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
4651
        #ifndef NO_ECC_SECP
4652
        case WOLFSSL_ECC_SECP521R1:
4653
            break;
4654
        #endif /* !NO_ECC_SECP */
4655
    #endif
4656
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
4657
        #ifdef HAVE_ECC_KOBLITZ
4658
        case WOLFSSL_ECC_SECP160K1:
4659
            break;
4660
        #endif
4661
        #ifndef NO_ECC_SECP
4662
        case WOLFSSL_ECC_SECP160R1:
4663
            break;
4664
        #endif
4665
        #ifdef HAVE_ECC_SECPR2
4666
        case WOLFSSL_ECC_SECP160R2:
4667
            break;
4668
        #endif
4669
    #endif
4670
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
4671
        #ifdef HAVE_ECC_KOBLITZ
4672
        case WOLFSSL_ECC_SECP192K1:
4673
            break;
4674
        #endif
4675
        #ifndef NO_ECC_SECP
4676
        case WOLFSSL_ECC_SECP192R1:
4677
            break;
4678
        #endif
4679
    #endif
4680
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
4681
        #ifdef HAVE_ECC_KOBLITZ
4682
        case WOLFSSL_ECC_SECP224K1:
4683
            break;
4684
        #endif
4685
        #ifndef NO_ECC_SECP
4686
        case WOLFSSL_ECC_SECP224R1:
4687
            break;
4688
        #endif
4689
    #endif
4690
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
4691
        #ifdef HAVE_ECC_BRAINPOOL
4692
        case WOLFSSL_ECC_BRAINPOOLP512R1:
4693
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
4694
            break;
4695
        #endif
4696
    #endif
4697
#ifdef WOLFSSL_HAVE_MLKEM
4698
#ifndef WOLFSSL_NO_ML_KEM
4699
        #ifndef WOLFSSL_NO_ML_KEM_512
4700
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4701
            case WOLFSSL_ML_KEM_512:
4702
                break;
4703
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4704
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4705
            case WOLFSSL_SECP256R1MLKEM512:
4706
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4707
            case WOLFSSL_X25519MLKEM512:
4708
            #endif /* HAVE_CURVE25519 */
4709
                break;
4710
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4711
        #endif /* WOLFSSL_NO_ML_KEM_512 */
4712
        #ifndef WOLFSSL_NO_ML_KEM_768
4713
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4714
            case WOLFSSL_ML_KEM_768:
4715
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4716
            #ifdef WOLFSSL_PQC_HYBRIDS
4717
            case WOLFSSL_SECP256R1MLKEM768:
4718
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4719
            case WOLFSSL_X25519MLKEM768:
4720
            #endif /* HAVE_CURVE25519 */
4721
            #endif /* WOLFSSL_PQC_HYBRIDS */
4722
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4723
            case WOLFSSL_SECP384R1MLKEM768:
4724
            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4725
            case WOLFSSL_X448MLKEM768:
4726
            #endif /* HAVE_CURVE448 */
4727
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4728
                break;
4729
        #endif /* WOLFSSL_NO_ML_KEM_768 */
4730
        #ifndef WOLFSSL_NO_ML_KEM_1024
4731
            #ifndef WOLFSSL_TLS_NO_MLKEM_STANDALONE
4732
            case WOLFSSL_ML_KEM_1024:
4733
            #endif /* !WOLFSSL_TLS_NO_MLKEM_STANDALONE */
4734
            #ifdef WOLFSSL_PQC_HYBRIDS
4735
            case WOLFSSL_SECP384R1MLKEM1024:
4736
            #endif /* WOLFSSL_PQC_HYBRIDS */
4737
            #ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
4738
            case WOLFSSL_SECP521R1MLKEM1024:
4739
            #endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
4740
                break;
4741
        #endif
4742
        #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
4743
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
4744
            case WOLFSSL_P256_ML_KEM_512_OLD:
4745
            case WOLFSSL_P384_ML_KEM_768_OLD:
4746
            case WOLFSSL_P521_ML_KEM_1024_OLD:
4747
                break;
4748
        #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
4749
#endif /* WOLFSSL_NO_ML_KEM */
4750
#ifdef WOLFSSL_MLKEM_KYBER
4751
        #ifdef WOLFSSL_KYBER512
4752
            case WOLFSSL_KYBER_LEVEL1:
4753
            case WOLFSSL_P256_KYBER_LEVEL1:
4754
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4755
            case WOLFSSL_X25519_KYBER_LEVEL1:
4756
        #endif
4757
        #endif
4758
        #ifdef WOLFSSL_KYBER768
4759
            case WOLFSSL_KYBER_LEVEL3:
4760
            case WOLFSSL_P384_KYBER_LEVEL3:
4761
            case WOLFSSL_P256_KYBER_LEVEL3:
4762
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4763
            case WOLFSSL_X25519_KYBER_LEVEL3:
4764
        #endif
4765
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4766
            case WOLFSSL_X448_KYBER_LEVEL3:
4767
        #endif
4768
        #endif
4769
        #ifdef WOLFSSL_KYBER1024
4770
            case WOLFSSL_KYBER_LEVEL5:
4771
            case WOLFSSL_P521_KYBER_LEVEL5:
4772
        #endif
4773
                break;
4774
#endif
4775
#endif /* WOLFSSL_HAVE_MLKEM */
4776
        default:
4777
            return 0;
4778
    }
4779
4780
    return 1;
4781
}
4782
#endif
4783
4784
/******************************************************************************/
4785
/* Supported Elliptic Curves                                                  */
4786
/******************************************************************************/
4787
4788
#ifdef HAVE_SUPPORTED_CURVES
4789
4790
#if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \
4791
                       && !defined(HAVE_FFDHE) && !defined(WOLFSSL_HAVE_MLKEM)
4792
#error Elliptic Curves Extension requires Elliptic Curve Cryptography or liboqs groups. \
4793
       Use --enable-ecc and/or --enable-liboqs in the configure script or \
4794
       define HAVE_ECC. Alternatively use FFDHE for DH cipher suites.
4795
#endif
4796
4797
static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
4798
                                                                     void* heap)
4799
274k
{
4800
274k
    if (curve == NULL)
4801
0
        return BAD_FUNC_ARG;
4802
4803
274k
    (void)heap;
4804
4805
274k
    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
4806
274k
                                                             DYNAMIC_TYPE_TLSX);
4807
274k
    if (*curve == NULL)
4808
4.55k
        return MEMORY_E;
4809
4810
269k
    (*curve)->name = name;
4811
269k
    (*curve)->next = NULL;
4812
4813
269k
    return 0;
4814
274k
}
4815
4816
static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
4817
11.0k
{
4818
11.0k
    if (point == NULL)
4819
0
        return BAD_FUNC_ARG;
4820
4821
11.0k
    (void)heap;
4822
4823
11.0k
    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
4824
11.0k
                                                             DYNAMIC_TYPE_TLSX);
4825
11.0k
    if (*point == NULL)
4826
0
        return MEMORY_E;
4827
4828
11.0k
    (*point)->format = format;
4829
11.0k
    (*point)->next = NULL;
4830
4831
11.0k
    return 0;
4832
11.0k
}
4833
4834
static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
4835
22.3k
{
4836
22.3k
    SupportedCurve* curve;
4837
4838
292k
    while ((curve = list)) {
4839
269k
        list = curve->next;
4840
269k
        XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
4841
269k
    }
4842
22.3k
    (void)heap;
4843
22.3k
}
4844
4845
static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
4846
11.0k
{
4847
11.0k
    PointFormat* point;
4848
4849
22.1k
    while ((point = list)) {
4850
11.0k
        list = point->next;
4851
11.0k
        XFREE(point, heap, DYNAMIC_TYPE_TLSX);
4852
11.0k
    }
4853
11.0k
    (void)heap;
4854
11.0k
}
4855
4856
static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
4857
                                                                     void* heap)
4858
253k
{
4859
253k
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
4860
4861
2.13M
    while (list) {
4862
2.13M
        if (list->name == name) {
4863
1.58k
            ret = 0; /* curve already in use */
4864
1.58k
            break;
4865
1.58k
        }
4866
4867
2.13M
        if (list->next == NULL) {
4868
251k
            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
4869
251k
            break;
4870
251k
        }
4871
4872
1.87M
        list = list->next;
4873
1.87M
    }
4874
4875
253k
    return ret;
4876
253k
}
4877
4878
static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
4879
0
{
4880
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
4881
4882
0
    while (list) {
4883
0
        if (list->format == format) {
4884
0
            ret = 0; /* format already in use */
4885
0
            break;
4886
0
        }
4887
4888
0
        if (list->next == NULL) {
4889
0
            ret = TLSX_PointFormat_New(&list->next, format, heap);
4890
0
            break;
4891
0
        }
4892
4893
0
        list = list->next;
4894
0
    }
4895
4896
0
    return ret;
4897
0
}
4898
4899
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
4900
4901
#if defined(HAVE_FFDHE) && (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4902
                                                         defined(HAVE_CURVE448))
4903
static void TLSX_SupportedCurve_ValidateRequest(const WOLFSSL* ssl,
4904
                                                const byte* semaphore)
4905
28.3k
{
4906
    /* If all pre-defined parameter types for key exchange are supported then
4907
     * always send SupportedGroups extension.
4908
     */
4909
28.3k
    (void)ssl;
4910
28.3k
    (void)semaphore;
4911
28.3k
}
4912
#else
4913
static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4914
{
4915
    word16 i;
4916
    const Suites* suites = WOLFSSL_SUITES(ssl);
4917
4918
    for (i = 0; i < suites->suiteSz; i += 2) {
4919
        if (suites->suites[i] == TLS13_BYTE)
4920
            return;
4921
    #ifdef BUILD_TLS_SM4_GCM_SM3
4922
        if ((suites->suites[i] == CIPHER_BYTE) &&
4923
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
4924
            return;
4925
    #endif
4926
    #ifdef BUILD_TLS_SM4_CCM_SM3
4927
        if ((suites->suites[i] == CIPHER_BYTE) &&
4928
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
4929
            return;
4930
    #endif
4931
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4932
        if ((suites->suites[i] == SM_BYTE) &&
4933
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4934
            return;
4935
    #endif
4936
        if ((suites->suites[i] == ECC_BYTE) ||
4937
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4938
            (suites->suites[i] == CHACHA_BYTE)) {
4939
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4940
                                                          defined(HAVE_CURVE448)
4941
            return;
4942
        #endif
4943
        }
4944
        #ifdef HAVE_FFDHE
4945
        else {
4946
            return;
4947
        }
4948
        #endif
4949
    }
4950
4951
    /* turns semaphore on to avoid sending this extension. */
4952
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
4953
}
4954
#endif
4955
4956
/* Only send PointFormats if TLSv13, ECC or CHACHA cipher suite present.
4957
 */
4958
static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4959
28.3k
{
4960
28.3k
#ifdef HAVE_FFDHE
4961
28.3k
    (void)ssl;
4962
28.3k
    (void)semaphore;
4963
#else
4964
    word16 i;
4965
    const Suites* suites = WOLFSSL_SUITES(ssl);
4966
4967
    if (suites == NULL)
4968
        return;
4969
4970
    for (i = 0; i < suites->suiteSz; i += 2) {
4971
        if (suites->suites[i] == TLS13_BYTE)
4972
            return;
4973
    #ifdef BUILD_TLS_SM4_GCM_SM3
4974
        if ((suites->suites[i] == CIPHER_BYTE) &&
4975
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
4976
            return;
4977
    #endif
4978
    #ifdef BUILD_TLS_SM4_CCM_SM3
4979
        if ((suites->suites[i] == CIPHER_BYTE) &&
4980
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
4981
            return;
4982
    #endif
4983
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4984
        if ((suites->suites[i] == SM_BYTE) &&
4985
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4986
            return;
4987
    #endif
4988
        if ((suites->suites[i] == ECC_BYTE) ||
4989
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4990
            (suites->suites[i] == CHACHA_BYTE)) {
4991
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4992
                                                          defined(HAVE_CURVE448)
4993
            return;
4994
        #endif
4995
        }
4996
    }
4997
   /* turns semaphore on to avoid sending this extension. */
4998
   TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4999
#endif
5000
28.3k
}
5001
5002
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
5003
5004
#ifndef NO_WOLFSSL_SERVER
5005
5006
static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
5007
{
5008
#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
5009
                                                          defined(HAVE_CURVE448)
5010
    (void)semaphore;
5011
#endif
5012
5013
    if (ssl->options.cipherSuite0 == TLS13_BYTE)
5014
        return;
5015
#ifdef BUILD_TLS_SM4_GCM_SM3
5016
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
5017
        (ssl->options.cipherSuite == TLS_SM4_GCM_SM3))
5018
        return;
5019
#endif
5020
#ifdef BUILD_TLS_SM4_CCM_SM3
5021
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
5022
        (ssl->options.cipherSuite == TLS_SM4_CCM_SM3))
5023
        return;
5024
#endif
5025
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
5026
    if ((ssl->options.cipherSuite0 == SM_BYTE) &&
5027
        (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
5028
        return;
5029
#endif
5030
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5031
    if (ssl->options.cipherSuite0 == ECC_BYTE ||
5032
        ssl->options.cipherSuite0 == ECDHE_PSK_BYTE ||
5033
        ssl->options.cipherSuite0 == CHACHA_BYTE) {
5034
        return;
5035
    }
5036
#endif
5037
5038
    /* turns semaphore on to avoid sending this extension. */
5039
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
5040
}
5041
5042
#endif /* !NO_WOLFSSL_SERVER */
5043
5044
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5045
5046
static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
5047
15.2k
{
5048
15.2k
    SupportedCurve* curve;
5049
15.2k
    word16 length = OPAQUE16_LEN; /* list length */
5050
5051
289k
    while ((curve = list)) {
5052
274k
        list = curve->next;
5053
274k
        length += OPAQUE16_LEN; /* curve length */
5054
274k
    }
5055
5056
15.2k
    return length;
5057
15.2k
}
5058
5059
#endif
5060
5061
static word16 TLSX_PointFormat_GetSize(PointFormat* list)
5062
10.5k
{
5063
10.5k
    PointFormat* point;
5064
10.5k
    word16 length = ENUM_LEN; /* list length */
5065
5066
21.0k
    while ((point = list)) {
5067
10.5k
        list = point->next;
5068
10.5k
        length += ENUM_LEN; /* format length */
5069
10.5k
    }
5070
5071
10.5k
    return length;
5072
10.5k
}
5073
5074
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5075
5076
static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
5077
13.2k
{
5078
13.2k
    word16 offset = OPAQUE16_LEN;
5079
5080
248k
    while (list) {
5081
235k
        c16toa(list->name, output + offset);
5082
235k
        offset += OPAQUE16_LEN;
5083
235k
        list = list->next;
5084
235k
    }
5085
5086
13.2k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
5087
5088
13.2k
    return offset;
5089
13.2k
}
5090
5091
#endif
5092
5093
static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
5094
10.5k
{
5095
10.5k
    word16 offset = ENUM_LEN;
5096
5097
21.0k
    while (list) {
5098
10.5k
        output[offset++] = list->format;
5099
10.5k
        list = list->next;
5100
10.5k
    }
5101
5102
10.5k
    output[0] = (byte)(offset - ENUM_LEN);
5103
5104
10.5k
    return offset;
5105
10.5k
}
5106
5107
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
5108
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
5109
5110
int TLSX_SupportedCurve_Parse(const WOLFSSL* ssl, const byte* input,
5111
                              word16 length, byte isRequest, TLSX** extensions)
5112
4.34k
{
5113
4.34k
    word16 offset;
5114
4.34k
    word16 name;
5115
4.34k
    int ret = 0;
5116
4.34k
    TLSX* extension;
5117
5118
4.34k
    if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
5119
#ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
5120
        return 0;
5121
#else
5122
0
        return BUFFER_ERROR; /* servers doesn't send this extension. */
5123
0
#endif
5124
0
    }
5125
4.34k
    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
5126
391
        return BUFFER_ERROR;
5127
3.95k
    ato16(input, &offset);
5128
    /* validating curve list length */
5129
3.95k
    if (length != OPAQUE16_LEN + offset)
5130
44
        return BUFFER_ERROR;
5131
3.90k
    offset = OPAQUE16_LEN;
5132
3.90k
    if (offset == length)
5133
6
        return 0;
5134
5135
3.90k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5136
3.90k
    if (extension == NULL) {
5137
        /* Just accept what the peer wants to use */
5138
20.4k
        for (; offset < length; offset += OPAQUE16_LEN) {
5139
16.5k
            ato16(input + offset, &name);
5140
5141
16.5k
            ret = TLSX_UseSupportedCurve(extensions, name, ssl->heap);
5142
            /* If it is BAD_FUNC_ARG then it is a group we do not support, but
5143
             * that is fine. */
5144
16.5k
            if (ret != WOLFSSL_SUCCESS &&
5145
9.66k
                    ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
5146
0
                break;
5147
16.5k
            ret = 0;
5148
16.5k
        }
5149
3.89k
    }
5150
5
    else {
5151
        /* Find the intersection with what the user has set */
5152
5
        SupportedCurve* commonCurves = NULL;
5153
14
        for (; offset < length; offset += OPAQUE16_LEN) {
5154
9
            SupportedCurve* foundCurve = (SupportedCurve*)extension->data;
5155
9
            ato16(input + offset, &name);
5156
5157
16
            while (foundCurve != NULL && foundCurve->name != name)
5158
7
                foundCurve = foundCurve->next;
5159
5160
9
            if (foundCurve != NULL) {
5161
2
                ret = commonCurves == NULL ?
5162
2
                      TLSX_SupportedCurve_New(&commonCurves, name, ssl->heap) :
5163
2
                      TLSX_SupportedCurve_Append(commonCurves, name, ssl->heap);
5164
2
                if (ret != 0)
5165
0
                    break;
5166
2
            }
5167
9
        }
5168
        /* If no common curves return error. In TLS 1.3 we can still try to save
5169
         * this by using HRR. */
5170
5
        if (ret == 0 && commonCurves == NULL &&
5171
3
                !IsAtLeastTLSv1_3(ssl->version))
5172
0
            ret = ECC_CURVE_ERROR;
5173
5
        if (ret == 0) {
5174
            /* Now swap out the curves in the extension */
5175
5
            TLSX_SupportedCurve_FreeAll((SupportedCurve*)extension->data,
5176
5
                                        ssl->heap);
5177
5
            extension->data = commonCurves;
5178
5
            commonCurves = NULL;
5179
5
        }
5180
5
        TLSX_SupportedCurve_FreeAll(commonCurves, ssl->heap);
5181
5
    }
5182
5183
3.90k
    return ret;
5184
3.90k
}
5185
#endif
5186
5187
#if !defined(NO_WOLFSSL_SERVER)
5188
5189
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5190
5191
/* Checks the priority of the groups on the server and set the supported groups
5192
 * response if there is a group not advertised by the client that is preferred.
5193
 *
5194
 * ssl  SSL/TLS object.
5195
 * returns 0 on success, otherwise an error.
5196
 */
5197
int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
5198
113
{
5199
113
    int ret;
5200
113
    TLSX* extension;
5201
113
    TLSX* priority = NULL;
5202
113
    TLSX* ext = NULL;
5203
113
    word16 name;
5204
113
    SupportedCurve* curve;
5205
5206
113
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5207
    /* May be doing PSK with no key exchange. */
5208
113
    if (extension == NULL)
5209
0
        return 0;
5210
5211
113
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5212
113
    if (ret != WOLFSSL_SUCCESS) {
5213
0
        TLSX_FreeAll(priority, ssl->heap);
5214
0
        return ret;
5215
0
    }
5216
5217
113
    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5218
113
    if (ext == NULL) {
5219
0
        WOLFSSL_MSG("Could not find supported groups extension");
5220
0
        TLSX_FreeAll(priority, ssl->heap);
5221
0
        return 0;
5222
0
    }
5223
5224
113
    curve = (SupportedCurve*)ext->data;
5225
113
    name = curve->name;
5226
5227
113
    curve = (SupportedCurve*)extension->data;
5228
376
    while (curve != NULL) {
5229
263
        if (curve->name == name)
5230
0
            break;
5231
263
        curve = curve->next;
5232
263
    }
5233
5234
113
    if (curve == NULL) {
5235
        /* Couldn't find the preferred group in client list. */
5236
113
        extension->resp = 1;
5237
5238
        /* Send server list back and free client list. */
5239
113
        curve = (SupportedCurve*)extension->data;
5240
113
        extension->data = ext->data;
5241
113
        ext->data = curve;
5242
113
    }
5243
5244
113
    TLSX_FreeAll(priority, ssl->heap);
5245
5246
113
    return 0;
5247
113
}
5248
5249
#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
5250
5251
#if defined(HAVE_FFDHE) && !defined(WOLFSSL_NO_TLS12)
5252
#ifdef HAVE_PUBLIC_FFDHE
5253
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5254
    SupportedCurve* serverGroup)
5255
783
{
5256
783
    int ret = 0;
5257
783
    SupportedCurve* group;
5258
783
    const DhParams* params = NULL;
5259
5260
13.3k
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5261
13.3k
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5262
12.5k
            continue;
5263
5264
1.40k
        for (group = clientGroup; group != NULL; group = group->next) {
5265
1.40k
            if (serverGroup->name != group->name)
5266
626
                continue;
5267
5268
783
            switch (serverGroup->name) {
5269
0
            #ifdef HAVE_FFDHE_2048
5270
783
                case WOLFSSL_FFDHE_2048:
5271
783
                    params = wc_Dh_ffdhe2048_Get();
5272
783
                    break;
5273
0
            #endif
5274
            #ifdef HAVE_FFDHE_3072
5275
                case WOLFSSL_FFDHE_3072:
5276
                    params = wc_Dh_ffdhe3072_Get();
5277
                    break;
5278
            #endif
5279
            #ifdef HAVE_FFDHE_4096
5280
                case WOLFSSL_FFDHE_4096:
5281
                    params = wc_Dh_ffdhe4096_Get();
5282
                    break;
5283
            #endif
5284
            #ifdef HAVE_FFDHE_6144
5285
                case WOLFSSL_FFDHE_6144:
5286
                    params = wc_Dh_ffdhe6144_Get();
5287
                    break;
5288
            #endif
5289
            #ifdef HAVE_FFDHE_8192
5290
                case WOLFSSL_FFDHE_8192:
5291
                    params = wc_Dh_ffdhe8192_Get();
5292
                    break;
5293
            #endif
5294
0
                default:
5295
0
                    break;
5296
783
            }
5297
783
            if (params == NULL) {
5298
0
                ret = BAD_FUNC_ARG;
5299
0
                break;
5300
0
            }
5301
783
            if (params->p_len >= ssl->options.minDhKeySz &&
5302
783
                                     params->p_len <= ssl->options.maxDhKeySz) {
5303
783
                break;
5304
783
            }
5305
783
        }
5306
5307
783
        if (ret != 0)
5308
0
            break;
5309
783
        if ((group != NULL) && (serverGroup->name == group->name))
5310
783
            break;
5311
783
    }
5312
5313
783
    if ((ret == 0) && (serverGroup != NULL) && (params != NULL)) {
5314
783
        ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
5315
783
        ssl->buffers.serverDH_P.length = params->p_len;
5316
783
        ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
5317
783
        ssl->buffers.serverDH_G.length = params->g_len;
5318
5319
783
        ssl->namedGroup = serverGroup->name;
5320
783
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5321
783
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5322
783
        ssl->options.dhDoKeyTest = 0;
5323
783
    #endif
5324
783
        ssl->options.haveDH = 1;
5325
783
    }
5326
5327
783
    return ret;
5328
783
}
5329
#else
5330
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5331
    SupportedCurve* serverGroup)
5332
{
5333
    int ret = 0;
5334
    SupportedCurve* group;
5335
    word32 p_len;
5336
5337
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5338
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5339
            continue;
5340
5341
        for (group = clientGroup; group != NULL; group = group->next) {
5342
            if (serverGroup->name != group->name)
5343
                continue;
5344
5345
            ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &p_len, NULL, NULL);
5346
            if (ret == 0) {
5347
                if (p_len == 0) {
5348
                    ret = BAD_FUNC_ARG;
5349
                    break;
5350
                }
5351
                if (p_len >= ssl->options.minDhKeySz &&
5352
                                                p_len <= ssl->options.maxDhKeySz) {
5353
                    break;
5354
                }
5355
            }
5356
        }
5357
5358
        if (ret != 0)
5359
            break;
5360
        if ((group != NULL) && (serverGroup->name == group->name))
5361
            break;
5362
    }
5363
5364
    if ((ret == 0) && (serverGroup != NULL)) {
5365
        word32 pSz, gSz;
5366
5367
        ssl->buffers.serverDH_P.buffer = NULL;
5368
        ssl->buffers.serverDH_G.buffer = NULL;
5369
        ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &pSz, &gSz, NULL);
5370
        if (ret == 0) {
5371
            ssl->buffers.serverDH_P.buffer =
5372
                (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5373
            if (ssl->buffers.serverDH_P.buffer == NULL)
5374
                ret = MEMORY_E;
5375
            else
5376
                ssl->buffers.serverDH_P.length = pSz;
5377
        }
5378
        if (ret == 0) {
5379
            ssl->buffers.serverDH_G.buffer =
5380
                (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5381
            if (ssl->buffers.serverDH_G.buffer == NULL) {
5382
                ret = MEMORY_E;
5383
            } else
5384
                ssl->buffers.serverDH_G.length = gSz;
5385
        }
5386
        if (ret == 0) {
5387
            ret = wc_DhCopyNamedKey(serverGroup->name,
5388
                              ssl->buffers.serverDH_P.buffer, &pSz,
5389
                              ssl->buffers.serverDH_G.buffer, &gSz,
5390
                              NULL, NULL);
5391
        }
5392
        if (ret == 0) {
5393
            ssl->buffers.weOwnDH = 1;
5394
5395
            ssl->namedGroup = serverGroup->name;
5396
        #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5397
            !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5398
            ssl->options.dhDoKeyTest = 0;
5399
        #endif
5400
            ssl->options.haveDH = 1;
5401
        }
5402
        else {
5403
            if (ssl->buffers.serverDH_P.buffer != NULL) {
5404
                XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5405
                    DYNAMIC_TYPE_PUBLIC_KEY);
5406
                ssl->buffers.serverDH_P.length = 0;
5407
                ssl->buffers.serverDH_P.buffer = NULL;
5408
            }
5409
            if (ssl->buffers.serverDH_G.buffer != NULL) {
5410
                XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5411
                    DYNAMIC_TYPE_PUBLIC_KEY);
5412
                ssl->buffers.serverDH_G.length = 0;
5413
                ssl->buffers.serverDH_G.buffer = NULL;
5414
            }
5415
        }
5416
    }
5417
5418
    return ret;
5419
}
5420
#endif
5421
5422
/* Set the highest priority common FFDHE group on the server as compared to
5423
 * client extensions.
5424
 *
5425
 * ssl    SSL/TLS object.
5426
 * returns 0 on success, otherwise an error.
5427
 */
5428
int TLSX_SupportedFFDHE_Set(WOLFSSL* ssl)
5429
2.95k
{
5430
2.95k
    int ret;
5431
2.95k
    TLSX* priority = NULL;
5432
2.95k
    TLSX* ext = NULL;
5433
2.95k
    TLSX* extension;
5434
2.95k
    SupportedCurve* clientGroup;
5435
2.95k
    SupportedCurve* group;
5436
2.95k
    int found = 0;
5437
5438
2.95k
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5439
    /* May be doing PSK with no key exchange. */
5440
2.95k
    if (extension == NULL)
5441
0
        return 0;
5442
2.95k
    clientGroup = (SupportedCurve*)extension->data;
5443
6.24k
    for (group = clientGroup; group != NULL; group = group->next) {
5444
4.06k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(group->name)) {
5445
783
            found = 1;
5446
783
            break;
5447
783
        }
5448
4.06k
    }
5449
2.95k
    if (!found)
5450
2.17k
        return 0;
5451
5452
783
    if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
5453
0
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5454
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5455
0
    }
5456
783
    if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
5457
0
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5458
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5459
0
    }
5460
783
    ssl->buffers.serverDH_P.buffer = NULL;
5461
783
    ssl->buffers.serverDH_G.buffer = NULL;
5462
783
    ssl->buffers.weOwnDH = 0;
5463
783
    ssl->options.haveDH = 0;
5464
5465
783
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5466
783
    if (ret == WOLFSSL_SUCCESS) {
5467
783
        SupportedCurve* serverGroup;
5468
5469
783
        ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5470
783
        if (ext == NULL) {
5471
0
            WOLFSSL_MSG("Could not find supported groups extension");
5472
0
            ret = 0;
5473
0
        }
5474
783
        else {
5475
783
            serverGroup = (SupportedCurve*)ext->data;
5476
783
            ret = tlsx_ffdhe_find_group(ssl, clientGroup, serverGroup);
5477
783
        }
5478
783
    }
5479
5480
783
    TLSX_FreeAll(priority, ssl->heap);
5481
5482
783
    return ret;
5483
2.95k
}
5484
#endif /* HAVE_FFDHE && !WOLFSSL_NO_TLS12 */
5485
#endif /* !NO_WOLFSSL_SERVER */
5486
5487
/* Check if the given curve is present in the supported groups extension.
5488
 *
5489
 * ssl             SSL/TLS object.
5490
 * name            The curve name to check.
5491
 * returns 1 if present, 0 otherwise.
5492
 */
5493
int TLSX_SupportedCurve_IsSupported(WOLFSSL* ssl, word16 name)
5494
0
{
5495
0
    TLSX* extension;
5496
0
    SupportedCurve* curve;
5497
5498
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5499
0
    if (extension == NULL)
5500
0
        return 0;
5501
5502
0
    curve = (SupportedCurve*)extension->data;
5503
0
    while (curve != NULL) {
5504
0
        if (curve->name == name)
5505
0
            return 1;
5506
0
        curve = curve->next;
5507
0
    }
5508
5509
0
    return 0;
5510
0
}
5511
5512
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5513
/* Return the preferred group.
5514
 *
5515
 * ssl             SSL/TLS object.
5516
 * checkSupported  Whether to check for the first supported group.
5517
 * returns BAD_FUNC_ARG if no group found, otherwise the group.
5518
 */
5519
int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
5520
0
{
5521
0
    TLSX* extension;
5522
0
    SupportedCurve* curve;
5523
5524
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5525
0
    if (extension == NULL)
5526
0
        return BAD_FUNC_ARG;
5527
5528
0
    curve = (SupportedCurve*)extension->data;
5529
0
    while (curve != NULL) {
5530
0
        if (!checkSupported || TLSX_IsGroupSupported(curve->name))
5531
0
            return curve->name;
5532
0
        curve = curve->next;
5533
0
    }
5534
5535
0
    return BAD_FUNC_ARG;
5536
0
}
5537
5538
#endif /* HAVE_SUPPORTED_CURVES */
5539
5540
#ifndef NO_WOLFSSL_SERVER
5541
5542
static int TLSX_PointFormat_Parse(WOLFSSL* ssl, const byte* input,
5543
                                  word16 length, byte isRequest)
5544
843
{
5545
843
    int ret;
5546
5547
    /* validating formats list length */
5548
843
    if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
5549
51
        return BUFFER_ERROR;
5550
5551
792
    if (isRequest) {
5552
        /* adding uncompressed point format to response */
5553
790
        ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
5554
790
                                                                     ssl->heap);
5555
790
        if (ret != WOLFSSL_SUCCESS)
5556
0
            return ret; /* throw error */
5557
5558
790
        TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
5559
790
    }
5560
5561
792
    return 0;
5562
792
}
5563
5564
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5565
int TLSX_ValidateSupportedCurves(const WOLFSSL* ssl, byte first, byte second,
5566
                                 word32* ecdhCurveOID) {
5567
    TLSX*           extension = NULL;
5568
    SupportedCurve* curve     = NULL;
5569
    word32          oid       = 0;
5570
    word32          defOid    = 0;
5571
    word32          defSz     = 80; /* Maximum known curve size is 66. */
5572
    word32          nextOid   = 0;
5573
    word32          nextSz    = 80; /* Maximum known curve size is 66. */
5574
    word32          currOid   = ssl->ecdhCurveOID;
5575
    int             ephmSuite = 0;
5576
    word16          octets    = 0; /* according to 'ecc_set_type ecc_sets[];' */
5577
    int             key       = 0; /* validate key       */
5578
    int             foundCurve = 0; /* Found at least one supported curve */
5579
5580
    (void)oid;
5581
5582
    if (first == CHACHA_BYTE) {
5583
        switch (second) {
5584
            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5585
            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
5586
            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5587
            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5588
                return 1; /* no suite restriction */
5589
            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5590
            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5591
            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5592
                break;
5593
        }
5594
    }
5595
    if (first == ECC_BYTE || first == ECDHE_PSK_BYTE || first == CHACHA_BYTE)
5596
        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5597
    if (!extension)
5598
        return 1; /* no suite restriction */
5599
5600
    for (curve = (SupportedCurve*)extension->data;
5601
         curve && !key;
5602
         curve = curve->next) {
5603
5604
    #ifdef OPENSSL_EXTRA
5605
        /* skip if name is not in supported ECC range
5606
         * or disabled by user */
5607
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
5608
            continue;
5609
    #endif
5610
5611
        /* find supported curve */
5612
        switch (curve->name) {
5613
#ifdef HAVE_ECC
5614
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
5615
        #ifndef NO_ECC_SECP
5616
            case WOLFSSL_ECC_SECP160R1:
5617
                oid = ECC_SECP160R1_OID;
5618
                octets = 20;
5619
                break;
5620
        #endif /* !NO_ECC_SECP */
5621
        #ifdef HAVE_ECC_SECPR2
5622
            case WOLFSSL_ECC_SECP160R2:
5623
                oid = ECC_SECP160R2_OID;
5624
                octets = 20;
5625
                break;
5626
        #endif /* HAVE_ECC_SECPR2 */
5627
        #ifdef HAVE_ECC_KOBLITZ
5628
            case WOLFSSL_ECC_SECP160K1:
5629
                oid = ECC_SECP160K1_OID;
5630
                octets = 20;
5631
                break;
5632
        #endif /* HAVE_ECC_KOBLITZ */
5633
        #endif
5634
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
5635
        #ifndef NO_ECC_SECP
5636
            case WOLFSSL_ECC_SECP192R1:
5637
                oid = ECC_SECP192R1_OID;
5638
                octets = 24;
5639
                break;
5640
        #endif /* !NO_ECC_SECP */
5641
        #ifdef HAVE_ECC_KOBLITZ
5642
            case WOLFSSL_ECC_SECP192K1:
5643
                oid = ECC_SECP192K1_OID;
5644
                octets = 24;
5645
                break;
5646
        #endif /* HAVE_ECC_KOBLITZ */
5647
    #endif
5648
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
5649
        #ifndef NO_ECC_SECP
5650
            case WOLFSSL_ECC_SECP224R1:
5651
                oid = ECC_SECP224R1_OID;
5652
                octets = 28;
5653
                break;
5654
        #endif /* !NO_ECC_SECP */
5655
        #ifdef HAVE_ECC_KOBLITZ
5656
            case WOLFSSL_ECC_SECP224K1:
5657
                oid = ECC_SECP224K1_OID;
5658
                octets = 28;
5659
                break;
5660
        #endif /* HAVE_ECC_KOBLITZ */
5661
    #endif
5662
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5663
        #ifndef NO_ECC_SECP
5664
            case WOLFSSL_ECC_SECP256R1:
5665
                oid = ECC_SECP256R1_OID;
5666
                octets = 32;
5667
                break;
5668
        #endif /* !NO_ECC_SECP */
5669
    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
5670
#endif
5671
        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
5672
            case WOLFSSL_ECC_X25519:
5673
                oid = ECC_X25519_OID;
5674
                octets = 32;
5675
                break;
5676
        #endif /* HAVE_CURVE25519 */
5677
#ifdef HAVE_ECC
5678
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5679
        #ifdef HAVE_ECC_KOBLITZ
5680
            case WOLFSSL_ECC_SECP256K1:
5681
                oid = ECC_SECP256K1_OID;
5682
                octets = 32;
5683
                break;
5684
        #endif /* HAVE_ECC_KOBLITZ */
5685
        #ifdef HAVE_ECC_BRAINPOOL
5686
            case WOLFSSL_ECC_BRAINPOOLP256R1:
5687
                oid = ECC_BRAINPOOLP256R1_OID;
5688
                octets = 32;
5689
                break;
5690
        #endif /* HAVE_ECC_BRAINPOOL */
5691
        #ifdef WOLFSSL_SM2
5692
            case WOLFSSL_ECC_SM2P256V1:
5693
                oid = ECC_SM2P256V1_OID;
5694
                octets = 32;
5695
                break;
5696
        #endif /* WOLFSSL_SM2 */
5697
    #endif
5698
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
5699
        #ifndef NO_ECC_SECP
5700
            case WOLFSSL_ECC_SECP384R1:
5701
                oid = ECC_SECP384R1_OID;
5702
                octets = 48;
5703
                break;
5704
        #endif /* !NO_ECC_SECP */
5705
        #ifdef HAVE_ECC_BRAINPOOL
5706
            case WOLFSSL_ECC_BRAINPOOLP384R1:
5707
                oid = ECC_BRAINPOOLP384R1_OID;
5708
                octets = 48;
5709
                break;
5710
        #endif /* HAVE_ECC_BRAINPOOL */
5711
    #endif
5712
#endif
5713
        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
5714
            case WOLFSSL_ECC_X448:
5715
                oid = ECC_X448_OID;
5716
                octets = 57;
5717
                break;
5718
        #endif /* HAVE_CURVE448 */
5719
#ifdef HAVE_ECC
5720
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
5721
        #ifdef HAVE_ECC_BRAINPOOL
5722
            case WOLFSSL_ECC_BRAINPOOLP512R1:
5723
                oid = ECC_BRAINPOOLP512R1_OID;
5724
                octets = 64;
5725
                break;
5726
        #endif /* HAVE_ECC_BRAINPOOL */
5727
    #endif
5728
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
5729
        #ifndef NO_ECC_SECP
5730
            case WOLFSSL_ECC_SECP521R1:
5731
                oid = ECC_SECP521R1_OID;
5732
                octets = 66;
5733
                break;
5734
        #endif /* !NO_ECC_SECP */
5735
    #endif
5736
#endif
5737
            default: continue; /* unsupported curve */
5738
        }
5739
5740
        foundCurve = 1;
5741
5742
    #ifdef HAVE_ECC
5743
        /* Set default Oid */
5744
        if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
5745
            defOid = oid;
5746
            defSz = octets;
5747
        }
5748
5749
        /* The eccTempKeySz is the preferred ephemeral key size */
5750
        if (currOid == 0 && ssl->eccTempKeySz == octets)
5751
            currOid = oid;
5752
        if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
5753
            nextOid = oid;
5754
            nextSz  = octets;
5755
        }
5756
    #else
5757
        if (defOid == 0 && defSz > octets) {
5758
            defOid = oid;
5759
            defSz = octets;
5760
        }
5761
5762
        if (currOid == 0)
5763
            currOid = oid;
5764
        if (nextOid == 0 || nextSz > octets) {
5765
            nextOid = oid;
5766
            nextSz  = octets;
5767
        }
5768
    #endif
5769
5770
        if (first == ECC_BYTE) {
5771
            switch (second) {
5772
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
5773
                /* ECDHE_ECDSA */
5774
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
5775
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
5776
                case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
5777
                case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
5778
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
5779
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
5780
                case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
5781
                case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
5782
                case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
5783
                case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
5784
                    key |= ssl->ecdhCurveOID == oid;
5785
                    ephmSuite = 1;
5786
                break;
5787
5788
    #ifdef WOLFSSL_STATIC_DH
5789
                /* ECDH_ECDSA */
5790
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
5791
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
5792
                case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
5793
                case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
5794
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
5795
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
5796
                case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
5797
                case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
5798
                    if (oid == ECC_X25519_OID && defOid == oid) {
5799
                        defOid = 0;
5800
                        defSz = 80;
5801
                    }
5802
                    if (oid == ECC_X448_OID && defOid == oid) {
5803
                        defOid = 0;
5804
                        defSz = 80;
5805
                    }
5806
                    key |= ssl->pkCurveOID == oid;
5807
                break;
5808
    #endif /* WOLFSSL_STATIC_DH */
5809
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
5810
#ifndef NO_RSA
5811
                /* ECDHE_RSA */
5812
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
5813
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
5814
                case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
5815
                case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
5816
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
5817
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
5818
                case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
5819
                case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
5820
                    key |= ssl->ecdhCurveOID == oid;
5821
                    ephmSuite = 1;
5822
                break;
5823
5824
    #if defined(HAVE_ECC) && defined(WOLFSSL_STATIC_DH)
5825
                /* ECDH_RSA */
5826
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
5827
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
5828
                case TLS_ECDH_RSA_WITH_RC4_128_SHA:
5829
                case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
5830
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
5831
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
5832
                case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
5833
                case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
5834
                    if (oid == ECC_X25519_OID && defOid == oid) {
5835
                        defOid = 0;
5836
                        defSz = 80;
5837
                    }
5838
                    if (oid == ECC_X448_OID && defOid == oid) {
5839
                        defOid = 0;
5840
                        defSz = 80;
5841
                    }
5842
                    key |= ssl->pkCurveOID == oid;
5843
                break;
5844
    #endif /* HAVE_ECC && WOLFSSL_STATIC_DH */
5845
#endif
5846
                default:
5847
                    if (oid == ECC_X25519_OID && defOid == oid) {
5848
                        defOid = 0;
5849
                        defSz = 80;
5850
                    }
5851
                    if (oid == ECC_X448_OID && defOid == oid) {
5852
                        defOid = 0;
5853
                        defSz = 80;
5854
                    }
5855
                    key = 1;
5856
                break;
5857
            }
5858
        }
5859
5860
        /* ChaCha20-Poly1305 ECC cipher suites */
5861
        if (first == CHACHA_BYTE) {
5862
            switch (second) {
5863
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
5864
                /* ECDHE_ECDSA */
5865
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
5866
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
5867
                    key |= ssl->ecdhCurveOID == oid;
5868
                    ephmSuite = 1;
5869
                break;
5870
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
5871
#ifndef NO_RSA
5872
                /* ECDHE_RSA */
5873
                case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
5874
                case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
5875
                    key |= ssl->ecdhCurveOID == oid;
5876
                    ephmSuite = 1;
5877
                break;
5878
#endif
5879
                default:
5880
                    key = 1;
5881
                break;
5882
            }
5883
        }
5884
    }
5885
5886
    /* Check we found at least one supported curve */
5887
    if (!foundCurve)
5888
        return 0;
5889
5890
    *ecdhCurveOID = ssl->ecdhCurveOID;
5891
    /* Choose the default if it is at the required strength. */
5892
#ifdef HAVE_ECC
5893
    if (*ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
5894
#else
5895
    if (*ecdhCurveOID == 0)
5896
#endif
5897
    {
5898
        key = 1;
5899
        *ecdhCurveOID = defOid;
5900
    }
5901
    /* Choose any curve at the required strength. */
5902
    if (*ecdhCurveOID == 0) {
5903
        key = 1;
5904
        *ecdhCurveOID = currOid;
5905
    }
5906
    /* Choose the default if it is at the next highest strength. */
5907
    if (*ecdhCurveOID == 0 && defSz == nextSz)
5908
        *ecdhCurveOID = defOid;
5909
    /* Choose any curve at the next highest strength. */
5910
    if (*ecdhCurveOID == 0)
5911
        *ecdhCurveOID = nextOid;
5912
    /* No curve and ephemeral ECC suite requires a matching curve. */
5913
    if (*ecdhCurveOID == 0 && ephmSuite)
5914
        key = 0;
5915
5916
    return key;
5917
}
5918
#endif
5919
5920
#endif /* NO_WOLFSSL_SERVER */
5921
5922
5923
int TLSX_SupportedCurve_Copy(TLSX* src, TLSX** dst, void* heap)
5924
861
{
5925
861
    TLSX* extension;
5926
861
    int ret;
5927
5928
861
    extension = TLSX_Find(src, TLSX_SUPPORTED_GROUPS);
5929
861
    if (extension != NULL) {
5930
0
        SupportedCurve* curve;
5931
0
        for (curve = (SupportedCurve*)extension->data; curve != NULL;
5932
0
                curve = curve->next) {
5933
0
            ret = TLSX_UseSupportedCurve(dst, curve->name, heap);
5934
0
            if (ret != WOLFSSL_SUCCESS)
5935
0
                return MEMORY_E;
5936
0
        }
5937
0
    }
5938
5939
861
    return 0;
5940
861
}
5941
5942
int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
5943
285k
{
5944
285k
    TLSX* extension = NULL;
5945
285k
    SupportedCurve* curve = NULL;
5946
285k
    int ret;
5947
5948
285k
    if (extensions == NULL) {
5949
0
        return BAD_FUNC_ARG;
5950
0
    }
5951
5952
285k
    if (! TLSX_IsGroupSupported(name)) {
5953
9.66k
        return BAD_FUNC_ARG;
5954
9.66k
    }
5955
5956
275k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5957
5958
275k
    if (!extension) {
5959
22.4k
        ret = TLSX_SupportedCurve_New(&curve, name, heap);
5960
22.4k
        if (ret != 0)
5961
76
            return ret;
5962
5963
22.3k
        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
5964
22.3k
        if (ret != 0) {
5965
9
            XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
5966
9
            return ret;
5967
9
        }
5968
22.3k
    }
5969
253k
    else {
5970
253k
        ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
5971
253k
                                                                          heap);
5972
253k
        if (ret != 0)
5973
4.47k
            return ret;
5974
    #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
5975
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
5976
        if (name == WOLFSSL_SECP256R1MLKEM512) {
5977
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5978
                WOLFSSL_P256_ML_KEM_512_OLD, heap);
5979
        }
5980
        else if (name == WOLFSSL_SECP384R1MLKEM768) {
5981
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5982
                WOLFSSL_P384_ML_KEM_768_OLD, heap);
5983
        }
5984
        else if (name == WOLFSSL_SECP521R1MLKEM1024) {
5985
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5986
                WOLFSSL_P521_ML_KEM_1024_OLD, heap);
5987
        }
5988
        if (ret != 0) {
5989
            return ret;
5990
        }
5991
    #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
5992
253k
    }
5993
5994
271k
    return WOLFSSL_SUCCESS;
5995
275k
}
5996
5997
int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
5998
11.0k
{
5999
11.0k
    TLSX* extension = NULL;
6000
11.0k
    PointFormat* point = NULL;
6001
11.0k
    int ret = 0;
6002
6003
11.0k
    if (extensions == NULL)
6004
0
        return BAD_FUNC_ARG;
6005
6006
11.0k
    extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
6007
6008
11.0k
    if (!extension) {
6009
11.0k
        ret = TLSX_PointFormat_New(&point, format, heap);
6010
11.0k
        if (ret != 0)
6011
0
            return ret;
6012
6013
11.0k
        ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
6014
11.0k
        if (ret != 0) {
6015
14
            XFREE(point, heap, DYNAMIC_TYPE_TLSX);
6016
14
            return ret;
6017
14
        }
6018
11.0k
    }
6019
0
    else {
6020
0
        ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
6021
0
                                                                          heap);
6022
0
        if (ret != 0)
6023
0
            return ret;
6024
0
    }
6025
6026
11.0k
    return WOLFSSL_SUCCESS;
6027
11.0k
}
6028
6029
0
#define EC_FREE_ALL         TLSX_SupportedCurve_FreeAll
6030
#define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
6031
6032
/* In TLS 1.2 the server never sends supported curve extension, but in TLS 1.3
6033
 * the server can send supported groups extension to indicate what it will
6034
 * support for later connections. */
6035
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
6036
0
#define EC_GET_SIZE TLSX_SupportedCurve_GetSize
6037
#define EC_WRITE    TLSX_SupportedCurve_Write
6038
#else
6039
#define EC_GET_SIZE(list)         0
6040
#define EC_WRITE(a, b)            0
6041
#endif
6042
6043
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
6044
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
6045
0
#define EC_PARSE TLSX_SupportedCurve_Parse
6046
#else
6047
#define EC_PARSE(a, b, c, d, e)   0
6048
#endif
6049
6050
0
#define PF_FREE_ALL          TLSX_PointFormat_FreeAll
6051
#define PF_VALIDATE_REQUEST  TLSX_PointFormat_ValidateRequest
6052
0
#define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
6053
6054
0
#define PF_GET_SIZE TLSX_PointFormat_GetSize
6055
#define PF_WRITE    TLSX_PointFormat_Write
6056
6057
#ifndef NO_WOLFSSL_SERVER
6058
0
#define PF_PARSE TLSX_PointFormat_Parse
6059
#else
6060
#define PF_PARSE(a, b, c, d)      0
6061
#endif
6062
6063
#else
6064
6065
#define EC_FREE_ALL(list, heap) WC_DO_NOTHING
6066
#define EC_GET_SIZE(list)         0
6067
#define EC_WRITE(a, b)            0
6068
#define EC_PARSE(a, b, c, d, e)   0
6069
#define EC_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
6070
6071
#define PF_FREE_ALL(list, heap)   WC_DO_NOTHING
6072
#define PF_GET_SIZE(list)         0
6073
#define PF_WRITE(a, b)            0
6074
#define PF_PARSE(a, b, c, d)      0
6075
#define PF_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
6076
#define PF_VALIDATE_RESPONSE(a, b) WC_DO_NOTHING
6077
6078
#endif /* HAVE_SUPPORTED_CURVES */
6079
6080
/******************************************************************************/
6081
/* Renegotiation Indication                                                   */
6082
/******************************************************************************/
6083
6084
#if defined(HAVE_SECURE_RENEGOTIATION) \
6085
 || defined(HAVE_SERVER_RENEGOTIATION_INFO)
6086
6087
static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
6088
                                                                  int isRequest)
6089
337
{
6090
337
    byte length = OPAQUE8_LEN; /* empty info length */
6091
6092
    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
6093
337
    if (data && data->enabled && data->verifySet) {
6094
        /* client sends client_verify_data only */
6095
0
        length += TLS_FINISHED_SZ;
6096
6097
        /* server also sends server_verify_data */
6098
0
        if (!isRequest)
6099
0
            length += TLS_FINISHED_SZ;
6100
0
    }
6101
6102
337
    return length;
6103
337
}
6104
6105
static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
6106
                                                    byte* output, int isRequest)
6107
337
{
6108
337
    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
6109
337
    if (data && data->enabled && data->verifySet) {
6110
        /* client sends client_verify_data only */
6111
0
        XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
6112
0
        offset += TLS_FINISHED_SZ;
6113
6114
        /* server also sends server_verify_data */
6115
0
        if (!isRequest) {
6116
0
            XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
6117
0
            offset += TLS_FINISHED_SZ;
6118
0
        }
6119
0
    }
6120
6121
337
    output[0] = (byte)(offset - 1);  /* info length - self */
6122
6123
337
    return offset;
6124
337
}
6125
6126
static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input,
6127
                                          word16 length, byte isRequest)
6128
218
{
6129
218
    int ret = WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E);
6130
6131
218
    if (length >= OPAQUE8_LEN) {
6132
218
        if (isRequest) {
6133
216
        #ifndef NO_WOLFSSL_SERVER
6134
216
            if (ssl->secure_renegotiation == NULL) {
6135
197
                ret = wolfSSL_UseSecureRenegotiation(ssl);
6136
197
                if (ret == WOLFSSL_SUCCESS)
6137
197
                    ret = 0;
6138
197
            }
6139
216
            if (ret != 0 && ret != WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E)) {
6140
0
            }
6141
216
            else if (ssl->secure_renegotiation == NULL) {
6142
0
            }
6143
216
            else if (!ssl->secure_renegotiation->enabled) {
6144
197
                if (*input == 0) {
6145
123
                    input++; /* get past size */
6146
6147
123
                    ssl->secure_renegotiation->enabled = 1;
6148
123
                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6149
123
                    ret = 0;
6150
123
                }
6151
74
                else {
6152
                    /* already in error state */
6153
74
                    WOLFSSL_MSG("SCR client verify data present");
6154
74
                }
6155
197
            }
6156
19
            else if (*input == TLS_FINISHED_SZ) {
6157
12
                if (length < TLS_FINISHED_SZ + 1) {
6158
4
                    WOLFSSL_MSG("SCR malformed buffer");
6159
4
                    ret = BUFFER_E;
6160
4
                }
6161
8
                else {
6162
8
                    input++; /* get past size */
6163
6164
                    /* validate client verify data */
6165
8
                    if (ConstantCompare(input,
6166
8
                            ssl->secure_renegotiation->client_verify_data,
6167
8
                            TLS_FINISHED_SZ) == 0) {
6168
5
                        WOLFSSL_MSG("SCR client verify data match");
6169
5
                        TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6170
5
                        ret = 0;  /* verified */
6171
5
                    }
6172
3
                    else {
6173
                        /* already in error state */
6174
3
                        WOLFSSL_MSG("SCR client verify data Failure");
6175
3
                    }
6176
8
                }
6177
12
            }
6178
216
        #endif
6179
216
        }
6180
2
        else if (ssl->secure_renegotiation != NULL) {
6181
0
        #ifndef NO_WOLFSSL_CLIENT
6182
0
            if (!ssl->secure_renegotiation->enabled) {
6183
0
                if (*input == 0) {
6184
0
                    ssl->secure_renegotiation->enabled = 1;
6185
0
                    ret = 0;
6186
0
                }
6187
0
            }
6188
0
            else if (*input == 2 * TLS_FINISHED_SZ &&
6189
0
                     length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
6190
0
                int cmpRes = 0;
6191
0
                input++;  /* get past size */
6192
0
                cmpRes |= ConstantCompare(input,
6193
0
                        ssl->secure_renegotiation->client_verify_data,
6194
0
                        TLS_FINISHED_SZ);
6195
0
                cmpRes |= ConstantCompare(input + TLS_FINISHED_SZ,
6196
0
                        ssl->secure_renegotiation->server_verify_data,
6197
0
                        TLS_FINISHED_SZ);
6198
                /* validate client and server verify data */
6199
0
                if (cmpRes == 0) {
6200
0
                    WOLFSSL_MSG("SCR client and server verify data match");
6201
0
                    ret = 0;  /* verified */
6202
0
                }
6203
0
                else {
6204
                    /* already in error state */
6205
0
                    WOLFSSL_MSG("SCR client and server verify data Failure");
6206
0
                }
6207
0
            }
6208
0
        #endif
6209
0
        }
6210
2
        else {
6211
2
            ret = SECURE_RENEGOTIATION_E;
6212
2
        }
6213
218
    }
6214
0
    else {
6215
0
        ret = SECURE_RENEGOTIATION_E;
6216
0
    }
6217
6218
218
    if (ret != 0) {
6219
16
        WOLFSSL_ERROR_VERBOSE(ret);
6220
16
        SendAlert(ssl, alert_fatal, handshake_failure);
6221
16
    }
6222
6223
218
    return ret;
6224
218
}
6225
6226
int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
6227
846
{
6228
846
    int ret = 0;
6229
846
    SecureRenegotiation* data;
6230
6231
846
    data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
6232
846
                                                             DYNAMIC_TYPE_TLSX);
6233
846
    if (data == NULL)
6234
0
        return MEMORY_E;
6235
6236
846
    XMEMSET(data, 0, sizeof(SecureRenegotiation));
6237
6238
846
    ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
6239
846
    if (ret != 0) {
6240
0
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
6241
0
        return ret;
6242
0
    }
6243
6244
846
    return WOLFSSL_SUCCESS;
6245
846
}
6246
6247
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
6248
6249
int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
6250
649
{
6251
649
    int ret;
6252
6253
    /* send empty renegotiation_info extension */
6254
649
    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6255
649
    if (ext == NULL) {
6256
649
        ret = TLSX_UseSecureRenegotiation(extensions, heap);
6257
649
        if (ret != WOLFSSL_SUCCESS)
6258
0
            return ret;
6259
6260
649
        ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6261
649
    }
6262
649
    if (ext)
6263
649
        ext->resp = 1;
6264
6265
649
    return WOLFSSL_SUCCESS;
6266
649
}
6267
6268
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
6269
6270
6271
0
#define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
6272
0
#define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
6273
#define SCR_WRITE          TLSX_SecureRenegotiation_Write
6274
0
#define SCR_PARSE          TLSX_SecureRenegotiation_Parse
6275
6276
#else
6277
6278
#define SCR_FREE_ALL(a, heap) WC_DO_NOTHING
6279
#define SCR_GET_SIZE(a, b)    0
6280
#define SCR_WRITE(a, b, c)    0
6281
#define SCR_PARSE(a, b, c, d) 0
6282
6283
#endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
6284
6285
/******************************************************************************/
6286
/* Session Tickets                                                            */
6287
/******************************************************************************/
6288
6289
#ifdef HAVE_SESSION_TICKET
6290
6291
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
6292
{
6293
    (void)isRequest;
6294
    return ticket ? ticket->size : 0;
6295
}
6296
6297
static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
6298
                                       int isRequest)
6299
{
6300
    word16 offset = 0; /* empty ticket */
6301
6302
    if (isRequest && ticket) {
6303
        XMEMCPY(output + offset, ticket->data, ticket->size);
6304
        offset += ticket->size;
6305
    }
6306
6307
    return offset;
6308
}
6309
6310
6311
static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, const byte* input,
6312
                                    word16 length, byte isRequest)
6313
{
6314
    int ret = 0;
6315
6316
    (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
6317
6318
    if (!isRequest) {
6319
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
6320
            return TLSX_HandleUnsupportedExtension(ssl);
6321
6322
        if (length != 0)
6323
            return BUFFER_ERROR;
6324
6325
#ifndef NO_WOLFSSL_CLIENT
6326
        ssl->expect_session_ticket = 1;
6327
#endif
6328
    }
6329
#ifndef NO_WOLFSSL_SERVER
6330
    else {
6331
        /* server side */
6332
        if (ssl->ctx->ticketEncCb == NULL) {
6333
            WOLFSSL_MSG("Client sent session ticket, server has no callback");
6334
            return 0;
6335
        }
6336
6337
#ifdef HAVE_SECURE_RENEGOTIATION
6338
        if (IsSCR(ssl)) {
6339
            WOLFSSL_MSG("Client sent session ticket during SCR. Ignoring.");
6340
            return 0;
6341
        }
6342
#endif
6343
6344
        if (length > SESSION_TICKET_LEN) {
6345
            ret = BAD_TICKET_MSG_SZ;
6346
            WOLFSSL_ERROR_VERBOSE(ret);
6347
        } else if (IsAtLeastTLSv1_3(ssl->version)) {
6348
            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
6349
            ssl->options.rejectTicket = 1;
6350
            ret = 0;  /* not fatal */
6351
        } else if (ssl->options.noTicketTls12) {
6352
            /* ignore ticket request */
6353
        } else if (length == 0) {
6354
            /* blank ticket */
6355
            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6356
            if (ret == WOLFSSL_SUCCESS) {
6357
                ret = 0;
6358
                /* send blank ticket */
6359
                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6360
                ssl->options.createTicket = 1;  /* will send ticket msg */
6361
                ssl->options.useTicket    = 1;
6362
                ssl->options.resuming     = 0;  /* no standard resumption */
6363
                ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
6364
            }
6365
        } else {
6366
            /* got actual ticket from client */
6367
            ret = DoClientTicket(ssl, input, length);
6368
            if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
6369
                WOLFSSL_MSG("Using existing client ticket");
6370
                ssl->options.useTicket    = 1;
6371
                ssl->options.resuming     = 1;
6372
                /* SERVER: ticket is peer auth. */
6373
                ssl->options.peerAuthGood = 1;
6374
            } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
6375
                WOLFSSL_MSG("Using existing client ticket, creating new one");
6376
                ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6377
                if (ret == WOLFSSL_SUCCESS) {
6378
                    ret = 0;
6379
                    TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6380
                                                    /* send blank ticket */
6381
                    ssl->options.createTicket = 1;  /* will send ticket msg */
6382
                    ssl->options.useTicket    = 1;
6383
                    ssl->options.resuming     = 1;
6384
                    /* SERVER: ticket is peer auth. */
6385
                    ssl->options.peerAuthGood = 1;
6386
                }
6387
            } else if (ret == WOLFSSL_TICKET_RET_REJECT ||
6388
                    ret == WC_NO_ERR_TRACE(VERSION_ERROR)) {
6389
                WOLFSSL_MSG("Process client ticket rejected, not using");
6390
                if (ret == WC_NO_ERR_TRACE(VERSION_ERROR))
6391
                    WOLFSSL_MSG("\tbad TLS version");
6392
                ret = 0;  /* not fatal */
6393
6394
                ssl->options.rejectTicket = 1;
6395
                /* If we have session tickets enabled then send a new ticket */
6396
                if (!TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET)) {
6397
                    ret = TLSX_UseSessionTicket(&ssl->extensions, NULL,
6398
                                                ssl->heap);
6399
                    if (ret == WOLFSSL_SUCCESS) {
6400
                        ret = 0;
6401
                        TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6402
                        ssl->options.createTicket = 1;
6403
                        ssl->options.useTicket    = 1;
6404
                    }
6405
                }
6406
            } else if (ret == WOLFSSL_TICKET_RET_FATAL) {
6407
                WOLFSSL_MSG("Process client ticket fatal error, not using");
6408
            } else if (ret < 0) {
6409
                WOLFSSL_MSG("Process client ticket unknown error, not using");
6410
            }
6411
        }
6412
    }
6413
#endif /* NO_WOLFSSL_SERVER */
6414
6415
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
6416
    (void)ssl;
6417
#endif
6418
6419
    return ret;
6420
}
6421
6422
WOLFSSL_TEST_VIS SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
6423
                                            byte* data, word16 size, void* heap)
6424
{
6425
    SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
6426
                                                       heap, DYNAMIC_TYPE_TLSX);
6427
    if (ticket) {
6428
        ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
6429
        if (ticket->data == NULL) {
6430
            XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
6431
            return NULL;
6432
        }
6433
6434
        XMEMCPY(ticket->data, data, size);
6435
        ticket->size     = size;
6436
        ticket->lifetime = lifetime;
6437
    }
6438
6439
    (void)heap;
6440
6441
    return ticket;
6442
}
6443
WOLFSSL_TEST_VIS void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
6444
{
6445
    if (ticket) {
6446
        XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
6447
        XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
6448
    }
6449
6450
    (void)heap;
6451
}
6452
6453
int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
6454
{
6455
    int ret = 0;
6456
6457
    if (extensions == NULL)
6458
        return BAD_FUNC_ARG;
6459
6460
    /* If the ticket is NULL, the client will request a new ticket from the
6461
       server. Otherwise, the client will use it in the next client hello. */
6462
    if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
6463
                                                                           != 0)
6464
        return ret;
6465
6466
    return WOLFSSL_SUCCESS;
6467
}
6468
6469
#define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
6470
#define WOLF_STK_WRITE            TLSX_SessionTicket_Write
6471
#define WOLF_STK_PARSE            TLSX_SessionTicket_Parse
6472
#define WOLF_STK_FREE(stk, heap)  TLSX_SessionTicket_Free((SessionTicket*)(stk),(heap))
6473
6474
#else
6475
6476
0
#define WOLF_STK_FREE(a, b) WC_DO_NOTHING
6477
#define WOLF_STK_VALIDATE_REQUEST(a) WC_DO_NOTHING
6478
0
#define WOLF_STK_GET_SIZE(a, b)      0
6479
#define WOLF_STK_WRITE(a, b, c)      0
6480
0
#define WOLF_STK_PARSE(a, b, c, d)   0
6481
6482
#endif /* HAVE_SESSION_TICKET */
6483
6484
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
6485
/******************************************************************************/
6486
/* Encrypt-then-MAC                                                           */
6487
/******************************************************************************/
6488
6489
#ifndef WOLFSSL_NO_TLS12
6490
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl);
6491
6492
/**
6493
 * Get the size of the Encrypt-Then-MAC extension.
6494
 *
6495
 * msgType  Type of message to put extension into.
6496
 * pSz      Size of extension data.
6497
 * return SANITY_MSG_E when the message is not allowed to have extension and
6498
 *        0 otherwise.
6499
 */
6500
static int TLSX_EncryptThenMac_GetSize(byte msgType, word16* pSz)
6501
15.4k
{
6502
15.4k
    (void)pSz;
6503
6504
15.4k
    if (msgType != client_hello && msgType != server_hello) {
6505
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6506
0
        return SANITY_MSG_E;
6507
0
    }
6508
6509
    /* Empty extension */
6510
6511
15.4k
    return 0;
6512
15.4k
}
6513
6514
/**
6515
 * Write the Encrypt-Then-MAC extension.
6516
 *
6517
 * data     Unused
6518
 * output   Extension data buffer. Unused.
6519
 * msgType  Type of message to put extension into.
6520
 * pSz      Size of extension data.
6521
 * return SANITY_MSG_E when the message is not allowed to have extension and
6522
 *        0 otherwise.
6523
 */
6524
static int TLSX_EncryptThenMac_Write(void* data, byte* output, byte msgType,
6525
                                     word16* pSz)
6526
13.4k
{
6527
13.4k
    (void)data;
6528
13.4k
    (void)output;
6529
13.4k
    (void)pSz;
6530
6531
13.4k
    if (msgType != client_hello && msgType != server_hello) {
6532
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6533
0
        return SANITY_MSG_E;
6534
0
    }
6535
6536
    /* Empty extension */
6537
6538
13.4k
    return 0;
6539
13.4k
}
6540
6541
/**
6542
 * Parse the Encrypt-Then-MAC extension.
6543
 *
6544
 * ssl      SSL object
6545
 * input    Extension data buffer.
6546
 * length   Length of this extension's data.
6547
 * msgType  Type of message to extension appeared in.
6548
 * return SANITY_MSG_E when the message is not allowed to have extension,
6549
 *        BUFFER_ERROR when the extension's data is invalid,
6550
 *        MEMORY_E when unable to allocate memory and
6551
 *        0 otherwise.
6552
 */
6553
static int TLSX_EncryptThenMac_Parse(WOLFSSL* ssl, const byte* input,
6554
                                     word16 length, byte msgType)
6555
545
{
6556
545
    int ret;
6557
6558
545
    (void)input;
6559
6560
545
    if (msgType != client_hello && msgType != server_hello) {
6561
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6562
0
        return SANITY_MSG_E;
6563
0
    }
6564
6565
    /* Empty extension */
6566
545
    if (length != 0)
6567
14
        return BUFFER_ERROR;
6568
6569
531
    if (msgType == client_hello) {
6570
        /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
6571
529
        if (!ssl->options.disallowEncThenMac) {
6572
529
            ssl->options.encThenMac = 1;
6573
            /* Set the extension reply. */
6574
529
            ret = TLSX_EncryptThenMac_Use(ssl);
6575
529
            if (ret != 0)
6576
0
                return ret;
6577
529
        }
6578
529
        return 0;
6579
529
    }
6580
6581
    /* Server Hello */
6582
2
    if (ssl->options.disallowEncThenMac) {
6583
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6584
0
        return SANITY_MSG_E;
6585
0
    }
6586
6587
2
    ssl->options.encThenMac = 1;
6588
2
    return 0;
6589
6590
2
}
6591
6592
/**
6593
 * Add the Encrypt-Then-MAC extension to list.
6594
 *
6595
 * ssl      SSL object
6596
 * return MEMORY_E when unable to allocate memory and 0 otherwise.
6597
 */
6598
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl)
6599
18.3k
{
6600
18.3k
    int   ret = 0;
6601
18.3k
    TLSX* extension;
6602
6603
    /* Find the Encrypt-Then-Mac extension if it exists. */
6604
18.3k
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6605
18.3k
    if (extension == NULL) {
6606
        /* Push new Encrypt-Then-Mac extension. */
6607
18.3k
        ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
6608
18.3k
            ssl->heap);
6609
18.3k
        if (ret != 0)
6610
6
            return ret;
6611
18.3k
    }
6612
6613
18.3k
    return 0;
6614
18.3k
}
6615
6616
/**
6617
 * Set the Encrypt-Then-MAC extension as one to respond too.
6618
 *
6619
 * ssl      SSL object
6620
 * return EXT_MISSING when EncryptThenMac extension not in list.
6621
 */
6622
int TLSX_EncryptThenMac_Respond(WOLFSSL* ssl)
6623
301
{
6624
301
    TLSX* extension;
6625
6626
301
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6627
301
    if (extension == NULL)
6628
0
        return EXT_MISSING;
6629
301
    extension->resp = 1;
6630
6631
301
    return 0;
6632
301
}
6633
6634
0
#define ETM_GET_SIZE  TLSX_EncryptThenMac_GetSize
6635
#define ETM_WRITE     TLSX_EncryptThenMac_Write
6636
0
#define ETM_PARSE     TLSX_EncryptThenMac_Parse
6637
6638
#else
6639
6640
#define ETM_GET_SIZE(a, b)    0
6641
#define ETM_WRITE(a, b, c, d) 0
6642
#define ETM_PARSE(a, b, c, d) 0
6643
6644
#endif /* !WOLFSSL_NO_TLS12 */
6645
6646
#endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
6647
6648
6649
#ifdef WOLFSSL_SRTP
6650
6651
/******************************************************************************/
6652
/* DTLS SRTP (Secure Real-time Transport Protocol)                            */
6653
/******************************************************************************/
6654
6655
/* Only support single SRTP profile */
6656
typedef struct TlsxSrtp {
6657
    word16 profileCount;
6658
    word16 ids; /* selected bits */
6659
} TlsxSrtp;
6660
6661
#ifndef NO_WOLFSSL_SERVER
6662
static int TLSX_UseSRTP_GetSize(TlsxSrtp *srtp)
6663
{
6664
    /*   SRTP Profile Len (2)
6665
     *      SRTP Profiles (2)
6666
     *   MKI (master key id) Length */
6667
    return (OPAQUE16_LEN + (srtp->profileCount * OPAQUE16_LEN) + 1);
6668
}
6669
#endif
6670
6671
static TlsxSrtp* TLSX_UseSRTP_New(word16 ids, void* heap)
6672
{
6673
    TlsxSrtp* srtp;
6674
    int i;
6675
6676
    srtp = (TlsxSrtp*)XMALLOC(sizeof(TlsxSrtp), heap, DYNAMIC_TYPE_TLSX);
6677
    if (srtp == NULL) {
6678
        WOLFSSL_MSG("TLSX SRTP Memory failure");
6679
        return NULL;
6680
    }
6681
6682
    /* count and test each bit set */
6683
    srtp->profileCount = 0;
6684
    for (i=0; i<16; i++) {
6685
        if (ids & (1 << i)) {
6686
            srtp->profileCount++;
6687
        }
6688
    }
6689
    srtp->ids = ids;
6690
6691
    return srtp;
6692
}
6693
6694
static void TLSX_UseSRTP_Free(TlsxSrtp *srtp, void* heap)
6695
{
6696
    XFREE(srtp, heap, DYNAMIC_TYPE_TLSX);
6697
    (void)heap;
6698
}
6699
6700
#ifndef NO_WOLFSSL_SERVER
6701
static int TLSX_UseSRTP_Parse(WOLFSSL* ssl, const byte* input, word16 length,
6702
    byte isRequest)
6703
{
6704
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
6705
    word16 profile_len = 0;
6706
    word16 profile_value = 0;
6707
    word16 offset = 0;
6708
    int i;
6709
    TlsxSrtp* srtp = NULL;
6710
6711
    if (length < OPAQUE16_LEN) {
6712
        return BUFFER_ERROR;
6713
    }
6714
6715
    /* reset selected DTLS SRTP profile ID */
6716
    ssl->dtlsSrtpId = 0;
6717
6718
    /* total length, not include itself */
6719
    ato16(input, &profile_len);
6720
    offset += OPAQUE16_LEN;
6721
    /* Check profile length is not bigger than remaining length. */
6722
    if (profile_len > length - offset) {
6723
        return BUFFER_ERROR;
6724
    }
6725
    /* Protection profiles are 2 bytes long - ensure not an odd no. bytes. */
6726
    if ((profile_len & 1) == 1) {
6727
        return BUFFER_ERROR;
6728
    }
6729
    /* Ignoring srtp_mki field - SRTP Make Key Identifier.
6730
     * Defined to be 0..255 bytes long.
6731
     */
6732
    if ((length - profile_len - offset) > 255) {
6733
        return BUFFER_ERROR;
6734
    }
6735
6736
    if (!isRequest) {
6737
#ifndef NO_WOLFSSL_CLIENT
6738
        /* Only one SRTP Protection Profile can be chosen. */
6739
        if (profile_len != OPAQUE16_LEN) {
6740
            return BUFFER_ERROR;
6741
        }
6742
6743
        ato16(input + offset, &profile_value);
6744
6745
        /* check that the profile received was in the ones we support */
6746
        if (profile_value < 16 &&
6747
                               (ssl->dtlsSrtpProfiles & (1 << profile_value))) {
6748
            ssl->dtlsSrtpId = profile_value;
6749
            ret = 0; /* success */
6750
        }
6751
#endif
6752
    }
6753
    else {
6754
        /* parse remainder one profile at a time, looking for match in CTX */
6755
        ret = 0;
6756
        for (i = 0; i < profile_len; i += OPAQUE16_LEN) {
6757
            ato16(input + offset + i, &profile_value);
6758
            /* find first match */
6759
            if (profile_value < 16 &&
6760
                                 ssl->dtlsSrtpProfiles & (1 << profile_value)) {
6761
                ssl->dtlsSrtpId = profile_value;
6762
6763
                /* make sure we respond with selected SRTP id selected */
6764
                srtp = TLSX_UseSRTP_New((1 << profile_value), ssl->heap);
6765
                if (srtp != NULL) {
6766
                    ret = TLSX_Push(&ssl->extensions, TLSX_USE_SRTP,
6767
                        (void*)srtp, ssl->heap);
6768
                    if (ret == 0) {
6769
                        TLSX_SetResponse(ssl, TLSX_USE_SRTP);
6770
                        /* successfully set extension */
6771
                    }
6772
                }
6773
                else {
6774
                    ret = MEMORY_E;
6775
                }
6776
                break;
6777
            }
6778
        }
6779
    }
6780
6781
    if (ret == 0 && ssl->dtlsSrtpId == 0) {
6782
        WOLFSSL_MSG("TLSX_UseSRTP_Parse profile not found!");
6783
        /* not fatal */
6784
    }
6785
    else if (ret != 0) {
6786
        ssl->dtlsSrtpId = 0;
6787
        TLSX_UseSRTP_Free(srtp, ssl->heap);
6788
    }
6789
6790
    return ret;
6791
}
6792
6793
static word16 TLSX_UseSRTP_Write(TlsxSrtp* srtp, byte* output)
6794
{
6795
    word16 offset = 0;
6796
    int i, j;
6797
6798
    c16toa(srtp->profileCount * 2, output + offset);
6799
    offset += OPAQUE16_LEN;
6800
    j = 0;
6801
    for (i = 0; i < srtp->profileCount; i++) {
6802
        for (; j < 16; j++) {
6803
            if (srtp->ids & (1 << j)) {
6804
                c16toa(j, output + offset);
6805
                offset += OPAQUE16_LEN;
6806
            }
6807
        }
6808
    }
6809
    output[offset++] = 0x00; /* MKI Length */
6810
6811
    return offset;
6812
}
6813
#endif
6814
6815
static int TLSX_UseSRTP(TLSX** extensions, word16 profiles, void* heap)
6816
{
6817
    int ret = 0;
6818
    TLSX* extension;
6819
6820
    if (extensions == NULL) {
6821
        return BAD_FUNC_ARG;
6822
    }
6823
6824
    extension = TLSX_Find(*extensions, TLSX_USE_SRTP);
6825
    if (extension == NULL) {
6826
        TlsxSrtp* srtp = TLSX_UseSRTP_New(profiles, heap);
6827
        if (srtp == NULL) {
6828
            return MEMORY_E;
6829
        }
6830
6831
        ret = TLSX_Push(extensions, TLSX_USE_SRTP, (void*)srtp, heap);
6832
        if (ret != 0) {
6833
            TLSX_UseSRTP_Free(srtp, heap);
6834
        }
6835
    }
6836
6837
    return ret;
6838
}
6839
6840
#ifndef NO_WOLFSSL_SERVER
6841
    #define SRTP_FREE     TLSX_UseSRTP_Free
6842
    #define SRTP_PARSE    TLSX_UseSRTP_Parse
6843
    #define SRTP_WRITE    TLSX_UseSRTP_Write
6844
    #define SRTP_GET_SIZE TLSX_UseSRTP_GetSize
6845
#else
6846
    #define SRTP_FREE(a, b) WC_DO_NOTHING
6847
    #define SRTP_PARSE(a, b, c, d)      0
6848
    #define SRTP_WRITE(a, b)            0
6849
    #define SRTP_GET_SIZE(a)            0
6850
#endif
6851
6852
#endif /* WOLFSSL_SRTP */
6853
6854
6855
/******************************************************************************/
6856
/* Supported Versions                                                         */
6857
/******************************************************************************/
6858
6859
#ifdef WOLFSSL_TLS13
6860
static WC_INLINE int versionIsGreater(byte isDtls, byte a, byte b)
6861
{
6862
    (void)isDtls;
6863
6864
#ifdef WOLFSSL_DTLS
6865
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6866
    if (isDtls)
6867
        return a < b;
6868
#endif /* WOLFSSL_DTLS */
6869
6870
    return a > b;
6871
}
6872
6873
static WC_INLINE int versionIsLesser(byte isDtls, byte a, byte b)
6874
{
6875
    (void)isDtls;
6876
6877
#ifdef WOLFSSL_DTLS
6878
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6879
    if (isDtls)
6880
        return a > b;
6881
#endif /* WOLFSSL_DTLS */
6882
6883
    return a < b;
6884
}
6885
6886
static WC_INLINE int versionIsAtLeast(byte isDtls, byte a, byte b)
6887
{
6888
    (void)isDtls;
6889
6890
#ifdef WOLFSSL_DTLS
6891
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6892
    if (isDtls)
6893
        return a <= b;
6894
#endif /* WOLFSSL_DTLS */
6895
6896
    return a >= b;
6897
}
6898
6899
static WC_INLINE int versionIsLessEqual(byte isDtls, byte a, byte b)
6900
{
6901
    (void)isDtls;
6902
6903
#ifdef WOLFSSL_DTLS
6904
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6905
    if (isDtls)
6906
        return a >= b;
6907
#endif /* WOLFSSL_DTLS */
6908
6909
    return a <= b;
6910
}
6911
6912
/* Return the size of the SupportedVersions extension's data.
6913
 *
6914
 * data       The SSL/TLS object.
6915
 * msgType The type of the message this extension is being written into.
6916
 * returns the length of data that will be in the extension.
6917
 */
6918
static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
6919
0
{
6920
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6921
0
    byte tls13Minor, tls12Minor, tls11Minor, isDtls;
6922
6923
0
    isDtls = !!ssl->options.dtls;
6924
0
    tls13Minor = (byte)(isDtls ? DTLSv1_3_MINOR : TLSv1_3_MINOR);
6925
0
    tls12Minor = (byte)(isDtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR);
6926
0
    tls11Minor = (byte)(isDtls ? DTLS_MINOR : TLSv1_1_MINOR);
6927
6928
    /* unused on some configuration */
6929
0
    (void)tls12Minor;
6930
0
    (void)tls13Minor;
6931
0
    (void)tls11Minor;
6932
6933
0
    if (msgType == client_hello) {
6934
        /* TLS v1.2 and TLS v1.3  */
6935
0
        int cnt = 0;
6936
6937
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13Minor)
6938
        #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6939
            defined(WOLFSSL_WPAS_SMALL)
6940
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
6941
        #endif
6942
0
        ) {
6943
0
            cnt++;
6944
0
        }
6945
6946
0
        if (ssl->options.downgrade) {
6947
0
    #ifndef WOLFSSL_NO_TLS12
6948
0
            if (versionIsLessEqual(
6949
0
                    isDtls, ssl->options.minDowngrade, tls12Minor)
6950
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6951
    defined(WOLFSSL_WPAS_SMALL)
6952
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
6953
#endif
6954
0
            ) {
6955
0
                cnt++;
6956
0
            }
6957
0
#endif
6958
    #ifndef NO_OLD_TLS
6959
            if (versionIsLessEqual(
6960
                    isDtls, ssl->options.minDowngrade, tls11Minor)
6961
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6962
                defined(WOLFSSL_WPAS_SMALL)
6963
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
6964
            #endif
6965
            ) {
6966
                cnt++;
6967
            }
6968
        #ifdef WOLFSSL_ALLOW_TLSV10
6969
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
6970
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6971
                defined(WOLFSSL_WPAS_SMALL)
6972
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
6973
            #endif
6974
            ) {
6975
                cnt++;
6976
            }
6977
        #endif
6978
    #endif
6979
0
        }
6980
6981
0
        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
6982
0
    }
6983
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6984
0
        *pSz += OPAQUE16_LEN;
6985
0
    }
6986
0
    else {
6987
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6988
0
        return SANITY_MSG_E;
6989
0
    }
6990
6991
0
    return 0;
6992
0
}
6993
6994
/* Writes the SupportedVersions extension into the buffer.
6995
 *
6996
 * data    The SSL/TLS object.
6997
 * output  The buffer to write the extension into.
6998
 * msgType The type of the message this extension is being written into.
6999
 * returns the length of data that was written.
7000
 */
7001
static int TLSX_SupportedVersions_Write(void* data, byte* output,
7002
                                        byte msgType, word16* pSz)
7003
0
{
7004
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7005
0
    byte tls13minor, tls12minor, tls11minor, isDtls = 0;
7006
7007
0
    tls13minor = (byte)TLSv1_3_MINOR;
7008
0
    tls12minor = (byte)TLSv1_2_MINOR;
7009
0
    tls11minor = (byte)TLSv1_1_MINOR;
7010
7011
    /* unused in some configuration */
7012
0
    (void)tls11minor;
7013
0
    (void)tls12minor;
7014
7015
#ifdef WOLFSSL_DTLS13
7016
    if (ssl->options.dtls) {
7017
        tls13minor = (byte)DTLSv1_3_MINOR;
7018
    #ifndef WOLFSSL_NO_TLS12
7019
        tls12minor = (byte)DTLSv1_2_MINOR;
7020
    #endif
7021
    #ifndef NO_OLD_TLS
7022
        tls11minor = (byte)DTLS_MINOR;
7023
    #endif
7024
        isDtls = 1;
7025
    }
7026
#endif /* WOLFSSL_DTLS13 */
7027
7028
0
    if (msgType == client_hello) {
7029
0
        byte major = ssl->ctx->method->version.major;
7030
7031
0
        byte* cnt = output++;
7032
0
        *cnt = 0;
7033
7034
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13minor)
7035
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
7036
    defined(WOLFSSL_WPAS_SMALL)
7037
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
7038
#endif
7039
0
        ) {
7040
0
            *cnt += OPAQUE16_LEN;
7041
        #ifdef WOLFSSL_TLS13_DRAFT
7042
            /* The TLS draft major number. */
7043
            *(output++) = TLS_DRAFT_MAJOR;
7044
            /* Version of draft supported. */
7045
            *(output++) = TLS_DRAFT_MINOR;
7046
        #else
7047
0
            *(output++) = major;
7048
0
            *(output++) = tls13minor;
7049
0
        #endif
7050
0
        }
7051
7052
0
        if (ssl->options.downgrade) {
7053
0
        #ifndef WOLFSSL_NO_TLS12
7054
0
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls12minor)
7055
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7056
                defined(WOLFSSL_WPAS_SMALL)
7057
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
7058
            #endif
7059
0
            ) {
7060
0
                *cnt += OPAQUE16_LEN;
7061
0
                *(output++) = major;
7062
0
                *(output++) = tls12minor;
7063
0
            }
7064
0
        #endif
7065
7066
    #ifndef NO_OLD_TLS
7067
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls11minor)
7068
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7069
                defined(WOLFSSL_WPAS_SMALL)
7070
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
7071
            #endif
7072
            ) {
7073
                *cnt += OPAQUE16_LEN;
7074
                *(output++) = major;
7075
                *(output++) = tls11minor;
7076
            }
7077
        #ifdef WOLFSSL_ALLOW_TLSV10
7078
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
7079
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7080
                defined(WOLFSSL_WPAS_SMALL)
7081
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
7082
            #endif
7083
            ) {
7084
                *cnt += OPAQUE16_LEN;
7085
                *(output++) = major;
7086
                *(output++) = (byte)TLSv1_MINOR;
7087
            }
7088
        #endif
7089
    #endif
7090
0
        }
7091
7092
0
        *pSz += (word16)(OPAQUE8_LEN + *cnt);
7093
0
    }
7094
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7095
0
        output[0] = ssl->version.major;
7096
0
        output[1] = ssl->version.minor;
7097
7098
0
        *pSz += OPAQUE16_LEN;
7099
0
    }
7100
0
    else {
7101
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7102
0
        return SANITY_MSG_E;
7103
0
    }
7104
7105
0
    return 0;
7106
0
}
7107
7108
/* Parse the SupportedVersions extension.
7109
 *
7110
 * ssl     The SSL/TLS object.
7111
 * input   The buffer with the extension data.
7112
 * length  The length of the extension data.
7113
 * msgType The type of the message this extension is being parsed from.
7114
 * pv      The output ProtocolVersion for the negotiated version
7115
 * opts    The output options structure. Can be NULL.
7116
 * exts    The output extensions list. Can be NULL.
7117
 * returns 0 on success, otherwise failure.
7118
 */
7119
int TLSX_SupportedVersions_Parse(const WOLFSSL* ssl, const byte* input,
7120
        word16 length, byte msgType, ProtocolVersion* pv, Options* opts,
7121
        TLSX** exts)
7122
0
{
7123
    /* The client's greatest minor version that we support */
7124
0
    byte clientGreatestMinor = SSLv3_MINOR;
7125
0
    int ret;
7126
0
    byte major, minor;
7127
0
    byte tls13minor, tls12minor;
7128
0
    byte isDtls;
7129
7130
0
    tls13minor = TLSv1_3_MINOR;
7131
0
    tls12minor = TLSv1_2_MINOR;
7132
0
    isDtls = ssl->options.dtls == 1;
7133
7134
#ifdef WOLFSSL_DTLS13
7135
    if (ssl->options.dtls) {
7136
        tls13minor = DTLSv1_3_MINOR;
7137
        tls12minor = DTLSv1_2_MINOR;
7138
        clientGreatestMinor = DTLS_MINOR;
7139
    }
7140
#endif /* WOLFSSL_DTLS13 */
7141
7142
0
    if (msgType == client_hello) {
7143
0
        int i;
7144
0
        int len;
7145
0
        int set = 0;
7146
7147
        /* Must contain a length and at least one version. */
7148
0
        if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1
7149
0
            || length > MAX_SV_EXT_LEN) {
7150
0
            return BUFFER_ERROR;
7151
0
        }
7152
7153
0
        len = *input;
7154
7155
        /* Protocol version array must fill rest of data. */
7156
0
        if (length != (word16)OPAQUE8_LEN + len)
7157
0
            return BUFFER_ERROR;
7158
7159
0
        input++;
7160
7161
        /* Find first match. */
7162
0
        for (i = 0; i < len; i += OPAQUE16_LEN) {
7163
0
            major = input[i];
7164
0
            minor = input[i + OPAQUE8_LEN];
7165
7166
#ifdef WOLFSSL_TLS13_DRAFT
7167
            if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
7168
                major = SSLv3_MAJOR;
7169
                minor = TLSv1_3_MINOR;
7170
            }
7171
#else
7172
0
            if (major == TLS_DRAFT_MAJOR)
7173
0
                continue;
7174
0
#endif
7175
7176
0
            if (major != ssl->ctx->method->version.major)
7177
0
                continue;
7178
7179
            /* No upgrade allowed. */
7180
0
            if (versionIsGreater(isDtls, minor, ssl->version.minor))
7181
0
                continue;
7182
7183
            /* Check downgrade. */
7184
0
            if (versionIsLesser(isDtls, minor, ssl->version.minor)) {
7185
0
                if (!ssl->options.downgrade)
7186
0
                    continue;
7187
7188
0
                if (versionIsLesser(isDtls, minor, ssl->options.minDowngrade))
7189
0
                    continue;
7190
0
            }
7191
0
            if (versionIsGreater(isDtls, minor, clientGreatestMinor))
7192
0
                clientGreatestMinor = minor;
7193
7194
0
            set = 1;
7195
0
        }
7196
0
        if (!set) {
7197
            /* No common supported version was negotiated */
7198
0
            SendAlert((WOLFSSL*)ssl, alert_fatal,
7199
0
                      wolfssl_alert_protocol_version);
7200
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7201
0
            return VERSION_ERROR;
7202
0
        }
7203
0
        pv->minor = clientGreatestMinor;
7204
0
        if (versionIsAtLeast(isDtls, clientGreatestMinor, tls13minor)) {
7205
0
            if (opts != NULL)
7206
0
                opts->tls1_3 = 1;
7207
7208
            /* TLS v1.3 requires supported version extension */
7209
0
            if (exts != NULL &&
7210
0
                    TLSX_Find(*exts, TLSX_SUPPORTED_VERSIONS) == NULL) {
7211
0
                ret = TLSX_Push(exts,
7212
0
                          TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
7213
0
                if (ret != 0) {
7214
0
                    return ret;
7215
0
                }
7216
                /* *exts should be pointing to the TLSX_SUPPORTED_VERSIONS
7217
                 * ext in the list since it was pushed. */
7218
0
                (*exts)->resp = 1;
7219
0
            }
7220
0
        }
7221
7222
0
    }
7223
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7224
        /* Must contain one version. */
7225
0
        if (length != OPAQUE16_LEN)
7226
0
            return BUFFER_ERROR;
7227
7228
0
        major = input[0];
7229
0
        minor = input[OPAQUE8_LEN];
7230
7231
0
        if (major != ssl->ctx->method->version.major) {
7232
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7233
0
            return VERSION_ERROR;
7234
0
        }
7235
7236
        /* Can't downgrade with this extension below TLS v1.3. */
7237
0
        if (versionIsLesser(isDtls, minor, tls13minor)) {
7238
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7239
0
            return VERSION_ERROR;
7240
0
        }
7241
7242
        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
7243
0
        if (ssl->options.downgrade && ssl->version.minor == tls12minor) {
7244
            /* Set minor version back to TLS v1.3+ */
7245
0
            pv->minor = ssl->ctx->method->version.minor;
7246
0
        }
7247
7248
        /* No upgrade allowed. */
7249
0
        if (versionIsLesser(isDtls, ssl->version.minor, minor)) {
7250
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7251
0
            return VERSION_ERROR;
7252
0
        }
7253
7254
        /* Check downgrade. */
7255
0
        if (versionIsGreater(isDtls, ssl->version.minor, minor)) {
7256
0
            if (!ssl->options.downgrade) {
7257
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7258
0
                return VERSION_ERROR;
7259
0
            }
7260
7261
0
            if (versionIsLesser(
7262
0
                    isDtls, minor, ssl->options.minDowngrade)) {
7263
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7264
0
                return VERSION_ERROR;
7265
0
            }
7266
7267
            /* Downgrade the version. */
7268
0
            pv->minor = minor;
7269
0
        }
7270
0
    }
7271
0
    else {
7272
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7273
0
        return SANITY_MSG_E;
7274
0
    }
7275
7276
0
    return 0;
7277
0
}
7278
7279
/* Sets a new SupportedVersions extension into the extension list.
7280
 *
7281
 * extensions  The list of extensions.
7282
 * data        The extensions specific data.
7283
 * heap        The heap used for allocation.
7284
 * returns 0 on success, otherwise failure.
7285
 */
7286
static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
7287
                                     void* heap)
7288
2.96k
{
7289
2.96k
    if (extensions == NULL || data == NULL)
7290
0
        return BAD_FUNC_ARG;
7291
7292
2.96k
    return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, data, heap);
7293
2.96k
}
7294
7295
0
#define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
7296
#define SV_WRITE     TLSX_SupportedVersions_Write
7297
933
#define SV_PARSE     TLSX_SupportedVersions_Parse
7298
7299
#else
7300
7301
#define SV_GET_SIZE(a, b, c) 0
7302
#define SV_WRITE(a, b, c, d) 0
7303
#define SV_PARSE(a, b, c, d, e, f, g) 0
7304
7305
#endif /* WOLFSSL_TLS13 */
7306
7307
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
7308
7309
/******************************************************************************/
7310
/* Cookie                                                                     */
7311
/******************************************************************************/
7312
7313
/* Free the cookie data.
7314
 *
7315
 * cookie  Cookie data.
7316
 * heap    The heap used for allocation.
7317
 */
7318
static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
7319
{
7320
    (void)heap;
7321
7322
    XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
7323
}
7324
7325
/* Get the size of the encoded Cookie extension.
7326
 * In messages: ClientHello and HelloRetryRequest.
7327
 *
7328
 * cookie   The cookie to write.
7329
 * msgType  The type of the message this extension is being written into.
7330
 * returns the number of bytes of the encoded Cookie extension.
7331
 */
7332
static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
7333
{
7334
    if (msgType == client_hello || msgType == hello_retry_request) {
7335
        *pSz += OPAQUE16_LEN + cookie->len;
7336
    }
7337
    else {
7338
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7339
        return SANITY_MSG_E;
7340
    }
7341
    return 0;
7342
}
7343
7344
/* Writes the Cookie extension into the output buffer.
7345
 * Assumes that the the output buffer is big enough to hold data.
7346
 * In messages: ClientHello and HelloRetryRequest.
7347
 *
7348
 * cookie   The cookie to write.
7349
 * output   The buffer to write into.
7350
 * msgType  The type of the message this extension is being written into.
7351
 * returns the number of bytes written into the buffer.
7352
 */
7353
static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType,
7354
                             word16* pSz)
7355
{
7356
    if (msgType == client_hello || msgType == hello_retry_request) {
7357
        c16toa(cookie->len, output);
7358
        output += OPAQUE16_LEN;
7359
        XMEMCPY(output, cookie->data, cookie->len);
7360
        *pSz += OPAQUE16_LEN + cookie->len;
7361
    }
7362
    else {
7363
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7364
        return SANITY_MSG_E;
7365
    }
7366
    return 0;
7367
}
7368
7369
/* Parse the Cookie extension.
7370
 * In messages: ClientHello and HelloRetryRequest.
7371
 *
7372
 * ssl      The SSL/TLS object.
7373
 * input    The extension data.
7374
 * length   The length of the extension data.
7375
 * msgType  The type of the message this extension is being parsed from.
7376
 * returns 0 on success and other values indicate failure.
7377
 */
7378
static int TLSX_Cookie_Parse(WOLFSSL* ssl, const byte* input, word16 length,
7379
                             byte msgType)
7380
{
7381
    word16  len;
7382
    word16  idx = 0;
7383
    TLSX*   extension;
7384
    Cookie* cookie;
7385
7386
    if (msgType != client_hello && msgType != hello_retry_request) {
7387
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7388
        return SANITY_MSG_E;
7389
    }
7390
7391
    /* Message contains length and Cookie which must be at least one byte
7392
     * in length.
7393
     */
7394
    if (length < OPAQUE16_LEN + 1)
7395
        return BUFFER_E;
7396
    ato16(input + idx, &len);
7397
    idx += OPAQUE16_LEN;
7398
    if (length - idx != len)
7399
        return BUFFER_E;
7400
7401
    if (msgType == hello_retry_request) {
7402
        ssl->options.hrrSentCookie = 1;
7403
        return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 1,
7404
                               &ssl->extensions);
7405
    }
7406
7407
    /* client_hello */
7408
    extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
7409
    if (extension == NULL) {
7410
#ifdef WOLFSSL_DTLS13
7411
        if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
7412
            /* Allow a cookie extension with DTLS 1.3 because it is possible
7413
             * that a different SSL instance sent the cookie but we are now
7414
             * receiving it. */
7415
            return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
7416
                                   &ssl->extensions);
7417
        else
7418
#endif
7419
        {
7420
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7421
            return HRR_COOKIE_ERROR;
7422
        }
7423
    }
7424
7425
    cookie = (Cookie*)extension->data;
7426
    if (cookie->len != len || XMEMCMP(cookie->data, input + idx, len) != 0) {
7427
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7428
        return HRR_COOKIE_ERROR;
7429
    }
7430
7431
    /* Request seen. */
7432
    extension->resp = 0;
7433
7434
    return 0;
7435
}
7436
7437
/* Use the data to create a new Cookie object in the extensions.
7438
 *
7439
 * ssl    SSL/TLS object.
7440
 * data   Cookie data.
7441
 * len    Length of cookie data in bytes.
7442
 * mac    MAC data.
7443
 * macSz  Length of MAC data in bytes.
7444
 * resp   Indicates the extension will go into a response (HelloRetryRequest).
7445
 * returns 0 on success and other values indicate failure.
7446
 */
7447
int TLSX_Cookie_Use(const WOLFSSL* ssl, const byte* data, word16 len, byte* mac,
7448
                    byte macSz, int resp, TLSX** exts)
7449
{
7450
    int     ret = 0;
7451
    TLSX*   extension;
7452
    Cookie* cookie;
7453
7454
    /* Find the cookie extension if it exists. */
7455
    extension = TLSX_Find(*exts, TLSX_COOKIE);
7456
    if (extension == NULL) {
7457
        /* Push new cookie extension. */
7458
        ret = TLSX_Push(exts, TLSX_COOKIE, NULL, ssl->heap);
7459
        if (ret != 0)
7460
            return ret;
7461
7462
        extension = TLSX_Find(*exts, TLSX_COOKIE);
7463
        if (extension == NULL)
7464
            return MEMORY_E;
7465
    }
7466
7467
    cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz, ssl->heap,
7468
                              DYNAMIC_TYPE_TLSX);
7469
    if (cookie == NULL)
7470
        return MEMORY_E;
7471
7472
    cookie->len = len + macSz;
7473
    XMEMCPY(cookie->data, data, len);
7474
    if (mac != NULL)
7475
        XMEMCPY(cookie->data + len, mac, macSz);
7476
7477
    XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
7478
7479
    extension->data = (void*)cookie;
7480
    extension->resp = (byte)resp;
7481
7482
    return 0;
7483
}
7484
7485
#define CKE_FREE_ALL  TLSX_Cookie_FreeAll
7486
#define CKE_GET_SIZE  TLSX_Cookie_GetSize
7487
#define CKE_WRITE     TLSX_Cookie_Write
7488
#define CKE_PARSE     TLSX_Cookie_Parse
7489
7490
#else
7491
7492
0
#define CKE_FREE_ALL(a, b)    WC_DO_NOTHING
7493
0
#define CKE_GET_SIZE(a, b, c) 0
7494
#define CKE_WRITE(a, b, c, d) 0
7495
0
#define CKE_PARSE(a, b, c, d) 0
7496
7497
#endif
7498
7499
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && \
7500
    !defined(WOLFSSL_NO_CA_NAMES) && defined(OPENSSL_EXTRA)
7501
/* Currently only settable through compatibility API */
7502
/******************************************************************************/
7503
/* Certificate Authorities                                                       */
7504
/******************************************************************************/
7505
7506
static word16 TLSX_CA_Names_GetSize(void* data)
7507
{
7508
    WOLFSSL* ssl = (WOLFSSL*)data;
7509
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7510
    word32 size = 0;
7511
7512
    /* Length of names */
7513
    size += OPAQUE16_LEN;
7514
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL; names = names->next) {
7515
        byte seq[MAX_SEQ_SZ];
7516
        WOLFSSL_X509_NAME* name = names->data.name;
7517
7518
        if (name != NULL) {
7519
            /* 16-bit length | SEQ | Len | DER of name */
7520
            size += (word32)(OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
7521
                             name->rawLen);
7522
            if (size > WOLFSSL_MAX_16BIT) {
7523
                return 0;
7524
            }
7525
        }
7526
    }
7527
    return (word16)size;
7528
}
7529
7530
static word16 TLSX_CA_Names_Write(void* data, byte* output)
7531
{
7532
    WOLFSSL* ssl = (WOLFSSL*)data;
7533
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7534
    byte* len;
7535
7536
    /* Reserve space for the length value */
7537
    len = output;
7538
    output += OPAQUE16_LEN;
7539
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL; names = names->next) {
7540
        byte seq[MAX_SEQ_SZ];
7541
        WOLFSSL_X509_NAME* name = names->data.name;
7542
7543
        if (name != NULL) {
7544
            c16toa((word16)name->rawLen +
7545
                   (word16)SetSequence(name->rawLen, seq), output);
7546
            output += OPAQUE16_LEN;
7547
            output += SetSequence(name->rawLen, output);
7548
            XMEMCPY(output, name->raw, name->rawLen);
7549
            output += name->rawLen;
7550
        }
7551
    }
7552
    /* Write the total length */
7553
    c16toa((word16)(output - len - OPAQUE16_LEN), len);
7554
    return (word16)(output - len);
7555
}
7556
7557
static int TLSX_CA_Names_Parse(WOLFSSL *ssl, const byte* input,
7558
                                  word16 length, byte isRequest)
7559
{
7560
    word16 extLen;
7561
7562
    (void)isRequest;
7563
7564
    wolfSSL_sk_X509_NAME_pop_free(ssl->peer_ca_names, NULL);
7565
    ssl->peer_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
7566
    if (ssl->peer_ca_names == NULL)
7567
        return MEMORY_ERROR;
7568
7569
    if (length < OPAQUE16_LEN)
7570
        return BUFFER_ERROR;
7571
7572
    ato16(input, &extLen);
7573
    input += OPAQUE16_LEN;
7574
    length -= OPAQUE16_LEN;
7575
    if (extLen != length)
7576
        return BUFFER_ERROR;
7577
7578
    while (length) {
7579
        word16 idx = 0;
7580
        WOLFSSL_X509_NAME* name = NULL;
7581
        int ret = 0;
7582
        int didInit = FALSE;
7583
        /* Use a DecodedCert struct to get access to GetName to
7584
         * parse DN name */
7585
#ifdef WOLFSSL_SMALL_STACK
7586
        DecodedCert *cert = (DecodedCert *)XMALLOC(
7587
            sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
7588
        if (cert == NULL)
7589
            return MEMORY_ERROR;
7590
#else
7591
        DecodedCert cert[1];
7592
#endif
7593
7594
        if (length < OPAQUE16_LEN) {
7595
            ret = BUFFER_ERROR;
7596
        }
7597
7598
        if (ret == 0) {
7599
            ato16(input, &extLen);
7600
            idx += OPAQUE16_LEN;
7601
7602
            if (extLen > length - idx)
7603
                ret = BUFFER_ERROR;
7604
        }
7605
7606
        if (ret == 0) {
7607
            InitDecodedCert(cert, input + idx, extLen, ssl->heap);
7608
            didInit = TRUE;
7609
            idx += extLen;
7610
            ret = GetName(cert, ASN_SUBJECT, extLen);
7611
        }
7612
7613
        if (ret == 0 && (name = wolfSSL_X509_NAME_new()) == NULL)
7614
            ret = MEMORY_ERROR;
7615
7616
        if (ret == 0) {
7617
            CopyDecodedName(name, cert, ASN_SUBJECT);
7618
            if (wolfSSL_sk_X509_NAME_push(ssl->peer_ca_names, name) <= 0) {
7619
                wolfSSL_X509_NAME_free(name);
7620
                ret = MEMORY_ERROR;
7621
            }
7622
        }
7623
7624
        if (didInit)
7625
            FreeDecodedCert(cert);
7626
7627
        WC_FREE_VAR_EX(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
7628
        if (ret != 0)
7629
            return ret;
7630
7631
        input += idx;
7632
        length -= idx;
7633
    }
7634
    return 0;
7635
}
7636
7637
#define CAN_GET_SIZE(data)      TLSX_CA_Names_GetSize(data)
7638
#define CAN_WRITE(data, output) TLSX_CA_Names_Write(data, output)
7639
#define CAN_PARSE(ssl, input, length, isRequest) \
7640
                                TLSX_CA_Names_Parse(ssl, input, length, isRequest)
7641
7642
#else
7643
7644
#define CAN_GET_SIZE(data)                       0
7645
#define CAN_WRITE(data, output)                  0
7646
#define CAN_PARSE(ssl, input, length, isRequest) 0
7647
7648
#endif
7649
7650
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
7651
/******************************************************************************/
7652
/* Signature Algorithms                                                       */
7653
/******************************************************************************/
7654
7655
/* Return the size of the SignatureAlgorithms extension's data.
7656
 *
7657
 * data  Unused
7658
 * returns the length of data that will be in the extension.
7659
 */
7660
7661
static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
7662
15.1k
{
7663
15.1k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7664
7665
15.1k
    if (sa->hashSigAlgoSz == 0)
7666
15.1k
        return OPAQUE16_LEN + WOLFSSL_SUITES(sa->ssl)->hashSigAlgoSz;
7667
0
    else
7668
0
        return OPAQUE16_LEN + sa->hashSigAlgoSz;
7669
15.1k
}
7670
7671
/* Creates a bit string of supported hash algorithms with RSA PSS.
7672
 * The bit string is used when determining which signature algorithm to use
7673
 * when creating the CertificateVerify message.
7674
 * Note: Valid data has an even length as each signature algorithm is two bytes.
7675
 *
7676
 * ssl     The SSL/TLS object.
7677
 * input   The buffer with the list of supported signature algorithms.
7678
 * length  The length of the list in bytes.
7679
 * returns 0 on success, BUFFER_ERROR when the length is not even.
7680
 */
7681
static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, const byte* input,
7682
                                           word16 length)
7683
14.0k
{
7684
14.0k
    word16 i;
7685
7686
14.0k
    if ((length & 1) == 1)
7687
0
        return BUFFER_ERROR;
7688
7689
14.0k
    ssl->pssAlgo = 0;
7690
287k
    for (i = 0; i < length; i += 2) {
7691
273k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
7692
40.5k
            ssl->pssAlgo |= 1 << input[i + 1];
7693
273k
    #ifdef WOLFSSL_TLS13
7694
273k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
7695
79.7k
                                                   input[i + 1] <= pss_sha512) {
7696
39.6k
            ssl->pssAlgo |= 1 << input[i + 1];
7697
39.6k
        }
7698
273k
    #endif
7699
273k
    }
7700
7701
14.0k
    return 0;
7702
14.0k
}
7703
7704
/* Writes the SignatureAlgorithms extension into the buffer.
7705
 *
7706
 * data    Unused
7707
 * output  The buffer to write the extension into.
7708
 * returns the length of data that was written.
7709
 */
7710
static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
7711
13.1k
{
7712
13.1k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7713
13.1k
    const Suites* suites = WOLFSSL_SUITES(sa->ssl);
7714
13.1k
    word16 hashSigAlgoSz;
7715
7716
13.1k
    if (sa->hashSigAlgoSz == 0) {
7717
13.1k
        c16toa(suites->hashSigAlgoSz, output);
7718
13.1k
        XMEMCPY(output + OPAQUE16_LEN, suites->hashSigAlgo,
7719
13.1k
                suites->hashSigAlgoSz);
7720
13.1k
        hashSigAlgoSz = suites->hashSigAlgoSz;
7721
13.1k
    }
7722
0
    else {
7723
0
        c16toa(sa->hashSigAlgoSz, output);
7724
0
        XMEMCPY(output + OPAQUE16_LEN, sa->hashSigAlgo,
7725
0
                sa->hashSigAlgoSz);
7726
0
        hashSigAlgoSz = sa->hashSigAlgoSz;
7727
0
    }
7728
7729
13.1k
#ifndef NO_RSA
7730
13.1k
    TLSX_SignatureAlgorithms_MapPss(sa->ssl, output + OPAQUE16_LEN,
7731
13.1k
            hashSigAlgoSz);
7732
13.1k
#endif
7733
7734
13.1k
    return OPAQUE16_LEN + hashSigAlgoSz;
7735
13.1k
}
7736
7737
/* Parse the SignatureAlgorithms extension.
7738
 *
7739
 * ssl     The SSL/TLS object.
7740
 * input   The buffer with the extension data.
7741
 * length  The length of the extension data.
7742
 * returns 0 on success, otherwise failure.
7743
 */
7744
static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, const byte* input,
7745
                                  word16 length, byte isRequest, Suites* suites)
7746
968
{
7747
968
    word16 len;
7748
7749
968
    if (!isRequest)
7750
0
        return BUFFER_ERROR;
7751
7752
    /* Must contain a length and at least algorithm. */
7753
968
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7754
26
        return BUFFER_ERROR;
7755
7756
942
    ato16(input, &len);
7757
942
    input += OPAQUE16_LEN;
7758
7759
    /* Algorithm array must fill rest of data. */
7760
942
    if (length != OPAQUE16_LEN + len)
7761
49
        return BUFFER_ERROR;
7762
7763
    /* Truncate hashSigAlgo list if too long. */
7764
893
    suites->hashSigAlgoSz = len;
7765
    /* Sig Algo list size must be even. */
7766
893
    if (suites->hashSigAlgoSz % 2 != 0)
7767
0
        return BUFFER_ERROR;
7768
893
    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7769
37
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7770
37
        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7771
37
    }
7772
893
    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
7773
7774
893
    return TLSX_SignatureAlgorithms_MapPss(ssl, input, suites->hashSigAlgoSz);
7775
893
}
7776
7777
/* Sets a new SignatureAlgorithms extension into the extension list.
7778
 *
7779
 * extensions  The list of extensions.
7780
 * data        The extensions specific data.
7781
 * heap        The heap used for allocation.
7782
 * returns 0 on success, otherwise failure.
7783
 */
7784
static int TLSX_SetSignatureAlgorithms(TLSX** extensions, WOLFSSL* ssl,
7785
                                       void* heap)
7786
19.0k
{
7787
19.0k
    SignatureAlgorithms* sa;
7788
19.0k
    int ret;
7789
7790
19.0k
    if (extensions == NULL)
7791
0
        return BAD_FUNC_ARG;
7792
7793
    /* Already present */
7794
19.0k
    if (TLSX_Find(*extensions, TLSX_SIGNATURE_ALGORITHMS) != NULL)
7795
38
        return 0;
7796
7797
18.9k
    sa = TLSX_SignatureAlgorithms_New(ssl, 0, heap);
7798
18.9k
    if (sa == NULL)
7799
1
        return MEMORY_ERROR;
7800
7801
18.9k
    ret = TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, sa, heap);
7802
18.9k
    if (ret != 0)
7803
2
        TLSX_SignatureAlgorithms_FreeAll(sa, heap);
7804
18.9k
    return ret;
7805
18.9k
}
7806
7807
SignatureAlgorithms* TLSX_SignatureAlgorithms_New(WOLFSSL* ssl,
7808
        word16 hashSigAlgoSz, void* heap)
7809
18.9k
{
7810
18.9k
    SignatureAlgorithms* sa;
7811
18.9k
    (void)heap;
7812
7813
18.9k
    sa = (SignatureAlgorithms*)XMALLOC(sizeof(*sa) + hashSigAlgoSz, heap,
7814
18.9k
                                       DYNAMIC_TYPE_TLSX);
7815
18.9k
    if (sa != NULL) {
7816
18.9k
        XMEMSET(sa, 0, sizeof(*sa) + hashSigAlgoSz);
7817
18.9k
        sa->ssl = ssl;
7818
18.9k
        sa->hashSigAlgoSz = hashSigAlgoSz;
7819
18.9k
    }
7820
18.9k
    return sa;
7821
18.9k
}
7822
7823
void TLSX_SignatureAlgorithms_FreeAll(SignatureAlgorithms* sa,
7824
                                             void* heap)
7825
18.9k
{
7826
18.9k
    XFREE(sa, heap, DYNAMIC_TYPE_TLSX);
7827
18.9k
    (void)heap;
7828
18.9k
}
7829
7830
0
#define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
7831
#define SA_WRITE     TLSX_SignatureAlgorithms_Write
7832
0
#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
7833
0
#define SA_FREE_ALL  TLSX_SignatureAlgorithms_FreeAll
7834
#endif
7835
/******************************************************************************/
7836
/* Signature Algorithms Certificate                                           */
7837
/******************************************************************************/
7838
7839
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
7840
/* Return the size of the SignatureAlgorithms extension's data.
7841
 *
7842
 * data  Unused
7843
 * returns the length of data that will be in the extension.
7844
 */
7845
static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
7846
0
{
7847
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7848
7849
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
7850
0
}
7851
7852
/* Writes the SignatureAlgorithmsCert extension into the buffer.
7853
 *
7854
 * data    Unused
7855
 * output  The buffer to write the extension into.
7856
 * returns the length of data that was written.
7857
 */
7858
static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
7859
0
{
7860
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7861
7862
0
    c16toa(ssl->certHashSigAlgoSz, output);
7863
0
    XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
7864
0
            ssl->certHashSigAlgoSz);
7865
7866
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
7867
0
}
7868
7869
/* Parse the SignatureAlgorithmsCert extension.
7870
 *
7871
 * ssl     The SSL/TLS object.
7872
 * input   The buffer with the extension data.
7873
 * length  The length of the extension data.
7874
 * returns 0 on success, otherwise failure.
7875
 */
7876
static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, const byte* input,
7877
                                              word16 length, byte isRequest)
7878
32
{
7879
32
    word16 len;
7880
7881
32
    if (!isRequest)
7882
0
        return BUFFER_ERROR;
7883
7884
    /* Must contain a length and at least algorithm. */
7885
32
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7886
6
        return BUFFER_ERROR;
7887
7888
26
    ato16(input, &len);
7889
26
    input += OPAQUE16_LEN;
7890
7891
    /* Algorithm array must fill rest of data. */
7892
26
    if (length != OPAQUE16_LEN + len)
7893
18
        return BUFFER_ERROR;
7894
7895
    /* truncate hashSigAlgo list if too long */
7896
8
    ssl->certHashSigAlgoSz = len;
7897
8
    if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7898
1
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7899
1
        ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7900
1
    }
7901
8
    XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
7902
7903
8
    return 0;
7904
26
}
7905
7906
/* Sets a new SignatureAlgorithmsCert extension into the extension list.
7907
 *
7908
 * extensions  The list of extensions.
7909
 * data        The extensions specific data.
7910
 * heap        The heap used for allocation.
7911
 * returns 0 on success, otherwise failure.
7912
 */
7913
static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions,
7914
        const WOLFSSL* data, void* heap)
7915
0
{
7916
0
    if (extensions == NULL)
7917
0
        return BAD_FUNC_ARG;
7918
7919
0
    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, data, heap);
7920
0
}
7921
7922
0
#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
7923
#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
7924
0
#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
7925
#endif /* WOLFSSL_TLS13 */
7926
7927
7928
/******************************************************************************/
7929
/* Key Share                                                                  */
7930
/******************************************************************************/
7931
7932
#ifndef MAX_KEYSHARE_NAMED_GROUPS
7933
    #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY)
7934
799
        #define MAX_KEYSHARE_NAMED_GROUPS    24
7935
    #else
7936
        #define MAX_KEYSHARE_NAMED_GROUPS    12
7937
    #endif
7938
#endif
7939
7940
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
7941
/* Create a key share entry using named Diffie-Hellman parameters group.
7942
 * Generates a key pair.
7943
 *
7944
 * ssl   The SSL/TLS object.
7945
 * kse   The key share entry object.
7946
 * returns 0 on success, otherwise failure.
7947
 */
7948
static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
7949
45
{
7950
45
    int ret = 0;
7951
45
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
7952
45
    word32 pSz = 0, pvtSz = 0;
7953
45
    DhKey* dhKey = (DhKey*)kse->key;
7954
7955
    /* Pick the parameters from the named group. */
7956
45
#ifdef HAVE_PUBLIC_FFDHE
7957
45
    const DhParams* params = NULL;
7958
45
    switch (kse->group) {
7959
0
    #ifdef HAVE_FFDHE_2048
7960
45
        case WOLFSSL_FFDHE_2048:
7961
45
            params = wc_Dh_ffdhe2048_Get();
7962
45
            pvtSz = 29;
7963
45
            break;
7964
0
    #endif
7965
    #ifdef HAVE_FFDHE_3072
7966
        case WOLFSSL_FFDHE_3072:
7967
            params = wc_Dh_ffdhe3072_Get();
7968
            pvtSz = 34;
7969
            break;
7970
    #endif
7971
    #ifdef HAVE_FFDHE_4096
7972
        case WOLFSSL_FFDHE_4096:
7973
            params = wc_Dh_ffdhe4096_Get();
7974
            pvtSz = 39;
7975
            break;
7976
    #endif
7977
    #ifdef HAVE_FFDHE_6144
7978
        case WOLFSSL_FFDHE_6144:
7979
            params = wc_Dh_ffdhe6144_Get();
7980
            pvtSz = 46;
7981
            break;
7982
    #endif
7983
    #ifdef HAVE_FFDHE_8192
7984
        case WOLFSSL_FFDHE_8192:
7985
            params = wc_Dh_ffdhe8192_Get();
7986
            pvtSz = 52;
7987
            break;
7988
    #endif
7989
0
        default:
7990
0
            break;
7991
45
    }
7992
45
    if (params == NULL)
7993
0
        return BAD_FUNC_ARG;
7994
45
    pSz = params->p_len;
7995
#else
7996
    pvtSz = wc_DhGetNamedKeyMinSize(kse->group);
7997
    if (pvtSz == 0) {
7998
        return BAD_FUNC_ARG;
7999
    }
8000
    ret = wc_DhGetNamedKeyParamSize(kse->group, &pSz, NULL, NULL);
8001
    if (ret != 0) {
8002
        return BAD_FUNC_ARG;
8003
    }
8004
#endif
8005
8006
    /* Trigger Key Generation */
8007
45
    if (kse->pubKey == NULL || kse->privKey == NULL) {
8008
45
        if (kse->key == NULL) {
8009
45
            kse->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
8010
45
                DYNAMIC_TYPE_DH);
8011
45
            if (kse->key == NULL)
8012
0
                return MEMORY_E;
8013
8014
            /* Setup Key */
8015
45
            ret = wc_InitDhKey_ex((DhKey*)kse->key, ssl->heap, ssl->devId);
8016
45
            if (ret == 0) {
8017
45
                dhKey = (DhKey*)kse->key;
8018
45
            #ifdef HAVE_PUBLIC_FFDHE
8019
45
                ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
8020
45
                                                                 params->g_len);
8021
            #else
8022
                ret = wc_DhSetNamedKey(dhKey, kse->group);
8023
            #endif
8024
45
            }
8025
        #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8026
            defined(WC_ASYNC_ENABLE_DH)
8027
            /* Only set non-blocking context when async device is active. With
8028
             * INVALID_DEVID there is no async loop to retry on MP_WOULDBLOCK, so
8029
             * skip non-blocking setup and use blocking mode instead. */
8030
            if (ret == 0 && ssl->devId != INVALID_DEVID) {
8031
                DhNb* dhNb = (DhNb*)XMALLOC(sizeof(DhNb), ssl->heap,
8032
                                            DYNAMIC_TYPE_TMP_BUFFER);
8033
                if (dhNb == NULL) {
8034
                    ret = MEMORY_E;
8035
                }
8036
                else {
8037
                    ret = wc_DhSetNonBlock((DhKey*)kse->key, dhNb);
8038
                    if (ret != 0) {
8039
                        XFREE(dhNb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8040
                    }
8041
                }
8042
            }
8043
        #endif /* WC_DH_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8044
                  WC_ASYNC_ENABLE_DH */
8045
45
        }
8046
8047
        /* Allocate space for the private and public key */
8048
45
        if (ret == 0 && kse->pubKey == NULL) {
8049
45
            kse->pubKey = (byte*)XMALLOC(pSz, ssl->heap,
8050
45
                DYNAMIC_TYPE_PUBLIC_KEY);
8051
45
            if (kse->pubKey == NULL)
8052
0
                ret = MEMORY_E;
8053
45
        }
8054
8055
45
        if (ret == 0 && kse->privKey == NULL) {
8056
45
            kse->privKey = (byte*)XMALLOC(pvtSz, ssl->heap,
8057
45
                DYNAMIC_TYPE_PRIVATE_KEY);
8058
45
            if (kse->privKey == NULL)
8059
0
                ret = MEMORY_E;
8060
45
        }
8061
8062
45
        if (ret == 0) {
8063
        #if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
8064
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_DH, kse->key);
8065
            kse->pubKeyLen = pSz;
8066
            kse->keyLen = pvtSz;
8067
            if (ret == 0) {
8068
                ret = wc_DhExportKeyPair(dhKey,
8069
                    (byte*)kse->privKey, &kse->keyLen, /* private */
8070
                    kse->pubKey, &kse->pubKeyLen /* public */
8071
                );
8072
            }
8073
            else
8074
        #endif
8075
45
            {
8076
                /* Generate a new key pair */
8077
                /* For async this is called once and when event is done, the
8078
                 *   provided buffers will be populated.
8079
                 * Final processing is zero pad below. */
8080
45
                kse->pubKeyLen = pSz;
8081
45
                kse->keyLen = pvtSz;
8082
45
                ret = DhGenKeyPair(ssl, dhKey,
8083
45
                    (byte*)kse->privKey, &kse->keyLen, /* private */
8084
45
                    kse->pubKey, &kse->pubKeyLen /* public */
8085
45
                );
8086
            #ifdef WOLFSSL_ASYNC_CRYPT
8087
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8088
                    return ret;
8089
                }
8090
            #endif
8091
45
            }
8092
45
        }
8093
45
    }
8094
8095
45
    if (ret == 0) {
8096
45
        if (pSz != kse->pubKeyLen) {
8097
            /* Zero pad the front of the public key to match prime "p" size */
8098
0
            XMEMMOVE(kse->pubKey + pSz - kse->pubKeyLen, kse->pubKey,
8099
0
                kse->pubKeyLen);
8100
0
            XMEMSET(kse->pubKey, 0, pSz - kse->pubKeyLen);
8101
0
            kse->pubKeyLen = pSz;
8102
0
        }
8103
8104
45
        if (pvtSz != kse->keyLen) {
8105
            /* Zero pad the front of the private key */
8106
0
            XMEMMOVE(kse->privKey + pvtSz - kse->keyLen, kse->privKey,
8107
0
                kse->keyLen);
8108
0
            XMEMSET(kse->privKey, 0, pvtSz - kse->keyLen);
8109
0
            kse->keyLen = pvtSz;
8110
0
        }
8111
8112
    #ifdef WOLFSSL_DEBUG_TLS
8113
        WOLFSSL_MSG("Public DH Key");
8114
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8115
    #endif
8116
45
    }
8117
8118
    /* Always release the DH key to free up memory.
8119
     * The DhKey will be setup again in TLSX_KeyShare_ProcessDh */
8120
45
    if (dhKey != NULL) {
8121
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8122
        defined(WC_ASYNC_ENABLE_DH)
8123
        if (dhKey->nb != NULL) {
8124
            XFREE(dhKey->nb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8125
            dhKey->nb = NULL;
8126
        }
8127
    #endif
8128
45
        wc_FreeDhKey(dhKey);
8129
45
    }
8130
45
    XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
8131
45
    kse->key = NULL;
8132
8133
45
    if (ret != 0) {
8134
        /* Cleanup on error, otherwise data owned by key share entry */
8135
0
        if (kse->privKey) {
8136
0
            ForceZero(kse->privKey, pvtSz);
8137
0
            XFREE(kse->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8138
0
            kse->privKey = NULL;
8139
0
        }
8140
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8141
0
        kse->pubKey = NULL;
8142
0
    }
8143
#else
8144
    (void)ssl;
8145
    (void)kse;
8146
8147
    ret = NOT_COMPILED_IN;
8148
    WOLFSSL_ERROR_VERBOSE(ret);
8149
#endif
8150
8151
45
    return ret;
8152
45
}
8153
8154
/* Create a key share entry using X25519 parameters group.
8155
 * Generates a key pair.
8156
 *
8157
 * ssl   The SSL/TLS object.
8158
 * kse   The key share entry object.
8159
 * returns 0 on success, otherwise failure.
8160
 */
8161
static int TLSX_KeyShare_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
8162
3.06k
{
8163
3.06k
    int ret = 0;
8164
3.06k
#ifdef HAVE_CURVE25519
8165
3.06k
    curve25519_key* key = (curve25519_key*)kse->key;
8166
8167
3.06k
    if (kse->key == NULL) {
8168
        /* Allocate a Curve25519 key to hold private key. */
8169
3.06k
        kse->key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
8170
3.06k
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8171
3.06k
        if (kse->key == NULL) {
8172
0
            WOLFSSL_MSG("GenX25519Key memory error");
8173
0
            return MEMORY_E;
8174
0
        }
8175
8176
        /* Make an Curve25519 key. */
8177
3.06k
        ret = wc_curve25519_init_ex((curve25519_key*)kse->key, ssl->heap,
8178
3.06k
            ssl->devId);
8179
3.06k
        if (ret == 0) {
8180
            /* setting "key" means okay to call wc_curve25519_free */
8181
3.06k
            key = (curve25519_key*)kse->key;
8182
3.06k
            kse->keyLen = CURVE25519_KEYSIZE;
8183
3.06k
        }
8184
    #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8185
        defined(WC_ASYNC_ENABLE_X25519)
8186
        /* Only set non-blocking context when async device is active. With
8187
         * INVALID_DEVID there is no async loop to retry on FP_WOULDBLOCK, so
8188
         * skip non-blocking setup and use blocking mode instead. */
8189
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
8190
            x25519_nb_ctx_t* nb_ctx = (x25519_nb_ctx_t*)XMALLOC(
8191
                sizeof(x25519_nb_ctx_t), ssl->heap,
8192
                DYNAMIC_TYPE_TMP_BUFFER);
8193
            if (nb_ctx == NULL) {
8194
                ret = MEMORY_E;
8195
            }
8196
            else {
8197
                ret = wc_curve25519_set_nonblock(key, nb_ctx);
8198
                if (ret != 0) {
8199
                    XFREE(nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8200
                }
8201
            }
8202
        }
8203
    #endif /* WC_X25519_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8204
              WC_ASYNC_ENABLE_X25519 */
8205
3.06k
        if (ret == 0) {
8206
        #ifdef WOLFSSL_STATIC_EPHEMERAL
8207
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE25519, kse->key);
8208
            if (ret != 0) /* on failure, fallback to local key generation */
8209
        #endif
8210
3.06k
            {
8211
            #ifdef WOLFSSL_ASYNC_CRYPT
8212
                /* initialize event */
8213
                ret = wolfSSL_AsyncInit(ssl, &key->asyncDev,
8214
                    WC_ASYNC_FLAG_NONE);
8215
                if (ret != 0)
8216
                    return ret;
8217
            #endif
8218
3.06k
                ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
8219
8220
                /* Handle async pending response */
8221
            #ifdef WOLFSSL_ASYNC_CRYPT
8222
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8223
                    return wolfSSL_AsyncPush(ssl, &key->asyncDev);
8224
                }
8225
            #endif /* WOLFSSL_ASYNC_CRYPT */
8226
3.06k
            }
8227
3.06k
        }
8228
3.06k
    }
8229
8230
3.06k
    if (ret == 0 && kse->pubKey == NULL) {
8231
        /* Allocate space for the public key. */
8232
3.05k
        kse->pubKey = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
8233
3.05k
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8234
3.05k
        if (kse->pubKey == NULL) {
8235
0
            WOLFSSL_MSG("GenX25519Key pub memory error");
8236
0
            ret = MEMORY_E;
8237
0
        }
8238
3.05k
    }
8239
8240
3.06k
    if (ret == 0) {
8241
        /* Export Curve25519 public key. */
8242
3.05k
        kse->pubKeyLen = CURVE25519_KEYSIZE;
8243
3.05k
        if (wc_curve25519_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8244
3.05k
                                                  EC25519_LITTLE_ENDIAN) != 0) {
8245
0
            ret = ECC_EXPORT_ERROR;
8246
0
            WOLFSSL_ERROR_VERBOSE(ret);
8247
0
        }
8248
3.05k
        kse->pubKeyLen = CURVE25519_KEYSIZE; /* always CURVE25519_KEYSIZE */
8249
3.05k
    }
8250
8251
#ifdef WOLFSSL_DEBUG_TLS
8252
    if (ret == 0) {
8253
        WOLFSSL_MSG("Public Curve25519 Key");
8254
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8255
    }
8256
#endif
8257
8258
3.06k
    if (ret != 0) {
8259
        /* Data owned by key share entry otherwise. */
8260
8
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8261
8
        kse->pubKey = NULL;
8262
8
        if (key != NULL) {
8263
        #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
8264
            if (key->nb_ctx != NULL) {
8265
                XFREE(key->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8266
            }
8267
        #endif
8268
8
            wc_curve25519_free(key);
8269
8
        }
8270
8
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8271
8
        kse->key = NULL;
8272
8
    }
8273
#else
8274
    (void)ssl;
8275
    (void)kse;
8276
8277
    ret = NOT_COMPILED_IN;
8278
    WOLFSSL_ERROR_VERBOSE(ret);
8279
#endif /* HAVE_CURVE25519 */
8280
8281
3.06k
    return ret;
8282
3.06k
}
8283
8284
/* Create a key share entry using X448 parameters group.
8285
 * Generates a key pair.
8286
 *
8287
 * ssl   The SSL/TLS object.
8288
 * kse   The key share entry object.
8289
 * returns 0 on success, otherwise failure.
8290
 */
8291
static int TLSX_KeyShare_GenX448Key(WOLFSSL *ssl, KeyShareEntry* kse)
8292
4
{
8293
4
    int ret = 0;
8294
4
#ifdef HAVE_CURVE448
8295
4
    curve448_key* key = (curve448_key*)kse->key;
8296
8297
4
    if (kse->key == NULL) {
8298
        /* Allocate a Curve448 key to hold private key. */
8299
4
        kse->key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
8300
4
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8301
4
        if (kse->key == NULL) {
8302
0
            WOLFSSL_MSG("GenX448Key memory error");
8303
0
            return MEMORY_E;
8304
0
        }
8305
8306
        /* Make an Curve448 key. */
8307
4
        ret = wc_curve448_init((curve448_key*)kse->key);
8308
4
        if (ret == 0) {
8309
4
            key = (curve448_key*)kse->key;
8310
4
            kse->keyLen = CURVE448_KEY_SIZE;
8311
8312
            #ifdef WOLFSSL_STATIC_EPHEMERAL
8313
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE448, kse->key);
8314
            if (ret != 0)
8315
        #endif
8316
4
            {
8317
4
                ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
8318
4
            }
8319
4
        }
8320
4
    }
8321
8322
4
    if (ret == 0 && kse->pubKey == NULL) {
8323
        /* Allocate space for the public key. */
8324
4
        kse->pubKey = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
8325
4
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8326
4
        if (kse->pubKey == NULL) {
8327
0
            WOLFSSL_MSG("GenX448Key pub memory error");
8328
0
            ret = MEMORY_E;
8329
0
        }
8330
4
    }
8331
8332
4
    if (ret == 0) {
8333
        /* Export Curve448 public key. */
8334
4
        kse->pubKeyLen = CURVE448_KEY_SIZE;
8335
4
        if (wc_curve448_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8336
4
                                                    EC448_LITTLE_ENDIAN) != 0) {
8337
0
            ret = ECC_EXPORT_ERROR;
8338
0
        }
8339
4
        kse->pubKeyLen = CURVE448_KEY_SIZE; /* always CURVE448_KEY_SIZE */
8340
4
    }
8341
8342
#ifdef WOLFSSL_DEBUG_TLS
8343
    if (ret == 0) {
8344
        WOLFSSL_MSG("Public Curve448 Key");
8345
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8346
    }
8347
#endif
8348
8349
4
    if (ret != 0) {
8350
        /* Data owned by key share entry otherwise. */
8351
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8352
0
        kse->pubKey = NULL;
8353
0
        if (key != NULL)
8354
0
            wc_curve448_free(key);
8355
0
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8356
0
        kse->key = NULL;
8357
0
    }
8358
#else
8359
    (void)ssl;
8360
    (void)kse;
8361
8362
    ret = NOT_COMPILED_IN;
8363
    WOLFSSL_ERROR_VERBOSE(ret);
8364
#endif /* HAVE_CURVE448 */
8365
8366
4
    return ret;
8367
4
}
8368
8369
/* Create a key share entry using named elliptic curve parameters group.
8370
 * Generates a key pair.
8371
 *
8372
 * ssl   The SSL/TLS object.
8373
 * kse   The key share entry object.
8374
 * returns 0 on success, otherwise failure.
8375
 */
8376
static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
8377
0
{
8378
0
    int ret = 0;
8379
0
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
8380
0
    word32 keySize = 0;
8381
0
    word16 curveId = (word16) ECC_CURVE_INVALID;
8382
0
    ecc_key* eccKey = (ecc_key*)kse->key;
8383
8384
    /* Translate named group to a curve id. */
8385
0
    switch (kse->group) {
8386
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
8387
0
        #ifndef NO_ECC_SECP
8388
0
        case WOLFSSL_ECC_SECP256R1:
8389
0
            curveId = ECC_SECP256R1;
8390
0
            break;
8391
0
        #endif /* !NO_ECC_SECP */
8392
0
        #ifdef WOLFSSL_SM2
8393
0
        case WOLFSSL_ECC_SM2P256V1:
8394
0
            curveId = ECC_SM2P256V1;
8395
0
            break;
8396
0
        #endif /* !WOLFSSL_SM2 */
8397
0
        #ifdef HAVE_ECC_BRAINPOOL
8398
0
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
8399
0
            curveId = ECC_BRAINPOOLP256R1;
8400
0
            break;
8401
0
        #endif /* HAVE_ECC_BRAINPOOL */
8402
0
    #endif
8403
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
8404
0
        #ifndef NO_ECC_SECP
8405
0
        case WOLFSSL_ECC_SECP384R1:
8406
0
            curveId = ECC_SECP384R1;
8407
0
            break;
8408
0
        #endif /* !NO_ECC_SECP */
8409
0
        #ifdef HAVE_ECC_BRAINPOOL
8410
0
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
8411
0
            curveId = ECC_BRAINPOOLP384R1;
8412
0
            break;
8413
0
        #endif /* HAVE_ECC_BRAINPOOL */
8414
0
    #endif
8415
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
8416
0
        #ifdef HAVE_ECC_BRAINPOOL
8417
0
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
8418
0
            curveId = ECC_BRAINPOOLP512R1;
8419
0
            break;
8420
0
        #endif /* HAVE_ECC_BRAINPOOL */
8421
0
    #endif
8422
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
8423
0
        #ifndef NO_ECC_SECP
8424
0
        case WOLFSSL_ECC_SECP521R1:
8425
0
            curveId = ECC_SECP521R1;
8426
0
            break;
8427
0
        #endif /* !NO_ECC_SECP */
8428
0
    #endif
8429
0
        default:
8430
0
            WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
8431
0
            return BAD_FUNC_ARG;
8432
0
    }
8433
8434
0
    {
8435
0
        int size = wc_ecc_get_curve_size_from_id(curveId);
8436
0
        if (size < 0) {
8437
0
            WOLFSSL_ERROR_VERBOSE(size);
8438
0
            return size;
8439
0
        }
8440
0
        keySize = (word32)size;
8441
0
    }
8442
8443
0
    if (kse->key == NULL) {
8444
        /* Allocate an ECC key to hold private key. */
8445
0
        kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC);
8446
0
        if (kse->key == NULL) {
8447
0
            WOLFSSL_MSG_EX("Failed to allocate %d bytes, ssl->heap: %p",
8448
0
                           (int)sizeof(ecc_key), (wc_ptr_t)ssl->heap);
8449
0
            WOLFSSL_MSG("EccTempKey Memory error!");
8450
0
            return MEMORY_E;
8451
0
        }
8452
8453
        /* Initialize an ECC key struct for the ephemeral key */
8454
0
        ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
8455
8456
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8457
        defined(WC_ASYNC_ENABLE_ECC)
8458
        /* Only set non-blocking context when async device is active. With
8459
         * INVALID_DEVID there is no async loop to retry on FP_WOULDBLOCK, so
8460
         * skip non-blocking setup and use blocking mode instead. */
8461
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
8462
            ecc_nb_ctx_t* eccNbCtx = (ecc_nb_ctx_t*)XMALLOC(
8463
                sizeof(ecc_nb_ctx_t), ssl->heap,
8464
                DYNAMIC_TYPE_TMP_BUFFER);
8465
            if (eccNbCtx == NULL) {
8466
                ret = MEMORY_E;
8467
            }
8468
            else {
8469
                ret = wc_ecc_set_nonblock((ecc_key*)kse->key, eccNbCtx);
8470
                if (ret != 0) {
8471
                    XFREE(eccNbCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8472
                }
8473
            }
8474
        }
8475
    #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8476
              WC_ASYNC_ENABLE_ECC */
8477
8478
0
        if (ret == 0) {
8479
0
            kse->keyLen = keySize;
8480
0
            kse->pubKeyLen = keySize * 2 + 1;
8481
8482
        #if defined(WOLFSSL_RENESAS_TSIP_TLS)
8483
            ret = tsip_Tls13GenEccKeyPair(ssl, kse);
8484
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
8485
                return ret;
8486
            }
8487
        #endif
8488
            /* setting eccKey means okay to call wc_ecc_free */
8489
0
            eccKey = (ecc_key*)kse->key;
8490
8491
        #ifdef WOLFSSL_STATIC_EPHEMERAL
8492
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_ECDH, kse->key);
8493
            if (ret != 0 || eccKey->dp->id != curveId)
8494
        #endif
8495
0
            {
8496
                /* set curve info for EccMakeKey "peer" info */
8497
0
                ret = wc_ecc_set_curve(eccKey, (int)kse->keyLen, curveId);
8498
0
                if (ret == 0) {
8499
            #ifdef WOLFSSL_ASYNC_CRYPT
8500
                    /* Detect when private key generation is done */
8501
                    if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) &&
8502
                            eccKey->type == ECC_PRIVATEKEY) {
8503
                        ret = 0; /* ECC Key Generation is done */
8504
                    }
8505
                    else
8506
            #endif
8507
0
                    {
8508
                        /* Generate ephemeral ECC key */
8509
                        /* For async this is called once and when event is done, the
8510
                        *   provided buffers in key be populated.
8511
                        * Final processing is x963 key export below. */
8512
0
                        ret = EccMakeKey(ssl, eccKey, eccKey);
8513
0
                    }
8514
0
                }
8515
            #ifdef WOLFSSL_ASYNC_CRYPT
8516
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
8517
                    return ret;
8518
            #endif
8519
0
            }
8520
0
        }
8521
0
    }
8522
8523
0
    if (ret == 0 && kse->pubKey == NULL) {
8524
        /* Allocate space for the public key */
8525
0
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8526
0
            DYNAMIC_TYPE_PUBLIC_KEY);
8527
0
        if (kse->pubKey == NULL) {
8528
0
            WOLFSSL_MSG("Key data Memory error");
8529
0
            ret = MEMORY_E;
8530
0
        }
8531
0
    }
8532
8533
0
    if (ret == 0) {
8534
0
        XMEMSET(kse->pubKey, 0, kse->pubKeyLen);
8535
8536
        /* Export public key. */
8537
0
        PRIVATE_KEY_UNLOCK();
8538
0
        if (wc_ecc_export_x963(eccKey, kse->pubKey, &kse->pubKeyLen) != 0) {
8539
0
            ret = ECC_EXPORT_ERROR;
8540
0
            WOLFSSL_ERROR_VERBOSE(ret);
8541
0
        }
8542
0
        PRIVATE_KEY_LOCK();
8543
0
    }
8544
#ifdef WOLFSSL_DEBUG_TLS
8545
    if (ret == 0) {
8546
        WOLFSSL_MSG("Public ECC Key");
8547
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8548
    }
8549
#endif
8550
8551
0
    if (ret != 0) {
8552
        /* Cleanup on error, otherwise data owned by key share entry */
8553
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8554
0
        kse->pubKey = NULL;
8555
0
        if (eccKey != NULL) {
8556
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8557
        defined(WC_ASYNC_ENABLE_ECC)
8558
            if (eccKey->nb_ctx != NULL) {
8559
                XFREE(eccKey->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8560
            }
8561
    #endif
8562
0
            wc_ecc_free(eccKey);
8563
0
        }
8564
0
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8565
0
        kse->key = NULL;
8566
0
    }
8567
#else
8568
    (void)ssl;
8569
    (void)kse;
8570
8571
    ret = NOT_COMPILED_IN;
8572
    WOLFSSL_ERROR_VERBOSE(ret);
8573
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
8574
8575
0
    return ret;
8576
0
}
8577
8578
#ifdef WOLFSSL_HAVE_MLKEM
8579
#if (defined(WOLFSSL_MLKEM_CACHE_A) || \
8580
    (defined(HAVE_PKCS11) && !defined(NO_PKCS11_MLKEM))) && \
8581
    !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY)
8582
    /* Store KyberKey object rather than private key bytes in key share entry.
8583
     * Improves performance at cost of more dynamic memory being used. */
8584
    #define WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8585
#endif
8586
#if defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY) && \
8587
    defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ)
8588
    #error "Choose WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY or "
8589
           "WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ"
8590
#endif
8591
8592
#if !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) || \
8593
    !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) || \
8594
    (!defined(WOLFSSL_MLKEM_NO_DECAPSULATE) && \
8595
     !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ))
8596
static int mlkem_id2type(int id, int *type)
8597
2.95k
{
8598
2.95k
    int ret = 0;
8599
8600
2.95k
    switch (id) {
8601
0
#ifndef WOLFSSL_NO_ML_KEM
8602
0
    #ifndef WOLFSSL_NO_ML_KEM_512
8603
0
        case WOLFSSL_ML_KEM_512:
8604
0
            *type = WC_ML_KEM_512;
8605
0
            break;
8606
0
    #endif
8607
0
    #ifndef WOLFSSL_NO_ML_KEM_768
8608
2.95k
        case WOLFSSL_ML_KEM_768:
8609
2.95k
            *type = WC_ML_KEM_768;
8610
2.95k
            break;
8611
0
    #endif
8612
0
    #ifndef WOLFSSL_NO_ML_KEM_1024
8613
0
        case WOLFSSL_ML_KEM_1024:
8614
0
            *type = WC_ML_KEM_1024;
8615
0
            break;
8616
0
    #endif
8617
0
#endif
8618
#ifdef WOLFSSL_MLKEM_KYBER
8619
    #ifdef WOLFSSL_KYBER512
8620
        case WOLFSSL_KYBER_LEVEL1:
8621
            *type = KYBER512;
8622
            break;
8623
    #endif
8624
    #ifdef WOLFSSL_KYBER768
8625
        case WOLFSSL_KYBER_LEVEL3:
8626
            *type = KYBER768;
8627
            break;
8628
    #endif
8629
    #ifdef WOLFSSL_KYBER1024
8630
        case WOLFSSL_KYBER_LEVEL5:
8631
            *type = KYBER1024;
8632
            break;
8633
    #endif
8634
#endif
8635
0
        default:
8636
0
            ret = NOT_COMPILED_IN;
8637
0
            break;
8638
2.95k
    }
8639
8640
2.95k
    return ret;
8641
2.95k
}
8642
#endif
8643
8644
#if defined(WOLFSSL_NO_ML_KEM_768) && defined(WOLFSSL_NO_ML_KEM_1024) && \
8645
    defined(WOLFSSL_PQC_HYBRIDS)
8646
    #error "PQC hybrid combinations require either ML-KEM 768 or ML-KEM 1024"
8647
#endif
8648
8649
/* Structures and objects needed for hybrid key exchanges using both classic
8650
 * ECDHE and PQC KEM key material. */
8651
typedef struct PqcHybridMapping {
8652
    int hybrid;
8653
    int ecc;
8654
    int pqc;
8655
    int pqc_first;
8656
} PqcHybridMapping;
8657
8658
static const PqcHybridMapping pqc_hybrid_mapping[] = {
8659
#ifndef WOLFSSL_NO_ML_KEM
8660
#ifdef WOLFSSL_PQC_HYBRIDS
8661
    {WOLFSSL_SECP256R1MLKEM768, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_768, 0},
8662
    {WOLFSSL_SECP384R1MLKEM1024, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_1024, 0},
8663
#endif /* WOLFSSL_PQC_HYBRIDS */
8664
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
8665
    {WOLFSSL_SECP256R1MLKEM512, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8666
    {WOLFSSL_SECP384R1MLKEM768, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8667
    {WOLFSSL_SECP521R1MLKEM1024, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8668
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
8669
    {WOLFSSL_P256_ML_KEM_512_OLD, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8670
    {WOLFSSL_P384_ML_KEM_768_OLD, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8671
    {WOLFSSL_P521_ML_KEM_1024_OLD, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8672
#endif /* WOLFSSL_ML_KEM_USE_OLD_IDS */
8673
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
8674
#ifdef HAVE_CURVE25519
8675
#ifdef WOLFSSL_PQC_HYBRIDS
8676
    {WOLFSSL_X25519MLKEM768, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_768, 1},
8677
#endif /* WOLFSSL_PQC_HYBRIDS */
8678
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
8679
    {WOLFSSL_X25519MLKEM512, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_512, 1},
8680
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
8681
#endif /* HAVE_CURVE25519 */
8682
#ifdef HAVE_CURVE448
8683
#ifdef WOLFSSL_EXTRA_PQC_HYBRIDS
8684
    {WOLFSSL_X448MLKEM768, WOLFSSL_ECC_X448, WOLFSSL_ML_KEM_768, 1},
8685
#endif /* WOLFSSL_EXTRA_PQC_HYBRIDS */
8686
#endif /* HAVE_CURVE448 */
8687
#endif /* WOLFSSL_NO_ML_KEM */
8688
#ifdef WOLFSSL_MLKEM_KYBER
8689
    {WOLFSSL_P256_KYBER_LEVEL1, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL1, 0},
8690
    {WOLFSSL_P384_KYBER_LEVEL3, WOLFSSL_ECC_SECP384R1, WOLFSSL_KYBER_LEVEL3, 0},
8691
    {WOLFSSL_P256_KYBER_LEVEL3, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL3, 0},
8692
    {WOLFSSL_P521_KYBER_LEVEL5, WOLFSSL_ECC_SECP521R1, WOLFSSL_KYBER_LEVEL5, 0},
8693
#ifdef HAVE_CURVE25519
8694
    {WOLFSSL_X25519_KYBER_LEVEL1, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL1, 0},
8695
    {WOLFSSL_X25519_KYBER_LEVEL3, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL3, 0},
8696
#endif
8697
#ifdef HAVE_CURVE448
8698
    {WOLFSSL_X448_KYBER_LEVEL3, WOLFSSL_ECC_X448, WOLFSSL_KYBER_LEVEL3, 0},
8699
#endif
8700
#endif /* WOLFSSL_MLKEM_KYBER */
8701
    {0, 0, 0, 0}
8702
};
8703
8704
/* Map an ecc-pqc hybrid group into its ecc group and pqc kem group. */
8705
static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group)
8706
5.95k
{
8707
5.95k
    int i;
8708
8709
5.95k
    if (pqc != NULL)
8710
2.96k
        *pqc = 0;
8711
5.95k
    if (ecc != NULL)
8712
5.95k
        *ecc = 0;
8713
5.95k
    if (pqc_first != NULL)
8714
2.96k
        *pqc_first = 0;
8715
8716
17.8k
    for (i = 0; pqc_hybrid_mapping[i].hybrid != 0; i++) {
8717
17.8k
        if (pqc_hybrid_mapping[i].hybrid == group) {
8718
5.95k
            if (pqc != NULL)
8719
2.96k
                *pqc = pqc_hybrid_mapping[i].pqc;
8720
5.95k
            if (ecc != NULL)
8721
5.95k
                *ecc = pqc_hybrid_mapping[i].ecc;
8722
5.95k
            if (pqc_first != NULL)
8723
2.96k
                *pqc_first = pqc_hybrid_mapping[i].pqc_first;
8724
5.95k
            break;
8725
5.95k
        }
8726
17.8k
    }
8727
5.95k
}
8728
8729
#ifndef WOLFSSL_MLKEM_NO_MAKE_KEY
8730
/* Create a key share entry using pqc parameters group on the client side.
8731
 * Generates a key pair.
8732
 *
8733
 * ssl   The SSL/TLS object.
8734
 * kse   The key share entry object.
8735
 * returns 0 on success, otherwise failure.
8736
 */
8737
static int TLSX_KeyShare_GenPqcKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
8738
2.95k
{
8739
2.95k
    int ret = 0;
8740
2.95k
    int type = 0;
8741
2.95k
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8742
2.95k
        WC_DECLARE_VAR(kem, KyberKey, 1, 0);
8743
2.95k
    byte* privKey = NULL;
8744
2.95k
    word32 privSz = 0;
8745
#else
8746
    KyberKey* kem = NULL;
8747
#endif
8748
8749
    /* This gets called twice. Once during parsing of the key share and once
8750
     * during the population of the extension. No need to do work the second
8751
     * time. Just return success if its already been done. */
8752
2.95k
    if (kse->pubKey != NULL) {
8753
0
        return ret;
8754
0
    }
8755
8756
    /* Get the type of key we need from the key share group. */
8757
2.95k
    ret = mlkem_id2type(kse->group, &type);
8758
2.95k
    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
8759
0
        WOLFSSL_MSG("Invalid Kyber algorithm specified.");
8760
0
        ret = BAD_FUNC_ARG;
8761
0
    }
8762
8763
2.95k
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8764
8765
2.95k
    #ifdef WOLFSSL_SMALL_STACK
8766
2.95k
    if (ret == 0) {
8767
2.95k
        kem = (KyberKey *)XMALLOC(sizeof(*kem), ssl->heap,
8768
2.95k
                                  DYNAMIC_TYPE_PRIVATE_KEY);
8769
2.95k
        if (kem == NULL) {
8770
0
            WOLFSSL_MSG("KEM memory allocation failure");
8771
0
            ret = MEMORY_ERROR;
8772
0
        }
8773
2.95k
    }
8774
2.95k
    #endif /* WOLFSSL_SMALL_STACK */
8775
8776
2.95k
    if (ret == 0) {
8777
2.95k
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
8778
2.95k
        if (ret != 0) {
8779
0
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
8780
0
        }
8781
2.95k
    }
8782
8783
2.95k
    if (ret == 0) {
8784
2.95k
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
8785
2.95k
    }
8786
2.95k
    if (ret == 0) {
8787
2.95k
        ret = wc_KyberKey_PublicKeySize(kem, &kse->pubKeyLen);
8788
2.95k
    }
8789
8790
2.95k
    if (ret == 0) {
8791
2.95k
        privKey = (byte*)XMALLOC(privSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8792
2.95k
        if (privKey == NULL) {
8793
0
            WOLFSSL_MSG("privkey memory allocation failure");
8794
0
            ret = MEMORY_ERROR;
8795
0
        }
8796
2.95k
    }
8797
#else
8798
    if (ret == 0) {
8799
        /* Allocate a Kyber key to hold private key. */
8800
        kem = (KyberKey*)XMALLOC(sizeof(KyberKey), ssl->heap,
8801
                                 DYNAMIC_TYPE_PRIVATE_KEY);
8802
        if (kem == NULL) {
8803
            WOLFSSL_MSG("KEM memory allocation failure");
8804
            ret = MEMORY_ERROR;
8805
        }
8806
    }
8807
    if (ret == 0) {
8808
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
8809
        if (ret != 0) {
8810
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
8811
        }
8812
    }
8813
    if (ret == 0) {
8814
        ret = wc_KyberKey_PublicKeySize(kem, &kse->pubKeyLen);
8815
    }
8816
#endif
8817
8818
2.95k
    if (ret == 0) {
8819
2.95k
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8820
2.95k
                                     DYNAMIC_TYPE_PUBLIC_KEY);
8821
2.95k
        if (kse->pubKey == NULL) {
8822
0
            WOLFSSL_MSG("pubkey memory allocation failure");
8823
0
            ret = MEMORY_ERROR;
8824
0
        }
8825
2.95k
    }
8826
8827
2.95k
    if (ret == 0) {
8828
2.95k
        ret = wc_KyberKey_MakeKey(kem, ssl->rng);
8829
2.95k
        if (ret != 0) {
8830
0
            WOLFSSL_MSG("Kyber keygen failure");
8831
0
        }
8832
2.95k
    }
8833
2.95k
    if (ret == 0) {
8834
2.95k
        ret = wc_KyberKey_EncodePublicKey(kem, kse->pubKey,
8835
2.95k
                                          kse->pubKeyLen);
8836
2.95k
    }
8837
8838
2.95k
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8839
2.95k
    if (ret == 0) {
8840
2.95k
        PRIVATE_KEY_UNLOCK();
8841
2.95k
        ret = wc_KyberKey_EncodePrivateKey(kem, privKey, privSz);
8842
2.95k
        PRIVATE_KEY_LOCK();
8843
2.95k
    }
8844
2.95k
#endif
8845
8846
#ifdef WOLFSSL_DEBUG_TLS
8847
    WOLFSSL_MSG("Public Kyber Key");
8848
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
8849
#endif
8850
8851
2.95k
    if (ret != 0) {
8852
        /* Data owned by key share entry otherwise. */
8853
0
        wc_KyberKey_Free(kem);
8854
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8855
0
        kse->pubKey = NULL;
8856
0
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8857
0
        if (privKey) {
8858
0
            ForceZero(privKey, privSz);
8859
0
            XFREE(privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8860
0
            privKey = NULL;
8861
0
        }
8862
    #else
8863
        XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8864
        kse->key = NULL;
8865
    #endif
8866
0
    }
8867
2.95k
    else {
8868
2.95k
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8869
2.95k
        wc_KyberKey_Free(kem);
8870
2.95k
        kse->privKey = (byte*)privKey;
8871
2.95k
        kse->privKeyLen = privSz;
8872
    #else
8873
        kse->key = kem;
8874
    #endif
8875
2.95k
    }
8876
8877
2.95k
    #if !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ) && \
8878
2.95k
        defined(WOLFSSL_SMALL_STACK)
8879
2.95k
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8880
2.95k
    #endif
8881
8882
2.95k
    return ret;
8883
2.95k
}
8884
8885
/* Create a key share entry using both ecdhe and pqc parameters groups.
8886
 * Generates two key pairs on the client side.
8887
 *
8888
 * ssl   The SSL/TLS object.
8889
 * kse   The key share entry object.
8890
 * returns 0 on success, otherwise failure.
8891
 */
8892
static int TLSX_KeyShare_GenPqcHybridKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
8893
2.96k
{
8894
2.96k
    int ret = 0;
8895
2.96k
    KeyShareEntry *ecc_kse = NULL;
8896
2.96k
    KeyShareEntry *pqc_kse = NULL;
8897
2.96k
    int pqc_group = 0;
8898
2.96k
    int ecc_group = 0;
8899
2.96k
    int pqc_first = 0;
8900
8901
    /* This gets called twice. Once during parsing of the key share and once
8902
     * during the population of the extension. No need to do work the second
8903
     * time. Just return success if its already been done. */
8904
2.96k
    if (kse->pubKey != NULL) {
8905
0
        return ret;
8906
0
    }
8907
8908
    /* Determine the ECC and PQC group of the hybrid combination */
8909
2.96k
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, kse->group);
8910
2.96k
    if (ecc_group == 0 || pqc_group == 0) {
8911
0
        WOLFSSL_MSG("Invalid hybrid group");
8912
0
        ret = BAD_FUNC_ARG;
8913
0
    }
8914
8915
2.96k
    if (ret == 0) {
8916
2.96k
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
8917
2.96k
                   DYNAMIC_TYPE_TLSX);
8918
2.96k
        if (ecc_kse == NULL) {
8919
1
            WOLFSSL_MSG("kse memory allocation failure");
8920
1
            ret = MEMORY_ERROR;
8921
1
        }
8922
2.95k
        else {
8923
2.95k
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
8924
2.95k
        }
8925
2.96k
    }
8926
2.96k
    if (ret == 0) {
8927
2.95k
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
8928
2.95k
                   DYNAMIC_TYPE_TLSX);
8929
2.95k
        if (pqc_kse == NULL) {
8930
0
            WOLFSSL_MSG("kse memory allocation failure");
8931
0
            ret = MEMORY_ERROR;
8932
0
        }
8933
2.95k
        else {
8934
2.95k
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
8935
2.95k
        }
8936
2.95k
    }
8937
8938
    /* Generate ECC key share part */
8939
2.96k
    if (ret == 0) {
8940
2.95k
        ecc_kse->group = ecc_group;
8941
8942
    #ifdef WOLFSSL_ASYNC_CRYPT
8943
        /* Check if the provided kse already contains an ECC key and the
8944
         * last error was WC_PENDING_E. In this case, we already tried to
8945
         * generate an ECC key. Hence, we have to restore it. */
8946
        if (kse->key != NULL && kse->keyLen > 0 &&
8947
            kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8948
            ecc_kse->key = kse->key;
8949
            ecc_kse->keyLen = kse->keyLen;
8950
            ecc_kse->pubKeyLen = kse->pubKeyLen;
8951
            ecc_kse->lastRet = kse->lastRet;
8952
            kse->key = NULL;
8953
        }
8954
    #endif
8955
8956
2.95k
    #ifdef HAVE_CURVE25519
8957
2.95k
        if (ecc_group == WOLFSSL_ECC_X25519) {
8958
2.95k
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
8959
2.95k
        }
8960
0
        else
8961
0
    #endif
8962
0
    #ifdef HAVE_CURVE448
8963
0
        if (ecc_group == WOLFSSL_ECC_X448) {
8964
0
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
8965
0
        }
8966
0
        else
8967
0
    #endif
8968
0
        {
8969
0
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
8970
0
        }
8971
8972
    #ifdef WOLFSSL_ASYNC_CRYPT
8973
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8974
            /* Store the generated ECC key in the provided kse to later
8975
             * restore it.*/
8976
            kse->key = ecc_kse->key;
8977
            kse->keyLen = ecc_kse->keyLen;
8978
            kse->pubKeyLen = ecc_kse->pubKeyLen;
8979
            ecc_kse->key = NULL;
8980
        }
8981
    #endif
8982
2.95k
    }
8983
8984
    /* Generate PQC key share part */
8985
2.96k
    if (ret == 0) {
8986
2.95k
        pqc_kse->group = pqc_group;
8987
2.95k
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, pqc_kse);
8988
        /* No error message, TLSX_KeyShare_GenPqcKeyClient will do it. */
8989
2.95k
    }
8990
8991
    /* Allocate memory for combined public key */
8992
2.96k
    if (ret == 0) {
8993
2.95k
        kse->pubKey = (byte*)XMALLOC(ecc_kse->pubKeyLen + pqc_kse->pubKeyLen,
8994
2.95k
                                     ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8995
2.95k
        if (kse->pubKey == NULL) {
8996
1
            WOLFSSL_MSG("pubkey memory allocation failure");
8997
1
            ret = MEMORY_ERROR;
8998
1
        }
8999
2.95k
    }
9000
9001
    /* Create combined public key. The order of classic/pqc key material is
9002
     * indicated by the pqc_first variable. */
9003
2.96k
    if (ret == 0) {
9004
2.95k
        if (pqc_first) {
9005
2.95k
            XMEMCPY(kse->pubKey, pqc_kse->pubKey, pqc_kse->pubKeyLen);
9006
2.95k
            XMEMCPY(kse->pubKey + pqc_kse->pubKeyLen, ecc_kse->pubKey,
9007
2.95k
                    ecc_kse->pubKeyLen);
9008
2.95k
        }
9009
0
        else {
9010
0
            XMEMCPY(kse->pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen);
9011
0
            XMEMCPY(kse->pubKey + ecc_kse->pubKeyLen, pqc_kse->pubKey,
9012
0
                    pqc_kse->pubKeyLen);
9013
0
        }
9014
2.95k
        kse->pubKeyLen = ecc_kse->pubKeyLen + pqc_kse->pubKeyLen;
9015
2.95k
    }
9016
9017
    /* Store the private keys.
9018
     * Note we are saving the PQC private key and ECC private key
9019
     * separately. That's because the ECC private key is not simply a
9020
     * buffer. Its is an ecc_key struct. */
9021
2.96k
    if (ret == 0) {
9022
2.95k
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9023
        /* PQC private key is an encoded byte array */
9024
2.95k
        kse->privKey = pqc_kse->privKey;
9025
2.95k
        kse->privKeyLen = pqc_kse->privKeyLen;
9026
2.95k
        pqc_kse->privKey = NULL;
9027
    #else
9028
        /* PQC private key is a pointer to KyberKey object */
9029
        kse->privKey = (byte*)pqc_kse->key;
9030
        kse->privKeyLen = 0;
9031
        pqc_kse->key = NULL;
9032
    #endif
9033
        /* ECC private key is a pointer to ecc_key object */
9034
2.95k
        kse->key = ecc_kse->key;
9035
2.95k
        kse->keyLen = ecc_kse->keyLen;
9036
2.95k
        ecc_kse->key = NULL;
9037
2.95k
    }
9038
9039
#ifdef WOLFSSL_DEBUG_TLS
9040
    WOLFSSL_MSG("Public Kyber Key");
9041
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
9042
#endif
9043
9044
2.96k
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
9045
2.96k
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
9046
9047
2.96k
    return ret;
9048
2.96k
}
9049
#endif /* !WOLFSSL_MLKEM_NO_MAKE_KEY */
9050
#endif /* WOLFSSL_HAVE_MLKEM */
9051
9052
/* Generate a secret/key using the key share entry.
9053
 *
9054
 * ssl  The SSL/TLS object.
9055
 * kse  The key share entry holding peer data.
9056
 */
9057
int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
9058
3.16k
{
9059
3.16k
    int ret;
9060
    /* Named FFDHE groups have a bit set to identify them. */
9061
3.16k
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(kse->group))
9062
45
        ret = TLSX_KeyShare_GenDhKey(ssl, kse);
9063
3.11k
    else if (kse->group == WOLFSSL_ECC_X25519)
9064
105
        ret = TLSX_KeyShare_GenX25519Key(ssl, kse);
9065
3.01k
    else if (kse->group == WOLFSSL_ECC_X448)
9066
4
        ret = TLSX_KeyShare_GenX448Key(ssl, kse);
9067
3.01k
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY)
9068
3.01k
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group))
9069
0
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, kse);
9070
3.01k
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(kse->group))
9071
2.96k
        ret = TLSX_KeyShare_GenPqcHybridKeyClient(ssl, kse);
9072
50
#endif
9073
50
    else
9074
50
        ret = TLSX_KeyShare_GenEccKey(ssl, kse);
9075
#ifdef WOLFSSL_ASYNC_CRYPT
9076
    kse->lastRet = ret;
9077
#endif
9078
3.16k
    return ret;
9079
3.16k
}
9080
9081
/* Free the key share dynamic data.
9082
 *
9083
 * list  The linked list of key share entry objects.
9084
 * heap  The heap used for allocation.
9085
 */
9086
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
9087
11.7k
{
9088
11.7k
    KeyShareEntry* current;
9089
9090
21.8k
    while ((current = list) != NULL) {
9091
10.0k
        list = current->next;
9092
10.0k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(current->group)) {
9093
125
#ifndef NO_DH
9094
        #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9095
            defined(WC_ASYNC_ENABLE_DH)
9096
            if (current->key != NULL &&
9097
                    ((DhKey*)current->key)->nb != NULL) {
9098
                XFREE(((DhKey*)current->key)->nb, heap,
9099
                    DYNAMIC_TYPE_TMP_BUFFER);
9100
                ((DhKey*)current->key)->nb = NULL;
9101
            }
9102
        #endif
9103
125
            wc_FreeDhKey((DhKey*)current->key);
9104
125
            if (current->privKey != NULL && current->privKeyLen > 0) {
9105
0
                ForceZero(current->privKey, current->privKeyLen);
9106
0
            }
9107
125
#endif
9108
125
        }
9109
9.89k
        else if (current->group == WOLFSSL_ECC_X25519) {
9110
3.43k
#ifdef HAVE_CURVE25519
9111
        #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
9112
            if (current->key != NULL &&
9113
                    ((curve25519_key*)current->key)->nb_ctx != NULL) {
9114
                XFREE(((curve25519_key*)current->key)->nb_ctx, heap,
9115
                    DYNAMIC_TYPE_TMP_BUFFER);
9116
            }
9117
        #endif
9118
3.43k
            wc_curve25519_free((curve25519_key*)current->key);
9119
3.43k
#endif
9120
3.43k
        }
9121
6.45k
        else if (current->group == WOLFSSL_ECC_X448) {
9122
12
#ifdef HAVE_CURVE448
9123
12
            wc_curve448_free((curve448_key*)current->key);
9124
12
#endif
9125
12
        }
9126
6.44k
        else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
9127
2.95k
#ifdef WOLFSSL_HAVE_MLKEM
9128
2.95k
            wc_KyberKey_Free((KyberKey*)current->key);
9129
2.95k
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9130
2.95k
            if (current->privKey != NULL) {
9131
1
                ForceZero(current->privKey, current->privKeyLen);
9132
1
            }
9133
2.95k
        #endif
9134
2.95k
#endif
9135
2.95k
        }
9136
3.49k
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
9137
2.99k
#ifdef WOLFSSL_HAVE_MLKEM
9138
2.99k
            int ecc_group = 0;
9139
2.99k
            findEccPqc(&ecc_group, NULL, NULL, current->group);
9140
9141
            /* Free PQC private key */
9142
        #ifdef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9143
            wc_KyberKey_Free((KyberKey*)current->privKey);
9144
        #else
9145
2.99k
            if (current->privKey != NULL) {
9146
2.95k
                ForceZero(current->privKey, current->privKeyLen);
9147
2.95k
            }
9148
2.99k
        #endif
9149
9150
            /* Free ECC private key */
9151
2.99k
            if (ecc_group == WOLFSSL_ECC_X25519) {
9152
2.99k
            #ifdef HAVE_CURVE25519
9153
2.99k
                wc_curve25519_free((curve25519_key*)current->key);
9154
2.99k
            #endif
9155
2.99k
            }
9156
2
            else if (ecc_group == WOLFSSL_ECC_X448) {
9157
0
            #ifdef HAVE_CURVE448
9158
0
                wc_curve448_free((curve448_key*)current->key);
9159
0
            #endif
9160
0
            }
9161
2
            else {
9162
2
            #ifdef HAVE_ECC
9163
                #if defined(WC_ECC_NONBLOCK) && \
9164
                    defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9165
                    defined(WC_ASYNC_ENABLE_ECC)
9166
                if (current->key != NULL &&
9167
                        ((ecc_key*)current->key)->nb_ctx != NULL) {
9168
                    XFREE(((ecc_key*)current->key)->nb_ctx, heap,
9169
                        DYNAMIC_TYPE_TMP_BUFFER);
9170
                }
9171
                #endif
9172
2
                wc_ecc_free((ecc_key*)current->key);
9173
2
            #endif
9174
2
            }
9175
2.99k
#endif
9176
2.99k
        }
9177
502
        else {
9178
502
#ifdef HAVE_ECC
9179
        #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9180
            defined(WC_ASYNC_ENABLE_ECC)
9181
            if (current->key != NULL &&
9182
                    ((ecc_key*)current->key)->nb_ctx != NULL) {
9183
                XFREE(((ecc_key*)current->key)->nb_ctx, heap,
9184
                    DYNAMIC_TYPE_TMP_BUFFER);
9185
            }
9186
        #endif
9187
502
            wc_ecc_free((ecc_key*)current->key);
9188
502
#endif
9189
502
        }
9190
10.0k
        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
9191
10.0k
    #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
9192
10.0k
        XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY);
9193
10.0k
    #endif
9194
10.0k
        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
9195
10.0k
        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
9196
10.0k
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
9197
10.0k
    }
9198
9199
11.7k
    (void)heap;
9200
11.7k
}
9201
9202
/* Get the size of the encoded key share extension.
9203
 *
9204
 * list     The linked list of key share extensions.
9205
 * msgType  The type of the message this extension is being written into.
9206
 * returns the number of bytes of the encoded key share extension.
9207
 */
9208
static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
9209
5.18k
{
9210
5.18k
    word16         len = 0;
9211
5.18k
    byte           isRequest = (msgType == client_hello);
9212
5.18k
    KeyShareEntry* current;
9213
9214
    /* The named group the server wants to use. */
9215
5.18k
    if (msgType == hello_retry_request)
9216
145
        return OPAQUE16_LEN;
9217
9218
    /* List of key exchange groups. */
9219
5.04k
    if (isRequest)
9220
4.89k
        len += OPAQUE16_LEN;
9221
8.13k
    while ((current = list) != NULL) {
9222
3.09k
        list = current->next;
9223
9224
3.09k
        if (!isRequest && current->pubKey == NULL)
9225
0
            continue;
9226
9227
3.09k
        len += (word16)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
9228
3.09k
    }
9229
9230
5.04k
    return len;
9231
5.18k
}
9232
9233
/* Writes the key share extension into the output buffer.
9234
 * Assumes that the the output buffer is big enough to hold data.
9235
 *
9236
 * list     The linked list of key share entries.
9237
 * output   The buffer to write into.
9238
 * msgType  The type of the message this extension is being written into.
9239
 * returns the number of bytes written into the buffer.
9240
 */
9241
static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
9242
                                  byte msgType)
9243
3.22k
{
9244
3.22k
    word16         i = 0;
9245
3.22k
    byte           isRequest = (msgType == client_hello);
9246
3.22k
    KeyShareEntry* current;
9247
9248
3.22k
    if (msgType == hello_retry_request) {
9249
145
        c16toa(list->group, output);
9250
145
        return OPAQUE16_LEN;
9251
145
    }
9252
9253
    /* ClientHello has a list but ServerHello is only the chosen. */
9254
3.08k
    if (isRequest)
9255
2.93k
        i += OPAQUE16_LEN;
9256
9257
    /* Write out all in the list. */
9258
4.21k
    while ((current = list) != NULL) {
9259
1.13k
        list = current->next;
9260
9261
1.13k
        if (!isRequest && current->pubKey == NULL)
9262
0
            continue;
9263
9264
1.13k
        c16toa(current->group, &output[i]);
9265
1.13k
        i += KE_GROUP_LEN;
9266
1.13k
        c16toa((word16)(current->pubKeyLen), &output[i]);
9267
1.13k
        i += OPAQUE16_LEN;
9268
1.13k
        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
9269
1.13k
        i += (word16)current->pubKeyLen;
9270
1.13k
    }
9271
    /* Write the length of the list if required. */
9272
3.08k
    if (isRequest)
9273
2.93k
        c16toa(i - OPAQUE16_LEN, output);
9274
9275
3.08k
    return i;
9276
3.22k
}
9277
9278
/* Process the DH key share extension on the client side.
9279
 *
9280
 * ssl            The SSL/TLS object.
9281
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9282
 * returns 0 on success and other values indicate failure.
9283
 */
9284
static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9285
3
{
9286
3
    int ret = 0;
9287
3
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
9288
3
    word32 pSz = 0;
9289
3
    DhKey* dhKey = (DhKey*)keyShareEntry->key;
9290
9291
3
#ifdef HAVE_PUBLIC_FFDHE
9292
3
    const DhParams* params = NULL;
9293
3
    switch (keyShareEntry->group) {
9294
0
    #ifdef HAVE_FFDHE_2048
9295
3
        case WOLFSSL_FFDHE_2048:
9296
3
            params = wc_Dh_ffdhe2048_Get();
9297
3
            break;
9298
0
    #endif
9299
    #ifdef HAVE_FFDHE_3072
9300
        case WOLFSSL_FFDHE_3072:
9301
            params = wc_Dh_ffdhe3072_Get();
9302
            break;
9303
    #endif
9304
    #ifdef HAVE_FFDHE_4096
9305
        case WOLFSSL_FFDHE_4096:
9306
            params = wc_Dh_ffdhe4096_Get();
9307
            break;
9308
    #endif
9309
    #ifdef HAVE_FFDHE_6144
9310
        case WOLFSSL_FFDHE_6144:
9311
            params = wc_Dh_ffdhe6144_Get();
9312
            break;
9313
    #endif
9314
    #ifdef HAVE_FFDHE_8192
9315
        case WOLFSSL_FFDHE_8192:
9316
            params = wc_Dh_ffdhe8192_Get();
9317
            break;
9318
    #endif
9319
0
        default:
9320
0
            break;
9321
3
    }
9322
3
    if (params == NULL) {
9323
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9324
0
        return PEER_KEY_ERROR;
9325
0
    }
9326
3
    pSz = params->p_len;
9327
#else
9328
    ret = wc_DhGetNamedKeyParamSize(keyShareEntry->group, &pSz, NULL, NULL);
9329
    if (ret != 0 || pSz == 0) {
9330
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9331
        return PEER_KEY_ERROR;
9332
    }
9333
#endif
9334
9335
    /* RFC 8446 Section 4.2.8.1: FFDHE key_exchange values are left-padded with
9336
     * zeros to the size of the named-group prime. Reject any peer key share
9337
     * whose byte length does not match the expected prime size. */
9338
3
    if (keyShareEntry->keLen != pSz) {
9339
3
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9340
3
        return PEER_KEY_ERROR;
9341
3
    }
9342
9343
    /* if DhKey is not setup, do it now */
9344
0
    if (keyShareEntry->key == NULL) {
9345
0
        keyShareEntry->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
9346
0
            DYNAMIC_TYPE_DH);
9347
0
        if (keyShareEntry->key == NULL)
9348
0
            return MEMORY_E;
9349
9350
        /* Setup Key */
9351
0
        ret = wc_InitDhKey_ex((DhKey*)keyShareEntry->key, ssl->heap, ssl->devId);
9352
0
        if (ret == 0) {
9353
0
            dhKey = (DhKey*)keyShareEntry->key;
9354
        /* Set key */
9355
0
        #ifdef HAVE_PUBLIC_FFDHE
9356
0
            ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
9357
0
                                                                params->g_len);
9358
        #else
9359
            ret = wc_DhSetNamedKey(dhKey, keyShareEntry->group);
9360
        #endif
9361
0
        }
9362
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9363
        defined(WC_ASYNC_ENABLE_DH)
9364
        /* Only set non-blocking context when async device is active. With
9365
         * INVALID_DEVID there is no async loop to retry on MP_WOULDBLOCK, so
9366
         * skip non-blocking setup and use blocking mode instead. */
9367
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
9368
            DhNb* dhNb = (DhNb*)XMALLOC(sizeof(DhNb), ssl->heap,
9369
                                        DYNAMIC_TYPE_TMP_BUFFER);
9370
            if (dhNb == NULL) {
9371
                ret = MEMORY_E;
9372
            }
9373
            else {
9374
                ret = wc_DhSetNonBlock((DhKey*)keyShareEntry->key, dhNb);
9375
                if (ret != 0) {
9376
                    XFREE(dhNb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9377
                }
9378
            }
9379
        }
9380
    #endif /* WC_DH_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
9381
              WC_ASYNC_ENABLE_DH */
9382
0
    }
9383
9384
0
    if (ret == 0
9385
    #ifdef WOLFSSL_ASYNC_CRYPT
9386
        && keyShareEntry->lastRet == 0 /* don't enter here if WC_PENDING_E */
9387
    #endif
9388
0
    ) {
9389
    #ifdef WOLFSSL_DEBUG_TLS
9390
        WOLFSSL_MSG("Peer DH Key");
9391
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9392
    #endif
9393
9394
0
        ssl->options.dhKeySz = (word16)pSz;
9395
9396
        /* Derive secret from private key and peer's public key. */
9397
0
        ret = DhAgree(ssl, dhKey,
9398
0
            (const byte*)keyShareEntry->privKey, keyShareEntry->keyLen, /* our private */
9399
0
            keyShareEntry->ke, keyShareEntry->keLen,                    /* peer's public key */
9400
0
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,    /* secret */
9401
0
            NULL, 0
9402
0
        );
9403
    #ifdef WOLFSSL_ASYNC_CRYPT
9404
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9405
            return ret;
9406
        }
9407
    #endif
9408
0
    }
9409
9410
    /* RFC 8446 Section 7.4.1:
9411
     *     ... left-padded with zeros up to the size of the prime. ...
9412
     */
9413
0
    if (ret == 0 && (word32)ssl->options.dhKeySz > ssl->arrays->preMasterSz) {
9414
0
        word32 diff = (word32)ssl->options.dhKeySz - ssl->arrays->preMasterSz;
9415
0
        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
9416
0
                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9417
0
        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
9418
0
        ssl->arrays->preMasterSz = ssl->options.dhKeySz;
9419
0
    }
9420
9421
    /* done with key share, release resources */
9422
0
    if (dhKey) {
9423
    #if defined(WC_DH_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9424
        defined(WC_ASYNC_ENABLE_DH)
9425
        if (dhKey->nb != NULL) {
9426
            XFREE(dhKey->nb, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9427
            dhKey->nb = NULL;
9428
        }
9429
    #endif
9430
0
        wc_FreeDhKey(dhKey);
9431
0
    }
9432
0
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
9433
0
    keyShareEntry->key = NULL;
9434
0
    if (keyShareEntry->privKey) {
9435
0
        ForceZero(keyShareEntry->privKey, keyShareEntry->keyLen);
9436
0
        XFREE(keyShareEntry->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9437
0
        keyShareEntry->privKey = NULL;
9438
0
    }
9439
0
    XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9440
0
    keyShareEntry->pubKey = NULL;
9441
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9442
0
    keyShareEntry->ke = NULL;
9443
#else
9444
    (void)ssl;
9445
    (void)keyShareEntry;
9446
    ret = PEER_KEY_ERROR;
9447
    WOLFSSL_ERROR_VERBOSE(ret);
9448
#endif
9449
0
    return ret;
9450
0
}
9451
9452
/* Process the X25519 key share extension on the client side.
9453
 *
9454
 * ssl            The SSL/TLS object.
9455
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9456
 * ssOutput       The destination buffer for the shared secret.
9457
 * ssOutSz        The size of the generated shared secret.
9458
 *
9459
 * returns 0 on success and other values indicate failure.
9460
 */
9461
static int TLSX_KeyShare_ProcessX25519_ex(WOLFSSL* ssl,
9462
                                          KeyShareEntry* keyShareEntry,
9463
                                          unsigned char* ssOutput,
9464
                                          word32* ssOutSz)
9465
105
{
9466
105
    int ret = 0;
9467
9468
105
#ifdef HAVE_CURVE25519
9469
105
    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
9470
9471
#ifdef WOLFSSL_ASYNC_CRYPT
9472
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9473
#endif
9474
105
    {
9475
105
    #ifdef HAVE_ECC
9476
105
        if (ssl->peerEccKey != NULL) {
9477
0
            wc_ecc_free(ssl->peerEccKey);
9478
0
            ssl->peerEccKey = NULL;
9479
0
            ssl->peerEccKeyPresent = 0;
9480
0
        }
9481
105
    #endif
9482
9483
105
        ssl->peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
9484
105
                                        ssl->heap, DYNAMIC_TYPE_TLSX);
9485
105
        if (ssl->peerX25519Key == NULL) {
9486
0
            WOLFSSL_MSG("PeerX25519Key Memory error");
9487
0
            return MEMORY_ERROR;
9488
0
        }
9489
105
        ret = wc_curve25519_init(ssl->peerX25519Key);
9490
105
        if (ret != 0) {
9491
0
            XFREE(ssl->peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9492
0
            ssl->peerX25519Key = NULL;
9493
0
            return ret;
9494
0
        }
9495
    #ifdef WOLFSSL_DEBUG_TLS
9496
        WOLFSSL_MSG("Peer Curve25519 Key");
9497
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9498
    #endif
9499
9500
105
        if (wc_curve25519_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9501
105
                                                  EC25519_LITTLE_ENDIAN) != 0) {
9502
2
            ret = ECC_PEERKEY_ERROR;
9503
2
            WOLFSSL_ERROR_VERBOSE(ret);
9504
2
        }
9505
9506
105
        if (ret == 0) {
9507
103
            if (wc_curve25519_import_public_ex(keyShareEntry->ke,
9508
103
                                        keyShareEntry->keLen,
9509
103
                                        ssl->peerX25519Key,
9510
103
                                        EC25519_LITTLE_ENDIAN) != 0) {
9511
0
                ret = ECC_PEERKEY_ERROR;
9512
0
                WOLFSSL_ERROR_VERBOSE(ret);
9513
0
            }
9514
103
        }
9515
9516
105
        if (ret == 0) {
9517
103
            ssl->ecdhCurveOID = ECC_X25519_OID;
9518
103
            ssl->peerX25519KeyPresent = 1;
9519
103
        }
9520
105
    }
9521
9522
105
    if (ret == 0 && key == NULL)
9523
0
        ret = BAD_FUNC_ARG;
9524
105
    if (ret == 0) {
9525
103
    #ifdef WOLFSSL_CURVE25519_BLINDING
9526
103
        ret = wc_curve25519_set_rng(key, ssl->rng);
9527
103
    }
9528
105
    if (ret == 0) {
9529
103
    #endif
9530
    #ifdef WOLFSSL_ASYNC_CRYPT
9531
        if (keyShareEntry->lastRet != WC_NO_ERR_TRACE(WC_PENDING_E))
9532
    #endif
9533
103
        {
9534
        #ifdef WOLFSSL_ASYNC_CRYPT
9535
            /* initialize event */
9536
            ret = wolfSSL_AsyncInit(ssl, &key->asyncDev,
9537
                WC_ASYNC_FLAG_CALL_AGAIN);
9538
            if (ret != 0)
9539
                return ret;
9540
        #endif
9541
103
            ret = wc_curve25519_shared_secret_ex(key, ssl->peerX25519Key,
9542
103
                        ssOutput, ssOutSz, EC25519_LITTLE_ENDIAN);
9543
        #ifdef WOLFSSL_ASYNC_CRYPT
9544
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9545
                return wolfSSL_AsyncPush(ssl, &key->asyncDev);
9546
            }
9547
        #endif
9548
103
        }
9549
        /* On CALL_AGAIN re-entry (lastRet == PENDING): the block above
9550
         * is skipped entirely, so wc_curve25519_shared_secret_ex is not
9551
         * called again. ret stays 0 from initialization, and execution
9552
         * falls through to the cleanup code below. */
9553
103
    }
9554
9555
    /* done with key share, release resources */
9556
105
    if (ssl->peerX25519Key != NULL) {
9557
105
        wc_curve25519_free(ssl->peerX25519Key);
9558
105
        XFREE(ssl->peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9559
105
        ssl->peerX25519Key = NULL;
9560
105
        ssl->peerX25519KeyPresent = 0;
9561
105
    }
9562
105
    if (keyShareEntry->key != NULL) {
9563
    #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
9564
        if (((curve25519_key*)keyShareEntry->key)->nb_ctx != NULL) {
9565
            XFREE(((curve25519_key*)keyShareEntry->key)->nb_ctx, ssl->heap,
9566
                DYNAMIC_TYPE_TMP_BUFFER);
9567
        }
9568
    #endif
9569
105
        wc_curve25519_free((curve25519_key*)keyShareEntry->key);
9570
105
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9571
105
        keyShareEntry->key = NULL;
9572
105
    }
9573
105
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9574
105
    keyShareEntry->ke = NULL;
9575
#else
9576
    (void)ssl;
9577
    (void)keyShareEntry;
9578
    (void)ssOutput;
9579
    (void)ssOutSz;
9580
9581
    ret = PEER_KEY_ERROR;
9582
    WOLFSSL_ERROR_VERBOSE(ret);
9583
#endif /* HAVE_CURVE25519 */
9584
9585
105
    return ret;
9586
105
}
9587
9588
/* Process the X25519 key share extension on the client side.
9589
 *
9590
 * ssl            The SSL/TLS object.
9591
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9592
 *
9593
 * returns 0 on success and other values indicate failure.
9594
 */
9595
static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
9596
                                       KeyShareEntry* keyShareEntry)
9597
105
{
9598
105
    return TLSX_KeyShare_ProcessX25519_ex(ssl, keyShareEntry,
9599
105
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9600
105
}
9601
9602
/* Process the X448 key share extension on the client side.
9603
 *
9604
 * ssl            The SSL/TLS object.
9605
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9606
 * ssOutput       The destination buffer for the shared secret.
9607
 * ssOutSz        The size of the generated shared secret.
9608
 *
9609
 * returns 0 on success and other values indicate failure.
9610
 */
9611
static int TLSX_KeyShare_ProcessX448_ex(WOLFSSL* ssl,
9612
                                        KeyShareEntry* keyShareEntry,
9613
                                        unsigned char* ssOutput,
9614
                                        word32* ssOutSz)
9615
3
{
9616
3
    int ret;
9617
9618
3
#ifdef HAVE_CURVE448
9619
3
    curve448_key* key = (curve448_key*)keyShareEntry->key;
9620
3
    curve448_key* peerX448Key;
9621
9622
3
#ifdef HAVE_ECC
9623
3
    if (ssl->peerEccKey != NULL) {
9624
0
        wc_ecc_free(ssl->peerEccKey);
9625
0
        ssl->peerEccKey = NULL;
9626
0
        ssl->peerEccKeyPresent = 0;
9627
0
    }
9628
3
#endif
9629
9630
3
    peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
9631
3
                                                             DYNAMIC_TYPE_TLSX);
9632
3
    if (peerX448Key == NULL) {
9633
0
        WOLFSSL_MSG("PeerEccKey Memory error");
9634
0
        return MEMORY_ERROR;
9635
0
    }
9636
3
    ret = wc_curve448_init(peerX448Key);
9637
3
    if (ret != 0) {
9638
0
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9639
0
        return ret;
9640
0
    }
9641
#ifdef WOLFSSL_DEBUG_TLS
9642
    WOLFSSL_MSG("Peer Curve448 Key");
9643
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9644
#endif
9645
9646
3
    if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9647
3
                                                    EC448_LITTLE_ENDIAN) != 0) {
9648
1
        ret = ECC_PEERKEY_ERROR;
9649
1
        WOLFSSL_ERROR_VERBOSE(ret);
9650
1
    }
9651
9652
3
    if (ret == 0) {
9653
2
        if (wc_curve448_import_public_ex(keyShareEntry->ke,
9654
2
                                              keyShareEntry->keLen, peerX448Key,
9655
2
                                              EC448_LITTLE_ENDIAN) != 0) {
9656
0
            ret = ECC_PEERKEY_ERROR;
9657
0
            WOLFSSL_ERROR_VERBOSE(ret);
9658
0
        }
9659
2
    }
9660
9661
3
    if (ret == 0) {
9662
2
        ssl->ecdhCurveOID = ECC_X448_OID;
9663
9664
2
        ret = wc_curve448_shared_secret_ex(key, peerX448Key,
9665
2
                    ssOutput, ssOutSz, EC448_LITTLE_ENDIAN);
9666
2
    }
9667
9668
3
    wc_curve448_free(peerX448Key);
9669
3
    XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9670
3
    wc_curve448_free((curve448_key*)keyShareEntry->key);
9671
3
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9672
3
    keyShareEntry->key = NULL;
9673
3
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9674
3
    keyShareEntry->ke = NULL;
9675
#else
9676
    (void)ssl;
9677
    (void)keyShareEntry;
9678
    (void)ssOutput;
9679
    (void)ssOutSz;
9680
9681
    ret = PEER_KEY_ERROR;
9682
    WOLFSSL_ERROR_VERBOSE(ret);
9683
#endif /* HAVE_CURVE448 */
9684
9685
3
    return ret;
9686
3
}
9687
9688
/* Process the X448 key share extension on the client side.
9689
 *
9690
 * ssl            The SSL/TLS object.
9691
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9692
 * returns 0 on success and other values indicate failure.
9693
 */
9694
static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9695
3
{
9696
3
    return TLSX_KeyShare_ProcessX448_ex(ssl, keyShareEntry,
9697
3
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9698
3
}
9699
9700
/* Process the ECC key share extension on the client side.
9701
 *
9702
 * ssl            The SSL/TLS object.
9703
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9704
 * ssOutput       The destination buffer for the shared secret.
9705
 * ssOutSz        The size of the generated shared secret.
9706
 *
9707
 * returns 0 on success and other values indicate failure.
9708
 */
9709
static int TLSX_KeyShare_ProcessEcc_ex(WOLFSSL* ssl,
9710
                                       KeyShareEntry* keyShareEntry,
9711
                                       unsigned char* ssOutput,
9712
                                       word32* ssOutSz)
9713
{
9714
    int ret = 0;
9715
#ifdef HAVE_ECC
9716
    int curveId = ECC_CURVE_INVALID;
9717
    ecc_key* eccKey = (ecc_key*)keyShareEntry->key;
9718
9719
    /* find supported curve */
9720
    switch (keyShareEntry->group) {
9721
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
9722
        #ifndef NO_ECC_SECP
9723
        case WOLFSSL_ECC_SECP256R1:
9724
            curveId = ECC_SECP256R1;
9725
            break;
9726
        #endif /* !NO_ECC_SECP */
9727
        #ifdef WOLFSSL_SM2
9728
        case WOLFSSL_ECC_SM2P256V1:
9729
            curveId = ECC_SM2P256V1;
9730
            break;
9731
        #endif /* WOLFSSL_SM2 */
9732
        #ifdef HAVE_ECC_BRAINPOOL
9733
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
9734
            curveId = ECC_BRAINPOOLP256R1;
9735
            break;
9736
        #endif /* HAVE_ECC_BRAINPOOL */
9737
    #endif
9738
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
9739
        #ifndef NO_ECC_SECP
9740
        case WOLFSSL_ECC_SECP384R1:
9741
            curveId = ECC_SECP384R1;
9742
            break;
9743
        #endif /* !NO_ECC_SECP */
9744
        #ifdef HAVE_ECC_BRAINPOOL
9745
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
9746
            curveId = ECC_BRAINPOOLP384R1;
9747
            break;
9748
        #endif /* HAVE_ECC_BRAINPOOL */
9749
    #endif
9750
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
9751
        #ifdef HAVE_ECC_BRAINPOOL
9752
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
9753
            curveId = ECC_BRAINPOOLP512R1;
9754
            break;
9755
        #endif /* HAVE_ECC_BRAINPOOL */
9756
    #endif
9757
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
9758
        #ifndef NO_ECC_SECP
9759
        case WOLFSSL_ECC_SECP521R1:
9760
            curveId = ECC_SECP521R1;
9761
            break;
9762
        #endif /* !NO_ECC_SECP */
9763
    #endif
9764
    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
9765
        case WOLFSSL_ECC_X448:
9766
            curveId = ECC_X448;
9767
            break;
9768
    #endif
9769
        default:
9770
            /* unsupported curve */
9771
            WOLFSSL_ERROR_VERBOSE(ECC_PEERKEY_ERROR);
9772
            return ECC_PEERKEY_ERROR;
9773
    }
9774
9775
#ifdef WOLFSSL_ASYNC_CRYPT
9776
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9777
#endif
9778
    {
9779
    #ifdef WOLFSSL_DEBUG_TLS
9780
        WOLFSSL_MSG("Peer ECC Key");
9781
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9782
    #endif
9783
9784
        if (ssl->peerEccKey != NULL) {
9785
            wc_ecc_free(ssl->peerEccKey);
9786
            XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9787
            ssl->peerEccKeyPresent = 0;
9788
        }
9789
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
9790
        ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry);
9791
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
9792
            return ret;
9793
        }
9794
        ret = 0;
9795
#endif
9796
9797
        ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
9798
                                            DYNAMIC_TYPE_ECC);
9799
        if (ssl->peerEccKey == NULL) {
9800
            WOLFSSL_MSG("PeerEccKey Memory error");
9801
            ret = MEMORY_ERROR;
9802
        }
9803
9804
        if (ret == 0) {
9805
            ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
9806
        }
9807
9808
        /* Point is validated by import function. */
9809
        if (ret == 0) {
9810
#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
9811
            ret = wc_ecc_import_x963_ex2(keyShareEntry->ke,
9812
                keyShareEntry->keLen, ssl->peerEccKey, curveId, 1);
9813
#else
9814
            /* FIPS has validation define on. */
9815
            ret = wc_ecc_import_x963_ex(keyShareEntry->ke,
9816
                keyShareEntry->keLen, ssl->peerEccKey, curveId);
9817
#endif
9818
            if (ret != 0) {
9819
                ret = ECC_PEERKEY_ERROR;
9820
                WOLFSSL_ERROR_VERBOSE(ret);
9821
            }
9822
        }
9823
9824
        if (ret == 0) {
9825
            ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
9826
            ssl->peerEccKeyPresent = 1;
9827
        }
9828
    }
9829
9830
    if (ret == 0 && eccKey == NULL)
9831
        ret = BAD_FUNC_ARG;
9832
    if (ret == 0) {
9833
        ret = EccSharedSecret(ssl, eccKey, ssl->peerEccKey,
9834
            keyShareEntry->ke, &keyShareEntry->keLen,
9835
            ssOutput, ssOutSz, ssl->options.side);
9836
    #ifdef WOLFSSL_ASYNC_CRYPT
9837
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
9838
            return ret;
9839
    #endif
9840
    }
9841
9842
    /* done with key share, release resources */
9843
    if (ssl->peerEccKey != NULL
9844
    #ifdef HAVE_PK_CALLBACKS
9845
        && ssl->ctx->EccSharedSecretCb == NULL
9846
    #endif
9847
    ) {
9848
        wc_ecc_free(ssl->peerEccKey);
9849
        XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9850
        ssl->peerEccKey = NULL;
9851
        ssl->peerEccKeyPresent = 0;
9852
    }
9853
    if (eccKey != NULL) {
9854
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
9855
        defined(WC_ASYNC_ENABLE_ECC)
9856
        if (eccKey->nb_ctx != NULL) {
9857
            XFREE(eccKey->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
9858
        }
9859
    #endif
9860
        wc_ecc_free(eccKey);
9861
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_ECC);
9862
        keyShareEntry->key = NULL;
9863
    }
9864
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9865
    keyShareEntry->ke = NULL;
9866
#else
9867
    (void)ssl;
9868
    (void)keyShareEntry;
9869
    (void)ssOutput;
9870
    (void)ssOutSz;
9871
9872
    ret = PEER_KEY_ERROR;
9873
    WOLFSSL_ERROR_VERBOSE(ret);
9874
#endif /* HAVE_ECC */
9875
9876
    return ret;
9877
}
9878
9879
/* Process the ECC key share extension on the client side.
9880
 *
9881
 * ssl            The SSL/TLS object.
9882
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9883
 * returns 0 on success and other values indicate failure.
9884
 */
9885
static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9886
37
{
9887
37
    return TLSX_KeyShare_ProcessEcc_ex(ssl, keyShareEntry,
9888
37
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9889
37
}
9890
9891
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9892
/* Process the Kyber key share extension on the client side.
9893
 *
9894
 * ssl            The SSL/TLS object.
9895
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9896
 * ssOutput       The destination buffer for the shared secret.
9897
 * ssOutSz        The size of the generated shared secret.
9898
 *
9899
 * returns 0 on success and other values indicate failure.
9900
 */
9901
static int TLSX_KeyShare_ProcessPqcClient_ex(WOLFSSL* ssl,
9902
                                             KeyShareEntry* keyShareEntry,
9903
                                             unsigned char* ssOutput,
9904
                                             word32* ssOutSz)
9905
0
{
9906
0
    int       ret = 0;
9907
0
    KyberKey* kem = (KyberKey*)keyShareEntry->key;
9908
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9909
0
    word32    privSz = 0;
9910
0
#endif
9911
0
    word32    ctSz = 0;
9912
0
    word32    ssSz = 0;
9913
9914
0
    if (ssl->options.side == WOLFSSL_SERVER_END) {
9915
        /* I am the server, the shared secret has already been generated and
9916
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
9917
0
        return 0;
9918
0
    }
9919
9920
0
    if (keyShareEntry->ke == NULL) {
9921
0
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
9922
0
        return BAD_FUNC_ARG;
9923
0
    }
9924
0
    if (ssOutSz == NULL)
9925
0
        return BAD_FUNC_ARG;
9926
9927
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9928
0
    if (kem == NULL) {
9929
0
        int type = 0;
9930
9931
        /* Allocate a Kyber key to hold private key. */
9932
0
        kem = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
9933
0
                                  DYNAMIC_TYPE_PRIVATE_KEY);
9934
0
        if (kem == NULL) {
9935
0
            WOLFSSL_MSG("GenPqcKey memory error");
9936
0
            ret = MEMORY_E;
9937
0
        }
9938
0
        if (ret == 0) {
9939
0
            ret = mlkem_id2type(keyShareEntry->group, &type);
9940
0
        }
9941
0
        if (ret != 0) {
9942
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
9943
0
            ret = BAD_FUNC_ARG;
9944
0
        }
9945
0
        if (ret == 0) {
9946
0
            ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
9947
0
            if (ret != 0) {
9948
0
                WOLFSSL_MSG("Error creating Kyber KEM");
9949
0
            }
9950
0
        }
9951
0
    }
9952
#else
9953
    if (kem == NULL || keyShareEntry->privKeyLen != 0) {
9954
        WOLFSSL_MSG("Invalid Kyber key.");
9955
        ret = BAD_FUNC_ARG;
9956
    }
9957
#endif
9958
9959
0
    if (ret == 0) {
9960
0
        ret = wc_KyberKey_SharedSecretSize(kem, &ssSz);
9961
0
    }
9962
0
    if (ret == 0) {
9963
0
        ret = wc_KyberKey_CipherTextSize(kem, &ctSz);
9964
0
    }
9965
9966
0
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9967
0
    if (ret == 0) {
9968
0
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
9969
0
    }
9970
0
    if (ret == 0 && privSz != keyShareEntry->privKeyLen) {
9971
0
        WOLFSSL_MSG("Invalid private key size.");
9972
0
        ret = BAD_FUNC_ARG;
9973
0
    }
9974
0
    if (ret == 0) {
9975
0
        PRIVATE_KEY_UNLOCK();
9976
0
        ret = wc_KyberKey_DecodePrivateKey(kem, keyShareEntry->privKey, privSz);
9977
0
        PRIVATE_KEY_LOCK();
9978
0
    }
9979
0
#endif
9980
9981
0
    if (ret == 0 && keyShareEntry->keLen < ctSz) {
9982
0
        WOLFSSL_MSG("PQC key share data too short for ciphertext.");
9983
0
        ret = BUFFER_E;
9984
0
    }
9985
0
    if (ret == 0) {
9986
0
        PRIVATE_KEY_UNLOCK();
9987
0
        ret = wc_KyberKey_Decapsulate(kem, ssOutput,
9988
0
                                      keyShareEntry->ke, ctSz);
9989
0
        PRIVATE_KEY_LOCK();
9990
0
        if (ret != 0) {
9991
0
            WOLFSSL_MSG("wc_KyberKey decapsulation failure.");
9992
0
            ret = BAD_FUNC_ARG;
9993
0
        }
9994
0
    }
9995
0
    if (ret == 0) {
9996
0
        *ssOutSz = ssSz;
9997
0
    }
9998
9999
0
    wc_KyberKey_Free(kem);
10000
10001
0
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10002
0
    keyShareEntry->key = NULL;
10003
10004
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10005
0
    keyShareEntry->ke = NULL;
10006
10007
0
    return ret;
10008
0
}
10009
10010
/* Process the Kyber key share extension on the client side.
10011
 *
10012
 * ssl            The SSL/TLS object.
10013
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10014
 *
10015
 * returns 0 on success and other values indicate failure.
10016
 */
10017
static int TLSX_KeyShare_ProcessPqcClient(WOLFSSL* ssl,
10018
                                          KeyShareEntry* keyShareEntry)
10019
0
{
10020
0
    return TLSX_KeyShare_ProcessPqcClient_ex(ssl, keyShareEntry,
10021
0
                                             ssl->arrays->preMasterSecret,
10022
0
                                             &ssl->arrays->preMasterSz);
10023
0
}
10024
10025
/* Process the hybrid key share extension on the client side.
10026
 *
10027
 * ssl            The SSL/TLS object.
10028
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10029
 * returns 0 on success and other values indicate failure.
10030
 */
10031
static int TLSX_KeyShare_ProcessPqcHybridClient(WOLFSSL* ssl,
10032
                                                KeyShareEntry* keyShareEntry)
10033
0
{
10034
0
    int      ret = 0;
10035
0
    int      pqc_group = 0;
10036
0
    int      ecc_group = 0;
10037
0
    int      pqc_first = 0;
10038
0
    KeyShareEntry* pqc_kse = NULL;
10039
0
    KeyShareEntry *ecc_kse = NULL;
10040
0
    word32   ctSz = 0;
10041
0
    word32   ssSzPqc = 0;
10042
10043
0
    if (ssl->options.side == WOLFSSL_SERVER_END) {
10044
        /* I am the server, the shared secret has already been generated and
10045
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
10046
0
        return 0;
10047
0
    }
10048
10049
0
    if (keyShareEntry->ke == NULL) {
10050
0
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
10051
0
        return BAD_FUNC_ARG;
10052
0
    }
10053
10054
    /* I am the client, both the PQC ciphertext and the ECHD public key are in
10055
     * keyShareEntry->ke */
10056
10057
    /* Determine the ECC and PQC group of the hybrid combination */
10058
0
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
10059
0
    if (ecc_group == 0 || pqc_group == 0) {
10060
0
        WOLFSSL_MSG("Invalid hybrid group");
10061
0
        ret = BAD_FUNC_ARG;
10062
0
    }
10063
10064
0
    if (ret == 0) {
10065
0
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
10066
0
                   DYNAMIC_TYPE_TLSX);
10067
0
        if (ecc_kse == NULL) {
10068
0
            WOLFSSL_MSG("kse memory allocation failure");
10069
0
            ret = MEMORY_ERROR;
10070
0
        }
10071
0
        else {
10072
0
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
10073
0
        }
10074
0
    }
10075
0
    if (ret == 0) {
10076
0
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
10077
0
                   DYNAMIC_TYPE_TLSX);
10078
0
        if (pqc_kse == NULL) {
10079
0
            WOLFSSL_MSG("kse memory allocation failure");
10080
0
            ret = MEMORY_ERROR;
10081
0
        }
10082
0
        else {
10083
0
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
10084
0
        }
10085
0
    }
10086
10087
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
10088
     * decode these sizes to separate the KEM ciphertext from the ECDH public
10089
     * key. */
10090
0
    if (ret == 0) {
10091
0
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10092
0
        int type;
10093
10094
0
        pqc_kse->privKey = keyShareEntry->privKey;
10095
10096
0
        ret = mlkem_id2type(pqc_group, &type);
10097
0
        if (ret != 0) {
10098
0
            WOLFSSL_MSG("Invalid Kyber algorithm specified.");
10099
0
            ret = BAD_FUNC_ARG;
10100
0
        }
10101
0
        if (ret == 0) {
10102
0
            pqc_kse->key = XMALLOC(sizeof(KyberKey), ssl->heap,
10103
0
                                DYNAMIC_TYPE_PRIVATE_KEY);
10104
0
            if (pqc_kse->key == NULL) {
10105
0
                WOLFSSL_MSG("GenPqcKey memory error");
10106
0
                ret = MEMORY_E;
10107
0
            }
10108
0
        }
10109
0
        if (ret == 0) {
10110
0
            ret = wc_KyberKey_Init(type, (KyberKey*)pqc_kse->key,
10111
0
                                   ssl->heap, ssl->devId);
10112
0
            if (ret != 0) {
10113
0
                WOLFSSL_MSG("Error creating Kyber KEM");
10114
0
            }
10115
0
        }
10116
    #else
10117
        pqc_kse->key = keyShareEntry->privKey;
10118
    #endif
10119
10120
0
        pqc_kse->group = pqc_group;
10121
0
        pqc_kse->privKeyLen = keyShareEntry->privKeyLen;
10122
10123
0
        if (ret == 0) {
10124
0
            ret = wc_KyberKey_SharedSecretSize((KyberKey*)pqc_kse->key,
10125
0
                                               &ssSzPqc);
10126
0
        }
10127
0
        if (ret == 0) {
10128
0
            ret = wc_KyberKey_CipherTextSize((KyberKey*)pqc_kse->key,
10129
0
                                             &ctSz);
10130
0
            if (ret == 0 && keyShareEntry->keLen <= ctSz) {
10131
0
                WOLFSSL_MSG("Invalid ciphertext size.");
10132
0
                ret = BAD_FUNC_ARG;
10133
0
            }
10134
0
        }
10135
0
        if (ret == 0) {
10136
0
            pqc_kse->keLen = ctSz;
10137
0
            pqc_kse->ke = (byte*)XMALLOC(pqc_kse->keLen, ssl->heap,
10138
0
                                         DYNAMIC_TYPE_PUBLIC_KEY);
10139
0
            if (pqc_kse->ke == NULL) {
10140
0
                WOLFSSL_MSG("pqc_kse memory allocation failure");
10141
0
                ret = MEMORY_ERROR;
10142
0
            }
10143
            /* Copy the PQC KEM ciphertext. Depending on the pqc_first flag,
10144
             * the KEM ciphertext comes before or after the ECDH public key. */
10145
0
            if (ret == 0) {
10146
0
                int offset = keyShareEntry->keLen - ctSz;
10147
10148
0
                if (pqc_first)
10149
0
                    offset = 0;
10150
10151
0
                XMEMCPY(pqc_kse->ke, keyShareEntry->ke + offset, ctSz);
10152
0
            }
10153
0
        }
10154
0
    }
10155
10156
0
    if (ret == 0) {
10157
0
        ecc_kse->group = ecc_group;
10158
0
        ecc_kse->keLen = keyShareEntry->keLen - ctSz;
10159
0
        ecc_kse->key = keyShareEntry->key;
10160
0
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
10161
0
                                        DYNAMIC_TYPE_PUBLIC_KEY);
10162
0
        if (ecc_kse->ke == NULL) {
10163
0
            WOLFSSL_MSG("ecc_kse memory allocation failure");
10164
0
            ret = MEMORY_ERROR;
10165
0
        }
10166
        /* Copy the ECDH public key. Depending on the pqc_first flag, the
10167
         * KEM ciphertext comes before or after the ECDH public key. */
10168
0
        if (ret == 0) {
10169
0
            int offset = 0;
10170
10171
0
            if (pqc_first)
10172
0
                offset = ctSz;
10173
10174
0
            XMEMCPY(ecc_kse->ke, keyShareEntry->ke + offset, ecc_kse->keLen);
10175
0
        }
10176
    #ifdef WOLFSSL_ASYNC_CRYPT
10177
        ecc_kse->lastRet = keyShareEntry->lastRet;
10178
    #endif
10179
0
    }
10180
10181
    /* Process ECDH key share part. The generated shared secret is directly
10182
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
10183
     * pqc_first flag, the ECDH shared secret part goes before or after the
10184
     * KEM part. */
10185
0
    if (ret == 0) {
10186
0
        int offset = 0;
10187
10188
0
        if (pqc_first)
10189
0
            offset = ssSzPqc;
10190
10191
0
    #ifdef HAVE_CURVE25519
10192
0
        if (ecc_group == WOLFSSL_ECC_X25519) {
10193
0
            ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
10194
0
                    ssl->arrays->preMasterSecret + offset,
10195
0
                    &ssl->arrays->preMasterSz);
10196
0
        }
10197
0
        else
10198
0
    #endif
10199
0
    #ifdef HAVE_CURVE448
10200
0
        if (ecc_group == WOLFSSL_ECC_X448) {
10201
0
            ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
10202
0
                    ssl->arrays->preMasterSecret + offset,
10203
0
                    &ssl->arrays->preMasterSz);
10204
0
        }
10205
0
        else
10206
0
    #endif
10207
0
        {
10208
0
            ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
10209
0
                    ssl->arrays->preMasterSecret + offset,
10210
0
                    &ssl->arrays->preMasterSz);
10211
0
        }
10212
10213
    #ifdef WOLFSSL_ASYNC_CRYPT
10214
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10215
            keyShareEntry->lastRet = WC_PENDING_E;
10216
            /* Prevent freeing of the ECC and ML-KEM private keys */
10217
            ecc_kse->key = NULL;
10218
            pqc_kse->privKey = NULL;
10219
        }
10220
        else
10221
    #endif
10222
0
        {
10223
            /* Re-sync keyShareEntry->key with ecc_kse->key. ecc_kse->key was
10224
             * aliased to keyShareEntry->key above. The inner Process*_ex
10225
             * either ran its end-of-function cleanup and set ecc_kse->key
10226
             * to NULL (so the outer pointer must also become NULL to avoid
10227
             * UAF/double-free in TLSX_KeyShare_FreeAll), or returned early
10228
             * before cleanup with ecc_kse->key still pointing at the live
10229
             * key (so the outer pointer must keep that pointer for later
10230
             * freeing). Mirroring whatever the inner left in ecc_kse->key
10231
             * handles both cases correctly. */
10232
0
            keyShareEntry->key = ecc_kse->key;
10233
0
        }
10234
0
    }
10235
10236
0
    if (ret == 0) {
10237
0
        if ((ssl->arrays->preMasterSz + ssSzPqc) > ENCRYPT_LEN) {
10238
0
            WOLFSSL_MSG("shared secret is too long.");
10239
0
            ret = LENGTH_ERROR;
10240
0
        }
10241
0
    }
10242
10243
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
10244
     * KEM shared secret part goes before or after the ECDH part. */
10245
0
    if (ret == 0) {
10246
0
        int offset = ssl->arrays->preMasterSz;
10247
10248
0
        if (pqc_first)
10249
0
            offset = 0;
10250
10251
0
        ret = TLSX_KeyShare_ProcessPqcClient_ex(ssl, pqc_kse,
10252
0
                ssl->arrays->preMasterSecret + offset, &ssSzPqc);
10253
0
    }
10254
10255
0
    if (ret == 0) {
10256
0
        keyShareEntry->privKey = (byte*)pqc_kse->key;
10257
10258
0
        ssl->arrays->preMasterSz += ssSzPqc;
10259
0
    }
10260
0
    else
10261
#ifdef WOLFSSL_ASYNC_CRYPT
10262
        if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
10263
#endif
10264
0
    {
10265
        /* Clear the pre master secret buffer to prevent leaking any
10266
         * intermediate keys in the error case. Do not use preMasterSz
10267
         * here as it may already been set to the ECC shared secret size,
10268
         * which would be too small due to the PQC offset case. */
10269
0
        ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
10270
10271
        /* Prevent FreeAll from freeing pointers owned by keyShareEntry. */
10272
0
        if (ecc_kse != NULL)
10273
0
            ecc_kse->key = NULL;
10274
0
        if (pqc_kse != NULL) {
10275
0
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
10276
0
            pqc_kse->privKey = NULL;
10277
        #else
10278
            pqc_kse->key = NULL;
10279
        #endif
10280
0
        }
10281
0
    }
10282
10283
0
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
10284
0
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
10285
10286
0
    return ret;
10287
0
}
10288
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_DECAPSULATE */
10289
10290
/* Process the key share extension on the client side.
10291
 *
10292
 * ssl            The SSL/TLS object.
10293
 * keyShareEntry  The key share entry object to use to calculate shared secret.
10294
 * returns 0 on success and other values indicate failure.
10295
 */
10296
static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
10297
{
10298
    int ret;
10299
10300
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
10301
    keyShareEntry->session = ssl->session->namedGroup;
10302
    ssl->session->namedGroup = keyShareEntry->group;
10303
#endif
10304
    /* reset the pre master secret size */
10305
    if (ssl->arrays->preMasterSz == 0)
10306
        ssl->arrays->preMasterSz = ENCRYPT_LEN;
10307
10308
    /* Use Key Share Data from server. */
10309
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(keyShareEntry->group))
10310
        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
10311
    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
10312
        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
10313
    else if (keyShareEntry->group == WOLFSSL_ECC_X448)
10314
        ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
10315
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
10316
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group))
10317
        ret = TLSX_KeyShare_ProcessPqcClient(ssl, keyShareEntry);
10318
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(keyShareEntry->group))
10319
        ret = TLSX_KeyShare_ProcessPqcHybridClient(ssl, keyShareEntry);
10320
#endif
10321
    else
10322
        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
10323
10324
#ifdef WOLFSSL_DEBUG_TLS
10325
    if (ret == 0) {
10326
        WOLFSSL_MSG("KE Secret");
10327
        WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
10328
    }
10329
#endif
10330
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
10331
    keyShareEntry->derived = (ret == 0);
10332
#endif
10333
#ifdef WOLFSSL_ASYNC_CRYPT
10334
    keyShareEntry->lastRet = ret;
10335
#endif
10336
10337
    return ret;
10338
}
10339
10340
/* Parse an entry of the KeyShare extension.
10341
 *
10342
 * ssl     The SSL/TLS object.
10343
 * input   The extension data.
10344
 * length  The length of the extension data.
10345
 * kse     The new key share entry object.
10346
 * returns a positive number to indicate amount of data parsed and a negative
10347
 * number on error.
10348
 */
10349
static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
10350
            word16 length, KeyShareEntry **kse, word16* seenGroups,
10351
            int* seenGroupsCnt, TLSX** extensions)
10352
847
{
10353
847
    int    ret;
10354
847
    word16 group;
10355
847
    word16 keLen;
10356
847
    int    offset = 0;
10357
847
    byte*  ke;
10358
847
    int    i;
10359
10360
847
    if (length < OPAQUE16_LEN + OPAQUE16_LEN)
10361
3
        return BUFFER_ERROR;
10362
    /* Named group */
10363
844
    ato16(&input[offset], &group);
10364
844
    offset += OPAQUE16_LEN;
10365
    /* Key exchange data - public key. */
10366
844
    ato16(&input[offset], &keLen);
10367
844
    offset += OPAQUE16_LEN;
10368
844
    if (keLen == 0)
10369
6
        return BUFFER_ERROR;
10370
838
    if (keLen > length - offset)
10371
39
        return BUFFER_ERROR;
10372
10373
799
    if (seenGroups != NULL) {
10374
799
        if (*seenGroupsCnt >= MAX_KEYSHARE_NAMED_GROUPS) {
10375
1
            return BAD_KEY_SHARE_DATA;
10376
1
        }
10377
1.63k
        for (i = 0; i < *seenGroupsCnt; i++) {
10378
848
            if (seenGroups[i] == group) {
10379
8
                return BAD_KEY_SHARE_DATA;
10380
8
            }
10381
848
        }
10382
790
        seenGroups[i] = group;
10383
790
        *seenGroupsCnt = i + 1;
10384
790
    }
10385
10386
    /* Store a copy in the key share object. */
10387
790
    ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10388
790
    if (ke == NULL)
10389
0
        return MEMORY_E;
10390
790
    XMEMCPY(ke, &input[offset], keLen);
10391
10392
    /* Populate a key share object in the extension. */
10393
790
    ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
10394
790
    if (ret != 0) {
10395
0
        XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10396
0
        return ret;
10397
0
    }
10398
10399
    /* Total length of the parsed data. */
10400
790
    return offset + keLen;
10401
790
}
10402
10403
/* Searches the groups sent for the specified named group.
10404
 *
10405
 * ssl    SSL/TLS object.
10406
 * name   Group name to match.
10407
 * returns 1 when the extension has the group name and 0 otherwise.
10408
 */
10409
static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
10410
62
{
10411
62
    TLSX*          extension;
10412
62
    KeyShareEntry* list;
10413
10414
62
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
10415
62
    if (extension == NULL) {
10416
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
10417
0
        if (extension == NULL)
10418
0
            return 0;
10419
0
    }
10420
10421
62
    list = (KeyShareEntry*)extension->data;
10422
124
    while (list != NULL) {
10423
62
        if (list->group == group)
10424
0
            return 1;
10425
62
        list = list->next;
10426
62
    }
10427
10428
62
    return 0;
10429
62
}
10430
10431
10432
/* Searches the supported groups extension for the specified named group.
10433
 *
10434
 * ssl   The SSL/TLS object.
10435
 * name  The group name to match.
10436
 * returns 1 when the extension has the group name and 0 otherwise.
10437
 */
10438
static int TLSX_SupportedGroups_Find(const WOLFSSL* ssl, word16 name,
10439
                                     TLSX* extensions)
10440
556
{
10441
556
#ifdef HAVE_SUPPORTED_CURVES
10442
556
    TLSX*          extension;
10443
556
    SupportedCurve* curve = NULL;
10444
10445
556
    if ((extension = TLSX_Find(extensions, TLSX_SUPPORTED_GROUPS)) == NULL) {
10446
21
        if ((extension = TLSX_Find(ssl->ctx->extensions,
10447
21
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
10448
21
            return 0;
10449
21
        }
10450
21
    }
10451
10452
1.98k
    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
10453
1.75k
        if (curve->name == name)
10454
309
            return 1;
10455
1.75k
    }
10456
226
#endif
10457
10458
226
    (void)ssl;
10459
226
    (void)name;
10460
10461
226
    return 0;
10462
535
}
10463
10464
int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl,
10465
        const byte* input, word16 length, TLSX** extensions)
10466
620
{
10467
620
    int ret;
10468
620
    int    offset = 0;
10469
620
    word16 len;
10470
620
    TLSX*  extension;
10471
620
    word16 seenGroups[MAX_KEYSHARE_NAMED_GROUPS];
10472
620
    int    seenGroupsCnt = 0;
10473
10474
    /* Add a KeyShare extension if it doesn't exist even if peer sent no
10475
     * entries. The presence of this extension signals that the peer can be
10476
     * negotiated with. */
10477
620
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10478
620
    if (extension == NULL) {
10479
        /* Push new KeyShare extension. */
10480
617
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10481
617
        if (ret != 0)
10482
0
            return ret;
10483
617
    }
10484
10485
620
    if (length < OPAQUE16_LEN)
10486
10
        return BUFFER_ERROR;
10487
10488
    /* ClientHello contains zero or more key share entries. Limits extension
10489
     * length to 2^16-1 and subtracting 4 bytes for header size per RFC 8446 */
10490
610
    ato16(input, &len);
10491
610
    if ((len != length - OPAQUE16_LEN) ||
10492
587
         length > (MAX_EXT_DATA_LEN - HELLO_EXT_SZ)) {
10493
23
        return BUFFER_ERROR;
10494
23
    }
10495
587
    offset += OPAQUE16_LEN;
10496
10497
1.37k
    while (offset < (int)length) {
10498
847
        ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset],
10499
847
                length - (word16)offset, NULL, seenGroups, &seenGroupsCnt,
10500
847
                extensions);
10501
847
        if (ret < 0)
10502
57
            return ret;
10503
10504
790
        offset += ret;
10505
790
    }
10506
10507
530
    return 0;
10508
587
}
10509
10510
/* Parse the KeyShare extension.
10511
 * Different formats in different messages.
10512
 *
10513
 * ssl      The SSL/TLS object.
10514
 * input    The extension data.
10515
 * length   The length of the extension data.
10516
 * msgType  The type of the message this extension is being parsed from.
10517
 * returns 0 on success and other values indicate failure.
10518
 */
10519
int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10520
                               byte msgType)
10521
415
{
10522
415
    int ret = 0;
10523
415
    KeyShareEntry *keyShareEntry = NULL;
10524
415
    word16 group;
10525
10526
415
    if (msgType == client_hello) {
10527
349
        ret = TLSX_KeyShare_Parse_ClientHello(ssl, input, length,
10528
349
                                              &ssl->extensions);
10529
349
    }
10530
66
    else if (msgType == server_hello) {
10531
8
        int len;
10532
10533
8
        if (length < OPAQUE16_LEN)
10534
1
            return BUFFER_ERROR;
10535
10536
7
        ssl->options.shSentKeyShare = 1;
10537
10538
        /* The data is the named group the server wants to use. */
10539
7
        ato16(input, &group);
10540
10541
        /* Check the selected group was supported by ClientHello extensions. */
10542
7
        if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10543
1
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10544
1
            return BAD_KEY_SHARE_DATA;
10545
1
        }
10546
10547
        /* Check if the group was sent. */
10548
6
        if (!TLSX_KeyShare_Find(ssl, group)) {
10549
6
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10550
6
            return BAD_KEY_SHARE_DATA;
10551
6
        }
10552
10553
        /* ServerHello contains one key share entry. */
10554
0
        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry, NULL,
10555
0
                NULL, &ssl->extensions);
10556
0
        if (len != (int)length)
10557
0
            return BUFFER_ERROR;
10558
10559
        /* Not in list sent if there isn't a private key. */
10560
0
        if (keyShareEntry == NULL || (keyShareEntry->key == NULL
10561
0
        #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
10562
0
            && keyShareEntry->privKey == NULL
10563
0
        #endif
10564
0
        )) {
10565
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10566
0
            return BAD_KEY_SHARE_DATA;
10567
0
        }
10568
10569
        /* Process the entry to calculate the secret. */
10570
0
        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
10571
0
        if (ret == 0)
10572
0
            ssl->session->namedGroup = ssl->namedGroup = group;
10573
0
    }
10574
58
    else if (msgType == hello_retry_request) {
10575
58
        if (length != OPAQUE16_LEN)
10576
1
            return BUFFER_ERROR;
10577
10578
57
        ssl->options.hrrSentKeyShare = 1;
10579
10580
        /* The data is the named group the server wants to use. */
10581
57
        ato16(input, &group);
10582
10583
    #ifdef WOLFSSL_ASYNC_CRYPT
10584
        /* only perform find and clear TLSX if not returning from async */
10585
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
10586
    #endif
10587
57
        {
10588
            /* Check the selected group was supported by ClientHello extensions.
10589
             */
10590
57
            if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10591
1
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10592
1
                return BAD_KEY_SHARE_DATA;
10593
1
            }
10594
10595
            /* Make sure KeyShare for server requested group was not sent in
10596
             * ClientHello. */
10597
56
            if (TLSX_KeyShare_Find(ssl, group)) {
10598
0
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10599
0
                return BAD_KEY_SHARE_DATA;
10600
0
            }
10601
10602
            /* Clear out unusable key shares. */
10603
56
            ret = TLSX_KeyShare_Empty(ssl);
10604
56
            if (ret != 0)
10605
0
                return ret;
10606
56
        }
10607
10608
56
        ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
10609
56
        if (ret == 0)
10610
54
            ssl->session->namedGroup = ssl->namedGroup = group;
10611
56
    }
10612
0
    else {
10613
        /* Not a message type that is allowed to have this extension. */
10614
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10615
0
        return SANITY_MSG_E;
10616
0
    }
10617
10618
405
    return ret;
10619
415
}
10620
10621
/* Create a new key share entry and put it into the list.
10622
 *
10623
 * list           The linked list of key share entries.
10624
 * group          The named group.
10625
 * heap           The memory to allocate with.
10626
 * keyShareEntry  The new key share entry object.
10627
 * returns 0 on success and other values indicate failure.
10628
 */
10629
static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
10630
                             KeyShareEntry** keyShareEntry)
10631
4.09k
{
10632
4.09k
    KeyShareEntry* kse;
10633
4.09k
    KeyShareEntry** next;
10634
10635
4.09k
    kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
10636
4.09k
                                  DYNAMIC_TYPE_TLSX);
10637
4.09k
    if (kse == NULL)
10638
0
        return MEMORY_E;
10639
10640
4.09k
    XMEMSET(kse, 0, sizeof(*kse));
10641
4.09k
    kse->group = (word16)group;
10642
10643
    /* Add it to the back and maintain the links. */
10644
4.91k
    while (*list != NULL) {
10645
        /* Assign to temporary to work around compiler bug found by customer. */
10646
817
        next = &((*list)->next);
10647
817
        list = next;
10648
817
    }
10649
4.09k
    *list = kse;
10650
4.09k
    *keyShareEntry = kse;
10651
10652
4.09k
    (void)heap;
10653
10654
4.09k
    return 0;
10655
4.09k
}
10656
10657
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
10658
/* Process the Kyber key share extension on the server side.
10659
 *
10660
 * ssl            The SSL/TLS object.
10661
 * keyShareEntry  The key share entry object to be sent to the client.
10662
 * data           The key share data received from the client.
10663
 * len            The length of the key share data from the client.
10664
 * ssOutput       The destination buffer for the shared secret.
10665
 * ssOutSz        The size of the generated shared secret.
10666
 *
10667
 * returns 0 on success and other values indicate failure.
10668
 */
10669
static int TLSX_KeyShare_HandlePqcKeyServer(WOLFSSL* ssl,
10670
    KeyShareEntry* keyShareEntry, byte* clientData, word16 clientLen,
10671
    unsigned char* ssOutput, word32* ssOutSz)
10672
0
{
10673
    /* We are on the server side. The key share contains a PQC KEM public key
10674
     * that we are using for an encapsulate operation. The resulting ciphertext
10675
     * is stored in the server key share. */
10676
0
    KyberKey* kemKey = (KyberKey*)keyShareEntry->key;
10677
0
    byte* ciphertext = NULL;
10678
0
    int ret = 0;
10679
0
    word32 pubSz = 0;
10680
0
    word32 ctSz = 0;
10681
0
    word32 ssSz = 0;
10682
10683
0
    if (clientData == NULL) {
10684
0
        WOLFSSL_MSG("No KEM public key from the client.");
10685
0
        return BAD_FUNC_ARG;
10686
0
    }
10687
10688
0
    if (kemKey == NULL) {
10689
0
        int type = 0;
10690
10691
        /* Allocate a Kyber key to hold private key. */
10692
0
        kemKey = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
10693
0
                                     DYNAMIC_TYPE_PRIVATE_KEY);
10694
0
        if (kemKey == NULL) {
10695
0
            WOLFSSL_MSG("GenPqcKey memory error");
10696
0
            ret = MEMORY_E;
10697
0
        }
10698
0
        if (ret == 0) {
10699
0
            ret = mlkem_id2type(keyShareEntry->group, &type);
10700
0
        }
10701
0
        if (ret != 0) {
10702
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10703
0
            ret = BAD_FUNC_ARG;
10704
0
        }
10705
0
        if (ret == 0) {
10706
0
            ret = wc_KyberKey_Init(type, kemKey, ssl->heap, ssl->devId);
10707
0
            if (ret != 0) {
10708
0
                WOLFSSL_MSG("Error creating Kyber KEM");
10709
0
            }
10710
0
        }
10711
0
    }
10712
10713
0
    if (ret == 0) {
10714
0
        ret = wc_KyberKey_PublicKeySize(kemKey, &pubSz);
10715
0
    }
10716
0
    if (ret == 0) {
10717
0
        ret = wc_KyberKey_CipherTextSize(kemKey, &ctSz);
10718
0
    }
10719
0
    if (ret == 0) {
10720
0
        ret = wc_KyberKey_SharedSecretSize(kemKey, &ssSz);
10721
0
    }
10722
10723
0
    if (ret == 0 && clientLen != pubSz) {
10724
0
        WOLFSSL_MSG("Invalid public key.");
10725
0
        ret = BAD_FUNC_ARG;
10726
0
    }
10727
10728
0
    if (ret == 0) {
10729
0
        ciphertext = (byte*)XMALLOC(ctSz, ssl->heap, DYNAMIC_TYPE_TLSX);
10730
10731
0
        if (ciphertext == NULL) {
10732
0
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10733
0
            ret = MEMORY_E;
10734
0
        }
10735
0
    }
10736
10737
0
    if (ret == 0) {
10738
0
        ret = wc_KyberKey_DecodePublicKey(kemKey, clientData, pubSz);
10739
0
    }
10740
0
    if (ret == 0) {
10741
0
        ret = wc_KyberKey_Encapsulate(kemKey, ciphertext,
10742
0
                                      ssOutput, ssl->rng);
10743
0
        if (ret != 0) {
10744
0
            WOLFSSL_MSG("wc_KyberKey encapsulation failure.");
10745
0
        }
10746
0
    }
10747
10748
0
    if (ret == 0) {
10749
0
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10750
10751
0
        *ssOutSz = ssSz;
10752
0
        keyShareEntry->ke = NULL;
10753
0
        keyShareEntry->keLen = 0;
10754
10755
0
        XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10756
0
        keyShareEntry->pubKey = ciphertext;
10757
0
        keyShareEntry->pubKeyLen = ctSz;
10758
0
        ciphertext = NULL;
10759
10760
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
10761
         * the server side. */
10762
0
        ssl->namedGroup = keyShareEntry->group;
10763
0
    }
10764
10765
0
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
10766
10767
0
    wc_KyberKey_Free(kemKey);
10768
0
    XFREE(kemKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10769
0
    keyShareEntry->key = NULL;
10770
0
    return ret;
10771
0
}
10772
10773
int TLSX_KeyShare_HandlePqcHybridKeyServer(WOLFSSL* ssl,
10774
    KeyShareEntry* keyShareEntry, byte* data, word16 len)
10775
0
{
10776
    /* I am the server. The data parameter is the concatenation of the client's
10777
     * ECDH public key and the KEM public key. I need to generate a matching
10778
     * public key for ECDH and encapsulate a shared secret using the KEM public
10779
     * key. We send the ECDH public key and the KEM ciphertext back to the
10780
     * client. Additionally, we create the ECDH shared secret here already.
10781
     */
10782
0
    int    type;
10783
0
    byte*  ciphertext = NULL;
10784
0
    int    ret = 0;
10785
0
    int    pqc_group = 0;
10786
0
    int    ecc_group = 0;
10787
0
    int    pqc_first = 0;
10788
0
    KeyShareEntry *ecc_kse = NULL;
10789
0
    KeyShareEntry *pqc_kse = NULL;
10790
0
    word32 pubSz = 0;
10791
0
    word32 ctSz = 0;
10792
0
    word32 ssSzPqc = 0;
10793
10794
0
    if (data == NULL) {
10795
0
        WOLFSSL_MSG("No hybrid key share data from the client.");
10796
0
        return BAD_FUNC_ARG;
10797
0
    }
10798
10799
    /* Determine the ECC and PQC group of the hybrid combination */
10800
0
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
10801
0
    if (ecc_group == 0 || pqc_group == 0) {
10802
0
        WOLFSSL_MSG("Invalid hybrid group");
10803
0
        ret = BAD_FUNC_ARG;
10804
0
    }
10805
10806
0
    if (ret == 0) {
10807
0
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
10808
0
                   DYNAMIC_TYPE_TLSX);
10809
0
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
10810
0
                   DYNAMIC_TYPE_TLSX);
10811
0
        if (ecc_kse == NULL || pqc_kse == NULL) {
10812
0
            WOLFSSL_MSG("kse memory allocation failure");
10813
0
            ret = MEMORY_ERROR;
10814
0
        }
10815
0
    }
10816
0
    if (ret == 0) {
10817
0
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
10818
0
        ecc_kse->group = ecc_group;
10819
0
        XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
10820
0
        pqc_kse->group = pqc_group;
10821
0
    }
10822
10823
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
10824
     * decode these sizes to properly concatenate the KEM ciphertext with the
10825
     * ECDH public key. */
10826
0
    if (ret == 0) {
10827
        /* Allocate a Kyber key to hold private key. */
10828
0
        pqc_kse->key = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
10829
0
                                           DYNAMIC_TYPE_PRIVATE_KEY);
10830
0
        if (pqc_kse->key == NULL) {
10831
0
            WOLFSSL_MSG("GenPqcKey memory error");
10832
0
            ret = MEMORY_E;
10833
0
        }
10834
0
        if (ret == 0) {
10835
0
            ret = mlkem_id2type(pqc_kse->group, &type);
10836
0
        }
10837
0
        if (ret != 0) {
10838
0
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10839
0
            ret = BAD_FUNC_ARG;
10840
0
        }
10841
0
        if (ret == 0) {
10842
0
            ret = wc_KyberKey_Init(type, (KyberKey*)pqc_kse->key,
10843
0
                                   ssl->heap, ssl->devId);
10844
0
            if (ret != 0) {
10845
0
                WOLFSSL_MSG("Error creating Kyber KEM");
10846
0
            }
10847
0
        }
10848
0
        if (ret == 0) {
10849
0
            ret = wc_KyberKey_SharedSecretSize((KyberKey*)pqc_kse->key,
10850
0
                                               &ssSzPqc);
10851
0
        }
10852
0
        if (ret == 0) {
10853
0
            ret = wc_KyberKey_CipherTextSize((KyberKey*)pqc_kse->key,
10854
0
                                             &ctSz);
10855
0
        }
10856
0
        if (ret == 0) {
10857
0
            ret = wc_KyberKey_PublicKeySize((KyberKey*)pqc_kse->key,
10858
0
                                            &pubSz);
10859
0
        }
10860
0
    }
10861
10862
#ifdef WOLFSSL_ASYNC_CRYPT
10863
    if (ret == 0) {
10864
        /* Check if the provided kse already contains ECC data and the
10865
        * last error was WC_PENDING_E. In this case, we already tried to
10866
        * process ECC kse data. Hence, we have to restore it. */
10867
        if (keyShareEntry->key != NULL && keyShareEntry->keyLen > 0 &&
10868
            keyShareEntry->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10869
            ecc_kse->key = keyShareEntry->key;
10870
            ecc_kse->keyLen = keyShareEntry->keyLen;
10871
            ecc_kse->pubKey = keyShareEntry->pubKey;
10872
            ecc_kse->pubKeyLen = keyShareEntry->pubKeyLen;
10873
            ecc_kse->lastRet = keyShareEntry->lastRet;
10874
            keyShareEntry->key = NULL;
10875
            keyShareEntry->pubKey = NULL;
10876
        }
10877
    }
10878
#endif
10879
10880
    /* Generate the ECDH key share part to be sent to the client */
10881
0
    if (ret == 0 && ecc_group != 0 && ecc_kse->pubKey == NULL) {
10882
0
    #ifdef HAVE_CURVE25519
10883
0
        if (ecc_group == WOLFSSL_ECC_X25519) {
10884
0
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
10885
0
        }
10886
0
        else
10887
0
    #endif
10888
0
    #ifdef HAVE_CURVE448
10889
0
        if (ecc_group == WOLFSSL_ECC_X448) {
10890
0
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
10891
0
        }
10892
0
        else
10893
0
    #endif
10894
0
        {
10895
0
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
10896
0
        }
10897
    #ifdef WOLFSSL_ASYNC_CRYPT
10898
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10899
            /* Store the generated ECC key in the provided kse to later
10900
             * restore it.*/
10901
            keyShareEntry->key = ecc_kse->key;
10902
            keyShareEntry->keyLen = ecc_kse->keyLen;
10903
            keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen;
10904
            keyShareEntry->lastRet = WC_PENDING_E;
10905
            ecc_kse->key = NULL;
10906
        }
10907
        else if (ret == 0 &&
10908
                 keyShareEntry->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10909
            keyShareEntry->lastRet = 0;
10910
            ecc_kse->lastRet = 0;
10911
        }
10912
    #endif
10913
0
    }
10914
10915
0
    if (ret == 0 && len != pubSz + ecc_kse->pubKeyLen) {
10916
0
        WOLFSSL_MSG("Invalid public key.");
10917
0
        ret = BAD_FUNC_ARG;
10918
0
    }
10919
10920
    /* Allocate buffer for the concatenated client key share data
10921
     * (PQC KEM ciphertext + ECDH public key) */
10922
0
    if (ret == 0) {
10923
0
        ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap,
10924
0
            DYNAMIC_TYPE_TLSX);
10925
10926
0
        if (ciphertext == NULL) {
10927
0
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10928
0
            ret = MEMORY_E;
10929
0
        }
10930
0
    }
10931
10932
    /* Process ECDH key share part. The generated shared secret is directly
10933
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
10934
     * pqc_first flag, the ECDH shared secret part goes before or after the
10935
     * KEM part. */
10936
0
    if (ret == 0) {
10937
0
        ecc_kse->keLen = len - pubSz;
10938
0
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
10939
0
                                     DYNAMIC_TYPE_PUBLIC_KEY);
10940
0
        if (ecc_kse->ke == NULL) {
10941
0
            WOLFSSL_MSG("ecc_kse memory allocation failure");
10942
0
            ret = MEMORY_ERROR;
10943
0
        }
10944
0
        if (ret == 0) {
10945
0
            int pubOffset = 0;
10946
0
            int ssOffset = 0;
10947
10948
0
            if (pqc_first) {
10949
0
                pubOffset = pubSz;
10950
0
                ssOffset = ssSzPqc;
10951
0
            }
10952
10953
0
            XMEMCPY(ecc_kse->ke, data + pubOffset, ecc_kse->keLen);
10954
10955
0
        #ifdef HAVE_CURVE25519
10956
0
            if (ecc_group == WOLFSSL_ECC_X25519) {
10957
0
                ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
10958
0
                        ssl->arrays->preMasterSecret + ssOffset,
10959
0
                        &ssl->arrays->preMasterSz);
10960
0
            }
10961
0
            else
10962
0
        #endif
10963
0
        #ifdef HAVE_CURVE448
10964
0
            if (ecc_group == WOLFSSL_ECC_X448) {
10965
0
                ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
10966
0
                        ssl->arrays->preMasterSecret + ssOffset,
10967
0
                        &ssl->arrays->preMasterSz);
10968
0
            }
10969
0
            else
10970
0
        #endif
10971
0
            {
10972
0
                ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
10973
0
                        ssl->arrays->preMasterSecret + ssOffset,
10974
0
                        &ssl->arrays->preMasterSz);
10975
0
            }
10976
0
        }
10977
0
        if (ret == 0) {
10978
0
            if (ssl->arrays->preMasterSz != ecc_kse->keyLen) {
10979
0
                WOLFSSL_MSG("Data length mismatch.");
10980
0
                ret = BAD_FUNC_ARG;
10981
0
            }
10982
0
        }
10983
    #ifdef WOLFSSL_ASYNC_CRYPT
10984
        else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10985
            keyShareEntry->lastRet = WC_PENDING_E;
10986
            keyShareEntry->key = ecc_kse->key;
10987
            keyShareEntry->pubKey = ecc_kse->pubKey;
10988
            keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen;
10989
            ecc_kse->key = NULL;
10990
            ecc_kse->pubKey = NULL;
10991
        }
10992
    #endif
10993
0
    }
10994
10995
0
    if (ret == 0 && ssl->arrays->preMasterSz + ssSzPqc > ENCRYPT_LEN) {
10996
0
        WOLFSSL_MSG("shared secret is too long.");
10997
0
        ret = LENGTH_ERROR;
10998
0
    }
10999
11000
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
11001
     * KEM shared secret part goes before or after the ECDH part. */
11002
0
    if (ret == 0) {
11003
0
        int input_offset = ecc_kse->keLen;
11004
0
        int output_offset = ssl->arrays->preMasterSz;
11005
11006
0
        if (pqc_first) {
11007
0
            input_offset = 0;
11008
0
            output_offset = 0;
11009
0
        }
11010
11011
0
        ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, pqc_kse,
11012
0
                data + input_offset, pubSz,
11013
0
                ssl->arrays->preMasterSecret + output_offset, &ssSzPqc);
11014
0
    }
11015
11016
0
    if (ret == 0) {
11017
0
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11018
11019
0
        ssl->arrays->preMasterSz += ssSzPqc;
11020
0
        keyShareEntry->ke = NULL;
11021
0
        keyShareEntry->keLen = 0;
11022
11023
        /* Concatenate the ECDH public key and the PQC KEM ciphertext. Based on
11024
         * the pqc_first flag, the ECDH public key goes before or after the KEM
11025
         * ciphertext. */
11026
0
        if (pqc_first) {
11027
0
            XMEMCPY(ciphertext, pqc_kse->pubKey, ctSz);
11028
0
            XMEMCPY(ciphertext + ctSz, ecc_kse->pubKey, ecc_kse->pubKeyLen);
11029
0
        }
11030
0
        else {
11031
0
            XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen);
11032
0
            XMEMCPY(ciphertext + ecc_kse->pubKeyLen, pqc_kse->pubKey, ctSz);
11033
0
        }
11034
11035
0
        XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11036
0
        keyShareEntry->pubKey = ciphertext;
11037
0
        keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen + ctSz;
11038
0
        ciphertext = NULL;
11039
11040
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
11041
         * the server side. */
11042
0
        ssl->namedGroup = keyShareEntry->group;
11043
0
    }
11044
0
    else
11045
#ifdef WOLFSSL_ASYNC_CRYPT
11046
        if (ret != WC_NO_ERR_TRACE(WC_PENDING_E))
11047
#endif
11048
0
    {
11049
        /* Clear the pre master secret buffer to prevent leaking any
11050
         * intermediate keys in the error case. Do not use preMasterSz
11051
         * here as it may already been set to the ECC shared secret size,
11052
         * which would be too small due to the PQC offset case. */
11053
0
        ForceZero(ssl->arrays->preMasterSecret, ENCRYPT_LEN);
11054
0
    }
11055
11056
0
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
11057
0
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
11058
0
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
11059
0
    return ret;
11060
0
}
11061
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_ENCAPSULATE */
11062
11063
/* Use the data to create a new key share object in the extensions.
11064
 *
11065
 * ssl    The SSL/TLS object.
11066
 * group  The named group.
11067
 * len    The length of the public key data.
11068
 * data   The public key data.
11069
 * kse    The new key share entry object.
11070
 * returns 0 on success and other values indicate failure.
11071
 */
11072
int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
11073
                      KeyShareEntry **kse, TLSX** extensions)
11074
3.80k
{
11075
3.80k
    int            ret = 0;
11076
3.80k
    TLSX*          extension;
11077
3.80k
    KeyShareEntry* keyShareEntry = NULL;
11078
11079
    /* Find the KeyShare extension if it exists. */
11080
3.80k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11081
3.80k
    if (extension == NULL) {
11082
        /* Push new KeyShare extension. */
11083
2.96k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11084
2.96k
        if (ret != 0)
11085
0
            return ret;
11086
11087
2.96k
        extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11088
2.96k
        if (extension == NULL)
11089
0
            return MEMORY_E;
11090
2.96k
    }
11091
3.80k
    extension->resp = 0;
11092
11093
    /* Try to find the key share entry with this group. */
11094
3.80k
    keyShareEntry = (KeyShareEntry*)extension->data;
11095
4.62k
    while (keyShareEntry != NULL) {
11096
    #if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
11097
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
11098
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
11099
                keyShareEntry->group == WOLFSSL_SECP256R1MLKEM512) ||
11100
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
11101
                keyShareEntry->group == WOLFSSL_SECP384R1MLKEM768) ||
11102
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
11103
                keyShareEntry->group == WOLFSSL_SECP521R1MLKEM1024)) {
11104
            keyShareEntry->group = group;
11105
            break;
11106
        }
11107
        else
11108
    #endif /* WOLFSSL_ML_KEM_USE_OLD_IDS && WOLFSSL_EXTRA_PQC_HYBRIDS */
11109
817
        if (keyShareEntry->group == group)
11110
0
            break;
11111
817
        keyShareEntry = keyShareEntry->next;
11112
817
    }
11113
11114
    /* Create a new key share entry if not found. */
11115
3.80k
    if (keyShareEntry == NULL) {
11116
3.80k
        ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
11117
3.80k
                                ssl->heap, &keyShareEntry);
11118
3.80k
        if (ret != 0)
11119
0
            return ret;
11120
3.80k
    }
11121
11122
3.80k
    if (data != NULL) {
11123
        /* Store the peer data in the key share object. */
11124
790
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11125
790
        keyShareEntry->ke = data;
11126
790
        keyShareEntry->keLen = len;
11127
790
    }
11128
3.01k
    else {
11129
        /* Generate a key pair. Casting to non-const since changes inside are
11130
         * minimal but would require an extensive redesign to refactor. Also
11131
         * this path shouldn't be taken when parsing a ClientHello in stateless
11132
         * mode. */
11133
3.01k
        ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, keyShareEntry);
11134
3.01k
        if (ret != 0)
11135
12
            return ret;
11136
3.01k
    }
11137
11138
3.79k
    if (kse != NULL)
11139
0
        *kse = keyShareEntry;
11140
11141
3.79k
    return 0;
11142
3.80k
}
11143
11144
/* Set an empty Key Share extension.
11145
 *
11146
 * ssl  The SSL/TLS object.
11147
 * returns 0 on success and other values indicate failure.
11148
 */
11149
int TLSX_KeyShare_Empty(WOLFSSL* ssl)
11150
2.00k
{
11151
2.00k
    int   ret = 0;
11152
2.00k
    TLSX* extension;
11153
11154
    /* Find the KeyShare extension if it exists. */
11155
2.00k
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11156
2.00k
    if (extension == NULL) {
11157
        /* Push new KeyShare extension. */
11158
0
        ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11159
0
    }
11160
2.00k
    else if (extension->data != NULL) {
11161
2.00k
        TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
11162
2.00k
        extension->data = NULL;
11163
2.00k
    }
11164
11165
2.00k
    return ret;
11166
2.00k
}
11167
11168
static const word16 preferredGroup[] = {
11169
    /* Sort by strength, but prefer non-experimental PQ/T hybrid groups */
11170
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_NO_ML_KEM) && \
11171
    defined(WOLFSSL_PQC_HYBRIDS)
11172
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
11173
        ECC_MIN_KEY_SZ <= 256
11174
    WOLFSSL_X25519MLKEM768,
11175
    #endif
11176
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11177
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11178
        ECC_MIN_KEY_SZ <= 384
11179
    WOLFSSL_SECP384R1MLKEM1024,
11180
    #endif
11181
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11182
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11183
        ECC_MIN_KEY_SZ <= 256
11184
    WOLFSSL_SECP256R1MLKEM768,
11185
    #endif
11186
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_NO_ML_KEM && WOLFSSL_PQC_HYBRIDS */
11187
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_NO_ML_KEM) && \
11188
    !defined(WOLFSSL_NO_ML_KEM_1024) && !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11189
    WOLFSSL_ML_KEM_1024,
11190
#endif
11191
#if defined(HAVE_ECC) && (!defined(NO_ECC521) || \
11192
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
11193
    WOLFSSL_ECC_SECP521R1,
11194
#endif
11195
#if defined(HAVE_ECC) && defined(HAVE_ECC512) && \
11196
    defined(HAVE_ECC_BRAINPOOL) && ECC_MIN_KEY_SZ <= 512
11197
    WOLFSSL_ECC_BRAINPOOLP512R1TLS13,
11198
#endif
11199
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_NO_ML_KEM) && \
11200
    !defined(WOLFSSL_NO_ML_KEM_768) && !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11201
    WOLFSSL_ML_KEM_768,
11202
#endif
11203
#if defined(HAVE_ECC) && (!defined(NO_ECC384) || \
11204
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384
11205
    WOLFSSL_ECC_SECP384R1,
11206
#if defined(HAVE_ECC_BRAINPOOL)
11207
    WOLFSSL_ECC_BRAINPOOLP384R1TLS13,
11208
#endif
11209
#endif
11210
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11211
    WOLFSSL_ECC_X448,
11212
#endif
11213
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_NO_ML_KEM) && \
11214
    !defined(WOLFSSL_NO_ML_KEM_512) && !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11215
    WOLFSSL_ML_KEM_512,
11216
#endif
11217
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11218
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256
11219
    WOLFSSL_ECC_SECP256R1,
11220
#if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
11221
    WOLFSSL_ECC_SM2P256V1,
11222
#endif
11223
#if defined(HAVE_ECC_BRAINPOOL)
11224
    WOLFSSL_ECC_BRAINPOOLP256R1TLS13,
11225
#endif
11226
#endif
11227
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11228
    WOLFSSL_ECC_X25519,
11229
#endif
11230
#if defined(HAVE_FFDHE_8192)
11231
    WOLFSSL_FFDHE_8192,
11232
#endif
11233
#if defined(HAVE_FFDHE_6144)
11234
    WOLFSSL_FFDHE_6144,
11235
#endif
11236
#if defined(HAVE_FFDHE_4096)
11237
    WOLFSSL_FFDHE_4096,
11238
#endif
11239
#if defined(HAVE_FFDHE_3072)
11240
    WOLFSSL_FFDHE_3072,
11241
#endif
11242
#if defined(HAVE_FFDHE_2048)
11243
    WOLFSSL_FFDHE_2048,
11244
#endif
11245
#ifndef WOLFSSL_NO_ML_KEM
11246
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && \
11247
        defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
11248
    WOLFSSL_SECP521R1MLKEM1024,
11249
    #endif
11250
    #if !defined(WOLFSSL_NO_ML_KEM_768) && \
11251
        defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
11252
    WOLFSSL_SECP384R1MLKEM768,
11253
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11254
    WOLFSSL_X448MLKEM768,
11255
    #endif /* HAVE_CURVE448 */
11256
    #endif
11257
    #if !defined(WOLFSSL_NO_ML_KEM_512) && \
11258
        defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
11259
    WOLFSSL_SECP256R1MLKEM512,
11260
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11261
    WOLFSSL_X25519MLKEM512,
11262
    #endif /* HAVE_CURVE25519 */
11263
    #endif
11264
#endif /* !WOLFSSL_NO_ML_KEM */
11265
#ifdef WOLFSSL_MLKEM_KYBER
11266
    #ifdef WOLFSSL_KYBER1024
11267
    WOLFSSL_KYBER_LEVEL5,
11268
    WOLFSSL_P521_KYBER_LEVEL5,
11269
    #endif
11270
    #ifdef WOLFSSL_KYBER768
11271
    WOLFSSL_KYBER_LEVEL3,
11272
    WOLFSSL_P384_KYBER_LEVEL3,
11273
    WOLFSSL_P256_KYBER_LEVEL3,
11274
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11275
    WOLFSSL_X25519_KYBER_LEVEL3,
11276
    #endif
11277
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11278
    WOLFSSL_X448_KYBER_LEVEL3,
11279
    #endif
11280
    #endif
11281
    #ifdef WOLFSSL_KYBER512
11282
    WOLFSSL_KYBER_LEVEL1,
11283
    WOLFSSL_P256_KYBER_LEVEL1,
11284
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11285
    WOLFSSL_X25519_KYBER_LEVEL1,
11286
    #endif
11287
    #endif
11288
#endif /* WOLFSSL_MLKEM_KYBER */
11289
    WOLFSSL_NAMED_GROUP_INVALID
11290
};
11291
11292
#define PREFERRED_GROUP_SZ \
11293
490
    ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
11294
                                            /* -1 for the invalid group */
11295
11296
/* Examines the application specified group ranking and returns the rank of the
11297
 * group.
11298
 * If no group ranking set then all groups are rank 0 (highest).
11299
 *
11300
 * ssl    The SSL/TLS object.
11301
 * group  The group to check ranking for.
11302
 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
11303
 */
11304
static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
11305
490
{
11306
490
    byte i;
11307
490
    const word16* groups;
11308
490
    byte numGroups;
11309
11310
490
    if (ssl->numGroups == 0) {
11311
        /* If the user didn't specify a group list with a preferred order,
11312
         * use the internal preferred group list. */
11313
490
        groups = preferredGroup;
11314
490
        numGroups = PREFERRED_GROUP_SZ;
11315
490
    }
11316
0
    else {
11317
0
        groups = ssl->group;
11318
0
        numGroups = ssl->numGroups;
11319
0
    }
11320
11321
3.94k
    for (i = 0; i < numGroups; i++) {
11322
#if defined(WOLFSSL_ML_KEM_USE_OLD_IDS) && \
11323
                                             defined (WOLFSSL_EXTRA_PQC_HYBRIDS)
11324
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
11325
             groups[i] == WOLFSSL_SECP256R1MLKEM512) ||
11326
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
11327
             groups[i] == WOLFSSL_SECP384R1MLKEM768) ||
11328
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
11329
             groups[i] == WOLFSSL_SECP521R1MLKEM1024)) {
11330
            return i;
11331
        }
11332
#endif
11333
3.93k
        if (groups[i] == (word16)group)
11334
476
            return i;
11335
3.93k
    }
11336
11337
14
    return WOLFSSL_FATAL_ERROR;
11338
490
}
11339
11340
/* Set a key share that is supported by the client into extensions.
11341
 *
11342
 * ssl  The SSL/TLS object.
11343
 * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
11344
 * 0 if a supported group has a key share and other values indicate an error.
11345
 */
11346
int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, TLSX** extensions)
11347
161
{
11348
161
    int             ret;
11349
161
#ifdef HAVE_SUPPORTED_CURVES
11350
161
    TLSX*           extension;
11351
161
    SupportedCurve* curve = NULL;
11352
161
    SupportedCurve* preferredCurve = NULL;
11353
161
    word16          name = WOLFSSL_NAMED_GROUP_INVALID;
11354
161
    KeyShareEntry*  kse = NULL;
11355
161
    int             preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11356
161
    int             rank;
11357
11358
161
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
11359
161
    if (extension != NULL)
11360
147
        curve = (SupportedCurve*)extension->data;
11361
404
    for (; curve != NULL; curve = curve->next) {
11362
        /* Use server's preference order. Common group was found but key share
11363
         * was missing */
11364
243
        if (!TLSX_IsGroupSupported(curve->name))
11365
0
            continue;
11366
243
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
11367
0
            continue;
11368
11369
243
        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
11370
243
        if (rank == -1)
11371
10
            continue;
11372
233
        if (rank < preferredRank) {
11373
188
            preferredCurve = curve;
11374
188
            preferredRank = rank;
11375
188
        }
11376
233
    }
11377
161
    curve = preferredCurve;
11378
11379
161
    if (curve == NULL) {
11380
16
        byte i;
11381
        /* Fallback to user selected group */
11382
16
        preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11383
16
        for (i = 0; i < ssl->numGroups; i++) {
11384
0
            rank = TLSX_KeyShare_GroupRank(ssl, ssl->group[i]);
11385
0
            if (rank == -1)
11386
0
                continue;
11387
0
            if (rank < preferredRank) {
11388
0
                name = ssl->group[i];
11389
0
                preferredRank = rank;
11390
0
            }
11391
0
        }
11392
16
        if (name == WOLFSSL_NAMED_GROUP_INVALID) {
11393
            /* No group selected or specified by the server */
11394
16
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11395
16
            return BAD_KEY_SHARE_DATA;
11396
16
        }
11397
16
    }
11398
145
    else {
11399
145
        name = curve->name;
11400
145
    }
11401
11402
    #ifdef WOLFSSL_ASYNC_CRYPT
11403
    /* Check the old key share data list. */
11404
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11405
    if (extension != NULL) {
11406
        kse = (KeyShareEntry*)extension->data;
11407
        /* We should not be computing keys if we are only going to advertise
11408
         * our choice here. */
11409
        if (kse != NULL && kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11410
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11411
            return BAD_KEY_SHARE_DATA;
11412
        }
11413
    }
11414
    #endif
11415
11416
    /* Push new KeyShare extension. This will also free the old one */
11417
145
    ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11418
145
    if (ret != 0)
11419
0
        return ret;
11420
    /* Extension got pushed to head */
11421
145
    extension = *extensions;
11422
    /* Push the selected curve */
11423
145
    ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, name,
11424
145
                            ssl->heap, &kse);
11425
145
    if (ret != 0)
11426
0
        return ret;
11427
    /* Set extension to be in response. */
11428
145
    extension->resp = 1;
11429
#else
11430
11431
    (void)ssl;
11432
11433
    WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN);
11434
    ret = NOT_COMPILED_IN;
11435
#endif
11436
11437
145
    return ret;
11438
145
}
11439
11440
#ifdef WOLFSSL_DUAL_ALG_CERTS
11441
/* Writes the CKS objects of a list in a buffer. */
11442
static word16 CKS_WRITE(WOLFSSL* ssl, byte* output)
11443
{
11444
    XMEMCPY(output, ssl->sigSpec, ssl->sigSpecSz);
11445
    return ssl->sigSpecSz;
11446
}
11447
11448
static int TLSX_UseCKS(TLSX** extensions, WOLFSSL* ssl, void* heap)
11449
{
11450
    int ret = 0;
11451
    TLSX* extension;
11452
11453
    if (extensions == NULL) {
11454
        return BAD_FUNC_ARG;
11455
    }
11456
11457
    extension = TLSX_Find(*extensions, TLSX_CKS);
11458
    /* If it is already present, do nothing. */
11459
    if (extension == NULL) {
11460
        /* The data required is in the ssl struct, so push it in. */
11461
        ret = TLSX_Push(extensions, TLSX_CKS, (void*)ssl, heap);
11462
    }
11463
11464
    return ret;
11465
}
11466
11467
int TLSX_CKS_Set(WOLFSSL* ssl, TLSX** extensions)
11468
{
11469
    int ret;
11470
    TLSX* extension;
11471
    /* Push new KeyShare extension. This will also free the old one */
11472
    ret = TLSX_Push(extensions, TLSX_CKS, NULL, ssl->heap);
11473
    if (ret != 0)
11474
        return ret;
11475
    /* Extension got pushed to head */
11476
    extension = *extensions;
11477
    /* Need ssl->sigSpecSz during extension length calculation. */
11478
    extension->data = ssl;
11479
    /* Set extension to be in response. */
11480
    extension->resp = 1;
11481
    return ret;
11482
}
11483
11484
int TLSX_CKS_Parse(WOLFSSL* ssl, byte* input, word16 length,
11485
                   TLSX** extensions)
11486
{
11487
    int ret;
11488
    int i, j;
11489
11490
    (void) extensions;
11491
11492
    /* Validating the input. */
11493
    if (length == 0)
11494
        return BUFFER_ERROR;
11495
    for (i = 0; i < length; i++) {
11496
        switch (input[i])
11497
        {
11498
            case WOLFSSL_CKS_SIGSPEC_NATIVE:
11499
            case WOLFSSL_CKS_SIGSPEC_ALTERNATIVE:
11500
            case WOLFSSL_CKS_SIGSPEC_BOTH:
11501
                /* These are all valid values; do nothing */
11502
                break;
11503
            case WOLFSSL_CKS_SIGSPEC_EXTERNAL:
11504
            default:
11505
                /* All other values (including external) are not. */
11506
                return BAD_FUNC_ARG;
11507
        }
11508
    }
11509
11510
    /* This could be a situation where the client tried to start with TLS 1.3
11511
     * when it sent ClientHello and the server down-graded to TLS 1.2. In that
11512
     * case, erroring out because it is TLS 1.2 is not a reasonable thing to do.
11513
     * In the case of TLS 1.2, the CKS values will be ignored. */
11514
    if (!IsAtLeastTLSv1_3(ssl->version)) {
11515
        ssl->sigSpec = NULL;
11516
        ssl->sigSpecSz = 0;
11517
        return 0;
11518
    }
11519
11520
    /* Extension data is valid, but if we are the server and we don't have an
11521
     * alt private key, do not respond with CKS extension. */
11522
    if (wolfSSL_is_server(ssl) && ssl->buffers.altKey == NULL) {
11523
        ssl->sigSpec = NULL;
11524
        ssl->sigSpecSz = 0;
11525
        return 0;
11526
    }
11527
11528
    /* Copy as the lifetime of input seems to be ephemeral. */
11529
    ssl->peerSigSpec = (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_TLSX);
11530
    if (ssl->peerSigSpec == NULL) {
11531
        return BUFFER_ERROR;
11532
    }
11533
    XMEMCPY(ssl->peerSigSpec, input, length);
11534
    ssl->peerSigSpecSz = length;
11535
11536
    /* If there is no preference set, use theirs... */
11537
    if (ssl->sigSpec == NULL) {
11538
        ret = wolfSSL_UseCKS(ssl, ssl->peerSigSpec, 1);
11539
        if (ret == WOLFSSL_SUCCESS) {
11540
            ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11541
            TLSX_SetResponse(ssl, TLSX_CKS);
11542
        }
11543
        return ret;
11544
    }
11545
11546
    /* ...otherwise, prioritize our preference. */
11547
    for (i = 0; i < ssl->sigSpecSz; i++) {
11548
        for (j = 0; j < length; j++) {
11549
            if (ssl->sigSpec[i] == input[j]) {
11550
                /* Got the match, set to this one. */
11551
                ret = wolfSSL_UseCKS(ssl, &ssl->sigSpec[i], 1);
11552
                if (ret == WOLFSSL_SUCCESS) {
11553
                    ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11554
                    TLSX_SetResponse(ssl, TLSX_CKS);
11555
                }
11556
                return ret;
11557
            }
11558
        }
11559
    }
11560
11561
    /* No match found. Cannot continue. */
11562
    return MATCH_SUITE_ERROR;
11563
}
11564
#endif /* WOLFSSL_DUAL_ALG_CERTS */
11565
11566
/* Server side KSE processing */
11567
int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
11568
    byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, byte* searched)
11569
{
11570
    TLSX*          extension;
11571
    KeyShareEntry* clientKSE = NULL;
11572
    KeyShareEntry* list = NULL;
11573
    KeyShareEntry* preferredKSE = NULL;
11574
    int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11575
    int rank;
11576
11577
    (void)cipherSuite0;
11578
    (void)cipherSuite;
11579
11580
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11581
        return BAD_FUNC_ARG;
11582
11583
    *searched = 0;
11584
11585
    /* Find the KeyShare extension if it exists. */
11586
    extension = TLSX_Find(extensions, TLSX_KEY_SHARE);
11587
    if (extension != NULL)
11588
        list = (KeyShareEntry*)extension->data;
11589
11590
    if (extension && extension->resp == 1) {
11591
        /* Outside of the async case this path should not be taken. */
11592
        int ret = WC_NO_ERR_TRACE(INCOMPLETE_DATA);
11593
    #ifdef WOLFSSL_ASYNC_CRYPT
11594
        /* in async case make sure key generation is finalized */
11595
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
11596
        if (serverKSE && serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11597
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
11598
                *searched = 1;
11599
            ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11600
        }
11601
        else
11602
    #endif
11603
        {
11604
            ret = INCOMPLETE_DATA;
11605
        }
11606
        return ret;
11607
    }
11608
11609
    /* Use server's preference order. */
11610
    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
11611
        if (clientKSE->ke == NULL)
11612
            continue;
11613
11614
#ifdef WOLFSSL_SM2
11615
        if ((cipherSuite0 == CIPHER_BYTE) &&
11616
            ((cipherSuite == TLS_SM4_GCM_SM3) ||
11617
             (cipherSuite == TLS_SM4_CCM_SM3))) {
11618
           if (clientKSE->group != WOLFSSL_ECC_SM2P256V1) {
11619
               continue;
11620
           }
11621
        }
11622
        else if (clientKSE->group == WOLFSSL_ECC_SM2P256V1) {
11623
           continue;
11624
        }
11625
#endif
11626
11627
        /* Check consistency now - extensions in any order. */
11628
        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions))
11629
            continue;
11630
11631
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(clientKSE->group)) {
11632
            /* Check max value supported. */
11633
            if (clientKSE->group > WOLFSSL_ECC_MAX) {
11634
#ifdef WOLFSSL_HAVE_MLKEM
11635
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) &&
11636
                    !WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group))
11637
#endif
11638
                    continue;
11639
            }
11640
            if (wolfSSL_curve_is_disabled(ssl, clientKSE->group))
11641
                continue;
11642
        }
11643
        if (!TLSX_IsGroupSupported(clientKSE->group))
11644
            continue;
11645
11646
        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
11647
        if (rank == -1)
11648
            continue;
11649
        if (rank < preferredRank) {
11650
            preferredKSE = clientKSE;
11651
            preferredRank = rank;
11652
        }
11653
    }
11654
    *kse = preferredKSE;
11655
    *searched = 1;
11656
    return 0;
11657
}
11658
11659
/* Server side KSE processing */
11660
int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
11661
148
{
11662
148
    int            ret;
11663
148
    TLSX*          extension;
11664
148
    KeyShareEntry* serverKSE;
11665
148
    KeyShareEntry* list = NULL;
11666
11667
148
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11668
0
        return BAD_FUNC_ARG;
11669
11670
148
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11671
148
    if (extension == NULL)
11672
0
        return BAD_STATE_E;
11673
11674
148
    if (clientKSE == NULL) {
11675
#ifdef WOLFSSL_ASYNC_CRYPT
11676
        /* Not necessarily an error. The key may have already been setup. */
11677
        if (extension != NULL && extension->resp == 1) {
11678
            serverKSE = (KeyShareEntry*)extension->data;
11679
            if (serverKSE != NULL) {
11680
                /* in async case make sure key generation is finalized */
11681
                if (serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E))
11682
                    return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11683
                else if (serverKSE->lastRet == 0)
11684
                    return 0;
11685
            }
11686
        }
11687
#endif
11688
0
        return BAD_FUNC_ARG;
11689
0
    }
11690
11691
    /* Generate a new key pair except in the case of PQC KEM because we
11692
     * are going to encapsulate and that does not require us to generate a
11693
     * key pair.
11694
     */
11695
148
    ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
11696
148
    if (ret != 0)
11697
0
        return ret;
11698
11699
148
    if (clientKSE->key == NULL) {
11700
148
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
11701
148
        if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) {
11702
0
            ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, serverKSE,
11703
0
                    clientKSE->ke, clientKSE->keLen,
11704
0
                    ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
11705
0
        }
11706
148
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
11707
0
            ret = TLSX_KeyShare_HandlePqcHybridKeyServer(ssl, serverKSE,
11708
0
                    clientKSE->ke, clientKSE->keLen);
11709
0
        }
11710
148
        else
11711
148
#endif
11712
148
        {
11713
148
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
11714
148
        }
11715
11716
        /* for async do setup of serverKSE below, but return WC_PENDING_E */
11717
148
        if (ret != 0
11718
        #ifdef WOLFSSL_ASYNC_CRYPT
11719
            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
11720
        #endif
11721
148
        ) {
11722
0
            TLSX_KeyShare_FreeAll(list, ssl->heap);
11723
0
            return ret;
11724
0
        }
11725
148
    }
11726
0
    else {
11727
        /* transfer buffers to serverKSE */
11728
0
        serverKSE->key = clientKSE->key;
11729
0
        clientKSE->key = NULL;
11730
0
        serverKSE->keyLen = clientKSE->keyLen;
11731
0
        serverKSE->pubKey = clientKSE->pubKey;
11732
0
        clientKSE->pubKey = NULL;
11733
0
        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11734
0
    #ifndef NO_DH
11735
0
        serverKSE->privKey = clientKSE->privKey;
11736
0
        clientKSE->privKey = NULL;
11737
0
    #endif
11738
0
    }
11739
148
    serverKSE->ke = clientKSE->ke;
11740
148
    serverKSE->keLen = clientKSE->keLen;
11741
148
    clientKSE->ke = NULL;
11742
148
    clientKSE->keLen = 0;
11743
148
    ssl->namedGroup = serverKSE->group;
11744
11745
148
    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
11746
148
    extension->data = (void *)serverKSE;
11747
11748
148
    extension->resp = 1;
11749
148
    return ret;
11750
148
}
11751
11752
/* Ensure there is a key pair that can be used for key exchange.
11753
 *
11754
 * ssl  The SSL/TLS object.
11755
 * doHelloRetry If set to non-zero will do hello_retry
11756
 * returns 0 on success and other values indicate failure.
11757
 */
11758
int TLSX_KeyShare_Establish(WOLFSSL *ssl, int* doHelloRetry)
11759
0
{
11760
0
    int            ret;
11761
0
    KeyShareEntry* clientKSE = NULL;
11762
0
    byte           searched = 0;
11763
11764
0
    *doHelloRetry = 0;
11765
11766
0
    ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, ssl->cipher.cipherSuite0,
11767
0
        ssl->cipher.cipherSuite, &clientKSE, &searched);
11768
0
    if (ret != 0 || !searched)
11769
0
        return ret;
11770
11771
    /* No supported group found - send HelloRetryRequest. */
11772
0
    if (clientKSE == NULL) {
11773
        /* Set KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
11774
0
        *doHelloRetry = 1;
11775
0
        return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
11776
0
    }
11777
11778
0
    return TLSX_KeyShare_Setup(ssl, clientKSE);
11779
0
}
11780
11781
/* Derive the shared secret of the key exchange.
11782
 *
11783
 * ssl  The SSL/TLS object.
11784
 * returns 0 on success and other values indicate failure.
11785
 */
11786
int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
11787
148
{
11788
148
    int            ret;
11789
148
    TLSX*          extension;
11790
148
    KeyShareEntry* list = NULL;
11791
11792
#ifdef WOLFSSL_ASYNC_CRYPT
11793
    ret = wolfSSL_AsyncPop(ssl, NULL);
11794
    /* Check for error */
11795
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) && ret < 0) {
11796
        return ret;
11797
    }
11798
#endif
11799
11800
    /* Find the KeyShare extension if it exists. */
11801
148
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11802
148
    if (extension != NULL)
11803
148
        list = (KeyShareEntry*)extension->data;
11804
11805
148
    if (list == NULL)
11806
0
        return KEY_SHARE_ERROR;
11807
11808
    /* Calculate secret. */
11809
148
    ret = TLSX_KeyShare_Process(ssl, list);
11810
11811
148
    return ret;
11812
148
}
11813
11814
0
#define KS_FREE_ALL  TLSX_KeyShare_FreeAll
11815
0
#define KS_GET_SIZE  TLSX_KeyShare_GetSize
11816
#define KS_WRITE     TLSX_KeyShare_Write
11817
0
#define KS_PARSE     TLSX_KeyShare_Parse
11818
11819
#else
11820
11821
#define KS_FREE_ALL(a, b) WC_DO_NOTHING
11822
#define KS_GET_SIZE(a, b)    0
11823
#define KS_WRITE(a, b, c)    0
11824
#define KS_PARSE(a, b, c, d) 0
11825
11826
#endif /* WOLFSSL_TLS13 */
11827
11828
/******************************************************************************/
11829
/* Pre-Shared Key                                                             */
11830
/******************************************************************************/
11831
11832
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
11833
/* Free the pre-shared key dynamic data.
11834
 *
11835
 * list  The linked list of key share entry objects.
11836
 * heap  The heap used for allocation.
11837
 */
11838
static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
11839
{
11840
    PreSharedKey* current;
11841
11842
    while ((current = list) != NULL) {
11843
        list = current->next;
11844
        XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
11845
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
11846
    }
11847
11848
    (void)heap;
11849
}
11850
11851
/* Get the size of the encoded pre shared key extension.
11852
 *
11853
 * list     The linked list of pre-shared key extensions.
11854
 * msgType  The type of the message this extension is being written into.
11855
 * returns the number of bytes of the encoded pre-shared key extension or
11856
 * SANITY_MSG_E to indicate invalid message type.
11857
 */
11858
static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
11859
                                     word16* pSz)
11860
{
11861
    if (msgType == client_hello) {
11862
        /* Length of identities + Length of binders. */
11863
        word32 len = OPAQUE16_LEN + OPAQUE16_LEN;
11864
        while (list != NULL) {
11865
            /* Each entry has: identity, ticket age and binder. */
11866
            len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
11867
                   OPAQUE8_LEN + (word32)list->binderLen;
11868
            if (len > WOLFSSL_MAX_16BIT) {
11869
                WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
11870
                return LENGTH_ERROR;
11871
            }
11872
            list = list->next;
11873
        }
11874
        if ((word32)*pSz + len > WOLFSSL_MAX_16BIT) {
11875
            WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
11876
            return LENGTH_ERROR;
11877
        }
11878
        *pSz += (word16)len;
11879
        return 0;
11880
    }
11881
11882
    if (msgType == server_hello) {
11883
        *pSz += OPAQUE16_LEN;
11884
        return 0;
11885
    }
11886
11887
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11888
    return SANITY_MSG_E;
11889
}
11890
11891
/* The number of bytes to be written for the binders.
11892
 *
11893
 * list     The linked list of pre-shared key extensions.
11894
 * msgType  The type of the message this extension is being written into.
11895
 * returns the number of bytes of the encoded pre-shared key extension or
11896
 * SANITY_MSG_E to indicate invalid message type.
11897
 */
11898
int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
11899
                                     word16* pSz)
11900
{
11901
    word32 len;
11902
11903
    if (msgType != client_hello) {
11904
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11905
        return SANITY_MSG_E;
11906
    }
11907
11908
    /* Length of all binders. */
11909
    len = OPAQUE16_LEN;
11910
    while (list != NULL) {
11911
        len += OPAQUE8_LEN + (word32)list->binderLen;
11912
        if (len > WOLFSSL_MAX_16BIT) {
11913
            WOLFSSL_ERROR_VERBOSE(LENGTH_ERROR);
11914
            return LENGTH_ERROR;
11915
        }
11916
        list = list->next;
11917
    }
11918
11919
    *pSz = (word16)len;
11920
    return 0;
11921
}
11922
11923
/* Writes the pre-shared key extension into the output buffer - binders only.
11924
 * Assumes that the the output buffer is big enough to hold data.
11925
 *
11926
 * list     The linked list of key share entries.
11927
 * output   The buffer to write into.
11928
 * msgType  The type of the message this extension is being written into.
11929
 * returns the number of bytes written into the buffer.
11930
 */
11931
int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
11932
                                   byte msgType, word16* pSz)
11933
{
11934
    PreSharedKey* current = list;
11935
    word16 idx = 0;
11936
    word16 lenIdx;
11937
    word16 len;
11938
11939
    if (msgType != client_hello) {
11940
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11941
        return SANITY_MSG_E;
11942
    }
11943
11944
    /* Skip length of all binders. */
11945
    lenIdx = idx;
11946
    idx += OPAQUE16_LEN;
11947
    while (current != NULL) {
11948
        /* Binder data length. */
11949
        output[idx++] = (byte)current->binderLen;
11950
        /* Binder data. */
11951
        XMEMCPY(output + idx, current->binder, current->binderLen);
11952
        idx += (word16)current->binderLen;
11953
11954
        current = current->next;
11955
    }
11956
    /* Length of the binders. */
11957
    len = idx - lenIdx - OPAQUE16_LEN;
11958
    c16toa(len, output + lenIdx);
11959
11960
    *pSz = idx;
11961
    return 0;
11962
}
11963
11964
11965
/* Writes the pre-shared key extension into the output buffer.
11966
 * Assumes that the the output buffer is big enough to hold data.
11967
 *
11968
 * list     The linked list of key share entries.
11969
 * output   The buffer to write into.
11970
 * msgType  The type of the message this extension is being written into.
11971
 * returns the number of bytes written into the buffer.
11972
 */
11973
static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
11974
                                   byte msgType, word16* pSz)
11975
{
11976
    if (msgType == client_hello) {
11977
        PreSharedKey* current = list;
11978
        word16 idx = 0;
11979
        word16 lenIdx;
11980
        word16 len;
11981
        int ret;
11982
11983
        /* Write identities only. Binders after HMACing over this. */
11984
        lenIdx = idx;
11985
        idx += OPAQUE16_LEN;
11986
        while (current != NULL) {
11987
            /* Identity length */
11988
            c16toa(current->identityLen, output + idx);
11989
            idx += OPAQUE16_LEN;
11990
            /* Identity data */
11991
            XMEMCPY(output + idx, current->identity, current->identityLen);
11992
            idx += current->identityLen;
11993
11994
            /* Obfuscated ticket age. */
11995
            c32toa(current->ticketAge, output + idx);
11996
            idx += OPAQUE32_LEN;
11997
11998
            current = current->next;
11999
        }
12000
        /* Length of the identities. */
12001
        len = idx - lenIdx - OPAQUE16_LEN;
12002
        c16toa(len, output + lenIdx);
12003
12004
        /* Don't include binders here.
12005
         * The binders are based on the hash of all the ClientHello data up to
12006
         * and include the identities written above.
12007
         */
12008
        ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
12009
        if (ret < 0)
12010
            return ret;
12011
        *pSz += idx + len;
12012
    }
12013
    else if (msgType == server_hello) {
12014
        word16 i;
12015
12016
        /* Find the index of the chosen identity. */
12017
        for (i=0; list != NULL && !list->chosen; i++)
12018
            list = list->next;
12019
        if (list == NULL) {
12020
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
12021
            return BUILD_MSG_ERROR;
12022
        }
12023
12024
        /* The index of the identity chosen by the server from the list supplied
12025
         * by the client.
12026
         */
12027
        c16toa(i, output);
12028
        *pSz += OPAQUE16_LEN;
12029
    }
12030
    else {
12031
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12032
        return SANITY_MSG_E;
12033
    }
12034
12035
    return 0;
12036
}
12037
12038
int TLSX_PreSharedKey_Parse_ClientHello(TLSX** extensions, const byte* input,
12039
                                        word16 length, void* heap)
12040
{
12041
12042
    int    ret;
12043
    word16 len;
12044
    word16 idx = 0;
12045
    TLSX*         extension;
12046
    PreSharedKey* list;
12047
12048
    TLSX_Remove(extensions, TLSX_PRE_SHARED_KEY, heap);
12049
12050
    /* Length of identities and of binders. */
12051
    if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
12052
        return BUFFER_E;
12053
12054
    /* Length of identities. */
12055
    ato16(input + idx, &len);
12056
    idx += OPAQUE16_LEN;
12057
    if (len < MIN_PSK_ID_LEN || length - idx < len)
12058
        return BUFFER_E;
12059
12060
    /* Create a pre-shared key object for each identity. */
12061
    while (len > 0) {
12062
        const byte* identity;
12063
        word16      identityLen;
12064
        word32      age;
12065
12066
        if (len < OPAQUE16_LEN)
12067
            return BUFFER_E;
12068
12069
        /* Length of identity. */
12070
        ato16(input + idx, &identityLen);
12071
        idx += OPAQUE16_LEN;
12072
        if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
12073
                identityLen > MAX_PSK_ID_LEN)
12074
            return BUFFER_E;
12075
        /* Cache identity pointer. */
12076
        identity = input + idx;
12077
        idx += identityLen;
12078
        /* Ticket age. */
12079
        ato32(input + idx, &age);
12080
        idx += OPAQUE32_LEN;
12081
12082
        ret = TLSX_PreSharedKey_Use(extensions, identity, identityLen, age, no_mac,
12083
                                    0, 0, 1, NULL, heap);
12084
        if (ret != 0)
12085
            return ret;
12086
12087
        /* Done with this identity. */
12088
        len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
12089
    }
12090
12091
    /* Find the list of identities sent to server. */
12092
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12093
    if (extension == NULL)
12094
        return PSK_KEY_ERROR;
12095
    list = (PreSharedKey*)extension->data;
12096
12097
    /* Length of binders. */
12098
    if (idx + OPAQUE16_LEN > length)
12099
        return BUFFER_E;
12100
    ato16(input + idx, &len);
12101
    idx += OPAQUE16_LEN;
12102
    if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
12103
        return BUFFER_E;
12104
12105
    /* Set binder for each identity. */
12106
    while (list != NULL && len > 0) {
12107
        /* Length of binder */
12108
        list->binderLen = input[idx++];
12109
        if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
12110
                list->binderLen > WC_MAX_DIGEST_SIZE)
12111
            return BUFFER_E;
12112
        if (len < OPAQUE8_LEN + list->binderLen)
12113
            return BUFFER_E;
12114
12115
        /* Copy binder into static buffer. */
12116
        XMEMCPY(list->binder, input + idx, list->binderLen);
12117
        idx += (word16)list->binderLen;
12118
12119
        /* Done with binder entry. */
12120
        len -= OPAQUE8_LEN + (word16)list->binderLen;
12121
12122
        /* Next identity. */
12123
        list = list->next;
12124
    }
12125
    if (list != NULL || len != 0)
12126
        return BUFFER_E;
12127
12128
    return 0;
12129
12130
}
12131
12132
/* Parse the pre-shared key extension.
12133
 * Different formats in different messages.
12134
 *
12135
 * ssl      The SSL/TLS object.
12136
 * input    The extension data.
12137
 * length   The length of the extension data.
12138
 * msgType  The type of the message this extension is being parsed from.
12139
 * returns 0 on success and other values indicate failure.
12140
 */
12141
static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, const byte* input,
12142
                                   word16 length, byte msgType)
12143
{
12144
12145
    if (msgType == client_hello) {
12146
        return TLSX_PreSharedKey_Parse_ClientHello(&ssl->extensions, input,
12147
                                                   length, ssl->heap);
12148
    }
12149
12150
    if (msgType == server_hello) {
12151
        word16 idx;
12152
        PreSharedKey* list;
12153
        TLSX*         extension;
12154
12155
        /* Index of identity chosen by server. */
12156
        if (length != OPAQUE16_LEN)
12157
            return BUFFER_E;
12158
        ato16(input, &idx);
12159
12160
    #ifdef WOLFSSL_EARLY_DATA
12161
        ssl->options.pskIdIndex = idx + 1;
12162
    #endif
12163
12164
        /* Find the list of identities sent to server. */
12165
        extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
12166
        if (extension == NULL)
12167
            return INCOMPLETE_DATA;
12168
        list = (PreSharedKey*)extension->data;
12169
12170
        /* Mark the identity as chosen. */
12171
        for (; list != NULL && idx > 0; idx--)
12172
            list = list->next;
12173
        if (list == NULL) {
12174
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12175
            return PSK_KEY_ERROR;
12176
        }
12177
        list->chosen = 1;
12178
12179
        if (list->resumption) {
12180
           /* Check that the session's details are the same as the server's. */
12181
           if (ssl->options.cipherSuite0  != ssl->session->cipherSuite0       ||
12182
               ssl->options.cipherSuite   != ssl->session->cipherSuite        ||
12183
               ssl->session->version.major != ssl->ctx->method->version.major ||
12184
               ssl->session->version.minor != ssl->ctx->method->version.minor) {
12185
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12186
               return PSK_KEY_ERROR;
12187
           }
12188
        }
12189
12190
        return 0;
12191
    }
12192
12193
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12194
    return SANITY_MSG_E;
12195
}
12196
12197
/* Create a new pre-shared key and put it into the list.
12198
 *
12199
 * list          The linked list of pre-shared key.
12200
 * identity      The identity.
12201
 * len           The length of the identity data.
12202
 * heap          The memory to allocate with.
12203
 * preSharedKey  The new pre-shared key object.
12204
 * returns 0 on success and other values indicate failure.
12205
 */
12206
static int TLSX_PreSharedKey_New(PreSharedKey** list, const byte* identity,
12207
                                 word16 len, void *heap,
12208
                                 PreSharedKey** preSharedKey)
12209
{
12210
    PreSharedKey* psk;
12211
    PreSharedKey** next;
12212
12213
    psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
12214
    if (psk == NULL)
12215
        return MEMORY_E;
12216
    XMEMSET(psk, 0, sizeof(*psk));
12217
12218
    /* Make a copy of the identity data. */
12219
    psk->identity = (byte*)XMALLOC(len + NULL_TERM_LEN, heap,
12220
                                   DYNAMIC_TYPE_TLSX);
12221
    if (psk->identity == NULL) {
12222
        XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
12223
        return MEMORY_E;
12224
    }
12225
    XMEMCPY(psk->identity, identity, len);
12226
    psk->identityLen = len;
12227
    /* Use a NULL terminator in case it is a C string */
12228
    psk->identity[psk->identityLen] = '\0';
12229
12230
    /* Add it to the end and maintain the links. */
12231
    while (*list != NULL) {
12232
        /* Assign to temporary to work around compiler bug found by customer. */
12233
        next = &((*list)->next);
12234
        list = next;
12235
    }
12236
    *list = psk;
12237
    *preSharedKey = psk;
12238
12239
    (void)heap;
12240
12241
    return 0;
12242
}
12243
12244
static WC_INLINE byte GetHmacLength(int hmac)
12245
{
12246
    switch (hmac) {
12247
    #ifndef NO_SHA256
12248
        case sha256_mac:
12249
            return WC_SHA256_DIGEST_SIZE;
12250
    #endif
12251
    #ifdef WOLFSSL_SHA384
12252
        case sha384_mac:
12253
            return WC_SHA384_DIGEST_SIZE;
12254
    #endif
12255
    #ifdef WOLFSSL_SHA512
12256
        case sha512_mac:
12257
            return WC_SHA512_DIGEST_SIZE;
12258
    #endif
12259
    #ifdef WOLFSSL_SM3
12260
        case sm3_mac:
12261
            return WC_SM3_DIGEST_SIZE;
12262
    #endif
12263
        default:
12264
            break;
12265
    }
12266
    return 0;
12267
}
12268
12269
/* Use the data to create a new pre-shared key object in the extensions.
12270
 *
12271
 * ssl           The SSL/TLS object.
12272
 * identity      The identity.
12273
 * len           The length of the identity data.
12274
 * age           The age of the identity.
12275
 * hmac          The HMAC algorithm.
12276
 * cipherSuite0  The first byte of the cipher suite to use.
12277
 * cipherSuite   The second byte of the cipher suite to use.
12278
 * resumption    The PSK is for resumption of a session.
12279
 * preSharedKey  The new pre-shared key object.
12280
 * returns 0 on success and other values indicate failure.
12281
 */
12282
int TLSX_PreSharedKey_Use(TLSX** extensions, const byte* identity, word16 len,
12283
                          word32 age, byte hmac, byte cipherSuite0,
12284
                          byte cipherSuite, byte resumption,
12285
                          PreSharedKey **preSharedKey, void* heap)
12286
{
12287
    int           ret = 0;
12288
    TLSX*         extension;
12289
    PreSharedKey* psk = NULL;
12290
12291
    /* Find the pre-shared key extension if it exists. */
12292
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12293
    if (extension == NULL) {
12294
        /* Push new pre-shared key extension. */
12295
        ret = TLSX_Push(extensions, TLSX_PRE_SHARED_KEY, NULL, heap);
12296
        if (ret != 0)
12297
            return ret;
12298
12299
        extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
12300
        if (extension == NULL)
12301
            return MEMORY_E;
12302
    }
12303
12304
    /* Try to find the pre-shared key with this identity. */
12305
    psk = (PreSharedKey*)extension->data;
12306
    while (psk != NULL) {
12307
        if ((psk->identityLen == len) &&
12308
               (XMEMCMP(psk->identity, identity, len) == 0)) {
12309
            break;
12310
        }
12311
        psk = psk->next;
12312
    }
12313
12314
    /* Create a new pre-shared key object if not found. */
12315
    if (psk == NULL) {
12316
        ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
12317
                                    len, heap, &psk);
12318
        if (ret != 0)
12319
            return ret;
12320
    }
12321
12322
    /* Update/set age and HMAC algorithm. */
12323
    psk->ticketAge    = age;
12324
    psk->hmac         = hmac;
12325
    psk->cipherSuite0 = cipherSuite0;
12326
    psk->cipherSuite  = cipherSuite;
12327
    psk->resumption   = resumption;
12328
    psk->binderLen    = GetHmacLength(psk->hmac);
12329
12330
    if (preSharedKey != NULL)
12331
        *preSharedKey = psk;
12332
12333
    return 0;
12334
}
12335
12336
#define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
12337
#define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
12338
#define PSK_WRITE     TLSX_PreSharedKey_Write
12339
#define PSK_PARSE     TLSX_PreSharedKey_Parse
12340
12341
#else
12342
12343
#define PSK_FREE_ALL(a, b) WC_DO_NOTHING
12344
#define PSK_GET_SIZE(a, b, c) 0
12345
#define PSK_WRITE(a, b, c, d) 0
12346
#define PSK_PARSE(a, b, c, d) 0
12347
12348
#endif
12349
12350
/******************************************************************************/
12351
/* Certificate Authentication with External Pre-Shared Key                    */
12352
/******************************************************************************/
12353
12354
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
12355
    !defined(NO_PSK)
12356
12357
static int TLSX_CertWithExternPsk_GetSize(byte msgType, word16* pSz)
12358
{
12359
    (void)msgType;
12360
    (void)pSz;
12361
    /* Zero-length extension - nothing to add. */
12362
    return 0;
12363
}
12364
12365
static int TLSX_CertWithExternPsk_Write(byte* output, byte msgType,
12366
    word16* pSz)
12367
{
12368
    (void)output;
12369
    (void)msgType;
12370
    (void)pSz;
12371
    /* Zero-length extension - nothing to write. */
12372
    return 0;
12373
}
12374
12375
static int TLSX_CertWithExternPsk_Parse(WOLFSSL* ssl, byte msgType)
12376
{
12377
    if (msgType == client_hello) {
12378
        /* Server has not opted in - treat the extension as unknown. */
12379
        if (!ssl->options.certWithExternPsk)
12380
            return 0;
12381
        /* Record that the client offered the extension, leaving resp=0.
12382
         * CheckPreSharedKeys() is the sole writer that flips resp to 1, and
12383
         * only after confirming that a non-ticket PSK was matched. */
12384
        if (TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) == NULL) {
12385
            return TLSX_Push(&ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK,
12386
                NULL, ssl->heap);
12387
        }
12388
        return 0;
12389
    }
12390
12391
    if (msgType == server_hello) {
12392
        if (TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) == NULL) {
12393
            WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
12394
            return EXT_NOT_ALLOWED;
12395
        }
12396
        ssl->options.certWithExternPsk = 1;
12397
        return 0;
12398
    }
12399
12400
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12401
    return SANITY_MSG_E;
12402
}
12403
12404
int TLSX_CertWithExternPsk_Use(WOLFSSL* ssl)
12405
{
12406
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK);
12407
12408
    if (extension == NULL) {
12409
        int ret = TLSX_Push(&ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK, NULL,
12410
            ssl->heap);
12411
        if (ret != 0)
12412
            return ret;
12413
        extension = TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK);
12414
        if (extension == NULL)
12415
            return MEMORY_E;
12416
    }
12417
    extension->resp = 1;
12418
    return 0;
12419
}
12420
12421
#define PSK_WITH_CERT_GET_SIZE  TLSX_CertWithExternPsk_GetSize
12422
#define PSK_WITH_CERT_WRITE     TLSX_CertWithExternPsk_Write
12423
#define PSK_WITH_CERT_PARSE     TLSX_CertWithExternPsk_Parse
12424
12425
#else
12426
12427
#define PSK_WITH_CERT_GET_SIZE(a, b) 0
12428
#define PSK_WITH_CERT_WRITE(a, b, c) 0
12429
#define PSK_WITH_CERT_PARSE(a, b) 0
12430
12431
#endif /* WOLFSSL_TLS13 && WOLFSSL_CERT_WITH_EXTERN_PSK */
12432
12433
/******************************************************************************/
12434
/* PSK Key Exchange Modes                                                     */
12435
/******************************************************************************/
12436
12437
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
12438
/* Get the size of the encoded PSK KE modes extension.
12439
 * Only in ClientHello.
12440
 *
12441
 * modes    The PSK KE mode bit string.
12442
 * msgType  The type of the message this extension is being written into.
12443
 * returns the number of bytes of the encoded PSK KE mode extension.
12444
 */
12445
static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
12446
{
12447
    if (msgType == client_hello) {
12448
        /* Format: Len | Modes* */
12449
        word16 len = OPAQUE8_LEN;
12450
        /* Check whether each possible mode is to be written. */
12451
        if (modes & (1 << PSK_KE))
12452
            len += OPAQUE8_LEN;
12453
        if (modes & (1 << PSK_DHE_KE))
12454
            len += OPAQUE8_LEN;
12455
        *pSz += len;
12456
        return 0;
12457
    }
12458
12459
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12460
    return SANITY_MSG_E;
12461
}
12462
12463
/* Writes the PSK KE modes extension into the output buffer.
12464
 * Assumes that the the output buffer is big enough to hold data.
12465
 * Only in ClientHello.
12466
 *
12467
 * modes    The PSK KE mode bit string.
12468
 * output   The buffer to write into.
12469
 * msgType  The type of the message this extension is being written into.
12470
 * returns the number of bytes written into the buffer.
12471
 */
12472
static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
12473
                                 word16* pSz)
12474
{
12475
    if (msgType == client_hello) {
12476
        /* Format: Len | Modes* */
12477
        word16 idx = OPAQUE8_LEN;
12478
12479
        /* Write out each possible mode. */
12480
        if (modes & (1 << PSK_KE))
12481
            output[idx++] = PSK_KE;
12482
        if (modes & (1 << PSK_DHE_KE))
12483
            output[idx++] = PSK_DHE_KE;
12484
        /* Write out length of mode list. */
12485
        output[0] = (byte)(idx - OPAQUE8_LEN);
12486
12487
        *pSz += idx;
12488
        return 0;
12489
    }
12490
12491
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12492
    return SANITY_MSG_E;
12493
}
12494
12495
int TLSX_PskKeyModes_Parse_Modes(const byte* input, word16 length, byte msgType,
12496
                                byte* modes)
12497
{
12498
    if (msgType == client_hello) {
12499
        /* Format: Len | Modes* */
12500
        int   idx = 0;
12501
        word16 len;
12502
        *modes = 0;
12503
12504
        /* Ensure length byte exists. */
12505
        if (length < OPAQUE8_LEN)
12506
            return BUFFER_E;
12507
12508
        /* Get length of mode list and ensure that is the only data. */
12509
        len = input[0];
12510
        if (length - OPAQUE8_LEN != len)
12511
            return BUFFER_E;
12512
12513
        idx = OPAQUE8_LEN;
12514
        /* Set a bit for each recognized modes. */
12515
        while (len > 0) {
12516
            /* Ignore unrecognized modes.  */
12517
            if (input[idx] <= PSK_DHE_KE)
12518
               *modes |= 1 << input[idx];
12519
            idx++;
12520
            len--;
12521
        }
12522
        return 0;
12523
    }
12524
12525
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12526
    return SANITY_MSG_E;
12527
}
12528
12529
/* Parse the PSK KE modes extension.
12530
 * Only in ClientHello.
12531
 *
12532
 * ssl      The SSL/TLS object.
12533
 * input    The extension data.
12534
 * length   The length of the extension data.
12535
 * msgType  The type of the message this extension is being parsed from.
12536
 * returns 0 on success and other values indicate failure.
12537
 */
12538
static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, const byte* input, word16 length,
12539
                                 byte msgType)
12540
{
12541
    int    ret;
12542
    byte modes;
12543
12544
    ret = TLSX_PskKeyModes_Parse_Modes(input, length, msgType, &modes);
12545
    if (ret == 0)
12546
        ret = TLSX_PskKeyModes_Use(ssl, modes);
12547
12548
    if (ret != 0) {
12549
        WOLFSSL_ERROR_VERBOSE(ret);
12550
    }
12551
12552
    return ret;
12553
}
12554
12555
/* Use the data to create a new PSK Key Exchange Modes object in the extensions.
12556
 *
12557
 * ssl    The SSL/TLS object.
12558
 * modes  The PSK key exchange modes.
12559
 * returns 0 on success and other values indicate failure.
12560
 */
12561
int TLSX_PskKeyModes_Use(WOLFSSL* ssl, byte modes)
12562
{
12563
    int           ret = 0;
12564
    TLSX*         extension;
12565
12566
    /* Find the PSK key exchange modes extension if it exists. */
12567
    extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
12568
    if (extension == NULL) {
12569
        /* Push new PSK key exchange modes extension. */
12570
        ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
12571
            ssl->heap);
12572
        if (ret != 0)
12573
            return ret;
12574
12575
        extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
12576
        if (extension == NULL)
12577
            return MEMORY_E;
12578
    }
12579
12580
    extension->val = modes;
12581
12582
    return 0;
12583
}
12584
12585
#define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
12586
#define PKM_WRITE     TLSX_PskKeModes_Write
12587
#define PKM_PARSE     TLSX_PskKeModes_Parse
12588
12589
#else
12590
12591
#define PKM_GET_SIZE(a, b, c) 0
12592
#define PKM_WRITE(a, b, c, d) 0
12593
#define PKM_PARSE(a, b, c, d) 0
12594
12595
#endif
12596
12597
/******************************************************************************/
12598
/* Post-Handshake Authentication                                              */
12599
/******************************************************************************/
12600
12601
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
12602
/* Get the size of the encoded Post-Handshake Authentication extension.
12603
 * Only in ClientHello.
12604
 *
12605
 * msgType  The type of the message this extension is being written into.
12606
 * returns the number of bytes of the encoded Post-Handshake Authentication
12607
 * extension.
12608
 */
12609
static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
12610
{
12611
    if (msgType == client_hello) {
12612
        *pSz += 0;
12613
        return 0;
12614
    }
12615
12616
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12617
    return SANITY_MSG_E;
12618
}
12619
12620
/* Writes the Post-Handshake Authentication extension into the output buffer.
12621
 * Assumes that the the output buffer is big enough to hold data.
12622
 * Only in ClientHello.
12623
 *
12624
 * output   The buffer to write into.
12625
 * msgType  The type of the message this extension is being written into.
12626
 * returns the number of bytes written into the buffer.
12627
 */
12628
static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
12629
{
12630
    (void)output;
12631
12632
    if (msgType == client_hello) {
12633
        *pSz += 0;
12634
        return 0;
12635
    }
12636
12637
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12638
    return SANITY_MSG_E;
12639
}
12640
12641
/* Parse the Post-Handshake Authentication extension.
12642
 * Only in ClientHello.
12643
 *
12644
 * ssl      The SSL/TLS object.
12645
 * input    The extension data.
12646
 * length   The length of the extension data.
12647
 * msgType  The type of the message this extension is being parsed from.
12648
 * returns 0 on success and other values indicate failure.
12649
 */
12650
static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, const byte* input,
12651
                                   word16 length, byte msgType)
12652
{
12653
    (void)input;
12654
12655
    if (msgType == client_hello) {
12656
        /* Ensure extension is empty. */
12657
        if (length != 0)
12658
            return BUFFER_E;
12659
12660
        ssl->options.postHandshakeAuth = 1;
12661
        return 0;
12662
    }
12663
12664
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12665
    return SANITY_MSG_E;
12666
}
12667
12668
/* Create a new Post-handshake authentication object in the extensions.
12669
 *
12670
 * ssl    The SSL/TLS object.
12671
 * returns 0 on success and other values indicate failure.
12672
 */
12673
static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
12674
{
12675
    int   ret = 0;
12676
    TLSX* extension;
12677
12678
    /* Find the PSK key exchange modes extension if it exists. */
12679
    extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
12680
    if (extension == NULL) {
12681
        /* Push new Post-handshake Authentication extension. */
12682
        ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
12683
            ssl->heap);
12684
        if (ret != 0)
12685
            return ret;
12686
    }
12687
12688
    return 0;
12689
}
12690
12691
#define PHA_GET_SIZE  TLSX_PostHandAuth_GetSize
12692
#define PHA_WRITE     TLSX_PostHandAuth_Write
12693
#define PHA_PARSE     TLSX_PostHandAuth_Parse
12694
12695
#else
12696
12697
#define PHA_GET_SIZE(a, b)    0
12698
#define PHA_WRITE(a, b, c)    0
12699
#define PHA_PARSE(a, b, c, d) 0
12700
12701
#endif
12702
12703
/******************************************************************************/
12704
/* Early Data Indication                                                      */
12705
/******************************************************************************/
12706
12707
#ifdef WOLFSSL_EARLY_DATA
12708
/* Get the size of the encoded Early Data Indication extension.
12709
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12710
 *
12711
 * msgType  The type of the message this extension is being written into.
12712
 * returns the number of bytes of the encoded Early Data Indication extension.
12713
 */
12714
static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
12715
{
12716
    int ret = 0;
12717
12718
    if (msgType == client_hello || msgType == encrypted_extensions)
12719
        *pSz += 0;
12720
    else if (msgType == session_ticket)
12721
        *pSz += OPAQUE32_LEN;
12722
    else {
12723
        ret = SANITY_MSG_E;
12724
        WOLFSSL_ERROR_VERBOSE(ret);
12725
    }
12726
12727
    return ret;
12728
}
12729
12730
/* Writes the Early Data Indicator extension into the output buffer.
12731
 * Assumes that the the output buffer is big enough to hold data.
12732
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12733
 *
12734
 * maxSz    The maximum early data size.
12735
 * output   The buffer to write into.
12736
 * msgType  The type of the message this extension is being written into.
12737
 * returns the number of bytes written into the buffer.
12738
 */
12739
static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
12740
                                word16* pSz)
12741
{
12742
    if (msgType == client_hello || msgType == encrypted_extensions)
12743
        return 0;
12744
    else if (msgType == session_ticket) {
12745
        c32toa(maxSz, output);
12746
        *pSz += OPAQUE32_LEN;
12747
        return 0;
12748
    }
12749
12750
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12751
    return SANITY_MSG_E;
12752
}
12753
12754
/* Parse the Early Data Indicator extension.
12755
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12756
 *
12757
 * ssl      The SSL/TLS object.
12758
 * input    The extension data.
12759
 * length   The length of the extension data.
12760
 * msgType  The type of the message this extension is being parsed from.
12761
 * returns 0 on success and other values indicate failure.
12762
 */
12763
static int TLSX_EarlyData_Parse(WOLFSSL* ssl, const byte* input, word16 length,
12764
                                 byte msgType)
12765
{
12766
    WOLFSSL_ENTER("TLSX_EarlyData_Parse");
12767
    if (msgType == client_hello) {
12768
        if (length != 0)
12769
            return BUFFER_E;
12770
12771
        if (ssl->earlyData == expecting_early_data) {
12772
12773
            if (ssl->options.maxEarlyDataSz != 0)
12774
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
12775
            else
12776
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
12777
12778
            return TLSX_EarlyData_Use(ssl, 0, 0);
12779
        }
12780
        ssl->earlyData = early_data_ext;
12781
12782
        return 0;
12783
    }
12784
    if (msgType == encrypted_extensions) {
12785
        if (length != 0)
12786
            return BUFFER_E;
12787
12788
        /* Ensure the index of PSK identity chosen by server is 0.
12789
         * Index is plus one to handle 'not set' value of 0.
12790
         */
12791
        if (ssl->options.pskIdIndex != 1) {
12792
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12793
            return PSK_KEY_ERROR;
12794
        }
12795
12796
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
12797
            /* the extension from server comes in */
12798
            ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
12799
        }
12800
12801
        return TLSX_EarlyData_Use(ssl, 1, 1);
12802
    }
12803
    if (msgType == session_ticket) {
12804
        word32 maxSz;
12805
12806
        if (length != OPAQUE32_LEN)
12807
            return BUFFER_E;
12808
        ato32(input, &maxSz);
12809
12810
        ssl->session->maxEarlyDataSz = maxSz;
12811
        return 0;
12812
    }
12813
12814
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12815
    return SANITY_MSG_E;
12816
}
12817
12818
/* Use the data to create a new Early Data object in the extensions.
12819
 *
12820
 * ssl    The SSL/TLS object.
12821
 * maxSz  The maximum early data size.
12822
 * is_response   if this extension is part of a response
12823
 * returns 0 on success and other values indicate failure.
12824
 */
12825
int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz, int is_response)
12826
{
12827
    int   ret = 0;
12828
    TLSX* extension;
12829
12830
    /* Find the early data extension if it exists. */
12831
    extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
12832
    if (extension == NULL) {
12833
        /* Push new early data extension. */
12834
        ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
12835
        if (ret != 0)
12836
            return ret;
12837
12838
        extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
12839
        if (extension == NULL)
12840
            return MEMORY_E;
12841
    }
12842
12843
    extension->resp = is_response;
12844
    /* In QUIC, earlydata size is either 0 or 0xffffffff.
12845
     * Override any size between, possibly left from our initial value */
12846
    extension->val  = (WOLFSSL_IS_QUIC(ssl) && is_response && maxSz > 0) ?
12847
                       WOLFSSL_MAX_32BIT : maxSz;
12848
12849
    return 0;
12850
}
12851
12852
#define EDI_GET_SIZE  TLSX_EarlyData_GetSize
12853
#define EDI_WRITE     TLSX_EarlyData_Write
12854
#define EDI_PARSE     TLSX_EarlyData_Parse
12855
12856
#else
12857
12858
#define EDI_GET_SIZE(a, b)    0
12859
#define EDI_WRITE(a, b, c, d) 0
12860
#define EDI_PARSE(a, b, c, d) 0
12861
12862
#endif
12863
12864
/******************************************************************************/
12865
/* QUIC transport parameter extension                                         */
12866
/******************************************************************************/
12867
#ifdef WOLFSSL_QUIC
12868
12869
static word16 TLSX_QuicTP_GetSize(TLSX* extension)
12870
{
12871
    const QuicTransportParam *tp = (QuicTransportParam*)extension->data;
12872
12873
    return tp ? tp->len : 0;
12874
}
12875
12876
int TLSX_QuicTP_Use(WOLFSSL* ssl, TLSX_Type ext_type, int is_response)
12877
{
12878
    int ret = 0;
12879
    TLSX* extension;
12880
12881
    WOLFSSL_ENTER("TLSX_QuicTP_Use");
12882
    if (ssl->quic.transport_local == NULL) {
12883
        /* RFC9000, ch 7.3: "An endpoint MUST treat the absence of [...]
12884
         *     from either endpoint [...] as a connection error of type
12885
         *     TRANSPORT_PARAMETER_ERROR."
12886
         */
12887
        ret = QUIC_TP_MISSING_E;
12888
        goto cleanup;
12889
    }
12890
12891
    extension = TLSX_Find(ssl->extensions, ext_type);
12892
    if (extension == NULL) {
12893
        ret = TLSX_Push(&ssl->extensions, ext_type, NULL, ssl->heap);
12894
        if (ret != 0)
12895
            goto cleanup;
12896
12897
        extension = TLSX_Find(ssl->extensions, ext_type);
12898
        if (extension == NULL) {
12899
            ret = MEMORY_E;
12900
            goto cleanup;
12901
        }
12902
    }
12903
    if (extension->data) {
12904
        QuicTransportParam_free((QuicTransportParam*)extension->data, ssl->heap);
12905
        extension->data = NULL;
12906
    }
12907
    extension->resp = is_response;
12908
    extension->data = (void*)QuicTransportParam_dup(ssl->quic.transport_local, ssl->heap);
12909
    if (!extension->data) {
12910
        ret = MEMORY_E;
12911
        goto cleanup;
12912
    }
12913
12914
cleanup:
12915
    WOLFSSL_LEAVE("TLSX_QuicTP_Use", ret);
12916
    return ret;
12917
}
12918
12919
static word16 TLSX_QuicTP_Write(QuicTransportParam *tp, byte* output)
12920
{
12921
    word16 len = 0;
12922
12923
    WOLFSSL_ENTER("TLSX_QuicTP_Write");
12924
    if (tp && tp->len) {
12925
        XMEMCPY(output, tp->data, tp->len);
12926
        len = tp->len;
12927
    }
12928
    WOLFSSL_LEAVE("TLSX_QuicTP_Write", len);
12929
    return len;
12930
}
12931
12932
static int TLSX_QuicTP_Parse(WOLFSSL *ssl, const byte *input, size_t len, int ext_type, int msgType)
12933
{
12934
    const QuicTransportParam *tp, **ptp;
12935
12936
    (void)msgType;
12937
    tp = QuicTransportParam_new(input, len, ssl->heap);
12938
    if (!tp) {
12939
        return MEMORY_E;
12940
    }
12941
    ptp = (ext_type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT) ?
12942
        &ssl->quic.transport_peer_draft : &ssl->quic.transport_peer;
12943
    if (*ptp) {
12944
        QTP_FREE(*ptp, ssl->heap);
12945
    }
12946
    *ptp = tp;
12947
    return 0;
12948
}
12949
12950
#define QTP_GET_SIZE    TLSX_QuicTP_GetSize
12951
#define QTP_USE         TLSX_QuicTP_Use
12952
#define QTP_WRITE       TLSX_QuicTP_Write
12953
#define QTP_PARSE       TLSX_QuicTP_Parse
12954
12955
#endif /* WOLFSSL_QUIC */
12956
12957
#if defined(WOLFSSL_DTLS_CID)
12958
#define CID_GET_SIZE  TLSX_ConnectionID_GetSize
12959
#define CID_WRITE  TLSX_ConnectionID_Write
12960
#define CID_PARSE  TLSX_ConnectionID_Parse
12961
#define CID_FREE  TLSX_ConnectionID_Free
12962
#else
12963
#define CID_GET_SIZE(a) 0
12964
#define CID_WRITE(a, b) 0
12965
#define CID_PARSE(a, b, c, d) 0
12966
#define CID_FREE(a, b) 0
12967
#endif /* defined(WOLFSSL_DTLS_CID) */
12968
12969
#if defined(HAVE_RPK)
12970
/******************************************************************************/
12971
/* Client_Certificate_Type extension                                          */
12972
/******************************************************************************/
12973
/* return 1 if specified type is included in the given list, otherwise 0 */
12974
static int IsCertTypeListed(byte type, byte cnt, const byte* list)
12975
{
12976
    int ret = 0;
12977
    int i;
12978
12979
    if (cnt == 0 || list == NULL)
12980
        return ret;
12981
12982
    if (cnt > 0 && cnt <= MAX_CLIENT_CERT_TYPE_CNT) {
12983
        for (i = 0; i < cnt; i++) {
12984
            if (list[i] == type)
12985
                return 1;
12986
        }
12987
    }
12988
    return 0;
12989
}
12990
12991
/* Search both arrays from above to find a common value between the two given
12992
 * arrays(a and b). return 1 if it finds a common value, otherwise return 0.
12993
 */
12994
static int GetCommonItem(const byte* a, byte aLen, const byte* b, byte bLen,
12995
                                                                    byte* type)
12996
{
12997
    int i, j;
12998
12999
    if (a == NULL || b == NULL)
13000
        return 0;
13001
13002
    for (i = 0; i < aLen; i++) {
13003
        for (j = 0; j < bLen; j++) {
13004
            if (a[i] == b[j]) {
13005
                *type = a[i];
13006
                return 1;
13007
            }
13008
        }
13009
    }
13010
    return 0;
13011
}
13012
13013
/* Creates a "client certificate type" extension if necessary.
13014
 * Returns 0 if no error occurred, negative value otherwise.
13015
 * A return of 0, it does not indicae that the extension was created.
13016
 */
13017
static int TLSX_ClientCertificateType_Use(WOLFSSL* ssl, byte isServer)
13018
{
13019
    int ret = 0;
13020
13021
    if (ssl == NULL)
13022
        return BAD_FUNC_ARG;
13023
13024
    if (isServer) {
13025
        /* [in server side]
13026
         */
13027
13028
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13029
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13030
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
13031
13032
            WOLFSSL_MSG("Adding Client Certificate Type extension");
13033
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
13034
                                                                    ssl->heap);
13035
            if (ret == 0) {
13036
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
13037
            }
13038
        }
13039
    }
13040
    else {
13041
        /* [in client side]
13042
         * This extension MUST be omitted from the ClientHello unless the RPK
13043
         * certificate is preferred by the user and actually loaded.
13044
         */
13045
13046
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13047
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13048
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
13049
13050
            if (ssl->options.rpkState.isRPKLoaded) {
13051
13052
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
13053
                ssl->options.rpkState.sending_ClientCertTypes[0] =
13054
                                                        WOLFSSL_CERT_TYPE_RPK;
13055
13056
                /* Push new client_certificate_type extension. */
13057
                WOLFSSL_MSG("Adding Client Certificate Type extension");
13058
                ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE,
13059
                                                                ssl, ssl->heap);
13060
            }
13061
            else {
13062
                WOLFSSL_MSG("Willing to use RPK cert but not loaded it");
13063
            }
13064
        }
13065
        else {
13066
            WOLFSSL_MSG("No will to use RPK cert");
13067
        }
13068
    }
13069
    return ret;
13070
}
13071
13072
/* Parse a "client certificate type" extension received from peer.
13073
 * returns 0 on success and other values indicate failure.
13074
 */
13075
static int TLSX_ClientCertificateType_Parse(WOLFSSL* ssl, const byte* input,
13076
                                                word16 length, byte msgType)
13077
{
13078
    byte typeCnt;
13079
    int idx = 0;
13080
    int ret = 0;
13081
    int i;
13082
    int populate = 0;
13083
    byte  cmnType;
13084
13085
13086
    if (msgType == client_hello) {
13087
        /* [parse ClientHello in server end]
13088
         * case 1) if peer verify is disabled, this extension must be omitted
13089
         *         from ServerHello.
13090
         * case 2) if user have not set his preference, find X509 in parsed
13091
         *         result, then populate "Client Certificate Type" extension.
13092
         * case 3) if user have not set his preference and X509 isn't included
13093
         *         in parsed result, send "unsupported certificate" alert.
13094
         * case 4) if user have set his preference, find a common cert type
13095
         *         in users preference and received cert types.
13096
         * case 5) if user have set his preference, but no common cert type
13097
         *         found.
13098
         */
13099
13100
        /* case 1 */
13101
        if (ssl->options.verifyNone) {
13102
            return ret;
13103
        }
13104
13105
        /* parse extension */
13106
        if (length < OPAQUE8_LEN)
13107
            return BUFFER_E;
13108
13109
        typeCnt = input[idx];
13110
13111
        if (typeCnt > MAX_CLIENT_CERT_TYPE_CNT)
13112
            return BUFFER_E;
13113
13114
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
13115
            return BUFFER_E;
13116
        }
13117
13118
        ssl->options.rpkState.received_ClientCertTypeCnt = input[idx];
13119
        idx += OPAQUE8_LEN;
13120
13121
        for (i = 0; i < typeCnt; i++) {
13122
            ssl->options.rpkState.received_ClientCertTypes[i] = input[idx];
13123
            idx += OPAQUE8_LEN;
13124
        }
13125
13126
        if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt == 0) {
13127
            /* case 2 */
13128
            if (IsCertTypeListed(WOLFSSL_CERT_TYPE_X509,
13129
                            ssl->options.rpkState.received_ClientCertTypeCnt,
13130
                            ssl->options.rpkState.received_ClientCertTypes)) {
13131
13132
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
13133
                ssl->options.rpkState.sending_ClientCertTypes[0] =
13134
                                                        WOLFSSL_CERT_TYPE_X509;
13135
                populate = 1;
13136
            }
13137
            /* case 3 */
13138
            else {
13139
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
13140
                SendAlert(ssl, alert_fatal, unsupported_certificate);
13141
                return UNSUPPORTED_CERTIFICATE;
13142
            }
13143
        }
13144
        else if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt > 0) {
13145
            /* case 4 */
13146
            if (GetCommonItem(
13147
                            ssl->options.rpkConfig.preferred_ClientCertTypes,
13148
                            ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
13149
                            ssl->options.rpkState.received_ClientCertTypes,
13150
                            ssl->options.rpkState.received_ClientCertTypeCnt,
13151
                            &cmnType)) {
13152
                ssl->options.rpkState.sending_ClientCertTypeCnt  = 1;
13153
                ssl->options.rpkState.sending_ClientCertTypes[0] = cmnType;
13154
                populate = 1;
13155
            }
13156
            /* case 5 */
13157
            else {
13158
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
13159
                SendAlert(ssl, alert_fatal, unsupported_certificate);
13160
                return UNSUPPORTED_CERTIFICATE;
13161
            }
13162
        }
13163
13164
        /* populate client_certificate_type extension */
13165
        if (populate) {
13166
            WOLFSSL_MSG("Adding Client Certificate Type extension");
13167
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
13168
                                                                    ssl->heap);
13169
            if (ret == 0) {
13170
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
13171
            }
13172
        }
13173
    }
13174
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13175
        /* parse it in client side */
13176
        if (length == 1) {
13177
            ssl->options.rpkState.received_ClientCertTypeCnt  = 1;
13178
            ssl->options.rpkState.received_ClientCertTypes[0] = *input;
13179
        }
13180
        else {
13181
            return BUFFER_E;
13182
        }
13183
    }
13184
13185
    return ret;
13186
}
13187
13188
/* Write out the "client certificate type" extension data into the given buffer.
13189
 * return the size wrote in the buffer on success, negative value on error.
13190
 */
13191
static word16 TLSX_ClientCertificateType_Write(void* data, byte* output,
13192
                                              byte msgType)
13193
{
13194
    WOLFSSL* ssl = (WOLFSSL*)data;
13195
    word16 idx = 0;
13196
    byte cnt = 0;
13197
    int i;
13198
13199
    /* skip to write extension if count is zero */
13200
    cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
13201
13202
    if (cnt == 0)
13203
        return 0;
13204
13205
    if (msgType == client_hello) {
13206
        /* client side */
13207
13208
        *(output + idx) = cnt;
13209
        idx += OPAQUE8_LEN;
13210
13211
        for (i = 0; i < cnt; i++) {
13212
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[i];
13213
            idx += OPAQUE8_LEN;
13214
        }
13215
        return idx;
13216
    }
13217
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13218
        /* sever side */
13219
        if (cnt == 1) {
13220
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[0];
13221
            idx += OPAQUE8_LEN;
13222
        }
13223
    }
13224
    return idx;
13225
}
13226
13227
/* Calculate then return the size of the "client certificate type" extension
13228
 * data.
13229
 * return the extension data size on success, negative value on error.
13230
*/
13231
static int TLSX_ClientCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
13232
{
13233
    int ret = 0;
13234
    byte cnt;
13235
13236
    if (ssl == NULL)
13237
        return BAD_FUNC_ARG;
13238
13239
    if (msgType == client_hello) {
13240
        /* client side */
13241
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
13242
        ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
13243
    }
13244
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13245
        /* server side */
13246
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;/* must be one */
13247
        if (cnt != 1)
13248
            return SANITY_MSG_E;
13249
        ret = OPAQUE8_LEN;
13250
    }
13251
    else {
13252
        return SANITY_MSG_E;
13253
    }
13254
    return ret;
13255
}
13256
13257
    #define CCT_GET_SIZE  TLSX_ClientCertificateType_GetSize
13258
    #define CCT_WRITE     TLSX_ClientCertificateType_Write
13259
    #define CCT_PARSE     TLSX_ClientCertificateType_Parse
13260
#else
13261
    #define CCT_GET_SIZE(a)  0
13262
    #define CCT_WRITE(a, b)  0
13263
    #define CCT_PARSE(a, b, c, d) 0
13264
#endif /* HAVE_RPK */
13265
13266
#if defined(HAVE_RPK)
13267
/******************************************************************************/
13268
/* Server_Certificate_Type extension                                          */
13269
/******************************************************************************/
13270
/* Creates a "server certificate type" extension if necessary.
13271
 * Returns 0 if no error occurred, negative value otherwise.
13272
 * A return of 0, it does not indicae that the extension was created.
13273
 */
13274
static int TLSX_ServerCertificateType_Use(WOLFSSL* ssl, byte isServer)
13275
{
13276
    int ret = 0;
13277
    byte ctype;
13278
13279
    if (ssl == NULL)
13280
        return BAD_FUNC_ARG;
13281
13282
    if (isServer) {
13283
        /* [in server side] */
13284
        /* find common cert type to both end */
13285
        if (GetCommonItem(
13286
                ssl->options.rpkConfig.preferred_ServerCertTypes,
13287
                ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
13288
                ssl->options.rpkState.received_ServerCertTypes,
13289
                ssl->options.rpkState.received_ServerCertTypeCnt,
13290
                &ctype)) {
13291
            ssl->options.rpkState.sending_ServerCertTypeCnt = 1;
13292
            ssl->options.rpkState.sending_ServerCertTypes[0] = ctype;
13293
13294
            /* Push new server_certificate_type extension. */
13295
            WOLFSSL_MSG("Adding Server Certificate Type extension");
13296
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
13297
                                                                    ssl->heap);
13298
            if (ret == 0) {
13299
                TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
13300
            }
13301
        }
13302
        else {
13303
            /* no common cert type found */
13304
            WOLFSSL_MSG("No common cert type found in server_certificate_type ext");
13305
            SendAlert(ssl, alert_fatal, unsupported_certificate);
13306
            ret = UNSUPPORTED_CERTIFICATE;
13307
        }
13308
    }
13309
    else {
13310
        /* [in client side] */
13311
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
13312
                            ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
13313
                            ssl->options.rpkConfig.preferred_ServerCertTypes)) {
13314
13315
            ssl->options.rpkState.sending_ServerCertTypeCnt =
13316
                        ssl->options.rpkConfig.preferred_ServerCertTypeCnt;
13317
            XMEMCPY(ssl->options.rpkState.sending_ServerCertTypes,
13318
                    ssl->options.rpkConfig.preferred_ServerCertTypes,
13319
                    ssl->options.rpkConfig.preferred_ServerCertTypeCnt);
13320
13321
            /* Push new server_certificate_type extension. */
13322
            WOLFSSL_MSG("Adding Server Certificate Type extension");
13323
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
13324
                                                                    ssl->heap);
13325
        }
13326
        else {
13327
            WOLFSSL_MSG("No will to accept RPK cert");
13328
        }
13329
    }
13330
13331
    return ret;
13332
}
13333
13334
/* Parse a "server certificate type" extension received from peer.
13335
 * returns 0 on success and other values indicate failure.
13336
 */
13337
static int TLSX_ServerCertificateType_Parse(WOLFSSL* ssl, const byte* input,
13338
                                                word16 length, byte msgType)
13339
{
13340
    byte typeCnt;
13341
    int idx = 0;
13342
    int ret = 0;
13343
    int i;
13344
13345
    if (msgType == client_hello) {
13346
        /* in server side */
13347
13348
        if (length < OPAQUE8_LEN)
13349
            return BUFFER_E;
13350
13351
        typeCnt = input[idx];
13352
13353
        if (typeCnt > MAX_SERVER_CERT_TYPE_CNT)
13354
            return BUFFER_E;
13355
13356
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
13357
            return BUFFER_E;
13358
        }
13359
        ssl->options.rpkState.received_ServerCertTypeCnt = input[idx];
13360
        idx += OPAQUE8_LEN;
13361
13362
        for (i = 0; i < typeCnt; i++) {
13363
            ssl->options.rpkState.received_ServerCertTypes[i] = input[idx];
13364
            idx += OPAQUE8_LEN;
13365
        }
13366
13367
        ret = TLSX_ServerCertificateType_Use(ssl, 1);
13368
        if (ret == 0) {
13369
            TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
13370
        }
13371
    }
13372
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13373
        /* in client side */
13374
        if (length != 1)                     /* length slould be 1 */
13375
            return BUFFER_E;
13376
13377
        ssl->options.rpkState.received_ServerCertTypeCnt  = 1;
13378
        ssl->options.rpkState.received_ServerCertTypes[0] = *input;
13379
    }
13380
13381
    return 0;
13382
}
13383
13384
/* Write out the "server certificate type" extension data into the given buffer.
13385
 * return the size wrote in the buffer on success, negative value on error.
13386
 */
13387
static word16 TLSX_ServerCertificateType_Write(void* data, byte* output,
13388
                                                                byte msgType)
13389
{
13390
    WOLFSSL* ssl = (WOLFSSL*)data;
13391
    word16 idx = 0;
13392
    int cnt = 0;
13393
    int i;
13394
13395
    /* skip to write extension if count is zero */
13396
    cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
13397
13398
    if (cnt == 0)
13399
        return 0;
13400
13401
    if (msgType == client_hello) {
13402
        /* in client side */
13403
13404
        *(output + idx) = cnt;
13405
        idx += OPAQUE8_LEN;
13406
13407
        for (i = 0; i < cnt; i++) {
13408
            *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[i];
13409
            idx += OPAQUE8_LEN;
13410
        }
13411
    }
13412
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13413
        /* in server side */
13414
        /* ensure cnt is one */
13415
        if (cnt != 1)
13416
            return 0;
13417
13418
        *(output + idx) =  ssl->options.rpkState.sending_ServerCertTypes[0];
13419
        idx += OPAQUE8_LEN;
13420
    }
13421
    return idx;
13422
}
13423
13424
/* Calculate then return the size of the "server certificate type" extension
13425
 * data.
13426
 * return the extension data size on success, negative value on error.
13427
*/
13428
static int TLSX_ServerCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
13429
{
13430
    int ret = 0;
13431
    int cnt;
13432
13433
    if (ssl == NULL)
13434
        return BAD_FUNC_ARG;
13435
13436
    if (msgType == client_hello) {
13437
        /* in clent side */
13438
        cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
13439
        if (cnt > 0) {
13440
            ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
13441
        }
13442
    }
13443
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13444
        /* in server side */
13445
        ret = (int)OPAQUE8_LEN;
13446
    }
13447
    else {
13448
        return SANITY_MSG_E;
13449
    }
13450
    return ret;
13451
}
13452
13453
    #define SCT_GET_SIZE  TLSX_ServerCertificateType_GetSize
13454
    #define SCT_WRITE     TLSX_ServerCertificateType_Write
13455
    #define SCT_PARSE     TLSX_ServerCertificateType_Parse
13456
#else
13457
    #define SCT_GET_SIZE(a)  0
13458
    #define SCT_WRITE(a, b)  0
13459
    #define SCT_PARSE(a, b, c, d) 0
13460
#endif /* HAVE_RPK */
13461
13462
/******************************************************************************/
13463
/* TLS Extensions Framework                                                   */
13464
/******************************************************************************/
13465
13466
/** Finds an extension in the provided list. */
13467
TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
13468
450k
{
13469
450k
    TLSX* extension = list;
13470
13471
836k
    while (extension && extension->type != type)
13472
385k
        extension = extension->next;
13473
13474
450k
    return extension;
13475
450k
}
13476
13477
/** Remove an extension. */
13478
void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
13479
6.29k
{
13480
6.29k
    TLSX* extension;
13481
6.29k
    TLSX** next;
13482
13483
6.29k
    if (list == NULL)
13484
0
        return;
13485
13486
6.29k
    extension = *list;
13487
6.29k
    next = list;
13488
13489
48.5k
    while (extension && extension->type != type) {
13490
42.2k
        next = &extension->next;
13491
42.2k
        extension = extension->next;
13492
42.2k
    }
13493
13494
6.29k
    if (extension) {
13495
85
        *next = extension->next;
13496
85
        extension->next = NULL;
13497
85
        TLSX_FreeAll(extension, heap);
13498
85
    }
13499
6.29k
}
13500
13501
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13502
#define GREASE_ECH_SIZE 160
13503
#define TLS_INFO_CONST_STRING "tls ech"
13504
#define TLS_INFO_CONST_STRING_SZ 7
13505
13506
/* return status after setting up ech to write a grease ech */
13507
static int TLSX_GreaseECH_Use(TLSX** extensions, void* heap, WC_RNG* rng)
13508
{
13509
    int ret = 0;
13510
    WOLFSSL_ECH* ech;
13511
13512
    if (extensions == NULL)
13513
        return BAD_FUNC_ARG;
13514
13515
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13516
        DYNAMIC_TYPE_TMP_BUFFER);
13517
13518
    if (ech == NULL)
13519
        return MEMORY_E;
13520
13521
    ForceZero(ech, sizeof(WOLFSSL_ECH));
13522
13523
    ech->state = ECH_WRITE_GREASE;
13524
13525
    /* 0 for outer */
13526
    ech->type = ECH_TYPE_OUTER;
13527
    /* kemId */
13528
    ech->kemId = DHKEM_X25519_HKDF_SHA256;
13529
    /* cipherSuite kdf */
13530
    ech->cipherSuite.kdfId = HKDF_SHA256;
13531
    /* cipherSuite aead */
13532
    ech->cipherSuite.aeadId = HPKE_AES_128_GCM;
13533
13534
    /* random configId */
13535
    ret = wc_RNG_GenerateByte(rng, &(ech->configId));
13536
13537
    /* curve25519 encLen */
13538
    ech->encLen = DHKEM_X25519_ENC_LEN;
13539
13540
    if (ret == 0)
13541
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13542
13543
    if (ret != 0) {
13544
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13545
    }
13546
13547
    return ret;
13548
}
13549
13550
/* return status after setting up ech to write real ech */
13551
static int TLSX_ECH_Use(WOLFSSL_EchConfig* echConfig, TLSX** extensions,
13552
    void* heap, WC_RNG* rng)
13553
{
13554
    int ret = 0;
13555
    int suiteIndex;
13556
    TLSX* echX;
13557
    WOLFSSL_ECH* ech;
13558
    if (extensions == NULL)
13559
        return BAD_FUNC_ARG;
13560
    /* skip if we already have an ech extension, we will for hrr */
13561
    echX = TLSX_Find(*extensions, TLSX_ECH);
13562
    if (echX != NULL)
13563
        return 0;
13564
    /* find a supported cipher suite */
13565
    suiteIndex = EchConfigGetSupportedCipherSuite(echConfig);
13566
    if (suiteIndex < 0)
13567
        return suiteIndex;
13568
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13569
        DYNAMIC_TYPE_TMP_BUFFER);
13570
    if (ech == NULL)
13571
        return MEMORY_E;
13572
    ForceZero(ech, sizeof(WOLFSSL_ECH));
13573
    ech->state = ECH_WRITE_REAL;
13574
    ech->echConfig = echConfig;
13575
    /* 0 for outer */
13576
    ech->type = ECH_TYPE_OUTER;
13577
    /* kemId */
13578
    ech->kemId = echConfig->kemId;
13579
    /* cipherSuite kdf */
13580
    ech->cipherSuite.kdfId = echConfig->cipherSuites[suiteIndex].kdfId;
13581
    /* cipherSuite aead */
13582
    ech->cipherSuite.aeadId = echConfig->cipherSuites[suiteIndex].aeadId;
13583
    /* configId */
13584
    ech->configId = echConfig->configId;
13585
    /* encLen */
13586
    ech->encLen = wc_HpkeKemGetEncLen(echConfig->kemId);
13587
    if (ech->encLen == 0) {
13588
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13589
        return BAD_FUNC_ARG;
13590
    }
13591
    /* setup hpke */
13592
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
13593
    if (ech->hpke == NULL) {
13594
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13595
        return MEMORY_E;
13596
    }
13597
    ret = wc_HpkeInit(ech->hpke, ech->kemId, ech->cipherSuite.kdfId,
13598
        ech->cipherSuite.aeadId, heap);
13599
    /* setup the ephemeralKey */
13600
    if (ret == 0)
13601
        ret = wc_HpkeGenerateKeyPair(ech->hpke, &ech->ephemeralKey, rng);
13602
    if (ret == 0) {
13603
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13604
        if (ret != 0) {
13605
            wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
13606
                ech->hpke->heap);
13607
        }
13608
    }
13609
    if (ret != 0) {
13610
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13611
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13612
    }
13613
    return ret;
13614
}
13615
13616
/* return status after setting up ech to read and decrypt */
13617
static int TLSX_ServerECH_Use(TLSX** extensions, void* heap,
13618
    WOLFSSL_EchConfig* configs)
13619
{
13620
    int ret;
13621
    WOLFSSL_ECH* ech;
13622
    TLSX* echX;
13623
    if (extensions == NULL)
13624
        return BAD_FUNC_ARG;
13625
    /* if we already have ech don't override it */
13626
    echX = TLSX_Find(*extensions, TLSX_ECH);
13627
    if (echX != NULL)
13628
        return 0;
13629
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13630
        DYNAMIC_TYPE_TMP_BUFFER);
13631
    if (ech == NULL)
13632
        return MEMORY_E;
13633
    ForceZero(ech, sizeof(WOLFSSL_ECH));
13634
    ech->state = ECH_WRITE_NONE;
13635
    /* 0 for outer */
13636
    ech->type = ECH_TYPE_OUTER;
13637
    ech->echConfig = configs;
13638
    /* setup the rest of the settings when we receive ech from the client */
13639
    ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13640
    if (ret != 0)
13641
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13642
    return ret;
13643
}
13644
13645
/* return status after writing the ech and updating offset */
13646
static int TLSX_ECH_Write(WOLFSSL_ECH* ech, byte msgType, byte* writeBuf,
13647
    word16* offset)
13648
{
13649
    int ret = 0;
13650
    int rngRet = -1;
13651
    word32 configsLen = 0;
13652
    void* ephemeralKey = NULL;
13653
    byte* writeBuf_p = writeBuf;
13654
    WC_DECLARE_VAR(hpke, Hpke, 1, DYNAMIC_TYPE_TMP_BUFFER);
13655
    WC_DECLARE_VAR(rng, WC_RNG, 1, DYNAMIC_TYPE_RNG);
13656
13657
    WOLFSSL_MSG("TLSX_ECH_Write");
13658
    if (msgType == hello_retry_request) {
13659
        WC_ALLOC_VAR_EX(rng, WC_RNG, 1, NULL, DYNAMIC_TYPE_RNG, ret = MEMORY_E);
13660
        if (ret == 0) {
13661
            ret = wc_InitRng(rng);
13662
        }
13663
        if (ret == 0) {
13664
            /* randomize confirmation in case ech is rejected */
13665
            ret = wc_RNG_GenerateBlock(rng, writeBuf,
13666
                    ECH_ACCEPT_CONFIRMATION_SZ);
13667
            wc_FreeRng(rng);
13668
        }
13669
        if (ret == 0) {
13670
            *offset += ECH_ACCEPT_CONFIRMATION_SZ;
13671
            ech->confBuf = writeBuf;
13672
        }
13673
13674
        WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
13675
        return ret;
13676
    }
13677
    if (ech->state == ECH_WRITE_NONE || ech->state == ECH_PARSED_INTERNAL)
13678
        return 0;
13679
    if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
13680
        /* get size then write */
13681
        ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen);
13682
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13683
            return ret;
13684
        ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen);
13685
        if (ret != WOLFSSL_SUCCESS)
13686
            return ret;
13687
        *offset += configsLen;
13688
        return 0;
13689
    }
13690
    /* type */
13691
    *writeBuf_p = ech->type;
13692
    writeBuf_p += sizeof(ech->type);
13693
    /* outer has body, inner does not */
13694
    if (ech->type == ECH_TYPE_OUTER) {
13695
        /* kdfId */
13696
        c16toa(ech->cipherSuite.kdfId, writeBuf_p);
13697
        writeBuf_p += sizeof(ech->cipherSuite.kdfId);
13698
        /* aeadId */
13699
        c16toa(ech->cipherSuite.aeadId, writeBuf_p);
13700
        writeBuf_p += sizeof(ech->cipherSuite.aeadId);
13701
        /* configId */
13702
        *writeBuf_p = ech->configId;
13703
        writeBuf_p += sizeof(ech->configId);
13704
        /* encLen */
13705
        if (ech->hpkeContext == NULL) {
13706
            c16toa(ech->encLen, writeBuf_p);
13707
        }
13708
        else {
13709
            /* set to 0 if this is clientInner 2 */
13710
            c16toa(0, writeBuf_p);
13711
        }
13712
        writeBuf_p += 2;
13713
        if (ech->state == ECH_WRITE_GREASE) {
13714
            WC_ALLOC_VAR_EX(hpke, Hpke, 1, NULL, DYNAMIC_TYPE_TMP_BUFFER, ret = MEMORY_E);
13715
            WC_ALLOC_VAR_EX(rng, WC_RNG, 1, NULL, DYNAMIC_TYPE_RNG, ret = MEMORY_E);
13716
            /* hpke init */
13717
            if (ret == 0) {
13718
                ret = wc_HpkeInit(hpke, ech->kemId, ech->cipherSuite.kdfId,
13719
                    ech->cipherSuite.aeadId, NULL);
13720
            }
13721
            if (ret == 0)
13722
                rngRet = ret = wc_InitRng(rng);
13723
            /* create the ephemeralKey */
13724
            if (ret == 0)
13725
                ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng);
13726
            /* enc */
13727
            if (ret == 0) {
13728
                ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey, writeBuf_p,
13729
                    &ech->encLen);
13730
                writeBuf_p += ech->encLen;
13731
            }
13732
            if (ret == 0) {
13733
                /* innerClientHelloLen */
13734
                c16toa(GREASE_ECH_SIZE + ((writeBuf_p + 2 - writeBuf) % 32),
13735
                    writeBuf_p);
13736
                writeBuf_p += 2;
13737
13738
                /* innerClientHello */
13739
                ret = wc_RNG_GenerateBlock(rng, writeBuf_p, GREASE_ECH_SIZE +
13740
                    ((writeBuf_p - writeBuf) % 32));
13741
                writeBuf_p += GREASE_ECH_SIZE + ((writeBuf_p - writeBuf) % 32);
13742
            }
13743
            if (rngRet == 0)
13744
                wc_FreeRng(rng);
13745
            if (ephemeralKey != NULL)
13746
                wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap);
13747
            WC_FREE_VAR_EX(hpke, NULL, DYNAMIC_TYPE_TMP_BUFFER);
13748
            WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
13749
        }
13750
        else {
13751
            /* only write enc if this is our first ech, no hpke context */
13752
            if (ech->hpkeContext == NULL) {
13753
                /* write enc to writeBuf_p */
13754
                ret = wc_HpkeSerializePublicKey(ech->hpke, ech->ephemeralKey,
13755
                    writeBuf_p, &ech->encLen);
13756
                writeBuf_p += ech->encLen;
13757
            }
13758
            /* innerClientHelloLen */
13759
            c16toa((word16)ech->innerClientHelloLen, writeBuf_p);
13760
            writeBuf_p += 2;
13761
            /* set payload offset for when we finalize */
13762
            ech->outerClientPayload = writeBuf_p;
13763
            /* write zeros for payload */
13764
            XMEMSET(writeBuf_p, 0, ech->innerClientHelloLen);
13765
            writeBuf_p += ech->innerClientHelloLen;
13766
        }
13767
    }
13768
    if (ret == 0)
13769
        *offset += (writeBuf_p - writeBuf);
13770
    return ret;
13771
}
13772
13773
/* return the size needed for the ech extension */
13774
static int TLSX_ECH_GetSize(WOLFSSL_ECH* ech, byte msgType)
13775
{
13776
    int ret;
13777
    word32 size = 0;
13778
13779
    if (ech->state == ECH_WRITE_GREASE) {
13780
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
13781
            sizeof(ech->configId) + sizeof(word16) + ech->encLen +
13782
            sizeof(word16);
13783
13784
        size += GREASE_ECH_SIZE + (size % 32);
13785
    }
13786
    else if (msgType == hello_retry_request) {
13787
        size = ECH_ACCEPT_CONFIRMATION_SZ;
13788
    }
13789
    else if (ech->state == ECH_WRITE_NONE ||
13790
        ech->state == ECH_PARSED_INTERNAL) {
13791
        size = 0;
13792
    }
13793
    else if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
13794
        /* get the size of the raw configs */
13795
        ret = GetEchConfigsEx(ech->echConfig, NULL, &size);
13796
13797
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13798
            return ret;
13799
    }
13800
    else if (ech->type == ECH_TYPE_INNER)
13801
    {
13802
        size = sizeof(ech->type);
13803
    }
13804
    else
13805
    {
13806
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
13807
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16) +
13808
            ech->innerClientHelloLen;
13809
        /* only set encLen if this is inner hello 1 */
13810
        if (ech->hpkeContext == NULL)
13811
            size += ech->encLen;
13812
    }
13813
13814
    return (int)size;
13815
}
13816
13817
/* rough check that inner hello fields do not exceed length of decrypted
13818
 * information. Additionally, this function will check that all padding bytes
13819
 * are zero and decrease the innerHelloLen accordingly if so.
13820
 * returns 0 on success and otherwise failure */
13821
static int TLSX_ECH_CheckInnerPadding(WOLFSSL* ssl, WOLFSSL_ECH* ech)
13822
{
13823
    int headerSz;
13824
    const byte* innerCh;
13825
    word32 innerChLen;
13826
    word32 idx;
13827
    byte sessionIdLen;
13828
    word16 cipherSuitesLen;
13829
    byte compressionLen;
13830
    word16 extLen;
13831
    byte acc = 0;
13832
    word32 i;
13833
13834
#ifdef WOLFSSL_DTLS13
13835
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
13836
                                   HANDSHAKE_HEADER_SZ;
13837
#else
13838
    (void)ssl;
13839
13840
    headerSz = HANDSHAKE_HEADER_SZ;
13841
#endif
13842
13843
    innerCh = ech->innerClientHello + headerSz;
13844
    innerChLen = ech->innerClientHelloLen;
13845
13846
    idx = OPAQUE16_LEN + RAN_LEN;
13847
    if (idx >= innerChLen)
13848
        return BUFFER_ERROR;
13849
13850
    sessionIdLen = innerCh[idx++];
13851
    /* innerHello sessionID must initially be empty */
13852
    if (sessionIdLen != 0)
13853
        return INVALID_PARAMETER;
13854
    idx += sessionIdLen;
13855
    if (idx + OPAQUE16_LEN > innerChLen)
13856
        return BUFFER_ERROR;
13857
13858
    ato16(innerCh + idx, &cipherSuitesLen);
13859
    idx += OPAQUE16_LEN + cipherSuitesLen;
13860
    if (idx >= innerChLen)
13861
        return BUFFER_ERROR;
13862
13863
    compressionLen = innerCh[idx++];
13864
    idx += compressionLen;
13865
    if (idx + OPAQUE16_LEN > innerChLen)
13866
        return BUFFER_ERROR;
13867
13868
    ato16(innerCh + idx, &extLen);
13869
    idx += OPAQUE16_LEN + extLen;
13870
    if (idx > innerChLen)
13871
        return BUFFER_ERROR;
13872
13873
    /* should now be at the end of the innerHello
13874
     * Per ECH spec all padding bytes MUST be 0 */
13875
    for (i = idx; i < innerChLen; i++) {
13876
        acc |= innerCh[i];
13877
    }
13878
    if (acc != 0) {
13879
        return INVALID_PARAMETER;
13880
    }
13881
13882
    ech->innerClientHelloLen -= i - idx;
13883
    return 0;
13884
}
13885
13886
/* Locate the given extension type, use the extOffset to start off after where a
13887
 * previous call to this function ended
13888
 *
13889
 * outerCh          The outer ClientHello buffer.
13890
 * chLen            Outer ClientHello length.
13891
 * extType          Extension type to look for.
13892
 * extLen           Out parameter, length of found extension.
13893
 * extOffset        Offset into outer ClientHello to look for extension from.
13894
 * extensionsStart  Start of outer ClientHello extensions.
13895
 * extensionsLen    Length of outer ClientHello extensions.
13896
 * returns 0 on success and otherwise failure.
13897
 */
13898
static const byte* TLSX_ECH_FindOuterExtension(const byte* outerCh,
13899
    word32 chLen, word16 extType, word32* extLen, word32* extOffset,
13900
    word16* extensionsStart, word16* extensionsLen)
13901
{
13902
    word32 idx = *extOffset;
13903
    byte sessionIdLen;
13904
    word16 cipherSuitesLen;
13905
    byte compressionLen;
13906
    word16 type;
13907
    word16 len;
13908
13909
    if (idx == 0) {
13910
        idx = OPAQUE16_LEN + RAN_LEN;
13911
        if (idx >= chLen)
13912
            return NULL;
13913
13914
        sessionIdLen = outerCh[idx++];
13915
        idx += sessionIdLen;
13916
        if (idx + OPAQUE16_LEN > chLen)
13917
            return NULL;
13918
13919
        ato16(outerCh + idx, &cipherSuitesLen);
13920
        idx += OPAQUE16_LEN + cipherSuitesLen;
13921
        if (idx >= chLen)
13922
            return NULL;
13923
13924
        compressionLen = outerCh[idx++];
13925
        idx += compressionLen;
13926
        if (idx + OPAQUE16_LEN > chLen)
13927
            return NULL;
13928
13929
        ato16(outerCh + idx, extensionsLen);
13930
        idx += OPAQUE16_LEN;
13931
        *extensionsStart = (word16)idx;
13932
13933
        if (idx + *extensionsLen > chLen)
13934
            return NULL;
13935
    }
13936
13937
    while (idx - *extensionsStart < *extensionsLen) {
13938
        if (idx + OPAQUE16_LEN + OPAQUE16_LEN > chLen)
13939
            return NULL;
13940
13941
        ato16(outerCh + idx, &type);
13942
        idx += OPAQUE16_LEN;
13943
        ato16(outerCh + idx, &len);
13944
        idx += OPAQUE16_LEN;
13945
13946
        if (idx + len - *extensionsStart > *extensionsLen)
13947
            return NULL;
13948
13949
        if (type == extType) {
13950
            *extLen = len + OPAQUE16_LEN + OPAQUE16_LEN;
13951
            *extOffset = idx + len;
13952
            return outerCh + idx - OPAQUE16_LEN - OPAQUE16_LEN;
13953
        }
13954
13955
        idx += len;
13956
    }
13957
13958
    return NULL;
13959
}
13960
13961
/* If newinnerCh is NULL, validate ordering and existence of references
13962
 *   - updates newInnerChLen with total length of selected extensions
13963
 * If newinnerCh is not NULL, copy extensions into newInnerCh
13964
 *
13965
 * outerCh          The outer ClientHello buffer.
13966
 * outerChLen       Outer ClientHello length.
13967
 * newInnerCh       The inner ClientHello buffer.
13968
 * newInnerChLen    Inner ClientHello length.
13969
 * numOuterRefs     Number of references described by OuterExtensions extension.
13970
 * OuterRefTypes    References described by OuterExtensions extension.
13971
 * returns 0 on success and otherwise failure.
13972
 */
13973
static int TLSX_ECH_CopyOuterExtensions(const byte* outerCh, word32 outerChLen,
13974
    byte** newInnerCh, word32* newInnerChLen,
13975
    word16 numOuterRefs, const byte* outerRefTypes)
13976
{
13977
    int ret = 0;
13978
    word16 refType;
13979
    word32 outerExtLen;
13980
    word32 outerExtOffset = 0;
13981
    word16 extsStart = 0;
13982
    word16 extsLen = 0;
13983
    const byte* outerExtData;
13984
13985
    if (newInnerCh == NULL) {
13986
        *newInnerChLen = 0;
13987
    }
13988
13989
    while (numOuterRefs-- > 0) {
13990
        ato16(outerRefTypes, &refType);
13991
13992
        if (refType == TLSXT_ECH) {
13993
            WOLFSSL_MSG("ECH: ech_outer_extensions references ECH");
13994
            ret = INVALID_PARAMETER;
13995
            break;
13996
        }
13997
13998
        outerExtData = TLSX_ECH_FindOuterExtension(outerCh, outerChLen,
13999
                            refType, &outerExtLen, &outerExtOffset,
14000
                            &extsStart, &extsLen);
14001
14002
        if (outerExtData == NULL) {
14003
            WOLFSSL_MSG("ECH: referenced extension not in outer CH or out "
14004
                        "of order");
14005
            ret = INVALID_PARAMETER;
14006
            break;
14007
        }
14008
14009
        if (newInnerCh == NULL) {
14010
            *newInnerChLen += outerExtLen;
14011
        }
14012
        else {
14013
            XMEMCPY(*newInnerCh, outerExtData, outerExtLen);
14014
            *newInnerCh += outerExtLen;
14015
        }
14016
14017
        outerRefTypes += OPAQUE16_LEN;
14018
    }
14019
14020
    return ret;
14021
}
14022
14023
/* Expand ech_outer_extensions in the inner ClientHello by copying referenced
14024
 * extensions from the outer ClientHello.
14025
 * If the sessionID exists in the outer ClientHello then also copy that into the
14026
 * expanded inner ClientHello.
14027
 *
14028
 * ssl      SSL/TLS object.
14029
 * ech      ECH object.
14030
 * heap     Heap hint.
14031
 * returns 0 on success and otherwise failure.
14032
 */
14033
static int TLSX_ECH_ExpandOuterExtensions(WOLFSSL* ssl, WOLFSSL_ECH* ech,
14034
    void* heap)
14035
{
14036
    int ret = 0;
14037
    int headerSz;
14038
    const byte* innerCh;
14039
    word32 innerChLen;
14040
    const byte* outerCh;
14041
    word32 outerChLen;
14042
    word32 idx;
14043
    byte sessionIdLen;
14044
    word16 cipherSuitesLen;
14045
    byte compressionLen;
14046
14047
    word32 innerExtIdx;
14048
    word16 innerExtLen;
14049
    word32 echOuterExtIdx = 0;
14050
    word16 echOuterExtLen = 0;
14051
    int foundEchOuter = 0;
14052
    word16 numOuterRefs = 0;
14053
    const byte* outerRefTypes = NULL;
14054
    word32 extraSize = 0;
14055
    byte* newInnerCh = NULL;
14056
    byte* newInnerChRef;
14057
    word32 newInnerChLen;
14058
    word32 copyLen;
14059
14060
    WOLFSSL_ENTER("TLSX_ExpandEchOuterExtensions");
14061
14062
    if (ech == NULL || ech->innerClientHello == NULL || ech->aad == NULL)
14063
        return BAD_FUNC_ARG;
14064
14065
#ifdef WOLFSSL_DTLS13
14066
    headerSz = ssl->options.dtls ? DTLS13_HANDSHAKE_HEADER_SZ :
14067
                                   HANDSHAKE_HEADER_SZ;
14068
#else
14069
    headerSz = HANDSHAKE_HEADER_SZ;
14070
#endif
14071
14072
    innerCh = ech->innerClientHello + headerSz;
14073
    innerChLen = ech->innerClientHelloLen;
14074
    outerCh = ech->aad;
14075
    outerChLen = ech->aadLen;
14076
14077
    /* don't need to check for buffer overflows here since they are caught by
14078
     * TLSX_ECH_CheckInnerPadding */
14079
    idx = OPAQUE16_LEN + RAN_LEN;
14080
14081
    sessionIdLen = innerCh[idx++];
14082
    idx += sessionIdLen;
14083
14084
    ato16(innerCh + idx, &cipherSuitesLen);
14085
    idx += OPAQUE16_LEN + cipherSuitesLen;
14086
14087
    compressionLen = innerCh[idx++];
14088
    idx += compressionLen;
14089
14090
    ato16(innerCh + idx, &innerExtLen);
14091
    idx += OPAQUE16_LEN;
14092
    innerExtIdx = idx;
14093
14094
    /* validate ech_outer_extensions and calculate extra size */
14095
    while (idx < innerChLen && (idx - innerExtIdx) < innerExtLen) {
14096
        word16 type;
14097
        word16 len;
14098
        byte outerExtListLen;
14099
14100
        if (idx + OPAQUE16_LEN + OPAQUE16_LEN > innerChLen)
14101
            return BUFFER_ERROR;
14102
14103
        ato16(innerCh + idx, &type);
14104
        idx += OPAQUE16_LEN;
14105
        ato16(innerCh + idx, &len);
14106
        idx += OPAQUE16_LEN;
14107
14108
        if (idx + len > innerChLen)
14109
            return BUFFER_ERROR;
14110
14111
        if (type == TLSXT_ECH_OUTER_EXTENSIONS) {
14112
            if (foundEchOuter) {
14113
                WOLFSSL_MSG("ECH: duplicate ech_outer_extensions");
14114
                return INVALID_PARAMETER;
14115
            }
14116
            foundEchOuter = 1;
14117
            echOuterExtIdx = idx - OPAQUE16_LEN - OPAQUE16_LEN;
14118
            echOuterExtLen = len + OPAQUE16_LEN + OPAQUE16_LEN;
14119
14120
            /* ech_outer_extensions data format: 1-byte length + extension types
14121
             * ExtensionType OuterExtensions<2..254>; */
14122
            if (len < 1)
14123
                return BUFFER_ERROR;
14124
            outerExtListLen = innerCh[idx];
14125
            if (outerExtListLen + 1 != len || outerExtListLen < 2 ||
14126
                    outerExtListLen == 255)
14127
                return BUFFER_ERROR;
14128
14129
            outerRefTypes = innerCh + idx + 1;
14130
            numOuterRefs = outerExtListLen / OPAQUE16_LEN;
14131
14132
            ret = TLSX_ECH_CopyOuterExtensions(outerCh, outerChLen, NULL,
14133
                    &extraSize, numOuterRefs, outerRefTypes);
14134
            if (ret != 0)
14135
                return ret;
14136
        }
14137
14138
        idx += len;
14139
    }
14140
14141
    newInnerChLen = innerChLen - echOuterExtLen + extraSize - sessionIdLen +
14142
                        ssl->session->sessionIDSz;
14143
    if (newInnerChLen > 0xFFFF) {
14144
        return BUFFER_E;
14145
    }
14146
14147
    if (!foundEchOuter && sessionIdLen == ssl->session->sessionIDSz) {
14148
        /* no extensions + no sessionID to copy */
14149
        WOLFSSL_MSG("ECH: no EchOuterExtensions extension found");
14150
        return ret;
14151
    }
14152
    else {
14153
        newInnerCh = (byte*)XMALLOC(newInnerChLen + headerSz, heap,
14154
                                    DYNAMIC_TYPE_TMP_BUFFER);
14155
        if (newInnerCh == NULL)
14156
            return MEMORY_E;
14157
    }
14158
14159
    /* note: The first HANDSHAKE_HEADER_SZ bytes are reserved for the header
14160
     * but not initialized here. The header will be properly set later by
14161
     * AddTls13HandShakeHeader() in DoTls13ClientHello(). */
14162
14163
    /* copy everything up to EchOuterExtensions */
14164
    newInnerChRef = newInnerCh + headerSz;
14165
    copyLen = OPAQUE16_LEN + RAN_LEN;
14166
    XMEMCPY(newInnerChRef, innerCh, copyLen);
14167
    newInnerChRef += copyLen;
14168
14169
    *newInnerChRef = ssl->session->sessionIDSz;
14170
    newInnerChRef += OPAQUE8_LEN;
14171
14172
    copyLen = ssl->session->sessionIDSz;
14173
    XMEMCPY(newInnerChRef, ssl->session->sessionID, copyLen);
14174
    newInnerChRef += copyLen;
14175
14176
    if (!foundEchOuter) {
14177
        WOLFSSL_MSG("ECH: no EchOuterExtensions extension found");
14178
14179
        copyLen = innerChLen - OPAQUE16_LEN - RAN_LEN - OPAQUE8_LEN -
14180
                sessionIdLen;
14181
        XMEMCPY(newInnerChRef, innerCh + OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN +
14182
                sessionIdLen, copyLen);
14183
    }
14184
    else {
14185
        innerExtIdx = headerSz + innerExtIdx - OPAQUE16_LEN -
14186
            sessionIdLen + ssl->session->sessionIDSz;
14187
14188
        copyLen = echOuterExtIdx - OPAQUE16_LEN - RAN_LEN - OPAQUE8_LEN -
14189
                sessionIdLen;
14190
        XMEMCPY(newInnerChRef, innerCh + OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN +
14191
                sessionIdLen, copyLen);
14192
        newInnerChRef += copyLen;
14193
14194
        /* update extensions length in the new ClientHello */
14195
        c16toa(innerExtLen - echOuterExtLen + (word16)extraSize,
14196
                newInnerCh + innerExtIdx);
14197
14198
        ret = TLSX_ECH_CopyOuterExtensions(outerCh, outerChLen, &newInnerChRef,
14199
                &newInnerChLen, numOuterRefs, outerRefTypes);
14200
        if (ret == 0) {
14201
            /* copy remaining extensions after ech_outer_extensions */
14202
            copyLen = innerChLen - (echOuterExtIdx + echOuterExtLen);
14203
            XMEMCPY(newInnerChRef, innerCh + echOuterExtIdx + echOuterExtLen,
14204
                    copyLen);
14205
14206
            WOLFSSL_MSG("ECH: expanded ech_outer_extensions successfully");
14207
        }
14208
    }
14209
14210
    if (ret == 0) {
14211
        XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
14212
        ech->innerClientHello = newInnerCh;
14213
        ech->innerClientHelloLen = newInnerChLen;
14214
        newInnerCh = NULL;
14215
    }
14216
14217
    if (newInnerCh != NULL)
14218
        XFREE(newInnerCh, heap, DYNAMIC_TYPE_TMP_BUFFER);
14219
14220
    return ret;
14221
}
14222
14223
/* return status after attempting to open the hpke encrypted ech extension, if
14224
 * successful the inner client hello will be stored in
14225
 * ech->innerClientHelloLen */
14226
static int TLSX_ExtractEch(WOLFSSL_ECH* ech, WOLFSSL_EchConfig* echConfig,
14227
    byte* aad, word32 aadLen, void* heap)
14228
{
14229
    int ret = 0;
14230
    int i;
14231
    int allocatedHpke = 0;
14232
    word32 rawConfigLen = 0;
14233
    byte* info = NULL;
14234
    word32 infoLen = 0;
14235
    if (ech == NULL || echConfig == NULL || aad == NULL)
14236
        return BAD_FUNC_ARG;
14237
    /* verify the kem and key len */
14238
    if (wc_HpkeKemGetEncLen(echConfig->kemId) != ech->encLen)
14239
        return BAD_FUNC_ARG;
14240
    /* verify the cipher suite */
14241
    for (i = 0; i < echConfig->numCipherSuites; i++) {
14242
        if (echConfig->cipherSuites[i].kdfId == ech->cipherSuite.kdfId &&
14243
            echConfig->cipherSuites[i].aeadId == ech->cipherSuite.aeadId) {
14244
            break;
14245
        }
14246
    }
14247
    if (i >= echConfig->numCipherSuites) {
14248
        return BAD_FUNC_ARG;
14249
    }
14250
    /* check if hpke already exists, may if HelloRetryRequest */
14251
    if (ech->hpke == NULL) {
14252
        allocatedHpke = 1;
14253
        ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
14254
        if (ech->hpke == NULL)
14255
            ret = MEMORY_E;
14256
        /* init the hpke struct */
14257
        if (ret == 0) {
14258
            ret = wc_HpkeInit(ech->hpke, echConfig->kemId,
14259
                ech->cipherSuite.kdfId, ech->cipherSuite.aeadId, heap);
14260
        }
14261
        if (ret == 0) {
14262
            /* allocate hpkeContext */
14263
            ech->hpkeContext =
14264
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
14265
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
14266
            if (ech->hpkeContext == NULL)
14267
                ret = MEMORY_E;
14268
        }
14269
        /* get the rawConfigLen */
14270
        if (ret == 0)
14271
            ret = GetEchConfig(echConfig, NULL, &rawConfigLen);
14272
        if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
14273
            ret = 0;
14274
        /* create info */
14275
        if (ret == 0) {
14276
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + rawConfigLen;
14277
            info = (byte*)XMALLOC(infoLen, heap, DYNAMIC_TYPE_TMP_BUFFER);
14278
14279
            if (info == NULL)
14280
                ret = MEMORY_E;
14281
            else {
14282
                XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
14283
                    TLS_INFO_CONST_STRING_SZ + 1);
14284
                ret = GetEchConfig(echConfig, info +
14285
                    TLS_INFO_CONST_STRING_SZ + 1, &rawConfigLen);
14286
            }
14287
        }
14288
        /* init the context for opening */
14289
        if (ret == 0) {
14290
            ret = wc_HpkeInitOpenContext(ech->hpke, ech->hpkeContext,
14291
                echConfig->receiverPrivkey, ech->enc, ech->encLen, info,
14292
                infoLen);
14293
        }
14294
    }
14295
    /* decrypt the ech payload */
14296
    if (ret == 0) {
14297
        ret = wc_HpkeContextOpenBase(ech->hpke, ech->hpkeContext, aad, aadLen,
14298
            ech->outerClientPayload, ech->innerClientHelloLen,
14299
            ech->innerClientHello + HANDSHAKE_HEADER_SZ);
14300
    }
14301
    /* only free hpke/hpkeContext if allocated in this call; otherwise preserve
14302
     * them for clientHello2 */
14303
    if (ret != 0 && allocatedHpke) {
14304
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
14305
        ech->hpke = NULL;
14306
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
14307
        ech->hpkeContext = NULL;
14308
    }
14309
14310
    if (info != NULL)
14311
        XFREE(info, heap, DYNAMIC_TYPE_TMP_BUFFER);
14312
14313
    return ret;
14314
}
14315
14316
/* parse the ech extension, if internal update ech->state and return, if
14317
 * external attempt to extract the inner client_hello, return the status */
14318
static int TLSX_ECH_Parse(WOLFSSL* ssl, const byte* readBuf, word16 size,
14319
    byte msgType)
14320
{
14321
    int ret = 0;
14322
    TLSX* echX;
14323
    WOLFSSL_ECH* ech;
14324
    WOLFSSL_EchConfig* echConfig;
14325
    byte* aadCopy;
14326
    byte* readBuf_p = (byte*)readBuf;
14327
    word32 offset = 0;
14328
    word16 len;
14329
    word16 tmpVal16;
14330
    word16 lenCh;
14331
14332
    WOLFSSL_MSG("TLSX_ECH_Parse");
14333
    if (ssl->options.disableECH) {
14334
        WOLFSSL_MSG("TLSX_ECH_Parse: ECH disabled. Ignoring.");
14335
        return 0;
14336
    }
14337
    if (size == 0)
14338
        return BAD_FUNC_ARG;
14339
14340
    /* retry configs */
14341
    if (msgType == encrypted_extensions) {
14342
        /* configs must only be sent on ECH rejection (RFC9849, Section 5) */
14343
        if (ssl->options.echAccepted) {
14344
            SendAlert(ssl, alert_fatal, unsupported_extension);
14345
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
14346
            return UNSUPPORTED_EXTENSION;
14347
        }
14348
14349
        ret = SetRetryConfigs(ssl, readBuf, (word32)size);
14350
        if (ret == WC_NO_ERR_TRACE(UNSUPPORTED_SUITE) ||
14351
                ret == WC_NO_ERR_TRACE(UNSUPPORTED_PROTO_VERSION)) {
14352
            WOLFSSL_MSG("ECH retry configs had 'bad version' or 'bad suite'");
14353
            ret = 0;
14354
        }
14355
14356
        if (ssl->echConfigs == NULL) {
14357
            /* on GREASE connection configs must be checked syntactically and
14358
             * must not be saved (RFC 9849, Section 6.2.1) */
14359
            FreeEchConfigs(ssl->echRetryConfigs, ssl->heap);
14360
            ssl->echRetryConfigs = NULL;
14361
        }
14362
14363
        /* retry configs may only be accepted at the point when ECH_REQUIRED is
14364
         * sent */
14365
        ssl->options.echRetryConfigsAccepted = 0;
14366
    }
14367
    /* HRR with special confirmation */
14368
    else if (msgType == hello_retry_request && ssl->echConfigs != NULL) {
14369
        /* length must be 8 */
14370
        if (size != ECH_ACCEPT_CONFIRMATION_SZ)
14371
            return BUFFER_ERROR;
14372
14373
        /* get extension */
14374
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
14375
        if (echX == NULL)
14376
            return BAD_FUNC_ARG;
14377
        ech = (WOLFSSL_ECH*)echX->data;
14378
14379
        ech->confBuf = (byte*)readBuf;
14380
    }
14381
    else if (msgType == client_hello && ssl->ctx->echConfigs != NULL) {
14382
        /* get extension */
14383
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
14384
        if (echX == NULL)
14385
            return BAD_FUNC_ARG;
14386
        ech = (WOLFSSL_ECH*)echX->data;
14387
14388
        /* if the first ECH was rejected or CH1 did not have ECH then there is
14389
         * no need to decrypt this one */
14390
        if (!ssl->options.echAccepted && ssl->options.serverState ==
14391
                SERVER_HELLO_RETRY_REQUEST_COMPLETE) {
14392
            ech->state = ECH_WRITE_RETRY_CONFIGS;
14393
            return 0;
14394
        }
14395
14396
        /* read the ech parameters before the payload */
14397
        ech->type = *readBuf_p;
14398
        readBuf_p++;
14399
        offset += 1;
14400
        if (ssl->options.echProcessingInner && ech->type == ECH_TYPE_INNER) {
14401
            ech->state = ECH_PARSED_INTERNAL;
14402
            return 0;
14403
        }
14404
        else if ((!ssl->options.echProcessingInner &&
14405
                  ech->type != ECH_TYPE_OUTER) ||
14406
                 (ssl->options.echProcessingInner &&
14407
                  ech->type != ECH_TYPE_INNER)) {
14408
            /* MUST process INNER in inner hello and OUTER in outer hello */
14409
            return INVALID_PARAMETER;
14410
        }
14411
        /* Must have kdfId, aeadId, configId, enc len and payload len. */
14412
        if (size < offset + 2 + 2 + 1 + 2 + 2) {
14413
            return BUFFER_ERROR;
14414
        }
14415
        /* only get enc if we don't already have the hpke context */
14416
        if (ech->hpkeContext == NULL) {
14417
            /* kdfId */
14418
            ato16(readBuf_p, &ech->cipherSuite.kdfId);
14419
            readBuf_p += 2;
14420
            offset += 2;
14421
            /* aeadId */
14422
            ato16(readBuf_p, &ech->cipherSuite.aeadId);
14423
            readBuf_p += 2;
14424
            offset += 2;
14425
            /* configId */
14426
            ech->configId = *readBuf_p;
14427
            readBuf_p++;
14428
            offset++;
14429
            /* encLen */
14430
            ato16(readBuf_p, &len);
14431
            readBuf_p += 2;
14432
            offset += 2;
14433
            /* Check encLen isn't more than remaining bytes minus
14434
             * payload length. */
14435
            if (len > size - offset - 2) {
14436
                return BUFFER_ERROR;
14437
            }
14438
            if (len > HPKE_Npk_MAX) {
14439
                return BUFFER_ERROR;
14440
            }
14441
            /* read enc */
14442
            XMEMCPY(ech->enc, readBuf_p, len);
14443
            ech->encLen = len;
14444
        }
14445
        else {
14446
            /* kdfId, aeadId, and configId must be the same as last time */
14447
            /* kdfId */
14448
            ato16(readBuf_p, &tmpVal16);
14449
            if (tmpVal16 != ech->cipherSuite.kdfId) {
14450
                return INVALID_PARAMETER;
14451
            }
14452
            readBuf_p += 2;
14453
            offset += 2;
14454
            /* aeadId */
14455
            ato16(readBuf_p, &tmpVal16);
14456
            if (tmpVal16 != ech->cipherSuite.aeadId) {
14457
                return INVALID_PARAMETER;
14458
            }
14459
            readBuf_p += 2;
14460
            offset += 2;
14461
            /* configId */
14462
            if (*readBuf_p != ech->configId) {
14463
                return INVALID_PARAMETER;
14464
            }
14465
            readBuf_p++;
14466
            offset++;
14467
            /* on an HRR the enc value MUST be empty */
14468
            ato16(readBuf_p, &len);
14469
            if (len != 0) {
14470
                return INVALID_PARAMETER;
14471
            }
14472
            readBuf_p += 2;
14473
            offset += 2;
14474
        }
14475
        readBuf_p += len;
14476
        offset += len;
14477
        /* read payload (encrypted CH) len */
14478
        ato16(readBuf_p, &lenCh);
14479
        ech->innerClientHelloLen = lenCh;
14480
        readBuf_p += 2;
14481
        offset += 2;
14482
        /* Check payload is no bigger than remaining bytes. */
14483
        if (ech->innerClientHelloLen > size - offset) {
14484
            return BUFFER_ERROR;
14485
        }
14486
        if (ech->innerClientHelloLen < WC_AES_BLOCK_SIZE) {
14487
            return BUFFER_ERROR;
14488
        }
14489
        ech->innerClientHelloLen -= WC_AES_BLOCK_SIZE;
14490
        ech->outerClientPayload = readBuf_p;
14491
        /* make a copy of the aad */
14492
        aadCopy = (byte*)XMALLOC(ech->aadLen, ssl->heap,
14493
            DYNAMIC_TYPE_TMP_BUFFER);
14494
        if (aadCopy == NULL)
14495
            return MEMORY_E;
14496
        XMEMCPY(aadCopy, ech->aad, ech->aadLen);
14497
        /* set the ech payload of the copy to zeros */
14498
        XMEMSET(aadCopy + (readBuf_p - ech->aad), 0,
14499
            ech->innerClientHelloLen + WC_AES_BLOCK_SIZE);
14500
        /* free the old ech when this is the second client hello */
14501
        if (ech->innerClientHello != NULL)
14502
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14503
        /* allocate the inner payload buffer */
14504
        ech->innerClientHello =
14505
            (byte*)XMALLOC(ech->innerClientHelloLen + HANDSHAKE_HEADER_SZ,
14506
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14507
        if (ech->innerClientHello == NULL) {
14508
            XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14509
            return MEMORY_E;
14510
        }
14511
        /* try to decrypt with matching configId */
14512
        echConfig = ssl->ctx->echConfigs;
14513
        while (echConfig != NULL) {
14514
            if (echConfig->configId == ech->configId) {
14515
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
14516
                    ssl->heap);
14517
                break;
14518
            }
14519
            echConfig = echConfig->next;
14520
        }
14521
        /* otherwise, try to decrypt with all configs */
14522
        if (echConfig == NULL || ret != 0) {
14523
            echConfig = ssl->ctx->echConfigs;
14524
            while (echConfig != NULL) {
14525
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
14526
                    ssl->heap);
14527
                if (ret == 0)
14528
                    break;
14529
                echConfig = echConfig->next;
14530
            }
14531
        }
14532
        /* if we failed to extract/expand */
14533
        if (ret != 0) {
14534
            WOLFSSL_MSG("ECH rejected");
14535
14536
            if (ssl->options.echAccepted == 1) {
14537
                /* on SH2 this is fatal */
14538
                SendAlert(ssl, alert_fatal, decrypt_error);
14539
                WOLFSSL_ERROR_VERBOSE(DECRYPT_ERROR);
14540
                ret = DECRYPT_ERROR;
14541
            }
14542
            else {
14543
                /* on SH1 prepare to write retry configs */
14544
                XFREE(ech->innerClientHello, ssl->heap,
14545
                    DYNAMIC_TYPE_TMP_BUFFER);
14546
                ech->innerClientHello = NULL;
14547
                ech->state = ECH_WRITE_RETRY_CONFIGS;
14548
                ret = 0;
14549
            }
14550
        }
14551
        else {
14552
            ret = TLSX_ECH_CheckInnerPadding(ssl, ech);
14553
            if (ret == 0) {
14554
                /* expand EchOuterExtensions if present.
14555
                 * Also, if it exists, copy sessionID from outer hello */
14556
                ret = TLSX_ECH_ExpandOuterExtensions(ssl, ech, ssl->heap);
14557
            }
14558
14559
            if (ret == 0){
14560
                WOLFSSL_MSG("ECH accepted");
14561
                ssl->options.echAccepted = 1;
14562
            }
14563
            else {
14564
                WOLFSSL_MSG("ECH rejected");
14565
            }
14566
        }
14567
        if (ret != 0) {
14568
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14569
            ech->innerClientHello = NULL;
14570
        }
14571
14572
        XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
14573
    }
14574
14575
    return ret;
14576
}
14577
14578
/* free the ech struct and the dynamic buffer it uses */
14579
static void TLSX_ECH_Free(WOLFSSL_ECH* ech, void* heap)
14580
{
14581
    XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
14582
    if (ech->hpke != NULL) {
14583
        if (ech->ephemeralKey != NULL)
14584
            wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
14585
                ech->hpke->heap);
14586
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
14587
    }
14588
    if (ech->hpkeContext != NULL)
14589
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
14590
    if (ech->privateName != NULL)
14591
        XFREE((char*)ech->privateName, heap, DYNAMIC_TYPE_TMP_BUFFER);
14592
14593
    XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
14594
    (void)heap;
14595
}
14596
14597
/* encrypt the client hello and store it in ech->outerClientPayload, return
14598
 * status */
14599
int TLSX_FinalizeEch(WOLFSSL_ECH* ech, byte* aad, word32 aadLen)
14600
{
14601
    int ret = 0;
14602
    void* receiverPubkey = NULL;
14603
    byte* info = NULL;
14604
    int infoLen = 0;
14605
    byte* aadCopy = NULL;
14606
    /* setup hpke context to seal, should be done at most once per connection */
14607
    if (ech->hpkeContext == NULL) {
14608
        /* import the server public key */
14609
        ret = wc_HpkeDeserializePublicKey(ech->hpke, &receiverPubkey,
14610
            ech->echConfig->receiverPubkey, ech->encLen);
14611
        if (ret == 0) {
14612
            /* allocate hpke context */
14613
            ech->hpkeContext =
14614
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
14615
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
14616
            if (ech->hpkeContext == NULL)
14617
                ret = MEMORY_E;
14618
        }
14619
        if (ret == 0) {
14620
            /* create info */
14621
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + ech->echConfig->rawLen;
14622
            info = (byte*)XMALLOC(infoLen, ech->hpke->heap,
14623
                DYNAMIC_TYPE_TMP_BUFFER);
14624
            if (info == NULL)
14625
                ret = MEMORY_E;
14626
        }
14627
        if (ret == 0) {
14628
            /* puts the null byte in for me */
14629
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
14630
                TLS_INFO_CONST_STRING_SZ + 1);
14631
            XMEMCPY(info + TLS_INFO_CONST_STRING_SZ + 1,
14632
                ech->echConfig->raw, ech->echConfig->rawLen);
14633
            /* init the context for seal with info and keys */
14634
            ret = wc_HpkeInitSealContext(ech->hpke, ech->hpkeContext,
14635
                ech->ephemeralKey, receiverPubkey, info, infoLen);
14636
        }
14637
    }
14638
    if (ret == 0) {
14639
        /* make a copy of the aad since we overwrite it */
14640
        aadCopy = (byte*)XMALLOC(aadLen, ech->hpke->heap,
14641
            DYNAMIC_TYPE_TMP_BUFFER);
14642
        if (aadCopy == NULL) {
14643
            ret = MEMORY_E;
14644
        }
14645
    }
14646
    if (ret == 0) {
14647
        XMEMCPY(aadCopy, aad, aadLen);
14648
        /* seal the payload with context */
14649
        ret = wc_HpkeContextSealBase(ech->hpke, ech->hpkeContext, aadCopy,
14650
            aadLen, ech->innerClientHello,
14651
            ech->innerClientHelloLen - ech->hpke->Nt, ech->outerClientPayload);
14652
    }
14653
    if (info != NULL)
14654
        XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
14655
    if (aadCopy != NULL)
14656
        XFREE(aadCopy, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
14657
    if (receiverPubkey != NULL)
14658
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, receiverPubkey,
14659
            ech->hpke->heap);
14660
    return ret;
14661
}
14662
14663
#define GREASE_ECH_USE TLSX_GreaseECH_Use
14664
#define ECH_USE TLSX_ECH_Use
14665
#define SERVER_ECH_USE TLSX_ServerECH_Use
14666
#define ECH_WRITE TLSX_ECH_Write
14667
#define ECH_GET_SIZE TLSX_ECH_GetSize
14668
#define ECH_PARSE TLSX_ECH_Parse
14669
#define ECH_FREE TLSX_ECH_Free
14670
14671
#endif
14672
14673
/** Releases all extensions in the provided list. */
14674
void TLSX_FreeAll(TLSX* list, void* heap)
14675
5.30k
{
14676
5.30k
    TLSX* extension;
14677
14678
5.30k
    while ((extension = list)) {
14679
0
        list = extension->next;
14680
14681
0
        switch (extension->type) {
14682
#if defined(HAVE_RPK)
14683
            case TLSX_CLIENT_CERTIFICATE_TYPE:
14684
                WOLFSSL_MSG("Client Certificate Type extension free");
14685
                /* nothing to do */
14686
                break;
14687
            case TLSX_SERVER_CERTIFICATE_TYPE:
14688
                WOLFSSL_MSG("Server Certificate Type extension free");
14689
                /* nothing to do */
14690
                break;
14691
#endif
14692
14693
0
#ifdef HAVE_SNI
14694
0
            case TLSX_SERVER_NAME:
14695
0
                WOLFSSL_MSG("SNI extension free");
14696
0
                SNI_FREE_ALL((SNI*)extension->data, heap);
14697
0
                break;
14698
0
#endif
14699
14700
0
            case TLSX_TRUSTED_CA_KEYS:
14701
0
                WOLFSSL_MSG("Trusted CA Indication extension free");
14702
0
                TCA_FREE_ALL((TCA*)extension->data, heap);
14703
0
                break;
14704
14705
0
            case TLSX_MAX_FRAGMENT_LENGTH:
14706
0
                WOLFSSL_MSG("Max Fragment Length extension free");
14707
0
                MFL_FREE_ALL(extension->data, heap);
14708
0
                break;
14709
14710
0
            case TLSX_EXTENDED_MASTER_SECRET:
14711
0
                WOLFSSL_MSG("Extended Master Secret free");
14712
                /* Nothing to do. */
14713
0
                break;
14714
0
            case TLSX_TRUNCATED_HMAC:
14715
0
                WOLFSSL_MSG("Truncated HMAC extension free");
14716
                /* Nothing to do. */
14717
0
                break;
14718
14719
0
            case TLSX_SUPPORTED_GROUPS:
14720
0
                WOLFSSL_MSG("Supported Groups extension free");
14721
0
                EC_FREE_ALL((SupportedCurve*)extension->data, heap);
14722
0
                break;
14723
14724
0
            case TLSX_EC_POINT_FORMATS:
14725
0
                WOLFSSL_MSG("Point Formats extension free");
14726
0
                PF_FREE_ALL((PointFormat*)extension->data, heap);
14727
0
                break;
14728
14729
0
            case TLSX_STATUS_REQUEST:
14730
0
                WOLFSSL_MSG("Certificate Status Request extension free");
14731
0
                CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
14732
0
                break;
14733
14734
0
            case TLSX_STATUS_REQUEST_V2:
14735
0
                WOLFSSL_MSG("Certificate Status Request v2 extension free");
14736
0
                CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
14737
0
                        heap);
14738
0
                break;
14739
14740
0
            case TLSX_RENEGOTIATION_INFO:
14741
0
                WOLFSSL_MSG("Secure Renegotiation extension free");
14742
0
                SCR_FREE_ALL(extension->data, heap);
14743
0
                break;
14744
14745
0
            case TLSX_SESSION_TICKET:
14746
0
                WOLFSSL_MSG("Session Ticket extension free");
14747
0
                WOLF_STK_FREE(extension->data, heap);
14748
0
                break;
14749
14750
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
14751
0
                WOLFSSL_MSG("ALPN extension free");
14752
0
                ALPN_FREE_ALL((ALPN*)extension->data, heap);
14753
0
                break;
14754
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14755
0
            case TLSX_SIGNATURE_ALGORITHMS:
14756
0
                WOLFSSL_MSG("Signature Algorithms extension to free");
14757
0
                SA_FREE_ALL((SignatureAlgorithms*)extension->data, heap);
14758
0
                break;
14759
0
#endif
14760
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
14761
0
            case TLSX_ENCRYPT_THEN_MAC:
14762
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension free");
14763
0
                break;
14764
0
#endif
14765
14766
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
14767
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14768
            case TLSX_PRE_SHARED_KEY:
14769
                WOLFSSL_MSG("Pre-Shared Key extension free");
14770
                PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
14771
                break;
14772
14773
        #ifdef WOLFSSL_TLS13
14774
            case TLSX_PSK_KEY_EXCHANGE_MODES:
14775
                WOLFSSL_MSG("PSK Key Exchange Modes extension free");
14776
                break;
14777
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
14778
            case TLSX_CERT_WITH_EXTERN_PSK:
14779
                WOLFSSL_MSG("Cert with external PSK extension free");
14780
                break;
14781
        #endif
14782
        #endif
14783
    #endif
14784
14785
0
            case TLSX_KEY_SHARE:
14786
0
                WOLFSSL_MSG("Key Share extension free");
14787
0
                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
14788
0
                break;
14789
0
#endif
14790
0
#ifdef WOLFSSL_TLS13
14791
0
            case TLSX_SUPPORTED_VERSIONS:
14792
0
                WOLFSSL_MSG("Supported Versions extension free");
14793
0
                break;
14794
14795
0
            case TLSX_COOKIE:
14796
0
                WOLFSSL_MSG("Cookie extension free");
14797
0
                CKE_FREE_ALL((Cookie*)extension->data, heap);
14798
0
                break;
14799
14800
    #ifdef WOLFSSL_EARLY_DATA
14801
            case TLSX_EARLY_DATA:
14802
                WOLFSSL_MSG("Early Data extension free");
14803
                break;
14804
    #endif
14805
14806
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
14807
            case TLSX_POST_HANDSHAKE_AUTH:
14808
                WOLFSSL_MSG("Post-Handshake Authentication extension free");
14809
                break;
14810
    #endif
14811
14812
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14813
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
14814
0
                WOLFSSL_MSG("Signature Algorithms extension free");
14815
0
                break;
14816
0
    #endif
14817
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14818
            case TLSX_CERTIFICATE_AUTHORITIES:
14819
                WOLFSSL_MSG("Certificate Authorities extension free");
14820
                break;
14821
    #endif
14822
0
#endif
14823
#ifdef WOLFSSL_SRTP
14824
            case TLSX_USE_SRTP:
14825
                WOLFSSL_MSG("SRTP extension free");
14826
                SRTP_FREE((TlsxSrtp*)extension->data, heap);
14827
                break;
14828
#endif
14829
14830
    #ifdef WOLFSSL_QUIC
14831
            case TLSX_KEY_QUIC_TP_PARAMS:
14832
                FALL_THROUGH;
14833
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
14834
                WOLFSSL_MSG("QUIC transport parameter free");
14835
                QTP_FREE((QuicTransportParam*)extension->data, heap);
14836
                break;
14837
    #endif
14838
14839
#ifdef WOLFSSL_DTLS_CID
14840
            case TLSX_CONNECTION_ID:
14841
                WOLFSSL_MSG("Connection ID extension free");
14842
                CID_FREE((byte*)extension->data, heap);
14843
                break;
14844
#endif /* WOLFSSL_DTLS_CID */
14845
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
14846
            case TLSX_ECH:
14847
                WOLFSSL_MSG("ECH extension free");
14848
                ECH_FREE((WOLFSSL_ECH*)extension->data, heap);
14849
                break;
14850
#endif
14851
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
14852
            case TLSX_CKS:
14853
                WOLFSSL_MSG("CKS extension free");
14854
                /* nothing to do */
14855
                break;
14856
#endif
14857
0
            default:
14858
0
                break;
14859
0
        }
14860
14861
0
        XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
14862
0
    }
14863
14864
5.30k
    (void)heap;
14865
5.30k
}
14866
14867
/** Checks if the tls extensions are supported based on the protocol version. */
14868
53.2k
int TLSX_SupportExtensions(WOLFSSL* ssl) {
14869
53.2k
    return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
14870
53.2k
}
14871
14872
/** Tells the buffered size of the extensions in a list. */
14873
static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
14874
                        word16* pLength)
14875
0
{
14876
0
    int    ret = 0;
14877
0
    TLSX*  extension;
14878
    /* Use a word32 accumulator so that an extension whose contribution
14879
     * pushes the running total past 0xFFFF is detected rather than
14880
     * silently wrapped (the TLS extensions block length prefix on the
14881
     * wire is a 2-byte field). Callees that take a word16* accumulator
14882
     * are invoked via a per-iteration shim (`cbShim`) and their delta
14883
     * is added back into the word32 total.
14884
     *
14885
     * MAINTAINER NOTE: do NOT pass &length to any *_GET_SIZE function
14886
     * that expects a `word16*` out-parameter -- that would be a type
14887
     * mismatch (UB) and would silently bypass the overflow detection
14888
     * below. When adding a new extension case, either:
14889
     *   - use `length += FOO_GET_SIZE(...)` when the helper returns a
14890
     *     word16 by value, or
14891
     *   - use the cbShim pattern: `cbShim = 0; ret = FOO_GET_SIZE(...,
14892
     *     &cbShim); length += cbShim;`
14893
     */
14894
0
    word32 length = 0;
14895
0
    word16 cbShim = 0;
14896
0
    byte   isRequest = (msgType == client_hello ||
14897
0
                        msgType == certificate_request);
14898
0
    (void)cbShim;
14899
14900
0
    while ((extension = list)) {
14901
0
        list = extension->next;
14902
14903
        /* only extensions marked as response are sent back to the client. */
14904
0
        if (!isRequest && !extension->resp)
14905
0
            continue; /* skip! */
14906
14907
        /* ssl level extensions are expected to override ctx level ones. */
14908
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
14909
0
            continue; /* skip! */
14910
14911
        /* extension type + extension data length. */
14912
0
        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
14913
14914
0
        switch (extension->type) {
14915
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
14916
            case TLSX_CKS:
14917
                length += ((WOLFSSL*)extension->data)->sigSpecSz ;
14918
                break;
14919
#endif
14920
0
#ifdef HAVE_SNI
14921
0
            case TLSX_SERVER_NAME:
14922
                /* SNI only sends the name on the request. */
14923
0
                if (isRequest)
14924
0
                    length += SNI_GET_SIZE((SNI*)extension->data);
14925
0
                break;
14926
0
#endif
14927
14928
0
            case TLSX_TRUSTED_CA_KEYS:
14929
                /* TCA only sends the list on the request. */
14930
0
                if (isRequest) {
14931
0
                    word16 tcaSz = TCA_GET_SIZE((TCA*)extension->data);
14932
                    /* 0 on non-empty list means 16-bit overflow. */
14933
0
                    if (tcaSz == 0 && extension->data != NULL) {
14934
0
                        ret = LENGTH_ERROR;
14935
0
                        break;
14936
0
                    }
14937
0
                    length += tcaSz;
14938
0
                }
14939
0
                break;
14940
14941
0
            case TLSX_MAX_FRAGMENT_LENGTH:
14942
0
                length += MFL_GET_SIZE(extension->data);
14943
0
                break;
14944
14945
0
            case TLSX_EXTENDED_MASTER_SECRET:
14946
0
            case TLSX_TRUNCATED_HMAC:
14947
                /* always empty. */
14948
0
                break;
14949
14950
0
            case TLSX_SUPPORTED_GROUPS:
14951
0
                length += EC_GET_SIZE((SupportedCurve*)extension->data);
14952
0
                break;
14953
14954
0
            case TLSX_EC_POINT_FORMATS:
14955
0
                length += PF_GET_SIZE((PointFormat*)extension->data);
14956
0
                break;
14957
14958
0
            case TLSX_STATUS_REQUEST:
14959
0
                length += CSR_GET_SIZE(
14960
0
                         (CertificateStatusRequest*)extension->data, isRequest);
14961
0
                break;
14962
14963
0
            case TLSX_STATUS_REQUEST_V2:
14964
0
                length += CSR2_GET_SIZE(
14965
0
                        (CertificateStatusRequestItemV2*)extension->data,
14966
0
                        isRequest);
14967
0
                break;
14968
14969
0
            case TLSX_RENEGOTIATION_INFO:
14970
0
                length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
14971
0
                        isRequest);
14972
0
                break;
14973
14974
0
            case TLSX_SESSION_TICKET:
14975
0
                length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
14976
0
                        isRequest);
14977
0
                break;
14978
14979
0
            case TLSX_APPLICATION_LAYER_PROTOCOL: {
14980
0
                word16 alpnSz = ALPN_GET_SIZE((ALPN*)extension->data);
14981
                /* 0 on non-empty list means 16-bit overflow. */
14982
0
                if (alpnSz == 0 && extension->data != NULL) {
14983
0
                    ret = LENGTH_ERROR;
14984
0
                    break;
14985
0
                }
14986
0
                length += alpnSz;
14987
0
                break;
14988
0
            }
14989
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14990
0
            case TLSX_SIGNATURE_ALGORITHMS:
14991
0
                length += SA_GET_SIZE(extension->data);
14992
0
                break;
14993
0
#endif
14994
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
14995
0
            case TLSX_ENCRYPT_THEN_MAC:
14996
0
                cbShim = 0;
14997
0
                ret = ETM_GET_SIZE(msgType, &cbShim);
14998
0
                length += cbShim;
14999
0
                break;
15000
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
15001
15002
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15003
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15004
            case TLSX_PRE_SHARED_KEY:
15005
                cbShim = 0;
15006
                ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
15007
                                                                       &cbShim);
15008
                length += cbShim;
15009
                break;
15010
        #ifdef WOLFSSL_TLS13
15011
            case TLSX_PSK_KEY_EXCHANGE_MODES:
15012
                cbShim = 0;
15013
                ret = PKM_GET_SIZE((byte)extension->val, msgType, &cbShim);
15014
                length += cbShim;
15015
                break;
15016
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
15017
            case TLSX_CERT_WITH_EXTERN_PSK:
15018
                cbShim = 0;
15019
                ret = PSK_WITH_CERT_GET_SIZE(msgType, &cbShim);
15020
                length += cbShim;
15021
                break;
15022
        #endif
15023
        #endif
15024
    #endif
15025
0
            case TLSX_KEY_SHARE:
15026
0
                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
15027
0
                break;
15028
0
#endif
15029
15030
0
#ifdef WOLFSSL_TLS13
15031
0
            case TLSX_SUPPORTED_VERSIONS:
15032
0
                cbShim = 0;
15033
0
                ret = SV_GET_SIZE(extension->data, msgType, &cbShim);
15034
0
                length += cbShim;
15035
0
                break;
15036
15037
0
            case TLSX_COOKIE:
15038
0
                cbShim = 0;
15039
0
                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &cbShim);
15040
0
                length += cbShim;
15041
0
                break;
15042
15043
    #ifdef WOLFSSL_EARLY_DATA
15044
            case TLSX_EARLY_DATA:
15045
                cbShim = 0;
15046
                ret = EDI_GET_SIZE(msgType, &cbShim);
15047
                length += cbShim;
15048
                break;
15049
    #endif
15050
15051
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15052
            case TLSX_POST_HANDSHAKE_AUTH:
15053
                cbShim = 0;
15054
                ret = PHA_GET_SIZE(msgType, &cbShim);
15055
                length += cbShim;
15056
                break;
15057
    #endif
15058
15059
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15060
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
15061
0
                length += SAC_GET_SIZE(extension->data);
15062
0
                break;
15063
0
    #endif
15064
15065
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15066
            case TLSX_CERTIFICATE_AUTHORITIES: {
15067
                word16 canSz = CAN_GET_SIZE(extension->data);
15068
                /* 0 on non-empty list means 16-bit overflow. */
15069
                if (canSz == 0) {
15070
                    ret = LENGTH_ERROR;
15071
                    break;
15072
                }
15073
                length += canSz;
15074
                break;
15075
            }
15076
    #endif
15077
0
#endif
15078
#ifdef WOLFSSL_SRTP
15079
            case TLSX_USE_SRTP:
15080
                length += SRTP_GET_SIZE((TlsxSrtp*)extension->data);
15081
                break;
15082
#endif
15083
15084
#ifdef HAVE_RPK
15085
            case TLSX_CLIENT_CERTIFICATE_TYPE:
15086
                length += CCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
15087
                break;
15088
15089
            case TLSX_SERVER_CERTIFICATE_TYPE:
15090
                length += SCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
15091
                break;
15092
#endif /* HAVE_RPK */
15093
15094
#ifdef WOLFSSL_QUIC
15095
            case TLSX_KEY_QUIC_TP_PARAMS:
15096
                FALL_THROUGH; /* followed by */
15097
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
15098
                length += QTP_GET_SIZE(extension);
15099
                break;
15100
#endif
15101
#ifdef WOLFSSL_DTLS_CID
15102
            case TLSX_CONNECTION_ID:
15103
                length += CID_GET_SIZE((byte*)extension->data);
15104
                break;
15105
#endif /* WOLFSSL_DTLS_CID */
15106
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15107
            case TLSX_ECH:
15108
                length += ECH_GET_SIZE((WOLFSSL_ECH*)extension->data, msgType);
15109
                break;
15110
#endif
15111
0
            default:
15112
0
                break;
15113
0
        }
15114
15115
0
        if (ret != 0)
15116
0
            return ret;
15117
15118
        /* Early exit: stop accumulating as soon as the running total
15119
         * cannot possibly fit the 2-byte wire length. Check *before*
15120
         * marking the extension as processed so the semaphore is not
15121
         * left in an inconsistent state on the error path. */
15122
0
        if (length > WOLFSSL_MAX_16BIT) {
15123
0
            WOLFSSL_MSG("TLSX_GetSize extension length exceeds word16");
15124
0
            return BUFFER_E;
15125
0
        }
15126
15127
        /* marks the extension as processed so ctx level */
15128
        /* extensions don't overlap with ssl level ones. */
15129
0
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
15130
0
    }
15131
15132
0
    if ((word32)*pLength + length > WOLFSSL_MAX_16BIT) {
15133
0
        WOLFSSL_MSG("TLSX_GetSize total extensions length exceeds word16");
15134
0
        return BUFFER_E;
15135
0
    }
15136
15137
0
    *pLength += (word16)length;
15138
15139
0
    return ret;
15140
0
}
15141
15142
/** Writes the extensions of a list in a buffer. */
15143
static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
15144
                         byte msgType, word16* pOffset)
15145
{
15146
    int    ret = 0;
15147
    TLSX*  extension;
15148
    /* Use word32 to symmetrize with TLSX_GetSize -- a single extension can
15149
     * contribute up to 0x10003 bytes (4-byte type/length header + 0xFFFF
15150
     * payload), which would word16-overflow undetectably (e.g. wrap to a
15151
     * value still above prevOffset). Per-iteration and aggregate bounds are
15152
     * checked below before truncating back into the word16 wire fields.
15153
     * Callees that take a word16* offset use the cbShim pattern (init to 0,
15154
     * then add the returned delta to the word32 accumulator). */
15155
    word32 offset = 0;
15156
    word32 length_offset = 0;
15157
    word32 prevOffset;
15158
    word16 cbShim = 0;
15159
    byte   isRequest = (msgType == client_hello ||
15160
                        msgType == certificate_request);
15161
    (void)cbShim;
15162
15163
    while ((extension = list)) {
15164
        list = extension->next;
15165
15166
        /* only extensions marked as response are written in a response. */
15167
        if (!isRequest && !extension->resp)
15168
            continue; /* skip! */
15169
15170
        /* ssl level extensions are expected to override ctx level ones. */
15171
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
15172
            continue; /* skip! */
15173
15174
        /* Snapshot offset to detect word16 wrap within this iteration;
15175
         * see matching comment in TLSX_GetSize. */
15176
        prevOffset = offset;
15177
15178
        /* writes extension type. */
15179
        c16toa((word16)extension->type, output + offset);
15180
        offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
15181
        length_offset = offset;
15182
15183
        /* extension data should be written internally. */
15184
        switch (extension->type) {
15185
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
15186
            case TLSX_CKS:
15187
                WOLFSSL_MSG("CKS extension to write");
15188
                offset += CKS_WRITE(((WOLFSSL*)extension->data),
15189
                                    output + offset);
15190
                break;
15191
#endif
15192
#ifdef HAVE_SNI
15193
            case TLSX_SERVER_NAME:
15194
                if (isRequest) {
15195
                    WOLFSSL_MSG("SNI extension to write");
15196
                    offset += SNI_WRITE((SNI*)extension->data, output + offset);
15197
                }
15198
                break;
15199
#endif
15200
15201
            case TLSX_TRUSTED_CA_KEYS:
15202
                WOLFSSL_MSG("Trusted CA Indication extension to write");
15203
                if (isRequest) {
15204
                    offset += TCA_WRITE((TCA*)extension->data, output + offset);
15205
                }
15206
                break;
15207
15208
            case TLSX_MAX_FRAGMENT_LENGTH:
15209
                WOLFSSL_MSG("Max Fragment Length extension to write");
15210
                offset += MFL_WRITE((byte*)extension->data, output + offset);
15211
                break;
15212
15213
            case TLSX_EXTENDED_MASTER_SECRET:
15214
                WOLFSSL_MSG("Extended Master Secret");
15215
                /* always empty. */
15216
                break;
15217
15218
            case TLSX_TRUNCATED_HMAC:
15219
                WOLFSSL_MSG("Truncated HMAC extension to write");
15220
                /* always empty. */
15221
                break;
15222
15223
            case TLSX_SUPPORTED_GROUPS:
15224
                WOLFSSL_MSG("Supported Groups extension to write");
15225
                offset += EC_WRITE((SupportedCurve*)extension->data,
15226
                                    output + offset);
15227
                break;
15228
15229
            case TLSX_EC_POINT_FORMATS:
15230
                WOLFSSL_MSG("Point Formats extension to write");
15231
                offset += PF_WRITE((PointFormat*)extension->data,
15232
                                    output + offset);
15233
                break;
15234
15235
            case TLSX_STATUS_REQUEST:
15236
                WOLFSSL_MSG("Certificate Status Request extension to write");
15237
                ret = CSR_WRITE((CertificateStatusRequest*)extension->data,
15238
                        output + offset, isRequest);
15239
                if (ret > 0) {
15240
                    offset += (word16)ret;
15241
                    ret = 0;
15242
                }
15243
                break;
15244
15245
            case TLSX_STATUS_REQUEST_V2:
15246
                WOLFSSL_MSG("Certificate Status Request v2 extension to write");
15247
                ret = CSR2_WRITE(
15248
                        (CertificateStatusRequestItemV2*)extension->data,
15249
                        output + offset, isRequest);
15250
                if (ret > 0) {
15251
                    offset += (word16)ret;
15252
                    ret = 0;
15253
                }
15254
                break;
15255
15256
            case TLSX_RENEGOTIATION_INFO:
15257
                WOLFSSL_MSG("Secure Renegotiation extension to write");
15258
                offset += SCR_WRITE((SecureRenegotiation*)extension->data,
15259
                        output + offset, isRequest);
15260
                break;
15261
15262
            case TLSX_SESSION_TICKET:
15263
                WOLFSSL_MSG("Session Ticket extension to write");
15264
                offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
15265
                        output + offset, isRequest);
15266
                break;
15267
15268
            case TLSX_APPLICATION_LAYER_PROTOCOL:
15269
                WOLFSSL_MSG("ALPN extension to write");
15270
                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
15271
                break;
15272
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15273
            case TLSX_SIGNATURE_ALGORITHMS:
15274
                WOLFSSL_MSG("Signature Algorithms extension to write");
15275
                offset += SA_WRITE(extension->data, output + offset);
15276
                break;
15277
#endif
15278
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
15279
            case TLSX_ENCRYPT_THEN_MAC:
15280
                WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
15281
                cbShim = 0;
15282
                ret = ETM_WRITE(extension->data, output, msgType, &cbShim);
15283
                offset += cbShim;
15284
                break;
15285
#endif /* HAVE_ENCRYPT_THEN_MAC */
15286
15287
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15288
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15289
            case TLSX_PRE_SHARED_KEY:
15290
                WOLFSSL_MSG("Pre-Shared Key extension to write");
15291
                cbShim = 0;
15292
                ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
15293
                                                              msgType, &cbShim);
15294
                offset += cbShim;
15295
                break;
15296
15297
        #ifdef WOLFSSL_TLS13
15298
            case TLSX_PSK_KEY_EXCHANGE_MODES:
15299
                WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
15300
                cbShim = 0;
15301
                ret = PKM_WRITE((byte)extension->val, output + offset, msgType,
15302
                                                                       &cbShim);
15303
                offset += cbShim;
15304
                break;
15305
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
15306
            case TLSX_CERT_WITH_EXTERN_PSK:
15307
                WOLFSSL_MSG("Cert with external PSK extension to write");
15308
                cbShim = 0;
15309
                ret = PSK_WITH_CERT_WRITE(output + offset, msgType, &cbShim);
15310
                offset += cbShim;
15311
                break;
15312
        #endif
15313
        #endif
15314
    #endif
15315
            case TLSX_KEY_SHARE:
15316
                WOLFSSL_MSG("Key Share extension to write");
15317
                offset += KS_WRITE((KeyShareEntry*)extension->data,
15318
                                                      output + offset, msgType);
15319
                break;
15320
#endif
15321
#ifdef WOLFSSL_TLS13
15322
            case TLSX_SUPPORTED_VERSIONS:
15323
                WOLFSSL_MSG("Supported Versions extension to write");
15324
                cbShim = 0;
15325
                ret = SV_WRITE(extension->data, output + offset, msgType,
15326
                                                                       &cbShim);
15327
                offset += cbShim;
15328
                break;
15329
15330
            case TLSX_COOKIE:
15331
                WOLFSSL_MSG("Cookie extension to write");
15332
                cbShim = 0;
15333
                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
15334
                                msgType, &cbShim);
15335
                offset += cbShim;
15336
                break;
15337
15338
    #ifdef WOLFSSL_EARLY_DATA
15339
            case TLSX_EARLY_DATA:
15340
                WOLFSSL_MSG("Early Data extension to write");
15341
                cbShim = 0;
15342
                ret = EDI_WRITE(extension->val, output + offset, msgType,
15343
                                                                       &cbShim);
15344
                offset += cbShim;
15345
                break;
15346
    #endif
15347
15348
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15349
            case TLSX_POST_HANDSHAKE_AUTH:
15350
                WOLFSSL_MSG("Post-Handshake Authentication extension to write");
15351
                cbShim = 0;
15352
                ret = PHA_WRITE(output + offset, msgType, &cbShim);
15353
                offset += cbShim;
15354
                break;
15355
    #endif
15356
15357
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15358
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
15359
                WOLFSSL_MSG("Signature Algorithms extension to write");
15360
                offset += SAC_WRITE(extension->data, output + offset);
15361
                break;
15362
    #endif
15363
15364
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15365
            case TLSX_CERTIFICATE_AUTHORITIES:
15366
                WOLFSSL_MSG("Certificate Authorities extension to write");
15367
                offset += CAN_WRITE(extension->data, output + offset);
15368
                break;
15369
    #endif
15370
#endif
15371
#ifdef WOLFSSL_SRTP
15372
            case TLSX_USE_SRTP:
15373
                WOLFSSL_MSG("SRTP extension to write");
15374
                offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset);
15375
                break;
15376
#endif
15377
15378
#ifdef HAVE_RPK
15379
            case TLSX_CLIENT_CERTIFICATE_TYPE:
15380
                WOLFSSL_MSG("Client Certificate Type extension to write");
15381
                offset += CCT_WRITE(extension->data, output + offset, msgType);
15382
                break;
15383
15384
            case TLSX_SERVER_CERTIFICATE_TYPE:
15385
                WOLFSSL_MSG("Server Certificate Type extension to write");
15386
                offset += SCT_WRITE(extension->data, output + offset, msgType);
15387
                break;
15388
#endif /* HAVE_RPK */
15389
15390
#ifdef WOLFSSL_QUIC
15391
            case TLSX_KEY_QUIC_TP_PARAMS:
15392
                FALL_THROUGH;
15393
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
15394
                WOLFSSL_MSG("QUIC transport parameter to write");
15395
                offset += QTP_WRITE((QuicTransportParam*)extension->data,
15396
                                    output + offset);
15397
                break;
15398
#endif
15399
#ifdef WOLFSSL_DTLS_CID
15400
            case TLSX_CONNECTION_ID:
15401
                WOLFSSL_MSG("Connection ID extension to write");
15402
                offset += CID_WRITE((byte*)extension->data, output+offset);
15403
                break;
15404
15405
#endif /* WOLFSSL_DTLS_CID */
15406
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15407
            case TLSX_ECH:
15408
                WOLFSSL_MSG("ECH extension to write");
15409
                cbShim = 0;
15410
                ret = ECH_WRITE((WOLFSSL_ECH*)extension->data, msgType,
15411
                    output + offset, &cbShim);
15412
                offset += cbShim;
15413
                break;
15414
#endif
15415
            default:
15416
                break;
15417
        }
15418
15419
        /* Per-extension data length is a 2-byte wire field; reject any
15420
         * single extension whose payload exceeds that before truncating. */
15421
        if (offset - length_offset > WOLFSSL_MAX_16BIT) {
15422
            WOLFSSL_MSG("TLSX_Write single extension length exceeds word16");
15423
            return BUFFER_E;
15424
        }
15425
15426
        /* writes extension data length. */
15427
        c16toa((word16)(offset - length_offset),
15428
               output + length_offset - OPAQUE16_LEN);
15429
15430
        /* marks the extension as processed so ctx level */
15431
        /* extensions don't overlap with ssl level ones. */
15432
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
15433
15434
        /* if we encountered an error propagate it */
15435
        if (ret != 0)
15436
            break;
15437
15438
        if (offset <= prevOffset) {
15439
            WOLFSSL_MSG("TLSX_Write extension made no progress");
15440
            return BUFFER_E;
15441
        }
15442
    }
15443
15444
    /* Only validate and commit the aggregate offset when the loop
15445
     * completed without error; on the error path, leave *pOffset
15446
     * unchanged and return the original failure reason so callers
15447
     * see the real error instead of a masking BUFFER_E. */
15448
    if (ret == 0) {
15449
        if ((word32)*pOffset + offset > WOLFSSL_MAX_16BIT) {
15450
            WOLFSSL_MSG("TLSX_Write total extensions length exceeds word16");
15451
            return BUFFER_E;
15452
        }
15453
        *pOffset += (word16)offset;
15454
    }
15455
15456
    return ret;
15457
}
15458
15459
#ifdef HAVE_SUPPORTED_CURVES
15460
15461
/* Populates the default supported groups / curves */
15462
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
15463
0
{
15464
0
    int ret = WOLFSSL_SUCCESS;
15465
0
#ifdef WOLFSSL_TLS13
15466
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15467
    if (ssl->options.resuming && ssl->session->namedGroup != 0) {
15468
        return TLSX_UseSupportedCurve(extensions, ssl->session->namedGroup,
15469
                                                                     ssl->heap);
15470
    }
15471
#endif
15472
15473
0
    if (ssl->numGroups != 0) {
15474
0
        int i;
15475
0
        for (i = 0; i < ssl->numGroups; i++) {
15476
0
            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap);
15477
0
            if (ret != WOLFSSL_SUCCESS)
15478
0
                return ret;
15479
0
        }
15480
0
        return WOLFSSL_SUCCESS;
15481
0
    }
15482
0
#endif /* WOLFSSL_TLS13 */
15483
15484
0
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
15485
0
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS)
15486
    /* Prefer non-experimental PQ/T hybrid groups (only for TLS 1.3) */
15487
0
    if (IsAtLeastTLSv1_3(ssl->version)) {
15488
0
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
15489
0
        ECC_MIN_KEY_SZ <= 256
15490
0
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM768,
15491
0
            ssl->heap);
15492
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15493
0
    #endif
15494
0
    #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
15495
0
        (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
15496
0
        ECC_MIN_KEY_SZ <= 384
15497
0
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM1024,
15498
0
            ssl->heap);
15499
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15500
0
    #endif
15501
0
    #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
15502
0
        (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
15503
0
        ECC_MIN_KEY_SZ <= 256
15504
0
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM768,
15505
0
            ssl->heap);
15506
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15507
0
    #endif
15508
0
    }
15509
0
#endif
15510
15511
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
15512
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_1024) && \
15513
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
15514
    if (IsAtLeastTLSv1_3(ssl->version)) {
15515
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
15516
                                     ssl->heap);
15517
        if (ret != WOLFSSL_SUCCESS) return ret;
15518
    }
15519
#endif
15520
15521
0
#if defined(HAVE_ECC)
15522
    /* list in order by strength, since not all servers choose by strength */
15523
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
15524
0
        #ifndef NO_ECC_SECP
15525
0
        ret = TLSX_UseSupportedCurve(extensions,
15526
0
                                        WOLFSSL_ECC_SECP521R1, ssl->heap);
15527
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15528
0
        #endif
15529
0
    #endif
15530
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
15531
0
        #ifdef HAVE_ECC_BRAINPOOL
15532
0
        if (IsAtLeastTLSv1_3(ssl->version)) {
15533
            /* TLS 1.3 BrainpoolP512 curve */
15534
0
            ret = TLSX_UseSupportedCurve(extensions,
15535
0
                        WOLFSSL_ECC_BRAINPOOLP512R1TLS13, ssl->heap);
15536
0
            if (ret != WOLFSSL_SUCCESS) return ret;
15537
15538
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
15539
0
            if (ssl->options.downgrade &&
15540
0
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
15541
0
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
15542
0
                ret = TLSX_UseSupportedCurve(extensions,
15543
0
                            WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
15544
0
                if (ret != WOLFSSL_SUCCESS) return ret;
15545
0
            }
15546
0
        }
15547
0
        else {
15548
            /* TLS 1.2 only */
15549
0
            ret = TLSX_UseSupportedCurve(extensions,
15550
0
                WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
15551
0
            if (ret != WOLFSSL_SUCCESS) return ret;
15552
0
        }
15553
0
        #endif
15554
0
    #endif
15555
0
#endif
15556
15557
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
15558
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_768) && \
15559
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
15560
    if (IsAtLeastTLSv1_3(ssl->version)) {
15561
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
15562
                                     ssl->heap);
15563
        if (ret != WOLFSSL_SUCCESS) return ret;
15564
    }
15565
#endif
15566
15567
0
#if defined(HAVE_ECC)
15568
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
15569
0
        #ifndef NO_ECC_SECP
15570
0
        ret = TLSX_UseSupportedCurve(extensions,
15571
0
                                        WOLFSSL_ECC_SECP384R1, ssl->heap);
15572
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15573
0
        #endif
15574
0
        #ifdef HAVE_ECC_BRAINPOOL
15575
0
        if (IsAtLeastTLSv1_3(ssl->version)) {
15576
            /* TLS 1.3 BrainpoolP384 curve */
15577
0
            ret = TLSX_UseSupportedCurve(extensions,
15578
0
                        WOLFSSL_ECC_BRAINPOOLP384R1TLS13, ssl->heap);
15579
0
            if (ret != WOLFSSL_SUCCESS) return ret;
15580
15581
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
15582
0
            if (ssl->options.downgrade &&
15583
0
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
15584
0
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
15585
0
                ret = TLSX_UseSupportedCurve(extensions,
15586
0
                            WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
15587
0
                if (ret != WOLFSSL_SUCCESS) return ret;
15588
0
            }
15589
0
        }
15590
0
        else {
15591
            /* TLS 1.2 only */
15592
0
            ret = TLSX_UseSupportedCurve(extensions,
15593
0
                WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
15594
0
            if (ret != WOLFSSL_SUCCESS) return ret;
15595
0
        }
15596
0
        #endif
15597
0
    #endif
15598
0
#endif /* HAVE_ECC */
15599
15600
0
#ifndef HAVE_FIPS
15601
0
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
15602
0
        ret = TLSX_UseSupportedCurve(extensions,
15603
0
                                            WOLFSSL_ECC_X448, ssl->heap);
15604
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15605
0
    #endif
15606
0
#endif /* HAVE_FIPS */
15607
15608
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
15609
    !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_512) && \
15610
    !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
15611
    if (IsAtLeastTLSv1_3(ssl->version)) {
15612
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512,
15613
                                     ssl->heap);
15614
        if (ret != WOLFSSL_SUCCESS) return ret;
15615
    }
15616
#endif
15617
15618
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
15619
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
15620
0
        #ifndef NO_ECC_SECP
15621
0
        ret = TLSX_UseSupportedCurve(extensions,
15622
0
                                        WOLFSSL_ECC_SECP256R1, ssl->heap);
15623
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15624
0
        #endif
15625
0
        #ifdef HAVE_ECC_KOBLITZ
15626
0
        ret = TLSX_UseSupportedCurve(extensions,
15627
0
                                        WOLFSSL_ECC_SECP256K1, ssl->heap);
15628
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15629
0
        #endif
15630
0
        #ifdef HAVE_ECC_BRAINPOOL
15631
0
        if (IsAtLeastTLSv1_3(ssl->version)) {
15632
            /* TLS 1.3 BrainpoolP256 curve */
15633
0
            ret = TLSX_UseSupportedCurve(extensions,
15634
0
                                    WOLFSSL_ECC_BRAINPOOLP256R1TLS13, ssl->heap);
15635
0
            if (ret != WOLFSSL_SUCCESS) return ret;
15636
15637
            /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
15638
0
            if (ssl->options.downgrade &&
15639
0
                (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
15640
0
                    ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
15641
0
                ret = TLSX_UseSupportedCurve(extensions,
15642
0
                            WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
15643
0
                if (ret != WOLFSSL_SUCCESS) return ret;
15644
0
            }
15645
0
        }
15646
0
        else {
15647
            /* TLS 1.2 only */
15648
0
            ret = TLSX_UseSupportedCurve(extensions,
15649
0
                WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
15650
0
            if (ret != WOLFSSL_SUCCESS) return ret;
15651
0
        }
15652
0
        #endif
15653
0
        #ifdef WOLFSSL_SM2
15654
0
        ret = TLSX_UseSupportedCurve(extensions,
15655
0
                                        WOLFSSL_ECC_SM2P256V1, ssl->heap);
15656
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15657
0
        #endif
15658
0
    #endif
15659
0
#endif /* HAVE_ECC */
15660
15661
0
#ifndef HAVE_FIPS
15662
0
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
15663
0
        ret = TLSX_UseSupportedCurve(extensions,
15664
0
                                            WOLFSSL_ECC_X25519, ssl->heap);
15665
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15666
0
    #endif
15667
0
#endif /* HAVE_FIPS */
15668
15669
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
15670
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
15671
0
        #ifndef NO_ECC_SECP
15672
0
        ret = TLSX_UseSupportedCurve(extensions,
15673
0
                                        WOLFSSL_ECC_SECP224R1, ssl->heap);
15674
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15675
0
        #endif
15676
0
        #ifdef HAVE_ECC_KOBLITZ
15677
0
        ret = TLSX_UseSupportedCurve(extensions,
15678
0
                                        WOLFSSL_ECC_SECP224K1, ssl->heap);
15679
0
        if (ret != WOLFSSL_SUCCESS) return ret;
15680
0
        #endif
15681
0
    #endif
15682
15683
0
    #ifndef HAVE_FIPS
15684
0
        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
15685
0
            #ifndef NO_ECC_SECP
15686
0
                ret = TLSX_UseSupportedCurve(extensions,
15687
0
                                              WOLFSSL_ECC_SECP192R1, ssl->heap);
15688
0
                if (ret != WOLFSSL_SUCCESS) return ret;
15689
0
            #endif
15690
0
            #ifdef HAVE_ECC_KOBLITZ
15691
0
                ret = TLSX_UseSupportedCurve(extensions,
15692
0
                                              WOLFSSL_ECC_SECP192K1, ssl->heap);
15693
0
                if (ret != WOLFSSL_SUCCESS) return ret;
15694
0
            #endif
15695
0
        #endif
15696
0
        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
15697
0
            #ifndef NO_ECC_SECP
15698
0
                ret = TLSX_UseSupportedCurve(extensions,
15699
0
                                              WOLFSSL_ECC_SECP160R1, ssl->heap);
15700
0
                if (ret != WOLFSSL_SUCCESS) return ret;
15701
0
            #endif
15702
0
            #ifdef HAVE_ECC_SECPR2
15703
0
                ret = TLSX_UseSupportedCurve(extensions,
15704
0
                                              WOLFSSL_ECC_SECP160R2, ssl->heap);
15705
0
                if (ret != WOLFSSL_SUCCESS) return ret;
15706
0
            #endif
15707
0
            #ifdef HAVE_ECC_KOBLITZ
15708
0
                ret = TLSX_UseSupportedCurve(extensions,
15709
0
                                              WOLFSSL_ECC_SECP160K1, ssl->heap);
15710
0
                if (ret != WOLFSSL_SUCCESS) return ret;
15711
0
            #endif
15712
0
        #endif
15713
0
    #endif /* HAVE_FIPS */
15714
0
#endif /* HAVE_ECC */
15715
15716
0
#ifndef NO_DH
15717
        /* Add FFDHE supported groups. */
15718
    #ifdef HAVE_FFDHE_8192
15719
        if (8192/8 >= ssl->options.minDhKeySz &&
15720
                                        8192/8 <= ssl->options.maxDhKeySz) {
15721
            ret = TLSX_UseSupportedCurve(extensions,
15722
                                            WOLFSSL_FFDHE_8192, ssl->heap);
15723
            if (ret != WOLFSSL_SUCCESS)
15724
                return ret;
15725
        }
15726
    #endif
15727
    #ifdef HAVE_FFDHE_6144
15728
        if (6144/8 >= ssl->options.minDhKeySz &&
15729
                                        6144/8 <= ssl->options.maxDhKeySz) {
15730
            ret = TLSX_UseSupportedCurve(extensions,
15731
                                            WOLFSSL_FFDHE_6144, ssl->heap);
15732
            if (ret != WOLFSSL_SUCCESS)
15733
                return ret;
15734
        }
15735
    #endif
15736
    #ifdef HAVE_FFDHE_4096
15737
        if (4096/8 >= ssl->options.minDhKeySz &&
15738
                                        4096/8 <= ssl->options.maxDhKeySz) {
15739
            ret = TLSX_UseSupportedCurve(extensions,
15740
                                            WOLFSSL_FFDHE_4096, ssl->heap);
15741
            if (ret != WOLFSSL_SUCCESS)
15742
                return ret;
15743
        }
15744
    #endif
15745
    #ifdef HAVE_FFDHE_3072
15746
        if (3072/8 >= ssl->options.minDhKeySz &&
15747
                                        3072/8 <= ssl->options.maxDhKeySz) {
15748
            ret = TLSX_UseSupportedCurve(extensions,
15749
                                            WOLFSSL_FFDHE_3072, ssl->heap);
15750
            if (ret != WOLFSSL_SUCCESS)
15751
                return ret;
15752
        }
15753
    #endif
15754
0
    #ifdef HAVE_FFDHE_2048
15755
0
        if (2048/8 >= ssl->options.minDhKeySz &&
15756
0
                                        2048/8 <= ssl->options.maxDhKeySz) {
15757
0
            ret = TLSX_UseSupportedCurve(extensions,
15758
0
                                            WOLFSSL_FFDHE_2048, ssl->heap);
15759
0
            if (ret != WOLFSSL_SUCCESS)
15760
0
                return ret;
15761
0
        }
15762
0
    #endif
15763
0
#endif
15764
15765
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
15766
    !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
15767
    if (IsAtLeastTLSv1_3(ssl->version)) {
15768
#if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
15769
    (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
15770
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP521R1MLKEM1024,
15771
                                     ssl->heap);
15772
        if (ret != WOLFSSL_SUCCESS) return ret;
15773
#endif
15774
#if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
15775
    (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
15776
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM768,
15777
                                     ssl->heap);
15778
        if (ret != WOLFSSL_SUCCESS) return ret;
15779
#endif
15780
#if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE448) && \
15781
    ECC_MIN_KEY_SZ <= 448
15782
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448MLKEM768,
15783
                                     ssl->heap);
15784
        if (ret != WOLFSSL_SUCCESS) return ret;
15785
#endif
15786
#if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_ECC) && \
15787
    (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
15788
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM512,
15789
                                     ssl->heap);
15790
        if (ret != WOLFSSL_SUCCESS) return ret;
15791
#endif
15792
#if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_CURVE25519) && \
15793
    ECC_MIN_KEY_SZ <= 256
15794
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM512,
15795
                                     ssl->heap);
15796
        if (ret != WOLFSSL_SUCCESS) return ret;
15797
#endif
15798
    }
15799
#endif
15800
15801
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
15802
    defined(WOLFSSL_MLKEM_KYBER)
15803
    if (IsAtLeastTLSv1_3(ssl->version)) {
15804
#ifdef WOLFSSL_KYBER1024
15805
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
15806
                                     ssl->heap);
15807
        if (ret != WOLFSSL_SUCCESS) return ret;
15808
#if defined(HAVE_ECC) && (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
15809
    ECC_MIN_KEY_SZ <= 521
15810
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
15811
                                     ssl->heap);
15812
        if (ret != WOLFSSL_SUCCESS) return ret;
15813
#endif
15814
#endif
15815
#ifdef WOLFSSL_KYBER768
15816
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
15817
                                     ssl->heap);
15818
        if (ret != WOLFSSL_SUCCESS) return ret;
15819
#if defined(HAVE_ECC) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
15820
        ECC_MIN_KEY_SZ <= 384
15821
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
15822
                                     ssl->heap);
15823
        if (ret != WOLFSSL_SUCCESS) return ret;
15824
#endif
15825
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
15826
    ECC_MIN_KEY_SZ <= 256
15827
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
15828
                                     ssl->heap);
15829
        if (ret != WOLFSSL_SUCCESS) return ret;
15830
#endif
15831
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
15832
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
15833
                                     ssl->heap);
15834
        if (ret != WOLFSSL_SUCCESS) return ret;
15835
#endif
15836
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
15837
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
15838
                                     ssl->heap);
15839
        if (ret != WOLFSSL_SUCCESS) return ret;
15840
#endif
15841
#endif
15842
#ifdef WOLFSSL_KYBER512
15843
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1,
15844
                                     ssl->heap);
15845
        if (ret != WOLFSSL_SUCCESS) return ret;
15846
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
15847
    ECC_MIN_KEY_SZ <= 256
15848
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
15849
                                     ssl->heap);
15850
        if (ret != WOLFSSL_SUCCESS) return ret;
15851
#endif
15852
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
15853
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
15854
                                     ssl->heap);
15855
        if (ret != WOLFSSL_SUCCESS) return ret;
15856
#endif
15857
#endif
15858
    }
15859
#endif
15860
15861
0
    (void)ssl;
15862
0
    (void)extensions;
15863
15864
0
    return ret;
15865
0
}
15866
15867
#endif /* HAVE_SUPPORTED_CURVES */
15868
15869
int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
15870
0
{
15871
0
    int ret = 0;
15872
0
    byte* public_key      = NULL;
15873
0
    word16 public_key_len = 0;
15874
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
15875
    int usingPSK = 0;
15876
#endif
15877
0
#if defined(HAVE_SUPPORTED_CURVES) && defined(WOLFSSL_TLS13)
15878
0
    TLSX* extension = NULL;
15879
0
    word16 namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
15880
0
#endif
15881
15882
    /* server will add extension depending on what is parsed from client */
15883
0
    if (!isServer) {
15884
#if defined(HAVE_RPK)
15885
        ret = TLSX_ClientCertificateType_Use(ssl, isServer);
15886
        if (ret != 0)
15887
            return ret;
15888
15889
        ret = TLSX_ServerCertificateType_Use(ssl, isServer);
15890
        if (ret != 0)
15891
            return ret;
15892
#endif /* HAVE_RPK */
15893
15894
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) && \
15895
0
    !defined(WOLFSSL_NO_TLS12)
15896
0
        if (!ssl->options.disallowEncThenMac) {
15897
0
            ret = TLSX_EncryptThenMac_Use(ssl);
15898
0
            if (ret != 0)
15899
0
                return ret;
15900
0
        }
15901
0
#endif
15902
15903
0
#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
15904
0
                       defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
15905
0
        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
15906
0
            if (TLSX_Find(ssl->ctx->extensions,
15907
0
                                               TLSX_SUPPORTED_GROUPS) == NULL) {
15908
0
                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
15909
0
                if (ret != WOLFSSL_SUCCESS)
15910
0
                    return ret;
15911
0
            }
15912
0
        }
15913
0
        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
15914
0
               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
15915
0
               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
15916
0
             ret = TLSX_UsePointFormat(&ssl->extensions,
15917
0
                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
15918
0
             if (ret != WOLFSSL_SUCCESS)
15919
0
                 return ret;
15920
0
        }
15921
0
#endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
15922
15923
#ifdef WOLFSSL_SRTP
15924
        if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
15925
            WOLFSSL_MSG("Adding DTLS SRTP extension");
15926
            if ((ret = TLSX_UseSRTP(&ssl->extensions, ssl->dtlsSrtpProfiles,
15927
                                                                ssl->heap)) != 0) {
15928
                return ret;
15929
            }
15930
        }
15931
#endif
15932
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
15933
        if ((IsAtLeastTLSv1_3(ssl->version)) && (ssl->sigSpec != NULL)) {
15934
            WOLFSSL_MSG("Adding CKS extension");
15935
            if ((ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap)) != 0) {
15936
                return ret;
15937
            }
15938
        }
15939
#endif
15940
0
    } /* is not server */
15941
15942
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15943
0
    WOLFSSL_MSG("Adding signature algorithms extension");
15944
0
    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
15945
0
                                                                         != 0) {
15946
0
            return ret;
15947
0
    }
15948
#else
15949
    ret = 0;
15950
#endif
15951
0
#ifdef WOLFSSL_TLS13
15952
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15953
        if (IsAtLeastTLSv1_3(ssl->version) &&
15954
                SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
15955
            WOLFSSL_MSG("Adding certificate authorities extension");
15956
            if ((ret = TLSX_Push(&ssl->extensions,
15957
                    TLSX_CERTIFICATE_AUTHORITIES, ssl, ssl->heap)) != 0) {
15958
                    return ret;
15959
            }
15960
        }
15961
    #endif
15962
0
        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
15963
            /* Add mandatory TLS v1.3 extension: supported version */
15964
0
            WOLFSSL_MSG("Adding supported versions extension");
15965
0
            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
15966
0
                                                             ssl->heap)) != 0) {
15967
0
                return ret;
15968
0
            }
15969
15970
    #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && \
15971
                       !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)
15972
        if (TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
15973
            /* Put in DH groups for TLS 1.3 only. */
15974
            ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
15975
            if (ret != WOLFSSL_SUCCESS)
15976
                return ret;
15977
        /* ret value will be overwritten in !NO_PSK case */
15978
        #ifdef NO_PSK
15979
            ret = 0;
15980
        #endif
15981
        }
15982
    #endif /* !(HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
15983
15984
0
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15985
0
            if (ssl->certHashSigAlgoSz > 0) {
15986
0
                WOLFSSL_MSG("Adding signature algorithms cert extension");
15987
0
                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
15988
0
                                                        ssl, ssl->heap)) != 0) {
15989
0
                    return ret;
15990
0
                }
15991
0
            }
15992
0
        #endif
15993
15994
0
        #if defined(HAVE_SUPPORTED_CURVES)
15995
0
            extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
15996
0
            if (extension == NULL) {
15997
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15998
                if (ssl->options.resuming && ssl->session->namedGroup != 0)
15999
                    namedGroup = ssl->session->namedGroup;
16000
                else
16001
            #endif
16002
0
                if (ssl->numGroups > 0) {
16003
0
                    int set = 0;
16004
0
                    int i, j;
16005
16006
                    /* try to find the highest element in ssl->group[]
16007
                     * that is contained in preferredGroup[].
16008
                     */
16009
0
                    namedGroup = preferredGroup[0];
16010
0
                    for (i = 0; i < ssl->numGroups && !set; i++) {
16011
0
                        for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
16012
0
                            if (preferredGroup[j] == ssl->group[i]) {
16013
0
                                namedGroup = ssl->group[i];
16014
0
                                set = 1;
16015
0
                                break;
16016
0
                            }
16017
0
                        }
16018
0
                    }
16019
0
                    if (!set)
16020
0
                        namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
16021
0
                }
16022
0
                else {
16023
                    /* Choose the most preferred group. */
16024
0
                    namedGroup = preferredGroup[0];
16025
0
                }
16026
0
            }
16027
0
            else {
16028
0
                KeyShareEntry* kse = (KeyShareEntry*)extension->data;
16029
0
                if (kse)
16030
0
                    namedGroup = kse->group;
16031
0
            }
16032
0
            if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
16033
0
                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
16034
0
                        &ssl->extensions);
16035
0
                if (ret != 0)
16036
0
                    return ret;
16037
0
            }
16038
0
        #endif /* HAVE_SUPPORTED_CURVES */
16039
16040
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16041
            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
16042
        #endif
16043
        #if defined(HAVE_SESSION_TICKET)
16044
            if (ssl->options.resuming && ssl->session->ticketLen > 0
16045
        #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
16046
                && !ssl->options.certWithExternPsk
16047
        #endif
16048
            ) {
16049
                WOLFSSL_SESSION* sess = ssl->session;
16050
            #ifdef WOLFSSL_32BIT_MILLI_TIME
16051
                word32 now, milli;
16052
            #else
16053
                word64 now, milli;
16054
            #endif
16055
16056
                /* Determine the MAC algorithm for the cipher suite used. */
16057
                ssl->options.cipherSuite0 = sess->cipherSuite0;
16058
                ssl->options.cipherSuite  = sess->cipherSuite;
16059
                ret = SetCipherSpecs(ssl);
16060
                if (ret != 0)
16061
                    return ret;
16062
                now = (word64)TimeNowInMilliseconds();
16063
                if (now == 0)
16064
                    return GETTIME_ERROR;
16065
            #ifdef WOLFSSL_32BIT_MILLI_TIME
16066
                if (now < sess->ticketSeen)
16067
                    milli = (0xFFFFFFFFU - sess->ticketSeen) + 1 + now;
16068
                else
16069
                    milli = now - sess->ticketSeen;
16070
                milli += sess->ticketAdd;
16071
16072
                /* Pre-shared key is mandatory extension for resumption. */
16073
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
16074
                    sess->ticketLen, milli, ssl->specs.mac_algorithm,
16075
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
16076
                    NULL, ssl->heap);
16077
            #else
16078
                milli = now - sess->ticketSeen + sess->ticketAdd;
16079
16080
                /* Pre-shared key is mandatory extension for resumption. */
16081
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
16082
                    sess->ticketLen, (word32)milli, ssl->specs.mac_algorithm,
16083
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
16084
                    NULL, ssl->heap);
16085
            #endif
16086
                if (ret != 0)
16087
                    return ret;
16088
16089
                usingPSK = 1;
16090
            }
16091
        #endif
16092
    #ifndef NO_PSK
16093
        #ifndef WOLFSSL_PSK_ONE_ID
16094
            if (ssl->options.client_psk_cs_cb != NULL) {
16095
                int i;
16096
                const Suites* suites = WOLFSSL_SUITES(ssl);
16097
                for (i = 0; i < suites->suiteSz; i += 2) {
16098
                    byte cipherSuite0 = suites->suites[i + 0];
16099
                    byte cipherSuite = suites->suites[i + 1];
16100
                    unsigned int keySz;
16101
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16102
                    int cnt = 0;
16103
                #endif
16104
16105
                #ifdef HAVE_NULL_CIPHER
16106
                    if (cipherSuite0 == ECC_BYTE ||
16107
                        cipherSuite0 == ECDHE_PSK_BYTE) {
16108
                        if (cipherSuite != TLS_SHA256_SHA256 &&
16109
                                             cipherSuite != TLS_SHA384_SHA384) {
16110
                            continue;
16111
                        }
16112
                    }
16113
                    else
16114
                #endif
16115
                #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
16116
                    defined(WOLFSSL_SM3)
16117
                    if (cipherSuite0 == CIPHER_BYTE) {
16118
                        if ((cipherSuite != TLS_SM4_GCM_SM3) &&
16119
                            (cipherSuite != TLS_SM4_CCM_SM3)) {
16120
                            continue;
16121
                        }
16122
                    }
16123
                    else
16124
                #endif
16125
                    if (cipherSuite0 != TLS13_BYTE)
16126
                        continue;
16127
16128
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16129
                    do {
16130
                        ssl->arrays->client_identity[0] = cnt;
16131
                #endif
16132
16133
                        ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
16134
                        keySz = ssl->options.client_psk_cs_cb(
16135
                            ssl, ssl->arrays->server_hint,
16136
                            ssl->arrays->client_identity, MAX_PSK_ID_LEN,
16137
                            ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
16138
                            GetCipherNameInternal(cipherSuite0, cipherSuite));
16139
                        if (keySz > 0) {
16140
                            ssl->arrays->psk_keySz = keySz;
16141
                            ret = TLSX_PreSharedKey_Use(&ssl->extensions,
16142
                                (byte*)ssl->arrays->client_identity,
16143
                                (word16)XSTRLEN(ssl->arrays->client_identity),
16144
                                0, SuiteMac(WOLFSSL_SUITES(ssl)->suites + i),
16145
                                cipherSuite0, cipherSuite, 0, NULL, ssl->heap);
16146
                            if (ret != 0)
16147
                                return ret;
16148
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16149
                            cnt++;
16150
                #endif
16151
                        }
16152
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
16153
                    }
16154
                    while (keySz > 0);
16155
                #endif
16156
                }
16157
16158
                usingPSK = 1;
16159
            }
16160
            else
16161
        #endif
16162
            if (ssl->options.client_psk_cb != NULL ||
16163
                ssl->options.client_psk_tls13_cb != NULL) {
16164
                /* Default cipher suite. */
16165
                byte cipherSuite0 = TLS13_BYTE;
16166
                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
16167
                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
16168
                const char* cipherName = NULL;
16169
16170
                if (ssl->options.client_psk_tls13_cb != NULL) {
16171
                    ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
16172
                        ssl, ssl->arrays->server_hint,
16173
                        ssl->arrays->client_identity, MAX_PSK_ID_LEN,
16174
                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
16175
                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
16176
                            &cipherSuite, NULL, NULL, &cipherSuiteFlags) != 0) {
16177
                        return PSK_KEY_ERROR;
16178
                    }
16179
                }
16180
                else {
16181
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
16182
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
16183
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
16184
                }
16185
                if (
16186
                #ifdef OPENSSL_EXTRA
16187
                    /* OpenSSL treats a PSK key length of 0
16188
                     * to indicate no PSK available.
16189
                     */
16190
                    ssl->arrays->psk_keySz == 0 ||
16191
                #endif
16192
                         (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
16193
                     (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
16194
                #ifndef OPENSSL_EXTRA
16195
                    ret = PSK_KEY_ERROR;
16196
                #endif
16197
                }
16198
                else {
16199
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
16200
16201
                    ssl->options.cipherSuite0 = cipherSuite0;
16202
                    ssl->options.cipherSuite  = cipherSuite;
16203
                    (void)cipherSuiteFlags;
16204
                    ret = SetCipherSpecs(ssl);
16205
                    if (ret == 0) {
16206
                        ret = TLSX_PreSharedKey_Use(
16207
                            &ssl->extensions,
16208
                                     (byte*)ssl->arrays->client_identity,
16209
                            (word16)XSTRLEN(ssl->arrays->client_identity),
16210
                            0, ssl->specs.mac_algorithm,
16211
                            cipherSuite0, cipherSuite, 0,
16212
                            NULL, ssl->heap);
16213
                    }
16214
                    if (ret == 0)
16215
                        usingPSK = 1;
16216
                }
16217
                if (ret != 0)
16218
                    return ret;
16219
            }
16220
    #endif /* !NO_PSK */
16221
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16222
16223
            /* Some servers do not generate session tickets unless
16224
             * the extension is seen in a non-resume client hello.
16225
             * We used to send it only if we were otherwise using PSK.
16226
             * Now always send it. Define NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
16227
             * to revert to the old behaviour. */
16228
            #ifdef NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
16229
            if (usingPSK)
16230
            #endif
16231
            {
16232
                byte modes = 0;
16233
16234
                (void)usingPSK;
16235
                /* Pre-shared key modes: mandatory extension for resumption. */
16236
            #ifdef HAVE_SUPPORTED_CURVES
16237
                if (!ssl->options.onlyPskDheKe)
16238
            #endif
16239
                {
16240
                    modes = 1 << PSK_KE;
16241
                }
16242
            #if !defined(NO_DH) || defined(HAVE_ECC) || \
16243
                          defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
16244
                if (!ssl->options.noPskDheKe) {
16245
                    modes |= 1 << PSK_DHE_KE;
16246
                }
16247
            #endif
16248
            #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
16249
                if (ssl->options.certWithExternPsk) {
16250
                    /* RFC8773bis requires psk_dhe_ke with cert_with_extern_psk. */
16251
                    modes |= 1 << PSK_DHE_KE;
16252
                }
16253
            #endif
16254
                ret = TLSX_PskKeyModes_Use(ssl, modes);
16255
                if (ret != 0)
16256
                    return ret;
16257
            }
16258
16259
        #if defined(WOLFSSL_CERT_WITH_EXTERN_PSK)
16260
            if (usingPSK && ssl->options.certWithExternPsk) {
16261
                ret = TLSX_CertWithExternPsk_Use(ssl);
16262
                if (ret != 0)
16263
                    return ret;
16264
                /* Require server confirmation before using cert-with-PSK path. */
16265
                ssl->options.certWithExternPsk = 0;
16266
            }
16267
        #endif
16268
        #endif
16269
        #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
16270
            if (!isServer && ssl->options.postHandshakeAuth) {
16271
                ret = TLSX_PostHandAuth_Use(ssl);
16272
                if (ret != 0)
16273
                    return ret;
16274
            }
16275
        #endif
16276
#if defined(HAVE_ECH)
16277
            /* GREASE ECH */
16278
            if (!ssl->options.disableECH) {
16279
                if (ssl->echConfigs == NULL) {
16280
                    ret = GREASE_ECH_USE(&(ssl->extensions), ssl->heap,
16281
                            ssl->rng);
16282
                }
16283
                else if (ssl->echConfigs != NULL) {
16284
                    ret = ECH_USE(ssl->echConfigs, &(ssl->extensions),
16285
                            ssl->heap, ssl->rng);
16286
                }
16287
            }
16288
#endif
16289
0
        }
16290
#if defined(HAVE_ECH)
16291
        else if (IsAtLeastTLSv1_3(ssl->version)) {
16292
            if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
16293
                ret = SERVER_ECH_USE(&(ssl->extensions), ssl->heap,
16294
                    ssl->ctx->echConfigs);
16295
16296
                if (ret == 0)
16297
                    TLSX_SetResponse(ssl, TLSX_ECH);
16298
            }
16299
        }
16300
#endif
16301
16302
0
#endif
16303
16304
0
    (void)isServer;
16305
0
    (void)public_key;
16306
0
    (void)public_key_len;
16307
0
    (void)ssl;
16308
16309
0
    return ret;
16310
0
}
16311
16312
16313
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
16314
16315
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
16316
static int TLSX_EchChangeSNI(WOLFSSL* ssl, TLSX** pEchX,
16317
                             char* serverName, TLSX** pServerNameX,
16318
                             TLSX*** pExtensions)
16319
{
16320
    int ret = 0;
16321
    TLSX* echX = NULL;
16322
    TLSX* serverNameX = NULL;
16323
    TLSX** extensions = NULL;
16324
16325
    /* calculate the rest of the extensions length with inner ech */
16326
    if (ssl->extensions)
16327
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
16328
16329
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions)
16330
        /* if not NULL the semaphore will stop it from being counted */
16331
        echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
16332
16333
    /* if type is outer change sni to public name */
16334
    if (echX != NULL &&
16335
        ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER &&
16336
        (ssl->options.echAccepted ||
16337
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
16338
        if (ssl->extensions) {
16339
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
16340
16341
            if (serverNameX != NULL)
16342
                extensions = &ssl->extensions;
16343
        }
16344
16345
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
16346
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
16347
            if (serverNameX != NULL)
16348
                extensions = &ssl->ctx->extensions;
16349
        }
16350
16351
        /* ECH requires an inner SNI to be present for ClientHelloInner.
16352
         * Without it, fail instead of mutating extension lists. */
16353
        if (serverNameX == NULL) {
16354
            ret = BAD_FUNC_ARG;
16355
        }
16356
16357
        /* store the inner server name */
16358
        if (ret == 0 && serverNameX != NULL) {
16359
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
16360
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
16361
16362
            if (hostNameSz > WOLFSSL_HOST_NAME_MAX)
16363
                ret = BAD_LENGTH_E;
16364
            else
16365
                XMEMCPY(serverName, hostName, hostNameSz);
16366
        }
16367
16368
        /* only swap the SNI if one was found; extensions is non-NULL if an
16369
         * SNI entry was found on ssl->extensions or ctx->extensions */
16370
        if (ret == 0 && extensions != NULL) {
16371
            /* remove the inner server name */
16372
            TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
16373
16374
            /* set the public name as the server name */
16375
            if ((ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
16376
                    ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
16377
                    XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
16378
                    ssl->heap)) == WOLFSSL_SUCCESS)
16379
                ret = 0;
16380
        }
16381
    }
16382
    *pServerNameX = serverNameX;
16383
    *pExtensions = extensions;
16384
    *pEchX = echX;
16385
    return ret;
16386
}
16387
16388
static int TLSX_EchRestoreSNI(WOLFSSL* ssl, char* serverName,
16389
                              TLSX* serverNameX, TLSX** extensions)
16390
{
16391
    int ret = 0;
16392
16393
    /* always remove the publicName SNI we injected, regardless of whether
16394
     * there was a prior inner SNI to restore */
16395
    if (extensions != NULL)
16396
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
16397
16398
    if (serverNameX != NULL) {
16399
        /* restore the inner server name */
16400
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
16401
            serverName, XSTRLEN(serverName), ssl->heap);
16402
16403
        if (ret == WOLFSSL_SUCCESS)
16404
            ret = 0;
16405
    }
16406
    return ret;
16407
}
16408
16409
/* Returns 1 if the extension may be encoded into ech_outer_extensions,
16410
 * 0 otherwise */
16411
static int TLSX_ECH_IsEncodable(word16 type)
16412
{
16413
    /* supported_versions being here prevents the inner hello from advertising
16414
     * a version less than TLS1.3 */
16415
    switch (type) {
16416
        case TLSX_SERVER_NAME:
16417
        case TLSX_APPLICATION_LAYER_PROTOCOL:
16418
        case TLSX_SUPPORTED_VERSIONS:
16419
        case TLSX_ECH:
16420
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16421
        case TLSX_PRE_SHARED_KEY:
16422
#endif
16423
#ifdef WOLFSSL_EARLY_DATA
16424
        case TLSX_EARLY_DATA:
16425
#endif
16426
            return 0;
16427
        default:
16428
            return 1;
16429
    }
16430
}
16431
16432
/* find extensions that can be encoded into ech_outer_extensions.
16433
 * If output is non-NULL, then write the encoded form.
16434
 *
16435
 * Layout of OuterExtensions (RFC 9849, S5.1):
16436
 *   2-byte extension_type + 2-byte extension_data length +
16437
 *   1-byte list length    + 2*count bytes of extension types
16438
 */
16439
static int TLSX_ECH_BuildOuterExtensions(WOLFSSL* ssl, const byte* semaphore,
16440
    byte msgType, byte* output, word16* pOffset, word16* outCount,
16441
    byte* encodeMask)
16442
{
16443
    TLSX* list;
16444
    TLSX* extension;
16445
    byte* typesStart = NULL;
16446
    int listIdx;
16447
    word16 count = 0;
16448
    byte isRequest = (msgType == client_hello ||
16449
                      msgType == certificate_request);
16450
    byte seen[SEMAPHORE_SIZE];
16451
16452
    /* backup semaphore so it can be aliased by encodeMask */
16453
    XMEMCPY(seen, semaphore, SEMAPHORE_SIZE);
16454
16455
    if (output != NULL && pOffset != NULL) {
16456
        typesStart = output + *pOffset
16457
                     + HELLO_EXT_TYPE_SZ + OPAQUE16_LEN + OPAQUE8_LEN;
16458
    }
16459
16460
    for (listIdx = 0; listIdx < 2; listIdx++) {
16461
        list = (listIdx == 0) ? ssl->extensions :
16462
            (ssl->ctx != NULL ? ssl->ctx->extensions : NULL);
16463
        for (extension = list; extension != NULL; extension = extension->next) {
16464
            word16 type = (word16)extension->type;
16465
            word16 semIdx = TLSX_ToSemaphore(type);
16466
16467
            /* OuterExtensions is <2..254>, so reference at most 127 types */
16468
            if (count >= 127) {
16469
                WOLFSSL_MSG("ECH: cannot encode more than 127 extensions");
16470
                break;
16471
            }
16472
16473
            if (!isRequest && !extension->resp)
16474
                continue;
16475
            if (!IS_OFF(seen, semIdx))
16476
                continue;
16477
            TURN_ON(seen, semIdx);
16478
            if (!TLSX_ECH_IsEncodable(type))
16479
                continue;
16480
16481
            if (typesStart != NULL)
16482
                c16toa(type, typesStart + count * OPAQUE16_LEN);
16483
            count++;
16484
            TURN_ON(encodeMask, semIdx);
16485
        }
16486
    }
16487
16488
    if (count > 0 && pOffset != NULL) {
16489
        word16 listLen = (word16)(OPAQUE16_LEN * count);
16490
        word16 blockSz = (word16)(HELLO_EXT_TYPE_SZ + OPAQUE16_LEN
16491
                                + OPAQUE8_LEN + listLen);
16492
        if ((word32)*pOffset + blockSz > WOLFSSL_MAX_16BIT) {
16493
            WOLFSSL_MSG("ECH OuterExtensions overflows extensions length");
16494
            return BUFFER_E;
16495
        }
16496
        if (output != NULL) {
16497
            byte* hdr = output + *pOffset;
16498
            c16toa(TLSXT_ECH_OUTER_EXTENSIONS, hdr);
16499
            c16toa((word16)(OPAQUE8_LEN + listLen), hdr + OPAQUE16_LEN);
16500
            hdr[OPAQUE16_LEN + OPAQUE16_LEN] = (byte)listLen;
16501
        }
16502
16503
        /* accumulate offset even if nothing is written */
16504
        *pOffset += blockSz;
16505
    }
16506
16507
    *outCount = count;
16508
    return 0;
16509
}
16510
16511
/* because the size of ech depends on the size of other extensions we need to
16512
 * get the size with ech special and process ech last, return status */
16513
static int TLSX_GetSizeWithEch(WOLFSSL* ssl, byte* semaphore, byte msgType,
16514
    word16* pLength)
16515
{
16516
    int ret = 0, r = 0;
16517
    TLSX* echX = NULL;
16518
    TLSX* serverNameX = NULL;
16519
    TLSX** extensions = NULL;
16520
    WOLFSSL_ECH* ech = NULL;
16521
    word16 count = 0;
16522
    WC_DECLARE_VAR(serverName, char, WOLFSSL_HOST_NAME_MAX, 0);
16523
16524
    WC_ALLOC_VAR_EX(serverName, char, WOLFSSL_HOST_NAME_MAX, NULL,
16525
                    DYNAMIC_TYPE_TMP_BUFFER, return MEMORY_E);
16526
16527
    r = TLSX_EchChangeSNI(ssl, &echX, serverName, &serverNameX, &extensions);
16528
16529
    if (echX != NULL)
16530
        ech = (WOLFSSL_ECH*)echX->data;
16531
16532
    /* If ECH won't be written exclude it from the size calculation */
16533
    if (r == 0 && !ssl->options.echAccepted && ech != NULL &&
16534
            ech->innerCount != 0) {
16535
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
16536
    }
16537
16538
    /* if encoding, then count encoded form of inner ClientHello.
16539
     * `semaphore` is in/out so encodable extensions will later be ignored */
16540
    if (r == 0 && ech != NULL && ech->type == ECH_TYPE_INNER &&
16541
            ech->writeEncoded) {
16542
        ret = TLSX_ECH_BuildOuterExtensions(ssl, semaphore, msgType,
16543
            NULL, pLength, &count, semaphore);
16544
    }
16545
    if (r == 0 && ret == 0 && ssl->extensions)
16546
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, pLength);
16547
    if (r == 0 && ret == 0 && ssl->ctx && ssl->ctx->extensions)
16548
        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, pLength);
16549
    if (r == 0)
16550
        r = TLSX_EchRestoreSNI(ssl, serverName, serverNameX, extensions);
16551
16552
    WC_FREE_VAR_EX(serverName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
16553
    if (ret == 0 && r != 0)
16554
        ret = r;
16555
    return ret;
16556
}
16557
#endif
16558
16559
/** Tells the buffered size of extensions to be sent into the client hello. */
16560
int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word32* pLength)
16561
{
16562
    int ret = 0;
16563
    word16 length = 0;
16564
    byte semaphore[SEMAPHORE_SIZE] = {0};
16565
16566
    if (!TLSX_SupportExtensions(ssl))
16567
        return 0;
16568
    if (msgType == client_hello) {
16569
        EC_VALIDATE_REQUEST(ssl, semaphore);
16570
        PF_VALIDATE_REQUEST(ssl, semaphore);
16571
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16572
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
16573
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
16574
#endif
16575
#if defined(WOLFSSL_TLS13)
16576
        if (!IsAtLeastTLSv1_2(ssl)) {
16577
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
16578
        }
16579
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
16580
        if (!IsAtLeastTLSv1_3(ssl->version)) {
16581
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
16582
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16583
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
16584
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
16585
        #endif
16586
        #ifdef WOLFSSL_EARLY_DATA
16587
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
16588
        #endif
16589
        #ifdef WOLFSSL_SEND_HRR_COOKIE
16590
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
16591
        #endif
16592
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
16593
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
16594
        #endif
16595
        }
16596
    #endif
16597
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16598
        if (!IsAtLeastTLSv1_3(ssl->version) ||
16599
                SSL_CA_NAMES(ssl) == NULL) {
16600
            TURN_ON(semaphore,
16601
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
16602
        }
16603
    #endif
16604
#endif /* WOLFSSL_TLS13 */
16605
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
16606
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
16607
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
16608
            /* mark already sent, so it won't send it */
16609
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
16610
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
16611
        }
16612
    #endif
16613
    }
16614
16615
#ifdef WOLFSSL_TLS13
16616
    #ifndef NO_CERTS
16617
    else if (msgType == certificate_request) {
16618
        /* Don't send out any extension except those that are turned off. */
16619
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
16620
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16621
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
16622
#endif
16623
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16624
        if (SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
16625
            TURN_OFF(semaphore,
16626
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
16627
        }
16628
#endif
16629
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, OID_FILTERS
16630
         *       TLSX_STATUS_REQUEST
16631
         */
16632
    }
16633
    #endif
16634
#if defined(HAVE_ECH)
16635
    if (ssl->echConfigs != NULL && !ssl->options.disableECH
16636
            && msgType == client_hello) {
16637
        ret = TLSX_GetSizeWithEch(ssl, semaphore, msgType, &length);
16638
        if (ret != 0)
16639
            return ret;
16640
    }
16641
    else
16642
#endif /* HAVE_ECH */
16643
#endif /* WOLFSSL_TLS13 */
16644
    {
16645
        if (ssl->extensions) {
16646
            ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
16647
            if (ret != 0)
16648
                return ret;
16649
        }
16650
        if (ssl->ctx && ssl->ctx->extensions) {
16651
            ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType,
16652
                &length);
16653
            if (ret != 0)
16654
                return ret;
16655
        }
16656
    }
16657
16658
#ifdef HAVE_EXTENDED_MASTER
16659
    if (msgType == client_hello && ssl->options.haveEMS &&
16660
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
16661
        length += HELLO_EXT_SZ;
16662
    }
16663
#endif
16664
16665
    /* The TLS extensions block length prefix is a 2-byte field, so any
16666
     * accumulated total above 0xFFFF must be rejected rather than silently
16667
     * truncating and producing a short, malformed handshake message. */
16668
    if (length > (word16)(WOLFSSL_MAX_16BIT - OPAQUE16_LEN)) {
16669
        WOLFSSL_MSG("TLSX_GetRequestSize extensions exceed word16");
16670
        return BUFFER_E;
16671
    }
16672
    if (length)
16673
        length += OPAQUE16_LEN; /* for total length storage. */
16674
16675
    *pLength += length;
16676
16677
    return ret;
16678
}
16679
16680
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
16681
/* return status after writing the extensions with ech written last */
16682
static int TLSX_WriteWithEch(WOLFSSL* ssl, byte* output, byte* semaphore,
16683
    byte msgType, word16* pOffset)
16684
{
16685
    int r = 0, ret = 0;
16686
    TLSX* echX = NULL;
16687
    TLSX* serverNameX = NULL;
16688
    TLSX** extensions = NULL;
16689
    WOLFSSL_ECH* ech = NULL;
16690
    WC_DECLARE_VAR(serverName, char, WOLFSSL_HOST_NAME_MAX, 0);
16691
16692
    WC_ALLOC_VAR_EX(serverName, char, WOLFSSL_HOST_NAME_MAX, NULL,
16693
                    DYNAMIC_TYPE_TMP_BUFFER, return MEMORY_E);
16694
    r = TLSX_EchChangeSNI(ssl, &echX, serverName, &serverNameX, &extensions);
16695
    ret = r;
16696
    if (ret == 0 && echX != NULL) {
16697
        ech = (WOLFSSL_ECH*)echX->data;
16698
        /* turn ech on so it doesn't write, then write it last */
16699
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
16700
    }
16701
16702
    /* for ECH inner, print the encodable block first, then the non-encodables.
16703
     * This allows the same transcript to be produced on either side
16704
     * (the transcript is over the expanded form). */
16705
    if (ret == 0 && ech != NULL && ech->type == ECH_TYPE_INNER) {
16706
        byte encodeMask[SEMAPHORE_SIZE];
16707
        byte* mask = ech->writeEncoded ? semaphore : encodeMask;
16708
        word16 count = 0;
16709
        int i;
16710
16711
        XMEMSET(encodeMask, 0, SEMAPHORE_SIZE);
16712
16713
        ret = TLSX_ECH_BuildOuterExtensions(ssl, semaphore, msgType,
16714
            ech->writeEncoded ? output : NULL,
16715
            ech->writeEncoded ? pOffset : NULL,
16716
            &count, mask);
16717
        if (ret == 0 && count >= 1 && !ech->writeEncoded) {
16718
            /* expanded: print encodable block normally */
16719
            for (i = 0; i < SEMAPHORE_SIZE; i++) {
16720
                semaphore[i] |= encodeMask[i];
16721
                encodeMask[i] = (byte)~encodeMask[i];
16722
            }
16723
            if (ssl->extensions) {
16724
                ret = TLSX_Write(ssl->extensions, output + *pOffset,
16725
                        encodeMask, msgType, pOffset);
16726
            }
16727
            if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
16728
                ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset,
16729
                        encodeMask, msgType, pOffset);
16730
            }
16731
        }
16732
    }
16733
16734
    /* print non-encodable block */
16735
    if (ret == 0 && ssl->extensions) {
16736
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
16737
                         msgType, pOffset);
16738
    }
16739
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
16740
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
16741
                         msgType, pOffset);
16742
    }
16743
16744
    /* only write ECH if there is a shot at acceptance */
16745
    if (ret == 0 && echX != NULL &&
16746
        (ssl->options.echAccepted ||
16747
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
16748
        if (echX != NULL) {
16749
            /* turn off and write it last */
16750
            TURN_OFF(semaphore, TLSX_ToSemaphore(echX->type));
16751
        }
16752
16753
        if (ret == 0 && ssl->extensions) {
16754
            ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
16755
                msgType, pOffset);
16756
        }
16757
16758
        if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
16759
            ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
16760
                msgType, pOffset);
16761
        }
16762
    }
16763
16764
    if (r == 0)
16765
        r = TLSX_EchRestoreSNI(ssl, serverName, serverNameX, extensions);
16766
    WC_FREE_VAR_EX(serverName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
16767
16768
    if (ret == 0 && r != 0)
16769
        ret = r;
16770
    return ret;
16771
}
16772
#endif
16773
16774
/** Writes the extensions to be sent into the client hello. */
16775
int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word32* pOffset)
16776
{
16777
    int ret = 0;
16778
    word16 offset = 0;
16779
    byte semaphore[SEMAPHORE_SIZE] = {0};
16780
16781
    if (!TLSX_SupportExtensions(ssl) || output == NULL)
16782
        return 0;
16783
16784
    offset += OPAQUE16_LEN; /* extensions length */
16785
16786
    if (msgType == client_hello) {
16787
        EC_VALIDATE_REQUEST(ssl, semaphore);
16788
        PF_VALIDATE_REQUEST(ssl, semaphore);
16789
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16790
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
16791
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
16792
#endif
16793
#ifdef WOLFSSL_TLS13
16794
        if (!IsAtLeastTLSv1_2(ssl)) {
16795
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
16796
        }
16797
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
16798
        if (!IsAtLeastTLSv1_3(ssl->version)) {
16799
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
16800
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16801
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
16802
        #endif
16803
        #ifdef WOLFSSL_EARLY_DATA
16804
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
16805
        #endif
16806
        #ifdef WOLFSSL_SEND_HRR_COOKIE
16807
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
16808
        #endif
16809
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
16810
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
16811
        #endif
16812
        #ifdef WOLFSSL_DUAL_ALG_CERTS
16813
            TURN_ON(semaphore,
16814
                    TLSX_ToSemaphore(TLSX_CKS));
16815
        #endif
16816
        }
16817
    #endif
16818
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16819
        if (!IsAtLeastTLSv1_3(ssl->version) || SSL_CA_NAMES(ssl) == NULL) {
16820
            TURN_ON(semaphore,
16821
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
16822
        }
16823
    #endif
16824
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16825
        /* Must write Pre-shared Key extension at the end in TLS v1.3.
16826
         * Must not write out Pre-shared Key extension in earlier versions of
16827
         * protocol.
16828
         */
16829
        TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
16830
    #endif
16831
#endif /* WOLFSSL_TLS13 */
16832
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
16833
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
16834
         /* mark already sent, so it won't send it */
16835
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
16836
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
16837
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
16838
        }
16839
    #endif
16840
    }
16841
#ifdef WOLFSSL_TLS13
16842
    #ifndef NO_CERTS
16843
    else if (msgType == certificate_request) {
16844
        /* Don't send out any extension except those that are turned off. */
16845
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
16846
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16847
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
16848
#endif
16849
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16850
        if (SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
16851
            TURN_OFF(semaphore,
16852
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
16853
        }
16854
#endif
16855
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, TLSX_OID_FILTERS
16856
         *       TLSX_STATUS_REQUEST
16857
         */
16858
    }
16859
    #endif
16860
#endif
16861
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
16862
    if (ssl->echConfigs != NULL && !ssl->options.disableECH
16863
            && msgType == client_hello) {
16864
        ret = TLSX_WriteWithEch(ssl, output, semaphore,
16865
                         msgType, &offset);
16866
        if (ret != 0)
16867
            return ret;
16868
    }
16869
    else
16870
#endif
16871
    {
16872
        if (ssl->extensions) {
16873
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
16874
                             msgType, &offset);
16875
            if (ret != 0)
16876
                return ret;
16877
        }
16878
        if (ssl->ctx && ssl->ctx->extensions) {
16879
            ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
16880
                             msgType, &offset);
16881
            if (ret != 0)
16882
                return ret;
16883
        }
16884
    }
16885
16886
#ifdef HAVE_EXTENDED_MASTER
16887
    if (msgType == client_hello && ssl->options.haveEMS &&
16888
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
16889
        WOLFSSL_MSG("EMS extension to write");
16890
        c16toa(HELLO_EXT_EXTMS, output + offset);
16891
        offset += HELLO_EXT_TYPE_SZ;
16892
        c16toa(0, output + offset);
16893
        offset += HELLO_EXT_SZ_SZ;
16894
    }
16895
#endif
16896
16897
#ifdef WOLFSSL_TLS13
16898
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16899
    if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
16900
        /* Write out what we can of Pre-shared key extension.  */
16901
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
16902
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
16903
                         client_hello, &offset);
16904
        if (ret != 0)
16905
            return ret;
16906
    }
16907
    #endif
16908
#endif
16909
16910
    /* Wrap detection for the TLSX_Write calls above is handled inside
16911
     * TLSX_Write itself: any iteration that would push the local word16
16912
     * offset past 0xFFFF returns BUFFER_E so we never reach here with a
16913
     * truncated value. The TLS extensions block length prefix on the
16914
     * wire is a 2-byte field, matching this invariant. */
16915
16916
    if (offset > OPAQUE16_LEN || msgType != client_hello)
16917
        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
16918
16919
     *pOffset += offset;
16920
16921
    return ret;
16922
}
16923
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
16924
16925
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
16926
16927
/** Tells the buffered size of extensions to be sent into the server hello. */
16928
int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
16929
{
16930
    int ret = 0;
16931
    word16 length = 0;
16932
    byte semaphore[SEMAPHORE_SIZE] = {0};
16933
16934
    switch (msgType) {
16935
#ifndef NO_WOLFSSL_SERVER
16936
        case server_hello:
16937
            PF_VALIDATE_RESPONSE(ssl, semaphore);
16938
        #ifdef WOLFSSL_TLS13
16939
                if (IsAtLeastTLSv1_3(ssl->version)) {
16940
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
16941
                    TURN_OFF(semaphore,
16942
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
16943
                #if defined(HAVE_SUPPORTED_CURVES)
16944
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16945
                    if (!ssl->options.noPskDheKe)
16946
                #endif
16947
                    {
16948
                        /* Expect KeyShare extension in ServerHello. */
16949
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
16950
                    }
16951
                #endif
16952
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16953
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
16954
                #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
16955
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
16956
                #endif
16957
                #endif
16958
                }
16959
            #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
16960
                else {
16961
                #ifdef HAVE_SUPPORTED_CURVES
16962
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
16963
                #endif
16964
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16965
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
16966
                #endif
16967
                }
16968
            #endif
16969
            #ifdef WOLFSSL_DTLS_CID
16970
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
16971
            #endif
16972
        #endif /* WOLFSSL_TLS13 */
16973
            break;
16974
16975
    #ifdef WOLFSSL_TLS13
16976
        case hello_retry_request:
16977
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
16978
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
16979
        #ifdef HAVE_SUPPORTED_CURVES
16980
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16981
            if (!ssl->options.noPskDheKe)
16982
        #endif
16983
            {
16984
                /* Expect KeyShare extension in HelloRetryRequest. */
16985
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
16986
            }
16987
        #endif
16988
        #ifdef WOLFSSL_SEND_HRR_COOKIE
16989
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
16990
        #endif
16991
#ifdef HAVE_ECH
16992
            /* send the special confirmation */
16993
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
16994
#endif
16995
            break;
16996
    #endif
16997
16998
    #ifdef WOLFSSL_TLS13
16999
        case encrypted_extensions:
17000
            /* Send out all extension except those that are turned on. */
17001
        #ifdef HAVE_ECC
17002
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
17003
        #endif
17004
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17005
        #ifdef HAVE_SESSION_TICKET
17006
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
17007
        #endif
17008
        #ifdef HAVE_SUPPORTED_CURVES
17009
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17010
        #endif
17011
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17012
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17013
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
17014
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
17015
        #endif
17016
        #endif
17017
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
17018
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17019
        #endif
17020
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
17021
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
17022
        #endif
17023
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
17024
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
17025
        #endif
17026
        #ifdef WOLFSSL_DTLS_CID
17027
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
17028
        #endif /* WOLFSSL_DTLS_CID */
17029
            break;
17030
17031
        #ifdef WOLFSSL_EARLY_DATA
17032
        case session_ticket:
17033
            if (ssl->options.tls1_3) {
17034
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17035
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
17036
            }
17037
            break;
17038
        #endif
17039
    #endif
17040
#endif
17041
17042
#ifdef WOLFSSL_TLS13
17043
    #ifndef NO_CERTS
17044
        case certificate:
17045
            /* Don't send out any extension except those that are turned off. */
17046
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17047
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17048
            /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
17049
             *       TLSX_SERVER_CERTIFICATE_TYPE
17050
             */
17051
            break;
17052
    #endif
17053
#endif
17054
    }
17055
17056
#ifdef HAVE_EXTENDED_MASTER
17057
    if (ssl->options.haveEMS && msgType == server_hello &&
17058
                                              !IsAtLeastTLSv1_3(ssl->version)) {
17059
        length += HELLO_EXT_SZ;
17060
    }
17061
#endif
17062
17063
    if (TLSX_SupportExtensions(ssl)) {
17064
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
17065
        if (ret != 0)
17066
            return ret;
17067
    }
17068
17069
    /* All the response data is set at the ssl object only, so no ctx here. */
17070
17071
    if (length || msgType != server_hello)
17072
        length += OPAQUE16_LEN; /* for total length storage. */
17073
17074
    *pLength += length;
17075
17076
    return ret;
17077
}
17078
17079
/** Writes the server hello extensions into a buffer. */
17080
int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
17081
0
{
17082
0
    int ret = 0;
17083
0
    word16 offset = 0;
17084
17085
0
    if (TLSX_SupportExtensions(ssl) && output) {
17086
0
        byte semaphore[SEMAPHORE_SIZE] = {0};
17087
17088
0
        switch (msgType) {
17089
0
#ifndef NO_WOLFSSL_SERVER
17090
0
            case server_hello:
17091
0
                PF_VALIDATE_RESPONSE(ssl, semaphore);
17092
0
        #ifdef WOLFSSL_TLS13
17093
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
17094
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17095
0
                    TURN_OFF(semaphore,
17096
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17097
0
            #ifdef HAVE_SUPPORTED_CURVES
17098
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17099
                    if (!ssl->options.noPskDheKe)
17100
                #endif
17101
0
                    {
17102
                        /* Write out KeyShare in ServerHello. */
17103
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17104
0
                    }
17105
0
            #endif
17106
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17107
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17108
            #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
17109
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
17110
            #endif
17111
            #endif
17112
0
                }
17113
0
                else
17114
0
        #endif /* WOLFSSL_TLS13 */
17115
0
                {
17116
0
        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
17117
0
            #ifdef HAVE_SUPPORTED_CURVES
17118
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17119
0
            #endif
17120
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17121
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17122
            #endif
17123
0
        #endif
17124
0
                    WC_DO_NOTHING; /* avoid empty brackets */
17125
0
                }
17126
        #ifdef WOLFSSL_DTLS_CID
17127
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
17128
        #endif /* WOLFSSL_DTLS_CID */
17129
0
                break;
17130
17131
0
    #ifdef WOLFSSL_TLS13
17132
0
            case hello_retry_request:
17133
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17134
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17135
0
        #ifdef HAVE_SUPPORTED_CURVES
17136
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17137
                if (!ssl->options.noPskDheKe)
17138
            #endif
17139
0
                {
17140
                    /* Write out KeyShare in HelloRetryRequest. */
17141
0
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17142
0
                }
17143
0
        #endif
17144
0
                break;
17145
0
    #endif
17146
17147
0
    #ifdef WOLFSSL_TLS13
17148
0
            case encrypted_extensions:
17149
                /* Send out all extension except those that are turned on. */
17150
0
        #ifdef HAVE_ECC
17151
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
17152
0
        #endif
17153
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
17154
        #ifdef HAVE_SESSION_TICKET
17155
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
17156
        #endif
17157
0
        #ifdef HAVE_SUPPORTED_CURVES
17158
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
17159
0
        #endif
17160
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17161
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
17162
        #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
17163
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
17164
        #endif
17165
        #endif
17166
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
17167
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17168
        #endif
17169
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
17170
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
17171
        #endif
17172
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
17173
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
17174
0
        #endif
17175
        #ifdef WOLFSSL_DTLS_CID
17176
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
17177
        #endif /* WOLFSSL_DTLS_CID */
17178
0
                break;
17179
17180
        #ifdef WOLFSSL_EARLY_DATA
17181
            case session_ticket:
17182
                if (ssl->options.tls1_3) {
17183
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17184
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
17185
                }
17186
                break;
17187
        #endif
17188
0
    #endif
17189
0
#endif
17190
17191
0
    #ifdef WOLFSSL_TLS13
17192
0
        #ifndef NO_CERTS
17193
0
            case certificate:
17194
                /* Don't send out any extension except those that are turned
17195
                 * off. */
17196
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17197
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
17198
                /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
17199
                 *       TLSX_SERVER_CERTIFICATE_TYPE
17200
                 */
17201
0
                break;
17202
0
        #endif
17203
0
    #endif
17204
17205
0
            default:
17206
0
                break;
17207
0
        }
17208
17209
0
        offset += OPAQUE16_LEN; /* extensions length */
17210
17211
0
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
17212
0
                         msgType, &offset);
17213
0
        if (ret != 0)
17214
0
            return ret;
17215
17216
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
17217
        if (msgType == hello_retry_request) {
17218
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17219
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
17220
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
17221
                             msgType, &offset);
17222
            if (ret != 0)
17223
                return ret;
17224
        }
17225
#endif
17226
17227
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
17228
        /* write ECH last to promote interop with other implementations */
17229
        if (msgType == hello_retry_request) {
17230
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
17231
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
17232
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
17233
                             msgType, &offset);
17234
            if (ret != 0)
17235
                return ret;
17236
        }
17237
#endif
17238
17239
0
#ifdef HAVE_EXTENDED_MASTER
17240
0
        if (ssl->options.haveEMS && msgType == server_hello &&
17241
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
17242
0
            WOLFSSL_MSG("EMS extension to write");
17243
0
            c16toa(HELLO_EXT_EXTMS, output + offset);
17244
0
            offset += HELLO_EXT_TYPE_SZ;
17245
0
            c16toa(0, output + offset);
17246
0
            offset += HELLO_EXT_SZ_SZ;
17247
0
        }
17248
0
#endif
17249
17250
0
        if (offset > OPAQUE16_LEN || msgType != server_hello)
17251
0
            c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
17252
0
    }
17253
17254
0
    if (pOffset)
17255
0
        *pOffset += offset;
17256
17257
0
    return ret;
17258
0
}
17259
17260
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
17261
17262
#ifdef WOLFSSL_TLS13
17263
int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
17264
                      byte msgType, int* found)
17265
1.11k
{
17266
1.11k
    int ret = 0;
17267
1.11k
    int offset = 0;
17268
17269
1.11k
    *found = 0;
17270
6.25k
    while (offset < (int)length) {
17271
6.17k
        word16 type;
17272
6.17k
        word16 size;
17273
17274
6.17k
        if (offset + (2 * OPAQUE16_LEN) > length) {
17275
16
            ret = BUFFER_ERROR;
17276
16
            break;
17277
16
        }
17278
17279
6.15k
        ato16(input + offset, &type);
17280
6.15k
        offset += HELLO_EXT_TYPE_SZ;
17281
17282
6.15k
        ato16(input + offset, &size);
17283
6.15k
        offset += OPAQUE16_LEN;
17284
17285
6.15k
        if (offset + size > length) {
17286
82
            ret = BUFFER_ERROR;
17287
82
            break;
17288
82
        }
17289
17290
6.07k
        if (type == TLSX_SUPPORTED_VERSIONS) {
17291
933
            *found = 1;
17292
17293
933
            WOLFSSL_MSG("Supported Versions extension received");
17294
17295
933
            ret = SV_PARSE(ssl, input + offset, size, msgType, &ssl->version,
17296
933
                           &ssl->options, &ssl->extensions);
17297
933
            break;
17298
933
        }
17299
17300
5.14k
        offset += size;
17301
5.14k
    }
17302
17303
1.11k
    return ret;
17304
1.11k
}
17305
#endif
17306
/* Jump Table to check minimum size values for client case in TLSX_Parse */
17307
#ifndef NO_WOLFSSL_SERVER
17308
static word16 TLSX_GetMinSize_Client(word16* type)
17309
25.7k
{
17310
25.7k
    switch (*type) {
17311
702
        case TLSXT_SERVER_NAME:
17312
702
            return WOLFSSL_SNI_MIN_SIZE_CLIENT;
17313
351
        case TLSXT_EARLY_DATA:
17314
351
            return WOLFSSL_EDI_MIN_SIZE_CLIENT;
17315
175
        case TLSXT_MAX_FRAGMENT_LENGTH:
17316
175
            return WOLFSSL_MFL_MIN_SIZE_CLIENT;
17317
116
        case TLSXT_TRUSTED_CA_KEYS:
17318
116
            return WOLFSSL_TCA_MIN_SIZE_CLIENT;
17319
258
        case TLSXT_TRUNCATED_HMAC:
17320
258
            return WOLFSSL_THM_MIN_SIZE_CLIENT;
17321
474
        case TLSXT_STATUS_REQUEST:
17322
474
            return WOLFSSL_CSR_MIN_SIZE_CLIENT;
17323
3.70k
        case TLSXT_SUPPORTED_GROUPS:
17324
3.70k
            return WOLFSSL_EC_MIN_SIZE_CLIENT;
17325
1.11k
        case TLSXT_EC_POINT_FORMATS:
17326
1.11k
            return WOLFSSL_PF_MIN_SIZE_CLIENT;
17327
1.56k
        case TLSXT_SIGNATURE_ALGORITHMS:
17328
1.56k
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
17329
90
        case TLSXT_USE_SRTP:
17330
90
            return WOLFSSL_SRTP_MIN_SIZE_CLIENT;
17331
128
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
17332
128
            return WOLFSSL_ALPN_MIN_SIZE_CLIENT;
17333
75
        case TLSXT_STATUS_REQUEST_V2:
17334
75
            return WOLFSSL_CSR2_MIN_SIZE_CLIENT;
17335
100
        case TLSXT_CLIENT_CERTIFICATE:
17336
100
            return WOLFSSL_CCT_MIN_SIZE_CLIENT;
17337
56
        case TLSXT_SERVER_CERTIFICATE:
17338
56
            return WOLFSSL_SCT_MIN_SIZE_CLIENT;
17339
745
        case TLSXT_ENCRYPT_THEN_MAC:
17340
745
            return WOLFSSL_ETM_MIN_SIZE_CLIENT;
17341
616
        case TLSXT_SESSION_TICKET:
17342
616
            return WOLFSSL_STK_MIN_SIZE_CLIENT;
17343
644
        case TLSXT_PRE_SHARED_KEY:
17344
644
            return WOLFSSL_PSK_MIN_SIZE_CLIENT;
17345
23
        case TLSXT_COOKIE:
17346
23
            return WOLFSSL_CKE_MIN_SIZE_CLIENT;
17347
895
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
17348
895
            return WOLFSSL_PKM_MIN_SIZE_CLIENT;
17349
48
        case TLSXT_CERT_WITH_EXTERN_PSK:
17350
48
            return WOLFSSL_CWEP_MIN_SIZE_CLIENT;
17351
108
        case TLSXT_CERTIFICATE_AUTHORITIES:
17352
108
            return WOLFSSL_CAN_MIN_SIZE_CLIENT;
17353
103
        case TLSXT_POST_HANDSHAKE_AUTH:
17354
103
            return WOLFSSL_PHA_MIN_SIZE_CLIENT;
17355
117
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
17356
117
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
17357
1.04k
        case TLSXT_KEY_SHARE:
17358
1.04k
            return WOLFSSL_KS_MIN_SIZE_CLIENT;
17359
37
        case TLSXT_CONNECTION_ID:
17360
37
            return WOLFSSL_CID_MIN_SIZE_CLIENT;
17361
239
        case TLSXT_RENEGOTIATION_INFO:
17362
239
            return WOLFSSL_SCR_MIN_SIZE_CLIENT;
17363
6
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
17364
6
            return WOLFSSL_QTP_MIN_SIZE_CLIENT;
17365
12
        case TLSXT_ECH:
17366
12
            return WOLFSSL_ECH_MIN_SIZE_CLIENT;
17367
12.1k
        default:
17368
12.1k
            return 0;
17369
25.7k
    }
17370
25.7k
}
17371
0
    #define TLSX_GET_MIN_SIZE_CLIENT(type) TLSX_GetMinSize_Client(type)
17372
#else
17373
    #define TLSX_GET_MIN_SIZE_CLIENT(type) 0
17374
#endif
17375
17376
17377
#ifndef NO_WOLFSSL_CLIENT
17378
/* Jump Table to check minimum size values for server case in TLSX_Parse */
17379
static word16 TLSX_GetMinSize_Server(const word16 *type)
17380
5.13k
{
17381
5.13k
    switch (*type) {
17382
69
        case TLSXT_SERVER_NAME:
17383
69
            return WOLFSSL_SNI_MIN_SIZE_SERVER;
17384
4
        case TLSXT_EARLY_DATA:
17385
4
            return WOLFSSL_EDI_MIN_SIZE_SERVER;
17386
4
        case TLSXT_MAX_FRAGMENT_LENGTH:
17387
4
            return WOLFSSL_MFL_MIN_SIZE_SERVER;
17388
8
        case TLSXT_TRUSTED_CA_KEYS:
17389
8
            return WOLFSSL_TCA_MIN_SIZE_SERVER;
17390
4
        case TLSXT_TRUNCATED_HMAC:
17391
4
            return WOLFSSL_THM_MIN_SIZE_SERVER;
17392
2.20k
        case TLSXT_STATUS_REQUEST:
17393
2.20k
            return WOLFSSL_CSR_MIN_SIZE_SERVER;
17394
4
        case TLSXT_SUPPORTED_GROUPS:
17395
4
            return WOLFSSL_EC_MIN_SIZE_SERVER;
17396
19
        case TLSXT_EC_POINT_FORMATS:
17397
19
            return WOLFSSL_PF_MIN_SIZE_SERVER;
17398
5
        case TLSXT_SIGNATURE_ALGORITHMS:
17399
5
            return WOLFSSL_SA_MIN_SIZE_SERVER;
17400
43
        case TLSXT_USE_SRTP:
17401
43
            return WOLFSSL_SRTP_MIN_SIZE_SERVER;
17402
40
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
17403
40
            return WOLFSSL_ALPN_MIN_SIZE_SERVER;
17404
2
        case TLSXT_STATUS_REQUEST_V2:
17405
2
            return WOLFSSL_CSR2_MIN_SIZE_SERVER;
17406
1
        case TLSXT_CLIENT_CERTIFICATE:
17407
1
            return WOLFSSL_CCT_MIN_SIZE_SERVER;
17408
3
        case TLSXT_SERVER_CERTIFICATE:
17409
3
            return WOLFSSL_SCT_MIN_SIZE_SERVER;
17410
13
        case TLSXT_ENCRYPT_THEN_MAC:
17411
13
            return WOLFSSL_ETM_MIN_SIZE_SERVER;
17412
50
        case TLSXT_SESSION_TICKET:
17413
50
            return WOLFSSL_STK_MIN_SIZE_SERVER;
17414
21
        case TLSXT_PRE_SHARED_KEY:
17415
21
            return WOLFSSL_PSK_MIN_SIZE_SERVER;
17416
39
        case TLSXT_COOKIE:
17417
39
            return WOLFSSL_CKE_MIN_SIZE_SERVER;
17418
52
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
17419
52
            return WOLFSSL_PKM_MIN_SIZE_SERVER;
17420
0
        case TLSXT_CERT_WITH_EXTERN_PSK:
17421
0
            return WOLFSSL_CWEP_MIN_SIZE_SERVER;
17422
3
        case TLSXT_CERTIFICATE_AUTHORITIES:
17423
3
            return WOLFSSL_CAN_MIN_SIZE_SERVER;
17424
6
        case TLSXT_POST_HANDSHAKE_AUTH:
17425
6
            return WOLFSSL_PHA_MIN_SIZE_SERVER;
17426
7
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
17427
7
            return WOLFSSL_SA_MIN_SIZE_SERVER;
17428
72
        case TLSXT_KEY_SHARE:
17429
72
            return WOLFSSL_KS_MIN_SIZE_SERVER;
17430
4
        case TLSXT_CONNECTION_ID:
17431
4
            return WOLFSSL_CID_MIN_SIZE_SERVER;
17432
4
        case TLSXT_RENEGOTIATION_INFO:
17433
4
            return WOLFSSL_SCR_MIN_SIZE_SERVER;
17434
1
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
17435
1
            return WOLFSSL_QTP_MIN_SIZE_SERVER;
17436
0
        case TLSXT_ECH:
17437
0
            return WOLFSSL_ECH_MIN_SIZE_SERVER;
17438
2.45k
        default:
17439
2.45k
            return 0;
17440
5.13k
    }
17441
5.13k
}
17442
0
    #define TLSX_GET_MIN_SIZE_SERVER(type) TLSX_GetMinSize_Server(type)
17443
#else
17444
    #define TLSX_GET_MIN_SIZE_SERVER(type) 0
17445
#endif
17446
17447
17448
/** Parses a buffer of TLS extensions. */
17449
WOLFSSL_TEST_VIS int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length,
17450
                                byte msgType, Suites *suites)
17451
0
{
17452
0
    int ret = 0;
17453
0
    word16 offset = 0;
17454
0
    byte isRequest = (msgType == client_hello ||
17455
0
                      msgType == certificate_request);
17456
17457
0
#ifdef HAVE_EXTENDED_MASTER
17458
0
    byte pendingEMS = 0;
17459
0
#endif
17460
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
17461
    int pskDone = 0;
17462
#endif
17463
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
17464
    !defined(NO_PSK)
17465
    int secondClientHello = 0;
17466
    int prevHasPskWithCert = 0;
17467
#endif
17468
0
    byte seenType[SEMAPHORE_SIZE];  /* Seen known extensions. */
17469
17470
0
    if (!ssl || !input || (isRequest && !suites))
17471
0
        return BAD_FUNC_ARG;
17472
17473
    /* No known extensions seen yet. */
17474
0
    XMEMSET(seenType, 0, sizeof(seenType));
17475
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
17476
    !defined(NO_PSK)
17477
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == client_hello &&
17478
            ssl->msgsReceived.got_client_hello == 2) {
17479
        secondClientHello = 1;
17480
        prevHasPskWithCert =
17481
            TLSX_Find(ssl->extensions, TLSX_CERT_WITH_EXTERN_PSK) != NULL;
17482
    }
17483
#endif
17484
17485
0
    while (ret == 0 && offset < length) {
17486
0
        word16 type;
17487
0
        word16 size;
17488
17489
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
17490
        if (msgType == client_hello && pskDone) {
17491
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
17492
            return PSK_KEY_ERROR;
17493
        }
17494
#endif
17495
17496
0
        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
17497
0
            return BUFFER_ERROR;
17498
17499
0
        ato16(input + offset, &type);
17500
0
        offset += HELLO_EXT_TYPE_SZ;
17501
17502
0
        ato16(input + offset, &size);
17503
0
        offset += OPAQUE16_LEN;
17504
17505
        /* Check we have a bit for extension type. */
17506
0
        if ((type <= 62) || (type == TLSX_RENEGOTIATION_INFO)
17507
        #ifdef WOLFSSL_QUIC
17508
            || (type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT)
17509
        #endif
17510
        #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
17511
            || (type == TLSX_ECH)
17512
        #endif
17513
        #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
17514
            || (type == TLSX_CKS)
17515
        #endif
17516
0
            )
17517
0
        {
17518
            /* Detect duplicate recognized extensions. */
17519
0
            if (IS_OFF(seenType, TLSX_ToSemaphore(type))) {
17520
0
                TURN_ON(seenType, TLSX_ToSemaphore(type));
17521
0
            }
17522
0
            else {
17523
0
                return DUPLICATE_TLS_EXT_E;
17524
0
            }
17525
0
        }
17526
17527
0
        if (length - offset < size)
17528
0
            return BUFFER_ERROR;
17529
17530
        /* Check minimum size required for TLSX, even if disabled */
17531
0
        switch (msgType) {
17532
0
            #ifndef NO_WOLFSSL_SERVER
17533
0
            case client_hello:
17534
0
                if (size < TLSX_GET_MIN_SIZE_CLIENT(&type)){
17535
0
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
17536
0
                    return BUFFER_ERROR;
17537
0
                }
17538
0
            break;
17539
0
            #endif
17540
0
            #ifndef NO_WOLFSSL_CLIENT
17541
0
            case server_hello:
17542
0
            case hello_retry_request:
17543
0
                if (size < TLSX_GET_MIN_SIZE_SERVER(&type)){
17544
0
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
17545
0
                    return BUFFER_ERROR;
17546
0
                }
17547
0
            break;
17548
0
            #endif
17549
0
            default:
17550
0
            break;
17551
0
        }
17552
17553
0
#ifdef WOLFSSL_TLS13
17554
        /* RFC 8446 4.4.2: extensions in a Certificate message MUST
17555
         * correspond to ones offered in our prior ClientHello (client) or
17556
         * CertificateRequest (server). Reject anything we did not offer. */
17557
0
        if (msgType == certificate &&
17558
0
            IsAtLeastTLSv1_3(ssl->version) &&
17559
0
            TLSX_Find(ssl->extensions, (TLSX_Type)type) == NULL) {
17560
0
            WOLFSSL_MSG("Cert-msg extension not offered in CH/CR");
17561
0
            SendAlert(ssl, alert_fatal, unsupported_extension);
17562
0
            WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
17563
0
            return UNSUPPORTED_EXTENSION;
17564
0
        }
17565
0
#endif
17566
17567
0
        switch (type) {
17568
0
#ifdef HAVE_SNI
17569
0
            case TLSX_SERVER_NAME:
17570
0
                WOLFSSL_MSG("SNI extension received");
17571
            #ifdef WOLFSSL_DEBUG_TLS
17572
                WOLFSSL_BUFFER(input + offset, size);
17573
            #endif
17574
17575
0
#ifdef WOLFSSL_TLS13
17576
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
17577
0
                    if (msgType != client_hello &&
17578
0
                        msgType != encrypted_extensions)
17579
0
                        return EXT_NOT_ALLOWED;
17580
0
                }
17581
0
                else
17582
0
#endif
17583
0
                {
17584
0
                    if (msgType != client_hello &&
17585
0
                        msgType != server_hello)
17586
0
                        return EXT_NOT_ALLOWED;
17587
0
                }
17588
0
                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
17589
0
                break;
17590
0
#endif
17591
17592
0
            case TLSX_TRUSTED_CA_KEYS:
17593
0
                WOLFSSL_MSG("Trusted CA extension received");
17594
            #ifdef WOLFSSL_DEBUG_TLS
17595
                WOLFSSL_BUFFER(input + offset, size);
17596
            #endif
17597
17598
0
#ifdef WOLFSSL_TLS13
17599
                /* RFC 8446 4.2.4 states trusted_ca_keys is not used
17600
                   in TLS 1.3. */
17601
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
17602
0
                    break;
17603
0
                }
17604
0
                else
17605
0
#endif
17606
0
                {
17607
0
                    if (msgType != client_hello &&
17608
0
                        msgType != server_hello)
17609
0
                        return EXT_NOT_ALLOWED;
17610
0
                }
17611
0
                ret = TCA_PARSE(ssl, input + offset, size, isRequest);
17612
0
                break;
17613
17614
0
            case TLSX_MAX_FRAGMENT_LENGTH:
17615
0
                WOLFSSL_MSG("Max Fragment Length extension received");
17616
            #ifdef WOLFSSL_DEBUG_TLS
17617
                WOLFSSL_BUFFER(input + offset, size);
17618
            #endif
17619
17620
0
#ifdef WOLFSSL_TLS13
17621
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
17622
0
                    if (msgType != client_hello &&
17623
0
                        msgType != encrypted_extensions) {
17624
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
17625
0
                        return EXT_NOT_ALLOWED;
17626
0
                    }
17627
0
                }
17628
0
                else
17629
0
#endif
17630
0
                {
17631
0
                    if (msgType != client_hello &&
17632
0
                        msgType != server_hello) {
17633
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
17634
0
                        return EXT_NOT_ALLOWED;
17635
0
                    }
17636
0
                }
17637
0
                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
17638
0
                break;
17639
17640
0
            case TLSX_TRUNCATED_HMAC:
17641
0
                WOLFSSL_MSG("Truncated HMAC extension received");
17642
            #ifdef WOLFSSL_DEBUG_TLS
17643
                WOLFSSL_BUFFER(input + offset, size);
17644
            #endif
17645
17646
0
#ifdef WOLFSSL_TLS13
17647
0
                if (IsAtLeastTLSv1_3(ssl->version))
17648
0
                    break;
17649
0
#endif
17650
0
                if (msgType != client_hello)
17651
0
                    return EXT_NOT_ALLOWED;
17652
0
                ret = THM_PARSE(ssl, input + offset, size, isRequest);
17653
0
                break;
17654
17655
0
            case TLSX_SUPPORTED_GROUPS:
17656
0
                WOLFSSL_MSG("Supported Groups extension received");
17657
            #ifdef WOLFSSL_DEBUG_TLS
17658
                WOLFSSL_BUFFER(input + offset, size);
17659
            #endif
17660
17661
0
#ifdef WOLFSSL_TLS13
17662
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
17663
0
                    if (msgType != client_hello &&
17664
0
                        msgType != encrypted_extensions) {
17665
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
17666
0
                        return EXT_NOT_ALLOWED;
17667
0
                    }
17668
0
                }
17669
0
                else
17670
0
#endif
17671
0
                {
17672
0
                    if (msgType != client_hello) {
17673
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
17674
0
                        return EXT_NOT_ALLOWED;
17675
0
                    }
17676
0
                }
17677
0
                ret = EC_PARSE(ssl, input + offset, size, isRequest,
17678
0
                        &ssl->extensions);
17679
0
                break;
17680
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
17681
            case TLSX_CKS:
17682
                WOLFSSL_MSG("CKS extension received");
17683
                if (msgType != client_hello &&
17684
                     msgType != encrypted_extensions) {
17685
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
17686
                        return EXT_NOT_ALLOWED;
17687
                }
17688
                ret = TLSX_CKS_Parse(ssl, (byte *)(input + offset), size,
17689
                                     &ssl->extensions);
17690
            break;
17691
#endif /* WOLFSSL_DUAL_ALG_CERTS */
17692
0
            case TLSX_EC_POINT_FORMATS:
17693
0
                WOLFSSL_MSG("Point Formats extension received");
17694
            #ifdef WOLFSSL_DEBUG_TLS
17695
                WOLFSSL_BUFFER(input + offset, size);
17696
            #endif
17697
17698
0
#ifdef WOLFSSL_TLS13
17699
0
                if (IsAtLeastTLSv1_3(ssl->version))
17700
0
                    break;
17701
0
#endif
17702
0
                if (msgType != client_hello &&
17703
0
                    msgType != server_hello) {
17704
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
17705
0
                    return EXT_NOT_ALLOWED;
17706
0
                }
17707
17708
0
                ret = PF_PARSE(ssl, input + offset, size, isRequest);
17709
0
                break;
17710
17711
0
            case TLSX_STATUS_REQUEST:
17712
0
                WOLFSSL_MSG("Certificate Status Request extension received");
17713
            #ifdef WOLFSSL_DEBUG_TLS
17714
                WOLFSSL_BUFFER(input + offset, size);
17715
            #endif
17716
17717
0
#ifdef WOLFSSL_TLS13
17718
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
17719
0
                    if (msgType != client_hello &&
17720
0
                        msgType != certificate_request &&
17721
0
                        msgType != certificate)
17722
0
                        return EXT_NOT_ALLOWED;
17723
0
                }
17724
0
                else
17725
0
 #endif
17726
0
                {
17727
0
                    if (msgType != client_hello &&
17728
0
                        msgType != server_hello)
17729
0
                        return EXT_NOT_ALLOWED;
17730
0
                }
17731
0
                ret = CSR_PARSE(ssl, input + offset, size, isRequest);
17732
0
                break;
17733
17734
0
            case TLSX_STATUS_REQUEST_V2:
17735
0
                WOLFSSL_MSG("Certificate Status Request v2 extension received");
17736
            #ifdef WOLFSSL_DEBUG_TLS
17737
                WOLFSSL_BUFFER(input + offset, size);
17738
            #endif
17739
17740
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
17741
                if (IsAtLeastTLSv1_3(ssl->version)) {
17742
                    if (msgType != client_hello &&
17743
                        msgType != certificate_request &&
17744
                        msgType != certificate)
17745
                        return EXT_NOT_ALLOWED;
17746
                }
17747
                else
17748
#endif
17749
0
                {
17750
0
                    if (msgType != client_hello &&
17751
0
                        msgType != server_hello)
17752
0
                        return EXT_NOT_ALLOWED;
17753
0
                }
17754
0
                ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
17755
0
                break;
17756
17757
0
#ifdef HAVE_EXTENDED_MASTER
17758
0
            case HELLO_EXT_EXTMS:
17759
0
                WOLFSSL_MSG("Extended Master Secret extension received");
17760
            #ifdef WOLFSSL_DEBUG_TLS
17761
                WOLFSSL_BUFFER(input + offset, size);
17762
            #endif
17763
17764
0
#if defined(WOLFSSL_TLS13)
17765
0
                if (IsAtLeastTLSv1_3(ssl->version))
17766
0
                    break;
17767
0
#endif
17768
0
                if (msgType != client_hello &&
17769
0
                    msgType != server_hello)
17770
0
                    return EXT_NOT_ALLOWED;
17771
0
                if (size != 0)
17772
0
                    return BUFFER_ERROR;
17773
17774
0
#ifndef NO_WOLFSSL_SERVER
17775
0
                if (isRequest)
17776
0
                    ssl->options.haveEMS = 1;
17777
0
#endif
17778
0
                pendingEMS = 1;
17779
0
                break;
17780
0
#endif
17781
17782
0
            case TLSX_RENEGOTIATION_INFO:
17783
0
                WOLFSSL_MSG("Secure Renegotiation extension received");
17784
            #ifdef WOLFSSL_DEBUG_TLS
17785
                WOLFSSL_BUFFER(input + offset, size);
17786
            #endif
17787
17788
0
#ifdef WOLFSSL_TLS13
17789
0
                if (IsAtLeastTLSv1_3(ssl->version))
17790
0
                    break;
17791
0
#endif
17792
0
                if (msgType != client_hello &&
17793
0
                    msgType != server_hello)
17794
0
                    return EXT_NOT_ALLOWED;
17795
0
                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
17796
0
                break;
17797
17798
0
            case TLSX_SESSION_TICKET:
17799
0
                WOLFSSL_MSG("Session Ticket extension received");
17800
            #ifdef WOLFSSL_DEBUG_TLS
17801
                WOLFSSL_BUFFER(input + offset, size);
17802
            #endif
17803
17804
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
17805
                if (IsAtLeastTLSv1_3(ssl->version)) {
17806
                    if (msgType != client_hello)
17807
                        return EXT_NOT_ALLOWED;
17808
                }
17809
                else
17810
#endif
17811
0
                {
17812
0
                    if (msgType != client_hello &&
17813
0
                        msgType != server_hello)
17814
0
                        return EXT_NOT_ALLOWED;
17815
0
                }
17816
0
                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
17817
0
                break;
17818
17819
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
17820
0
                WOLFSSL_MSG("ALPN extension received");
17821
17822
            #ifdef WOLFSSL_DEBUG_TLS
17823
                WOLFSSL_BUFFER(input + offset, size);
17824
            #endif
17825
17826
#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
17827
                if (IsAtLeastTLSv1_3(ssl->version)) {
17828
                    if (msgType != client_hello &&
17829
                        msgType != encrypted_extensions)
17830
                        return EXT_NOT_ALLOWED;
17831
                }
17832
                else
17833
#endif
17834
0
                {
17835
0
                    if (msgType != client_hello &&
17836
0
                        msgType != server_hello)
17837
0
                        return EXT_NOT_ALLOWED;
17838
0
                }
17839
0
                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
17840
0
                break;
17841
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
17842
0
            case TLSX_SIGNATURE_ALGORITHMS:
17843
0
                WOLFSSL_MSG("Signature Algorithms extension received");
17844
            #ifdef WOLFSSL_DEBUG_TLS
17845
                WOLFSSL_BUFFER(input + offset, size);
17846
            #endif
17847
17848
0
                if (!IsAtLeastTLSv1_2(ssl))
17849
0
                    break;
17850
0
            #ifdef WOLFSSL_TLS13
17851
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
17852
0
                    if (msgType != client_hello &&
17853
0
                        msgType != certificate_request)
17854
0
                        return EXT_NOT_ALLOWED;
17855
0
                }
17856
0
                else
17857
0
            #endif
17858
0
                {
17859
0
                    if (msgType != client_hello)
17860
0
                        return EXT_NOT_ALLOWED;
17861
0
                }
17862
0
                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
17863
0
                break;
17864
0
#endif
17865
17866
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
17867
0
            case TLSX_ENCRYPT_THEN_MAC:
17868
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension received");
17869
17870
                /* Ignore for TLS 1.3+ */
17871
0
                if (IsAtLeastTLSv1_3(ssl->version))
17872
0
                    break;
17873
0
                if (msgType != client_hello &&
17874
0
                    msgType != server_hello)
17875
0
                    return EXT_NOT_ALLOWED;
17876
17877
0
                ret = ETM_PARSE(ssl, input + offset, size, msgType);
17878
0
                break;
17879
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
17880
17881
0
#ifdef WOLFSSL_TLS13
17882
0
            case TLSX_SUPPORTED_VERSIONS:
17883
0
                WOLFSSL_MSG("Skipping Supported Versions - already processed");
17884
            #ifdef WOLFSSL_DEBUG_TLS
17885
                WOLFSSL_BUFFER(input + offset, size);
17886
            #endif
17887
0
                if (msgType != client_hello &&
17888
0
                    msgType != server_hello &&
17889
0
                    msgType != hello_retry_request)
17890
0
                    return EXT_NOT_ALLOWED;
17891
17892
0
                break;
17893
17894
0
            case TLSX_COOKIE:
17895
0
                WOLFSSL_MSG("Cookie extension received");
17896
            #ifdef WOLFSSL_DEBUG_TLS
17897
                WOLFSSL_BUFFER(input + offset, size);
17898
            #endif
17899
0
                if (!IsAtLeastTLSv1_3(ssl->version))
17900
0
                    break;
17901
17902
0
                if (msgType != client_hello &&
17903
0
                    msgType != hello_retry_request) {
17904
0
                    return EXT_NOT_ALLOWED;
17905
0
                }
17906
17907
0
                ret = CKE_PARSE(ssl, input + offset, size, msgType);
17908
0
                break;
17909
17910
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
17911
            case TLSX_PRE_SHARED_KEY:
17912
                WOLFSSL_MSG("Pre-Shared Key extension received");
17913
            #ifdef WOLFSSL_DEBUG_TLS
17914
                WOLFSSL_BUFFER(input + offset, size);
17915
            #endif
17916
17917
                if (!IsAtLeastTLSv1_3(ssl->version))
17918
                    break;
17919
17920
                if (msgType != client_hello &&
17921
                    msgType != server_hello) {
17922
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
17923
                    return EXT_NOT_ALLOWED;
17924
                }
17925
17926
                ret = PSK_PARSE(ssl, input + offset, size, msgType);
17927
                pskDone = 1;
17928
                break;
17929
17930
            case TLSX_PSK_KEY_EXCHANGE_MODES:
17931
                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
17932
            #ifdef WOLFSSL_DEBUG_TLS
17933
                WOLFSSL_BUFFER(input + offset, size);
17934
            #endif
17935
17936
                if (!IsAtLeastTLSv1_3(ssl->version))
17937
                    break;
17938
17939
                if (msgType != client_hello) {
17940
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
17941
                    return EXT_NOT_ALLOWED;
17942
                }
17943
17944
                ret = PKM_PARSE(ssl, input + offset, size, msgType);
17945
                break;
17946
17947
    #ifdef WOLFSSL_CERT_WITH_EXTERN_PSK
17948
            case TLSX_CERT_WITH_EXTERN_PSK:
17949
                WOLFSSL_MSG("Cert with external PSK extension received");
17950
            #ifdef WOLFSSL_DEBUG_TLS
17951
                WOLFSSL_BUFFER(input + offset, size);
17952
            #endif
17953
17954
                if (!IsAtLeastTLSv1_3(ssl->version))
17955
                    break;
17956
17957
                if (msgType != client_hello && msgType != server_hello) {
17958
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
17959
                    return EXT_NOT_ALLOWED;
17960
                }
17961
                if (size != 0) {
17962
                    WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR);
17963
                    return BUFFER_ERROR;
17964
                }
17965
17966
                ret = PSK_WITH_CERT_PARSE(ssl, msgType);
17967
                break;
17968
    #endif
17969
    #endif
17970
17971
    #ifdef WOLFSSL_EARLY_DATA
17972
            case TLSX_EARLY_DATA:
17973
                WOLFSSL_MSG("Early Data extension received");
17974
            #ifdef WOLFSSL_DEBUG_TLS
17975
                WOLFSSL_BUFFER(input + offset, size);
17976
            #endif
17977
17978
                if (!IsAtLeastTLSv1_3(ssl->version))
17979
                    break;
17980
17981
                if (msgType != client_hello && msgType != session_ticket &&
17982
                    msgType != encrypted_extensions) {
17983
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
17984
                    return EXT_NOT_ALLOWED;
17985
                }
17986
                ret = EDI_PARSE(ssl, input + offset, size, msgType);
17987
                break;
17988
    #endif
17989
17990
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
17991
            case TLSX_POST_HANDSHAKE_AUTH:
17992
                WOLFSSL_MSG("Post Handshake Authentication extension received");
17993
            #ifdef WOLFSSL_DEBUG_TLS
17994
                WOLFSSL_BUFFER(input + offset, size);
17995
            #endif
17996
17997
                if (!IsAtLeastTLSv1_3(ssl->version))
17998
                    break;
17999
18000
                if (msgType != client_hello) {
18001
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18002
                    return EXT_NOT_ALLOWED;
18003
                }
18004
18005
                ret = PHA_PARSE(ssl, input + offset, size, msgType);
18006
                break;
18007
    #endif
18008
18009
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
18010
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
18011
0
                WOLFSSL_MSG("Signature Algorithms extension received");
18012
            #ifdef WOLFSSL_DEBUG_TLS
18013
                WOLFSSL_BUFFER(input + offset, size);
18014
            #endif
18015
18016
0
                if (!IsAtLeastTLSv1_3(ssl->version))
18017
0
                    break;
18018
18019
0
                if (msgType != client_hello &&
18020
0
                        msgType != certificate_request) {
18021
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18022
0
                    return EXT_NOT_ALLOWED;
18023
0
                }
18024
18025
0
                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
18026
0
                break;
18027
0
    #endif
18028
18029
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
18030
            case TLSX_CERTIFICATE_AUTHORITIES:
18031
                WOLFSSL_MSG("Certificate Authorities extension received");
18032
            #ifdef WOLFSSL_DEBUG_TLS
18033
                WOLFSSL_BUFFER(input + offset, size);
18034
            #endif
18035
18036
                if (!IsAtLeastTLSv1_3(ssl->version))
18037
                    break;
18038
18039
                if (msgType != client_hello &&
18040
                        msgType != certificate_request) {
18041
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18042
                    return EXT_NOT_ALLOWED;
18043
                }
18044
18045
                ret = CAN_PARSE(ssl, input + offset, size, isRequest);
18046
                break;
18047
    #endif
18048
18049
0
            case TLSX_KEY_SHARE:
18050
0
                WOLFSSL_MSG("Key Share extension received");
18051
            #ifdef WOLFSSL_DEBUG_TLS
18052
                WOLFSSL_BUFFER(input + offset, size);
18053
            #endif
18054
18055
0
    #ifdef HAVE_SUPPORTED_CURVES
18056
0
                if (!IsAtLeastTLSv1_3(ssl->version))
18057
0
                    break;
18058
18059
0
                if (msgType != client_hello && msgType != server_hello &&
18060
0
                        msgType != hello_retry_request) {
18061
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18062
0
                    return EXT_NOT_ALLOWED;
18063
0
                }
18064
0
    #endif
18065
18066
0
                ret = KS_PARSE(ssl, input + offset, size, msgType);
18067
0
                break;
18068
0
#endif
18069
#ifdef WOLFSSL_SRTP
18070
            case TLSX_USE_SRTP:
18071
                WOLFSSL_MSG("Use SRTP extension received");
18072
18073
#if defined(WOLFSSL_TLS13)
18074
                if (IsAtLeastTLSv1_3(ssl->version)) {
18075
                    if (msgType != client_hello &&
18076
                        msgType != encrypted_extensions)
18077
                        return EXT_NOT_ALLOWED;
18078
                }
18079
                else
18080
#endif
18081
                {
18082
                    if (msgType != client_hello &&
18083
                        msgType != server_hello)
18084
                        return EXT_NOT_ALLOWED;
18085
                }
18086
                ret = SRTP_PARSE(ssl, input + offset, size, isRequest);
18087
                break;
18088
#endif
18089
#ifdef WOLFSSL_QUIC
18090
            case TLSX_KEY_QUIC_TP_PARAMS:
18091
                FALL_THROUGH;
18092
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
18093
                WOLFSSL_MSG("QUIC transport parameter received");
18094
            #ifdef WOLFSSL_DEBUG_TLS
18095
                WOLFSSL_BUFFER(input + offset, size);
18096
            #endif
18097
18098
                if (IsAtLeastTLSv1_3(ssl->version) &&
18099
                        msgType != client_hello &&
18100
                        msgType != encrypted_extensions) {
18101
                    return EXT_NOT_ALLOWED;
18102
                }
18103
                else if (!IsAtLeastTLSv1_3(ssl->version) &&
18104
                         msgType == encrypted_extensions) {
18105
                    return EXT_NOT_ALLOWED;
18106
                }
18107
                else if (WOLFSSL_IS_QUIC(ssl)) {
18108
                    ret = QTP_PARSE(ssl, input + offset, size, type, msgType);
18109
                }
18110
                else {
18111
                    WOLFSSL_MSG("QUIC transport param TLS extension type, but no QUIC");
18112
                    return EXT_NOT_ALLOWED; /* be safe, this should not happen */
18113
                }
18114
                break;
18115
#endif /* WOLFSSL_QUIC */
18116
#if defined(WOLFSSL_DTLS_CID)
18117
            case TLSX_CONNECTION_ID:
18118
                if (msgType != client_hello && msgType != server_hello)
18119
                    return EXT_NOT_ALLOWED;
18120
18121
                WOLFSSL_MSG("ConnectionID extension received");
18122
                ret = CID_PARSE(ssl, input + offset, size, isRequest);
18123
                break;
18124
18125
#endif /* defined(WOLFSSL_DTLS_CID) */
18126
#if defined(HAVE_RPK)
18127
            case TLSX_CLIENT_CERTIFICATE_TYPE:
18128
                WOLFSSL_MSG("Client Certificate Type extension received");
18129
#if defined(WOLFSSL_TLS13)
18130
                /* RFC 8446, Section 4.2 (Extensions), client_certificate_type
18131
                   and server_certificate_type MUST be sent in ClientHello(CH)
18132
                   or EncryptedExtensions(EE) */
18133
                if (IsAtLeastTLSv1_3(ssl->version)) {
18134
                    if (msgType != client_hello &&
18135
                        msgType != encrypted_extensions) {
18136
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18137
                        return EXT_NOT_ALLOWED;
18138
                    }
18139
                }
18140
                else
18141
#endif
18142
                {
18143
                    /* TLS 1.2: allowed in CH and SH (RFC 7250) */
18144
                    if (msgType != client_hello &&
18145
                        msgType != server_hello) {
18146
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18147
                        return EXT_NOT_ALLOWED;
18148
                    }
18149
                }
18150
                ret = CCT_PARSE(ssl, input + offset, size, msgType);
18151
                break;
18152
18153
            case TLSX_SERVER_CERTIFICATE_TYPE:
18154
                WOLFSSL_MSG("Server Certificate Type extension received");
18155
#if defined(WOLFSSL_TLS13)
18156
                /* RFC 8446, Section 4.2 (Extensions) */
18157
                if (IsAtLeastTLSv1_3(ssl->version)) {
18158
                    if (msgType != client_hello &&
18159
                        msgType != encrypted_extensions) {
18160
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18161
                        return EXT_NOT_ALLOWED;
18162
                    }
18163
                }
18164
                else
18165
#endif
18166
                {
18167
                    /* TLS 1.2: allowed in CH and SH (RFC 7250) */
18168
                    if (msgType != client_hello &&
18169
                        msgType != server_hello) {
18170
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18171
                        return EXT_NOT_ALLOWED;
18172
                    }
18173
                }
18174
                ret = SCT_PARSE(ssl, input + offset, size, msgType);
18175
                break;
18176
#endif /* HAVE_RPK */
18177
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
18178
            case TLSX_ECH:
18179
                WOLFSSL_MSG("ECH extension received");
18180
                if (!IsAtLeastTLSv1_3(ssl->version))
18181
                    break;
18182
18183
                if (msgType != client_hello &&
18184
                    msgType != encrypted_extensions &&
18185
                    msgType != hello_retry_request) {
18186
                    return EXT_NOT_ALLOWED;
18187
                }
18188
18189
                ret = ECH_PARSE(ssl, input + offset, size, msgType);
18190
                break;
18191
            case TLSXT_ECH_OUTER_EXTENSIONS:
18192
                /* RFC 9849 s5.1: ech_outer_extensions MUST only appear in
18193
                 * the EncodedClientHelloInner */
18194
                WOLFSSL_MSG("ech_outer_extensions in plaintext message");
18195
                WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER);
18196
                return INVALID_PARAMETER;
18197
#endif
18198
0
            default:
18199
0
                WOLFSSL_MSG("Unknown TLS extension type");
18200
0
#if defined(WOLFSSL_TLS13)
18201
                /* RFC 8446 Sec. 4.2: a TLS 1.3 client MUST abort with an
18202
                 * unsupported_extension alert when it receives an extension
18203
                 * "response" that was not advertised in the ClientHello. The
18204
                 * rule applies only to messages whose extensions are responses
18205
                 * to the ClientHello: ServerHello, HelloRetryRequest,
18206
                 * EncryptedExtensions and Certificate.
18207
                 *
18208
                 * Extensions in CertificateRequest and NewSessionTicket are
18209
                 * independent server-initiated payloads, not responses, and
18210
                 * per RFC 8701 (GREASE) the server MAY include unknown
18211
                 * (GREASE) extension types there which the client MUST treat
18212
                 * like any other unknown value (i.e. ignore them). */
18213
0
                if (IsAtLeastTLSv1_3(ssl->version) &&
18214
0
                        (msgType == server_hello ||
18215
0
                         msgType == hello_retry_request ||
18216
0
                         msgType == encrypted_extensions ||
18217
0
                         msgType == certificate)) {
18218
0
                    SendAlert((WOLFSSL*)ssl, alert_fatal, unsupported_extension);
18219
0
                    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
18220
0
                    return UNSUPPORTED_EXTENSION;
18221
0
                }
18222
0
#endif
18223
0
        }
18224
18225
        /* offset should be updated here! */
18226
0
        offset += size;
18227
0
    }
18228
18229
0
#ifdef HAVE_EXTENDED_MASTER
18230
0
    if (IsAtLeastTLSv1_3(ssl->version) &&
18231
0
        (msgType == hello_retry_request || msgType == hello_verify_request)) {
18232
        /* Don't change EMS status until server_hello received.
18233
         * Second ClientHello must have same extensions.
18234
         */
18235
0
    }
18236
0
    else if (!isRequest && ssl->options.haveEMS && !pendingEMS)
18237
0
        ssl->options.haveEMS = 0;
18238
0
#endif
18239
#if defined(WOLFSSL_TLS13) && !defined(NO_PSK)
18240
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == server_hello &&
18241
        IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE))) {
18242
        ssl->options.noPskDheKe = 1;
18243
    }
18244
#endif
18245
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_CERT_WITH_EXTERN_PSK) && \
18246
    !defined(NO_PSK)
18247
    if (IsAtLeastTLSv1_3(ssl->version)) {
18248
        int hasPskWithCert = !IS_OFF(seenType,
18249
            TLSX_ToSemaphore(TLSX_CERT_WITH_EXTERN_PSK));
18250
        if (hasPskWithCert && ssl->options.certWithExternPsk) {
18251
            int hasPsk = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
18252
            int hasPskModes = !IS_OFF(seenType,
18253
                TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
18254
            int hasKeyShare = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18255
            int hasSg = !IS_OFF(seenType,
18256
                TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
18257
            int hasSigAlg = !IS_OFF(seenType,
18258
                TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
18259
#ifdef WOLFSSL_EARLY_DATA
18260
            int hasEarlyData = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_EARLY_DATA));
18261
#endif
18262
18263
            if (msgType == client_hello && isRequest) {
18264
                TLSX* pskm;
18265
                /* RFC8773bis: CH2 after HRR must keep CH1's extension set. */
18266
                if (secondClientHello && !prevHasPskWithCert) {
18267
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18268
                    return EXT_NOT_ALLOWED;
18269
                }
18270
                /* RFC8773bis: cert_with_extern_psk depends on these extensions. */
18271
                if (!hasPsk || !hasPskModes || !hasKeyShare || !hasSg ||
18272
                    !hasSigAlg) {
18273
                    WOLFSSL_ERROR_VERBOSE(EXT_MISSING);
18274
                    return EXT_MISSING;
18275
                }
18276
#ifdef WOLFSSL_EARLY_DATA
18277
                /* External PSK + certificate mode forbids 0-RTT in CH.
18278
                 * When WOLFSSL_EARLY_DATA is not defined there is no parser
18279
                 * case for TLSX_EARLY_DATA, so an incoming early_data
18280
                 * extension is treated as unknown and ignored per RFC 8446
18281
                 * Sect. 4.2 - no additional check is needed in that case. */
18282
                if (hasEarlyData) {
18283
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18284
                    return EXT_NOT_ALLOWED;
18285
                }
18286
#endif
18287
                pskm = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
18288
                /* RFC8773bis requires client support for psk_dhe_ke mode. */
18289
                if (pskm == NULL || (pskm->val & (1 << PSK_DHE_KE)) == 0) {
18290
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18291
                    return EXT_NOT_ALLOWED;
18292
                }
18293
            }
18294
            else if (msgType == server_hello && !isRequest) {
18295
                /* SH confirming cert_with_extern_psk must also confirm PSK and KSE. */
18296
                if (!hasPsk || !hasKeyShare) {
18297
                    WOLFSSL_ERROR_VERBOSE(EXT_MISSING);
18298
                    return EXT_MISSING;
18299
                }
18300
            }
18301
        }
18302
        else if (msgType == client_hello && isRequest && secondClientHello &&
18303
                prevHasPskWithCert) {
18304
            /* RFC8773bis: reject dropping the extension in CH2 after HRR. */
18305
            WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
18306
            return EXT_NOT_ALLOWED;
18307
        }
18308
    }
18309
#endif
18310
0
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
18311
    /* RFC 8446 Section 9.2: ClientHello with KeyShare must
18312
     * contain SupportedGroups and vice-versa. */
18313
0
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == client_hello && isRequest) {
18314
0
        int hasKeyShare = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE));
18315
0
        int hasSupportedGroups = !IS_OFF(seenType,
18316
0
            TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
18317
18318
0
        if (hasKeyShare && !hasSupportedGroups) {
18319
0
            WOLFSSL_MSG("ClientHello with KeyShare extension missing required "
18320
0
                        "SupportedGroups extension");
18321
0
            return INCOMPLETE_DATA;
18322
0
        }
18323
0
        if (hasSupportedGroups && !hasKeyShare) {
18324
0
            WOLFSSL_MSG("ClientHello with SupportedGroups extension missing "
18325
0
                        "required KeyShare extension");
18326
0
            return INCOMPLETE_DATA;
18327
0
        }
18328
0
    }
18329
0
#endif
18330
18331
0
    if (ret == 0)
18332
0
        ret = SNI_VERIFY_PARSE(ssl, isRequest);
18333
0
    if (ret == 0)
18334
0
        ret = TCA_VERIFY_PARSE(ssl, isRequest);
18335
18336
0
    WOLFSSL_LEAVE("Leaving TLSX_Parse", ret);
18337
0
    return ret;
18338
0
}
18339
18340
/* undefining semaphore macros */
18341
#undef IS_OFF
18342
#undef TURN_ON
18343
#undef SEMAPHORE_SIZE
18344
18345
#endif /* HAVE_TLS_EXTENSIONS */
18346
18347
#ifndef NO_WOLFSSL_CLIENT
18348
18349
    WOLFSSL_METHOD* wolfTLS_client_method(void)
18350
0
    {
18351
0
        return wolfTLS_client_method_ex(NULL);
18352
0
    }
18353
    WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
18354
0
    {
18355
0
        WOLFSSL_METHOD* method =
18356
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18357
0
                                                     heap, DYNAMIC_TYPE_METHOD);
18358
0
        (void)heap;
18359
0
        WOLFSSL_ENTER("TLS_client_method_ex");
18360
0
        if (method) {
18361
0
        #if defined(WOLFSSL_TLS13)
18362
0
            InitSSL_Method(method, MakeTLSv1_3());
18363
        #elif !defined(WOLFSSL_NO_TLS12)
18364
            InitSSL_Method(method, MakeTLSv1_2());
18365
        #elif !defined(NO_OLD_TLS)
18366
            InitSSL_Method(method, MakeTLSv1_1());
18367
        #elif defined(WOLFSSL_ALLOW_TLSV10)
18368
            InitSSL_Method(method, MakeTLSv1());
18369
        #else
18370
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
18371
        #endif
18372
18373
0
            method->downgrade = 1;
18374
0
            method->side      = WOLFSSL_CLIENT_END;
18375
0
        }
18376
0
        return method;
18377
0
    }
18378
18379
#ifndef NO_OLD_TLS
18380
    #ifdef WOLFSSL_ALLOW_TLSV10
18381
    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
18382
    {
18383
        return wolfTLSv1_client_method_ex(NULL);
18384
    }
18385
    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
18386
    {
18387
        WOLFSSL_METHOD* method =
18388
                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18389
                                                     heap, DYNAMIC_TYPE_METHOD);
18390
        (void)heap;
18391
        WOLFSSL_ENTER("TLSv1_client_method_ex");
18392
        if (method)
18393
            InitSSL_Method(method, MakeTLSv1());
18394
        return method;
18395
    }
18396
    #endif /* WOLFSSL_ALLOW_TLSV10 */
18397
18398
    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
18399
    {
18400
        return wolfTLSv1_1_client_method_ex(NULL);
18401
    }
18402
    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
18403
    {
18404
        WOLFSSL_METHOD* method =
18405
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18406
                                                     heap, DYNAMIC_TYPE_METHOD);
18407
        (void)heap;
18408
        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
18409
        if (method)
18410
            InitSSL_Method(method, MakeTLSv1_1());
18411
        return method;
18412
    }
18413
#endif /* !NO_OLD_TLS */
18414
18415
#ifndef WOLFSSL_NO_TLS12
18416
    WOLFSSL_ABI
18417
    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
18418
4
    {
18419
4
        return wolfTLSv1_2_client_method_ex(NULL);
18420
4
    }
18421
    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
18422
4
    {
18423
4
        WOLFSSL_METHOD* method =
18424
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18425
4
                                                     heap, DYNAMIC_TYPE_METHOD);
18426
4
        (void)heap;
18427
4
        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
18428
4
        if (method)
18429
4
            InitSSL_Method(method, MakeTLSv1_2());
18430
4
        return method;
18431
4
    }
18432
#endif /* WOLFSSL_NO_TLS12 */
18433
18434
#ifdef WOLFSSL_TLS13
18435
    /* The TLS v1.3 client method data.
18436
     *
18437
     * returns the method data for a TLS v1.3 client.
18438
     */
18439
    WOLFSSL_ABI
18440
    WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
18441
4
    {
18442
4
        return wolfTLSv1_3_client_method_ex(NULL);
18443
4
    }
18444
18445
    /* The TLS v1.3 client method data.
18446
     *
18447
     * heap  The heap used for allocation.
18448
     * returns the method data for a TLS v1.3 client.
18449
     */
18450
    WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
18451
4
    {
18452
4
        WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
18453
4
                                 XMALLOC(sizeof(WOLFSSL_METHOD), heap,
18454
4
                                         DYNAMIC_TYPE_METHOD);
18455
4
        (void)heap;
18456
4
        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
18457
4
        if (method)
18458
4
            InitSSL_Method(method, MakeTLSv1_3());
18459
4
        return method;
18460
4
    }
18461
#endif /* WOLFSSL_TLS13 */
18462
18463
#ifdef WOLFSSL_DTLS
18464
18465
    WOLFSSL_METHOD* wolfDTLS_client_method(void)
18466
    {
18467
        return wolfDTLS_client_method_ex(NULL);
18468
    }
18469
    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
18470
    {
18471
        WOLFSSL_METHOD* method =
18472
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18473
                                                     heap, DYNAMIC_TYPE_METHOD);
18474
        (void)heap;
18475
        WOLFSSL_ENTER("DTLS_client_method_ex");
18476
        if (method) {
18477
        #if defined(WOLFSSL_DTLS13)
18478
            InitSSL_Method(method, MakeDTLSv1_3());
18479
        #elif !defined(WOLFSSL_NO_TLS12)
18480
            InitSSL_Method(method, MakeDTLSv1_2());
18481
        #elif !defined(NO_OLD_TLS)
18482
            InitSSL_Method(method, MakeDTLSv1());
18483
        #else
18484
            #error No DTLS version enabled!
18485
        #endif
18486
18487
            method->downgrade = 1;
18488
            method->side      = WOLFSSL_CLIENT_END;
18489
        }
18490
        return method;
18491
    }
18492
18493
    #ifndef NO_OLD_TLS
18494
    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
18495
    {
18496
        return wolfDTLSv1_client_method_ex(NULL);
18497
    }
18498
    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
18499
    {
18500
        WOLFSSL_METHOD* method =
18501
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18502
                                                 heap, DYNAMIC_TYPE_METHOD);
18503
        (void)heap;
18504
        WOLFSSL_ENTER("DTLSv1_client_method_ex");
18505
        if (method)
18506
            InitSSL_Method(method, MakeDTLSv1());
18507
        return method;
18508
    }
18509
    #endif  /* NO_OLD_TLS */
18510
18511
    #ifndef WOLFSSL_NO_TLS12
18512
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
18513
    {
18514
        return wolfDTLSv1_2_client_method_ex(NULL);
18515
    }
18516
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
18517
    {
18518
        WOLFSSL_METHOD* method =
18519
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18520
                                                 heap, DYNAMIC_TYPE_METHOD);
18521
        (void)heap;
18522
        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
18523
        if (method)
18524
            InitSSL_Method(method, MakeDTLSv1_2());
18525
        (void)heap;
18526
        return method;
18527
    }
18528
    #endif /* !WOLFSSL_NO_TLS12 */
18529
#endif /* WOLFSSL_DTLS */
18530
18531
#endif /* NO_WOLFSSL_CLIENT */
18532
18533
18534
/* EITHER SIDE METHODS */
18535
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
18536
    #ifndef NO_OLD_TLS
18537
    #ifdef WOLFSSL_ALLOW_TLSV10
18538
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
18539
     *
18540
     * Returns a pointer to a WOLFSSL_METHOD struct
18541
     */
18542
    WOLFSSL_METHOD* wolfTLSv1_method(void)
18543
    {
18544
        return wolfTLSv1_method_ex(NULL);
18545
    }
18546
    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
18547
    {
18548
        WOLFSSL_METHOD* m;
18549
        WOLFSSL_ENTER("TLSv1_method");
18550
    #ifndef NO_WOLFSSL_CLIENT
18551
        m = wolfTLSv1_client_method_ex(heap);
18552
    #else
18553
        m = wolfTLSv1_server_method_ex(heap);
18554
    #endif
18555
        if (m != NULL) {
18556
            m->side = WOLFSSL_NEITHER_END;
18557
        }
18558
18559
        return m;
18560
    }
18561
    #endif /* WOLFSSL_ALLOW_TLSV10 */
18562
18563
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
18564
     *
18565
     * Returns a pointer to a WOLFSSL_METHOD struct
18566
     */
18567
    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
18568
    {
18569
        return wolfTLSv1_1_method_ex(NULL);
18570
    }
18571
    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
18572
    {
18573
        WOLFSSL_METHOD* m;
18574
        WOLFSSL_ENTER("TLSv1_1_method");
18575
    #ifndef NO_WOLFSSL_CLIENT
18576
        m = wolfTLSv1_1_client_method_ex(heap);
18577
    #else
18578
        m = wolfTLSv1_1_server_method_ex(heap);
18579
    #endif
18580
        if (m != NULL) {
18581
            m->side = WOLFSSL_NEITHER_END;
18582
        }
18583
        return m;
18584
    }
18585
    #endif /* !NO_OLD_TLS */
18586
18587
    #ifndef WOLFSSL_NO_TLS12
18588
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
18589
     *
18590
     * Returns a pointer to a WOLFSSL_METHOD struct
18591
     */
18592
    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
18593
    {
18594
        return wolfTLSv1_2_method_ex(NULL);
18595
    }
18596
    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
18597
    {
18598
        WOLFSSL_METHOD* m;
18599
        WOLFSSL_ENTER("TLSv1_2_method");
18600
    #ifndef NO_WOLFSSL_CLIENT
18601
        m = wolfTLSv1_2_client_method_ex(heap);
18602
    #else
18603
        m = wolfTLSv1_2_server_method_ex(heap);
18604
    #endif
18605
        if (m != NULL) {
18606
            m->side = WOLFSSL_NEITHER_END;
18607
        }
18608
        return m;
18609
    }
18610
    #endif /* !WOLFSSL_NO_TLS12 */
18611
18612
    #ifdef WOLFSSL_TLS13
18613
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
18614
     *
18615
     * Returns a pointer to a WOLFSSL_METHOD struct
18616
     */
18617
    WOLFSSL_METHOD* wolfTLSv1_3_method(void)
18618
    {
18619
        return wolfTLSv1_3_method_ex(NULL);
18620
    }
18621
    WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
18622
    {
18623
        WOLFSSL_METHOD* m;
18624
        WOLFSSL_ENTER("TLSv1_3_method");
18625
    #ifndef NO_WOLFSSL_CLIENT
18626
        m = wolfTLSv1_3_client_method_ex(heap);
18627
    #else
18628
        m = wolfTLSv1_3_server_method_ex(heap);
18629
    #endif
18630
        if (m != NULL) {
18631
            m->side = WOLFSSL_NEITHER_END;
18632
        }
18633
        return m;
18634
    }
18635
    #endif /* WOLFSSL_TLS13 */
18636
18637
#ifdef WOLFSSL_DTLS
18638
    WOLFSSL_METHOD* wolfDTLS_method(void)
18639
    {
18640
        return wolfDTLS_method_ex(NULL);
18641
    }
18642
    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
18643
    {
18644
        WOLFSSL_METHOD* m;
18645
        WOLFSSL_ENTER("DTLS_method_ex");
18646
    #ifndef NO_WOLFSSL_CLIENT
18647
        m = wolfDTLS_client_method_ex(heap);
18648
    #else
18649
        m = wolfDTLS_server_method_ex(heap);
18650
    #endif
18651
        if (m != NULL) {
18652
            m->side = WOLFSSL_NEITHER_END;
18653
        }
18654
        return m;
18655
    }
18656
18657
    #ifndef NO_OLD_TLS
18658
    WOLFSSL_METHOD* wolfDTLSv1_method(void)
18659
    {
18660
        return wolfDTLSv1_method_ex(NULL);
18661
    }
18662
    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
18663
    {
18664
        WOLFSSL_METHOD* m;
18665
        WOLFSSL_ENTER("DTLSv1_method_ex");
18666
    #ifndef NO_WOLFSSL_CLIENT
18667
        m = wolfDTLSv1_client_method_ex(heap);
18668
    #else
18669
        m = wolfDTLSv1_server_method_ex(heap);
18670
    #endif
18671
        if (m != NULL) {
18672
            m->side = WOLFSSL_NEITHER_END;
18673
        }
18674
        return m;
18675
    }
18676
    #endif /* !NO_OLD_TLS */
18677
    #ifndef WOLFSSL_NO_TLS12
18678
    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
18679
    {
18680
        return wolfDTLSv1_2_method_ex(NULL);
18681
    }
18682
    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
18683
    {
18684
        WOLFSSL_METHOD* m;
18685
        WOLFSSL_ENTER("DTLSv1_2_method");
18686
    #ifndef NO_WOLFSSL_CLIENT
18687
        m = wolfDTLSv1_2_client_method_ex(heap);
18688
    #else
18689
        m = wolfDTLSv1_2_server_method_ex(heap);
18690
    #endif
18691
        if (m != NULL) {
18692
            m->side = WOLFSSL_NEITHER_END;
18693
        }
18694
        return m;
18695
    }
18696
    #endif /* !WOLFSSL_NO_TLS12 */
18697
    #ifdef WOLFSSL_DTLS13
18698
    WOLFSSL_METHOD* wolfDTLSv1_3_method(void)
18699
    {
18700
        return wolfDTLSv1_3_method_ex(NULL);
18701
    }
18702
    WOLFSSL_METHOD* wolfDTLSv1_3_method_ex(void* heap)
18703
    {
18704
        WOLFSSL_METHOD* m;
18705
        WOLFSSL_ENTER("DTLSv1_3_method");
18706
    #ifndef NO_WOLFSSL_CLIENT
18707
        m = wolfDTLSv1_3_client_method_ex(heap);
18708
    #else
18709
        m = wolfDTLSv1_3_server_method_ex(heap);
18710
    #endif
18711
        if (m != NULL) {
18712
            m->side = WOLFSSL_NEITHER_END;
18713
        }
18714
        return m;
18715
    }
18716
    #endif /* WOLFSSL_DTLS13 */
18717
#endif /* WOLFSSL_DTLS */
18718
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
18719
18720
18721
#ifndef NO_WOLFSSL_SERVER
18722
18723
    WOLFSSL_METHOD* wolfTLS_server_method(void)
18724
0
    {
18725
0
        return wolfTLS_server_method_ex(NULL);
18726
0
    }
18727
18728
    WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
18729
0
    {
18730
0
        WOLFSSL_METHOD* method =
18731
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18732
0
                                                     heap, DYNAMIC_TYPE_METHOD);
18733
0
        (void)heap;
18734
0
        WOLFSSL_ENTER("TLS_server_method_ex");
18735
0
        if (method) {
18736
0
        #if defined(WOLFSSL_TLS13)
18737
0
            InitSSL_Method(method, MakeTLSv1_3());
18738
        #elif !defined(WOLFSSL_NO_TLS12)
18739
            InitSSL_Method(method, MakeTLSv1_2());
18740
        #elif !defined(NO_OLD_TLS)
18741
            InitSSL_Method(method, MakeTLSv1_1());
18742
        #elif defined(WOLFSSL_ALLOW_TLSV10)
18743
            InitSSL_Method(method, MakeTLSv1());
18744
        #else
18745
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
18746
        #endif
18747
18748
0
            method->downgrade = 1;
18749
0
            method->side      = WOLFSSL_SERVER_END;
18750
0
        }
18751
0
        return method;
18752
0
    }
18753
18754
#ifndef NO_OLD_TLS
18755
    #ifdef WOLFSSL_ALLOW_TLSV10
18756
    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
18757
    {
18758
        return wolfTLSv1_server_method_ex(NULL);
18759
    }
18760
    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
18761
    {
18762
        WOLFSSL_METHOD* method =
18763
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18764
                                                     heap, DYNAMIC_TYPE_METHOD);
18765
        (void)heap;
18766
        WOLFSSL_ENTER("TLSv1_server_method_ex");
18767
        if (method) {
18768
            InitSSL_Method(method, MakeTLSv1());
18769
            method->side = WOLFSSL_SERVER_END;
18770
        }
18771
        return method;
18772
    }
18773
    #endif /* WOLFSSL_ALLOW_TLSV10 */
18774
18775
    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
18776
    {
18777
        return wolfTLSv1_1_server_method_ex(NULL);
18778
    }
18779
    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
18780
    {
18781
        WOLFSSL_METHOD* method =
18782
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18783
                                                     heap, DYNAMIC_TYPE_METHOD);
18784
        (void)heap;
18785
        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
18786
        if (method) {
18787
            InitSSL_Method(method, MakeTLSv1_1());
18788
            method->side = WOLFSSL_SERVER_END;
18789
        }
18790
        return method;
18791
    }
18792
#endif /* !NO_OLD_TLS */
18793
18794
18795
#ifndef WOLFSSL_NO_TLS12
18796
    WOLFSSL_ABI
18797
    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
18798
5.30k
    {
18799
5.30k
        return wolfTLSv1_2_server_method_ex(NULL);
18800
5.30k
    }
18801
    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
18802
5.30k
    {
18803
5.30k
        WOLFSSL_METHOD* method =
18804
5.30k
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18805
5.30k
                                                     heap, DYNAMIC_TYPE_METHOD);
18806
5.30k
        (void)heap;
18807
5.30k
        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
18808
5.30k
        if (method) {
18809
5.30k
            InitSSL_Method(method, MakeTLSv1_2());
18810
5.30k
            method->side = WOLFSSL_SERVER_END;
18811
5.30k
        }
18812
5.30k
        return method;
18813
5.30k
    }
18814
#endif /* !WOLFSSL_NO_TLS12 */
18815
18816
#ifdef WOLFSSL_TLS13
18817
    /* The TLS v1.3 server method data.
18818
     *
18819
     * returns the method data for a TLS v1.3 server.
18820
     */
18821
    WOLFSSL_ABI
18822
    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
18823
4
    {
18824
4
        return wolfTLSv1_3_server_method_ex(NULL);
18825
4
    }
18826
18827
    /* The TLS v1.3 server method data.
18828
     *
18829
     * heap  The heap used for allocation.
18830
     * returns the method data for a TLS v1.3 server.
18831
     */
18832
    WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
18833
4
    {
18834
4
        WOLFSSL_METHOD* method =
18835
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18836
4
                                                     heap, DYNAMIC_TYPE_METHOD);
18837
4
        (void)heap;
18838
4
        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
18839
4
        if (method) {
18840
4
            InitSSL_Method(method, MakeTLSv1_3());
18841
4
            method->side = WOLFSSL_SERVER_END;
18842
4
        }
18843
4
        return method;
18844
4
    }
18845
#endif /* WOLFSSL_TLS13 */
18846
18847
#ifdef WOLFSSL_DTLS
18848
    WOLFSSL_METHOD* wolfDTLS_server_method(void)
18849
    {
18850
        return wolfDTLS_server_method_ex(NULL);
18851
    }
18852
    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
18853
    {
18854
        WOLFSSL_METHOD* method =
18855
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18856
                                                     heap, DYNAMIC_TYPE_METHOD);
18857
        (void)heap;
18858
        WOLFSSL_ENTER("DTLS_server_method_ex");
18859
        if (method) {
18860
        #if defined(WOLFSSL_DTLS13)
18861
            InitSSL_Method(method, MakeDTLSv1_3());
18862
        #elif !defined(WOLFSSL_NO_TLS12)
18863
            InitSSL_Method(method, MakeDTLSv1_2());
18864
        #elif !defined(NO_OLD_TLS)
18865
            InitSSL_Method(method, MakeDTLSv1());
18866
        #else
18867
            #error No DTLS version enabled!
18868
        #endif
18869
18870
            method->downgrade = 1;
18871
            method->side      = WOLFSSL_SERVER_END;
18872
        }
18873
        return method;
18874
    }
18875
18876
    #ifndef NO_OLD_TLS
18877
    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
18878
    {
18879
        return wolfDTLSv1_server_method_ex(NULL);
18880
    }
18881
    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
18882
    {
18883
        WOLFSSL_METHOD* method =
18884
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18885
                                                 heap, DYNAMIC_TYPE_METHOD);
18886
        (void)heap;
18887
        WOLFSSL_ENTER("DTLSv1_server_method_ex");
18888
        if (method) {
18889
            InitSSL_Method(method, MakeDTLSv1());
18890
            method->side = WOLFSSL_SERVER_END;
18891
        }
18892
        return method;
18893
    }
18894
    #endif /* !NO_OLD_TLS */
18895
18896
    #ifndef WOLFSSL_NO_TLS12
18897
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
18898
    {
18899
        return wolfDTLSv1_2_server_method_ex(NULL);
18900
    }
18901
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
18902
    {
18903
        WOLFSSL_METHOD* method =
18904
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
18905
                                                 heap, DYNAMIC_TYPE_METHOD);
18906
        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
18907
        (void)heap;
18908
        if (method) {
18909
            InitSSL_Method(method, MakeDTLSv1_2());
18910
            method->side = WOLFSSL_SERVER_END;
18911
        }
18912
        (void)heap;
18913
        return method;
18914
    }
18915
    #endif /* !WOLFSSL_NO_TLS12 */
18916
#endif /* WOLFSSL_DTLS */
18917
18918
#endif /* NO_WOLFSSL_SERVER */
18919
18920
#endif /* NO_TLS */
18921
18922
#endif /* WOLFCRYPT_ONLY */