Coverage Report

Created: 2026-02-14 07:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-normal-math/src/tls.c
Line
Count
Source
1
/* tls.c
2
 *
3
 * Copyright (C) 2006-2025 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
#include <wolfssl/wolfcrypt/libwolfssl_sources.h>
23
24
#ifndef WOLFCRYPT_ONLY
25
26
#include <wolfssl/ssl.h>
27
#include <wolfssl/internal.h>
28
#include <wolfssl/error-ssl.h>
29
#include <wolfssl/wolfcrypt/hash.h>
30
#include <wolfssl/wolfcrypt/hmac.h>
31
#include <wolfssl/wolfcrypt/kdf.h>
32
#ifdef NO_INLINE
33
    #include <wolfssl/wolfcrypt/misc.h>
34
#else
35
    #define WOLFSSL_MISC_INCLUDED
36
    #include <wolfcrypt/src/misc.c>
37
#endif
38
39
#ifdef HAVE_CURVE25519
40
    #include <wolfssl/wolfcrypt/curve25519.h>
41
#endif
42
#ifdef HAVE_CURVE448
43
    #include <wolfssl/wolfcrypt/curve448.h>
44
#endif
45
#ifdef WOLFSSL_HAVE_MLKEM
46
    #include <wolfssl/wolfcrypt/mlkem.h>
47
#ifdef WOLFSSL_WC_MLKEM
48
    #include <wolfssl/wolfcrypt/wc_mlkem.h>
49
#elif defined(HAVE_LIBOQS)
50
    #include <wolfssl/wolfcrypt/ext_mlkem.h>
51
#endif
52
#endif
53
54
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
55
    #include <wolfssl/wolfcrypt/port/Renesas/renesas_tsip_internal.h>
56
#endif
57
58
#include <wolfssl/wolfcrypt/hpke.h>
59
60
#ifndef NO_TLS
61
62
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
63
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap);
64
#endif
65
66
#ifdef HAVE_SUPPORTED_CURVES
67
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions);
68
#endif
69
70
/* Digest enable checks */
71
#ifdef NO_OLD_TLS /* TLS 1.2 only */
72
    #if defined(NO_SHA256) && !defined(WOLFSSL_SHA384) && \
73
            !defined(WOLFSSL_SHA512)
74
        #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
75
    #endif
76
#else  /* TLS 1.1 or older */
77
    #if defined(NO_MD5) && defined(NO_SHA)
78
        #error Must have SHA1 and MD5 enabled for old TLS
79
    #endif
80
#endif
81
82
#ifdef WOLFSSL_TLS13
83
    #if !defined(NO_DH) && \
84
        !defined(HAVE_FFDHE_2048) && !defined(HAVE_FFDHE_3072) && \
85
        !defined(HAVE_FFDHE_4096) && !defined(HAVE_FFDHE_6144) && \
86
        !defined(HAVE_FFDHE_8192)
87
        #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
88
    #endif
89
    #if !defined(NO_RSA) && !defined(WC_RSA_PSS)
90
        #error The build option WC_RSA_PSS is required for TLS 1.3 with RSA
91
    #endif
92
    #ifndef HAVE_TLS_EXTENSIONS
93
        #ifndef _MSC_VER
94
            #error "The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3"
95
        #else
96
            #pragma message("Error: The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3")
97
        #endif
98
    #endif
99
#endif
100
101
/* Warn if secrets logging is enabled */
102
#if (defined(SHOW_SECRETS) || defined(WOLFSSL_SSLKEYLOGFILE)) && \
103
    !defined(WOLFSSL_KEYLOG_EXPORT_WARNED)
104
    #ifndef _MSC_VER
105
        #warning The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment
106
    #else
107
        #pragma message("Warning: The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment")
108
    #endif
109
#endif
110
111
#ifndef WOLFSSL_NO_TLS12
112
113
#ifdef WOLFSSL_SHA384
114
991
    #define HSHASH_SZ WC_SHA384_DIGEST_SIZE
115
#else
116
    #define HSHASH_SZ FINISHED_SZ
117
#endif
118
119
int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
120
0
{
121
0
    int ret = 0;
122
0
    word32 hashSz = FINISHED_SZ;
123
124
0
    if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
125
0
        return BAD_FUNC_ARG;
126
127
    /* for constant timing perform these even if error */
128
#ifndef NO_OLD_TLS
129
    ret |= wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
130
    ret |= wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
131
#endif
132
133
0
    if (IsAtLeastTLSv1_2(ssl)) {
134
0
#ifndef NO_SHA256
135
0
        if (ssl->specs.mac_algorithm <= sha256_mac ||
136
0
            ssl->specs.mac_algorithm == blake2b_mac) {
137
0
            ret |= wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
138
0
            hashSz = WC_SHA256_DIGEST_SIZE;
139
0
        }
140
0
#endif
141
0
#ifdef WOLFSSL_SHA384
142
0
        if (ssl->specs.mac_algorithm == sha384_mac) {
143
0
            ret |= wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
144
0
            hashSz = WC_SHA384_DIGEST_SIZE;
145
0
        }
146
0
#endif
147
0
#ifdef WOLFSSL_SM3
148
0
        if (ssl->specs.mac_algorithm == sm3_mac) {
149
0
            ret |= wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
150
0
            hashSz = WC_SM3_DIGEST_SIZE;
151
0
        }
152
0
#endif
153
0
    }
154
155
0
    *hashLen = hashSz;
156
#ifdef WOLFSSL_CHECK_MEM_ZERO
157
     wc_MemZero_Add("TLS handshake hash", hash, hashSz);
158
#endif
159
160
0
    if (ret != 0) {
161
0
        ret = BUILD_MSG_ERROR;
162
0
        WOLFSSL_ERROR_VERBOSE(ret);
163
0
    }
164
165
0
    return ret;
166
0
}
167
168
169
int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
170
960
{
171
960
    int ret;
172
960
    const byte* side = NULL;
173
960
    word32 hashSz = HSHASH_SZ;
174
960
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
175
960
    byte handshake_hash[HSHASH_SZ];
176
#else
177
    byte* handshake_hash = NULL;
178
    handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap, DYNAMIC_TYPE_DIGEST);
179
    if (handshake_hash == NULL)
180
        return MEMORY_E;
181
#endif
182
183
960
    XMEMSET(handshake_hash, 0, HSHASH_SZ);
184
960
    ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
185
960
    if (ret == 0) {
186
948
        if (XSTRNCMP((const char*)sender, (const char*)kTlsClientStr,
187
948
                                                          SIZEOF_SENDER) == 0) {
188
716
            side = kTlsClientFinStr;
189
716
        }
190
232
        else if (XSTRNCMP((const char*)sender, (const char*)kTlsServerStr,
191
232
                                                          SIZEOF_SENDER) == 0) {
192
232
            side = kTlsServerFinStr;
193
232
        }
194
0
        else {
195
0
            ret = BAD_FUNC_ARG;
196
0
            WOLFSSL_MSG("Unexpected sender value");
197
0
        }
198
948
    }
199
200
960
    if (ret == 0) {
201
948
#ifdef WOLFSSL_HAVE_PRF
202
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
203
        if (ssl->ctx->TlsFinishedCb) {
204
            void* ctx = wolfSSL_GetTlsFinishedCtx(ssl);
205
            ret = ssl->ctx->TlsFinishedCb(ssl, side, handshake_hash, hashSz,
206
                                          (byte*)hashes, ctx);
207
        }
208
        if (!ssl->ctx->TlsFinishedCb ||
209
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
210
#endif
211
948
        {
212
948
            PRIVATE_KEY_UNLOCK();
213
948
            ret = wc_PRF_TLS((byte*)hashes, TLS_FINISHED_SZ,
214
948
                      ssl->arrays->masterSecret, SECRET_LEN, side,
215
948
                      FINISHED_LABEL_SZ, handshake_hash, hashSz,
216
948
                      IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
217
948
                      ssl->heap, ssl->devId);
218
948
            PRIVATE_KEY_LOCK();
219
948
        }
220
948
        ForceZero(handshake_hash, hashSz);
221
#else
222
        /* Pseudo random function must be enabled in the configuration. */
223
        ret = PRF_MISSING;
224
        WOLFSSL_ERROR_VERBOSE(ret);
225
        WOLFSSL_MSG("Pseudo-random function is not enabled");
226
227
        (void)side;
228
        (void)hashes;
229
#endif
230
948
    }
231
232
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
233
    XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
234
#elif defined(WOLFSSL_CHECK_MEM_ZERO)
235
    wc_MemZero_Check(handshake_hash, HSHASH_SZ);
236
#endif
237
238
960
    return ret;
239
960
}
240
241
#endif /* !WOLFSSL_NO_TLS12 */
242
243
#ifndef NO_OLD_TLS
244
245
#ifdef WOLFSSL_ALLOW_TLSV10
246
ProtocolVersion MakeTLSv1(void)
247
{
248
    ProtocolVersion pv;
249
    pv.major = SSLv3_MAJOR;
250
    pv.minor = TLSv1_MINOR;
251
252
    return pv;
253
}
254
#endif /* WOLFSSL_ALLOW_TLSV10 */
255
256
257
ProtocolVersion MakeTLSv1_1(void)
258
{
259
    ProtocolVersion pv;
260
    pv.major = SSLv3_MAJOR;
261
    pv.minor = TLSv1_1_MINOR;
262
263
    return pv;
264
}
265
266
#endif /* !NO_OLD_TLS */
267
268
269
#ifndef WOLFSSL_NO_TLS12
270
271
ProtocolVersion MakeTLSv1_2(void)
272
4.79k
{
273
4.79k
    ProtocolVersion pv;
274
4.79k
    pv.major = SSLv3_MAJOR;
275
4.79k
    pv.minor = TLSv1_2_MINOR;
276
277
4.79k
    return pv;
278
4.79k
}
279
280
#endif /* !WOLFSSL_NO_TLS12 */
281
282
#ifdef WOLFSSL_TLS13
283
/* The TLS v1.3 protocol version.
284
 *
285
 * returns the protocol version data for TLS v1.3.
286
 */
287
ProtocolVersion MakeTLSv1_3(void)
288
8
{
289
8
    ProtocolVersion pv;
290
8
    pv.major = SSLv3_MAJOR;
291
8
    pv.minor = TLSv1_3_MINOR;
292
293
8
    return pv;
294
8
}
295
#endif
296
297
#if defined(HAVE_SUPPORTED_CURVES)
298
/* Sets the key exchange groups in rank order on a context.
299
 *
300
 * ctx     SSL/TLS context object.
301
 * groups  Array of groups.
302
 * count   Number of groups in array.
303
 * returns BAD_FUNC_ARG when ctx or groups is NULL, not using TLS v1.3 or
304
 * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success.
305
 */
306
int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count)
307
0
{
308
0
    int ret, i;
309
310
0
    WOLFSSL_ENTER("wolfSSL_CTX_set_groups");
311
0
    if (ctx == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT)
312
0
        return BAD_FUNC_ARG;
313
0
    if (!IsTLS_ex(ctx->method->version))
314
0
        return BAD_FUNC_ARG;
315
316
0
    #ifdef WOLFSSL_TLS13
317
0
    ctx->numGroups = 0;
318
0
    #endif
319
0
    #if !defined(NO_TLS)
320
0
    TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
321
0
    #endif /* !NO_TLS */
322
0
    for (i = 0; i < count; i++) {
323
        /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups
324
         * are valid */
325
0
        if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, (word16)groups[i]))
326
0
                != WOLFSSL_SUCCESS) {
327
0
    #if !defined(NO_TLS)
328
0
            TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
329
0
    #endif /* !NO_TLS */
330
0
            return ret;
331
0
        }
332
0
        #ifdef WOLFSSL_TLS13
333
0
        ctx->group[i] = (word16)groups[i];
334
0
        #endif
335
0
    }
336
0
    #ifdef WOLFSSL_TLS13
337
0
    ctx->numGroups = (byte)count;
338
0
    #endif
339
340
0
    return WOLFSSL_SUCCESS;
341
0
}
342
343
/* Sets the key exchange groups in rank order.
344
 *
345
 * ssl     SSL/TLS object.
346
 * groups  Array of groups.
347
 * count   Number of groups in array.
348
 * returns BAD_FUNC_ARG when ssl or groups is NULL, not using TLS v1.3 or
349
 * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success.
350
 */
351
int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count)
352
0
{
353
0
    int ret, i;
354
355
0
    WOLFSSL_ENTER("wolfSSL_set_groups");
356
0
    if (ssl == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT)
357
0
        return BAD_FUNC_ARG;
358
0
    if (!IsTLS_ex(ssl->version))
359
0
        return BAD_FUNC_ARG;
360
361
0
    #ifdef WOLFSSL_TLS13
362
0
    ssl->numGroups = 0;
363
0
    #endif
364
0
    #if !defined(NO_TLS)
365
0
    TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
366
0
    #endif /* !NO_TLS */
367
0
    for (i = 0; i < count; i++) {
368
        /* Call to wolfSSL_UseSupportedCurve also checks if input groups
369
                 * are valid */
370
0
        if ((ret = wolfSSL_UseSupportedCurve(ssl, (word16)groups[i]))
371
0
                != WOLFSSL_SUCCESS) {
372
0
    #if !defined(NO_TLS)
373
0
            TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
374
0
    #endif /* !NO_TLS */
375
0
            return ret;
376
0
        }
377
0
        #ifdef WOLFSSL_TLS13
378
0
        ssl->group[i] = (word16)groups[i];
379
0
        #endif
380
0
    }
381
0
    #ifdef WOLFSSL_TLS13
382
0
    ssl->numGroups = (byte)count;
383
0
    #endif
384
385
0
    return WOLFSSL_SUCCESS;
386
0
}
387
#endif /* HAVE_SUPPORTED_CURVES */
388
389
#ifndef WOLFSSL_NO_TLS12
390
391
#ifdef HAVE_EXTENDED_MASTER
392
static const byte ext_master_label[EXT_MASTER_LABEL_SZ + 1] =
393
                                                      "extended master secret";
394
#endif
395
static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
396
static const byte key_label   [KEY_LABEL_SZ + 1]    = "key expansion";
397
398
static int _DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
399
                         const byte* ms, word32 msLen,
400
                         const byte* sr, const byte* cr,
401
                         int tls1_2, int hash_type,
402
                         void* heap, int devId)
403
1.24k
{
404
1.24k
    int ret;
405
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
406
    byte* seed = NULL;
407
    seed = (byte*)XMALLOC(SEED_LEN, heap, DYNAMIC_TYPE_SEED);
408
    if (seed == NULL)
409
        return MEMORY_E;
410
#else
411
1.24k
    byte seed[SEED_LEN];
412
1.24k
#endif
413
414
1.24k
    XMEMCPY(seed,           sr, RAN_LEN);
415
1.24k
    XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
416
417
1.24k
#ifdef WOLFSSL_HAVE_PRF
418
1.24k
    PRIVATE_KEY_UNLOCK();
419
1.24k
    ret = wc_PRF_TLS(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
420
1.24k
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
421
1.24k
    PRIVATE_KEY_LOCK();
422
#else
423
    /* Pseudo random function must be enabled in the configuration. */
424
    ret = PRF_MISSING;
425
    WOLFSSL_ERROR_VERBOSE(ret);
426
    WOLFSSL_MSG("Pseudo-random function is not enabled");
427
428
    (void)key_dig;
429
    (void)key_dig_len;
430
    (void)ms;
431
    (void)msLen;
432
    (void)tls1_2;
433
    (void)hash_type;
434
    (void)heap;
435
    (void)devId;
436
    (void)key_label;
437
    (void)master_label;
438
#ifdef HAVE_EXTENDED_MASTER
439
    (void)ext_master_label;
440
#endif
441
#endif
442
443
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
444
    XFREE(seed, heap, DYNAMIC_TYPE_SEED);
445
#endif
446
447
1.24k
    return ret;
448
1.24k
}
449
450
/* External facing wrapper so user can call as well, 0 on success */
451
int wolfSSL_DeriveTlsKeys(byte* key_data, word32 keyLen,
452
                         const byte* ms, word32 msLen,
453
                         const byte* sr, const byte* cr,
454
                         int tls1_2, int hash_type)
455
0
{
456
0
    return _DeriveTlsKeys(key_data, keyLen, ms, msLen, sr, cr, tls1_2,
457
0
        hash_type, NULL, INVALID_DEVID);
458
0
}
459
460
461
int DeriveTlsKeys(WOLFSSL* ssl)
462
1.24k
{
463
1.24k
    int   ret;
464
1.24k
    int   key_dig_len = 2 * ssl->specs.hash_size +
465
1.24k
                        2 * ssl->specs.key_size  +
466
1.24k
                        2 * ssl->specs.iv_size;
467
1.24k
    WC_DECLARE_VAR(key_dig, byte, MAX_PRF_DIG, 0);
468
469
1.24k
    WC_ALLOC_VAR_EX(key_dig, byte, MAX_PRF_DIG, ssl->heap,
470
1.24k
        DYNAMIC_TYPE_DIGEST, return MEMORY_E);
471
472
1.24k
    XMEMSET(key_dig, 0, MAX_PRF_DIG);
473
474
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
475
    ret = PROTOCOLCB_UNAVAILABLE;
476
    if (ssl->ctx->GenSessionKeyCb) {
477
        void* ctx = wolfSSL_GetGenSessionKeyCtx(ssl);
478
        ret = ssl->ctx->GenSessionKeyCb(ssl, ctx);
479
    }
480
    if (!ssl->ctx->GenSessionKeyCb ||
481
        ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
482
#endif
483
1.24k
    ret = _DeriveTlsKeys(key_dig, (word32)key_dig_len,
484
1.24k
                     ssl->arrays->masterSecret, SECRET_LEN,
485
1.24k
                     ssl->arrays->serverRandom, ssl->arrays->clientRandom,
486
1.24k
                     IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
487
1.24k
                     ssl->heap, ssl->devId);
488
1.24k
    if (ret == 0)
489
1.20k
        ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
490
491
1.24k
    WC_FREE_VAR_EX(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
492
493
1.24k
    return ret;
494
1.24k
}
495
496
static int _MakeTlsMasterSecret(byte* ms, word32 msLen,
497
                               const byte* pms, word32 pmsLen,
498
                               const byte* cr, const byte* sr,
499
                               int tls1_2, int hash_type,
500
                               void* heap, int devId)
501
1.25k
{
502
1.25k
    int ret;
503
1.25k
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
504
1.25k
    byte seed[SEED_LEN];
505
#else
506
    byte* seed = NULL;
507
    seed = (byte*)XMALLOC(SEED_LEN, heap, DYNAMIC_TYPE_SEED);
508
    if (seed == NULL)
509
        return MEMORY_E;
510
#endif
511
512
1.25k
    XMEMCPY(seed,           cr, RAN_LEN);
513
1.25k
    XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
514
515
1.25k
#ifdef WOLFSSL_HAVE_PRF
516
1.25k
    PRIVATE_KEY_UNLOCK();
517
1.25k
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
518
1.25k
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
519
1.25k
    PRIVATE_KEY_LOCK();
520
#else
521
    /* Pseudo random function must be enabled in the configuration. */
522
    ret = PRF_MISSING;
523
    WOLFSSL_MSG("Pseudo-random function is not enabled");
524
525
    (void)ms;
526
    (void)msLen;
527
    (void)pms;
528
    (void)pmsLen;
529
    (void)tls1_2;
530
    (void)hash_type;
531
    (void)heap;
532
    (void)devId;
533
#endif
534
535
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
536
    XFREE(seed, heap, DYNAMIC_TYPE_SEED);
537
#endif
538
539
1.25k
    return ret;
540
1.25k
}
541
542
/* External facing wrapper so user can call as well, 0 on success */
543
int wolfSSL_MakeTlsMasterSecret(byte* ms, word32 msLen,
544
                               const byte* pms, word32 pmsLen,
545
                               const byte* cr, const byte* sr,
546
                               int tls1_2, int hash_type)
547
0
{
548
0
    return _MakeTlsMasterSecret(ms, msLen, pms, pmsLen, cr, sr, tls1_2,
549
0
        hash_type, NULL, INVALID_DEVID);
550
0
}
551
552
553
#ifdef HAVE_EXTENDED_MASTER
554
555
static int _MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
556
                                        const byte* pms, word32 pmsLen,
557
                                        const byte* sHash, word32 sHashLen,
558
                                        int tls1_2, int hash_type,
559
                                        void* heap, int devId)
560
31
{
561
31
    int ret;
562
563
31
#ifdef WOLFSSL_HAVE_PRF
564
31
    PRIVATE_KEY_UNLOCK();
565
31
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
566
31
               sHash, sHashLen, tls1_2, hash_type, heap, devId);
567
31
    PRIVATE_KEY_LOCK();
568
#else
569
    /* Pseudo random function must be enabled in the configuration. */
570
    ret = PRF_MISSING;
571
    WOLFSSL_MSG("Pseudo-random function is not enabled");
572
573
    (void)ms;
574
    (void)msLen;
575
    (void)pms;
576
    (void)pmsLen;
577
    (void)sHash;
578
    (void)sHashLen;
579
    (void)tls1_2;
580
    (void)hash_type;
581
    (void)heap;
582
    (void)devId;
583
#endif
584
31
    return ret;
585
31
}
586
587
/* External facing wrapper so user can call as well, 0 on success */
588
int wolfSSL_MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
589
                                        const byte* pms, word32 pmsLen,
590
                                        const byte* sHash, word32 sHashLen,
591
                                        int tls1_2, int hash_type)
592
0
{
593
0
    return _MakeTlsExtendedMasterSecret(ms, msLen, pms, pmsLen, sHash, sHashLen,
594
0
        tls1_2, hash_type, NULL, INVALID_DEVID);
595
0
}
596
597
#endif /* HAVE_EXTENDED_MASTER */
598
599
600
int MakeTlsMasterSecret(WOLFSSL* ssl)
601
1.28k
{
602
1.28k
    int ret;
603
604
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
605
    /* If this is called from a sniffer session with keylog file support, obtain
606
     * the master secret from the callback */
607
    if (ssl->snifferSecretCb != NULL) {
608
        ret = ssl->snifferSecretCb(ssl->arrays->clientRandom,
609
                                   SNIFFER_SECRET_TLS12_MASTER_SECRET,
610
                                   ssl->arrays->masterSecret);
611
        if (ret != 0) {
612
            return ret;
613
        }
614
        ret = DeriveTlsKeys(ssl);
615
        return ret;
616
    }
617
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
618
619
1.28k
#ifdef HAVE_EXTENDED_MASTER
620
1.28k
    if (ssl->options.haveEMS) {
621
31
        word32 hashSz = HSHASH_SZ;
622
31
    #ifdef WOLFSSL_SMALL_STACK
623
31
        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
624
31
                                              DYNAMIC_TYPE_DIGEST);
625
31
        if (handshake_hash == NULL)
626
0
            return MEMORY_E;
627
    #else
628
        byte handshake_hash[HSHASH_SZ];
629
    #endif
630
631
31
        XMEMSET(handshake_hash, 0, HSHASH_SZ);
632
31
        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
633
31
        if (ret == 0) {
634
        #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
635
            ret = PROTOCOLCB_UNAVAILABLE;
636
            if (ssl->ctx->GenExtMasterCb) {
637
                void* ctx = wolfSSL_GetGenExtMasterSecretCtx(ssl);
638
                ret = ssl->ctx->GenExtMasterCb(ssl, handshake_hash, hashSz,
639
                                                ctx);
640
            }
641
            if (!ssl->ctx->GenExtMasterCb ||
642
                ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
643
        #endif /* (HAVE_SECRET_CALLBACK) && (HAVE_EXT_SECRET_CALLBACK) */
644
31
            {
645
31
                ret = _MakeTlsExtendedMasterSecret(
646
31
                    ssl->arrays->masterSecret, SECRET_LEN,
647
31
                    ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
648
31
                    handshake_hash, hashSz,
649
31
                    IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
650
31
                    ssl->heap, ssl->devId);
651
31
            }
652
31
            ForceZero(handshake_hash, hashSz);
653
31
        }
654
655
31
    #ifdef WOLFSSL_SMALL_STACK
656
31
        XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
657
    #elif defined(WOLFSSL_CHECK_MEM_ZERO)
658
        wc_MemZero_Check(handshake_hash, HSHASH_SZ);
659
    #endif
660
31
    }
661
1.25k
    else
662
1.25k
#endif /* HAVE_EXTENDED_MASTER */
663
1.25k
    {
664
665
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
666
        ret = PROTOCOLCB_UNAVAILABLE;
667
        if (ssl->ctx->GenMasterCb) {
668
            void* ctx = wolfSSL_GetGenMasterSecretCtx(ssl);
669
            ret = ssl->ctx->GenMasterCb(ssl, ctx);
670
        }
671
        if (!ssl->ctx->GenMasterCb ||
672
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
673
#endif
674
1.25k
        {
675
1.25k
            ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret,
676
1.25k
                      SECRET_LEN, ssl->arrays->preMasterSecret,
677
1.25k
                      ssl->arrays->preMasterSz, ssl->arrays->clientRandom,
678
1.25k
                      ssl->arrays->serverRandom, IsAtLeastTLSv1_2(ssl),
679
1.25k
                      ssl->specs.mac_algorithm, ssl->heap, ssl->devId);
680
1.25k
        }
681
1.25k
    }
682
#ifdef HAVE_SECRET_CALLBACK
683
    if (ret == 0 && ssl->tlsSecretCb != NULL) {
684
        ret = ssl->tlsSecretCb(ssl, ssl->arrays->masterSecret,
685
                SECRET_LEN, ssl->tlsSecretCtx);
686
    }
687
#endif /* HAVE_SECRET_CALLBACK */
688
1.28k
    if (ret == 0) {
689
1.24k
        ret = DeriveTlsKeys(ssl);
690
1.24k
    }
691
692
1.28k
    return ret;
693
1.28k
}
694
695
696
/* Used by EAP-TLS and EAP-TTLS to derive keying material from
697
 * the master_secret. */
698
int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* key, unsigned int len,
699
                                                              const char* label)
700
0
{
701
0
    int   ret;
702
0
    WC_DECLARE_VAR(seed, byte, SEED_LEN, 0);
703
704
0
    WC_ALLOC_VAR_EX(seed, byte, SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED,
705
0
        return MEMORY_E);
706
707
    /*
708
     * As per RFC-5281, the order of the client and server randoms is reversed
709
     * from that used by the TLS protocol to derive keys.
710
     */
711
0
    XMEMCPY(seed,           ssl->arrays->clientRandom, RAN_LEN);
712
0
    XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
713
714
0
#ifdef WOLFSSL_HAVE_PRF
715
0
    PRIVATE_KEY_UNLOCK();
716
0
    ret = wc_PRF_TLS((byte*)key, len, ssl->arrays->masterSecret, SECRET_LEN,
717
0
              (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
718
0
              IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
719
0
              ssl->heap, ssl->devId);
720
0
    PRIVATE_KEY_LOCK();
721
#else
722
    /* Pseudo random function must be enabled in the configuration. */
723
    ret = PRF_MISSING;
724
    WOLFSSL_MSG("Pseudo-random function is not enabled");
725
726
    (void)key;
727
    (void)len;
728
    (void)label;
729
#endif
730
731
0
    WC_FREE_VAR_EX(seed, ssl->heap, DYNAMIC_TYPE_SEED);
732
733
0
    return ret;
734
0
}
735
736
/* return HMAC digest type in wolfSSL format */
737
int wolfSSL_GetHmacType(WOLFSSL* ssl)
738
775
{
739
775
    if (ssl == NULL)
740
0
        return BAD_FUNC_ARG;
741
742
775
    return wolfSSL_GetHmacType_ex(&ssl->specs);
743
775
}
744
745
746
int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
747
                           int verify)
748
{
749
    if (ssl == NULL || inner == NULL)
750
        return BAD_FUNC_ARG;
751
752
    if (content == dtls12_cid
753
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
754
       || (ssl->options.dtls && DtlsGetCidTxSize(ssl) > 0)
755
#endif
756
    ) {
757
        WOLFSSL_MSG("wolfSSL_SetTlsHmacInner doesn't support CID");
758
        return BAD_FUNC_ARG;
759
    }
760
761
    XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
762
763
    WriteSEQ(ssl, verify, inner);
764
    inner[SEQ_SZ] = (byte)content;
765
    inner[SEQ_SZ + ENUM_LEN]            = ssl->version.major;
766
    inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
767
    c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
768
769
    return 0;
770
}
771
772
773
#ifndef WOLFSSL_AEAD_ONLY
774
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
775
    !defined(HAVE_SELFTEST)
776
777
/* Update the hash in the HMAC.
778
 *
779
 * hmac  HMAC object.
780
 * data  Data to be hashed.
781
 * sz    Size of data to hash.
782
 * returns 0 on success, otherwise failure.
783
 */
784
static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz)
785
0
{
786
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
787
788
0
    switch (hmac->macType) {
789
0
    #ifndef NO_SHA
790
0
        case WC_SHA:
791
0
            ret = wc_ShaUpdate(&hmac->hash.sha, data, sz);
792
0
            break;
793
0
    #endif /* !NO_SHA */
794
795
0
    #ifndef NO_SHA256
796
0
        case WC_SHA256:
797
0
            ret = wc_Sha256Update(&hmac->hash.sha256, data, sz);
798
0
            break;
799
0
    #endif /* !NO_SHA256 */
800
801
0
    #ifdef WOLFSSL_SHA384
802
0
        case WC_SHA384:
803
0
            ret = wc_Sha384Update(&hmac->hash.sha384, data, sz);
804
0
            break;
805
0
    #endif /* WOLFSSL_SHA384 */
806
807
0
    #ifdef WOLFSSL_SHA512
808
0
        case WC_SHA512:
809
0
            ret = wc_Sha512Update(&hmac->hash.sha512, data, sz);
810
0
            break;
811
0
    #endif /* WOLFSSL_SHA512 */
812
813
0
    #ifdef WOLFSSL_SM3
814
0
        case WC_SM3:
815
0
            ret = wc_Sm3Update(&hmac->hash.sm3, data, sz);
816
0
            break;
817
0
    #endif /* WOLFSSL_SM3 */
818
819
0
        default:
820
0
            ret = BAD_FUNC_ARG;
821
0
            break;
822
0
    }
823
824
0
    return ret;
825
0
}
826
827
/* Finalize the hash but don't put the EOC, padding or length in.
828
 *
829
 * hmac  HMAC object.
830
 * hash  Hash result.
831
 * returns 0 on success, otherwise failure.
832
 */
833
static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash)
834
0
{
835
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
836
837
0
    switch (hmac->macType) {
838
0
    #ifndef NO_SHA
839
0
        case WC_SHA:
840
0
            ret = wc_ShaFinalRaw(&hmac->hash.sha, hash);
841
0
            break;
842
0
    #endif /* !NO_SHA */
843
844
0
    #ifndef NO_SHA256
845
0
        case WC_SHA256:
846
0
            ret = wc_Sha256FinalRaw(&hmac->hash.sha256, hash);
847
0
            break;
848
0
    #endif /* !NO_SHA256 */
849
850
0
    #ifdef WOLFSSL_SHA384
851
0
        case WC_SHA384:
852
0
            ret = wc_Sha384FinalRaw(&hmac->hash.sha384, hash);
853
0
            break;
854
0
    #endif /* WOLFSSL_SHA384 */
855
856
0
    #ifdef WOLFSSL_SHA512
857
0
        case WC_SHA512:
858
0
            ret = wc_Sha512FinalRaw(&hmac->hash.sha512, hash);
859
0
            break;
860
0
    #endif /* WOLFSSL_SHA512 */
861
862
0
    #ifdef WOLFSSL_SM3
863
0
        case WC_SM3:
864
0
            ret = wc_Sm3FinalRaw(&hmac->hash.sm3, hash);
865
0
            break;
866
0
    #endif /* WOLFSSL_SM3 */
867
868
0
        default:
869
0
            ret = BAD_FUNC_ARG;
870
0
            break;
871
0
    }
872
873
0
    return ret;
874
0
}
875
876
/* Finalize the HMAC by performing outer hash.
877
 *
878
 * hmac  HMAC object.
879
 * mac   MAC result.
880
 * returns 0 on success, otherwise failure.
881
 */
882
static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac)
883
107
{
884
107
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
885
107
    wc_HashAlg hash;
886
107
    enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
887
107
    int digestSz = wc_HashGetDigestSize(hashType);
888
107
    int blockSz = wc_HashGetBlockSize(hashType);
889
890
107
    if ((digestSz >= 0) && (blockSz >= 0)) {
891
107
        ret = wc_HashInit(&hash, hashType);
892
107
    }
893
0
    else {
894
0
        ret = BAD_FUNC_ARG;
895
0
    }
896
897
107
    if (ret == 0) {
898
107
        ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->opad,
899
107
            (word32)blockSz);
900
107
        if (ret == 0)
901
101
            ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->innerHash,
902
101
                (word32)digestSz);
903
107
        if (ret == 0)
904
101
            ret = wc_HashFinal(&hash, hashType, mac);
905
107
        wc_HashFree(&hash, hashType);
906
107
    }
907
908
107
    return ret;
909
107
}
910
911
/* Calculate the HMAC of the header + message data.
912
 * Constant time implementation using wc_Sha*FinalRaw().
913
 *
914
 * hmac    HMAC object.
915
 * digest  MAC result.
916
 * in      Message data.
917
 * sz      Size of the message data.
918
 * header  Constructed record header with length of handshake data.
919
 * headerSz Length of header
920
 * returns 0 on success, otherwise failure.
921
 */
922
static int Hmac_UpdateFinal_CT(Hmac* hmac, byte* digest, const byte* in,
923
                           word32 sz, int macLen, byte* header, word32 headerSz)
924
0
{
925
0
    byte         lenBytes[8];
926
0
    int          i, j;
927
0
    unsigned int k;
928
0
    int          blockBits, blockMask;
929
0
    int          lastBlockLen, extraLen, eocIndex;
930
0
    int          blocks;
931
0
    int          safeBlocks;
932
0
    int          lenBlock;
933
0
    int          eocBlock;
934
0
    word32       maxLen;
935
0
    int          blockSz, padSz;
936
0
    int          ret;
937
0
    word32       realLen;
938
0
    byte         extraBlock;
939
940
0
    if (macLen <= 0 || macLen > (int)sizeof(hmac->innerHash))
941
0
        return BAD_FUNC_ARG;
942
943
0
    switch (hmac->macType) {
944
0
    #ifndef NO_SHA
945
0
        case WC_SHA:
946
0
            blockSz = WC_SHA_BLOCK_SIZE;
947
0
            blockBits = 6;
948
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
949
0
            break;
950
0
    #endif /* !NO_SHA */
951
952
0
    #ifndef NO_SHA256
953
0
        case WC_SHA256:
954
0
            blockSz = WC_SHA256_BLOCK_SIZE;
955
0
            blockBits = 6;
956
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
957
0
            break;
958
0
    #endif /* !NO_SHA256 */
959
960
0
    #ifdef WOLFSSL_SHA384
961
0
        case WC_SHA384:
962
0
            blockSz = WC_SHA384_BLOCK_SIZE;
963
0
            blockBits = 7;
964
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
965
0
            break;
966
0
    #endif /* WOLFSSL_SHA384 */
967
968
0
    #ifdef WOLFSSL_SHA512
969
0
        case WC_SHA512:
970
0
            blockSz = WC_SHA512_BLOCK_SIZE;
971
0
            blockBits = 7;
972
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
973
0
            break;
974
0
    #endif /* WOLFSSL_SHA512 */
975
976
0
    #ifdef WOLFSSL_SM3
977
0
        case WC_SM3:
978
0
            blockSz = WC_SM3_BLOCK_SIZE;
979
0
            blockBits = 6;
980
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
981
0
            break;
982
0
    #endif /* WOLFSSL_SM3 */
983
984
0
        default:
985
0
            return BAD_FUNC_ARG;
986
0
    }
987
0
    blockMask = blockSz - 1;
988
989
    /* Size of data to HMAC if padding length byte is zero. */
990
0
    maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - (word32)macLen;
991
992
    /* Complete data (including padding) has block for EOC and/or length. */
993
0
    extraBlock = ctSetLTE(((int)maxLen + padSz) & blockMask, padSz);
994
    /* Total number of blocks for data including padding. */
995
0
    blocks = ((int)(maxLen + (word32)blockSz - 1) >> blockBits) + extraBlock;
996
    /* Up to last 6 blocks can be hashed safely. */
997
0
    safeBlocks = blocks - 6;
998
999
    /* Length of message data. */
1000
0
    realLen = maxLen - in[sz - 1];
1001
    /* Number of message bytes in last block. */
1002
0
    lastBlockLen = (int)realLen & blockMask;
1003
    /* Number of padding bytes in last block. */
1004
0
    extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
1005
    /* Number of blocks to create for hash. */
1006
0
    lenBlock = ((int)realLen + extraLen) >> blockBits;
1007
    /* Block containing EOC byte. */
1008
0
    eocBlock = (int)(realLen >> (word32)blockBits);
1009
    /* Index of EOC byte in block. */
1010
0
    eocIndex = (int)(realLen & (word32)blockMask);
1011
1012
    /* Add length of hmac's ipad to total length. */
1013
0
    realLen += (word32)blockSz;
1014
    /* Length as bits - 8 bytes bigendian. */
1015
0
    c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
1016
0
    c32toa(realLen << 3, lenBytes + sizeof(word32));
1017
1018
0
    ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, (word32)blockSz);
1019
0
    if (ret != 0)
1020
0
        return ret;
1021
1022
0
    XMEMSET(hmac->innerHash, 0, (size_t)macLen);
1023
1024
0
    if (safeBlocks > 0) {
1025
0
        ret = Hmac_HashUpdate(hmac, header, headerSz);
1026
0
        if (ret != 0)
1027
0
            return ret;
1028
0
        ret = Hmac_HashUpdate(hmac, in, (word32)(safeBlocks * blockSz -
1029
0
                                WOLFSSL_TLS_HMAC_INNER_SZ));
1030
1031
0
        if (ret != 0)
1032
0
            return ret;
1033
0
    }
1034
0
    else
1035
0
        safeBlocks = 0;
1036
1037
0
    XMEMSET(digest, 0, (size_t)macLen);
1038
0
    k = (unsigned int)(safeBlocks * blockSz);
1039
0
    for (i = safeBlocks; i < blocks; i++) {
1040
0
        unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
1041
0
        unsigned char isEocBlock = ctMaskEq(i, eocBlock);
1042
0
        unsigned char isOutBlock = ctMaskEq(i, lenBlock);
1043
1044
0
        for (j = 0; j < blockSz; j++) {
1045
0
            unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
1046
0
            volatile unsigned char maskPastEoc = ctMaskGT(j, eocIndex);
1047
0
            volatile unsigned char pastEoc = maskPastEoc & isEocBlock;
1048
0
            unsigned char b = 0;
1049
1050
0
            if (k < headerSz)
1051
0
                b = header[k];
1052
0
            else if (k < maxLen)
1053
0
                b = in[k - headerSz];
1054
0
            k++;
1055
1056
0
            b = ctMaskSel(atEoc, 0x80, b);
1057
0
            b &= (unsigned char)~(word32)pastEoc;
1058
0
            b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
1059
1060
0
            if (j >= blockSz - 8) {
1061
0
                b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
1062
0
            }
1063
1064
0
            hashBlock[j] = b;
1065
0
        }
1066
1067
        /* cppcheck-suppress uninitvar */
1068
0
        ret = Hmac_HashUpdate(hmac, hashBlock, (word32)blockSz);
1069
0
        if (ret != 0)
1070
0
            return ret;
1071
0
        ret = Hmac_HashFinalRaw(hmac, hashBlock);
1072
0
        if (ret != 0)
1073
0
            return ret;
1074
0
        for (j = 0; j < macLen; j++)
1075
0
            ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
1076
0
    }
1077
1078
0
    ret = Hmac_OuterHash(hmac, digest);
1079
1080
0
    return ret;
1081
0
}
1082
1083
#endif
1084
1085
#if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
1086
    defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2)
1087
1088
/* Calculate the HMAC of the header + message data.
1089
 * Constant time implementation using normal hashing operations.
1090
 * Update-Final need to be constant time.
1091
 *
1092
 * hmac    HMAC object.
1093
 * digest  MAC result.
1094
 * in      Message data.
1095
 * sz      Size of the message data.
1096
 * header  Constructed record header with length of handshake data.
1097
 * headerSz Length of header
1098
 * returns 0 on success, otherwise failure.
1099
 */
1100
static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
1101
                            word32 sz, byte* header, word32 headerSz)
1102
0
{
1103
0
    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
1104
0
    int        ret = 0;
1105
0
    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
1106
0
    word32     offset = 0;
1107
0
    int        msgBlocks, blocks, blockBits;
1108
0
    int        i;
1109
1110
0
    switch (hmac->macType) {
1111
0
    #ifndef NO_SHA
1112
0
        case WC_SHA:
1113
0
            blockSz = WC_SHA_BLOCK_SIZE;
1114
0
            blockBits = 6;
1115
0
            macSz = WC_SHA_DIGEST_SIZE;
1116
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1117
0
            break;
1118
0
    #endif /* !NO_SHA */
1119
1120
0
    #ifndef NO_SHA256
1121
0
        case WC_SHA256:
1122
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1123
0
            blockBits = 6;
1124
0
            macSz = WC_SHA256_DIGEST_SIZE;
1125
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1126
0
            break;
1127
0
    #endif /* !NO_SHA256 */
1128
1129
0
    #ifdef WOLFSSL_SHA384
1130
0
        case WC_SHA384:
1131
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1132
0
            blockBits = 7;
1133
0
            macSz = WC_SHA384_DIGEST_SIZE;
1134
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1135
0
            break;
1136
0
    #endif /* WOLFSSL_SHA384 */
1137
1138
0
    #ifdef WOLFSSL_SHA512
1139
0
        case WC_SHA512:
1140
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1141
0
            blockBits = 7;
1142
0
            macSz = WC_SHA512_DIGEST_SIZE;
1143
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1144
0
            break;
1145
0
    #endif /* WOLFSSL_SHA512 */
1146
1147
0
    #ifdef HAVE_BLAKE2
1148
0
        case WC_HASH_TYPE_BLAKE2B:
1149
0
            blockSz = BLAKE2B_BLOCKBYTES;
1150
0
            blockBits = 7;
1151
0
            macSz = BLAKE2B_256;
1152
0
            padSz = 0;
1153
0
            break;
1154
0
    #endif /* HAVE_BLAKE2 */
1155
1156
0
    #ifdef WOLFSSL_SM3
1157
0
        case WC_SM3:
1158
0
            blockSz = WC_SM3_BLOCK_SIZE;
1159
0
            blockBits = 6;
1160
0
            macSz = WC_SM3_DIGEST_SIZE;
1161
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1162
0
            break;
1163
0
    #endif
1164
1165
0
        default:
1166
0
            WOLFSSL_MSG("ERROR: Hmac_UpdateFinal failed, no hmac->macType");
1167
0
            return BAD_FUNC_ARG;
1168
0
    }
1169
1170
0
    msgSz = sz - (1 + in[sz - 1] + macSz);
1171
    /* Make negative result 0 */
1172
0
    msgSz &= ~(0 - (msgSz >> 31));
1173
0
    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
1174
0
    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
1175
    /* Make negative result 0 */
1176
0
    maxSz &= ~(0 - (maxSz >> 31));
1177
1178
    /* Calculate #blocks processed in HMAC for max and real data. */
1179
0
    blocks      = (int)(maxSz >> blockBits);
1180
0
    blocks     += ((maxSz + padSz) % blockSz) < padSz;
1181
0
    msgBlocks   = (int)(realSz >> blockBits);
1182
    /* #Extra blocks to process. */
1183
0
    blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0);
1184
    /* Calculate whole blocks. */
1185
0
    msgBlocks--;
1186
1187
0
    ret = wc_HmacUpdate(hmac, header, headerSz);
1188
0
    if (ret == 0) {
1189
        /* Fill the rest of the block with any available data. */
1190
0
        word32 currSz = ctMaskLT((int)msgSz, (int)blockSz) & msgSz;
1191
0
        currSz |= ctMaskGTE((int)msgSz, (int)blockSz) & blockSz;
1192
0
        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
1193
0
        currSz &= ~(0 - (currSz >> 31));
1194
0
        ret = wc_HmacUpdate(hmac, in, currSz);
1195
0
        offset = currSz;
1196
0
    }
1197
0
    if (ret == 0) {
1198
        /* Do the hash operations on a block basis. */
1199
0
        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
1200
0
            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
1201
0
            if (ret != 0)
1202
0
                break;
1203
0
        }
1204
0
    }
1205
0
    if (ret == 0)
1206
0
        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
1207
0
    if (ret == 0)
1208
0
        ret = wc_HmacFinal(hmac, digest);
1209
0
    if (ret == 0) {
1210
        /* Do the dummy hash operations. Do at least one. */
1211
0
        for (i = 0; i < blocks + 1; i++) {
1212
0
            ret = wc_HmacUpdate(hmac, dummy, blockSz);
1213
0
            if (ret != 0)
1214
0
                break;
1215
0
        }
1216
0
    }
1217
1218
0
    return ret;
1219
0
}
1220
1221
#endif
1222
1223
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1224
#define TLS_HMAC_CID_SZ(s, v) \
1225
                ((v) ? DtlsGetCidRxSize((s)) \
1226
                     : DtlsGetCidTxSize((s)))
1227
#define TLS_HMAC_CID(s, v, b, c) \
1228
                ((v) ? wolfSSL_dtls_cid_get_rx((s), (b), (c)) \
1229
                     : wolfSSL_dtls_cid_get_tx((s), (b), (c)))
1230
#endif
1231
1232
static int TLS_hmac_SetInner(WOLFSSL* ssl, byte* inner, word32* innerSz,
1233
        word32 sz, int content, int verify, int epochOrder)
1234
{
1235
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1236
    unsigned int cidSz = 0;
1237
    if (ssl->options.dtls && (cidSz = TLS_HMAC_CID_SZ(ssl, verify)) > 0) {
1238
        word32 idx = 0;
1239
        if (cidSz > DTLS_CID_MAX_SIZE) {
1240
            WOLFSSL_MSG("DTLS CID too large");
1241
            return DTLS_CID_ERROR;
1242
        }
1243
1244
        XMEMSET(inner + idx, 0xFF, SEQ_SZ);
1245
        idx += SEQ_SZ;
1246
        inner[idx++] = dtls12_cid;
1247
        inner[idx++] = (byte)cidSz;
1248
        inner[idx++] = dtls12_cid;
1249
        inner[idx++] = ssl->version.major;
1250
        inner[idx++] = ssl->version.minor;
1251
        WriteSEQ(ssl, epochOrder, inner + idx);
1252
        idx += SEQ_SZ;
1253
        if (TLS_HMAC_CID(ssl, verify, inner + idx, cidSz) ==
1254
                WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
1255
            WOLFSSL_MSG("DTLS CID write failed");
1256
            return DTLS_CID_ERROR;
1257
        }
1258
        idx += cidSz;
1259
        c16toa((word16)sz, inner + idx);
1260
        idx += LENGTH_SZ;
1261
1262
        *innerSz = idx;
1263
        return 0;
1264
    }
1265
#endif
1266
    *innerSz = WOLFSSL_TLS_HMAC_INNER_SZ;
1267
    return wolfSSL_SetTlsHmacInner(ssl, inner, sz, content,
1268
            !ssl->options.dtls ? verify : epochOrder);
1269
}
1270
1271
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1272
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_CID_INNER_SZ
1273
#else
1274
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_INNER_SZ
1275
#endif
1276
1277
int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
1278
             int content, int verify, int epochOrder)
1279
{
1280
    Hmac   hmac;
1281
    byte   myInner[TLS_HMAC_INNER_SZ];
1282
    word32 innerSz = TLS_HMAC_INNER_SZ;
1283
    int    ret = 0;
1284
    const byte* macSecret = NULL;
1285
    word32 hashSz = 0;
1286
1287
    if (ssl == NULL)
1288
        return BAD_FUNC_ARG;
1289
1290
#ifdef HAVE_TRUNCATED_HMAC
1291
    hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
1292
                                        : ssl->specs.hash_size;
1293
#else
1294
    hashSz = ssl->specs.hash_size;
1295
#endif
1296
1297
#ifdef HAVE_FUZZER
1298
    /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
1299
    if (ssl->fuzzerCb) {
1300
        if (verify && padSz >= 0) {
1301
            ssl->fuzzerCb(ssl, in, sz + hashSz + padSz + 1, FUZZ_HMAC,
1302
                          ssl->fuzzerCtx);
1303
        }
1304
        else {
1305
            ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
1306
        }
1307
    }
1308
#endif
1309
1310
    ret = TLS_hmac_SetInner(ssl, myInner, &innerSz, sz, content, verify,
1311
                            epochOrder);
1312
    if (ret != 0)
1313
        return ret;
1314
1315
    ret = wc_HmacInit(&hmac, ssl->heap, ssl->devId);
1316
    if (ret != 0)
1317
        return ret;
1318
1319
1320
#ifdef WOLFSSL_DTLS
1321
    if (ssl->options.dtls)
1322
        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
1323
    else
1324
#endif
1325
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
1326
    ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
1327
                                              macSecret,
1328
                                              ssl->specs.hash_size);
1329
1330
    if (ret == 0) {
1331
        /* Constant time verification required. */
1332
        if (verify && padSz >= 0) {
1333
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
1334
    !defined(HAVE_SELFTEST)
1335
    #ifdef HAVE_BLAKE2
1336
            if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
1337
                ret = Hmac_UpdateFinal(&hmac, digest, in,
1338
                        sz + hashSz + (word32)padSz + 1, myInner, innerSz);
1339
            }
1340
            else
1341
    #endif
1342
            {
1343
                ret = Hmac_UpdateFinal_CT(&hmac, digest, in,
1344
                                      (sz + hashSz + (word32)padSz + 1),
1345
                                      (int)hashSz, myInner, innerSz);
1346
1347
            }
1348
#else
1349
            ret = Hmac_UpdateFinal(&hmac, digest, in, sz + hashSz +
1350
                                        (word32)(padSz) + 1,
1351
                                        myInner, innerSz);
1352
#endif
1353
        }
1354
        else {
1355
            ret = wc_HmacUpdate(&hmac, myInner, innerSz);
1356
            if (ret == 0)
1357
                ret = wc_HmacUpdate(&hmac, in, sz);                /* content */
1358
            if (ret == 0)
1359
                ret = wc_HmacFinal(&hmac, digest);
1360
        }
1361
    }
1362
1363
    wc_HmacFree(&hmac);
1364
1365
    return ret;
1366
}
1367
#endif /* WOLFSSL_AEAD_ONLY */
1368
1369
#endif /* !WOLFSSL_NO_TLS12 */
1370
1371
int wolfSSL_GetHmacType_ex(CipherSpecs* specs)
1372
0
{
1373
0
    if (specs == NULL)
1374
0
        return BAD_FUNC_ARG;
1375
1376
0
    switch (specs->mac_algorithm) {
1377
0
        #ifndef NO_MD5
1378
0
        case md5_mac:
1379
0
        {
1380
0
            return WC_MD5;
1381
0
        }
1382
0
        #endif
1383
0
        #ifndef NO_SHA256
1384
0
        case sha256_mac:
1385
0
        {
1386
0
            return WC_SHA256;
1387
0
        }
1388
0
        #endif
1389
0
        #ifdef WOLFSSL_SHA384
1390
0
        case sha384_mac:
1391
0
        {
1392
0
            return WC_SHA384;
1393
0
        }
1394
0
        #endif
1395
0
        #ifdef WOLFSSL_SM3
1396
0
        case sm3_mac:
1397
0
        {
1398
0
            return WC_SM3;
1399
0
        }
1400
0
        #endif
1401
0
        #ifndef NO_SHA
1402
0
        case sha_mac:
1403
0
        {
1404
0
            return WC_SHA;
1405
0
        }
1406
0
        #endif
1407
0
        #ifdef HAVE_BLAKE2
1408
0
        case blake2b_mac:
1409
0
        {
1410
0
            return BLAKE2B_ID;
1411
0
        }
1412
0
        #endif
1413
0
        default:
1414
0
        {
1415
0
            return WOLFSSL_FATAL_ERROR;
1416
0
        }
1417
0
    }
1418
0
}
1419
1420
#ifdef HAVE_TLS_EXTENSIONS
1421
1422
/**
1423
 * The TLSX semaphore is used to calculate the size of the extensions to be sent
1424
 * from one peer to another.
1425
 */
1426
1427
/** Supports up to 72 flags. Increase as needed. */
1428
#define SEMAPHORE_SIZE 9
1429
1430
/**
1431
 * Converts the extension type (id) to an index in the semaphore.
1432
 *
1433
 * Official reference for TLS extension types:
1434
 *   http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
1435
 *
1436
 * Motivation:
1437
 *   Previously, we used the extension type itself as the index of that
1438
 *   extension in the semaphore as the extension types were declared
1439
 *   sequentially, but maintain a semaphore as big as the number of available
1440
 *   extensions is no longer an option since the release of renegotiation_info.
1441
 *
1442
 * How to update:
1443
 *   Assign extension types that extrapolate the number of available semaphores
1444
 *   to the first available index going backwards in the semaphore array.
1445
 *   When adding a new extension type that don't extrapolate the number of
1446
 *   available semaphores, check for a possible collision with with a
1447
 *   'remapped' extension type.
1448
 *
1449
 * Update TLSX_Parse for duplicate detection if more added above 62.
1450
 */
1451
static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
1452
{
1453
    switch (type) {
1454
1455
        case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
1456
            return 63;
1457
#ifdef WOLFSSL_QUIC
1458
        case TLSX_KEY_QUIC_TP_PARAMS_DRAFT: /* 0xffa5 */
1459
            return 64;
1460
#endif
1461
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
1462
        case TLSX_ECH: /* 0xfe0d */
1463
            return 65;
1464
#endif
1465
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
1466
        case TLSX_CKS:
1467
            return 66;
1468
#endif
1469
        default:
1470
            if (type > 62) {
1471
                /* This message SHOULD only happens during the adding of
1472
                   new TLS extensions in which its IANA number overflows
1473
                   the current semaphore's range, or if its number already
1474
                   is assigned to be used by another extension.
1475
                   Use this check value for the new extension and decrement
1476
                   the check value by one. */
1477
                WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
1478
            }
1479
    }
1480
1481
    return type;
1482
}
1483
1484
/** Checks if a specific light (tls extension) is not set in the semaphore. */
1485
#define IS_OFF(semaphore, light) \
1486
    (!(((semaphore)[(light) / 8] &  (byte) (0x01 << ((light) % 8)))))
1487
1488
/** Turn on a specific light (tls extension) in the semaphore. */
1489
/* the semaphore marks the extensions already written to the message */
1490
#define TURN_ON(semaphore, light) \
1491
0
    ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
1492
1493
/** Turn off a specific light (tls extension) in the semaphore. */
1494
#define TURN_OFF(semaphore, light) \
1495
0
    ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
1496
1497
/** Creates a new extension. */
1498
static TLSX* TLSX_New(TLSX_Type type, const void* data, void* heap)
1499
121k
{
1500
121k
    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
1501
1502
121k
    (void)heap;
1503
1504
121k
    if (extension) {
1505
121k
        extension->type = type;
1506
121k
        extension->data = (void*)data;
1507
121k
        extension->resp = 0;
1508
121k
        extension->next = NULL;
1509
121k
    }
1510
1511
121k
    return extension;
1512
121k
}
1513
1514
/**
1515
 * Creates a new extension and appends it to the provided list.
1516
 * Checks for duplicate extensions, keeps the newest.
1517
 */
1518
int TLSX_Append(TLSX** list, TLSX_Type type, const void* data, void* heap)
1519
0
{
1520
0
    TLSX* extension = TLSX_New(type, data, heap);
1521
0
    TLSX* cur;
1522
0
    TLSX** prevNext = list;
1523
1524
0
    if (extension == NULL)
1525
0
        return MEMORY_E;
1526
1527
0
    for (cur = *list; cur != NULL;) {
1528
0
        if (cur->type == type) {
1529
0
            *prevNext = cur->next;
1530
0
            cur->next = NULL;
1531
0
            TLSX_FreeAll(cur, heap);
1532
0
            cur = *prevNext;
1533
0
        }
1534
0
        else {
1535
0
            prevNext = &cur->next;
1536
0
            cur = cur->next;
1537
0
        }
1538
0
    }
1539
1540
    /* Append the extension to the list */
1541
0
    *prevNext = extension;
1542
1543
0
    return 0;
1544
0
}
1545
1546
/**
1547
 * Creates a new extension and pushes it to the provided list.
1548
 * Checks for duplicate extensions, keeps the newest.
1549
 */
1550
int TLSX_Push(TLSX** list, TLSX_Type type, const void* data, void* heap)
1551
121k
{
1552
121k
    TLSX* extension = TLSX_New(type, data, heap);
1553
1554
121k
    if (extension == NULL)
1555
313
        return MEMORY_E;
1556
1557
    /* pushes the new extension on the list. */
1558
121k
    extension->next = *list;
1559
121k
    *list = extension;
1560
1561
    /* remove duplicate extensions, there should be only one of each type. */
1562
365k
    do {
1563
365k
        if (extension->next && extension->next->type == type) {
1564
184
            TLSX *next = extension->next;
1565
1566
184
            extension->next = next->next;
1567
184
            next->next = NULL;
1568
1569
184
            TLSX_FreeAll(next, heap);
1570
1571
            /* there is no way to occur more than
1572
             * two extensions of the same type.
1573
             */
1574
184
            break;
1575
184
        }
1576
365k
    } while ((extension = extension->next));
1577
1578
121k
    return 0;
1579
121k
}
1580
1581
#ifndef NO_WOLFSSL_CLIENT
1582
1583
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
1584
1585
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
1586
229
{
1587
229
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1588
1589
229
    if (!extension)
1590
229
        extension = TLSX_Find(ssl->ctx->extensions, type);
1591
1592
229
    return extension == NULL;
1593
229
}
1594
1595
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
1596
1597
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
1598
14
{
1599
14
    SendAlert(ssl, alert_fatal, unsupported_extension);
1600
14
    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
1601
14
    return UNSUPPORTED_EXTENSION;
1602
14
}
1603
1604
#else
1605
1606
#define TLSX_CheckUnsupportedExtension(ssl, type) 0
1607
#define TLSX_HandleUnsupportedExtension(ssl) 0
1608
1609
#endif
1610
1611
#if !defined(NO_WOLFSSL_SERVER) || defined(WOLFSSL_TLS13)
1612
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
1613
/** Mark an extension to be sent back to the client. */
1614
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
1615
2.34k
{
1616
2.34k
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1617
1618
2.34k
    if (extension)
1619
2.34k
        extension->resp = 1;
1620
2.34k
}
1621
#endif
1622
1623
/******************************************************************************/
1624
/* Application-Layer Protocol Negotiation                                     */
1625
/******************************************************************************/
1626
1627
#ifdef HAVE_ALPN
1628
/** Creates a new ALPN object, providing protocol name to use. */
1629
static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
1630
                                                                     void* heap)
1631
{
1632
    ALPN *alpn;
1633
1634
    WOLFSSL_ENTER("TLSX_ALPN_New");
1635
1636
    if (protocol_name == NULL ||
1637
        protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
1638
        WOLFSSL_MSG("Invalid arguments");
1639
        return NULL;
1640
    }
1641
1642
    alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
1643
    if (alpn == NULL) {
1644
        WOLFSSL_MSG("Memory failure");
1645
        return NULL;
1646
    }
1647
1648
    alpn->next = NULL;
1649
    alpn->negotiated = 0;
1650
    alpn->options = 0;
1651
1652
    alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
1653
                                         heap, DYNAMIC_TYPE_TLSX);
1654
    if (alpn->protocol_name == NULL) {
1655
        WOLFSSL_MSG("Memory failure");
1656
        XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1657
        return NULL;
1658
    }
1659
1660
    XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
1661
    alpn->protocol_name[protocol_nameSz] = 0;
1662
1663
    (void)heap;
1664
1665
    return alpn;
1666
}
1667
1668
/** Releases an ALPN object. */
1669
static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
1670
{
1671
    (void)heap;
1672
1673
    if (alpn == NULL)
1674
        return;
1675
1676
    XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
1677
    XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1678
}
1679
1680
/** Releases all ALPN objects in the provided list. */
1681
static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
1682
{
1683
    ALPN* alpn;
1684
1685
    while ((alpn = list)) {
1686
        list = alpn->next;
1687
        TLSX_ALPN_Free(alpn, heap);
1688
    }
1689
}
1690
1691
/** Tells the buffered size of the ALPN objects in a list. */
1692
static word16 TLSX_ALPN_GetSize(ALPN *list)
1693
{
1694
    ALPN* alpn;
1695
    word16 length = OPAQUE16_LEN; /* list length */
1696
1697
    while ((alpn = list)) {
1698
        list = alpn->next;
1699
1700
        length++; /* protocol name length is on one byte */
1701
        length += (word16)XSTRLEN(alpn->protocol_name);
1702
    }
1703
1704
    return length;
1705
}
1706
1707
/** Writes the ALPN objects of a list in a buffer. */
1708
static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
1709
{
1710
    ALPN* alpn;
1711
    word16 length = 0;
1712
    word16 offset = OPAQUE16_LEN; /* list length offset */
1713
1714
    while ((alpn = list)) {
1715
        list = alpn->next;
1716
1717
        length = (word16)XSTRLEN(alpn->protocol_name);
1718
1719
        /* protocol name length */
1720
        output[offset++] = (byte)length;
1721
1722
        /* protocol name value */
1723
        XMEMCPY(output + offset, alpn->protocol_name, length);
1724
1725
        offset += length;
1726
    }
1727
1728
    /* writing list length */
1729
    c16toa(offset - OPAQUE16_LEN, output);
1730
1731
    return offset;
1732
}
1733
1734
/** Finds a protocol name in the provided ALPN list */
1735
static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
1736
{
1737
    ALPN *alpn;
1738
1739
    if (list == NULL || protocol_name == NULL)
1740
        return NULL;
1741
1742
    alpn = list;
1743
    while (alpn != NULL && (
1744
           (word16)XSTRLEN(alpn->protocol_name) != size ||
1745
           XSTRNCMP(alpn->protocol_name, protocol_name, size)))
1746
        alpn = alpn->next;
1747
1748
    return alpn;
1749
}
1750
1751
/** Set the ALPN matching client and server requirements */
1752
static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
1753
                                                                     void* heap)
1754
{
1755
    ALPN *alpn;
1756
    int  ret;
1757
1758
    if (extensions == NULL || data == NULL)
1759
        return BAD_FUNC_ARG;
1760
1761
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1762
    if (alpn == NULL) {
1763
        WOLFSSL_MSG("Memory failure");
1764
        return MEMORY_E;
1765
    }
1766
1767
    alpn->negotiated = 1;
1768
1769
    ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
1770
                                                                          heap);
1771
    if (ret != 0) {
1772
        TLSX_ALPN_Free(alpn, heap);
1773
        return ret;
1774
    }
1775
1776
    return WOLFSSL_SUCCESS;
1777
}
1778
1779
static int ALPN_find_match(WOLFSSL *ssl, TLSX **pextension,
1780
                           const byte **psel, byte *psel_len,
1781
                           const byte *alpn_val, word16 alpn_val_len)
1782
{
1783
    TLSX    *extension;
1784
    ALPN    *alpn, *list;
1785
    const byte *sel = NULL, *s;
1786
    byte sel_len = 0, wlen;
1787
1788
    extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1789
    if (extension == NULL)
1790
        extension = TLSX_Find(ssl->ctx->extensions,
1791
                              TLSX_APPLICATION_LAYER_PROTOCOL);
1792
1793
    /* No ALPN configured here */
1794
    if (extension == NULL || extension->data == NULL) {
1795
        *pextension = NULL;
1796
        *psel = NULL;
1797
        *psel_len = 0;
1798
        return 0;
1799
    }
1800
1801
    list = (ALPN*)extension->data;
1802
    for (s = alpn_val;
1803
         (s - alpn_val) < alpn_val_len;
1804
         s += wlen) {
1805
        wlen = *s++; /* bounds already checked on save */
1806
        alpn = TLSX_ALPN_Find(list, (char*)s, wlen);
1807
        if (alpn != NULL) {
1808
            WOLFSSL_MSG("ALPN protocol match");
1809
            sel = s,
1810
            sel_len = wlen;
1811
            break;
1812
        }
1813
    }
1814
1815
    if (sel == NULL) {
1816
        WOLFSSL_MSG("No ALPN protocol match");
1817
1818
        /* do nothing if no protocol match between client and server and option
1819
         is set to continue (like OpenSSL) */
1820
        if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
1821
            WOLFSSL_MSG("Continue on mismatch");
1822
        }
1823
        else {
1824
            SendAlert(ssl, alert_fatal, no_application_protocol);
1825
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1826
            return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1827
        }
1828
    }
1829
1830
    *pextension = extension;
1831
    *psel = sel;
1832
    *psel_len = sel_len;
1833
    return 0;
1834
}
1835
1836
int ALPN_Select(WOLFSSL *ssl)
1837
{
1838
    TLSX *extension;
1839
    const byte *sel = NULL;
1840
    byte sel_len = 0;
1841
    int r = 0;
1842
1843
    WOLFSSL_ENTER("ALPN_Select");
1844
    if (ssl->alpn_peer_requested == NULL)
1845
        return 0;
1846
1847
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
1848
    if (ssl->alpnSelect != NULL && ssl->options.side == WOLFSSL_SERVER_END) {
1849
        r = ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested,
1850
                ssl->alpn_peer_requested_length, ssl->alpnSelectArg);
1851
        switch (r) {
1852
            case SSL_TLSEXT_ERR_OK:
1853
                WOLFSSL_MSG("ALPN protocol match");
1854
                break;
1855
            case SSL_TLSEXT_ERR_NOACK:
1856
                WOLFSSL_MSG("ALPN cb no match but not fatal");
1857
                sel = NULL;
1858
                sel_len = 0;
1859
                break;
1860
            case SSL_TLSEXT_ERR_ALERT_FATAL:
1861
            default:
1862
                WOLFSSL_MSG("ALPN cb no match and fatal");
1863
                SendAlert(ssl, alert_fatal, no_application_protocol);
1864
                WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1865
                return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1866
        }
1867
    }
1868
    else
1869
#endif
1870
    {
1871
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len,
1872
                            ssl->alpn_peer_requested,
1873
                            ssl->alpn_peer_requested_length);
1874
        if (r != 0)
1875
            return r;
1876
    }
1877
1878
    if (sel != NULL) {
1879
        /* set the matching negotiated protocol */
1880
        r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
1881
        if (r != WOLFSSL_SUCCESS) {
1882
            WOLFSSL_MSG("TLSX_SetALPN failed");
1883
            return BUFFER_ERROR;
1884
        }
1885
        /* reply to ALPN extension sent from peer */
1886
#ifndef NO_WOLFSSL_SERVER
1887
        TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
1888
#endif
1889
    }
1890
    return 0;
1891
}
1892
1893
/** Parses a buffer of ALPN extensions and set the first one matching
1894
 * client and server requirements */
1895
static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, const byte *input, word16 length,
1896
                                 byte isRequest)
1897
{
1898
    word16  size = 0, offset = 0, wlen;
1899
    int     r = WC_NO_ERR_TRACE(BUFFER_ERROR);
1900
    const byte *s;
1901
1902
    if (OPAQUE16_LEN > length)
1903
        return BUFFER_ERROR;
1904
1905
    ato16(input, &size);
1906
    offset += OPAQUE16_LEN;
1907
1908
    /* validating alpn list length */
1909
    if (size == 0 || length != OPAQUE16_LEN + size)
1910
        return BUFFER_ERROR;
1911
1912
    /* validating length of entries before accepting */
1913
    for (s = input + offset; (s - input) < size; s += wlen) {
1914
        wlen = *s++;
1915
        if (wlen == 0 || (s + wlen - input) > length)
1916
            return BUFFER_ERROR;
1917
    }
1918
1919
    if (isRequest) {
1920
        /* keep the list sent by peer, if this is from a request. We
1921
         * use it later in ALPN_Select() for evaluation. */
1922
        if (ssl->alpn_peer_requested != NULL) {
1923
            XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
1924
            ssl->alpn_peer_requested_length = 0;
1925
        }
1926
        ssl->alpn_peer_requested = (byte *)XMALLOC(size, ssl->heap,
1927
                                                   DYNAMIC_TYPE_ALPN);
1928
        if (ssl->alpn_peer_requested == NULL) {
1929
            return MEMORY_ERROR;
1930
        }
1931
        ssl->alpn_peer_requested_length = size;
1932
        XMEMCPY(ssl->alpn_peer_requested, (char*)input + offset, size);
1933
    }
1934
    else {
1935
        /* a response, we should find the value in our config */
1936
        const byte *sel = NULL;
1937
        byte sel_len = 0;
1938
        TLSX *extension = NULL;
1939
1940
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len, input + offset, size);
1941
        if (r != 0)
1942
            return r;
1943
1944
        if (sel != NULL) {
1945
            /* set the matching negotiated protocol */
1946
            r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
1947
            if (r != WOLFSSL_SUCCESS) {
1948
                WOLFSSL_MSG("TLSX_SetALPN failed");
1949
                return BUFFER_ERROR;
1950
            }
1951
        }
1952
        /* If we had nothing configured, the response is unexpected */
1953
        else if (extension == NULL) {
1954
            r = TLSX_HandleUnsupportedExtension(ssl);
1955
            if (r != 0)
1956
                return r;
1957
        }
1958
    }
1959
    return 0;
1960
}
1961
1962
/** Add a protocol name to the list of accepted usable ones */
1963
int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
1964
                                                                     void* heap)
1965
{
1966
    ALPN *alpn;
1967
    TLSX *extension;
1968
    int  ret;
1969
1970
    if (extensions == NULL || data == NULL)
1971
        return BAD_FUNC_ARG;
1972
1973
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1974
    if (alpn == NULL) {
1975
        WOLFSSL_MSG("Memory failure");
1976
        return MEMORY_E;
1977
    }
1978
1979
    /* Set Options of ALPN */
1980
    alpn->options = options;
1981
1982
    extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1983
    if (extension == NULL) {
1984
        ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
1985
                                                             (void*)alpn, heap);
1986
        if (ret != 0) {
1987
            TLSX_ALPN_Free(alpn, heap);
1988
            return ret;
1989
        }
1990
    }
1991
    else {
1992
        /* push new ALPN object to extension data. */
1993
        alpn->next = (ALPN*)extension->data;
1994
        extension->data = (void*)alpn;
1995
    }
1996
1997
    return WOLFSSL_SUCCESS;
1998
}
1999
2000
/** Get the protocol name set by the server */
2001
int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
2002
{
2003
    TLSX *extension;
2004
    ALPN *alpn;
2005
2006
    if (extensions == NULL || data == NULL || dataSz == NULL)
2007
        return BAD_FUNC_ARG;
2008
2009
    *data = NULL;
2010
    *dataSz = 0;
2011
2012
    extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2013
    if (extension == NULL) {
2014
        WOLFSSL_MSG("TLS extension not found");
2015
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2016
        return WOLFSSL_ALPN_NOT_FOUND;
2017
    }
2018
2019
    alpn = (ALPN *)extension->data;
2020
    if (alpn == NULL) {
2021
        WOLFSSL_MSG("ALPN extension not found");
2022
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2023
        return WOLFSSL_FATAL_ERROR;
2024
    }
2025
2026
    if (alpn->negotiated != 1) {
2027
2028
        /* consider as an error */
2029
        if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
2030
            WOLFSSL_MSG("No protocol match with peer -> Failed");
2031
            WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2032
            return WOLFSSL_FATAL_ERROR;
2033
        }
2034
2035
        /* continue without negotiated protocol */
2036
        WOLFSSL_MSG("No protocol match with peer -> Continue");
2037
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2038
        return WOLFSSL_ALPN_NOT_FOUND;
2039
    }
2040
2041
    if (alpn->next != NULL) {
2042
        WOLFSSL_MSG("Only one protocol name must be accepted");
2043
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2044
        return WOLFSSL_FATAL_ERROR;
2045
    }
2046
2047
    *data = alpn->protocol_name;
2048
    *dataSz = (word16)XSTRLEN((char*)*data);
2049
2050
    return WOLFSSL_SUCCESS;
2051
}
2052
2053
#define ALPN_FREE_ALL     TLSX_ALPN_FreeAll
2054
#define ALPN_GET_SIZE     TLSX_ALPN_GetSize
2055
#define ALPN_WRITE        TLSX_ALPN_Write
2056
#define ALPN_PARSE        TLSX_ALPN_ParseAndSet
2057
2058
#else /* HAVE_ALPN */
2059
2060
0
#define ALPN_FREE_ALL(list, heap) WC_DO_NOTHING
2061
#define ALPN_GET_SIZE(list)     0
2062
#define ALPN_WRITE(a, b)        0
2063
#define ALPN_PARSE(a, b, c, d)  0
2064
2065
#endif /* HAVE_ALPN */
2066
2067
/******************************************************************************/
2068
/* Server Name Indication                                                     */
2069
/******************************************************************************/
2070
2071
#ifdef HAVE_SNI
2072
2073
/** Creates a new SNI object. */
2074
static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
2075
28
{
2076
28
    SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
2077
2078
28
    (void)heap;
2079
2080
28
    if (sni) {
2081
28
        sni->type = type;
2082
28
        sni->next = NULL;
2083
2084
28
    #ifndef NO_WOLFSSL_SERVER
2085
28
        sni->options = 0;
2086
28
        sni->status  = WOLFSSL_SNI_NO_MATCH;
2087
28
    #endif
2088
2089
28
        switch (sni->type) {
2090
28
            case WOLFSSL_SNI_HOST_NAME:
2091
28
                sni->data.host_name = (char*)XMALLOC(size + 1, heap,
2092
28
                                                     DYNAMIC_TYPE_TLSX);
2093
28
                if (sni->data.host_name) {
2094
28
                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
2095
28
                    sni->data.host_name[size] = '\0';
2096
28
                } else {
2097
0
                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2098
0
                    sni = NULL;
2099
0
                }
2100
28
            break;
2101
2102
0
            default: /* invalid type */
2103
0
                XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2104
0
                sni = NULL;
2105
28
        }
2106
28
    }
2107
2108
28
    return sni;
2109
28
}
2110
2111
/** Releases a SNI object. */
2112
static void TLSX_SNI_Free(SNI* sni, void* heap)
2113
0
{
2114
0
    if (sni) {
2115
0
        switch (sni->type) {
2116
0
            case WOLFSSL_SNI_HOST_NAME:
2117
0
                XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
2118
0
            break;
2119
0
        }
2120
2121
0
        XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2122
0
    }
2123
0
    (void)heap;
2124
0
}
2125
2126
/** Releases all SNI objects in the provided list. */
2127
static void TLSX_SNI_FreeAll(SNI* list, void* heap)
2128
0
{
2129
0
    SNI* sni;
2130
2131
0
    while ((sni = list)) {
2132
0
        list = sni->next;
2133
0
        TLSX_SNI_Free(sni, heap);
2134
0
    }
2135
0
}
2136
2137
/** Tells the buffered size of the SNI objects in a list. */
2138
static word16 TLSX_SNI_GetSize(SNI* list)
2139
14.7k
{
2140
14.7k
    SNI* sni;
2141
14.7k
    word16 length = OPAQUE16_LEN; /* list length */
2142
2143
29.5k
    while ((sni = list)) {
2144
14.7k
        list = sni->next;
2145
2146
14.7k
        length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
2147
2148
14.7k
        switch (sni->type) {
2149
14.7k
            case WOLFSSL_SNI_HOST_NAME:
2150
14.7k
                length += (word16)XSTRLEN((char*)sni->data.host_name);
2151
14.7k
            break;
2152
14.7k
        }
2153
14.7k
    }
2154
2155
14.7k
    return length;
2156
14.7k
}
2157
2158
/** Writes the SNI objects of a list in a buffer. */
2159
static word16 TLSX_SNI_Write(SNI* list, byte* output)
2160
14.7k
{
2161
14.7k
    SNI* sni;
2162
14.7k
    word16 length = 0;
2163
14.7k
    word16 offset = OPAQUE16_LEN; /* list length offset */
2164
2165
29.4k
    while ((sni = list)) {
2166
14.7k
        list = sni->next;
2167
2168
14.7k
        output[offset++] = sni->type; /* sni type */
2169
2170
14.7k
        switch (sni->type) {
2171
14.7k
            case WOLFSSL_SNI_HOST_NAME:
2172
14.7k
                length = (word16)XSTRLEN((char*)sni->data.host_name);
2173
2174
14.7k
                c16toa(length, output + offset); /* sni length */
2175
14.7k
                offset += OPAQUE16_LEN;
2176
2177
14.7k
                XMEMCPY(output + offset, sni->data.host_name, length);
2178
2179
14.7k
                offset += length;
2180
14.7k
            break;
2181
14.7k
        }
2182
14.7k
    }
2183
2184
14.7k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2185
2186
14.7k
    return offset;
2187
14.7k
}
2188
2189
/** Finds a SNI object in the provided list. */
2190
static SNI* TLSX_SNI_Find(SNI *list, byte type)
2191
24
{
2192
24
    SNI* sni = list;
2193
2194
24
    while (sni && sni->type != type)
2195
0
        sni = sni->next;
2196
2197
24
    return sni;
2198
24
}
2199
2200
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
2201
/** Sets the status of a SNI object. */
2202
static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
2203
24
{
2204
24
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2205
24
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2206
2207
24
    if (sni)
2208
0
        sni->status = status;
2209
24
}
2210
#endif
2211
2212
/** Gets the status of a SNI object. */
2213
byte TLSX_SNI_Status(TLSX* extensions, byte type)
2214
0
{
2215
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2216
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2217
2218
0
    if (sni)
2219
0
        return sni->status;
2220
2221
0
    return 0;
2222
0
}
2223
2224
/** Parses a buffer of SNI extensions. */
2225
static int TLSX_SNI_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2226
                          byte isRequest)
2227
662
{
2228
662
#ifndef NO_WOLFSSL_SERVER
2229
662
    word16 size = 0;
2230
662
    word16 offset = 0;
2231
662
    int cacheOnly = 0;
2232
662
    SNI *sni = NULL;
2233
662
    byte type;
2234
662
    byte matched;
2235
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2236
    WOLFSSL_ECH* ech = NULL;
2237
    WOLFSSL_EchConfig* workingConfig;
2238
    TLSX* echX;
2239
#endif
2240
662
#endif /* !NO_WOLFSSL_SERVER */
2241
662
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
2242
2243
662
    if (!extension)
2244
662
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2245
2246
662
    if (!isRequest) {
2247
28
        #ifndef NO_WOLFSSL_CLIENT
2248
28
            if (!extension || !extension->data)
2249
0
                return TLSX_HandleUnsupportedExtension(ssl);
2250
2251
28
            if (length > 0)
2252
4
                return BUFFER_ERROR; /* SNI response MUST be empty. */
2253
2254
            /* This call enables wolfSSL_SNI_GetRequest() to be called in the
2255
             * client side to fetch the used SNI. It will only work if the SNI
2256
             * was set at the SSL object level. Right now we only support one
2257
             * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
2258
             * inclusion of other name types will turn this method inaccurate,
2259
             * as the extension response doesn't contains information of which
2260
             * name was accepted.
2261
             */
2262
24
            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
2263
24
                                                        WOLFSSL_SNI_REAL_MATCH);
2264
2265
24
            return 0;
2266
28
        #endif
2267
28
    }
2268
2269
634
#ifndef NO_WOLFSSL_SERVER
2270
634
    if (!extension || !extension->data) {
2271
        /* This will keep SNI even though TLSX_UseSNI has not been called.
2272
         * Enable it so that the received sni is available to functions
2273
         * that use a custom callback when SNI is received.
2274
         */
2275
    #ifdef WOLFSSL_ALWAYS_KEEP_SNI
2276
        cacheOnly = 1;
2277
    #endif
2278
634
        if (ssl->ctx->sniRecvCb) {
2279
0
            cacheOnly = 1;
2280
0
        }
2281
2282
634
        if (cacheOnly) {
2283
0
            WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
2284
0
        }
2285
634
        else {
2286
            /* Skipping, SNI not enabled at server side. */
2287
634
            return 0;
2288
634
        }
2289
634
    }
2290
2291
0
    if (OPAQUE16_LEN > length)
2292
0
        return BUFFER_ERROR;
2293
2294
0
    ato16(input, &size);
2295
0
    offset += OPAQUE16_LEN;
2296
2297
    /* validating sni list length */
2298
0
    if (length != OPAQUE16_LEN + size || size == 0)
2299
0
        return BUFFER_ERROR;
2300
2301
    /* SNI was badly specified and only one type is now recognized and allowed.
2302
     * Only one SNI value per type (RFC6066), so, no loop. */
2303
0
    type = input[offset++];
2304
0
    if (type != WOLFSSL_SNI_HOST_NAME)
2305
0
        return BUFFER_ERROR;
2306
2307
0
    if (offset + OPAQUE16_LEN > length)
2308
0
        return BUFFER_ERROR;
2309
0
    ato16(input + offset, &size);
2310
0
    offset += OPAQUE16_LEN;
2311
2312
0
    if (offset + size != length || size == 0)
2313
0
        return BUFFER_ERROR;
2314
2315
0
    if (!cacheOnly && !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
2316
0
        return 0; /* not using this type of SNI. */
2317
2318
0
#ifdef WOLFSSL_TLS13
2319
    /* Don't process the second ClientHello SNI extension if there
2320
     * was problems with the first.
2321
     */
2322
0
    if (!cacheOnly && sni->status != 0)
2323
0
        return 0;
2324
0
#endif
2325
0
    matched = cacheOnly || (XSTRLEN(sni->data.host_name) == size &&
2326
0
         XSTRNCMP(sni->data.host_name, (const char*)input + offset, size) == 0);
2327
2328
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2329
    echX = TLSX_Find(ssl->extensions, TLSX_ECH);
2330
    if (echX != NULL)
2331
        ech = (WOLFSSL_ECH*)(echX->data);
2332
2333
    if (!matched && ech != NULL) {
2334
        workingConfig = ech->echConfig;
2335
2336
        while (workingConfig != NULL) {
2337
            matched = XSTRLEN(workingConfig->publicName) == size &&
2338
                XSTRNCMP(workingConfig->publicName,
2339
                (const char*)input + offset, size) == 0;
2340
2341
            if (matched)
2342
                break;
2343
2344
            workingConfig = workingConfig->next;
2345
        }
2346
    }
2347
#endif
2348
2349
0
    if (matched || sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH) {
2350
0
        int matchStat;
2351
0
        int r = TLSX_UseSNI(&ssl->extensions, type, input + offset, size,
2352
0
                                                                     ssl->heap);
2353
0
        if (r != WOLFSSL_SUCCESS)
2354
0
            return r; /* throws error. */
2355
2356
0
        if (cacheOnly) {
2357
0
            WOLFSSL_MSG("Forcing storage of SNI, Fake match");
2358
0
            matchStat = WOLFSSL_SNI_FORCE_KEEP;
2359
0
        }
2360
0
        else if (matched) {
2361
0
            WOLFSSL_MSG("SNI did match!");
2362
0
            matchStat = WOLFSSL_SNI_REAL_MATCH;
2363
0
        }
2364
0
        else {
2365
0
            WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
2366
0
            matchStat = WOLFSSL_SNI_FAKE_MATCH;
2367
0
        }
2368
2369
0
        TLSX_SNI_SetStatus(ssl->extensions, type, (byte)matchStat);
2370
2371
0
        if (!cacheOnly)
2372
0
            TLSX_SetResponse(ssl, TLSX_SERVER_NAME);
2373
0
    }
2374
0
    else if (!(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
2375
0
        SendAlert(ssl, alert_fatal, unrecognized_name);
2376
0
        WOLFSSL_ERROR_VERBOSE(UNKNOWN_SNI_HOST_NAME_E);
2377
0
        return UNKNOWN_SNI_HOST_NAME_E;
2378
0
    }
2379
#else
2380
    (void)input;
2381
#endif /* !NO_WOLFSSL_SERVER */
2382
2383
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
2384
    (void)length;
2385
#endif
2386
2387
0
    return 0;
2388
0
}
2389
2390
static int TLSX_SNI_VerifyParse(WOLFSSL* ssl,  byte isRequest)
2391
13.7k
{
2392
13.7k
    (void)ssl;
2393
2394
13.7k
    if (isRequest) {
2395
8.69k
    #ifndef NO_WOLFSSL_SERVER
2396
8.69k
        TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2397
8.69k
        TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
2398
8.69k
        SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
2399
8.69k
        SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
2400
8.69k
        SNI* sni = NULL;
2401
2402
8.69k
        for (; ctx_sni; ctx_sni = ctx_sni->next) {
2403
0
            if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2404
0
                sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
2405
2406
0
                if (sni) {
2407
0
                    if (sni->status != WOLFSSL_SNI_NO_MATCH)
2408
0
                        continue;
2409
2410
                    /* if ssl level overrides ctx level, it is ok. */
2411
0
                    if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
2412
0
                        continue;
2413
0
                }
2414
2415
0
                SendAlert(ssl, alert_fatal, handshake_failure);
2416
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2417
0
                return SNI_ABSENT_ERROR;
2418
0
            }
2419
0
        }
2420
2421
8.69k
        for (; ssl_sni; ssl_sni = ssl_sni->next) {
2422
0
            if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2423
0
                if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
2424
0
                    continue;
2425
2426
0
                SendAlert(ssl, alert_fatal, handshake_failure);
2427
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2428
0
                return SNI_ABSENT_ERROR;
2429
0
            }
2430
0
        }
2431
8.69k
    #endif /* NO_WOLFSSL_SERVER */
2432
8.69k
    }
2433
2434
13.7k
    return 0;
2435
13.7k
}
2436
2437
int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
2438
                                                                     void* heap)
2439
28
{
2440
28
    TLSX* extension;
2441
28
    SNI* sni = NULL;
2442
2443
28
    if (extensions == NULL || data == NULL)
2444
0
        return BAD_FUNC_ARG;
2445
2446
28
    if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
2447
0
        return MEMORY_E;
2448
2449
28
    extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
2450
28
    if (!extension) {
2451
28
        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
2452
2453
28
        if (ret != 0) {
2454
0
            TLSX_SNI_Free(sni, heap);
2455
0
            return ret;
2456
0
        }
2457
28
    }
2458
0
    else {
2459
        /* push new SNI object to extension data. */
2460
0
        sni->next = (SNI*)extension->data;
2461
0
        extension->data = (void*)sni;
2462
2463
        /* remove duplicate SNI, there should be only one of each type. */
2464
0
        do {
2465
0
            if (sni->next && sni->next->type == type) {
2466
0
                SNI* next = sni->next;
2467
2468
0
                sni->next = next->next;
2469
0
                TLSX_SNI_Free(next, heap);
2470
2471
                /* there is no way to occur more than
2472
                 * two SNIs of the same type.
2473
                 */
2474
0
                break;
2475
0
            }
2476
0
        } while ((sni = sni->next));
2477
0
    }
2478
2479
28
    return WOLFSSL_SUCCESS;
2480
28
}
2481
2482
#ifndef NO_WOLFSSL_SERVER
2483
2484
/** Tells the SNI requested by the client. */
2485
word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data,
2486
        byte ignoreStatus)
2487
0
{
2488
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2489
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2490
2491
0
    if (sni && (ignoreStatus || sni->status != WOLFSSL_SNI_NO_MATCH)) {
2492
0
        switch (sni->type) {
2493
0
            case WOLFSSL_SNI_HOST_NAME:
2494
0
                if (data) {
2495
0
                    *data = sni->data.host_name;
2496
0
                    return (word16)XSTRLEN((char*)*data);
2497
0
                }
2498
0
        }
2499
0
    }
2500
2501
0
    return 0;
2502
0
}
2503
2504
/** Sets the options for a SNI object. */
2505
void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
2506
0
{
2507
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2508
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2509
2510
0
    if (sni)
2511
0
        sni->options = options;
2512
0
}
2513
2514
/** Retrieves a SNI request from a client hello buffer. */
2515
int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
2516
                           byte type, byte* sni, word32* inOutSz)
2517
0
{
2518
0
    word32 offset = 0;
2519
0
    word32 len32 = 0;
2520
0
    word16 len16 = 0;
2521
2522
0
    if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
2523
0
        return INCOMPLETE_DATA;
2524
2525
    /* TLS record header */
2526
0
    if ((enum ContentType) clientHello[offset++] != handshake) {
2527
2528
        /* checking for SSLv2.0 client hello according to: */
2529
        /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
2530
0
        if ((enum HandShakeType) clientHello[++offset] == client_hello) {
2531
0
            offset += ENUM_LEN + VERSION_SZ; /* skip version */
2532
2533
0
            ato16(clientHello + offset, &len16);
2534
0
            offset += OPAQUE16_LEN;
2535
2536
0
            if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
2537
0
                return BUFFER_ERROR;
2538
2539
0
            ato16(clientHello + offset, &len16);
2540
            /* Returning SNI_UNSUPPORTED do not increment offset here */
2541
2542
0
            if (len16 != 0) /* session_id_length must be 0 */
2543
0
                return BUFFER_ERROR;
2544
2545
0
            WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2546
0
            return SNI_UNSUPPORTED;
2547
0
        }
2548
2549
0
        return BUFFER_ERROR;
2550
0
    }
2551
2552
0
    if (clientHello[offset++] != SSLv3_MAJOR)
2553
0
        return BUFFER_ERROR;
2554
2555
0
    if (clientHello[offset++] < TLSv1_MINOR) {
2556
0
        WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2557
0
        return SNI_UNSUPPORTED;
2558
0
    }
2559
2560
0
    ato16(clientHello + offset, &len16);
2561
0
    offset += OPAQUE16_LEN;
2562
2563
0
    if (offset + len16 > helloSz)
2564
0
        return INCOMPLETE_DATA;
2565
2566
    /* Handshake header */
2567
0
    if ((enum HandShakeType) clientHello[offset] != client_hello)
2568
0
        return BUFFER_ERROR;
2569
2570
0
    c24to32(clientHello + offset + 1, &len32);
2571
0
    offset += HANDSHAKE_HEADER_SZ;
2572
2573
0
    if (offset + len32 > helloSz)
2574
0
        return BUFFER_ERROR;
2575
2576
    /* client hello */
2577
0
    offset += VERSION_SZ + RAN_LEN; /* version, random */
2578
2579
0
    if (helloSz < offset + clientHello[offset])
2580
0
        return BUFFER_ERROR;
2581
2582
0
    offset += ENUM_LEN + clientHello[offset]; /* skip session id */
2583
2584
    /* cypher suites */
2585
0
    if (helloSz < offset + OPAQUE16_LEN)
2586
0
        return BUFFER_ERROR;
2587
2588
0
    ato16(clientHello + offset, &len16);
2589
0
    offset += OPAQUE16_LEN;
2590
2591
0
    if (helloSz < offset + len16)
2592
0
        return BUFFER_ERROR;
2593
2594
0
    offset += len16; /* skip cypher suites */
2595
2596
    /* compression methods */
2597
0
    if (helloSz < offset + 1)
2598
0
        return BUFFER_ERROR;
2599
2600
0
    if (helloSz < offset + clientHello[offset])
2601
0
        return BUFFER_ERROR;
2602
2603
0
    offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
2604
2605
    /* extensions */
2606
0
    if (helloSz < offset + OPAQUE16_LEN)
2607
0
        return 0; /* no extensions in client hello. */
2608
2609
0
    ato16(clientHello + offset, &len16);
2610
0
    offset += OPAQUE16_LEN;
2611
2612
0
    if (helloSz < offset + len16)
2613
0
        return BUFFER_ERROR;
2614
2615
0
    while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
2616
0
        word16 extType;
2617
0
        word16 extLen;
2618
2619
0
        ato16(clientHello + offset, &extType);
2620
0
        offset += OPAQUE16_LEN;
2621
2622
0
        ato16(clientHello + offset, &extLen);
2623
0
        offset += OPAQUE16_LEN;
2624
2625
0
        if (helloSz < offset + extLen)
2626
0
            return BUFFER_ERROR;
2627
2628
0
        if (extType != TLSX_SERVER_NAME) {
2629
0
            offset += extLen; /* skip extension */
2630
0
        } else {
2631
0
            word16 listLen;
2632
2633
0
            ato16(clientHello + offset, &listLen);
2634
0
            offset += OPAQUE16_LEN;
2635
2636
0
            if (helloSz < offset + listLen)
2637
0
                return BUFFER_ERROR;
2638
2639
0
            while (listLen > ENUM_LEN + OPAQUE16_LEN) {
2640
0
                byte   sniType = clientHello[offset++];
2641
0
                word16 sniLen;
2642
2643
0
                ato16(clientHello + offset, &sniLen);
2644
0
                offset += OPAQUE16_LEN;
2645
2646
0
                if (helloSz < offset + sniLen)
2647
0
                    return BUFFER_ERROR;
2648
2649
0
                if (sniType != type) {
2650
0
                    offset  += sniLen;
2651
0
                    listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
2652
0
                    continue;
2653
0
                }
2654
2655
0
                *inOutSz = min(sniLen, *inOutSz);
2656
0
                XMEMCPY(sni, clientHello + offset, *inOutSz);
2657
2658
0
                return WOLFSSL_SUCCESS;
2659
0
            }
2660
0
        }
2661
2662
0
        len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
2663
0
    }
2664
2665
0
    return len16 ? BUFFER_ERROR : 0;
2666
0
}
2667
2668
#endif
2669
2670
0
#define SNI_FREE_ALL     TLSX_SNI_FreeAll
2671
#define SNI_GET_SIZE     TLSX_SNI_GetSize
2672
#define SNI_WRITE        TLSX_SNI_Write
2673
#define SNI_PARSE        TLSX_SNI_Parse
2674
#define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
2675
2676
#else
2677
2678
#define SNI_FREE_ALL(list, heap) WC_DO_NOTHING
2679
#define SNI_GET_SIZE(list)     0
2680
#define SNI_WRITE(a, b)        0
2681
#define SNI_PARSE(a, b, c, d)  0
2682
#define SNI_VERIFY_PARSE(a, b) 0
2683
2684
#endif /* HAVE_SNI */
2685
2686
/******************************************************************************/
2687
/* Trusted CA Key Indication                                                  */
2688
/******************************************************************************/
2689
2690
#ifdef HAVE_TRUSTED_CA
2691
2692
/** Creates a new TCA object. */
2693
static TCA* TLSX_TCA_New(byte type, const byte* id, word16 idSz, void* heap)
2694
{
2695
    TCA* tca = (TCA*)XMALLOC(sizeof(TCA), heap, DYNAMIC_TYPE_TLSX);
2696
2697
    if (tca) {
2698
        XMEMSET(tca, 0, sizeof(TCA));
2699
        tca->type = type;
2700
2701
        switch (type) {
2702
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2703
                break;
2704
2705
            #ifndef NO_SHA
2706
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2707
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2708
                if (idSz == WC_SHA_DIGEST_SIZE &&
2709
                        (tca->id =
2710
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2711
                    XMEMCPY(tca->id, id, idSz);
2712
                    tca->idSz = idSz;
2713
                }
2714
                else {
2715
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2716
                    tca = NULL;
2717
                }
2718
                break;
2719
            #endif
2720
2721
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2722
                if (idSz > 0 &&
2723
                        (tca->id =
2724
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2725
                    XMEMCPY(tca->id, id, idSz);
2726
                    tca->idSz = idSz;
2727
                }
2728
                else {
2729
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2730
                    tca = NULL;
2731
                }
2732
                break;
2733
2734
            default: /* invalid type */
2735
                XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2736
                tca = NULL;
2737
        }
2738
    }
2739
2740
    (void)heap;
2741
2742
    return tca;
2743
}
2744
2745
/** Releases a TCA object. */
2746
static void TLSX_TCA_Free(TCA* tca, void* heap)
2747
{
2748
    (void)heap;
2749
2750
    if (tca) {
2751
        XFREE(tca->id, heap, DYNAMIC_TYPE_TLSX);
2752
        XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2753
    }
2754
}
2755
2756
/** Releases all TCA objects in the provided list. */
2757
static void TLSX_TCA_FreeAll(TCA* list, void* heap)
2758
{
2759
    TCA* tca;
2760
2761
    while ((tca = list)) {
2762
        list = tca->next;
2763
        TLSX_TCA_Free(tca, heap);
2764
    }
2765
}
2766
2767
/** Tells the buffered size of the TCA objects in a list. */
2768
static word16 TLSX_TCA_GetSize(TCA* list)
2769
{
2770
    TCA* tca;
2771
    word16 length = OPAQUE16_LEN; /* list length */
2772
2773
    while ((tca = list)) {
2774
        list = tca->next;
2775
2776
        length += ENUM_LEN; /* tca type */
2777
2778
        switch (tca->type) {
2779
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2780
                break;
2781
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2782
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2783
                length += tca->idSz;
2784
                break;
2785
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2786
                length += OPAQUE16_LEN + tca->idSz;
2787
                break;
2788
        }
2789
    }
2790
2791
    return length;
2792
}
2793
2794
/** Writes the TCA objects of a list in a buffer. */
2795
static word16 TLSX_TCA_Write(TCA* list, byte* output)
2796
{
2797
    TCA* tca;
2798
    word16 offset = OPAQUE16_LEN; /* list length offset */
2799
2800
    while ((tca = list)) {
2801
        list = tca->next;
2802
2803
        output[offset++] = tca->type; /* tca type */
2804
2805
        switch (tca->type) {
2806
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2807
                break;
2808
            #ifndef NO_SHA
2809
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2810
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2811
                if (tca->id != NULL) {
2812
                    XMEMCPY(output + offset, tca->id, tca->idSz);
2813
                    offset += tca->idSz;
2814
                }
2815
                else {
2816
                    /* ID missing. Set to an empty string. */
2817
                    c16toa(0, output + offset);
2818
                    offset += OPAQUE16_LEN;
2819
                }
2820
                break;
2821
            #endif
2822
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2823
                if (tca->id != NULL) {
2824
                    c16toa(tca->idSz, output + offset); /* tca length */
2825
                    offset += OPAQUE16_LEN;
2826
                    XMEMCPY(output + offset, tca->id, tca->idSz);
2827
                    offset += tca->idSz;
2828
                }
2829
                else {
2830
                    /* ID missing. Set to an empty string. */
2831
                    c16toa(0, output + offset);
2832
                    offset += OPAQUE16_LEN;
2833
                }
2834
                break;
2835
            default:
2836
                /* ID unknown. Set to an empty string. */
2837
                c16toa(0, output + offset);
2838
                offset += OPAQUE16_LEN;
2839
        }
2840
    }
2841
2842
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2843
2844
    return offset;
2845
}
2846
2847
#ifndef NO_WOLFSSL_SERVER
2848
static TCA* TLSX_TCA_Find(TCA *list, byte type, const byte* id, word16 idSz)
2849
{
2850
    TCA* tca = list;
2851
2852
    while (tca && tca->type != type && type != WOLFSSL_TRUSTED_CA_PRE_AGREED &&
2853
           idSz != tca->idSz && !XMEMCMP(id, tca->id, idSz))
2854
        tca = tca->next;
2855
2856
    return tca;
2857
}
2858
#endif /* NO_WOLFSSL_SERVER */
2859
2860
/** Parses a buffer of TCA extensions. */
2861
static int TLSX_TCA_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2862
                          byte isRequest)
2863
{
2864
#ifndef NO_WOLFSSL_SERVER
2865
    word16 size = 0;
2866
    word16 offset = 0;
2867
#endif
2868
2869
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
2870
2871
    if (!extension)
2872
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_TRUSTED_CA_KEYS);
2873
2874
    if (!isRequest) {
2875
        #ifndef NO_WOLFSSL_CLIENT
2876
            if (!extension || !extension->data)
2877
                return TLSX_HandleUnsupportedExtension(ssl);
2878
2879
            if (length > 0)
2880
                return BUFFER_ERROR; /* TCA response MUST be empty. */
2881
2882
            /* Set the flag that we're good for keys */
2883
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
2884
2885
            return 0;
2886
        #endif
2887
    }
2888
2889
#ifndef NO_WOLFSSL_SERVER
2890
    if (!extension || !extension->data) {
2891
        /* Skipping, TCA not enabled at server side. */
2892
        return 0;
2893
    }
2894
2895
    if (OPAQUE16_LEN > length)
2896
        return BUFFER_ERROR;
2897
2898
    ato16(input, &size);
2899
    offset += OPAQUE16_LEN;
2900
2901
    /* validating tca list length */
2902
    if (length != OPAQUE16_LEN + size)
2903
        return BUFFER_ERROR;
2904
2905
    for (size = 0; offset < length; offset += size) {
2906
        TCA *tca = NULL;
2907
        byte type;
2908
        const byte* id = NULL;
2909
        word16 idSz = 0;
2910
2911
        if (offset + ENUM_LEN > length)
2912
            return BUFFER_ERROR;
2913
2914
        type = input[offset++];
2915
2916
        switch (type) {
2917
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2918
                break;
2919
            #ifndef NO_SHA
2920
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2921
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2922
                if (offset + WC_SHA_DIGEST_SIZE > length)
2923
                    return BUFFER_ERROR;
2924
                idSz = WC_SHA_DIGEST_SIZE;
2925
                id = input + offset;
2926
                offset += idSz;
2927
                break;
2928
            #endif
2929
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2930
                if (offset + OPAQUE16_LEN > length)
2931
                    return BUFFER_ERROR;
2932
                ato16(input + offset, &idSz);
2933
                offset += OPAQUE16_LEN;
2934
                if ((offset > length) || (idSz > length - offset))
2935
                    return BUFFER_ERROR;
2936
                id = input + offset;
2937
                offset += idSz;
2938
                break;
2939
            default:
2940
                WOLFSSL_ERROR_VERBOSE(TCA_INVALID_ID_TYPE);
2941
                return TCA_INVALID_ID_TYPE;
2942
        }
2943
2944
        /* Find the type/ID in the TCA list. */
2945
        tca = TLSX_TCA_Find((TCA*)extension->data, type, id, idSz);
2946
        if (tca != NULL) {
2947
            /* Found it. Set the response flag and break out of the loop. */
2948
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
2949
            break;
2950
        }
2951
    }
2952
#else
2953
    (void)input;
2954
#endif
2955
2956
    return 0;
2957
}
2958
2959
/* Checks to see if the server sent a response for the TCA. */
2960
static int TLSX_TCA_VerifyParse(WOLFSSL* ssl, byte isRequest)
2961
{
2962
    (void)ssl;
2963
2964
    if (!isRequest) {
2965
        /* RFC 6066 section 6 states that the server responding
2966
         * to trusted_ca_keys is optional.  Do not error out unless
2967
         * opted into with the define WOLFSSL_REQUIRE_TCA. */
2968
    #if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_REQUIRE_TCA)
2969
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
2970
2971
        if (extension && !extension->resp) {
2972
            SendAlert(ssl, alert_fatal, handshake_failure);
2973
            WOLFSSL_ERROR_VERBOSE(TCA_ABSENT_ERROR);
2974
            return TCA_ABSENT_ERROR;
2975
        }
2976
    #else
2977
        WOLFSSL_MSG("No response received for trusted_ca_keys.  Continuing.");
2978
    #endif /* !NO_WOLFSSL_CLIENT && WOLFSSL_REQUIRE_TCA */
2979
    }
2980
2981
    return 0;
2982
}
2983
2984
int TLSX_UseTrustedCA(TLSX** extensions, byte type,
2985
                    const byte* id, word16 idSz, void* heap)
2986
{
2987
    TLSX* extension;
2988
    TCA* tca = NULL;
2989
2990
    if (extensions == NULL)
2991
        return BAD_FUNC_ARG;
2992
2993
    if ((tca = TLSX_TCA_New(type, id, idSz, heap)) == NULL)
2994
        return MEMORY_E;
2995
2996
    extension = TLSX_Find(*extensions, TLSX_TRUSTED_CA_KEYS);
2997
    if (!extension) {
2998
        int ret = TLSX_Push(extensions, TLSX_TRUSTED_CA_KEYS, (void*)tca, heap);
2999
3000
        if (ret != 0) {
3001
            TLSX_TCA_Free(tca, heap);
3002
            return ret;
3003
        }
3004
    }
3005
    else {
3006
        /* push new TCA object to extension data. */
3007
        tca->next = (TCA*)extension->data;
3008
        extension->data = (void*)tca;
3009
    }
3010
3011
    return WOLFSSL_SUCCESS;
3012
}
3013
3014
#define TCA_FREE_ALL     TLSX_TCA_FreeAll
3015
#define TCA_GET_SIZE     TLSX_TCA_GetSize
3016
#define TCA_WRITE        TLSX_TCA_Write
3017
#define TCA_PARSE        TLSX_TCA_Parse
3018
#define TCA_VERIFY_PARSE TLSX_TCA_VerifyParse
3019
3020
#else /* HAVE_TRUSTED_CA */
3021
3022
0
#define TCA_FREE_ALL(list, heap) WC_DO_NOTHING
3023
#define TCA_GET_SIZE(list)     0
3024
#define TCA_WRITE(a, b)        0
3025
#define TCA_PARSE(a, b, c, d)  0
3026
#define TCA_VERIFY_PARSE(a, b) 0
3027
3028
#endif /* HAVE_TRUSTED_CA */
3029
3030
/******************************************************************************/
3031
/* Max Fragment Length Negotiation                                            */
3032
/******************************************************************************/
3033
3034
#ifdef HAVE_MAX_FRAGMENT
3035
3036
static word16 TLSX_MFL_Write(byte* data, byte* output)
3037
{
3038
    output[0] = data[0];
3039
3040
    return ENUM_LEN;
3041
}
3042
3043
static int TLSX_MFL_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3044
                          byte isRequest)
3045
{
3046
    if (length != ENUM_LEN)
3047
        return BUFFER_ERROR;
3048
3049
#ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3050
    (void) isRequest;
3051
#else
3052
    if (!isRequest)
3053
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
3054
            return TLSX_HandleUnsupportedExtension(ssl);
3055
#endif
3056
3057
    switch (*input) {
3058
        case WOLFSSL_MFL_2_8 : ssl->max_fragment =  256; break;
3059
        case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
3060
        case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
3061
        case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
3062
        case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
3063
        case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
3064
3065
        default:
3066
            SendAlert(ssl, alert_fatal, illegal_parameter);
3067
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
3068
            return UNKNOWN_MAX_FRAG_LEN_E;
3069
    }
3070
    if (ssl->session != NULL) {
3071
        ssl->session->mfl = *input;
3072
    }
3073
3074
#ifndef NO_WOLFSSL_SERVER
3075
    if (isRequest) {
3076
        int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
3077
3078
        if (ret != WOLFSSL_SUCCESS)
3079
            return ret; /* throw error */
3080
3081
        TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
3082
    }
3083
#endif
3084
3085
    return 0;
3086
}
3087
3088
int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
3089
{
3090
    byte* data = NULL;
3091
    int ret = 0;
3092
3093
    if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
3094
        return BAD_FUNC_ARG;
3095
3096
    data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
3097
    if (data == NULL)
3098
        return MEMORY_E;
3099
3100
    data[0] = mfl;
3101
3102
    ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
3103
    if (ret != 0) {
3104
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
3105
        return ret;
3106
    }
3107
3108
    return WOLFSSL_SUCCESS;
3109
}
3110
3111
3112
#define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
3113
#define MFL_GET_SIZE(data) ENUM_LEN
3114
#define MFL_WRITE          TLSX_MFL_Write
3115
#define MFL_PARSE          TLSX_MFL_Parse
3116
3117
#else
3118
3119
0
#define MFL_FREE_ALL(a, b) WC_DO_NOTHING
3120
#define MFL_GET_SIZE(a)       0
3121
#define MFL_WRITE(a, b)       0
3122
#define MFL_PARSE(a, b, c, d) 0
3123
3124
#endif /* HAVE_MAX_FRAGMENT */
3125
3126
/******************************************************************************/
3127
/* Truncated HMAC                                                             */
3128
/******************************************************************************/
3129
3130
#ifdef HAVE_TRUNCATED_HMAC
3131
3132
static int TLSX_THM_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3133
                          byte isRequest)
3134
{
3135
    if (length != 0 || input == NULL)
3136
        return BUFFER_ERROR;
3137
3138
    if (!isRequest) {
3139
    #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3140
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
3141
            return TLSX_HandleUnsupportedExtension(ssl);
3142
    #endif
3143
    }
3144
    else {
3145
        #ifndef NO_WOLFSSL_SERVER
3146
            int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
3147
3148
            if (ret != WOLFSSL_SUCCESS)
3149
                return ret; /* throw error */
3150
3151
            TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
3152
        #endif
3153
    }
3154
3155
    ssl->truncated_hmac = 1;
3156
3157
    return 0;
3158
}
3159
3160
int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
3161
{
3162
    int ret = 0;
3163
3164
    if (extensions == NULL)
3165
        return BAD_FUNC_ARG;
3166
3167
    ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
3168
    if (ret != 0)
3169
        return ret;
3170
3171
    return WOLFSSL_SUCCESS;
3172
}
3173
3174
#define THM_PARSE TLSX_THM_Parse
3175
3176
#else
3177
3178
#define THM_PARSE(a, b, c, d) 0
3179
3180
#endif /* HAVE_TRUNCATED_HMAC */
3181
3182
/******************************************************************************/
3183
/* Certificate Status Request                                                 */
3184
/******************************************************************************/
3185
3186
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3187
3188
static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
3189
{
3190
    int i;
3191
3192
    switch (csr->status_type) {
3193
        case WOLFSSL_CSR_OCSP:
3194
            for (i = 0; i <= csr->requests; i++) {
3195
                FreeOcspRequest(&csr->request.ocsp[i]);
3196
            }
3197
        break;
3198
    }
3199
#ifdef WOLFSSL_TLS13
3200
    for (i = 0; i < MAX_CERT_EXTENSIONS; i++) {
3201
        if (csr->responses[i].buffer != NULL) {
3202
            XFREE(csr->responses[i].buffer, heap,
3203
                DYNAMIC_TYPE_TMP_BUFFER);
3204
        }
3205
    }
3206
#endif
3207
    XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3208
    (void)heap;
3209
}
3210
3211
word16 TLSX_CSR_GetSize_ex(CertificateStatusRequest* csr, byte isRequest,
3212
                                                             int idx)
3213
{
3214
    word16 size = 0;
3215
3216
    /* shut up compiler warnings */
3217
    (void) csr; (void) isRequest;
3218
#ifndef NO_WOLFSSL_CLIENT
3219
    if (isRequest) {
3220
        switch (csr->status_type) {
3221
            case WOLFSSL_CSR_OCSP:
3222
                size += ENUM_LEN + 2 * OPAQUE16_LEN;
3223
3224
                if (csr->request.ocsp[0].nonceSz)
3225
                    size += OCSP_NONCE_EXT_SZ;
3226
            break;
3227
        }
3228
    }
3229
#endif
3230
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3231
    if (!isRequest && IsAtLeastTLSv1_3(csr->ssl->version)) {
3232
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3233
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3234
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3235
            return OPAQUE8_LEN + OPAQUE24_LEN + csr->ssl->ocspCsrResp[idx].length;
3236
        }
3237
        return (word16)(OPAQUE8_LEN + OPAQUE24_LEN +
3238
                csr->responses[idx].length);
3239
    }
3240
#else
3241
    (void)idx;
3242
#endif
3243
    return size;
3244
}
3245
3246
#if (defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER))
3247
int TLSX_CSR_SetResponseWithStatusCB(WOLFSSL *ssl)
3248
{
3249
    WOLFSSL_OCSP *ocsp;
3250
    int ret;
3251
3252
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3253
        return BAD_FUNC_ARG;
3254
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3255
    if (ocsp == NULL || ocsp->statusCb == NULL)
3256
        return BAD_FUNC_ARG;
3257
    ret = ocsp->statusCb(ssl, ocsp->statusCbArg);
3258
    switch (ret) {
3259
        case WOLFSSL_OCSP_STATUS_CB_OK: {
3260
            size_t i;
3261
            for (i = 0; i < XELEM_CNT(ssl->ocspCsrResp); i++) {
3262
                if (ssl->ocspCsrResp[i].length > 0) {
3263
                    /* ack the extension, status cb provided the response in
3264
                     * ssl->ocspCsrResp */
3265
                    TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3266
                    ssl->status_request = WOLFSSL_CSR_OCSP;
3267
                    break;
3268
                }
3269
            }
3270
            ret = 0;
3271
            break;
3272
        }
3273
        case WOLFSSL_OCSP_STATUS_CB_NOACK:
3274
            /* suppressing as not critical */
3275
            ret = 0;
3276
            break;
3277
        case WOLFSSL_OCSP_STATUS_CB_ALERT_FATAL:
3278
        default:
3279
            ret = WOLFSSL_FATAL_ERROR;
3280
            break;
3281
    }
3282
    return ret;
3283
}
3284
3285
static int TLSX_CSR_WriteWithStatusCB(CertificateStatusRequest* csr,
3286
    byte* output, int idx)
3287
{
3288
    WOLFSSL *ssl = csr->ssl;
3289
    WOLFSSL_OCSP *ocsp;
3290
    word16 offset = 0;
3291
    byte *response;
3292
    int respSz;
3293
3294
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3295
        return BAD_FUNC_ARG;
3296
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3297
    if (ocsp == NULL || ocsp->statusCb == NULL)
3298
        return BAD_FUNC_ARG;
3299
    response = ssl->ocspCsrResp[idx].buffer;
3300
    respSz = ssl->ocspCsrResp[idx].length;
3301
    if (response == NULL || respSz == 0)
3302
        return BAD_FUNC_ARG;
3303
    output[offset++] = WOLFSSL_CSR_OCSP;
3304
    c32to24(respSz, output + offset);
3305
    offset += OPAQUE24_LEN;
3306
    XMEMCPY(output + offset, response, respSz);
3307
    return offset + respSz;
3308
}
3309
#endif /* (TLS13 && !NO_WOLFSLL_SERVER) */
3310
3311
static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
3312
{
3313
    return TLSX_CSR_GetSize_ex(csr, isRequest, 0);
3314
}
3315
3316
int TLSX_CSR_Write_ex(CertificateStatusRequest* csr, byte* output,
3317
                          byte isRequest, int idx)
3318
{
3319
    /* shut up compiler warnings */
3320
    (void) csr; (void) output; (void) isRequest;
3321
3322
#ifndef NO_WOLFSSL_CLIENT
3323
    if (isRequest) {
3324
        int ret = 0;
3325
        word16 offset = 0;
3326
        word16 length = 0;
3327
3328
        /* type */
3329
        output[offset++] = csr->status_type;
3330
3331
        switch (csr->status_type) {
3332
            case WOLFSSL_CSR_OCSP:
3333
                /* responder id list */
3334
                c16toa(0, output + offset);
3335
                offset += OPAQUE16_LEN;
3336
3337
                /* request extensions */
3338
                if (csr->request.ocsp[0].nonceSz) {
3339
                    ret = (int)EncodeOcspRequestExtensions(&csr->request.ocsp[0],
3340
                                                 output + offset + OPAQUE16_LEN,
3341
                                                 OCSP_NONCE_EXT_SZ);
3342
3343
                    if (ret > 0) {
3344
                        length = (word16)ret;
3345
                    }
3346
                    else {
3347
                        return ret;
3348
                    }
3349
                }
3350
3351
                c16toa(length, output + offset);
3352
                offset += OPAQUE16_LEN + length;
3353
3354
            break;
3355
        }
3356
3357
        return (int)offset;
3358
    }
3359
#endif
3360
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3361
    if (!isRequest && IsAtLeastTLSv1_3(csr->ssl->version)) {
3362
        word16 offset = 0;
3363
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3364
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3365
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3366
            return TLSX_CSR_WriteWithStatusCB(csr, output, idx);
3367
        }
3368
        output[offset++] = csr->status_type;
3369
        c32to24(csr->responses[idx].length, output + offset);
3370
        offset += OPAQUE24_LEN;
3371
        XMEMCPY(output + offset, csr->responses[idx].buffer,
3372
                                        csr->responses[idx].length);
3373
        offset += (word16)csr->responses[idx].length;
3374
        return offset;
3375
    }
3376
#else
3377
    (void)idx;
3378
#endif
3379
3380
    return 0;
3381
}
3382
3383
static int TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
3384
                          byte isRequest)
3385
{
3386
    return TLSX_CSR_Write_ex(csr, output, isRequest, 0);
3387
}
3388
3389
#if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
3390
    defined(WOLFSSL_TLS_OCSP_MULTI)
3391
/* Process OCSP request certificate chain
3392
 *
3393
 * ssl       SSL/TLS object.
3394
 * returns 0 on success, otherwise failure.
3395
 */
3396
int ProcessChainOCSPRequest(WOLFSSL* ssl)
3397
{
3398
    DecodedCert* cert;
3399
    OcspRequest* request;
3400
    TLSX* extension;
3401
    CertificateStatusRequest* csr;
3402
    DerBuffer* chain;
3403
    word32 pos = 0;
3404
    buffer der;
3405
    int i = 1;
3406
    int ret = 0;
3407
    byte ctxOwnsRequest = 0;
3408
3409
    /* use certChain if available, otherwise use peer certificate */
3410
    chain = ssl->buffers.certChain;
3411
    if (chain == NULL) {
3412
        chain = ssl->buffers.certificate;
3413
    }
3414
3415
    extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3416
    csr = extension ?
3417
                (CertificateStatusRequest*)extension->data : NULL;
3418
    if (csr == NULL)
3419
        return MEMORY_ERROR;
3420
3421
    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
3422
                                         DYNAMIC_TYPE_DCERT);
3423
    if (cert == NULL) {
3424
        return MEMORY_E;
3425
    }
3426
3427
    if (chain && chain->buffer) {
3428
        while (ret == 0 && pos + OPAQUE24_LEN < chain->length) {
3429
            c24to32(chain->buffer + pos, &der.length);
3430
            pos += OPAQUE24_LEN;
3431
            der.buffer = chain->buffer + pos;
3432
            pos += der.length;
3433
3434
            if (pos > chain->length)
3435
                break;
3436
            request = &csr->request.ocsp[i];
3437
            if (ret == 0) {
3438
                ret = CreateOcspRequest(ssl, request, cert,
3439
                        der.buffer, der.length, &ctxOwnsRequest);
3440
                if (ctxOwnsRequest) {
3441
                    wolfSSL_Mutex* ocspLock =
3442
                        &SSL_CM(ssl)->ocsp_stapling->ocspLock;
3443
                    if (wc_LockMutex(ocspLock) == 0) {
3444
                        /* the request is ours */
3445
                        ssl->ctx->certOcspRequest = NULL;
3446
                    }
3447
                    wc_UnLockMutex(ocspLock);
3448
                }
3449
            }
3450
3451
            if (ret == 0) {
3452
                request->ssl = ssl;
3453
                ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
3454
                                 request, &csr->responses[i], ssl->heap);
3455
                /* Suppressing, not critical */
3456
                if (ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED) ||
3457
                    ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) ||
3458
                    ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL)) {
3459
                    ret = 0;
3460
                }
3461
                i++;
3462
                csr->requests++;
3463
            }
3464
        }
3465
    }
3466
    XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3467
3468
    return ret;
3469
}
3470
#endif
3471
3472
static int TLSX_CSR_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3473
                          byte isRequest)
3474
{
3475
    int ret;
3476
#if !defined(NO_WOLFSSL_SERVER)
3477
    byte status_type;
3478
    word16 size = 0;
3479
#endif
3480
3481
#if !defined(NO_WOLFSSL_CLIENT)
3482
    OcspRequest* request;
3483
    TLSX* extension;
3484
    CertificateStatusRequest* csr;
3485
#endif
3486
3487
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
3488
 || !defined(NO_WOLFSSL_SERVER)
3489
    word32 offset = 0;
3490
#endif
3491
3492
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
3493
    word32 resp_length = 0;
3494
#endif
3495
3496
    /* shut up compiler warnings */
3497
    (void) ssl; (void) input;
3498
3499
    if (!isRequest) {
3500
#ifndef NO_WOLFSSL_CLIENT
3501
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3502
        csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3503
3504
        if (!csr) {
3505
            /* look at context level */
3506
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
3507
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3508
3509
            if (!csr) /* unexpected extension */
3510
                return TLSX_HandleUnsupportedExtension(ssl);
3511
3512
            /* enable extension at ssl level */
3513
            ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
3514
                                     csr->status_type, csr->options, ssl,
3515
                                     ssl->heap, ssl->devId);
3516
            if (ret != WOLFSSL_SUCCESS)
3517
                return ret == 0 ? -1 : ret;
3518
3519
            switch (csr->status_type) {
3520
                case WOLFSSL_CSR_OCSP:
3521
                    /* propagate nonce */
3522
                    if (csr->request.ocsp[0].nonceSz) {
3523
                        request =
3524
                            (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
3525
3526
                        if (request) {
3527
                            XMEMCPY(request->nonce, csr->request.ocsp[0].nonce,
3528
                                        (size_t)csr->request.ocsp[0].nonceSz);
3529
                            request->nonceSz = csr->request.ocsp[0].nonceSz;
3530
                        }
3531
                    }
3532
                break;
3533
            }
3534
        }
3535
3536
        ssl->status_request = 1;
3537
3538
    #ifdef WOLFSSL_TLS13
3539
        if (ssl->options.tls1_3) {
3540
            /* Get the new extension potentially created above. */
3541
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3542
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3543
            if (csr == NULL)
3544
                return MEMORY_ERROR;
3545
3546
            ret = 0;
3547
            if (OPAQUE8_LEN + OPAQUE24_LEN > length)
3548
                ret = BUFFER_ERROR;
3549
            if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP) {
3550
                ret = BAD_CERTIFICATE_STATUS_ERROR;
3551
                WOLFSSL_ERROR_VERBOSE(ret);
3552
            }
3553
            if (ret == 0) {
3554
                c24to32(input + offset, &resp_length);
3555
                offset += OPAQUE24_LEN;
3556
                if (offset + resp_length != length)
3557
                    ret = BUFFER_ERROR;
3558
            }
3559
            if (ret == 0) {
3560
                if (ssl->response_idx < (1 + MAX_CHAIN_DEPTH))
3561
                    csr->responses[ssl->response_idx].buffer =
3562
                    (byte*)XMALLOC(resp_length, ssl->heap,
3563
                        DYNAMIC_TYPE_TMP_BUFFER);
3564
                else
3565
                    ret = BAD_FUNC_ARG;
3566
3567
                if (ret == 0 &&
3568
                        csr->responses[ssl->response_idx].buffer == NULL)
3569
                    ret = MEMORY_ERROR;
3570
            }
3571
            if (ret == 0) {
3572
                XMEMCPY(csr->responses[ssl->response_idx].buffer,
3573
                                            input + offset, resp_length);
3574
                csr->responses[ssl->response_idx].length = resp_length;
3575
            }
3576
3577
            return ret;
3578
        }
3579
        else
3580
    #endif
3581
        {
3582
            /* extension_data MUST be empty. */
3583
            return length ? BUFFER_ERROR : 0;
3584
        }
3585
#endif
3586
    }
3587
    else {
3588
#ifndef NO_WOLFSSL_SERVER
3589
        if (length == 0)
3590
            return 0;
3591
3592
        status_type = input[offset++];
3593
3594
        switch (status_type) {
3595
            case WOLFSSL_CSR_OCSP: {
3596
3597
                /* skip responder_id_list */
3598
                if ((int)(length - offset) < OPAQUE16_LEN)
3599
                    return BUFFER_ERROR;
3600
3601
                ato16(input + offset, &size);
3602
                offset += OPAQUE16_LEN + size;
3603
3604
                /* skip request_extensions */
3605
                if ((int)(length - offset) < OPAQUE16_LEN)
3606
                    return BUFFER_ERROR;
3607
3608
                ato16(input + offset, &size);
3609
                offset += OPAQUE16_LEN + size;
3610
3611
                if (offset > length)
3612
                    return BUFFER_ERROR;
3613
3614
                /* is able to send OCSP response? */
3615
                if (SSL_CM(ssl) == NULL || !SSL_CM(ssl)->ocspStaplingEnabled)
3616
                    return 0;
3617
            }
3618
            break;
3619
3620
            /* unknown status type */
3621
            default:
3622
                return 0;
3623
        }
3624
3625
        /* if using status_request and already sending it, skip this one */
3626
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3627
        if (ssl->status_request_v2)
3628
            return 0;
3629
        #endif
3630
3631
        /* accept the first good status_type and return */
3632
        ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
3633
                                                 0, ssl, ssl->heap, ssl->devId);
3634
        if (ret != WOLFSSL_SUCCESS)
3635
            return ret == 0 ? -1 : ret; /* throw error */
3636
3637
        TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3638
        ssl->status_request = status_type;
3639
#endif
3640
    }
3641
3642
    return 0;
3643
}
3644
3645
int TLSX_CSR_InitRequest_ex(TLSX* extensions, DecodedCert* cert,
3646
                                                            void* heap, int idx)
3647
{
3648
     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3649
    CertificateStatusRequest* csr = extension ?
3650
        (CertificateStatusRequest*)extension->data : NULL;
3651
    int ret = 0;
3652
3653
    if (csr) {
3654
        switch (csr->status_type) {
3655
            case WOLFSSL_CSR_OCSP: {
3656
                byte nonce[MAX_OCSP_NONCE_SZ];
3657
                int  req_cnt = idx == -1 ? csr->requests : idx;
3658
                int  nonceSz = csr->request.ocsp[0].nonceSz;
3659
                OcspRequest* request;
3660
3661
                request = &csr->request.ocsp[req_cnt];
3662
                if (request->serial != NULL) {
3663
                    /* clear request contents before reuse */
3664
                    FreeOcspRequest(request);
3665
                    if (csr->requests > 0)
3666
                        csr->requests--;
3667
                }
3668
                /* preserve nonce */
3669
                XMEMCPY(nonce, csr->request.ocsp->nonce, (size_t)nonceSz);
3670
3671
                if (req_cnt < MAX_CERT_EXTENSIONS) {
3672
                    if ((ret = InitOcspRequest(request, cert, 0, heap)) != 0)
3673
                        return ret;
3674
3675
                    /* restore nonce */
3676
                    XMEMCPY(csr->request.ocsp->nonce, nonce, (size_t)nonceSz);
3677
                    request->nonceSz = nonceSz;
3678
                    csr->requests++;
3679
                }
3680
                else {
3681
                    WOLFSSL_ERROR_VERBOSE(MAX_CERT_EXTENSIONS_ERR);
3682
                    return MAX_CERT_EXTENSIONS_ERR;
3683
                }
3684
            }
3685
            break;
3686
        }
3687
    }
3688
3689
    return ret;
3690
}
3691
3692
int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
3693
{
3694
    return TLSX_CSR_InitRequest_ex(extensions, cert, heap, -1);
3695
}
3696
3697
void* TLSX_CSR_GetRequest_ex(TLSX* extensions, int idx)
3698
{
3699
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3700
    CertificateStatusRequest* csr = extension ?
3701
                              (CertificateStatusRequest*)extension->data : NULL;
3702
3703
    if (csr && csr->ssl) {
3704
        switch (csr->status_type) {
3705
            case WOLFSSL_CSR_OCSP:
3706
                if (IsAtLeastTLSv1_3(csr->ssl->version)) {
3707
                    return idx < csr->requests ? &csr->request.ocsp[idx] : NULL;
3708
                }
3709
                else {
3710
                    return idx == 0 ? &csr->request.ocsp[0] : NULL;
3711
                }
3712
        }
3713
    }
3714
3715
    return NULL;
3716
}
3717
3718
void* TLSX_CSR_GetRequest(TLSX* extensions)
3719
{
3720
    return TLSX_CSR_GetRequest_ex(extensions, 0);
3721
}
3722
3723
int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
3724
{
3725
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3726
    CertificateStatusRequest* csr = extension ?
3727
                              (CertificateStatusRequest*)extension->data : NULL;
3728
3729
    if (csr) {
3730
        switch (csr->status_type) {
3731
            case WOLFSSL_CSR_OCSP:
3732
                if (SSL_CM(ssl)->ocspEnabled) {
3733
                    csr->request.ocsp[0].ssl = ssl;
3734
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
3735
                                              &csr->request.ocsp[0], NULL, NULL);
3736
                }
3737
                else {
3738
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
3739
                    return OCSP_LOOKUP_FAIL;
3740
                }
3741
        }
3742
    }
3743
3744
    return 0;
3745
}
3746
3747
int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
3748
                                         byte options, WOLFSSL* ssl, void* heap,
3749
                                                                      int devId)
3750
{
3751
    CertificateStatusRequest* csr = NULL;
3752
    int ret = 0;
3753
3754
    if (!extensions || status_type != WOLFSSL_CSR_OCSP)
3755
        return BAD_FUNC_ARG;
3756
3757
    csr = (CertificateStatusRequest*)
3758
             XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
3759
    if (!csr)
3760
        return MEMORY_E;
3761
3762
    ForceZero(csr, sizeof(CertificateStatusRequest));
3763
#if defined(WOLFSSL_TLS13)
3764
    XMEMSET(csr->responses, 0, sizeof(csr->responses));
3765
#endif
3766
    csr->status_type = status_type;
3767
    csr->options     = options;
3768
    csr->ssl         = ssl;
3769
3770
    switch (csr->status_type) {
3771
        case WOLFSSL_CSR_OCSP:
3772
            if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
3773
                WC_RNG rng;
3774
3775
            #ifndef HAVE_FIPS
3776
                ret = wc_InitRng_ex(&rng, heap, devId);
3777
            #else
3778
                ret = wc_InitRng(&rng);
3779
                (void)devId;
3780
            #endif
3781
                if (ret == 0) {
3782
                    if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp[0].nonce,
3783
                                                        MAX_OCSP_NONCE_SZ) == 0)
3784
                        csr->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
3785
3786
                    wc_FreeRng(&rng);
3787
                }
3788
            }
3789
        break;
3790
    }
3791
3792
    if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
3793
        XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3794
        return ret;
3795
    }
3796
3797
    return WOLFSSL_SUCCESS;
3798
}
3799
3800
#define CSR_FREE_ALL TLSX_CSR_Free
3801
#define CSR_GET_SIZE TLSX_CSR_GetSize
3802
#define CSR_WRITE    TLSX_CSR_Write
3803
#define CSR_PARSE    TLSX_CSR_Parse
3804
3805
#else
3806
3807
0
#define CSR_FREE_ALL(data, heap) WC_DO_NOTHING
3808
#define CSR_GET_SIZE(a, b)    0
3809
#define CSR_WRITE(a, b, c)    0
3810
#define CSR_PARSE(a, b, c, d) 0
3811
3812
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
3813
3814
/******************************************************************************/
3815
/* Certificate Status Request v2                                              */
3816
/******************************************************************************/
3817
3818
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3819
3820
static void TLSX_CSR2_FreePendingSigners(Signer *s, void* heap)
3821
{
3822
    Signer* next;
3823
    while(s) {
3824
        next = s->next;
3825
        FreeSigner(s, heap);
3826
        s = next;
3827
    }
3828
}
3829
static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
3830
{
3831
    CertificateStatusRequestItemV2* next;
3832
3833
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, heap);
3834
    for (; csr2; csr2 = next) {
3835
        next = csr2->next;
3836
3837
        switch (csr2->status_type) {
3838
            case WOLFSSL_CSR2_OCSP:
3839
            case WOLFSSL_CSR2_OCSP_MULTI:
3840
                while(csr2->requests--)
3841
                    FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
3842
            break;
3843
        }
3844
3845
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
3846
    }
3847
    (void)heap;
3848
}
3849
3850
static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
3851
                                                                 byte isRequest)
3852
{
3853
    word16 size = 0;
3854
3855
    /* shut up compiler warnings */
3856
    (void) csr2; (void) isRequest;
3857
3858
#ifndef NO_WOLFSSL_CLIENT
3859
    if (isRequest) {
3860
        CertificateStatusRequestItemV2* next;
3861
3862
        for (size = OPAQUE16_LEN; csr2; csr2 = next) {
3863
            next = csr2->next;
3864
3865
            switch (csr2->status_type) {
3866
                case WOLFSSL_CSR2_OCSP:
3867
                case WOLFSSL_CSR2_OCSP_MULTI:
3868
                    size += ENUM_LEN + 3 * OPAQUE16_LEN;
3869
3870
                    if (csr2->request.ocsp[0].nonceSz)
3871
                        size += OCSP_NONCE_EXT_SZ;
3872
                break;
3873
            }
3874
        }
3875
    }
3876
#endif
3877
3878
    return size;
3879
}
3880
3881
static int TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
3882
                                                   byte* output, byte isRequest)
3883
{
3884
    /* shut up compiler warnings */
3885
    (void) csr2; (void) output; (void) isRequest;
3886
3887
#ifndef NO_WOLFSSL_CLIENT
3888
    if (isRequest) {
3889
        int ret = 0;
3890
        word16 offset;
3891
        word16 length;
3892
3893
        for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
3894
            /* status_type */
3895
            output[offset++] = csr2->status_type;
3896
3897
            /* request */
3898
            switch (csr2->status_type) {
3899
                case WOLFSSL_CSR2_OCSP:
3900
                case WOLFSSL_CSR2_OCSP_MULTI:
3901
                    /* request_length */
3902
                    length = 2 * OPAQUE16_LEN;
3903
3904
                    if (csr2->request.ocsp[0].nonceSz)
3905
                        length += OCSP_NONCE_EXT_SZ;
3906
3907
                    c16toa(length, output + offset);
3908
                    offset += OPAQUE16_LEN;
3909
3910
                    /* responder id list */
3911
                    c16toa(0, output + offset);
3912
                    offset += OPAQUE16_LEN;
3913
3914
                    /* request extensions */
3915
                    length = 0;
3916
3917
                    if (csr2->request.ocsp[0].nonceSz) {
3918
                        ret = (int)EncodeOcspRequestExtensions(
3919
                                                 &csr2->request.ocsp[0],
3920
                                                 output + offset + OPAQUE16_LEN,
3921
                                                 OCSP_NONCE_EXT_SZ);
3922
3923
                        if (ret > 0) {
3924
                            length = (word16)ret;
3925
                        }
3926
                        else {
3927
                            return ret;
3928
                        }
3929
                    }
3930
3931
                    c16toa(length, output + offset);
3932
                    offset += OPAQUE16_LEN + length;
3933
                break;
3934
            }
3935
        }
3936
3937
        /* list size */
3938
        c16toa(offset - OPAQUE16_LEN, output);
3939
3940
        return (int)offset;
3941
    }
3942
#endif
3943
3944
    return 0;
3945
}
3946
3947
static int TLSX_CSR2_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3948
                           byte isRequest)
3949
{
3950
    int ret;
3951
3952
    /* shut up compiler warnings */
3953
    (void) ssl; (void) input;
3954
3955
    if (!isRequest) {
3956
#ifndef NO_WOLFSSL_CLIENT
3957
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
3958
        CertificateStatusRequestItemV2* csr2 = extension ?
3959
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3960
3961
        if (!csr2) {
3962
            /* look at context level */
3963
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
3964
            csr2 = extension ?
3965
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3966
3967
            if (!csr2) /* unexpected extension */
3968
                return TLSX_HandleUnsupportedExtension(ssl);
3969
3970
            /* enable extension at ssl level */
3971
            for (; csr2; csr2 = csr2->next) {
3972
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
3973
                                    csr2->status_type, csr2->options, ssl->heap,
3974
                                                                    ssl->devId);
3975
                if (ret != WOLFSSL_SUCCESS)
3976
                    return ret;
3977
3978
                switch (csr2->status_type) {
3979
                    case WOLFSSL_CSR2_OCSP:
3980
                        /* followed by */
3981
                    case WOLFSSL_CSR2_OCSP_MULTI:
3982
                        /* propagate nonce */
3983
                        if (csr2->request.ocsp[0].nonceSz) {
3984
                            OcspRequest* request =
3985
                             (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
3986
                                                          csr2->status_type, 0);
3987
3988
                            if (request) {
3989
                                XMEMCPY(request->nonce,
3990
                                        csr2->request.ocsp[0].nonce,
3991
                                        (size_t)csr2->request.ocsp[0].nonceSz);
3992
3993
                                request->nonceSz =
3994
                                                  csr2->request.ocsp[0].nonceSz;
3995
                            }
3996
                        }
3997
                    break;
3998
                }
3999
            }
4000
        }
4001
4002
        ssl->status_request_v2 = 1;
4003
4004
        return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
4005
#endif
4006
    }
4007
    else {
4008
#ifndef NO_WOLFSSL_SERVER
4009
        byte   status_type;
4010
        word16 request_length;
4011
        word16 offset = 0;
4012
        word16 size = 0;
4013
4014
        /* list size */
4015
        if (offset + OPAQUE16_LEN >= length) {
4016
            return BUFFER_E;
4017
        }
4018
4019
        ato16(input + offset, &request_length);
4020
        offset += OPAQUE16_LEN;
4021
4022
        if (length - OPAQUE16_LEN != request_length)
4023
            return BUFFER_ERROR;
4024
4025
        while (length > offset) {
4026
            if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
4027
                return BUFFER_ERROR;
4028
4029
            status_type = input[offset++];
4030
4031
            ato16(input + offset, &request_length);
4032
            offset += OPAQUE16_LEN;
4033
4034
            if (length - offset < request_length)
4035
                return BUFFER_ERROR;
4036
4037
            switch (status_type) {
4038
                case WOLFSSL_CSR2_OCSP:
4039
                case WOLFSSL_CSR2_OCSP_MULTI:
4040
                    /* skip responder_id_list */
4041
                    if ((int)(length - offset) < OPAQUE16_LEN)
4042
                        return BUFFER_ERROR;
4043
4044
                    ato16(input + offset, &size);
4045
                    if (length - offset < size)
4046
                        return BUFFER_ERROR;
4047
4048
                    offset += OPAQUE16_LEN + size;
4049
                    /* skip request_extensions */
4050
                    if ((int)(length - offset) < OPAQUE16_LEN)
4051
                        return BUFFER_ERROR;
4052
4053
                    ato16(input + offset, &size);
4054
                    if (length - offset < size)
4055
                        return BUFFER_ERROR;
4056
4057
                    offset += OPAQUE16_LEN + size;
4058
                    if (offset > length)
4059
                        return BUFFER_ERROR;
4060
4061
                    /* is able to send OCSP response? */
4062
                    if (SSL_CM(ssl) == NULL
4063
                    || !SSL_CM(ssl)->ocspStaplingEnabled)
4064
                        continue;
4065
                break;
4066
4067
                default:
4068
                    /* unknown status type, skipping! */
4069
                    offset += request_length;
4070
                    continue;
4071
            }
4072
4073
            /* if using status_request and already sending it, remove it
4074
             * and prefer to use the v2 version */
4075
            #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
4076
            if (ssl->status_request) {
4077
                ssl->status_request = 0;
4078
                TLSX_Remove(&ssl->extensions, TLSX_STATUS_REQUEST, ssl->heap);
4079
            }
4080
            #endif
4081
4082
            /* TLS 1.3 servers MUST NOT act upon presence or information in
4083
             * this extension (RFC 8448 Section 4.4.2.1).
4084
             */
4085
            if (!IsAtLeastTLSv1_3(ssl->version)) {
4086
                /* accept the first good status_type and return */
4087
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4088
                                         status_type, 0, ssl->heap, ssl->devId);
4089
                if (ret != WOLFSSL_SUCCESS)
4090
                    return ret; /* throw error */
4091
4092
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
4093
                ssl->status_request_v2 = status_type;
4094
            }
4095
4096
            return 0;
4097
        }
4098
#endif
4099
    }
4100
4101
    return 0;
4102
}
4103
4104
static CertificateStatusRequestItemV2* TLSX_CSR2_GetMulti(TLSX *extensions)
4105
{
4106
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4107
    CertificateStatusRequestItemV2* csr2 = extension ?
4108
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4109
4110
    for (; csr2; csr2 = csr2->next) {
4111
        if (csr2->status_type == WOLFSSL_CSR2_OCSP_MULTI)
4112
            return csr2;
4113
    }
4114
    return NULL;
4115
}
4116
4117
int TLSX_CSR2_IsMulti(TLSX *extensions)
4118
{
4119
    return TLSX_CSR2_GetMulti(extensions) != NULL;
4120
}
4121
4122
int TLSX_CSR2_AddPendingSigner(TLSX *extensions, Signer *s)
4123
{
4124
    CertificateStatusRequestItemV2* csr2;
4125
4126
    csr2 = TLSX_CSR2_GetMulti(extensions);
4127
    if (!csr2)
4128
        return WOLFSSL_FATAL_ERROR;
4129
4130
    s->next = csr2->pendingSigners;
4131
    csr2->pendingSigners = s;
4132
    return 0;
4133
}
4134
4135
Signer* TLSX_CSR2_GetPendingSigners(TLSX *extensions)
4136
{
4137
    CertificateStatusRequestItemV2* csr2;
4138
4139
    csr2 = TLSX_CSR2_GetMulti(extensions);
4140
    if (!csr2)
4141
        return NULL;
4142
4143
    return csr2->pendingSigners;
4144
}
4145
4146
int TLSX_CSR2_ClearPendingCA(WOLFSSL *ssl)
4147
{
4148
    CertificateStatusRequestItemV2* csr2;
4149
4150
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4151
    if (csr2 == NULL)
4152
        return 0;
4153
4154
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, SSL_CM(ssl)->heap);
4155
    csr2->pendingSigners = NULL;
4156
    return 0;
4157
}
4158
4159
int TLSX_CSR2_MergePendingCA(WOLFSSL* ssl)
4160
{
4161
    CertificateStatusRequestItemV2* csr2;
4162
    Signer *s, *next;
4163
    int r = 0;
4164
4165
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4166
    if (csr2 == NULL)
4167
        return 0;
4168
4169
    s = csr2->pendingSigners;
4170
    while (s != NULL) {
4171
        next = s->next;
4172
        r = AddSigner(SSL_CM(ssl), s);
4173
        if (r != 0)
4174
            FreeSigner(s, SSL_CM(ssl)->heap);
4175
        s = next;
4176
    }
4177
    csr2->pendingSigners = NULL;
4178
    return r;
4179
}
4180
4181
int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
4182
                                                                     void* heap)
4183
{
4184
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4185
    CertificateStatusRequestItemV2* csr2 = extension ?
4186
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4187
    int ret = 0;
4188
4189
    for (; csr2; csr2 = csr2->next) {
4190
        switch (csr2->status_type) {
4191
            case WOLFSSL_CSR2_OCSP:
4192
                if (!isPeer || csr2->requests != 0)
4193
                    break;
4194
4195
                FALL_THROUGH; /* followed by */
4196
4197
            case WOLFSSL_CSR2_OCSP_MULTI: {
4198
                if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
4199
                    byte nonce[MAX_OCSP_NONCE_SZ];
4200
                    int  nonceSz = csr2->request.ocsp[0].nonceSz;
4201
4202
                    /* preserve nonce, replicating nonce of ocsp[0] */
4203
                    XMEMCPY(nonce, csr2->request.ocsp[0].nonce,
4204
                    (size_t)nonceSz);
4205
4206
                    if ((ret = InitOcspRequest(
4207
                                      &csr2->request.ocsp[csr2->requests], cert,
4208
                                                                 0, heap)) != 0)
4209
                        return ret;
4210
4211
                    /* restore nonce */
4212
                    XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
4213
                                                        nonce, (size_t)nonceSz);
4214
                    csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
4215
                    csr2->requests++;
4216
                }
4217
            }
4218
            break;
4219
        }
4220
    }
4221
4222
    (void)cert;
4223
    return ret;
4224
}
4225
4226
void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
4227
{
4228
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4229
    CertificateStatusRequestItemV2* csr2 = extension ?
4230
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4231
4232
    for (; csr2; csr2 = csr2->next) {
4233
        if (csr2->status_type == status_type) {
4234
            switch (csr2->status_type) {
4235
                case WOLFSSL_CSR2_OCSP:
4236
                    /* followed by */
4237
4238
                case WOLFSSL_CSR2_OCSP_MULTI:
4239
                    /* requests are initialized in the reverse order */
4240
                    return idx < csr2->requests
4241
                         ? &csr2->request.ocsp[csr2->requests - idx - 1]
4242
                         : NULL;
4243
            }
4244
        }
4245
    }
4246
4247
    return NULL;
4248
}
4249
4250
int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
4251
{
4252
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4253
    CertificateStatusRequestItemV2* csr2 = extension ?
4254
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4255
4256
    /* forces only the first one */
4257
    if (csr2) {
4258
        switch (csr2->status_type) {
4259
            case WOLFSSL_CSR2_OCSP:
4260
                /* followed by */
4261
4262
            case WOLFSSL_CSR2_OCSP_MULTI:
4263
                if (SSL_CM(ssl)->ocspEnabled && csr2->requests >= 1) {
4264
                    csr2->request.ocsp[csr2->requests-1].ssl = ssl;
4265
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
4266
                                          &csr2->request.ocsp[csr2->requests-1], NULL, NULL);
4267
                }
4268
                else {
4269
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
4270
                    return OCSP_LOOKUP_FAIL;
4271
                }
4272
        }
4273
    }
4274
4275
    return 0;
4276
}
4277
4278
int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
4279
                                           byte options, void* heap, int devId)
4280
{
4281
    TLSX* extension = NULL;
4282
    CertificateStatusRequestItemV2* csr2 = NULL;
4283
    int ret = 0;
4284
4285
    if (!extensions)
4286
        return BAD_FUNC_ARG;
4287
4288
    if (status_type != WOLFSSL_CSR2_OCSP
4289
    &&  status_type != WOLFSSL_CSR2_OCSP_MULTI)
4290
        return BAD_FUNC_ARG;
4291
4292
    csr2 = (CertificateStatusRequestItemV2*)
4293
       XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
4294
    if (!csr2)
4295
        return MEMORY_E;
4296
4297
    ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
4298
4299
    csr2->status_type = status_type;
4300
    csr2->options     = options;
4301
    csr2->next        = NULL;
4302
4303
    switch (csr2->status_type) {
4304
        case WOLFSSL_CSR2_OCSP:
4305
        case WOLFSSL_CSR2_OCSP_MULTI:
4306
            if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
4307
                WC_RNG rng;
4308
4309
            #ifndef HAVE_FIPS
4310
                ret = wc_InitRng_ex(&rng, heap, devId);
4311
            #else
4312
                ret = wc_InitRng(&rng);
4313
                (void)devId;
4314
            #endif
4315
                if (ret == 0) {
4316
                    if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
4317
                                                        MAX_OCSP_NONCE_SZ) == 0)
4318
                        csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4319
4320
                    wc_FreeRng(&rng);
4321
                }
4322
            }
4323
        break;
4324
    }
4325
4326
    /* append new item */
4327
    if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
4328
        CertificateStatusRequestItemV2* last =
4329
                               (CertificateStatusRequestItemV2*)extension->data;
4330
4331
        if (last == NULL) {
4332
            XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4333
            return BAD_FUNC_ARG;
4334
        }
4335
4336
        for (; last->next; last = last->next);
4337
4338
        last->next = csr2;
4339
    }
4340
    else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
4341
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4342
        return ret;
4343
    }
4344
4345
    return WOLFSSL_SUCCESS;
4346
}
4347
4348
#define CSR2_FREE_ALL TLSX_CSR2_FreeAll
4349
#define CSR2_GET_SIZE TLSX_CSR2_GetSize
4350
#define CSR2_WRITE    TLSX_CSR2_Write
4351
#define CSR2_PARSE    TLSX_CSR2_Parse
4352
4353
#else
4354
4355
0
#define CSR2_FREE_ALL(data, heap) WC_DO_NOTHING
4356
#define CSR2_GET_SIZE(a, b)    0
4357
#define CSR2_WRITE(a, b, c)    0
4358
#define CSR2_PARSE(a, b, c, d) 0
4359
4360
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
4361
4362
#if defined(HAVE_SUPPORTED_CURVES) || \
4363
    (defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES))
4364
4365
/* Functions needed by TLSX_IsGroupSupported */
4366
#ifdef HAVE_LIBOQS
4367
static int mlkem_id2type(int id, int *type);
4368
static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group);
4369
#endif
4370
4371
/* Returns whether this group is supported.
4372
 *
4373
 * namedGroup  The named group to check.
4374
 * returns 1 when supported or 0 otherwise.
4375
 */
4376
static int TLSX_IsGroupSupported(int namedGroup)
4377
0
{
4378
0
    switch (namedGroup) {
4379
0
    #ifdef HAVE_FFDHE_2048
4380
0
        case WOLFSSL_FFDHE_2048:
4381
0
            break;
4382
0
    #endif
4383
    #ifdef HAVE_FFDHE_3072
4384
        case WOLFSSL_FFDHE_3072:
4385
            break;
4386
    #endif
4387
    #ifdef HAVE_FFDHE_4096
4388
        case WOLFSSL_FFDHE_4096:
4389
            break;
4390
    #endif
4391
    #ifdef HAVE_FFDHE_6144
4392
        case WOLFSSL_FFDHE_6144:
4393
            break;
4394
    #endif
4395
    #ifdef HAVE_FFDHE_8192
4396
        case WOLFSSL_FFDHE_8192:
4397
            break;
4398
    #endif
4399
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4400
0
        #ifdef HAVE_ECC_KOBLITZ
4401
0
        case WOLFSSL_ECC_SECP256K1:
4402
0
            break;
4403
0
        #endif
4404
0
        #ifndef NO_ECC_SECP
4405
0
        case WOLFSSL_ECC_SECP256R1:
4406
0
            break;
4407
0
        #endif /* !NO_ECC_SECP */
4408
0
        #ifdef HAVE_ECC_BRAINPOOL
4409
0
        case WOLFSSL_ECC_BRAINPOOLP256R1:
4410
0
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
4411
0
            break;
4412
0
        #endif
4413
0
        #ifdef WOLFSSL_SM2
4414
0
        case WOLFSSL_ECC_SM2P256V1:
4415
0
            break;
4416
0
        #endif /* WOLFSSL_SM2 */
4417
0
    #endif
4418
0
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4419
0
        case WOLFSSL_ECC_X25519:
4420
0
            break;
4421
0
    #endif
4422
0
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4423
0
        case WOLFSSL_ECC_X448:
4424
0
            break;
4425
0
    #endif
4426
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
4427
0
        #ifndef NO_ECC_SECP
4428
0
        case WOLFSSL_ECC_SECP384R1:
4429
0
            break;
4430
0
        #endif /* !NO_ECC_SECP */
4431
0
        #ifdef HAVE_ECC_BRAINPOOL
4432
0
        case WOLFSSL_ECC_BRAINPOOLP384R1:
4433
0
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
4434
0
            break;
4435
0
        #endif
4436
0
    #endif
4437
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
4438
0
        #ifndef NO_ECC_SECP
4439
0
        case WOLFSSL_ECC_SECP521R1:
4440
0
            break;
4441
0
        #endif /* !NO_ECC_SECP */
4442
0
    #endif
4443
0
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
4444
0
        #ifdef HAVE_ECC_KOBLITZ
4445
0
        case WOLFSSL_ECC_SECP160K1:
4446
0
            break;
4447
0
        #endif
4448
0
        #ifndef NO_ECC_SECP
4449
0
        case WOLFSSL_ECC_SECP160R1:
4450
0
            break;
4451
0
        #endif
4452
0
        #ifdef HAVE_ECC_SECPR2
4453
0
        case WOLFSSL_ECC_SECP160R2:
4454
0
            break;
4455
0
        #endif
4456
0
    #endif
4457
0
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
4458
0
        #ifdef HAVE_ECC_KOBLITZ
4459
0
        case WOLFSSL_ECC_SECP192K1:
4460
0
            break;
4461
0
        #endif
4462
0
        #ifndef NO_ECC_SECP
4463
0
        case WOLFSSL_ECC_SECP192R1:
4464
0
            break;
4465
0
        #endif
4466
0
    #endif
4467
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
4468
0
        #ifdef HAVE_ECC_KOBLITZ
4469
0
        case WOLFSSL_ECC_SECP224K1:
4470
0
            break;
4471
0
        #endif
4472
0
        #ifndef NO_ECC_SECP
4473
0
        case WOLFSSL_ECC_SECP224R1:
4474
0
            break;
4475
0
        #endif
4476
0
    #endif
4477
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
4478
0
        #ifdef HAVE_ECC_BRAINPOOL
4479
0
        case WOLFSSL_ECC_BRAINPOOLP512R1:
4480
0
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
4481
0
            break;
4482
0
        #endif
4483
0
    #endif
4484
#ifdef WOLFSSL_HAVE_MLKEM
4485
#ifndef WOLFSSL_NO_ML_KEM
4486
    #ifdef WOLFSSL_WC_MLKEM
4487
        #ifndef WOLFSSL_NO_ML_KEM_512
4488
            case WOLFSSL_ML_KEM_512:
4489
            case WOLFSSL_SECP256R1MLKEM512:
4490
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4491
            case WOLFSSL_X25519MLKEM512:
4492
        #endif
4493
        #endif
4494
        #ifndef WOLFSSL_NO_ML_KEM_768
4495
            case WOLFSSL_ML_KEM_768:
4496
            case WOLFSSL_SECP384R1MLKEM768:
4497
            case WOLFSSL_SECP256R1MLKEM768:
4498
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4499
            case WOLFSSL_X25519MLKEM768:
4500
        #endif
4501
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4502
            case WOLFSSL_X448MLKEM768:
4503
        #endif
4504
        #endif
4505
        #ifndef WOLFSSL_NO_ML_KEM_1024
4506
            case WOLFSSL_ML_KEM_1024:
4507
            case WOLFSSL_SECP521R1MLKEM1024:
4508
            case WOLFSSL_SECP384R1MLKEM1024:
4509
                break;
4510
        #endif
4511
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
4512
            case WOLFSSL_P256_ML_KEM_512_OLD:
4513
            case WOLFSSL_P384_ML_KEM_768_OLD:
4514
            case WOLFSSL_P521_ML_KEM_1024_OLD:
4515
                break;
4516
#endif
4517
    #elif defined(HAVE_LIBOQS)
4518
        case WOLFSSL_ML_KEM_512:
4519
        case WOLFSSL_ML_KEM_768:
4520
        case WOLFSSL_ML_KEM_1024:
4521
        {
4522
            int ret;
4523
            int id;
4524
            ret = mlkem_id2type(namedGroup, &id);
4525
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4526
                return 0;
4527
            }
4528
4529
            if (! ext_mlkem_enabled(id)) {
4530
                return 0;
4531
            }
4532
            break;
4533
        }
4534
4535
        case WOLFSSL_SECP256R1MLKEM512:
4536
        case WOLFSSL_SECP384R1MLKEM768:
4537
        case WOLFSSL_SECP256R1MLKEM768:
4538
        case WOLFSSL_SECP521R1MLKEM1024:
4539
        case WOLFSSL_SECP384R1MLKEM1024:
4540
        case WOLFSSL_X25519MLKEM512:
4541
        case WOLFSSL_X448MLKEM768:
4542
        case WOLFSSL_X25519MLKEM768:
4543
        {
4544
            int ret;
4545
            int id;
4546
            findEccPqc(NULL, &namedGroup, NULL, namedGroup);
4547
            ret = mlkem_id2type(namedGroup, &id);
4548
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4549
                return 0;
4550
            }
4551
4552
            if (! ext_mlkem_enabled(id)) {
4553
                return 0;
4554
            }
4555
            break;
4556
        }
4557
    #endif
4558
#endif /* WOLFSSL_NO_ML_KEM */
4559
#ifdef WOLFSSL_MLKEM_KYBER
4560
    #ifdef WOLFSSL_WC_MLKEM
4561
        #ifdef WOLFSSL_KYBER512
4562
            case WOLFSSL_KYBER_LEVEL1:
4563
            case WOLFSSL_P256_KYBER_LEVEL1:
4564
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4565
            case WOLFSSL_X25519_KYBER_LEVEL1:
4566
        #endif
4567
        #endif
4568
        #ifdef WOLFSSL_KYBER768
4569
            case WOLFSSL_KYBER_LEVEL3:
4570
            case WOLFSSL_P384_KYBER_LEVEL3:
4571
            case WOLFSSL_P256_KYBER_LEVEL3:
4572
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4573
            case WOLFSSL_X25519_KYBER_LEVEL3:
4574
        #endif
4575
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4576
            case WOLFSSL_X448_KYBER_LEVEL3:
4577
        #endif
4578
        #endif
4579
        #ifdef WOLFSSL_KYBER1024
4580
            case WOLFSSL_KYBER_LEVEL5:
4581
            case WOLFSSL_P521_KYBER_LEVEL5:
4582
        #endif
4583
                break;
4584
    #elif defined(HAVE_LIBOQS)
4585
        case WOLFSSL_KYBER_LEVEL1:
4586
        case WOLFSSL_KYBER_LEVEL3:
4587
        case WOLFSSL_KYBER_LEVEL5:
4588
        {
4589
            int ret;
4590
            int id;
4591
            ret = mlkem_id2type(namedGroup, &id);
4592
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4593
                return 0;
4594
            }
4595
4596
            if (! ext_mlkem_enabled(id)) {
4597
                return 0;
4598
            }
4599
            break;
4600
        }
4601
        case WOLFSSL_P256_KYBER_LEVEL1:
4602
        case WOLFSSL_P384_KYBER_LEVEL3:
4603
        case WOLFSSL_P256_KYBER_LEVEL3:
4604
        case WOLFSSL_P521_KYBER_LEVEL5:
4605
        case WOLFSSL_X25519_KYBER_LEVEL1:
4606
        case WOLFSSL_X448_KYBER_LEVEL3:
4607
        case WOLFSSL_X25519_KYBER_LEVEL3:
4608
        {
4609
            int ret;
4610
            int id;
4611
            findEccPqc(NULL, &namedGroup, NULL, namedGroup);
4612
            ret = mlkem_id2type(namedGroup, &id);
4613
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4614
                return 0;
4615
            }
4616
4617
            if (! ext_mlkem_enabled(id)) {
4618
                return 0;
4619
            }
4620
            break;
4621
        }
4622
    #endif
4623
#endif
4624
#endif /* WOLFSSL_HAVE_MLKEM */
4625
0
        default:
4626
0
            return 0;
4627
0
    }
4628
4629
0
    return 1;
4630
0
}
4631
#endif
4632
4633
/******************************************************************************/
4634
/* Supported Elliptic Curves                                                  */
4635
/******************************************************************************/
4636
4637
#ifdef HAVE_SUPPORTED_CURVES
4638
4639
#if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \
4640
                       && !defined(HAVE_FFDHE) && !defined(WOLFSSL_HAVE_MLKEM)
4641
#error Elliptic Curves Extension requires Elliptic Curve Cryptography or liboqs groups. \
4642
       Use --enable-ecc and/or --enable-liboqs in the configure script or \
4643
       define HAVE_ECC. Alternatively use FFDHE for DH cipher suites.
4644
#endif
4645
4646
static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
4647
                                                                     void* heap)
4648
316k
{
4649
316k
    if (curve == NULL)
4650
0
        return BAD_FUNC_ARG;
4651
4652
316k
    (void)heap;
4653
4654
316k
    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
4655
316k
                                                             DYNAMIC_TYPE_TLSX);
4656
316k
    if (*curve == NULL)
4657
207
        return MEMORY_E;
4658
4659
316k
    (*curve)->name = name;
4660
316k
    (*curve)->next = NULL;
4661
4662
316k
    return 0;
4663
316k
}
4664
4665
static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
4666
13.2k
{
4667
13.2k
    if (point == NULL)
4668
0
        return BAD_FUNC_ARG;
4669
4670
13.2k
    (void)heap;
4671
4672
13.2k
    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
4673
13.2k
                                                             DYNAMIC_TYPE_TLSX);
4674
13.2k
    if (*point == NULL)
4675
5
        return MEMORY_E;
4676
4677
13.2k
    (*point)->format = format;
4678
13.2k
    (*point)->next = NULL;
4679
4680
13.2k
    return 0;
4681
13.2k
}
4682
4683
static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
4684
26.1k
{
4685
26.1k
    SupportedCurve* curve;
4686
4687
342k
    while ((curve = list)) {
4688
316k
        list = curve->next;
4689
316k
        XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
4690
316k
    }
4691
26.1k
    (void)heap;
4692
26.1k
}
4693
4694
static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
4695
13.2k
{
4696
13.2k
    PointFormat* point;
4697
4698
26.5k
    while ((point = list)) {
4699
13.2k
        list = point->next;
4700
13.2k
        XFREE(point, heap, DYNAMIC_TYPE_TLSX);
4701
13.2k
    }
4702
13.2k
    (void)heap;
4703
13.2k
}
4704
4705
static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
4706
                                                                     void* heap)
4707
293k
{
4708
293k
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
4709
4710
2.45M
    while (list) {
4711
2.45M
        if (list->name == name) {
4712
2.46k
            ret = 0; /* curve already in use */
4713
2.46k
            break;
4714
2.46k
        }
4715
4716
2.44M
        if (list->next == NULL) {
4717
290k
            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
4718
290k
            break;
4719
290k
        }
4720
4721
2.15M
        list = list->next;
4722
2.15M
    }
4723
4724
293k
    return ret;
4725
293k
}
4726
4727
static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
4728
0
{
4729
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
4730
4731
0
    while (list) {
4732
0
        if (list->format == format) {
4733
0
            ret = 0; /* format already in use */
4734
0
            break;
4735
0
        }
4736
4737
0
        if (list->next == NULL) {
4738
0
            ret = TLSX_PointFormat_New(&list->next, format, heap);
4739
0
            break;
4740
0
        }
4741
4742
0
        list = list->next;
4743
0
    }
4744
4745
0
    return ret;
4746
0
}
4747
4748
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
4749
4750
#if defined(HAVE_FFDHE) && (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4751
                                                         defined(HAVE_CURVE448))
4752
static void TLSX_SupportedCurve_ValidateRequest(const WOLFSSL* ssl,
4753
                                                const byte* semaphore)
4754
29.5k
{
4755
    /* If all pre-defined parameter types for key exchange are supported then
4756
     * always send SupportedGroups extension.
4757
     */
4758
29.5k
    (void)ssl;
4759
29.5k
    (void)semaphore;
4760
29.5k
}
4761
#else
4762
static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4763
{
4764
    word16 i;
4765
    const Suites* suites = WOLFSSL_SUITES(ssl);
4766
4767
    for (i = 0; i < suites->suiteSz; i += 2) {
4768
        if (suites->suites[i] == TLS13_BYTE)
4769
            return;
4770
    #ifdef BUILD_TLS_SM4_GCM_SM3
4771
        if ((suites->suites[i] == CIPHER_BYTE) &&
4772
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
4773
            return;
4774
    #endif
4775
    #ifdef BUILD_TLS_SM4_CCM_SM3
4776
        if ((suites->suites[i] == CIPHER_BYTE) &&
4777
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
4778
            return;
4779
    #endif
4780
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4781
        if ((suites->suites[i] == SM_BYTE) &&
4782
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4783
            return;
4784
    #endif
4785
        if ((suites->suites[i] == ECC_BYTE) ||
4786
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4787
            (suites->suites[i] == CHACHA_BYTE)) {
4788
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4789
                                                          defined(HAVE_CURVE448)
4790
            return;
4791
        #endif
4792
        }
4793
        #ifdef HAVE_FFDHE
4794
        else {
4795
            return;
4796
        }
4797
        #endif
4798
    }
4799
4800
    /* turns semaphore on to avoid sending this extension. */
4801
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
4802
}
4803
#endif
4804
4805
/* Only send PointFormats if TLSv13, ECC or CHACHA cipher suite present.
4806
 */
4807
static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4808
29.5k
{
4809
29.5k
#ifdef HAVE_FFDHE
4810
29.5k
    (void)ssl;
4811
29.5k
    (void)semaphore;
4812
#else
4813
    word16 i;
4814
    const Suites* suites = WOLFSSL_SUITES(ssl);
4815
4816
    if (suites == NULL)
4817
        return;
4818
4819
    for (i = 0; i < suites->suiteSz; i += 2) {
4820
        if (suites->suites[i] == TLS13_BYTE)
4821
            return;
4822
    #ifdef BUILD_TLS_SM4_GCM_SM3
4823
        if ((suites->suites[i] == CIPHER_BYTE) &&
4824
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
4825
            return;
4826
    #endif
4827
    #ifdef BUILD_TLS_SM4_CCM_SM3
4828
        if ((suites->suites[i] == CIPHER_BYTE) &&
4829
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
4830
            return;
4831
    #endif
4832
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4833
        if ((suites->suites[i] == SM_BYTE) &&
4834
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4835
            return;
4836
    #endif
4837
        if ((suites->suites[i] == ECC_BYTE) ||
4838
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4839
            (suites->suites[i] == CHACHA_BYTE)) {
4840
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4841
                                                          defined(HAVE_CURVE448)
4842
            return;
4843
        #endif
4844
        }
4845
    }
4846
   /* turns semaphore on to avoid sending this extension. */
4847
   TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4848
#endif
4849
29.5k
}
4850
4851
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
4852
4853
#ifndef NO_WOLFSSL_SERVER
4854
4855
static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
4856
{
4857
#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4858
                                                          defined(HAVE_CURVE448)
4859
    (void)semaphore;
4860
#endif
4861
4862
    if (ssl->options.cipherSuite0 == TLS13_BYTE)
4863
        return;
4864
#ifdef BUILD_TLS_SM4_GCM_SM3
4865
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
4866
        (ssl->options.cipherSuite == TLS_SM4_GCM_SM3))
4867
        return;
4868
#endif
4869
#ifdef BUILD_TLS_SM4_CCM_SM3
4870
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
4871
        (ssl->options.cipherSuite == TLS_SM4_CCM_SM3))
4872
        return;
4873
#endif
4874
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4875
    if ((ssl->options.cipherSuite0 == SM_BYTE) &&
4876
        (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4877
        return;
4878
#endif
4879
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
4880
    if (ssl->options.cipherSuite0 == ECC_BYTE ||
4881
        ssl->options.cipherSuite0 == ECDHE_PSK_BYTE ||
4882
        ssl->options.cipherSuite0 == CHACHA_BYTE) {
4883
        return;
4884
    }
4885
#endif
4886
4887
    /* turns semaphore on to avoid sending this extension. */
4888
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4889
}
4890
4891
#endif /* !NO_WOLFSSL_SERVER */
4892
4893
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
4894
4895
static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
4896
15.2k
{
4897
15.2k
    SupportedCurve* curve;
4898
15.2k
    word16 length = OPAQUE16_LEN; /* list length */
4899
4900
275k
    while ((curve = list)) {
4901
259k
        list = curve->next;
4902
259k
        length += OPAQUE16_LEN; /* curve length */
4903
259k
    }
4904
4905
15.2k
    return length;
4906
15.2k
}
4907
4908
#endif
4909
4910
static word16 TLSX_PointFormat_GetSize(PointFormat* list)
4911
12.5k
{
4912
12.5k
    PointFormat* point;
4913
12.5k
    word16 length = ENUM_LEN; /* list length */
4914
4915
25.0k
    while ((point = list)) {
4916
12.5k
        list = point->next;
4917
12.5k
        length += ENUM_LEN; /* format length */
4918
12.5k
    }
4919
4920
12.5k
    return length;
4921
12.5k
}
4922
4923
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
4924
4925
static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
4926
15.2k
{
4927
15.2k
    word16 offset = OPAQUE16_LEN;
4928
4929
274k
    while (list) {
4930
259k
        c16toa(list->name, output + offset);
4931
259k
        offset += OPAQUE16_LEN;
4932
259k
        list = list->next;
4933
259k
    }
4934
4935
15.2k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
4936
4937
15.2k
    return offset;
4938
15.2k
}
4939
4940
#endif
4941
4942
static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
4943
12.5k
{
4944
12.5k
    word16 offset = ENUM_LEN;
4945
4946
25.0k
    while (list) {
4947
12.5k
        output[offset++] = list->format;
4948
12.5k
        list = list->next;
4949
12.5k
    }
4950
4951
12.5k
    output[0] = (byte)(offset - ENUM_LEN);
4952
4953
12.5k
    return offset;
4954
12.5k
}
4955
4956
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
4957
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
4958
4959
int TLSX_SupportedCurve_Parse(const WOLFSSL* ssl, const byte* input,
4960
                              word16 length, byte isRequest, TLSX** extensions)
4961
9.58k
{
4962
9.58k
    word16 offset;
4963
9.58k
    word16 name;
4964
9.58k
    int ret = 0;
4965
9.58k
    TLSX* extension;
4966
4967
9.58k
    if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
4968
#ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
4969
        return 0;
4970
#else
4971
0
        return BUFFER_ERROR; /* servers doesn't send this extension. */
4972
0
#endif
4973
0
    }
4974
9.58k
    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
4975
250
        return BUFFER_ERROR;
4976
9.33k
    ato16(input, &offset);
4977
    /* validating curve list length */
4978
9.33k
    if (length != OPAQUE16_LEN + offset)
4979
100
        return BUFFER_ERROR;
4980
9.23k
    offset = OPAQUE16_LEN;
4981
9.23k
    if (offset == length)
4982
12
        return 0;
4983
4984
9.22k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
4985
9.22k
    if (extension == NULL) {
4986
        /* Just accept what the peer wants to use */
4987
55.0k
        for (; offset < length; offset += OPAQUE16_LEN) {
4988
45.9k
            ato16(input + offset, &name);
4989
4990
45.9k
            ret = TLSX_UseSupportedCurve(extensions, name, ssl->heap);
4991
            /* If it is BAD_FUNC_ARG then it is a group we do not support, but
4992
             * that is fine. */
4993
45.9k
            if (ret != WOLFSSL_SUCCESS &&
4994
31.9k
                    ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
4995
105
                break;
4996
45.8k
            ret = 0;
4997
45.8k
        }
4998
9.22k
    }
4999
7
    else {
5000
        /* Find the intersection with what the user has set */
5001
7
        SupportedCurve* commonCurves = NULL;
5002
26
        for (; offset < length; offset += OPAQUE16_LEN) {
5003
19
            SupportedCurve* foundCurve = (SupportedCurve*)extension->data;
5004
19
            ato16(input + offset, &name);
5005
5006
41
            while (foundCurve != NULL && foundCurve->name != name)
5007
22
                foundCurve = foundCurve->next;
5008
5009
19
            if (foundCurve != NULL) {
5010
4
                ret = commonCurves == NULL ?
5011
3
                      TLSX_SupportedCurve_New(&commonCurves, name, ssl->heap) :
5012
4
                      TLSX_SupportedCurve_Append(commonCurves, name, ssl->heap);
5013
4
                if (ret != 0)
5014
0
                    break;
5015
4
            }
5016
19
        }
5017
        /* If no common curves return error. In TLS 1.3 we can still try to save
5018
         * this by using HRR. */
5019
7
        if (ret == 0 && commonCurves == NULL &&
5020
4
                !IsAtLeastTLSv1_3(ssl->version))
5021
0
            ret = ECC_CURVE_ERROR;
5022
7
        if (ret == 0) {
5023
            /* Now swap out the curves in the extension */
5024
7
            TLSX_SupportedCurve_FreeAll((SupportedCurve*)extension->data,
5025
7
                                        ssl->heap);
5026
7
            extension->data = commonCurves;
5027
7
            commonCurves = NULL;
5028
7
        }
5029
7
        TLSX_SupportedCurve_FreeAll(commonCurves, ssl->heap);
5030
7
    }
5031
5032
9.22k
    return ret;
5033
9.23k
}
5034
#endif
5035
5036
#if !defined(NO_WOLFSSL_SERVER)
5037
5038
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5039
5040
/* Checks the priority of the groups on the server and set the supported groups
5041
 * response if there is a group not advertised by the client that is preferred.
5042
 *
5043
 * ssl  SSL/TLS object.
5044
 * returns 0 on success, otherwise an error.
5045
 */
5046
int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
5047
656
{
5048
656
    int ret;
5049
656
    TLSX* extension;
5050
656
    TLSX* priority = NULL;
5051
656
    TLSX* ext = NULL;
5052
656
    word16 name;
5053
656
    SupportedCurve* curve;
5054
5055
656
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5056
    /* May be doing PSK with no key exchange. */
5057
656
    if (extension == NULL)
5058
0
        return 0;
5059
5060
656
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5061
656
    if (ret != WOLFSSL_SUCCESS) {
5062
20
        TLSX_FreeAll(priority, ssl->heap);
5063
20
        return ret;
5064
20
    }
5065
5066
636
    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5067
636
    if (ext == NULL) {
5068
0
        WOLFSSL_MSG("Could not find supported groups extension");
5069
0
        TLSX_FreeAll(priority, ssl->heap);
5070
0
        return 0;
5071
0
    }
5072
5073
636
    curve = (SupportedCurve*)ext->data;
5074
636
    name = curve->name;
5075
5076
636
    curve = (SupportedCurve*)extension->data;
5077
1.81k
    while (curve != NULL) {
5078
1.21k
        if (curve->name == name)
5079
38
            break;
5080
1.18k
        curve = curve->next;
5081
1.18k
    }
5082
5083
636
    if (curve == NULL) {
5084
        /* Couldn't find the preferred group in client list. */
5085
598
        extension->resp = 1;
5086
5087
        /* Send server list back and free client list. */
5088
598
        curve = (SupportedCurve*)extension->data;
5089
598
        extension->data = ext->data;
5090
598
        ext->data = curve;
5091
598
    }
5092
5093
636
    TLSX_FreeAll(priority, ssl->heap);
5094
5095
636
    return 0;
5096
636
}
5097
5098
#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
5099
5100
#if defined(HAVE_FFDHE) && !defined(WOLFSSL_NO_TLS12)
5101
#ifdef HAVE_PUBLIC_FFDHE
5102
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5103
    SupportedCurve* serverGroup)
5104
1.79k
{
5105
1.79k
    int ret = 0;
5106
1.79k
    SupportedCurve* group;
5107
1.79k
    const DhParams* params = NULL;
5108
5109
30.5k
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5110
30.5k
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5111
28.7k
            continue;
5112
5113
3.59k
        for (group = clientGroup; group != NULL; group = group->next) {
5114
3.59k
            if (serverGroup->name != group->name)
5115
1.80k
                continue;
5116
5117
1.79k
            switch (serverGroup->name) {
5118
0
            #ifdef HAVE_FFDHE_2048
5119
1.79k
                case WOLFSSL_FFDHE_2048:
5120
1.79k
                    params = wc_Dh_ffdhe2048_Get();
5121
1.79k
                    break;
5122
0
            #endif
5123
            #ifdef HAVE_FFDHE_3072
5124
                case WOLFSSL_FFDHE_3072:
5125
                    params = wc_Dh_ffdhe3072_Get();
5126
                    break;
5127
            #endif
5128
            #ifdef HAVE_FFDHE_4096
5129
                case WOLFSSL_FFDHE_4096:
5130
                    params = wc_Dh_ffdhe4096_Get();
5131
                    break;
5132
            #endif
5133
            #ifdef HAVE_FFDHE_6144
5134
                case WOLFSSL_FFDHE_6144:
5135
                    params = wc_Dh_ffdhe6144_Get();
5136
                    break;
5137
            #endif
5138
            #ifdef HAVE_FFDHE_8192
5139
                case WOLFSSL_FFDHE_8192:
5140
                    params = wc_Dh_ffdhe8192_Get();
5141
                    break;
5142
            #endif
5143
0
                default:
5144
0
                    break;
5145
1.79k
            }
5146
1.79k
            if (params == NULL) {
5147
0
                ret = BAD_FUNC_ARG;
5148
0
                break;
5149
0
            }
5150
1.79k
            if (params->p_len >= ssl->options.minDhKeySz &&
5151
1.79k
                                     params->p_len <= ssl->options.maxDhKeySz) {
5152
1.79k
                break;
5153
1.79k
            }
5154
1.79k
        }
5155
5156
1.79k
        if (ret != 0)
5157
0
            break;
5158
1.79k
        if ((group != NULL) && (serverGroup->name == group->name))
5159
1.79k
            break;
5160
1.79k
    }
5161
5162
1.79k
    if ((ret == 0) && (serverGroup != NULL) && (params != NULL)) {
5163
1.79k
        ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
5164
1.79k
        ssl->buffers.serverDH_P.length = params->p_len;
5165
1.79k
        ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
5166
1.79k
        ssl->buffers.serverDH_G.length = params->g_len;
5167
5168
1.79k
        ssl->namedGroup = serverGroup->name;
5169
1.79k
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5170
1.79k
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5171
1.79k
        ssl->options.dhDoKeyTest = 0;
5172
1.79k
    #endif
5173
1.79k
        ssl->options.haveDH = 1;
5174
1.79k
    }
5175
5176
1.79k
    return ret;
5177
1.79k
}
5178
#else
5179
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5180
    SupportedCurve* serverGroup)
5181
{
5182
    int ret = 0;
5183
    SupportedCurve* group;
5184
    word32 p_len;
5185
5186
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5187
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5188
            continue;
5189
5190
        for (group = clientGroup; group != NULL; group = group->next) {
5191
            if (serverGroup->name != group->name)
5192
                continue;
5193
5194
            ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &p_len, NULL, NULL);
5195
            if (ret == 0) {
5196
                if (p_len == 0) {
5197
                    ret = BAD_FUNC_ARG;
5198
                    break;
5199
                }
5200
                if (p_len >= ssl->options.minDhKeySz &&
5201
                                                p_len <= ssl->options.maxDhKeySz) {
5202
                    break;
5203
                }
5204
            }
5205
        }
5206
5207
        if (ret != 0)
5208
            break;
5209
        if ((group != NULL) && (serverGroup->name == group->name))
5210
            break;
5211
    }
5212
5213
    if ((ret == 0) && (serverGroup != NULL)) {
5214
        word32 pSz, gSz;
5215
5216
        ssl->buffers.serverDH_P.buffer = NULL;
5217
        ssl->buffers.serverDH_G.buffer = NULL;
5218
        ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &pSz, &gSz, NULL);
5219
        if (ret == 0) {
5220
            ssl->buffers.serverDH_P.buffer =
5221
                (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5222
            if (ssl->buffers.serverDH_P.buffer == NULL)
5223
                ret = MEMORY_E;
5224
            else
5225
                ssl->buffers.serverDH_P.length = pSz;
5226
        }
5227
        if (ret == 0) {
5228
            ssl->buffers.serverDH_G.buffer =
5229
                (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5230
            if (ssl->buffers.serverDH_G.buffer == NULL) {
5231
                ret = MEMORY_E;
5232
            } else
5233
                ssl->buffers.serverDH_G.length = gSz;
5234
        }
5235
        if (ret == 0) {
5236
            ret = wc_DhCopyNamedKey(serverGroup->name,
5237
                              ssl->buffers.serverDH_P.buffer, &pSz,
5238
                              ssl->buffers.serverDH_G.buffer, &gSz,
5239
                              NULL, NULL);
5240
        }
5241
        if (ret == 0) {
5242
            ssl->buffers.weOwnDH = 1;
5243
5244
            ssl->namedGroup = serverGroup->name;
5245
        #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5246
            !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5247
            ssl->options.dhDoKeyTest = 0;
5248
        #endif
5249
            ssl->options.haveDH = 1;
5250
        }
5251
        else {
5252
            if (ssl->buffers.serverDH_P.buffer != NULL) {
5253
                XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5254
                    DYNAMIC_TYPE_PUBLIC_KEY);
5255
                ssl->buffers.serverDH_P.length = 0;
5256
                ssl->buffers.serverDH_P.buffer = NULL;
5257
            }
5258
            if (ssl->buffers.serverDH_G.buffer != NULL) {
5259
                XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5260
                    DYNAMIC_TYPE_PUBLIC_KEY);
5261
                ssl->buffers.serverDH_G.length = 0;
5262
                ssl->buffers.serverDH_G.buffer = NULL;
5263
            }
5264
        }
5265
    }
5266
5267
    return ret;
5268
}
5269
#endif
5270
5271
/* Set the highest priority common FFDHE group on the server as compared to
5272
 * client extensions.
5273
 *
5274
 * ssl    SSL/TLS object.
5275
 * returns 0 on success, otherwise an error.
5276
 */
5277
int TLSX_SupportedFFDHE_Set(WOLFSSL* ssl)
5278
6.08k
{
5279
6.08k
    int ret;
5280
6.08k
    TLSX* priority = NULL;
5281
6.08k
    TLSX* ext = NULL;
5282
6.08k
    TLSX* extension;
5283
6.08k
    SupportedCurve* clientGroup;
5284
6.08k
    SupportedCurve* group;
5285
6.08k
    int found = 0;
5286
5287
6.08k
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5288
    /* May be doing PSK with no key exchange. */
5289
6.08k
    if (extension == NULL)
5290
0
        return 0;
5291
6.08k
    clientGroup = (SupportedCurve*)extension->data;
5292
12.9k
    for (group = clientGroup; group != NULL; group = group->next) {
5293
8.72k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(group->name)) {
5294
1.89k
            found = 1;
5295
1.89k
            break;
5296
1.89k
        }
5297
8.72k
    }
5298
6.08k
    if (!found)
5299
4.19k
        return 0;
5300
5301
1.89k
    if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
5302
0
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5303
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5304
0
    }
5305
1.89k
    if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
5306
0
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5307
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5308
0
    }
5309
1.89k
    ssl->buffers.serverDH_P.buffer = NULL;
5310
1.89k
    ssl->buffers.serverDH_G.buffer = NULL;
5311
1.89k
    ssl->buffers.weOwnDH = 0;
5312
1.89k
    ssl->options.haveDH = 0;
5313
5314
1.89k
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5315
1.89k
    if (ret == WOLFSSL_SUCCESS) {
5316
1.79k
        SupportedCurve* serverGroup;
5317
5318
1.79k
        ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5319
1.79k
        if (ext == NULL) {
5320
0
            WOLFSSL_MSG("Could not find supported groups extension");
5321
0
            ret = 0;
5322
0
        }
5323
1.79k
        else {
5324
1.79k
            serverGroup = (SupportedCurve*)ext->data;
5325
1.79k
            ret = tlsx_ffdhe_find_group(ssl, clientGroup, serverGroup);
5326
1.79k
        }
5327
1.79k
    }
5328
5329
1.89k
    TLSX_FreeAll(priority, ssl->heap);
5330
5331
1.89k
    return ret;
5332
6.08k
}
5333
#endif /* HAVE_FFDHE && !WOLFSSL_NO_TLS12 */
5334
#endif /* !NO_WOLFSSL_SERVER */
5335
5336
/* Check if the given curve is present in the supported groups extension.
5337
 *
5338
 * ssl             SSL/TLS object.
5339
 * name            The curve name to check.
5340
 * returns 1 if present, 0 otherwise.
5341
 */
5342
int TLSX_SupportedCurve_IsSupported(WOLFSSL* ssl, word16 name)
5343
0
{
5344
0
    TLSX* extension;
5345
0
    SupportedCurve* curve;
5346
5347
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5348
0
    if (extension == NULL)
5349
0
        return 0;
5350
5351
0
    curve = (SupportedCurve*)extension->data;
5352
0
    while (curve != NULL) {
5353
0
        if (curve->name == name)
5354
0
            return 1;
5355
0
        curve = curve->next;
5356
0
    }
5357
5358
0
    return 0;
5359
0
}
5360
5361
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5362
/* Return the preferred group.
5363
 *
5364
 * ssl             SSL/TLS object.
5365
 * checkSupported  Whether to check for the first supported group.
5366
 * returns BAD_FUNC_ARG if no group found, otherwise the group.
5367
 */
5368
int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
5369
0
{
5370
0
    TLSX* extension;
5371
0
    SupportedCurve* curve;
5372
5373
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5374
0
    if (extension == NULL)
5375
0
        return BAD_FUNC_ARG;
5376
5377
0
    curve = (SupportedCurve*)extension->data;
5378
0
    while (curve != NULL) {
5379
0
        if (!checkSupported || TLSX_IsGroupSupported(curve->name))
5380
0
            return curve->name;
5381
0
        curve = curve->next;
5382
0
    }
5383
5384
0
    return BAD_FUNC_ARG;
5385
0
}
5386
5387
#endif /* HAVE_SUPPORTED_CURVES */
5388
5389
#ifndef NO_WOLFSSL_SERVER
5390
5391
static int TLSX_PointFormat_Parse(WOLFSSL* ssl, const byte* input,
5392
                                  word16 length, byte isRequest)
5393
1.36k
{
5394
1.36k
    int ret;
5395
5396
    /* validating formats list length */
5397
1.36k
    if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
5398
169
        return BUFFER_ERROR;
5399
5400
1.19k
    if (isRequest) {
5401
        /* adding uncompressed point format to response */
5402
1.19k
        ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
5403
1.19k
                                                                     ssl->heap);
5404
1.19k
        if (ret != WOLFSSL_SUCCESS)
5405
6
            return ret; /* throw error */
5406
5407
1.18k
        TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
5408
1.18k
    }
5409
5410
1.19k
    return 0;
5411
1.19k
}
5412
5413
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5414
int TLSX_ValidateSupportedCurves(const WOLFSSL* ssl, byte first, byte second,
5415
                                 word32* ecdhCurveOID) {
5416
    TLSX*           extension = NULL;
5417
    SupportedCurve* curve     = NULL;
5418
    word32          oid       = 0;
5419
    word32          defOid    = 0;
5420
    word32          defSz     = 80; /* Maximum known curve size is 66. */
5421
    word32          nextOid   = 0;
5422
    word32          nextSz    = 80; /* Maximum known curve size is 66. */
5423
    word32          currOid   = ssl->ecdhCurveOID;
5424
    int             ephmSuite = 0;
5425
    word16          octets    = 0; /* according to 'ecc_set_type ecc_sets[];' */
5426
    int             key       = 0; /* validate key       */
5427
    int             foundCurve = 0; /* Found at least one supported curve */
5428
5429
    (void)oid;
5430
5431
    if (first == CHACHA_BYTE) {
5432
        switch (second) {
5433
            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5434
            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
5435
            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5436
            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5437
                return 1; /* no suite restriction */
5438
            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5439
            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5440
            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5441
                break;
5442
        }
5443
    }
5444
    if (first == ECC_BYTE || first == ECDHE_PSK_BYTE || first == CHACHA_BYTE)
5445
        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5446
    if (!extension)
5447
        return 1; /* no suite restriction */
5448
5449
    for (curve = (SupportedCurve*)extension->data;
5450
         curve && !key;
5451
         curve = curve->next) {
5452
5453
    #ifdef OPENSSL_EXTRA
5454
        /* skip if name is not in supported ECC range
5455
         * or disabled by user */
5456
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
5457
            continue;
5458
    #endif
5459
5460
        /* find supported curve */
5461
        switch (curve->name) {
5462
#ifdef HAVE_ECC
5463
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
5464
        #ifndef NO_ECC_SECP
5465
            case WOLFSSL_ECC_SECP160R1:
5466
                oid = ECC_SECP160R1_OID;
5467
                octets = 20;
5468
                break;
5469
        #endif /* !NO_ECC_SECP */
5470
        #ifdef HAVE_ECC_SECPR2
5471
            case WOLFSSL_ECC_SECP160R2:
5472
                oid = ECC_SECP160R2_OID;
5473
                octets = 20;
5474
                break;
5475
        #endif /* HAVE_ECC_SECPR2 */
5476
        #ifdef HAVE_ECC_KOBLITZ
5477
            case WOLFSSL_ECC_SECP160K1:
5478
                oid = ECC_SECP160K1_OID;
5479
                octets = 20;
5480
                break;
5481
        #endif /* HAVE_ECC_KOBLITZ */
5482
        #endif
5483
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
5484
        #ifndef NO_ECC_SECP
5485
            case WOLFSSL_ECC_SECP192R1:
5486
                oid = ECC_SECP192R1_OID;
5487
                octets = 24;
5488
                break;
5489
        #endif /* !NO_ECC_SECP */
5490
        #ifdef HAVE_ECC_KOBLITZ
5491
            case WOLFSSL_ECC_SECP192K1:
5492
                oid = ECC_SECP192K1_OID;
5493
                octets = 24;
5494
                break;
5495
        #endif /* HAVE_ECC_KOBLITZ */
5496
    #endif
5497
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
5498
        #ifndef NO_ECC_SECP
5499
            case WOLFSSL_ECC_SECP224R1:
5500
                oid = ECC_SECP224R1_OID;
5501
                octets = 28;
5502
                break;
5503
        #endif /* !NO_ECC_SECP */
5504
        #ifdef HAVE_ECC_KOBLITZ
5505
            case WOLFSSL_ECC_SECP224K1:
5506
                oid = ECC_SECP224K1_OID;
5507
                octets = 28;
5508
                break;
5509
        #endif /* HAVE_ECC_KOBLITZ */
5510
    #endif
5511
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5512
        #ifndef NO_ECC_SECP
5513
            case WOLFSSL_ECC_SECP256R1:
5514
                oid = ECC_SECP256R1_OID;
5515
                octets = 32;
5516
                break;
5517
        #endif /* !NO_ECC_SECP */
5518
    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
5519
#endif
5520
        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
5521
            case WOLFSSL_ECC_X25519:
5522
                oid = ECC_X25519_OID;
5523
                octets = 32;
5524
                break;
5525
        #endif /* HAVE_CURVE25519 */
5526
#ifdef HAVE_ECC
5527
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5528
        #ifdef HAVE_ECC_KOBLITZ
5529
            case WOLFSSL_ECC_SECP256K1:
5530
                oid = ECC_SECP256K1_OID;
5531
                octets = 32;
5532
                break;
5533
        #endif /* HAVE_ECC_KOBLITZ */
5534
        #ifdef HAVE_ECC_BRAINPOOL
5535
            case WOLFSSL_ECC_BRAINPOOLP256R1:
5536
                oid = ECC_BRAINPOOLP256R1_OID;
5537
                octets = 32;
5538
                break;
5539
        #endif /* HAVE_ECC_BRAINPOOL */
5540
        #ifdef WOLFSSL_SM2
5541
            case WOLFSSL_ECC_SM2P256V1:
5542
                oid = ECC_SM2P256V1_OID;
5543
                octets = 32;
5544
                break;
5545
        #endif /* WOLFSSL_SM2 */
5546
    #endif
5547
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
5548
        #ifndef NO_ECC_SECP
5549
            case WOLFSSL_ECC_SECP384R1:
5550
                oid = ECC_SECP384R1_OID;
5551
                octets = 48;
5552
                break;
5553
        #endif /* !NO_ECC_SECP */
5554
        #ifdef HAVE_ECC_BRAINPOOL
5555
            case WOLFSSL_ECC_BRAINPOOLP384R1:
5556
                oid = ECC_BRAINPOOLP384R1_OID;
5557
                octets = 48;
5558
                break;
5559
        #endif /* HAVE_ECC_BRAINPOOL */
5560
    #endif
5561
#endif
5562
        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
5563
            case WOLFSSL_ECC_X448:
5564
                oid = ECC_X448_OID;
5565
                octets = 57;
5566
                break;
5567
        #endif /* HAVE_CURVE448 */
5568
#ifdef HAVE_ECC
5569
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
5570
        #ifdef HAVE_ECC_BRAINPOOL
5571
            case WOLFSSL_ECC_BRAINPOOLP512R1:
5572
                oid = ECC_BRAINPOOLP512R1_OID;
5573
                octets = 64;
5574
                break;
5575
        #endif /* HAVE_ECC_BRAINPOOL */
5576
    #endif
5577
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
5578
        #ifndef NO_ECC_SECP
5579
            case WOLFSSL_ECC_SECP521R1:
5580
                oid = ECC_SECP521R1_OID;
5581
                octets = 66;
5582
                break;
5583
        #endif /* !NO_ECC_SECP */
5584
    #endif
5585
#endif
5586
            default: continue; /* unsupported curve */
5587
        }
5588
5589
        foundCurve = 1;
5590
5591
    #ifdef HAVE_ECC
5592
        /* Set default Oid */
5593
        if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
5594
            defOid = oid;
5595
            defSz = octets;
5596
        }
5597
5598
        /* The eccTempKeySz is the preferred ephemeral key size */
5599
        if (currOid == 0 && ssl->eccTempKeySz == octets)
5600
            currOid = oid;
5601
        if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
5602
            nextOid = oid;
5603
            nextSz  = octets;
5604
        }
5605
    #else
5606
        if (defOid == 0 && defSz > octets) {
5607
            defOid = oid;
5608
            defSz = octets;
5609
        }
5610
5611
        if (currOid == 0)
5612
            currOid = oid;
5613
        if (nextOid == 0 || nextSz > octets) {
5614
            nextOid = oid;
5615
            nextSz  = octets;
5616
        }
5617
    #endif
5618
5619
        if (first == ECC_BYTE) {
5620
            switch (second) {
5621
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
5622
                /* ECDHE_ECDSA */
5623
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
5624
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
5625
                case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
5626
                case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
5627
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
5628
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
5629
                case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
5630
                case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
5631
                case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
5632
                case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
5633
                    key |= ssl->ecdhCurveOID == oid;
5634
                    ephmSuite = 1;
5635
                break;
5636
5637
    #ifdef WOLFSSL_STATIC_DH
5638
                /* ECDH_ECDSA */
5639
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
5640
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
5641
                case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
5642
                case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
5643
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
5644
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
5645
                case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
5646
                case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
5647
                    if (oid == ECC_X25519_OID && defOid == oid) {
5648
                        defOid = 0;
5649
                        defSz = 80;
5650
                    }
5651
                    if (oid == ECC_X448_OID && defOid == oid) {
5652
                        defOid = 0;
5653
                        defSz = 80;
5654
                    }
5655
                    key |= ssl->pkCurveOID == oid;
5656
                break;
5657
    #endif /* WOLFSSL_STATIC_DH */
5658
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
5659
#ifndef NO_RSA
5660
                /* ECDHE_RSA */
5661
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
5662
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
5663
                case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
5664
                case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
5665
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
5666
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
5667
                case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
5668
                case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
5669
                    key |= ssl->ecdhCurveOID == oid;
5670
                    ephmSuite = 1;
5671
                break;
5672
5673
    #if defined(HAVE_ECC) && defined(WOLFSSL_STATIC_DH)
5674
                /* ECDH_RSA */
5675
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
5676
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
5677
                case TLS_ECDH_RSA_WITH_RC4_128_SHA:
5678
                case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
5679
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
5680
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
5681
                case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
5682
                case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
5683
                    if (oid == ECC_X25519_OID && defOid == oid) {
5684
                        defOid = 0;
5685
                        defSz = 80;
5686
                    }
5687
                    if (oid == ECC_X448_OID && defOid == oid) {
5688
                        defOid = 0;
5689
                        defSz = 80;
5690
                    }
5691
                    key |= ssl->pkCurveOID == oid;
5692
                break;
5693
    #endif /* HAVE_ECC && WOLFSSL_STATIC_DH */
5694
#endif
5695
                default:
5696
                    if (oid == ECC_X25519_OID && defOid == oid) {
5697
                        defOid = 0;
5698
                        defSz = 80;
5699
                    }
5700
                    if (oid == ECC_X448_OID && defOid == oid) {
5701
                        defOid = 0;
5702
                        defSz = 80;
5703
                    }
5704
                    key = 1;
5705
                break;
5706
            }
5707
        }
5708
5709
        /* ChaCha20-Poly1305 ECC cipher suites */
5710
        if (first == CHACHA_BYTE) {
5711
            switch (second) {
5712
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
5713
                /* ECDHE_ECDSA */
5714
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
5715
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
5716
                    key |= ssl->ecdhCurveOID == oid;
5717
                    ephmSuite = 1;
5718
                break;
5719
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
5720
#ifndef NO_RSA
5721
                /* ECDHE_RSA */
5722
                case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
5723
                case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
5724
                    key |= ssl->ecdhCurveOID == oid;
5725
                    ephmSuite = 1;
5726
                break;
5727
#endif
5728
                default:
5729
                    key = 1;
5730
                break;
5731
            }
5732
        }
5733
    }
5734
5735
    /* Check we found at least one supported curve */
5736
    if (!foundCurve)
5737
        return 0;
5738
5739
    *ecdhCurveOID = ssl->ecdhCurveOID;
5740
    /* Choose the default if it is at the required strength. */
5741
#ifdef HAVE_ECC
5742
    if (*ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
5743
#else
5744
    if (*ecdhCurveOID == 0)
5745
#endif
5746
    {
5747
        key = 1;
5748
        *ecdhCurveOID = defOid;
5749
    }
5750
    /* Choose any curve at the required strength. */
5751
    if (*ecdhCurveOID == 0) {
5752
        key = 1;
5753
        *ecdhCurveOID = currOid;
5754
    }
5755
    /* Choose the default if it is at the next highest strength. */
5756
    if (*ecdhCurveOID == 0 && defSz == nextSz)
5757
        *ecdhCurveOID = defOid;
5758
    /* Choose any curve at the next highest strength. */
5759
    if (*ecdhCurveOID == 0)
5760
        *ecdhCurveOID = nextOid;
5761
    /* No curve and ephemeral ECC suite requires a matching curve. */
5762
    if (*ecdhCurveOID == 0 && ephmSuite)
5763
        key = 0;
5764
5765
    return key;
5766
}
5767
#endif
5768
5769
#endif /* NO_WOLFSSL_SERVER */
5770
5771
5772
int TLSX_SupportedCurve_Copy(TLSX* src, TLSX** dst, void* heap)
5773
515
{
5774
515
    TLSX* extension;
5775
515
    int ret;
5776
5777
515
    extension = TLSX_Find(src, TLSX_SUPPORTED_GROUPS);
5778
515
    if (extension != NULL) {
5779
0
        SupportedCurve* curve;
5780
0
        for (curve = (SupportedCurve*)extension->data; curve != NULL;
5781
0
                curve = curve->next) {
5782
0
            ret = TLSX_UseSupportedCurve(dst, curve->name, heap);
5783
0
            if (ret != WOLFSSL_SUCCESS)
5784
0
                return MEMORY_E;
5785
0
        }
5786
0
    }
5787
5788
515
    return 0;
5789
515
}
5790
5791
int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
5792
351k
{
5793
351k
    TLSX* extension = NULL;
5794
351k
    SupportedCurve* curve = NULL;
5795
351k
    int ret;
5796
5797
351k
    if (extensions == NULL) {
5798
0
        return BAD_FUNC_ARG;
5799
0
    }
5800
5801
351k
    if (! TLSX_IsGroupSupported(name)) {
5802
31.8k
        return BAD_FUNC_ARG;
5803
31.8k
    }
5804
5805
319k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5806
5807
319k
    if (!extension) {
5808
26.2k
        ret = TLSX_SupportedCurve_New(&curve, name, heap);
5809
26.2k
        if (ret != 0)
5810
64
            return ret;
5811
5812
26.1k
        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
5813
26.1k
        if (ret != 0) {
5814
48
            XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
5815
48
            return ret;
5816
48
        }
5817
26.1k
    }
5818
293k
    else {
5819
293k
        ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
5820
293k
                                                                          heap);
5821
293k
        if (ret != 0)
5822
143
            return ret;
5823
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
5824
        if (name == WOLFSSL_SECP256R1MLKEM512) {
5825
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5826
                WOLFSSL_P256_ML_KEM_512_OLD, heap);
5827
        }
5828
        else if (name == WOLFSSL_SECP384R1MLKEM768) {
5829
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5830
                WOLFSSL_P384_ML_KEM_768_OLD, heap);
5831
        }
5832
        else if (name == WOLFSSL_SECP521R1MLKEM1024) {
5833
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5834
                WOLFSSL_P521_ML_KEM_1024_OLD, heap);
5835
        }
5836
        if (ret != 0) {
5837
            return ret;
5838
        }
5839
#endif
5840
293k
    }
5841
5842
319k
    return WOLFSSL_SUCCESS;
5843
319k
}
5844
5845
int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
5846
13.2k
{
5847
13.2k
    TLSX* extension = NULL;
5848
13.2k
    PointFormat* point = NULL;
5849
13.2k
    int ret = 0;
5850
5851
13.2k
    if (extensions == NULL)
5852
0
        return BAD_FUNC_ARG;
5853
5854
13.2k
    extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
5855
5856
13.2k
    if (!extension) {
5857
13.2k
        ret = TLSX_PointFormat_New(&point, format, heap);
5858
13.2k
        if (ret != 0)
5859
5
            return ret;
5860
5861
13.2k
        ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
5862
13.2k
        if (ret != 0) {
5863
3
            XFREE(point, heap, DYNAMIC_TYPE_TLSX);
5864
3
            return ret;
5865
3
        }
5866
13.2k
    }
5867
0
    else {
5868
0
        ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
5869
0
                                                                          heap);
5870
0
        if (ret != 0)
5871
0
            return ret;
5872
0
    }
5873
5874
13.2k
    return WOLFSSL_SUCCESS;
5875
13.2k
}
5876
5877
0
#define EC_FREE_ALL         TLSX_SupportedCurve_FreeAll
5878
0
#define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
5879
5880
/* In TLS 1.2 the server never sends supported curve extension, but in TLS 1.3
5881
 * the server can send supported groups extension to indicate what it will
5882
 * support for later connections. */
5883
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5884
#define EC_GET_SIZE TLSX_SupportedCurve_GetSize
5885
#define EC_WRITE    TLSX_SupportedCurve_Write
5886
#else
5887
#define EC_GET_SIZE(list)         0
5888
#define EC_WRITE(a, b)            0
5889
#endif
5890
5891
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
5892
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
5893
#define EC_PARSE TLSX_SupportedCurve_Parse
5894
#else
5895
#define EC_PARSE(a, b, c, d, e)   0
5896
#endif
5897
5898
0
#define PF_FREE_ALL          TLSX_PointFormat_FreeAll
5899
0
#define PF_VALIDATE_REQUEST  TLSX_PointFormat_ValidateRequest
5900
0
#define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
5901
5902
#define PF_GET_SIZE TLSX_PointFormat_GetSize
5903
#define PF_WRITE    TLSX_PointFormat_Write
5904
5905
#ifndef NO_WOLFSSL_SERVER
5906
#define PF_PARSE TLSX_PointFormat_Parse
5907
#else
5908
#define PF_PARSE(a, b, c, d)      0
5909
#endif
5910
5911
#else
5912
5913
#define EC_FREE_ALL(list, heap) WC_DO_NOTHING
5914
#define EC_GET_SIZE(list)         0
5915
#define EC_WRITE(a, b)            0
5916
#define EC_PARSE(a, b, c, d, e)   0
5917
#define EC_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
5918
5919
#define PF_FREE_ALL(list, heap)   WC_DO_NOTHING
5920
#define PF_GET_SIZE(list)         0
5921
#define PF_WRITE(a, b)            0
5922
#define PF_PARSE(a, b, c, d)      0
5923
#define PF_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
5924
#define PF_VALIDATE_RESPONSE(a, b) WC_DO_NOTHING
5925
5926
#endif /* HAVE_SUPPORTED_CURVES */
5927
5928
/******************************************************************************/
5929
/* Renegotiation Indication                                                   */
5930
/******************************************************************************/
5931
5932
#if defined(HAVE_SECURE_RENEGOTIATION) \
5933
 || defined(HAVE_SERVER_RENEGOTIATION_INFO)
5934
5935
static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
5936
                                                                  int isRequest)
5937
1.57k
{
5938
1.57k
    byte length = OPAQUE8_LEN; /* empty info length */
5939
5940
    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
5941
1.57k
    if (data && data->enabled && data->verifySet) {
5942
        /* client sends client_verify_data only */
5943
0
        length += TLS_FINISHED_SZ;
5944
5945
        /* server also sends server_verify_data */
5946
0
        if (!isRequest)
5947
0
            length += TLS_FINISHED_SZ;
5948
0
    }
5949
5950
1.57k
    return length;
5951
1.57k
}
5952
5953
static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
5954
                                                    byte* output, int isRequest)
5955
1.49k
{
5956
1.49k
    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
5957
1.49k
    if (data && data->enabled && data->verifySet) {
5958
        /* client sends client_verify_data only */
5959
0
        XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
5960
0
        offset += TLS_FINISHED_SZ;
5961
5962
        /* server also sends server_verify_data */
5963
0
        if (!isRequest) {
5964
0
            XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
5965
0
            offset += TLS_FINISHED_SZ;
5966
0
        }
5967
0
    }
5968
5969
1.49k
    output[0] = (byte)(offset - 1);  /* info length - self */
5970
5971
1.49k
    return offset;
5972
1.49k
}
5973
5974
static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input,
5975
                                          word16 length, byte isRequest)
5976
296
{
5977
296
    int ret = WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E);
5978
5979
296
    if (length >= OPAQUE8_LEN) {
5980
296
        if (isRequest) {
5981
293
        #ifndef NO_WOLFSSL_SERVER
5982
293
            if (ssl->secure_renegotiation == NULL) {
5983
245
                ret = wolfSSL_UseSecureRenegotiation(ssl);
5984
245
                if (ret == WOLFSSL_SUCCESS)
5985
237
                    ret = 0;
5986
245
            }
5987
293
            if (ret != 0 && ret != WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E)) {
5988
8
            }
5989
285
            else if (ssl->secure_renegotiation == NULL) {
5990
0
            }
5991
285
            else if (!ssl->secure_renegotiation->enabled) {
5992
237
                if (*input == 0) {
5993
164
                    input++; /* get past size */
5994
5995
164
                    ssl->secure_renegotiation->enabled = 1;
5996
164
                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
5997
164
                    ret = 0;
5998
164
                }
5999
73
                else {
6000
                    /* already in error state */
6001
73
                    WOLFSSL_MSG("SCR client verify data present");
6002
73
                }
6003
237
            }
6004
48
            else if (*input == TLS_FINISHED_SZ) {
6005
42
                if (length < TLS_FINISHED_SZ + 1) {
6006
3
                    WOLFSSL_MSG("SCR malformed buffer");
6007
3
                    ret = BUFFER_E;
6008
3
                }
6009
39
                else {
6010
39
                    input++; /* get past size */
6011
6012
                    /* validate client verify data */
6013
39
                    if (XMEMCMP(input,
6014
39
                            ssl->secure_renegotiation->client_verify_data,
6015
39
                            TLS_FINISHED_SZ) == 0) {
6016
5
                        WOLFSSL_MSG("SCR client verify data match");
6017
5
                        TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6018
5
                        ret = 0;  /* verified */
6019
5
                    }
6020
34
                    else {
6021
                        /* already in error state */
6022
34
                        WOLFSSL_MSG("SCR client verify data Failure");
6023
34
                    }
6024
39
                }
6025
42
            }
6026
293
        #endif
6027
293
        }
6028
3
        else if (ssl->secure_renegotiation != NULL) {
6029
0
        #ifndef NO_WOLFSSL_CLIENT
6030
0
            if (!ssl->secure_renegotiation->enabled) {
6031
0
                if (*input == 0) {
6032
0
                    ssl->secure_renegotiation->enabled = 1;
6033
0
                    ret = 0;
6034
0
                }
6035
0
            }
6036
0
            else if (*input == 2 * TLS_FINISHED_SZ &&
6037
0
                     length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
6038
0
                input++;  /* get past size */
6039
6040
                /* validate client and server verify data */
6041
0
                if (XMEMCMP(input,
6042
0
                            ssl->secure_renegotiation->client_verify_data,
6043
0
                            TLS_FINISHED_SZ) == 0 &&
6044
0
                    XMEMCMP(input + TLS_FINISHED_SZ,
6045
0
                            ssl->secure_renegotiation->server_verify_data,
6046
0
                            TLS_FINISHED_SZ) == 0) {
6047
0
                    WOLFSSL_MSG("SCR client and server verify data match");
6048
0
                    ret = 0;  /* verified */
6049
0
                }
6050
0
                else {
6051
                    /* already in error state */
6052
0
                    WOLFSSL_MSG("SCR client and server verify data Failure");
6053
0
                }
6054
0
            }
6055
0
        #endif
6056
0
        }
6057
3
        else {
6058
3
            ret = SECURE_RENEGOTIATION_E;
6059
3
        }
6060
296
    }
6061
0
    else {
6062
0
        ret = SECURE_RENEGOTIATION_E;
6063
0
    }
6064
6065
296
    if (ret != 0) {
6066
54
        WOLFSSL_ERROR_VERBOSE(ret);
6067
54
        SendAlert(ssl, alert_fatal, handshake_failure);
6068
54
    }
6069
6070
296
    return ret;
6071
296
}
6072
6073
int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
6074
3.06k
{
6075
3.06k
    int ret = 0;
6076
3.06k
    SecureRenegotiation* data;
6077
6078
3.06k
    data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
6079
3.06k
                                                             DYNAMIC_TYPE_TLSX);
6080
3.06k
    if (data == NULL)
6081
30
        return MEMORY_E;
6082
6083
3.03k
    XMEMSET(data, 0, sizeof(SecureRenegotiation));
6084
6085
3.03k
    ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
6086
3.03k
    if (ret != 0) {
6087
24
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
6088
24
        return ret;
6089
24
    }
6090
6091
3.00k
    return WOLFSSL_SUCCESS;
6092
3.03k
}
6093
6094
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
6095
6096
int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
6097
2.81k
{
6098
2.81k
    int ret;
6099
6100
    /* send empty renegotiation_info extension */
6101
2.81k
    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6102
2.81k
    if (ext == NULL) {
6103
2.81k
        ret = TLSX_UseSecureRenegotiation(extensions, heap);
6104
2.81k
        if (ret != WOLFSSL_SUCCESS)
6105
46
            return ret;
6106
6107
2.77k
        ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6108
2.77k
    }
6109
2.77k
    if (ext)
6110
2.77k
        ext->resp = 1;
6111
6112
2.77k
    return WOLFSSL_SUCCESS;
6113
2.81k
}
6114
6115
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
6116
6117
6118
0
#define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
6119
#define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
6120
#define SCR_WRITE          TLSX_SecureRenegotiation_Write
6121
#define SCR_PARSE          TLSX_SecureRenegotiation_Parse
6122
6123
#else
6124
6125
#define SCR_FREE_ALL(a, heap) WC_DO_NOTHING
6126
#define SCR_GET_SIZE(a, b)    0
6127
#define SCR_WRITE(a, b, c)    0
6128
#define SCR_PARSE(a, b, c, d) 0
6129
6130
#endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
6131
6132
/******************************************************************************/
6133
/* Session Tickets                                                            */
6134
/******************************************************************************/
6135
6136
#ifdef HAVE_SESSION_TICKET
6137
6138
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
6139
static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl)
6140
{
6141
    TLSX*          extension = TLSX_Find(ssl->extensions, TLSX_SESSION_TICKET);
6142
    SessionTicket* ticket    = extension ?
6143
                                         (SessionTicket*)extension->data : NULL;
6144
6145
    if (ticket) {
6146
        /* TODO validate ticket timeout here! */
6147
        if (ticket->lifetime == 0xfffffff) {
6148
            /* send empty ticket on timeout */
6149
            TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6150
        }
6151
    }
6152
}
6153
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
6154
6155
6156
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
6157
{
6158
    (void)isRequest;
6159
    return ticket ? ticket->size : 0;
6160
}
6161
6162
static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
6163
                                       int isRequest)
6164
{
6165
    word16 offset = 0; /* empty ticket */
6166
6167
    if (isRequest && ticket) {
6168
        XMEMCPY(output + offset, ticket->data, ticket->size);
6169
        offset += ticket->size;
6170
    }
6171
6172
    return offset;
6173
}
6174
6175
6176
static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, const byte* input,
6177
                                    word16 length, byte isRequest)
6178
{
6179
    int ret = 0;
6180
6181
    (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
6182
6183
    if (!isRequest) {
6184
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
6185
            return TLSX_HandleUnsupportedExtension(ssl);
6186
6187
        if (length != 0)
6188
            return BUFFER_ERROR;
6189
6190
#ifndef NO_WOLFSSL_CLIENT
6191
        ssl->expect_session_ticket = 1;
6192
#endif
6193
    }
6194
#ifndef NO_WOLFSSL_SERVER
6195
    else {
6196
        /* server side */
6197
        if (ssl->ctx->ticketEncCb == NULL) {
6198
            WOLFSSL_MSG("Client sent session ticket, server has no callback");
6199
            return 0;
6200
        }
6201
6202
#ifdef HAVE_SECURE_RENEGOTIATION
6203
        if (IsSCR(ssl)) {
6204
            WOLFSSL_MSG("Client sent session ticket during SCR. Ignoring.");
6205
            return 0;
6206
        }
6207
#endif
6208
6209
        if (length > SESSION_TICKET_LEN) {
6210
            ret = BAD_TICKET_MSG_SZ;
6211
            WOLFSSL_ERROR_VERBOSE(ret);
6212
        } else if (IsAtLeastTLSv1_3(ssl->version)) {
6213
            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
6214
            ssl->options.rejectTicket = 1;
6215
            ret = 0;  /* not fatal */
6216
        } else if (ssl->options.noTicketTls12) {
6217
            /* ignore ticket request */
6218
        } else if (length == 0) {
6219
            /* blank ticket */
6220
            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6221
            if (ret == WOLFSSL_SUCCESS) {
6222
                ret = 0;
6223
                /* send blank ticket */
6224
                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6225
                ssl->options.createTicket = 1;  /* will send ticket msg */
6226
                ssl->options.useTicket    = 1;
6227
                ssl->options.resuming     = 0;  /* no standard resumption */
6228
                ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
6229
            }
6230
        } else {
6231
            /* got actual ticket from client */
6232
            ret = DoClientTicket(ssl, input, length);
6233
            if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
6234
                WOLFSSL_MSG("Using existing client ticket");
6235
                ssl->options.useTicket    = 1;
6236
                ssl->options.resuming     = 1;
6237
                /* SERVER: ticket is peer auth. */
6238
                ssl->options.peerAuthGood = 1;
6239
            } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
6240
                WOLFSSL_MSG("Using existing client ticket, creating new one");
6241
                ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6242
                if (ret == WOLFSSL_SUCCESS) {
6243
                    ret = 0;
6244
                    TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6245
                                                    /* send blank ticket */
6246
                    ssl->options.createTicket = 1;  /* will send ticket msg */
6247
                    ssl->options.useTicket    = 1;
6248
                    ssl->options.resuming     = 1;
6249
                    /* SERVER: ticket is peer auth. */
6250
                    ssl->options.peerAuthGood = 1;
6251
                }
6252
            } else if (ret == WOLFSSL_TICKET_RET_REJECT ||
6253
                    ret == WC_NO_ERR_TRACE(VERSION_ERROR)) {
6254
                WOLFSSL_MSG("Process client ticket rejected, not using");
6255
                if (ret == WC_NO_ERR_TRACE(VERSION_ERROR))
6256
                    WOLFSSL_MSG("\tbad TLS version");
6257
                ret = 0;  /* not fatal */
6258
6259
                ssl->options.rejectTicket = 1;
6260
                /* If we have session tickets enabled then send a new ticket */
6261
                if (!TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET)) {
6262
                    ret = TLSX_UseSessionTicket(&ssl->extensions, NULL,
6263
                                                ssl->heap);
6264
                    if (ret == WOLFSSL_SUCCESS) {
6265
                        ret = 0;
6266
                        TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6267
                        ssl->options.createTicket = 1;
6268
                        ssl->options.useTicket    = 1;
6269
                    }
6270
                }
6271
            } else if (ret == WOLFSSL_TICKET_RET_FATAL) {
6272
                WOLFSSL_MSG("Process client ticket fatal error, not using");
6273
            } else if (ret < 0) {
6274
                WOLFSSL_MSG("Process client ticket unknown error, not using");
6275
            }
6276
        }
6277
    }
6278
#endif /* NO_WOLFSSL_SERVER */
6279
6280
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
6281
    (void)ssl;
6282
#endif
6283
6284
    return ret;
6285
}
6286
6287
WOLFSSL_LOCAL SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
6288
                                            byte* data, word16 size, void* heap)
6289
{
6290
    SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
6291
                                                       heap, DYNAMIC_TYPE_TLSX);
6292
    if (ticket) {
6293
        ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
6294
        if (ticket->data == NULL) {
6295
            XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
6296
            return NULL;
6297
        }
6298
6299
        XMEMCPY(ticket->data, data, size);
6300
        ticket->size     = size;
6301
        ticket->lifetime = lifetime;
6302
    }
6303
6304
    (void)heap;
6305
6306
    return ticket;
6307
}
6308
WOLFSSL_LOCAL void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
6309
{
6310
    if (ticket) {
6311
        XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
6312
        XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
6313
    }
6314
6315
    (void)heap;
6316
}
6317
6318
int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
6319
{
6320
    int ret = 0;
6321
6322
    if (extensions == NULL)
6323
        return BAD_FUNC_ARG;
6324
6325
    /* If the ticket is NULL, the client will request a new ticket from the
6326
       server. Otherwise, the client will use it in the next client hello. */
6327
    if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
6328
                                                                           != 0)
6329
        return ret;
6330
6331
    return WOLFSSL_SUCCESS;
6332
}
6333
6334
#define WOLF_STK_VALIDATE_REQUEST TLSX_SessionTicket_ValidateRequest
6335
#define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
6336
#define WOLF_STK_WRITE            TLSX_SessionTicket_Write
6337
#define WOLF_STK_PARSE            TLSX_SessionTicket_Parse
6338
#define WOLF_STK_FREE(stk, heap)  TLSX_SessionTicket_Free((SessionTicket*)(stk),(heap))
6339
6340
#else
6341
6342
0
#define WOLF_STK_FREE(a, b) WC_DO_NOTHING
6343
0
#define WOLF_STK_VALIDATE_REQUEST(a) WC_DO_NOTHING
6344
#define WOLF_STK_GET_SIZE(a, b)      0
6345
#define WOLF_STK_WRITE(a, b, c)      0
6346
#define WOLF_STK_PARSE(a, b, c, d)   0
6347
6348
#endif /* HAVE_SESSION_TICKET */
6349
6350
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
6351
/******************************************************************************/
6352
/* Encrypt-then-MAC                                                           */
6353
/******************************************************************************/
6354
6355
#ifndef WOLFSSL_NO_TLS12
6356
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl);
6357
6358
/**
6359
 * Get the size of the Encrypt-Then-MAC extension.
6360
 *
6361
 * msgType  Type of message to put extension into.
6362
 * pSz      Size of extension data.
6363
 * return SANITY_MSG_E when the message is not allowed to have extension and
6364
 *        0 otherwise.
6365
 */
6366
static int TLSX_EncryptThenMac_GetSize(byte msgType, word16* pSz)
6367
15.9k
{
6368
15.9k
    (void)pSz;
6369
6370
15.9k
    if (msgType != client_hello && msgType != server_hello) {
6371
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6372
0
        return SANITY_MSG_E;
6373
0
    }
6374
6375
    /* Empty extension */
6376
6377
15.9k
    return 0;
6378
15.9k
}
6379
6380
/**
6381
 * Write the Encrypt-Then-MAC extension.
6382
 *
6383
 * data     Unused
6384
 * output   Extension data buffer. Unused.
6385
 * msgType  Type of message to put extension into.
6386
 * pSz      Size of extension data.
6387
 * return SANITY_MSG_E when the message is not allowed to have extension and
6388
 *        0 otherwise.
6389
 */
6390
static int TLSX_EncryptThenMac_Write(void* data, byte* output, byte msgType,
6391
                                     word16* pSz)
6392
15.8k
{
6393
15.8k
    (void)data;
6394
15.8k
    (void)output;
6395
15.8k
    (void)pSz;
6396
6397
15.8k
    if (msgType != client_hello && msgType != server_hello) {
6398
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6399
0
        return SANITY_MSG_E;
6400
0
    }
6401
6402
    /* Empty extension */
6403
6404
15.8k
    return 0;
6405
15.8k
}
6406
6407
/**
6408
 * Parse the Encrypt-Then-MAC extension.
6409
 *
6410
 * ssl      SSL object
6411
 * input    Extension data buffer.
6412
 * length   Length of this extension's data.
6413
 * msgType  Type of message to extension appeared in.
6414
 * return SANITY_MSG_E when the message is not allowed to have extension,
6415
 *        BUFFER_ERROR when the extension's data is invalid,
6416
 *        MEMORY_E when unable to allocate memory and
6417
 *        0 otherwise.
6418
 */
6419
static int TLSX_EncryptThenMac_Parse(WOLFSSL* ssl, const byte* input,
6420
                                     word16 length, byte msgType)
6421
1.62k
{
6422
1.62k
    int ret;
6423
6424
1.62k
    (void)input;
6425
6426
1.62k
    if (msgType != client_hello && msgType != server_hello) {
6427
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6428
0
        return SANITY_MSG_E;
6429
0
    }
6430
6431
    /* Empty extension */
6432
1.62k
    if (length != 0)
6433
11
        return BUFFER_ERROR;
6434
6435
1.61k
    if (msgType == client_hello) {
6436
        /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
6437
1.61k
        if (!ssl->options.disallowEncThenMac) {
6438
1.61k
            ssl->options.encThenMac = 1;
6439
            /* Set the extension reply. */
6440
1.61k
            ret = TLSX_EncryptThenMac_Use(ssl);
6441
1.61k
            if (ret != 0)
6442
10
                return ret;
6443
1.61k
        }
6444
1.60k
        return 0;
6445
1.61k
    }
6446
6447
    /* Server Hello */
6448
5
    if (ssl->options.disallowEncThenMac) {
6449
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6450
0
        return SANITY_MSG_E;
6451
0
    }
6452
6453
5
    ssl->options.encThenMac = 1;
6454
5
    return 0;
6455
6456
5
}
6457
6458
/**
6459
 * Add the Encrypt-Then-MAC extension to list.
6460
 *
6461
 * ssl      SSL object
6462
 * return MEMORY_E when unable to allocate memory and 0 otherwise.
6463
 */
6464
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl)
6465
17.1k
{
6466
17.1k
    int   ret = 0;
6467
17.1k
    TLSX* extension;
6468
6469
    /* Find the Encrypt-Then-Mac extension if it exists. */
6470
17.1k
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6471
17.1k
    if (extension == NULL) {
6472
        /* Push new Encrypt-Then-Mac extension. */
6473
17.0k
        ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
6474
17.0k
            ssl->heap);
6475
17.0k
        if (ret != 0)
6476
15
            return ret;
6477
17.0k
    }
6478
6479
17.0k
    return 0;
6480
17.1k
}
6481
6482
/**
6483
 * Set the Encrypt-Then-MAC extension as one to respond too.
6484
 *
6485
 * ssl      SSL object
6486
 * return EXT_MISSING when EncryptThenMac extension not in list.
6487
 */
6488
int TLSX_EncryptThenMac_Respond(WOLFSSL* ssl)
6489
1.15k
{
6490
1.15k
    TLSX* extension;
6491
6492
1.15k
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6493
1.15k
    if (extension == NULL)
6494
0
        return EXT_MISSING;
6495
1.15k
    extension->resp = 1;
6496
6497
1.15k
    return 0;
6498
1.15k
}
6499
6500
#define ETM_GET_SIZE  TLSX_EncryptThenMac_GetSize
6501
#define ETM_WRITE     TLSX_EncryptThenMac_Write
6502
#define ETM_PARSE     TLSX_EncryptThenMac_Parse
6503
6504
#else
6505
6506
#define ETM_GET_SIZE(a, b)    0
6507
#define ETM_WRITE(a, b, c, d) 0
6508
#define ETM_PARSE(a, b, c, d) 0
6509
6510
#endif /* !WOLFSSL_NO_TLS12 */
6511
6512
#endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
6513
6514
6515
#ifdef WOLFSSL_SRTP
6516
6517
/******************************************************************************/
6518
/* DTLS SRTP (Secure Real-time Transport Protocol)                            */
6519
/******************************************************************************/
6520
6521
/* Only support single SRTP profile */
6522
typedef struct TlsxSrtp {
6523
    word16 profileCount;
6524
    word16 ids; /* selected bits */
6525
} TlsxSrtp;
6526
6527
#ifndef NO_WOLFSSL_SERVER
6528
static int TLSX_UseSRTP_GetSize(TlsxSrtp *srtp)
6529
{
6530
    /*   SRTP Profile Len (2)
6531
     *      SRTP Profiles (2)
6532
     *   MKI (master key id) Length */
6533
    return (OPAQUE16_LEN + (srtp->profileCount * OPAQUE16_LEN) + 1);
6534
}
6535
#endif
6536
6537
static TlsxSrtp* TLSX_UseSRTP_New(word16 ids, void* heap)
6538
{
6539
    TlsxSrtp* srtp;
6540
    int i;
6541
6542
    srtp = (TlsxSrtp*)XMALLOC(sizeof(TlsxSrtp), heap, DYNAMIC_TYPE_TLSX);
6543
    if (srtp == NULL) {
6544
        WOLFSSL_MSG("TLSX SRTP Memory failure");
6545
        return NULL;
6546
    }
6547
6548
    /* count and test each bit set */
6549
    srtp->profileCount = 0;
6550
    for (i=0; i<16; i++) {
6551
        if (ids & (1 << i)) {
6552
            srtp->profileCount++;
6553
        }
6554
    }
6555
    srtp->ids = ids;
6556
6557
    return srtp;
6558
}
6559
6560
static void TLSX_UseSRTP_Free(TlsxSrtp *srtp, void* heap)
6561
{
6562
    XFREE(srtp, heap, DYNAMIC_TYPE_TLSX);
6563
    (void)heap;
6564
}
6565
6566
#ifndef NO_WOLFSSL_SERVER
6567
static int TLSX_UseSRTP_Parse(WOLFSSL* ssl, const byte* input, word16 length,
6568
    byte isRequest)
6569
{
6570
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
6571
    word16 profile_len = 0;
6572
    word16 profile_value = 0;
6573
    word16 offset = 0;
6574
    int i;
6575
    TlsxSrtp* srtp = NULL;
6576
6577
    if (length < OPAQUE16_LEN) {
6578
        return BUFFER_ERROR;
6579
    }
6580
6581
    /* reset selected DTLS SRTP profile ID */
6582
    ssl->dtlsSrtpId = 0;
6583
6584
    /* total length, not include itself */
6585
    ato16(input, &profile_len);
6586
    offset += OPAQUE16_LEN;
6587
6588
    if (!isRequest) {
6589
#ifndef NO_WOLFSSL_CLIENT
6590
        if (length < offset + OPAQUE16_LEN)
6591
            return BUFFER_ERROR;
6592
6593
        ato16(input + offset, &profile_value);
6594
6595
        /* check that the profile received was in the ones we support */
6596
        if (profile_value < 16 &&
6597
                               (ssl->dtlsSrtpProfiles & (1 << profile_value))) {
6598
            ssl->dtlsSrtpId = profile_value;
6599
            ret = 0; /* success */
6600
        }
6601
#endif
6602
    }
6603
    else {
6604
        /* parse remainder one profile at a time, looking for match in CTX */
6605
        ret = 0;
6606
        for (i=offset; i<length; i+=OPAQUE16_LEN) {
6607
            if (length < (i + OPAQUE16_LEN)) {
6608
                WOLFSSL_MSG("Unexpected length when parsing SRTP profile");
6609
                ret = BUFFER_ERROR;
6610
                break;
6611
            }
6612
6613
            ato16(input+i, &profile_value);
6614
            /* find first match */
6615
            if (profile_value < 16 &&
6616
                                 ssl->dtlsSrtpProfiles & (1 << profile_value)) {
6617
                ssl->dtlsSrtpId = profile_value;
6618
6619
                /* make sure we respond with selected SRTP id selected */
6620
                srtp = TLSX_UseSRTP_New((1 << profile_value), ssl->heap);
6621
                if (srtp != NULL) {
6622
                    ret = TLSX_Push(&ssl->extensions, TLSX_USE_SRTP,
6623
                        (void*)srtp, ssl->heap);
6624
                    if (ret == 0) {
6625
                        TLSX_SetResponse(ssl, TLSX_USE_SRTP);
6626
                        /* successfully set extension */
6627
                    }
6628
                }
6629
                else {
6630
                    ret = MEMORY_E;
6631
                }
6632
                break;
6633
            }
6634
        }
6635
    }
6636
6637
    if (ret == 0 && ssl->dtlsSrtpId == 0) {
6638
        WOLFSSL_MSG("TLSX_UseSRTP_Parse profile not found!");
6639
        /* not fatal */
6640
    }
6641
    else if (ret != 0) {
6642
        ssl->dtlsSrtpId = 0;
6643
        TLSX_UseSRTP_Free(srtp, ssl->heap);
6644
    }
6645
    (void)profile_len;
6646
6647
    return ret;
6648
}
6649
6650
static word16 TLSX_UseSRTP_Write(TlsxSrtp* srtp, byte* output)
6651
{
6652
    word16 offset = 0;
6653
    int i, j;
6654
6655
    c16toa(srtp->profileCount * 2, output + offset);
6656
    offset += OPAQUE16_LEN;
6657
    j = 0;
6658
    for (i = 0; i < srtp->profileCount; i++) {
6659
        for (; j < 16; j++) {
6660
            if (srtp->ids & (1 << j)) {
6661
                c16toa(j, output + offset);
6662
                offset += OPAQUE16_LEN;
6663
            }
6664
        }
6665
    }
6666
    output[offset++] = 0x00; /* MKI Length */
6667
6668
    return offset;
6669
}
6670
#endif
6671
6672
static int TLSX_UseSRTP(TLSX** extensions, word16 profiles, void* heap)
6673
{
6674
    int ret = 0;
6675
    TLSX* extension;
6676
6677
    if (extensions == NULL) {
6678
        return BAD_FUNC_ARG;
6679
    }
6680
6681
    extension = TLSX_Find(*extensions, TLSX_USE_SRTP);
6682
    if (extension == NULL) {
6683
        TlsxSrtp* srtp = TLSX_UseSRTP_New(profiles, heap);
6684
        if (srtp == NULL) {
6685
            return MEMORY_E;
6686
        }
6687
6688
        ret = TLSX_Push(extensions, TLSX_USE_SRTP, (void*)srtp, heap);
6689
        if (ret != 0) {
6690
            TLSX_UseSRTP_Free(srtp, heap);
6691
        }
6692
    }
6693
6694
    return ret;
6695
}
6696
6697
#ifndef NO_WOLFSSL_SERVER
6698
    #define SRTP_FREE     TLSX_UseSRTP_Free
6699
    #define SRTP_PARSE    TLSX_UseSRTP_Parse
6700
    #define SRTP_WRITE    TLSX_UseSRTP_Write
6701
    #define SRTP_GET_SIZE TLSX_UseSRTP_GetSize
6702
#else
6703
    #define SRTP_FREE(a, b) WC_DO_NOTHING
6704
    #define SRTP_PARSE(a, b, c, d)      0
6705
    #define SRTP_WRITE(a, b)            0
6706
    #define SRTP_GET_SIZE(a)            0
6707
#endif
6708
6709
#endif /* WOLFSSL_SRTP */
6710
6711
6712
/******************************************************************************/
6713
/* Supported Versions                                                         */
6714
/******************************************************************************/
6715
6716
#ifdef WOLFSSL_TLS13
6717
static WC_INLINE int versionIsGreater(byte isDtls, byte a, byte b)
6718
{
6719
    (void)isDtls;
6720
6721
#ifdef WOLFSSL_DTLS
6722
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6723
    if (isDtls)
6724
        return a < b;
6725
#endif /* WOLFSSL_DTLS */
6726
6727
    return a > b;
6728
}
6729
6730
static WC_INLINE int versionIsLesser(byte isDtls, byte a, byte b)
6731
{
6732
    (void)isDtls;
6733
6734
#ifdef WOLFSSL_DTLS
6735
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6736
    if (isDtls)
6737
        return a > b;
6738
#endif /* WOLFSSL_DTLS */
6739
6740
    return a < b;
6741
}
6742
6743
static WC_INLINE int versionIsAtLeast(byte isDtls, byte a, byte b)
6744
{
6745
    (void)isDtls;
6746
6747
#ifdef WOLFSSL_DTLS
6748
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6749
    if (isDtls)
6750
        return a <= b;
6751
#endif /* WOLFSSL_DTLS */
6752
6753
    return a >= b;
6754
}
6755
6756
static WC_INLINE int versionIsLessEqual(byte isDtls, byte a, byte b)
6757
{
6758
    (void)isDtls;
6759
6760
#ifdef WOLFSSL_DTLS
6761
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6762
    if (isDtls)
6763
        return a >= b;
6764
#endif /* WOLFSSL_DTLS */
6765
6766
    return a <= b;
6767
}
6768
6769
/* Return the size of the SupportedVersions extension's data.
6770
 *
6771
 * data       The SSL/TLS object.
6772
 * msgType The type of the message this extension is being written into.
6773
 * returns the length of data that will be in the extension.
6774
 */
6775
static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
6776
0
{
6777
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6778
0
    byte tls13Minor, tls12Minor, tls11Minor, isDtls;
6779
6780
0
    isDtls = !!ssl->options.dtls;
6781
0
    tls13Minor = (byte)(isDtls ? DTLSv1_3_MINOR : TLSv1_3_MINOR);
6782
0
    tls12Minor = (byte)(isDtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR);
6783
0
    tls11Minor = (byte)(isDtls ? DTLS_MINOR : TLSv1_1_MINOR);
6784
6785
    /* unused on some configuration */
6786
0
    (void)tls12Minor;
6787
0
    (void)tls13Minor;
6788
0
    (void)tls11Minor;
6789
6790
0
    if (msgType == client_hello) {
6791
        /* TLS v1.2 and TLS v1.3  */
6792
0
        int cnt = 0;
6793
6794
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13Minor)
6795
        #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6796
            defined(WOLFSSL_WPAS_SMALL)
6797
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
6798
        #endif
6799
0
        ) {
6800
0
            cnt++;
6801
0
        }
6802
6803
0
        if (ssl->options.downgrade) {
6804
0
    #ifndef WOLFSSL_NO_TLS12
6805
0
            if (versionIsLessEqual(
6806
0
                    isDtls, ssl->options.minDowngrade, tls12Minor)
6807
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6808
    defined(WOLFSSL_WPAS_SMALL)
6809
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
6810
#endif
6811
0
            ) {
6812
0
                cnt++;
6813
0
            }
6814
0
#endif
6815
    #ifndef NO_OLD_TLS
6816
            if (versionIsLessEqual(
6817
                    isDtls, ssl->options.minDowngrade, tls11Minor)
6818
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6819
                defined(WOLFSSL_WPAS_SMALL)
6820
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
6821
            #endif
6822
            ) {
6823
                cnt++;
6824
            }
6825
        #ifdef WOLFSSL_ALLOW_TLSV10
6826
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
6827
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6828
                defined(WOLFSSL_WPAS_SMALL)
6829
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
6830
            #endif
6831
            ) {
6832
                cnt++;
6833
            }
6834
        #endif
6835
    #endif
6836
0
        }
6837
6838
0
        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
6839
0
    }
6840
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6841
0
        *pSz += OPAQUE16_LEN;
6842
0
    }
6843
0
    else {
6844
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6845
0
        return SANITY_MSG_E;
6846
0
    }
6847
6848
0
    return 0;
6849
0
}
6850
6851
/* Writes the SupportedVersions extension into the buffer.
6852
 *
6853
 * data    The SSL/TLS object.
6854
 * output  The buffer to write the extension into.
6855
 * msgType The type of the message this extension is being written into.
6856
 * returns the length of data that was written.
6857
 */
6858
static int TLSX_SupportedVersions_Write(void* data, byte* output,
6859
                                        byte msgType, word16* pSz)
6860
0
{
6861
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6862
0
    byte tls13minor, tls12minor, tls11minor, isDtls = 0;
6863
6864
0
    tls13minor = (byte)TLSv1_3_MINOR;
6865
0
    tls12minor = (byte)TLSv1_2_MINOR;
6866
0
    tls11minor = (byte)TLSv1_1_MINOR;
6867
6868
    /* unused in some configuration */
6869
0
    (void)tls11minor;
6870
0
    (void)tls12minor;
6871
6872
#ifdef WOLFSSL_DTLS13
6873
    if (ssl->options.dtls) {
6874
        tls13minor = (byte)DTLSv1_3_MINOR;
6875
    #ifndef WOLFSSL_NO_TLS12
6876
        tls12minor = (byte)DTLSv1_2_MINOR;
6877
    #endif
6878
    #ifndef NO_OLD_TLS
6879
        tls11minor = (byte)DTLS_MINOR;
6880
    #endif
6881
        isDtls = 1;
6882
    }
6883
#endif /* WOLFSSL_DTLS13 */
6884
6885
0
    if (msgType == client_hello) {
6886
0
        byte major = ssl->ctx->method->version.major;
6887
6888
0
        byte* cnt = output++;
6889
0
        *cnt = 0;
6890
6891
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13minor)
6892
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6893
    defined(WOLFSSL_WPAS_SMALL)
6894
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
6895
#endif
6896
0
        ) {
6897
0
            *cnt += OPAQUE16_LEN;
6898
        #ifdef WOLFSSL_TLS13_DRAFT
6899
            /* The TLS draft major number. */
6900
            *(output++) = TLS_DRAFT_MAJOR;
6901
            /* Version of draft supported. */
6902
            *(output++) = TLS_DRAFT_MINOR;
6903
        #else
6904
0
            *(output++) = major;
6905
0
            *(output++) = tls13minor;
6906
0
        #endif
6907
0
        }
6908
6909
0
        if (ssl->options.downgrade) {
6910
0
        #ifndef WOLFSSL_NO_TLS12
6911
0
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls12minor)
6912
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6913
                defined(WOLFSSL_WPAS_SMALL)
6914
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
6915
            #endif
6916
0
            ) {
6917
0
                *cnt += OPAQUE16_LEN;
6918
0
                *(output++) = major;
6919
0
                *(output++) = tls12minor;
6920
0
            }
6921
0
        #endif
6922
6923
    #ifndef NO_OLD_TLS
6924
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls11minor)
6925
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6926
                defined(WOLFSSL_WPAS_SMALL)
6927
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
6928
            #endif
6929
            ) {
6930
                *cnt += OPAQUE16_LEN;
6931
                *(output++) = major;
6932
                *(output++) = tls11minor;
6933
            }
6934
        #ifdef WOLFSSL_ALLOW_TLSV10
6935
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
6936
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6937
                defined(WOLFSSL_WPAS_SMALL)
6938
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
6939
            #endif
6940
            ) {
6941
                *cnt += OPAQUE16_LEN;
6942
                *(output++) = major;
6943
                *(output++) = (byte)TLSv1_MINOR;
6944
            }
6945
        #endif
6946
    #endif
6947
0
        }
6948
6949
0
        *pSz += (word16)(OPAQUE8_LEN + *cnt);
6950
0
    }
6951
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6952
0
        output[0] = ssl->version.major;
6953
0
        output[1] = ssl->version.minor;
6954
6955
0
        *pSz += OPAQUE16_LEN;
6956
0
    }
6957
0
    else {
6958
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6959
0
        return SANITY_MSG_E;
6960
0
    }
6961
6962
0
    return 0;
6963
0
}
6964
6965
/* Parse the SupportedVersions extension.
6966
 *
6967
 * ssl     The SSL/TLS object.
6968
 * input   The buffer with the extension data.
6969
 * length  The length of the extension data.
6970
 * msgType The type of the message this extension is being parsed from.
6971
 * pv      The output ProtocolVersion for the negotiated version
6972
 * opts    The output options structure. Can be NULL.
6973
 * exts    The output extensions list. Can be NULL.
6974
 * returns 0 on success, otherwise failure.
6975
 */
6976
int TLSX_SupportedVersions_Parse(const WOLFSSL* ssl, const byte* input,
6977
        word16 length, byte msgType, ProtocolVersion* pv, Options* opts,
6978
        TLSX** exts)
6979
0
{
6980
    /* The client's greatest minor version that we support */
6981
0
    byte clientGreatestMinor = SSLv3_MINOR;
6982
0
    int ret;
6983
0
    byte major, minor;
6984
0
    byte tls13minor, tls12minor;
6985
0
    byte isDtls;
6986
6987
0
    tls13minor = TLSv1_3_MINOR;
6988
0
    tls12minor = TLSv1_2_MINOR;
6989
0
    isDtls = ssl->options.dtls == 1;
6990
6991
#ifdef WOLFSSL_DTLS13
6992
    if (ssl->options.dtls) {
6993
        tls13minor = DTLSv1_3_MINOR;
6994
        tls12minor = DTLSv1_2_MINOR;
6995
        clientGreatestMinor = DTLS_MINOR;
6996
    }
6997
#endif /* WOLFSSL_DTLS13 */
6998
6999
0
    if (msgType == client_hello) {
7000
0
        int i;
7001
0
        int len;
7002
0
        int set = 0;
7003
7004
        /* Must contain a length and at least one version. */
7005
0
        if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1
7006
0
            || length > MAX_SV_EXT_LEN) {
7007
0
            return BUFFER_ERROR;
7008
0
        }
7009
7010
0
        len = *input;
7011
7012
        /* Protocol version array must fill rest of data. */
7013
0
        if (length != (word16)OPAQUE8_LEN + len)
7014
0
            return BUFFER_ERROR;
7015
7016
0
        input++;
7017
7018
        /* Find first match. */
7019
0
        for (i = 0; i < len; i += OPAQUE16_LEN) {
7020
0
            major = input[i];
7021
0
            minor = input[i + OPAQUE8_LEN];
7022
7023
#ifdef WOLFSSL_TLS13_DRAFT
7024
            if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
7025
                major = SSLv3_MAJOR;
7026
                minor = TLSv1_3_MINOR;
7027
            }
7028
#else
7029
0
            if (major == TLS_DRAFT_MAJOR)
7030
0
                continue;
7031
0
#endif
7032
7033
0
            if (major != ssl->ctx->method->version.major)
7034
0
                continue;
7035
7036
            /* No upgrade allowed. */
7037
0
            if (versionIsGreater(isDtls, minor, ssl->version.minor))
7038
0
                continue;
7039
7040
            /* Check downgrade. */
7041
0
            if (versionIsLesser(isDtls, minor, ssl->version.minor)) {
7042
0
                if (!ssl->options.downgrade)
7043
0
                    continue;
7044
7045
0
                if (versionIsLesser(isDtls, minor, ssl->options.minDowngrade))
7046
0
                    continue;
7047
0
            }
7048
0
            if (versionIsGreater(isDtls, minor, clientGreatestMinor))
7049
0
                clientGreatestMinor = minor;
7050
7051
0
            set = 1;
7052
0
        }
7053
0
        if (!set) {
7054
            /* No common supported version was negotiated */
7055
0
            SendAlert((WOLFSSL*)ssl, alert_fatal,
7056
0
                      wolfssl_alert_protocol_version);
7057
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7058
0
            return VERSION_ERROR;
7059
0
        }
7060
0
        pv->minor = clientGreatestMinor;
7061
0
        if (versionIsAtLeast(isDtls, clientGreatestMinor, tls13minor)) {
7062
0
            if (opts != NULL)
7063
0
                opts->tls1_3 = 1;
7064
7065
            /* TLS v1.3 requires supported version extension */
7066
0
            if (exts != NULL &&
7067
0
                    TLSX_Find(*exts, TLSX_SUPPORTED_VERSIONS) == NULL) {
7068
0
                ret = TLSX_Push(exts,
7069
0
                          TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
7070
0
                if (ret != 0) {
7071
0
                    return ret;
7072
0
                }
7073
                /* *exts should be pointing to the TLSX_SUPPORTED_VERSIONS
7074
                 * ext in the list since it was pushed. */
7075
0
                (*exts)->resp = 1;
7076
0
            }
7077
0
        }
7078
7079
0
    }
7080
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7081
        /* Must contain one version. */
7082
0
        if (length != OPAQUE16_LEN)
7083
0
            return BUFFER_ERROR;
7084
7085
0
        major = input[0];
7086
0
        minor = input[OPAQUE8_LEN];
7087
7088
0
        if (major != ssl->ctx->method->version.major) {
7089
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7090
0
            return VERSION_ERROR;
7091
0
        }
7092
7093
        /* Can't downgrade with this extension below TLS v1.3. */
7094
0
        if (versionIsLesser(isDtls, minor, tls13minor)) {
7095
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7096
0
            return VERSION_ERROR;
7097
0
        }
7098
7099
        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
7100
0
        if (ssl->options.downgrade && ssl->version.minor == tls12minor) {
7101
            /* Set minor version back to TLS v1.3+ */
7102
0
            pv->minor = ssl->ctx->method->version.minor;
7103
0
        }
7104
7105
        /* No upgrade allowed. */
7106
0
        if (versionIsLesser(isDtls, ssl->version.minor, minor)) {
7107
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7108
0
            return VERSION_ERROR;
7109
0
        }
7110
7111
        /* Check downgrade. */
7112
0
        if (versionIsGreater(isDtls, ssl->version.minor, minor)) {
7113
0
            if (!ssl->options.downgrade) {
7114
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7115
0
                return VERSION_ERROR;
7116
0
            }
7117
7118
0
            if (versionIsLesser(
7119
0
                    isDtls, minor, ssl->options.minDowngrade)) {
7120
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7121
0
                return VERSION_ERROR;
7122
0
            }
7123
7124
            /* Downgrade the version. */
7125
0
            pv->minor = minor;
7126
0
        }
7127
0
    }
7128
0
    else {
7129
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7130
0
        return SANITY_MSG_E;
7131
0
    }
7132
7133
0
    return 0;
7134
0
}
7135
7136
/* Sets a new SupportedVersions extension into the extension list.
7137
 *
7138
 * extensions  The list of extensions.
7139
 * data        The extensions specific data.
7140
 * heap        The heap used for allocation.
7141
 * returns 0 on success, otherwise failure.
7142
 */
7143
static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
7144
                                     void* heap)
7145
3.35k
{
7146
3.35k
    if (extensions == NULL || data == NULL)
7147
0
        return BAD_FUNC_ARG;
7148
7149
3.35k
    return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, data, heap);
7150
3.35k
}
7151
7152
#define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
7153
#define SV_WRITE     TLSX_SupportedVersions_Write
7154
2.76k
#define SV_PARSE     TLSX_SupportedVersions_Parse
7155
7156
#else
7157
7158
#define SV_GET_SIZE(a, b, c) 0
7159
#define SV_WRITE(a, b, c, d) 0
7160
#define SV_PARSE(a, b, c, d, e, f, g) 0
7161
7162
#endif /* WOLFSSL_TLS13 */
7163
7164
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
7165
7166
/******************************************************************************/
7167
/* Cookie                                                                     */
7168
/******************************************************************************/
7169
7170
/* Free the cookie data.
7171
 *
7172
 * cookie  Cookie data.
7173
 * heap    The heap used for allocation.
7174
 */
7175
static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
7176
{
7177
    (void)heap;
7178
7179
    XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
7180
}
7181
7182
/* Get the size of the encoded Cookie extension.
7183
 * In messages: ClientHello and HelloRetryRequest.
7184
 *
7185
 * cookie   The cookie to write.
7186
 * msgType  The type of the message this extension is being written into.
7187
 * returns the number of bytes of the encoded Cookie extension.
7188
 */
7189
static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
7190
{
7191
    if (msgType == client_hello || msgType == hello_retry_request) {
7192
        *pSz += OPAQUE16_LEN + cookie->len;
7193
    }
7194
    else {
7195
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7196
        return SANITY_MSG_E;
7197
    }
7198
    return 0;
7199
}
7200
7201
/* Writes the Cookie extension into the output buffer.
7202
 * Assumes that the the output buffer is big enough to hold data.
7203
 * In messages: ClientHello and HelloRetryRequest.
7204
 *
7205
 * cookie   The cookie to write.
7206
 * output   The buffer to write into.
7207
 * msgType  The type of the message this extension is being written into.
7208
 * returns the number of bytes written into the buffer.
7209
 */
7210
static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType,
7211
                             word16* pSz)
7212
{
7213
    if (msgType == client_hello || msgType == hello_retry_request) {
7214
        c16toa(cookie->len, output);
7215
        output += OPAQUE16_LEN;
7216
        XMEMCPY(output, cookie->data, cookie->len);
7217
        *pSz += OPAQUE16_LEN + cookie->len;
7218
    }
7219
    else {
7220
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7221
        return SANITY_MSG_E;
7222
    }
7223
    return 0;
7224
}
7225
7226
/* Parse the Cookie extension.
7227
 * In messages: ClientHello and HelloRetryRequest.
7228
 *
7229
 * ssl      The SSL/TLS object.
7230
 * input    The extension data.
7231
 * length   The length of the extension data.
7232
 * msgType  The type of the message this extension is being parsed from.
7233
 * returns 0 on success and other values indicate failure.
7234
 */
7235
static int TLSX_Cookie_Parse(WOLFSSL* ssl, const byte* input, word16 length,
7236
                             byte msgType)
7237
{
7238
    word16  len;
7239
    word16  idx = 0;
7240
    TLSX*   extension;
7241
    Cookie* cookie;
7242
7243
    if (msgType != client_hello && msgType != hello_retry_request) {
7244
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7245
        return SANITY_MSG_E;
7246
    }
7247
7248
    /* Message contains length and Cookie which must be at least one byte
7249
     * in length.
7250
     */
7251
    if (length < OPAQUE16_LEN + 1)
7252
        return BUFFER_E;
7253
    ato16(input + idx, &len);
7254
    idx += OPAQUE16_LEN;
7255
    if (length - idx != len)
7256
        return BUFFER_E;
7257
7258
    if (msgType == hello_retry_request) {
7259
        ssl->options.hrrSentCookie = 1;
7260
        return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 1,
7261
                               &ssl->extensions);
7262
    }
7263
7264
    /* client_hello */
7265
    extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
7266
    if (extension == NULL) {
7267
#ifdef WOLFSSL_DTLS13
7268
        if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
7269
            /* Allow a cookie extension with DTLS 1.3 because it is possible
7270
             * that a different SSL instance sent the cookie but we are now
7271
             * receiving it. */
7272
            return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
7273
                                   &ssl->extensions);
7274
        else
7275
#endif
7276
        {
7277
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7278
            return HRR_COOKIE_ERROR;
7279
        }
7280
    }
7281
7282
    cookie = (Cookie*)extension->data;
7283
    if (cookie->len != len || XMEMCMP(cookie->data, input + idx, len) != 0) {
7284
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7285
        return HRR_COOKIE_ERROR;
7286
    }
7287
7288
    /* Request seen. */
7289
    extension->resp = 0;
7290
7291
    return 0;
7292
}
7293
7294
/* Use the data to create a new Cookie object in the extensions.
7295
 *
7296
 * ssl    SSL/TLS object.
7297
 * data   Cookie data.
7298
 * len    Length of cookie data in bytes.
7299
 * mac    MAC data.
7300
 * macSz  Length of MAC data in bytes.
7301
 * resp   Indicates the extension will go into a response (HelloRetryRequest).
7302
 * returns 0 on success and other values indicate failure.
7303
 */
7304
int TLSX_Cookie_Use(const WOLFSSL* ssl, const byte* data, word16 len, byte* mac,
7305
                    byte macSz, int resp, TLSX** exts)
7306
{
7307
    int     ret = 0;
7308
    TLSX*   extension;
7309
    Cookie* cookie;
7310
7311
    /* Find the cookie extension if it exists. */
7312
    extension = TLSX_Find(*exts, TLSX_COOKIE);
7313
    if (extension == NULL) {
7314
        /* Push new cookie extension. */
7315
        ret = TLSX_Push(exts, TLSX_COOKIE, NULL, ssl->heap);
7316
        if (ret != 0)
7317
            return ret;
7318
7319
        extension = TLSX_Find(*exts, TLSX_COOKIE);
7320
        if (extension == NULL)
7321
            return MEMORY_E;
7322
    }
7323
7324
    cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz, ssl->heap,
7325
                              DYNAMIC_TYPE_TLSX);
7326
    if (cookie == NULL)
7327
        return MEMORY_E;
7328
7329
    cookie->len = len + macSz;
7330
    XMEMCPY(cookie->data, data, len);
7331
    if (mac != NULL)
7332
        XMEMCPY(cookie->data + len, mac, macSz);
7333
7334
    XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
7335
7336
    extension->data = (void*)cookie;
7337
    extension->resp = (byte)resp;
7338
7339
    return 0;
7340
}
7341
7342
#define CKE_FREE_ALL  TLSX_Cookie_FreeAll
7343
#define CKE_GET_SIZE  TLSX_Cookie_GetSize
7344
#define CKE_WRITE     TLSX_Cookie_Write
7345
#define CKE_PARSE     TLSX_Cookie_Parse
7346
7347
#else
7348
7349
#define CKE_FREE_ALL(a, b)    0
7350
#define CKE_GET_SIZE(a, b, c) 0
7351
#define CKE_WRITE(a, b, c, d) 0
7352
#define CKE_PARSE(a, b, c, d) 0
7353
7354
#endif
7355
7356
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && \
7357
    !defined(WOLFSSL_NO_CA_NAMES) && defined(OPENSSL_EXTRA)
7358
/* Currently only settable through compatibility API */
7359
/******************************************************************************/
7360
/* Certificate Authorities                                                       */
7361
/******************************************************************************/
7362
7363
static word16 TLSX_CA_Names_GetSize(void* data)
7364
{
7365
    WOLFSSL* ssl = (WOLFSSL*)data;
7366
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7367
    word16 size = 0;
7368
7369
    /* Length of names */
7370
    size += OPAQUE16_LEN;
7371
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL; names = names->next) {
7372
        byte seq[MAX_SEQ_SZ];
7373
        WOLFSSL_X509_NAME* name = names->data.name;
7374
7375
        if (name != NULL) {
7376
            /* 16-bit length | SEQ | Len | DER of name */
7377
            size += (word16)(OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
7378
                             name->rawLen);
7379
        }
7380
    }
7381
    return size;
7382
}
7383
7384
static word16 TLSX_CA_Names_Write(void* data, byte* output)
7385
{
7386
    WOLFSSL* ssl = (WOLFSSL*)data;
7387
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7388
    byte* len;
7389
7390
    /* Reserve space for the length value */
7391
    len = output;
7392
    output += OPAQUE16_LEN;
7393
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL; names = names->next) {
7394
        byte seq[MAX_SEQ_SZ];
7395
        WOLFSSL_X509_NAME* name = names->data.name;
7396
7397
        if (name != NULL) {
7398
            c16toa((word16)name->rawLen +
7399
                   (word16)SetSequence(name->rawLen, seq), output);
7400
            output += OPAQUE16_LEN;
7401
            output += SetSequence(name->rawLen, output);
7402
            XMEMCPY(output, name->raw, name->rawLen);
7403
            output += name->rawLen;
7404
        }
7405
    }
7406
    /* Write the total length */
7407
    c16toa((word16)(output - len - OPAQUE16_LEN), len);
7408
    return (word16)(output - len);
7409
}
7410
7411
static int TLSX_CA_Names_Parse(WOLFSSL *ssl, const byte* input,
7412
                                  word16 length, byte isRequest)
7413
{
7414
    word16 extLen;
7415
7416
    (void)isRequest;
7417
7418
    wolfSSL_sk_X509_NAME_pop_free(ssl->peer_ca_names, NULL);
7419
    ssl->peer_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
7420
    if (ssl->peer_ca_names == NULL)
7421
        return MEMORY_ERROR;
7422
7423
    if (length < OPAQUE16_LEN)
7424
        return BUFFER_ERROR;
7425
7426
    ato16(input, &extLen);
7427
    input += OPAQUE16_LEN;
7428
    length -= OPAQUE16_LEN;
7429
    if (extLen != length)
7430
        return BUFFER_ERROR;
7431
7432
    while (length) {
7433
        word32 idx = 0;
7434
        WOLFSSL_X509_NAME* name = NULL;
7435
        int ret = 0;
7436
        int didInit = FALSE;
7437
        /* Use a DecodedCert struct to get access to GetName to
7438
         * parse DN name */
7439
#ifdef WOLFSSL_SMALL_STACK
7440
        DecodedCert *cert = (DecodedCert *)XMALLOC(
7441
            sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
7442
        if (cert == NULL)
7443
            return MEMORY_ERROR;
7444
#else
7445
        DecodedCert cert[1];
7446
#endif
7447
7448
        if (length < OPAQUE16_LEN) {
7449
            ret = BUFFER_ERROR;
7450
        }
7451
7452
        if (ret == 0) {
7453
            ato16(input, &extLen);
7454
            idx += OPAQUE16_LEN;
7455
7456
            if (idx + extLen > length)
7457
                ret = BUFFER_ERROR;
7458
        }
7459
7460
        if (ret == 0) {
7461
            InitDecodedCert(cert, input + idx, extLen, ssl->heap);
7462
            didInit = TRUE;
7463
            idx += extLen;
7464
            ret = GetName(cert, ASN_SUBJECT, extLen);
7465
        }
7466
7467
        if (ret == 0 && (name = wolfSSL_X509_NAME_new()) == NULL)
7468
            ret = MEMORY_ERROR;
7469
7470
        if (ret == 0) {
7471
            CopyDecodedName(name, cert, ASN_SUBJECT);
7472
            if (wolfSSL_sk_X509_NAME_push(ssl->peer_ca_names, name) <= 0) {
7473
                wolfSSL_X509_NAME_free(name);
7474
                ret = MEMORY_ERROR;
7475
            }
7476
        }
7477
7478
        if (didInit)
7479
            FreeDecodedCert(cert);
7480
7481
        WC_FREE_VAR_EX(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
7482
        if (ret != 0)
7483
            return ret;
7484
7485
        input += idx;
7486
        length -= (word16)idx;
7487
    }
7488
    return 0;
7489
}
7490
7491
#define CAN_GET_SIZE(data)      TLSX_CA_Names_GetSize(data)
7492
#define CAN_WRITE(data, output) TLSX_CA_Names_Write(data, output)
7493
#define CAN_PARSE(ssl, input, length, isRequest) \
7494
                                TLSX_CA_Names_Parse(ssl, input, length, isRequest)
7495
7496
#else
7497
7498
#define CAN_GET_SIZE(data)                       0
7499
#define CAN_WRITE(data, output)                  0
7500
#define CAN_PARSE(ssl, input, length, isRequest) 0
7501
7502
#endif
7503
7504
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
7505
/******************************************************************************/
7506
/* Signature Algorithms                                                       */
7507
/******************************************************************************/
7508
7509
/* Return the size of the SignatureAlgorithms extension's data.
7510
 *
7511
 * data  Unused
7512
 * returns the length of data that will be in the extension.
7513
 */
7514
7515
static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
7516
14.7k
{
7517
14.7k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7518
7519
14.7k
    if (sa->hashSigAlgoSz == 0)
7520
14.7k
        return OPAQUE16_LEN + WOLFSSL_SUITES(sa->ssl)->hashSigAlgoSz;
7521
0
    else
7522
0
        return OPAQUE16_LEN + sa->hashSigAlgoSz;
7523
14.7k
}
7524
7525
/* Creates a bit string of supported hash algorithms with RSA PSS.
7526
 * The bit string is used when determining which signature algorithm to use
7527
 * when creating the CertificateVerify message.
7528
 * Note: Valid data has an even length as each signature algorithm is two bytes.
7529
 *
7530
 * ssl     The SSL/TLS object.
7531
 * input   The buffer with the list of supported signature algorithms.
7532
 * length  The length of the list in bytes.
7533
 * returns 0 on success, BUFFER_ERROR when the length is not even.
7534
 */
7535
static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, const byte* input,
7536
                                           word16 length)
7537
18.2k
{
7538
18.2k
    word16 i;
7539
7540
18.2k
    if ((length & 1) == 1)
7541
0
        return BUFFER_ERROR;
7542
7543
18.2k
    ssl->pssAlgo = 0;
7544
361k
    for (i = 0; i < length; i += 2) {
7545
343k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
7546
48.0k
            ssl->pssAlgo |= 1 << input[i + 1];
7547
343k
    #ifdef WOLFSSL_TLS13
7548
343k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
7549
90.6k
                                                   input[i + 1] <= pss_sha512) {
7550
44.4k
            ssl->pssAlgo |= 1 << input[i + 1];
7551
44.4k
        }
7552
343k
    #endif
7553
343k
    }
7554
7555
18.2k
    return 0;
7556
18.2k
}
7557
7558
/* Writes the SignatureAlgorithms extension into the buffer.
7559
 *
7560
 * data    Unused
7561
 * output  The buffer to write the extension into.
7562
 * returns the length of data that was written.
7563
 */
7564
static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
7565
14.7k
{
7566
14.7k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7567
14.7k
    const Suites* suites = WOLFSSL_SUITES(sa->ssl);
7568
14.7k
    word16 hashSigAlgoSz;
7569
7570
14.7k
    if (sa->hashSigAlgoSz == 0) {
7571
14.7k
        c16toa(suites->hashSigAlgoSz, output);
7572
14.7k
        XMEMCPY(output + OPAQUE16_LEN, suites->hashSigAlgo,
7573
14.7k
                suites->hashSigAlgoSz);
7574
14.7k
        hashSigAlgoSz = suites->hashSigAlgoSz;
7575
14.7k
    }
7576
0
    else {
7577
0
        c16toa(sa->hashSigAlgoSz, output);
7578
0
        XMEMCPY(output + OPAQUE16_LEN, sa->hashSigAlgo,
7579
0
                sa->hashSigAlgoSz);
7580
0
        hashSigAlgoSz = sa->hashSigAlgoSz;
7581
0
    }
7582
7583
14.7k
#ifndef NO_RSA
7584
14.7k
    TLSX_SignatureAlgorithms_MapPss(sa->ssl, output + OPAQUE16_LEN,
7585
14.7k
            hashSigAlgoSz);
7586
14.7k
#endif
7587
7588
14.7k
    return OPAQUE16_LEN + hashSigAlgoSz;
7589
14.7k
}
7590
7591
/* Parse the SignatureAlgorithms extension.
7592
 *
7593
 * ssl     The SSL/TLS object.
7594
 * input   The buffer with the extension data.
7595
 * length  The length of the extension data.
7596
 * returns 0 on success, otherwise failure.
7597
 */
7598
static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, const byte* input,
7599
                                  word16 length, byte isRequest, Suites* suites)
7600
3.58k
{
7601
3.58k
    word16 len;
7602
7603
3.58k
    if (!isRequest)
7604
0
        return BUFFER_ERROR;
7605
7606
    /* Must contain a length and at least algorithm. */
7607
3.58k
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7608
38
        return BUFFER_ERROR;
7609
7610
3.54k
    ato16(input, &len);
7611
3.54k
    input += OPAQUE16_LEN;
7612
7613
    /* Algorithm array must fill rest of data. */
7614
3.54k
    if (length != OPAQUE16_LEN + len)
7615
83
        return BUFFER_ERROR;
7616
7617
    /* Sig Algo list size must be even. */
7618
3.45k
    if (suites->hashSigAlgoSz % 2 != 0)
7619
0
        return BUFFER_ERROR;
7620
7621
    /* truncate hashSigAlgo list if too long */
7622
3.45k
    suites->hashSigAlgoSz = len;
7623
3.45k
    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7624
27
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7625
27
        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7626
27
    }
7627
3.45k
    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
7628
7629
3.45k
    return TLSX_SignatureAlgorithms_MapPss(ssl, input, suites->hashSigAlgoSz);
7630
3.45k
}
7631
7632
/* Sets a new SignatureAlgorithms extension into the extension list.
7633
 *
7634
 * extensions  The list of extensions.
7635
 * data        The extensions specific data.
7636
 * heap        The heap used for allocation.
7637
 * returns 0 on success, otherwise failure.
7638
 */
7639
static int TLSX_SetSignatureAlgorithms(TLSX** extensions, WOLFSSL* ssl,
7640
                                       void* heap)
7641
27.6k
{
7642
27.6k
    SignatureAlgorithms* sa;
7643
27.6k
    int ret;
7644
7645
27.6k
    if (extensions == NULL)
7646
0
        return BAD_FUNC_ARG;
7647
7648
    /* Already present */
7649
27.6k
    if (TLSX_Find(*extensions, TLSX_SIGNATURE_ALGORITHMS) != NULL)
7650
69
        return 0;
7651
7652
27.5k
    sa = TLSX_SignatureAlgorithms_New(ssl, 0, heap);
7653
27.5k
    if (sa == NULL)
7654
50
        return MEMORY_ERROR;
7655
7656
27.5k
    ret = TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, sa, heap);
7657
27.5k
    if (ret != 0)
7658
126
        TLSX_SignatureAlgorithms_FreeAll(sa, heap);
7659
27.5k
    return ret;
7660
27.5k
}
7661
7662
SignatureAlgorithms* TLSX_SignatureAlgorithms_New(WOLFSSL* ssl,
7663
        word16 hashSigAlgoSz, void* heap)
7664
27.5k
{
7665
27.5k
    SignatureAlgorithms* sa;
7666
27.5k
    (void)heap;
7667
7668
27.5k
    sa = (SignatureAlgorithms*)XMALLOC(sizeof(*sa) + hashSigAlgoSz, heap,
7669
27.5k
                                       DYNAMIC_TYPE_TLSX);
7670
27.5k
    if (sa != NULL) {
7671
27.5k
        XMEMSET(sa, 0, sizeof(*sa) + hashSigAlgoSz);
7672
27.5k
        sa->ssl = ssl;
7673
27.5k
        sa->hashSigAlgoSz = hashSigAlgoSz;
7674
27.5k
    }
7675
27.5k
    return sa;
7676
27.5k
}
7677
7678
void TLSX_SignatureAlgorithms_FreeAll(SignatureAlgorithms* sa,
7679
                                             void* heap)
7680
27.5k
{
7681
27.5k
    XFREE(sa, heap, DYNAMIC_TYPE_TLSX);
7682
27.5k
    (void)heap;
7683
27.5k
}
7684
7685
#define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
7686
#define SA_WRITE     TLSX_SignatureAlgorithms_Write
7687
#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
7688
0
#define SA_FREE_ALL  TLSX_SignatureAlgorithms_FreeAll
7689
#endif
7690
/******************************************************************************/
7691
/* Signature Algorithms Certificate                                           */
7692
/******************************************************************************/
7693
7694
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
7695
/* Return the size of the SignatureAlgorithms extension's data.
7696
 *
7697
 * data  Unused
7698
 * returns the length of data that will be in the extension.
7699
 */
7700
static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
7701
0
{
7702
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7703
7704
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
7705
0
}
7706
7707
/* Writes the SignatureAlgorithmsCert extension into the buffer.
7708
 *
7709
 * data    Unused
7710
 * output  The buffer to write the extension into.
7711
 * returns the length of data that was written.
7712
 */
7713
static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
7714
0
{
7715
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7716
7717
0
    c16toa(ssl->certHashSigAlgoSz, output);
7718
0
    XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
7719
0
            ssl->certHashSigAlgoSz);
7720
7721
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
7722
0
}
7723
7724
/* Parse the SignatureAlgorithmsCert extension.
7725
 *
7726
 * ssl     The SSL/TLS object.
7727
 * input   The buffer with the extension data.
7728
 * length  The length of the extension data.
7729
 * returns 0 on success, otherwise failure.
7730
 */
7731
static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, const byte* input,
7732
                                              word16 length, byte isRequest)
7733
38
{
7734
38
    word16 len;
7735
7736
38
    if (!isRequest)
7737
0
        return BUFFER_ERROR;
7738
7739
    /* Must contain a length and at least algorithm. */
7740
38
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7741
8
        return BUFFER_ERROR;
7742
7743
30
    ato16(input, &len);
7744
30
    input += OPAQUE16_LEN;
7745
7746
    /* Algorithm array must fill rest of data. */
7747
30
    if (length != OPAQUE16_LEN + len)
7748
8
        return BUFFER_ERROR;
7749
7750
    /* truncate hashSigAlgo list if too long */
7751
22
    ssl->certHashSigAlgoSz = len;
7752
22
    if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7753
1
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7754
1
        ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7755
1
    }
7756
22
    XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
7757
7758
22
    return 0;
7759
30
}
7760
7761
/* Sets a new SignatureAlgorithmsCert extension into the extension list.
7762
 *
7763
 * extensions  The list of extensions.
7764
 * data        The extensions specific data.
7765
 * heap        The heap used for allocation.
7766
 * returns 0 on success, otherwise failure.
7767
 */
7768
static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions,
7769
        const WOLFSSL* data, void* heap)
7770
0
{
7771
0
    if (extensions == NULL)
7772
0
        return BAD_FUNC_ARG;
7773
7774
0
    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, data, heap);
7775
0
}
7776
7777
#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
7778
#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
7779
#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
7780
#endif /* WOLFSSL_TLS13 */
7781
7782
7783
/******************************************************************************/
7784
/* Key Share                                                                  */
7785
/******************************************************************************/
7786
7787
#ifndef MAX_KEYSHARE_NAMED_GROUPS
7788
    #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY)
7789
        #define MAX_KEYSHARE_NAMED_GROUPS    24
7790
    #else
7791
1.76k
        #define MAX_KEYSHARE_NAMED_GROUPS    12
7792
    #endif
7793
#endif
7794
7795
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
7796
/* Create a key share entry using named Diffie-Hellman parameters group.
7797
 * Generates a key pair.
7798
 *
7799
 * ssl   The SSL/TLS object.
7800
 * kse   The key share entry object.
7801
 * returns 0 on success, otherwise failure.
7802
 */
7803
static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
7804
253
{
7805
253
    int ret = 0;
7806
253
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
7807
253
    word32 pSz = 0, pvtSz = 0;
7808
253
    DhKey* dhKey = (DhKey*)kse->key;
7809
7810
    /* Pick the parameters from the named group. */
7811
253
#ifdef HAVE_PUBLIC_FFDHE
7812
253
    const DhParams* params = NULL;
7813
253
    switch (kse->group) {
7814
0
    #ifdef HAVE_FFDHE_2048
7815
253
        case WOLFSSL_FFDHE_2048:
7816
253
            params = wc_Dh_ffdhe2048_Get();
7817
253
            pvtSz = 29;
7818
253
            break;
7819
0
    #endif
7820
    #ifdef HAVE_FFDHE_3072
7821
        case WOLFSSL_FFDHE_3072:
7822
            params = wc_Dh_ffdhe3072_Get();
7823
            pvtSz = 34;
7824
            break;
7825
    #endif
7826
    #ifdef HAVE_FFDHE_4096
7827
        case WOLFSSL_FFDHE_4096:
7828
            params = wc_Dh_ffdhe4096_Get();
7829
            pvtSz = 39;
7830
            break;
7831
    #endif
7832
    #ifdef HAVE_FFDHE_6144
7833
        case WOLFSSL_FFDHE_6144:
7834
            params = wc_Dh_ffdhe6144_Get();
7835
            pvtSz = 46;
7836
            break;
7837
    #endif
7838
    #ifdef HAVE_FFDHE_8192
7839
        case WOLFSSL_FFDHE_8192:
7840
            params = wc_Dh_ffdhe8192_Get();
7841
            pvtSz = 52;
7842
            break;
7843
    #endif
7844
0
        default:
7845
0
            break;
7846
253
    }
7847
253
    if (params == NULL)
7848
0
        return BAD_FUNC_ARG;
7849
253
    pSz = params->p_len;
7850
#else
7851
    pvtSz = wc_DhGetNamedKeyMinSize(kse->group);
7852
    if (pvtSz == 0) {
7853
        return BAD_FUNC_ARG;
7854
    }
7855
    ret = wc_DhGetNamedKeyParamSize(kse->group, &pSz, NULL, NULL);
7856
    if (ret != 0) {
7857
        return BAD_FUNC_ARG;
7858
    }
7859
#endif
7860
7861
    /* Trigger Key Generation */
7862
253
    if (kse->pubKey == NULL || kse->privKey == NULL) {
7863
252
        if (kse->key == NULL) {
7864
252
            kse->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
7865
252
                DYNAMIC_TYPE_DH);
7866
252
            if (kse->key == NULL)
7867
2
                return MEMORY_E;
7868
7869
            /* Setup Key */
7870
250
            ret = wc_InitDhKey_ex((DhKey*)kse->key, ssl->heap, ssl->devId);
7871
250
            if (ret == 0) {
7872
250
                dhKey = (DhKey*)kse->key;
7873
250
            #ifdef HAVE_PUBLIC_FFDHE
7874
250
                ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
7875
250
                                                                 params->g_len);
7876
            #else
7877
                ret = wc_DhSetNamedKey(dhKey, kse->group);
7878
            #endif
7879
250
            }
7880
250
        }
7881
7882
        /* Allocate space for the private and public key */
7883
250
        if (ret == 0 && kse->pubKey == NULL) {
7884
250
            kse->pubKey = (byte*)XMALLOC(pSz, ssl->heap,
7885
250
                DYNAMIC_TYPE_PUBLIC_KEY);
7886
250
            if (kse->pubKey == NULL)
7887
1
                ret = MEMORY_E;
7888
250
        }
7889
7890
250
        if (ret == 0 && kse->privKey == NULL) {
7891
249
            kse->privKey = (byte*)XMALLOC(pvtSz, ssl->heap,
7892
249
                DYNAMIC_TYPE_PRIVATE_KEY);
7893
249
            if (kse->privKey == NULL)
7894
2
                ret = MEMORY_E;
7895
249
        }
7896
7897
250
        if (ret == 0) {
7898
        #if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
7899
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_DH, kse->key);
7900
            kse->pubKeyLen = pSz;
7901
            kse->keyLen = pvtSz;
7902
            if (ret == 0) {
7903
                ret = wc_DhExportKeyPair(dhKey,
7904
                    (byte*)kse->privKey, &kse->keyLen, /* private */
7905
                    kse->pubKey, &kse->pubKeyLen /* public */
7906
                );
7907
            }
7908
            else
7909
        #endif
7910
247
            {
7911
                /* Generate a new key pair */
7912
                /* For async this is called once and when event is done, the
7913
                 *   provided buffers will be populated.
7914
                 * Final processing is zero pad below. */
7915
247
                kse->pubKeyLen = pSz;
7916
247
                kse->keyLen = pvtSz;
7917
247
                ret = DhGenKeyPair(ssl, dhKey,
7918
247
                    (byte*)kse->privKey, &kse->keyLen, /* private */
7919
247
                    kse->pubKey, &kse->pubKeyLen /* public */
7920
247
                );
7921
            #ifdef WOLFSSL_ASYNC_CRYPT
7922
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
7923
                    return ret;
7924
                }
7925
            #endif
7926
247
            }
7927
247
        }
7928
250
    }
7929
7930
251
    if (ret == 0) {
7931
146
        if (pSz != kse->pubKeyLen) {
7932
            /* Zero pad the front of the public key to match prime "p" size */
7933
0
            XMEMMOVE(kse->pubKey + pSz - kse->pubKeyLen, kse->pubKey,
7934
0
                kse->pubKeyLen);
7935
0
            XMEMSET(kse->pubKey, 0, pSz - kse->pubKeyLen);
7936
0
            kse->pubKeyLen = pSz;
7937
0
        }
7938
7939
146
        if (pvtSz != kse->keyLen) {
7940
            /* Zero pad the front of the private key */
7941
0
            XMEMMOVE(kse->privKey + pvtSz - kse->keyLen, kse->privKey,
7942
0
                kse->keyLen);
7943
0
            XMEMSET(kse->privKey, 0, pvtSz - kse->keyLen);
7944
0
            kse->keyLen = pvtSz;
7945
0
        }
7946
7947
    #ifdef WOLFSSL_DEBUG_TLS
7948
        WOLFSSL_MSG("Public DH Key");
7949
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
7950
    #endif
7951
146
    }
7952
7953
    /* Always release the DH key to free up memory.
7954
     * The DhKey will be setup again in TLSX_KeyShare_ProcessDh */
7955
251
    if (dhKey != NULL)
7956
250
        wc_FreeDhKey(dhKey);
7957
251
    XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
7958
251
    kse->key = NULL;
7959
7960
251
    if (ret != 0) {
7961
        /* Cleanup on error, otherwise data owned by key share entry */
7962
105
        if (kse->privKey) {
7963
102
            ForceZero(kse->privKey, pvtSz);
7964
102
            XFREE(kse->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7965
102
            kse->privKey = NULL;
7966
102
        }
7967
105
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7968
105
        kse->pubKey = NULL;
7969
105
    }
7970
#else
7971
    (void)ssl;
7972
    (void)kse;
7973
7974
    ret = NOT_COMPILED_IN;
7975
    WOLFSSL_ERROR_VERBOSE(ret);
7976
#endif
7977
7978
251
    return ret;
7979
253
}
7980
7981
/* Create a key share entry using X25519 parameters group.
7982
 * Generates a key pair.
7983
 *
7984
 * ssl   The SSL/TLS object.
7985
 * kse   The key share entry object.
7986
 * returns 0 on success, otherwise failure.
7987
 */
7988
static int TLSX_KeyShare_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
7989
672
{
7990
672
    int ret = 0;
7991
672
#ifdef HAVE_CURVE25519
7992
672
    curve25519_key* key = (curve25519_key*)kse->key;
7993
7994
672
    if (kse->key == NULL) {
7995
        /* Allocate a Curve25519 key to hold private key. */
7996
668
        kse->key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
7997
668
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
7998
668
        if (kse->key == NULL) {
7999
2
            WOLFSSL_MSG("GenX25519Key memory error");
8000
2
            return MEMORY_E;
8001
2
        }
8002
8003
        /* Make an Curve25519 key. */
8004
666
        ret = wc_curve25519_init_ex((curve25519_key*)kse->key, ssl->heap,
8005
666
            ssl->devId);
8006
666
        if (ret == 0) {
8007
            /* setting "key" means okay to call wc_curve25519_free */
8008
666
            key = (curve25519_key*)kse->key;
8009
666
            kse->keyLen = CURVE25519_KEYSIZE;
8010
666
        }
8011
    #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8012
        defined(WC_ASYNC_ENABLE_X25519)
8013
        /* Only set non-blocking context when async device is active. With
8014
         * INVALID_DEVID there is no async loop to retry on FP_WOULDBLOCK, so
8015
         * skip non-blocking setup and use blocking mode instead. */
8016
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
8017
            x25519_nb_ctx_t* nb_ctx = (x25519_nb_ctx_t*)XMALLOC(
8018
                sizeof(x25519_nb_ctx_t), ssl->heap,
8019
                DYNAMIC_TYPE_TMP_BUFFER);
8020
            if (nb_ctx == NULL) {
8021
                ret = MEMORY_E;
8022
            }
8023
            else {
8024
                ret = wc_curve25519_set_nonblock(key, nb_ctx);
8025
                if (ret != 0) {
8026
                    XFREE(nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8027
                }
8028
            }
8029
        }
8030
    #endif /* WC_X25519_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8031
              WC_ASYNC_ENABLE_X25519 */
8032
666
        if (ret == 0) {
8033
        #ifdef WOLFSSL_STATIC_EPHEMERAL
8034
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE25519, kse->key);
8035
            if (ret != 0) /* on failure, fallback to local key generation */
8036
        #endif
8037
666
            {
8038
            #ifdef WOLFSSL_ASYNC_CRYPT
8039
                /* initialize event */
8040
                ret = wolfSSL_AsyncInit(ssl, &key->asyncDev,
8041
                    WC_ASYNC_FLAG_NONE);
8042
                if (ret != 0)
8043
                    return ret;
8044
            #endif
8045
666
                ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
8046
8047
                /* Handle async pending response */
8048
            #ifdef WOLFSSL_ASYNC_CRYPT
8049
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8050
                    return wolfSSL_AsyncPush(ssl, &key->asyncDev);
8051
                }
8052
            #endif /* WOLFSSL_ASYNC_CRYPT */
8053
666
            }
8054
666
        }
8055
666
    }
8056
8057
670
    if (ret == 0 && kse->pubKey == NULL) {
8058
        /* Allocate space for the public key. */
8059
646
        kse->pubKey = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
8060
646
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8061
646
        if (kse->pubKey == NULL) {
8062
5
            WOLFSSL_MSG("GenX25519Key pub memory error");
8063
5
            ret = MEMORY_E;
8064
5
        }
8065
646
    }
8066
8067
670
    if (ret == 0) {
8068
        /* Export Curve25519 public key. */
8069
645
        kse->pubKeyLen = CURVE25519_KEYSIZE;
8070
645
        if (wc_curve25519_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8071
645
                                                  EC25519_LITTLE_ENDIAN) != 0) {
8072
0
            ret = ECC_EXPORT_ERROR;
8073
0
            WOLFSSL_ERROR_VERBOSE(ret);
8074
0
        }
8075
645
        kse->pubKeyLen = CURVE25519_KEYSIZE; /* always CURVE25519_KEYSIZE */
8076
645
    }
8077
8078
#ifdef WOLFSSL_DEBUG_TLS
8079
    if (ret == 0) {
8080
        WOLFSSL_MSG("Public Curve25519 Key");
8081
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8082
    }
8083
#endif
8084
8085
670
    if (ret != 0) {
8086
        /* Data owned by key share entry otherwise. */
8087
25
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8088
25
        kse->pubKey = NULL;
8089
25
        if (key != NULL) {
8090
        #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
8091
            if (key->nb_ctx != NULL) {
8092
                XFREE(key->nb_ctx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8093
            }
8094
        #endif
8095
25
            wc_curve25519_free(key);
8096
25
        }
8097
25
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8098
25
        kse->key = NULL;
8099
25
    }
8100
#else
8101
    (void)ssl;
8102
    (void)kse;
8103
8104
    ret = NOT_COMPILED_IN;
8105
    WOLFSSL_ERROR_VERBOSE(ret);
8106
#endif /* HAVE_CURVE25519 */
8107
8108
670
    return ret;
8109
672
}
8110
8111
/* Create a key share entry using X448 parameters group.
8112
 * Generates a key pair.
8113
 *
8114
 * ssl   The SSL/TLS object.
8115
 * kse   The key share entry object.
8116
 * returns 0 on success, otherwise failure.
8117
 */
8118
static int TLSX_KeyShare_GenX448Key(WOLFSSL *ssl, KeyShareEntry* kse)
8119
17
{
8120
17
    int ret = 0;
8121
17
#ifdef HAVE_CURVE448
8122
17
    curve448_key* key = (curve448_key*)kse->key;
8123
8124
17
    if (kse->key == NULL) {
8125
        /* Allocate a Curve448 key to hold private key. */
8126
16
        kse->key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
8127
16
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8128
16
        if (kse->key == NULL) {
8129
1
            WOLFSSL_MSG("GenX448Key memory error");
8130
1
            return MEMORY_E;
8131
1
        }
8132
8133
        /* Make an Curve448 key. */
8134
15
        ret = wc_curve448_init((curve448_key*)kse->key);
8135
15
        if (ret == 0) {
8136
15
            key = (curve448_key*)kse->key;
8137
15
            kse->keyLen = CURVE448_KEY_SIZE;
8138
8139
            #ifdef WOLFSSL_STATIC_EPHEMERAL
8140
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE448, kse->key);
8141
            if (ret != 0)
8142
        #endif
8143
15
            {
8144
15
                ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
8145
15
            }
8146
15
        }
8147
15
    }
8148
8149
16
    if (ret == 0 && kse->pubKey == NULL) {
8150
        /* Allocate space for the public key. */
8151
13
        kse->pubKey = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
8152
13
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8153
13
        if (kse->pubKey == NULL) {
8154
1
            WOLFSSL_MSG("GenX448Key pub memory error");
8155
1
            ret = MEMORY_E;
8156
1
        }
8157
13
    }
8158
8159
16
    if (ret == 0) {
8160
        /* Export Curve448 public key. */
8161
13
        kse->pubKeyLen = CURVE448_KEY_SIZE;
8162
13
        if (wc_curve448_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8163
13
                                                    EC448_LITTLE_ENDIAN) != 0) {
8164
0
            ret = ECC_EXPORT_ERROR;
8165
0
        }
8166
13
        kse->pubKeyLen = CURVE448_KEY_SIZE; /* always CURVE448_KEY_SIZE */
8167
13
    }
8168
8169
#ifdef WOLFSSL_DEBUG_TLS
8170
    if (ret == 0) {
8171
        WOLFSSL_MSG("Public Curve448 Key");
8172
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8173
    }
8174
#endif
8175
8176
16
    if (ret != 0) {
8177
        /* Data owned by key share entry otherwise. */
8178
3
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8179
3
        kse->pubKey = NULL;
8180
3
        if (key != NULL)
8181
3
            wc_curve448_free(key);
8182
3
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8183
3
        kse->key = NULL;
8184
3
    }
8185
#else
8186
    (void)ssl;
8187
    (void)kse;
8188
8189
    ret = NOT_COMPILED_IN;
8190
    WOLFSSL_ERROR_VERBOSE(ret);
8191
#endif /* HAVE_CURVE448 */
8192
8193
16
    return ret;
8194
17
}
8195
8196
/* Create a key share entry using named elliptic curve parameters group.
8197
 * Generates a key pair.
8198
 *
8199
 * ssl   The SSL/TLS object.
8200
 * kse   The key share entry object.
8201
 * returns 0 on success, otherwise failure.
8202
 */
8203
static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
8204
{
8205
    int ret = 0;
8206
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
8207
    word32 keySize = 0;
8208
    word16 curveId = (word16) ECC_CURVE_INVALID;
8209
    ecc_key* eccKey = (ecc_key*)kse->key;
8210
8211
    /* TODO: [TLS13] Get key sizes using wc_ecc_get_curve_size_from_id. */
8212
    /* Translate named group to a curve id. */
8213
    switch (kse->group) {
8214
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
8215
        #ifndef NO_ECC_SECP
8216
        case WOLFSSL_ECC_SECP256R1:
8217
            curveId = ECC_SECP256R1;
8218
            keySize = 32;
8219
            break;
8220
        #endif /* !NO_ECC_SECP */
8221
        #ifdef WOLFSSL_SM2
8222
        case WOLFSSL_ECC_SM2P256V1:
8223
            curveId = ECC_SM2P256V1;
8224
            keySize = 32;
8225
            break;
8226
        #endif /* !WOLFSSL_SM2 */
8227
        #ifdef HAVE_ECC_BRAINPOOL
8228
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
8229
            curveId = ECC_BRAINPOOLP256R1;
8230
            keySize = 32;
8231
            break;
8232
        #endif /* HAVE_ECC_BRAINPOOL */
8233
    #endif
8234
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
8235
        #ifndef NO_ECC_SECP
8236
        case WOLFSSL_ECC_SECP384R1:
8237
            curveId = ECC_SECP384R1;
8238
            keySize = 48;
8239
            break;
8240
        #endif /* !NO_ECC_SECP */
8241
        #ifdef HAVE_ECC_BRAINPOOL
8242
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
8243
            curveId = ECC_BRAINPOOLP384R1;
8244
            keySize = 48;
8245
            break;
8246
        #endif /* HAVE_ECC_BRAINPOOL */
8247
    #endif
8248
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
8249
        #ifdef HAVE_ECC_BRAINPOOL
8250
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
8251
            curveId = ECC_BRAINPOOLP512R1;
8252
            keySize = 64;
8253
            break;
8254
        #endif /* HAVE_ECC_BRAINPOOL */
8255
    #endif
8256
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
8257
        #ifndef NO_ECC_SECP
8258
        case WOLFSSL_ECC_SECP521R1:
8259
            curveId = ECC_SECP521R1;
8260
            keySize = 66;
8261
            break;
8262
        #endif /* !NO_ECC_SECP */
8263
    #endif
8264
        default:
8265
            WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
8266
            return BAD_FUNC_ARG;
8267
    }
8268
8269
    if (kse->key == NULL) {
8270
        /* Allocate an ECC key to hold private key. */
8271
        kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC);
8272
        if (kse->key == NULL) {
8273
            WOLFSSL_MSG_EX("Failed to allocate %d bytes, ssl->heap: %p",
8274
                           (int)sizeof(ecc_key), (wc_ptr_t)ssl->heap);
8275
            WOLFSSL_MSG("EccTempKey Memory error!");
8276
            return MEMORY_E;
8277
        }
8278
8279
        /* Initialize an ECC key struct for the ephemeral key */
8280
        ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
8281
8282
    #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8283
        defined(WC_ASYNC_ENABLE_ECC)
8284
        /* Only set non-blocking context when async device is active. With
8285
         * INVALID_DEVID there is no async loop to retry on FP_WOULDBLOCK, so
8286
         * skip non-blocking setup and use blocking mode instead. */
8287
        if (ret == 0 && ssl->devId != INVALID_DEVID) {
8288
            ecc_nb_ctx_t* eccNbCtx = (ecc_nb_ctx_t*)XMALLOC(
8289
                sizeof(ecc_nb_ctx_t), ssl->heap,
8290
                DYNAMIC_TYPE_TMP_BUFFER);
8291
            if (eccNbCtx == NULL) {
8292
                ret = MEMORY_E;
8293
            }
8294
            else {
8295
                ret = wc_ecc_set_nonblock((ecc_key*)kse->key, eccNbCtx);
8296
                if (ret != 0) {
8297
                    XFREE(eccNbCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
8298
                }
8299
            }
8300
        }
8301
    #endif /* WC_ECC_NONBLOCK && WOLFSSL_ASYNC_CRYPT_SW &&
8302
              WC_ASYNC_ENABLE_ECC */
8303
8304
        if (ret == 0) {
8305
            kse->keyLen = keySize;
8306
            kse->pubKeyLen = keySize * 2 + 1;
8307
8308
        #if defined(WOLFSSL_RENESAS_TSIP_TLS)
8309
            ret = tsip_Tls13GenEccKeyPair(ssl, kse);
8310
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
8311
                return ret;
8312
            }
8313
        #endif
8314
            /* setting eccKey means okay to call wc_ecc_free */
8315
            eccKey = (ecc_key*)kse->key;
8316
8317
        #ifdef WOLFSSL_STATIC_EPHEMERAL
8318
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_ECDH, kse->key);
8319
            if (ret != 0 || eccKey->dp->id != curveId)
8320
        #endif
8321
            {
8322
                /* set curve info for EccMakeKey "peer" info */
8323
                ret = wc_ecc_set_curve(eccKey, (int)kse->keyLen, curveId);
8324
                if (ret == 0) {
8325
            #ifdef WOLFSSL_ASYNC_CRYPT
8326
                    /* Detect when private key generation is done */
8327
                    if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) &&
8328
                            eccKey->type == ECC_PRIVATEKEY) {
8329
                        ret = 0; /* ECC Key Generation is done */
8330
                    }
8331
                    else
8332
            #endif
8333
                    {
8334
                        /* Generate ephemeral ECC key */
8335
                        /* For async this is called once and when event is done, the
8336
                        *   provided buffers in key be populated.
8337
                        * Final processing is x963 key export below. */
8338
                        ret = EccMakeKey(ssl, eccKey, eccKey);
8339
                    }
8340
                }
8341
            #ifdef WOLFSSL_ASYNC_CRYPT
8342
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
8343
                    return ret;
8344
            #endif
8345
            }
8346
        }
8347
    }
8348
8349
    if (ret == 0 && kse->pubKey == NULL) {
8350
        /* Allocate space for the public key */
8351
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8352
            DYNAMIC_TYPE_PUBLIC_KEY);
8353
        if (kse->pubKey == NULL) {
8354
            WOLFSSL_MSG("Key data Memory error");
8355
            ret = MEMORY_E;
8356
        }
8357
    }
8358
8359
    if (ret == 0) {
8360
        XMEMSET(kse->pubKey, 0, kse->pubKeyLen);
8361
8362
        /* Export public key. */
8363
        PRIVATE_KEY_UNLOCK();
8364
        if (wc_ecc_export_x963(eccKey, kse->pubKey, &kse->pubKeyLen) != 0) {
8365
            ret = ECC_EXPORT_ERROR;
8366
            WOLFSSL_ERROR_VERBOSE(ret);
8367
        }
8368
        PRIVATE_KEY_LOCK();
8369
    }
8370
#ifdef WOLFSSL_DEBUG_TLS
8371
    if (ret == 0) {
8372
        WOLFSSL_MSG("Public ECC Key");
8373
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8374
    }
8375
#endif
8376
8377
    if (ret != 0) {
8378
        /* Cleanup on error, otherwise data owned by key share entry */
8379
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8380
        kse->pubKey = NULL;
8381
        if (eccKey != NULL)
8382
            wc_ecc_free(eccKey);
8383
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8384
        kse->key = NULL;
8385
    }
8386
#else
8387
    (void)ssl;
8388
    (void)kse;
8389
8390
    ret = NOT_COMPILED_IN;
8391
    WOLFSSL_ERROR_VERBOSE(ret);
8392
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
8393
8394
    return ret;
8395
}
8396
8397
#ifdef WOLFSSL_HAVE_MLKEM
8398
#if defined(WOLFSSL_MLKEM_CACHE_A) && \
8399
    !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY)
8400
    /* Store KyberKey object rather than private key bytes in key share entry.
8401
     * Improves performance at cost of more dynamic memory being used. */
8402
    #define WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8403
#endif
8404
#if defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY) && \
8405
    defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ)
8406
    #error "Choose WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY or "
8407
           "WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ"
8408
#endif
8409
8410
#if !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) || \
8411
    !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) || \
8412
    (!defined(WOLFSSL_MLKEM_NO_DECAPSULATE) && \
8413
     !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ))
8414
static int mlkem_id2type(int id, int *type)
8415
{
8416
    int ret = 0;
8417
8418
    switch (id) {
8419
#ifndef WOLFSSL_NO_ML_KEM
8420
    #ifndef WOLFSSL_NO_ML_KEM_512
8421
        case WOLFSSL_ML_KEM_512:
8422
            *type = WC_ML_KEM_512;
8423
            break;
8424
    #endif
8425
    #ifndef WOLFSSL_NO_ML_KEM_768
8426
        case WOLFSSL_ML_KEM_768:
8427
            *type = WC_ML_KEM_768;
8428
            break;
8429
    #endif
8430
    #ifndef WOLFSSL_NO_ML_KEM_1024
8431
        case WOLFSSL_ML_KEM_1024:
8432
            *type = WC_ML_KEM_1024;
8433
            break;
8434
    #endif
8435
#endif
8436
#ifdef WOLFSSL_MLKEM_KYBER
8437
    #ifdef WOLFSSL_KYBER512
8438
        case WOLFSSL_KYBER_LEVEL1:
8439
            *type = KYBER512;
8440
            break;
8441
    #endif
8442
    #ifdef WOLFSSL_KYBER768
8443
        case WOLFSSL_KYBER_LEVEL3:
8444
            *type = KYBER768;
8445
            break;
8446
    #endif
8447
    #ifdef WOLFSSL_KYBER1024
8448
        case WOLFSSL_KYBER_LEVEL5:
8449
            *type = KYBER1024;
8450
            break;
8451
    #endif
8452
#endif
8453
        default:
8454
            ret = NOT_COMPILED_IN;
8455
            break;
8456
    }
8457
8458
    return ret;
8459
}
8460
#endif
8461
8462
/* Structures and objects needed for hybrid key exchanges using both classic
8463
 * ECDHE and PQC KEM key material. */
8464
typedef struct PqcHybridMapping {
8465
    int hybrid;
8466
    int ecc;
8467
    int pqc;
8468
    int pqc_first;
8469
} PqcHybridMapping;
8470
8471
static const PqcHybridMapping pqc_hybrid_mapping[] = {
8472
#ifndef WOLFSSL_NO_ML_KEM
8473
    {WOLFSSL_SECP256R1MLKEM512, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8474
    {WOLFSSL_SECP384R1MLKEM768, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8475
    {WOLFSSL_SECP256R1MLKEM768, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_768, 0},
8476
    {WOLFSSL_SECP521R1MLKEM1024, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8477
    {WOLFSSL_SECP384R1MLKEM1024, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_1024, 0},
8478
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
8479
    {WOLFSSL_P256_ML_KEM_512_OLD, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8480
    {WOLFSSL_P384_ML_KEM_768_OLD, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8481
    {WOLFSSL_P521_ML_KEM_1024_OLD, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8482
#endif
8483
#ifdef HAVE_CURVE25519
8484
    {WOLFSSL_X25519MLKEM512, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_512, 1},
8485
    {WOLFSSL_X25519MLKEM768, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_768, 1},
8486
#endif
8487
#ifdef HAVE_CURVE448
8488
    {WOLFSSL_X448MLKEM768, WOLFSSL_ECC_X448, WOLFSSL_ML_KEM_768, 1},
8489
#endif
8490
#endif /* WOLFSSL_NO_ML_KEM */
8491
#ifdef WOLFSSL_MLKEM_KYBER
8492
    {WOLFSSL_P256_KYBER_LEVEL1, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL1, 0},
8493
    {WOLFSSL_P384_KYBER_LEVEL3, WOLFSSL_ECC_SECP384R1, WOLFSSL_KYBER_LEVEL3, 0},
8494
    {WOLFSSL_P256_KYBER_LEVEL3, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL3, 0},
8495
    {WOLFSSL_P521_KYBER_LEVEL5, WOLFSSL_ECC_SECP521R1, WOLFSSL_KYBER_LEVEL5, 0},
8496
#ifdef HAVE_CURVE25519
8497
    {WOLFSSL_X25519_KYBER_LEVEL1, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL1, 0},
8498
    {WOLFSSL_X25519_KYBER_LEVEL3, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL3, 0},
8499
#endif
8500
#ifdef HAVE_CURVE448
8501
    {WOLFSSL_X448_KYBER_LEVEL3, WOLFSSL_ECC_X448, WOLFSSL_KYBER_LEVEL3, 0},
8502
#endif
8503
#endif /* WOLFSSL_MLKEM_KYBER */
8504
    {0, 0, 0, 0}
8505
};
8506
8507
/* Map an ecc-pqc hybrid group into its ecc group and pqc kem group. */
8508
static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group)
8509
{
8510
    int i;
8511
8512
    if (pqc != NULL)
8513
        *pqc = 0;
8514
    if (ecc != NULL)
8515
        *ecc = 0;
8516
    if (pqc_first != NULL)
8517
        *pqc_first = 0;
8518
8519
    for (i = 0; pqc_hybrid_mapping[i].hybrid != 0; i++) {
8520
        if (pqc_hybrid_mapping[i].hybrid == group) {
8521
            if (pqc != NULL)
8522
                *pqc = pqc_hybrid_mapping[i].pqc;
8523
            if (ecc != NULL)
8524
                *ecc = pqc_hybrid_mapping[i].ecc;
8525
            if (pqc_first != NULL)
8526
                *pqc_first = pqc_hybrid_mapping[i].pqc_first;
8527
            break;
8528
        }
8529
    }
8530
}
8531
8532
#ifndef WOLFSSL_MLKEM_NO_MAKE_KEY
8533
/* Create a key share entry using pqc parameters group on the client side.
8534
 * Generates a key pair.
8535
 *
8536
 * ssl   The SSL/TLS object.
8537
 * kse   The key share entry object.
8538
 * returns 0 on success, otherwise failure.
8539
 */
8540
static int TLSX_KeyShare_GenPqcKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
8541
{
8542
    int ret = 0;
8543
    int type = 0;
8544
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8545
        WC_DECLARE_VAR(kem, KyberKey, 1, 0);
8546
    byte* privKey = NULL;
8547
    word32 privSz = 0;
8548
#else
8549
    KyberKey* kem = NULL;
8550
#endif
8551
8552
    /* This gets called twice. Once during parsing of the key share and once
8553
     * during the population of the extension. No need to do work the second
8554
     * time. Just return success if its already been done. */
8555
    if (kse->pubKey != NULL) {
8556
        return ret;
8557
    }
8558
8559
    /* Get the type of key we need from the key share group. */
8560
    ret = mlkem_id2type(kse->group, &type);
8561
    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
8562
        WOLFSSL_MSG("Invalid Kyber algorithm specified.");
8563
        ret = BAD_FUNC_ARG;
8564
    }
8565
8566
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8567
8568
    #ifdef WOLFSSL_SMALL_STACK
8569
    if (ret == 0) {
8570
        kem = (KyberKey *)XMALLOC(sizeof(*kem), ssl->heap,
8571
                                  DYNAMIC_TYPE_PRIVATE_KEY);
8572
        if (kem == NULL) {
8573
            WOLFSSL_MSG("KEM memory allocation failure");
8574
            ret = MEMORY_ERROR;
8575
        }
8576
    }
8577
    #endif /* WOLFSSL_SMALL_STACK */
8578
8579
    if (ret == 0) {
8580
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
8581
        if (ret != 0) {
8582
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
8583
        }
8584
    }
8585
8586
    if (ret == 0) {
8587
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
8588
    }
8589
    if (ret == 0) {
8590
        ret = wc_KyberKey_PublicKeySize(kem, &kse->pubKeyLen);
8591
    }
8592
8593
    if (ret == 0) {
8594
        privKey = (byte*)XMALLOC(privSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8595
        if (privKey == NULL) {
8596
            WOLFSSL_MSG("privkey memory allocation failure");
8597
            ret = MEMORY_ERROR;
8598
        }
8599
    }
8600
#else
8601
    if (ret == 0) {
8602
        /* Allocate a Kyber key to hold private key. */
8603
        kem = (KyberKey*)XMALLOC(sizeof(KyberKey), ssl->heap,
8604
                                 DYNAMIC_TYPE_PRIVATE_KEY);
8605
        if (kem == NULL) {
8606
            WOLFSSL_MSG("KEM memory allocation failure");
8607
            ret = MEMORY_ERROR;
8608
        }
8609
    }
8610
    if (ret == 0) {
8611
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
8612
        if (ret != 0) {
8613
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
8614
        }
8615
    }
8616
    if (ret == 0) {
8617
        ret = wc_KyberKey_PublicKeySize(kem, &kse->pubKeyLen);
8618
    }
8619
#endif
8620
8621
    if (ret == 0) {
8622
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8623
                                     DYNAMIC_TYPE_PUBLIC_KEY);
8624
        if (kse->pubKey == NULL) {
8625
            WOLFSSL_MSG("pubkey memory allocation failure");
8626
            ret = MEMORY_ERROR;
8627
        }
8628
    }
8629
8630
    if (ret == 0) {
8631
        ret = wc_KyberKey_MakeKey(kem, ssl->rng);
8632
        if (ret != 0) {
8633
            WOLFSSL_MSG("Kyber keygen failure");
8634
        }
8635
    }
8636
    if (ret == 0) {
8637
        ret = wc_KyberKey_EncodePublicKey(kem, kse->pubKey,
8638
                                          kse->pubKeyLen);
8639
    }
8640
8641
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8642
    if (ret == 0) {
8643
        ret = wc_KyberKey_EncodePrivateKey(kem, privKey, privSz);
8644
    }
8645
#endif
8646
8647
#ifdef WOLFSSL_DEBUG_TLS
8648
    WOLFSSL_MSG("Public Kyber Key");
8649
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
8650
#endif
8651
8652
    if (ret != 0) {
8653
        /* Data owned by key share entry otherwise. */
8654
        wc_KyberKey_Free(kem);
8655
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8656
        kse->pubKey = NULL;
8657
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8658
        if (privKey) {
8659
            ForceZero(privKey, privSz);
8660
            XFREE(privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8661
            privKey = NULL;
8662
        }
8663
    #else
8664
        XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8665
        kse->key = NULL;
8666
    #endif
8667
    }
8668
    else {
8669
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8670
        wc_KyberKey_Free(kem);
8671
        kse->privKey = (byte*)privKey;
8672
        kse->privKeyLen = privSz;
8673
    #else
8674
        kse->key = kem;
8675
    #endif
8676
    }
8677
8678
    #if !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ) && \
8679
        defined(WOLFSSL_SMALL_STACK)
8680
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8681
    #endif
8682
8683
    return ret;
8684
}
8685
8686
/* Create a key share entry using both ecdhe and pqc parameters groups.
8687
 * Generates two key pairs on the client side.
8688
 *
8689
 * ssl   The SSL/TLS object.
8690
 * kse   The key share entry object.
8691
 * returns 0 on success, otherwise failure.
8692
 */
8693
static int TLSX_KeyShare_GenPqcHybridKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
8694
{
8695
    int ret = 0;
8696
    KeyShareEntry *ecc_kse = NULL;
8697
    KeyShareEntry *pqc_kse = NULL;
8698
    int pqc_group = 0;
8699
    int ecc_group = 0;
8700
    int pqc_first = 0;
8701
8702
    /* This gets called twice. Once during parsing of the key share and once
8703
     * during the population of the extension. No need to do work the second
8704
     * time. Just return success if its already been done. */
8705
    if (kse->pubKey != NULL) {
8706
        return ret;
8707
    }
8708
8709
    /* Determine the ECC and PQC group of the hybrid combination */
8710
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, kse->group);
8711
    if (ecc_group == 0 || pqc_group == 0) {
8712
        WOLFSSL_MSG("Invalid hybrid group");
8713
        ret = BAD_FUNC_ARG;
8714
    }
8715
8716
    if (ret == 0) {
8717
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
8718
                   DYNAMIC_TYPE_TLSX);
8719
        if (ecc_kse == NULL) {
8720
            WOLFSSL_MSG("kse memory allocation failure");
8721
            ret = MEMORY_ERROR;
8722
        }
8723
        else {
8724
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
8725
        }
8726
    }
8727
    if (ret == 0) {
8728
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
8729
                   DYNAMIC_TYPE_TLSX);
8730
        if (pqc_kse == NULL) {
8731
            WOLFSSL_MSG("kse memory allocation failure");
8732
            ret = MEMORY_ERROR;
8733
        }
8734
        else {
8735
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
8736
        }
8737
    }
8738
8739
    /* Generate ECC key share part */
8740
    if (ret == 0) {
8741
        ecc_kse->group = ecc_group;
8742
    #ifdef HAVE_CURVE25519
8743
        if (ecc_group == WOLFSSL_ECC_X25519) {
8744
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
8745
        }
8746
        else
8747
    #endif
8748
    #ifdef HAVE_CURVE448
8749
        if (ecc_group == WOLFSSL_ECC_X448) {
8750
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
8751
        }
8752
        else
8753
    #endif
8754
        {
8755
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
8756
        }
8757
        /* No error message, TLSX_KeyShare_Gen*Key will do it. */
8758
    }
8759
8760
    /* Generate PQC key share part */
8761
    if (ret == 0) {
8762
        pqc_kse->group = pqc_group;
8763
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, pqc_kse);
8764
        /* No error message, TLSX_KeyShare_GenPqcKeyClient will do it. */
8765
    }
8766
8767
    /* Allocate memory for combined public key */
8768
    if (ret == 0) {
8769
        kse->pubKey = (byte*)XMALLOC(ecc_kse->pubKeyLen + pqc_kse->pubKeyLen,
8770
                                     ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8771
        if (kse->pubKey == NULL) {
8772
            WOLFSSL_MSG("pubkey memory allocation failure");
8773
            ret = MEMORY_ERROR;
8774
        }
8775
    }
8776
8777
    /* Create combined public key. The order of classic/pqc key material is
8778
     * indicated by the pqc_first variable. */
8779
    if (ret == 0) {
8780
        if (pqc_first) {
8781
            XMEMCPY(kse->pubKey, pqc_kse->pubKey, pqc_kse->pubKeyLen);
8782
            XMEMCPY(kse->pubKey + pqc_kse->pubKeyLen, ecc_kse->pubKey,
8783
                    ecc_kse->pubKeyLen);
8784
        }
8785
        else {
8786
            XMEMCPY(kse->pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen);
8787
            XMEMCPY(kse->pubKey + ecc_kse->pubKeyLen, pqc_kse->pubKey,
8788
                    pqc_kse->pubKeyLen);
8789
        }
8790
        kse->pubKeyLen = ecc_kse->pubKeyLen + pqc_kse->pubKeyLen;
8791
    }
8792
8793
    /* Store the private keys.
8794
     * Note we are saving the PQC private key and ECC private key
8795
     * separately. That's because the ECC private key is not simply a
8796
     * buffer. Its is an ecc_key struct. */
8797
    if (ret == 0) {
8798
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8799
        /* PQC private key is an encoded byte array */
8800
        kse->privKey = pqc_kse->privKey;
8801
        kse->privKeyLen = pqc_kse->privKeyLen;
8802
        pqc_kse->privKey = NULL;
8803
    #else
8804
        /* PQC private key is a pointer to KyberKey object */
8805
        kse->privKey = (byte*)pqc_kse->key;
8806
        kse->privKeyLen = 0;
8807
        pqc_kse->key = NULL;
8808
    #endif
8809
        /* ECC private key is a pointer to ecc_key object */
8810
        kse->key = ecc_kse->key;
8811
        kse->keyLen = ecc_kse->keyLen;
8812
        ecc_kse->key = NULL;
8813
    }
8814
8815
#ifdef WOLFSSL_DEBUG_TLS
8816
    WOLFSSL_MSG("Public Kyber Key");
8817
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
8818
#endif
8819
8820
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
8821
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
8822
8823
    return ret;
8824
}
8825
#endif /* !WOLFSSL_MLKEM_NO_MAKE_KEY */
8826
#endif /* WOLFSSL_HAVE_MLKEM */
8827
8828
/* Generate a secret/key using the key share entry.
8829
 *
8830
 * ssl  The SSL/TLS object.
8831
 * kse  The key share entry holding peer data.
8832
 */
8833
int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
8834
4.47k
{
8835
4.47k
    int ret;
8836
    /* Named FFDHE groups have a bit set to identify them. */
8837
4.47k
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(kse->group))
8838
253
        ret = TLSX_KeyShare_GenDhKey(ssl, kse);
8839
4.22k
    else if (kse->group == WOLFSSL_ECC_X25519)
8840
672
        ret = TLSX_KeyShare_GenX25519Key(ssl, kse);
8841
3.55k
    else if (kse->group == WOLFSSL_ECC_X448)
8842
17
        ret = TLSX_KeyShare_GenX448Key(ssl, kse);
8843
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY)
8844
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group))
8845
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, kse);
8846
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(kse->group))
8847
        ret = TLSX_KeyShare_GenPqcHybridKeyClient(ssl, kse);
8848
#endif
8849
3.53k
    else
8850
3.53k
        ret = TLSX_KeyShare_GenEccKey(ssl, kse);
8851
#ifdef WOLFSSL_ASYNC_CRYPT
8852
    kse->lastRet = ret;
8853
#endif
8854
4.47k
    return ret;
8855
4.47k
}
8856
8857
/* Free the key share dynamic data.
8858
 *
8859
 * list  The linked list of key share entry objects.
8860
 * heap  The heap used for allocation.
8861
 */
8862
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
8863
6.23k
{
8864
6.23k
    KeyShareEntry* current;
8865
8866
12.5k
    while ((current = list) != NULL) {
8867
6.32k
        list = current->next;
8868
6.32k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(current->group)) {
8869
553
#ifndef NO_DH
8870
553
            wc_FreeDhKey((DhKey*)current->key);
8871
553
#endif
8872
553
        }
8873
5.76k
        else if (current->group == WOLFSSL_ECC_X25519) {
8874
1.66k
#ifdef HAVE_CURVE25519
8875
        #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
8876
            if (current->key != NULL &&
8877
                    ((curve25519_key*)current->key)->nb_ctx != NULL) {
8878
                XFREE(((curve25519_key*)current->key)->nb_ctx, heap,
8879
                    DYNAMIC_TYPE_TMP_BUFFER);
8880
            }
8881
        #endif
8882
1.66k
            wc_curve25519_free((curve25519_key*)current->key);
8883
1.66k
#endif
8884
1.66k
        }
8885
4.10k
        else if (current->group == WOLFSSL_ECC_X448) {
8886
36
#ifdef HAVE_CURVE448
8887
36
            wc_curve448_free((curve448_key*)current->key);
8888
36
#endif
8889
36
        }
8890
#ifdef WOLFSSL_HAVE_MLKEM
8891
        else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
8892
            wc_KyberKey_Free((KyberKey*)current->key);
8893
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8894
            if (current->privKey != NULL) {
8895
                ForceZero(current->privKey, current->privKeyLen);
8896
            }
8897
        #endif
8898
        }
8899
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
8900
            int ecc_group = 0;
8901
            findEccPqc(&ecc_group, NULL, NULL, current->group);
8902
8903
            /* Free PQC private key */
8904
        #ifdef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8905
            wc_KyberKey_Free((KyberKey*)current->privKey);
8906
        #else
8907
            if (current->privKey != NULL) {
8908
                ForceZero(current->privKey, current->privKeyLen);
8909
            }
8910
        #endif
8911
8912
            /* Free ECC private key */
8913
            if (ecc_group == WOLFSSL_ECC_X25519) {
8914
            #ifdef HAVE_CURVE25519
8915
                wc_curve25519_free((curve25519_key*)current->key);
8916
            #endif
8917
            }
8918
            else if (ecc_group == WOLFSSL_ECC_X448) {
8919
            #ifdef HAVE_CURVE448
8920
                wc_curve448_free((curve448_key*)current->key);
8921
            #endif
8922
            }
8923
            else {
8924
            #ifdef HAVE_ECC
8925
                #if defined(WC_ECC_NONBLOCK) && \
8926
                    defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8927
                    defined(WC_ASYNC_ENABLE_ECC)
8928
                if (current->key != NULL &&
8929
                        ((ecc_key*)current->key)->nb_ctx != NULL) {
8930
                    XFREE(((ecc_key*)current->key)->nb_ctx, heap,
8931
                        DYNAMIC_TYPE_TMP_BUFFER);
8932
                }
8933
                #endif
8934
                wc_ecc_free((ecc_key*)current->key);
8935
            #endif
8936
            }
8937
        }
8938
#endif
8939
4.06k
        else {
8940
4.06k
#ifdef HAVE_ECC
8941
        #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
8942
            defined(WC_ASYNC_ENABLE_ECC)
8943
            if (current->key != NULL &&
8944
                    ((ecc_key*)current->key)->nb_ctx != NULL) {
8945
                XFREE(((ecc_key*)current->key)->nb_ctx, heap,
8946
                    DYNAMIC_TYPE_TMP_BUFFER);
8947
            }
8948
        #endif
8949
4.06k
            wc_ecc_free((ecc_key*)current->key);
8950
4.06k
#endif
8951
4.06k
        }
8952
6.32k
        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
8953
6.32k
    #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
8954
6.32k
        XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY);
8955
6.32k
    #endif
8956
6.32k
        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
8957
6.32k
        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
8958
6.32k
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
8959
6.32k
    }
8960
8961
6.23k
    (void)heap;
8962
6.23k
}
8963
8964
/* Get the size of the encoded key share extension.
8965
 *
8966
 * list     The linked list of key share extensions.
8967
 * msgType  The type of the message this extension is being written into.
8968
 * returns the number of bytes of the encoded key share extension.
8969
 */
8970
static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
8971
3.74k
{
8972
3.74k
    word16         len = 0;
8973
3.74k
    byte           isRequest = (msgType == client_hello);
8974
3.74k
    KeyShareEntry* current;
8975
8976
    /* The named group the server wants to use. */
8977
3.74k
    if (msgType == hello_retry_request)
8978
125
        return OPAQUE16_LEN;
8979
8980
    /* List of key exchange groups. */
8981
3.62k
    if (isRequest)
8982
2.83k
        len += OPAQUE16_LEN;
8983
7.24k
    while ((current = list) != NULL) {
8984
3.62k
        list = current->next;
8985
8986
3.62k
        if (!isRequest && current->pubKey == NULL)
8987
0
            continue;
8988
8989
3.62k
        len += (word16)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
8990
3.62k
    }
8991
8992
3.62k
    return len;
8993
3.74k
}
8994
8995
/* Writes the key share extension into the output buffer.
8996
 * Assumes that the the output buffer is big enough to hold data.
8997
 *
8998
 * list     The linked list of key share entries.
8999
 * output   The buffer to write into.
9000
 * msgType  The type of the message this extension is being written into.
9001
 * returns the number of bytes written into the buffer.
9002
 */
9003
static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
9004
                                  byte msgType)
9005
3.73k
{
9006
3.73k
    word16         i = 0;
9007
3.73k
    byte           isRequest = (msgType == client_hello);
9008
3.73k
    KeyShareEntry* current;
9009
9010
3.73k
    if (msgType == hello_retry_request) {
9011
122
        c16toa(list->group, output);
9012
122
        return OPAQUE16_LEN;
9013
122
    }
9014
9015
    /* ClientHello has a list but ServerHello is only the chosen. */
9016
3.60k
    if (isRequest)
9017
2.82k
        i += OPAQUE16_LEN;
9018
9019
    /* Write out all in the list. */
9020
7.21k
    while ((current = list) != NULL) {
9021
3.60k
        list = current->next;
9022
9023
3.60k
        if (!isRequest && current->pubKey == NULL)
9024
0
            continue;
9025
9026
3.60k
        c16toa(current->group, &output[i]);
9027
3.60k
        i += KE_GROUP_LEN;
9028
3.60k
        c16toa((word16)(current->pubKeyLen), &output[i]);
9029
3.60k
        i += OPAQUE16_LEN;
9030
3.60k
        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
9031
3.60k
        i += (word16)current->pubKeyLen;
9032
3.60k
    }
9033
    /* Write the length of the list if required. */
9034
3.60k
    if (isRequest)
9035
2.82k
        c16toa(i - OPAQUE16_LEN, output);
9036
9037
3.60k
    return i;
9038
3.73k
}
9039
9040
/* Process the DH key share extension on the client side.
9041
 *
9042
 * ssl            The SSL/TLS object.
9043
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9044
 * returns 0 on success and other values indicate failure.
9045
 */
9046
static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9047
102
{
9048
102
    int ret = 0;
9049
102
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
9050
102
    word32 pSz = 0;
9051
102
    DhKey* dhKey = (DhKey*)keyShareEntry->key;
9052
9053
102
#ifdef HAVE_PUBLIC_FFDHE
9054
102
    const DhParams* params = NULL;
9055
102
    switch (keyShareEntry->group) {
9056
0
    #ifdef HAVE_FFDHE_2048
9057
102
        case WOLFSSL_FFDHE_2048:
9058
102
            params = wc_Dh_ffdhe2048_Get();
9059
102
            break;
9060
0
    #endif
9061
    #ifdef HAVE_FFDHE_3072
9062
        case WOLFSSL_FFDHE_3072:
9063
            params = wc_Dh_ffdhe3072_Get();
9064
            break;
9065
    #endif
9066
    #ifdef HAVE_FFDHE_4096
9067
        case WOLFSSL_FFDHE_4096:
9068
            params = wc_Dh_ffdhe4096_Get();
9069
            break;
9070
    #endif
9071
    #ifdef HAVE_FFDHE_6144
9072
        case WOLFSSL_FFDHE_6144:
9073
            params = wc_Dh_ffdhe6144_Get();
9074
            break;
9075
    #endif
9076
    #ifdef HAVE_FFDHE_8192
9077
        case WOLFSSL_FFDHE_8192:
9078
            params = wc_Dh_ffdhe8192_Get();
9079
            break;
9080
    #endif
9081
0
        default:
9082
0
            break;
9083
102
    }
9084
102
    if (params == NULL) {
9085
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9086
0
        return PEER_KEY_ERROR;
9087
0
    }
9088
102
    pSz = params->p_len;
9089
#else
9090
    ret = wc_DhGetNamedKeyParamSize(keyShareEntry->group, &pSz, NULL, NULL);
9091
    if (ret != 0 || pSz == 0) {
9092
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9093
        return PEER_KEY_ERROR;
9094
    }
9095
#endif
9096
9097
    /* if DhKey is not setup, do it now */
9098
102
    if (keyShareEntry->key == NULL) {
9099
102
        keyShareEntry->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
9100
102
            DYNAMIC_TYPE_DH);
9101
102
        if (keyShareEntry->key == NULL)
9102
2
            return MEMORY_E;
9103
9104
        /* Setup Key */
9105
100
        ret = wc_InitDhKey_ex((DhKey*)keyShareEntry->key, ssl->heap, ssl->devId);
9106
100
        if (ret == 0) {
9107
100
            dhKey = (DhKey*)keyShareEntry->key;
9108
        /* Set key */
9109
100
        #ifdef HAVE_PUBLIC_FFDHE
9110
100
            ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
9111
100
                                                                params->g_len);
9112
        #else
9113
            ret = wc_DhSetNamedKey(dhKey, keyShareEntry->group);
9114
        #endif
9115
100
        }
9116
100
    }
9117
9118
100
    if (ret == 0
9119
    #ifdef WOLFSSL_ASYNC_CRYPT
9120
        && keyShareEntry->lastRet == 0 /* don't enter here if WC_PENDING_E */
9121
    #endif
9122
100
    ) {
9123
    #ifdef WOLFSSL_DEBUG_TLS
9124
        WOLFSSL_MSG("Peer DH Key");
9125
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9126
    #endif
9127
9128
100
        ssl->options.dhKeySz = (word16)pSz;
9129
9130
        /* Derive secret from private key and peer's public key. */
9131
100
        ret = DhAgree(ssl, dhKey,
9132
100
            (const byte*)keyShareEntry->privKey, keyShareEntry->keyLen, /* our private */
9133
100
            keyShareEntry->ke, keyShareEntry->keLen,                    /* peer's public key */
9134
100
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,    /* secret */
9135
100
            NULL, 0
9136
100
        );
9137
    #ifdef WOLFSSL_ASYNC_CRYPT
9138
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9139
            return ret;
9140
        }
9141
    #endif
9142
100
    }
9143
9144
    /* RFC 8446 Section 7.4.1:
9145
     *     ... left-padded with zeros up to the size of the prime. ...
9146
     */
9147
100
    if (ret == 0 && (word32)ssl->options.dhKeySz > ssl->arrays->preMasterSz) {
9148
0
        word32 diff = (word32)ssl->options.dhKeySz - ssl->arrays->preMasterSz;
9149
0
        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
9150
0
                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9151
0
        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
9152
0
        ssl->arrays->preMasterSz = ssl->options.dhKeySz;
9153
0
    }
9154
9155
    /* done with key share, release resources */
9156
100
    if (dhKey)
9157
100
        wc_FreeDhKey(dhKey);
9158
100
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
9159
100
    keyShareEntry->key = NULL;
9160
100
    if (keyShareEntry->privKey) {
9161
100
        ForceZero(keyShareEntry->privKey, keyShareEntry->keyLen);
9162
100
        XFREE(keyShareEntry->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9163
100
        keyShareEntry->privKey = NULL;
9164
100
    }
9165
100
    XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9166
100
    keyShareEntry->pubKey = NULL;
9167
100
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9168
100
    keyShareEntry->ke = NULL;
9169
#else
9170
    (void)ssl;
9171
    (void)keyShareEntry;
9172
    ret = PEER_KEY_ERROR;
9173
    WOLFSSL_ERROR_VERBOSE(ret);
9174
#endif
9175
100
    return ret;
9176
102
}
9177
9178
/* Process the X25519 key share extension on the client side.
9179
 *
9180
 * ssl            The SSL/TLS object.
9181
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9182
 * ssOutput       The destination buffer for the shared secret.
9183
 * ssOutSz        The size of the generated shared secret.
9184
 *
9185
 * returns 0 on success and other values indicate failure.
9186
 */
9187
static int TLSX_KeyShare_ProcessX25519_ex(WOLFSSL* ssl,
9188
                                          KeyShareEntry* keyShareEntry,
9189
                                          unsigned char* ssOutput,
9190
                                          word32* ssOutSz)
9191
621
{
9192
621
    int ret = 0;
9193
9194
621
#ifdef HAVE_CURVE25519
9195
621
    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
9196
9197
#ifdef WOLFSSL_ASYNC_CRYPT
9198
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9199
#endif
9200
621
    {
9201
621
    #ifdef HAVE_ECC
9202
621
        if (ssl->peerEccKey != NULL) {
9203
0
            wc_ecc_free(ssl->peerEccKey);
9204
0
            ssl->peerEccKey = NULL;
9205
0
            ssl->peerEccKeyPresent = 0;
9206
0
        }
9207
621
    #endif
9208
9209
621
        ssl->peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key),
9210
621
                                        ssl->heap, DYNAMIC_TYPE_TLSX);
9211
621
        if (ssl->peerX25519Key == NULL) {
9212
3
            WOLFSSL_MSG("PeerX25519Key Memory error");
9213
3
            return MEMORY_ERROR;
9214
3
        }
9215
618
        ret = wc_curve25519_init(ssl->peerX25519Key);
9216
618
        if (ret != 0) {
9217
0
            XFREE(ssl->peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9218
0
            ssl->peerX25519Key = NULL;
9219
0
            return ret;
9220
0
        }
9221
    #ifdef WOLFSSL_DEBUG_TLS
9222
        WOLFSSL_MSG("Peer Curve25519 Key");
9223
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9224
    #endif
9225
9226
618
        if (wc_curve25519_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9227
618
                                                  EC25519_LITTLE_ENDIAN) != 0) {
9228
8
            ret = ECC_PEERKEY_ERROR;
9229
8
            WOLFSSL_ERROR_VERBOSE(ret);
9230
8
        }
9231
9232
618
        if (ret == 0) {
9233
610
            if (wc_curve25519_import_public_ex(keyShareEntry->ke,
9234
610
                                        keyShareEntry->keLen,
9235
610
                                        ssl->peerX25519Key,
9236
610
                                        EC25519_LITTLE_ENDIAN) != 0) {
9237
0
                ret = ECC_PEERKEY_ERROR;
9238
0
                WOLFSSL_ERROR_VERBOSE(ret);
9239
0
            }
9240
610
        }
9241
9242
618
        if (ret == 0) {
9243
610
            ssl->ecdhCurveOID = ECC_X25519_OID;
9244
610
            ssl->peerX25519KeyPresent = 1;
9245
610
        }
9246
618
    }
9247
9248
618
    if (ret == 0 && key == NULL)
9249
0
        ret = BAD_FUNC_ARG;
9250
618
    if (ret == 0) {
9251
610
    #ifdef WOLFSSL_CURVE25519_BLINDING
9252
610
        ret = wc_curve25519_set_rng(key, ssl->rng);
9253
610
    }
9254
618
    if (ret == 0) {
9255
610
    #endif
9256
    #ifdef WOLFSSL_ASYNC_CRYPT
9257
        if (keyShareEntry->lastRet != WC_NO_ERR_TRACE(WC_PENDING_E))
9258
    #endif
9259
610
        {
9260
        #ifdef WOLFSSL_ASYNC_CRYPT
9261
            /* initialize event */
9262
            ret = wolfSSL_AsyncInit(ssl, &key->asyncDev,
9263
                WC_ASYNC_FLAG_CALL_AGAIN);
9264
            if (ret != 0)
9265
                return ret;
9266
        #endif
9267
610
            ret = wc_curve25519_shared_secret_ex(key, ssl->peerX25519Key,
9268
610
                        ssOutput, ssOutSz, EC25519_LITTLE_ENDIAN);
9269
        #ifdef WOLFSSL_ASYNC_CRYPT
9270
            if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9271
                return wolfSSL_AsyncPush(ssl, &key->asyncDev);
9272
            }
9273
        #endif
9274
610
        }
9275
        /* On CALL_AGAIN re-entry (lastRet == PENDING): the block above
9276
         * is skipped entirely, so wc_curve25519_shared_secret_ex is not
9277
         * called again. ret stays 0 from initialization, and execution
9278
         * falls through to the cleanup code below. */
9279
610
    }
9280
9281
    /* done with key share, release resources */
9282
618
    if (ssl->peerX25519Key != NULL) {
9283
618
        wc_curve25519_free(ssl->peerX25519Key);
9284
618
        XFREE(ssl->peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9285
618
        ssl->peerX25519Key = NULL;
9286
618
        ssl->peerX25519KeyPresent = 0;
9287
618
    }
9288
618
    if (keyShareEntry->key != NULL) {
9289
    #if defined(WC_X25519_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW)
9290
        if (((curve25519_key*)keyShareEntry->key)->nb_ctx != NULL) {
9291
            XFREE(((curve25519_key*)keyShareEntry->key)->nb_ctx, ssl->heap,
9292
                DYNAMIC_TYPE_TMP_BUFFER);
9293
        }
9294
    #endif
9295
618
        wc_curve25519_free((curve25519_key*)keyShareEntry->key);
9296
618
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9297
618
        keyShareEntry->key = NULL;
9298
618
    }
9299
618
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9300
618
    keyShareEntry->ke = NULL;
9301
#else
9302
    (void)ssl;
9303
    (void)keyShareEntry;
9304
    (void)ssOutput;
9305
    (void)ssOutSz;
9306
9307
    ret = PEER_KEY_ERROR;
9308
    WOLFSSL_ERROR_VERBOSE(ret);
9309
#endif /* HAVE_CURVE25519 */
9310
9311
618
    return ret;
9312
618
}
9313
9314
/* Process the X25519 key share extension on the client side.
9315
 *
9316
 * ssl            The SSL/TLS object.
9317
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9318
 *
9319
 * returns 0 on success and other values indicate failure.
9320
 */
9321
static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
9322
                                       KeyShareEntry* keyShareEntry)
9323
621
{
9324
621
    return TLSX_KeyShare_ProcessX25519_ex(ssl, keyShareEntry,
9325
621
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9326
621
}
9327
9328
/* Process the X448 key share extension on the client side.
9329
 *
9330
 * ssl            The SSL/TLS object.
9331
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9332
 * ssOutput       The destination buffer for the shared secret.
9333
 * ssOutSz        The size of the generated shared secret.
9334
 *
9335
 * returns 0 on success and other values indicate failure.
9336
 */
9337
static int TLSX_KeyShare_ProcessX448_ex(WOLFSSL* ssl,
9338
                                        KeyShareEntry* keyShareEntry,
9339
                                        unsigned char* ssOutput,
9340
                                        word32* ssOutSz)
9341
8
{
9342
8
    int ret;
9343
9344
8
#ifdef HAVE_CURVE448
9345
8
    curve448_key* key = (curve448_key*)keyShareEntry->key;
9346
8
    curve448_key* peerX448Key;
9347
9348
8
#ifdef HAVE_ECC
9349
8
    if (ssl->peerEccKey != NULL) {
9350
0
        wc_ecc_free(ssl->peerEccKey);
9351
0
        ssl->peerEccKey = NULL;
9352
0
        ssl->peerEccKeyPresent = 0;
9353
0
    }
9354
8
#endif
9355
9356
8
    peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
9357
8
                                                             DYNAMIC_TYPE_TLSX);
9358
8
    if (peerX448Key == NULL) {
9359
1
        WOLFSSL_MSG("PeerEccKey Memory error");
9360
1
        return MEMORY_ERROR;
9361
1
    }
9362
7
    ret = wc_curve448_init(peerX448Key);
9363
7
    if (ret != 0) {
9364
0
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9365
0
        return ret;
9366
0
    }
9367
#ifdef WOLFSSL_DEBUG_TLS
9368
    WOLFSSL_MSG("Peer Curve448 Key");
9369
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9370
#endif
9371
9372
7
    if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9373
7
                                                    EC448_LITTLE_ENDIAN) != 0) {
9374
3
        ret = ECC_PEERKEY_ERROR;
9375
3
        WOLFSSL_ERROR_VERBOSE(ret);
9376
3
    }
9377
9378
7
    if (ret == 0) {
9379
4
        if (wc_curve448_import_public_ex(keyShareEntry->ke,
9380
4
                                              keyShareEntry->keLen, peerX448Key,
9381
4
                                              EC448_LITTLE_ENDIAN) != 0) {
9382
0
            ret = ECC_PEERKEY_ERROR;
9383
0
            WOLFSSL_ERROR_VERBOSE(ret);
9384
0
        }
9385
4
    }
9386
9387
7
    if (ret == 0) {
9388
4
        ssl->ecdhCurveOID = ECC_X448_OID;
9389
9390
4
        ret = wc_curve448_shared_secret_ex(key, peerX448Key,
9391
4
                    ssOutput, ssOutSz, EC448_LITTLE_ENDIAN);
9392
4
    }
9393
9394
7
    wc_curve448_free(peerX448Key);
9395
7
    XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9396
7
    wc_curve448_free((curve448_key*)keyShareEntry->key);
9397
7
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9398
7
    keyShareEntry->key = NULL;
9399
7
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9400
7
    keyShareEntry->ke = NULL;
9401
#else
9402
    (void)ssl;
9403
    (void)keyShareEntry;
9404
    (void)ssOutput;
9405
    (void)ssOutSz;
9406
9407
    ret = PEER_KEY_ERROR;
9408
    WOLFSSL_ERROR_VERBOSE(ret);
9409
#endif /* HAVE_CURVE448 */
9410
9411
7
    return ret;
9412
7
}
9413
9414
/* Process the X448 key share extension on the client side.
9415
 *
9416
 * ssl            The SSL/TLS object.
9417
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9418
 * returns 0 on success and other values indicate failure.
9419
 */
9420
static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9421
8
{
9422
8
    return TLSX_KeyShare_ProcessX448_ex(ssl, keyShareEntry,
9423
8
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9424
8
}
9425
9426
/* Process the ECC key share extension on the client side.
9427
 *
9428
 * ssl            The SSL/TLS object.
9429
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9430
 * ssOutput       The destination buffer for the shared secret.
9431
 * ssOutSz        The size of the generated shared secret.
9432
 *
9433
 * returns 0 on success and other values indicate failure.
9434
 */
9435
static int TLSX_KeyShare_ProcessEcc_ex(WOLFSSL* ssl,
9436
                                       KeyShareEntry* keyShareEntry,
9437
                                       unsigned char* ssOutput,
9438
                                       word32* ssOutSz)
9439
{
9440
    int ret = 0;
9441
#ifdef HAVE_ECC
9442
    int curveId = ECC_CURVE_INVALID;
9443
    ecc_key* eccKey = (ecc_key*)keyShareEntry->key;
9444
9445
    /* find supported curve */
9446
    switch (keyShareEntry->group) {
9447
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
9448
        #ifndef NO_ECC_SECP
9449
        case WOLFSSL_ECC_SECP256R1:
9450
            curveId = ECC_SECP256R1;
9451
            break;
9452
        #endif /* !NO_ECC_SECP */
9453
        #ifdef WOLFSSL_SM2
9454
        case WOLFSSL_ECC_SM2P256V1:
9455
            curveId = ECC_SM2P256V1;
9456
            break;
9457
        #endif /* WOLFSSL_SM2 */
9458
        #ifdef HAVE_ECC_BRAINPOOL
9459
        case WOLFSSL_ECC_BRAINPOOLP256R1TLS13:
9460
            curveId = ECC_BRAINPOOLP256R1;
9461
            break;
9462
        #endif /* HAVE_ECC_BRAINPOOL */
9463
    #endif
9464
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
9465
        #ifndef NO_ECC_SECP
9466
        case WOLFSSL_ECC_SECP384R1:
9467
            curveId = ECC_SECP384R1;
9468
            break;
9469
        #endif /* !NO_ECC_SECP */
9470
        #ifdef HAVE_ECC_BRAINPOOL
9471
        case WOLFSSL_ECC_BRAINPOOLP384R1TLS13:
9472
            curveId = ECC_BRAINPOOLP384R1;
9473
            break;
9474
        #endif /* HAVE_ECC_BRAINPOOL */
9475
    #endif
9476
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
9477
        #ifdef HAVE_ECC_BRAINPOOL
9478
        case WOLFSSL_ECC_BRAINPOOLP512R1TLS13:
9479
            curveId = ECC_BRAINPOOLP512R1;
9480
            break;
9481
        #endif /* HAVE_ECC_BRAINPOOL */
9482
    #endif
9483
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
9484
        #ifndef NO_ECC_SECP
9485
        case WOLFSSL_ECC_SECP521R1:
9486
            curveId = ECC_SECP521R1;
9487
            break;
9488
        #endif /* !NO_ECC_SECP */
9489
    #endif
9490
    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
9491
        case WOLFSSL_ECC_X448:
9492
            curveId = ECC_X448;
9493
            break;
9494
    #endif
9495
        default:
9496
            /* unsupported curve */
9497
            WOLFSSL_ERROR_VERBOSE(ECC_PEERKEY_ERROR);
9498
            return ECC_PEERKEY_ERROR;
9499
    }
9500
9501
#ifdef WOLFSSL_ASYNC_CRYPT
9502
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9503
#endif
9504
    {
9505
    #ifdef WOLFSSL_DEBUG_TLS
9506
        WOLFSSL_MSG("Peer ECC Key");
9507
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9508
    #endif
9509
9510
        if (ssl->peerEccKey != NULL) {
9511
            wc_ecc_free(ssl->peerEccKey);
9512
            XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9513
            ssl->peerEccKeyPresent = 0;
9514
        }
9515
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
9516
        ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry);
9517
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
9518
            return ret;
9519
        }
9520
        ret = 0;
9521
#endif
9522
9523
        ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
9524
                                            DYNAMIC_TYPE_ECC);
9525
        if (ssl->peerEccKey == NULL) {
9526
            WOLFSSL_MSG("PeerEccKey Memory error");
9527
            ret = MEMORY_ERROR;
9528
        }
9529
9530
        if (ret == 0) {
9531
            ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
9532
        }
9533
9534
        /* Point is validated by import function. */
9535
        if (ret == 0) {
9536
#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
9537
            ret = wc_ecc_import_x963_ex2(keyShareEntry->ke,
9538
                keyShareEntry->keLen, ssl->peerEccKey, curveId, 1);
9539
#else
9540
            /* FIPS has validation define on. */
9541
            ret = wc_ecc_import_x963_ex(keyShareEntry->ke,
9542
                keyShareEntry->keLen, ssl->peerEccKey, curveId);
9543
#endif
9544
            if (ret != 0) {
9545
                ret = ECC_PEERKEY_ERROR;
9546
                WOLFSSL_ERROR_VERBOSE(ret);
9547
            }
9548
        }
9549
9550
        if (ret == 0) {
9551
            ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
9552
            ssl->peerEccKeyPresent = 1;
9553
        }
9554
    }
9555
9556
    if (ret == 0 && eccKey == NULL)
9557
        ret = BAD_FUNC_ARG;
9558
    if (ret == 0) {
9559
        ret = EccSharedSecret(ssl, eccKey, ssl->peerEccKey,
9560
            keyShareEntry->ke, &keyShareEntry->keLen,
9561
            ssOutput, ssOutSz, ssl->options.side);
9562
    #ifdef WOLFSSL_ASYNC_CRYPT
9563
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
9564
            return ret;
9565
    #endif
9566
    }
9567
9568
    /* done with key share, release resources */
9569
    if (ssl->peerEccKey != NULL
9570
    #ifdef HAVE_PK_CALLBACKS
9571
        && ssl->ctx->EccSharedSecretCb == NULL
9572
    #endif
9573
    ) {
9574
        wc_ecc_free(ssl->peerEccKey);
9575
        XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9576
        ssl->peerEccKey = NULL;
9577
        ssl->peerEccKeyPresent = 0;
9578
    }
9579
    if (keyShareEntry->key) {
9580
        wc_ecc_free((ecc_key*)keyShareEntry->key);
9581
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_ECC);
9582
        keyShareEntry->key = NULL;
9583
    }
9584
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9585
    keyShareEntry->ke = NULL;
9586
#else
9587
    (void)ssl;
9588
    (void)keyShareEntry;
9589
    (void)ssOutput;
9590
    (void)ssOutSz;
9591
9592
    ret = PEER_KEY_ERROR;
9593
    WOLFSSL_ERROR_VERBOSE(ret);
9594
#endif /* HAVE_ECC */
9595
9596
    return ret;
9597
}
9598
9599
/* Process the ECC key share extension on the client side.
9600
 *
9601
 * ssl            The SSL/TLS object.
9602
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9603
 * returns 0 on success and other values indicate failure.
9604
 */
9605
static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9606
109
{
9607
109
    return TLSX_KeyShare_ProcessEcc_ex(ssl, keyShareEntry,
9608
109
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9609
109
}
9610
9611
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9612
/* Process the Kyber key share extension on the client side.
9613
 *
9614
 * ssl            The SSL/TLS object.
9615
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9616
 * ssOutput       The destination buffer for the shared secret.
9617
 * ssOutSz        The size of the generated shared secret.
9618
 *
9619
 * returns 0 on success and other values indicate failure.
9620
 */
9621
static int TLSX_KeyShare_ProcessPqcClient_ex(WOLFSSL* ssl,
9622
                                             KeyShareEntry* keyShareEntry,
9623
                                             unsigned char* ssOutput,
9624
                                             word32* ssOutSz)
9625
{
9626
    int       ret = 0;
9627
    KyberKey* kem = (KyberKey*)keyShareEntry->key;
9628
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9629
    word32    privSz = 0;
9630
#endif
9631
    word32    ctSz = 0;
9632
    word32    ssSz = 0;
9633
9634
    if (ssl->options.side == WOLFSSL_SERVER_END) {
9635
        /* I am the server, the shared secret has already been generated and
9636
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
9637
        return 0;
9638
    }
9639
9640
    if (keyShareEntry->ke == NULL) {
9641
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
9642
        return BAD_FUNC_ARG;
9643
    }
9644
    if (ssOutSz == NULL)
9645
        return BAD_FUNC_ARG;
9646
9647
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9648
    if (kem == NULL) {
9649
        int type = 0;
9650
9651
        /* Allocate a Kyber key to hold private key. */
9652
        kem = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
9653
                                  DYNAMIC_TYPE_PRIVATE_KEY);
9654
        if (kem == NULL) {
9655
            WOLFSSL_MSG("GenPqcKey memory error");
9656
            ret = MEMORY_E;
9657
        }
9658
        if (ret == 0) {
9659
            ret = mlkem_id2type(keyShareEntry->group, &type);
9660
        }
9661
        if (ret != 0) {
9662
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
9663
            ret = BAD_FUNC_ARG;
9664
        }
9665
        if (ret == 0) {
9666
            ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
9667
            if (ret != 0) {
9668
                WOLFSSL_MSG("Error creating Kyber KEM");
9669
            }
9670
        }
9671
    }
9672
#else
9673
    if (kem == NULL || keyShareEntry->privKeyLen != 0) {
9674
        WOLFSSL_MSG("Invalid Kyber key.");
9675
        ret = BAD_FUNC_ARG;
9676
    }
9677
#endif
9678
9679
    if (ret == 0) {
9680
        ret = wc_KyberKey_SharedSecretSize(kem, &ssSz);
9681
    }
9682
    if (ret == 0) {
9683
        ret = wc_KyberKey_CipherTextSize(kem, &ctSz);
9684
    }
9685
9686
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9687
    if (ret == 0) {
9688
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
9689
    }
9690
    if (ret == 0 && privSz != keyShareEntry->privKeyLen) {
9691
        WOLFSSL_MSG("Invalid private key size.");
9692
        ret = BAD_FUNC_ARG;
9693
    }
9694
    if (ret == 0) {
9695
        ret = wc_KyberKey_DecodePrivateKey(kem, keyShareEntry->privKey, privSz);
9696
    }
9697
#endif
9698
9699
    if (ret == 0) {
9700
        ret = wc_KyberKey_Decapsulate(kem, ssOutput,
9701
                                      keyShareEntry->ke, ctSz);
9702
        if (ret != 0) {
9703
            WOLFSSL_MSG("wc_KyberKey decapsulation failure.");
9704
            ret = BAD_FUNC_ARG;
9705
        }
9706
    }
9707
    if (ret == 0) {
9708
        *ssOutSz = ssSz;
9709
    }
9710
9711
    wc_KyberKey_Free(kem);
9712
9713
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9714
    keyShareEntry->key = NULL;
9715
9716
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9717
    keyShareEntry->ke = NULL;
9718
9719
    return ret;
9720
}
9721
9722
/* Process the Kyber key share extension on the client side.
9723
 *
9724
 * ssl            The SSL/TLS object.
9725
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9726
 *
9727
 * returns 0 on success and other values indicate failure.
9728
 */
9729
static int TLSX_KeyShare_ProcessPqcClient(WOLFSSL* ssl,
9730
                                          KeyShareEntry* keyShareEntry)
9731
{
9732
    return TLSX_KeyShare_ProcessPqcClient_ex(ssl, keyShareEntry,
9733
                                             ssl->arrays->preMasterSecret,
9734
                                             &ssl->arrays->preMasterSz);
9735
}
9736
9737
/* Process the hybrid key share extension on the client side.
9738
 *
9739
 * ssl            The SSL/TLS object.
9740
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9741
 * returns 0 on success and other values indicate failure.
9742
 */
9743
static int TLSX_KeyShare_ProcessPqcHybridClient(WOLFSSL* ssl,
9744
                                                KeyShareEntry* keyShareEntry)
9745
{
9746
    int      ret = 0;
9747
    int      pqc_group = 0;
9748
    int      ecc_group = 0;
9749
    int      pqc_first = 0;
9750
    KeyShareEntry* pqc_kse = NULL;
9751
    KeyShareEntry *ecc_kse = NULL;
9752
    word32   ctSz = 0;
9753
    word32   ssSzPqc = 0;
9754
    word32   ssSzEcc = 0;
9755
9756
    if (ssl->options.side == WOLFSSL_SERVER_END) {
9757
        /* I am the server, the shared secret has already been generated and
9758
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
9759
        return 0;
9760
    }
9761
9762
    if (keyShareEntry->ke == NULL) {
9763
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
9764
        return BAD_FUNC_ARG;
9765
    }
9766
9767
    /* I am the client, both the PQC ciphertext and the ECHD public key are in
9768
     * keyShareEntry->ke */
9769
9770
    /* Determine the ECC and PQC group of the hybrid combination */
9771
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
9772
    if (ecc_group == 0 || pqc_group == 0) {
9773
        WOLFSSL_MSG("Invalid hybrid group");
9774
        ret = BAD_FUNC_ARG;
9775
    }
9776
9777
    if (ret == 0) {
9778
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
9779
                   DYNAMIC_TYPE_TLSX);
9780
        if (ecc_kse == NULL) {
9781
            WOLFSSL_MSG("kse memory allocation failure");
9782
            ret = MEMORY_ERROR;
9783
        }
9784
        else {
9785
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
9786
        }
9787
    }
9788
    if (ret == 0) {
9789
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
9790
                   DYNAMIC_TYPE_TLSX);
9791
        if (pqc_kse == NULL) {
9792
            WOLFSSL_MSG("kse memory allocation failure");
9793
            ret = MEMORY_ERROR;
9794
        }
9795
        else {
9796
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
9797
        }
9798
    }
9799
9800
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
9801
     * decode these sizes to separate the KEM ciphertext from the ECDH public
9802
     * key. */
9803
    if (ret == 0) {
9804
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9805
        int type;
9806
9807
        pqc_kse->privKey = keyShareEntry->privKey;
9808
9809
        ret = mlkem_id2type(pqc_group, &type);
9810
        if (ret != 0) {
9811
            WOLFSSL_MSG("Invalid Kyber algorithm specified.");
9812
            ret = BAD_FUNC_ARG;
9813
        }
9814
        if (ret == 0) {
9815
            pqc_kse->key = XMALLOC(sizeof(KyberKey), ssl->heap,
9816
                                DYNAMIC_TYPE_PRIVATE_KEY);
9817
            if (pqc_kse->key == NULL) {
9818
                WOLFSSL_MSG("GenPqcKey memory error");
9819
                ret = MEMORY_E;
9820
            }
9821
        }
9822
        if (ret == 0) {
9823
            ret = wc_KyberKey_Init(type, (KyberKey*)pqc_kse->key,
9824
                                   ssl->heap, ssl->devId);
9825
            if (ret != 0) {
9826
                WOLFSSL_MSG("Error creating Kyber KEM");
9827
            }
9828
        }
9829
    #else
9830
        pqc_kse->key = keyShareEntry->privKey;
9831
    #endif
9832
9833
        pqc_kse->group = pqc_group;
9834
        pqc_kse->privKeyLen = keyShareEntry->privKeyLen;
9835
9836
        if (ret == 0) {
9837
            ret = wc_KyberKey_SharedSecretSize((KyberKey*)pqc_kse->key,
9838
                                               &ssSzPqc);
9839
        }
9840
        if (ret == 0) {
9841
            ret = wc_KyberKey_CipherTextSize((KyberKey*)pqc_kse->key,
9842
                                             &ctSz);
9843
            if (ret == 0 && keyShareEntry->keLen <= ctSz) {
9844
                WOLFSSL_MSG("Invalid ciphertext size.");
9845
                ret = BAD_FUNC_ARG;
9846
            }
9847
        }
9848
        if (ret == 0) {
9849
            pqc_kse->keLen = ctSz;
9850
            pqc_kse->ke = (byte*)XMALLOC(pqc_kse->keLen, ssl->heap,
9851
                                         DYNAMIC_TYPE_PUBLIC_KEY);
9852
            if (pqc_kse->ke == NULL) {
9853
                WOLFSSL_MSG("pqc_kse memory allocation failure");
9854
                ret = MEMORY_ERROR;
9855
            }
9856
            /* Copy the PQC KEM ciphertext. Depending on the pqc_first flag,
9857
             * the KEM ciphertext comes before or after the ECDH public key. */
9858
            if (ret == 0) {
9859
                int offset = keyShareEntry->keLen - ctSz;
9860
9861
                if (pqc_first)
9862
                    offset = 0;
9863
9864
                XMEMCPY(pqc_kse->ke, keyShareEntry->ke + offset, ctSz);
9865
            }
9866
        }
9867
    }
9868
9869
    if (ret == 0) {
9870
        ecc_kse->group = ecc_group;
9871
        ecc_kse->keLen = keyShareEntry->keLen - ctSz;
9872
        ecc_kse->key = keyShareEntry->key;
9873
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
9874
                                        DYNAMIC_TYPE_PUBLIC_KEY);
9875
        if (ecc_kse->ke == NULL) {
9876
            WOLFSSL_MSG("ecc_kse memory allocation failure");
9877
            ret = MEMORY_ERROR;
9878
        }
9879
        /* Copy the ECDH public key. Depending on the pqc_first flag, the
9880
         * KEM ciphertext comes before or after the ECDH public key. */
9881
        if (ret == 0) {
9882
            int offset = 0;
9883
9884
            if (pqc_first)
9885
                offset = ctSz;
9886
9887
            XMEMCPY(ecc_kse->ke, keyShareEntry->ke + offset, ecc_kse->keLen);
9888
        }
9889
    }
9890
9891
    /* Process ECDH key share part. The generated shared secret is directly
9892
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
9893
     * pqc_first flag, the ECDH shared secret part goes before or after the
9894
     * KEM part. */
9895
    if (ret == 0) {
9896
        int offset = 0;
9897
9898
        /* Set the ECC size variable to the initial buffer size */
9899
        ssSzEcc = ssl->arrays->preMasterSz;
9900
9901
        if (pqc_first)
9902
            offset = ssSzPqc;
9903
9904
    #ifdef HAVE_CURVE25519
9905
        if (ecc_group == WOLFSSL_ECC_X25519) {
9906
            ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
9907
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9908
        }
9909
        else
9910
    #endif
9911
    #ifdef HAVE_CURVE448
9912
        if (ecc_group == WOLFSSL_ECC_X448) {
9913
            ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
9914
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9915
        }
9916
        else
9917
    #endif
9918
        {
9919
            ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
9920
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9921
        }
9922
    }
9923
9924
    if (ret == 0) {
9925
        keyShareEntry->key = ecc_kse->key;
9926
9927
        if ((ret == 0) && ((ssSzEcc + ssSzPqc) > ENCRYPT_LEN)) {
9928
            WOLFSSL_MSG("shared secret is too long.");
9929
            ret = LENGTH_ERROR;
9930
        }
9931
    }
9932
9933
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
9934
     * KEM shared secret part goes before or after the ECDH part. */
9935
    if (ret == 0) {
9936
        int offset = ssSzEcc;
9937
9938
        if (pqc_first)
9939
            offset = 0;
9940
9941
        ret = TLSX_KeyShare_ProcessPqcClient_ex(ssl, pqc_kse,
9942
                ssl->arrays->preMasterSecret + offset, &ssSzPqc);
9943
    }
9944
9945
    if (ret == 0) {
9946
        keyShareEntry->privKey = (byte*)pqc_kse->key;
9947
9948
        ssl->arrays->preMasterSz = ssSzEcc + ssSzPqc;
9949
    }
9950
9951
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
9952
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
9953
9954
    return ret;
9955
}
9956
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_DECAPSULATE */
9957
9958
/* Process the key share extension on the client side.
9959
 *
9960
 * ssl            The SSL/TLS object.
9961
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9962
 * returns 0 on success and other values indicate failure.
9963
 */
9964
static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9965
{
9966
    int ret;
9967
9968
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
9969
    keyShareEntry->session = ssl->session->namedGroup;
9970
    ssl->session->namedGroup = keyShareEntry->group;
9971
#endif
9972
    /* reset the pre master secret size */
9973
    if (ssl->arrays->preMasterSz == 0)
9974
        ssl->arrays->preMasterSz = ENCRYPT_LEN;
9975
9976
    /* Use Key Share Data from server. */
9977
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(keyShareEntry->group))
9978
        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
9979
    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
9980
        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
9981
    else if (keyShareEntry->group == WOLFSSL_ECC_X448)
9982
        ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
9983
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9984
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group))
9985
        ret = TLSX_KeyShare_ProcessPqcClient(ssl, keyShareEntry);
9986
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(keyShareEntry->group))
9987
        ret = TLSX_KeyShare_ProcessPqcHybridClient(ssl, keyShareEntry);
9988
#endif
9989
    else
9990
        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
9991
9992
#ifdef WOLFSSL_DEBUG_TLS
9993
    if (ret == 0) {
9994
        WOLFSSL_MSG("KE Secret");
9995
        WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9996
    }
9997
#endif
9998
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
9999
    keyShareEntry->derived = (ret == 0);
10000
#endif
10001
#ifdef WOLFSSL_ASYNC_CRYPT
10002
    keyShareEntry->lastRet = ret;
10003
#endif
10004
10005
    return ret;
10006
}
10007
10008
/* Parse an entry of the KeyShare extension.
10009
 *
10010
 * ssl     The SSL/TLS object.
10011
 * input   The extension data.
10012
 * length  The length of the extension data.
10013
 * kse     The new key share entry object.
10014
 * returns a positive number to indicate amount of data parsed and a negative
10015
 * number on error.
10016
 */
10017
static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
10018
            word16 length, KeyShareEntry **kse, word16* seenGroups,
10019
            int* seenGroupsCnt, TLSX** extensions)
10020
1.89k
{
10021
1.89k
    int    ret;
10022
1.89k
    word16 group;
10023
1.89k
    word16 keLen;
10024
1.89k
    int    offset = 0;
10025
1.89k
    byte*  ke;
10026
1.89k
    int    i;
10027
10028
1.89k
    if (length < OPAQUE16_LEN + OPAQUE16_LEN)
10029
5
        return BUFFER_ERROR;
10030
    /* Named group */
10031
1.89k
    ato16(&input[offset], &group);
10032
1.89k
    offset += OPAQUE16_LEN;
10033
    /* Key exchange data - public key. */
10034
1.89k
    ato16(&input[offset], &keLen);
10035
1.89k
    offset += OPAQUE16_LEN;
10036
1.89k
    if (keLen == 0)
10037
8
        return BUFFER_ERROR;
10038
1.88k
    if (keLen > length - offset)
10039
53
        return BUFFER_ERROR;
10040
10041
1.82k
    if (seenGroups != NULL) {
10042
1.76k
        if (*seenGroupsCnt >= MAX_KEYSHARE_NAMED_GROUPS) {
10043
1
            return BAD_KEY_SHARE_DATA;
10044
1
        }
10045
2.18k
        for (i = 0; i < *seenGroupsCnt; i++) {
10046
438
            if (seenGroups[i] == group) {
10047
9
                return BAD_KEY_SHARE_DATA;
10048
9
            }
10049
438
        }
10050
1.75k
        seenGroups[i] = group;
10051
1.75k
        *seenGroupsCnt = i + 1;
10052
1.75k
    }
10053
10054
#ifdef WOLFSSL_HAVE_MLKEM
10055
    if ((WOLFSSL_NAMED_GROUP_IS_PQC(group) ||
10056
         WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) &&
10057
        ssl->options.side == WOLFSSL_SERVER_END) {
10058
        /* When handling a key share containing a KEM public key on the server
10059
         * end, we have to perform the encapsulation immediately in order to
10060
         * send the resulting ciphertext back to the client in the ServerHello
10061
         * message. As the public key is not stored and we do not modify it, we
10062
         * don't have to create a copy of it.
10063
         * In case of a hybrid key exchange, the ECDH part is also performed
10064
         * immediately (to not split the generation of the master secret).
10065
         * Hence, we also don't have to store this public key either.  */
10066
        ke = (byte *)&input[offset];
10067
    } else
10068
#endif
10069
1.81k
    {
10070
        /* Store a copy in the key share object. */
10071
1.81k
        ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10072
1.81k
        if (ke == NULL)
10073
8
            return MEMORY_E;
10074
1.81k
        XMEMCPY(ke, &input[offset], keLen);
10075
1.81k
    }
10076
10077
    /* Populate a key share object in the extension. */
10078
0
    ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
10079
1.81k
    if (ret != 0) {
10080
10
        if (ke != &input[offset]) {
10081
10
            XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10082
10
        }
10083
10
        return ret;
10084
10
    }
10085
10086
    /* Total length of the parsed data. */
10087
1.80k
    return offset + keLen;
10088
1.81k
}
10089
10090
/* Searches the groups sent for the specified named group.
10091
 *
10092
 * ssl    SSL/TLS object.
10093
 * name   Group name to match.
10094
 * returns 1 when the extension has the group name and 0 otherwise.
10095
 */
10096
static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
10097
172
{
10098
172
    TLSX*          extension;
10099
172
    KeyShareEntry* list;
10100
10101
172
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
10102
172
    if (extension == NULL) {
10103
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
10104
0
        if (extension == NULL)
10105
0
            return 0;
10106
0
    }
10107
10108
172
    list = (KeyShareEntry*)extension->data;
10109
259
    while (list != NULL) {
10110
172
        if (list->group == group)
10111
85
            return 1;
10112
87
        list = list->next;
10113
87
    }
10114
10115
87
    return 0;
10116
172
}
10117
10118
10119
/* Searches the supported groups extension for the specified named group.
10120
 *
10121
 * ssl   The SSL/TLS object.
10122
 * name  The group name to match.
10123
 * returns 1 when the extension has the group name and 0 otherwise.
10124
 */
10125
static int TLSX_SupportedGroups_Find(const WOLFSSL* ssl, word16 name,
10126
                                     TLSX* extensions)
10127
1.52k
{
10128
1.52k
#ifdef HAVE_SUPPORTED_CURVES
10129
1.52k
    TLSX*          extension;
10130
1.52k
    SupportedCurve* curve = NULL;
10131
10132
1.52k
    if ((extension = TLSX_Find(extensions, TLSX_SUPPORTED_GROUPS)) == NULL) {
10133
29
        if ((extension = TLSX_Find(ssl->ctx->extensions,
10134
29
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
10135
29
            return 0;
10136
29
        }
10137
29
    }
10138
10139
3.23k
    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
10140
3.02k
        if (curve->name == name)
10141
1.28k
            return 1;
10142
3.02k
    }
10143
210
#endif
10144
10145
210
    (void)ssl;
10146
210
    (void)name;
10147
10148
210
    return 0;
10149
1.49k
}
10150
10151
int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl,
10152
        const byte* input, word16 length, TLSX** extensions)
10153
1.65k
{
10154
1.65k
    int ret;
10155
1.65k
    int    offset = 0;
10156
1.65k
    word16 len;
10157
1.65k
    TLSX*  extension;
10158
1.65k
    word16 seenGroups[MAX_KEYSHARE_NAMED_GROUPS];
10159
1.65k
    int    seenGroupsCnt = 0;
10160
10161
    /* Add a KeyShare extension if it doesn't exist even if peer sent no
10162
     * entries. The presence of this extension signals that the peer can be
10163
     * negotiated with. */
10164
1.65k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10165
1.65k
    if (extension == NULL) {
10166
        /* Push new KeyShare extension. */
10167
1.65k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10168
1.65k
        if (ret != 0)
10169
9
            return ret;
10170
1.65k
    }
10171
10172
1.64k
    if (length < OPAQUE16_LEN)
10173
3
        return BUFFER_ERROR;
10174
10175
    /* ClientHello contains zero or more key share entries. Limits extension
10176
     * length to 2^16-1 and subtracting 4 bytes for header size per RFC 8446 */
10177
1.64k
    ato16(input, &len);
10178
1.64k
    if ((len != length - OPAQUE16_LEN) ||
10179
1.61k
         length > (MAX_EXT_DATA_LEN - HELLO_EXT_SZ)) {
10180
31
        return BUFFER_ERROR;
10181
31
    }
10182
1.61k
    offset += OPAQUE16_LEN;
10183
10184
3.34k
    while (offset < (int)length) {
10185
1.81k
        ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset],
10186
1.81k
                length - (word16)offset, NULL, seenGroups, &seenGroupsCnt,
10187
1.81k
                extensions);
10188
1.81k
        if (ret < 0)
10189
79
            return ret;
10190
10191
1.73k
        offset += ret;
10192
1.73k
    }
10193
10194
1.53k
    if (ssl->hrr_keyshare_group != 0) {
10195
        /*
10196
         * https://datatracker.ietf.org/doc/html/rfc8446#section-4.2.8
10197
         *   when sending the new ClientHello, the client MUST
10198
         *   replace the original "key_share" extension with one containing only a
10199
         *   new KeyShareEntry for the group indicated in the selected_group field
10200
         *   of the triggering HelloRetryRequest
10201
         */
10202
46
        if (seenGroupsCnt != 1 || seenGroups[0] != ssl->hrr_keyshare_group) {
10203
35
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10204
35
            return BAD_KEY_SHARE_DATA;
10205
35
        }
10206
46
    }
10207
10208
1.49k
    return 0;
10209
1.53k
}
10210
10211
/* Parse the KeyShare extension.
10212
 * Different formats in different messages.
10213
 *
10214
 * ssl      The SSL/TLS object.
10215
 * input    The extension data.
10216
 * length   The length of the extension data.
10217
 * msgType  The type of the message this extension is being parsed from.
10218
 * returns 0 on success and other values indicate failure.
10219
 */
10220
int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10221
                               byte msgType)
10222
1.70k
{
10223
1.70k
    int ret = 0;
10224
1.70k
    KeyShareEntry *keyShareEntry = NULL;
10225
1.70k
    word16 group;
10226
10227
1.70k
    if (msgType == client_hello) {
10228
1.53k
        ret = TLSX_KeyShare_Parse_ClientHello(ssl, input, length,
10229
1.53k
                                              &ssl->extensions);
10230
1.53k
    }
10231
178
    else if (msgType == server_hello) {
10232
94
        int len;
10233
10234
94
        if (length < OPAQUE16_LEN)
10235
1
            return BUFFER_ERROR;
10236
10237
93
        ssl->options.shSentKeyShare = 1;
10238
10239
        /* The data is the named group the server wants to use. */
10240
93
        ato16(input, &group);
10241
10242
        /* Check the selected group was supported by ClientHello extensions. */
10243
93
        if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10244
2
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10245
2
            return BAD_KEY_SHARE_DATA;
10246
2
        }
10247
10248
        /* Check if the group was sent. */
10249
91
        if (!TLSX_KeyShare_Find(ssl, group)) {
10250
7
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10251
7
            return BAD_KEY_SHARE_DATA;
10252
7
        }
10253
10254
        /* ServerHello contains one key share entry. */
10255
84
        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry, NULL,
10256
84
                NULL, &ssl->extensions);
10257
84
        if (len != (int)length)
10258
19
            return BUFFER_ERROR;
10259
10260
        /* Not in list sent if there isn't a private key. */
10261
65
        if (keyShareEntry == NULL || (keyShareEntry->key == NULL
10262
0
        #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
10263
0
            && keyShareEntry->privKey == NULL
10264
65
        #endif
10265
65
        )) {
10266
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10267
0
            return BAD_KEY_SHARE_DATA;
10268
0
        }
10269
10270
        /* Process the entry to calculate the secret. */
10271
65
        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
10272
65
        if (ret == 0)
10273
21
            ssl->session->namedGroup = ssl->namedGroup = group;
10274
65
    }
10275
84
    else if (msgType == hello_retry_request) {
10276
84
        if (length != OPAQUE16_LEN)
10277
1
            return BUFFER_ERROR;
10278
10279
83
        ssl->options.hrrSentKeyShare = 1;
10280
10281
        /* The data is the named group the server wants to use. */
10282
83
        ato16(input, &group);
10283
10284
    #ifdef WOLFSSL_ASYNC_CRYPT
10285
        /* only perform find and clear TLSX if not returning from async */
10286
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
10287
    #endif
10288
83
        {
10289
            /* Check the selected group was supported by ClientHello extensions.
10290
             */
10291
83
            if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10292
2
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10293
2
                return BAD_KEY_SHARE_DATA;
10294
2
            }
10295
10296
            /* Make sure KeyShare for server requested group was not sent in
10297
             * ClientHello. */
10298
81
            if (TLSX_KeyShare_Find(ssl, group)) {
10299
1
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10300
1
                return BAD_KEY_SHARE_DATA;
10301
1
            }
10302
10303
            /* Clear out unusable key shares. */
10304
80
            ret = TLSX_KeyShare_Empty(ssl);
10305
80
            if (ret != 0)
10306
0
                return ret;
10307
80
        }
10308
10309
80
        ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
10310
80
        if (ret == 0)
10311
75
            ssl->session->namedGroup = ssl->namedGroup = group;
10312
80
    }
10313
0
    else {
10314
        /* Not a message type that is allowed to have this extension. */
10315
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10316
0
        return SANITY_MSG_E;
10317
0
    }
10318
10319
1.67k
    return ret;
10320
1.70k
}
10321
10322
/* Create a new key share entry and put it into the list.
10323
 *
10324
 * list           The linked list of key share entries.
10325
 * group          The named group.
10326
 * heap           The memory to allocate with.
10327
 * keyShareEntry  The new key share entry object.
10328
 * returns 0 on success and other values indicate failure.
10329
 */
10330
static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
10331
                             KeyShareEntry** keyShareEntry)
10332
6.34k
{
10333
6.34k
    KeyShareEntry* kse;
10334
6.34k
    KeyShareEntry** next;
10335
10336
6.34k
    kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
10337
6.34k
                                  DYNAMIC_TYPE_TLSX);
10338
6.34k
    if (kse == NULL)
10339
20
        return MEMORY_E;
10340
10341
6.32k
    XMEMSET(kse, 0, sizeof(*kse));
10342
6.32k
    kse->group = (word16)group;
10343
10344
    /* Add it to the back and maintain the links. */
10345
6.70k
    while (*list != NULL) {
10346
        /* Assign to temporary to work around compiler bug found by customer. */
10347
388
        next = &((*list)->next);
10348
388
        list = next;
10349
388
    }
10350
6.32k
    *list = kse;
10351
6.32k
    *keyShareEntry = kse;
10352
10353
6.32k
    (void)heap;
10354
10355
6.32k
    return 0;
10356
6.34k
}
10357
10358
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
10359
/* Process the Kyber key share extension on the server side.
10360
 *
10361
 * ssl            The SSL/TLS object.
10362
 * keyShareEntry  The key share entry object to be sent to the client.
10363
 * data           The key share data received from the client.
10364
 * len            The length of the key share data from the client.
10365
 * ssOutput       The destination buffer for the shared secret.
10366
 * ssOutSz        The size of the generated shared secret.
10367
 *
10368
 * returns 0 on success and other values indicate failure.
10369
 */
10370
static int TLSX_KeyShare_HandlePqcKeyServer(WOLFSSL* ssl,
10371
    KeyShareEntry* keyShareEntry, byte* clientData, word16 clientLen,
10372
    unsigned char* ssOutput, word32* ssOutSz)
10373
{
10374
    /* We are on the server side. The key share contains a PQC KEM public key
10375
     * that we are using for an encapsulate operation. The resulting ciphertext
10376
     * is stored in the server key share. */
10377
    KyberKey* kemKey = (KyberKey*)keyShareEntry->key;
10378
    byte* ciphertext = NULL;
10379
    int ret = 0;
10380
    word32 pubSz = 0;
10381
    word32 ctSz = 0;
10382
    word32 ssSz = 0;
10383
10384
    if (clientData == NULL) {
10385
        WOLFSSL_MSG("No KEM public key from the client.");
10386
        return BAD_FUNC_ARG;
10387
    }
10388
10389
    if (kemKey == NULL) {
10390
        int type = 0;
10391
10392
        /* Allocate a Kyber key to hold private key. */
10393
        kemKey = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
10394
                                     DYNAMIC_TYPE_PRIVATE_KEY);
10395
        if (kemKey == NULL) {
10396
            WOLFSSL_MSG("GenPqcKey memory error");
10397
            ret = MEMORY_E;
10398
        }
10399
        if (ret == 0) {
10400
            ret = mlkem_id2type(keyShareEntry->group, &type);
10401
        }
10402
        if (ret != 0) {
10403
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10404
            ret = BAD_FUNC_ARG;
10405
        }
10406
        if (ret == 0) {
10407
            ret = wc_KyberKey_Init(type, kemKey, ssl->heap, ssl->devId);
10408
            if (ret != 0) {
10409
                WOLFSSL_MSG("Error creating Kyber KEM");
10410
            }
10411
        }
10412
    }
10413
10414
    if (ret == 0) {
10415
        ret = wc_KyberKey_PublicKeySize(kemKey, &pubSz);
10416
    }
10417
    if (ret == 0) {
10418
        ret = wc_KyberKey_CipherTextSize(kemKey, &ctSz);
10419
    }
10420
    if (ret == 0) {
10421
        ret = wc_KyberKey_SharedSecretSize(kemKey, &ssSz);
10422
    }
10423
10424
    if (ret == 0 && clientLen != pubSz) {
10425
        WOLFSSL_MSG("Invalid public key.");
10426
        ret = BAD_FUNC_ARG;
10427
    }
10428
10429
    if (ret == 0) {
10430
        ciphertext = (byte*)XMALLOC(ctSz, ssl->heap, DYNAMIC_TYPE_TLSX);
10431
10432
        if (ciphertext == NULL) {
10433
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10434
            ret = MEMORY_E;
10435
        }
10436
    }
10437
10438
    if (ret == 0) {
10439
        ret = wc_KyberKey_DecodePublicKey(kemKey, clientData, pubSz);
10440
    }
10441
    if (ret == 0) {
10442
        ret = wc_KyberKey_Encapsulate(kemKey, ciphertext,
10443
                                      ssOutput, ssl->rng);
10444
        if (ret != 0) {
10445
            WOLFSSL_MSG("wc_KyberKey encapsulation failure.");
10446
        }
10447
    }
10448
10449
    if (ret == 0) {
10450
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10451
10452
        *ssOutSz = ssSz;
10453
        keyShareEntry->ke = NULL;
10454
        keyShareEntry->keLen = 0;
10455
10456
        keyShareEntry->pubKey = ciphertext;
10457
        keyShareEntry->pubKeyLen = ctSz;
10458
        ciphertext = NULL;
10459
10460
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
10461
         * the server side. */
10462
        ssl->namedGroup = keyShareEntry->group;
10463
    }
10464
10465
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
10466
10467
    wc_KyberKey_Free(kemKey);
10468
    XFREE(kemKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10469
    keyShareEntry->key = NULL;
10470
    return ret;
10471
}
10472
10473
static int TLSX_KeyShare_HandlePqcHybridKeyServer(WOLFSSL* ssl,
10474
    KeyShareEntry* keyShareEntry, byte* data, word16 len)
10475
{
10476
    /* I am the server. The data parameter is the concatenation of the client's
10477
     * ECDH public key and the KEM public key. I need to generate a matching
10478
     * public key for ECDH and encapsulate a shared secret using the KEM public
10479
     * key. We send the ECDH public key and the KEM ciphertext back to the
10480
     * client. Additionally, we create the ECDH shared secret here already.
10481
     */
10482
    int    type;
10483
    byte*  ciphertext = NULL;
10484
    int    ret = 0;
10485
    int    pqc_group = 0;
10486
    int    ecc_group = 0;
10487
    int    pqc_first = 0;
10488
    KeyShareEntry *ecc_kse = NULL;
10489
    KeyShareEntry *pqc_kse = NULL;
10490
    word32 pubSz = 0;
10491
    word32 ctSz = 0;
10492
    word32 ssSzPqc = 0;
10493
    word32 ssSzEcc = 0;
10494
10495
    if (data == NULL) {
10496
        WOLFSSL_MSG("No hybrid key share data from the client.");
10497
        return BAD_FUNC_ARG;
10498
    }
10499
10500
    /* Determine the ECC and PQC group of the hybrid combination */
10501
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
10502
    if (ecc_group == 0 || pqc_group == 0) {
10503
        WOLFSSL_MSG("Invalid hybrid group");
10504
        ret = BAD_FUNC_ARG;
10505
    }
10506
10507
    if (ret == 0) {
10508
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
10509
                   DYNAMIC_TYPE_TLSX);
10510
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
10511
                   DYNAMIC_TYPE_TLSX);
10512
        if (ecc_kse == NULL || pqc_kse == NULL) {
10513
            WOLFSSL_MSG("kse memory allocation failure");
10514
            ret = MEMORY_ERROR;
10515
        }
10516
    }
10517
10518
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
10519
     * decode these sizes to properly concatenate the KEM ciphertext with the
10520
     * ECDH public key. */
10521
    if (ret == 0) {
10522
        XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
10523
        pqc_kse->group = pqc_group;
10524
10525
        /* Allocate a Kyber key to hold private key. */
10526
        pqc_kse->key = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
10527
                                           DYNAMIC_TYPE_PRIVATE_KEY);
10528
        if (pqc_kse->key == NULL) {
10529
            WOLFSSL_MSG("GenPqcKey memory error");
10530
            ret = MEMORY_E;
10531
        }
10532
        if (ret == 0) {
10533
            ret = mlkem_id2type(pqc_kse->group, &type);
10534
        }
10535
        if (ret != 0) {
10536
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10537
            ret = BAD_FUNC_ARG;
10538
        }
10539
        if (ret == 0) {
10540
            ret = wc_KyberKey_Init(type, (KyberKey*)pqc_kse->key,
10541
                                   ssl->heap, ssl->devId);
10542
            if (ret != 0) {
10543
                WOLFSSL_MSG("Error creating Kyber KEM");
10544
            }
10545
        }
10546
        if (ret == 0) {
10547
            ret = wc_KyberKey_SharedSecretSize((KyberKey*)pqc_kse->key,
10548
                                               &ssSzPqc);
10549
        }
10550
        if (ret == 0) {
10551
            ret = wc_KyberKey_CipherTextSize((KyberKey*)pqc_kse->key,
10552
                                             &ctSz);
10553
        }
10554
        if (ret == 0) {
10555
            ret = wc_KyberKey_PublicKeySize((KyberKey*)pqc_kse->key,
10556
                                            &pubSz);
10557
        }
10558
    }
10559
10560
    /* Generate the ECDH key share part to be sent to the client */
10561
    if (ret == 0 && ecc_group != 0) {
10562
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
10563
        ecc_kse->group = ecc_group;
10564
    #ifdef HAVE_CURVE25519
10565
        if (ecc_group == WOLFSSL_ECC_X25519) {
10566
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
10567
        }
10568
        else
10569
    #endif
10570
    #ifdef HAVE_CURVE448
10571
        if (ecc_group == WOLFSSL_ECC_X448) {
10572
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
10573
        }
10574
        else
10575
    #endif
10576
        {
10577
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
10578
        }
10579
        /* No error message, TLSX_KeyShare_GenKey will do it. */
10580
    }
10581
10582
    if (ret == 0 && len != pubSz + ecc_kse->pubKeyLen) {
10583
        WOLFSSL_MSG("Invalid public key.");
10584
        ret = BAD_FUNC_ARG;
10585
    }
10586
10587
    /* Allocate buffer for the concatenated client key share data
10588
     * (PQC KEM ciphertext + ECDH public key) */
10589
    if (ret == 0) {
10590
        ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap,
10591
            DYNAMIC_TYPE_TLSX);
10592
10593
        if (ciphertext == NULL) {
10594
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10595
            ret = MEMORY_E;
10596
        }
10597
    }
10598
10599
    /* Process ECDH key share part. The generated shared secret is directly
10600
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
10601
     * pqc_first flag, the ECDH shared secret part goes before or after the
10602
     * KEM part. */
10603
    if (ret == 0) {
10604
        ecc_kse->keLen = len - pubSz;
10605
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
10606
                                     DYNAMIC_TYPE_PUBLIC_KEY);
10607
        if (ecc_kse->ke == NULL) {
10608
            WOLFSSL_MSG("ecc_kse memory allocation failure");
10609
            ret = MEMORY_ERROR;
10610
        }
10611
        if (ret == 0) {
10612
            int pubOffset = 0;
10613
            int ssOffset = 0;
10614
10615
            /* Set the ECC size variable to the initial buffer size */
10616
            ssSzEcc = ssl->arrays->preMasterSz;
10617
10618
            if (pqc_first) {
10619
                pubOffset = pubSz;
10620
                ssOffset = ssSzPqc;
10621
            }
10622
10623
            XMEMCPY(ecc_kse->ke, data + pubOffset, ecc_kse->keLen);
10624
10625
        #ifdef HAVE_CURVE25519
10626
            if (ecc_group == WOLFSSL_ECC_X25519) {
10627
                ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
10628
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10629
            }
10630
            else
10631
        #endif
10632
        #ifdef HAVE_CURVE448
10633
            if (ecc_group == WOLFSSL_ECC_X448) {
10634
                ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
10635
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10636
            }
10637
            else
10638
        #endif
10639
            {
10640
                ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
10641
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10642
            }
10643
        }
10644
        if (ret == 0) {
10645
            if (ssSzEcc != ecc_kse->keyLen) {
10646
                WOLFSSL_MSG("Data length mismatch.");
10647
                ret = BAD_FUNC_ARG;
10648
            }
10649
        }
10650
    }
10651
10652
    if (ret == 0 && ssSzEcc + ssSzPqc > ENCRYPT_LEN) {
10653
        WOLFSSL_MSG("shared secret is too long.");
10654
        ret = LENGTH_ERROR;
10655
    }
10656
10657
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
10658
     * KEM shared secret part goes before or after the ECDH part. */
10659
    if (ret == 0) {
10660
        int input_offset = ecc_kse->keLen;
10661
        int output_offset = ssSzEcc;
10662
10663
        if (pqc_first) {
10664
            input_offset = 0;
10665
            output_offset = 0;
10666
        }
10667
10668
        ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, pqc_kse,
10669
                data + input_offset, pubSz,
10670
                ssl->arrays->preMasterSecret + output_offset, &ssSzPqc);
10671
    }
10672
10673
    if (ret == 0) {
10674
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10675
10676
        ssl->arrays->preMasterSz = ssSzEcc + ssSzPqc;
10677
        keyShareEntry->ke = NULL;
10678
        keyShareEntry->keLen = 0;
10679
10680
        /* Concatenate the ECDH public key and the PQC KEM ciphertext. Based on
10681
         * the pqc_first flag, the ECDH public key goes before or after the KEM
10682
         * ciphertext. */
10683
        if (pqc_first) {
10684
            XMEMCPY(ciphertext, pqc_kse->pubKey, ctSz);
10685
            XMEMCPY(ciphertext + ctSz, ecc_kse->pubKey, ecc_kse->pubKeyLen);
10686
        }
10687
        else {
10688
            XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen);
10689
            XMEMCPY(ciphertext + ecc_kse->pubKeyLen, pqc_kse->pubKey, ctSz);
10690
        }
10691
10692
        keyShareEntry->pubKey = ciphertext;
10693
        keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen + ctSz;
10694
        ciphertext = NULL;
10695
10696
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
10697
         * the server side. */
10698
        ssl->namedGroup = keyShareEntry->group;
10699
    }
10700
10701
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
10702
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
10703
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
10704
    return ret;
10705
}
10706
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_ENCAPSULATE */
10707
10708
/* Use the data to create a new key share object in the extensions.
10709
 *
10710
 * ssl    The SSL/TLS object.
10711
 * group  The named group.
10712
 * len    The length of the public key data.
10713
 * data   The public key data.
10714
 * kse    The new key share entry object.
10715
 * returns 0 on success and other values indicate failure.
10716
 */
10717
int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
10718
                      KeyShareEntry **kse, TLSX** extensions)
10719
5.24k
{
10720
5.24k
    int            ret = 0;
10721
5.24k
    TLSX*          extension;
10722
5.24k
    KeyShareEntry* keyShareEntry = NULL;
10723
10724
    /* Find the KeyShare extension if it exists. */
10725
5.24k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10726
5.24k
    if (extension == NULL) {
10727
        /* Push new KeyShare extension. */
10728
3.31k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10729
3.31k
        if (ret != 0)
10730
1
            return ret;
10731
10732
3.31k
        extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10733
3.31k
        if (extension == NULL)
10734
0
            return MEMORY_E;
10735
3.31k
    }
10736
5.24k
    extension->resp = 0;
10737
10738
    /* Try to find the key share entry with this group. */
10739
5.24k
    keyShareEntry = (KeyShareEntry*)extension->data;
10740
5.64k
    while (keyShareEntry != NULL) {
10741
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
10742
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
10743
                keyShareEntry->group == WOLFSSL_SECP256R1MLKEM512) ||
10744
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
10745
                keyShareEntry->group == WOLFSSL_SECP384R1MLKEM768) ||
10746
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
10747
                keyShareEntry->group == WOLFSSL_SECP521R1MLKEM1024)) {
10748
            keyShareEntry->group = group;
10749
            break;
10750
        }
10751
        else
10752
#endif
10753
503
        if (keyShareEntry->group == group)
10754
104
            break;
10755
399
        keyShareEntry = keyShareEntry->next;
10756
399
    }
10757
10758
    /* Create a new key share entry if not found. */
10759
5.24k
    if (keyShareEntry == NULL) {
10760
5.14k
        ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
10761
5.14k
                                ssl->heap, &keyShareEntry);
10762
5.14k
        if (ret != 0)
10763
11
            return ret;
10764
5.14k
    }
10765
10766
10767
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
10768
    if (ssl->options.side == WOLFSSL_SERVER_END &&
10769
            WOLFSSL_NAMED_GROUP_IS_PQC(group)) {
10770
        ret = TLSX_KeyShare_HandlePqcKeyServer((WOLFSSL*)ssl,
10771
                                               keyShareEntry,
10772
                                               data, len,
10773
                                               ssl->arrays->preMasterSecret,
10774
                                               &ssl->arrays->preMasterSz);
10775
        if (ret != 0)
10776
            return ret;
10777
    }
10778
    else if (ssl->options.side == WOLFSSL_SERVER_END &&
10779
             WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) {
10780
        ret = TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
10781
                                                     keyShareEntry,
10782
                                                     data, len);
10783
        if (ret != 0)
10784
            return ret;
10785
    }
10786
    else
10787
#endif
10788
5.23k
    if (data != NULL) {
10789
1.80k
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10790
1.80k
        keyShareEntry->ke = data;
10791
1.80k
        keyShareEntry->keLen = len;
10792
1.80k
    }
10793
3.43k
    else {
10794
        /* Generate a key pair. Casting to non-const since changes inside are
10795
         * minimal but would require an extensive redesign to refactor. Also
10796
         * this path shouldn't be taken when parsing a ClientHello in stateless
10797
         * mode. */
10798
3.43k
        ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, keyShareEntry);
10799
3.43k
        if (ret != 0)
10800
510
            return ret;
10801
3.43k
    }
10802
10803
4.72k
    if (kse != NULL)
10804
69
        *kse = keyShareEntry;
10805
10806
4.72k
    return 0;
10807
5.23k
}
10808
10809
/* Set an empty Key Share extension.
10810
 *
10811
 * ssl  The SSL/TLS object.
10812
 * returns 0 on success and other values indicate failure.
10813
 */
10814
int TLSX_KeyShare_Empty(WOLFSSL* ssl)
10815
80
{
10816
80
    int   ret = 0;
10817
80
    TLSX* extension;
10818
10819
    /* Find the KeyShare extension if it exists. */
10820
80
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
10821
80
    if (extension == NULL) {
10822
        /* Push new KeyShare extension. */
10823
0
        ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10824
0
    }
10825
80
    else if (extension->data != NULL) {
10826
80
        TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
10827
80
        extension->data = NULL;
10828
80
    }
10829
10830
80
    return ret;
10831
80
}
10832
10833
static const word16 preferredGroup[] = {
10834
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
10835
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256
10836
    WOLFSSL_ECC_SECP256R1,
10837
#if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
10838
    WOLFSSL_ECC_SM2P256V1,
10839
#endif
10840
#if defined(HAVE_ECC_BRAINPOOL)
10841
    WOLFSSL_ECC_BRAINPOOLP256R1TLS13,
10842
#endif
10843
#endif
10844
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10845
    WOLFSSL_ECC_X25519,
10846
#endif
10847
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10848
    WOLFSSL_ECC_X448,
10849
#endif
10850
#if defined(HAVE_ECC) && (!defined(NO_ECC384) || \
10851
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384
10852
    WOLFSSL_ECC_SECP384R1,
10853
#if defined(HAVE_ECC_BRAINPOOL)
10854
    WOLFSSL_ECC_BRAINPOOLP384R1TLS13,
10855
#endif
10856
#endif
10857
#if defined(HAVE_ECC) && (!defined(NO_ECC521) || \
10858
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
10859
    WOLFSSL_ECC_SECP521R1,
10860
#endif
10861
#if defined(HAVE_ECC) && defined(HAVE_ECC512) && \
10862
    defined(HAVE_ECC_BRAINPOOL) && ECC_MIN_KEY_SZ <= 512
10863
    WOLFSSL_ECC_BRAINPOOLP512R1TLS13,
10864
#endif
10865
#if defined(HAVE_FFDHE_2048)
10866
    WOLFSSL_FFDHE_2048,
10867
#endif
10868
#if defined(HAVE_FFDHE_3072)
10869
    WOLFSSL_FFDHE_3072,
10870
#endif
10871
#if defined(HAVE_FFDHE_4096)
10872
    WOLFSSL_FFDHE_4096,
10873
#endif
10874
#if defined(HAVE_FFDHE_6144)
10875
    WOLFSSL_FFDHE_6144,
10876
#endif
10877
#if defined(HAVE_FFDHE_8192)
10878
    WOLFSSL_FFDHE_8192,
10879
#endif
10880
#ifndef WOLFSSL_NO_ML_KEM
10881
#ifdef WOLFSSL_WC_MLKEM
10882
    #ifndef WOLFSSL_NO_ML_KEM_512
10883
    WOLFSSL_ML_KEM_512,
10884
    WOLFSSL_SECP256R1MLKEM512,
10885
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10886
    WOLFSSL_X25519MLKEM512,
10887
    #endif
10888
    #endif
10889
    #ifndef WOLFSSL_NO_ML_KEM_768
10890
    WOLFSSL_ML_KEM_768,
10891
    WOLFSSL_SECP384R1MLKEM768,
10892
    WOLFSSL_SECP256R1MLKEM768,
10893
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10894
    WOLFSSL_X25519MLKEM768,
10895
    #endif
10896
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10897
    WOLFSSL_X448MLKEM768,
10898
    #endif
10899
    #endif
10900
    #ifndef WOLFSSL_NO_ML_KEM_1024
10901
    WOLFSSL_ML_KEM_1024,
10902
    WOLFSSL_SECP521R1MLKEM1024,
10903
    WOLFSSL_SECP384R1MLKEM1024,
10904
    #endif
10905
#elif defined(HAVE_LIBOQS)
10906
    /* These require a runtime call to TLSX_IsGroupSupported to use */
10907
    WOLFSSL_ML_KEM_512,
10908
    WOLFSSL_ML_KEM_768,
10909
    WOLFSSL_ML_KEM_1024,
10910
    WOLFSSL_SECP256R1MLKEM512,
10911
    WOLFSSL_SECP384R1MLKEM768,
10912
    WOLFSSL_SECP256R1MLKEM768,
10913
    WOLFSSL_SECP521R1MLKEM1024,
10914
    WOLFSSL_SECP384R1MLKEM1024,
10915
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10916
    WOLFSSL_X25519MLKEM512,
10917
    WOLFSSL_X25519MLKEM768,
10918
    #endif
10919
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10920
    WOLFSSL_X448MLKEM768,
10921
    #endif
10922
#endif
10923
#endif /* !WOLFSSL_NO_ML_KEM */
10924
#ifdef WOLFSSL_MLKEM_KYBER
10925
#ifdef WOLFSSL_WC_MLKEM
10926
    #ifdef WOLFSSL_KYBER512
10927
    WOLFSSL_KYBER_LEVEL1,
10928
    WOLFSSL_P256_KYBER_LEVEL1,
10929
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10930
    WOLFSSL_X25519_KYBER_LEVEL1,
10931
    #endif
10932
    #endif
10933
    #ifdef WOLFSSL_KYBER768
10934
    WOLFSSL_KYBER_LEVEL3,
10935
    WOLFSSL_P384_KYBER_LEVEL3,
10936
    WOLFSSL_P256_KYBER_LEVEL3,
10937
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10938
    WOLFSSL_X25519_KYBER_LEVEL3,
10939
    #endif
10940
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10941
    WOLFSSL_X448_KYBER_LEVEL3,
10942
    #endif
10943
    #endif
10944
    #ifdef WOLFSSL_KYBER1024
10945
    WOLFSSL_KYBER_LEVEL5,
10946
    WOLFSSL_P521_KYBER_LEVEL5,
10947
    #endif
10948
#elif defined(HAVE_LIBOQS)
10949
    /* These require a runtime call to TLSX_IsGroupSupported to use */
10950
    WOLFSSL_KYBER_LEVEL1,
10951
    WOLFSSL_KYBER_LEVEL3,
10952
    WOLFSSL_KYBER_LEVEL5,
10953
    WOLFSSL_P256_KYBER_LEVEL1,
10954
    WOLFSSL_P384_KYBER_LEVEL3,
10955
    WOLFSSL_P256_KYBER_LEVEL3,
10956
    WOLFSSL_P521_KYBER_LEVEL5,
10957
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10958
    WOLFSSL_X25519_KYBER_LEVEL1,
10959
    WOLFSSL_X25519_KYBER_LEVEL3,
10960
    #endif
10961
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10962
    WOLFSSL_X448_KYBER_LEVEL3,
10963
    #endif
10964
#endif
10965
#endif /* WOLFSSL_MLKEM_KYBER */
10966
    WOLFSSL_NAMED_GROUP_INVALID
10967
};
10968
10969
#define PREFERRED_GROUP_SZ \
10970
    ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
10971
                                            /* -1 for the invalid group */
10972
10973
/* Examines the application specified group ranking and returns the rank of the
10974
 * group.
10975
 * If no group ranking set then all groups are rank 0 (highest).
10976
 *
10977
 * ssl    The SSL/TLS object.
10978
 * group  The group to check ranking for.
10979
 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
10980
 */
10981
static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
10982
1.33k
{
10983
1.33k
    byte i;
10984
1.33k
    const word16* groups;
10985
1.33k
    byte numGroups;
10986
10987
1.33k
    if (ssl->numGroups == 0) {
10988
1.33k
        return 0;
10989
1.33k
    }
10990
0
    else {
10991
0
        groups = ssl->group;
10992
0
        numGroups = ssl->numGroups;
10993
0
    }
10994
10995
#ifdef HAVE_LIBOQS
10996
      if (!TLSX_IsGroupSupported(group))
10997
          return WOLFSSL_FATAL_ERROR;
10998
#endif
10999
11000
0
    for (i = 0; i < numGroups; i++) {
11001
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
11002
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
11003
             groups[i] == WOLFSSL_SECP256R1MLKEM512) ||
11004
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
11005
             groups[i] == WOLFSSL_SECP384R1MLKEM768) ||
11006
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
11007
             groups[i] == WOLFSSL_SECP521R1MLKEM1024)) {
11008
            return i;
11009
        }
11010
#endif
11011
0
        if (groups[i] == (word16)group)
11012
0
            return i;
11013
0
    }
11014
11015
0
    return WOLFSSL_FATAL_ERROR;
11016
0
}
11017
11018
/* Set a key share that is supported by the client into extensions.
11019
 *
11020
 * ssl  The SSL/TLS object.
11021
 * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
11022
 * 0 if a supported group has a key share and other values indicate an error.
11023
 */
11024
int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, TLSX** extensions)
11025
181
{
11026
181
    int             ret;
11027
181
#ifdef HAVE_SUPPORTED_CURVES
11028
181
    TLSX*           extension;
11029
181
    SupportedCurve* curve = NULL;
11030
181
    SupportedCurve* preferredCurve = NULL;
11031
181
    word16          name = WOLFSSL_NAMED_GROUP_INVALID;
11032
181
    KeyShareEntry*  kse = NULL;
11033
181
    int             preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11034
181
    int             rank;
11035
11036
181
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
11037
181
    if (extension != NULL)
11038
157
        curve = (SupportedCurve*)extension->data;
11039
399
    for (; curve != NULL; curve = curve->next) {
11040
        /* Use server's preference order. Common group was found but key share
11041
         * was missing */
11042
218
        if (!TLSX_IsGroupSupported(curve->name))
11043
0
            continue;
11044
218
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
11045
0
            continue;
11046
11047
218
        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
11048
218
        if (rank == -1)
11049
0
            continue;
11050
218
        if (rank < preferredRank) {
11051
157
            preferredCurve = curve;
11052
157
            preferredRank = rank;
11053
157
        }
11054
218
    }
11055
181
    curve = preferredCurve;
11056
11057
181
    if (curve == NULL) {
11058
24
        byte i;
11059
        /* Fallback to user selected group */
11060
24
        preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11061
24
        for (i = 0; i < ssl->numGroups; i++) {
11062
0
            rank = TLSX_KeyShare_GroupRank(ssl, ssl->group[i]);
11063
0
            if (rank == -1)
11064
0
                continue;
11065
0
            if (rank < preferredRank) {
11066
0
                name = ssl->group[i];
11067
0
                preferredRank = rank;
11068
0
            }
11069
0
        }
11070
24
        if (name == WOLFSSL_NAMED_GROUP_INVALID) {
11071
            /* No group selected or specified by the server */
11072
24
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11073
24
            return BAD_KEY_SHARE_DATA;
11074
24
        }
11075
24
    }
11076
157
    else {
11077
157
        name = curve->name;
11078
157
    }
11079
11080
    #ifdef WOLFSSL_ASYNC_CRYPT
11081
    /* Check the old key share data list. */
11082
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
11083
    if (extension != NULL) {
11084
        kse = (KeyShareEntry*)extension->data;
11085
        /* We should not be computing keys if we are only going to advertise
11086
         * our choice here. */
11087
        if (kse != NULL && kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11088
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
11089
            return BAD_KEY_SHARE_DATA;
11090
        }
11091
    }
11092
    #endif
11093
11094
    /* Push new KeyShare extension. This will also free the old one */
11095
157
    ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
11096
157
    if (ret != 0)
11097
8
        return ret;
11098
    /* Extension got pushed to head */
11099
149
    extension = *extensions;
11100
    /* Push the selected curve */
11101
149
    ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, name,
11102
149
                            ssl->heap, &kse);
11103
149
    if (ret != 0)
11104
2
        return ret;
11105
    /* Set extension to be in response. */
11106
147
    extension->resp = 1;
11107
#else
11108
11109
    (void)ssl;
11110
11111
    WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN);
11112
    ret = NOT_COMPILED_IN;
11113
#endif
11114
11115
147
    return ret;
11116
149
}
11117
11118
#ifdef WOLFSSL_DUAL_ALG_CERTS
11119
/* Writes the CKS objects of a list in a buffer. */
11120
static word16 CKS_WRITE(WOLFSSL* ssl, byte* output)
11121
{
11122
    XMEMCPY(output, ssl->sigSpec, ssl->sigSpecSz);
11123
    return ssl->sigSpecSz;
11124
}
11125
11126
static int TLSX_UseCKS(TLSX** extensions, WOLFSSL* ssl, void* heap)
11127
{
11128
    int ret = 0;
11129
    TLSX* extension;
11130
11131
    if (extensions == NULL) {
11132
        return BAD_FUNC_ARG;
11133
    }
11134
11135
    extension = TLSX_Find(*extensions, TLSX_CKS);
11136
    /* If it is already present, do nothing. */
11137
    if (extension == NULL) {
11138
        /* The data required is in the ssl struct, so push it in. */
11139
        ret = TLSX_Push(extensions, TLSX_CKS, (void*)ssl, heap);
11140
    }
11141
11142
    return ret;
11143
}
11144
11145
int TLSX_CKS_Set(WOLFSSL* ssl, TLSX** extensions)
11146
{
11147
    int ret;
11148
    TLSX* extension;
11149
    /* Push new KeyShare extension. This will also free the old one */
11150
    ret = TLSX_Push(extensions, TLSX_CKS, NULL, ssl->heap);
11151
    if (ret != 0)
11152
        return ret;
11153
    /* Extension got pushed to head */
11154
    extension = *extensions;
11155
    /* Need ssl->sigSpecSz during extension length calculation. */
11156
    extension->data = ssl;
11157
    /* Set extension to be in response. */
11158
    extension->resp = 1;
11159
    return ret;
11160
}
11161
11162
int TLSX_CKS_Parse(WOLFSSL* ssl, byte* input, word16 length,
11163
                   TLSX** extensions)
11164
{
11165
    int ret;
11166
    int i, j;
11167
11168
    (void) extensions;
11169
11170
    /* Validating the input. */
11171
    if (length == 0)
11172
        return BUFFER_ERROR;
11173
    for (i = 0; i < length; i++) {
11174
        switch (input[i])
11175
        {
11176
            case WOLFSSL_CKS_SIGSPEC_NATIVE:
11177
            case WOLFSSL_CKS_SIGSPEC_ALTERNATIVE:
11178
            case WOLFSSL_CKS_SIGSPEC_BOTH:
11179
                /* These are all valid values; do nothing */
11180
                break;
11181
            case WOLFSSL_CKS_SIGSPEC_EXTERNAL:
11182
            default:
11183
                /* All other values (including external) are not. */
11184
                return BAD_FUNC_ARG;
11185
        }
11186
    }
11187
11188
    /* This could be a situation where the client tried to start with TLS 1.3
11189
     * when it sent ClientHello and the server down-graded to TLS 1.2. In that
11190
     * case, erroring out because it is TLS 1.2 is not a reasonable thing to do.
11191
     * In the case of TLS 1.2, the CKS values will be ignored. */
11192
    if (!IsAtLeastTLSv1_3(ssl->version)) {
11193
        ssl->sigSpec = NULL;
11194
        ssl->sigSpecSz = 0;
11195
        return 0;
11196
    }
11197
11198
    /* Extension data is valid, but if we are the server and we don't have an
11199
     * alt private key, do not respond with CKS extension. */
11200
    if (wolfSSL_is_server(ssl) && ssl->buffers.altKey == NULL) {
11201
        ssl->sigSpec = NULL;
11202
        ssl->sigSpecSz = 0;
11203
        return 0;
11204
    }
11205
11206
    /* Copy as the lifetime of input seems to be ephemeral. */
11207
    ssl->peerSigSpec = (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_TLSX);
11208
    if (ssl->peerSigSpec == NULL) {
11209
        return BUFFER_ERROR;
11210
    }
11211
    XMEMCPY(ssl->peerSigSpec, input, length);
11212
    ssl->peerSigSpecSz = length;
11213
11214
    /* If there is no preference set, use theirs... */
11215
    if (ssl->sigSpec == NULL) {
11216
        ret = wolfSSL_UseCKS(ssl, ssl->peerSigSpec, 1);
11217
        if (ret == WOLFSSL_SUCCESS) {
11218
            ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11219
            TLSX_SetResponse(ssl, TLSX_CKS);
11220
        }
11221
        return ret;
11222
    }
11223
11224
    /* ...otherwise, prioritize our preference. */
11225
    for (i = 0; i < ssl->sigSpecSz; i++) {
11226
        for (j = 0; j < length; j++) {
11227
            if (ssl->sigSpec[i] == input[j]) {
11228
                /* Got the match, set to this one. */
11229
                ret = wolfSSL_UseCKS(ssl, &ssl->sigSpec[i], 1);
11230
                if (ret == WOLFSSL_SUCCESS) {
11231
                    ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11232
                    TLSX_SetResponse(ssl, TLSX_CKS);
11233
                }
11234
                return ret;
11235
            }
11236
        }
11237
    }
11238
11239
    /* No match found. Cannot continue. */
11240
    return MATCH_SUITE_ERROR;
11241
}
11242
#endif /* WOLFSSL_DUAL_ALG_CERTS */
11243
11244
/* Server side KSE processing */
11245
int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
11246
    byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, byte* searched)
11247
{
11248
    TLSX*          extension;
11249
    KeyShareEntry* clientKSE = NULL;
11250
    KeyShareEntry* list = NULL;
11251
    KeyShareEntry* preferredKSE = NULL;
11252
    int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11253
    int rank;
11254
11255
    (void)cipherSuite0;
11256
    (void)cipherSuite;
11257
11258
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11259
        return BAD_FUNC_ARG;
11260
11261
    *searched = 0;
11262
11263
    /* Find the KeyShare extension if it exists. */
11264
    extension = TLSX_Find(extensions, TLSX_KEY_SHARE);
11265
    if (extension != NULL)
11266
        list = (KeyShareEntry*)extension->data;
11267
11268
    if (extension && extension->resp == 1) {
11269
        /* Outside of the async case this path should not be taken. */
11270
        int ret = WC_NO_ERR_TRACE(INCOMPLETE_DATA);
11271
    #ifdef WOLFSSL_ASYNC_CRYPT
11272
        /* in async case make sure key generation is finalized */
11273
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
11274
        if (serverKSE && serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11275
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
11276
                *searched = 1;
11277
            ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11278
        }
11279
        else
11280
    #endif
11281
        {
11282
            ret = INCOMPLETE_DATA;
11283
        }
11284
        return ret;
11285
    }
11286
11287
    /* Use server's preference order. */
11288
    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
11289
        if ((clientKSE->ke == NULL) &&
11290
            (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) &&
11291
            (!WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)))
11292
            continue;
11293
11294
#ifdef WOLFSSL_SM2
11295
        if ((cipherSuite0 == CIPHER_BYTE) &&
11296
            ((cipherSuite == TLS_SM4_GCM_SM3) ||
11297
             (cipherSuite == TLS_SM4_CCM_SM3))) {
11298
           if (clientKSE->group != WOLFSSL_ECC_SM2P256V1) {
11299
               continue;
11300
           }
11301
        }
11302
        else if (clientKSE->group == WOLFSSL_ECC_SM2P256V1) {
11303
           continue;
11304
        }
11305
#endif
11306
11307
        /* Check consistency now - extensions in any order. */
11308
        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions))
11309
            continue;
11310
11311
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(clientKSE->group)) {
11312
            /* Check max value supported. */
11313
            if (clientKSE->group > WOLFSSL_ECC_MAX) {
11314
#ifdef WOLFSSL_HAVE_MLKEM
11315
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) &&
11316
                    !WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group))
11317
#endif
11318
                    continue;
11319
            }
11320
            if (wolfSSL_curve_is_disabled(ssl, clientKSE->group))
11321
                continue;
11322
        }
11323
        if (!TLSX_IsGroupSupported(clientKSE->group))
11324
            continue;
11325
11326
        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
11327
        if (rank == -1)
11328
            continue;
11329
        if (rank < preferredRank) {
11330
            preferredKSE = clientKSE;
11331
            preferredRank = rank;
11332
        }
11333
    }
11334
    *kse = preferredKSE;
11335
    *searched = 1;
11336
    return 0;
11337
}
11338
11339
/* Server side KSE processing */
11340
int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
11341
1.05k
{
11342
1.05k
    int            ret;
11343
1.05k
    TLSX*          extension;
11344
1.05k
    KeyShareEntry* serverKSE;
11345
1.05k
    KeyShareEntry* list = NULL;
11346
11347
1.05k
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11348
0
        return BAD_FUNC_ARG;
11349
11350
1.05k
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11351
1.05k
    if (extension == NULL)
11352
0
        return BAD_STATE_E;
11353
11354
1.05k
    if (clientKSE == NULL) {
11355
#ifdef WOLFSSL_ASYNC_CRYPT
11356
        /* Not necessarily an error. The key may have already been setup. */
11357
        if (extension != NULL && extension->resp == 1) {
11358
            serverKSE = (KeyShareEntry*)extension->data;
11359
            if (serverKSE != NULL) {
11360
                /* in async case make sure key generation is finalized */
11361
                if (serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E))
11362
                    return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11363
                else if (serverKSE->lastRet == 0)
11364
                    return 0;
11365
            }
11366
        }
11367
#endif
11368
0
        return BAD_FUNC_ARG;
11369
0
    }
11370
11371
    /* Generate a new key pair except in the case of PQC KEM because we
11372
     * are going to encapsulate and that does not require us to generate a
11373
     * key pair.
11374
     */
11375
1.05k
    ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
11376
1.05k
    if (ret != 0)
11377
7
        return ret;
11378
11379
1.04k
    if (clientKSE->key == NULL) {
11380
#ifdef WOLFSSL_HAVE_MLKEM
11381
        if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) ||
11382
            WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
11383
            /* Going to need the public key (AKA ciphertext). */
11384
            serverKSE->pubKey = clientKSE->pubKey;
11385
            clientKSE->pubKey = NULL;
11386
            serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11387
            clientKSE->pubKeyLen = 0;
11388
        }
11389
        else
11390
#endif
11391
1.04k
        {
11392
1.04k
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
11393
1.04k
        }
11394
11395
        /* for async do setup of serverKSE below, but return WC_PENDING_E */
11396
1.04k
        if (ret != 0
11397
        #ifdef WOLFSSL_ASYNC_CRYPT
11398
            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
11399
        #endif
11400
1.04k
        ) {
11401
237
            TLSX_KeyShare_FreeAll(list, ssl->heap);
11402
237
            return ret;
11403
237
        }
11404
1.04k
    }
11405
0
    else {
11406
        /* transfer buffers to serverKSE */
11407
0
        serverKSE->key = clientKSE->key;
11408
0
        clientKSE->key = NULL;
11409
0
        serverKSE->keyLen = clientKSE->keyLen;
11410
0
        serverKSE->pubKey = clientKSE->pubKey;
11411
0
        clientKSE->pubKey = NULL;
11412
0
        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11413
0
    #ifndef NO_DH
11414
0
        serverKSE->privKey = clientKSE->privKey;
11415
0
        clientKSE->privKey = NULL;
11416
0
    #endif
11417
0
    }
11418
807
    serverKSE->ke = clientKSE->ke;
11419
807
    serverKSE->keLen = clientKSE->keLen;
11420
807
    clientKSE->ke = NULL;
11421
807
    clientKSE->keLen = 0;
11422
807
    ssl->namedGroup = serverKSE->group;
11423
11424
807
    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
11425
807
    extension->data = (void *)serverKSE;
11426
11427
807
    extension->resp = 1;
11428
807
    return ret;
11429
1.04k
}
11430
11431
/* Ensure there is a key pair that can be used for key exchange.
11432
 *
11433
 * ssl  The SSL/TLS object.
11434
 * doHelloRetry If set to non-zero will do hello_retry
11435
 * returns 0 on success and other values indicate failure.
11436
 */
11437
int TLSX_KeyShare_Establish(WOLFSSL *ssl, int* doHelloRetry)
11438
0
{
11439
0
    int            ret;
11440
0
    KeyShareEntry* clientKSE = NULL;
11441
0
    byte           searched = 0;
11442
11443
0
    *doHelloRetry = 0;
11444
11445
0
    ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, ssl->cipher.cipherSuite0,
11446
0
        ssl->cipher.cipherSuite, &clientKSE, &searched);
11447
0
    if (ret != 0 || !searched)
11448
0
        return ret;
11449
11450
    /* No supported group found - send HelloRetryRequest. */
11451
0
    if (clientKSE == NULL) {
11452
        /* Set KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
11453
0
        *doHelloRetry = 1;
11454
0
        return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
11455
0
    }
11456
11457
0
    return TLSX_KeyShare_Setup(ssl, clientKSE);
11458
0
}
11459
11460
/* Derive the shared secret of the key exchange.
11461
 *
11462
 * ssl  The SSL/TLS object.
11463
 * returns 0 on success and other values indicate failure.
11464
 */
11465
int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
11466
775
{
11467
775
    int            ret;
11468
775
    TLSX*          extension;
11469
775
    KeyShareEntry* list = NULL;
11470
11471
#ifdef WOLFSSL_ASYNC_CRYPT
11472
    ret = wolfSSL_AsyncPop(ssl, NULL);
11473
    /* Check for error */
11474
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) && ret < 0) {
11475
        return ret;
11476
    }
11477
#endif
11478
11479
    /* Find the KeyShare extension if it exists. */
11480
775
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11481
775
    if (extension != NULL)
11482
775
        list = (KeyShareEntry*)extension->data;
11483
11484
775
    if (list == NULL)
11485
0
        return KEY_SHARE_ERROR;
11486
11487
    /* Calculate secret. */
11488
775
    ret = TLSX_KeyShare_Process(ssl, list);
11489
11490
775
    return ret;
11491
775
}
11492
11493
0
#define KS_FREE_ALL  TLSX_KeyShare_FreeAll
11494
#define KS_GET_SIZE  TLSX_KeyShare_GetSize
11495
#define KS_WRITE     TLSX_KeyShare_Write
11496
#define KS_PARSE     TLSX_KeyShare_Parse
11497
11498
#else
11499
11500
#define KS_FREE_ALL(a, b) WC_DO_NOTHING
11501
#define KS_GET_SIZE(a, b)    0
11502
#define KS_WRITE(a, b, c)    0
11503
#define KS_PARSE(a, b, c, d) 0
11504
11505
#endif /* WOLFSSL_TLS13 */
11506
11507
/******************************************************************************/
11508
/* Pre-Shared Key                                                             */
11509
/******************************************************************************/
11510
11511
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
11512
/* Free the pre-shared key dynamic data.
11513
 *
11514
 * list  The linked list of key share entry objects.
11515
 * heap  The heap used for allocation.
11516
 */
11517
static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
11518
{
11519
    PreSharedKey* current;
11520
11521
    while ((current = list) != NULL) {
11522
        list = current->next;
11523
        XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
11524
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
11525
    }
11526
11527
    (void)heap;
11528
}
11529
11530
/* Get the size of the encoded pre shared key extension.
11531
 *
11532
 * list     The linked list of pre-shared key extensions.
11533
 * msgType  The type of the message this extension is being written into.
11534
 * returns the number of bytes of the encoded pre-shared key extension or
11535
 * SANITY_MSG_E to indicate invalid message type.
11536
 */
11537
static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
11538
                                     word16* pSz)
11539
{
11540
    if (msgType == client_hello) {
11541
        /* Length of identities + Length of binders. */
11542
        word16 len = OPAQUE16_LEN + OPAQUE16_LEN;
11543
        while (list != NULL) {
11544
            /* Each entry has: identity, ticket age and binder. */
11545
            len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
11546
                   OPAQUE8_LEN + (word16)list->binderLen;
11547
            list = list->next;
11548
        }
11549
        *pSz += len;
11550
        return 0;
11551
    }
11552
11553
    if (msgType == server_hello) {
11554
        *pSz += OPAQUE16_LEN;
11555
        return 0;
11556
    }
11557
11558
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11559
    return SANITY_MSG_E;
11560
}
11561
11562
/* The number of bytes to be written for the binders.
11563
 *
11564
 * list     The linked list of pre-shared key extensions.
11565
 * msgType  The type of the message this extension is being written into.
11566
 * returns the number of bytes of the encoded pre-shared key extension or
11567
 * SANITY_MSG_E to indicate invalid message type.
11568
 */
11569
int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
11570
                                     word16* pSz)
11571
{
11572
    word16 len;
11573
11574
    if (msgType != client_hello) {
11575
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11576
        return SANITY_MSG_E;
11577
    }
11578
11579
    /* Length of all binders. */
11580
    len = OPAQUE16_LEN;
11581
    while (list != NULL) {
11582
        len += OPAQUE8_LEN + (word16)list->binderLen;
11583
        list = list->next;
11584
    }
11585
11586
    *pSz = len;
11587
    return 0;
11588
}
11589
11590
/* Writes the pre-shared key extension into the output buffer - binders only.
11591
 * Assumes that the the output buffer is big enough to hold data.
11592
 *
11593
 * list     The linked list of key share entries.
11594
 * output   The buffer to write into.
11595
 * msgType  The type of the message this extension is being written into.
11596
 * returns the number of bytes written into the buffer.
11597
 */
11598
int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
11599
                                   byte msgType, word16* pSz)
11600
{
11601
    PreSharedKey* current = list;
11602
    word16 idx = 0;
11603
    word16 lenIdx;
11604
    word16 len;
11605
11606
    if (msgType != client_hello) {
11607
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11608
        return SANITY_MSG_E;
11609
    }
11610
11611
    /* Skip length of all binders. */
11612
    lenIdx = idx;
11613
    idx += OPAQUE16_LEN;
11614
    while (current != NULL) {
11615
        /* Binder data length. */
11616
        output[idx++] = (byte)current->binderLen;
11617
        /* Binder data. */
11618
        XMEMCPY(output + idx, current->binder, current->binderLen);
11619
        idx += (word16)current->binderLen;
11620
11621
        current = current->next;
11622
    }
11623
    /* Length of the binders. */
11624
    len = idx - lenIdx - OPAQUE16_LEN;
11625
    c16toa(len, output + lenIdx);
11626
11627
    *pSz = idx;
11628
    return 0;
11629
}
11630
11631
11632
/* Writes the pre-shared key extension into the output buffer.
11633
 * Assumes that the the output buffer is big enough to hold data.
11634
 *
11635
 * list     The linked list of key share entries.
11636
 * output   The buffer to write into.
11637
 * msgType  The type of the message this extension is being written into.
11638
 * returns the number of bytes written into the buffer.
11639
 */
11640
static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
11641
                                   byte msgType, word16* pSz)
11642
{
11643
    if (msgType == client_hello) {
11644
        PreSharedKey* current = list;
11645
        word16 idx = 0;
11646
        word16 lenIdx;
11647
        word16 len;
11648
        int ret;
11649
11650
        /* Write identities only. Binders after HMACing over this. */
11651
        lenIdx = idx;
11652
        idx += OPAQUE16_LEN;
11653
        while (current != NULL) {
11654
            /* Identity length */
11655
            c16toa(current->identityLen, output + idx);
11656
            idx += OPAQUE16_LEN;
11657
            /* Identity data */
11658
            XMEMCPY(output + idx, current->identity, current->identityLen);
11659
            idx += current->identityLen;
11660
11661
            /* Obfuscated ticket age. */
11662
            c32toa(current->ticketAge, output + idx);
11663
            idx += OPAQUE32_LEN;
11664
11665
            current = current->next;
11666
        }
11667
        /* Length of the identities. */
11668
        len = idx - lenIdx - OPAQUE16_LEN;
11669
        c16toa(len, output + lenIdx);
11670
11671
        /* Don't include binders here.
11672
         * The binders are based on the hash of all the ClientHello data up to
11673
         * and include the identities written above.
11674
         */
11675
        ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
11676
        if (ret < 0)
11677
            return ret;
11678
        *pSz += idx + len;
11679
    }
11680
    else if (msgType == server_hello) {
11681
        word16 i;
11682
11683
        /* Find the index of the chosen identity. */
11684
        for (i=0; list != NULL && !list->chosen; i++)
11685
            list = list->next;
11686
        if (list == NULL) {
11687
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
11688
            return BUILD_MSG_ERROR;
11689
        }
11690
11691
        /* The index of the identity chosen by the server from the list supplied
11692
         * by the client.
11693
         */
11694
        c16toa(i, output);
11695
        *pSz += OPAQUE16_LEN;
11696
    }
11697
    else {
11698
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11699
        return SANITY_MSG_E;
11700
    }
11701
11702
    return 0;
11703
}
11704
11705
int TLSX_PreSharedKey_Parse_ClientHello(TLSX** extensions, const byte* input,
11706
                                        word16 length, void* heap)
11707
{
11708
11709
    int    ret;
11710
    word16 len;
11711
    word16 idx = 0;
11712
    TLSX*         extension;
11713
    PreSharedKey* list;
11714
11715
    TLSX_Remove(extensions, TLSX_PRE_SHARED_KEY, heap);
11716
11717
    /* Length of identities and of binders. */
11718
    if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
11719
        return BUFFER_E;
11720
11721
    /* Length of identities. */
11722
    ato16(input + idx, &len);
11723
    idx += OPAQUE16_LEN;
11724
    if (len < MIN_PSK_ID_LEN || length - idx < len)
11725
        return BUFFER_E;
11726
11727
    /* Create a pre-shared key object for each identity. */
11728
    while (len > 0) {
11729
        const byte* identity;
11730
        word16      identityLen;
11731
        word32      age;
11732
11733
        if (len < OPAQUE16_LEN)
11734
            return BUFFER_E;
11735
11736
        /* Length of identity. */
11737
        ato16(input + idx, &identityLen);
11738
        idx += OPAQUE16_LEN;
11739
        if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
11740
                identityLen > MAX_PSK_ID_LEN)
11741
            return BUFFER_E;
11742
        /* Cache identity pointer. */
11743
        identity = input + idx;
11744
        idx += identityLen;
11745
        /* Ticket age. */
11746
        ato32(input + idx, &age);
11747
        idx += OPAQUE32_LEN;
11748
11749
        ret = TLSX_PreSharedKey_Use(extensions, identity, identityLen, age, no_mac,
11750
                                    0, 0, 1, NULL, heap);
11751
        if (ret != 0)
11752
            return ret;
11753
11754
        /* Done with this identity. */
11755
        len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
11756
    }
11757
11758
    /* Find the list of identities sent to server. */
11759
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11760
    if (extension == NULL)
11761
        return PSK_KEY_ERROR;
11762
    list = (PreSharedKey*)extension->data;
11763
11764
    /* Length of binders. */
11765
    if (idx + OPAQUE16_LEN > length)
11766
        return BUFFER_E;
11767
    ato16(input + idx, &len);
11768
    idx += OPAQUE16_LEN;
11769
    if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
11770
        return BUFFER_E;
11771
11772
    /* Set binder for each identity. */
11773
    while (list != NULL && len > 0) {
11774
        /* Length of binder */
11775
        list->binderLen = input[idx++];
11776
        if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
11777
                list->binderLen > WC_MAX_DIGEST_SIZE)
11778
            return BUFFER_E;
11779
        if (len < OPAQUE8_LEN + list->binderLen)
11780
            return BUFFER_E;
11781
11782
        /* Copy binder into static buffer. */
11783
        XMEMCPY(list->binder, input + idx, list->binderLen);
11784
        idx += (word16)list->binderLen;
11785
11786
        /* Done with binder entry. */
11787
        len -= OPAQUE8_LEN + (word16)list->binderLen;
11788
11789
        /* Next identity. */
11790
        list = list->next;
11791
    }
11792
    if (list != NULL || len != 0)
11793
        return BUFFER_E;
11794
11795
    return 0;
11796
11797
}
11798
11799
/* Parse the pre-shared key extension.
11800
 * Different formats in different messages.
11801
 *
11802
 * ssl      The SSL/TLS object.
11803
 * input    The extension data.
11804
 * length   The length of the extension data.
11805
 * msgType  The type of the message this extension is being parsed from.
11806
 * returns 0 on success and other values indicate failure.
11807
 */
11808
static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, const byte* input,
11809
                                   word16 length, byte msgType)
11810
{
11811
11812
    if (msgType == client_hello) {
11813
        return TLSX_PreSharedKey_Parse_ClientHello(&ssl->extensions, input,
11814
                                                   length, ssl->heap);
11815
    }
11816
11817
    if (msgType == server_hello) {
11818
        word16 idx;
11819
        PreSharedKey* list;
11820
        TLSX*         extension;
11821
11822
        /* Index of identity chosen by server. */
11823
        if (length != OPAQUE16_LEN)
11824
            return BUFFER_E;
11825
        ato16(input, &idx);
11826
11827
    #ifdef WOLFSSL_EARLY_DATA
11828
        ssl->options.pskIdIndex = idx + 1;
11829
    #endif
11830
11831
        /* Find the list of identities sent to server. */
11832
        extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
11833
        if (extension == NULL)
11834
            return INCOMPLETE_DATA;
11835
        list = (PreSharedKey*)extension->data;
11836
11837
        /* Mark the identity as chosen. */
11838
        for (; list != NULL && idx > 0; idx--)
11839
            list = list->next;
11840
        if (list == NULL) {
11841
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
11842
            return PSK_KEY_ERROR;
11843
        }
11844
        list->chosen = 1;
11845
11846
    #ifdef HAVE_SESSION_TICKET
11847
        if (list->resumption) {
11848
           /* Check that the session's details are the same as the server's. */
11849
           if (ssl->options.cipherSuite0  != ssl->session->cipherSuite0       ||
11850
               ssl->options.cipherSuite   != ssl->session->cipherSuite        ||
11851
               ssl->session->version.major != ssl->ctx->method->version.major ||
11852
               ssl->session->version.minor != ssl->ctx->method->version.minor) {
11853
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
11854
               return PSK_KEY_ERROR;
11855
           }
11856
        }
11857
    #endif
11858
11859
        return 0;
11860
    }
11861
11862
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11863
    return SANITY_MSG_E;
11864
}
11865
11866
/* Create a new pre-shared key and put it into the list.
11867
 *
11868
 * list          The linked list of pre-shared key.
11869
 * identity      The identity.
11870
 * len           The length of the identity data.
11871
 * heap          The memory to allocate with.
11872
 * preSharedKey  The new pre-shared key object.
11873
 * returns 0 on success and other values indicate failure.
11874
 */
11875
static int TLSX_PreSharedKey_New(PreSharedKey** list, const byte* identity,
11876
                                 word16 len, void *heap,
11877
                                 PreSharedKey** preSharedKey)
11878
{
11879
    PreSharedKey* psk;
11880
    PreSharedKey** next;
11881
11882
    psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
11883
    if (psk == NULL)
11884
        return MEMORY_E;
11885
    XMEMSET(psk, 0, sizeof(*psk));
11886
11887
    /* Make a copy of the identity data. */
11888
    psk->identity = (byte*)XMALLOC(len + NULL_TERM_LEN, heap,
11889
                                   DYNAMIC_TYPE_TLSX);
11890
    if (psk->identity == NULL) {
11891
        XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
11892
        return MEMORY_E;
11893
    }
11894
    XMEMCPY(psk->identity, identity, len);
11895
    psk->identityLen = len;
11896
    /* Use a NULL terminator in case it is a C string */
11897
    psk->identity[psk->identityLen] = '\0';
11898
11899
    /* Add it to the end and maintain the links. */
11900
    while (*list != NULL) {
11901
        /* Assign to temporary to work around compiler bug found by customer. */
11902
        next = &((*list)->next);
11903
        list = next;
11904
    }
11905
    *list = psk;
11906
    *preSharedKey = psk;
11907
11908
    (void)heap;
11909
11910
    return 0;
11911
}
11912
11913
static WC_INLINE byte GetHmacLength(int hmac)
11914
{
11915
    switch (hmac) {
11916
    #ifndef NO_SHA256
11917
        case sha256_mac:
11918
            return WC_SHA256_DIGEST_SIZE;
11919
    #endif
11920
    #ifdef WOLFSSL_SHA384
11921
        case sha384_mac:
11922
            return WC_SHA384_DIGEST_SIZE;
11923
    #endif
11924
    #ifdef WOLFSSL_SHA512
11925
        case sha512_mac:
11926
            return WC_SHA512_DIGEST_SIZE;
11927
    #endif
11928
    #ifdef WOLFSSL_SM3
11929
        case sm3_mac:
11930
            return WC_SM3_DIGEST_SIZE;
11931
    #endif
11932
        default:
11933
            break;
11934
    }
11935
    return 0;
11936
}
11937
11938
/* Use the data to create a new pre-shared key object in the extensions.
11939
 *
11940
 * ssl           The SSL/TLS object.
11941
 * identity      The identity.
11942
 * len           The length of the identity data.
11943
 * age           The age of the identity.
11944
 * hmac          The HMAC algorithm.
11945
 * cipherSuite0  The first byte of the cipher suite to use.
11946
 * cipherSuite   The second byte of the cipher suite to use.
11947
 * resumption    The PSK is for resumption of a session.
11948
 * preSharedKey  The new pre-shared key object.
11949
 * returns 0 on success and other values indicate failure.
11950
 */
11951
int TLSX_PreSharedKey_Use(TLSX** extensions, const byte* identity, word16 len,
11952
                          word32 age, byte hmac, byte cipherSuite0,
11953
                          byte cipherSuite, byte resumption,
11954
                          PreSharedKey **preSharedKey, void* heap)
11955
{
11956
    int           ret = 0;
11957
    TLSX*         extension;
11958
    PreSharedKey* psk = NULL;
11959
11960
    /* Find the pre-shared key extension if it exists. */
11961
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11962
    if (extension == NULL) {
11963
        /* Push new pre-shared key extension. */
11964
        ret = TLSX_Push(extensions, TLSX_PRE_SHARED_KEY, NULL, heap);
11965
        if (ret != 0)
11966
            return ret;
11967
11968
        extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11969
        if (extension == NULL)
11970
            return MEMORY_E;
11971
    }
11972
11973
    /* Try to find the pre-shared key with this identity. */
11974
    psk = (PreSharedKey*)extension->data;
11975
    while (psk != NULL) {
11976
        if ((psk->identityLen == len) &&
11977
               (XMEMCMP(psk->identity, identity, len) == 0)) {
11978
            break;
11979
        }
11980
        psk = psk->next;
11981
    }
11982
11983
    /* Create a new pre-shared key object if not found. */
11984
    if (psk == NULL) {
11985
        ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
11986
                                    len, heap, &psk);
11987
        if (ret != 0)
11988
            return ret;
11989
    }
11990
11991
    /* Update/set age and HMAC algorithm. */
11992
    psk->ticketAge    = age;
11993
    psk->hmac         = hmac;
11994
    psk->cipherSuite0 = cipherSuite0;
11995
    psk->cipherSuite  = cipherSuite;
11996
    psk->resumption   = resumption;
11997
    psk->binderLen    = GetHmacLength(psk->hmac);
11998
11999
    if (preSharedKey != NULL)
12000
        *preSharedKey = psk;
12001
12002
    return 0;
12003
}
12004
12005
#define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
12006
#define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
12007
#define PSK_WRITE     TLSX_PreSharedKey_Write
12008
#define PSK_PARSE     TLSX_PreSharedKey_Parse
12009
12010
#else
12011
12012
#define PSK_FREE_ALL(a, b) WC_DO_NOTHING
12013
#define PSK_GET_SIZE(a, b, c) 0
12014
#define PSK_WRITE(a, b, c, d) 0
12015
#define PSK_PARSE(a, b, c, d) 0
12016
12017
#endif
12018
12019
/******************************************************************************/
12020
/* PSK Key Exchange Modes                                                     */
12021
/******************************************************************************/
12022
12023
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
12024
/* Get the size of the encoded PSK KE modes extension.
12025
 * Only in ClientHello.
12026
 *
12027
 * modes    The PSK KE mode bit string.
12028
 * msgType  The type of the message this extension is being written into.
12029
 * returns the number of bytes of the encoded PSK KE mode extension.
12030
 */
12031
static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
12032
{
12033
    if (msgType == client_hello) {
12034
        /* Format: Len | Modes* */
12035
        word16 len = OPAQUE8_LEN;
12036
        /* Check whether each possible mode is to be written. */
12037
        if (modes & (1 << PSK_KE))
12038
            len += OPAQUE8_LEN;
12039
        if (modes & (1 << PSK_DHE_KE))
12040
            len += OPAQUE8_LEN;
12041
        *pSz += len;
12042
        return 0;
12043
    }
12044
12045
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12046
    return SANITY_MSG_E;
12047
}
12048
12049
/* Writes the PSK KE modes extension into the output buffer.
12050
 * Assumes that the the output buffer is big enough to hold data.
12051
 * Only in ClientHello.
12052
 *
12053
 * modes    The PSK KE mode bit string.
12054
 * output   The buffer to write into.
12055
 * msgType  The type of the message this extension is being written into.
12056
 * returns the number of bytes written into the buffer.
12057
 */
12058
static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
12059
                                 word16* pSz)
12060
{
12061
    if (msgType == client_hello) {
12062
        /* Format: Len | Modes* */
12063
        word16 idx = OPAQUE8_LEN;
12064
12065
        /* Write out each possible mode. */
12066
        if (modes & (1 << PSK_KE))
12067
            output[idx++] = PSK_KE;
12068
        if (modes & (1 << PSK_DHE_KE))
12069
            output[idx++] = PSK_DHE_KE;
12070
        /* Write out length of mode list. */
12071
        output[0] = (byte)(idx - OPAQUE8_LEN);
12072
12073
        *pSz += idx;
12074
        return 0;
12075
    }
12076
12077
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12078
    return SANITY_MSG_E;
12079
}
12080
12081
int TLSX_PskKeyModes_Parse_Modes(const byte* input, word16 length, byte msgType,
12082
                                byte* modes)
12083
{
12084
    if (msgType == client_hello) {
12085
        /* Format: Len | Modes* */
12086
        int   idx = 0;
12087
        word16 len;
12088
        *modes = 0;
12089
12090
        /* Ensure length byte exists. */
12091
        if (length < OPAQUE8_LEN)
12092
            return BUFFER_E;
12093
12094
        /* Get length of mode list and ensure that is the only data. */
12095
        len = input[0];
12096
        if (length - OPAQUE8_LEN != len)
12097
            return BUFFER_E;
12098
12099
        idx = OPAQUE8_LEN;
12100
        /* Set a bit for each recognized modes. */
12101
        while (len > 0) {
12102
            /* Ignore unrecognized modes.  */
12103
            if (input[idx] <= PSK_DHE_KE)
12104
               *modes |= 1 << input[idx];
12105
            idx++;
12106
            len--;
12107
        }
12108
        return 0;
12109
    }
12110
12111
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12112
    return SANITY_MSG_E;
12113
}
12114
12115
/* Parse the PSK KE modes extension.
12116
 * Only in ClientHello.
12117
 *
12118
 * ssl      The SSL/TLS object.
12119
 * input    The extension data.
12120
 * length   The length of the extension data.
12121
 * msgType  The type of the message this extension is being parsed from.
12122
 * returns 0 on success and other values indicate failure.
12123
 */
12124
static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, const byte* input, word16 length,
12125
                                 byte msgType)
12126
{
12127
    int    ret;
12128
    byte modes;
12129
12130
    ret = TLSX_PskKeyModes_Parse_Modes(input, length, msgType, &modes);
12131
    if (ret == 0)
12132
        ret = TLSX_PskKeyModes_Use(ssl, modes);
12133
12134
    if (ret != 0) {
12135
        WOLFSSL_ERROR_VERBOSE(ret);
12136
    }
12137
12138
    return ret;
12139
}
12140
12141
/* Use the data to create a new PSK Key Exchange Modes object in the extensions.
12142
 *
12143
 * ssl    The SSL/TLS object.
12144
 * modes  The PSK key exchange modes.
12145
 * returns 0 on success and other values indicate failure.
12146
 */
12147
int TLSX_PskKeyModes_Use(WOLFSSL* ssl, byte modes)
12148
{
12149
    int           ret = 0;
12150
    TLSX*         extension;
12151
12152
    /* Find the PSK key exchange modes extension if it exists. */
12153
    extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
12154
    if (extension == NULL) {
12155
        /* Push new PSK key exchange modes extension. */
12156
        ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
12157
            ssl->heap);
12158
        if (ret != 0)
12159
            return ret;
12160
12161
        extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
12162
        if (extension == NULL)
12163
            return MEMORY_E;
12164
    }
12165
12166
    extension->val = modes;
12167
12168
    return 0;
12169
}
12170
12171
#define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
12172
#define PKM_WRITE     TLSX_PskKeModes_Write
12173
#define PKM_PARSE     TLSX_PskKeModes_Parse
12174
12175
#else
12176
12177
#define PKM_GET_SIZE(a, b, c) 0
12178
#define PKM_WRITE(a, b, c, d) 0
12179
#define PKM_PARSE(a, b, c, d) 0
12180
12181
#endif
12182
12183
/******************************************************************************/
12184
/* Post-Handshake Authentication                                              */
12185
/******************************************************************************/
12186
12187
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
12188
/* Get the size of the encoded Post-Handshake Authentication extension.
12189
 * Only in ClientHello.
12190
 *
12191
 * msgType  The type of the message this extension is being written into.
12192
 * returns the number of bytes of the encoded Post-Handshake Authentication
12193
 * extension.
12194
 */
12195
static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
12196
{
12197
    if (msgType == client_hello) {
12198
        *pSz += 0;
12199
        return 0;
12200
    }
12201
12202
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12203
    return SANITY_MSG_E;
12204
}
12205
12206
/* Writes the Post-Handshake Authentication extension into the output buffer.
12207
 * Assumes that the the output buffer is big enough to hold data.
12208
 * Only in ClientHello.
12209
 *
12210
 * output   The buffer to write into.
12211
 * msgType  The type of the message this extension is being written into.
12212
 * returns the number of bytes written into the buffer.
12213
 */
12214
static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
12215
{
12216
    (void)output;
12217
12218
    if (msgType == client_hello) {
12219
        *pSz += 0;
12220
        return 0;
12221
    }
12222
12223
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12224
    return SANITY_MSG_E;
12225
}
12226
12227
/* Parse the Post-Handshake Authentication extension.
12228
 * Only in ClientHello.
12229
 *
12230
 * ssl      The SSL/TLS object.
12231
 * input    The extension data.
12232
 * length   The length of the extension data.
12233
 * msgType  The type of the message this extension is being parsed from.
12234
 * returns 0 on success and other values indicate failure.
12235
 */
12236
static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, const byte* input,
12237
                                   word16 length, byte msgType)
12238
{
12239
    (void)input;
12240
12241
    if (msgType == client_hello) {
12242
        /* Ensure extension is empty. */
12243
        if (length != 0)
12244
            return BUFFER_E;
12245
12246
        ssl->options.postHandshakeAuth = 1;
12247
        return 0;
12248
    }
12249
12250
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12251
    return SANITY_MSG_E;
12252
}
12253
12254
/* Create a new Post-handshake authentication object in the extensions.
12255
 *
12256
 * ssl    The SSL/TLS object.
12257
 * returns 0 on success and other values indicate failure.
12258
 */
12259
static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
12260
{
12261
    int   ret = 0;
12262
    TLSX* extension;
12263
12264
    /* Find the PSK key exchange modes extension if it exists. */
12265
    extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
12266
    if (extension == NULL) {
12267
        /* Push new Post-handshake Authentication extension. */
12268
        ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
12269
            ssl->heap);
12270
        if (ret != 0)
12271
            return ret;
12272
    }
12273
12274
    return 0;
12275
}
12276
12277
#define PHA_GET_SIZE  TLSX_PostHandAuth_GetSize
12278
#define PHA_WRITE     TLSX_PostHandAuth_Write
12279
#define PHA_PARSE     TLSX_PostHandAuth_Parse
12280
12281
#else
12282
12283
#define PHA_GET_SIZE(a, b)    0
12284
#define PHA_WRITE(a, b, c)    0
12285
#define PHA_PARSE(a, b, c, d) 0
12286
12287
#endif
12288
12289
/******************************************************************************/
12290
/* Early Data Indication                                                      */
12291
/******************************************************************************/
12292
12293
#ifdef WOLFSSL_EARLY_DATA
12294
/* Get the size of the encoded Early Data Indication extension.
12295
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12296
 *
12297
 * msgType  The type of the message this extension is being written into.
12298
 * returns the number of bytes of the encoded Early Data Indication extension.
12299
 */
12300
static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
12301
{
12302
    int ret = 0;
12303
12304
    if (msgType == client_hello || msgType == encrypted_extensions)
12305
        *pSz += 0;
12306
    else if (msgType == session_ticket)
12307
        *pSz += OPAQUE32_LEN;
12308
    else {
12309
        ret = SANITY_MSG_E;
12310
        WOLFSSL_ERROR_VERBOSE(ret);
12311
    }
12312
12313
    return ret;
12314
}
12315
12316
/* Writes the Early Data Indicator extension into the output buffer.
12317
 * Assumes that the the output buffer is big enough to hold data.
12318
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12319
 *
12320
 * maxSz    The maximum early data size.
12321
 * output   The buffer to write into.
12322
 * msgType  The type of the message this extension is being written into.
12323
 * returns the number of bytes written into the buffer.
12324
 */
12325
static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
12326
                                word16* pSz)
12327
{
12328
    if (msgType == client_hello || msgType == encrypted_extensions)
12329
        return 0;
12330
    else if (msgType == session_ticket) {
12331
        c32toa(maxSz, output);
12332
        *pSz += OPAQUE32_LEN;
12333
        return 0;
12334
    }
12335
12336
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12337
    return SANITY_MSG_E;
12338
}
12339
12340
/* Parse the Early Data Indicator extension.
12341
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12342
 *
12343
 * ssl      The SSL/TLS object.
12344
 * input    The extension data.
12345
 * length   The length of the extension data.
12346
 * msgType  The type of the message this extension is being parsed from.
12347
 * returns 0 on success and other values indicate failure.
12348
 */
12349
static int TLSX_EarlyData_Parse(WOLFSSL* ssl, const byte* input, word16 length,
12350
                                 byte msgType)
12351
{
12352
    WOLFSSL_ENTER("TLSX_EarlyData_Parse");
12353
    if (msgType == client_hello) {
12354
        if (length != 0)
12355
            return BUFFER_E;
12356
12357
        if (ssl->earlyData == expecting_early_data) {
12358
12359
            if (ssl->options.maxEarlyDataSz != 0)
12360
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
12361
            else
12362
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
12363
12364
            return TLSX_EarlyData_Use(ssl, 0, 0);
12365
        }
12366
        ssl->earlyData = early_data_ext;
12367
12368
        return 0;
12369
    }
12370
    if (msgType == encrypted_extensions) {
12371
        if (length != 0)
12372
            return BUFFER_E;
12373
12374
        /* Ensure the index of PSK identity chosen by server is 0.
12375
         * Index is plus one to handle 'not set' value of 0.
12376
         */
12377
        if (ssl->options.pskIdIndex != 1) {
12378
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12379
            return PSK_KEY_ERROR;
12380
        }
12381
12382
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
12383
            /* the extension from server comes in */
12384
            ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
12385
        }
12386
12387
        return TLSX_EarlyData_Use(ssl, 1, 1);
12388
    }
12389
    if (msgType == session_ticket) {
12390
        word32 maxSz;
12391
12392
        if (length != OPAQUE32_LEN)
12393
            return BUFFER_E;
12394
        ato32(input, &maxSz);
12395
12396
        ssl->session->maxEarlyDataSz = maxSz;
12397
        return 0;
12398
    }
12399
12400
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12401
    return SANITY_MSG_E;
12402
}
12403
12404
/* Use the data to create a new Early Data object in the extensions.
12405
 *
12406
 * ssl    The SSL/TLS object.
12407
 * maxSz  The maximum early data size.
12408
 * is_response   if this extension is part of a response
12409
 * returns 0 on success and other values indicate failure.
12410
 */
12411
int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz, int is_response)
12412
{
12413
    int   ret = 0;
12414
    TLSX* extension;
12415
12416
    /* Find the early data extension if it exists. */
12417
    extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
12418
    if (extension == NULL) {
12419
        /* Push new early data extension. */
12420
        ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
12421
        if (ret != 0)
12422
            return ret;
12423
12424
        extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
12425
        if (extension == NULL)
12426
            return MEMORY_E;
12427
    }
12428
12429
    extension->resp = is_response;
12430
    /* In QUIC, earlydata size is either 0 or 0xffffffff.
12431
     * Override any size between, possibly left from our initial value */
12432
    extension->val  = (WOLFSSL_IS_QUIC(ssl) && is_response && maxSz > 0) ?
12433
                       WOLFSSL_MAX_32BIT : maxSz;
12434
12435
    return 0;
12436
}
12437
12438
#define EDI_GET_SIZE  TLSX_EarlyData_GetSize
12439
#define EDI_WRITE     TLSX_EarlyData_Write
12440
#define EDI_PARSE     TLSX_EarlyData_Parse
12441
12442
#else
12443
12444
#define EDI_GET_SIZE(a, b)    0
12445
#define EDI_WRITE(a, b, c, d) 0
12446
#define EDI_PARSE(a, b, c, d) 0
12447
12448
#endif
12449
12450
/******************************************************************************/
12451
/* QUIC transport parameter extension                                         */
12452
/******************************************************************************/
12453
#ifdef WOLFSSL_QUIC
12454
12455
static word16 TLSX_QuicTP_GetSize(TLSX* extension)
12456
{
12457
    const QuicTransportParam *tp = (QuicTransportParam*)extension->data;
12458
12459
    return tp ? tp->len : 0;
12460
}
12461
12462
int TLSX_QuicTP_Use(WOLFSSL* ssl, TLSX_Type ext_type, int is_response)
12463
{
12464
    int ret = 0;
12465
    TLSX* extension;
12466
12467
    WOLFSSL_ENTER("TLSX_QuicTP_Use");
12468
    if (ssl->quic.transport_local == NULL) {
12469
        /* RFC9000, ch 7.3: "An endpoint MUST treat the absence of [...]
12470
         *     from either endpoint [...] as a connection error of type
12471
         *     TRANSPORT_PARAMETER_ERROR."
12472
         */
12473
        ret = QUIC_TP_MISSING_E;
12474
        goto cleanup;
12475
    }
12476
12477
    extension = TLSX_Find(ssl->extensions, ext_type);
12478
    if (extension == NULL) {
12479
        ret = TLSX_Push(&ssl->extensions, ext_type, NULL, ssl->heap);
12480
        if (ret != 0)
12481
            goto cleanup;
12482
12483
        extension = TLSX_Find(ssl->extensions, ext_type);
12484
        if (extension == NULL) {
12485
            ret = MEMORY_E;
12486
            goto cleanup;
12487
        }
12488
    }
12489
    if (extension->data) {
12490
        QuicTransportParam_free((QuicTransportParam*)extension->data, ssl->heap);
12491
        extension->data = NULL;
12492
    }
12493
    extension->resp = is_response;
12494
    extension->data = (void*)QuicTransportParam_dup(ssl->quic.transport_local, ssl->heap);
12495
    if (!extension->data) {
12496
        ret = MEMORY_E;
12497
        goto cleanup;
12498
    }
12499
12500
cleanup:
12501
    WOLFSSL_LEAVE("TLSX_QuicTP_Use", ret);
12502
    return ret;
12503
}
12504
12505
static word16 TLSX_QuicTP_Write(QuicTransportParam *tp, byte* output)
12506
{
12507
    word16 len = 0;
12508
12509
    WOLFSSL_ENTER("TLSX_QuicTP_Write");
12510
    if (tp && tp->len) {
12511
        XMEMCPY(output, tp->data, tp->len);
12512
        len = tp->len;
12513
    }
12514
    WOLFSSL_LEAVE("TLSX_QuicTP_Write", len);
12515
    return len;
12516
}
12517
12518
static int TLSX_QuicTP_Parse(WOLFSSL *ssl, const byte *input, size_t len, int ext_type, int msgType)
12519
{
12520
    const QuicTransportParam *tp, **ptp;
12521
12522
    (void)msgType;
12523
    tp = QuicTransportParam_new(input, len, ssl->heap);
12524
    if (!tp) {
12525
        return MEMORY_E;
12526
    }
12527
    ptp = (ext_type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT) ?
12528
        &ssl->quic.transport_peer_draft : &ssl->quic.transport_peer;
12529
    if (*ptp) {
12530
        QTP_FREE(*ptp, ssl->heap);
12531
    }
12532
    *ptp = tp;
12533
    return 0;
12534
}
12535
12536
#define QTP_GET_SIZE    TLSX_QuicTP_GetSize
12537
#define QTP_USE         TLSX_QuicTP_Use
12538
#define QTP_WRITE       TLSX_QuicTP_Write
12539
#define QTP_PARSE       TLSX_QuicTP_Parse
12540
12541
#endif /* WOLFSSL_QUIC */
12542
12543
#if defined(WOLFSSL_DTLS_CID)
12544
#define CID_GET_SIZE  TLSX_ConnectionID_GetSize
12545
#define CID_WRITE  TLSX_ConnectionID_Write
12546
#define CID_PARSE  TLSX_ConnectionID_Parse
12547
#define CID_FREE  TLSX_ConnectionID_Free
12548
#else
12549
#define CID_GET_SIZE(a) 0
12550
#define CID_WRITE(a, b) 0
12551
#define CID_PARSE(a, b, c, d) 0
12552
#define CID_FREE(a, b) 0
12553
#endif /* defined(WOLFSSL_DTLS_CID) */
12554
12555
#if defined(HAVE_RPK)
12556
/******************************************************************************/
12557
/* Client_Certificate_Type extension                                          */
12558
/******************************************************************************/
12559
/* return 1 if specified type is included in the given list, otherwise 0 */
12560
static int IsCertTypeListed(byte type, byte cnt, const byte* list)
12561
{
12562
    int ret = 0;
12563
    int i;
12564
12565
    if (cnt == 0 || list == NULL)
12566
        return ret;
12567
12568
    if (cnt > 0 && cnt <= MAX_CLIENT_CERT_TYPE_CNT) {
12569
        for (i = 0; i < cnt; i++) {
12570
            if (list[i] == type)
12571
                return 1;
12572
        }
12573
    }
12574
    return 0;
12575
}
12576
12577
/* Search both arrays from above to find a common value between the two given
12578
 * arrays(a and b). return 1 if it finds a common value, otherwise return 0.
12579
 */
12580
static int GetCommonItem(const byte* a, byte aLen, const byte* b, byte bLen,
12581
                                                                    byte* type)
12582
{
12583
    int i, j;
12584
12585
    if (a == NULL || b == NULL)
12586
        return 0;
12587
12588
    for (i = 0; i < aLen; i++) {
12589
        for (j = 0; j < bLen; j++) {
12590
            if (a[i] == b[j]) {
12591
                *type = a[i];
12592
                return 1;
12593
            }
12594
        }
12595
    }
12596
    return 0;
12597
}
12598
12599
/* Creates a "client certificate type" extension if necessary.
12600
 * Returns 0 if no error occurred, negative value otherwise.
12601
 * A return of 0, it does not indicae that the extension was created.
12602
 */
12603
static int TLSX_ClientCertificateType_Use(WOLFSSL* ssl, byte isServer)
12604
{
12605
    int ret = 0;
12606
12607
    if (ssl == NULL)
12608
        return BAD_FUNC_ARG;
12609
12610
    if (isServer) {
12611
        /* [in server side]
12612
         */
12613
12614
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12615
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12616
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
12617
12618
            WOLFSSL_MSG("Adding Client Certificate Type extension");
12619
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
12620
                                                                    ssl->heap);
12621
            if (ret == 0) {
12622
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
12623
            }
12624
        }
12625
    }
12626
    else {
12627
        /* [in client side]
12628
         * This extension MUST be omitted from the ClientHello unless the RPK
12629
         * certificate is preferred by the user and actually loaded.
12630
         */
12631
12632
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12633
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12634
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
12635
12636
            if (ssl->options.rpkState.isRPKLoaded) {
12637
12638
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
12639
                ssl->options.rpkState.sending_ClientCertTypes[0] =
12640
                                                        WOLFSSL_CERT_TYPE_RPK;
12641
12642
                /* Push new client_certificate_type extension. */
12643
                WOLFSSL_MSG("Adding Client Certificate Type extension");
12644
                ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE,
12645
                                                                ssl, ssl->heap);
12646
            }
12647
            else {
12648
                WOLFSSL_MSG("Willing to use RPK cert but not loaded it");
12649
            }
12650
        }
12651
        else {
12652
            WOLFSSL_MSG("No will to use RPK cert");
12653
        }
12654
    }
12655
    return ret;
12656
}
12657
12658
/* Parse a "client certificate type" extension received from peer.
12659
 * returns 0 on success and other values indicate failure.
12660
 */
12661
static int TLSX_ClientCertificateType_Parse(WOLFSSL* ssl, const byte* input,
12662
                                                word16 length, byte msgType)
12663
{
12664
    byte typeCnt;
12665
    int idx = 0;
12666
    int ret = 0;
12667
    int i;
12668
    int populate = 0;
12669
    byte  cmnType;
12670
12671
12672
    if (msgType == client_hello) {
12673
        /* [parse ClientHello in server end]
12674
         * case 1) if peer verify is disabled, this extension must be omitted
12675
         *         from ServerHello.
12676
         * case 2) if user have not set his preference, find X509 in parsed
12677
         *         result, then populate "Client Certificate Type" extension.
12678
         * case 3) if user have not set his preference and X509 isn't included
12679
         *         in parsed result, send "unsupported certificate" alert.
12680
         * case 4) if user have set his preference, find a common cert type
12681
         *         in users preference and received cert types.
12682
         * case 5) if user have set his preference, but no common cert type
12683
         *         found.
12684
         */
12685
12686
        /* case 1 */
12687
        if (ssl->options.verifyNone) {
12688
            return ret;
12689
        }
12690
12691
        /* parse extension */
12692
        if (length < OPAQUE8_LEN)
12693
            return BUFFER_E;
12694
12695
        typeCnt = input[idx];
12696
12697
        if (typeCnt > MAX_CLIENT_CERT_TYPE_CNT)
12698
            return BUFFER_E;
12699
12700
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
12701
            return BUFFER_E;
12702
        }
12703
12704
        ssl->options.rpkState.received_ClientCertTypeCnt = input[idx];
12705
        idx += OPAQUE8_LEN;
12706
12707
        for (i = 0; i < typeCnt; i++) {
12708
            ssl->options.rpkState.received_ClientCertTypes[i] = input[idx];
12709
            idx += OPAQUE8_LEN;
12710
        }
12711
12712
        if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt == 0) {
12713
            /* case 2 */
12714
            if (IsCertTypeListed(WOLFSSL_CERT_TYPE_X509,
12715
                            ssl->options.rpkState.received_ClientCertTypeCnt,
12716
                            ssl->options.rpkState.received_ClientCertTypes)) {
12717
12718
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
12719
                ssl->options.rpkState.sending_ClientCertTypes[0] =
12720
                                                        WOLFSSL_CERT_TYPE_X509;
12721
                populate = 1;
12722
            }
12723
            /* case 3 */
12724
            else {
12725
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
12726
                SendAlert(ssl, alert_fatal, unsupported_certificate);
12727
                return UNSUPPORTED_CERTIFICATE;
12728
            }
12729
        }
12730
        else if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt > 0) {
12731
            /* case 4 */
12732
            if (GetCommonItem(
12733
                            ssl->options.rpkConfig.preferred_ClientCertTypes,
12734
                            ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12735
                            ssl->options.rpkState.received_ClientCertTypes,
12736
                            ssl->options.rpkState.received_ClientCertTypeCnt,
12737
                            &cmnType)) {
12738
                ssl->options.rpkState.sending_ClientCertTypeCnt  = 1;
12739
                ssl->options.rpkState.sending_ClientCertTypes[0] = cmnType;
12740
                populate = 1;
12741
            }
12742
            /* case 5 */
12743
            else {
12744
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
12745
                SendAlert(ssl, alert_fatal, unsupported_certificate);
12746
                return UNSUPPORTED_CERTIFICATE;
12747
            }
12748
        }
12749
12750
        /* populate client_certificate_type extension */
12751
        if (populate) {
12752
            WOLFSSL_MSG("Adding Client Certificate Type extension");
12753
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
12754
                                                                    ssl->heap);
12755
            if (ret == 0) {
12756
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
12757
            }
12758
        }
12759
    }
12760
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12761
        /* parse it in client side */
12762
        if (length == 1) {
12763
            ssl->options.rpkState.received_ClientCertTypeCnt  = 1;
12764
            ssl->options.rpkState.received_ClientCertTypes[0] = *input;
12765
        }
12766
        else {
12767
            return BUFFER_E;
12768
        }
12769
    }
12770
12771
    return ret;
12772
}
12773
12774
/* Write out the "client certificate type" extension data into the given buffer.
12775
 * return the size wrote in the buffer on success, negative value on error.
12776
 */
12777
static word16 TLSX_ClientCertificateType_Write(void* data, byte* output,
12778
                                              byte msgType)
12779
{
12780
    WOLFSSL* ssl = (WOLFSSL*)data;
12781
    word16 idx = 0;
12782
    byte cnt = 0;
12783
    int i;
12784
12785
    /* skip to write extension if count is zero */
12786
    cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
12787
12788
    if (cnt == 0)
12789
        return 0;
12790
12791
    if (msgType == client_hello) {
12792
        /* client side */
12793
12794
        *(output + idx) = cnt;
12795
        idx += OPAQUE8_LEN;
12796
12797
        for (i = 0; i < cnt; i++) {
12798
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[i];
12799
            idx += OPAQUE8_LEN;
12800
        }
12801
        return idx;
12802
    }
12803
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12804
        /* sever side */
12805
        if (cnt == 1) {
12806
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[0];
12807
            idx += OPAQUE8_LEN;
12808
        }
12809
    }
12810
    return idx;
12811
}
12812
12813
/* Calculate then return the size of the "client certificate type" extension
12814
 * data.
12815
 * return the extension data size on success, negative value on error.
12816
*/
12817
static int TLSX_ClientCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
12818
{
12819
    int ret = 0;
12820
    byte cnt;
12821
12822
    if (ssl == NULL)
12823
        return BAD_FUNC_ARG;
12824
12825
    if (msgType == client_hello) {
12826
        /* client side */
12827
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
12828
        ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
12829
    }
12830
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12831
        /* server side */
12832
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;/* must be one */
12833
        if (cnt != 1)
12834
            return SANITY_MSG_E;
12835
        ret = OPAQUE8_LEN;
12836
    }
12837
    else {
12838
        return SANITY_MSG_E;
12839
    }
12840
    return ret;
12841
}
12842
12843
    #define CCT_GET_SIZE  TLSX_ClientCertificateType_GetSize
12844
    #define CCT_WRITE     TLSX_ClientCertificateType_Write
12845
    #define CCT_PARSE     TLSX_ClientCertificateType_Parse
12846
#else
12847
    #define CCT_GET_SIZE(a)  0
12848
    #define CCT_WRITE(a, b)  0
12849
    #define CCT_PARSE(a, b, c, d) 0
12850
#endif /* HAVE_RPK */
12851
12852
#if defined(HAVE_RPK)
12853
/******************************************************************************/
12854
/* Server_Certificate_Type extension                                          */
12855
/******************************************************************************/
12856
/* Creates a "server certificate type" extension if necessary.
12857
 * Returns 0 if no error occurred, negative value otherwise.
12858
 * A return of 0, it does not indicae that the extension was created.
12859
 */
12860
static int TLSX_ServerCertificateType_Use(WOLFSSL* ssl, byte isServer)
12861
{
12862
    int ret = 0;
12863
    byte ctype;
12864
12865
    if (ssl == NULL)
12866
        return BAD_FUNC_ARG;
12867
12868
    if (isServer) {
12869
        /* [in server side] */
12870
        /* find common cert type to both end */
12871
        if (GetCommonItem(
12872
                ssl->options.rpkConfig.preferred_ServerCertTypes,
12873
                ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
12874
                ssl->options.rpkState.received_ServerCertTypes,
12875
                ssl->options.rpkState.received_ServerCertTypeCnt,
12876
                &ctype)) {
12877
            ssl->options.rpkState.sending_ServerCertTypeCnt = 1;
12878
            ssl->options.rpkState.sending_ServerCertTypes[0] = ctype;
12879
12880
            /* Push new server_certificate_type extension. */
12881
            WOLFSSL_MSG("Adding Server Certificate Type extension");
12882
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
12883
                                                                    ssl->heap);
12884
            if (ret == 0) {
12885
                TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
12886
            }
12887
        }
12888
        else {
12889
            /* no common cert type found */
12890
            WOLFSSL_MSG("No common cert type found in server_certificate_type ext");
12891
            SendAlert(ssl, alert_fatal, unsupported_certificate);
12892
            ret = UNSUPPORTED_CERTIFICATE;
12893
        }
12894
    }
12895
    else {
12896
        /* [in client side] */
12897
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12898
                            ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
12899
                            ssl->options.rpkConfig.preferred_ServerCertTypes)) {
12900
12901
            ssl->options.rpkState.sending_ServerCertTypeCnt =
12902
                        ssl->options.rpkConfig.preferred_ServerCertTypeCnt;
12903
            XMEMCPY(ssl->options.rpkState.sending_ServerCertTypes,
12904
                    ssl->options.rpkConfig.preferred_ServerCertTypes,
12905
                    ssl->options.rpkConfig.preferred_ServerCertTypeCnt);
12906
12907
            /* Push new server_certificate_type extension. */
12908
            WOLFSSL_MSG("Adding Server Certificate Type extension");
12909
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
12910
                                                                    ssl->heap);
12911
        }
12912
        else {
12913
            WOLFSSL_MSG("No will to accept RPK cert");
12914
        }
12915
    }
12916
12917
    return ret;
12918
}
12919
12920
/* Parse a "server certificate type" extension received from peer.
12921
 * returns 0 on success and other values indicate failure.
12922
 */
12923
static int TLSX_ServerCertificateType_Parse(WOLFSSL* ssl, const byte* input,
12924
                                                word16 length, byte msgType)
12925
{
12926
    byte typeCnt;
12927
    int idx = 0;
12928
    int ret = 0;
12929
    int i;
12930
12931
    if (msgType == client_hello) {
12932
        /* in server side */
12933
12934
        if (length < OPAQUE8_LEN)
12935
            return BUFFER_E;
12936
12937
        typeCnt = input[idx];
12938
12939
        if (typeCnt > MAX_SERVER_CERT_TYPE_CNT)
12940
            return BUFFER_E;
12941
12942
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
12943
            return BUFFER_E;
12944
        }
12945
        ssl->options.rpkState.received_ServerCertTypeCnt = input[idx];
12946
        idx += OPAQUE8_LEN;
12947
12948
        for (i = 0; i < typeCnt; i++) {
12949
            ssl->options.rpkState.received_ServerCertTypes[i] = input[idx];
12950
            idx += OPAQUE8_LEN;
12951
        }
12952
12953
        ret = TLSX_ServerCertificateType_Use(ssl, 1);
12954
        if (ret == 0) {
12955
            TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
12956
        }
12957
    }
12958
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12959
        /* in client side */
12960
        if (length != 1)                     /* length slould be 1 */
12961
            return BUFFER_E;
12962
12963
        ssl->options.rpkState.received_ServerCertTypeCnt  = 1;
12964
        ssl->options.rpkState.received_ServerCertTypes[0] = *input;
12965
    }
12966
12967
    return 0;
12968
}
12969
12970
/* Write out the "server certificate type" extension data into the given buffer.
12971
 * return the size wrote in the buffer on success, negative value on error.
12972
 */
12973
static word16 TLSX_ServerCertificateType_Write(void* data, byte* output,
12974
                                                                byte msgType)
12975
{
12976
    WOLFSSL* ssl = (WOLFSSL*)data;
12977
    word16 idx = 0;
12978
    int cnt = 0;
12979
    int i;
12980
12981
    /* skip to write extension if count is zero */
12982
    cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
12983
12984
    if (cnt == 0)
12985
        return 0;
12986
12987
    if (msgType == client_hello) {
12988
        /* in client side */
12989
12990
        *(output + idx) = cnt;
12991
        idx += OPAQUE8_LEN;
12992
12993
        for (i = 0; i < cnt; i++) {
12994
            *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[i];
12995
            idx += OPAQUE8_LEN;
12996
        }
12997
    }
12998
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12999
        /* in server side */
13000
        /* ensure cnt is one */
13001
        if (cnt != 1)
13002
            return 0;
13003
13004
        *(output + idx) =  ssl->options.rpkState.sending_ServerCertTypes[0];
13005
        idx += OPAQUE8_LEN;
13006
    }
13007
    return idx;
13008
}
13009
13010
/* Calculate then return the size of the "server certificate type" extension
13011
 * data.
13012
 * return the extension data size on success, negative value on error.
13013
*/
13014
static int TLSX_ServerCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
13015
{
13016
    int ret = 0;
13017
    int cnt;
13018
13019
    if (ssl == NULL)
13020
        return BAD_FUNC_ARG;
13021
13022
    if (msgType == client_hello) {
13023
        /* in clent side */
13024
        cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
13025
        if (cnt > 0) {
13026
            ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
13027
        }
13028
    }
13029
    else if (msgType == server_hello || msgType == encrypted_extensions) {
13030
        /* in server side */
13031
        ret = (int)OPAQUE8_LEN;
13032
    }
13033
    else {
13034
        return SANITY_MSG_E;
13035
    }
13036
    return ret;
13037
}
13038
13039
    #define SCT_GET_SIZE  TLSX_ServerCertificateType_GetSize
13040
    #define SCT_WRITE     TLSX_ServerCertificateType_Write
13041
    #define SCT_PARSE     TLSX_ServerCertificateType_Parse
13042
#else
13043
    #define SCT_GET_SIZE(a)  0
13044
    #define SCT_WRITE(a, b)  0
13045
    #define SCT_PARSE(a, b, c, d) 0
13046
#endif /* HAVE_RPK */
13047
13048
/******************************************************************************/
13049
/* TLS Extensions Framework                                                   */
13050
/******************************************************************************/
13051
13052
/** Finds an extension in the provided list. */
13053
TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
13054
586k
{
13055
586k
    TLSX* extension = list;
13056
13057
1.20M
    while (extension && extension->type != type)
13058
619k
        extension = extension->next;
13059
13060
586k
    return extension;
13061
586k
}
13062
13063
/** Remove an extension. */
13064
void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
13065
6.38k
{
13066
6.38k
    TLSX* extension;
13067
6.38k
    TLSX** next;
13068
13069
6.38k
    if (list == NULL)
13070
0
        return;
13071
13072
6.38k
    extension = *list;
13073
6.38k
    next = list;
13074
13075
48.3k
    while (extension && extension->type != type) {
13076
41.9k
        next = &extension->next;
13077
41.9k
        extension = extension->next;
13078
41.9k
    }
13079
13080
6.38k
    if (extension) {
13081
71
        *next = extension->next;
13082
71
        extension->next = NULL;
13083
71
        TLSX_FreeAll(extension, heap);
13084
71
    }
13085
6.38k
}
13086
13087
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13088
#define GREASE_ECH_SIZE 160
13089
#define MAX_PUBLIC_NAME_SZ 256
13090
#define TLS_INFO_CONST_STRING "tls ech"
13091
#define TLS_INFO_CONST_STRING_SZ 7
13092
13093
/* return status after setting up ech to write a grease ech */
13094
static int TLSX_GreaseECH_Use(TLSX** extensions, void* heap, WC_RNG* rng)
13095
{
13096
    int ret = 0;
13097
    WOLFSSL_ECH* ech;
13098
13099
    if (extensions == NULL)
13100
        return BAD_FUNC_ARG;
13101
13102
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13103
        DYNAMIC_TYPE_TMP_BUFFER);
13104
13105
    if (ech == NULL)
13106
        return MEMORY_E;
13107
13108
    ForceZero(ech, sizeof(WOLFSSL_ECH));
13109
13110
    ech->state = ECH_WRITE_GREASE;
13111
13112
    /* 0 for outer */
13113
    ech->type = ECH_TYPE_OUTER;
13114
    /* kemId */
13115
    ech->kemId = DHKEM_X25519_HKDF_SHA256;
13116
    /* cipherSuite kdf */
13117
    ech->cipherSuite.kdfId = HKDF_SHA256;
13118
    /* cipherSuite aead */
13119
    ech->cipherSuite.aeadId = HPKE_AES_128_GCM;
13120
13121
    /* random configId */
13122
    ret = wc_RNG_GenerateByte(rng, &(ech->configId));
13123
13124
    /* curve25519 encLen */
13125
    ech->encLen = DHKEM_X25519_ENC_LEN;
13126
13127
    if (ret == 0)
13128
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13129
13130
    if (ret != 0) {
13131
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13132
    }
13133
13134
    return ret;
13135
}
13136
13137
/* return status after setting up ech to write real ech */
13138
static int TLSX_ECH_Use(WOLFSSL_EchConfig* echConfig, TLSX** extensions,
13139
    void* heap, WC_RNG* rng)
13140
{
13141
    int ret = 0;
13142
    int suiteIndex;
13143
    TLSX* echX;
13144
    WOLFSSL_ECH* ech;
13145
    if (extensions == NULL)
13146
        return BAD_FUNC_ARG;
13147
    /* skip if we already have an ech extension, we will for hrr */
13148
    echX = TLSX_Find(*extensions, TLSX_ECH);
13149
    if (echX != NULL)
13150
        return 0;
13151
    /* find a supported cipher suite */
13152
    suiteIndex = EchConfigGetSupportedCipherSuite(echConfig);
13153
    if (suiteIndex < 0)
13154
        return suiteIndex;
13155
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13156
        DYNAMIC_TYPE_TMP_BUFFER);
13157
    if (ech == NULL)
13158
        return MEMORY_E;
13159
    ForceZero(ech, sizeof(WOLFSSL_ECH));
13160
    ech->state = ECH_WRITE_REAL;
13161
    ech->echConfig = echConfig;
13162
    /* 0 for outer */
13163
    ech->type = ECH_TYPE_OUTER;
13164
    /* kemId */
13165
    ech->kemId = echConfig->kemId;
13166
    /* cipherSuite kdf */
13167
    ech->cipherSuite.kdfId = echConfig->cipherSuites[suiteIndex].kdfId;
13168
    /* cipherSuite aead */
13169
    ech->cipherSuite.aeadId = echConfig->cipherSuites[suiteIndex].aeadId;
13170
    /* configId */
13171
    ech->configId = echConfig->configId;
13172
    /* encLen */
13173
    switch (echConfig->kemId)
13174
    {
13175
        case DHKEM_P256_HKDF_SHA256:
13176
            ech->encLen = DHKEM_P256_ENC_LEN;
13177
            break;
13178
        case DHKEM_P384_HKDF_SHA384:
13179
            ech->encLen = DHKEM_P384_ENC_LEN;
13180
            break;
13181
        case DHKEM_P521_HKDF_SHA512:
13182
            ech->encLen = DHKEM_P521_ENC_LEN;
13183
            break;
13184
        case DHKEM_X25519_HKDF_SHA256:
13185
            ech->encLen = DHKEM_X25519_ENC_LEN;
13186
            break;
13187
        case DHKEM_X448_HKDF_SHA512:
13188
            ech->encLen = DHKEM_X448_ENC_LEN;
13189
            break;
13190
    }
13191
    /* setup hpke */
13192
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
13193
    if (ech->hpke == NULL) {
13194
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13195
        return MEMORY_E;
13196
    }
13197
    ret = wc_HpkeInit(ech->hpke, ech->kemId, ech->cipherSuite.kdfId,
13198
        ech->cipherSuite.aeadId, heap);
13199
    /* setup the ephemeralKey */
13200
    if (ret == 0)
13201
        ret = wc_HpkeGenerateKeyPair(ech->hpke, &ech->ephemeralKey, rng);
13202
    if (ret == 0)
13203
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13204
    if (ret != 0) {
13205
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13206
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13207
    }
13208
    return ret;
13209
}
13210
13211
/* return status after setting up ech to read and decrypt */
13212
static int TLSX_ServerECH_Use(TLSX** extensions, void* heap,
13213
    WOLFSSL_EchConfig* configs)
13214
{
13215
    int ret;
13216
    WOLFSSL_ECH* ech;
13217
    TLSX* echX;
13218
    if (extensions == NULL)
13219
        return BAD_FUNC_ARG;
13220
    /* if we already have ech don't override it */
13221
    echX = TLSX_Find(*extensions, TLSX_ECH);
13222
    if (echX != NULL)
13223
        return 0;
13224
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13225
        DYNAMIC_TYPE_TMP_BUFFER);
13226
    if (ech == NULL)
13227
        return MEMORY_E;
13228
    ForceZero(ech, sizeof(WOLFSSL_ECH));
13229
    ech->state = ECH_WRITE_NONE;
13230
    /* 0 for outer */
13231
    ech->type = ECH_TYPE_OUTER;
13232
    ech->echConfig = configs;
13233
    /* setup the rest of the settings when we receive ech from the client */
13234
    ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13235
    if (ret != 0)
13236
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13237
    return ret;
13238
}
13239
13240
/* return status after writing the ech and updating offset */
13241
static int TLSX_ECH_Write(WOLFSSL_ECH* ech, byte msgType, byte* writeBuf,
13242
    word16* offset)
13243
{
13244
    int ret = 0;
13245
    int rngRet = -1;
13246
    word32 configsLen = 0;
13247
    void* ephemeralKey = NULL;
13248
    byte* writeBuf_p = writeBuf;
13249
#ifdef WOLFSSL_SMALL_STACK
13250
    Hpke* hpke = NULL;
13251
    WC_RNG* rng = NULL;
13252
#else
13253
    Hpke hpke[1];
13254
    WC_RNG rng[1];
13255
#endif
13256
    WOLFSSL_MSG("TLSX_ECH_Write");
13257
    if (msgType == hello_retry_request) {
13258
        /* reserve space to write the confirmation to */
13259
        *offset += ECH_ACCEPT_CONFIRMATION_SZ;
13260
        /* set confBuf */
13261
        ech->confBuf = writeBuf;
13262
        return 0;
13263
    }
13264
    if (ech->state == ECH_WRITE_NONE || ech->state == ECH_PARSED_INTERNAL)
13265
        return 0;
13266
    if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
13267
        /* get size then write */
13268
        ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen);
13269
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13270
            return ret;
13271
        ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen);
13272
        if (ret != WOLFSSL_SUCCESS)
13273
            return ret;
13274
        *offset += configsLen;
13275
        return 0;
13276
    }
13277
    /* type */
13278
    *writeBuf_p = ech->type;
13279
    writeBuf_p += sizeof(ech->type);
13280
    /* outer has body, inner does not */
13281
    if (ech->type == ECH_TYPE_OUTER) {
13282
        /* kdfId */
13283
        c16toa(ech->cipherSuite.kdfId, writeBuf_p);
13284
        writeBuf_p += sizeof(ech->cipherSuite.kdfId);
13285
        /* aeadId */
13286
        c16toa(ech->cipherSuite.aeadId, writeBuf_p);
13287
        writeBuf_p += sizeof(ech->cipherSuite.aeadId);
13288
        /* configId */
13289
        *writeBuf_p = ech->configId;
13290
        writeBuf_p += sizeof(ech->configId);
13291
        /* encLen */
13292
        if (ech->hpkeContext == NULL) {
13293
            c16toa(ech->encLen, writeBuf_p);
13294
        }
13295
        else {
13296
            /* set to 0 if this is clientInner 2 */
13297
            c16toa(0, writeBuf_p);
13298
        }
13299
        writeBuf_p += 2;
13300
        if (ech->state == ECH_WRITE_GREASE) {
13301
#ifdef WOLFSSL_SMALL_STACK
13302
            hpke = (Hpke*)XMALLOC(sizeof(Hpke), NULL, DYNAMIC_TYPE_TMP_BUFFER);
13303
            if (hpke == NULL)
13304
                return MEMORY_E;
13305
            rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
13306
            if (rng == NULL) {
13307
                XFREE(hpke, NULL, DYNAMIC_TYPE_RNG);
13308
                return MEMORY_E;
13309
            }
13310
#endif
13311
            /* hpke init */
13312
            ret = wc_HpkeInit(hpke, ech->kemId, ech->cipherSuite.kdfId,
13313
                ech->cipherSuite.aeadId, NULL);
13314
            if (ret == 0)
13315
                rngRet = ret = wc_InitRng(rng);
13316
            /* create the ephemeralKey */
13317
            if (ret == 0)
13318
                ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng);
13319
            /* enc */
13320
            if (ret == 0) {
13321
                ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey, writeBuf_p,
13322
                    &ech->encLen);
13323
                writeBuf_p += ech->encLen;
13324
            }
13325
            if (ret == 0) {
13326
                /* innerClientHelloLen */
13327
                c16toa(GREASE_ECH_SIZE + ((writeBuf_p + 2 - writeBuf) % 32),
13328
                    writeBuf_p);
13329
                writeBuf_p += 2;
13330
13331
                /* innerClientHello */
13332
                ret = wc_RNG_GenerateBlock(rng, writeBuf_p, GREASE_ECH_SIZE +
13333
                    ((writeBuf_p - writeBuf) % 32));
13334
                writeBuf_p += GREASE_ECH_SIZE + ((writeBuf_p - writeBuf) % 32);
13335
            }
13336
            if (rngRet == 0)
13337
                wc_FreeRng(rng);
13338
            if (ephemeralKey != NULL)
13339
                wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap);
13340
            WC_FREE_VAR_EX(hpke, NULL, DYNAMIC_TYPE_TMP_BUFFER);
13341
            WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
13342
        }
13343
        else {
13344
            /* only write enc if this is our first ech, no hpke context */
13345
            if (ech->hpkeContext == NULL) {
13346
                /* write enc to writeBuf_p */
13347
                ret = wc_HpkeSerializePublicKey(ech->hpke, ech->ephemeralKey,
13348
                    writeBuf_p, &ech->encLen);
13349
                writeBuf_p += ech->encLen;
13350
            }
13351
            /* innerClientHelloLen */
13352
            c16toa(ech->innerClientHelloLen, writeBuf_p);
13353
            writeBuf_p += 2;
13354
            /* set payload offset for when we finalize */
13355
            ech->outerClientPayload = writeBuf_p;
13356
            /* write zeros for payload */
13357
            XMEMSET(writeBuf_p, 0, ech->innerClientHelloLen);
13358
            writeBuf_p += ech->innerClientHelloLen;
13359
        }
13360
    }
13361
    if (ret == 0)
13362
        *offset += (writeBuf_p - writeBuf);
13363
    return ret;
13364
}
13365
13366
/* return the size needed for the ech extension */
13367
static int TLSX_ECH_GetSize(WOLFSSL_ECH* ech, byte msgType)
13368
{
13369
    int ret;
13370
    word32 size = 0;
13371
13372
    if (ech->state == ECH_WRITE_GREASE) {
13373
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
13374
            sizeof(ech->configId) + sizeof(word16) + ech->encLen +
13375
            sizeof(word16);
13376
13377
        size += GREASE_ECH_SIZE + (size % 32);
13378
    }
13379
    else if (msgType == hello_retry_request) {
13380
        size = ECH_ACCEPT_CONFIRMATION_SZ;
13381
    }
13382
    else if (ech->state == ECH_WRITE_NONE ||
13383
        ech->state == ECH_PARSED_INTERNAL) {
13384
        size = 0;
13385
    }
13386
    else if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
13387
        /* get the size of the raw configs */
13388
        ret = GetEchConfigsEx(ech->echConfig, NULL, &size);
13389
13390
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13391
            return ret;
13392
    }
13393
    else if (ech->type == ECH_TYPE_INNER)
13394
    {
13395
        size = sizeof(ech->type);
13396
    }
13397
    else
13398
    {
13399
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
13400
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16) +
13401
            ech->innerClientHelloLen;
13402
        /* only set encLen if this is inner hello 1 */
13403
        if (ech->hpkeContext == NULL)
13404
            size += ech->encLen;
13405
    }
13406
13407
    return (int)size;
13408
}
13409
13410
/* return status after attempting to open the hpke encrypted ech extension, if
13411
 * successful the inner client hello will be stored in
13412
 * ech->innerClientHelloLen */
13413
static int TLSX_ExtractEch(WOLFSSL_ECH* ech, WOLFSSL_EchConfig* echConfig,
13414
    byte* aad, word32 aadLen, void* heap)
13415
{
13416
    int ret = 0;
13417
    int expectedEncLen;
13418
    int i;
13419
    word32 rawConfigLen = 0;
13420
    byte* info = NULL;
13421
    word32 infoLen = 0;
13422
    if (ech == NULL || echConfig == NULL || aad == NULL)
13423
        return BAD_FUNC_ARG;
13424
    /* verify the kem and key len */
13425
    switch (echConfig->kemId)
13426
    {
13427
        case DHKEM_P256_HKDF_SHA256:
13428
            expectedEncLen = DHKEM_P256_ENC_LEN;
13429
            break;
13430
        case DHKEM_P384_HKDF_SHA384:
13431
            expectedEncLen = DHKEM_P384_ENC_LEN;
13432
            break;
13433
        case DHKEM_P521_HKDF_SHA512:
13434
            expectedEncLen = DHKEM_P521_ENC_LEN;
13435
            break;
13436
        case DHKEM_X25519_HKDF_SHA256:
13437
            expectedEncLen = DHKEM_X25519_ENC_LEN;
13438
            break;
13439
        case DHKEM_X448_HKDF_SHA512:
13440
            expectedEncLen = DHKEM_X448_ENC_LEN;
13441
            break;
13442
        default:
13443
            expectedEncLen = 0;
13444
            break;
13445
    }
13446
    if (expectedEncLen != ech->encLen)
13447
        return BAD_FUNC_ARG;
13448
    /* verify the cipher suite */
13449
    for (i = 0; i < echConfig->numCipherSuites; i++) {
13450
        if (echConfig->cipherSuites[i].kdfId == ech->cipherSuite.kdfId &&
13451
            echConfig->cipherSuites[i].aeadId == ech->cipherSuite.aeadId) {
13452
            break;
13453
        }
13454
    }
13455
    if (i >= echConfig->numCipherSuites) {
13456
        return BAD_FUNC_ARG;
13457
    }
13458
    /* check if hpke already exists, may if HelloRetryRequest */
13459
    if (ech->hpke == NULL) {
13460
        ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
13461
        if (ech->hpke == NULL)
13462
            ret = MEMORY_E;
13463
        /* init the hpke struct */
13464
        if (ret == 0) {
13465
            ret = wc_HpkeInit(ech->hpke, echConfig->kemId,
13466
                ech->cipherSuite.kdfId, ech->cipherSuite.aeadId, heap);
13467
        }
13468
        if (ret == 0) {
13469
            /* allocate hpkeContext */
13470
            ech->hpkeContext =
13471
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
13472
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13473
            if (ech->hpkeContext == NULL)
13474
                ret = MEMORY_E;
13475
        }
13476
        /* get the rawConfigLen */
13477
        if (ret == 0)
13478
            ret = GetEchConfig(echConfig, NULL, &rawConfigLen);
13479
        if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13480
            ret = 0;
13481
        /* create info */
13482
        if (ret == 0) {
13483
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + rawConfigLen;
13484
            info = (byte*)XMALLOC(infoLen, heap, DYNAMIC_TYPE_TMP_BUFFER);
13485
13486
            if (info == NULL)
13487
                ret = MEMORY_E;
13488
            else {
13489
                XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
13490
                    TLS_INFO_CONST_STRING_SZ + 1);
13491
                ret = GetEchConfig(echConfig, info +
13492
                    TLS_INFO_CONST_STRING_SZ + 1, &rawConfigLen);
13493
            }
13494
        }
13495
        /* init the context for opening */
13496
        if (ret == 0) {
13497
            ret = wc_HpkeInitOpenContext(ech->hpke, ech->hpkeContext,
13498
                echConfig->receiverPrivkey, ech->enc, ech->encLen, info,
13499
                infoLen);
13500
        }
13501
    }
13502
    /* decrypt the ech payload */
13503
    if (ret == 0) {
13504
        ret = wc_HpkeContextOpenBase(ech->hpke, ech->hpkeContext, aad, aadLen,
13505
            ech->outerClientPayload, ech->innerClientHelloLen,
13506
            ech->innerClientHello + HANDSHAKE_HEADER_SZ);
13507
    }
13508
    /* free the hpke and context on failure */
13509
    if (ret != 0) {
13510
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13511
        ech->hpke = NULL;
13512
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
13513
        ech->hpkeContext = NULL;
13514
    }
13515
13516
    if (info != NULL)
13517
        XFREE(info, heap, DYNAMIC_TYPE_TMP_BUFFER);
13518
13519
    return ret;
13520
}
13521
13522
/* parse the ech extension, if internal update ech->state and return, if
13523
 * external attempt to extract the inner client_hello, return the status */
13524
static int TLSX_ECH_Parse(WOLFSSL* ssl, const byte* readBuf, word16 size,
13525
    byte msgType)
13526
{
13527
    int ret = 0;
13528
    int i;
13529
    TLSX* echX;
13530
    WOLFSSL_ECH* ech;
13531
    WOLFSSL_EchConfig* echConfig;
13532
    byte* aadCopy;
13533
    byte* readBuf_p = (byte*)readBuf;
13534
    WOLFSSL_MSG("TLSX_ECH_Parse");
13535
    if (size == 0)
13536
        return BAD_FUNC_ARG;
13537
    if (ssl->options.disableECH) {
13538
        WOLFSSL_MSG("TLSX_ECH_Parse: ECH disabled. Ignoring.");
13539
        return 0;
13540
    }
13541
    /* retry configs */
13542
    if (msgType == encrypted_extensions) {
13543
        ret = wolfSSL_SetEchConfigs(ssl, readBuf, size);
13544
13545
        if (ret == WOLFSSL_SUCCESS)
13546
            ret = 0;
13547
    }
13548
    /* HRR with special confirmation */
13549
    else if (msgType == hello_retry_request && ssl->options.useEch) {
13550
        /* length must be 8 */
13551
        if (size != ECH_ACCEPT_CONFIRMATION_SZ)
13552
            return BAD_FUNC_ARG;
13553
        /* get extension */
13554
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13555
        if (echX == NULL)
13556
            return BAD_FUNC_ARG;
13557
        ech = (WOLFSSL_ECH*)echX->data;
13558
        ech->confBuf = (byte*)readBuf;
13559
    }
13560
    else if (msgType == client_hello && ssl->ctx->echConfigs != NULL) {
13561
        /* get extension */
13562
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13563
        if (echX == NULL)
13564
            return BAD_FUNC_ARG;
13565
        ech = (WOLFSSL_ECH*)echX->data;
13566
        /* read the ech parameters before the payload */
13567
        ech->type = *readBuf_p;
13568
        readBuf_p++;
13569
        if (ech->type == ECH_TYPE_INNER) {
13570
            ech->state = ECH_PARSED_INTERNAL;
13571
            return 0;
13572
        }
13573
        /* technically the payload would only be 1 byte at this length */
13574
        if (size < 11 + ech->encLen)
13575
            return BAD_FUNC_ARG;
13576
        /* read kdfId */
13577
        ato16(readBuf_p, &ech->cipherSuite.kdfId);
13578
        readBuf_p += 2;
13579
        /* read aeadId */
13580
        ato16(readBuf_p, &ech->cipherSuite.aeadId);
13581
        readBuf_p += 2;
13582
        /* read configId */
13583
        ech->configId = *readBuf_p;
13584
        readBuf_p++;
13585
        /* only get enc if we don't already have the hpke context */
13586
        if (ech->hpkeContext == NULL) {
13587
            /* read encLen */
13588
            ato16(readBuf_p, &ech->encLen);
13589
            readBuf_p += 2;
13590
            if (ech->encLen > HPKE_Npk_MAX)
13591
                return BAD_FUNC_ARG;
13592
            /* read enc */
13593
            XMEMCPY(ech->enc, readBuf_p, ech->encLen);
13594
            readBuf_p += ech->encLen;
13595
        }
13596
        else {
13597
            readBuf_p += 2;
13598
        }
13599
        /* read hello inner len */
13600
        ato16(readBuf_p, &ech->innerClientHelloLen);
13601
        ech->innerClientHelloLen -= WC_AES_BLOCK_SIZE;
13602
        readBuf_p += 2;
13603
        ech->outerClientPayload = readBuf_p;
13604
        /* make a copy of the aad */
13605
        aadCopy = (byte*)XMALLOC(ech->aadLen, ssl->heap,
13606
            DYNAMIC_TYPE_TMP_BUFFER);
13607
        if (aadCopy == NULL)
13608
            return MEMORY_E;
13609
        XMEMCPY(aadCopy, ech->aad, ech->aadLen);
13610
        /* set the ech payload of the copy to zeros */
13611
        XMEMSET(aadCopy + (readBuf_p - ech->aad), 0,
13612
            ech->innerClientHelloLen + WC_AES_BLOCK_SIZE);
13613
        /* free the old ech in case this is our second client hello */
13614
        if (ech->innerClientHello != NULL)
13615
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13616
        /* allocate the inner payload buffer */
13617
        ech->innerClientHello =
13618
            (byte*)XMALLOC(ech->innerClientHelloLen + HANDSHAKE_HEADER_SZ,
13619
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13620
        if (ech->innerClientHello == NULL) {
13621
            XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13622
            return MEMORY_E;
13623
        }
13624
        /* first check if the config id matches */
13625
        echConfig = ssl->ctx->echConfigs;
13626
        while (echConfig != NULL) {
13627
            /* decrypt with this config */
13628
            if (echConfig->configId == ech->configId) {
13629
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
13630
                    ssl->heap);
13631
                break;
13632
            }
13633
            echConfig = echConfig->next;
13634
        }
13635
        /* try to decrypt with all configs */
13636
        if (echConfig == NULL || ret != 0) {
13637
            echConfig = ssl->ctx->echConfigs;
13638
            while (echConfig != NULL) {
13639
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
13640
                    ssl->heap);
13641
                if (ret== 0)
13642
                    break;
13643
                echConfig = echConfig->next;
13644
            }
13645
        }
13646
        /* if we failed to extract, set state to retry configs */
13647
        if (ret != 0) {
13648
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13649
            ech->innerClientHello = NULL;
13650
            ech->state = ECH_WRITE_RETRY_CONFIGS;
13651
        }
13652
        else {
13653
            i = 0;
13654
            /* decrement until before the padding */
13655
            while (ech->innerClientHello[ech->innerClientHelloLen +
13656
                HANDSHAKE_HEADER_SZ - i - 1] != ECH_TYPE_INNER) {
13657
                i++;
13658
            }
13659
            /* subtract the length of the padding from the length */
13660
            ech->innerClientHelloLen -= i;
13661
        }
13662
        XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13663
        return 0;
13664
    }
13665
13666
    return ret;
13667
}
13668
13669
/* free the ech struct and the dynamic buffer it uses */
13670
static void TLSX_ECH_Free(WOLFSSL_ECH* ech, void* heap)
13671
{
13672
    XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
13673
    if (ech->ephemeralKey != NULL)
13674
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
13675
            ech->hpke->heap);
13676
    if (ech->hpke != NULL)
13677
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13678
    if (ech->hpkeContext != NULL)
13679
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
13680
13681
    XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13682
    (void)heap;
13683
}
13684
13685
/* encrypt the client hello and store it in ech->outerClientPayload, return
13686
 * status */
13687
int TLSX_FinalizeEch(WOLFSSL_ECH* ech, byte* aad, word32 aadLen)
13688
{
13689
    int ret = 0;
13690
    void* receiverPubkey = NULL;
13691
    byte* info = NULL;
13692
    int infoLen = 0;
13693
    byte* aadCopy = NULL;
13694
    /* setup hpke context to seal, should be done at most once per connection */
13695
    if (ech->hpkeContext == NULL) {
13696
        /* import the server public key */
13697
        ret = wc_HpkeDeserializePublicKey(ech->hpke, &receiverPubkey,
13698
            ech->echConfig->receiverPubkey, ech->encLen);
13699
        if (ret == 0) {
13700
            /* allocate hpke context */
13701
            ech->hpkeContext =
13702
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
13703
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13704
            if (ech->hpkeContext == NULL)
13705
                ret = MEMORY_E;
13706
        }
13707
        if (ret == 0) {
13708
            /* create info */
13709
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + ech->echConfig->rawLen;
13710
            info = (byte*)XMALLOC(infoLen, ech->hpke->heap,
13711
                DYNAMIC_TYPE_TMP_BUFFER);
13712
            if (info == NULL)
13713
                ret = MEMORY_E;
13714
        }
13715
        if (ret == 0) {
13716
            /* puts the null byte in for me */
13717
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
13718
                TLS_INFO_CONST_STRING_SZ + 1);
13719
            XMEMCPY(info + TLS_INFO_CONST_STRING_SZ + 1,
13720
                ech->echConfig->raw, ech->echConfig->rawLen);
13721
            /* init the context for seal with info and keys */
13722
            ret = wc_HpkeInitSealContext(ech->hpke, ech->hpkeContext,
13723
                ech->ephemeralKey, receiverPubkey, info, infoLen);
13724
        }
13725
    }
13726
    if (ret == 0) {
13727
        /* make a copy of the aad since we overwrite it */
13728
        aadCopy = (byte*)XMALLOC(aadLen, ech->hpke->heap,
13729
            DYNAMIC_TYPE_TMP_BUFFER);
13730
        if (aadCopy == NULL) {
13731
            ret = MEMORY_E;
13732
        }
13733
    }
13734
    if (ret == 0) {
13735
        XMEMCPY(aadCopy, aad, aadLen);
13736
        /* seal the payload with context */
13737
        ret = wc_HpkeContextSealBase(ech->hpke, ech->hpkeContext, aadCopy,
13738
            aadLen, ech->innerClientHello,
13739
            ech->innerClientHelloLen - ech->hpke->Nt, ech->outerClientPayload);
13740
    }
13741
    if (info != NULL)
13742
        XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13743
    if (aadCopy != NULL)
13744
        XFREE(aadCopy, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13745
    if (receiverPubkey != NULL)
13746
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, receiverPubkey,
13747
            ech->hpke->heap);
13748
    return ret;
13749
}
13750
13751
#define GREASE_ECH_USE TLSX_GreaseECH_Use
13752
#define ECH_USE TLSX_ECH_Use
13753
#define SERVER_ECH_USE TLSX_ServerECH_Use
13754
#define ECH_WRITE TLSX_ECH_Write
13755
#define ECH_GET_SIZE TLSX_ECH_GetSize
13756
#define ECH_PARSE TLSX_ECH_Parse
13757
#define ECH_FREE TLSX_ECH_Free
13758
13759
#endif
13760
13761
/** Releases all extensions in the provided list. */
13762
void TLSX_FreeAll(TLSX* list, void* heap)
13763
4.78k
{
13764
4.78k
    TLSX* extension;
13765
13766
4.78k
    while ((extension = list)) {
13767
0
        list = extension->next;
13768
13769
0
        switch (extension->type) {
13770
#if defined(HAVE_RPK)
13771
            case TLSX_CLIENT_CERTIFICATE_TYPE:
13772
                WOLFSSL_MSG("Client Certificate Type extension free");
13773
                /* nothing to do */
13774
                break;
13775
            case TLSX_SERVER_CERTIFICATE_TYPE:
13776
                WOLFSSL_MSG("Server Certificate Type extension free");
13777
                /* nothing to do */
13778
                break;
13779
#endif
13780
13781
0
#ifdef HAVE_SNI
13782
0
            case TLSX_SERVER_NAME:
13783
0
                WOLFSSL_MSG("SNI extension free");
13784
0
                SNI_FREE_ALL((SNI*)extension->data, heap);
13785
0
                break;
13786
0
#endif
13787
13788
0
            case TLSX_TRUSTED_CA_KEYS:
13789
0
                WOLFSSL_MSG("Trusted CA Indication extension free");
13790
0
                TCA_FREE_ALL((TCA*)extension->data, heap);
13791
0
                break;
13792
13793
0
            case TLSX_MAX_FRAGMENT_LENGTH:
13794
0
                WOLFSSL_MSG("Max Fragment Length extension free");
13795
0
                MFL_FREE_ALL(extension->data, heap);
13796
0
                break;
13797
13798
0
            case TLSX_EXTENDED_MASTER_SECRET:
13799
0
                WOLFSSL_MSG("Extended Master Secret free");
13800
                /* Nothing to do. */
13801
0
                break;
13802
0
            case TLSX_TRUNCATED_HMAC:
13803
0
                WOLFSSL_MSG("Truncated HMAC extension free");
13804
                /* Nothing to do. */
13805
0
                break;
13806
13807
0
            case TLSX_SUPPORTED_GROUPS:
13808
0
                WOLFSSL_MSG("Supported Groups extension free");
13809
0
                EC_FREE_ALL((SupportedCurve*)extension->data, heap);
13810
0
                break;
13811
13812
0
            case TLSX_EC_POINT_FORMATS:
13813
0
                WOLFSSL_MSG("Point Formats extension free");
13814
0
                PF_FREE_ALL((PointFormat*)extension->data, heap);
13815
0
                break;
13816
13817
0
            case TLSX_STATUS_REQUEST:
13818
0
                WOLFSSL_MSG("Certificate Status Request extension free");
13819
0
                CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
13820
0
                break;
13821
13822
0
            case TLSX_STATUS_REQUEST_V2:
13823
0
                WOLFSSL_MSG("Certificate Status Request v2 extension free");
13824
0
                CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
13825
0
                        heap);
13826
0
                break;
13827
13828
0
            case TLSX_RENEGOTIATION_INFO:
13829
0
                WOLFSSL_MSG("Secure Renegotiation extension free");
13830
0
                SCR_FREE_ALL(extension->data, heap);
13831
0
                break;
13832
13833
0
            case TLSX_SESSION_TICKET:
13834
0
                WOLFSSL_MSG("Session Ticket extension free");
13835
0
                WOLF_STK_FREE(extension->data, heap);
13836
0
                break;
13837
13838
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
13839
0
                WOLFSSL_MSG("ALPN extension free");
13840
0
                ALPN_FREE_ALL((ALPN*)extension->data, heap);
13841
0
                break;
13842
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13843
0
            case TLSX_SIGNATURE_ALGORITHMS:
13844
0
                WOLFSSL_MSG("Signature Algorithms extension to free");
13845
0
                SA_FREE_ALL((SignatureAlgorithms*)extension->data, heap);
13846
0
                break;
13847
0
#endif
13848
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
13849
0
            case TLSX_ENCRYPT_THEN_MAC:
13850
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension free");
13851
0
                break;
13852
0
#endif
13853
13854
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13855
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13856
            case TLSX_PRE_SHARED_KEY:
13857
                WOLFSSL_MSG("Pre-Shared Key extension free");
13858
                PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
13859
                break;
13860
13861
        #ifdef WOLFSSL_TLS13
13862
            case TLSX_PSK_KEY_EXCHANGE_MODES:
13863
                WOLFSSL_MSG("PSK Key Exchange Modes extension free");
13864
                break;
13865
        #endif
13866
    #endif
13867
13868
0
            case TLSX_KEY_SHARE:
13869
0
                WOLFSSL_MSG("Key Share extension free");
13870
0
                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
13871
0
                break;
13872
0
#endif
13873
0
#ifdef WOLFSSL_TLS13
13874
0
            case TLSX_SUPPORTED_VERSIONS:
13875
0
                WOLFSSL_MSG("Supported Versions extension free");
13876
0
                break;
13877
13878
    #ifdef WOLFSSL_SEND_HRR_COOKIE
13879
            case TLSX_COOKIE:
13880
                WOLFSSL_MSG("Cookie extension free");
13881
                CKE_FREE_ALL((Cookie*)extension->data, heap);
13882
                break;
13883
    #endif
13884
13885
    #ifdef WOLFSSL_EARLY_DATA
13886
            case TLSX_EARLY_DATA:
13887
                WOLFSSL_MSG("Early Data extension free");
13888
                break;
13889
    #endif
13890
13891
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13892
            case TLSX_POST_HANDSHAKE_AUTH:
13893
                WOLFSSL_MSG("Post-Handshake Authentication extension free");
13894
                break;
13895
    #endif
13896
13897
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13898
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
13899
0
                WOLFSSL_MSG("Signature Algorithms extension free");
13900
0
                break;
13901
0
    #endif
13902
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13903
            case TLSX_CERTIFICATE_AUTHORITIES:
13904
                WOLFSSL_MSG("Certificate Authorities extension free");
13905
                break;
13906
    #endif
13907
0
#endif
13908
#ifdef WOLFSSL_SRTP
13909
            case TLSX_USE_SRTP:
13910
                WOLFSSL_MSG("SRTP extension free");
13911
                SRTP_FREE((TlsxSrtp*)extension->data, heap);
13912
                break;
13913
#endif
13914
13915
    #ifdef WOLFSSL_QUIC
13916
            case TLSX_KEY_QUIC_TP_PARAMS:
13917
                FALL_THROUGH;
13918
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
13919
                WOLFSSL_MSG("QUIC transport parameter free");
13920
                QTP_FREE((QuicTransportParam*)extension->data, heap);
13921
                break;
13922
    #endif
13923
13924
#ifdef WOLFSSL_DTLS_CID
13925
            case TLSX_CONNECTION_ID:
13926
                WOLFSSL_MSG("Connection ID extension free");
13927
                CID_FREE((byte*)extension->data, heap);
13928
                break;
13929
#endif /* WOLFSSL_DTLS_CID */
13930
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13931
            case TLSX_ECH:
13932
                WOLFSSL_MSG("ECH extension free");
13933
                ECH_FREE((WOLFSSL_ECH*)extension->data, heap);
13934
                break;
13935
#endif
13936
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
13937
            case TLSX_CKS:
13938
                WOLFSSL_MSG("CKS extension free");
13939
                /* nothing to do */
13940
                break;
13941
#endif
13942
0
            default:
13943
0
                break;
13944
0
        }
13945
13946
0
        XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
13947
0
    }
13948
13949
4.78k
    (void)heap;
13950
4.78k
}
13951
13952
/** Checks if the tls extensions are supported based on the protocol version. */
13953
68.2k
int TLSX_SupportExtensions(WOLFSSL* ssl) {
13954
68.2k
    return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
13955
68.2k
}
13956
13957
/** Tells the buffered size of the extensions in a list. */
13958
static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
13959
                        word16* pLength)
13960
{
13961
    int    ret = 0;
13962
    TLSX*  extension;
13963
    word16 length = 0;
13964
    byte   isRequest = (msgType == client_hello ||
13965
                        msgType == certificate_request);
13966
13967
    while ((extension = list)) {
13968
        list = extension->next;
13969
13970
        /* only extensions marked as response are sent back to the client. */
13971
        if (!isRequest && !extension->resp)
13972
            continue; /* skip! */
13973
13974
        /* ssl level extensions are expected to override ctx level ones. */
13975
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
13976
            continue; /* skip! */
13977
13978
        /* extension type + extension data length. */
13979
        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
13980
13981
        switch (extension->type) {
13982
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
13983
            case TLSX_CKS:
13984
                length += ((WOLFSSL*)extension->data)->sigSpecSz ;
13985
                break;
13986
#endif
13987
#ifdef HAVE_SNI
13988
            case TLSX_SERVER_NAME:
13989
                /* SNI only sends the name on the request. */
13990
                if (isRequest)
13991
                    length += SNI_GET_SIZE((SNI*)extension->data);
13992
                break;
13993
#endif
13994
13995
            case TLSX_TRUSTED_CA_KEYS:
13996
                /* TCA only sends the list on the request. */
13997
                if (isRequest)
13998
                    length += TCA_GET_SIZE((TCA*)extension->data);
13999
                break;
14000
14001
            case TLSX_MAX_FRAGMENT_LENGTH:
14002
                length += MFL_GET_SIZE(extension->data);
14003
                break;
14004
14005
            case TLSX_EXTENDED_MASTER_SECRET:
14006
            case TLSX_TRUNCATED_HMAC:
14007
                /* always empty. */
14008
                break;
14009
14010
            case TLSX_SUPPORTED_GROUPS:
14011
                length += EC_GET_SIZE((SupportedCurve*)extension->data);
14012
                break;
14013
14014
            case TLSX_EC_POINT_FORMATS:
14015
                length += PF_GET_SIZE((PointFormat*)extension->data);
14016
                break;
14017
14018
            case TLSX_STATUS_REQUEST:
14019
                length += CSR_GET_SIZE(
14020
                         (CertificateStatusRequest*)extension->data, isRequest);
14021
                break;
14022
14023
            case TLSX_STATUS_REQUEST_V2:
14024
                length += CSR2_GET_SIZE(
14025
                        (CertificateStatusRequestItemV2*)extension->data,
14026
                        isRequest);
14027
                break;
14028
14029
            case TLSX_RENEGOTIATION_INFO:
14030
                length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
14031
                        isRequest);
14032
                break;
14033
14034
            case TLSX_SESSION_TICKET:
14035
                length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
14036
                        isRequest);
14037
                break;
14038
14039
            case TLSX_APPLICATION_LAYER_PROTOCOL:
14040
                length += ALPN_GET_SIZE((ALPN*)extension->data);
14041
                break;
14042
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14043
            case TLSX_SIGNATURE_ALGORITHMS:
14044
                length += SA_GET_SIZE(extension->data);
14045
                break;
14046
#endif
14047
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
14048
            case TLSX_ENCRYPT_THEN_MAC:
14049
                ret = ETM_GET_SIZE(msgType, &length);
14050
                break;
14051
#endif /* HAVE_ENCRYPT_THEN_MAC */
14052
14053
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
14054
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14055
            case TLSX_PRE_SHARED_KEY:
14056
                ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
14057
                                                                       &length);
14058
                break;
14059
        #ifdef WOLFSSL_TLS13
14060
            case TLSX_PSK_KEY_EXCHANGE_MODES:
14061
                ret = PKM_GET_SIZE((byte)extension->val, msgType, &length);
14062
                break;
14063
        #endif
14064
    #endif
14065
            case TLSX_KEY_SHARE:
14066
                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
14067
                break;
14068
#endif
14069
14070
#ifdef WOLFSSL_TLS13
14071
            case TLSX_SUPPORTED_VERSIONS:
14072
                ret = SV_GET_SIZE(extension->data, msgType, &length);
14073
                break;
14074
14075
    #ifdef WOLFSSL_SEND_HRR_COOKIE
14076
            case TLSX_COOKIE:
14077
                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &length);
14078
                break;
14079
    #endif
14080
14081
    #ifdef WOLFSSL_EARLY_DATA
14082
            case TLSX_EARLY_DATA:
14083
                ret = EDI_GET_SIZE(msgType, &length);
14084
                break;
14085
    #endif
14086
14087
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
14088
            case TLSX_POST_HANDSHAKE_AUTH:
14089
                ret = PHA_GET_SIZE(msgType, &length);
14090
                break;
14091
    #endif
14092
14093
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14094
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
14095
                length += SAC_GET_SIZE(extension->data);
14096
                break;
14097
    #endif
14098
14099
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14100
            case TLSX_CERTIFICATE_AUTHORITIES:
14101
                length += CAN_GET_SIZE(extension->data);
14102
                break;
14103
    #endif
14104
#endif
14105
#ifdef WOLFSSL_SRTP
14106
            case TLSX_USE_SRTP:
14107
                length += SRTP_GET_SIZE((TlsxSrtp*)extension->data);
14108
                break;
14109
#endif
14110
14111
#ifdef HAVE_RPK
14112
            case TLSX_CLIENT_CERTIFICATE_TYPE:
14113
                length += CCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
14114
                break;
14115
14116
            case TLSX_SERVER_CERTIFICATE_TYPE:
14117
                length += SCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
14118
                break;
14119
#endif /* HAVE_RPK */
14120
14121
#ifdef WOLFSSL_QUIC
14122
            case TLSX_KEY_QUIC_TP_PARAMS:
14123
                FALL_THROUGH; /* followed by */
14124
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
14125
                length += QTP_GET_SIZE(extension);
14126
                break;
14127
#endif
14128
#ifdef WOLFSSL_DTLS_CID
14129
            case TLSX_CONNECTION_ID:
14130
                length += CID_GET_SIZE((byte*)extension->data);
14131
                break;
14132
#endif /* WOLFSSL_DTLS_CID */
14133
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
14134
            case TLSX_ECH:
14135
                length += ECH_GET_SIZE((WOLFSSL_ECH*)extension->data, msgType);
14136
                break;
14137
#endif
14138
            default:
14139
                break;
14140
        }
14141
14142
        /* marks the extension as processed so ctx level */
14143
        /* extensions don't overlap with ssl level ones. */
14144
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
14145
    }
14146
14147
    *pLength += length;
14148
14149
    return ret;
14150
}
14151
14152
/** Writes the extensions of a list in a buffer. */
14153
static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
14154
                         byte msgType, word16* pOffset)
14155
{
14156
    int    ret = 0;
14157
    TLSX*  extension;
14158
    word16 offset = 0;
14159
    word16 length_offset = 0;
14160
    byte   isRequest = (msgType == client_hello ||
14161
                        msgType == certificate_request);
14162
14163
    while ((extension = list)) {
14164
        list = extension->next;
14165
14166
        /* only extensions marked as response are written in a response. */
14167
        if (!isRequest && !extension->resp)
14168
            continue; /* skip! */
14169
14170
        /* ssl level extensions are expected to override ctx level ones. */
14171
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
14172
            continue; /* skip! */
14173
14174
        /* writes extension type. */
14175
        c16toa((word16)extension->type, output + offset);
14176
        offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
14177
        length_offset = offset;
14178
14179
        /* extension data should be written internally. */
14180
        switch (extension->type) {
14181
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
14182
            case TLSX_CKS:
14183
                WOLFSSL_MSG("CKS extension to write");
14184
                offset += CKS_WRITE(((WOLFSSL*)extension->data),
14185
                                    output + offset);
14186
                break;
14187
#endif
14188
#ifdef HAVE_SNI
14189
            case TLSX_SERVER_NAME:
14190
                if (isRequest) {
14191
                    WOLFSSL_MSG("SNI extension to write");
14192
                    offset += SNI_WRITE((SNI*)extension->data, output + offset);
14193
                }
14194
                break;
14195
#endif
14196
14197
            case TLSX_TRUSTED_CA_KEYS:
14198
                WOLFSSL_MSG("Trusted CA Indication extension to write");
14199
                if (isRequest) {
14200
                    offset += TCA_WRITE((TCA*)extension->data, output + offset);
14201
                }
14202
                break;
14203
14204
            case TLSX_MAX_FRAGMENT_LENGTH:
14205
                WOLFSSL_MSG("Max Fragment Length extension to write");
14206
                offset += MFL_WRITE((byte*)extension->data, output + offset);
14207
                break;
14208
14209
            case TLSX_EXTENDED_MASTER_SECRET:
14210
                WOLFSSL_MSG("Extended Master Secret");
14211
                /* always empty. */
14212
                break;
14213
14214
            case TLSX_TRUNCATED_HMAC:
14215
                WOLFSSL_MSG("Truncated HMAC extension to write");
14216
                /* always empty. */
14217
                break;
14218
14219
            case TLSX_SUPPORTED_GROUPS:
14220
                WOLFSSL_MSG("Supported Groups extension to write");
14221
                offset += EC_WRITE((SupportedCurve*)extension->data,
14222
                                    output + offset);
14223
                break;
14224
14225
            case TLSX_EC_POINT_FORMATS:
14226
                WOLFSSL_MSG("Point Formats extension to write");
14227
                offset += PF_WRITE((PointFormat*)extension->data,
14228
                                    output + offset);
14229
                break;
14230
14231
            case TLSX_STATUS_REQUEST:
14232
                WOLFSSL_MSG("Certificate Status Request extension to write");
14233
                ret = CSR_WRITE((CertificateStatusRequest*)extension->data,
14234
                        output + offset, isRequest);
14235
                if (ret > 0) {
14236
                    offset += (word16)ret;
14237
                    ret = 0;
14238
                }
14239
                break;
14240
14241
            case TLSX_STATUS_REQUEST_V2:
14242
                WOLFSSL_MSG("Certificate Status Request v2 extension to write");
14243
                ret = CSR2_WRITE(
14244
                        (CertificateStatusRequestItemV2*)extension->data,
14245
                        output + offset, isRequest);
14246
                if (ret > 0) {
14247
                    offset += (word16)ret;
14248
                    ret = 0;
14249
                }
14250
                break;
14251
14252
            case TLSX_RENEGOTIATION_INFO:
14253
                WOLFSSL_MSG("Secure Renegotiation extension to write");
14254
                offset += SCR_WRITE((SecureRenegotiation*)extension->data,
14255
                        output + offset, isRequest);
14256
                break;
14257
14258
            case TLSX_SESSION_TICKET:
14259
                WOLFSSL_MSG("Session Ticket extension to write");
14260
                offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
14261
                        output + offset, isRequest);
14262
                break;
14263
14264
            case TLSX_APPLICATION_LAYER_PROTOCOL:
14265
                WOLFSSL_MSG("ALPN extension to write");
14266
                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
14267
                break;
14268
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14269
            case TLSX_SIGNATURE_ALGORITHMS:
14270
                WOLFSSL_MSG("Signature Algorithms extension to write");
14271
                offset += SA_WRITE(extension->data, output + offset);
14272
                break;
14273
#endif
14274
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
14275
            case TLSX_ENCRYPT_THEN_MAC:
14276
                WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
14277
                ret = ETM_WRITE(extension->data, output, msgType, &offset);
14278
                break;
14279
#endif /* HAVE_ENCRYPT_THEN_MAC */
14280
14281
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
14282
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14283
            case TLSX_PRE_SHARED_KEY:
14284
                WOLFSSL_MSG("Pre-Shared Key extension to write");
14285
                ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
14286
                                                              msgType, &offset);
14287
                break;
14288
14289
        #ifdef WOLFSSL_TLS13
14290
            case TLSX_PSK_KEY_EXCHANGE_MODES:
14291
                WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
14292
                ret = PKM_WRITE((byte)extension->val, output + offset, msgType,
14293
                                                                       &offset);
14294
                break;
14295
        #endif
14296
    #endif
14297
            case TLSX_KEY_SHARE:
14298
                WOLFSSL_MSG("Key Share extension to write");
14299
                offset += KS_WRITE((KeyShareEntry*)extension->data,
14300
                                                      output + offset, msgType);
14301
                break;
14302
#endif
14303
#ifdef WOLFSSL_TLS13
14304
            case TLSX_SUPPORTED_VERSIONS:
14305
                WOLFSSL_MSG("Supported Versions extension to write");
14306
                ret = SV_WRITE(extension->data, output + offset, msgType,
14307
                                                                       &offset);
14308
                break;
14309
14310
    #ifdef WOLFSSL_SEND_HRR_COOKIE
14311
            case TLSX_COOKIE:
14312
                WOLFSSL_MSG("Cookie extension to write");
14313
                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
14314
                                msgType, &offset);
14315
                break;
14316
    #endif
14317
14318
    #ifdef WOLFSSL_EARLY_DATA
14319
            case TLSX_EARLY_DATA:
14320
                WOLFSSL_MSG("Early Data extension to write");
14321
                ret = EDI_WRITE(extension->val, output + offset, msgType,
14322
                                                                       &offset);
14323
                break;
14324
    #endif
14325
14326
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
14327
            case TLSX_POST_HANDSHAKE_AUTH:
14328
                WOLFSSL_MSG("Post-Handshake Authentication extension to write");
14329
                ret = PHA_WRITE(output + offset, msgType, &offset);
14330
                break;
14331
    #endif
14332
14333
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14334
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
14335
                WOLFSSL_MSG("Signature Algorithms extension to write");
14336
                offset += SAC_WRITE(extension->data, output + offset);
14337
                break;
14338
    #endif
14339
14340
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14341
            case TLSX_CERTIFICATE_AUTHORITIES:
14342
                WOLFSSL_MSG("Certificate Authorities extension to write");
14343
                offset += CAN_WRITE(extension->data, output + offset);
14344
                break;
14345
    #endif
14346
#endif
14347
#ifdef WOLFSSL_SRTP
14348
            case TLSX_USE_SRTP:
14349
                WOLFSSL_MSG("SRTP extension to write");
14350
                offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset);
14351
                break;
14352
#endif
14353
14354
#ifdef HAVE_RPK
14355
            case TLSX_CLIENT_CERTIFICATE_TYPE:
14356
                WOLFSSL_MSG("Client Certificate Type extension to write");
14357
                offset += CCT_WRITE(extension->data, output + offset, msgType);
14358
                break;
14359
14360
            case TLSX_SERVER_CERTIFICATE_TYPE:
14361
                WOLFSSL_MSG("Server Certificate Type extension to write");
14362
                offset += SCT_WRITE(extension->data, output + offset, msgType);
14363
                break;
14364
#endif /* HAVE_RPK */
14365
14366
#ifdef WOLFSSL_QUIC
14367
            case TLSX_KEY_QUIC_TP_PARAMS:
14368
                FALL_THROUGH;
14369
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
14370
                WOLFSSL_MSG("QUIC transport parameter to write");
14371
                offset += QTP_WRITE((QuicTransportParam*)extension->data,
14372
                                    output + offset);
14373
                break;
14374
#endif
14375
#ifdef WOLFSSL_DTLS_CID
14376
            case TLSX_CONNECTION_ID:
14377
                WOLFSSL_MSG("Connection ID extension to write");
14378
                offset += CID_WRITE((byte*)extension->data, output+offset);
14379
                break;
14380
14381
#endif /* WOLFSSL_DTLS_CID */
14382
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
14383
            case TLSX_ECH:
14384
                WOLFSSL_MSG("ECH extension to write");
14385
                ret = ECH_WRITE((WOLFSSL_ECH*)extension->data, msgType,
14386
                    output + offset, &offset);
14387
                break;
14388
#endif
14389
            default:
14390
                break;
14391
        }
14392
14393
        /* writes extension data length. */
14394
        c16toa(offset - length_offset, output + length_offset - OPAQUE16_LEN);
14395
14396
        /* marks the extension as processed so ctx level */
14397
        /* extensions don't overlap with ssl level ones. */
14398
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
14399
14400
        /* if we encountered an error propagate it */
14401
        if (ret != 0)
14402
            break;
14403
    }
14404
14405
    *pOffset += offset;
14406
14407
    return ret;
14408
}
14409
14410
#ifdef HAVE_SUPPORTED_CURVES
14411
14412
/* Populates the default supported groups / curves */
14413
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
14414
{
14415
    int ret = WOLFSSL_SUCCESS;
14416
#ifdef WOLFSSL_TLS13
14417
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14418
    if (ssl->options.resuming && ssl->session->namedGroup != 0) {
14419
        return TLSX_UseSupportedCurve(extensions, ssl->session->namedGroup,
14420
                                                                     ssl->heap);
14421
    }
14422
#endif
14423
14424
    if (ssl->numGroups != 0) {
14425
        int i;
14426
        for (i = 0; i < ssl->numGroups; i++) {
14427
            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap);
14428
            if (ret != WOLFSSL_SUCCESS)
14429
                return ret;
14430
        }
14431
        return WOLFSSL_SUCCESS;
14432
    }
14433
#endif /* WOLFSSL_TLS13 */
14434
14435
#if defined(HAVE_ECC)
14436
        /* list in order by strength, since not all servers choose by strength */
14437
        #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
14438
            #ifndef NO_ECC_SECP
14439
                ret = TLSX_UseSupportedCurve(extensions,
14440
                                              WOLFSSL_ECC_SECP521R1, ssl->heap);
14441
                if (ret != WOLFSSL_SUCCESS) return ret;
14442
            #endif
14443
        #endif
14444
        #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
14445
            #ifdef HAVE_ECC_BRAINPOOL
14446
                if (IsAtLeastTLSv1_3(ssl->version)) {
14447
                    /* TLS 1.3 BrainpoolP512 curve */
14448
                    ret = TLSX_UseSupportedCurve(extensions,
14449
                                WOLFSSL_ECC_BRAINPOOLP512R1TLS13, ssl->heap);
14450
                    if (ret != WOLFSSL_SUCCESS) return ret;
14451
14452
                    /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
14453
                    if (ssl->options.downgrade &&
14454
                        (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
14455
                         ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
14456
                        ret = TLSX_UseSupportedCurve(extensions,
14457
                                    WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
14458
                        if (ret != WOLFSSL_SUCCESS) return ret;
14459
                    }
14460
                }
14461
                else {
14462
                    /* TLS 1.2 only */
14463
                    ret = TLSX_UseSupportedCurve(extensions,
14464
                        WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
14465
                    if (ret != WOLFSSL_SUCCESS) return ret;
14466
                }
14467
            #endif
14468
        #endif
14469
        #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
14470
            #ifndef NO_ECC_SECP
14471
                ret = TLSX_UseSupportedCurve(extensions,
14472
                                              WOLFSSL_ECC_SECP384R1, ssl->heap);
14473
                if (ret != WOLFSSL_SUCCESS) return ret;
14474
            #endif
14475
            #ifdef HAVE_ECC_BRAINPOOL
14476
                if (IsAtLeastTLSv1_3(ssl->version)) {
14477
                    /* TLS 1.3 BrainpoolP384 curve */
14478
                    ret = TLSX_UseSupportedCurve(extensions,
14479
                                WOLFSSL_ECC_BRAINPOOLP384R1TLS13, ssl->heap);
14480
                    if (ret != WOLFSSL_SUCCESS) return ret;
14481
14482
                    /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
14483
                    if (ssl->options.downgrade &&
14484
                        (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
14485
                         ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
14486
                        ret = TLSX_UseSupportedCurve(extensions,
14487
                                    WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
14488
                        if (ret != WOLFSSL_SUCCESS) return ret;
14489
                    }
14490
                }
14491
                else {
14492
                    /* TLS 1.2 only */
14493
                    ret = TLSX_UseSupportedCurve(extensions,
14494
                        WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
14495
                    if (ret != WOLFSSL_SUCCESS) return ret;
14496
                }
14497
            #endif
14498
        #endif
14499
#endif /* HAVE_ECC */
14500
14501
        #ifndef HAVE_FIPS
14502
            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14503
                ret = TLSX_UseSupportedCurve(extensions,
14504
                                                   WOLFSSL_ECC_X448, ssl->heap);
14505
                if (ret != WOLFSSL_SUCCESS) return ret;
14506
            #endif
14507
        #endif /* HAVE_FIPS */
14508
14509
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
14510
        #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
14511
            #ifndef NO_ECC_SECP
14512
                ret = TLSX_UseSupportedCurve(extensions,
14513
                                              WOLFSSL_ECC_SECP256R1, ssl->heap);
14514
                if (ret != WOLFSSL_SUCCESS) return ret;
14515
            #endif
14516
            #ifdef HAVE_ECC_KOBLITZ
14517
                ret = TLSX_UseSupportedCurve(extensions,
14518
                                              WOLFSSL_ECC_SECP256K1, ssl->heap);
14519
                if (ret != WOLFSSL_SUCCESS) return ret;
14520
            #endif
14521
            #ifdef HAVE_ECC_BRAINPOOL
14522
                if (IsAtLeastTLSv1_3(ssl->version)) {
14523
                    /* TLS 1.3 BrainpoolP256 curve */
14524
                    ret = TLSX_UseSupportedCurve(extensions,
14525
                                            WOLFSSL_ECC_BRAINPOOLP256R1TLS13, ssl->heap);
14526
                    if (ret != WOLFSSL_SUCCESS) return ret;
14527
14528
                    /* If TLS 1.2 is allowed, also add the TLS 1.2 curve */
14529
                    if (ssl->options.downgrade &&
14530
                        (ssl->options.minDowngrade <= TLSv1_2_MINOR ||
14531
                         ssl->options.minDowngrade <= DTLSv1_2_MINOR)) {
14532
                        ret = TLSX_UseSupportedCurve(extensions,
14533
                                    WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
14534
                        if (ret != WOLFSSL_SUCCESS) return ret;
14535
                    }
14536
                }
14537
                else {
14538
                    /* TLS 1.2 only */
14539
                    ret = TLSX_UseSupportedCurve(extensions,
14540
                        WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
14541
                    if (ret != WOLFSSL_SUCCESS) return ret;
14542
                }
14543
            #endif
14544
            #ifdef WOLFSSL_SM2
14545
                ret = TLSX_UseSupportedCurve(extensions,
14546
                                              WOLFSSL_ECC_SM2P256V1, ssl->heap);
14547
                if (ret != WOLFSSL_SUCCESS) return ret;
14548
            #endif
14549
        #endif
14550
#endif /* HAVE_ECC */
14551
14552
        #ifndef HAVE_FIPS
14553
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14554
                ret = TLSX_UseSupportedCurve(extensions,
14555
                                                 WOLFSSL_ECC_X25519, ssl->heap);
14556
                if (ret != WOLFSSL_SUCCESS) return ret;
14557
            #endif
14558
        #endif /* HAVE_FIPS */
14559
14560
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
14561
        #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
14562
            #ifndef NO_ECC_SECP
14563
                ret = TLSX_UseSupportedCurve(extensions,
14564
                                              WOLFSSL_ECC_SECP224R1, ssl->heap);
14565
                if (ret != WOLFSSL_SUCCESS) return ret;
14566
            #endif
14567
            #ifdef HAVE_ECC_KOBLITZ
14568
                ret = TLSX_UseSupportedCurve(extensions,
14569
                                              WOLFSSL_ECC_SECP224K1, ssl->heap);
14570
                if (ret != WOLFSSL_SUCCESS) return ret;
14571
            #endif
14572
        #endif
14573
14574
    #ifndef HAVE_FIPS
14575
        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
14576
            #ifndef NO_ECC_SECP
14577
                ret = TLSX_UseSupportedCurve(extensions,
14578
                                              WOLFSSL_ECC_SECP192R1, ssl->heap);
14579
                if (ret != WOLFSSL_SUCCESS) return ret;
14580
            #endif
14581
            #ifdef HAVE_ECC_KOBLITZ
14582
                ret = TLSX_UseSupportedCurve(extensions,
14583
                                              WOLFSSL_ECC_SECP192K1, ssl->heap);
14584
                if (ret != WOLFSSL_SUCCESS) return ret;
14585
            #endif
14586
        #endif
14587
        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
14588
            #ifndef NO_ECC_SECP
14589
                ret = TLSX_UseSupportedCurve(extensions,
14590
                                              WOLFSSL_ECC_SECP160R1, ssl->heap);
14591
                if (ret != WOLFSSL_SUCCESS) return ret;
14592
            #endif
14593
            #ifdef HAVE_ECC_SECPR2
14594
                ret = TLSX_UseSupportedCurve(extensions,
14595
                                              WOLFSSL_ECC_SECP160R2, ssl->heap);
14596
                if (ret != WOLFSSL_SUCCESS) return ret;
14597
            #endif
14598
            #ifdef HAVE_ECC_KOBLITZ
14599
                ret = TLSX_UseSupportedCurve(extensions,
14600
                                              WOLFSSL_ECC_SECP160K1, ssl->heap);
14601
                if (ret != WOLFSSL_SUCCESS) return ret;
14602
            #endif
14603
        #endif
14604
    #endif /* HAVE_FIPS */
14605
#endif /* HAVE_ECC */
14606
14607
#ifndef NO_DH
14608
            /* Add FFDHE supported groups. */
14609
        #ifdef HAVE_FFDHE_8192
14610
            if (8192/8 >= ssl->options.minDhKeySz &&
14611
                                            8192/8 <= ssl->options.maxDhKeySz) {
14612
                ret = TLSX_UseSupportedCurve(extensions,
14613
                                             WOLFSSL_FFDHE_8192, ssl->heap);
14614
                if (ret != WOLFSSL_SUCCESS)
14615
                    return ret;
14616
            }
14617
        #endif
14618
        #ifdef HAVE_FFDHE_6144
14619
            if (6144/8 >= ssl->options.minDhKeySz &&
14620
                                            6144/8 <= ssl->options.maxDhKeySz) {
14621
                ret = TLSX_UseSupportedCurve(extensions,
14622
                                             WOLFSSL_FFDHE_6144, ssl->heap);
14623
                if (ret != WOLFSSL_SUCCESS)
14624
                    return ret;
14625
            }
14626
        #endif
14627
        #ifdef HAVE_FFDHE_4096
14628
            if (4096/8 >= ssl->options.minDhKeySz &&
14629
                                            4096/8 <= ssl->options.maxDhKeySz) {
14630
                ret = TLSX_UseSupportedCurve(extensions,
14631
                                             WOLFSSL_FFDHE_4096, ssl->heap);
14632
                if (ret != WOLFSSL_SUCCESS)
14633
                    return ret;
14634
            }
14635
        #endif
14636
        #ifdef HAVE_FFDHE_3072
14637
            if (3072/8 >= ssl->options.minDhKeySz &&
14638
                                            3072/8 <= ssl->options.maxDhKeySz) {
14639
                ret = TLSX_UseSupportedCurve(extensions,
14640
                                             WOLFSSL_FFDHE_3072, ssl->heap);
14641
                if (ret != WOLFSSL_SUCCESS)
14642
                    return ret;
14643
            }
14644
        #endif
14645
        #ifdef HAVE_FFDHE_2048
14646
            if (2048/8 >= ssl->options.minDhKeySz &&
14647
                                            2048/8 <= ssl->options.maxDhKeySz) {
14648
                ret = TLSX_UseSupportedCurve(extensions,
14649
                                             WOLFSSL_FFDHE_2048, ssl->heap);
14650
                if (ret != WOLFSSL_SUCCESS)
14651
                    return ret;
14652
            }
14653
        #endif
14654
#endif
14655
14656
#ifdef WOLFSSL_HAVE_MLKEM
14657
#ifndef WOLFSSL_NO_ML_KEM
14658
#ifdef WOLFSSL_WC_MLKEM
14659
#ifndef WOLFSSL_NO_ML_KEM_512
14660
    if (ret == WOLFSSL_SUCCESS)
14661
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512,
14662
                                     ssl->heap);
14663
    if (ret == WOLFSSL_SUCCESS)
14664
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM512,
14665
                                     ssl->heap);
14666
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14667
    if (ret == WOLFSSL_SUCCESS)
14668
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM512,
14669
                                     ssl->heap);
14670
    #endif
14671
#endif
14672
#ifndef WOLFSSL_NO_ML_KEM_768
14673
    if (ret == WOLFSSL_SUCCESS)
14674
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
14675
                                     ssl->heap);
14676
    if (ret == WOLFSSL_SUCCESS)
14677
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM768,
14678
                                     ssl->heap);
14679
    if (ret == WOLFSSL_SUCCESS)
14680
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM768,
14681
                                     ssl->heap);
14682
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14683
    if (ret == WOLFSSL_SUCCESS)
14684
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM768,
14685
                                     ssl->heap);
14686
    #endif
14687
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14688
    if (ret == WOLFSSL_SUCCESS)
14689
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448MLKEM768,
14690
                                     ssl->heap);
14691
    #endif
14692
#endif
14693
#ifndef WOLFSSL_NO_ML_KEM_1024
14694
    if (ret == WOLFSSL_SUCCESS)
14695
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
14696
                                     ssl->heap);
14697
    if (ret == WOLFSSL_SUCCESS)
14698
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP521R1MLKEM1024,
14699
                                     ssl->heap);
14700
    if (ret == WOLFSSL_SUCCESS)
14701
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM1024,
14702
                                     ssl->heap);
14703
#endif
14704
#elif defined(HAVE_LIBOQS)
14705
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512, ssl->heap);
14706
    if (ret == WOLFSSL_SUCCESS)
14707
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
14708
                                     ssl->heap);
14709
    if (ret == WOLFSSL_SUCCESS)
14710
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
14711
                                     ssl->heap);
14712
    if (ret == WOLFSSL_SUCCESS)
14713
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM512,
14714
                                     ssl->heap);
14715
    if (ret == WOLFSSL_SUCCESS)
14716
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM768,
14717
                                     ssl->heap);
14718
    if (ret == WOLFSSL_SUCCESS)
14719
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM768,
14720
                                     ssl->heap);
14721
    if (ret == WOLFSSL_SUCCESS)
14722
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP521R1MLKEM1024,
14723
                                     ssl->heap);
14724
    if (ret == WOLFSSL_SUCCESS)
14725
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM1024,
14726
                                     ssl->heap);
14727
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14728
    if (ret == WOLFSSL_SUCCESS)
14729
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM512,
14730
                                     ssl->heap);
14731
    if (ret == WOLFSSL_SUCCESS)
14732
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM768,
14733
                                     ssl->heap);
14734
    #endif
14735
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14736
    if (ret == WOLFSSL_SUCCESS)
14737
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448MLKEM768,
14738
                                     ssl->heap);
14739
    #endif
14740
#endif /* HAVE_LIBOQS */
14741
#endif /* !WOLFSSL_NO_ML_KEM */
14742
#ifdef WOLFSSL_MLKEM_KYBER
14743
#ifdef WOLFSSL_WC_MLKEM
14744
#ifdef WOLFSSL_KYBER512
14745
    if (ret == WOLFSSL_SUCCESS)
14746
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1,
14747
                                     ssl->heap);
14748
    if (ret == WOLFSSL_SUCCESS)
14749
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
14750
                                     ssl->heap);
14751
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14752
    if (ret == WOLFSSL_SUCCESS)
14753
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
14754
                                     ssl->heap);
14755
    #endif
14756
#endif
14757
#ifdef WOLFSSL_KYBER768
14758
    if (ret == WOLFSSL_SUCCESS)
14759
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
14760
                                     ssl->heap);
14761
    if (ret == WOLFSSL_SUCCESS)
14762
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
14763
                                     ssl->heap);
14764
    if (ret == WOLFSSL_SUCCESS)
14765
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
14766
                                     ssl->heap);
14767
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14768
    if (ret == WOLFSSL_SUCCESS)
14769
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
14770
                                     ssl->heap);
14771
    #endif
14772
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14773
    if (ret == WOLFSSL_SUCCESS)
14774
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
14775
                                     ssl->heap);
14776
    #endif
14777
#endif
14778
#ifdef WOLFSSL_KYBER1024
14779
    if (ret == WOLFSSL_SUCCESS)
14780
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
14781
                                     ssl->heap);
14782
    if (ret == WOLFSSL_SUCCESS)
14783
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
14784
                                     ssl->heap);
14785
#endif
14786
#elif defined(HAVE_LIBOQS)
14787
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap);
14788
    if (ret == WOLFSSL_SUCCESS)
14789
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
14790
                                     ssl->heap);
14791
    if (ret == WOLFSSL_SUCCESS)
14792
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
14793
                                     ssl->heap);
14794
    if (ret == WOLFSSL_SUCCESS)
14795
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
14796
                                     ssl->heap);
14797
    if (ret == WOLFSSL_SUCCESS)
14798
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
14799
                                     ssl->heap);
14800
    if (ret == WOLFSSL_SUCCESS)
14801
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
14802
                                     ssl->heap);
14803
    if (ret == WOLFSSL_SUCCESS)
14804
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
14805
                                     ssl->heap);
14806
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14807
    if (ret == WOLFSSL_SUCCESS)
14808
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
14809
                                     ssl->heap);
14810
    if (ret == WOLFSSL_SUCCESS)
14811
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
14812
                                     ssl->heap);
14813
    #endif
14814
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14815
    if (ret == WOLFSSL_SUCCESS)
14816
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
14817
                                     ssl->heap);
14818
    #endif
14819
#endif /* HAVE_LIBOQS */
14820
#endif /* WOLFSSL_MLKEM_KYBER */
14821
#endif /* WOLFSSL_HAVE_MLKEM */
14822
14823
    (void)ssl;
14824
    (void)extensions;
14825
14826
    return ret;
14827
}
14828
14829
#endif /* HAVE_SUPPORTED_CURVES */
14830
14831
int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
14832
0
{
14833
0
    int ret = 0;
14834
0
    byte* public_key      = NULL;
14835
0
    word16 public_key_len = 0;
14836
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
14837
    int usingPSK = 0;
14838
#endif
14839
0
#if defined(HAVE_SUPPORTED_CURVES) && defined(WOLFSSL_TLS13)
14840
0
    TLSX* extension = NULL;
14841
0
    word16 namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
14842
0
#endif
14843
14844
    /* server will add extension depending on what is parsed from client */
14845
0
    if (!isServer) {
14846
#if defined(HAVE_RPK)
14847
        ret = TLSX_ClientCertificateType_Use(ssl, isServer);
14848
        if (ret != 0)
14849
            return ret;
14850
14851
        ret = TLSX_ServerCertificateType_Use(ssl, isServer);
14852
        if (ret != 0)
14853
            return ret;
14854
#endif /* HAVE_RPK */
14855
14856
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) && \
14857
0
    !defined(WOLFSSL_NO_TLS12)
14858
0
        if (!ssl->options.disallowEncThenMac) {
14859
0
            ret = TLSX_EncryptThenMac_Use(ssl);
14860
0
            if (ret != 0)
14861
0
                return ret;
14862
0
        }
14863
0
#endif
14864
14865
0
#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
14866
0
                       defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
14867
0
        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
14868
0
            if (TLSX_Find(ssl->ctx->extensions,
14869
0
                                               TLSX_SUPPORTED_GROUPS) == NULL) {
14870
0
                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
14871
0
                if (ret != WOLFSSL_SUCCESS)
14872
0
                    return ret;
14873
0
            }
14874
0
        }
14875
0
        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
14876
0
               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
14877
0
               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
14878
0
             ret = TLSX_UsePointFormat(&ssl->extensions,
14879
0
                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
14880
0
             if (ret != WOLFSSL_SUCCESS)
14881
0
                 return ret;
14882
0
        }
14883
0
#endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
14884
14885
#ifdef WOLFSSL_SRTP
14886
        if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
14887
            WOLFSSL_MSG("Adding DTLS SRTP extension");
14888
            if ((ret = TLSX_UseSRTP(&ssl->extensions, ssl->dtlsSrtpProfiles,
14889
                                                                ssl->heap)) != 0) {
14890
                return ret;
14891
            }
14892
        }
14893
#endif
14894
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
14895
        if ((IsAtLeastTLSv1_3(ssl->version)) && (ssl->sigSpec != NULL)) {
14896
            WOLFSSL_MSG("Adding CKS extension");
14897
            if ((ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap)) != 0) {
14898
                return ret;
14899
            }
14900
        }
14901
#endif
14902
0
    } /* is not server */
14903
14904
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14905
0
    WOLFSSL_MSG("Adding signature algorithms extension");
14906
0
    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
14907
0
                                                                         != 0) {
14908
0
            return ret;
14909
0
    }
14910
#else
14911
    ret = 0;
14912
#endif
14913
0
#ifdef WOLFSSL_TLS13
14914
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14915
        if (IsAtLeastTLSv1_3(ssl->version) &&
14916
                SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
14917
            WOLFSSL_MSG("Adding certificate authorities extension");
14918
            if ((ret = TLSX_Push(&ssl->extensions,
14919
                    TLSX_CERTIFICATE_AUTHORITIES, ssl, ssl->heap)) != 0) {
14920
                    return ret;
14921
            }
14922
        }
14923
    #endif
14924
0
        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
14925
            /* Add mandatory TLS v1.3 extension: supported version */
14926
0
            WOLFSSL_MSG("Adding supported versions extension");
14927
0
            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
14928
0
                                                             ssl->heap)) != 0) {
14929
0
                return ret;
14930
0
            }
14931
14932
    #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && \
14933
                       !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)
14934
        if (TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
14935
            /* Put in DH groups for TLS 1.3 only. */
14936
            ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
14937
            if (ret != WOLFSSL_SUCCESS)
14938
                return ret;
14939
        /* ret value will be overwritten in !NO_PSK case */
14940
        #ifdef NO_PSK
14941
            ret = 0;
14942
        #endif
14943
        }
14944
    #endif /* !(HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
14945
14946
0
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14947
0
            if (ssl->certHashSigAlgoSz > 0) {
14948
0
                WOLFSSL_MSG("Adding signature algorithms cert extension");
14949
0
                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
14950
0
                                                        ssl, ssl->heap)) != 0) {
14951
0
                    return ret;
14952
0
                }
14953
0
            }
14954
0
        #endif
14955
14956
0
        #if defined(HAVE_SUPPORTED_CURVES)
14957
0
            extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
14958
0
            if (extension == NULL) {
14959
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14960
                if (ssl->options.resuming && ssl->session->namedGroup != 0)
14961
                    namedGroup = ssl->session->namedGroup;
14962
                else
14963
            #endif
14964
0
                if (ssl->numGroups > 0) {
14965
0
                    int set = 0;
14966
0
                    int i, j;
14967
14968
                    /* try to find the highest element in ssl->group[]
14969
                     * that is contained in preferredGroup[].
14970
                     */
14971
0
                    namedGroup = preferredGroup[0];
14972
0
                    for (i = 0; i < ssl->numGroups && !set; i++) {
14973
0
                        for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
14974
0
                            if (preferredGroup[j] == ssl->group[i]
14975
#ifdef HAVE_LIBOQS
14976
                                && TLSX_IsGroupSupported(preferredGroup[j])
14977
#endif
14978
0
                                                                ) {
14979
0
                                namedGroup = ssl->group[i];
14980
0
                                set = 1;
14981
0
                                break;
14982
0
                            }
14983
0
                        }
14984
0
                    }
14985
0
                    if (!set)
14986
0
                        namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
14987
0
                }
14988
0
                else {
14989
                    /* Choose the most preferred group. */
14990
0
                    namedGroup = preferredGroup[0];
14991
#ifdef HAVE_LIBOQS
14992
                    if (!TLSX_IsGroupSupported(namedGroup)) {
14993
                        int i = 1;
14994
                        for (;preferredGroup[i] != WOLFSSL_NAMED_GROUP_INVALID;
14995
                              i++) {
14996
                            if (TLSX_IsGroupSupported(preferredGroup[i]))
14997
                                break;
14998
                        }
14999
                        namedGroup = preferredGroup[i];
15000
                    }
15001
#endif
15002
0
                }
15003
0
            }
15004
0
            else {
15005
0
                KeyShareEntry* kse = (KeyShareEntry*)extension->data;
15006
0
                if (kse)
15007
0
                    namedGroup = kse->group;
15008
0
            }
15009
0
            if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
15010
0
                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
15011
0
                        &ssl->extensions);
15012
0
                if (ret != 0)
15013
0
                    return ret;
15014
0
            }
15015
0
        #endif /* HAVE_SUPPORTED_CURVES */
15016
15017
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15018
            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
15019
        #endif
15020
        #if defined(HAVE_SESSION_TICKET)
15021
            if (ssl->options.resuming && ssl->session->ticketLen > 0) {
15022
                WOLFSSL_SESSION* sess = ssl->session;
15023
            #ifdef WOLFSSL_32BIT_MILLI_TIME
15024
                word32 now, milli;
15025
            #else
15026
                word64 now, milli;
15027
            #endif
15028
15029
                /* Determine the MAC algorithm for the cipher suite used. */
15030
                ssl->options.cipherSuite0 = sess->cipherSuite0;
15031
                ssl->options.cipherSuite  = sess->cipherSuite;
15032
                ret = SetCipherSpecs(ssl);
15033
                if (ret != 0)
15034
                    return ret;
15035
                now = (word64)TimeNowInMilliseconds();
15036
                if (now == 0)
15037
                    return GETTIME_ERROR;
15038
            #ifdef WOLFSSL_32BIT_MILLI_TIME
15039
                if (now < sess->ticketSeen)
15040
                    milli = (0xFFFFFFFFU - sess->ticketSeen) + 1 + now;
15041
                else
15042
                    milli = now - sess->ticketSeen;
15043
                milli += sess->ticketAdd;
15044
15045
                /* Pre-shared key is mandatory extension for resumption. */
15046
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
15047
                    sess->ticketLen, milli, ssl->specs.mac_algorithm,
15048
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
15049
                    NULL, ssl->heap);
15050
            #else
15051
                milli = now - sess->ticketSeen + sess->ticketAdd;
15052
15053
                /* Pre-shared key is mandatory extension for resumption. */
15054
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
15055
                    sess->ticketLen, (word32)milli, ssl->specs.mac_algorithm,
15056
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
15057
                    NULL, ssl->heap);
15058
            #endif
15059
                if (ret != 0)
15060
                    return ret;
15061
15062
                usingPSK = 1;
15063
            }
15064
        #endif
15065
    #ifndef NO_PSK
15066
        #ifndef WOLFSSL_PSK_ONE_ID
15067
            if (ssl->options.client_psk_cs_cb != NULL) {
15068
                int i;
15069
                const Suites* suites = WOLFSSL_SUITES(ssl);
15070
                for (i = 0; i < suites->suiteSz; i += 2) {
15071
                    byte cipherSuite0 = suites->suites[i + 0];
15072
                    byte cipherSuite = suites->suites[i + 1];
15073
                    unsigned int keySz;
15074
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
15075
                    int cnt = 0;
15076
                #endif
15077
15078
                #ifdef HAVE_NULL_CIPHER
15079
                    if (cipherSuite0 == ECC_BYTE ||
15080
                        cipherSuite0 == ECDHE_PSK_BYTE) {
15081
                        if (cipherSuite != TLS_SHA256_SHA256 &&
15082
                                             cipherSuite != TLS_SHA384_SHA384) {
15083
                            continue;
15084
                        }
15085
                    }
15086
                    else
15087
                #endif
15088
                #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
15089
                    defined(WOLFSSL_SM3)
15090
                    if (cipherSuite0 == CIPHER_BYTE) {
15091
                        if ((cipherSuite != TLS_SM4_GCM_SM3) &&
15092
                            (cipherSuite != TLS_SM4_CCM_SM3)) {
15093
                            continue;
15094
                        }
15095
                    }
15096
                    else
15097
                #endif
15098
                    if (cipherSuite0 != TLS13_BYTE)
15099
                        continue;
15100
15101
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
15102
                    do {
15103
                        ssl->arrays->client_identity[0] = cnt;
15104
                #endif
15105
15106
                        ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
15107
                        keySz = ssl->options.client_psk_cs_cb(
15108
                            ssl, ssl->arrays->server_hint,
15109
                            ssl->arrays->client_identity, MAX_PSK_ID_LEN,
15110
                            ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
15111
                            GetCipherNameInternal(cipherSuite0, cipherSuite));
15112
                        if (keySz > 0) {
15113
                            ssl->arrays->psk_keySz = keySz;
15114
                            ret = TLSX_PreSharedKey_Use(&ssl->extensions,
15115
                                (byte*)ssl->arrays->client_identity,
15116
                                (word16)XSTRLEN(ssl->arrays->client_identity),
15117
                                0, SuiteMac(WOLFSSL_SUITES(ssl)->suites + i),
15118
                                cipherSuite0, cipherSuite, 0, NULL, ssl->heap);
15119
                            if (ret != 0)
15120
                                return ret;
15121
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
15122
                            cnt++;
15123
                #endif
15124
                        }
15125
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
15126
                    }
15127
                    while (keySz > 0);
15128
                #endif
15129
                }
15130
15131
                usingPSK = 1;
15132
            }
15133
            else
15134
        #endif
15135
            if (ssl->options.client_psk_cb != NULL ||
15136
                ssl->options.client_psk_tls13_cb != NULL) {
15137
                /* Default cipher suite. */
15138
                byte cipherSuite0 = TLS13_BYTE;
15139
                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
15140
                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
15141
                const char* cipherName = NULL;
15142
15143
                if (ssl->options.client_psk_tls13_cb != NULL) {
15144
                    ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
15145
                        ssl, ssl->arrays->server_hint,
15146
                        ssl->arrays->client_identity, MAX_PSK_ID_LEN,
15147
                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
15148
                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
15149
                            &cipherSuite, NULL, NULL, &cipherSuiteFlags) != 0) {
15150
                        return PSK_KEY_ERROR;
15151
                    }
15152
                }
15153
                else {
15154
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
15155
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
15156
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
15157
                }
15158
                if (
15159
                #ifdef OPENSSL_EXTRA
15160
                    /* OpenSSL treats a PSK key length of 0
15161
                     * to indicate no PSK available.
15162
                     */
15163
                    ssl->arrays->psk_keySz == 0 ||
15164
                #endif
15165
                         (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
15166
                     (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
15167
                #ifndef OPENSSL_EXTRA
15168
                    ret = PSK_KEY_ERROR;
15169
                #endif
15170
                }
15171
                else {
15172
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
15173
15174
                    ssl->options.cipherSuite0 = cipherSuite0;
15175
                    ssl->options.cipherSuite  = cipherSuite;
15176
                    (void)cipherSuiteFlags;
15177
                    ret = SetCipherSpecs(ssl);
15178
                    if (ret == 0) {
15179
                        ret = TLSX_PreSharedKey_Use(
15180
                            &ssl->extensions,
15181
                                     (byte*)ssl->arrays->client_identity,
15182
                            (word16)XSTRLEN(ssl->arrays->client_identity),
15183
                            0, ssl->specs.mac_algorithm,
15184
                            cipherSuite0, cipherSuite, 0,
15185
                            NULL, ssl->heap);
15186
                    }
15187
                    if (ret == 0)
15188
                        usingPSK = 1;
15189
                }
15190
                if (ret != 0)
15191
                    return ret;
15192
            }
15193
    #endif /* !NO_PSK */
15194
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15195
15196
            /* Some servers do not generate session tickets unless
15197
             * the extension is seen in a non-resume client hello.
15198
             * We used to send it only if we were otherwise using PSK.
15199
             * Now always send it. Define NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
15200
             * to revert to the old behaviour. */
15201
            #ifdef NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
15202
            if (usingPSK)
15203
            #endif
15204
            {
15205
                byte modes = 0;
15206
15207
                (void)usingPSK;
15208
                /* Pre-shared key modes: mandatory extension for resumption. */
15209
            #ifdef HAVE_SUPPORTED_CURVES
15210
                if (!ssl->options.onlyPskDheKe)
15211
            #endif
15212
                {
15213
                    modes = 1 << PSK_KE;
15214
                }
15215
            #if !defined(NO_DH) || defined(HAVE_ECC) || \
15216
                              defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
15217
                if (!ssl->options.noPskDheKe) {
15218
                    modes |= 1 << PSK_DHE_KE;
15219
                }
15220
            #endif
15221
                ret = TLSX_PskKeyModes_Use(ssl, modes);
15222
                if (ret != 0)
15223
                    return ret;
15224
            }
15225
        #endif
15226
        #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
15227
            if (!isServer && ssl->options.postHandshakeAuth) {
15228
                ret = TLSX_PostHandAuth_Use(ssl);
15229
                if (ret != 0)
15230
                    return ret;
15231
            }
15232
        #endif
15233
#if defined(HAVE_ECH)
15234
            /* GREASE ECH */
15235
            if (!ssl->options.disableECH) {
15236
                if (ssl->echConfigs == NULL) {
15237
                    ret = GREASE_ECH_USE(&(ssl->extensions), ssl->heap,
15238
                            ssl->rng);
15239
                }
15240
                else if (ssl->echConfigs != NULL) {
15241
                    ret = ECH_USE(ssl->echConfigs, &(ssl->extensions),
15242
                            ssl->heap, ssl->rng);
15243
                }
15244
            }
15245
#endif
15246
0
        }
15247
#if defined(HAVE_ECH)
15248
        else if (IsAtLeastTLSv1_3(ssl->version)) {
15249
            if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
15250
                ret = SERVER_ECH_USE(&(ssl->extensions), ssl->heap,
15251
                    ssl->ctx->echConfigs);
15252
15253
                if (ret == 0)
15254
                    TLSX_SetResponse(ssl, TLSX_ECH);
15255
            }
15256
        }
15257
#endif
15258
15259
0
#endif
15260
15261
0
    (void)isServer;
15262
0
    (void)public_key;
15263
0
    (void)public_key_len;
15264
0
    (void)ssl;
15265
15266
0
    return ret;
15267
0
}
15268
15269
15270
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
15271
15272
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15273
static int TLSX_EchChangeSNI(WOLFSSL* ssl, TLSX** pEchX,
15274
                             char* serverName, TLSX** pServerNameX,
15275
                             TLSX*** pExtensions)
15276
{
15277
    int ret = 0;
15278
    TLSX* echX = NULL;
15279
    TLSX* serverNameX = NULL;
15280
    TLSX** extensions = NULL;
15281
15282
    /* calculate the rest of the extensions length with inner ech */
15283
    if (ssl->extensions)
15284
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
15285
15286
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions)
15287
        /* if not NULL the semaphore will stop it from being counted */
15288
        echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
15289
15290
    /* if type is outer change sni to public name */
15291
    if (echX != NULL &&
15292
        ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER &&
15293
        (ssl->options.echAccepted ||
15294
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
15295
        if (ssl->extensions) {
15296
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
15297
15298
            if (serverNameX != NULL)
15299
                extensions = &ssl->extensions;
15300
        }
15301
15302
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
15303
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
15304
            extensions = &ssl->ctx->extensions;
15305
        }
15306
15307
        /* store the inner server name */
15308
        if (serverNameX != NULL) {
15309
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
15310
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
15311
15312
            /* truncate if too long */
15313
            if (hostNameSz > MAX_PUBLIC_NAME_SZ)
15314
                hostNameSz = MAX_PUBLIC_NAME_SZ;
15315
15316
            XMEMCPY(serverName, hostName, hostNameSz);
15317
        }
15318
15319
        /* remove the inner server name */
15320
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15321
15322
        /* set the public name as the server name */
15323
        if ((ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
15324
                ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
15325
                XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
15326
                ssl->heap)) == WOLFSSL_SUCCESS)
15327
            ret = 0;
15328
    }
15329
    *pServerNameX = serverNameX;
15330
    *pExtensions = extensions;
15331
    *pEchX = echX;
15332
    return ret;
15333
}
15334
15335
static int TLSX_EchRestoreSNI(WOLFSSL* ssl, char* serverName,
15336
                              TLSX* serverNameX, TLSX** extensions)
15337
{
15338
    int ret = 0;
15339
15340
    if (serverNameX != NULL) {
15341
        /* remove the public name SNI */
15342
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15343
15344
        /* restore the inner server name */
15345
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
15346
            serverName, XSTRLEN(serverName), ssl->heap);
15347
15348
        if (ret == WOLFSSL_SUCCESS)
15349
            ret = 0;
15350
    }
15351
    return ret;
15352
}
15353
15354
/* because the size of ech depends on the size of other extensions we need to
15355
 * get the size with ech special and process ech last, return status */
15356
static int TLSX_GetSizeWithEch(WOLFSSL* ssl, byte* semaphore, byte msgType,
15357
    word16* pLength)
15358
{
15359
    int ret = 0, r = 0;
15360
    TLSX* echX = NULL;
15361
    TLSX* serverNameX = NULL;
15362
    TLSX** extensions = NULL;
15363
    WC_DECLARE_VAR(serverName, char, MAX_PUBLIC_NAME_SZ, 0);
15364
15365
    WC_ALLOC_VAR_EX(serverName, char, MAX_PUBLIC_NAME_SZ, NULL,
15366
                    DYNAMIC_TYPE_TMP_BUFFER, return MEMORY_E);
15367
    r = TLSX_EchChangeSNI(ssl, &echX, serverName, &serverNameX, &extensions);
15368
    if (r == 0 && ssl->extensions)
15369
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, pLength);
15370
    if (r == 0 && ret == 0 && ssl->ctx && ssl->ctx->extensions)
15371
        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, pLength);
15372
    if (r == 0)
15373
        r = TLSX_EchRestoreSNI(ssl, serverName, serverNameX, extensions);
15374
15375
    WC_FREE_VAR_EX(serverName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15376
    if (ret == 0 && r != 0)
15377
        ret = r;
15378
    return ret;
15379
}
15380
#endif
15381
15382
/** Tells the buffered size of extensions to be sent into the client hello. */
15383
int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word32* pLength)
15384
{
15385
    int ret = 0;
15386
    word16 length = 0;
15387
    byte semaphore[SEMAPHORE_SIZE] = {0};
15388
15389
    if (!TLSX_SupportExtensions(ssl))
15390
        return 0;
15391
    if (msgType == client_hello) {
15392
        EC_VALIDATE_REQUEST(ssl, semaphore);
15393
        PF_VALIDATE_REQUEST(ssl, semaphore);
15394
        WOLF_STK_VALIDATE_REQUEST(ssl);
15395
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15396
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
15397
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15398
#endif
15399
#if defined(WOLFSSL_TLS13)
15400
        if (!IsAtLeastTLSv1_2(ssl)) {
15401
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15402
        }
15403
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15404
        if (!IsAtLeastTLSv1_3(ssl->version)) {
15405
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15406
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15407
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15408
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
15409
        #endif
15410
        #ifdef WOLFSSL_EARLY_DATA
15411
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15412
        #endif
15413
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15414
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15415
        #endif
15416
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15417
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
15418
        #endif
15419
        }
15420
    #endif
15421
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15422
        if (!IsAtLeastTLSv1_3(ssl->version) ||
15423
                SSL_CA_NAMES(ssl) == NULL) {
15424
            TURN_ON(semaphore,
15425
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15426
        }
15427
    #endif
15428
#endif /* WOLFSSL_TLS13 */
15429
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
15430
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
15431
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
15432
            /* mark already sent, so it won't send it */
15433
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15434
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15435
        }
15436
    #endif
15437
    }
15438
15439
#ifdef WOLFSSL_TLS13
15440
    #ifndef NO_CERTS
15441
    else if (msgType == certificate_request) {
15442
        /* Don't send out any extension except those that are turned off. */
15443
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15444
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15445
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15446
#endif
15447
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15448
        if (SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
15449
            TURN_OFF(semaphore,
15450
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15451
        }
15452
#endif
15453
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, OID_FILTERS
15454
         *       TLSX_STATUS_REQUEST
15455
         */
15456
    }
15457
    #endif
15458
#if defined(HAVE_ECH)
15459
    if (ssl->options.useEch == 1 && !ssl->options.disableECH
15460
            && msgType == client_hello) {
15461
        ret = TLSX_GetSizeWithEch(ssl, semaphore, msgType, &length);
15462
        if (ret != 0)
15463
            return ret;
15464
    }
15465
    else
15466
#endif /* HAVE_ECH */
15467
#endif /* WOLFSSL_TLS13 */
15468
    {
15469
        if (ssl->extensions) {
15470
            ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
15471
            if (ret != 0)
15472
                return ret;
15473
        }
15474
        if (ssl->ctx && ssl->ctx->extensions) {
15475
            ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType,
15476
                &length);
15477
            if (ret != 0)
15478
                return ret;
15479
        }
15480
    }
15481
15482
#ifdef HAVE_EXTENDED_MASTER
15483
    if (msgType == client_hello && ssl->options.haveEMS &&
15484
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
15485
        length += HELLO_EXT_SZ;
15486
    }
15487
#endif
15488
15489
    if (length)
15490
        length += OPAQUE16_LEN; /* for total length storage. */
15491
15492
    *pLength += length;
15493
15494
    return ret;
15495
}
15496
15497
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15498
/* return status after writing the extensions with ech written last */
15499
static int TLSX_WriteWithEch(WOLFSSL* ssl, byte* output, byte* semaphore,
15500
    byte msgType, word16* pOffset)
15501
{
15502
    int r = 0, ret = 0;
15503
    TLSX* echX = NULL;
15504
    TLSX* serverNameX = NULL;
15505
    TLSX** extensions = NULL;
15506
    WC_DECLARE_VAR(serverName, char, MAX_PUBLIC_NAME_SZ, 0);
15507
15508
    WC_ALLOC_VAR_EX(serverName, char, MAX_PUBLIC_NAME_SZ, NULL,
15509
                    DYNAMIC_TYPE_TMP_BUFFER, return MEMORY_E);
15510
    r = TLSX_EchChangeSNI(ssl, &echX, serverName, &serverNameX, &extensions);
15511
    ret = r;
15512
    if (ret == 0 && echX != NULL)
15513
        /* turn ech on so it doesn't write, then write it last */
15514
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
15515
15516
    if (ret == 0 && ssl->extensions) {
15517
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
15518
                         msgType, pOffset);
15519
    }
15520
15521
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
15522
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
15523
                         msgType, pOffset);
15524
    }
15525
15526
    /* only write if have a shot at acceptance */
15527
    if (ret == 0 && echX != NULL &&
15528
        (ssl->options.echAccepted ||
15529
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
15530
        if (echX != NULL) {
15531
            /* turn off and write it last */
15532
            TURN_OFF(semaphore, TLSX_ToSemaphore(echX->type));
15533
        }
15534
15535
        if (ret == 0 && ssl->extensions) {
15536
            ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
15537
                msgType, pOffset);
15538
        }
15539
15540
        if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
15541
            ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
15542
                msgType, pOffset);
15543
        }
15544
    }
15545
15546
    if (r == 0)
15547
        r = TLSX_EchRestoreSNI(ssl, serverName, serverNameX, extensions);
15548
    WC_FREE_VAR_EX(serverName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15549
15550
    if (ret == 0 && r != 0)
15551
        ret = r;
15552
    return ret;
15553
}
15554
#endif
15555
15556
/** Writes the extensions to be sent into the client hello. */
15557
int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word32* pOffset)
15558
0
{
15559
0
    int ret = 0;
15560
0
    word16 offset = 0;
15561
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
15562
15563
0
    if (!TLSX_SupportExtensions(ssl) || output == NULL)
15564
0
        return 0;
15565
15566
0
    offset += OPAQUE16_LEN; /* extensions length */
15567
15568
0
    if (msgType == client_hello) {
15569
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
15570
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
15571
0
        WOLF_STK_VALIDATE_REQUEST(ssl);
15572
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15573
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
15574
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15575
0
#endif
15576
0
#ifdef WOLFSSL_TLS13
15577
0
        if (!IsAtLeastTLSv1_2(ssl)) {
15578
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15579
0
        }
15580
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15581
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
15582
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15583
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15584
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
15585
        #endif
15586
        #ifdef WOLFSSL_EARLY_DATA
15587
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15588
        #endif
15589
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15590
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15591
        #endif
15592
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15593
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
15594
        #endif
15595
        #ifdef WOLFSSL_DUAL_ALG_CERTS
15596
            TURN_ON(semaphore,
15597
                    TLSX_ToSemaphore(TLSX_CKS));
15598
        #endif
15599
0
        }
15600
0
    #endif
15601
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15602
        if (!IsAtLeastTLSv1_3(ssl->version) || SSL_CA_NAMES(ssl) == NULL) {
15603
            TURN_ON(semaphore,
15604
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15605
        }
15606
    #endif
15607
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15608
        /* Must write Pre-shared Key extension at the end in TLS v1.3.
15609
         * Must not write out Pre-shared Key extension in earlier versions of
15610
         * protocol.
15611
         */
15612
        TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15613
    #endif
15614
0
#endif /* WOLFSSL_TLS13 */
15615
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
15616
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
15617
         /* mark already sent, so it won't send it */
15618
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
15619
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15620
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15621
        }
15622
    #endif
15623
0
    }
15624
0
#ifdef WOLFSSL_TLS13
15625
0
    #ifndef NO_CERTS
15626
0
    else if (msgType == certificate_request) {
15627
        /* Don't send out any extension except those that are turned off. */
15628
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15629
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15630
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15631
0
#endif
15632
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15633
        if (SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
15634
            TURN_OFF(semaphore,
15635
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15636
        }
15637
#endif
15638
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, TLSX_OID_FILTERS
15639
         *       TLSX_STATUS_REQUEST
15640
         */
15641
0
    }
15642
0
    #endif
15643
0
#endif
15644
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15645
    if (ssl->options.useEch == 1 && !ssl->options.disableECH
15646
            && msgType == client_hello) {
15647
        ret = TLSX_WriteWithEch(ssl, output, semaphore,
15648
                         msgType, &offset);
15649
        if (ret != 0)
15650
            return ret;
15651
    }
15652
    else
15653
#endif
15654
0
    {
15655
0
        if (ssl->extensions) {
15656
0
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15657
0
                             msgType, &offset);
15658
0
            if (ret != 0)
15659
0
                return ret;
15660
0
        }
15661
0
        if (ssl->ctx && ssl->ctx->extensions) {
15662
0
            ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
15663
0
                             msgType, &offset);
15664
0
            if (ret != 0)
15665
0
                return ret;
15666
0
        }
15667
0
    }
15668
15669
0
#ifdef HAVE_EXTENDED_MASTER
15670
0
    if (msgType == client_hello && ssl->options.haveEMS &&
15671
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
15672
0
        WOLFSSL_MSG("EMS extension to write");
15673
0
        c16toa(HELLO_EXT_EXTMS, output + offset);
15674
0
        offset += HELLO_EXT_TYPE_SZ;
15675
0
        c16toa(0, output + offset);
15676
0
        offset += HELLO_EXT_SZ_SZ;
15677
0
    }
15678
0
#endif
15679
15680
0
#ifdef WOLFSSL_TLS13
15681
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15682
    if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
15683
        /* Write out what we can of Pre-shared key extension.  */
15684
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15685
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15686
                         client_hello, &offset);
15687
        if (ret != 0)
15688
            return ret;
15689
    }
15690
    #endif
15691
0
#endif
15692
15693
0
    if (offset > OPAQUE16_LEN || msgType != client_hello)
15694
0
        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
15695
15696
0
     *pOffset += offset;
15697
15698
0
    return ret;
15699
0
}
15700
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
15701
15702
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
15703
15704
/** Tells the buffered size of extensions to be sent into the server hello. */
15705
int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
15706
{
15707
    int ret = 0;
15708
    word16 length = 0;
15709
    byte semaphore[SEMAPHORE_SIZE] = {0};
15710
15711
    switch (msgType) {
15712
#ifndef NO_WOLFSSL_SERVER
15713
        case server_hello:
15714
            PF_VALIDATE_RESPONSE(ssl, semaphore);
15715
        #ifdef WOLFSSL_TLS13
15716
                if (IsAtLeastTLSv1_3(ssl->version)) {
15717
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15718
                    TURN_OFF(semaphore,
15719
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15720
                #if defined(HAVE_SUPPORTED_CURVES)
15721
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15722
                    if (!ssl->options.noPskDheKe)
15723
                #endif
15724
                    {
15725
                        /* Expect KeyShare extension in ServerHello. */
15726
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15727
                    }
15728
                #endif
15729
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15730
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15731
                #endif
15732
                }
15733
            #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15734
                else {
15735
                #ifdef HAVE_SUPPORTED_CURVES
15736
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15737
                #endif
15738
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15739
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15740
                #endif
15741
                }
15742
            #endif
15743
            #ifdef WOLFSSL_DTLS_CID
15744
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15745
            #endif
15746
        #endif /* WOLFSSL_TLS13 */
15747
            break;
15748
15749
    #ifdef WOLFSSL_TLS13
15750
        case hello_retry_request:
15751
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15752
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15753
        #ifdef HAVE_SUPPORTED_CURVES
15754
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15755
            if (!ssl->options.noPskDheKe)
15756
        #endif
15757
            {
15758
                /* Expect KeyShare extension in HelloRetryRequest. */
15759
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15760
            }
15761
        #endif
15762
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15763
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15764
        #endif
15765
#ifdef HAVE_ECH
15766
            /* send the special confirmation */
15767
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
15768
#endif
15769
            break;
15770
    #endif
15771
15772
    #ifdef WOLFSSL_TLS13
15773
        case encrypted_extensions:
15774
            /* Send out all extension except those that are turned on. */
15775
        #ifdef HAVE_ECC
15776
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
15777
        #endif
15778
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15779
        #ifdef HAVE_SESSION_TICKET
15780
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
15781
        #endif
15782
        #ifdef HAVE_SUPPORTED_CURVES
15783
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15784
        #endif
15785
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15786
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15787
        #endif
15788
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
15789
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15790
        #endif
15791
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
15792
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15793
        #endif
15794
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
15795
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
15796
        #endif
15797
        #ifdef WOLFSSL_DTLS_CID
15798
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15799
        #endif /* WOLFSSL_DTLS_CID */
15800
            break;
15801
15802
        #ifdef WOLFSSL_EARLY_DATA
15803
        case session_ticket:
15804
            if (ssl->options.tls1_3) {
15805
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15806
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15807
            }
15808
            break;
15809
        #endif
15810
    #endif
15811
#endif
15812
15813
#ifdef WOLFSSL_TLS13
15814
    #ifndef NO_CERTS
15815
        case certificate:
15816
            /* Don't send out any extension except those that are turned off. */
15817
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15818
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15819
            /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
15820
             *       TLSX_SERVER_CERTIFICATE_TYPE
15821
             */
15822
            break;
15823
    #endif
15824
#endif
15825
    }
15826
15827
#ifdef HAVE_EXTENDED_MASTER
15828
    if (ssl->options.haveEMS && msgType == server_hello &&
15829
                                              !IsAtLeastTLSv1_3(ssl->version)) {
15830
        length += HELLO_EXT_SZ;
15831
    }
15832
#endif
15833
15834
    if (TLSX_SupportExtensions(ssl)) {
15835
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
15836
        if (ret != 0)
15837
            return ret;
15838
    }
15839
15840
    /* All the response data is set at the ssl object only, so no ctx here. */
15841
15842
    if (length || msgType != server_hello)
15843
        length += OPAQUE16_LEN; /* for total length storage. */
15844
15845
    *pLength += length;
15846
15847
    return ret;
15848
}
15849
15850
/** Writes the server hello extensions into a buffer. */
15851
int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
15852
0
{
15853
0
    int ret = 0;
15854
0
    word16 offset = 0;
15855
15856
0
    if (TLSX_SupportExtensions(ssl) && output) {
15857
0
        byte semaphore[SEMAPHORE_SIZE] = {0};
15858
15859
0
        switch (msgType) {
15860
0
#ifndef NO_WOLFSSL_SERVER
15861
0
            case server_hello:
15862
0
                PF_VALIDATE_RESPONSE(ssl, semaphore);
15863
0
        #ifdef WOLFSSL_TLS13
15864
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
15865
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15866
0
                    TURN_OFF(semaphore,
15867
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15868
0
            #ifdef HAVE_SUPPORTED_CURVES
15869
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15870
                    if (!ssl->options.noPskDheKe)
15871
                #endif
15872
0
                    {
15873
                        /* Write out KeyShare in ServerHello. */
15874
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15875
0
                    }
15876
0
            #endif
15877
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15878
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15879
            #endif
15880
0
                }
15881
0
                else
15882
0
        #endif /* WOLFSSL_TLS13 */
15883
0
                {
15884
0
        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15885
0
            #ifdef HAVE_SUPPORTED_CURVES
15886
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15887
0
            #endif
15888
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15889
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15890
            #endif
15891
0
        #endif
15892
0
                    WC_DO_NOTHING; /* avoid empty brackets */
15893
0
                }
15894
        #ifdef WOLFSSL_DTLS_CID
15895
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15896
        #endif /* WOLFSSL_DTLS_CID */
15897
0
                break;
15898
15899
0
    #ifdef WOLFSSL_TLS13
15900
0
            case hello_retry_request:
15901
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15902
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15903
0
        #ifdef HAVE_SUPPORTED_CURVES
15904
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15905
                if (!ssl->options.noPskDheKe)
15906
            #endif
15907
0
                {
15908
                    /* Write out KeyShare in HelloRetryRequest. */
15909
0
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15910
0
                }
15911
0
        #endif
15912
#ifdef HAVE_ECH
15913
                /* send the special confirmation */
15914
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
15915
#endif
15916
                /* Cookie is written below as last extension. */
15917
0
                break;
15918
0
    #endif
15919
15920
0
    #ifdef WOLFSSL_TLS13
15921
0
            case encrypted_extensions:
15922
                /* Send out all extension except those that are turned on. */
15923
0
        #ifdef HAVE_ECC
15924
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
15925
0
        #endif
15926
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15927
        #ifdef HAVE_SESSION_TICKET
15928
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
15929
        #endif
15930
0
        #ifdef HAVE_SUPPORTED_CURVES
15931
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15932
0
        #endif
15933
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15934
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15935
        #endif
15936
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
15937
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15938
        #endif
15939
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
15940
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15941
        #endif
15942
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
15943
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
15944
0
        #endif
15945
        #ifdef WOLFSSL_DTLS_CID
15946
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15947
        #endif /* WOLFSSL_DTLS_CID */
15948
0
                break;
15949
15950
        #ifdef WOLFSSL_EARLY_DATA
15951
            case session_ticket:
15952
                if (ssl->options.tls1_3) {
15953
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15954
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15955
                }
15956
                break;
15957
        #endif
15958
0
    #endif
15959
0
#endif
15960
15961
0
    #ifdef WOLFSSL_TLS13
15962
0
        #ifndef NO_CERTS
15963
0
            case certificate:
15964
                /* Don't send out any extension except those that are turned
15965
                 * off. */
15966
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15967
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15968
                /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
15969
                 *       TLSX_SERVER_CERTIFICATE_TYPE
15970
                 */
15971
0
                break;
15972
0
        #endif
15973
0
    #endif
15974
15975
0
            default:
15976
0
                break;
15977
0
        }
15978
15979
0
        offset += OPAQUE16_LEN; /* extensions length */
15980
15981
0
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15982
0
                         msgType, &offset);
15983
0
        if (ret != 0)
15984
0
            return ret;
15985
15986
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
15987
        if (msgType == hello_retry_request) {
15988
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15989
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15990
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15991
                             msgType, &offset);
15992
            if (ret != 0)
15993
                return ret;
15994
        }
15995
#endif
15996
15997
0
#ifdef HAVE_EXTENDED_MASTER
15998
0
        if (ssl->options.haveEMS && msgType == server_hello &&
15999
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
16000
0
            WOLFSSL_MSG("EMS extension to write");
16001
0
            c16toa(HELLO_EXT_EXTMS, output + offset);
16002
0
            offset += HELLO_EXT_TYPE_SZ;
16003
0
            c16toa(0, output + offset);
16004
0
            offset += HELLO_EXT_SZ_SZ;
16005
0
        }
16006
0
#endif
16007
16008
0
        if (offset > OPAQUE16_LEN || msgType != server_hello)
16009
0
            c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
16010
0
    }
16011
16012
0
    if (pOffset)
16013
0
        *pOffset += offset;
16014
16015
0
    return ret;
16016
0
}
16017
16018
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
16019
16020
#ifdef WOLFSSL_TLS13
16021
int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
16022
                      byte msgType, int* found)
16023
3.18k
{
16024
3.18k
    int ret = 0;
16025
3.18k
    int offset = 0;
16026
16027
3.18k
    *found = 0;
16028
20.9k
    while (offset < (int)length) {
16029
20.8k
        word16 type;
16030
20.8k
        word16 size;
16031
16032
20.8k
        if (offset + (2 * OPAQUE16_LEN) > length) {
16033
20
            ret = BUFFER_ERROR;
16034
20
            break;
16035
20
        }
16036
16037
20.7k
        ato16(input + offset, &type);
16038
20.7k
        offset += HELLO_EXT_TYPE_SZ;
16039
16040
20.7k
        ato16(input + offset, &size);
16041
20.7k
        offset += OPAQUE16_LEN;
16042
16043
20.7k
        if (offset + size > length) {
16044
254
            ret = BUFFER_ERROR;
16045
254
            break;
16046
254
        }
16047
16048
20.5k
        if (type == TLSX_SUPPORTED_VERSIONS) {
16049
2.76k
            *found = 1;
16050
16051
2.76k
            WOLFSSL_MSG("Supported Versions extension received");
16052
16053
2.76k
            ret = SV_PARSE(ssl, input + offset, size, msgType, &ssl->version,
16054
2.76k
                           &ssl->options, &ssl->extensions);
16055
2.76k
            break;
16056
2.76k
        }
16057
16058
17.7k
        offset += size;
16059
17.7k
    }
16060
16061
3.18k
    return ret;
16062
3.18k
}
16063
#endif
16064
/* Jump Table to check minimum size values for client case in TLSX_Parse */
16065
#ifndef NO_WOLFSSL_SERVER
16066
static word16 TLSX_GetMinSize_Client(word16* type)
16067
74.5k
{
16068
74.5k
    switch (*type) {
16069
791
        case TLSXT_SERVER_NAME:
16070
791
            return WOLFSSL_SNI_MIN_SIZE_CLIENT;
16071
3.43k
        case TLSXT_EARLY_DATA:
16072
3.43k
            return WOLFSSL_EDI_MIN_SIZE_CLIENT;
16073
226
        case TLSXT_MAX_FRAGMENT_LENGTH:
16074
226
            return WOLFSSL_MFL_MIN_SIZE_CLIENT;
16075
83
        case TLSXT_TRUSTED_CA_KEYS:
16076
83
            return WOLFSSL_TCA_MIN_SIZE_CLIENT;
16077
371
        case TLSXT_TRUNCATED_HMAC:
16078
371
            return WOLFSSL_THM_MIN_SIZE_CLIENT;
16079
531
        case TLSXT_STATUS_REQUEST:
16080
531
            return WOLFSSL_CSR_MIN_SIZE_CLIENT;
16081
9.22k
        case TLSXT_SUPPORTED_GROUPS:
16082
9.22k
            return WOLFSSL_EC_MIN_SIZE_CLIENT;
16083
1.89k
        case TLSXT_EC_POINT_FORMATS:
16084
1.89k
            return WOLFSSL_PF_MIN_SIZE_CLIENT;
16085
5.63k
        case TLSXT_SIGNATURE_ALGORITHMS:
16086
5.63k
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
16087
122
        case TLSXT_USE_SRTP:
16088
122
            return WOLFSSL_SRTP_MIN_SIZE_CLIENT;
16089
241
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
16090
241
            return WOLFSSL_ALPN_MIN_SIZE_CLIENT;
16091
187
        case TLSXT_STATUS_REQUEST_V2:
16092
187
            return WOLFSSL_CSR2_MIN_SIZE_CLIENT;
16093
105
        case TLSXT_CLIENT_CERTIFICATE:
16094
105
            return WOLFSSL_CCT_MIN_SIZE_CLIENT;
16095
54
        case TLSXT_SERVER_CERTIFICATE:
16096
54
            return WOLFSSL_SCT_MIN_SIZE_CLIENT;
16097
2.42k
        case TLSXT_ENCRYPT_THEN_MAC:
16098
2.42k
            return WOLFSSL_ETM_MIN_SIZE_CLIENT;
16099
943
        case TLSXT_SESSION_TICKET:
16100
943
            return WOLFSSL_STK_MIN_SIZE_CLIENT;
16101
1.64k
        case TLSXT_PRE_SHARED_KEY:
16102
1.64k
            return WOLFSSL_PSK_MIN_SIZE_CLIENT;
16103
97
        case TLSXT_COOKIE:
16104
97
            return WOLFSSL_CKE_MIN_SIZE_CLIENT;
16105
1.44k
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
16106
1.44k
            return WOLFSSL_PKM_MIN_SIZE_CLIENT;
16107
375
        case TLSXT_CERTIFICATE_AUTHORITIES:
16108
375
            return WOLFSSL_CAN_MIN_SIZE_CLIENT;
16109
146
        case TLSXT_POST_HANDSHAKE_AUTH:
16110
146
            return WOLFSSL_PHA_MIN_SIZE_CLIENT;
16111
130
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
16112
130
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
16113
4.44k
        case TLSXT_KEY_SHARE:
16114
4.44k
            return WOLFSSL_KS_MIN_SIZE_CLIENT;
16115
80
        case TLSXT_CONNECTION_ID:
16116
80
            return WOLFSSL_CID_MIN_SIZE_CLIENT;
16117
318
        case TLSXT_RENEGOTIATION_INFO:
16118
318
            return WOLFSSL_SCR_MIN_SIZE_CLIENT;
16119
12
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
16120
12
            return WOLFSSL_QTP_MIN_SIZE_CLIENT;
16121
36
        case TLSXT_ECH:
16122
36
            return WOLFSSL_ECH_MIN_SIZE_CLIENT;
16123
39.5k
        default:
16124
39.5k
            return 0;
16125
74.5k
    }
16126
74.5k
}
16127
    #define TLSX_GET_MIN_SIZE_CLIENT(type) TLSX_GetMinSize_Client(type)
16128
#else
16129
    #define TLSX_GET_MIN_SIZE_CLIENT(type) 0
16130
#endif
16131
16132
16133
#ifndef NO_WOLFSSL_CLIENT
16134
/* Jump Table to check minimum size values for server case in TLSX_Parse */
16135
static word16 TLSX_GetMinSize_Server(const word16 *type)
16136
5.35k
{
16137
5.35k
    switch (*type) {
16138
31
        case TLSXT_SERVER_NAME:
16139
31
            return WOLFSSL_SNI_MIN_SIZE_SERVER;
16140
7
        case TLSXT_EARLY_DATA:
16141
7
            return WOLFSSL_EDI_MIN_SIZE_SERVER;
16142
10
        case TLSXT_MAX_FRAGMENT_LENGTH:
16143
10
            return WOLFSSL_MFL_MIN_SIZE_SERVER;
16144
3
        case TLSXT_TRUSTED_CA_KEYS:
16145
3
            return WOLFSSL_TCA_MIN_SIZE_SERVER;
16146
5
        case TLSXT_TRUNCATED_HMAC:
16147
5
            return WOLFSSL_THM_MIN_SIZE_SERVER;
16148
2.22k
        case TLSXT_STATUS_REQUEST:
16149
2.22k
            return WOLFSSL_CSR_MIN_SIZE_SERVER;
16150
4
        case TLSXT_SUPPORTED_GROUPS:
16151
4
            return WOLFSSL_EC_MIN_SIZE_SERVER;
16152
17
        case TLSXT_EC_POINT_FORMATS:
16153
17
            return WOLFSSL_PF_MIN_SIZE_SERVER;
16154
6
        case TLSXT_SIGNATURE_ALGORITHMS:
16155
6
            return WOLFSSL_SA_MIN_SIZE_SERVER;
16156
19
        case TLSXT_USE_SRTP:
16157
19
            return WOLFSSL_SRTP_MIN_SIZE_SERVER;
16158
64
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
16159
64
            return WOLFSSL_ALPN_MIN_SIZE_SERVER;
16160
3
        case TLSXT_STATUS_REQUEST_V2:
16161
3
            return WOLFSSL_CSR2_MIN_SIZE_SERVER;
16162
4
        case TLSXT_CLIENT_CERTIFICATE:
16163
4
            return WOLFSSL_CCT_MIN_SIZE_SERVER;
16164
5
        case TLSXT_SERVER_CERTIFICATE:
16165
5
            return WOLFSSL_SCT_MIN_SIZE_SERVER;
16166
13
        case TLSXT_ENCRYPT_THEN_MAC:
16167
13
            return WOLFSSL_ETM_MIN_SIZE_SERVER;
16168
57
        case TLSXT_SESSION_TICKET:
16169
57
            return WOLFSSL_STK_MIN_SIZE_SERVER;
16170
17
        case TLSXT_PRE_SHARED_KEY:
16171
17
            return WOLFSSL_PSK_MIN_SIZE_SERVER;
16172
32
        case TLSXT_COOKIE:
16173
32
            return WOLFSSL_CKE_MIN_SIZE_SERVER;
16174
9
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
16175
9
            return WOLFSSL_PKM_MIN_SIZE_SERVER;
16176
4
        case TLSXT_CERTIFICATE_AUTHORITIES:
16177
4
            return WOLFSSL_CAN_MIN_SIZE_SERVER;
16178
7
        case TLSXT_POST_HANDSHAKE_AUTH:
16179
7
            return WOLFSSL_PHA_MIN_SIZE_SERVER;
16180
4
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
16181
4
            return WOLFSSL_SA_MIN_SIZE_SERVER;
16182
181
        case TLSXT_KEY_SHARE:
16183
181
            return WOLFSSL_KS_MIN_SIZE_SERVER;
16184
5
        case TLSXT_CONNECTION_ID:
16185
5
            return WOLFSSL_CID_MIN_SIZE_SERVER;
16186
5
        case TLSXT_RENEGOTIATION_INFO:
16187
5
            return WOLFSSL_SCR_MIN_SIZE_SERVER;
16188
2
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
16189
2
            return WOLFSSL_QTP_MIN_SIZE_SERVER;
16190
0
        case TLSXT_ECH:
16191
0
            return WOLFSSL_ECH_MIN_SIZE_SERVER;
16192
2.61k
        default:
16193
2.61k
            return 0;
16194
5.35k
    }
16195
5.35k
}
16196
    #define TLSX_GET_MIN_SIZE_SERVER(type) TLSX_GetMinSize_Server(type)
16197
#else
16198
    #define TLSX_GET_MIN_SIZE_SERVER(type) 0
16199
#endif
16200
16201
16202
/** Parses a buffer of TLS extensions. */
16203
int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType,
16204
                                                                 Suites *suites)
16205
{
16206
    int ret = 0;
16207
    word16 offset = 0;
16208
    byte isRequest = (msgType == client_hello ||
16209
                      msgType == certificate_request);
16210
16211
#ifdef HAVE_EXTENDED_MASTER
16212
    byte pendingEMS = 0;
16213
#endif
16214
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
16215
    int pskDone = 0;
16216
#endif
16217
    byte seenType[SEMAPHORE_SIZE];  /* Seen known extensions. */
16218
16219
    if (!ssl || !input || (isRequest && !suites))
16220
        return BAD_FUNC_ARG;
16221
16222
    /* No known extensions seen yet. */
16223
    XMEMSET(seenType, 0, sizeof(seenType));
16224
16225
    while (ret == 0 && offset < length) {
16226
        word16 type;
16227
        word16 size;
16228
16229
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
16230
        if (msgType == client_hello && pskDone) {
16231
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
16232
            return PSK_KEY_ERROR;
16233
        }
16234
#endif
16235
16236
        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
16237
            return BUFFER_ERROR;
16238
16239
        ato16(input + offset, &type);
16240
        offset += HELLO_EXT_TYPE_SZ;
16241
16242
        ato16(input + offset, &size);
16243
        offset += OPAQUE16_LEN;
16244
16245
        /* Check we have a bit for extension type. */
16246
        if ((type <= 62) || (type == TLSX_RENEGOTIATION_INFO)
16247
        #ifdef WOLFSSL_QUIC
16248
            || (type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT)
16249
        #endif
16250
        #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
16251
            || (type == TLSX_CKS)
16252
        #endif
16253
            )
16254
        {
16255
            /* Detect duplicate recognized extensions. */
16256
            if (IS_OFF(seenType, TLSX_ToSemaphore(type))) {
16257
                TURN_ON(seenType, TLSX_ToSemaphore(type));
16258
            }
16259
            else {
16260
                return DUPLICATE_TLS_EXT_E;
16261
            }
16262
        }
16263
16264
        if (length - offset < size)
16265
            return BUFFER_ERROR;
16266
16267
        /* Check minimum size required for TLSX, even if disabled */
16268
        switch (msgType) {
16269
            #ifndef NO_WOLFSSL_SERVER
16270
            case client_hello:
16271
                if (size < TLSX_GET_MIN_SIZE_CLIENT(&type)){
16272
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
16273
                    return BUFFER_ERROR;
16274
                }
16275
            break;
16276
            #endif
16277
            #ifndef NO_WOLFSSL_CLIENT
16278
            case server_hello:
16279
            case hello_retry_request:
16280
                if (size < TLSX_GET_MIN_SIZE_SERVER(&type)){
16281
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
16282
                    return BUFFER_ERROR;
16283
                }
16284
            break;
16285
            #endif
16286
            default:
16287
            break;
16288
        }
16289
16290
        switch (type) {
16291
#ifdef HAVE_SNI
16292
            case TLSX_SERVER_NAME:
16293
                WOLFSSL_MSG("SNI extension received");
16294
            #ifdef WOLFSSL_DEBUG_TLS
16295
                WOLFSSL_BUFFER(input + offset, size);
16296
            #endif
16297
16298
#ifdef WOLFSSL_TLS13
16299
                if (IsAtLeastTLSv1_3(ssl->version)) {
16300
                    if (msgType != client_hello &&
16301
                        msgType != encrypted_extensions)
16302
                        return EXT_NOT_ALLOWED;
16303
                }
16304
                else
16305
#endif
16306
                {
16307
                    if (msgType != client_hello &&
16308
                        msgType != server_hello)
16309
                        return EXT_NOT_ALLOWED;
16310
                }
16311
                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
16312
                break;
16313
#endif
16314
16315
            case TLSX_TRUSTED_CA_KEYS:
16316
                WOLFSSL_MSG("Trusted CA extension received");
16317
            #ifdef WOLFSSL_DEBUG_TLS
16318
                WOLFSSL_BUFFER(input + offset, size);
16319
            #endif
16320
16321
#ifdef WOLFSSL_TLS13
16322
                /* RFC 8446 4.2.4 states trusted_ca_keys is not used
16323
                   in TLS 1.3. */
16324
                if (IsAtLeastTLSv1_3(ssl->version)) {
16325
                    break;
16326
                }
16327
                else
16328
#endif
16329
                {
16330
                    if (msgType != client_hello &&
16331
                        msgType != server_hello)
16332
                        return EXT_NOT_ALLOWED;
16333
                }
16334
                ret = TCA_PARSE(ssl, input + offset, size, isRequest);
16335
                break;
16336
16337
            case TLSX_MAX_FRAGMENT_LENGTH:
16338
                WOLFSSL_MSG("Max Fragment Length extension received");
16339
            #ifdef WOLFSSL_DEBUG_TLS
16340
                WOLFSSL_BUFFER(input + offset, size);
16341
            #endif
16342
16343
#ifdef WOLFSSL_TLS13
16344
                if (IsAtLeastTLSv1_3(ssl->version)) {
16345
                    if (msgType != client_hello &&
16346
                        msgType != encrypted_extensions) {
16347
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16348
                        return EXT_NOT_ALLOWED;
16349
                    }
16350
                }
16351
                else
16352
#endif
16353
                {
16354
                    if (msgType != client_hello &&
16355
                        msgType != server_hello) {
16356
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16357
                        return EXT_NOT_ALLOWED;
16358
                    }
16359
                }
16360
                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
16361
                break;
16362
16363
            case TLSX_TRUNCATED_HMAC:
16364
                WOLFSSL_MSG("Truncated HMAC extension received");
16365
            #ifdef WOLFSSL_DEBUG_TLS
16366
                WOLFSSL_BUFFER(input + offset, size);
16367
            #endif
16368
16369
#ifdef WOLFSSL_TLS13
16370
                if (IsAtLeastTLSv1_3(ssl->version))
16371
                    break;
16372
#endif
16373
                if (msgType != client_hello)
16374
                    return EXT_NOT_ALLOWED;
16375
                ret = THM_PARSE(ssl, input + offset, size, isRequest);
16376
                break;
16377
16378
            case TLSX_SUPPORTED_GROUPS:
16379
                WOLFSSL_MSG("Supported Groups extension received");
16380
            #ifdef WOLFSSL_DEBUG_TLS
16381
                WOLFSSL_BUFFER(input + offset, size);
16382
            #endif
16383
16384
#ifdef WOLFSSL_TLS13
16385
                if (IsAtLeastTLSv1_3(ssl->version)) {
16386
                    if (msgType != client_hello &&
16387
                        msgType != encrypted_extensions) {
16388
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16389
                        return EXT_NOT_ALLOWED;
16390
                    }
16391
                }
16392
                else
16393
#endif
16394
                {
16395
                    if (msgType != client_hello) {
16396
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16397
                        return EXT_NOT_ALLOWED;
16398
                    }
16399
                }
16400
                ret = EC_PARSE(ssl, input + offset, size, isRequest,
16401
                        &ssl->extensions);
16402
                break;
16403
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS)
16404
            case TLSX_CKS:
16405
                WOLFSSL_MSG("CKS extension received");
16406
                if (msgType != client_hello &&
16407
                     msgType != encrypted_extensions) {
16408
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16409
                        return EXT_NOT_ALLOWED;
16410
                }
16411
                ret = TLSX_CKS_Parse(ssl, (byte *)(input + offset), size,
16412
                                     &ssl->extensions);
16413
            break;
16414
#endif /* WOLFSSL_DUAL_ALG_CERTS */
16415
            case TLSX_EC_POINT_FORMATS:
16416
                WOLFSSL_MSG("Point Formats extension received");
16417
            #ifdef WOLFSSL_DEBUG_TLS
16418
                WOLFSSL_BUFFER(input + offset, size);
16419
            #endif
16420
16421
#ifdef WOLFSSL_TLS13
16422
                if (IsAtLeastTLSv1_3(ssl->version))
16423
                    break;
16424
#endif
16425
                if (msgType != client_hello &&
16426
                    msgType != server_hello) {
16427
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16428
                    return EXT_NOT_ALLOWED;
16429
                }
16430
16431
                ret = PF_PARSE(ssl, input + offset, size, isRequest);
16432
                break;
16433
16434
            case TLSX_STATUS_REQUEST:
16435
                WOLFSSL_MSG("Certificate Status Request extension received");
16436
            #ifdef WOLFSSL_DEBUG_TLS
16437
                WOLFSSL_BUFFER(input + offset, size);
16438
            #endif
16439
16440
#ifdef WOLFSSL_TLS13
16441
                if (IsAtLeastTLSv1_3(ssl->version)) {
16442
                    if (msgType != client_hello &&
16443
                        msgType != certificate_request &&
16444
                        msgType != certificate)
16445
                        return EXT_NOT_ALLOWED;
16446
                }
16447
                else
16448
 #endif
16449
                {
16450
                    if (msgType != client_hello &&
16451
                        msgType != server_hello)
16452
                        return EXT_NOT_ALLOWED;
16453
                }
16454
                ret = CSR_PARSE(ssl, input + offset, size, isRequest);
16455
                break;
16456
16457
            case TLSX_STATUS_REQUEST_V2:
16458
                WOLFSSL_MSG("Certificate Status Request v2 extension received");
16459
            #ifdef WOLFSSL_DEBUG_TLS
16460
                WOLFSSL_BUFFER(input + offset, size);
16461
            #endif
16462
16463
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
16464
                if (IsAtLeastTLSv1_3(ssl->version)) {
16465
                    if (msgType != client_hello &&
16466
                        msgType != certificate_request &&
16467
                        msgType != certificate)
16468
                        return EXT_NOT_ALLOWED;
16469
                }
16470
                else
16471
#endif
16472
                {
16473
                    if (msgType != client_hello &&
16474
                        msgType != server_hello)
16475
                        return EXT_NOT_ALLOWED;
16476
                }
16477
                ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
16478
                break;
16479
16480
#ifdef HAVE_EXTENDED_MASTER
16481
            case HELLO_EXT_EXTMS:
16482
                WOLFSSL_MSG("Extended Master Secret extension received");
16483
            #ifdef WOLFSSL_DEBUG_TLS
16484
                WOLFSSL_BUFFER(input + offset, size);
16485
            #endif
16486
16487
#if defined(WOLFSSL_TLS13)
16488
                if (IsAtLeastTLSv1_3(ssl->version))
16489
                    break;
16490
#endif
16491
                if (msgType != client_hello &&
16492
                    msgType != server_hello)
16493
                    return EXT_NOT_ALLOWED;
16494
                if (size != 0)
16495
                    return BUFFER_ERROR;
16496
16497
#ifndef NO_WOLFSSL_SERVER
16498
                if (isRequest)
16499
                    ssl->options.haveEMS = 1;
16500
#endif
16501
                pendingEMS = 1;
16502
                break;
16503
#endif
16504
16505
            case TLSX_RENEGOTIATION_INFO:
16506
                WOLFSSL_MSG("Secure Renegotiation extension received");
16507
            #ifdef WOLFSSL_DEBUG_TLS
16508
                WOLFSSL_BUFFER(input + offset, size);
16509
            #endif
16510
16511
#ifdef WOLFSSL_TLS13
16512
                if (IsAtLeastTLSv1_3(ssl->version))
16513
                    break;
16514
#endif
16515
                if (msgType != client_hello &&
16516
                    msgType != server_hello)
16517
                    return EXT_NOT_ALLOWED;
16518
                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
16519
                break;
16520
16521
            case TLSX_SESSION_TICKET:
16522
                WOLFSSL_MSG("Session Ticket extension received");
16523
            #ifdef WOLFSSL_DEBUG_TLS
16524
                WOLFSSL_BUFFER(input + offset, size);
16525
            #endif
16526
16527
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
16528
                if (IsAtLeastTLSv1_3(ssl->version)) {
16529
                    if (msgType != client_hello)
16530
                        return EXT_NOT_ALLOWED;
16531
                }
16532
                else
16533
#endif
16534
                {
16535
                    if (msgType != client_hello &&
16536
                        msgType != server_hello)
16537
                        return EXT_NOT_ALLOWED;
16538
                }
16539
                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
16540
                break;
16541
16542
            case TLSX_APPLICATION_LAYER_PROTOCOL:
16543
                WOLFSSL_MSG("ALPN extension received");
16544
16545
            #ifdef WOLFSSL_DEBUG_TLS
16546
                WOLFSSL_BUFFER(input + offset, size);
16547
            #endif
16548
16549
#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
16550
                if (IsAtLeastTLSv1_3(ssl->version)) {
16551
                    if (msgType != client_hello &&
16552
                        msgType != encrypted_extensions)
16553
                        return EXT_NOT_ALLOWED;
16554
                }
16555
                else
16556
#endif
16557
                {
16558
                    if (msgType != client_hello &&
16559
                        msgType != server_hello)
16560
                        return EXT_NOT_ALLOWED;
16561
                }
16562
                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
16563
                break;
16564
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16565
            case TLSX_SIGNATURE_ALGORITHMS:
16566
                WOLFSSL_MSG("Signature Algorithms extension received");
16567
            #ifdef WOLFSSL_DEBUG_TLS
16568
                WOLFSSL_BUFFER(input + offset, size);
16569
            #endif
16570
16571
                if (!IsAtLeastTLSv1_2(ssl))
16572
                    break;
16573
            #ifdef WOLFSSL_TLS13
16574
                if (IsAtLeastTLSv1_3(ssl->version)) {
16575
                    if (msgType != client_hello &&
16576
                        msgType != certificate_request)
16577
                        return EXT_NOT_ALLOWED;
16578
                }
16579
                else
16580
            #endif
16581
                {
16582
                    if (msgType != client_hello)
16583
                        return EXT_NOT_ALLOWED;
16584
                }
16585
                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
16586
                break;
16587
#endif
16588
16589
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
16590
            case TLSX_ENCRYPT_THEN_MAC:
16591
                WOLFSSL_MSG("Encrypt-Then-Mac extension received");
16592
16593
                /* Ignore for TLS 1.3+ */
16594
                if (IsAtLeastTLSv1_3(ssl->version))
16595
                    break;
16596
                if (msgType != client_hello &&
16597
                    msgType != server_hello)
16598
                    return EXT_NOT_ALLOWED;
16599
16600
                ret = ETM_PARSE(ssl, input + offset, size, msgType);
16601
                break;
16602
#endif /* HAVE_ENCRYPT_THEN_MAC */
16603
16604
#ifdef WOLFSSL_TLS13
16605
            case TLSX_SUPPORTED_VERSIONS:
16606
                WOLFSSL_MSG("Skipping Supported Versions - already processed");
16607
            #ifdef WOLFSSL_DEBUG_TLS
16608
                WOLFSSL_BUFFER(input + offset, size);
16609
            #endif
16610
                if (msgType != client_hello &&
16611
                    msgType != server_hello &&
16612
                    msgType != hello_retry_request)
16613
                    return EXT_NOT_ALLOWED;
16614
16615
                break;
16616
16617
    #ifdef WOLFSSL_SEND_HRR_COOKIE
16618
            case TLSX_COOKIE:
16619
                WOLFSSL_MSG("Cookie extension received");
16620
            #ifdef WOLFSSL_DEBUG_TLS
16621
                WOLFSSL_BUFFER(input + offset, size);
16622
            #endif
16623
16624
                if (!IsAtLeastTLSv1_3(ssl->version))
16625
                    break;
16626
16627
                if (msgType != client_hello &&
16628
                    msgType != hello_retry_request) {
16629
                    return EXT_NOT_ALLOWED;
16630
                }
16631
16632
                ret = CKE_PARSE(ssl, input + offset, size, msgType);
16633
                break;
16634
    #endif
16635
16636
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16637
            case TLSX_PRE_SHARED_KEY:
16638
                WOLFSSL_MSG("Pre-Shared Key extension received");
16639
            #ifdef WOLFSSL_DEBUG_TLS
16640
                WOLFSSL_BUFFER(input + offset, size);
16641
            #endif
16642
16643
                if (!IsAtLeastTLSv1_3(ssl->version))
16644
                    break;
16645
16646
                if (msgType != client_hello &&
16647
                    msgType != server_hello) {
16648
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16649
                    return EXT_NOT_ALLOWED;
16650
                }
16651
16652
                ret = PSK_PARSE(ssl, input + offset, size, msgType);
16653
                pskDone = 1;
16654
                break;
16655
16656
            case TLSX_PSK_KEY_EXCHANGE_MODES:
16657
                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
16658
            #ifdef WOLFSSL_DEBUG_TLS
16659
                WOLFSSL_BUFFER(input + offset, size);
16660
            #endif
16661
16662
                if (!IsAtLeastTLSv1_3(ssl->version))
16663
                    break;
16664
16665
                if (msgType != client_hello) {
16666
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16667
                    return EXT_NOT_ALLOWED;
16668
                }
16669
16670
                ret = PKM_PARSE(ssl, input + offset, size, msgType);
16671
                break;
16672
    #endif
16673
16674
    #ifdef WOLFSSL_EARLY_DATA
16675
            case TLSX_EARLY_DATA:
16676
                WOLFSSL_MSG("Early Data extension received");
16677
            #ifdef WOLFSSL_DEBUG_TLS
16678
                WOLFSSL_BUFFER(input + offset, size);
16679
            #endif
16680
16681
                if (!IsAtLeastTLSv1_3(ssl->version))
16682
                    break;
16683
16684
                if (msgType != client_hello && msgType != session_ticket &&
16685
                    msgType != encrypted_extensions) {
16686
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16687
                    return EXT_NOT_ALLOWED;
16688
                }
16689
                ret = EDI_PARSE(ssl, input + offset, size, msgType);
16690
                break;
16691
    #endif
16692
16693
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
16694
            case TLSX_POST_HANDSHAKE_AUTH:
16695
                WOLFSSL_MSG("Post Handshake Authentication extension received");
16696
            #ifdef WOLFSSL_DEBUG_TLS
16697
                WOLFSSL_BUFFER(input + offset, size);
16698
            #endif
16699
16700
                if (!IsAtLeastTLSv1_3(ssl->version))
16701
                    break;
16702
16703
                if (msgType != client_hello) {
16704
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16705
                    return EXT_NOT_ALLOWED;
16706
                }
16707
16708
                ret = PHA_PARSE(ssl, input + offset, size, msgType);
16709
                break;
16710
    #endif
16711
16712
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16713
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
16714
                WOLFSSL_MSG("Signature Algorithms extension received");
16715
            #ifdef WOLFSSL_DEBUG_TLS
16716
                WOLFSSL_BUFFER(input + offset, size);
16717
            #endif
16718
16719
                if (!IsAtLeastTLSv1_3(ssl->version))
16720
                    break;
16721
16722
                if (msgType != client_hello &&
16723
                        msgType != certificate_request) {
16724
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16725
                    return EXT_NOT_ALLOWED;
16726
                }
16727
16728
                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
16729
                break;
16730
    #endif
16731
16732
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16733
            case TLSX_CERTIFICATE_AUTHORITIES:
16734
                WOLFSSL_MSG("Certificate Authorities extension received");
16735
            #ifdef WOLFSSL_DEBUG_TLS
16736
                WOLFSSL_BUFFER(input + offset, size);
16737
            #endif
16738
16739
                if (!IsAtLeastTLSv1_3(ssl->version))
16740
                    break;
16741
16742
                if (msgType != client_hello &&
16743
                        msgType != certificate_request) {
16744
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16745
                    return EXT_NOT_ALLOWED;
16746
                }
16747
16748
                ret = CAN_PARSE(ssl, input + offset, size, isRequest);
16749
                break;
16750
    #endif
16751
16752
            case TLSX_KEY_SHARE:
16753
                WOLFSSL_MSG("Key Share extension received");
16754
            #ifdef WOLFSSL_DEBUG_TLS
16755
                WOLFSSL_BUFFER(input + offset, size);
16756
            #endif
16757
16758
    #ifdef HAVE_SUPPORTED_CURVES
16759
                if (!IsAtLeastTLSv1_3(ssl->version))
16760
                    break;
16761
16762
                if (msgType != client_hello && msgType != server_hello &&
16763
                        msgType != hello_retry_request) {
16764
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16765
                    return EXT_NOT_ALLOWED;
16766
                }
16767
    #endif
16768
16769
                ret = KS_PARSE(ssl, input + offset, size, msgType);
16770
                break;
16771
#endif
16772
#ifdef WOLFSSL_SRTP
16773
            case TLSX_USE_SRTP:
16774
                WOLFSSL_MSG("Use SRTP extension received");
16775
                ret = SRTP_PARSE(ssl, input + offset, size, isRequest);
16776
                break;
16777
#endif
16778
#ifdef WOLFSSL_QUIC
16779
            case TLSX_KEY_QUIC_TP_PARAMS:
16780
                FALL_THROUGH;
16781
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
16782
                WOLFSSL_MSG("QUIC transport parameter received");
16783
            #ifdef WOLFSSL_DEBUG_TLS
16784
                WOLFSSL_BUFFER(input + offset, size);
16785
            #endif
16786
16787
                if (IsAtLeastTLSv1_3(ssl->version) &&
16788
                        msgType != client_hello &&
16789
                        msgType != server_hello &&
16790
                        msgType != encrypted_extensions) {
16791
                    return EXT_NOT_ALLOWED;
16792
                }
16793
                else if (!IsAtLeastTLSv1_3(ssl->version) &&
16794
                         msgType == encrypted_extensions) {
16795
                    return EXT_NOT_ALLOWED;
16796
                }
16797
                else if (WOLFSSL_IS_QUIC(ssl)) {
16798
                    ret = QTP_PARSE(ssl, input + offset, size, type, msgType);
16799
                }
16800
                else {
16801
                    WOLFSSL_MSG("QUIC transport param TLS extension type, but no QUIC");
16802
                    return EXT_NOT_ALLOWED; /* be safe, this should not happen */
16803
                }
16804
                break;
16805
#endif /* WOLFSSL_QUIC */
16806
#if defined(WOLFSSL_DTLS_CID)
16807
            case TLSX_CONNECTION_ID:
16808
                if (msgType != client_hello && msgType != server_hello)
16809
                    return EXT_NOT_ALLOWED;
16810
16811
                WOLFSSL_MSG("ConnectionID extension received");
16812
                ret = CID_PARSE(ssl, input + offset, size, isRequest);
16813
                break;
16814
16815
#endif /* defined(WOLFSSL_DTLS_CID) */
16816
#if defined(HAVE_RPK)
16817
            case TLSX_CLIENT_CERTIFICATE_TYPE:
16818
                WOLFSSL_MSG("Client Certificate Type extension received");
16819
#if defined(WOLFSSL_TLS13)
16820
                /* RFC 8446, Section 4.2 (Extensions), client_certificate_type
16821
                   and server_certificate_type MUST be sent in ClientHello(CH)
16822
                   or EncryptedExtensions(EE) */
16823
                if (IsAtLeastTLSv1_3(ssl->version)) {
16824
                    if (msgType != client_hello &&
16825
                        msgType != encrypted_extensions) {
16826
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16827
                        return EXT_NOT_ALLOWED;
16828
                    }
16829
                }
16830
                else
16831
#endif
16832
                {
16833
                    /* TLS 1.2: allowed in CH and SH (RFC 7250) */
16834
                    if (msgType != client_hello &&
16835
                        msgType != server_hello) {
16836
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16837
                        return EXT_NOT_ALLOWED;
16838
                    }
16839
                }
16840
                ret = CCT_PARSE(ssl, input + offset, size, msgType);
16841
                break;
16842
16843
            case TLSX_SERVER_CERTIFICATE_TYPE:
16844
                WOLFSSL_MSG("Server Certificate Type extension received");
16845
#if defined(WOLFSSL_TLS13)
16846
                /* RFC 8446, Section 4.2 (Extensions) */
16847
                if (IsAtLeastTLSv1_3(ssl->version)) {
16848
                    if (msgType != client_hello &&
16849
                        msgType != encrypted_extensions) {
16850
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16851
                        return EXT_NOT_ALLOWED;
16852
                    }
16853
                }
16854
                else
16855
#endif
16856
                {
16857
                    /* TLS 1.2: allowed in CH and SH (RFC 7250) */
16858
                    if (msgType != client_hello &&
16859
                        msgType != server_hello) {
16860
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16861
                        return EXT_NOT_ALLOWED;
16862
                    }
16863
                }
16864
                ret = SCT_PARSE(ssl, input + offset, size, msgType);
16865
                break;
16866
#endif /* HAVE_RPK */
16867
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
16868
            case TLSX_ECH:
16869
                WOLFSSL_MSG("ECH extension received");
16870
                ret = ECH_PARSE(ssl, input + offset, size, msgType);
16871
                break;
16872
#endif
16873
            default:
16874
                WOLFSSL_MSG("Unknown TLS extension type");
16875
        }
16876
16877
        /* offset should be updated here! */
16878
        offset += size;
16879
    }
16880
16881
#ifdef HAVE_EXTENDED_MASTER
16882
    if (IsAtLeastTLSv1_3(ssl->version) &&
16883
        (msgType == hello_retry_request || msgType == hello_verify_request)) {
16884
        /* Don't change EMS status until server_hello received.
16885
         * Second ClientHello must have same extensions.
16886
         */
16887
    }
16888
    else if (!isRequest && ssl->options.haveEMS && !pendingEMS)
16889
        ssl->options.haveEMS = 0;
16890
#endif
16891
#if defined(WOLFSSL_TLS13) && !defined(NO_PSK)
16892
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == server_hello &&
16893
        IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE))) {
16894
        ssl->options.noPskDheKe = 1;
16895
    }
16896
#endif
16897
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
16898
    /* RFC 8446 Section 9.2: ClientHello with KeyShare must
16899
     * contain SupportedGroups and vice-versa. */
16900
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == client_hello && isRequest) {
16901
        int hasKeyShare = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE));
16902
        int hasSupportedGroups = !IS_OFF(seenType,
16903
            TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
16904
16905
        if (hasKeyShare && !hasSupportedGroups) {
16906
            WOLFSSL_MSG("ClientHello with KeyShare extension missing required "
16907
                        "SupportedGroups extension");
16908
            return INCOMPLETE_DATA;
16909
        }
16910
        if (hasSupportedGroups && !hasKeyShare) {
16911
            WOLFSSL_MSG("ClientHello with SupportedGroups extension missing "
16912
                        "required KeyShare extension");
16913
            return INCOMPLETE_DATA;
16914
        }
16915
    }
16916
#endif
16917
16918
    if (ret == 0)
16919
        ret = SNI_VERIFY_PARSE(ssl, isRequest);
16920
    if (ret == 0)
16921
        ret = TCA_VERIFY_PARSE(ssl, isRequest);
16922
16923
    WOLFSSL_LEAVE("Leaving TLSX_Parse", ret);
16924
    return ret;
16925
}
16926
16927
/* undefining semaphore macros */
16928
#undef IS_OFF
16929
#undef TURN_ON
16930
#undef SEMAPHORE_SIZE
16931
16932
#endif /* HAVE_TLS_EXTENSIONS */
16933
16934
#ifndef NO_WOLFSSL_CLIENT
16935
16936
    WOLFSSL_METHOD* wolfTLS_client_method(void)
16937
0
    {
16938
0
        return wolfTLS_client_method_ex(NULL);
16939
0
    }
16940
    WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
16941
0
    {
16942
0
        WOLFSSL_METHOD* method =
16943
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16944
0
                                                     heap, DYNAMIC_TYPE_METHOD);
16945
0
        (void)heap;
16946
0
        WOLFSSL_ENTER("TLS_client_method_ex");
16947
0
        if (method) {
16948
0
        #if defined(WOLFSSL_TLS13)
16949
0
            InitSSL_Method(method, MakeTLSv1_3());
16950
        #elif !defined(WOLFSSL_NO_TLS12)
16951
            InitSSL_Method(method, MakeTLSv1_2());
16952
        #elif !defined(NO_OLD_TLS)
16953
            InitSSL_Method(method, MakeTLSv1_1());
16954
        #elif defined(WOLFSSL_ALLOW_TLSV10)
16955
            InitSSL_Method(method, MakeTLSv1());
16956
        #else
16957
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
16958
        #endif
16959
16960
0
            method->downgrade = 1;
16961
0
            method->side      = WOLFSSL_CLIENT_END;
16962
0
        }
16963
0
        return method;
16964
0
    }
16965
16966
#ifndef NO_OLD_TLS
16967
    #ifdef WOLFSSL_ALLOW_TLSV10
16968
    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
16969
    {
16970
        return wolfTLSv1_client_method_ex(NULL);
16971
    }
16972
    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
16973
    {
16974
        WOLFSSL_METHOD* method =
16975
                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16976
                                                     heap, DYNAMIC_TYPE_METHOD);
16977
        (void)heap;
16978
        WOLFSSL_ENTER("TLSv1_client_method_ex");
16979
        if (method)
16980
            InitSSL_Method(method, MakeTLSv1());
16981
        return method;
16982
    }
16983
    #endif /* WOLFSSL_ALLOW_TLSV10 */
16984
16985
    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
16986
    {
16987
        return wolfTLSv1_1_client_method_ex(NULL);
16988
    }
16989
    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
16990
    {
16991
        WOLFSSL_METHOD* method =
16992
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16993
                                                     heap, DYNAMIC_TYPE_METHOD);
16994
        (void)heap;
16995
        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
16996
        if (method)
16997
            InitSSL_Method(method, MakeTLSv1_1());
16998
        return method;
16999
    }
17000
#endif /* !NO_OLD_TLS */
17001
17002
#ifndef WOLFSSL_NO_TLS12
17003
    WOLFSSL_ABI
17004
    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
17005
4
    {
17006
4
        return wolfTLSv1_2_client_method_ex(NULL);
17007
4
    }
17008
    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
17009
4
    {
17010
4
        WOLFSSL_METHOD* method =
17011
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17012
4
                                                     heap, DYNAMIC_TYPE_METHOD);
17013
4
        (void)heap;
17014
4
        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
17015
4
        if (method)
17016
4
            InitSSL_Method(method, MakeTLSv1_2());
17017
4
        return method;
17018
4
    }
17019
#endif /* WOLFSSL_NO_TLS12 */
17020
17021
#ifdef WOLFSSL_TLS13
17022
    /* The TLS v1.3 client method data.
17023
     *
17024
     * returns the method data for a TLS v1.3 client.
17025
     */
17026
    WOLFSSL_ABI
17027
    WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
17028
4
    {
17029
4
        return wolfTLSv1_3_client_method_ex(NULL);
17030
4
    }
17031
17032
    /* The TLS v1.3 client method data.
17033
     *
17034
     * heap  The heap used for allocation.
17035
     * returns the method data for a TLS v1.3 client.
17036
     */
17037
    WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
17038
4
    {
17039
4
        WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
17040
4
                                 XMALLOC(sizeof(WOLFSSL_METHOD), heap,
17041
4
                                         DYNAMIC_TYPE_METHOD);
17042
4
        (void)heap;
17043
4
        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
17044
4
        if (method)
17045
4
            InitSSL_Method(method, MakeTLSv1_3());
17046
4
        return method;
17047
4
    }
17048
#endif /* WOLFSSL_TLS13 */
17049
17050
#ifdef WOLFSSL_DTLS
17051
17052
    WOLFSSL_METHOD* wolfDTLS_client_method(void)
17053
    {
17054
        return wolfDTLS_client_method_ex(NULL);
17055
    }
17056
    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
17057
    {
17058
        WOLFSSL_METHOD* method =
17059
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17060
                                                     heap, DYNAMIC_TYPE_METHOD);
17061
        (void)heap;
17062
        WOLFSSL_ENTER("DTLS_client_method_ex");
17063
        if (method) {
17064
        #if defined(WOLFSSL_DTLS13)
17065
            InitSSL_Method(method, MakeDTLSv1_3());
17066
        #elif !defined(WOLFSSL_NO_TLS12)
17067
            InitSSL_Method(method, MakeDTLSv1_2());
17068
        #elif !defined(NO_OLD_TLS)
17069
            InitSSL_Method(method, MakeDTLSv1());
17070
        #else
17071
            #error No DTLS version enabled!
17072
        #endif
17073
17074
            method->downgrade = 1;
17075
            method->side      = WOLFSSL_CLIENT_END;
17076
        }
17077
        return method;
17078
    }
17079
17080
    #ifndef NO_OLD_TLS
17081
    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
17082
    {
17083
        return wolfDTLSv1_client_method_ex(NULL);
17084
    }
17085
    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
17086
    {
17087
        WOLFSSL_METHOD* method =
17088
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17089
                                                 heap, DYNAMIC_TYPE_METHOD);
17090
        (void)heap;
17091
        WOLFSSL_ENTER("DTLSv1_client_method_ex");
17092
        if (method)
17093
            InitSSL_Method(method, MakeDTLSv1());
17094
        return method;
17095
    }
17096
    #endif  /* NO_OLD_TLS */
17097
17098
    #ifndef WOLFSSL_NO_TLS12
17099
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
17100
    {
17101
        return wolfDTLSv1_2_client_method_ex(NULL);
17102
    }
17103
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
17104
    {
17105
        WOLFSSL_METHOD* method =
17106
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17107
                                                 heap, DYNAMIC_TYPE_METHOD);
17108
        (void)heap;
17109
        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
17110
        if (method)
17111
            InitSSL_Method(method, MakeDTLSv1_2());
17112
        (void)heap;
17113
        return method;
17114
    }
17115
    #endif /* !WOLFSSL_NO_TLS12 */
17116
#endif /* WOLFSSL_DTLS */
17117
17118
#endif /* NO_WOLFSSL_CLIENT */
17119
17120
17121
/* EITHER SIDE METHODS */
17122
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
17123
    #ifndef NO_OLD_TLS
17124
    #ifdef WOLFSSL_ALLOW_TLSV10
17125
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
17126
     *
17127
     * Returns a pointer to a WOLFSSL_METHOD struct
17128
     */
17129
    WOLFSSL_METHOD* wolfTLSv1_method(void)
17130
    {
17131
        return wolfTLSv1_method_ex(NULL);
17132
    }
17133
    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
17134
    {
17135
        WOLFSSL_METHOD* m;
17136
        WOLFSSL_ENTER("TLSv1_method");
17137
    #ifndef NO_WOLFSSL_CLIENT
17138
        m = wolfTLSv1_client_method_ex(heap);
17139
    #else
17140
        m = wolfTLSv1_server_method_ex(heap);
17141
    #endif
17142
        if (m != NULL) {
17143
            m->side = WOLFSSL_NEITHER_END;
17144
        }
17145
17146
        return m;
17147
    }
17148
    #endif /* WOLFSSL_ALLOW_TLSV10 */
17149
17150
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
17151
     *
17152
     * Returns a pointer to a WOLFSSL_METHOD struct
17153
     */
17154
    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
17155
    {
17156
        return wolfTLSv1_1_method_ex(NULL);
17157
    }
17158
    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
17159
    {
17160
        WOLFSSL_METHOD* m;
17161
        WOLFSSL_ENTER("TLSv1_1_method");
17162
    #ifndef NO_WOLFSSL_CLIENT
17163
        m = wolfTLSv1_1_client_method_ex(heap);
17164
    #else
17165
        m = wolfTLSv1_1_server_method_ex(heap);
17166
    #endif
17167
        if (m != NULL) {
17168
            m->side = WOLFSSL_NEITHER_END;
17169
        }
17170
        return m;
17171
    }
17172
    #endif /* !NO_OLD_TLS */
17173
17174
    #ifndef WOLFSSL_NO_TLS12
17175
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
17176
     *
17177
     * Returns a pointer to a WOLFSSL_METHOD struct
17178
     */
17179
    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
17180
    {
17181
        return wolfTLSv1_2_method_ex(NULL);
17182
    }
17183
    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
17184
    {
17185
        WOLFSSL_METHOD* m;
17186
        WOLFSSL_ENTER("TLSv1_2_method");
17187
    #ifndef NO_WOLFSSL_CLIENT
17188
        m = wolfTLSv1_2_client_method_ex(heap);
17189
    #else
17190
        m = wolfTLSv1_2_server_method_ex(heap);
17191
    #endif
17192
        if (m != NULL) {
17193
            m->side = WOLFSSL_NEITHER_END;
17194
        }
17195
        return m;
17196
    }
17197
    #endif /* !WOLFSSL_NO_TLS12 */
17198
17199
    #ifdef WOLFSSL_TLS13
17200
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
17201
     *
17202
     * Returns a pointer to a WOLFSSL_METHOD struct
17203
     */
17204
    WOLFSSL_METHOD* wolfTLSv1_3_method(void)
17205
    {
17206
        return wolfTLSv1_3_method_ex(NULL);
17207
    }
17208
    WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
17209
    {
17210
        WOLFSSL_METHOD* m;
17211
        WOLFSSL_ENTER("TLSv1_3_method");
17212
    #ifndef NO_WOLFSSL_CLIENT
17213
        m = wolfTLSv1_3_client_method_ex(heap);
17214
    #else
17215
        m = wolfTLSv1_3_server_method_ex(heap);
17216
    #endif
17217
        if (m != NULL) {
17218
            m->side = WOLFSSL_NEITHER_END;
17219
        }
17220
        return m;
17221
    }
17222
    #endif /* WOLFSSL_TLS13 */
17223
17224
#ifdef WOLFSSL_DTLS
17225
    WOLFSSL_METHOD* wolfDTLS_method(void)
17226
    {
17227
        return wolfDTLS_method_ex(NULL);
17228
    }
17229
    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
17230
    {
17231
        WOLFSSL_METHOD* m;
17232
        WOLFSSL_ENTER("DTLS_method_ex");
17233
    #ifndef NO_WOLFSSL_CLIENT
17234
        m = wolfDTLS_client_method_ex(heap);
17235
    #else
17236
        m = wolfDTLS_server_method_ex(heap);
17237
    #endif
17238
        if (m != NULL) {
17239
            m->side = WOLFSSL_NEITHER_END;
17240
        }
17241
        return m;
17242
    }
17243
17244
    #ifndef NO_OLD_TLS
17245
    WOLFSSL_METHOD* wolfDTLSv1_method(void)
17246
    {
17247
        return wolfDTLSv1_method_ex(NULL);
17248
    }
17249
    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
17250
    {
17251
        WOLFSSL_METHOD* m;
17252
        WOLFSSL_ENTER("DTLSv1_method_ex");
17253
    #ifndef NO_WOLFSSL_CLIENT
17254
        m = wolfDTLSv1_client_method_ex(heap);
17255
    #else
17256
        m = wolfDTLSv1_server_method_ex(heap);
17257
    #endif
17258
        if (m != NULL) {
17259
            m->side = WOLFSSL_NEITHER_END;
17260
        }
17261
        return m;
17262
    }
17263
    #endif /* !NO_OLD_TLS */
17264
    #ifndef WOLFSSL_NO_TLS12
17265
    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
17266
    {
17267
        return wolfDTLSv1_2_method_ex(NULL);
17268
    }
17269
    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
17270
    {
17271
        WOLFSSL_METHOD* m;
17272
        WOLFSSL_ENTER("DTLSv1_2_method");
17273
    #ifndef NO_WOLFSSL_CLIENT
17274
        m = wolfDTLSv1_2_client_method_ex(heap);
17275
    #else
17276
        m = wolfDTLSv1_2_server_method_ex(heap);
17277
    #endif
17278
        if (m != NULL) {
17279
            m->side = WOLFSSL_NEITHER_END;
17280
        }
17281
        return m;
17282
    }
17283
    #endif /* !WOLFSSL_NO_TLS12 */
17284
    #ifdef WOLFSSL_DTLS13
17285
    WOLFSSL_METHOD* wolfDTLSv1_3_method(void)
17286
    {
17287
        return wolfDTLSv1_3_method_ex(NULL);
17288
    }
17289
    WOLFSSL_METHOD* wolfDTLSv1_3_method_ex(void* heap)
17290
    {
17291
        WOLFSSL_METHOD* m;
17292
        WOLFSSL_ENTER("DTLSv1_3_method");
17293
    #ifndef NO_WOLFSSL_CLIENT
17294
        m = wolfDTLSv1_3_client_method_ex(heap);
17295
    #else
17296
        m = wolfDTLSv1_3_server_method_ex(heap);
17297
    #endif
17298
        if (m != NULL) {
17299
            m->side = WOLFSSL_NEITHER_END;
17300
        }
17301
        return m;
17302
    }
17303
    #endif /* WOLFSSL_DTLS13 */
17304
#endif /* WOLFSSL_DTLS */
17305
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
17306
17307
17308
#ifndef NO_WOLFSSL_SERVER
17309
17310
    WOLFSSL_METHOD* wolfTLS_server_method(void)
17311
0
    {
17312
0
        return wolfTLS_server_method_ex(NULL);
17313
0
    }
17314
17315
    WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
17316
0
    {
17317
0
        WOLFSSL_METHOD* method =
17318
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17319
0
                                                     heap, DYNAMIC_TYPE_METHOD);
17320
0
        (void)heap;
17321
0
        WOLFSSL_ENTER("TLS_server_method_ex");
17322
0
        if (method) {
17323
0
        #if defined(WOLFSSL_TLS13)
17324
0
            InitSSL_Method(method, MakeTLSv1_3());
17325
        #elif !defined(WOLFSSL_NO_TLS12)
17326
            InitSSL_Method(method, MakeTLSv1_2());
17327
        #elif !defined(NO_OLD_TLS)
17328
            InitSSL_Method(method, MakeTLSv1_1());
17329
        #elif defined(WOLFSSL_ALLOW_TLSV10)
17330
            InitSSL_Method(method, MakeTLSv1());
17331
        #else
17332
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
17333
        #endif
17334
17335
0
            method->downgrade = 1;
17336
0
            method->side      = WOLFSSL_SERVER_END;
17337
0
        }
17338
0
        return method;
17339
0
    }
17340
17341
#ifndef NO_OLD_TLS
17342
    #ifdef WOLFSSL_ALLOW_TLSV10
17343
    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
17344
    {
17345
        return wolfTLSv1_server_method_ex(NULL);
17346
    }
17347
    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
17348
    {
17349
        WOLFSSL_METHOD* method =
17350
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17351
                                                     heap, DYNAMIC_TYPE_METHOD);
17352
        (void)heap;
17353
        WOLFSSL_ENTER("TLSv1_server_method_ex");
17354
        if (method) {
17355
            InitSSL_Method(method, MakeTLSv1());
17356
            method->side = WOLFSSL_SERVER_END;
17357
        }
17358
        return method;
17359
    }
17360
    #endif /* WOLFSSL_ALLOW_TLSV10 */
17361
17362
    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
17363
    {
17364
        return wolfTLSv1_1_server_method_ex(NULL);
17365
    }
17366
    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
17367
    {
17368
        WOLFSSL_METHOD* method =
17369
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17370
                                                     heap, DYNAMIC_TYPE_METHOD);
17371
        (void)heap;
17372
        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
17373
        if (method) {
17374
            InitSSL_Method(method, MakeTLSv1_1());
17375
            method->side = WOLFSSL_SERVER_END;
17376
        }
17377
        return method;
17378
    }
17379
#endif /* !NO_OLD_TLS */
17380
17381
17382
#ifndef WOLFSSL_NO_TLS12
17383
    WOLFSSL_ABI
17384
    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
17385
4.78k
    {
17386
4.78k
        return wolfTLSv1_2_server_method_ex(NULL);
17387
4.78k
    }
17388
    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
17389
4.78k
    {
17390
4.78k
        WOLFSSL_METHOD* method =
17391
4.78k
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17392
4.78k
                                                     heap, DYNAMIC_TYPE_METHOD);
17393
4.78k
        (void)heap;
17394
4.78k
        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
17395
4.78k
        if (method) {
17396
4.78k
            InitSSL_Method(method, MakeTLSv1_2());
17397
4.78k
            method->side = WOLFSSL_SERVER_END;
17398
4.78k
        }
17399
4.78k
        return method;
17400
4.78k
    }
17401
#endif /* !WOLFSSL_NO_TLS12 */
17402
17403
#ifdef WOLFSSL_TLS13
17404
    /* The TLS v1.3 server method data.
17405
     *
17406
     * returns the method data for a TLS v1.3 server.
17407
     */
17408
    WOLFSSL_ABI
17409
    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
17410
4
    {
17411
4
        return wolfTLSv1_3_server_method_ex(NULL);
17412
4
    }
17413
17414
    /* The TLS v1.3 server method data.
17415
     *
17416
     * heap  The heap used for allocation.
17417
     * returns the method data for a TLS v1.3 server.
17418
     */
17419
    WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
17420
4
    {
17421
4
        WOLFSSL_METHOD* method =
17422
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17423
4
                                                     heap, DYNAMIC_TYPE_METHOD);
17424
4
        (void)heap;
17425
4
        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
17426
4
        if (method) {
17427
4
            InitSSL_Method(method, MakeTLSv1_3());
17428
4
            method->side = WOLFSSL_SERVER_END;
17429
4
        }
17430
4
        return method;
17431
4
    }
17432
#endif /* WOLFSSL_TLS13 */
17433
17434
#ifdef WOLFSSL_DTLS
17435
    WOLFSSL_METHOD* wolfDTLS_server_method(void)
17436
    {
17437
        return wolfDTLS_server_method_ex(NULL);
17438
    }
17439
    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
17440
    {
17441
        WOLFSSL_METHOD* method =
17442
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17443
                                                     heap, DYNAMIC_TYPE_METHOD);
17444
        (void)heap;
17445
        WOLFSSL_ENTER("DTLS_server_method_ex");
17446
        if (method) {
17447
        #if defined(WOLFSSL_DTLS13)
17448
            InitSSL_Method(method, MakeDTLSv1_3());
17449
        #elif !defined(WOLFSSL_NO_TLS12)
17450
            InitSSL_Method(method, MakeDTLSv1_2());
17451
        #elif !defined(NO_OLD_TLS)
17452
            InitSSL_Method(method, MakeDTLSv1());
17453
        #else
17454
            #error No DTLS version enabled!
17455
        #endif
17456
17457
            method->downgrade = 1;
17458
            method->side      = WOLFSSL_SERVER_END;
17459
        }
17460
        return method;
17461
    }
17462
17463
    #ifndef NO_OLD_TLS
17464
    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
17465
    {
17466
        return wolfDTLSv1_server_method_ex(NULL);
17467
    }
17468
    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
17469
    {
17470
        WOLFSSL_METHOD* method =
17471
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17472
                                                 heap, DYNAMIC_TYPE_METHOD);
17473
        (void)heap;
17474
        WOLFSSL_ENTER("DTLSv1_server_method_ex");
17475
        if (method) {
17476
            InitSSL_Method(method, MakeDTLSv1());
17477
            method->side = WOLFSSL_SERVER_END;
17478
        }
17479
        return method;
17480
    }
17481
    #endif /* !NO_OLD_TLS */
17482
17483
    #ifndef WOLFSSL_NO_TLS12
17484
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
17485
    {
17486
        return wolfDTLSv1_2_server_method_ex(NULL);
17487
    }
17488
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
17489
    {
17490
        WOLFSSL_METHOD* method =
17491
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17492
                                                 heap, DYNAMIC_TYPE_METHOD);
17493
        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
17494
        (void)heap;
17495
        if (method) {
17496
            InitSSL_Method(method, MakeDTLSv1_2());
17497
            method->side = WOLFSSL_SERVER_END;
17498
        }
17499
        (void)heap;
17500
        return method;
17501
    }
17502
    #endif /* !WOLFSSL_NO_TLS12 */
17503
#endif /* WOLFSSL_DTLS */
17504
17505
#endif /* NO_WOLFSSL_SERVER */
17506
17507
#endif /* NO_TLS */
17508
17509
#endif /* WOLFCRYPT_ONLY */