Coverage Report

Created: 2025-12-31 07:08

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wolfssl-heapmath/src/tls.c
Line
Count
Source
1
/* tls.c
2
 *
3
 * Copyright (C) 2006-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
1.04k
    #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
1.01k
{
171
1.01k
    int ret;
172
1.01k
    const byte* side = NULL;
173
1.01k
    word32 hashSz = HSHASH_SZ;
174
1.01k
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
175
1.01k
    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
1.01k
    XMEMSET(handshake_hash, 0, HSHASH_SZ);
184
1.01k
    ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
185
1.01k
    if (ret == 0) {
186
998
        if (XSTRNCMP((const char*)sender, (const char*)kTlsClientStr,
187
998
                                                          SIZEOF_SENDER) == 0) {
188
750
            side = kTlsClientFinStr;
189
750
        }
190
248
        else if (XSTRNCMP((const char*)sender, (const char*)kTlsServerStr,
191
248
                                                          SIZEOF_SENDER) == 0) {
192
248
            side = kTlsServerFinStr;
193
248
        }
194
0
        else {
195
0
            ret = BAD_FUNC_ARG;
196
0
            WOLFSSL_MSG("Unexpected sender value");
197
0
        }
198
998
    }
199
200
1.01k
    if (ret == 0) {
201
998
#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
998
        {
212
998
            PRIVATE_KEY_UNLOCK();
213
998
            ret = wc_PRF_TLS((byte*)hashes, TLS_FINISHED_SZ,
214
998
                      ssl->arrays->masterSecret, SECRET_LEN, side,
215
998
                      FINISHED_LABEL_SZ, handshake_hash, hashSz,
216
998
                      IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
217
998
                      ssl->heap, ssl->devId);
218
998
            PRIVATE_KEY_LOCK();
219
998
        }
220
998
        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
998
    }
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
1.01k
    return ret;
239
1.01k
}
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.86k
{
273
4.86k
    ProtocolVersion pv;
274
4.86k
    pv.major = SSLv3_MAJOR;
275
4.86k
    pv.minor = TLSv1_2_MINOR;
276
277
4.86k
    return pv;
278
4.86k
}
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.47k
{
404
1.47k
    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.47k
    byte seed[SEED_LEN];
412
1.47k
#endif
413
414
1.47k
    XMEMCPY(seed,           sr, RAN_LEN);
415
1.47k
    XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
416
417
1.47k
#ifdef WOLFSSL_HAVE_PRF
418
1.47k
    PRIVATE_KEY_UNLOCK();
419
1.47k
    ret = wc_PRF_TLS(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
420
1.47k
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
421
1.47k
    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.47k
    return ret;
448
1.47k
}
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.47k
{
463
1.47k
    int   ret;
464
1.47k
    int   key_dig_len = 2 * ssl->specs.hash_size +
465
1.47k
                        2 * ssl->specs.key_size  +
466
1.47k
                        2 * ssl->specs.iv_size;
467
1.47k
    WC_DECLARE_VAR(key_dig, byte, MAX_PRF_DIG, 0);
468
469
1.47k
    WC_ALLOC_VAR_EX(key_dig, byte, MAX_PRF_DIG, ssl->heap,
470
1.47k
        DYNAMIC_TYPE_DIGEST, return MEMORY_E);
471
472
1.47k
    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.47k
    ret = _DeriveTlsKeys(key_dig, (word32)key_dig_len,
484
1.47k
                     ssl->arrays->masterSecret, SECRET_LEN,
485
1.47k
                     ssl->arrays->serverRandom, ssl->arrays->clientRandom,
486
1.47k
                     IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
487
1.47k
                     ssl->heap, ssl->devId);
488
1.47k
    if (ret == 0)
489
1.43k
        ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
490
491
1.47k
    WC_FREE_VAR_EX(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
492
493
1.47k
    return ret;
494
1.47k
}
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.47k
{
502
1.47k
    int ret;
503
1.47k
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
504
1.47k
    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.47k
    XMEMCPY(seed,           cr, RAN_LEN);
513
1.47k
    XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
514
515
1.47k
#ifdef WOLFSSL_HAVE_PRF
516
1.47k
    PRIVATE_KEY_UNLOCK();
517
1.47k
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
518
1.47k
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
519
1.47k
    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.47k
    return ret;
540
1.47k
}
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
32
{
561
32
    int ret;
562
563
32
#ifdef WOLFSSL_HAVE_PRF
564
32
    PRIVATE_KEY_UNLOCK();
565
32
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
566
32
               sHash, sHashLen, tls1_2, hash_type, heap, devId);
567
32
    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
32
    return ret;
585
32
}
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.50k
{
602
1.50k
    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.50k
#ifdef HAVE_EXTENDED_MASTER
620
1.50k
    if (ssl->options.haveEMS) {
621
32
        word32 hashSz = HSHASH_SZ;
622
32
    #ifdef WOLFSSL_SMALL_STACK
623
32
        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
624
32
                                              DYNAMIC_TYPE_DIGEST);
625
32
        if (handshake_hash == NULL)
626
0
            return MEMORY_E;
627
    #else
628
        byte handshake_hash[HSHASH_SZ];
629
    #endif
630
631
32
        XMEMSET(handshake_hash, 0, HSHASH_SZ);
632
32
        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
633
32
        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
32
            {
645
32
                ret = _MakeTlsExtendedMasterSecret(
646
32
                    ssl->arrays->masterSecret, SECRET_LEN,
647
32
                    ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
648
32
                    handshake_hash, hashSz,
649
32
                    IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
650
32
                    ssl->heap, ssl->devId);
651
32
            }
652
32
            ForceZero(handshake_hash, hashSz);
653
32
        }
654
655
32
    #ifdef WOLFSSL_SMALL_STACK
656
32
        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
32
    }
661
1.47k
    else
662
1.47k
#endif /* HAVE_EXTENDED_MASTER */
663
1.47k
    {
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.47k
        {
675
1.47k
            ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret,
676
1.47k
                      SECRET_LEN, ssl->arrays->preMasterSecret,
677
1.47k
                      ssl->arrays->preMasterSz, ssl->arrays->clientRandom,
678
1.47k
                      ssl->arrays->serverRandom, IsAtLeastTLSv1_2(ssl),
679
1.47k
                      ssl->specs.mac_algorithm, ssl->heap, ssl->devId);
680
1.47k
        }
681
1.47k
    }
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.50k
    if (ret == 0) {
689
1.47k
        ret = DeriveTlsKeys(ssl);
690
1.47k
    }
691
692
1.50k
    return ret;
693
1.50k
}
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
727
{
739
727
    if (ssl == NULL)
740
0
        return BAD_FUNC_ARG;
741
742
727
    return wolfSSL_GetHmacType_ex(&ssl->specs);
743
727
}
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
99
            ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->innerHash,
902
99
                (word32)digestSz);
903
107
        if (ret == 0)
904
99
            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
    switch (hmac->macType) {
941
0
    #ifndef NO_SHA
942
0
        case WC_SHA:
943
0
            blockSz = WC_SHA_BLOCK_SIZE;
944
0
            blockBits = 6;
945
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
946
0
            break;
947
0
    #endif /* !NO_SHA */
948
949
0
    #ifndef NO_SHA256
950
0
        case WC_SHA256:
951
0
            blockSz = WC_SHA256_BLOCK_SIZE;
952
0
            blockBits = 6;
953
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
954
0
            break;
955
0
    #endif /* !NO_SHA256 */
956
957
0
    #ifdef WOLFSSL_SHA384
958
0
        case WC_SHA384:
959
0
            blockSz = WC_SHA384_BLOCK_SIZE;
960
0
            blockBits = 7;
961
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
962
0
            break;
963
0
    #endif /* WOLFSSL_SHA384 */
964
965
0
    #ifdef WOLFSSL_SHA512
966
0
        case WC_SHA512:
967
0
            blockSz = WC_SHA512_BLOCK_SIZE;
968
0
            blockBits = 7;
969
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
970
0
            break;
971
0
    #endif /* WOLFSSL_SHA512 */
972
973
0
    #ifdef WOLFSSL_SM3
974
0
        case WC_SM3:
975
0
            blockSz = WC_SM3_BLOCK_SIZE;
976
0
            blockBits = 6;
977
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
978
0
            break;
979
0
    #endif /* WOLFSSL_SM3 */
980
981
0
        default:
982
0
            return BAD_FUNC_ARG;
983
0
    }
984
0
    blockMask = blockSz - 1;
985
986
    /* Size of data to HMAC if padding length byte is zero. */
987
0
    maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - (word32)macLen;
988
989
    /* Complete data (including padding) has block for EOC and/or length. */
990
0
    extraBlock = ctSetLTE(((int)maxLen + padSz) & blockMask, padSz);
991
    /* Total number of blocks for data including padding. */
992
0
    blocks = ((int)(maxLen + (word32)blockSz - 1) >> blockBits) + extraBlock;
993
    /* Up to last 6 blocks can be hashed safely. */
994
0
    safeBlocks = blocks - 6;
995
996
    /* Length of message data. */
997
0
    realLen = maxLen - in[sz - 1];
998
    /* Number of message bytes in last block. */
999
0
    lastBlockLen = (int)realLen & blockMask;
1000
    /* Number of padding bytes in last block. */
1001
0
    extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
1002
    /* Number of blocks to create for hash. */
1003
0
    lenBlock = ((int)realLen + extraLen) >> blockBits;
1004
    /* Block containing EOC byte. */
1005
0
    eocBlock = (int)(realLen >> (word32)blockBits);
1006
    /* Index of EOC byte in block. */
1007
0
    eocIndex = (int)(realLen & (word32)blockMask);
1008
1009
    /* Add length of hmac's ipad to total length. */
1010
0
    realLen += (word32)blockSz;
1011
    /* Length as bits - 8 bytes bigendian. */
1012
0
    c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
1013
0
    c32toa(realLen << 3, lenBytes + sizeof(word32));
1014
1015
0
    ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, (word32)blockSz);
1016
0
    if (ret != 0)
1017
0
        return ret;
1018
1019
0
    XMEMSET(hmac->innerHash, 0, (size_t)macLen);
1020
1021
0
    if (safeBlocks > 0) {
1022
0
        ret = Hmac_HashUpdate(hmac, header, headerSz);
1023
0
        if (ret != 0)
1024
0
            return ret;
1025
0
        ret = Hmac_HashUpdate(hmac, in, (word32)(safeBlocks * blockSz -
1026
0
                                WOLFSSL_TLS_HMAC_INNER_SZ));
1027
1028
0
        if (ret != 0)
1029
0
            return ret;
1030
0
    }
1031
0
    else
1032
0
        safeBlocks = 0;
1033
1034
0
    XMEMSET(digest, 0, (size_t)macLen);
1035
0
    k = (unsigned int)(safeBlocks * blockSz);
1036
0
    for (i = safeBlocks; i < blocks; i++) {
1037
0
        unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
1038
0
        unsigned char isEocBlock = ctMaskEq(i, eocBlock);
1039
0
        unsigned char isOutBlock = ctMaskEq(i, lenBlock);
1040
1041
0
        for (j = 0; j < blockSz; j++) {
1042
0
            unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
1043
0
            volatile unsigned char maskPastEoc = ctMaskGT(j, eocIndex);
1044
0
            volatile unsigned char pastEoc = maskPastEoc & isEocBlock;
1045
0
            unsigned char b = 0;
1046
1047
0
            if (k < headerSz)
1048
0
                b = header[k];
1049
0
            else if (k < maxLen)
1050
0
                b = in[k - headerSz];
1051
0
            k++;
1052
1053
0
            b = ctMaskSel(atEoc, 0x80, b);
1054
0
            b &= (unsigned char)~(word32)pastEoc;
1055
0
            b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
1056
1057
0
            if (j >= blockSz - 8) {
1058
0
                b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
1059
0
            }
1060
1061
0
            hashBlock[j] = b;
1062
0
        }
1063
1064
0
        ret = Hmac_HashUpdate(hmac, hashBlock, (word32)blockSz); /* cppcheck-suppress uninitvar */
1065
0
        if (ret != 0)
1066
0
            return ret;
1067
0
        ret = Hmac_HashFinalRaw(hmac, hashBlock);
1068
0
        if (ret != 0)
1069
0
            return ret;
1070
0
        for (j = 0; j < macLen; j++)
1071
0
            ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
1072
0
    }
1073
1074
0
    ret = Hmac_OuterHash(hmac, digest);
1075
1076
0
    return ret;
1077
0
}
1078
1079
#endif
1080
1081
#if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
1082
    defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2)
1083
1084
/* Calculate the HMAC of the header + message data.
1085
 * Constant time implementation using normal hashing operations.
1086
 * Update-Final need to be constant time.
1087
 *
1088
 * hmac    HMAC object.
1089
 * digest  MAC result.
1090
 * in      Message data.
1091
 * sz      Size of the message data.
1092
 * header  Constructed record header with length of handshake data.
1093
 * headerSz Length of header
1094
 * returns 0 on success, otherwise failure.
1095
 */
1096
static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
1097
                            word32 sz, byte* header, word32 headerSz)
1098
0
{
1099
0
    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
1100
0
    int        ret = 0;
1101
0
    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
1102
0
    word32     offset = 0;
1103
0
    int        msgBlocks, blocks, blockBits;
1104
0
    int        i;
1105
1106
0
    switch (hmac->macType) {
1107
0
    #ifndef NO_SHA
1108
0
        case WC_SHA:
1109
0
            blockSz = WC_SHA_BLOCK_SIZE;
1110
0
            blockBits = 6;
1111
0
            macSz = WC_SHA_DIGEST_SIZE;
1112
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1113
0
            break;
1114
0
    #endif /* !NO_SHA */
1115
1116
0
    #ifndef NO_SHA256
1117
0
        case WC_SHA256:
1118
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1119
0
            blockBits = 6;
1120
0
            macSz = WC_SHA256_DIGEST_SIZE;
1121
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1122
0
            break;
1123
0
    #endif /* !NO_SHA256 */
1124
1125
0
    #ifdef WOLFSSL_SHA384
1126
0
        case WC_SHA384:
1127
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1128
0
            blockBits = 7;
1129
0
            macSz = WC_SHA384_DIGEST_SIZE;
1130
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1131
0
            break;
1132
0
    #endif /* WOLFSSL_SHA384 */
1133
1134
0
    #ifdef WOLFSSL_SHA512
1135
0
        case WC_SHA512:
1136
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1137
0
            blockBits = 7;
1138
0
            macSz = WC_SHA512_DIGEST_SIZE;
1139
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1140
0
            break;
1141
0
    #endif /* WOLFSSL_SHA512 */
1142
1143
0
    #ifdef HAVE_BLAKE2
1144
0
        case WC_HASH_TYPE_BLAKE2B:
1145
0
            blockSz = BLAKE2B_BLOCKBYTES;
1146
0
            blockBits = 7;
1147
0
            macSz = BLAKE2B_256;
1148
0
            padSz = 0;
1149
0
            break;
1150
0
    #endif /* HAVE_BLAKE2 */
1151
1152
0
    #ifdef WOLFSSL_SM3
1153
0
        case WC_SM3:
1154
0
            blockSz = WC_SM3_BLOCK_SIZE;
1155
0
            blockBits = 6;
1156
0
            macSz = WC_SM3_DIGEST_SIZE;
1157
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1158
0
            break;
1159
0
    #endif
1160
1161
0
        default:
1162
0
            WOLFSSL_MSG("ERROR: Hmac_UpdateFinal failed, no hmac->macType");
1163
0
            return BAD_FUNC_ARG;
1164
0
    }
1165
1166
0
    msgSz = sz - (1 + in[sz - 1] + macSz);
1167
    /* Make negative result 0 */
1168
0
    msgSz &= ~(0 - (msgSz >> 31));
1169
0
    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
1170
0
    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
1171
    /* Make negative result 0 */
1172
0
    maxSz &= ~(0 - (maxSz >> 31));
1173
1174
    /* Calculate #blocks processed in HMAC for max and real data. */
1175
0
    blocks      = (int)(maxSz >> blockBits);
1176
0
    blocks     += ((maxSz + padSz) % blockSz) < padSz;
1177
0
    msgBlocks   = (int)(realSz >> blockBits);
1178
    /* #Extra blocks to process. */
1179
0
    blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0);
1180
    /* Calculate whole blocks. */
1181
0
    msgBlocks--;
1182
1183
0
    ret = wc_HmacUpdate(hmac, header, headerSz);
1184
0
    if (ret == 0) {
1185
        /* Fill the rest of the block with any available data. */
1186
0
        word32 currSz = ctMaskLT((int)msgSz, (int)blockSz) & msgSz;
1187
0
        currSz |= ctMaskGTE((int)msgSz, (int)blockSz) & blockSz;
1188
0
        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
1189
0
        currSz &= ~(0 - (currSz >> 31));
1190
0
        ret = wc_HmacUpdate(hmac, in, currSz);
1191
0
        offset = currSz;
1192
0
    }
1193
0
    if (ret == 0) {
1194
        /* Do the hash operations on a block basis. */
1195
0
        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
1196
0
            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
1197
0
            if (ret != 0)
1198
0
                break;
1199
0
        }
1200
0
    }
1201
0
    if (ret == 0)
1202
0
        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
1203
0
    if (ret == 0)
1204
0
        ret = wc_HmacFinal(hmac, digest);
1205
0
    if (ret == 0) {
1206
        /* Do the dummy hash operations. Do at least one. */
1207
0
        for (i = 0; i < blocks + 1; i++) {
1208
0
            ret = wc_HmacUpdate(hmac, dummy, blockSz);
1209
0
            if (ret != 0)
1210
0
                break;
1211
0
        }
1212
0
    }
1213
1214
0
    return ret;
1215
0
}
1216
1217
#endif
1218
1219
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1220
#define TLS_HMAC_CID_SZ(s, v) \
1221
                ((v) ? DtlsGetCidRxSize((s)) \
1222
                     : DtlsGetCidTxSize((s)))
1223
#define TLS_HMAC_CID(s, v, b, c) \
1224
                ((v) ? wolfSSL_dtls_cid_get_rx((s), (b), (c)) \
1225
                     : wolfSSL_dtls_cid_get_tx((s), (b), (c)))
1226
#endif
1227
1228
static int TLS_hmac_SetInner(WOLFSSL* ssl, byte* inner, word32* innerSz,
1229
        word32 sz, int content, int verify, int epochOrder)
1230
{
1231
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1232
    unsigned int cidSz = 0;
1233
    if (ssl->options.dtls && (cidSz = TLS_HMAC_CID_SZ(ssl, verify)) > 0) {
1234
        word32 idx = 0;
1235
        if (cidSz > DTLS_CID_MAX_SIZE) {
1236
            WOLFSSL_MSG("DTLS CID too large");
1237
            return DTLS_CID_ERROR;
1238
        }
1239
1240
        XMEMSET(inner + idx, 0xFF, SEQ_SZ);
1241
        idx += SEQ_SZ;
1242
        inner[idx++] = dtls12_cid;
1243
        inner[idx++] = (byte)cidSz;
1244
        inner[idx++] = dtls12_cid;
1245
        inner[idx++] = ssl->version.major;
1246
        inner[idx++] = ssl->version.minor;
1247
        WriteSEQ(ssl, epochOrder, inner + idx);
1248
        idx += SEQ_SZ;
1249
        if (TLS_HMAC_CID(ssl, verify, inner + idx, cidSz) ==
1250
                WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
1251
            WOLFSSL_MSG("DTLS CID write failed");
1252
            return DTLS_CID_ERROR;
1253
        }
1254
        idx += cidSz;
1255
        c16toa((word16)sz, inner + idx);
1256
        idx += LENGTH_SZ;
1257
1258
        *innerSz = idx;
1259
        return 0;
1260
    }
1261
#endif
1262
    *innerSz = WOLFSSL_TLS_HMAC_INNER_SZ;
1263
    return wolfSSL_SetTlsHmacInner(ssl, inner, sz, content,
1264
            !ssl->options.dtls ? verify : epochOrder);
1265
}
1266
1267
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1268
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_CID_INNER_SZ
1269
#else
1270
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_INNER_SZ
1271
#endif
1272
1273
int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
1274
             int content, int verify, int epochOrder)
1275
{
1276
    Hmac   hmac;
1277
    byte   myInner[TLS_HMAC_INNER_SZ];
1278
    word32 innerSz = TLS_HMAC_INNER_SZ;
1279
    int    ret = 0;
1280
    const byte* macSecret = NULL;
1281
    word32 hashSz = 0;
1282
1283
    if (ssl == NULL)
1284
        return BAD_FUNC_ARG;
1285
1286
#ifdef HAVE_TRUNCATED_HMAC
1287
    hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
1288
                                        : ssl->specs.hash_size;
1289
#else
1290
    hashSz = ssl->specs.hash_size;
1291
#endif
1292
1293
#ifdef HAVE_FUZZER
1294
    /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
1295
    if (ssl->fuzzerCb) {
1296
        if (verify && padSz >= 0) {
1297
            ssl->fuzzerCb(ssl, in, sz + hashSz + padSz + 1, FUZZ_HMAC,
1298
                          ssl->fuzzerCtx);
1299
        }
1300
        else {
1301
            ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
1302
        }
1303
    }
1304
#endif
1305
1306
    ret = TLS_hmac_SetInner(ssl, myInner, &innerSz, sz, content, verify,
1307
                            epochOrder);
1308
    if (ret != 0)
1309
        return ret;
1310
1311
    ret = wc_HmacInit(&hmac, ssl->heap, ssl->devId);
1312
    if (ret != 0)
1313
        return ret;
1314
1315
1316
#ifdef WOLFSSL_DTLS
1317
    if (ssl->options.dtls)
1318
        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
1319
    else
1320
#endif
1321
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
1322
    ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
1323
                                              macSecret,
1324
                                              ssl->specs.hash_size);
1325
1326
    if (ret == 0) {
1327
        /* Constant time verification required. */
1328
        if (verify && padSz >= 0) {
1329
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
1330
    !defined(HAVE_SELFTEST)
1331
    #ifdef HAVE_BLAKE2
1332
            if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
1333
                ret = Hmac_UpdateFinal(&hmac, digest, in,
1334
                        sz + hashSz + (word32)padSz + 1, myInner, innerSz);
1335
            }
1336
            else
1337
    #endif
1338
            {
1339
                ret = Hmac_UpdateFinal_CT(&hmac, digest, in,
1340
                                      (sz + hashSz + (word32)padSz + 1),
1341
                                      (int)hashSz, myInner, innerSz);
1342
1343
            }
1344
#else
1345
            ret = Hmac_UpdateFinal(&hmac, digest, in, sz + hashSz +
1346
                                        (word32)(padSz) + 1,
1347
                                        myInner, innerSz);
1348
#endif
1349
        }
1350
        else {
1351
            ret = wc_HmacUpdate(&hmac, myInner, innerSz);
1352
            if (ret == 0)
1353
                ret = wc_HmacUpdate(&hmac, in, sz);                /* content */
1354
            if (ret == 0)
1355
                ret = wc_HmacFinal(&hmac, digest);
1356
        }
1357
    }
1358
1359
    wc_HmacFree(&hmac);
1360
1361
    return ret;
1362
}
1363
#endif /* WOLFSSL_AEAD_ONLY */
1364
1365
#endif /* !WOLFSSL_NO_TLS12 */
1366
1367
int wolfSSL_GetHmacType_ex(CipherSpecs* specs)
1368
0
{
1369
0
    if (specs == NULL)
1370
0
        return BAD_FUNC_ARG;
1371
1372
0
    switch (specs->mac_algorithm) {
1373
0
        #ifndef NO_MD5
1374
0
        case md5_mac:
1375
0
        {
1376
0
            return WC_MD5;
1377
0
        }
1378
0
        #endif
1379
0
        #ifndef NO_SHA256
1380
0
        case sha256_mac:
1381
0
        {
1382
0
            return WC_SHA256;
1383
0
        }
1384
0
        #endif
1385
0
        #ifdef WOLFSSL_SHA384
1386
0
        case sha384_mac:
1387
0
        {
1388
0
            return WC_SHA384;
1389
0
        }
1390
0
        #endif
1391
0
        #ifdef WOLFSSL_SM3
1392
0
        case sm3_mac:
1393
0
        {
1394
0
            return WC_SM3;
1395
0
        }
1396
0
        #endif
1397
0
        #ifndef NO_SHA
1398
0
        case sha_mac:
1399
0
        {
1400
0
            return WC_SHA;
1401
0
        }
1402
0
        #endif
1403
0
        #ifdef HAVE_BLAKE2
1404
0
        case blake2b_mac:
1405
0
        {
1406
0
            return BLAKE2B_ID;
1407
0
        }
1408
0
        #endif
1409
0
        default:
1410
0
        {
1411
0
            return WOLFSSL_FATAL_ERROR;
1412
0
        }
1413
0
    }
1414
0
}
1415
1416
#ifdef HAVE_TLS_EXTENSIONS
1417
1418
/**
1419
 * The TLSX semaphore is used to calculate the size of the extensions to be sent
1420
 * from one peer to another.
1421
 */
1422
1423
/** Supports up to 72 flags. Increase as needed. */
1424
#define SEMAPHORE_SIZE 9
1425
1426
/**
1427
 * Converts the extension type (id) to an index in the semaphore.
1428
 *
1429
 * Official reference for TLS extension types:
1430
 *   http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
1431
 *
1432
 * Motivation:
1433
 *   Previously, we used the extension type itself as the index of that
1434
 *   extension in the semaphore as the extension types were declared
1435
 *   sequentially, but maintain a semaphore as big as the number of available
1436
 *   extensions is no longer an option since the release of renegotiation_info.
1437
 *
1438
 * How to update:
1439
 *   Assign extension types that extrapolate the number of available semaphores
1440
 *   to the first available index going backwards in the semaphore array.
1441
 *   When adding a new extension type that don't extrapolate the number of
1442
 *   available semaphores, check for a possible collision with with a
1443
 *   'remapped' extension type.
1444
 *
1445
 * Update TLSX_Parse for duplicate detection if more added above 62.
1446
 */
1447
static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
1448
{
1449
    switch (type) {
1450
1451
        case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
1452
            return 63;
1453
#ifdef WOLFSSL_QUIC
1454
        case TLSX_KEY_QUIC_TP_PARAMS_DRAFT: /* 0xffa5 */
1455
            return 64;
1456
#endif
1457
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
1458
        case TLSX_ECH: /* 0xfe0d */
1459
            return 65;
1460
#endif
1461
#ifdef WOLFSSL_DUAL_ALG_CERTS
1462
        case TLSX_CKS:
1463
            return 66;
1464
#endif
1465
        default:
1466
            if (type > 62) {
1467
                /* This message SHOULD only happens during the adding of
1468
                   new TLS extensions in which its IANA number overflows
1469
                   the current semaphore's range, or if its number already
1470
                   is assigned to be used by another extension.
1471
                   Use this check value for the new extension and decrement
1472
                   the check value by one. */
1473
                WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
1474
            }
1475
    }
1476
1477
    return type;
1478
}
1479
1480
/** Checks if a specific light (tls extension) is not set in the semaphore. */
1481
#define IS_OFF(semaphore, light) \
1482
    (!(((semaphore)[(light) / 8] &  (byte) (0x01 << ((light) % 8)))))
1483
1484
/** Turn on a specific light (tls extension) in the semaphore. */
1485
/* the semaphore marks the extensions already written to the message */
1486
#define TURN_ON(semaphore, light) \
1487
0
    ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
1488
1489
/** Turn off a specific light (tls extension) in the semaphore. */
1490
#define TURN_OFF(semaphore, light) \
1491
0
    ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
1492
1493
/** Creates a new extension. */
1494
static TLSX* TLSX_New(TLSX_Type type, const void* data, void* heap)
1495
122k
{
1496
122k
    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
1497
1498
122k
    (void)heap;
1499
1500
122k
    if (extension) {
1501
122k
        extension->type = type;
1502
122k
        extension->data = (void*)data;
1503
122k
        extension->resp = 0;
1504
122k
        extension->next = NULL;
1505
122k
    }
1506
1507
122k
    return extension;
1508
122k
}
1509
1510
/**
1511
 * Creates a new extension and appends it to the provided list.
1512
 * Checks for duplicate extensions, keeps the newest.
1513
 */
1514
int TLSX_Append(TLSX** list, TLSX_Type type, const void* data, void* heap)
1515
0
{
1516
0
    TLSX* extension = TLSX_New(type, data, heap);
1517
0
    TLSX* cur;
1518
0
    TLSX** prevNext = list;
1519
1520
0
    if (extension == NULL)
1521
0
        return MEMORY_E;
1522
1523
0
    for (cur = *list; cur != NULL;) {
1524
0
        if (cur->type == type) {
1525
0
            *prevNext = cur->next;
1526
0
            cur->next = NULL;
1527
0
            TLSX_FreeAll(cur, heap);
1528
0
            cur = *prevNext;
1529
0
        }
1530
0
        else {
1531
0
            prevNext = &cur->next;
1532
0
            cur = cur->next;
1533
0
        }
1534
0
    }
1535
1536
    /* Append the extension to the list */
1537
0
    *prevNext = extension;
1538
1539
0
    return 0;
1540
0
}
1541
1542
/**
1543
 * Creates a new extension and pushes it to the provided list.
1544
 * Checks for duplicate extensions, keeps the newest.
1545
 */
1546
int TLSX_Push(TLSX** list, TLSX_Type type, const void* data, void* heap)
1547
122k
{
1548
122k
    TLSX* extension = TLSX_New(type, data, heap);
1549
1550
122k
    if (extension == NULL)
1551
278
        return MEMORY_E;
1552
1553
    /* pushes the new extension on the list. */
1554
122k
    extension->next = *list;
1555
122k
    *list = extension;
1556
1557
    /* remove duplicate extensions, there should be only one of each type. */
1558
371k
    do {
1559
371k
        if (extension->next && extension->next->type == type) {
1560
162
            TLSX *next = extension->next;
1561
1562
162
            extension->next = next->next;
1563
162
            next->next = NULL;
1564
1565
162
            TLSX_FreeAll(next, heap);
1566
1567
            /* there is no way to occur more than
1568
             * two extensions of the same type.
1569
             */
1570
162
            break;
1571
162
        }
1572
371k
    } while ((extension = extension->next));
1573
1574
122k
    return 0;
1575
122k
}
1576
1577
#ifndef NO_WOLFSSL_CLIENT
1578
1579
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
1580
1581
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
1582
271
{
1583
271
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1584
1585
271
    if (!extension)
1586
271
        extension = TLSX_Find(ssl->ctx->extensions, type);
1587
1588
271
    return extension == NULL;
1589
271
}
1590
1591
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
1592
1593
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
1594
14
{
1595
14
    SendAlert(ssl, alert_fatal, unsupported_extension);
1596
14
    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
1597
14
    return UNSUPPORTED_EXTENSION;
1598
14
}
1599
1600
#else
1601
1602
#define TLSX_CheckUnsupportedExtension(ssl, type) 0
1603
#define TLSX_HandleUnsupportedExtension(ssl) 0
1604
1605
#endif
1606
1607
#if !defined(NO_WOLFSSL_SERVER) || defined(WOLFSSL_TLS13)
1608
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
1609
/** Mark an extension to be sent back to the client. */
1610
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
1611
2.26k
{
1612
2.26k
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1613
1614
2.26k
    if (extension)
1615
2.26k
        extension->resp = 1;
1616
2.26k
}
1617
#endif
1618
1619
/******************************************************************************/
1620
/* Application-Layer Protocol Negotiation                                     */
1621
/******************************************************************************/
1622
1623
#ifdef HAVE_ALPN
1624
/** Creates a new ALPN object, providing protocol name to use. */
1625
static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
1626
                                                                     void* heap)
1627
{
1628
    ALPN *alpn;
1629
1630
    WOLFSSL_ENTER("TLSX_ALPN_New");
1631
1632
    if (protocol_name == NULL ||
1633
        protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
1634
        WOLFSSL_MSG("Invalid arguments");
1635
        return NULL;
1636
    }
1637
1638
    alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
1639
    if (alpn == NULL) {
1640
        WOLFSSL_MSG("Memory failure");
1641
        return NULL;
1642
    }
1643
1644
    alpn->next = NULL;
1645
    alpn->negotiated = 0;
1646
    alpn->options = 0;
1647
1648
    alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
1649
                                         heap, DYNAMIC_TYPE_TLSX);
1650
    if (alpn->protocol_name == NULL) {
1651
        WOLFSSL_MSG("Memory failure");
1652
        XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1653
        return NULL;
1654
    }
1655
1656
    XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
1657
    alpn->protocol_name[protocol_nameSz] = 0;
1658
1659
    (void)heap;
1660
1661
    return alpn;
1662
}
1663
1664
/** Releases an ALPN object. */
1665
static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
1666
{
1667
    (void)heap;
1668
1669
    if (alpn == NULL)
1670
        return;
1671
1672
    XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
1673
    XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1674
}
1675
1676
/** Releases all ALPN objects in the provided list. */
1677
static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
1678
{
1679
    ALPN* alpn;
1680
1681
    while ((alpn = list)) {
1682
        list = alpn->next;
1683
        TLSX_ALPN_Free(alpn, heap);
1684
    }
1685
}
1686
1687
/** Tells the buffered size of the ALPN objects in a list. */
1688
static word16 TLSX_ALPN_GetSize(ALPN *list)
1689
{
1690
    ALPN* alpn;
1691
    word16 length = OPAQUE16_LEN; /* list length */
1692
1693
    while ((alpn = list)) {
1694
        list = alpn->next;
1695
1696
        length++; /* protocol name length is on one byte */
1697
        length += (word16)XSTRLEN(alpn->protocol_name);
1698
    }
1699
1700
    return length;
1701
}
1702
1703
/** Writes the ALPN objects of a list in a buffer. */
1704
static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
1705
{
1706
    ALPN* alpn;
1707
    word16 length = 0;
1708
    word16 offset = OPAQUE16_LEN; /* list length offset */
1709
1710
    while ((alpn = list)) {
1711
        list = alpn->next;
1712
1713
        length = (word16)XSTRLEN(alpn->protocol_name);
1714
1715
        /* protocol name length */
1716
        output[offset++] = (byte)length;
1717
1718
        /* protocol name value */
1719
        XMEMCPY(output + offset, alpn->protocol_name, length);
1720
1721
        offset += length;
1722
    }
1723
1724
    /* writing list length */
1725
    c16toa(offset - OPAQUE16_LEN, output);
1726
1727
    return offset;
1728
}
1729
1730
/** Finds a protocol name in the provided ALPN list */
1731
static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
1732
{
1733
    ALPN *alpn;
1734
1735
    if (list == NULL || protocol_name == NULL)
1736
        return NULL;
1737
1738
    alpn = list;
1739
    while (alpn != NULL && (
1740
           (word16)XSTRLEN(alpn->protocol_name) != size ||
1741
           XSTRNCMP(alpn->protocol_name, protocol_name, size)))
1742
        alpn = alpn->next;
1743
1744
    return alpn;
1745
}
1746
1747
/** Set the ALPN matching client and server requirements */
1748
static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
1749
                                                                     void* heap)
1750
{
1751
    ALPN *alpn;
1752
    int  ret;
1753
1754
    if (extensions == NULL || data == NULL)
1755
        return BAD_FUNC_ARG;
1756
1757
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1758
    if (alpn == NULL) {
1759
        WOLFSSL_MSG("Memory failure");
1760
        return MEMORY_E;
1761
    }
1762
1763
    alpn->negotiated = 1;
1764
1765
    ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
1766
                                                                          heap);
1767
    if (ret != 0) {
1768
        TLSX_ALPN_Free(alpn, heap);
1769
        return ret;
1770
    }
1771
1772
    return WOLFSSL_SUCCESS;
1773
}
1774
1775
static int ALPN_find_match(WOLFSSL *ssl, TLSX **pextension,
1776
                           const byte **psel, byte *psel_len,
1777
                           const byte *alpn_val, word16 alpn_val_len)
1778
{
1779
    TLSX    *extension;
1780
    ALPN    *alpn, *list;
1781
    const byte *sel = NULL, *s;
1782
    byte sel_len = 0, wlen;
1783
1784
    extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1785
    if (extension == NULL)
1786
        extension = TLSX_Find(ssl->ctx->extensions,
1787
                              TLSX_APPLICATION_LAYER_PROTOCOL);
1788
1789
    /* No ALPN configured here */
1790
    if (extension == NULL || extension->data == NULL) {
1791
        *pextension = NULL;
1792
        *psel = NULL;
1793
        *psel_len = 0;
1794
        return 0;
1795
    }
1796
1797
    list = (ALPN*)extension->data;
1798
    for (s = alpn_val;
1799
         (s - alpn_val) < alpn_val_len;
1800
         s += wlen) {
1801
        wlen = *s++; /* bounds already checked on save */
1802
        alpn = TLSX_ALPN_Find(list, (char*)s, wlen);
1803
        if (alpn != NULL) {
1804
            WOLFSSL_MSG("ALPN protocol match");
1805
            sel = s,
1806
            sel_len = wlen;
1807
            break;
1808
        }
1809
    }
1810
1811
    if (sel == NULL) {
1812
        WOLFSSL_MSG("No ALPN protocol match");
1813
1814
        /* do nothing if no protocol match between client and server and option
1815
         is set to continue (like OpenSSL) */
1816
        if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
1817
            WOLFSSL_MSG("Continue on mismatch");
1818
        }
1819
        else {
1820
            SendAlert(ssl, alert_fatal, no_application_protocol);
1821
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1822
            return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1823
        }
1824
    }
1825
1826
    *pextension = extension;
1827
    *psel = sel;
1828
    *psel_len = sel_len;
1829
    return 0;
1830
}
1831
1832
int ALPN_Select(WOLFSSL *ssl)
1833
{
1834
    TLSX *extension;
1835
    const byte *sel = NULL;
1836
    byte sel_len = 0;
1837
    int r = 0;
1838
1839
    WOLFSSL_ENTER("ALPN_Select");
1840
    if (ssl->alpn_peer_requested == NULL)
1841
        return 0;
1842
1843
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
1844
    if (ssl->alpnSelect != NULL && ssl->options.side == WOLFSSL_SERVER_END) {
1845
        r = ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested,
1846
                ssl->alpn_peer_requested_length, ssl->alpnSelectArg);
1847
        switch (r) {
1848
            case SSL_TLSEXT_ERR_OK:
1849
                WOLFSSL_MSG("ALPN protocol match");
1850
                break;
1851
            case SSL_TLSEXT_ERR_NOACK:
1852
                WOLFSSL_MSG("ALPN cb no match but not fatal");
1853
                sel = NULL;
1854
                sel_len = 0;
1855
                break;
1856
            case SSL_TLSEXT_ERR_ALERT_FATAL:
1857
            default:
1858
                WOLFSSL_MSG("ALPN cb no match and fatal");
1859
                SendAlert(ssl, alert_fatal, no_application_protocol);
1860
                WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1861
                return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1862
        }
1863
    }
1864
    else
1865
#endif
1866
    {
1867
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len,
1868
                            ssl->alpn_peer_requested,
1869
                            ssl->alpn_peer_requested_length);
1870
        if (r != 0)
1871
            return r;
1872
    }
1873
1874
    if (sel != NULL) {
1875
        /* set the matching negotiated protocol */
1876
        r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
1877
        if (r != WOLFSSL_SUCCESS) {
1878
            WOLFSSL_MSG("TLSX_SetALPN failed");
1879
            return BUFFER_ERROR;
1880
        }
1881
        /* reply to ALPN extension sent from peer */
1882
#ifndef NO_WOLFSSL_SERVER
1883
        TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
1884
#endif
1885
    }
1886
    return 0;
1887
}
1888
1889
/** Parses a buffer of ALPN extensions and set the first one matching
1890
 * client and server requirements */
1891
static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, const byte *input, word16 length,
1892
                                 byte isRequest)
1893
{
1894
    word16  size = 0, offset = 0, wlen;
1895
    int     r = WC_NO_ERR_TRACE(BUFFER_ERROR);
1896
    const byte *s;
1897
1898
    if (OPAQUE16_LEN > length)
1899
        return BUFFER_ERROR;
1900
1901
    ato16(input, &size);
1902
    offset += OPAQUE16_LEN;
1903
1904
    /* validating alpn list length */
1905
    if (size == 0 || length != OPAQUE16_LEN + size)
1906
        return BUFFER_ERROR;
1907
1908
    /* validating length of entries before accepting */
1909
    for (s = input + offset; (s - input) < size; s += wlen) {
1910
        wlen = *s++;
1911
        if (wlen == 0 || (s + wlen - input) > length)
1912
            return BUFFER_ERROR;
1913
    }
1914
1915
    if (isRequest) {
1916
        /* keep the list sent by peer, if this is from a request. We
1917
         * use it later in ALPN_Select() for evaluation. */
1918
        if (ssl->alpn_peer_requested != NULL) {
1919
            XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
1920
            ssl->alpn_peer_requested_length = 0;
1921
        }
1922
        ssl->alpn_peer_requested = (byte *)XMALLOC(size, ssl->heap,
1923
                                                   DYNAMIC_TYPE_ALPN);
1924
        if (ssl->alpn_peer_requested == NULL) {
1925
            return MEMORY_ERROR;
1926
        }
1927
        ssl->alpn_peer_requested_length = size;
1928
        XMEMCPY(ssl->alpn_peer_requested, (char*)input + offset, size);
1929
    }
1930
    else {
1931
        /* a response, we should find the value in our config */
1932
        const byte *sel = NULL;
1933
        byte sel_len = 0;
1934
        TLSX *extension = NULL;
1935
1936
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len, input + offset, size);
1937
        if (r != 0)
1938
            return r;
1939
1940
        if (sel != NULL) {
1941
            /* set the matching negotiated protocol */
1942
            r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
1943
            if (r != WOLFSSL_SUCCESS) {
1944
                WOLFSSL_MSG("TLSX_SetALPN failed");
1945
                return BUFFER_ERROR;
1946
            }
1947
        }
1948
        /* If we had nothing configured, the response is unexpected */
1949
        else if (extension == NULL) {
1950
            r = TLSX_HandleUnsupportedExtension(ssl);
1951
            if (r != 0)
1952
                return r;
1953
        }
1954
    }
1955
    return 0;
1956
}
1957
1958
/** Add a protocol name to the list of accepted usable ones */
1959
int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
1960
                                                                     void* heap)
1961
{
1962
    ALPN *alpn;
1963
    TLSX *extension;
1964
    int  ret;
1965
1966
    if (extensions == NULL || data == NULL)
1967
        return BAD_FUNC_ARG;
1968
1969
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1970
    if (alpn == NULL) {
1971
        WOLFSSL_MSG("Memory failure");
1972
        return MEMORY_E;
1973
    }
1974
1975
    /* Set Options of ALPN */
1976
    alpn->options = options;
1977
1978
    extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1979
    if (extension == NULL) {
1980
        ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
1981
                                                             (void*)alpn, heap);
1982
        if (ret != 0) {
1983
            TLSX_ALPN_Free(alpn, heap);
1984
            return ret;
1985
        }
1986
    }
1987
    else {
1988
        /* push new ALPN object to extension data. */
1989
        alpn->next = (ALPN*)extension->data;
1990
        extension->data = (void*)alpn;
1991
    }
1992
1993
    return WOLFSSL_SUCCESS;
1994
}
1995
1996
/** Get the protocol name set by the server */
1997
int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
1998
{
1999
    TLSX *extension;
2000
    ALPN *alpn;
2001
2002
    if (extensions == NULL || data == NULL || dataSz == NULL)
2003
        return BAD_FUNC_ARG;
2004
2005
    *data = NULL;
2006
    *dataSz = 0;
2007
2008
    extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2009
    if (extension == NULL) {
2010
        WOLFSSL_MSG("TLS extension not found");
2011
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2012
        return WOLFSSL_ALPN_NOT_FOUND;
2013
    }
2014
2015
    alpn = (ALPN *)extension->data;
2016
    if (alpn == NULL) {
2017
        WOLFSSL_MSG("ALPN extension not found");
2018
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2019
        return WOLFSSL_FATAL_ERROR;
2020
    }
2021
2022
    if (alpn->negotiated != 1) {
2023
2024
        /* consider as an error */
2025
        if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
2026
            WOLFSSL_MSG("No protocol match with peer -> Failed");
2027
            WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2028
            return WOLFSSL_FATAL_ERROR;
2029
        }
2030
2031
        /* continue without negotiated protocol */
2032
        WOLFSSL_MSG("No protocol match with peer -> Continue");
2033
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2034
        return WOLFSSL_ALPN_NOT_FOUND;
2035
    }
2036
2037
    if (alpn->next != NULL) {
2038
        WOLFSSL_MSG("Only one protocol name must be accepted");
2039
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2040
        return WOLFSSL_FATAL_ERROR;
2041
    }
2042
2043
    *data = alpn->protocol_name;
2044
    *dataSz = (word16)XSTRLEN((char*)*data);
2045
2046
    return WOLFSSL_SUCCESS;
2047
}
2048
2049
#define ALPN_FREE_ALL     TLSX_ALPN_FreeAll
2050
#define ALPN_GET_SIZE     TLSX_ALPN_GetSize
2051
#define ALPN_WRITE        TLSX_ALPN_Write
2052
#define ALPN_PARSE        TLSX_ALPN_ParseAndSet
2053
2054
#else /* HAVE_ALPN */
2055
2056
0
#define ALPN_FREE_ALL(list, heap) WC_DO_NOTHING
2057
#define ALPN_GET_SIZE(list)     0
2058
#define ALPN_WRITE(a, b)        0
2059
#define ALPN_PARSE(a, b, c, d)  0
2060
2061
#endif /* HAVE_ALPN */
2062
2063
/******************************************************************************/
2064
/* Server Name Indication                                                     */
2065
/******************************************************************************/
2066
2067
#ifdef HAVE_SNI
2068
2069
/** Creates a new SNI object. */
2070
static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
2071
28
{
2072
28
    SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
2073
2074
28
    (void)heap;
2075
2076
28
    if (sni) {
2077
28
        sni->type = type;
2078
28
        sni->next = NULL;
2079
2080
28
    #ifndef NO_WOLFSSL_SERVER
2081
28
        sni->options = 0;
2082
28
        sni->status  = WOLFSSL_SNI_NO_MATCH;
2083
28
    #endif
2084
2085
28
        switch (sni->type) {
2086
28
            case WOLFSSL_SNI_HOST_NAME:
2087
28
                sni->data.host_name = (char*)XMALLOC(size + 1, heap,
2088
28
                                                     DYNAMIC_TYPE_TLSX);
2089
28
                if (sni->data.host_name) {
2090
28
                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
2091
28
                    sni->data.host_name[size] = '\0';
2092
28
                } else {
2093
0
                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2094
0
                    sni = NULL;
2095
0
                }
2096
28
            break;
2097
2098
0
            default: /* invalid type */
2099
0
                XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2100
0
                sni = NULL;
2101
28
        }
2102
28
    }
2103
2104
28
    return sni;
2105
28
}
2106
2107
/** Releases a SNI object. */
2108
static void TLSX_SNI_Free(SNI* sni, void* heap)
2109
0
{
2110
0
    if (sni) {
2111
0
        switch (sni->type) {
2112
0
            case WOLFSSL_SNI_HOST_NAME:
2113
0
                XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
2114
0
            break;
2115
0
        }
2116
2117
0
        XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2118
0
    }
2119
0
    (void)heap;
2120
0
}
2121
2122
/** Releases all SNI objects in the provided list. */
2123
static void TLSX_SNI_FreeAll(SNI* list, void* heap)
2124
0
{
2125
0
    SNI* sni;
2126
2127
0
    while ((sni = list)) {
2128
0
        list = sni->next;
2129
0
        TLSX_SNI_Free(sni, heap);
2130
0
    }
2131
0
}
2132
2133
/** Tells the buffered size of the SNI objects in a list. */
2134
static word16 TLSX_SNI_GetSize(SNI* list)
2135
15.4k
{
2136
15.4k
    SNI* sni;
2137
15.4k
    word16 length = OPAQUE16_LEN; /* list length */
2138
2139
30.9k
    while ((sni = list)) {
2140
15.4k
        list = sni->next;
2141
2142
15.4k
        length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
2143
2144
15.4k
        switch (sni->type) {
2145
15.4k
            case WOLFSSL_SNI_HOST_NAME:
2146
15.4k
                length += (word16)XSTRLEN((char*)sni->data.host_name);
2147
15.4k
            break;
2148
15.4k
        }
2149
15.4k
    }
2150
2151
15.4k
    return length;
2152
15.4k
}
2153
2154
/** Writes the SNI objects of a list in a buffer. */
2155
static word16 TLSX_SNI_Write(SNI* list, byte* output)
2156
15.4k
{
2157
15.4k
    SNI* sni;
2158
15.4k
    word16 length = 0;
2159
15.4k
    word16 offset = OPAQUE16_LEN; /* list length offset */
2160
2161
30.9k
    while ((sni = list)) {
2162
15.4k
        list = sni->next;
2163
2164
15.4k
        output[offset++] = sni->type; /* sni type */
2165
2166
15.4k
        switch (sni->type) {
2167
15.4k
            case WOLFSSL_SNI_HOST_NAME:
2168
15.4k
                length = (word16)XSTRLEN((char*)sni->data.host_name);
2169
2170
15.4k
                c16toa(length, output + offset); /* sni length */
2171
15.4k
                offset += OPAQUE16_LEN;
2172
2173
15.4k
                XMEMCPY(output + offset, sni->data.host_name, length);
2174
2175
15.4k
                offset += length;
2176
15.4k
            break;
2177
15.4k
        }
2178
15.4k
    }
2179
2180
15.4k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2181
2182
15.4k
    return offset;
2183
15.4k
}
2184
2185
/** Finds a SNI object in the provided list. */
2186
static SNI* TLSX_SNI_Find(SNI *list, byte type)
2187
13
{
2188
13
    SNI* sni = list;
2189
2190
13
    while (sni && sni->type != type)
2191
0
        sni = sni->next;
2192
2193
13
    return sni;
2194
13
}
2195
2196
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
2197
/** Sets the status of a SNI object. */
2198
static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
2199
13
{
2200
13
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2201
13
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2202
2203
13
    if (sni)
2204
0
        sni->status = status;
2205
13
}
2206
#endif
2207
2208
/** Gets the status of a SNI object. */
2209
byte TLSX_SNI_Status(TLSX* extensions, byte type)
2210
0
{
2211
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2212
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2213
2214
0
    if (sni)
2215
0
        return sni->status;
2216
2217
0
    return 0;
2218
0
}
2219
2220
/** Parses a buffer of SNI extensions. */
2221
static int TLSX_SNI_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2222
                          byte isRequest)
2223
650
{
2224
650
#ifndef NO_WOLFSSL_SERVER
2225
650
    word16 size = 0;
2226
650
    word16 offset = 0;
2227
650
    int cacheOnly = 0;
2228
650
    SNI *sni = NULL;
2229
650
    byte type;
2230
650
    byte matched;
2231
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2232
    WOLFSSL_ECH* ech = NULL;
2233
    WOLFSSL_EchConfig* workingConfig;
2234
    TLSX* echX;
2235
#endif
2236
650
#endif /* !NO_WOLFSSL_SERVER */
2237
650
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
2238
2239
650
    if (!extension)
2240
650
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2241
2242
650
    if (!isRequest) {
2243
23
        #ifndef NO_WOLFSSL_CLIENT
2244
23
            if (!extension || !extension->data)
2245
0
                return TLSX_HandleUnsupportedExtension(ssl);
2246
2247
23
            if (length > 0)
2248
10
                return BUFFER_ERROR; /* SNI response MUST be empty. */
2249
2250
            /* This call enables wolfSSL_SNI_GetRequest() to be called in the
2251
             * client side to fetch the used SNI. It will only work if the SNI
2252
             * was set at the SSL object level. Right now we only support one
2253
             * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
2254
             * inclusion of other name types will turn this method inaccurate,
2255
             * as the extension response doesn't contains information of which
2256
             * name was accepted.
2257
             */
2258
13
            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
2259
13
                                                        WOLFSSL_SNI_REAL_MATCH);
2260
2261
13
            return 0;
2262
23
        #endif
2263
23
    }
2264
2265
627
#ifndef NO_WOLFSSL_SERVER
2266
627
    if (!extension || !extension->data) {
2267
        /* This will keep SNI even though TLSX_UseSNI has not been called.
2268
         * Enable it so that the received sni is available to functions
2269
         * that use a custom callback when SNI is received.
2270
         */
2271
    #ifdef WOLFSSL_ALWAYS_KEEP_SNI
2272
        cacheOnly = 1;
2273
    #endif
2274
627
        if (ssl->ctx->sniRecvCb) {
2275
0
            cacheOnly = 1;
2276
0
        }
2277
2278
627
        if (cacheOnly) {
2279
0
            WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
2280
0
        }
2281
627
        else {
2282
            /* Skipping, SNI not enabled at server side. */
2283
627
            return 0;
2284
627
        }
2285
627
    }
2286
2287
0
    if (OPAQUE16_LEN > length)
2288
0
        return BUFFER_ERROR;
2289
2290
0
    ato16(input, &size);
2291
0
    offset += OPAQUE16_LEN;
2292
2293
    /* validating sni list length */
2294
0
    if (length != OPAQUE16_LEN + size || size == 0)
2295
0
        return BUFFER_ERROR;
2296
2297
    /* SNI was badly specified and only one type is now recognized and allowed.
2298
     * Only one SNI value per type (RFC6066), so, no loop. */
2299
0
    type = input[offset++];
2300
0
    if (type != WOLFSSL_SNI_HOST_NAME)
2301
0
        return BUFFER_ERROR;
2302
2303
0
    if (offset + OPAQUE16_LEN > length)
2304
0
        return BUFFER_ERROR;
2305
0
    ato16(input + offset, &size);
2306
0
    offset += OPAQUE16_LEN;
2307
2308
0
    if (offset + size != length || size == 0)
2309
0
        return BUFFER_ERROR;
2310
2311
0
    if (!cacheOnly && !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
2312
0
        return 0; /* not using this type of SNI. */
2313
2314
0
#ifdef WOLFSSL_TLS13
2315
    /* Don't process the second ClientHello SNI extension if there
2316
     * was problems with the first.
2317
     */
2318
0
    if (!cacheOnly && sni->status != 0)
2319
0
        return 0;
2320
0
#endif
2321
0
    matched = cacheOnly || (XSTRLEN(sni->data.host_name) == size &&
2322
0
         XSTRNCMP(sni->data.host_name, (const char*)input + offset, size) == 0);
2323
2324
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2325
    echX = TLSX_Find(ssl->extensions, TLSX_ECH);
2326
    if (echX != NULL)
2327
        ech = (WOLFSSL_ECH*)(echX->data);
2328
2329
    if (!matched && ech != NULL) {
2330
        workingConfig = ech->echConfig;
2331
2332
        while (workingConfig != NULL) {
2333
            matched = XSTRLEN(workingConfig->publicName) == size &&
2334
                XSTRNCMP(workingConfig->publicName,
2335
                (const char*)input + offset, size) == 0;
2336
2337
            if (matched)
2338
                break;
2339
2340
            workingConfig = workingConfig->next;
2341
        }
2342
    }
2343
#endif
2344
2345
0
    if (matched || sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH) {
2346
0
        int matchStat;
2347
0
        int r = TLSX_UseSNI(&ssl->extensions, type, input + offset, size,
2348
0
                                                                     ssl->heap);
2349
0
        if (r != WOLFSSL_SUCCESS)
2350
0
            return r; /* throws error. */
2351
2352
0
        if (cacheOnly) {
2353
0
            WOLFSSL_MSG("Forcing storage of SNI, Fake match");
2354
0
            matchStat = WOLFSSL_SNI_FORCE_KEEP;
2355
0
        }
2356
0
        else if (matched) {
2357
0
            WOLFSSL_MSG("SNI did match!");
2358
0
            matchStat = WOLFSSL_SNI_REAL_MATCH;
2359
0
        }
2360
0
        else {
2361
0
            WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
2362
0
            matchStat = WOLFSSL_SNI_FAKE_MATCH;
2363
0
        }
2364
2365
0
        TLSX_SNI_SetStatus(ssl->extensions, type, (byte)matchStat);
2366
2367
0
        if (!cacheOnly)
2368
0
            TLSX_SetResponse(ssl, TLSX_SERVER_NAME);
2369
0
    }
2370
0
    else if (!(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
2371
0
        SendAlert(ssl, alert_fatal, unrecognized_name);
2372
0
        WOLFSSL_ERROR_VERBOSE(UNKNOWN_SNI_HOST_NAME_E);
2373
0
        return UNKNOWN_SNI_HOST_NAME_E;
2374
0
    }
2375
#else
2376
    (void)input;
2377
#endif /* !NO_WOLFSSL_SERVER */
2378
2379
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
2380
    (void)length;
2381
#endif
2382
2383
0
    return 0;
2384
0
}
2385
2386
static int TLSX_SNI_VerifyParse(WOLFSSL* ssl,  byte isRequest)
2387
13.2k
{
2388
13.2k
    (void)ssl;
2389
2390
13.2k
    if (isRequest) {
2391
8.26k
    #ifndef NO_WOLFSSL_SERVER
2392
8.26k
        TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2393
8.26k
        TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
2394
8.26k
        SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
2395
8.26k
        SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
2396
8.26k
        SNI* sni = NULL;
2397
2398
8.26k
        for (; ctx_sni; ctx_sni = ctx_sni->next) {
2399
0
            if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2400
0
                sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
2401
2402
0
                if (sni) {
2403
0
                    if (sni->status != WOLFSSL_SNI_NO_MATCH)
2404
0
                        continue;
2405
2406
                    /* if ssl level overrides ctx level, it is ok. */
2407
0
                    if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
2408
0
                        continue;
2409
0
                }
2410
2411
0
                SendAlert(ssl, alert_fatal, handshake_failure);
2412
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2413
0
                return SNI_ABSENT_ERROR;
2414
0
            }
2415
0
        }
2416
2417
8.26k
        for (; ssl_sni; ssl_sni = ssl_sni->next) {
2418
0
            if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2419
0
                if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
2420
0
                    continue;
2421
2422
0
                SendAlert(ssl, alert_fatal, handshake_failure);
2423
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2424
0
                return SNI_ABSENT_ERROR;
2425
0
            }
2426
0
        }
2427
8.26k
    #endif /* NO_WOLFSSL_SERVER */
2428
8.26k
    }
2429
2430
13.2k
    return 0;
2431
13.2k
}
2432
2433
int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
2434
                                                                     void* heap)
2435
28
{
2436
28
    TLSX* extension;
2437
28
    SNI* sni = NULL;
2438
2439
28
    if (extensions == NULL || data == NULL)
2440
0
        return BAD_FUNC_ARG;
2441
2442
28
    if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
2443
0
        return MEMORY_E;
2444
2445
28
    extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
2446
28
    if (!extension) {
2447
28
        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
2448
2449
28
        if (ret != 0) {
2450
0
            TLSX_SNI_Free(sni, heap);
2451
0
            return ret;
2452
0
        }
2453
28
    }
2454
0
    else {
2455
        /* push new SNI object to extension data. */
2456
0
        sni->next = (SNI*)extension->data;
2457
0
        extension->data = (void*)sni;
2458
2459
        /* remove duplicate SNI, there should be only one of each type. */
2460
0
        do {
2461
0
            if (sni->next && sni->next->type == type) {
2462
0
                SNI* next = sni->next;
2463
2464
0
                sni->next = next->next;
2465
0
                TLSX_SNI_Free(next, heap);
2466
2467
                /* there is no way to occur more than
2468
                 * two SNIs of the same type.
2469
                 */
2470
0
                break;
2471
0
            }
2472
0
        } while ((sni = sni->next));
2473
0
    }
2474
2475
28
    return WOLFSSL_SUCCESS;
2476
28
}
2477
2478
#ifndef NO_WOLFSSL_SERVER
2479
2480
/** Tells the SNI requested by the client. */
2481
word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data,
2482
        byte ignoreStatus)
2483
0
{
2484
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2485
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2486
2487
0
    if (sni && (ignoreStatus || sni->status != WOLFSSL_SNI_NO_MATCH)) {
2488
0
        switch (sni->type) {
2489
0
            case WOLFSSL_SNI_HOST_NAME:
2490
0
                if (data) {
2491
0
                    *data = sni->data.host_name;
2492
0
                    return (word16)XSTRLEN((char*)*data);
2493
0
                }
2494
0
        }
2495
0
    }
2496
2497
0
    return 0;
2498
0
}
2499
2500
/** Sets the options for a SNI object. */
2501
void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
2502
0
{
2503
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2504
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2505
2506
0
    if (sni)
2507
0
        sni->options = options;
2508
0
}
2509
2510
/** Retrieves a SNI request from a client hello buffer. */
2511
int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
2512
                           byte type, byte* sni, word32* inOutSz)
2513
0
{
2514
0
    word32 offset = 0;
2515
0
    word32 len32 = 0;
2516
0
    word16 len16 = 0;
2517
2518
0
    if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
2519
0
        return INCOMPLETE_DATA;
2520
2521
    /* TLS record header */
2522
0
    if ((enum ContentType) clientHello[offset++] != handshake) {
2523
2524
        /* checking for SSLv2.0 client hello according to: */
2525
        /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
2526
0
        if ((enum HandShakeType) clientHello[++offset] == client_hello) {
2527
0
            offset += ENUM_LEN + VERSION_SZ; /* skip version */
2528
2529
0
            ato16(clientHello + offset, &len16);
2530
0
            offset += OPAQUE16_LEN;
2531
2532
0
            if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
2533
0
                return BUFFER_ERROR;
2534
2535
0
            ato16(clientHello + offset, &len16);
2536
            /* Returning SNI_UNSUPPORTED do not increment offset here */
2537
2538
0
            if (len16 != 0) /* session_id_length must be 0 */
2539
0
                return BUFFER_ERROR;
2540
2541
0
            WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2542
0
            return SNI_UNSUPPORTED;
2543
0
        }
2544
2545
0
        return BUFFER_ERROR;
2546
0
    }
2547
2548
0
    if (clientHello[offset++] != SSLv3_MAJOR)
2549
0
        return BUFFER_ERROR;
2550
2551
0
    if (clientHello[offset++] < TLSv1_MINOR) {
2552
0
        WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2553
0
        return SNI_UNSUPPORTED;
2554
0
    }
2555
2556
0
    ato16(clientHello + offset, &len16);
2557
0
    offset += OPAQUE16_LEN;
2558
2559
0
    if (offset + len16 > helloSz)
2560
0
        return INCOMPLETE_DATA;
2561
2562
    /* Handshake header */
2563
0
    if ((enum HandShakeType) clientHello[offset] != client_hello)
2564
0
        return BUFFER_ERROR;
2565
2566
0
    c24to32(clientHello + offset + 1, &len32);
2567
0
    offset += HANDSHAKE_HEADER_SZ;
2568
2569
0
    if (offset + len32 > helloSz)
2570
0
        return BUFFER_ERROR;
2571
2572
    /* client hello */
2573
0
    offset += VERSION_SZ + RAN_LEN; /* version, random */
2574
2575
0
    if (helloSz < offset + clientHello[offset])
2576
0
        return BUFFER_ERROR;
2577
2578
0
    offset += ENUM_LEN + clientHello[offset]; /* skip session id */
2579
2580
    /* cypher suites */
2581
0
    if (helloSz < offset + OPAQUE16_LEN)
2582
0
        return BUFFER_ERROR;
2583
2584
0
    ato16(clientHello + offset, &len16);
2585
0
    offset += OPAQUE16_LEN;
2586
2587
0
    if (helloSz < offset + len16)
2588
0
        return BUFFER_ERROR;
2589
2590
0
    offset += len16; /* skip cypher suites */
2591
2592
    /* compression methods */
2593
0
    if (helloSz < offset + 1)
2594
0
        return BUFFER_ERROR;
2595
2596
0
    if (helloSz < offset + clientHello[offset])
2597
0
        return BUFFER_ERROR;
2598
2599
0
    offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
2600
2601
    /* extensions */
2602
0
    if (helloSz < offset + OPAQUE16_LEN)
2603
0
        return 0; /* no extensions in client hello. */
2604
2605
0
    ato16(clientHello + offset, &len16);
2606
0
    offset += OPAQUE16_LEN;
2607
2608
0
    if (helloSz < offset + len16)
2609
0
        return BUFFER_ERROR;
2610
2611
0
    while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
2612
0
        word16 extType;
2613
0
        word16 extLen;
2614
2615
0
        ato16(clientHello + offset, &extType);
2616
0
        offset += OPAQUE16_LEN;
2617
2618
0
        ato16(clientHello + offset, &extLen);
2619
0
        offset += OPAQUE16_LEN;
2620
2621
0
        if (helloSz < offset + extLen)
2622
0
            return BUFFER_ERROR;
2623
2624
0
        if (extType != TLSX_SERVER_NAME) {
2625
0
            offset += extLen; /* skip extension */
2626
0
        } else {
2627
0
            word16 listLen;
2628
2629
0
            ato16(clientHello + offset, &listLen);
2630
0
            offset += OPAQUE16_LEN;
2631
2632
0
            if (helloSz < offset + listLen)
2633
0
                return BUFFER_ERROR;
2634
2635
0
            while (listLen > ENUM_LEN + OPAQUE16_LEN) {
2636
0
                byte   sniType = clientHello[offset++];
2637
0
                word16 sniLen;
2638
2639
0
                ato16(clientHello + offset, &sniLen);
2640
0
                offset += OPAQUE16_LEN;
2641
2642
0
                if (helloSz < offset + sniLen)
2643
0
                    return BUFFER_ERROR;
2644
2645
0
                if (sniType != type) {
2646
0
                    offset  += sniLen;
2647
0
                    listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
2648
0
                    continue;
2649
0
                }
2650
2651
0
                *inOutSz = min(sniLen, *inOutSz);
2652
0
                XMEMCPY(sni, clientHello + offset, *inOutSz);
2653
2654
0
                return WOLFSSL_SUCCESS;
2655
0
            }
2656
0
        }
2657
2658
0
        len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
2659
0
    }
2660
2661
0
    return len16 ? BUFFER_ERROR : 0;
2662
0
}
2663
2664
#endif
2665
2666
0
#define SNI_FREE_ALL     TLSX_SNI_FreeAll
2667
#define SNI_GET_SIZE     TLSX_SNI_GetSize
2668
#define SNI_WRITE        TLSX_SNI_Write
2669
#define SNI_PARSE        TLSX_SNI_Parse
2670
#define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
2671
2672
#else
2673
2674
#define SNI_FREE_ALL(list, heap) WC_DO_NOTHING
2675
#define SNI_GET_SIZE(list)     0
2676
#define SNI_WRITE(a, b)        0
2677
#define SNI_PARSE(a, b, c, d)  0
2678
#define SNI_VERIFY_PARSE(a, b) 0
2679
2680
#endif /* HAVE_SNI */
2681
2682
/******************************************************************************/
2683
/* Trusted CA Key Indication                                                  */
2684
/******************************************************************************/
2685
2686
#ifdef HAVE_TRUSTED_CA
2687
2688
/** Creates a new TCA object. */
2689
static TCA* TLSX_TCA_New(byte type, const byte* id, word16 idSz, void* heap)
2690
{
2691
    TCA* tca = (TCA*)XMALLOC(sizeof(TCA), heap, DYNAMIC_TYPE_TLSX);
2692
2693
    if (tca) {
2694
        XMEMSET(tca, 0, sizeof(TCA));
2695
        tca->type = type;
2696
2697
        switch (type) {
2698
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2699
                break;
2700
2701
            #ifndef NO_SHA
2702
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2703
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2704
                if (idSz == WC_SHA_DIGEST_SIZE &&
2705
                        (tca->id =
2706
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2707
                    XMEMCPY(tca->id, id, idSz);
2708
                    tca->idSz = idSz;
2709
                }
2710
                else {
2711
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2712
                    tca = NULL;
2713
                }
2714
                break;
2715
            #endif
2716
2717
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2718
                if (idSz > 0 &&
2719
                        (tca->id =
2720
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2721
                    XMEMCPY(tca->id, id, idSz);
2722
                    tca->idSz = idSz;
2723
                }
2724
                else {
2725
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2726
                    tca = NULL;
2727
                }
2728
                break;
2729
2730
            default: /* invalid type */
2731
                XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2732
                tca = NULL;
2733
        }
2734
    }
2735
2736
    (void)heap;
2737
2738
    return tca;
2739
}
2740
2741
/** Releases a TCA object. */
2742
static void TLSX_TCA_Free(TCA* tca, void* heap)
2743
{
2744
    (void)heap;
2745
2746
    if (tca) {
2747
        XFREE(tca->id, heap, DYNAMIC_TYPE_TLSX);
2748
        XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2749
    }
2750
}
2751
2752
/** Releases all TCA objects in the provided list. */
2753
static void TLSX_TCA_FreeAll(TCA* list, void* heap)
2754
{
2755
    TCA* tca;
2756
2757
    while ((tca = list)) {
2758
        list = tca->next;
2759
        TLSX_TCA_Free(tca, heap);
2760
    }
2761
}
2762
2763
/** Tells the buffered size of the TCA objects in a list. */
2764
static word16 TLSX_TCA_GetSize(TCA* list)
2765
{
2766
    TCA* tca;
2767
    word16 length = OPAQUE16_LEN; /* list length */
2768
2769
    while ((tca = list)) {
2770
        list = tca->next;
2771
2772
        length += ENUM_LEN; /* tca type */
2773
2774
        switch (tca->type) {
2775
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2776
                break;
2777
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2778
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2779
                length += tca->idSz;
2780
                break;
2781
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2782
                length += OPAQUE16_LEN + tca->idSz;
2783
                break;
2784
        }
2785
    }
2786
2787
    return length;
2788
}
2789
2790
/** Writes the TCA objects of a list in a buffer. */
2791
static word16 TLSX_TCA_Write(TCA* list, byte* output)
2792
{
2793
    TCA* tca;
2794
    word16 offset = OPAQUE16_LEN; /* list length offset */
2795
2796
    while ((tca = list)) {
2797
        list = tca->next;
2798
2799
        output[offset++] = tca->type; /* tca type */
2800
2801
        switch (tca->type) {
2802
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2803
                break;
2804
            #ifndef NO_SHA
2805
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2806
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2807
                if (tca->id != NULL) {
2808
                    XMEMCPY(output + offset, tca->id, tca->idSz);
2809
                    offset += tca->idSz;
2810
                }
2811
                else {
2812
                    /* ID missing. Set to an empty string. */
2813
                    c16toa(0, output + offset);
2814
                    offset += OPAQUE16_LEN;
2815
                }
2816
                break;
2817
            #endif
2818
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2819
                if (tca->id != NULL) {
2820
                    c16toa(tca->idSz, output + offset); /* tca length */
2821
                    offset += OPAQUE16_LEN;
2822
                    XMEMCPY(output + offset, tca->id, tca->idSz);
2823
                    offset += tca->idSz;
2824
                }
2825
                else {
2826
                    /* ID missing. Set to an empty string. */
2827
                    c16toa(0, output + offset);
2828
                    offset += OPAQUE16_LEN;
2829
                }
2830
                break;
2831
            default:
2832
                /* ID unknown. Set to an empty string. */
2833
                c16toa(0, output + offset);
2834
                offset += OPAQUE16_LEN;
2835
        }
2836
    }
2837
2838
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2839
2840
    return offset;
2841
}
2842
2843
#ifndef NO_WOLFSSL_SERVER
2844
static TCA* TLSX_TCA_Find(TCA *list, byte type, const byte* id, word16 idSz)
2845
{
2846
    TCA* tca = list;
2847
2848
    while (tca && tca->type != type && type != WOLFSSL_TRUSTED_CA_PRE_AGREED &&
2849
           idSz != tca->idSz && !XMEMCMP(id, tca->id, idSz))
2850
        tca = tca->next;
2851
2852
    return tca;
2853
}
2854
#endif /* NO_WOLFSSL_SERVER */
2855
2856
/** Parses a buffer of TCA extensions. */
2857
static int TLSX_TCA_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2858
                          byte isRequest)
2859
{
2860
#ifndef NO_WOLFSSL_SERVER
2861
    word16 size = 0;
2862
    word16 offset = 0;
2863
#endif
2864
2865
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
2866
2867
    if (!extension)
2868
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_TRUSTED_CA_KEYS);
2869
2870
    if (!isRequest) {
2871
        #ifndef NO_WOLFSSL_CLIENT
2872
            if (!extension || !extension->data)
2873
                return TLSX_HandleUnsupportedExtension(ssl);
2874
2875
            if (length > 0)
2876
                return BUFFER_ERROR; /* TCA response MUST be empty. */
2877
2878
            /* Set the flag that we're good for keys */
2879
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
2880
2881
            return 0;
2882
        #endif
2883
    }
2884
2885
#ifndef NO_WOLFSSL_SERVER
2886
    if (!extension || !extension->data) {
2887
        /* Skipping, TCA not enabled at server side. */
2888
        return 0;
2889
    }
2890
2891
    if (OPAQUE16_LEN > length)
2892
        return BUFFER_ERROR;
2893
2894
    ato16(input, &size);
2895
    offset += OPAQUE16_LEN;
2896
2897
    /* validating tca list length */
2898
    if (length != OPAQUE16_LEN + size)
2899
        return BUFFER_ERROR;
2900
2901
    for (size = 0; offset < length; offset += size) {
2902
        TCA *tca = NULL;
2903
        byte type;
2904
        const byte* id = NULL;
2905
        word16 idSz = 0;
2906
2907
        if (offset + ENUM_LEN > length)
2908
            return BUFFER_ERROR;
2909
2910
        type = input[offset++];
2911
2912
        switch (type) {
2913
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2914
                break;
2915
            #ifndef NO_SHA
2916
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2917
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2918
                if (offset + WC_SHA_DIGEST_SIZE > length)
2919
                    return BUFFER_ERROR;
2920
                idSz = WC_SHA_DIGEST_SIZE;
2921
                id = input + offset;
2922
                offset += idSz;
2923
                break;
2924
            #endif
2925
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2926
                if (offset + OPAQUE16_LEN > length)
2927
                    return BUFFER_ERROR;
2928
                ato16(input + offset, &idSz);
2929
                offset += OPAQUE16_LEN;
2930
                if ((offset > length) || (idSz > length - offset))
2931
                    return BUFFER_ERROR;
2932
                id = input + offset;
2933
                offset += idSz;
2934
                break;
2935
            default:
2936
                WOLFSSL_ERROR_VERBOSE(TCA_INVALID_ID_TYPE);
2937
                return TCA_INVALID_ID_TYPE;
2938
        }
2939
2940
        /* Find the type/ID in the TCA list. */
2941
        tca = TLSX_TCA_Find((TCA*)extension->data, type, id, idSz);
2942
        if (tca != NULL) {
2943
            /* Found it. Set the response flag and break out of the loop. */
2944
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
2945
            break;
2946
        }
2947
    }
2948
#else
2949
    (void)input;
2950
#endif
2951
2952
    return 0;
2953
}
2954
2955
/* Checks to see if the server sent a response for the TCA. */
2956
static int TLSX_TCA_VerifyParse(WOLFSSL* ssl, byte isRequest)
2957
{
2958
    (void)ssl;
2959
2960
    if (!isRequest) {
2961
        /* RFC 6066 section 6 states that the server responding
2962
         * to trusted_ca_keys is optional.  Do not error out unless
2963
         * opted into with the define WOLFSSL_REQUIRE_TCA. */
2964
    #if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_REQUIRE_TCA)
2965
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
2966
2967
        if (extension && !extension->resp) {
2968
            SendAlert(ssl, alert_fatal, handshake_failure);
2969
            WOLFSSL_ERROR_VERBOSE(TCA_ABSENT_ERROR);
2970
            return TCA_ABSENT_ERROR;
2971
        }
2972
    #else
2973
        WOLFSSL_MSG("No response received for trusted_ca_keys.  Continuing.");
2974
    #endif /* !NO_WOLFSSL_CLIENT && WOLFSSL_REQUIRE_TCA */
2975
    }
2976
2977
    return 0;
2978
}
2979
2980
int TLSX_UseTrustedCA(TLSX** extensions, byte type,
2981
                    const byte* id, word16 idSz, void* heap)
2982
{
2983
    TLSX* extension;
2984
    TCA* tca = NULL;
2985
2986
    if (extensions == NULL)
2987
        return BAD_FUNC_ARG;
2988
2989
    if ((tca = TLSX_TCA_New(type, id, idSz, heap)) == NULL)
2990
        return MEMORY_E;
2991
2992
    extension = TLSX_Find(*extensions, TLSX_TRUSTED_CA_KEYS);
2993
    if (!extension) {
2994
        int ret = TLSX_Push(extensions, TLSX_TRUSTED_CA_KEYS, (void*)tca, heap);
2995
2996
        if (ret != 0) {
2997
            TLSX_TCA_Free(tca, heap);
2998
            return ret;
2999
        }
3000
    }
3001
    else {
3002
        /* push new TCA object to extension data. */
3003
        tca->next = (TCA*)extension->data;
3004
        extension->data = (void*)tca;
3005
    }
3006
3007
    return WOLFSSL_SUCCESS;
3008
}
3009
3010
#define TCA_FREE_ALL     TLSX_TCA_FreeAll
3011
#define TCA_GET_SIZE     TLSX_TCA_GetSize
3012
#define TCA_WRITE        TLSX_TCA_Write
3013
#define TCA_PARSE        TLSX_TCA_Parse
3014
#define TCA_VERIFY_PARSE TLSX_TCA_VerifyParse
3015
3016
#else /* HAVE_TRUSTED_CA */
3017
3018
0
#define TCA_FREE_ALL(list, heap) WC_DO_NOTHING
3019
#define TCA_GET_SIZE(list)     0
3020
#define TCA_WRITE(a, b)        0
3021
#define TCA_PARSE(a, b, c, d)  0
3022
#define TCA_VERIFY_PARSE(a, b) 0
3023
3024
#endif /* HAVE_TRUSTED_CA */
3025
3026
/******************************************************************************/
3027
/* Max Fragment Length Negotiation                                            */
3028
/******************************************************************************/
3029
3030
#ifdef HAVE_MAX_FRAGMENT
3031
3032
static word16 TLSX_MFL_Write(byte* data, byte* output)
3033
{
3034
    output[0] = data[0];
3035
3036
    return ENUM_LEN;
3037
}
3038
3039
static int TLSX_MFL_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3040
                          byte isRequest)
3041
{
3042
    if (length != ENUM_LEN)
3043
        return BUFFER_ERROR;
3044
3045
#ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3046
    (void) isRequest;
3047
#else
3048
    if (!isRequest)
3049
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
3050
            return TLSX_HandleUnsupportedExtension(ssl);
3051
#endif
3052
3053
    switch (*input) {
3054
        case WOLFSSL_MFL_2_8 : ssl->max_fragment =  256; break;
3055
        case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
3056
        case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
3057
        case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
3058
        case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
3059
        case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
3060
3061
        default:
3062
            SendAlert(ssl, alert_fatal, illegal_parameter);
3063
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
3064
            return UNKNOWN_MAX_FRAG_LEN_E;
3065
    }
3066
    if (ssl->session != NULL) {
3067
        ssl->session->mfl = *input;
3068
    }
3069
3070
#ifndef NO_WOLFSSL_SERVER
3071
    if (isRequest) {
3072
        int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
3073
3074
        if (ret != WOLFSSL_SUCCESS)
3075
            return ret; /* throw error */
3076
3077
        TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
3078
    }
3079
#endif
3080
3081
    return 0;
3082
}
3083
3084
int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
3085
{
3086
    byte* data = NULL;
3087
    int ret = 0;
3088
3089
    if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
3090
        return BAD_FUNC_ARG;
3091
3092
    data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
3093
    if (data == NULL)
3094
        return MEMORY_E;
3095
3096
    data[0] = mfl;
3097
3098
    ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
3099
    if (ret != 0) {
3100
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
3101
        return ret;
3102
    }
3103
3104
    return WOLFSSL_SUCCESS;
3105
}
3106
3107
3108
#define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
3109
#define MFL_GET_SIZE(data) ENUM_LEN
3110
#define MFL_WRITE          TLSX_MFL_Write
3111
#define MFL_PARSE          TLSX_MFL_Parse
3112
3113
#else
3114
3115
0
#define MFL_FREE_ALL(a, b) WC_DO_NOTHING
3116
#define MFL_GET_SIZE(a)       0
3117
#define MFL_WRITE(a, b)       0
3118
#define MFL_PARSE(a, b, c, d) 0
3119
3120
#endif /* HAVE_MAX_FRAGMENT */
3121
3122
/******************************************************************************/
3123
/* Truncated HMAC                                                             */
3124
/******************************************************************************/
3125
3126
#ifdef HAVE_TRUNCATED_HMAC
3127
3128
static int TLSX_THM_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3129
                          byte isRequest)
3130
{
3131
    if (length != 0 || input == NULL)
3132
        return BUFFER_ERROR;
3133
3134
    if (!isRequest) {
3135
    #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3136
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
3137
            return TLSX_HandleUnsupportedExtension(ssl);
3138
    #endif
3139
    }
3140
    else {
3141
        #ifndef NO_WOLFSSL_SERVER
3142
            int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
3143
3144
            if (ret != WOLFSSL_SUCCESS)
3145
                return ret; /* throw error */
3146
3147
            TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
3148
        #endif
3149
    }
3150
3151
    ssl->truncated_hmac = 1;
3152
3153
    return 0;
3154
}
3155
3156
int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
3157
{
3158
    int ret = 0;
3159
3160
    if (extensions == NULL)
3161
        return BAD_FUNC_ARG;
3162
3163
    ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
3164
    if (ret != 0)
3165
        return ret;
3166
3167
    return WOLFSSL_SUCCESS;
3168
}
3169
3170
#define THM_PARSE TLSX_THM_Parse
3171
3172
#else
3173
3174
#define THM_PARSE(a, b, c, d) 0
3175
3176
#endif /* HAVE_TRUNCATED_HMAC */
3177
3178
/******************************************************************************/
3179
/* Certificate Status Request                                                 */
3180
/******************************************************************************/
3181
3182
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3183
3184
static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
3185
{
3186
    int i;
3187
3188
    switch (csr->status_type) {
3189
        case WOLFSSL_CSR_OCSP:
3190
            for (i = 0; i <= csr->requests; i++) {
3191
                FreeOcspRequest(&csr->request.ocsp[i]);
3192
            }
3193
        break;
3194
    }
3195
#ifdef WOLFSSL_TLS13
3196
    for (i = 0; i < MAX_CERT_EXTENSIONS; i++) {
3197
        if (csr->responses[i].buffer != NULL) {
3198
            XFREE(csr->responses[i].buffer, heap,
3199
                DYNAMIC_TYPE_TMP_BUFFER);
3200
        }
3201
    }
3202
#endif
3203
    XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3204
    (void)heap;
3205
}
3206
3207
word16 TLSX_CSR_GetSize_ex(CertificateStatusRequest* csr, byte isRequest,
3208
                                                             int idx)
3209
{
3210
    word16 size = 0;
3211
3212
    /* shut up compiler warnings */
3213
    (void) csr; (void) isRequest;
3214
#ifndef NO_WOLFSSL_CLIENT
3215
    if (isRequest) {
3216
        switch (csr->status_type) {
3217
            case WOLFSSL_CSR_OCSP:
3218
                size += ENUM_LEN + 2 * OPAQUE16_LEN;
3219
3220
                if (csr->request.ocsp[0].nonceSz)
3221
                    size += OCSP_NONCE_EXT_SZ;
3222
            break;
3223
        }
3224
    }
3225
#endif
3226
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3227
    if (!isRequest && IsAtLeastTLSv1_3(csr->ssl->version)) {
3228
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3229
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3230
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3231
            return OPAQUE8_LEN + OPAQUE24_LEN + csr->ssl->ocspCsrResp[idx].length;
3232
        }
3233
        return (word16)(OPAQUE8_LEN + OPAQUE24_LEN +
3234
                csr->responses[idx].length);
3235
    }
3236
#else
3237
    (void)idx;
3238
#endif
3239
    return size;
3240
}
3241
3242
#if (defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER))
3243
int TLSX_CSR_SetResponseWithStatusCB(WOLFSSL *ssl)
3244
{
3245
    WOLFSSL_OCSP *ocsp;
3246
    int ret;
3247
3248
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3249
        return BAD_FUNC_ARG;
3250
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3251
    if (ocsp == NULL || ocsp->statusCb == NULL)
3252
        return BAD_FUNC_ARG;
3253
    ret = ocsp->statusCb(ssl, ocsp->statusCbArg);
3254
    switch (ret) {
3255
        case WOLFSSL_OCSP_STATUS_CB_OK: {
3256
            size_t i;
3257
            for (i = 0; i < XELEM_CNT(ssl->ocspCsrResp); i++) {
3258
                if (ssl->ocspCsrResp[i].length > 0) {
3259
                    /* ack the extension, status cb provided the response in
3260
                     * ssl->ocspCsrResp */
3261
                    TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3262
                    ssl->status_request = WOLFSSL_CSR_OCSP;
3263
                    break;
3264
                }
3265
            }
3266
            ret = 0;
3267
            break;
3268
        }
3269
        case WOLFSSL_OCSP_STATUS_CB_NOACK:
3270
            /* suppressing as not critical */
3271
            ret = 0;
3272
            break;
3273
        case WOLFSSL_OCSP_STATUS_CB_ALERT_FATAL:
3274
        default:
3275
            ret = WOLFSSL_FATAL_ERROR;
3276
            break;
3277
    }
3278
    return ret;
3279
}
3280
3281
static int TLSX_CSR_WriteWithStatusCB(CertificateStatusRequest* csr,
3282
    byte* output, int idx)
3283
{
3284
    WOLFSSL *ssl = csr->ssl;
3285
    WOLFSSL_OCSP *ocsp;
3286
    word16 offset = 0;
3287
    byte *response;
3288
    int respSz;
3289
3290
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3291
        return BAD_FUNC_ARG;
3292
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3293
    if (ocsp == NULL || ocsp->statusCb == NULL)
3294
        return BAD_FUNC_ARG;
3295
    response = ssl->ocspCsrResp[idx].buffer;
3296
    respSz = ssl->ocspCsrResp[idx].length;
3297
    if (response == NULL || respSz == 0)
3298
        return BAD_FUNC_ARG;
3299
    output[offset++] = WOLFSSL_CSR_OCSP;
3300
    c32to24(respSz, output + offset);
3301
    offset += OPAQUE24_LEN;
3302
    XMEMCPY(output + offset, response, respSz);
3303
    return offset + respSz;
3304
}
3305
#endif /* (TLS13 && !NO_WOLFSLL_SERVER) */
3306
3307
static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
3308
{
3309
    return TLSX_CSR_GetSize_ex(csr, isRequest, 0);
3310
}
3311
3312
int TLSX_CSR_Write_ex(CertificateStatusRequest* csr, byte* output,
3313
                          byte isRequest, int idx)
3314
{
3315
    /* shut up compiler warnings */
3316
    (void) csr; (void) output; (void) isRequest;
3317
3318
#ifndef NO_WOLFSSL_CLIENT
3319
    if (isRequest) {
3320
        int ret = 0;
3321
        word16 offset = 0;
3322
        word16 length = 0;
3323
3324
        /* type */
3325
        output[offset++] = csr->status_type;
3326
3327
        switch (csr->status_type) {
3328
            case WOLFSSL_CSR_OCSP:
3329
                /* responder id list */
3330
                c16toa(0, output + offset);
3331
                offset += OPAQUE16_LEN;
3332
3333
                /* request extensions */
3334
                if (csr->request.ocsp[0].nonceSz) {
3335
                    ret = (int)EncodeOcspRequestExtensions(&csr->request.ocsp[0],
3336
                                                 output + offset + OPAQUE16_LEN,
3337
                                                 OCSP_NONCE_EXT_SZ);
3338
3339
                    if (ret > 0) {
3340
                        length = (word16)ret;
3341
                    }
3342
                    else {
3343
                        return ret;
3344
                    }
3345
                }
3346
3347
                c16toa(length, output + offset);
3348
                offset += OPAQUE16_LEN + length;
3349
3350
            break;
3351
        }
3352
3353
        return (int)offset;
3354
    }
3355
#endif
3356
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3357
    if (!isRequest && IsAtLeastTLSv1_3(csr->ssl->version)) {
3358
        word16 offset = 0;
3359
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3360
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3361
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL) {
3362
            return TLSX_CSR_WriteWithStatusCB(csr, output, idx);
3363
        }
3364
        output[offset++] = csr->status_type;
3365
        c32to24(csr->responses[idx].length, output + offset);
3366
        offset += OPAQUE24_LEN;
3367
        XMEMCPY(output + offset, csr->responses[idx].buffer,
3368
                                        csr->responses[idx].length);
3369
        offset += (word16)csr->responses[idx].length;
3370
        return offset;
3371
    }
3372
#else
3373
    (void)idx;
3374
#endif
3375
3376
    return 0;
3377
}
3378
3379
static int TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
3380
                          byte isRequest)
3381
{
3382
    return TLSX_CSR_Write_ex(csr, output, isRequest, 0);
3383
}
3384
3385
#if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
3386
    defined(WOLFSSL_TLS_OCSP_MULTI)
3387
/* Process OCSP request certificate chain
3388
 *
3389
 * ssl       SSL/TLS object.
3390
 * returns 0 on success, otherwise failure.
3391
 */
3392
int ProcessChainOCSPRequest(WOLFSSL* ssl)
3393
{
3394
    DecodedCert* cert;
3395
    OcspRequest* request;
3396
    TLSX* extension;
3397
    CertificateStatusRequest* csr;
3398
    DerBuffer* chain;
3399
    word32 pos = 0;
3400
    buffer der;
3401
    int i = 1;
3402
    int ret = 0;
3403
    byte ctxOwnsRequest = 0;
3404
3405
    /* use certChain if available, otherwise use peer certificate */
3406
    chain = ssl->buffers.certChain;
3407
    if (chain == NULL) {
3408
        chain = ssl->buffers.certificate;
3409
    }
3410
3411
    extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3412
    csr = extension ?
3413
                (CertificateStatusRequest*)extension->data : NULL;
3414
    if (csr == NULL)
3415
        return MEMORY_ERROR;
3416
3417
    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
3418
                                         DYNAMIC_TYPE_DCERT);
3419
    if (cert == NULL) {
3420
        return MEMORY_E;
3421
    }
3422
3423
    if (chain && chain->buffer) {
3424
        while (ret == 0 && pos + OPAQUE24_LEN < chain->length) {
3425
            c24to32(chain->buffer + pos, &der.length);
3426
            pos += OPAQUE24_LEN;
3427
            der.buffer = chain->buffer + pos;
3428
            pos += der.length;
3429
3430
            if (pos > chain->length)
3431
                break;
3432
            request = &csr->request.ocsp[i];
3433
            if (ret == 0) {
3434
                ret = CreateOcspRequest(ssl, request, cert,
3435
                        der.buffer, der.length, &ctxOwnsRequest);
3436
                if (ctxOwnsRequest) {
3437
                    wolfSSL_Mutex* ocspLock =
3438
                        &SSL_CM(ssl)->ocsp_stapling->ocspLock;
3439
                    if (wc_LockMutex(ocspLock) == 0) {
3440
                        /* the request is ours */
3441
                        ssl->ctx->certOcspRequest = NULL;
3442
                    }
3443
                    wc_UnLockMutex(ocspLock);
3444
                }
3445
            }
3446
3447
            if (ret == 0) {
3448
                request->ssl = ssl;
3449
                ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
3450
                                 request, &csr->responses[i], ssl->heap);
3451
                /* Suppressing, not critical */
3452
                if (ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED) ||
3453
                    ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) ||
3454
                    ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL)) {
3455
                    ret = 0;
3456
                }
3457
                i++;
3458
                csr->requests++;
3459
            }
3460
        }
3461
    }
3462
    XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3463
3464
    return ret;
3465
}
3466
#endif
3467
3468
static int TLSX_CSR_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3469
                          byte isRequest)
3470
{
3471
    int ret;
3472
#if !defined(NO_WOLFSSL_SERVER)
3473
    byte status_type;
3474
    word16 size = 0;
3475
#endif
3476
3477
#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) \
3478
    && defined(WOLFSSL_TLS13)
3479
    OcspRequest* request;
3480
    TLSX* extension;
3481
    CertificateStatusRequest* csr;
3482
#endif
3483
3484
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
3485
 || !defined(NO_WOLFSSL_SERVER)
3486
    word32 offset = 0;
3487
#endif
3488
3489
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
3490
    word32 resp_length = 0;
3491
#endif
3492
3493
    /* shut up compiler warnings */
3494
    (void) ssl; (void) input;
3495
3496
    if (!isRequest) {
3497
#ifndef NO_WOLFSSL_CLIENT
3498
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3499
        csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3500
3501
        if (!csr) {
3502
            /* look at context level */
3503
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
3504
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3505
3506
            if (!csr) /* unexpected extension */
3507
                return TLSX_HandleUnsupportedExtension(ssl);
3508
3509
            /* enable extension at ssl level */
3510
            ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
3511
                                     csr->status_type, csr->options, ssl,
3512
                                     ssl->heap, ssl->devId);
3513
            if (ret != WOLFSSL_SUCCESS)
3514
                return ret == 0 ? -1 : ret;
3515
3516
            switch (csr->status_type) {
3517
                case WOLFSSL_CSR_OCSP:
3518
                    /* propagate nonce */
3519
                    if (csr->request.ocsp[0].nonceSz) {
3520
                        request =
3521
                            (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
3522
3523
                        if (request) {
3524
                            XMEMCPY(request->nonce, csr->request.ocsp[0].nonce,
3525
                                        (size_t)csr->request.ocsp[0].nonceSz);
3526
                            request->nonceSz = csr->request.ocsp[0].nonceSz;
3527
                        }
3528
                    }
3529
                break;
3530
            }
3531
        }
3532
3533
        ssl->status_request = 1;
3534
3535
    #ifdef WOLFSSL_TLS13
3536
        if (ssl->options.tls1_3) {
3537
            /* Get the new extension potentially created above. */
3538
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3539
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3540
            if (csr == NULL)
3541
                return MEMORY_ERROR;
3542
3543
            ret = 0;
3544
            if (OPAQUE8_LEN + OPAQUE24_LEN > length)
3545
                ret = BUFFER_ERROR;
3546
            if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP) {
3547
                ret = BAD_CERTIFICATE_STATUS_ERROR;
3548
                WOLFSSL_ERROR_VERBOSE(ret);
3549
            }
3550
            if (ret == 0) {
3551
                c24to32(input + offset, &resp_length);
3552
                offset += OPAQUE24_LEN;
3553
                if (offset + resp_length != length)
3554
                    ret = BUFFER_ERROR;
3555
            }
3556
            if (ret == 0) {
3557
                if (ssl->response_idx < (1 + MAX_CHAIN_DEPTH))
3558
                    csr->responses[ssl->response_idx].buffer =
3559
                    (byte*)XMALLOC(resp_length, ssl->heap,
3560
                        DYNAMIC_TYPE_TMP_BUFFER);
3561
                else
3562
                    ret = BAD_FUNC_ARG;
3563
3564
                if (ret == 0 &&
3565
                        csr->responses[ssl->response_idx].buffer == NULL)
3566
                    ret = MEMORY_ERROR;
3567
            }
3568
            if (ret == 0) {
3569
                XMEMCPY(csr->responses[ssl->response_idx].buffer,
3570
                                            input + offset, resp_length);
3571
                csr->responses[ssl->response_idx].length = resp_length;
3572
            }
3573
3574
            return ret;
3575
        }
3576
        else
3577
    #endif
3578
        {
3579
            /* extension_data MUST be empty. */
3580
            return length ? BUFFER_ERROR : 0;
3581
        }
3582
#endif
3583
    }
3584
    else {
3585
#ifndef NO_WOLFSSL_SERVER
3586
        if (length == 0)
3587
            return 0;
3588
3589
        status_type = input[offset++];
3590
3591
        switch (status_type) {
3592
            case WOLFSSL_CSR_OCSP: {
3593
3594
                /* skip responder_id_list */
3595
                if ((int)(length - offset) < OPAQUE16_LEN)
3596
                    return BUFFER_ERROR;
3597
3598
                ato16(input + offset, &size);
3599
                offset += OPAQUE16_LEN + size;
3600
3601
                /* skip request_extensions */
3602
                if ((int)(length - offset) < OPAQUE16_LEN)
3603
                    return BUFFER_ERROR;
3604
3605
                ato16(input + offset, &size);
3606
                offset += OPAQUE16_LEN + size;
3607
3608
                if (offset > length)
3609
                    return BUFFER_ERROR;
3610
3611
                /* is able to send OCSP response? */
3612
                if (SSL_CM(ssl) == NULL || !SSL_CM(ssl)->ocspStaplingEnabled)
3613
                    return 0;
3614
            }
3615
            break;
3616
3617
            /* unknown status type */
3618
            default:
3619
                return 0;
3620
        }
3621
3622
        /* if using status_request and already sending it, skip this one */
3623
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3624
        if (ssl->status_request_v2)
3625
            return 0;
3626
        #endif
3627
3628
        /* accept the first good status_type and return */
3629
        ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
3630
                                                 0, ssl, ssl->heap, ssl->devId);
3631
        if (ret != WOLFSSL_SUCCESS)
3632
            return ret == 0 ? -1 : ret; /* throw error */
3633
3634
        TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3635
        ssl->status_request = status_type;
3636
#endif
3637
    }
3638
3639
    return 0;
3640
}
3641
3642
int TLSX_CSR_InitRequest_ex(TLSX* extensions, DecodedCert* cert,
3643
                                                            void* heap, int idx)
3644
{
3645
     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3646
    CertificateStatusRequest* csr = extension ?
3647
        (CertificateStatusRequest*)extension->data : NULL;
3648
    int ret = 0;
3649
3650
    if (csr) {
3651
        switch (csr->status_type) {
3652
            case WOLFSSL_CSR_OCSP: {
3653
                byte nonce[MAX_OCSP_NONCE_SZ];
3654
                int  req_cnt = idx == -1 ? csr->requests : idx;
3655
                int  nonceSz = csr->request.ocsp[0].nonceSz;
3656
                OcspRequest* request;
3657
3658
                request = &csr->request.ocsp[req_cnt];
3659
                if (request->serial != NULL) {
3660
                    /* clear request contents before reuse */
3661
                    FreeOcspRequest(request);
3662
                    if (csr->requests > 0)
3663
                        csr->requests--;
3664
                }
3665
                /* preserve nonce */
3666
                XMEMCPY(nonce, csr->request.ocsp->nonce, (size_t)nonceSz);
3667
3668
                if (req_cnt < MAX_CERT_EXTENSIONS) {
3669
                    if ((ret = InitOcspRequest(request, cert, 0, heap)) != 0)
3670
                        return ret;
3671
3672
                    /* restore nonce */
3673
                    XMEMCPY(csr->request.ocsp->nonce, nonce, (size_t)nonceSz);
3674
                    request->nonceSz = nonceSz;
3675
                    csr->requests++;
3676
                }
3677
                else {
3678
                    WOLFSSL_ERROR_VERBOSE(MAX_CERT_EXTENSIONS_ERR);
3679
                    return MAX_CERT_EXTENSIONS_ERR;
3680
                }
3681
            }
3682
            break;
3683
        }
3684
    }
3685
3686
    return ret;
3687
}
3688
3689
int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
3690
{
3691
    return TLSX_CSR_InitRequest_ex(extensions, cert, heap, -1);
3692
}
3693
3694
void* TLSX_CSR_GetRequest_ex(TLSX* extensions, int idx)
3695
{
3696
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3697
    CertificateStatusRequest* csr = extension ?
3698
                              (CertificateStatusRequest*)extension->data : NULL;
3699
3700
    if (csr && csr->ssl) {
3701
        switch (csr->status_type) {
3702
            case WOLFSSL_CSR_OCSP:
3703
                if (IsAtLeastTLSv1_3(csr->ssl->version)) {
3704
                    return idx < csr->requests ? &csr->request.ocsp[idx] : NULL;
3705
                }
3706
                else {
3707
                    return idx == 0 ? &csr->request.ocsp[0] : NULL;
3708
                }
3709
        }
3710
    }
3711
3712
    return NULL;
3713
}
3714
3715
void* TLSX_CSR_GetRequest(TLSX* extensions)
3716
{
3717
    return TLSX_CSR_GetRequest_ex(extensions, 0);
3718
}
3719
3720
int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
3721
{
3722
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3723
    CertificateStatusRequest* csr = extension ?
3724
                              (CertificateStatusRequest*)extension->data : NULL;
3725
3726
    if (csr) {
3727
        switch (csr->status_type) {
3728
            case WOLFSSL_CSR_OCSP:
3729
                if (SSL_CM(ssl)->ocspEnabled) {
3730
                    csr->request.ocsp[0].ssl = ssl;
3731
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
3732
                                              &csr->request.ocsp[0], NULL, NULL);
3733
                }
3734
                else {
3735
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
3736
                    return OCSP_LOOKUP_FAIL;
3737
                }
3738
        }
3739
    }
3740
3741
    return 0;
3742
}
3743
3744
int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
3745
                                         byte options, WOLFSSL* ssl, void* heap,
3746
                                                                      int devId)
3747
{
3748
    CertificateStatusRequest* csr = NULL;
3749
    int ret = 0;
3750
3751
    if (!extensions || status_type != WOLFSSL_CSR_OCSP)
3752
        return BAD_FUNC_ARG;
3753
3754
    csr = (CertificateStatusRequest*)
3755
             XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
3756
    if (!csr)
3757
        return MEMORY_E;
3758
3759
    ForceZero(csr, sizeof(CertificateStatusRequest));
3760
#if defined(WOLFSSL_TLS13)
3761
    XMEMSET(csr->responses, 0, sizeof(csr->responses));
3762
#endif
3763
    csr->status_type = status_type;
3764
    csr->options     = options;
3765
    csr->ssl         = ssl;
3766
3767
    switch (csr->status_type) {
3768
        case WOLFSSL_CSR_OCSP:
3769
            if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
3770
                WC_RNG rng;
3771
3772
            #ifndef HAVE_FIPS
3773
                ret = wc_InitRng_ex(&rng, heap, devId);
3774
            #else
3775
                ret = wc_InitRng(&rng);
3776
                (void)devId;
3777
            #endif
3778
                if (ret == 0) {
3779
                    if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp[0].nonce,
3780
                                                        MAX_OCSP_NONCE_SZ) == 0)
3781
                        csr->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
3782
3783
                    wc_FreeRng(&rng);
3784
                }
3785
            }
3786
        break;
3787
    }
3788
3789
    if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
3790
        XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3791
        return ret;
3792
    }
3793
3794
    return WOLFSSL_SUCCESS;
3795
}
3796
3797
#define CSR_FREE_ALL TLSX_CSR_Free
3798
#define CSR_GET_SIZE TLSX_CSR_GetSize
3799
#define CSR_WRITE    TLSX_CSR_Write
3800
#define CSR_PARSE    TLSX_CSR_Parse
3801
3802
#else
3803
3804
0
#define CSR_FREE_ALL(data, heap) WC_DO_NOTHING
3805
#define CSR_GET_SIZE(a, b)    0
3806
#define CSR_WRITE(a, b, c)    0
3807
#define CSR_PARSE(a, b, c, d) 0
3808
3809
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
3810
3811
/******************************************************************************/
3812
/* Certificate Status Request v2                                              */
3813
/******************************************************************************/
3814
3815
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3816
3817
static void TLSX_CSR2_FreePendingSigners(Signer *s, void* heap)
3818
{
3819
    Signer* next;
3820
    while(s) {
3821
        next = s->next;
3822
        FreeSigner(s, heap);
3823
        s = next;
3824
    }
3825
}
3826
static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
3827
{
3828
    CertificateStatusRequestItemV2* next;
3829
3830
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, heap);
3831
    for (; csr2; csr2 = next) {
3832
        next = csr2->next;
3833
3834
        switch (csr2->status_type) {
3835
            case WOLFSSL_CSR2_OCSP:
3836
            case WOLFSSL_CSR2_OCSP_MULTI:
3837
                while(csr2->requests--)
3838
                    FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
3839
            break;
3840
        }
3841
3842
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
3843
    }
3844
    (void)heap;
3845
}
3846
3847
static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
3848
                                                                 byte isRequest)
3849
{
3850
    word16 size = 0;
3851
3852
    /* shut up compiler warnings */
3853
    (void) csr2; (void) isRequest;
3854
3855
#ifndef NO_WOLFSSL_CLIENT
3856
    if (isRequest) {
3857
        CertificateStatusRequestItemV2* next;
3858
3859
        for (size = OPAQUE16_LEN; csr2; csr2 = next) {
3860
            next = csr2->next;
3861
3862
            switch (csr2->status_type) {
3863
                case WOLFSSL_CSR2_OCSP:
3864
                case WOLFSSL_CSR2_OCSP_MULTI:
3865
                    size += ENUM_LEN + 3 * OPAQUE16_LEN;
3866
3867
                    if (csr2->request.ocsp[0].nonceSz)
3868
                        size += OCSP_NONCE_EXT_SZ;
3869
                break;
3870
            }
3871
        }
3872
    }
3873
#endif
3874
3875
    return size;
3876
}
3877
3878
static int TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
3879
                                                   byte* output, byte isRequest)
3880
{
3881
    /* shut up compiler warnings */
3882
    (void) csr2; (void) output; (void) isRequest;
3883
3884
#ifndef NO_WOLFSSL_CLIENT
3885
    if (isRequest) {
3886
        int ret = 0;
3887
        word16 offset;
3888
        word16 length;
3889
3890
        for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
3891
            /* status_type */
3892
            output[offset++] = csr2->status_type;
3893
3894
            /* request */
3895
            switch (csr2->status_type) {
3896
                case WOLFSSL_CSR2_OCSP:
3897
                case WOLFSSL_CSR2_OCSP_MULTI:
3898
                    /* request_length */
3899
                    length = 2 * OPAQUE16_LEN;
3900
3901
                    if (csr2->request.ocsp[0].nonceSz)
3902
                        length += OCSP_NONCE_EXT_SZ;
3903
3904
                    c16toa(length, output + offset);
3905
                    offset += OPAQUE16_LEN;
3906
3907
                    /* responder id list */
3908
                    c16toa(0, output + offset);
3909
                    offset += OPAQUE16_LEN;
3910
3911
                    /* request extensions */
3912
                    length = 0;
3913
3914
                    if (csr2->request.ocsp[0].nonceSz) {
3915
                        ret = (int)EncodeOcspRequestExtensions(
3916
                                                 &csr2->request.ocsp[0],
3917
                                                 output + offset + OPAQUE16_LEN,
3918
                                                 OCSP_NONCE_EXT_SZ);
3919
3920
                        if (ret > 0) {
3921
                            length = (word16)ret;
3922
                        }
3923
                        else {
3924
                            return ret;
3925
                        }
3926
                    }
3927
3928
                    c16toa(length, output + offset);
3929
                    offset += OPAQUE16_LEN + length;
3930
                break;
3931
            }
3932
        }
3933
3934
        /* list size */
3935
        c16toa(offset - OPAQUE16_LEN, output);
3936
3937
        return (int)offset;
3938
    }
3939
#endif
3940
3941
    return 0;
3942
}
3943
3944
static int TLSX_CSR2_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3945
                           byte isRequest)
3946
{
3947
    int ret;
3948
3949
    /* shut up compiler warnings */
3950
    (void) ssl; (void) input;
3951
3952
    if (!isRequest) {
3953
#ifndef NO_WOLFSSL_CLIENT
3954
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
3955
        CertificateStatusRequestItemV2* csr2 = extension ?
3956
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3957
3958
        if (!csr2) {
3959
            /* look at context level */
3960
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
3961
            csr2 = extension ?
3962
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3963
3964
            if (!csr2) /* unexpected extension */
3965
                return TLSX_HandleUnsupportedExtension(ssl);
3966
3967
            /* enable extension at ssl level */
3968
            for (; csr2; csr2 = csr2->next) {
3969
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
3970
                                    csr2->status_type, csr2->options, ssl->heap,
3971
                                                                    ssl->devId);
3972
                if (ret != WOLFSSL_SUCCESS)
3973
                    return ret;
3974
3975
                switch (csr2->status_type) {
3976
                    case WOLFSSL_CSR2_OCSP:
3977
                        /* followed by */
3978
                    case WOLFSSL_CSR2_OCSP_MULTI:
3979
                        /* propagate nonce */
3980
                        if (csr2->request.ocsp[0].nonceSz) {
3981
                            OcspRequest* request =
3982
                             (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
3983
                                                          csr2->status_type, 0);
3984
3985
                            if (request) {
3986
                                XMEMCPY(request->nonce,
3987
                                        csr2->request.ocsp[0].nonce,
3988
                                        (size_t)csr2->request.ocsp[0].nonceSz);
3989
3990
                                request->nonceSz =
3991
                                                  csr2->request.ocsp[0].nonceSz;
3992
                            }
3993
                        }
3994
                    break;
3995
                }
3996
            }
3997
        }
3998
3999
        ssl->status_request_v2 = 1;
4000
4001
        return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
4002
#endif
4003
    }
4004
    else {
4005
#ifndef NO_WOLFSSL_SERVER
4006
        byte   status_type;
4007
        word16 request_length;
4008
        word16 offset = 0;
4009
        word16 size = 0;
4010
4011
        /* list size */
4012
        if (offset + OPAQUE16_LEN >= length) {
4013
            return BUFFER_E;
4014
        }
4015
4016
        ato16(input + offset, &request_length);
4017
        offset += OPAQUE16_LEN;
4018
4019
        if (length - OPAQUE16_LEN != request_length)
4020
            return BUFFER_ERROR;
4021
4022
        while (length > offset) {
4023
            if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
4024
                return BUFFER_ERROR;
4025
4026
            status_type = input[offset++];
4027
4028
            ato16(input + offset, &request_length);
4029
            offset += OPAQUE16_LEN;
4030
4031
            if (length - offset < request_length)
4032
                return BUFFER_ERROR;
4033
4034
            switch (status_type) {
4035
                case WOLFSSL_CSR2_OCSP:
4036
                case WOLFSSL_CSR2_OCSP_MULTI:
4037
                    /* skip responder_id_list */
4038
                    if ((int)(length - offset) < OPAQUE16_LEN)
4039
                        return BUFFER_ERROR;
4040
4041
                    ato16(input + offset, &size);
4042
                    if (length - offset < size)
4043
                        return BUFFER_ERROR;
4044
4045
                    offset += OPAQUE16_LEN + size;
4046
                    /* skip request_extensions */
4047
                    if ((int)(length - offset) < OPAQUE16_LEN)
4048
                        return BUFFER_ERROR;
4049
4050
                    ato16(input + offset, &size);
4051
                    if (length - offset < size)
4052
                        return BUFFER_ERROR;
4053
4054
                    offset += OPAQUE16_LEN + size;
4055
                    if (offset > length)
4056
                        return BUFFER_ERROR;
4057
4058
                    /* is able to send OCSP response? */
4059
                    if (SSL_CM(ssl) == NULL
4060
                    || !SSL_CM(ssl)->ocspStaplingEnabled)
4061
                        continue;
4062
                break;
4063
4064
                default:
4065
                    /* unknown status type, skipping! */
4066
                    offset += request_length;
4067
                    continue;
4068
            }
4069
4070
            /* if using status_request and already sending it, remove it
4071
             * and prefer to use the v2 version */
4072
            #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
4073
            if (ssl->status_request) {
4074
                ssl->status_request = 0;
4075
                TLSX_Remove(&ssl->extensions, TLSX_STATUS_REQUEST, ssl->heap);
4076
            }
4077
            #endif
4078
4079
            /* TLS 1.3 servers MUST NOT act upon presence or information in
4080
             * this extension (RFC 8448 Section 4.4.2.1).
4081
             */
4082
            if (!IsAtLeastTLSv1_3(ssl->version)) {
4083
                /* accept the first good status_type and return */
4084
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4085
                                         status_type, 0, ssl->heap, ssl->devId);
4086
                if (ret != WOLFSSL_SUCCESS)
4087
                    return ret; /* throw error */
4088
4089
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
4090
                ssl->status_request_v2 = status_type;
4091
            }
4092
4093
            return 0;
4094
        }
4095
#endif
4096
    }
4097
4098
    return 0;
4099
}
4100
4101
static CertificateStatusRequestItemV2* TLSX_CSR2_GetMulti(TLSX *extensions)
4102
{
4103
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4104
    CertificateStatusRequestItemV2* csr2 = extension ?
4105
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4106
4107
    for (; csr2; csr2 = csr2->next) {
4108
        if (csr2->status_type == WOLFSSL_CSR2_OCSP_MULTI)
4109
            return csr2;
4110
    }
4111
    return NULL;
4112
}
4113
4114
int TLSX_CSR2_IsMulti(TLSX *extensions)
4115
{
4116
    return TLSX_CSR2_GetMulti(extensions) != NULL;
4117
}
4118
4119
int TLSX_CSR2_AddPendingSigner(TLSX *extensions, Signer *s)
4120
{
4121
    CertificateStatusRequestItemV2* csr2;
4122
4123
    csr2 = TLSX_CSR2_GetMulti(extensions);
4124
    if (!csr2)
4125
        return WOLFSSL_FATAL_ERROR;
4126
4127
    s->next = csr2->pendingSigners;
4128
    csr2->pendingSigners = s;
4129
    return 0;
4130
}
4131
4132
Signer* TLSX_CSR2_GetPendingSigners(TLSX *extensions)
4133
{
4134
    CertificateStatusRequestItemV2* csr2;
4135
4136
    csr2 = TLSX_CSR2_GetMulti(extensions);
4137
    if (!csr2)
4138
        return NULL;
4139
4140
    return csr2->pendingSigners;
4141
}
4142
4143
int TLSX_CSR2_ClearPendingCA(WOLFSSL *ssl)
4144
{
4145
    CertificateStatusRequestItemV2* csr2;
4146
4147
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4148
    if (csr2 == NULL)
4149
        return 0;
4150
4151
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, SSL_CM(ssl)->heap);
4152
    csr2->pendingSigners = NULL;
4153
    return 0;
4154
}
4155
4156
int TLSX_CSR2_MergePendingCA(WOLFSSL* ssl)
4157
{
4158
    CertificateStatusRequestItemV2* csr2;
4159
    Signer *s, *next;
4160
    int r = 0;
4161
4162
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4163
    if (csr2 == NULL)
4164
        return 0;
4165
4166
    s = csr2->pendingSigners;
4167
    while (s != NULL) {
4168
        next = s->next;
4169
        r = AddSigner(SSL_CM(ssl), s);
4170
        if (r != 0)
4171
            FreeSigner(s, SSL_CM(ssl)->heap);
4172
        s = next;
4173
    }
4174
    csr2->pendingSigners = NULL;
4175
    return r;
4176
}
4177
4178
int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
4179
                                                                     void* heap)
4180
{
4181
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4182
    CertificateStatusRequestItemV2* csr2 = extension ?
4183
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4184
    int ret = 0;
4185
4186
    for (; csr2; csr2 = csr2->next) {
4187
        switch (csr2->status_type) {
4188
            case WOLFSSL_CSR2_OCSP:
4189
                if (!isPeer || csr2->requests != 0)
4190
                    break;
4191
4192
                FALL_THROUGH; /* followed by */
4193
4194
            case WOLFSSL_CSR2_OCSP_MULTI: {
4195
                if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
4196
                    byte nonce[MAX_OCSP_NONCE_SZ];
4197
                    int  nonceSz = csr2->request.ocsp[0].nonceSz;
4198
4199
                    /* preserve nonce, replicating nonce of ocsp[0] */
4200
                    XMEMCPY(nonce, csr2->request.ocsp[0].nonce,
4201
                    (size_t)nonceSz);
4202
4203
                    if ((ret = InitOcspRequest(
4204
                                      &csr2->request.ocsp[csr2->requests], cert,
4205
                                                                 0, heap)) != 0)
4206
                        return ret;
4207
4208
                    /* restore nonce */
4209
                    XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
4210
                                                        nonce, (size_t)nonceSz);
4211
                    csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
4212
                    csr2->requests++;
4213
                }
4214
            }
4215
            break;
4216
        }
4217
    }
4218
4219
    (void)cert;
4220
    return ret;
4221
}
4222
4223
void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
4224
{
4225
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4226
    CertificateStatusRequestItemV2* csr2 = extension ?
4227
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4228
4229
    for (; csr2; csr2 = csr2->next) {
4230
        if (csr2->status_type == status_type) {
4231
            switch (csr2->status_type) {
4232
                case WOLFSSL_CSR2_OCSP:
4233
                    /* followed by */
4234
4235
                case WOLFSSL_CSR2_OCSP_MULTI:
4236
                    /* requests are initialized in the reverse order */
4237
                    return idx < csr2->requests
4238
                         ? &csr2->request.ocsp[csr2->requests - idx - 1]
4239
                         : NULL;
4240
            }
4241
        }
4242
    }
4243
4244
    return NULL;
4245
}
4246
4247
int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
4248
{
4249
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4250
    CertificateStatusRequestItemV2* csr2 = extension ?
4251
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4252
4253
    /* forces only the first one */
4254
    if (csr2) {
4255
        switch (csr2->status_type) {
4256
            case WOLFSSL_CSR2_OCSP:
4257
                /* followed by */
4258
4259
            case WOLFSSL_CSR2_OCSP_MULTI:
4260
                if (SSL_CM(ssl)->ocspEnabled && csr2->requests >= 1) {
4261
                    csr2->request.ocsp[csr2->requests-1].ssl = ssl;
4262
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
4263
                                          &csr2->request.ocsp[csr2->requests-1], NULL, NULL);
4264
                }
4265
                else {
4266
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
4267
                    return OCSP_LOOKUP_FAIL;
4268
                }
4269
        }
4270
    }
4271
4272
    return 0;
4273
}
4274
4275
int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
4276
                                           byte options, void* heap, int devId)
4277
{
4278
    TLSX* extension = NULL;
4279
    CertificateStatusRequestItemV2* csr2 = NULL;
4280
    int ret = 0;
4281
4282
    if (!extensions)
4283
        return BAD_FUNC_ARG;
4284
4285
    if (status_type != WOLFSSL_CSR2_OCSP
4286
    &&  status_type != WOLFSSL_CSR2_OCSP_MULTI)
4287
        return BAD_FUNC_ARG;
4288
4289
    csr2 = (CertificateStatusRequestItemV2*)
4290
       XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
4291
    if (!csr2)
4292
        return MEMORY_E;
4293
4294
    ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
4295
4296
    csr2->status_type = status_type;
4297
    csr2->options     = options;
4298
    csr2->next        = NULL;
4299
4300
    switch (csr2->status_type) {
4301
        case WOLFSSL_CSR2_OCSP:
4302
        case WOLFSSL_CSR2_OCSP_MULTI:
4303
            if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
4304
                WC_RNG rng;
4305
4306
            #ifndef HAVE_FIPS
4307
                ret = wc_InitRng_ex(&rng, heap, devId);
4308
            #else
4309
                ret = wc_InitRng(&rng);
4310
                (void)devId;
4311
            #endif
4312
                if (ret == 0) {
4313
                    if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
4314
                                                        MAX_OCSP_NONCE_SZ) == 0)
4315
                        csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4316
4317
                    wc_FreeRng(&rng);
4318
                }
4319
            }
4320
        break;
4321
    }
4322
4323
    /* append new item */
4324
    if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
4325
        CertificateStatusRequestItemV2* last =
4326
                               (CertificateStatusRequestItemV2*)extension->data;
4327
4328
        if (last == NULL) {
4329
            XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4330
            return BAD_FUNC_ARG;
4331
        }
4332
4333
        for (; last->next; last = last->next);
4334
4335
        last->next = csr2;
4336
    }
4337
    else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
4338
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4339
        return ret;
4340
    }
4341
4342
    return WOLFSSL_SUCCESS;
4343
}
4344
4345
#define CSR2_FREE_ALL TLSX_CSR2_FreeAll
4346
#define CSR2_GET_SIZE TLSX_CSR2_GetSize
4347
#define CSR2_WRITE    TLSX_CSR2_Write
4348
#define CSR2_PARSE    TLSX_CSR2_Parse
4349
4350
#else
4351
4352
0
#define CSR2_FREE_ALL(data, heap) WC_DO_NOTHING
4353
#define CSR2_GET_SIZE(a, b)    0
4354
#define CSR2_WRITE(a, b, c)    0
4355
#define CSR2_PARSE(a, b, c, d) 0
4356
4357
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
4358
4359
#if defined(HAVE_SUPPORTED_CURVES) || \
4360
    (defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES))
4361
4362
/* Functions needed by TLSX_IsGroupSupported */
4363
#ifdef HAVE_LIBOQS
4364
static int mlkem_id2type(int id, int *type);
4365
static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group);
4366
#endif
4367
4368
/* Returns whether this group is supported.
4369
 *
4370
 * namedGroup  The named group to check.
4371
 * returns 1 when supported or 0 otherwise.
4372
 */
4373
static int TLSX_IsGroupSupported(int namedGroup)
4374
0
{
4375
0
    switch (namedGroup) {
4376
0
    #ifdef HAVE_FFDHE_2048
4377
0
        case WOLFSSL_FFDHE_2048:
4378
0
            break;
4379
0
    #endif
4380
    #ifdef HAVE_FFDHE_3072
4381
        case WOLFSSL_FFDHE_3072:
4382
            break;
4383
    #endif
4384
    #ifdef HAVE_FFDHE_4096
4385
        case WOLFSSL_FFDHE_4096:
4386
            break;
4387
    #endif
4388
    #ifdef HAVE_FFDHE_6144
4389
        case WOLFSSL_FFDHE_6144:
4390
            break;
4391
    #endif
4392
    #ifdef HAVE_FFDHE_8192
4393
        case WOLFSSL_FFDHE_8192:
4394
            break;
4395
    #endif
4396
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4397
0
        #ifdef HAVE_ECC_KOBLITZ
4398
0
        case WOLFSSL_ECC_SECP256K1:
4399
0
            break;
4400
0
        #endif
4401
0
        #ifndef NO_ECC_SECP
4402
0
        case WOLFSSL_ECC_SECP256R1:
4403
0
            break;
4404
0
        #endif /* !NO_ECC_SECP */
4405
0
        #ifdef HAVE_ECC_BRAINPOOL
4406
0
        case WOLFSSL_ECC_BRAINPOOLP256R1:
4407
0
            break;
4408
0
        #endif
4409
0
        #ifdef WOLFSSL_SM2
4410
0
        case WOLFSSL_ECC_SM2P256V1:
4411
0
            break;
4412
0
        #endif /* WOLFSSL_SM2 */
4413
0
    #endif
4414
0
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4415
0
        case WOLFSSL_ECC_X25519:
4416
0
            break;
4417
0
    #endif
4418
0
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4419
0
        case WOLFSSL_ECC_X448:
4420
0
            break;
4421
0
    #endif
4422
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
4423
0
        #ifndef NO_ECC_SECP
4424
0
        case WOLFSSL_ECC_SECP384R1:
4425
0
            break;
4426
0
        #endif /* !NO_ECC_SECP */
4427
0
        #ifdef HAVE_ECC_BRAINPOOL
4428
0
        case WOLFSSL_ECC_BRAINPOOLP384R1:
4429
0
            break;
4430
0
        #endif
4431
0
    #endif
4432
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
4433
0
        #ifndef NO_ECC_SECP
4434
0
        case WOLFSSL_ECC_SECP521R1:
4435
0
            break;
4436
0
        #endif /* !NO_ECC_SECP */
4437
0
    #endif
4438
0
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
4439
0
        #ifdef HAVE_ECC_KOBLITZ
4440
0
        case WOLFSSL_ECC_SECP160K1:
4441
0
            break;
4442
0
        #endif
4443
0
        #ifndef NO_ECC_SECP
4444
0
        case WOLFSSL_ECC_SECP160R1:
4445
0
            break;
4446
0
        #endif
4447
0
        #ifdef HAVE_ECC_SECPR2
4448
0
        case WOLFSSL_ECC_SECP160R2:
4449
0
            break;
4450
0
        #endif
4451
0
    #endif
4452
0
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
4453
0
        #ifdef HAVE_ECC_KOBLITZ
4454
0
        case WOLFSSL_ECC_SECP192K1:
4455
0
            break;
4456
0
        #endif
4457
0
        #ifndef NO_ECC_SECP
4458
0
        case WOLFSSL_ECC_SECP192R1:
4459
0
            break;
4460
0
        #endif
4461
0
    #endif
4462
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
4463
0
        #ifdef HAVE_ECC_KOBLITZ
4464
0
        case WOLFSSL_ECC_SECP224K1:
4465
0
            break;
4466
0
        #endif
4467
0
        #ifndef NO_ECC_SECP
4468
0
        case WOLFSSL_ECC_SECP224R1:
4469
0
            break;
4470
0
        #endif
4471
0
    #endif
4472
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
4473
0
        #ifdef HAVE_ECC_BRAINPOOL
4474
0
        case WOLFSSL_ECC_BRAINPOOLP512R1:
4475
0
            break;
4476
0
        #endif
4477
0
    #endif
4478
#ifdef WOLFSSL_HAVE_MLKEM
4479
#ifndef WOLFSSL_NO_ML_KEM
4480
    #ifdef WOLFSSL_WC_MLKEM
4481
        #ifndef WOLFSSL_NO_ML_KEM_512
4482
            case WOLFSSL_ML_KEM_512:
4483
            case WOLFSSL_SECP256R1MLKEM512:
4484
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4485
            case WOLFSSL_X25519MLKEM512:
4486
        #endif
4487
        #endif
4488
        #ifndef WOLFSSL_NO_ML_KEM_768
4489
            case WOLFSSL_ML_KEM_768:
4490
            case WOLFSSL_SECP384R1MLKEM768:
4491
            case WOLFSSL_SECP256R1MLKEM768:
4492
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4493
            case WOLFSSL_X25519MLKEM768:
4494
        #endif
4495
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4496
            case WOLFSSL_X448MLKEM768:
4497
        #endif
4498
        #endif
4499
        #ifndef WOLFSSL_NO_ML_KEM_1024
4500
            case WOLFSSL_ML_KEM_1024:
4501
            case WOLFSSL_SECP521R1MLKEM1024:
4502
            case WOLFSSL_SECP384R1MLKEM1024:
4503
                break;
4504
        #endif
4505
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
4506
            case WOLFSSL_P256_ML_KEM_512_OLD:
4507
            case WOLFSSL_P384_ML_KEM_768_OLD:
4508
            case WOLFSSL_P521_ML_KEM_1024_OLD:
4509
                break;
4510
#endif
4511
    #elif defined(HAVE_LIBOQS)
4512
        case WOLFSSL_ML_KEM_512:
4513
        case WOLFSSL_ML_KEM_768:
4514
        case WOLFSSL_ML_KEM_1024:
4515
        {
4516
            int ret;
4517
            int id;
4518
            ret = mlkem_id2type(namedGroup, &id);
4519
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4520
                return 0;
4521
            }
4522
4523
            if (! ext_mlkem_enabled(id)) {
4524
                return 0;
4525
            }
4526
            break;
4527
        }
4528
4529
        case WOLFSSL_SECP256R1MLKEM512:
4530
        case WOLFSSL_SECP384R1MLKEM768:
4531
        case WOLFSSL_SECP256R1MLKEM768:
4532
        case WOLFSSL_SECP521R1MLKEM1024:
4533
        case WOLFSSL_SECP384R1MLKEM1024:
4534
        case WOLFSSL_X25519MLKEM512:
4535
        case WOLFSSL_X448MLKEM768:
4536
        case WOLFSSL_X25519MLKEM768:
4537
        {
4538
            int ret;
4539
            int id;
4540
            findEccPqc(NULL, &namedGroup, NULL, namedGroup);
4541
            ret = mlkem_id2type(namedGroup, &id);
4542
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4543
                return 0;
4544
            }
4545
4546
            if (! ext_mlkem_enabled(id)) {
4547
                return 0;
4548
            }
4549
            break;
4550
        }
4551
    #endif
4552
#endif /* WOLFSSL_NO_ML_KEM */
4553
#ifdef WOLFSSL_MLKEM_KYBER
4554
    #ifdef WOLFSSL_WC_MLKEM
4555
        #ifdef WOLFSSL_KYBER512
4556
            case WOLFSSL_KYBER_LEVEL1:
4557
            case WOLFSSL_P256_KYBER_LEVEL1:
4558
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4559
            case WOLFSSL_X25519_KYBER_LEVEL1:
4560
        #endif
4561
        #endif
4562
        #ifdef WOLFSSL_KYBER768
4563
            case WOLFSSL_KYBER_LEVEL3:
4564
            case WOLFSSL_P384_KYBER_LEVEL3:
4565
            case WOLFSSL_P256_KYBER_LEVEL3:
4566
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4567
            case WOLFSSL_X25519_KYBER_LEVEL3:
4568
        #endif
4569
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4570
            case WOLFSSL_X448_KYBER_LEVEL3:
4571
        #endif
4572
        #endif
4573
        #ifdef WOLFSSL_KYBER1024
4574
            case WOLFSSL_KYBER_LEVEL5:
4575
            case WOLFSSL_P521_KYBER_LEVEL5:
4576
        #endif
4577
                break;
4578
    #elif defined(HAVE_LIBOQS)
4579
        case WOLFSSL_KYBER_LEVEL1:
4580
        case WOLFSSL_KYBER_LEVEL3:
4581
        case WOLFSSL_KYBER_LEVEL5:
4582
        {
4583
            int ret;
4584
            int id;
4585
            ret = mlkem_id2type(namedGroup, &id);
4586
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4587
                return 0;
4588
            }
4589
4590
            if (! ext_mlkem_enabled(id)) {
4591
                return 0;
4592
            }
4593
            break;
4594
        }
4595
        case WOLFSSL_P256_KYBER_LEVEL1:
4596
        case WOLFSSL_P384_KYBER_LEVEL3:
4597
        case WOLFSSL_P256_KYBER_LEVEL3:
4598
        case WOLFSSL_P521_KYBER_LEVEL5:
4599
        case WOLFSSL_X25519_KYBER_LEVEL1:
4600
        case WOLFSSL_X448_KYBER_LEVEL3:
4601
        case WOLFSSL_X25519_KYBER_LEVEL3:
4602
        {
4603
            int ret;
4604
            int id;
4605
            findEccPqc(NULL, &namedGroup, NULL, namedGroup);
4606
            ret = mlkem_id2type(namedGroup, &id);
4607
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4608
                return 0;
4609
            }
4610
4611
            if (! ext_mlkem_enabled(id)) {
4612
                return 0;
4613
            }
4614
            break;
4615
        }
4616
    #endif
4617
#endif
4618
#endif /* WOLFSSL_HAVE_MLKEM */
4619
0
        default:
4620
0
            return 0;
4621
0
    }
4622
4623
0
    return 1;
4624
0
}
4625
#endif
4626
4627
/******************************************************************************/
4628
/* Supported Elliptic Curves                                                  */
4629
/******************************************************************************/
4630
4631
#ifdef HAVE_SUPPORTED_CURVES
4632
4633
#if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \
4634
                       && !defined(HAVE_FFDHE) && !defined(WOLFSSL_HAVE_MLKEM)
4635
#error Elliptic Curves Extension requires Elliptic Curve Cryptography or liboqs groups. \
4636
       Use --enable-ecc and/or --enable-liboqs in the configure script or \
4637
       define HAVE_ECC. Alternatively use FFDHE for DH cipher suites.
4638
#endif
4639
4640
static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
4641
                                                                     void* heap)
4642
326k
{
4643
326k
    if (curve == NULL)
4644
0
        return BAD_FUNC_ARG;
4645
4646
326k
    (void)heap;
4647
4648
326k
    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
4649
326k
                                                             DYNAMIC_TYPE_TLSX);
4650
326k
    if (*curve == NULL)
4651
159
        return MEMORY_E;
4652
4653
326k
    (*curve)->name = name;
4654
326k
    (*curve)->next = NULL;
4655
4656
326k
    return 0;
4657
326k
}
4658
4659
static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
4660
14.1k
{
4661
14.1k
    if (point == NULL)
4662
0
        return BAD_FUNC_ARG;
4663
4664
14.1k
    (void)heap;
4665
4666
14.1k
    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
4667
14.1k
                                                             DYNAMIC_TYPE_TLSX);
4668
14.1k
    if (*point == NULL)
4669
8
        return MEMORY_E;
4670
4671
14.0k
    (*point)->format = format;
4672
14.0k
    (*point)->next = NULL;
4673
4674
14.0k
    return 0;
4675
14.1k
}
4676
4677
static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
4678
26.2k
{
4679
26.2k
    SupportedCurve* curve;
4680
4681
352k
    while ((curve = list)) {
4682
326k
        list = curve->next;
4683
326k
        XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
4684
326k
    }
4685
26.2k
    (void)heap;
4686
26.2k
}
4687
4688
static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
4689
14.0k
{
4690
14.0k
    PointFormat* point;
4691
4692
28.1k
    while ((point = list)) {
4693
14.0k
        list = point->next;
4694
14.0k
        XFREE(point, heap, DYNAMIC_TYPE_TLSX);
4695
14.0k
    }
4696
14.0k
    (void)heap;
4697
14.0k
}
4698
4699
static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
4700
                                                                     void* heap)
4701
302k
{
4702
302k
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
4703
4704
2.52M
    while (list) {
4705
2.52M
        if (list->name == name) {
4706
1.68k
            ret = 0; /* curve already in use */
4707
1.68k
            break;
4708
1.68k
        }
4709
4710
2.52M
        if (list->next == NULL) {
4711
300k
            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
4712
300k
            break;
4713
300k
        }
4714
4715
2.22M
        list = list->next;
4716
2.22M
    }
4717
4718
302k
    return ret;
4719
302k
}
4720
4721
static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
4722
0
{
4723
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
4724
4725
0
    while (list) {
4726
0
        if (list->format == format) {
4727
0
            ret = 0; /* format already in use */
4728
0
            break;
4729
0
        }
4730
4731
0
        if (list->next == NULL) {
4732
0
            ret = TLSX_PointFormat_New(&list->next, format, heap);
4733
0
            break;
4734
0
        }
4735
4736
0
        list = list->next;
4737
0
    }
4738
4739
0
    return ret;
4740
0
}
4741
4742
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
4743
4744
#if defined(HAVE_FFDHE) && (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4745
                                                         defined(HAVE_CURVE448))
4746
static void TLSX_SupportedCurve_ValidateRequest(const WOLFSSL* ssl,
4747
                                                const byte* semaphore)
4748
30.9k
{
4749
    /* If all pre-defined parameter types for key exchange are supported then
4750
     * always send SupportedGroups extension.
4751
     */
4752
30.9k
    (void)ssl;
4753
30.9k
    (void)semaphore;
4754
30.9k
}
4755
#else
4756
static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4757
{
4758
    word16 i;
4759
    const Suites* suites = WOLFSSL_SUITES(ssl);
4760
4761
    for (i = 0; i < suites->suiteSz; i += 2) {
4762
        if (suites->suites[i] == TLS13_BYTE)
4763
            return;
4764
    #ifdef BUILD_TLS_SM4_GCM_SM3
4765
        if ((suites->suites[i] == CIPHER_BYTE) &&
4766
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
4767
            return;
4768
    #endif
4769
    #ifdef BUILD_TLS_SM4_CCM_SM3
4770
        if ((suites->suites[i] == CIPHER_BYTE) &&
4771
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
4772
            return;
4773
    #endif
4774
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4775
        if ((suites->suites[i] == SM_BYTE) &&
4776
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4777
            return;
4778
    #endif
4779
        if ((suites->suites[i] == ECC_BYTE) ||
4780
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4781
            (suites->suites[i] == CHACHA_BYTE)) {
4782
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4783
                                                          defined(HAVE_CURVE448)
4784
            return;
4785
        #endif
4786
        }
4787
        #ifdef HAVE_FFDHE
4788
        else {
4789
            return;
4790
        }
4791
        #endif
4792
    }
4793
4794
    /* turns semaphore on to avoid sending this extension. */
4795
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
4796
}
4797
#endif
4798
4799
/* Only send PointFormats if TLSv13, ECC or CHACHA cipher suite present.
4800
 */
4801
static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4802
30.9k
{
4803
30.9k
#ifdef HAVE_FFDHE
4804
30.9k
    (void)ssl;
4805
30.9k
    (void)semaphore;
4806
#else
4807
    word16 i;
4808
    const Suites* suites = WOLFSSL_SUITES(ssl);
4809
4810
    if (suites == NULL)
4811
        return;
4812
4813
    for (i = 0; i < suites->suiteSz; i += 2) {
4814
        if (suites->suites[i] == TLS13_BYTE)
4815
            return;
4816
    #ifdef BUILD_TLS_SM4_GCM_SM3
4817
        if ((suites->suites[i] == CIPHER_BYTE) &&
4818
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
4819
            return;
4820
    #endif
4821
    #ifdef BUILD_TLS_SM4_CCM_SM3
4822
        if ((suites->suites[i] == CIPHER_BYTE) &&
4823
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
4824
            return;
4825
    #endif
4826
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4827
        if ((suites->suites[i] == SM_BYTE) &&
4828
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4829
            return;
4830
    #endif
4831
        if ((suites->suites[i] == ECC_BYTE) ||
4832
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4833
            (suites->suites[i] == CHACHA_BYTE)) {
4834
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4835
                                                          defined(HAVE_CURVE448)
4836
            return;
4837
        #endif
4838
        }
4839
    }
4840
   /* turns semaphore on to avoid sending this extension. */
4841
   TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4842
#endif
4843
30.9k
}
4844
4845
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
4846
4847
#ifndef NO_WOLFSSL_SERVER
4848
4849
static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
4850
{
4851
#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4852
                                                          defined(HAVE_CURVE448)
4853
    (void)semaphore;
4854
#endif
4855
4856
    if (ssl->options.cipherSuite0 == TLS13_BYTE)
4857
        return;
4858
#ifdef BUILD_TLS_SM4_GCM_SM3
4859
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
4860
        (ssl->options.cipherSuite == TLS_SM4_GCM_SM3))
4861
        return;
4862
#endif
4863
#ifdef BUILD_TLS_SM4_CCM_SM3
4864
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
4865
        (ssl->options.cipherSuite == TLS_SM4_CCM_SM3))
4866
        return;
4867
#endif
4868
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4869
    if ((ssl->options.cipherSuite0 == SM_BYTE) &&
4870
        (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4871
        return;
4872
#endif
4873
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
4874
    if (ssl->options.cipherSuite0 == ECC_BYTE ||
4875
        ssl->options.cipherSuite0 == ECDHE_PSK_BYTE ||
4876
        ssl->options.cipherSuite0 == CHACHA_BYTE) {
4877
        return;
4878
    }
4879
#endif
4880
4881
    /* turns semaphore on to avoid sending this extension. */
4882
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4883
}
4884
4885
#endif /* !NO_WOLFSSL_SERVER */
4886
4887
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
4888
4889
static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
4890
15.9k
{
4891
15.9k
    SupportedCurve* curve;
4892
15.9k
    word16 length = OPAQUE16_LEN; /* list length */
4893
4894
287k
    while ((curve = list)) {
4895
271k
        list = curve->next;
4896
271k
        length += OPAQUE16_LEN; /* curve length */
4897
271k
    }
4898
4899
15.9k
    return length;
4900
15.9k
}
4901
4902
#endif
4903
4904
static word16 TLSX_PointFormat_GetSize(PointFormat* list)
4905
13.3k
{
4906
13.3k
    PointFormat* point;
4907
13.3k
    word16 length = ENUM_LEN; /* list length */
4908
4909
26.6k
    while ((point = list)) {
4910
13.3k
        list = point->next;
4911
13.3k
        length += ENUM_LEN; /* format length */
4912
13.3k
    }
4913
4914
13.3k
    return length;
4915
13.3k
}
4916
4917
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
4918
4919
static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
4920
15.9k
{
4921
15.9k
    word16 offset = OPAQUE16_LEN;
4922
4923
287k
    while (list) {
4924
271k
        c16toa(list->name, output + offset);
4925
271k
        offset += OPAQUE16_LEN;
4926
271k
        list = list->next;
4927
271k
    }
4928
4929
15.9k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
4930
4931
15.9k
    return offset;
4932
15.9k
}
4933
4934
#endif
4935
4936
static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
4937
13.3k
{
4938
13.3k
    word16 offset = ENUM_LEN;
4939
4940
26.6k
    while (list) {
4941
13.3k
        output[offset++] = list->format;
4942
13.3k
        list = list->next;
4943
13.3k
    }
4944
4945
13.3k
    output[0] = (byte)(offset - ENUM_LEN);
4946
4947
13.3k
    return offset;
4948
13.3k
}
4949
4950
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
4951
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
4952
4953
int TLSX_SupportedCurve_Parse(const WOLFSSL* ssl, const byte* input,
4954
                              word16 length, byte isRequest, TLSX** extensions)
4955
8.82k
{
4956
8.82k
    word16 offset;
4957
8.82k
    word16 name;
4958
8.82k
    int ret = 0;
4959
8.82k
    TLSX* extension;
4960
4961
8.82k
    if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
4962
#ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
4963
        return 0;
4964
#else
4965
0
        return BUFFER_ERROR; /* servers doesn't send this extension. */
4966
0
#endif
4967
0
    }
4968
8.82k
    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
4969
214
        return BUFFER_ERROR;
4970
8.61k
    ato16(input, &offset);
4971
    /* validating curve list length */
4972
8.61k
    if (length != OPAQUE16_LEN + offset)
4973
92
        return BUFFER_ERROR;
4974
8.52k
    offset = OPAQUE16_LEN;
4975
8.52k
    if (offset == length)
4976
12
        return 0;
4977
4978
8.50k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
4979
8.50k
    if (extension == NULL) {
4980
        /* Just accept what the peer wants to use */
4981
51.3k
        for (; offset < length; offset += OPAQUE16_LEN) {
4982
42.8k
            ato16(input + offset, &name);
4983
4984
42.8k
            ret = TLSX_UseSupportedCurve(extensions, name, ssl->heap);
4985
            /* If it is BAD_FUNC_ARG then it is a group we do not support, but
4986
             * that is fine. */
4987
42.8k
            if (ret != WOLFSSL_SUCCESS &&
4988
29.7k
                    ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
4989
72
                break;
4990
42.8k
            ret = 0;
4991
42.8k
        }
4992
8.50k
    }
4993
7
    else {
4994
        /* Find the intersection with what the user has set */
4995
7
        SupportedCurve* commonCurves = NULL;
4996
23
        for (; offset < length; offset += OPAQUE16_LEN) {
4997
16
            SupportedCurve* foundCurve = (SupportedCurve*)extension->data;
4998
16
            ato16(input + offset, &name);
4999
5000
33
            while (foundCurve != NULL && foundCurve->name != name)
5001
17
                foundCurve = foundCurve->next;
5002
5003
16
            if (foundCurve != NULL) {
5004
3
                ret = commonCurves == NULL ?
5005
3
                      TLSX_SupportedCurve_New(&commonCurves, name, ssl->heap) :
5006
3
                      TLSX_SupportedCurve_Append(commonCurves, name, ssl->heap);
5007
3
                if (ret != 0)
5008
0
                    break;
5009
3
            }
5010
16
        }
5011
        /* If no common curves return error. In TLS 1.3 we can still try to save
5012
         * this by using HRR. */
5013
7
        if (ret == 0 && commonCurves == NULL &&
5014
4
                !IsAtLeastTLSv1_3(ssl->version))
5015
0
            ret = ECC_CURVE_ERROR;
5016
7
        if (ret == 0) {
5017
            /* Now swap out the curves in the extension */
5018
7
            TLSX_SupportedCurve_FreeAll((SupportedCurve*)extension->data,
5019
7
                                        ssl->heap);
5020
7
            extension->data = commonCurves;
5021
7
            commonCurves = NULL;
5022
7
        }
5023
7
        TLSX_SupportedCurve_FreeAll(commonCurves, ssl->heap);
5024
7
    }
5025
5026
8.50k
    return ret;
5027
8.52k
}
5028
#endif
5029
5030
#if !defined(NO_WOLFSSL_SERVER)
5031
5032
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5033
5034
/* Checks the priority of the groups on the server and set the supported groups
5035
 * response if there is a group not advertised by the client that is preferred.
5036
 *
5037
 * ssl  SSL/TLS object.
5038
 * returns 0 on success, otherwise an error.
5039
 */
5040
int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
5041
618
{
5042
618
    int ret;
5043
618
    TLSX* extension;
5044
618
    TLSX* priority = NULL;
5045
618
    TLSX* ext = NULL;
5046
618
    word16 name;
5047
618
    SupportedCurve* curve;
5048
5049
618
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5050
    /* May be doing PSK with no key exchange. */
5051
618
    if (extension == NULL)
5052
0
        return 0;
5053
5054
618
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5055
618
    if (ret != WOLFSSL_SUCCESS) {
5056
12
        TLSX_FreeAll(priority, ssl->heap);
5057
12
        return ret;
5058
12
    }
5059
5060
606
    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5061
606
    if (ext == NULL) {
5062
0
        WOLFSSL_MSG("Could not find supported groups extension");
5063
0
        TLSX_FreeAll(priority, ssl->heap);
5064
0
        return 0;
5065
0
    }
5066
5067
606
    curve = (SupportedCurve*)ext->data;
5068
606
    name = curve->name;
5069
5070
606
    curve = (SupportedCurve*)extension->data;
5071
1.76k
    while (curve != NULL) {
5072
1.20k
        if (curve->name == name)
5073
44
            break;
5074
1.16k
        curve = curve->next;
5075
1.16k
    }
5076
5077
606
    if (curve == NULL) {
5078
        /* Couldn't find the preferred group in client list. */
5079
562
        extension->resp = 1;
5080
5081
        /* Send server list back and free client list. */
5082
562
        curve = (SupportedCurve*)extension->data;
5083
562
        extension->data = ext->data;
5084
562
        ext->data = curve;
5085
562
    }
5086
5087
606
    TLSX_FreeAll(priority, ssl->heap);
5088
5089
606
    return 0;
5090
606
}
5091
5092
#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
5093
5094
#if defined(HAVE_FFDHE) && !defined(WOLFSSL_NO_TLS12)
5095
#ifdef HAVE_PUBLIC_FFDHE
5096
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5097
    SupportedCurve* serverGroup)
5098
1.72k
{
5099
1.72k
    int ret = 0;
5100
1.72k
    SupportedCurve* group;
5101
1.72k
    const DhParams* params = NULL;
5102
5103
29.3k
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5104
29.3k
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5105
27.5k
            continue;
5106
5107
3.58k
        for (group = clientGroup; group != NULL; group = group->next) {
5108
3.58k
            if (serverGroup->name != group->name)
5109
1.85k
                continue;
5110
5111
1.72k
            switch (serverGroup->name) {
5112
0
            #ifdef HAVE_FFDHE_2048
5113
1.72k
                case WOLFSSL_FFDHE_2048:
5114
1.72k
                    params = wc_Dh_ffdhe2048_Get();
5115
1.72k
                    break;
5116
0
            #endif
5117
            #ifdef HAVE_FFDHE_3072
5118
                case WOLFSSL_FFDHE_3072:
5119
                    params = wc_Dh_ffdhe3072_Get();
5120
                    break;
5121
            #endif
5122
            #ifdef HAVE_FFDHE_4096
5123
                case WOLFSSL_FFDHE_4096:
5124
                    params = wc_Dh_ffdhe4096_Get();
5125
                    break;
5126
            #endif
5127
            #ifdef HAVE_FFDHE_6144
5128
                case WOLFSSL_FFDHE_6144:
5129
                    params = wc_Dh_ffdhe6144_Get();
5130
                    break;
5131
            #endif
5132
            #ifdef HAVE_FFDHE_8192
5133
                case WOLFSSL_FFDHE_8192:
5134
                    params = wc_Dh_ffdhe8192_Get();
5135
                    break;
5136
            #endif
5137
0
                default:
5138
0
                    break;
5139
1.72k
            }
5140
1.72k
            if (params == NULL) {
5141
0
                ret = BAD_FUNC_ARG;
5142
0
                break;
5143
0
            }
5144
1.72k
            if (params->p_len >= ssl->options.minDhKeySz &&
5145
1.72k
                                     params->p_len <= ssl->options.maxDhKeySz) {
5146
1.72k
                break;
5147
1.72k
            }
5148
1.72k
        }
5149
5150
1.72k
        if (ret != 0)
5151
0
            break;
5152
1.72k
        if ((group != NULL) && (serverGroup->name == group->name))
5153
1.72k
            break;
5154
1.72k
    }
5155
5156
1.72k
    if ((ret == 0) && (serverGroup != NULL) && (params != NULL)) {
5157
1.72k
        ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
5158
1.72k
        ssl->buffers.serverDH_P.length = params->p_len;
5159
1.72k
        ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
5160
1.72k
        ssl->buffers.serverDH_G.length = params->g_len;
5161
5162
1.72k
        ssl->namedGroup = serverGroup->name;
5163
1.72k
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5164
1.72k
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5165
1.72k
        ssl->options.dhDoKeyTest = 0;
5166
1.72k
    #endif
5167
1.72k
        ssl->options.haveDH = 1;
5168
1.72k
    }
5169
5170
1.72k
    return ret;
5171
1.72k
}
5172
#else
5173
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5174
    SupportedCurve* serverGroup)
5175
{
5176
    int ret = 0;
5177
    SupportedCurve* group;
5178
    word32 p_len;
5179
5180
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5181
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5182
            continue;
5183
5184
        for (group = clientGroup; group != NULL; group = group->next) {
5185
            if (serverGroup->name != group->name)
5186
                continue;
5187
5188
            ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &p_len, NULL, NULL);
5189
            if (ret == 0) {
5190
                if (p_len == 0) {
5191
                    ret = BAD_FUNC_ARG;
5192
                    break;
5193
                }
5194
                if (p_len >= ssl->options.minDhKeySz &&
5195
                                                p_len <= ssl->options.maxDhKeySz) {
5196
                    break;
5197
                }
5198
            }
5199
        }
5200
5201
        if (ret != 0)
5202
            break;
5203
        if ((group != NULL) && (serverGroup->name == group->name))
5204
            break;
5205
    }
5206
5207
    if ((ret == 0) && (serverGroup != NULL)) {
5208
        word32 pSz, gSz;
5209
5210
        ssl->buffers.serverDH_P.buffer = NULL;
5211
        ssl->buffers.serverDH_G.buffer = NULL;
5212
        ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &pSz, &gSz, NULL);
5213
        if (ret == 0) {
5214
            ssl->buffers.serverDH_P.buffer =
5215
                (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5216
            if (ssl->buffers.serverDH_P.buffer == NULL)
5217
                ret = MEMORY_E;
5218
            else
5219
                ssl->buffers.serverDH_P.length = pSz;
5220
        }
5221
        if (ret == 0) {
5222
            ssl->buffers.serverDH_G.buffer =
5223
                (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5224
            if (ssl->buffers.serverDH_G.buffer == NULL) {
5225
                ret = MEMORY_E;
5226
            } else
5227
                ssl->buffers.serverDH_G.length = gSz;
5228
        }
5229
        if (ret == 0) {
5230
            ret = wc_DhCopyNamedKey(serverGroup->name,
5231
                              ssl->buffers.serverDH_P.buffer, &pSz,
5232
                              ssl->buffers.serverDH_G.buffer, &gSz,
5233
                              NULL, NULL);
5234
        }
5235
        if (ret == 0) {
5236
            ssl->buffers.weOwnDH = 1;
5237
5238
            ssl->namedGroup = serverGroup->name;
5239
        #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5240
            !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5241
            ssl->options.dhDoKeyTest = 0;
5242
        #endif
5243
            ssl->options.haveDH = 1;
5244
        }
5245
        else {
5246
            if (ssl->buffers.serverDH_P.buffer != NULL) {
5247
                XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5248
                    DYNAMIC_TYPE_PUBLIC_KEY);
5249
                ssl->buffers.serverDH_P.length = 0;
5250
                ssl->buffers.serverDH_P.buffer = NULL;
5251
            }
5252
            if (ssl->buffers.serverDH_G.buffer != NULL) {
5253
                XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5254
                    DYNAMIC_TYPE_PUBLIC_KEY);
5255
                ssl->buffers.serverDH_G.length = 0;
5256
                ssl->buffers.serverDH_G.buffer = NULL;
5257
            }
5258
        }
5259
    }
5260
5261
    return ret;
5262
}
5263
#endif
5264
5265
/* Set the highest priority common FFDHE group on the server as compared to
5266
 * client extensions.
5267
 *
5268
 * ssl    SSL/TLS object.
5269
 * returns 0 on success, otherwise an error.
5270
 */
5271
int TLSX_SupportedFFDHE_Set(WOLFSSL* ssl)
5272
5.74k
{
5273
5.74k
    int ret;
5274
5.74k
    TLSX* priority = NULL;
5275
5.74k
    TLSX* ext = NULL;
5276
5.74k
    TLSX* extension;
5277
5.74k
    SupportedCurve* clientGroup;
5278
5.74k
    SupportedCurve* group;
5279
5.74k
    int found = 0;
5280
5281
5.74k
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5282
    /* May be doing PSK with no key exchange. */
5283
5.74k
    if (extension == NULL)
5284
0
        return 0;
5285
5.74k
    clientGroup = (SupportedCurve*)extension->data;
5286
12.3k
    for (group = clientGroup; group != NULL; group = group->next) {
5287
8.42k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(group->name)) {
5288
1.82k
            found = 1;
5289
1.82k
            break;
5290
1.82k
        }
5291
8.42k
    }
5292
5.74k
    if (!found)
5293
3.91k
        return 0;
5294
5295
1.82k
    if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
5296
0
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5297
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5298
0
    }
5299
1.82k
    if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
5300
0
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5301
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5302
0
    }
5303
1.82k
    ssl->buffers.serverDH_P.buffer = NULL;
5304
1.82k
    ssl->buffers.serverDH_G.buffer = NULL;
5305
1.82k
    ssl->buffers.weOwnDH = 0;
5306
1.82k
    ssl->options.haveDH = 0;
5307
5308
1.82k
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5309
1.82k
    if (ret == WOLFSSL_SUCCESS) {
5310
1.72k
        SupportedCurve* serverGroup;
5311
5312
1.72k
        ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5313
1.72k
        if (ext == NULL) {
5314
0
            WOLFSSL_MSG("Could not find supported groups extension");
5315
0
            ret = 0;
5316
0
        }
5317
1.72k
        else {
5318
1.72k
            serverGroup = (SupportedCurve*)ext->data;
5319
1.72k
            ret = tlsx_ffdhe_find_group(ssl, clientGroup, serverGroup);
5320
1.72k
        }
5321
1.72k
    }
5322
5323
1.82k
    TLSX_FreeAll(priority, ssl->heap);
5324
5325
1.82k
    return ret;
5326
5.74k
}
5327
#endif /* HAVE_FFDHE && !WOLFSSL_NO_TLS12 */
5328
5329
#endif /* !NO_WOLFSSL_SERVER */
5330
5331
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5332
/* Return the preferred group.
5333
 *
5334
 * ssl             SSL/TLS object.
5335
 * checkSupported  Whether to check for the first supported group.
5336
 * returns BAD_FUNC_ARG if no group found, otherwise the group.
5337
 */
5338
int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
5339
0
{
5340
0
    TLSX* extension;
5341
0
    SupportedCurve* curve;
5342
5343
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5344
0
    if (extension == NULL)
5345
0
        return BAD_FUNC_ARG;
5346
5347
0
    curve = (SupportedCurve*)extension->data;
5348
0
    while (curve != NULL) {
5349
0
        if (!checkSupported || TLSX_IsGroupSupported(curve->name))
5350
0
            return curve->name;
5351
0
        curve = curve->next;
5352
0
    }
5353
5354
0
    return BAD_FUNC_ARG;
5355
0
}
5356
5357
#endif /* HAVE_SUPPORTED_CURVES */
5358
5359
#ifndef NO_WOLFSSL_SERVER
5360
5361
static int TLSX_PointFormat_Parse(WOLFSSL* ssl, const byte* input,
5362
                                  word16 length, byte isRequest)
5363
1.39k
{
5364
1.39k
    int ret;
5365
5366
    /* validating formats list length */
5367
1.39k
    if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
5368
167
        return BUFFER_ERROR;
5369
5370
1.22k
    if (isRequest) {
5371
        /* adding uncompressed point format to response */
5372
1.22k
        ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
5373
1.22k
                                                                     ssl->heap);
5374
1.22k
        if (ret != WOLFSSL_SUCCESS)
5375
5
            return ret; /* throw error */
5376
5377
1.21k
        TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
5378
1.21k
    }
5379
5380
1.21k
    return 0;
5381
1.22k
}
5382
5383
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5384
int TLSX_ValidateSupportedCurves(const WOLFSSL* ssl, byte first, byte second,
5385
                                 word32* ecdhCurveOID) {
5386
    TLSX*           extension = NULL;
5387
    SupportedCurve* curve     = NULL;
5388
    word32          oid       = 0;
5389
    word32          defOid    = 0;
5390
    word32          defSz     = 80; /* Maximum known curve size is 66. */
5391
    word32          nextOid   = 0;
5392
    word32          nextSz    = 80; /* Maximum known curve size is 66. */
5393
    word32          currOid   = ssl->ecdhCurveOID;
5394
    int             ephmSuite = 0;
5395
    word16          octets    = 0; /* according to 'ecc_set_type ecc_sets[];' */
5396
    int             key       = 0; /* validate key       */
5397
    int             foundCurve = 0; /* Found at least one supported curve */
5398
5399
    (void)oid;
5400
5401
    if (first == CHACHA_BYTE) {
5402
        switch (second) {
5403
            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5404
            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
5405
            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5406
            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5407
                return 1; /* no suite restriction */
5408
            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5409
            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5410
            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5411
                break;
5412
        }
5413
    }
5414
    if (first == ECC_BYTE || first == ECDHE_PSK_BYTE || first == CHACHA_BYTE)
5415
        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5416
    if (!extension)
5417
        return 1; /* no suite restriction */
5418
5419
    for (curve = (SupportedCurve*)extension->data;
5420
         curve && !key;
5421
         curve = curve->next) {
5422
5423
    #ifdef OPENSSL_EXTRA
5424
        /* skip if name is not in supported ECC range
5425
         * or disabled by user */
5426
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
5427
            continue;
5428
    #endif
5429
5430
        /* find supported curve */
5431
        switch (curve->name) {
5432
#ifdef HAVE_ECC
5433
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
5434
        #ifndef NO_ECC_SECP
5435
            case WOLFSSL_ECC_SECP160R1:
5436
                oid = ECC_SECP160R1_OID;
5437
                octets = 20;
5438
                break;
5439
        #endif /* !NO_ECC_SECP */
5440
        #ifdef HAVE_ECC_SECPR2
5441
            case WOLFSSL_ECC_SECP160R2:
5442
                oid = ECC_SECP160R2_OID;
5443
                octets = 20;
5444
                break;
5445
        #endif /* HAVE_ECC_SECPR2 */
5446
        #ifdef HAVE_ECC_KOBLITZ
5447
            case WOLFSSL_ECC_SECP160K1:
5448
                oid = ECC_SECP160K1_OID;
5449
                octets = 20;
5450
                break;
5451
        #endif /* HAVE_ECC_KOBLITZ */
5452
        #endif
5453
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
5454
        #ifndef NO_ECC_SECP
5455
            case WOLFSSL_ECC_SECP192R1:
5456
                oid = ECC_SECP192R1_OID;
5457
                octets = 24;
5458
                break;
5459
        #endif /* !NO_ECC_SECP */
5460
        #ifdef HAVE_ECC_KOBLITZ
5461
            case WOLFSSL_ECC_SECP192K1:
5462
                oid = ECC_SECP192K1_OID;
5463
                octets = 24;
5464
                break;
5465
        #endif /* HAVE_ECC_KOBLITZ */
5466
    #endif
5467
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
5468
        #ifndef NO_ECC_SECP
5469
            case WOLFSSL_ECC_SECP224R1:
5470
                oid = ECC_SECP224R1_OID;
5471
                octets = 28;
5472
                break;
5473
        #endif /* !NO_ECC_SECP */
5474
        #ifdef HAVE_ECC_KOBLITZ
5475
            case WOLFSSL_ECC_SECP224K1:
5476
                oid = ECC_SECP224K1_OID;
5477
                octets = 28;
5478
                break;
5479
        #endif /* HAVE_ECC_KOBLITZ */
5480
    #endif
5481
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5482
        #ifndef NO_ECC_SECP
5483
            case WOLFSSL_ECC_SECP256R1:
5484
                oid = ECC_SECP256R1_OID;
5485
                octets = 32;
5486
                break;
5487
        #endif /* !NO_ECC_SECP */
5488
    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
5489
#endif
5490
        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
5491
            case WOLFSSL_ECC_X25519:
5492
                oid = ECC_X25519_OID;
5493
                octets = 32;
5494
                break;
5495
        #endif /* HAVE_CURVE25519 */
5496
#ifdef HAVE_ECC
5497
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5498
        #ifdef HAVE_ECC_KOBLITZ
5499
            case WOLFSSL_ECC_SECP256K1:
5500
                oid = ECC_SECP256K1_OID;
5501
                octets = 32;
5502
                break;
5503
        #endif /* HAVE_ECC_KOBLITZ */
5504
        #ifdef HAVE_ECC_BRAINPOOL
5505
            case WOLFSSL_ECC_BRAINPOOLP256R1:
5506
                oid = ECC_BRAINPOOLP256R1_OID;
5507
                octets = 32;
5508
                break;
5509
        #endif /* HAVE_ECC_BRAINPOOL */
5510
        #ifdef WOLFSSL_SM2
5511
            case WOLFSSL_ECC_SM2P256V1:
5512
                oid = ECC_SM2P256V1_OID;
5513
                octets = 32;
5514
                break;
5515
        #endif /* WOLFSSL_SM2 */
5516
    #endif
5517
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
5518
        #ifndef NO_ECC_SECP
5519
            case WOLFSSL_ECC_SECP384R1:
5520
                oid = ECC_SECP384R1_OID;
5521
                octets = 48;
5522
                break;
5523
        #endif /* !NO_ECC_SECP */
5524
        #ifdef HAVE_ECC_BRAINPOOL
5525
            case WOLFSSL_ECC_BRAINPOOLP384R1:
5526
                oid = ECC_BRAINPOOLP384R1_OID;
5527
                octets = 48;
5528
                break;
5529
        #endif /* HAVE_ECC_BRAINPOOL */
5530
    #endif
5531
#endif
5532
        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
5533
            case WOLFSSL_ECC_X448:
5534
                oid = ECC_X448_OID;
5535
                octets = 57;
5536
                break;
5537
        #endif /* HAVE_CURVE448 */
5538
#ifdef HAVE_ECC
5539
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
5540
        #ifdef HAVE_ECC_BRAINPOOL
5541
            case WOLFSSL_ECC_BRAINPOOLP512R1:
5542
                oid = ECC_BRAINPOOLP512R1_OID;
5543
                octets = 64;
5544
                break;
5545
        #endif /* HAVE_ECC_BRAINPOOL */
5546
    #endif
5547
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
5548
        #ifndef NO_ECC_SECP
5549
            case WOLFSSL_ECC_SECP521R1:
5550
                oid = ECC_SECP521R1_OID;
5551
                octets = 66;
5552
                break;
5553
        #endif /* !NO_ECC_SECP */
5554
    #endif
5555
#endif
5556
            default: continue; /* unsupported curve */
5557
        }
5558
5559
        foundCurve = 1;
5560
5561
    #ifdef HAVE_ECC
5562
        /* Set default Oid */
5563
        if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
5564
            defOid = oid;
5565
            defSz = octets;
5566
        }
5567
5568
        /* The eccTempKeySz is the preferred ephemeral key size */
5569
        if (currOid == 0 && ssl->eccTempKeySz == octets)
5570
            currOid = oid;
5571
        if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
5572
            nextOid = oid;
5573
            nextSz  = octets;
5574
        }
5575
    #else
5576
        if (defOid == 0 && defSz > octets) {
5577
            defOid = oid;
5578
            defSz = octets;
5579
        }
5580
5581
        if (currOid == 0)
5582
            currOid = oid;
5583
        if (nextOid == 0 || nextSz > octets) {
5584
            nextOid = oid;
5585
            nextSz  = octets;
5586
        }
5587
    #endif
5588
5589
        if (first == ECC_BYTE) {
5590
            switch (second) {
5591
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
5592
                /* ECDHE_ECDSA */
5593
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
5594
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
5595
                case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
5596
                case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
5597
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
5598
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
5599
                case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
5600
                case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
5601
                case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
5602
                case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
5603
                    key |= ssl->ecdhCurveOID == oid;
5604
                    ephmSuite = 1;
5605
                break;
5606
5607
    #ifdef WOLFSSL_STATIC_DH
5608
                /* ECDH_ECDSA */
5609
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
5610
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
5611
                case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
5612
                case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
5613
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
5614
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
5615
                case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
5616
                case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
5617
                    if (oid == ECC_X25519_OID && defOid == oid) {
5618
                        defOid = 0;
5619
                        defSz = 80;
5620
                    }
5621
                    if (oid == ECC_X448_OID && defOid == oid) {
5622
                        defOid = 0;
5623
                        defSz = 80;
5624
                    }
5625
                    key |= ssl->pkCurveOID == oid;
5626
                break;
5627
    #endif /* WOLFSSL_STATIC_DH */
5628
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
5629
#ifndef NO_RSA
5630
                /* ECDHE_RSA */
5631
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
5632
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
5633
                case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
5634
                case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
5635
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
5636
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
5637
                case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
5638
                case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
5639
                    key |= ssl->ecdhCurveOID == oid;
5640
                    ephmSuite = 1;
5641
                break;
5642
5643
    #if defined(HAVE_ECC) && defined(WOLFSSL_STATIC_DH)
5644
                /* ECDH_RSA */
5645
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
5646
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
5647
                case TLS_ECDH_RSA_WITH_RC4_128_SHA:
5648
                case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
5649
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
5650
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
5651
                case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
5652
                case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
5653
                    if (oid == ECC_X25519_OID && defOid == oid) {
5654
                        defOid = 0;
5655
                        defSz = 80;
5656
                    }
5657
                    if (oid == ECC_X448_OID && defOid == oid) {
5658
                        defOid = 0;
5659
                        defSz = 80;
5660
                    }
5661
                    key |= ssl->pkCurveOID == oid;
5662
                break;
5663
    #endif /* HAVE_ECC && WOLFSSL_STATIC_DH */
5664
#endif
5665
                default:
5666
                    if (oid == ECC_X25519_OID && defOid == oid) {
5667
                        defOid = 0;
5668
                        defSz = 80;
5669
                    }
5670
                    if (oid == ECC_X448_OID && defOid == oid) {
5671
                        defOid = 0;
5672
                        defSz = 80;
5673
                    }
5674
                    key = 1;
5675
                break;
5676
            }
5677
        }
5678
5679
        /* ChaCha20-Poly1305 ECC cipher suites */
5680
        if (first == CHACHA_BYTE) {
5681
            switch (second) {
5682
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
5683
                /* ECDHE_ECDSA */
5684
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
5685
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
5686
                    key |= ssl->ecdhCurveOID == oid;
5687
                    ephmSuite = 1;
5688
                break;
5689
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
5690
#ifndef NO_RSA
5691
                /* ECDHE_RSA */
5692
                case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
5693
                case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
5694
                    key |= ssl->ecdhCurveOID == oid;
5695
                    ephmSuite = 1;
5696
                break;
5697
#endif
5698
                default:
5699
                    key = 1;
5700
                break;
5701
            }
5702
        }
5703
    }
5704
5705
    /* Check we found at least one supported curve */
5706
    if (!foundCurve)
5707
        return 0;
5708
5709
    *ecdhCurveOID = ssl->ecdhCurveOID;
5710
    /* Choose the default if it is at the required strength. */
5711
#ifdef HAVE_ECC
5712
    if (*ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
5713
#else
5714
    if (*ecdhCurveOID == 0)
5715
#endif
5716
    {
5717
        key = 1;
5718
        *ecdhCurveOID = defOid;
5719
    }
5720
    /* Choose any curve at the required strength. */
5721
    if (*ecdhCurveOID == 0) {
5722
        key = 1;
5723
        *ecdhCurveOID = currOid;
5724
    }
5725
    /* Choose the default if it is at the next highest strength. */
5726
    if (*ecdhCurveOID == 0 && defSz == nextSz)
5727
        *ecdhCurveOID = defOid;
5728
    /* Choose any curve at the next highest strength. */
5729
    if (*ecdhCurveOID == 0)
5730
        *ecdhCurveOID = nextOid;
5731
    /* No curve and ephemeral ECC suite requires a matching curve. */
5732
    if (*ecdhCurveOID == 0 && ephmSuite)
5733
        key = 0;
5734
5735
    return key;
5736
}
5737
#endif
5738
5739
#endif /* NO_WOLFSSL_SERVER */
5740
5741
5742
int TLSX_SupportedCurve_Copy(TLSX* src, TLSX** dst, void* heap)
5743
334
{
5744
334
    TLSX* extension;
5745
334
    int ret;
5746
5747
334
    extension = TLSX_Find(src, TLSX_SUPPORTED_GROUPS);
5748
334
    if (extension != NULL) {
5749
0
        SupportedCurve* curve;
5750
0
        for (curve = (SupportedCurve*)extension->data; curve != NULL;
5751
0
                curve = curve->next) {
5752
0
            ret = TLSX_UseSupportedCurve(dst, curve->name, heap);
5753
0
            if (ret != WOLFSSL_SUCCESS)
5754
0
                return MEMORY_E;
5755
0
        }
5756
0
    }
5757
5758
334
    return 0;
5759
334
}
5760
5761
int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
5762
358k
{
5763
358k
    TLSX* extension = NULL;
5764
358k
    SupportedCurve* curve = NULL;
5765
358k
    int ret;
5766
5767
358k
    if (extensions == NULL) {
5768
0
        return BAD_FUNC_ARG;
5769
0
    }
5770
5771
358k
    if (! TLSX_IsGroupSupported(name)) {
5772
29.6k
        return BAD_FUNC_ARG;
5773
29.6k
    }
5774
5775
328k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5776
5777
328k
    if (!extension) {
5778
26.3k
        ret = TLSX_SupportedCurve_New(&curve, name, heap);
5779
26.3k
        if (ret != 0)
5780
35
            return ret;
5781
5782
26.3k
        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
5783
26.3k
        if (ret != 0) {
5784
46
            XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
5785
46
            return ret;
5786
46
        }
5787
26.3k
    }
5788
302k
    else {
5789
302k
        ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
5790
302k
                                                                          heap);
5791
302k
        if (ret != 0)
5792
124
            return ret;
5793
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
5794
        if (name == WOLFSSL_SECP256R1MLKEM512) {
5795
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5796
                WOLFSSL_P256_ML_KEM_512_OLD, heap);
5797
        }
5798
        else if (name == WOLFSSL_SECP384R1MLKEM768) {
5799
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5800
                WOLFSSL_P384_ML_KEM_768_OLD, heap);
5801
        }
5802
        else if (name == WOLFSSL_SECP521R1MLKEM1024) {
5803
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5804
                WOLFSSL_P521_ML_KEM_1024_OLD, heap);
5805
        }
5806
        if (ret != 0) {
5807
            return ret;
5808
        }
5809
#endif
5810
302k
    }
5811
5812
328k
    return WOLFSSL_SUCCESS;
5813
328k
}
5814
5815
int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
5816
14.1k
{
5817
14.1k
    TLSX* extension = NULL;
5818
14.1k
    PointFormat* point = NULL;
5819
14.1k
    int ret = 0;
5820
5821
14.1k
    if (extensions == NULL)
5822
0
        return BAD_FUNC_ARG;
5823
5824
14.1k
    extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
5825
5826
14.1k
    if (!extension) {
5827
14.1k
        ret = TLSX_PointFormat_New(&point, format, heap);
5828
14.1k
        if (ret != 0)
5829
8
            return ret;
5830
5831
14.0k
        ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
5832
14.0k
        if (ret != 0) {
5833
2
            XFREE(point, heap, DYNAMIC_TYPE_TLSX);
5834
2
            return ret;
5835
2
        }
5836
14.0k
    }
5837
0
    else {
5838
0
        ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
5839
0
                                                                          heap);
5840
0
        if (ret != 0)
5841
0
            return ret;
5842
0
    }
5843
5844
14.0k
    return WOLFSSL_SUCCESS;
5845
14.1k
}
5846
5847
0
#define EC_FREE_ALL         TLSX_SupportedCurve_FreeAll
5848
0
#define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
5849
5850
/* In TLS 1.2 the server never sends supported curve extension, but in TLS 1.3
5851
 * the server can send supported groups extension to indicate what it will
5852
 * support for later connections. */
5853
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5854
#define EC_GET_SIZE TLSX_SupportedCurve_GetSize
5855
#define EC_WRITE    TLSX_SupportedCurve_Write
5856
#else
5857
#define EC_GET_SIZE(list)         0
5858
#define EC_WRITE(a, b)            0
5859
#endif
5860
5861
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
5862
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
5863
#define EC_PARSE TLSX_SupportedCurve_Parse
5864
#else
5865
#define EC_PARSE(a, b, c, d, e)   0
5866
#endif
5867
5868
0
#define PF_FREE_ALL          TLSX_PointFormat_FreeAll
5869
0
#define PF_VALIDATE_REQUEST  TLSX_PointFormat_ValidateRequest
5870
0
#define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
5871
5872
#define PF_GET_SIZE TLSX_PointFormat_GetSize
5873
#define PF_WRITE    TLSX_PointFormat_Write
5874
5875
#ifndef NO_WOLFSSL_SERVER
5876
#define PF_PARSE TLSX_PointFormat_Parse
5877
#else
5878
#define PF_PARSE(a, b, c, d)      0
5879
#endif
5880
5881
#else
5882
5883
#define EC_FREE_ALL(list, heap) WC_DO_NOTHING
5884
#define EC_GET_SIZE(list)         0
5885
#define EC_WRITE(a, b)            0
5886
#define EC_PARSE(a, b, c, d, e)   0
5887
#define EC_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
5888
5889
#define PF_FREE_ALL(list, heap)   WC_DO_NOTHING
5890
#define PF_GET_SIZE(list)         0
5891
#define PF_WRITE(a, b)            0
5892
#define PF_PARSE(a, b, c, d)      0
5893
#define PF_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
5894
#define PF_VALIDATE_RESPONSE(a, b) WC_DO_NOTHING
5895
5896
#endif /* HAVE_SUPPORTED_CURVES */
5897
5898
/******************************************************************************/
5899
/* Renegotiation Indication                                                   */
5900
/******************************************************************************/
5901
5902
#if defined(HAVE_SECURE_RENEGOTIATION) \
5903
 || defined(HAVE_SERVER_RENEGOTIATION_INFO)
5904
5905
static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
5906
                                                                  int isRequest)
5907
1.54k
{
5908
1.54k
    byte length = OPAQUE8_LEN; /* empty info length */
5909
5910
    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
5911
1.54k
    if (data && data->enabled && data->verifySet) {
5912
        /* client sends client_verify_data only */
5913
0
        length += TLS_FINISHED_SZ;
5914
5915
        /* server also sends server_verify_data */
5916
0
        if (!isRequest)
5917
0
            length += TLS_FINISHED_SZ;
5918
0
    }
5919
5920
1.54k
    return length;
5921
1.54k
}
5922
5923
static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
5924
                                                    byte* output, int isRequest)
5925
1.46k
{
5926
1.46k
    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
5927
1.46k
    if (data && data->enabled && data->verifySet) {
5928
        /* client sends client_verify_data only */
5929
0
        XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
5930
0
        offset += TLS_FINISHED_SZ;
5931
5932
        /* server also sends server_verify_data */
5933
0
        if (!isRequest) {
5934
0
            XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
5935
0
            offset += TLS_FINISHED_SZ;
5936
0
        }
5937
0
    }
5938
5939
1.46k
    output[0] = (byte)(offset - 1);  /* info length - self */
5940
5941
1.46k
    return offset;
5942
1.46k
}
5943
5944
static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input,
5945
                                          word16 length, byte isRequest)
5946
327
{
5947
327
    int ret = WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E);
5948
5949
327
    if (length >= OPAQUE8_LEN) {
5950
327
        if (isRequest) {
5951
324
        #ifndef NO_WOLFSSL_SERVER
5952
324
            if (ssl->secure_renegotiation == NULL) {
5953
266
                ret = wolfSSL_UseSecureRenegotiation(ssl);
5954
266
                if (ret == WOLFSSL_SUCCESS)
5955
259
                    ret = 0;
5956
266
            }
5957
324
            if (ret != 0 && ret != WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E)) {
5958
7
            }
5959
317
            else if (ssl->secure_renegotiation == NULL) {
5960
0
            }
5961
317
            else if (!ssl->secure_renegotiation->enabled) {
5962
259
                if (*input == 0) {
5963
172
                    input++; /* get past size */
5964
5965
172
                    ssl->secure_renegotiation->enabled = 1;
5966
172
                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
5967
172
                    ret = 0;
5968
172
                }
5969
87
                else {
5970
                    /* already in error state */
5971
87
                    WOLFSSL_MSG("SCR client verify data present");
5972
87
                }
5973
259
            }
5974
58
            else if (*input == TLS_FINISHED_SZ) {
5975
47
                if (length < TLS_FINISHED_SZ + 1) {
5976
4
                    WOLFSSL_MSG("SCR malformed buffer");
5977
4
                    ret = BUFFER_E;
5978
4
                }
5979
43
                else {
5980
43
                    input++; /* get past size */
5981
5982
                    /* validate client verify data */
5983
43
                    if (XMEMCMP(input,
5984
43
                            ssl->secure_renegotiation->client_verify_data,
5985
43
                            TLS_FINISHED_SZ) == 0) {
5986
5
                        WOLFSSL_MSG("SCR client verify data match");
5987
5
                        TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
5988
5
                        ret = 0;  /* verified */
5989
5
                    }
5990
38
                    else {
5991
                        /* already in error state */
5992
38
                        WOLFSSL_MSG("SCR client verify data Failure");
5993
38
                    }
5994
43
                }
5995
47
            }
5996
324
        #endif
5997
324
        }
5998
3
        else if (ssl->secure_renegotiation != NULL) {
5999
0
        #ifndef NO_WOLFSSL_CLIENT
6000
0
            if (!ssl->secure_renegotiation->enabled) {
6001
0
                if (*input == 0) {
6002
0
                    ssl->secure_renegotiation->enabled = 1;
6003
0
                    ret = 0;
6004
0
                }
6005
0
            }
6006
0
            else if (*input == 2 * TLS_FINISHED_SZ &&
6007
0
                     length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
6008
0
                input++;  /* get past size */
6009
6010
                /* validate client and server verify data */
6011
0
                if (XMEMCMP(input,
6012
0
                            ssl->secure_renegotiation->client_verify_data,
6013
0
                            TLS_FINISHED_SZ) == 0 &&
6014
0
                    XMEMCMP(input + TLS_FINISHED_SZ,
6015
0
                            ssl->secure_renegotiation->server_verify_data,
6016
0
                            TLS_FINISHED_SZ) == 0) {
6017
0
                    WOLFSSL_MSG("SCR client and server verify data match");
6018
0
                    ret = 0;  /* verified */
6019
0
                }
6020
0
                else {
6021
                    /* already in error state */
6022
0
                    WOLFSSL_MSG("SCR client and server verify data Failure");
6023
0
                }
6024
0
            }
6025
0
        #endif
6026
0
        }
6027
3
        else {
6028
3
            ret = SECURE_RENEGOTIATION_E;
6029
3
        }
6030
327
    }
6031
0
    else {
6032
0
        ret = SECURE_RENEGOTIATION_E;
6033
0
    }
6034
6035
327
    if (ret != 0) {
6036
63
        WOLFSSL_ERROR_VERBOSE(ret);
6037
63
        SendAlert(ssl, alert_fatal, handshake_failure);
6038
63
    }
6039
6040
327
    return ret;
6041
327
}
6042
6043
int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
6044
2.83k
{
6045
2.83k
    int ret = 0;
6046
2.83k
    SecureRenegotiation* data;
6047
6048
2.83k
    data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
6049
2.83k
                                                             DYNAMIC_TYPE_TLSX);
6050
2.83k
    if (data == NULL)
6051
27
        return MEMORY_E;
6052
6053
2.80k
    XMEMSET(data, 0, sizeof(SecureRenegotiation));
6054
6055
2.80k
    ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
6056
2.80k
    if (ret != 0) {
6057
17
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
6058
17
        return ret;
6059
17
    }
6060
6061
2.78k
    return WOLFSSL_SUCCESS;
6062
2.80k
}
6063
6064
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
6065
6066
int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
6067
2.56k
{
6068
2.56k
    int ret;
6069
6070
    /* send empty renegotiation_info extension */
6071
2.56k
    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6072
2.56k
    if (ext == NULL) {
6073
2.56k
        ret = TLSX_UseSecureRenegotiation(extensions, heap);
6074
2.56k
        if (ret != WOLFSSL_SUCCESS)
6075
37
            return ret;
6076
6077
2.52k
        ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6078
2.52k
    }
6079
2.52k
    if (ext)
6080
2.52k
        ext->resp = 1;
6081
6082
2.52k
    return WOLFSSL_SUCCESS;
6083
2.56k
}
6084
6085
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
6086
6087
6088
0
#define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
6089
#define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
6090
#define SCR_WRITE          TLSX_SecureRenegotiation_Write
6091
#define SCR_PARSE          TLSX_SecureRenegotiation_Parse
6092
6093
#else
6094
6095
#define SCR_FREE_ALL(a, heap) WC_DO_NOTHING
6096
#define SCR_GET_SIZE(a, b)    0
6097
#define SCR_WRITE(a, b, c)    0
6098
#define SCR_PARSE(a, b, c, d) 0
6099
6100
#endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
6101
6102
/******************************************************************************/
6103
/* Session Tickets                                                            */
6104
/******************************************************************************/
6105
6106
#ifdef HAVE_SESSION_TICKET
6107
6108
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
6109
static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl)
6110
{
6111
    TLSX*          extension = TLSX_Find(ssl->extensions, TLSX_SESSION_TICKET);
6112
    SessionTicket* ticket    = extension ?
6113
                                         (SessionTicket*)extension->data : NULL;
6114
6115
    if (ticket) {
6116
        /* TODO validate ticket timeout here! */
6117
        if (ticket->lifetime == 0xfffffff) {
6118
            /* send empty ticket on timeout */
6119
            TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6120
        }
6121
    }
6122
}
6123
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
6124
6125
6126
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
6127
{
6128
    (void)isRequest;
6129
    return ticket ? ticket->size : 0;
6130
}
6131
6132
static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
6133
                                       int isRequest)
6134
{
6135
    word16 offset = 0; /* empty ticket */
6136
6137
    if (isRequest && ticket) {
6138
        XMEMCPY(output + offset, ticket->data, ticket->size);
6139
        offset += ticket->size;
6140
    }
6141
6142
    return offset;
6143
}
6144
6145
6146
static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, const byte* input,
6147
                                    word16 length, byte isRequest)
6148
{
6149
    int ret = 0;
6150
6151
    (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
6152
6153
    if (!isRequest) {
6154
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
6155
            return TLSX_HandleUnsupportedExtension(ssl);
6156
6157
        if (length != 0)
6158
            return BUFFER_ERROR;
6159
6160
#ifndef NO_WOLFSSL_CLIENT
6161
        ssl->expect_session_ticket = 1;
6162
#endif
6163
    }
6164
#ifndef NO_WOLFSSL_SERVER
6165
    else {
6166
        /* server side */
6167
        if (ssl->ctx->ticketEncCb == NULL) {
6168
            WOLFSSL_MSG("Client sent session ticket, server has no callback");
6169
            return 0;
6170
        }
6171
6172
#ifdef HAVE_SECURE_RENEGOTIATION
6173
        if (IsSCR(ssl)) {
6174
            WOLFSSL_MSG("Client sent session ticket during SCR. Ignoring.");
6175
            return 0;
6176
        }
6177
#endif
6178
6179
        if (length > SESSION_TICKET_LEN) {
6180
            ret = BAD_TICKET_MSG_SZ;
6181
            WOLFSSL_ERROR_VERBOSE(ret);
6182
        } else if (IsAtLeastTLSv1_3(ssl->version)) {
6183
            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
6184
            ssl->options.rejectTicket = 1;
6185
            ret = 0;  /* not fatal */
6186
        } else if (ssl->options.noTicketTls12) {
6187
            /* ignore ticket request */
6188
        } else if (length == 0) {
6189
            /* blank ticket */
6190
            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6191
            if (ret == WOLFSSL_SUCCESS) {
6192
                ret = 0;
6193
                /* send blank ticket */
6194
                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6195
                ssl->options.createTicket = 1;  /* will send ticket msg */
6196
                ssl->options.useTicket    = 1;
6197
                ssl->options.resuming     = 0;  /* no standard resumption */
6198
                ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
6199
            }
6200
        } else {
6201
            /* got actual ticket from client */
6202
            ret = DoClientTicket(ssl, input, length);
6203
            if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
6204
                WOLFSSL_MSG("Using existing client ticket");
6205
                ssl->options.useTicket    = 1;
6206
                ssl->options.resuming     = 1;
6207
                /* SERVER: ticket is peer auth. */
6208
                ssl->options.peerAuthGood = 1;
6209
            } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
6210
                WOLFSSL_MSG("Using existing client ticket, creating new one");
6211
                ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6212
                if (ret == WOLFSSL_SUCCESS) {
6213
                    ret = 0;
6214
                    TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6215
                                                    /* send blank ticket */
6216
                    ssl->options.createTicket = 1;  /* will send ticket msg */
6217
                    ssl->options.useTicket    = 1;
6218
                    ssl->options.resuming     = 1;
6219
                    /* SERVER: ticket is peer auth. */
6220
                    ssl->options.peerAuthGood = 1;
6221
                }
6222
            } else if (ret == WOLFSSL_TICKET_RET_REJECT ||
6223
                    ret == WC_NO_ERR_TRACE(VERSION_ERROR)) {
6224
                WOLFSSL_MSG("Process client ticket rejected, not using");
6225
                if (ret == WC_NO_ERR_TRACE(VERSION_ERROR))
6226
                    WOLFSSL_MSG("\tbad TLS version");
6227
                ret = 0;  /* not fatal */
6228
6229
                ssl->options.rejectTicket = 1;
6230
                /* If we have session tickets enabled then send a new ticket */
6231
                if (!TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET)) {
6232
                    ret = TLSX_UseSessionTicket(&ssl->extensions, NULL,
6233
                                                ssl->heap);
6234
                    if (ret == WOLFSSL_SUCCESS) {
6235
                        ret = 0;
6236
                        TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6237
                        ssl->options.createTicket = 1;
6238
                        ssl->options.useTicket    = 1;
6239
                    }
6240
                }
6241
            } else if (ret == WOLFSSL_TICKET_RET_FATAL) {
6242
                WOLFSSL_MSG("Process client ticket fatal error, not using");
6243
            } else if (ret < 0) {
6244
                WOLFSSL_MSG("Process client ticket unknown error, not using");
6245
            }
6246
        }
6247
    }
6248
#endif /* NO_WOLFSSL_SERVER */
6249
6250
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
6251
    (void)ssl;
6252
#endif
6253
6254
    return ret;
6255
}
6256
6257
WOLFSSL_LOCAL SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
6258
                                            byte* data, word16 size, void* heap)
6259
{
6260
    SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
6261
                                                       heap, DYNAMIC_TYPE_TLSX);
6262
    if (ticket) {
6263
        ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
6264
        if (ticket->data == NULL) {
6265
            XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
6266
            return NULL;
6267
        }
6268
6269
        XMEMCPY(ticket->data, data, size);
6270
        ticket->size     = size;
6271
        ticket->lifetime = lifetime;
6272
    }
6273
6274
    (void)heap;
6275
6276
    return ticket;
6277
}
6278
WOLFSSL_LOCAL void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
6279
{
6280
    if (ticket) {
6281
        XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
6282
        XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
6283
    }
6284
6285
    (void)heap;
6286
}
6287
6288
int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
6289
{
6290
    int ret = 0;
6291
6292
    if (extensions == NULL)
6293
        return BAD_FUNC_ARG;
6294
6295
    /* If the ticket is NULL, the client will request a new ticket from the
6296
       server. Otherwise, the client will use it in the next client hello. */
6297
    if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
6298
                                                                           != 0)
6299
        return ret;
6300
6301
    return WOLFSSL_SUCCESS;
6302
}
6303
6304
#define WOLF_STK_VALIDATE_REQUEST TLSX_SessionTicket_ValidateRequest
6305
#define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
6306
#define WOLF_STK_WRITE            TLSX_SessionTicket_Write
6307
#define WOLF_STK_PARSE            TLSX_SessionTicket_Parse
6308
#define WOLF_STK_FREE(stk, heap)  TLSX_SessionTicket_Free((SessionTicket*)(stk),(heap))
6309
6310
#else
6311
6312
0
#define WOLF_STK_FREE(a, b) WC_DO_NOTHING
6313
0
#define WOLF_STK_VALIDATE_REQUEST(a) WC_DO_NOTHING
6314
#define WOLF_STK_GET_SIZE(a, b)      0
6315
#define WOLF_STK_WRITE(a, b, c)      0
6316
#define WOLF_STK_PARSE(a, b, c, d)   0
6317
6318
#endif /* HAVE_SESSION_TICKET */
6319
6320
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
6321
/******************************************************************************/
6322
/* Encrypt-then-MAC                                                           */
6323
/******************************************************************************/
6324
6325
#ifndef WOLFSSL_NO_TLS12
6326
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl);
6327
6328
/**
6329
 * Get the size of the Encrypt-Then-MAC extension.
6330
 *
6331
 * msgType  Type of message to put extension into.
6332
 * pSz      Size of extension data.
6333
 * return SANITY_MSG_E when the message is not allowed to have extension and
6334
 *        0 otherwise.
6335
 */
6336
static int TLSX_EncryptThenMac_GetSize(byte msgType, word16* pSz)
6337
16.6k
{
6338
16.6k
    (void)pSz;
6339
6340
16.6k
    if (msgType != client_hello && msgType != server_hello) {
6341
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6342
0
        return SANITY_MSG_E;
6343
0
    }
6344
6345
    /* Empty extension */
6346
6347
16.6k
    return 0;
6348
16.6k
}
6349
6350
/**
6351
 * Write the Encrypt-Then-MAC extension.
6352
 *
6353
 * data     Unused
6354
 * output   Extension data buffer. Unused.
6355
 * msgType  Type of message to put extension into.
6356
 * pSz      Size of extension data.
6357
 * return SANITY_MSG_E when the message is not allowed to have extension and
6358
 *        0 otherwise.
6359
 */
6360
static int TLSX_EncryptThenMac_Write(void* data, byte* output, byte msgType,
6361
                                     word16* pSz)
6362
16.5k
{
6363
16.5k
    (void)data;
6364
16.5k
    (void)output;
6365
16.5k
    (void)pSz;
6366
6367
16.5k
    if (msgType != client_hello && msgType != server_hello) {
6368
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6369
0
        return SANITY_MSG_E;
6370
0
    }
6371
6372
    /* Empty extension */
6373
6374
16.5k
    return 0;
6375
16.5k
}
6376
6377
/**
6378
 * Parse the Encrypt-Then-MAC extension.
6379
 *
6380
 * ssl      SSL object
6381
 * input    Extension data buffer.
6382
 * length   Length of this extension's data.
6383
 * msgType  Type of message to extension appeared in.
6384
 * return SANITY_MSG_E when the message is not allowed to have extension,
6385
 *        BUFFER_ERROR when the extension's data is invalid,
6386
 *        MEMORY_E when unable to allocate memory and
6387
 *        0 otherwise.
6388
 */
6389
static int TLSX_EncryptThenMac_Parse(WOLFSSL* ssl, const byte* input,
6390
                                     word16 length, byte msgType)
6391
1.63k
{
6392
1.63k
    int ret;
6393
6394
1.63k
    (void)input;
6395
6396
1.63k
    if (msgType != client_hello && msgType != server_hello) {
6397
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6398
0
        return SANITY_MSG_E;
6399
0
    }
6400
6401
    /* Empty extension */
6402
1.63k
    if (length != 0)
6403
10
        return BUFFER_ERROR;
6404
6405
1.62k
    if (msgType == client_hello) {
6406
        /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
6407
1.61k
        if (!ssl->options.disallowEncThenMac) {
6408
1.61k
            ssl->options.encThenMac = 1;
6409
            /* Set the extension reply. */
6410
1.61k
            ret = TLSX_EncryptThenMac_Use(ssl);
6411
1.61k
            if (ret != 0)
6412
13
                return ret;
6413
1.61k
        }
6414
1.60k
        return 0;
6415
1.61k
    }
6416
6417
    /* Server Hello */
6418
8
    if (ssl->options.disallowEncThenMac) {
6419
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6420
0
        return SANITY_MSG_E;
6421
0
    }
6422
6423
8
    ssl->options.encThenMac = 1;
6424
8
    return 0;
6425
6426
8
}
6427
6428
/**
6429
 * Add the Encrypt-Then-MAC extension to list.
6430
 *
6431
 * ssl      SSL object
6432
 * return MEMORY_E when unable to allocate memory and 0 otherwise.
6433
 */
6434
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl)
6435
17.7k
{
6436
17.7k
    int   ret = 0;
6437
17.7k
    TLSX* extension;
6438
6439
    /* Find the Encrypt-Then-Mac extension if it exists. */
6440
17.7k
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6441
17.7k
    if (extension == NULL) {
6442
        /* Push new Encrypt-Then-Mac extension. */
6443
17.7k
        ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
6444
17.7k
            ssl->heap);
6445
17.7k
        if (ret != 0)
6446
18
            return ret;
6447
17.7k
    }
6448
6449
17.7k
    return 0;
6450
17.7k
}
6451
6452
/**
6453
 * Set the Encrypt-Then-MAC extension as one to respond too.
6454
 *
6455
 * ssl      SSL object
6456
 * return EXT_MISSING when EncryptThenMac extension not in list.
6457
 */
6458
int TLSX_EncryptThenMac_Respond(WOLFSSL* ssl)
6459
1.13k
{
6460
1.13k
    TLSX* extension;
6461
6462
1.13k
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6463
1.13k
    if (extension == NULL)
6464
0
        return EXT_MISSING;
6465
1.13k
    extension->resp = 1;
6466
6467
1.13k
    return 0;
6468
1.13k
}
6469
6470
#define ETM_GET_SIZE  TLSX_EncryptThenMac_GetSize
6471
#define ETM_WRITE     TLSX_EncryptThenMac_Write
6472
#define ETM_PARSE     TLSX_EncryptThenMac_Parse
6473
6474
#else
6475
6476
#define ETM_GET_SIZE(a, b)    0
6477
#define ETM_WRITE(a, b, c, d) 0
6478
#define ETM_PARSE(a, b, c, d) 0
6479
6480
#endif /* !WOLFSSL_NO_TLS12 */
6481
6482
#endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
6483
6484
6485
#ifdef WOLFSSL_SRTP
6486
6487
/******************************************************************************/
6488
/* DTLS SRTP (Secure Real-time Transport Protocol)                            */
6489
/******************************************************************************/
6490
6491
/* Only support single SRTP profile */
6492
typedef struct TlsxSrtp {
6493
    word16 profileCount;
6494
    word16 ids; /* selected bits */
6495
} TlsxSrtp;
6496
6497
static int TLSX_UseSRTP_GetSize(TlsxSrtp *srtp)
6498
{
6499
    /*   SRTP Profile Len (2)
6500
     *      SRTP Profiles (2)
6501
     *   MKI (master key id) Length */
6502
    return (OPAQUE16_LEN + (srtp->profileCount * OPAQUE16_LEN) + 1);
6503
}
6504
6505
static TlsxSrtp* TLSX_UseSRTP_New(word16 ids, void* heap)
6506
{
6507
    TlsxSrtp* srtp;
6508
    int i;
6509
6510
    srtp = (TlsxSrtp*)XMALLOC(sizeof(TlsxSrtp), heap, DYNAMIC_TYPE_TLSX);
6511
    if (srtp == NULL) {
6512
        WOLFSSL_MSG("TLSX SRTP Memory failure");
6513
        return NULL;
6514
    }
6515
6516
    /* count and test each bit set */
6517
    srtp->profileCount = 0;
6518
    for (i=0; i<16; i++) {
6519
        if (ids & (1 << i)) {
6520
            srtp->profileCount++;
6521
        }
6522
    }
6523
    srtp->ids = ids;
6524
6525
    return srtp;
6526
}
6527
6528
static void TLSX_UseSRTP_Free(TlsxSrtp *srtp, void* heap)
6529
{
6530
    XFREE(srtp, heap, DYNAMIC_TYPE_TLSX);
6531
    (void)heap;
6532
}
6533
6534
static int TLSX_UseSRTP_Parse(WOLFSSL* ssl, const byte* input, word16 length,
6535
    byte isRequest)
6536
{
6537
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
6538
    word16 profile_len = 0;
6539
    word16 profile_value = 0;
6540
    word16 offset = 0;
6541
#ifndef NO_WOLFSSL_SERVER
6542
    int i;
6543
    TlsxSrtp* srtp = NULL;
6544
#endif
6545
6546
    if (length < OPAQUE16_LEN) {
6547
        return BUFFER_ERROR;
6548
    }
6549
6550
    /* reset selected DTLS SRTP profile ID */
6551
    ssl->dtlsSrtpId = 0;
6552
6553
    /* total length, not include itself */
6554
    ato16(input, &profile_len);
6555
    offset += OPAQUE16_LEN;
6556
6557
    if (!isRequest) {
6558
#ifndef NO_WOLFSSL_CLIENT
6559
        if (length < offset + OPAQUE16_LEN)
6560
            return BUFFER_ERROR;
6561
6562
        ato16(input + offset, &profile_value);
6563
6564
        /* check that the profile received was in the ones we support */
6565
        if (profile_value < 16 &&
6566
                               (ssl->dtlsSrtpProfiles & (1 << profile_value))) {
6567
            ssl->dtlsSrtpId = profile_value;
6568
            ret = 0; /* success */
6569
        }
6570
#endif
6571
    }
6572
#ifndef NO_WOLFSSL_SERVER
6573
    else {
6574
        /* parse remainder one profile at a time, looking for match in CTX */
6575
        ret = 0;
6576
        for (i=offset; i<length; i+=OPAQUE16_LEN) {
6577
            if (length < (i + OPAQUE16_LEN)) {
6578
                WOLFSSL_MSG("Unexpected length when parsing SRTP profile");
6579
                ret = BUFFER_ERROR;
6580
                break;
6581
            }
6582
6583
            ato16(input+i, &profile_value);
6584
            /* find first match */
6585
            if (profile_value < 16 &&
6586
                                 ssl->dtlsSrtpProfiles & (1 << profile_value)) {
6587
                ssl->dtlsSrtpId = profile_value;
6588
6589
                /* make sure we respond with selected SRTP id selected */
6590
                srtp = TLSX_UseSRTP_New((1 << profile_value), ssl->heap);
6591
                if (srtp != NULL) {
6592
                    ret = TLSX_Push(&ssl->extensions, TLSX_USE_SRTP,
6593
                        (void*)srtp, ssl->heap);
6594
                    if (ret == 0) {
6595
                        TLSX_SetResponse(ssl, TLSX_USE_SRTP);
6596
                        /* successfully set extension */
6597
                    }
6598
                }
6599
                else {
6600
                    ret = MEMORY_E;
6601
                }
6602
                break;
6603
            }
6604
        }
6605
    }
6606
6607
    if (ret == 0 && ssl->dtlsSrtpId == 0) {
6608
        WOLFSSL_MSG("TLSX_UseSRTP_Parse profile not found!");
6609
        /* not fatal */
6610
    }
6611
    else if (ret != 0) {
6612
        ssl->dtlsSrtpId = 0;
6613
        TLSX_UseSRTP_Free(srtp, ssl->heap);
6614
    }
6615
#endif
6616
    (void)profile_len;
6617
6618
    return ret;
6619
}
6620
6621
static word16 TLSX_UseSRTP_Write(TlsxSrtp* srtp, byte* output)
6622
{
6623
    word16 offset = 0;
6624
    int i, j;
6625
6626
    c16toa(srtp->profileCount * 2, output + offset);
6627
    offset += OPAQUE16_LEN;
6628
    j = 0;
6629
    for (i = 0; i < srtp->profileCount; i++) {
6630
        for (; j < 16; j++) {
6631
            if (srtp->ids & (1 << j)) {
6632
                c16toa(j, output + offset);
6633
                offset += OPAQUE16_LEN;
6634
            }
6635
        }
6636
    }
6637
    output[offset++] = 0x00; /* MKI Length */
6638
6639
    return offset;
6640
}
6641
6642
static int TLSX_UseSRTP(TLSX** extensions, word16 profiles, void* heap)
6643
{
6644
    int ret = 0;
6645
    TLSX* extension;
6646
6647
    if (extensions == NULL) {
6648
        return BAD_FUNC_ARG;
6649
    }
6650
6651
    extension = TLSX_Find(*extensions, TLSX_USE_SRTP);
6652
    if (extension == NULL) {
6653
        TlsxSrtp* srtp = TLSX_UseSRTP_New(profiles, heap);
6654
        if (srtp == NULL) {
6655
            return MEMORY_E;
6656
        }
6657
6658
        ret = TLSX_Push(extensions, TLSX_USE_SRTP, (void*)srtp, heap);
6659
        if (ret != 0) {
6660
            TLSX_UseSRTP_Free(srtp, heap);
6661
        }
6662
    }
6663
6664
    return ret;
6665
}
6666
6667
#ifndef NO_WOLFSSL_SERVER
6668
    #define SRTP_FREE     TLSX_UseSRTP_Free
6669
    #define SRTP_PARSE    TLSX_UseSRTP_Parse
6670
    #define SRTP_WRITE    TLSX_UseSRTP_Write
6671
    #define SRTP_GET_SIZE TLSX_UseSRTP_GetSize
6672
#else
6673
    #define SRTP_FREE(a, b) WC_DO_NOTHING
6674
    #define SRTP_PARSE(a, b, c, d)      0
6675
    #define SRTP_WRITE(a, b)            0
6676
    #define SRTP_GET_SIZE(a)            0
6677
#endif
6678
6679
#endif /* WOLFSSL_SRTP */
6680
6681
6682
/******************************************************************************/
6683
/* Supported Versions                                                         */
6684
/******************************************************************************/
6685
6686
#ifdef WOLFSSL_TLS13
6687
static WC_INLINE int versionIsGreater(byte isDtls, byte a, byte b)
6688
{
6689
    (void)isDtls;
6690
6691
#ifdef WOLFSSL_DTLS
6692
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6693
    if (isDtls)
6694
        return a < b;
6695
#endif /* WOLFSSL_DTLS */
6696
6697
    return a > b;
6698
}
6699
6700
static WC_INLINE int versionIsLesser(byte isDtls, byte a, byte b)
6701
{
6702
    (void)isDtls;
6703
6704
#ifdef WOLFSSL_DTLS
6705
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6706
    if (isDtls)
6707
        return a > b;
6708
#endif /* WOLFSSL_DTLS */
6709
6710
    return a < b;
6711
}
6712
6713
static WC_INLINE int versionIsAtLeast(byte isDtls, byte a, byte b)
6714
{
6715
    (void)isDtls;
6716
6717
#ifdef WOLFSSL_DTLS
6718
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6719
    if (isDtls)
6720
        return a <= b;
6721
#endif /* WOLFSSL_DTLS */
6722
6723
    return a >= b;
6724
}
6725
6726
static WC_INLINE int versionIsLessEqual(byte isDtls, byte a, byte b)
6727
{
6728
    (void)isDtls;
6729
6730
#ifdef WOLFSSL_DTLS
6731
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6732
    if (isDtls)
6733
        return a >= b;
6734
#endif /* WOLFSSL_DTLS */
6735
6736
    return a <= b;
6737
}
6738
6739
/* Return the size of the SupportedVersions extension's data.
6740
 *
6741
 * data       The SSL/TLS object.
6742
 * msgType The type of the message this extension is being written into.
6743
 * returns the length of data that will be in the extension.
6744
 */
6745
static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
6746
0
{
6747
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6748
0
    byte tls13Minor, tls12Minor, tls11Minor, isDtls;
6749
6750
0
    isDtls = !!ssl->options.dtls;
6751
0
    tls13Minor = (byte)(isDtls ? DTLSv1_3_MINOR : TLSv1_3_MINOR);
6752
0
    tls12Minor = (byte)(isDtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR);
6753
0
    tls11Minor = (byte)(isDtls ? DTLS_MINOR : TLSv1_1_MINOR);
6754
6755
    /* unused on some configuration */
6756
0
    (void)tls12Minor;
6757
0
    (void)tls13Minor;
6758
0
    (void)tls11Minor;
6759
6760
0
    if (msgType == client_hello) {
6761
        /* TLS v1.2 and TLS v1.3  */
6762
0
        int cnt = 0;
6763
6764
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13Minor)
6765
        #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6766
            defined(WOLFSSL_WPAS_SMALL)
6767
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
6768
        #endif
6769
0
        ) {
6770
0
            cnt++;
6771
0
        }
6772
6773
0
        if (ssl->options.downgrade) {
6774
0
    #ifndef WOLFSSL_NO_TLS12
6775
0
            if (versionIsLessEqual(
6776
0
                    isDtls, ssl->options.minDowngrade, tls12Minor)
6777
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6778
    defined(WOLFSSL_WPAS_SMALL)
6779
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
6780
#endif
6781
0
            ) {
6782
0
                cnt++;
6783
0
            }
6784
0
#endif
6785
    #ifndef NO_OLD_TLS
6786
            if (versionIsLessEqual(
6787
                    isDtls, ssl->options.minDowngrade, tls11Minor)
6788
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6789
                defined(WOLFSSL_WPAS_SMALL)
6790
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
6791
            #endif
6792
            ) {
6793
                cnt++;
6794
            }
6795
        #ifdef WOLFSSL_ALLOW_TLSV10
6796
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
6797
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6798
                defined(WOLFSSL_WPAS_SMALL)
6799
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
6800
            #endif
6801
            ) {
6802
                cnt++;
6803
            }
6804
        #endif
6805
    #endif
6806
0
        }
6807
6808
0
        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
6809
0
    }
6810
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6811
0
        *pSz += OPAQUE16_LEN;
6812
0
    }
6813
0
    else {
6814
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6815
0
        return SANITY_MSG_E;
6816
0
    }
6817
6818
0
    return 0;
6819
0
}
6820
6821
/* Writes the SupportedVersions extension into the buffer.
6822
 *
6823
 * data    The SSL/TLS object.
6824
 * output  The buffer to write the extension into.
6825
 * msgType The type of the message this extension is being written into.
6826
 * returns the length of data that was written.
6827
 */
6828
static int TLSX_SupportedVersions_Write(void* data, byte* output,
6829
                                        byte msgType, word16* pSz)
6830
0
{
6831
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6832
0
    byte tls13minor, tls12minor, tls11minor, isDtls = 0;
6833
6834
0
    tls13minor = (byte)TLSv1_3_MINOR;
6835
0
    tls12minor = (byte)TLSv1_2_MINOR;
6836
0
    tls11minor = (byte)TLSv1_1_MINOR;
6837
6838
    /* unused in some configuration */
6839
0
    (void)tls11minor;
6840
0
    (void)tls12minor;
6841
6842
#ifdef WOLFSSL_DTLS13
6843
    if (ssl->options.dtls) {
6844
        tls13minor = (byte)DTLSv1_3_MINOR;
6845
    #ifndef WOLFSSL_NO_TLS12
6846
        tls12minor = (byte)DTLSv1_2_MINOR;
6847
    #endif
6848
    #ifndef NO_OLD_TLS
6849
        tls11minor = (byte)DTLS_MINOR;
6850
    #endif
6851
        isDtls = 1;
6852
    }
6853
#endif /* WOLFSSL_DTLS13 */
6854
6855
0
    if (msgType == client_hello) {
6856
0
        byte major = ssl->ctx->method->version.major;
6857
6858
0
        byte* cnt = output++;
6859
0
        *cnt = 0;
6860
6861
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13minor)
6862
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6863
    defined(WOLFSSL_WPAS_SMALL)
6864
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
6865
#endif
6866
0
        ) {
6867
0
            *cnt += OPAQUE16_LEN;
6868
        #ifdef WOLFSSL_TLS13_DRAFT
6869
            /* The TLS draft major number. */
6870
            *(output++) = TLS_DRAFT_MAJOR;
6871
            /* Version of draft supported. */
6872
            *(output++) = TLS_DRAFT_MINOR;
6873
        #else
6874
0
            *(output++) = major;
6875
0
            *(output++) = tls13minor;
6876
0
        #endif
6877
0
        }
6878
6879
0
        if (ssl->options.downgrade) {
6880
0
        #ifndef WOLFSSL_NO_TLS12
6881
0
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls12minor)
6882
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6883
                defined(WOLFSSL_WPAS_SMALL)
6884
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
6885
            #endif
6886
0
            ) {
6887
0
                *cnt += OPAQUE16_LEN;
6888
0
                *(output++) = major;
6889
0
                *(output++) = tls12minor;
6890
0
            }
6891
0
        #endif
6892
6893
    #ifndef NO_OLD_TLS
6894
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls11minor)
6895
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6896
                defined(WOLFSSL_WPAS_SMALL)
6897
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
6898
            #endif
6899
            ) {
6900
                *cnt += OPAQUE16_LEN;
6901
                *(output++) = major;
6902
                *(output++) = tls11minor;
6903
            }
6904
        #ifdef WOLFSSL_ALLOW_TLSV10
6905
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
6906
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6907
                defined(WOLFSSL_WPAS_SMALL)
6908
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
6909
            #endif
6910
            ) {
6911
                *cnt += OPAQUE16_LEN;
6912
                *(output++) = major;
6913
                *(output++) = (byte)TLSv1_MINOR;
6914
            }
6915
        #endif
6916
    #endif
6917
0
        }
6918
6919
0
        *pSz += (word16)(OPAQUE8_LEN + *cnt);
6920
0
    }
6921
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6922
0
        output[0] = ssl->version.major;
6923
0
        output[1] = ssl->version.minor;
6924
6925
0
        *pSz += OPAQUE16_LEN;
6926
0
    }
6927
0
    else {
6928
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6929
0
        return SANITY_MSG_E;
6930
0
    }
6931
6932
0
    return 0;
6933
0
}
6934
6935
/* Parse the SupportedVersions extension.
6936
 *
6937
 * ssl     The SSL/TLS object.
6938
 * input   The buffer with the extension data.
6939
 * length  The length of the extension data.
6940
 * msgType The type of the message this extension is being parsed from.
6941
 * pv      The output ProtocolVersion for the negotiated version
6942
 * opts    The output options structure. Can be NULL.
6943
 * exts    The output extensions list. Can be NULL.
6944
 * returns 0 on success, otherwise failure.
6945
 */
6946
int TLSX_SupportedVersions_Parse(const WOLFSSL* ssl, const byte* input,
6947
        word16 length, byte msgType, ProtocolVersion* pv, Options* opts,
6948
        TLSX** exts)
6949
{
6950
    /* The client's greatest minor version that we support */
6951
    byte clientGreatestMinor = SSLv3_MINOR;
6952
    int ret;
6953
    byte major, minor;
6954
    byte tls13minor, tls12minor;
6955
    byte isDtls;
6956
6957
    tls13minor = TLSv1_3_MINOR;
6958
    tls12minor = TLSv1_2_MINOR;
6959
    isDtls = ssl->options.dtls == 1;
6960
6961
#ifdef WOLFSSL_DTLS13
6962
    if (ssl->options.dtls) {
6963
        tls13minor = DTLSv1_3_MINOR;
6964
        tls12minor = DTLSv1_2_MINOR;
6965
        clientGreatestMinor = DTLS_MINOR;
6966
    }
6967
#endif /* WOLFSSL_DTLS13 */
6968
6969
    if (msgType == client_hello) {
6970
        int i;
6971
        int len;
6972
        int set = 0;
6973
6974
        /* Must contain a length and at least one version. */
6975
        if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1)
6976
            return BUFFER_ERROR;
6977
6978
        len = *input;
6979
6980
        /* Protocol version array must fill rest of data. */
6981
        if (length != (word16)OPAQUE8_LEN + len)
6982
            return BUFFER_ERROR;
6983
6984
        input++;
6985
6986
        /* Find first match. */
6987
        for (i = 0; i < len; i += OPAQUE16_LEN) {
6988
            major = input[i];
6989
            minor = input[i + OPAQUE8_LEN];
6990
6991
#ifdef WOLFSSL_TLS13_DRAFT
6992
            if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
6993
                major = SSLv3_MAJOR;
6994
                minor = TLSv1_3_MINOR;
6995
            }
6996
#else
6997
            if (major == TLS_DRAFT_MAJOR)
6998
                continue;
6999
#endif
7000
7001
            if (major != ssl->ctx->method->version.major)
7002
                continue;
7003
7004
            /* No upgrade allowed. */
7005
            if (versionIsGreater(isDtls, minor, ssl->version.minor))
7006
                continue;
7007
7008
            /* Check downgrade. */
7009
            if (versionIsLesser(isDtls, minor, ssl->version.minor)) {
7010
                if (!ssl->options.downgrade)
7011
                    continue;
7012
7013
                if (versionIsLesser(isDtls, minor, ssl->options.minDowngrade))
7014
                    continue;
7015
            }
7016
            if (versionIsGreater(isDtls, minor, clientGreatestMinor))
7017
                clientGreatestMinor = minor;
7018
7019
            set = 1;
7020
        }
7021
        if (!set) {
7022
            /* No common supported version was negotiated */
7023
            SendAlert((WOLFSSL*)ssl, alert_fatal,
7024
                      wolfssl_alert_protocol_version);
7025
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7026
            return VERSION_ERROR;
7027
        }
7028
        pv->minor = clientGreatestMinor;
7029
        if (versionIsAtLeast(isDtls, clientGreatestMinor, tls13minor)) {
7030
            if (opts != NULL)
7031
                opts->tls1_3 = 1;
7032
7033
            /* TLS v1.3 requires supported version extension */
7034
            if (exts != NULL &&
7035
                    TLSX_Find(*exts, TLSX_SUPPORTED_VERSIONS) == NULL) {
7036
                ret = TLSX_Push(exts,
7037
                          TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
7038
                if (ret != 0) {
7039
                    return ret;
7040
                }
7041
                /* *exts should be pointing to the TLSX_SUPPORTED_VERSIONS
7042
                 * ext in the list since it was pushed. */
7043
                (*exts)->resp = 1;
7044
            }
7045
        }
7046
7047
    }
7048
    else if (msgType == server_hello || msgType == hello_retry_request) {
7049
        /* Must contain one version. */
7050
        if (length != OPAQUE16_LEN)
7051
            return BUFFER_ERROR;
7052
7053
        major = input[0];
7054
        minor = input[OPAQUE8_LEN];
7055
7056
        if (major != ssl->ctx->method->version.major) {
7057
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7058
            return VERSION_ERROR;
7059
        }
7060
7061
        /* Can't downgrade with this extension below TLS v1.3. */
7062
        if (versionIsLesser(isDtls, minor, tls13minor)) {
7063
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7064
            return VERSION_ERROR;
7065
        }
7066
7067
        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
7068
        if (ssl->options.downgrade && ssl->version.minor == tls12minor) {
7069
            /* Set minor version back to TLS v1.3+ */
7070
            pv->minor = ssl->ctx->method->version.minor;
7071
        }
7072
7073
        /* No upgrade allowed. */
7074
        if (versionIsLesser(isDtls, ssl->version.minor, minor)) {
7075
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7076
            return VERSION_ERROR;
7077
        }
7078
7079
        /* Check downgrade. */
7080
        if (versionIsGreater(isDtls, ssl->version.minor, minor)) {
7081
            if (!ssl->options.downgrade) {
7082
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7083
                return VERSION_ERROR;
7084
            }
7085
7086
            if (versionIsLesser(
7087
                    isDtls, minor, ssl->options.minDowngrade)) {
7088
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7089
                return VERSION_ERROR;
7090
            }
7091
7092
            /* Downgrade the version. */
7093
            pv->minor = minor;
7094
        }
7095
    }
7096
    else {
7097
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7098
        return SANITY_MSG_E;
7099
    }
7100
7101
    return 0;
7102
}
7103
7104
/* Sets a new SupportedVersions extension into the extension list.
7105
 *
7106
 * extensions  The list of extensions.
7107
 * data        The extensions specific data.
7108
 * heap        The heap used for allocation.
7109
 * returns 0 on success, otherwise failure.
7110
 */
7111
static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
7112
                                     void* heap)
7113
3.25k
{
7114
3.25k
    if (extensions == NULL || data == NULL)
7115
0
        return BAD_FUNC_ARG;
7116
7117
3.25k
    return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, data, heap);
7118
3.25k
}
7119
7120
#define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
7121
#define SV_WRITE     TLSX_SupportedVersions_Write
7122
2.72k
#define SV_PARSE     TLSX_SupportedVersions_Parse
7123
7124
#else
7125
7126
#define SV_GET_SIZE(a, b, c) 0
7127
#define SV_WRITE(a, b, c, d) 0
7128
#define SV_PARSE(a, b, c, d, e, f, g) 0
7129
7130
#endif /* WOLFSSL_TLS13 */
7131
7132
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
7133
7134
/******************************************************************************/
7135
/* Cookie                                                                     */
7136
/******************************************************************************/
7137
7138
/* Free the cookie data.
7139
 *
7140
 * cookie  Cookie data.
7141
 * heap    The heap used for allocation.
7142
 */
7143
static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
7144
{
7145
    (void)heap;
7146
7147
    XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
7148
}
7149
7150
/* Get the size of the encoded Cookie extension.
7151
 * In messages: ClientHello and HelloRetryRequest.
7152
 *
7153
 * cookie   The cookie to write.
7154
 * msgType  The type of the message this extension is being written into.
7155
 * returns the number of bytes of the encoded Cookie extension.
7156
 */
7157
static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
7158
{
7159
    if (msgType == client_hello || msgType == hello_retry_request) {
7160
        *pSz += OPAQUE16_LEN + cookie->len;
7161
    }
7162
    else {
7163
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7164
        return SANITY_MSG_E;
7165
    }
7166
    return 0;
7167
}
7168
7169
/* Writes the Cookie extension into the output buffer.
7170
 * Assumes that the the output buffer is big enough to hold data.
7171
 * In messages: ClientHello and HelloRetryRequest.
7172
 *
7173
 * cookie   The cookie to write.
7174
 * output   The buffer to write into.
7175
 * msgType  The type of the message this extension is being written into.
7176
 * returns the number of bytes written into the buffer.
7177
 */
7178
static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType,
7179
                             word16* pSz)
7180
{
7181
    if (msgType == client_hello || msgType == hello_retry_request) {
7182
        c16toa(cookie->len, output);
7183
        output += OPAQUE16_LEN;
7184
        XMEMCPY(output, cookie->data, cookie->len);
7185
        *pSz += OPAQUE16_LEN + cookie->len;
7186
    }
7187
    else {
7188
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7189
        return SANITY_MSG_E;
7190
    }
7191
    return 0;
7192
}
7193
7194
/* Parse the Cookie extension.
7195
 * In messages: ClientHello and HelloRetryRequest.
7196
 *
7197
 * ssl      The SSL/TLS object.
7198
 * input    The extension data.
7199
 * length   The length of the extension data.
7200
 * msgType  The type of the message this extension is being parsed from.
7201
 * returns 0 on success and other values indicate failure.
7202
 */
7203
static int TLSX_Cookie_Parse(WOLFSSL* ssl, const byte* input, word16 length,
7204
                             byte msgType)
7205
{
7206
    word16  len;
7207
    word16  idx = 0;
7208
    TLSX*   extension;
7209
    Cookie* cookie;
7210
7211
    if (msgType != client_hello && msgType != hello_retry_request) {
7212
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7213
        return SANITY_MSG_E;
7214
    }
7215
7216
    /* Message contains length and Cookie which must be at least one byte
7217
     * in length.
7218
     */
7219
    if (length < OPAQUE16_LEN + 1)
7220
        return BUFFER_E;
7221
    ato16(input + idx, &len);
7222
    idx += OPAQUE16_LEN;
7223
    if (length - idx != len)
7224
        return BUFFER_E;
7225
7226
    if (msgType == hello_retry_request) {
7227
        ssl->options.hrrSentCookie = 1;
7228
        return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 1,
7229
                               &ssl->extensions);
7230
    }
7231
7232
    /* client_hello */
7233
    extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
7234
    if (extension == NULL) {
7235
#ifdef WOLFSSL_DTLS13
7236
        if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
7237
            /* Allow a cookie extension with DTLS 1.3 because it is possible
7238
             * that a different SSL instance sent the cookie but we are now
7239
             * receiving it. */
7240
            return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
7241
                                   &ssl->extensions);
7242
        else
7243
#endif
7244
        {
7245
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7246
            return HRR_COOKIE_ERROR;
7247
        }
7248
    }
7249
7250
    cookie = (Cookie*)extension->data;
7251
    if (cookie->len != len || XMEMCMP(cookie->data, input + idx, len) != 0) {
7252
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7253
        return HRR_COOKIE_ERROR;
7254
    }
7255
7256
    /* Request seen. */
7257
    extension->resp = 0;
7258
7259
    return 0;
7260
}
7261
7262
/* Use the data to create a new Cookie object in the extensions.
7263
 *
7264
 * ssl    SSL/TLS object.
7265
 * data   Cookie data.
7266
 * len    Length of cookie data in bytes.
7267
 * mac    MAC data.
7268
 * macSz  Length of MAC data in bytes.
7269
 * resp   Indicates the extension will go into a response (HelloRetryRequest).
7270
 * returns 0 on success and other values indicate failure.
7271
 */
7272
int TLSX_Cookie_Use(const WOLFSSL* ssl, const byte* data, word16 len, byte* mac,
7273
                    byte macSz, int resp, TLSX** exts)
7274
{
7275
    int     ret = 0;
7276
    TLSX*   extension;
7277
    Cookie* cookie;
7278
7279
    /* Find the cookie extension if it exists. */
7280
    extension = TLSX_Find(*exts, TLSX_COOKIE);
7281
    if (extension == NULL) {
7282
        /* Push new cookie extension. */
7283
        ret = TLSX_Push(exts, TLSX_COOKIE, NULL, ssl->heap);
7284
        if (ret != 0)
7285
            return ret;
7286
7287
        extension = TLSX_Find(*exts, TLSX_COOKIE);
7288
        if (extension == NULL)
7289
            return MEMORY_E;
7290
    }
7291
7292
    cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz, ssl->heap,
7293
                              DYNAMIC_TYPE_TLSX);
7294
    if (cookie == NULL)
7295
        return MEMORY_E;
7296
7297
    cookie->len = len + macSz;
7298
    XMEMCPY(cookie->data, data, len);
7299
    if (mac != NULL)
7300
        XMEMCPY(cookie->data + len, mac, macSz);
7301
7302
    XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
7303
7304
    extension->data = (void*)cookie;
7305
    extension->resp = (byte)resp;
7306
7307
    return 0;
7308
}
7309
7310
#define CKE_FREE_ALL  TLSX_Cookie_FreeAll
7311
#define CKE_GET_SIZE  TLSX_Cookie_GetSize
7312
#define CKE_WRITE     TLSX_Cookie_Write
7313
#define CKE_PARSE     TLSX_Cookie_Parse
7314
7315
#else
7316
7317
#define CKE_FREE_ALL(a, b)    0
7318
#define CKE_GET_SIZE(a, b, c) 0
7319
#define CKE_WRITE(a, b, c, d) 0
7320
#define CKE_PARSE(a, b, c, d) 0
7321
7322
#endif
7323
7324
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && \
7325
    !defined(WOLFSSL_NO_CA_NAMES) && defined(OPENSSL_EXTRA)
7326
/* Currently only settable through compatibility API */
7327
/******************************************************************************/
7328
/* Certificate Authorities                                                       */
7329
/******************************************************************************/
7330
7331
static word16 TLSX_CA_Names_GetSize(void* data)
7332
{
7333
    WOLFSSL* ssl = (WOLFSSL*)data;
7334
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7335
    word16 size = 0;
7336
7337
    /* Length of names */
7338
    size += OPAQUE16_LEN;
7339
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL; names = names->next) {
7340
        byte seq[MAX_SEQ_SZ];
7341
        WOLFSSL_X509_NAME* name = names->data.name;
7342
7343
        if (name != NULL) {
7344
            /* 16-bit length | SEQ | Len | DER of name */
7345
            size += (word16)(OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
7346
                             name->rawLen);
7347
        }
7348
    }
7349
    return size;
7350
}
7351
7352
static word16 TLSX_CA_Names_Write(void* data, byte* output)
7353
{
7354
    WOLFSSL* ssl = (WOLFSSL*)data;
7355
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7356
    byte* len;
7357
7358
    /* Reserve space for the length value */
7359
    len = output;
7360
    output += OPAQUE16_LEN;
7361
    for (names = SSL_PRIORITY_CA_NAMES(ssl); names != NULL; names = names->next) {
7362
        byte seq[MAX_SEQ_SZ];
7363
        WOLFSSL_X509_NAME* name = names->data.name;
7364
7365
        if (name != NULL) {
7366
            c16toa((word16)name->rawLen +
7367
                   (word16)SetSequence(name->rawLen, seq), output);
7368
            output += OPAQUE16_LEN;
7369
            output += SetSequence(name->rawLen, output);
7370
            XMEMCPY(output, name->raw, name->rawLen);
7371
            output += name->rawLen;
7372
        }
7373
    }
7374
    /* Write the total length */
7375
    c16toa((word16)(output - len - OPAQUE16_LEN), len);
7376
    return (word16)(output - len);
7377
}
7378
7379
static int TLSX_CA_Names_Parse(WOLFSSL *ssl, const byte* input,
7380
                                  word16 length, byte isRequest)
7381
{
7382
    word16 extLen;
7383
7384
    (void)isRequest;
7385
7386
    wolfSSL_sk_X509_NAME_pop_free(ssl->peer_ca_names, NULL);
7387
    ssl->peer_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
7388
    if (ssl->peer_ca_names == NULL)
7389
        return MEMORY_ERROR;
7390
7391
    if (length < OPAQUE16_LEN)
7392
        return BUFFER_ERROR;
7393
7394
    ato16(input, &extLen);
7395
    input += OPAQUE16_LEN;
7396
    length -= OPAQUE16_LEN;
7397
    if (extLen != length)
7398
        return BUFFER_ERROR;
7399
7400
    while (length) {
7401
        word32 idx = 0;
7402
        WOLFSSL_X509_NAME* name = NULL;
7403
        int ret = 0;
7404
        int didInit = FALSE;
7405
        /* Use a DecodedCert struct to get access to GetName to
7406
         * parse DN name */
7407
#ifdef WOLFSSL_SMALL_STACK
7408
        DecodedCert *cert = (DecodedCert *)XMALLOC(
7409
            sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
7410
        if (cert == NULL)
7411
            return MEMORY_ERROR;
7412
#else
7413
        DecodedCert cert[1];
7414
#endif
7415
7416
        if (length < OPAQUE16_LEN) {
7417
            ret = BUFFER_ERROR;
7418
        }
7419
7420
        if (ret == 0) {
7421
            ato16(input, &extLen);
7422
            idx += OPAQUE16_LEN;
7423
7424
            if (idx + extLen > length)
7425
                ret = BUFFER_ERROR;
7426
        }
7427
7428
        if (ret == 0) {
7429
            InitDecodedCert(cert, input + idx, extLen, ssl->heap);
7430
            didInit = TRUE;
7431
            idx += extLen;
7432
            ret = GetName(cert, ASN_SUBJECT, extLen);
7433
        }
7434
7435
        if (ret == 0 && (name = wolfSSL_X509_NAME_new()) == NULL)
7436
            ret = MEMORY_ERROR;
7437
7438
        if (ret == 0) {
7439
            CopyDecodedName(name, cert, ASN_SUBJECT);
7440
            if (wolfSSL_sk_X509_NAME_push(ssl->peer_ca_names, name) <= 0) {
7441
                wolfSSL_X509_NAME_free(name);
7442
                ret = MEMORY_ERROR;
7443
            }
7444
        }
7445
7446
        if (didInit)
7447
            FreeDecodedCert(cert);
7448
7449
        WC_FREE_VAR_EX(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
7450
        if (ret != 0)
7451
            return ret;
7452
7453
        input += idx;
7454
        length -= (word16)idx;
7455
    }
7456
    return 0;
7457
}
7458
7459
#define CAN_GET_SIZE(data)      TLSX_CA_Names_GetSize(data)
7460
#define CAN_WRITE(data, output) TLSX_CA_Names_Write(data, output)
7461
#define CAN_PARSE(ssl, input, length, isRequest) \
7462
                                TLSX_CA_Names_Parse(ssl, input, length, isRequest)
7463
7464
#else
7465
7466
#define CAN_GET_SIZE(data)                       0
7467
#define CAN_WRITE(data, output)                  0
7468
#define CAN_PARSE(ssl, input, length, isRequest) 0
7469
7470
#endif
7471
7472
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
7473
/******************************************************************************/
7474
/* Signature Algorithms                                                       */
7475
/******************************************************************************/
7476
7477
/* Return the size of the SignatureAlgorithms extension's data.
7478
 *
7479
 * data  Unused
7480
 * returns the length of data that will be in the extension.
7481
 */
7482
7483
static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
7484
15.4k
{
7485
15.4k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7486
7487
15.4k
    if (sa->hashSigAlgoSz == 0)
7488
15.4k
        return OPAQUE16_LEN + WOLFSSL_SUITES(sa->ssl)->hashSigAlgoSz;
7489
0
    else
7490
0
        return OPAQUE16_LEN + sa->hashSigAlgoSz;
7491
15.4k
}
7492
7493
/* Creates a bit string of supported hash algorithms with RSA PSS.
7494
 * The bit string is used when determining which signature algorithm to use
7495
 * when creating the CertificateVerify message.
7496
 * Note: Valid data has an even length as each signature algorithm is two bytes.
7497
 *
7498
 * ssl     The SSL/TLS object.
7499
 * input   The buffer with the list of supported signature algorithms.
7500
 * length  The length of the list in bytes.
7501
 * returns 0 on success, BUFFER_ERROR when the length is not even.
7502
 */
7503
static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, const byte* input,
7504
                                           word16 length)
7505
18.8k
{
7506
18.8k
    word16 i;
7507
7508
18.8k
    if ((length & 1) == 1)
7509
0
        return BUFFER_ERROR;
7510
7511
18.8k
    ssl->pssAlgo = 0;
7512
328k
    for (i = 0; i < length; i += 2) {
7513
309k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
7514
49.8k
            ssl->pssAlgo |= 1 << input[i + 1];
7515
309k
    #ifdef WOLFSSL_TLS13
7516
309k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
7517
48.4k
                                                   input[i + 1] <= pss_sha512) {
7518
46.6k
            ssl->pssAlgo |= 1 << input[i + 1];
7519
46.6k
        }
7520
309k
    #endif
7521
309k
    }
7522
7523
18.8k
    return 0;
7524
18.8k
}
7525
7526
/* Writes the SignatureAlgorithms extension into the buffer.
7527
 *
7528
 * data    Unused
7529
 * output  The buffer to write the extension into.
7530
 * returns the length of data that was written.
7531
 */
7532
static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
7533
15.4k
{
7534
15.4k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7535
15.4k
    const Suites* suites = WOLFSSL_SUITES(sa->ssl);
7536
15.4k
    word16 hashSigAlgoSz;
7537
7538
15.4k
    if (sa->hashSigAlgoSz == 0) {
7539
15.4k
        c16toa(suites->hashSigAlgoSz, output);
7540
15.4k
        XMEMCPY(output + OPAQUE16_LEN, suites->hashSigAlgo,
7541
15.4k
                suites->hashSigAlgoSz);
7542
15.4k
        hashSigAlgoSz = suites->hashSigAlgoSz;
7543
15.4k
    }
7544
0
    else {
7545
0
        c16toa(sa->hashSigAlgoSz, output);
7546
0
        XMEMCPY(output + OPAQUE16_LEN, sa->hashSigAlgo,
7547
0
                sa->hashSigAlgoSz);
7548
0
        hashSigAlgoSz = sa->hashSigAlgoSz;
7549
0
    }
7550
7551
15.4k
#ifndef NO_RSA
7552
15.4k
    TLSX_SignatureAlgorithms_MapPss(sa->ssl, output + OPAQUE16_LEN,
7553
15.4k
            hashSigAlgoSz);
7554
15.4k
#endif
7555
7556
15.4k
    return OPAQUE16_LEN + hashSigAlgoSz;
7557
15.4k
}
7558
7559
/* Parse the SignatureAlgorithms extension.
7560
 *
7561
 * ssl     The SSL/TLS object.
7562
 * input   The buffer with the extension data.
7563
 * length  The length of the extension data.
7564
 * returns 0 on success, otherwise failure.
7565
 */
7566
static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, const byte* input,
7567
                                  word16 length, byte isRequest, Suites* suites)
7568
3.49k
{
7569
3.49k
    word16 len;
7570
7571
3.49k
    if (!isRequest)
7572
0
        return BUFFER_ERROR;
7573
7574
    /* Must contain a length and at least algorithm. */
7575
3.49k
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7576
35
        return BUFFER_ERROR;
7577
7578
3.46k
    ato16(input, &len);
7579
3.46k
    input += OPAQUE16_LEN;
7580
7581
    /* Algorithm array must fill rest of data. */
7582
3.46k
    if (length != OPAQUE16_LEN + len)
7583
96
        return BUFFER_ERROR;
7584
7585
    /* Sig Algo list size must be even. */
7586
3.36k
    if (suites->hashSigAlgoSz % 2 != 0)
7587
0
        return BUFFER_ERROR;
7588
7589
    /* truncate hashSigAlgo list if too long */
7590
3.36k
    suites->hashSigAlgoSz = len;
7591
3.36k
    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7592
54
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7593
54
        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7594
54
    }
7595
3.36k
    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
7596
7597
3.36k
    return TLSX_SignatureAlgorithms_MapPss(ssl, input, suites->hashSigAlgoSz);
7598
3.36k
}
7599
7600
/* Sets a new SignatureAlgorithms extension into the extension list.
7601
 *
7602
 * extensions  The list of extensions.
7603
 * data        The extensions specific data.
7604
 * heap        The heap used for allocation.
7605
 * returns 0 on success, otherwise failure.
7606
 */
7607
static int TLSX_SetSignatureAlgorithms(TLSX** extensions, WOLFSSL* ssl,
7608
                                       void* heap)
7609
27.6k
{
7610
27.6k
    SignatureAlgorithms* sa;
7611
27.6k
    int ret;
7612
7613
27.6k
    if (extensions == NULL)
7614
0
        return BAD_FUNC_ARG;
7615
7616
    /* Already present */
7617
27.6k
    if (TLSX_Find(*extensions, TLSX_SIGNATURE_ALGORITHMS) != NULL)
7618
43
        return 0;
7619
7620
27.6k
    sa = TLSX_SignatureAlgorithms_New(ssl, 0, heap);
7621
27.6k
    if (sa == NULL)
7622
33
        return MEMORY_ERROR;
7623
7624
27.6k
    ret = TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, sa, heap);
7625
27.6k
    if (ret != 0)
7626
93
        TLSX_SignatureAlgorithms_FreeAll(sa, heap);
7627
27.6k
    return ret;
7628
27.6k
}
7629
7630
SignatureAlgorithms* TLSX_SignatureAlgorithms_New(WOLFSSL* ssl,
7631
        word16 hashSigAlgoSz, void* heap)
7632
27.6k
{
7633
27.6k
    SignatureAlgorithms* sa;
7634
27.6k
    (void)heap;
7635
7636
27.6k
    sa = (SignatureAlgorithms*)XMALLOC(sizeof(*sa) + hashSigAlgoSz, heap,
7637
27.6k
                                       DYNAMIC_TYPE_TLSX);
7638
27.6k
    if (sa != NULL) {
7639
27.6k
        XMEMSET(sa, 0, sizeof(*sa) + hashSigAlgoSz);
7640
27.6k
        sa->ssl = ssl;
7641
27.6k
        sa->hashSigAlgoSz = hashSigAlgoSz;
7642
27.6k
    }
7643
27.6k
    return sa;
7644
27.6k
}
7645
7646
void TLSX_SignatureAlgorithms_FreeAll(SignatureAlgorithms* sa,
7647
                                             void* heap)
7648
27.6k
{
7649
27.6k
    XFREE(sa, heap, DYNAMIC_TYPE_TLSX);
7650
27.6k
    (void)heap;
7651
27.6k
}
7652
7653
#define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
7654
#define SA_WRITE     TLSX_SignatureAlgorithms_Write
7655
#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
7656
0
#define SA_FREE_ALL  TLSX_SignatureAlgorithms_FreeAll
7657
#endif
7658
/******************************************************************************/
7659
/* Signature Algorithms Certificate                                           */
7660
/******************************************************************************/
7661
7662
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
7663
/* Return the size of the SignatureAlgorithms extension's data.
7664
 *
7665
 * data  Unused
7666
 * returns the length of data that will be in the extension.
7667
 */
7668
static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
7669
0
{
7670
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7671
7672
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
7673
0
}
7674
7675
/* Writes the SignatureAlgorithmsCert extension into the buffer.
7676
 *
7677
 * data    Unused
7678
 * output  The buffer to write the extension into.
7679
 * returns the length of data that was written.
7680
 */
7681
static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
7682
0
{
7683
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7684
7685
0
    c16toa(ssl->certHashSigAlgoSz, output);
7686
0
    XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
7687
0
            ssl->certHashSigAlgoSz);
7688
7689
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
7690
0
}
7691
7692
/* Parse the SignatureAlgorithmsCert extension.
7693
 *
7694
 * ssl     The SSL/TLS object.
7695
 * input   The buffer with the extension data.
7696
 * length  The length of the extension data.
7697
 * returns 0 on success, otherwise failure.
7698
 */
7699
static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, const byte* input,
7700
                                              word16 length, byte isRequest)
7701
71
{
7702
71
    word16 len;
7703
7704
71
    if (!isRequest)
7705
0
        return BUFFER_ERROR;
7706
7707
    /* Must contain a length and at least algorithm. */
7708
71
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7709
7
        return BUFFER_ERROR;
7710
7711
64
    ato16(input, &len);
7712
64
    input += OPAQUE16_LEN;
7713
7714
    /* Algorithm array must fill rest of data. */
7715
64
    if (length != OPAQUE16_LEN + len)
7716
41
        return BUFFER_ERROR;
7717
7718
    /* truncate hashSigAlgo list if too long */
7719
23
    ssl->certHashSigAlgoSz = len;
7720
23
    if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7721
1
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7722
1
        ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7723
1
    }
7724
23
    XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
7725
7726
23
    return 0;
7727
64
}
7728
7729
/* Sets a new SignatureAlgorithmsCert extension into the extension list.
7730
 *
7731
 * extensions  The list of extensions.
7732
 * data        The extensions specific data.
7733
 * heap        The heap used for allocation.
7734
 * returns 0 on success, otherwise failure.
7735
 */
7736
static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions,
7737
        const WOLFSSL* data, void* heap)
7738
0
{
7739
0
    if (extensions == NULL)
7740
0
        return BAD_FUNC_ARG;
7741
7742
0
    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, data, heap);
7743
0
}
7744
7745
#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
7746
#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
7747
#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
7748
#endif /* WOLFSSL_TLS13 */
7749
7750
7751
/******************************************************************************/
7752
/* Key Share                                                                  */
7753
/******************************************************************************/
7754
7755
#ifndef MAX_KEYSHARE_NAMED_GROUPS
7756
    #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY)
7757
        #define MAX_KEYSHARE_NAMED_GROUPS    24
7758
    #else
7759
1.62k
        #define MAX_KEYSHARE_NAMED_GROUPS    12
7760
    #endif
7761
#endif
7762
7763
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
7764
/* Create a key share entry using named Diffie-Hellman parameters group.
7765
 * Generates a key pair.
7766
 *
7767
 * ssl   The SSL/TLS object.
7768
 * kse   The key share entry object.
7769
 * returns 0 on success, otherwise failure.
7770
 */
7771
static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
7772
230
{
7773
230
    int ret = 0;
7774
230
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
7775
230
    word32 pSz = 0, pvtSz = 0;
7776
230
    DhKey* dhKey = (DhKey*)kse->key;
7777
7778
    /* Pick the parameters from the named group. */
7779
230
#ifdef HAVE_PUBLIC_FFDHE
7780
230
    const DhParams* params = NULL;
7781
230
    switch (kse->group) {
7782
0
    #ifdef HAVE_FFDHE_2048
7783
230
        case WOLFSSL_FFDHE_2048:
7784
230
            params = wc_Dh_ffdhe2048_Get();
7785
230
            pvtSz = 29;
7786
230
            break;
7787
0
    #endif
7788
    #ifdef HAVE_FFDHE_3072
7789
        case WOLFSSL_FFDHE_3072:
7790
            params = wc_Dh_ffdhe3072_Get();
7791
            pvtSz = 34;
7792
            break;
7793
    #endif
7794
    #ifdef HAVE_FFDHE_4096
7795
        case WOLFSSL_FFDHE_4096:
7796
            params = wc_Dh_ffdhe4096_Get();
7797
            pvtSz = 39;
7798
            break;
7799
    #endif
7800
    #ifdef HAVE_FFDHE_6144
7801
        case WOLFSSL_FFDHE_6144:
7802
            params = wc_Dh_ffdhe6144_Get();
7803
            pvtSz = 46;
7804
            break;
7805
    #endif
7806
    #ifdef HAVE_FFDHE_8192
7807
        case WOLFSSL_FFDHE_8192:
7808
            params = wc_Dh_ffdhe8192_Get();
7809
            pvtSz = 52;
7810
            break;
7811
    #endif
7812
0
        default:
7813
0
            break;
7814
230
    }
7815
230
    if (params == NULL)
7816
0
        return BAD_FUNC_ARG;
7817
230
    pSz = params->p_len;
7818
#else
7819
    pvtSz = wc_DhGetNamedKeyMinSize(kse->group);
7820
    if (pvtSz == 0) {
7821
        return BAD_FUNC_ARG;
7822
    }
7823
    ret = wc_DhGetNamedKeyParamSize(kse->group, &pSz, NULL, NULL);
7824
    if (ret != 0) {
7825
        return BAD_FUNC_ARG;
7826
    }
7827
#endif
7828
7829
    /* Trigger Key Generation */
7830
230
    if (kse->pubKey == NULL || kse->privKey == NULL) {
7831
229
        if (kse->key == NULL) {
7832
229
            kse->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
7833
229
                DYNAMIC_TYPE_DH);
7834
229
            if (kse->key == NULL)
7835
1
                return MEMORY_E;
7836
7837
            /* Setup Key */
7838
228
            ret = wc_InitDhKey_ex((DhKey*)kse->key, ssl->heap, ssl->devId);
7839
228
            if (ret == 0) {
7840
228
                dhKey = (DhKey*)kse->key;
7841
228
            #ifdef HAVE_PUBLIC_FFDHE
7842
228
                ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
7843
228
                                                                 params->g_len);
7844
            #else
7845
                ret = wc_DhSetNamedKey(dhKey, kse->group);
7846
            #endif
7847
228
            }
7848
228
        }
7849
7850
        /* Allocate space for the private and public key */
7851
228
        if (ret == 0 && kse->pubKey == NULL) {
7852
228
            kse->pubKey = (byte*)XMALLOC(pSz, ssl->heap,
7853
228
                DYNAMIC_TYPE_PUBLIC_KEY);
7854
228
            if (kse->pubKey == NULL)
7855
2
                ret = MEMORY_E;
7856
228
        }
7857
7858
228
        if (ret == 0 && kse->privKey == NULL) {
7859
226
            kse->privKey = (byte*)XMALLOC(pvtSz, ssl->heap,
7860
226
                DYNAMIC_TYPE_PRIVATE_KEY);
7861
226
            if (kse->privKey == NULL)
7862
3
                ret = MEMORY_E;
7863
226
        }
7864
7865
228
        if (ret == 0) {
7866
        #if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
7867
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_DH, kse->key);
7868
            kse->pubKeyLen = pSz;
7869
            kse->keyLen = pvtSz;
7870
            if (ret == 0) {
7871
                ret = wc_DhExportKeyPair(dhKey,
7872
                    (byte*)kse->privKey, &kse->keyLen, /* private */
7873
                    kse->pubKey, &kse->pubKeyLen /* public */
7874
                );
7875
            }
7876
            else
7877
        #endif
7878
223
            {
7879
                /* Generate a new key pair */
7880
                /* For async this is called once and when event is done, the
7881
                 *   provided buffers will be populated.
7882
                 * Final processing is zero pad below. */
7883
223
                kse->pubKeyLen = pSz;
7884
223
                kse->keyLen = pvtSz;
7885
223
                ret = DhGenKeyPair(ssl, dhKey,
7886
223
                    (byte*)kse->privKey, &kse->keyLen, /* private */
7887
223
                    kse->pubKey, &kse->pubKeyLen /* public */
7888
223
                );
7889
            #ifdef WOLFSSL_ASYNC_CRYPT
7890
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
7891
                    return ret;
7892
                }
7893
            #endif
7894
223
            }
7895
223
        }
7896
228
    }
7897
7898
229
    if (ret == 0) {
7899
131
        if (pSz != kse->pubKeyLen) {
7900
            /* Zero pad the front of the public key to match prime "p" size */
7901
0
            XMEMMOVE(kse->pubKey + pSz - kse->pubKeyLen, kse->pubKey,
7902
0
                kse->pubKeyLen);
7903
0
            XMEMSET(kse->pubKey, 0, pSz - kse->pubKeyLen);
7904
0
            kse->pubKeyLen = pSz;
7905
0
        }
7906
7907
131
        if (pvtSz != kse->keyLen) {
7908
            /* Zero pad the front of the private key */
7909
0
            XMEMMOVE(kse->privKey + pvtSz - kse->keyLen, kse->privKey,
7910
0
                kse->keyLen);
7911
0
            XMEMSET(kse->privKey, 0, pvtSz - kse->keyLen);
7912
0
            kse->keyLen = pvtSz;
7913
0
        }
7914
7915
    #ifdef WOLFSSL_DEBUG_TLS
7916
        WOLFSSL_MSG("Public DH Key");
7917
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
7918
    #endif
7919
131
    }
7920
7921
    /* Always release the DH key to free up memory.
7922
     * The DhKey will be setup again in TLSX_KeyShare_ProcessDh */
7923
229
    if (dhKey != NULL)
7924
228
        wc_FreeDhKey(dhKey);
7925
229
    XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
7926
229
    kse->key = NULL;
7927
7928
229
    if (ret != 0) {
7929
        /* Cleanup on error, otherwise data owned by key share entry */
7930
98
        if (kse->privKey) {
7931
93
            ForceZero(kse->privKey, pvtSz);
7932
93
            XFREE(kse->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7933
93
            kse->privKey = NULL;
7934
93
        }
7935
98
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7936
98
        kse->pubKey = NULL;
7937
98
    }
7938
#else
7939
    (void)ssl;
7940
    (void)kse;
7941
7942
    ret = NOT_COMPILED_IN;
7943
    WOLFSSL_ERROR_VERBOSE(ret);
7944
#endif
7945
7946
229
    return ret;
7947
230
}
7948
7949
/* Create a key share entry using X25519 parameters group.
7950
 * Generates a key pair.
7951
 *
7952
 * ssl   The SSL/TLS object.
7953
 * kse   The key share entry object.
7954
 * returns 0 on success, otherwise failure.
7955
 */
7956
static int TLSX_KeyShare_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
7957
622
{
7958
622
    int ret = 0;
7959
622
#ifdef HAVE_CURVE25519
7960
622
    curve25519_key* key = (curve25519_key*)kse->key;
7961
7962
622
    if (kse->key == NULL) {
7963
        /* Allocate a Curve25519 key to hold private key. */
7964
618
        kse->key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
7965
618
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
7966
618
        if (kse->key == NULL) {
7967
2
            WOLFSSL_MSG("GenX25519Key memory error");
7968
2
            return MEMORY_E;
7969
2
        }
7970
7971
        /* Make an Curve25519 key. */
7972
616
        ret = wc_curve25519_init_ex((curve25519_key*)kse->key, ssl->heap,
7973
616
            INVALID_DEVID);
7974
616
        if (ret == 0) {
7975
            /* setting "key" means okay to call wc_curve25519_free */
7976
616
            key = (curve25519_key*)kse->key;
7977
616
            kse->keyLen = CURVE25519_KEYSIZE;
7978
7979
        #ifdef WOLFSSL_STATIC_EPHEMERAL
7980
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE25519, kse->key);
7981
            if (ret != 0)
7982
        #endif
7983
616
            {
7984
616
                ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
7985
616
            }
7986
616
        }
7987
616
    }
7988
7989
620
    if (ret == 0 && kse->pubKey == NULL) {
7990
        /* Allocate space for the public key. */
7991
596
        kse->pubKey = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
7992
596
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
7993
596
        if (kse->pubKey == NULL) {
7994
3
            WOLFSSL_MSG("GenX25519Key pub memory error");
7995
3
            ret = MEMORY_E;
7996
3
        }
7997
596
    }
7998
7999
620
    if (ret == 0) {
8000
        /* Export Curve25519 public key. */
8001
597
        kse->pubKeyLen = CURVE25519_KEYSIZE;
8002
597
        if (wc_curve25519_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8003
597
                                                  EC25519_LITTLE_ENDIAN) != 0) {
8004
0
            ret = ECC_EXPORT_ERROR;
8005
0
            WOLFSSL_ERROR_VERBOSE(ret);
8006
0
        }
8007
597
        kse->pubKeyLen = CURVE25519_KEYSIZE; /* always CURVE25519_KEYSIZE */
8008
597
    }
8009
8010
#ifdef WOLFSSL_DEBUG_TLS
8011
    if (ret == 0) {
8012
        WOLFSSL_MSG("Public Curve25519 Key");
8013
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8014
    }
8015
#endif
8016
8017
620
    if (ret != 0) {
8018
        /* Data owned by key share entry otherwise. */
8019
23
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8020
23
        kse->pubKey = NULL;
8021
23
        if (key != NULL)
8022
23
            wc_curve25519_free(key);
8023
23
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8024
23
        kse->key = NULL;
8025
23
    }
8026
#else
8027
    (void)ssl;
8028
    (void)kse;
8029
8030
    ret = NOT_COMPILED_IN;
8031
    WOLFSSL_ERROR_VERBOSE(ret);
8032
#endif /* HAVE_CURVE25519 */
8033
8034
620
    return ret;
8035
622
}
8036
8037
/* Create a key share entry using X448 parameters group.
8038
 * Generates a key pair.
8039
 *
8040
 * ssl   The SSL/TLS object.
8041
 * kse   The key share entry object.
8042
 * returns 0 on success, otherwise failure.
8043
 */
8044
static int TLSX_KeyShare_GenX448Key(WOLFSSL *ssl, KeyShareEntry* kse)
8045
15
{
8046
15
    int ret = 0;
8047
15
#ifdef HAVE_CURVE448
8048
15
    curve448_key* key = (curve448_key*)kse->key;
8049
8050
15
    if (kse->key == NULL) {
8051
        /* Allocate a Curve448 key to hold private key. */
8052
13
        kse->key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
8053
13
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8054
13
        if (kse->key == NULL) {
8055
0
            WOLFSSL_MSG("GenX448Key memory error");
8056
0
            return MEMORY_E;
8057
0
        }
8058
8059
        /* Make an Curve448 key. */
8060
13
        ret = wc_curve448_init((curve448_key*)kse->key);
8061
13
        if (ret == 0) {
8062
13
            key = (curve448_key*)kse->key;
8063
13
            kse->keyLen = CURVE448_KEY_SIZE;
8064
8065
            #ifdef WOLFSSL_STATIC_EPHEMERAL
8066
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE448, kse->key);
8067
            if (ret != 0)
8068
        #endif
8069
13
            {
8070
13
                ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
8071
13
            }
8072
13
        }
8073
13
    }
8074
8075
15
    if (ret == 0 && kse->pubKey == NULL) {
8076
        /* Allocate space for the public key. */
8077
13
        kse->pubKey = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
8078
13
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8079
13
        if (kse->pubKey == NULL) {
8080
0
            WOLFSSL_MSG("GenX448Key pub memory error");
8081
0
            ret = MEMORY_E;
8082
0
        }
8083
13
    }
8084
8085
15
    if (ret == 0) {
8086
        /* Export Curve448 public key. */
8087
15
        kse->pubKeyLen = CURVE448_KEY_SIZE;
8088
15
        if (wc_curve448_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8089
15
                                                    EC448_LITTLE_ENDIAN) != 0) {
8090
0
            ret = ECC_EXPORT_ERROR;
8091
0
        }
8092
15
        kse->pubKeyLen = CURVE448_KEY_SIZE; /* always CURVE448_KEY_SIZE */
8093
15
    }
8094
8095
#ifdef WOLFSSL_DEBUG_TLS
8096
    if (ret == 0) {
8097
        WOLFSSL_MSG("Public Curve448 Key");
8098
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8099
    }
8100
#endif
8101
8102
15
    if (ret != 0) {
8103
        /* Data owned by key share entry otherwise. */
8104
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8105
0
        kse->pubKey = NULL;
8106
0
        if (key != NULL)
8107
0
            wc_curve448_free(key);
8108
0
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8109
0
        kse->key = NULL;
8110
0
    }
8111
#else
8112
    (void)ssl;
8113
    (void)kse;
8114
8115
    ret = NOT_COMPILED_IN;
8116
    WOLFSSL_ERROR_VERBOSE(ret);
8117
#endif /* HAVE_CURVE448 */
8118
8119
15
    return ret;
8120
15
}
8121
8122
/* Create a key share entry using named elliptic curve parameters group.
8123
 * Generates a key pair.
8124
 *
8125
 * ssl   The SSL/TLS object.
8126
 * kse   The key share entry object.
8127
 * returns 0 on success, otherwise failure.
8128
 */
8129
static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
8130
0
{
8131
0
    int ret = 0;
8132
0
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
8133
0
    word32 keySize = 0;
8134
0
    word16 curveId = (word16) ECC_CURVE_INVALID;
8135
0
    ecc_key* eccKey = (ecc_key*)kse->key;
8136
8137
    /* TODO: [TLS13] Get key sizes using wc_ecc_get_curve_size_from_id. */
8138
    /* Translate named group to a curve id. */
8139
0
    switch (kse->group) {
8140
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
8141
0
        #ifndef NO_ECC_SECP
8142
0
        case WOLFSSL_ECC_SECP256R1:
8143
0
            curveId = ECC_SECP256R1;
8144
0
            keySize = 32;
8145
0
            break;
8146
0
        #endif /* !NO_ECC_SECP */
8147
0
        #ifdef WOLFSSL_SM2
8148
0
        case WOLFSSL_ECC_SM2P256V1:
8149
0
            curveId = ECC_SM2P256V1;
8150
0
            keySize = 32;
8151
0
            break;
8152
0
        #endif /* !NO_ECC_SECP */
8153
0
    #endif
8154
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
8155
0
        #ifndef NO_ECC_SECP
8156
0
        case WOLFSSL_ECC_SECP384R1:
8157
0
            curveId = ECC_SECP384R1;
8158
0
            keySize = 48;
8159
0
            break;
8160
0
        #endif /* !NO_ECC_SECP */
8161
0
    #endif
8162
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
8163
0
        #ifndef NO_ECC_SECP
8164
0
        case WOLFSSL_ECC_SECP521R1:
8165
0
            curveId = ECC_SECP521R1;
8166
0
            keySize = 66;
8167
0
            break;
8168
0
        #endif /* !NO_ECC_SECP */
8169
0
    #endif
8170
0
        default:
8171
0
            WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
8172
0
            return BAD_FUNC_ARG;
8173
0
    }
8174
8175
0
    if (kse->key == NULL) {
8176
        /* Allocate an ECC key to hold private key. */
8177
0
        kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC);
8178
0
        if (kse->key == NULL) {
8179
0
            WOLFSSL_MSG_EX("Failed to allocate %d bytes, ssl->heap: %p",
8180
0
                           (int)sizeof(ecc_key), (wc_ptr_t)ssl->heap);
8181
0
            WOLFSSL_MSG("EccTempKey Memory error!");
8182
0
            return MEMORY_E;
8183
0
        }
8184
8185
        /* Initialize an ECC key struct for the ephemeral key */
8186
0
        ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
8187
8188
0
        if (ret == 0) {
8189
0
            kse->keyLen = keySize;
8190
0
            kse->pubKeyLen = keySize * 2 + 1;
8191
8192
        #if defined(WOLFSSL_RENESAS_TSIP_TLS)
8193
            ret = tsip_Tls13GenEccKeyPair(ssl, kse);
8194
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
8195
                return ret;
8196
            }
8197
        #endif
8198
            /* setting eccKey means okay to call wc_ecc_free */
8199
0
            eccKey = (ecc_key*)kse->key;
8200
8201
        #ifdef WOLFSSL_STATIC_EPHEMERAL
8202
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_ECDH, kse->key);
8203
            if (ret != 0 || eccKey->dp->id != curveId)
8204
        #endif
8205
0
            {
8206
                /* set curve info for EccMakeKey "peer" info */
8207
0
                ret = wc_ecc_set_curve(eccKey, (int)kse->keyLen, curveId);
8208
0
                if (ret == 0) {
8209
            #ifdef WOLFSSL_ASYNC_CRYPT
8210
                    /* Detect when private key generation is done */
8211
                    if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) &&
8212
                            eccKey->type == ECC_PRIVATEKEY) {
8213
                        ret = 0; /* ECC Key Generation is done */
8214
                    }
8215
                    else
8216
            #endif
8217
0
                    {
8218
                        /* Generate ephemeral ECC key */
8219
                        /* For async this is called once and when event is done, the
8220
                        *   provided buffers in key be populated.
8221
                        * Final processing is x963 key export below. */
8222
0
                        ret = EccMakeKey(ssl, eccKey, eccKey);
8223
0
                    }
8224
0
                }
8225
            #ifdef WOLFSSL_ASYNC_CRYPT
8226
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
8227
                    return ret;
8228
            #endif
8229
0
            }
8230
0
        }
8231
0
    }
8232
8233
0
    if (ret == 0 && kse->pubKey == NULL) {
8234
        /* Allocate space for the public key */
8235
0
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8236
0
            DYNAMIC_TYPE_PUBLIC_KEY);
8237
0
        if (kse->pubKey == NULL) {
8238
0
            WOLFSSL_MSG("Key data Memory error");
8239
0
            ret = MEMORY_E;
8240
0
        }
8241
0
    }
8242
8243
0
    if (ret == 0) {
8244
0
        XMEMSET(kse->pubKey, 0, kse->pubKeyLen);
8245
8246
        /* Export public key. */
8247
0
        PRIVATE_KEY_UNLOCK();
8248
0
        if (wc_ecc_export_x963(eccKey, kse->pubKey, &kse->pubKeyLen) != 0) {
8249
0
            ret = ECC_EXPORT_ERROR;
8250
0
            WOLFSSL_ERROR_VERBOSE(ret);
8251
0
        }
8252
0
        PRIVATE_KEY_LOCK();
8253
0
    }
8254
#ifdef WOLFSSL_DEBUG_TLS
8255
    if (ret == 0) {
8256
        WOLFSSL_MSG("Public ECC Key");
8257
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8258
    }
8259
#endif
8260
8261
0
    if (ret != 0) {
8262
        /* Cleanup on error, otherwise data owned by key share entry */
8263
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8264
0
        kse->pubKey = NULL;
8265
0
        if (eccKey != NULL)
8266
0
            wc_ecc_free(eccKey);
8267
0
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8268
0
        kse->key = NULL;
8269
0
    }
8270
#else
8271
    (void)ssl;
8272
    (void)kse;
8273
8274
    ret = NOT_COMPILED_IN;
8275
    WOLFSSL_ERROR_VERBOSE(ret);
8276
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
8277
8278
0
    return ret;
8279
0
}
8280
8281
#ifdef WOLFSSL_HAVE_MLKEM
8282
#if defined(WOLFSSL_MLKEM_CACHE_A) && \
8283
    !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY)
8284
    /* Store KyberKey object rather than private key bytes in key share entry.
8285
     * Improves performance at cost of more dynamic memory being used. */
8286
    #define WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8287
#endif
8288
#if defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY) && \
8289
    defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ)
8290
    #error "Choose WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY or "
8291
           "WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ"
8292
#endif
8293
8294
#if !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) || \
8295
    !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) || \
8296
    (!defined(WOLFSSL_MLKEM_NO_DECAPSULATE) && \
8297
     !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ))
8298
static int mlkem_id2type(int id, int *type)
8299
{
8300
    int ret = 0;
8301
8302
    switch (id) {
8303
#ifndef WOLFSSL_NO_ML_KEM
8304
    #ifndef WOLFSSL_NO_ML_KEM_512
8305
        case WOLFSSL_ML_KEM_512:
8306
            *type = WC_ML_KEM_512;
8307
            break;
8308
    #endif
8309
    #ifndef WOLFSSL_NO_ML_KEM_768
8310
        case WOLFSSL_ML_KEM_768:
8311
            *type = WC_ML_KEM_768;
8312
            break;
8313
    #endif
8314
    #ifndef WOLFSSL_NO_ML_KEM_1024
8315
        case WOLFSSL_ML_KEM_1024:
8316
            *type = WC_ML_KEM_1024;
8317
            break;
8318
    #endif
8319
#endif
8320
#ifdef WOLFSSL_MLKEM_KYBER
8321
    #ifdef WOLFSSL_KYBER512
8322
        case WOLFSSL_KYBER_LEVEL1:
8323
            *type = KYBER512;
8324
            break;
8325
    #endif
8326
    #ifdef WOLFSSL_KYBER768
8327
        case WOLFSSL_KYBER_LEVEL3:
8328
            *type = KYBER768;
8329
            break;
8330
    #endif
8331
    #ifdef WOLFSSL_KYBER1024
8332
        case WOLFSSL_KYBER_LEVEL5:
8333
            *type = KYBER1024;
8334
            break;
8335
    #endif
8336
#endif
8337
        default:
8338
            ret = NOT_COMPILED_IN;
8339
            break;
8340
    }
8341
8342
    return ret;
8343
}
8344
#endif
8345
8346
/* Structures and objects needed for hybrid key exchanges using both classic
8347
 * ECDHE and PQC KEM key material. */
8348
typedef struct PqcHybridMapping {
8349
    int hybrid;
8350
    int ecc;
8351
    int pqc;
8352
    int pqc_first;
8353
} PqcHybridMapping;
8354
8355
static const PqcHybridMapping pqc_hybrid_mapping[] = {
8356
#ifndef WOLFSSL_NO_ML_KEM
8357
    {WOLFSSL_SECP256R1MLKEM512, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8358
    {WOLFSSL_SECP384R1MLKEM768, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8359
    {WOLFSSL_SECP256R1MLKEM768, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_768, 0},
8360
    {WOLFSSL_SECP521R1MLKEM1024, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8361
    {WOLFSSL_SECP384R1MLKEM1024, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_1024, 0},
8362
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
8363
    {WOLFSSL_P256_ML_KEM_512_OLD, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8364
    {WOLFSSL_P384_ML_KEM_768_OLD, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8365
    {WOLFSSL_P521_ML_KEM_1024_OLD, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8366
#endif
8367
#ifdef HAVE_CURVE25519
8368
    {WOLFSSL_X25519MLKEM512, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_512, 1},
8369
    {WOLFSSL_X25519MLKEM768, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_768, 1},
8370
#endif
8371
#ifdef HAVE_CURVE448
8372
    {WOLFSSL_X448MLKEM768, WOLFSSL_ECC_X448, WOLFSSL_ML_KEM_768, 1},
8373
#endif
8374
#endif /* WOLFSSL_NO_ML_KEM */
8375
#ifdef WOLFSSL_MLKEM_KYBER
8376
    {WOLFSSL_P256_KYBER_LEVEL1, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL1, 0},
8377
    {WOLFSSL_P384_KYBER_LEVEL3, WOLFSSL_ECC_SECP384R1, WOLFSSL_KYBER_LEVEL3, 0},
8378
    {WOLFSSL_P256_KYBER_LEVEL3, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL3, 0},
8379
    {WOLFSSL_P521_KYBER_LEVEL5, WOLFSSL_ECC_SECP521R1, WOLFSSL_KYBER_LEVEL5, 0},
8380
#ifdef HAVE_CURVE25519
8381
    {WOLFSSL_X25519_KYBER_LEVEL1, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL1, 0},
8382
    {WOLFSSL_X25519_KYBER_LEVEL3, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL3, 0},
8383
#endif
8384
#ifdef HAVE_CURVE448
8385
    {WOLFSSL_X448_KYBER_LEVEL3, WOLFSSL_ECC_X448, WOLFSSL_KYBER_LEVEL3, 0},
8386
#endif
8387
#endif /* WOLFSSL_MLKEM_KYBER */
8388
    {0, 0, 0, 0}
8389
};
8390
8391
/* Map an ecc-pqc hybrid group into its ecc group and pqc kem group. */
8392
static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group)
8393
{
8394
    int i;
8395
8396
    if (pqc != NULL)
8397
        *pqc = 0;
8398
    if (ecc != NULL)
8399
        *ecc = 0;
8400
    if (pqc_first != NULL)
8401
        *pqc_first = 0;
8402
8403
    for (i = 0; pqc_hybrid_mapping[i].hybrid != 0; i++) {
8404
        if (pqc_hybrid_mapping[i].hybrid == group) {
8405
            if (pqc != NULL)
8406
                *pqc = pqc_hybrid_mapping[i].pqc;
8407
            if (ecc != NULL)
8408
                *ecc = pqc_hybrid_mapping[i].ecc;
8409
            if (pqc_first != NULL)
8410
                *pqc_first = pqc_hybrid_mapping[i].pqc_first;
8411
            break;
8412
        }
8413
    }
8414
}
8415
8416
#ifndef WOLFSSL_MLKEM_NO_MAKE_KEY
8417
/* Create a key share entry using pqc parameters group on the client side.
8418
 * Generates a key pair.
8419
 *
8420
 * ssl   The SSL/TLS object.
8421
 * kse   The key share entry object.
8422
 * returns 0 on success, otherwise failure.
8423
 */
8424
static int TLSX_KeyShare_GenPqcKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
8425
{
8426
    int ret = 0;
8427
    int type = 0;
8428
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8429
        WC_DECLARE_VAR(kem, KyberKey, 1, 0);
8430
    byte* privKey = NULL;
8431
    word32 privSz = 0;
8432
#else
8433
    KyberKey* kem = NULL;
8434
#endif
8435
8436
    /* This gets called twice. Once during parsing of the key share and once
8437
     * during the population of the extension. No need to do work the second
8438
     * time. Just return success if its already been done. */
8439
    if (kse->pubKey != NULL) {
8440
        return ret;
8441
    }
8442
8443
    /* Get the type of key we need from the key share group. */
8444
    ret = mlkem_id2type(kse->group, &type);
8445
    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
8446
        WOLFSSL_MSG("Invalid Kyber algorithm specified.");
8447
        ret = BAD_FUNC_ARG;
8448
    }
8449
8450
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8451
8452
    #ifdef WOLFSSL_SMALL_STACK
8453
    if (ret == 0) {
8454
        kem = (KyberKey *)XMALLOC(sizeof(*kem), ssl->heap,
8455
                                  DYNAMIC_TYPE_PRIVATE_KEY);
8456
        if (kem == NULL) {
8457
            WOLFSSL_MSG("KEM memory allocation failure");
8458
            ret = MEMORY_ERROR;
8459
        }
8460
    }
8461
    #endif /* WOLFSSL_SMALL_STACK */
8462
8463
    if (ret == 0) {
8464
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
8465
        if (ret != 0) {
8466
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
8467
        }
8468
    }
8469
8470
    if (ret == 0) {
8471
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
8472
    }
8473
    if (ret == 0) {
8474
        ret = wc_KyberKey_PublicKeySize(kem, &kse->pubKeyLen);
8475
    }
8476
8477
    if (ret == 0) {
8478
        privKey = (byte*)XMALLOC(privSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8479
        if (privKey == NULL) {
8480
            WOLFSSL_MSG("privkey memory allocation failure");
8481
            ret = MEMORY_ERROR;
8482
        }
8483
    }
8484
#else
8485
    if (ret == 0) {
8486
        /* Allocate a Kyber key to hold private key. */
8487
        kem = (KyberKey*)XMALLOC(sizeof(KyberKey), ssl->heap,
8488
                                 DYNAMIC_TYPE_PRIVATE_KEY);
8489
        if (kem == NULL) {
8490
            WOLFSSL_MSG("KEM memory allocation failure");
8491
            ret = MEMORY_ERROR;
8492
        }
8493
    }
8494
    if (ret == 0) {
8495
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
8496
        if (ret != 0) {
8497
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
8498
        }
8499
    }
8500
    if (ret == 0) {
8501
        ret = wc_KyberKey_PublicKeySize(kem, &kse->pubKeyLen);
8502
    }
8503
#endif
8504
8505
    if (ret == 0) {
8506
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8507
                                     DYNAMIC_TYPE_PUBLIC_KEY);
8508
        if (kse->pubKey == NULL) {
8509
            WOLFSSL_MSG("pubkey memory allocation failure");
8510
            ret = MEMORY_ERROR;
8511
        }
8512
    }
8513
8514
    if (ret == 0) {
8515
        ret = wc_KyberKey_MakeKey(kem, ssl->rng);
8516
        if (ret != 0) {
8517
            WOLFSSL_MSG("Kyber keygen failure");
8518
        }
8519
    }
8520
    if (ret == 0) {
8521
        ret = wc_KyberKey_EncodePublicKey(kem, kse->pubKey,
8522
                                          kse->pubKeyLen);
8523
    }
8524
8525
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8526
    if (ret == 0) {
8527
        ret = wc_KyberKey_EncodePrivateKey(kem, privKey, privSz);
8528
    }
8529
#endif
8530
8531
#ifdef WOLFSSL_DEBUG_TLS
8532
    WOLFSSL_MSG("Public Kyber Key");
8533
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
8534
#endif
8535
8536
    if (ret != 0) {
8537
        /* Data owned by key share entry otherwise. */
8538
        wc_KyberKey_Free(kem);
8539
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8540
        kse->pubKey = NULL;
8541
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8542
        if (privKey) {
8543
            ForceZero(privKey, privSz);
8544
            XFREE(privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8545
            privKey = NULL;
8546
        }
8547
    #else
8548
        XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8549
        kse->key = NULL;
8550
    #endif
8551
    }
8552
    else {
8553
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8554
        wc_KyberKey_Free(kem);
8555
        kse->privKey = (byte*)privKey;
8556
        kse->privKeyLen = privSz;
8557
    #else
8558
        kse->key = kem;
8559
    #endif
8560
    }
8561
8562
    #if !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ) && \
8563
        defined(WOLFSSL_SMALL_STACK)
8564
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8565
    #endif
8566
8567
    return ret;
8568
}
8569
8570
/* Create a key share entry using both ecdhe and pqc parameters groups.
8571
 * Generates two key pairs on the client side.
8572
 *
8573
 * ssl   The SSL/TLS object.
8574
 * kse   The key share entry object.
8575
 * returns 0 on success, otherwise failure.
8576
 */
8577
static int TLSX_KeyShare_GenPqcHybridKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
8578
{
8579
    int ret = 0;
8580
    KeyShareEntry *ecc_kse = NULL;
8581
    KeyShareEntry *pqc_kse = NULL;
8582
    int pqc_group = 0;
8583
    int ecc_group = 0;
8584
    int pqc_first = 0;
8585
8586
    /* This gets called twice. Once during parsing of the key share and once
8587
     * during the population of the extension. No need to do work the second
8588
     * time. Just return success if its already been done. */
8589
    if (kse->pubKey != NULL) {
8590
        return ret;
8591
    }
8592
8593
    /* Determine the ECC and PQC group of the hybrid combination */
8594
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, kse->group);
8595
    if (ecc_group == 0 || pqc_group == 0) {
8596
        WOLFSSL_MSG("Invalid hybrid group");
8597
        ret = BAD_FUNC_ARG;
8598
    }
8599
8600
    if (ret == 0) {
8601
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
8602
                   DYNAMIC_TYPE_TLSX);
8603
        if (ecc_kse == NULL) {
8604
            WOLFSSL_MSG("kse memory allocation failure");
8605
            ret = MEMORY_ERROR;
8606
        }
8607
        else {
8608
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
8609
        }
8610
    }
8611
    if (ret == 0) {
8612
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
8613
                   DYNAMIC_TYPE_TLSX);
8614
        if (pqc_kse == NULL) {
8615
            WOLFSSL_MSG("kse memory allocation failure");
8616
            ret = MEMORY_ERROR;
8617
        }
8618
        else {
8619
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
8620
        }
8621
    }
8622
8623
    /* Generate ECC key share part */
8624
    if (ret == 0) {
8625
        ecc_kse->group = ecc_group;
8626
    #ifdef HAVE_CURVE25519
8627
        if (ecc_group == WOLFSSL_ECC_X25519) {
8628
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
8629
        }
8630
        else
8631
    #endif
8632
    #ifdef HAVE_CURVE448
8633
        if (ecc_group == WOLFSSL_ECC_X448) {
8634
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
8635
        }
8636
        else
8637
    #endif
8638
        {
8639
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
8640
        }
8641
        /* No error message, TLSX_KeyShare_Gen*Key will do it. */
8642
    }
8643
8644
    /* Generate PQC key share part */
8645
    if (ret == 0) {
8646
        pqc_kse->group = pqc_group;
8647
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, pqc_kse);
8648
        /* No error message, TLSX_KeyShare_GenPqcKeyClient will do it. */
8649
    }
8650
8651
    /* Allocate memory for combined public key */
8652
    if (ret == 0) {
8653
        kse->pubKey = (byte*)XMALLOC(ecc_kse->pubKeyLen + pqc_kse->pubKeyLen,
8654
                                     ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8655
        if (kse->pubKey == NULL) {
8656
            WOLFSSL_MSG("pubkey memory allocation failure");
8657
            ret = MEMORY_ERROR;
8658
        }
8659
    }
8660
8661
    /* Create combined public key. The order of classic/pqc key material is
8662
     * indicated by the pqc_first variable. */
8663
    if (ret == 0) {
8664
        if (pqc_first) {
8665
            XMEMCPY(kse->pubKey, pqc_kse->pubKey, pqc_kse->pubKeyLen);
8666
            XMEMCPY(kse->pubKey + pqc_kse->pubKeyLen, ecc_kse->pubKey,
8667
                    ecc_kse->pubKeyLen);
8668
        }
8669
        else {
8670
            XMEMCPY(kse->pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen);
8671
            XMEMCPY(kse->pubKey + ecc_kse->pubKeyLen, pqc_kse->pubKey,
8672
                    pqc_kse->pubKeyLen);
8673
        }
8674
        kse->pubKeyLen = ecc_kse->pubKeyLen + pqc_kse->pubKeyLen;
8675
    }
8676
8677
    /* Store the private keys.
8678
     * Note we are saving the PQC private key and ECC private key
8679
     * separately. That's because the ECC private key is not simply a
8680
     * buffer. Its is an ecc_key struct. */
8681
    if (ret == 0) {
8682
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8683
        /* PQC private key is an encoded byte array */
8684
        kse->privKey = pqc_kse->privKey;
8685
        kse->privKeyLen = pqc_kse->privKeyLen;
8686
        pqc_kse->privKey = NULL;
8687
    #else
8688
        /* PQC private key is a pointer to KyberKey object */
8689
        kse->privKey = (byte*)pqc_kse->key;
8690
        kse->privKeyLen = 0;
8691
        pqc_kse->key = NULL;
8692
    #endif
8693
        /* ECC private key is a pointer to ecc_key object */
8694
        kse->key = ecc_kse->key;
8695
        kse->keyLen = ecc_kse->keyLen;
8696
        ecc_kse->key = NULL;
8697
    }
8698
8699
#ifdef WOLFSSL_DEBUG_TLS
8700
    WOLFSSL_MSG("Public Kyber Key");
8701
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
8702
#endif
8703
8704
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
8705
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
8706
8707
    return ret;
8708
}
8709
#endif /* !WOLFSSL_MLKEM_NO_MAKE_KEY */
8710
#endif /* WOLFSSL_HAVE_MLKEM */
8711
8712
/* Generate a secret/key using the key share entry.
8713
 *
8714
 * ssl  The SSL/TLS object.
8715
 * kse  The key share entry holding peer data.
8716
 */
8717
int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
8718
4.25k
{
8719
4.25k
    int ret;
8720
    /* Named FFDHE groups have a bit set to identify them. */
8721
4.25k
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(kse->group))
8722
230
        ret = TLSX_KeyShare_GenDhKey(ssl, kse);
8723
4.02k
    else if (kse->group == WOLFSSL_ECC_X25519)
8724
622
        ret = TLSX_KeyShare_GenX25519Key(ssl, kse);
8725
3.40k
    else if (kse->group == WOLFSSL_ECC_X448)
8726
15
        ret = TLSX_KeyShare_GenX448Key(ssl, kse);
8727
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY)
8728
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group))
8729
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, kse);
8730
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(kse->group))
8731
        ret = TLSX_KeyShare_GenPqcHybridKeyClient(ssl, kse);
8732
#endif
8733
3.38k
    else
8734
3.38k
        ret = TLSX_KeyShare_GenEccKey(ssl, kse);
8735
#ifdef WOLFSSL_ASYNC_CRYPT
8736
    kse->lastRet = ret;
8737
#endif
8738
4.25k
    return ret;
8739
4.25k
}
8740
8741
/* Free the key share dynamic data.
8742
 *
8743
 * list  The linked list of key share entry objects.
8744
 * heap  The heap used for allocation.
8745
 */
8746
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
8747
5.86k
{
8748
5.86k
    KeyShareEntry* current;
8749
8750
11.8k
    while ((current = list) != NULL) {
8751
5.95k
        list = current->next;
8752
5.95k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(current->group)) {
8753
505
#ifndef NO_DH
8754
505
            wc_FreeDhKey((DhKey*)current->key);
8755
505
#endif
8756
505
        }
8757
5.45k
        else if (current->group == WOLFSSL_ECC_X25519) {
8758
1.51k
#ifdef HAVE_CURVE25519
8759
1.51k
            wc_curve25519_free((curve25519_key*)current->key);
8760
1.51k
#endif
8761
1.51k
        }
8762
3.93k
        else if (current->group == WOLFSSL_ECC_X448) {
8763
35
#ifdef HAVE_CURVE448
8764
35
            wc_curve448_free((curve448_key*)current->key);
8765
35
#endif
8766
35
        }
8767
#ifdef WOLFSSL_HAVE_MLKEM
8768
        else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
8769
            wc_KyberKey_Free((KyberKey*)current->key);
8770
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8771
            if (current->privKey != NULL) {
8772
                ForceZero(current->privKey, current->privKeyLen);
8773
            }
8774
        #endif
8775
        }
8776
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
8777
            int ecc_group = 0;
8778
            findEccPqc(&ecc_group, NULL, NULL, current->group);
8779
8780
            /* Free PQC private key */
8781
        #ifdef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8782
            wc_KyberKey_Free((KyberKey*)current->privKey);
8783
        #else
8784
            if (current->privKey != NULL) {
8785
                ForceZero(current->privKey, current->privKeyLen);
8786
            }
8787
        #endif
8788
8789
            /* Free ECC private key */
8790
            if (ecc_group == WOLFSSL_ECC_X25519) {
8791
            #ifdef HAVE_CURVE25519
8792
                wc_curve25519_free((curve25519_key*)current->key);
8793
            #endif
8794
            }
8795
            else if (ecc_group == WOLFSSL_ECC_X448) {
8796
            #ifdef HAVE_CURVE448
8797
                wc_curve448_free((curve448_key*)current->key);
8798
            #endif
8799
            }
8800
            else {
8801
            #ifdef HAVE_ECC
8802
                wc_ecc_free((ecc_key*)current->key);
8803
            #endif
8804
            }
8805
        }
8806
#endif
8807
3.90k
        else {
8808
3.90k
#ifdef HAVE_ECC
8809
3.90k
            wc_ecc_free((ecc_key*)current->key);
8810
3.90k
#endif
8811
3.90k
        }
8812
5.95k
        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
8813
5.95k
    #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
8814
5.95k
        XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY);
8815
5.95k
    #endif
8816
5.95k
        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
8817
5.95k
        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
8818
5.95k
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
8819
5.95k
    }
8820
8821
5.86k
    (void)heap;
8822
5.86k
}
8823
8824
/* Get the size of the encoded key share extension.
8825
 *
8826
 * list     The linked list of key share extensions.
8827
 * msgType  The type of the message this extension is being written into.
8828
 * returns the number of bytes of the encoded key share extension.
8829
 */
8830
static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
8831
3.60k
{
8832
3.60k
    word16         len = 0;
8833
3.60k
    byte           isRequest = (msgType == client_hello);
8834
3.60k
    KeyShareEntry* current;
8835
8836
    /* The named group the server wants to use. */
8837
3.60k
    if (msgType == hello_retry_request)
8838
104
        return OPAQUE16_LEN;
8839
8840
    /* List of key exchange groups. */
8841
3.50k
    if (isRequest)
8842
2.76k
        len += OPAQUE16_LEN;
8843
7.00k
    while ((current = list) != NULL) {
8844
3.50k
        list = current->next;
8845
8846
3.50k
        if (!isRequest && current->pubKey == NULL)
8847
0
            continue;
8848
8849
3.50k
        len += (word16)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
8850
3.50k
    }
8851
8852
3.50k
    return len;
8853
3.60k
}
8854
8855
/* Writes the key share extension into the output buffer.
8856
 * Assumes that the the output buffer is big enough to hold data.
8857
 *
8858
 * list     The linked list of key share entries.
8859
 * output   The buffer to write into.
8860
 * msgType  The type of the message this extension is being written into.
8861
 * returns the number of bytes written into the buffer.
8862
 */
8863
static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
8864
                                  byte msgType)
8865
3.58k
{
8866
3.58k
    word16         i = 0;
8867
3.58k
    byte           isRequest = (msgType == client_hello);
8868
3.58k
    KeyShareEntry* current;
8869
8870
3.58k
    if (msgType == hello_retry_request) {
8871
100
        c16toa(list->group, output);
8872
100
        return OPAQUE16_LEN;
8873
100
    }
8874
8875
    /* ClientHello has a list but ServerHello is only the chosen. */
8876
3.48k
    if (isRequest)
8877
2.76k
        i += OPAQUE16_LEN;
8878
8879
    /* Write out all in the list. */
8880
6.97k
    while ((current = list) != NULL) {
8881
3.48k
        list = current->next;
8882
8883
3.48k
        if (!isRequest && current->pubKey == NULL)
8884
0
            continue;
8885
8886
3.48k
        c16toa(current->group, &output[i]);
8887
3.48k
        i += KE_GROUP_LEN;
8888
3.48k
        c16toa((word16)(current->pubKeyLen), &output[i]);
8889
3.48k
        i += OPAQUE16_LEN;
8890
3.48k
        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
8891
3.48k
        i += (word16)current->pubKeyLen;
8892
3.48k
    }
8893
    /* Write the length of the list if required. */
8894
3.48k
    if (isRequest)
8895
2.76k
        c16toa(i - OPAQUE16_LEN, output);
8896
8897
3.48k
    return i;
8898
3.58k
}
8899
8900
/* Process the DH key share extension on the client side.
8901
 *
8902
 * ssl            The SSL/TLS object.
8903
 * keyShareEntry  The key share entry object to use to calculate shared secret.
8904
 * returns 0 on success and other values indicate failure.
8905
 */
8906
static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
8907
94
{
8908
94
    int ret = 0;
8909
94
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
8910
94
    word32 pSz = 0;
8911
94
    DhKey* dhKey = (DhKey*)keyShareEntry->key;
8912
8913
94
#ifdef HAVE_PUBLIC_FFDHE
8914
94
    const DhParams* params = NULL;
8915
94
    switch (keyShareEntry->group) {
8916
0
    #ifdef HAVE_FFDHE_2048
8917
94
        case WOLFSSL_FFDHE_2048:
8918
94
            params = wc_Dh_ffdhe2048_Get();
8919
94
            break;
8920
0
    #endif
8921
    #ifdef HAVE_FFDHE_3072
8922
        case WOLFSSL_FFDHE_3072:
8923
            params = wc_Dh_ffdhe3072_Get();
8924
            break;
8925
    #endif
8926
    #ifdef HAVE_FFDHE_4096
8927
        case WOLFSSL_FFDHE_4096:
8928
            params = wc_Dh_ffdhe4096_Get();
8929
            break;
8930
    #endif
8931
    #ifdef HAVE_FFDHE_6144
8932
        case WOLFSSL_FFDHE_6144:
8933
            params = wc_Dh_ffdhe6144_Get();
8934
            break;
8935
    #endif
8936
    #ifdef HAVE_FFDHE_8192
8937
        case WOLFSSL_FFDHE_8192:
8938
            params = wc_Dh_ffdhe8192_Get();
8939
            break;
8940
    #endif
8941
0
        default:
8942
0
            break;
8943
94
    }
8944
94
    if (params == NULL) {
8945
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
8946
0
        return PEER_KEY_ERROR;
8947
0
    }
8948
94
    pSz = params->p_len;
8949
#else
8950
    ret = wc_DhGetNamedKeyParamSize(keyShareEntry->group, &pSz, NULL, NULL);
8951
    if (ret != 0 || pSz == 0) {
8952
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
8953
        return PEER_KEY_ERROR;
8954
    }
8955
#endif
8956
8957
    /* if DhKey is not setup, do it now */
8958
94
    if (keyShareEntry->key == NULL) {
8959
94
        keyShareEntry->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
8960
94
            DYNAMIC_TYPE_DH);
8961
94
        if (keyShareEntry->key == NULL)
8962
5
            return MEMORY_E;
8963
8964
        /* Setup Key */
8965
89
        ret = wc_InitDhKey_ex((DhKey*)keyShareEntry->key, ssl->heap, ssl->devId);
8966
89
        if (ret == 0) {
8967
89
            dhKey = (DhKey*)keyShareEntry->key;
8968
        /* Set key */
8969
89
        #ifdef HAVE_PUBLIC_FFDHE
8970
89
            ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
8971
89
                                                                params->g_len);
8972
        #else
8973
            ret = wc_DhSetNamedKey(dhKey, keyShareEntry->group);
8974
        #endif
8975
89
        }
8976
89
    }
8977
8978
89
    if (ret == 0
8979
    #ifdef WOLFSSL_ASYNC_CRYPT
8980
        && keyShareEntry->lastRet == 0 /* don't enter here if WC_PENDING_E */
8981
    #endif
8982
89
    ) {
8983
    #ifdef WOLFSSL_DEBUG_TLS
8984
        WOLFSSL_MSG("Peer DH Key");
8985
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
8986
    #endif
8987
8988
89
        ssl->options.dhKeySz = (word16)pSz;
8989
8990
        /* Derive secret from private key and peer's public key. */
8991
89
        ret = DhAgree(ssl, dhKey,
8992
89
            (const byte*)keyShareEntry->privKey, keyShareEntry->keyLen, /* our private */
8993
89
            keyShareEntry->ke, keyShareEntry->keLen,                    /* peer's public key */
8994
89
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,    /* secret */
8995
89
            NULL, 0
8996
89
        );
8997
    #ifdef WOLFSSL_ASYNC_CRYPT
8998
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8999
            return ret;
9000
        }
9001
    #endif
9002
89
    }
9003
9004
    /* RFC 8446 Section 7.4.1:
9005
     *     ... left-padded with zeros up to the size of the prime. ...
9006
     */
9007
89
    if (ret == 0 && (word32)ssl->options.dhKeySz > ssl->arrays->preMasterSz) {
9008
0
        word32 diff = (word32)ssl->options.dhKeySz - ssl->arrays->preMasterSz;
9009
0
        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
9010
0
                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9011
0
        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
9012
0
        ssl->arrays->preMasterSz = ssl->options.dhKeySz;
9013
0
    }
9014
9015
    /* done with key share, release resources */
9016
89
    if (dhKey)
9017
89
        wc_FreeDhKey(dhKey);
9018
89
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
9019
89
    keyShareEntry->key = NULL;
9020
89
    if (keyShareEntry->privKey) {
9021
89
        ForceZero(keyShareEntry->privKey, keyShareEntry->keyLen);
9022
89
        XFREE(keyShareEntry->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9023
89
        keyShareEntry->privKey = NULL;
9024
89
    }
9025
89
    XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9026
89
    keyShareEntry->pubKey = NULL;
9027
89
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9028
89
    keyShareEntry->ke = NULL;
9029
#else
9030
    (void)ssl;
9031
    (void)keyShareEntry;
9032
    ret = PEER_KEY_ERROR;
9033
    WOLFSSL_ERROR_VERBOSE(ret);
9034
#endif
9035
89
    return ret;
9036
94
}
9037
9038
/* Process the X25519 key share extension on the client side.
9039
 *
9040
 * ssl            The SSL/TLS object.
9041
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9042
 * ssOutput       The destination buffer for the shared secret.
9043
 * ssOutSz        The size of the generated shared secret.
9044
 *
9045
 * returns 0 on success and other values indicate failure.
9046
 */
9047
static int TLSX_KeyShare_ProcessX25519_ex(WOLFSSL* ssl,
9048
                                          KeyShareEntry* keyShareEntry,
9049
                                          unsigned char* ssOutput,
9050
                                          word32* ssOutSz)
9051
569
{
9052
569
    int ret;
9053
9054
569
#ifdef HAVE_CURVE25519
9055
569
    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
9056
569
    curve25519_key* peerX25519Key;
9057
9058
569
#ifdef HAVE_ECC
9059
569
    if (ssl->peerEccKey != NULL) {
9060
0
        wc_ecc_free(ssl->peerEccKey);
9061
0
        ssl->peerEccKey = NULL;
9062
0
        ssl->peerEccKeyPresent = 0;
9063
0
    }
9064
569
#endif
9065
9066
569
    peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
9067
569
                                                             DYNAMIC_TYPE_TLSX);
9068
569
    if (peerX25519Key == NULL) {
9069
2
        WOLFSSL_MSG("PeerEccKey Memory error");
9070
2
        return MEMORY_ERROR;
9071
2
    }
9072
567
    ret = wc_curve25519_init(peerX25519Key);
9073
567
    if (ret != 0) {
9074
0
        XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9075
0
        return ret;
9076
0
    }
9077
#ifdef WOLFSSL_DEBUG_TLS
9078
    WOLFSSL_MSG("Peer Curve25519 Key");
9079
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9080
#endif
9081
9082
567
    if (wc_curve25519_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9083
567
                                                  EC25519_LITTLE_ENDIAN) != 0) {
9084
6
        ret = ECC_PEERKEY_ERROR;
9085
6
        WOLFSSL_ERROR_VERBOSE(ret);
9086
6
    }
9087
9088
567
    if (ret == 0) {
9089
561
        if (wc_curve25519_import_public_ex(keyShareEntry->ke,
9090
561
                                            keyShareEntry->keLen, peerX25519Key,
9091
561
                                            EC25519_LITTLE_ENDIAN) != 0) {
9092
0
            ret = ECC_PEERKEY_ERROR;
9093
0
            WOLFSSL_ERROR_VERBOSE(ret);
9094
0
        }
9095
561
    }
9096
9097
567
    if (ret == 0) {
9098
561
        ssl->ecdhCurveOID = ECC_X25519_OID;
9099
561
    #ifdef WOLFSSL_CURVE25519_BLINDING
9100
561
        ret = wc_curve25519_set_rng(key, ssl->rng);
9101
561
    }
9102
567
    if (ret == 0) {
9103
561
    #endif
9104
561
        ret = wc_curve25519_shared_secret_ex(key, peerX25519Key,
9105
561
                    ssOutput, ssOutSz, EC25519_LITTLE_ENDIAN);
9106
561
    }
9107
9108
567
    wc_curve25519_free(peerX25519Key);
9109
567
    XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9110
567
    wc_curve25519_free((curve25519_key*)keyShareEntry->key);
9111
567
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9112
567
    keyShareEntry->key = NULL;
9113
567
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9114
567
    keyShareEntry->ke = NULL;
9115
#else
9116
    (void)ssl;
9117
    (void)keyShareEntry;
9118
    (void)ssOutput;
9119
    (void)ssOutSz;
9120
9121
    ret = PEER_KEY_ERROR;
9122
    WOLFSSL_ERROR_VERBOSE(ret);
9123
#endif /* HAVE_CURVE25519 */
9124
9125
567
    return ret;
9126
567
}
9127
9128
/* Process the X25519 key share extension on the client side.
9129
 *
9130
 * ssl            The SSL/TLS object.
9131
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9132
 *
9133
 * returns 0 on success and other values indicate failure.
9134
 */
9135
static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
9136
                                       KeyShareEntry* keyShareEntry)
9137
569
{
9138
569
    return TLSX_KeyShare_ProcessX25519_ex(ssl, keyShareEntry,
9139
569
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9140
569
}
9141
9142
/* Process the X448 key share extension on the client side.
9143
 *
9144
 * ssl            The SSL/TLS object.
9145
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9146
 * ssOutput       The destination buffer for the shared secret.
9147
 * ssOutSz        The size of the generated shared secret.
9148
 *
9149
 * returns 0 on success and other values indicate failure.
9150
 */
9151
static int TLSX_KeyShare_ProcessX448_ex(WOLFSSL* ssl,
9152
                                        KeyShareEntry* keyShareEntry,
9153
                                        unsigned char* ssOutput,
9154
                                        word32* ssOutSz)
9155
10
{
9156
10
    int ret;
9157
9158
10
#ifdef HAVE_CURVE448
9159
10
    curve448_key* key = (curve448_key*)keyShareEntry->key;
9160
10
    curve448_key* peerX448Key;
9161
9162
10
#ifdef HAVE_ECC
9163
10
    if (ssl->peerEccKey != NULL) {
9164
0
        wc_ecc_free(ssl->peerEccKey);
9165
0
        ssl->peerEccKey = NULL;
9166
0
        ssl->peerEccKeyPresent = 0;
9167
0
    }
9168
10
#endif
9169
9170
10
    peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
9171
10
                                                             DYNAMIC_TYPE_TLSX);
9172
10
    if (peerX448Key == NULL) {
9173
0
        WOLFSSL_MSG("PeerEccKey Memory error");
9174
0
        return MEMORY_ERROR;
9175
0
    }
9176
10
    ret = wc_curve448_init(peerX448Key);
9177
10
    if (ret != 0) {
9178
0
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9179
0
        return ret;
9180
0
    }
9181
#ifdef WOLFSSL_DEBUG_TLS
9182
    WOLFSSL_MSG("Peer Curve448 Key");
9183
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9184
#endif
9185
9186
10
    if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9187
10
                                                    EC448_LITTLE_ENDIAN) != 0) {
9188
1
        ret = ECC_PEERKEY_ERROR;
9189
1
        WOLFSSL_ERROR_VERBOSE(ret);
9190
1
    }
9191
9192
10
    if (ret == 0) {
9193
9
        if (wc_curve448_import_public_ex(keyShareEntry->ke,
9194
9
                                              keyShareEntry->keLen, peerX448Key,
9195
9
                                              EC448_LITTLE_ENDIAN) != 0) {
9196
0
            ret = ECC_PEERKEY_ERROR;
9197
0
            WOLFSSL_ERROR_VERBOSE(ret);
9198
0
        }
9199
9
    }
9200
9201
10
    if (ret == 0) {
9202
9
        ssl->ecdhCurveOID = ECC_X448_OID;
9203
9204
9
        ret = wc_curve448_shared_secret_ex(key, peerX448Key,
9205
9
                    ssOutput, ssOutSz, EC448_LITTLE_ENDIAN);
9206
9
    }
9207
9208
10
    wc_curve448_free(peerX448Key);
9209
10
    XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9210
10
    wc_curve448_free((curve448_key*)keyShareEntry->key);
9211
10
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9212
10
    keyShareEntry->key = NULL;
9213
10
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9214
10
    keyShareEntry->ke = NULL;
9215
#else
9216
    (void)ssl;
9217
    (void)keyShareEntry;
9218
    (void)ssOutput;
9219
    (void)ssOutSz;
9220
9221
    ret = PEER_KEY_ERROR;
9222
    WOLFSSL_ERROR_VERBOSE(ret);
9223
#endif /* HAVE_CURVE448 */
9224
9225
10
    return ret;
9226
10
}
9227
9228
/* Process the X448 key share extension on the client side.
9229
 *
9230
 * ssl            The SSL/TLS object.
9231
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9232
 * returns 0 on success and other values indicate failure.
9233
 */
9234
static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9235
10
{
9236
10
    return TLSX_KeyShare_ProcessX448_ex(ssl, keyShareEntry,
9237
10
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9238
10
}
9239
9240
/* Process the ECC key share extension on the client side.
9241
 *
9242
 * ssl            The SSL/TLS object.
9243
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9244
 * ssOutput       The destination buffer for the shared secret.
9245
 * ssOutSz        The size of the generated shared secret.
9246
 *
9247
 * returns 0 on success and other values indicate failure.
9248
 */
9249
static int TLSX_KeyShare_ProcessEcc_ex(WOLFSSL* ssl,
9250
                                       KeyShareEntry* keyShareEntry,
9251
                                       unsigned char* ssOutput,
9252
                                       word32* ssOutSz)
9253
{
9254
    int ret = 0;
9255
#ifdef HAVE_ECC
9256
    int curveId = ECC_CURVE_INVALID;
9257
    ecc_key* eccKey = (ecc_key*)keyShareEntry->key;
9258
9259
    /* find supported curve */
9260
    switch (keyShareEntry->group) {
9261
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
9262
        #ifndef NO_ECC_SECP
9263
        case WOLFSSL_ECC_SECP256R1:
9264
            curveId = ECC_SECP256R1;
9265
            break;
9266
        #endif /* !NO_ECC_SECP */
9267
        #ifdef WOLFSSL_SM2
9268
        case WOLFSSL_ECC_SM2P256V1:
9269
            curveId = ECC_SM2P256V1;
9270
            break;
9271
        #endif
9272
    #endif
9273
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
9274
        #ifndef NO_ECC_SECP
9275
        case WOLFSSL_ECC_SECP384R1:
9276
            curveId = ECC_SECP384R1;
9277
            break;
9278
        #endif /* !NO_ECC_SECP */
9279
    #endif
9280
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
9281
        #ifndef NO_ECC_SECP
9282
        case WOLFSSL_ECC_SECP521R1:
9283
            curveId = ECC_SECP521R1;
9284
            break;
9285
        #endif /* !NO_ECC_SECP */
9286
    #endif
9287
    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
9288
        case WOLFSSL_ECC_X448:
9289
            curveId = ECC_X448;
9290
            break;
9291
    #endif
9292
        default:
9293
            /* unsupported curve */
9294
            WOLFSSL_ERROR_VERBOSE(ECC_PEERKEY_ERROR);
9295
            return ECC_PEERKEY_ERROR;
9296
    }
9297
9298
#ifdef WOLFSSL_ASYNC_CRYPT
9299
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9300
#endif
9301
    {
9302
    #ifdef WOLFSSL_DEBUG_TLS
9303
        WOLFSSL_MSG("Peer ECC Key");
9304
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9305
    #endif
9306
9307
        if (ssl->peerEccKey != NULL) {
9308
            wc_ecc_free(ssl->peerEccKey);
9309
            XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9310
            ssl->peerEccKeyPresent = 0;
9311
        }
9312
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
9313
        ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry);
9314
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
9315
            return ret;
9316
        }
9317
        ret = 0;
9318
#endif
9319
9320
        ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
9321
                                            DYNAMIC_TYPE_ECC);
9322
        if (ssl->peerEccKey == NULL) {
9323
            WOLFSSL_MSG("PeerEccKey Memory error");
9324
            ret = MEMORY_ERROR;
9325
        }
9326
9327
        if (ret == 0) {
9328
            ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
9329
        }
9330
9331
        /* Point is validated by import function. */
9332
        if (ret == 0) {
9333
            ret = wc_ecc_import_x963_ex(keyShareEntry->ke, keyShareEntry->keLen,
9334
                                ssl->peerEccKey, curveId);
9335
            if (ret != 0) {
9336
                ret = ECC_PEERKEY_ERROR;
9337
                WOLFSSL_ERROR_VERBOSE(ret);
9338
            }
9339
        }
9340
9341
        if (ret == 0) {
9342
            ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
9343
            ssl->peerEccKeyPresent = 1;
9344
        }
9345
    }
9346
9347
    if (ret == 0 && eccKey == NULL)
9348
        ret = BAD_FUNC_ARG;
9349
    if (ret == 0) {
9350
        ret = EccSharedSecret(ssl, eccKey, ssl->peerEccKey,
9351
            keyShareEntry->ke, &keyShareEntry->keLen,
9352
            ssOutput, ssOutSz, ssl->options.side);
9353
    #ifdef WOLFSSL_ASYNC_CRYPT
9354
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
9355
            return ret;
9356
    #endif
9357
    }
9358
9359
    /* done with key share, release resources */
9360
    if (ssl->peerEccKey != NULL
9361
    #ifdef HAVE_PK_CALLBACKS
9362
        && ssl->ctx->EccSharedSecretCb == NULL
9363
    #endif
9364
    ) {
9365
        wc_ecc_free(ssl->peerEccKey);
9366
        XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9367
        ssl->peerEccKey = NULL;
9368
        ssl->peerEccKeyPresent = 0;
9369
    }
9370
    if (keyShareEntry->key) {
9371
        wc_ecc_free((ecc_key*)keyShareEntry->key);
9372
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_ECC);
9373
        keyShareEntry->key = NULL;
9374
    }
9375
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9376
    keyShareEntry->ke = NULL;
9377
#else
9378
    (void)ssl;
9379
    (void)keyShareEntry;
9380
    (void)ssOutput;
9381
    (void)ssOutSz;
9382
9383
    ret = PEER_KEY_ERROR;
9384
    WOLFSSL_ERROR_VERBOSE(ret);
9385
#endif /* HAVE_ECC */
9386
9387
    return ret;
9388
}
9389
9390
/* Process the ECC key share extension on the client side.
9391
 *
9392
 * ssl            The SSL/TLS object.
9393
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9394
 * returns 0 on success and other values indicate failure.
9395
 */
9396
static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9397
223
{
9398
223
    return TLSX_KeyShare_ProcessEcc_ex(ssl, keyShareEntry,
9399
223
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9400
223
}
9401
9402
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9403
/* Process the Kyber key share extension on the client side.
9404
 *
9405
 * ssl            The SSL/TLS object.
9406
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9407
 * ssOutput       The destination buffer for the shared secret.
9408
 * ssOutSz        The size of the generated shared secret.
9409
 *
9410
 * returns 0 on success and other values indicate failure.
9411
 */
9412
static int TLSX_KeyShare_ProcessPqcClient_ex(WOLFSSL* ssl,
9413
                                             KeyShareEntry* keyShareEntry,
9414
                                             unsigned char* ssOutput,
9415
                                             word32* ssOutSz)
9416
{
9417
    int       ret = 0;
9418
    KyberKey* kem = (KyberKey*)keyShareEntry->key;
9419
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9420
    word32    privSz = 0;
9421
#endif
9422
    word32    ctSz = 0;
9423
    word32    ssSz = 0;
9424
9425
    if (ssl->options.side == WOLFSSL_SERVER_END) {
9426
        /* I am the server, the shared secret has already been generated and
9427
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
9428
        return 0;
9429
    }
9430
9431
    if (keyShareEntry->ke == NULL) {
9432
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
9433
        return BAD_FUNC_ARG;
9434
    }
9435
    if (ssOutSz == NULL)
9436
        return BAD_FUNC_ARG;
9437
9438
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9439
    if (kem == NULL) {
9440
        int type = 0;
9441
9442
        /* Allocate a Kyber key to hold private key. */
9443
        kem = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
9444
                                  DYNAMIC_TYPE_PRIVATE_KEY);
9445
        if (kem == NULL) {
9446
            WOLFSSL_MSG("GenPqcKey memory error");
9447
            ret = MEMORY_E;
9448
        }
9449
        if (ret == 0) {
9450
            ret = mlkem_id2type(keyShareEntry->group, &type);
9451
        }
9452
        if (ret != 0) {
9453
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
9454
            ret = BAD_FUNC_ARG;
9455
        }
9456
        if (ret == 0) {
9457
            ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
9458
            if (ret != 0) {
9459
                WOLFSSL_MSG("Error creating Kyber KEM");
9460
            }
9461
        }
9462
    }
9463
#else
9464
    if (kem == NULL || keyShareEntry->privKeyLen != 0) {
9465
        WOLFSSL_MSG("Invalid Kyber key.");
9466
        ret = BAD_FUNC_ARG;
9467
    }
9468
#endif
9469
9470
    if (ret == 0) {
9471
        ret = wc_KyberKey_SharedSecretSize(kem, &ssSz);
9472
    }
9473
    if (ret == 0) {
9474
        ret = wc_KyberKey_CipherTextSize(kem, &ctSz);
9475
    }
9476
9477
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9478
    if (ret == 0) {
9479
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
9480
    }
9481
    if (ret == 0 && privSz != keyShareEntry->privKeyLen) {
9482
        WOLFSSL_MSG("Invalid private key size.");
9483
        ret = BAD_FUNC_ARG;
9484
    }
9485
    if (ret == 0) {
9486
        ret = wc_KyberKey_DecodePrivateKey(kem, keyShareEntry->privKey, privSz);
9487
    }
9488
#endif
9489
9490
    if (ret == 0) {
9491
        ret = wc_KyberKey_Decapsulate(kem, ssOutput,
9492
                                      keyShareEntry->ke, ctSz);
9493
        if (ret != 0) {
9494
            WOLFSSL_MSG("wc_KyberKey decapsulation failure.");
9495
            ret = BAD_FUNC_ARG;
9496
        }
9497
    }
9498
    if (ret == 0) {
9499
        *ssOutSz = ssSz;
9500
    }
9501
9502
    wc_KyberKey_Free(kem);
9503
9504
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9505
    keyShareEntry->key = NULL;
9506
9507
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9508
    keyShareEntry->ke = NULL;
9509
9510
    return ret;
9511
}
9512
9513
/* Process the Kyber key share extension on the client side.
9514
 *
9515
 * ssl            The SSL/TLS object.
9516
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9517
 *
9518
 * returns 0 on success and other values indicate failure.
9519
 */
9520
static int TLSX_KeyShare_ProcessPqcClient(WOLFSSL* ssl,
9521
                                          KeyShareEntry* keyShareEntry)
9522
{
9523
    return TLSX_KeyShare_ProcessPqcClient_ex(ssl, keyShareEntry,
9524
                                             ssl->arrays->preMasterSecret,
9525
                                             &ssl->arrays->preMasterSz);
9526
}
9527
9528
/* Process the hybrid key share extension on the client side.
9529
 *
9530
 * ssl            The SSL/TLS object.
9531
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9532
 * returns 0 on success and other values indicate failure.
9533
 */
9534
static int TLSX_KeyShare_ProcessPqcHybridClient(WOLFSSL* ssl,
9535
                                                KeyShareEntry* keyShareEntry)
9536
{
9537
    int      ret = 0;
9538
    int      pqc_group = 0;
9539
    int      ecc_group = 0;
9540
    int      pqc_first = 0;
9541
    KeyShareEntry* pqc_kse = NULL;
9542
    KeyShareEntry *ecc_kse = NULL;
9543
    word32   ctSz = 0;
9544
    word32   ssSzPqc = 0;
9545
    word32   ssSzEcc = 0;
9546
9547
    if (ssl->options.side == WOLFSSL_SERVER_END) {
9548
        /* I am the server, the shared secret has already been generated and
9549
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
9550
        return 0;
9551
    }
9552
9553
    if (keyShareEntry->ke == NULL) {
9554
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
9555
        return BAD_FUNC_ARG;
9556
    }
9557
9558
    /* I am the client, both the PQC ciphertext and the ECHD public key are in
9559
     * keyShareEntry->ke */
9560
9561
    /* Determine the ECC and PQC group of the hybrid combination */
9562
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
9563
    if (ecc_group == 0 || pqc_group == 0) {
9564
        WOLFSSL_MSG("Invalid hybrid group");
9565
        ret = BAD_FUNC_ARG;
9566
    }
9567
9568
    if (ret == 0) {
9569
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
9570
                   DYNAMIC_TYPE_TLSX);
9571
        if (ecc_kse == NULL) {
9572
            WOLFSSL_MSG("kse memory allocation failure");
9573
            ret = MEMORY_ERROR;
9574
        }
9575
        else {
9576
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
9577
        }
9578
    }
9579
    if (ret == 0) {
9580
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
9581
                   DYNAMIC_TYPE_TLSX);
9582
        if (pqc_kse == NULL) {
9583
            WOLFSSL_MSG("kse memory allocation failure");
9584
            ret = MEMORY_ERROR;
9585
        }
9586
        else {
9587
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
9588
        }
9589
    }
9590
9591
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
9592
     * decode these sizes to separate the KEM ciphertext from the ECDH public
9593
     * key. */
9594
    if (ret == 0) {
9595
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9596
        int type;
9597
9598
        pqc_kse->privKey = keyShareEntry->privKey;
9599
9600
        ret = mlkem_id2type(pqc_group, &type);
9601
        if (ret != 0) {
9602
            WOLFSSL_MSG("Invalid Kyber algorithm specified.");
9603
            ret = BAD_FUNC_ARG;
9604
        }
9605
        if (ret == 0) {
9606
            pqc_kse->key = XMALLOC(sizeof(KyberKey), ssl->heap,
9607
                                DYNAMIC_TYPE_PRIVATE_KEY);
9608
            if (pqc_kse->key == NULL) {
9609
                WOLFSSL_MSG("GenPqcKey memory error");
9610
                ret = MEMORY_E;
9611
            }
9612
        }
9613
        if (ret == 0) {
9614
            ret = wc_KyberKey_Init(type, (KyberKey*)pqc_kse->key,
9615
                                   ssl->heap, ssl->devId);
9616
            if (ret != 0) {
9617
                WOLFSSL_MSG("Error creating Kyber KEM");
9618
            }
9619
        }
9620
    #else
9621
        pqc_kse->key = keyShareEntry->privKey;
9622
    #endif
9623
9624
        pqc_kse->group = pqc_group;
9625
        pqc_kse->privKeyLen = keyShareEntry->privKeyLen;
9626
9627
        if (ret == 0) {
9628
            ret = wc_KyberKey_SharedSecretSize((KyberKey*)pqc_kse->key,
9629
                                               &ssSzPqc);
9630
        }
9631
        if (ret == 0) {
9632
            ret = wc_KyberKey_CipherTextSize((KyberKey*)pqc_kse->key,
9633
                                             &ctSz);
9634
            if (ret == 0 && keyShareEntry->keLen <= ctSz) {
9635
                WOLFSSL_MSG("Invalid ciphertext size.");
9636
                ret = BAD_FUNC_ARG;
9637
            }
9638
        }
9639
        if (ret == 0) {
9640
            pqc_kse->keLen = ctSz;
9641
            pqc_kse->ke = (byte*)XMALLOC(pqc_kse->keLen, ssl->heap,
9642
                                         DYNAMIC_TYPE_PUBLIC_KEY);
9643
            if (pqc_kse->ke == NULL) {
9644
                WOLFSSL_MSG("pqc_kse memory allocation failure");
9645
                ret = MEMORY_ERROR;
9646
            }
9647
            /* Copy the PQC KEM ciphertext. Depending on the pqc_first flag,
9648
             * the KEM ciphertext comes before or after the ECDH public key. */
9649
            if (ret == 0) {
9650
                int offset = keyShareEntry->keLen - ctSz;
9651
9652
                if (pqc_first)
9653
                    offset = 0;
9654
9655
                XMEMCPY(pqc_kse->ke, keyShareEntry->ke + offset, ctSz);
9656
            }
9657
        }
9658
    }
9659
9660
    if (ret == 0) {
9661
        ecc_kse->group = ecc_group;
9662
        ecc_kse->keLen = keyShareEntry->keLen - ctSz;
9663
        ecc_kse->key = keyShareEntry->key;
9664
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
9665
                                        DYNAMIC_TYPE_PUBLIC_KEY);
9666
        if (ecc_kse->ke == NULL) {
9667
            WOLFSSL_MSG("ecc_kse memory allocation failure");
9668
            ret = MEMORY_ERROR;
9669
        }
9670
        /* Copy the ECDH public key. Depending on the pqc_first flag, the
9671
         * KEM ciphertext comes before or after the ECDH public key. */
9672
        if (ret == 0) {
9673
            int offset = 0;
9674
9675
            if (pqc_first)
9676
                offset = ctSz;
9677
9678
            XMEMCPY(ecc_kse->ke, keyShareEntry->ke + offset, ecc_kse->keLen);
9679
        }
9680
    }
9681
9682
    /* Process ECDH key share part. The generated shared secret is directly
9683
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
9684
     * pqc_first flag, the ECDH shared secret part goes before or after the
9685
     * KEM part. */
9686
    if (ret == 0) {
9687
        int offset = 0;
9688
9689
        /* Set the ECC size variable to the initial buffer size */
9690
        ssSzEcc = ssl->arrays->preMasterSz;
9691
9692
        if (pqc_first)
9693
            offset = ssSzPqc;
9694
9695
    #ifdef HAVE_CURVE25519
9696
        if (ecc_group == WOLFSSL_ECC_X25519) {
9697
            ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
9698
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9699
        }
9700
        else
9701
    #endif
9702
    #ifdef HAVE_CURVE448
9703
        if (ecc_group == WOLFSSL_ECC_X448) {
9704
            ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
9705
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9706
        }
9707
        else
9708
    #endif
9709
        {
9710
            ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
9711
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9712
        }
9713
    }
9714
9715
    if (ret == 0) {
9716
        keyShareEntry->key = ecc_kse->key;
9717
9718
        if ((ret == 0) && ((ssSzEcc + ssSzPqc) > ENCRYPT_LEN)) {
9719
            WOLFSSL_MSG("shared secret is too long.");
9720
            ret = LENGTH_ERROR;
9721
        }
9722
    }
9723
9724
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
9725
     * KEM shared secret part goes before or after the ECDH part. */
9726
    if (ret == 0) {
9727
        int offset = ssSzEcc;
9728
9729
        if (pqc_first)
9730
            offset = 0;
9731
9732
        ret = TLSX_KeyShare_ProcessPqcClient_ex(ssl, pqc_kse,
9733
                ssl->arrays->preMasterSecret + offset, &ssSzPqc);
9734
    }
9735
9736
    if (ret == 0) {
9737
        keyShareEntry->privKey = (byte*)pqc_kse->key;
9738
9739
        ssl->arrays->preMasterSz = ssSzEcc + ssSzPqc;
9740
    }
9741
9742
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
9743
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
9744
9745
    return ret;
9746
}
9747
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_DECAPSULATE */
9748
9749
/* Process the key share extension on the client side.
9750
 *
9751
 * ssl            The SSL/TLS object.
9752
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9753
 * returns 0 on success and other values indicate failure.
9754
 */
9755
static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9756
{
9757
    int ret;
9758
9759
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
9760
    keyShareEntry->session = ssl->session->namedGroup;
9761
    ssl->session->namedGroup = keyShareEntry->group;
9762
#endif
9763
    /* reset the pre master secret size */
9764
    if (ssl->arrays->preMasterSz == 0)
9765
        ssl->arrays->preMasterSz = ENCRYPT_LEN;
9766
9767
    /* Use Key Share Data from server. */
9768
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(keyShareEntry->group))
9769
        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
9770
    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
9771
        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
9772
    else if (keyShareEntry->group == WOLFSSL_ECC_X448)
9773
        ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
9774
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9775
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group))
9776
        ret = TLSX_KeyShare_ProcessPqcClient(ssl, keyShareEntry);
9777
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(keyShareEntry->group))
9778
        ret = TLSX_KeyShare_ProcessPqcHybridClient(ssl, keyShareEntry);
9779
#endif
9780
    else
9781
        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
9782
9783
#ifdef WOLFSSL_DEBUG_TLS
9784
    if (ret == 0) {
9785
        WOLFSSL_MSG("KE Secret");
9786
        WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9787
    }
9788
#endif
9789
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
9790
    keyShareEntry->derived = (ret == 0);
9791
#endif
9792
#ifdef WOLFSSL_ASYNC_CRYPT
9793
    keyShareEntry->lastRet = ret;
9794
#endif
9795
9796
    return ret;
9797
}
9798
9799
/* Parse an entry of the KeyShare extension.
9800
 *
9801
 * ssl     The SSL/TLS object.
9802
 * input   The extension data.
9803
 * length  The length of the extension data.
9804
 * kse     The new key share entry object.
9805
 * returns a positive number to indicate amount of data parsed and a negative
9806
 * number on error.
9807
 */
9808
static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
9809
            word16 length, KeyShareEntry **kse, word16* seenGroups,
9810
            int* seenGroupsCnt, TLSX** extensions)
9811
1.88k
{
9812
1.88k
    int    ret;
9813
1.88k
    word16 group;
9814
1.88k
    word16 keLen;
9815
1.88k
    int    offset = 0;
9816
1.88k
    byte*  ke;
9817
1.88k
    int    i;
9818
9819
1.88k
    if (length < OPAQUE16_LEN + OPAQUE16_LEN)
9820
9
        return BUFFER_ERROR;
9821
    /* Named group */
9822
1.87k
    ato16(&input[offset], &group);
9823
1.87k
    offset += OPAQUE16_LEN;
9824
    /* Key exchange data - public key. */
9825
1.87k
    ato16(&input[offset], &keLen);
9826
1.87k
    offset += OPAQUE16_LEN;
9827
1.87k
    if (keLen == 0)
9828
5
        return INVALID_PARAMETER;
9829
1.86k
    if (keLen > length - offset)
9830
60
        return BUFFER_ERROR;
9831
9832
1.80k
    if (seenGroups != NULL) {
9833
1.62k
        if (*seenGroupsCnt >= MAX_KEYSHARE_NAMED_GROUPS) {
9834
1
            return BAD_KEY_SHARE_DATA;
9835
1
        }
9836
2.03k
        for (i = 0; i < *seenGroupsCnt; i++) {
9837
418
            if (seenGroups[i] == group) {
9838
8
                return BAD_KEY_SHARE_DATA;
9839
8
            }
9840
418
        }
9841
1.61k
        seenGroups[i] = group;
9842
1.61k
        *seenGroupsCnt = i + 1;
9843
1.61k
    }
9844
9845
#ifdef WOLFSSL_HAVE_MLKEM
9846
    if ((WOLFSSL_NAMED_GROUP_IS_PQC(group) ||
9847
         WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) &&
9848
        ssl->options.side == WOLFSSL_SERVER_END) {
9849
        /* When handling a key share containing a KEM public key on the server
9850
         * end, we have to perform the encapsulation immediately in order to
9851
         * send the resulting ciphertext back to the client in the ServerHello
9852
         * message. As the public key is not stored and we do not modify it, we
9853
         * don't have to create a copy of it.
9854
         * In case of a hybrid key exchange, the ECDH part is also performed
9855
         * immediately (to not split the generation of the master secret).
9856
         * Hence, we also don't have to store this public key either.  */
9857
        ke = (byte *)&input[offset];
9858
    } else
9859
#endif
9860
1.79k
    {
9861
        /* Store a copy in the key share object. */
9862
1.79k
        ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9863
1.79k
        if (ke == NULL)
9864
9
            return MEMORY_E;
9865
1.78k
        XMEMCPY(ke, &input[offset], keLen);
9866
1.78k
    }
9867
9868
    /* Populate a key share object in the extension. */
9869
0
    ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
9870
1.78k
    if (ret != 0) {
9871
8
        if (ke != &input[offset]) {
9872
8
            XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9873
8
        }
9874
8
        return ret;
9875
8
    }
9876
9877
    /* Total length of the parsed data. */
9878
1.78k
    return offset + keLen;
9879
1.78k
}
9880
9881
/* Searches the groups sent for the specified named group.
9882
 *
9883
 * ssl    SSL/TLS object.
9884
 * name   Group name to match.
9885
 * returns 1 when the extension has the group name and 0 otherwise.
9886
 */
9887
static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
9888
270
{
9889
270
    TLSX*          extension;
9890
270
    KeyShareEntry* list;
9891
9892
270
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
9893
270
    if (extension == NULL) {
9894
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
9895
0
        if (extension == NULL)
9896
0
            return 0;
9897
0
    }
9898
9899
270
    list = (KeyShareEntry*)extension->data;
9900
335
    while (list != NULL) {
9901
270
        if (list->group == group)
9902
205
            return 1;
9903
65
        list = list->next;
9904
65
    }
9905
9906
65
    return 0;
9907
270
}
9908
9909
9910
/* Searches the supported groups extension for the specified named group.
9911
 *
9912
 * ssl   The SSL/TLS object.
9913
 * name  The group name to match.
9914
 * returns 1 when the extension has the group name and 0 otherwise.
9915
 */
9916
static int TLSX_SupportedGroups_Find(const WOLFSSL* ssl, word16 name,
9917
                                     TLSX* extensions)
9918
1.50k
{
9919
1.50k
#ifdef HAVE_SUPPORTED_CURVES
9920
1.50k
    TLSX*          extension;
9921
1.50k
    SupportedCurve* curve = NULL;
9922
9923
1.50k
    if ((extension = TLSX_Find(extensions, TLSX_SUPPORTED_GROUPS)) == NULL) {
9924
14
        if ((extension = TLSX_Find(ssl->ctx->extensions,
9925
14
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
9926
14
            return 0;
9927
14
        }
9928
14
    }
9929
9930
3.72k
    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
9931
3.49k
        if (curve->name == name)
9932
1.25k
            return 1;
9933
3.49k
    }
9934
236
#endif
9935
9936
236
    (void)ssl;
9937
236
    (void)name;
9938
9939
236
    return 0;
9940
1.49k
}
9941
9942
int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl,
9943
        const byte* input, word16 length, TLSX** extensions)
9944
1.51k
{
9945
1.51k
    int ret;
9946
1.51k
    int    offset = 0;
9947
1.51k
    word16 len;
9948
1.51k
    TLSX*  extension;
9949
1.51k
    word16 seenGroups[MAX_KEYSHARE_NAMED_GROUPS];
9950
1.51k
    int    seenGroupsCnt = 0;
9951
9952
    /* Add a KeyShare extension if it doesn't exist even if peer sent no
9953
     * entries. The presence of this extension signals that the peer can be
9954
     * negotiated with. */
9955
1.51k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
9956
1.51k
    if (extension == NULL) {
9957
        /* Push new KeyShare extension. */
9958
1.50k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
9959
1.50k
        if (ret != 0)
9960
11
            return ret;
9961
1.50k
    }
9962
9963
1.50k
    if (length < OPAQUE16_LEN)
9964
3
        return BUFFER_ERROR;
9965
9966
    /* ClientHello contains zero or more key share entries. */
9967
1.49k
    ato16(input, &len);
9968
1.49k
    if (len != length - OPAQUE16_LEN)
9969
40
        return BUFFER_ERROR;
9970
1.45k
    offset += OPAQUE16_LEN;
9971
9972
3.05k
    while (offset < (int)length) {
9973
1.67k
        ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset],
9974
1.67k
                length - (word16)offset, NULL, seenGroups, &seenGroupsCnt,
9975
1.67k
                extensions);
9976
1.67k
        if (ret < 0)
9977
81
            return ret;
9978
9979
1.59k
        offset += ret;
9980
1.59k
    }
9981
9982
1.37k
    if (ssl->hrr_keyshare_group != 0) {
9983
        /*
9984
         * https://datatracker.ietf.org/doc/html/rfc8446#section-4.2.8
9985
         *   when sending the new ClientHello, the client MUST
9986
         *   replace the original "key_share" extension with one containing only a
9987
         *   new KeyShareEntry for the group indicated in the selected_group field
9988
         *   of the triggering HelloRetryRequest
9989
         */
9990
2
        if (seenGroupsCnt != 1 || seenGroups[0] != ssl->hrr_keyshare_group) {
9991
2
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
9992
2
            return BAD_KEY_SHARE_DATA;
9993
2
        }
9994
2
    }
9995
9996
1.37k
    return 0;
9997
1.37k
}
9998
9999
/* Parse the KeyShare extension.
10000
 * Different formats in different messages.
10001
 *
10002
 * ssl      The SSL/TLS object.
10003
 * input    The extension data.
10004
 * length   The length of the extension data.
10005
 * msgType  The type of the message this extension is being parsed from.
10006
 * returns 0 on success and other values indicate failure.
10007
 */
10008
int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10009
                               byte msgType)
10010
1.78k
{
10011
1.78k
    int ret = 0;
10012
1.78k
    KeyShareEntry *keyShareEntry = NULL;
10013
1.78k
    word16 group;
10014
10015
1.78k
    if (msgType == client_hello) {
10016
1.51k
        ret = TLSX_KeyShare_Parse_ClientHello(ssl, input, length,
10017
1.51k
                                              &ssl->extensions);
10018
1.51k
    }
10019
276
    else if (msgType == server_hello) {
10020
216
        int len;
10021
10022
216
        if (length < OPAQUE16_LEN)
10023
1
            return BUFFER_ERROR;
10024
10025
        /* The data is the named group the server wants to use. */
10026
215
        ato16(input, &group);
10027
10028
        /* Check the selected group was supported by ClientHello extensions. */
10029
215
        if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10030
3
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10031
3
            return BAD_KEY_SHARE_DATA;
10032
3
        }
10033
10034
        /* Check if the group was sent. */
10035
212
        if (!TLSX_KeyShare_Find(ssl, group)) {
10036
8
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10037
8
            return BAD_KEY_SHARE_DATA;
10038
8
        }
10039
10040
        /* ServerHello contains one key share entry. */
10041
204
        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry, NULL,
10042
204
                NULL, &ssl->extensions);
10043
204
        if (len != (int)length)
10044
26
            return BUFFER_ERROR;
10045
10046
        /* Not in list sent if there isn't a private key. */
10047
178
        if (keyShareEntry == NULL || (keyShareEntry->key == NULL
10048
0
        #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
10049
0
            && keyShareEntry->privKey == NULL
10050
178
        #endif
10051
178
        )) {
10052
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10053
0
            return BAD_KEY_SHARE_DATA;
10054
0
        }
10055
10056
        /* Process the entry to calculate the secret. */
10057
178
        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
10058
178
        if (ret == 0)
10059
176
            ssl->session->namedGroup = ssl->namedGroup = group;
10060
178
    }
10061
60
    else if (msgType == hello_retry_request) {
10062
60
        if (length != OPAQUE16_LEN)
10063
1
            return BUFFER_ERROR;
10064
10065
59
        ssl->options.hrrSentKeyShare = 1;
10066
10067
        /* The data is the named group the server wants to use. */
10068
59
        ato16(input, &group);
10069
10070
    #ifdef WOLFSSL_ASYNC_CRYPT
10071
        /* only perform find and clear TLSX if not returning from async */
10072
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
10073
    #endif
10074
59
        {
10075
            /* Check the selected group was supported by ClientHello extensions.
10076
             */
10077
59
            if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10078
1
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10079
1
                return BAD_KEY_SHARE_DATA;
10080
1
            }
10081
10082
            /* Make sure KeyShare for server requested group was not sent in
10083
             * ClientHello. */
10084
58
            if (TLSX_KeyShare_Find(ssl, group)) {
10085
1
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10086
1
                return BAD_KEY_SHARE_DATA;
10087
1
            }
10088
10089
            /* Clear out unusable key shares. */
10090
57
            ret = TLSX_KeyShare_Empty(ssl);
10091
57
            if (ret != 0)
10092
0
                return ret;
10093
57
        }
10094
10095
57
        ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
10096
57
        if (ret == 0)
10097
50
            ssl->session->namedGroup = ssl->namedGroup = group;
10098
57
    }
10099
0
    else {
10100
        /* Not a message type that is allowed to have this extension. */
10101
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10102
0
        return SANITY_MSG_E;
10103
0
    }
10104
10105
1.74k
    return ret;
10106
1.78k
}
10107
10108
/* Create a new key share entry and put it into the list.
10109
 *
10110
 * list           The linked list of key share entries.
10111
 * group          The named group.
10112
 * heap           The memory to allocate with.
10113
 * keyShareEntry  The new key share entry object.
10114
 * returns 0 on success and other values indicate failure.
10115
 */
10116
static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
10117
                             KeyShareEntry** keyShareEntry)
10118
5.98k
{
10119
5.98k
    KeyShareEntry* kse;
10120
5.98k
    KeyShareEntry** next;
10121
10122
5.98k
    kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
10123
5.98k
                                  DYNAMIC_TYPE_TLSX);
10124
5.98k
    if (kse == NULL)
10125
25
        return MEMORY_E;
10126
10127
5.95k
    XMEMSET(kse, 0, sizeof(*kse));
10128
5.95k
    kse->group = (word16)group;
10129
10130
    /* Add it to the back and maintain the links. */
10131
6.34k
    while (*list != NULL) {
10132
        /* Assign to temporary to work around compiler bug found by customer. */
10133
383
        next = &((*list)->next);
10134
383
        list = next;
10135
383
    }
10136
5.95k
    *list = kse;
10137
5.95k
    *keyShareEntry = kse;
10138
10139
5.95k
    (void)heap;
10140
10141
5.95k
    return 0;
10142
5.98k
}
10143
10144
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
10145
/* Process the Kyber key share extension on the server side.
10146
 *
10147
 * ssl            The SSL/TLS object.
10148
 * keyShareEntry  The key share entry object to be sent to the client.
10149
 * data           The key share data received from the client.
10150
 * len            The length of the key share data from the client.
10151
 * ssOutput       The destination buffer for the shared secret.
10152
 * ssOutSz        The size of the generated shared secret.
10153
 *
10154
 * returns 0 on success and other values indicate failure.
10155
 */
10156
static int TLSX_KeyShare_HandlePqcKeyServer(WOLFSSL* ssl,
10157
    KeyShareEntry* keyShareEntry, byte* clientData, word16 clientLen,
10158
    unsigned char* ssOutput, word32* ssOutSz)
10159
{
10160
    /* We are on the server side. The key share contains a PQC KEM public key
10161
     * that we are using for an encapsulate operation. The resulting ciphertext
10162
     * is stored in the server key share. */
10163
    KyberKey* kemKey = (KyberKey*)keyShareEntry->key;
10164
    byte* ciphertext = NULL;
10165
    int ret = 0;
10166
    word32 pubSz = 0;
10167
    word32 ctSz = 0;
10168
    word32 ssSz = 0;
10169
10170
    if (clientData == NULL) {
10171
        WOLFSSL_MSG("No KEM public key from the client.");
10172
        return BAD_FUNC_ARG;
10173
    }
10174
10175
    if (kemKey == NULL) {
10176
        int type = 0;
10177
10178
        /* Allocate a Kyber key to hold private key. */
10179
        kemKey = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
10180
                                     DYNAMIC_TYPE_PRIVATE_KEY);
10181
        if (kemKey == NULL) {
10182
            WOLFSSL_MSG("GenPqcKey memory error");
10183
            ret = MEMORY_E;
10184
        }
10185
        if (ret == 0) {
10186
            ret = mlkem_id2type(keyShareEntry->group, &type);
10187
        }
10188
        if (ret != 0) {
10189
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10190
            ret = BAD_FUNC_ARG;
10191
        }
10192
        if (ret == 0) {
10193
            ret = wc_KyberKey_Init(type, kemKey, ssl->heap, ssl->devId);
10194
            if (ret != 0) {
10195
                WOLFSSL_MSG("Error creating Kyber KEM");
10196
            }
10197
        }
10198
    }
10199
10200
    if (ret == 0) {
10201
        ret = wc_KyberKey_PublicKeySize(kemKey, &pubSz);
10202
    }
10203
    if (ret == 0) {
10204
        ret = wc_KyberKey_CipherTextSize(kemKey, &ctSz);
10205
    }
10206
    if (ret == 0) {
10207
        ret = wc_KyberKey_SharedSecretSize(kemKey, &ssSz);
10208
    }
10209
10210
    if (ret == 0 && clientLen != pubSz) {
10211
        WOLFSSL_MSG("Invalid public key.");
10212
        ret = BAD_FUNC_ARG;
10213
    }
10214
10215
    if (ret == 0) {
10216
        ciphertext = (byte*)XMALLOC(ctSz, ssl->heap, DYNAMIC_TYPE_TLSX);
10217
10218
        if (ciphertext == NULL) {
10219
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10220
            ret = MEMORY_E;
10221
        }
10222
    }
10223
10224
    if (ret == 0) {
10225
        ret = wc_KyberKey_DecodePublicKey(kemKey, clientData, pubSz);
10226
    }
10227
    if (ret == 0) {
10228
        ret = wc_KyberKey_Encapsulate(kemKey, ciphertext,
10229
                                      ssOutput, ssl->rng);
10230
        if (ret != 0) {
10231
            WOLFSSL_MSG("wc_KyberKey encapsulation failure.");
10232
        }
10233
    }
10234
10235
    if (ret == 0) {
10236
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10237
10238
        *ssOutSz = ssSz;
10239
        keyShareEntry->ke = NULL;
10240
        keyShareEntry->keLen = 0;
10241
10242
        keyShareEntry->pubKey = ciphertext;
10243
        keyShareEntry->pubKeyLen = ctSz;
10244
        ciphertext = NULL;
10245
10246
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
10247
         * the server side. */
10248
        ssl->namedGroup = keyShareEntry->group;
10249
    }
10250
10251
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
10252
10253
    wc_KyberKey_Free(kemKey);
10254
    XFREE(kemKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10255
    keyShareEntry->key = NULL;
10256
    return ret;
10257
}
10258
10259
static int TLSX_KeyShare_HandlePqcHybridKeyServer(WOLFSSL* ssl,
10260
    KeyShareEntry* keyShareEntry, byte* data, word16 len)
10261
{
10262
    /* I am the server. The data parameter is the concatenation of the client's
10263
     * ECDH public key and the KEM public key. I need to generate a matching
10264
     * public key for ECDH and encapsulate a shared secret using the KEM public
10265
     * key. We send the ECDH public key and the KEM ciphertext back to the
10266
     * client. Additionally, we create the ECDH shared secret here already.
10267
     */
10268
    int    type;
10269
    byte*  ciphertext = NULL;
10270
    int    ret = 0;
10271
    int    pqc_group = 0;
10272
    int    ecc_group = 0;
10273
    int    pqc_first = 0;
10274
    KeyShareEntry *ecc_kse = NULL;
10275
    KeyShareEntry *pqc_kse = NULL;
10276
    word32 pubSz = 0;
10277
    word32 ctSz = 0;
10278
    word32 ssSzPqc = 0;
10279
    word32 ssSzEcc = 0;
10280
10281
    if (data == NULL) {
10282
        WOLFSSL_MSG("No hybrid key share data from the client.");
10283
        return BAD_FUNC_ARG;
10284
    }
10285
10286
    /* Determine the ECC and PQC group of the hybrid combination */
10287
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
10288
    if (ecc_group == 0 || pqc_group == 0) {
10289
        WOLFSSL_MSG("Invalid hybrid group");
10290
        ret = BAD_FUNC_ARG;
10291
    }
10292
10293
    if (ret == 0) {
10294
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
10295
                   DYNAMIC_TYPE_TLSX);
10296
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
10297
                   DYNAMIC_TYPE_TLSX);
10298
        if (ecc_kse == NULL || pqc_kse == NULL) {
10299
            WOLFSSL_MSG("kse memory allocation failure");
10300
            ret = MEMORY_ERROR;
10301
        }
10302
    }
10303
10304
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
10305
     * decode these sizes to properly concatenate the KEM ciphertext with the
10306
     * ECDH public key. */
10307
    if (ret == 0) {
10308
        XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
10309
        pqc_kse->group = pqc_group;
10310
10311
        /* Allocate a Kyber key to hold private key. */
10312
        pqc_kse->key = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
10313
                                           DYNAMIC_TYPE_PRIVATE_KEY);
10314
        if (pqc_kse->key == NULL) {
10315
            WOLFSSL_MSG("GenPqcKey memory error");
10316
            ret = MEMORY_E;
10317
        }
10318
        if (ret == 0) {
10319
            ret = mlkem_id2type(pqc_kse->group, &type);
10320
        }
10321
        if (ret != 0) {
10322
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10323
            ret = BAD_FUNC_ARG;
10324
        }
10325
        if (ret == 0) {
10326
            ret = wc_KyberKey_Init(type, (KyberKey*)pqc_kse->key,
10327
                                   ssl->heap, ssl->devId);
10328
            if (ret != 0) {
10329
                WOLFSSL_MSG("Error creating Kyber KEM");
10330
            }
10331
        }
10332
        if (ret == 0) {
10333
            ret = wc_KyberKey_SharedSecretSize((KyberKey*)pqc_kse->key,
10334
                                               &ssSzPqc);
10335
        }
10336
        if (ret == 0) {
10337
            ret = wc_KyberKey_CipherTextSize((KyberKey*)pqc_kse->key,
10338
                                             &ctSz);
10339
        }
10340
        if (ret == 0) {
10341
            ret = wc_KyberKey_PublicKeySize((KyberKey*)pqc_kse->key,
10342
                                            &pubSz);
10343
        }
10344
    }
10345
10346
    /* Generate the ECDH key share part to be sent to the client */
10347
    if (ret == 0 && ecc_group != 0) {
10348
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
10349
        ecc_kse->group = ecc_group;
10350
    #ifdef HAVE_CURVE25519
10351
        if (ecc_group == WOLFSSL_ECC_X25519) {
10352
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
10353
        }
10354
        else
10355
    #endif
10356
    #ifdef HAVE_CURVE448
10357
        if (ecc_group == WOLFSSL_ECC_X448) {
10358
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
10359
        }
10360
        else
10361
    #endif
10362
        {
10363
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
10364
        }
10365
        /* No error message, TLSX_KeyShare_GenKey will do it. */
10366
    }
10367
10368
    if (ret == 0 && len != pubSz + ecc_kse->pubKeyLen) {
10369
        WOLFSSL_MSG("Invalid public key.");
10370
        ret = BAD_FUNC_ARG;
10371
    }
10372
10373
    /* Allocate buffer for the concatenated client key share data
10374
     * (PQC KEM ciphertext + ECDH public key) */
10375
    if (ret == 0) {
10376
        ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap,
10377
            DYNAMIC_TYPE_TLSX);
10378
10379
        if (ciphertext == NULL) {
10380
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10381
            ret = MEMORY_E;
10382
        }
10383
    }
10384
10385
    /* Process ECDH key share part. The generated shared secret is directly
10386
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
10387
     * pqc_first flag, the ECDH shared secret part goes before or after the
10388
     * KEM part. */
10389
    if (ret == 0) {
10390
        ecc_kse->keLen = len - pubSz;
10391
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
10392
                                     DYNAMIC_TYPE_PUBLIC_KEY);
10393
        if (ecc_kse->ke == NULL) {
10394
            WOLFSSL_MSG("ecc_kse memory allocation failure");
10395
            ret = MEMORY_ERROR;
10396
        }
10397
        if (ret == 0) {
10398
            int pubOffset = 0;
10399
            int ssOffset = 0;
10400
10401
            /* Set the ECC size variable to the initial buffer size */
10402
            ssSzEcc = ssl->arrays->preMasterSz;
10403
10404
            if (pqc_first) {
10405
                pubOffset = pubSz;
10406
                ssOffset = ssSzPqc;
10407
            }
10408
10409
            XMEMCPY(ecc_kse->ke, data + pubOffset, ecc_kse->keLen);
10410
10411
        #ifdef HAVE_CURVE25519
10412
            if (ecc_group == WOLFSSL_ECC_X25519) {
10413
                ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
10414
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10415
            }
10416
            else
10417
        #endif
10418
        #ifdef HAVE_CURVE448
10419
            if (ecc_group == WOLFSSL_ECC_X448) {
10420
                ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
10421
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10422
            }
10423
            else
10424
        #endif
10425
            {
10426
                ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
10427
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10428
            }
10429
        }
10430
        if (ret == 0) {
10431
            if (ssSzEcc != ecc_kse->keyLen) {
10432
                WOLFSSL_MSG("Data length mismatch.");
10433
                ret = BAD_FUNC_ARG;
10434
            }
10435
        }
10436
    }
10437
10438
    if (ret == 0 && ssSzEcc + ssSzPqc > ENCRYPT_LEN) {
10439
        WOLFSSL_MSG("shared secret is too long.");
10440
        ret = LENGTH_ERROR;
10441
    }
10442
10443
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
10444
     * KEM shared secret part goes before or after the ECDH part. */
10445
    if (ret == 0) {
10446
        int input_offset = ecc_kse->keLen;
10447
        int output_offset = ssSzEcc;
10448
10449
        if (pqc_first) {
10450
            input_offset = 0;
10451
            output_offset = 0;
10452
        }
10453
10454
        ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, pqc_kse,
10455
                data + input_offset, pubSz,
10456
                ssl->arrays->preMasterSecret + output_offset, &ssSzPqc);
10457
    }
10458
10459
    if (ret == 0) {
10460
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10461
10462
        ssl->arrays->preMasterSz = ssSzEcc + ssSzPqc;
10463
        keyShareEntry->ke = NULL;
10464
        keyShareEntry->keLen = 0;
10465
10466
        /* Concatenate the ECDH public key and the PQC KEM ciphertext. Based on
10467
         * the pqc_first flag, the ECDH public key goes before or after the KEM
10468
         * ciphertext. */
10469
        if (pqc_first) {
10470
            XMEMCPY(ciphertext, pqc_kse->pubKey, ctSz);
10471
            XMEMCPY(ciphertext + ctSz, ecc_kse->pubKey, ecc_kse->pubKeyLen);
10472
        }
10473
        else {
10474
            XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen);
10475
            XMEMCPY(ciphertext + ecc_kse->pubKeyLen, pqc_kse->pubKey, ctSz);
10476
        }
10477
10478
        keyShareEntry->pubKey = ciphertext;
10479
        keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen + ctSz;
10480
        ciphertext = NULL;
10481
10482
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
10483
         * the server side. */
10484
        ssl->namedGroup = keyShareEntry->group;
10485
    }
10486
10487
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
10488
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
10489
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
10490
    return ret;
10491
}
10492
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_ENCAPSULATE */
10493
10494
/* Use the data to create a new key share object in the extensions.
10495
 *
10496
 * ssl    The SSL/TLS object.
10497
 * group  The named group.
10498
 * len    The length of the public key data.
10499
 * data   The public key data.
10500
 * kse    The new key share entry object.
10501
 * returns 0 on success and other values indicate failure.
10502
 */
10503
int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
10504
                      KeyShareEntry **kse, TLSX** extensions)
10505
5.09k
{
10506
5.09k
    int            ret = 0;
10507
5.09k
    TLSX*          extension;
10508
5.09k
    KeyShareEntry* keyShareEntry = NULL;
10509
10510
    /* Find the KeyShare extension if it exists. */
10511
5.09k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10512
5.09k
    if (extension == NULL) {
10513
        /* Push new KeyShare extension. */
10514
3.22k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10515
3.22k
        if (ret != 0)
10516
1
            return ret;
10517
10518
3.22k
        extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10519
3.22k
        if (extension == NULL)
10520
0
            return MEMORY_E;
10521
3.22k
    }
10522
5.09k
    extension->resp = 0;
10523
10524
    /* Try to find the key share entry with this group. */
10525
5.09k
    keyShareEntry = (KeyShareEntry*)extension->data;
10526
5.48k
    while (keyShareEntry != NULL) {
10527
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
10528
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
10529
                keyShareEntry->group == WOLFSSL_SECP256R1MLKEM512) ||
10530
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
10531
                keyShareEntry->group == WOLFSSL_SECP384R1MLKEM768) ||
10532
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
10533
                keyShareEntry->group == WOLFSSL_SECP521R1MLKEM1024)) {
10534
            keyShareEntry->group = group;
10535
            break;
10536
        }
10537
        else
10538
#endif
10539
599
        if (keyShareEntry->group == group)
10540
208
            break;
10541
391
        keyShareEntry = keyShareEntry->next;
10542
391
    }
10543
10544
    /* Create a new key share entry if not found. */
10545
5.09k
    if (keyShareEntry == NULL) {
10546
4.88k
        ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
10547
4.88k
                                ssl->heap, &keyShareEntry);
10548
4.88k
        if (ret != 0)
10549
9
            return ret;
10550
4.88k
    }
10551
10552
10553
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
10554
    if (ssl->options.side == WOLFSSL_SERVER_END &&
10555
            WOLFSSL_NAMED_GROUP_IS_PQC(group)) {
10556
        ret = TLSX_KeyShare_HandlePqcKeyServer((WOLFSSL*)ssl,
10557
                                               keyShareEntry,
10558
                                               data, len,
10559
                                               ssl->arrays->preMasterSecret,
10560
                                               &ssl->arrays->preMasterSz);
10561
        if (ret != 0)
10562
            return ret;
10563
    }
10564
    else if (ssl->options.side == WOLFSSL_SERVER_END &&
10565
             WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) {
10566
        ret = TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
10567
                                                     keyShareEntry,
10568
                                                     data, len);
10569
        if (ret != 0)
10570
            return ret;
10571
    }
10572
    else
10573
#endif
10574
5.08k
    if (data != NULL) {
10575
1.78k
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10576
1.78k
        keyShareEntry->ke = data;
10577
1.78k
        keyShareEntry->keLen = len;
10578
1.78k
    }
10579
3.30k
    else {
10580
        /* Generate a key pair. Casting to non-const since changes inside are
10581
         * minimal but would require an extensive redesign to refactor. Also
10582
         * this path shouldn't be taken when parsing a ClientHello in stateless
10583
         * mode. */
10584
3.30k
        ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, keyShareEntry);
10585
3.30k
        if (ret != 0)
10586
477
            return ret;
10587
3.30k
    }
10588
10589
4.61k
    if (kse != NULL)
10590
185
        *kse = keyShareEntry;
10591
10592
4.61k
    return 0;
10593
5.08k
}
10594
10595
/* Set an empty Key Share extension.
10596
 *
10597
 * ssl  The SSL/TLS object.
10598
 * returns 0 on success and other values indicate failure.
10599
 */
10600
int TLSX_KeyShare_Empty(WOLFSSL* ssl)
10601
57
{
10602
57
    int   ret = 0;
10603
57
    TLSX* extension;
10604
10605
    /* Find the KeyShare extension if it exists. */
10606
57
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
10607
57
    if (extension == NULL) {
10608
        /* Push new KeyShare extension. */
10609
0
        ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10610
0
    }
10611
57
    else if (extension->data != NULL) {
10612
57
        TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
10613
57
        extension->data = NULL;
10614
57
    }
10615
10616
57
    return ret;
10617
57
}
10618
10619
static const word16 preferredGroup[] = {
10620
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
10621
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256
10622
    WOLFSSL_ECC_SECP256R1,
10623
#if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
10624
    WOLFSSL_ECC_SM2P256V1,
10625
#endif
10626
#endif
10627
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10628
    WOLFSSL_ECC_X25519,
10629
#endif
10630
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10631
    WOLFSSL_ECC_X448,
10632
#endif
10633
#if defined(HAVE_ECC) && (!defined(NO_ECC384) || \
10634
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384
10635
    WOLFSSL_ECC_SECP384R1,
10636
#endif
10637
#if defined(HAVE_ECC) && (!defined(NO_ECC521) || \
10638
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
10639
    WOLFSSL_ECC_SECP521R1,
10640
#endif
10641
#if defined(HAVE_FFDHE_2048)
10642
    WOLFSSL_FFDHE_2048,
10643
#endif
10644
#if defined(HAVE_FFDHE_3072)
10645
    WOLFSSL_FFDHE_3072,
10646
#endif
10647
#if defined(HAVE_FFDHE_4096)
10648
    WOLFSSL_FFDHE_4096,
10649
#endif
10650
#if defined(HAVE_FFDHE_6144)
10651
    WOLFSSL_FFDHE_6144,
10652
#endif
10653
#if defined(HAVE_FFDHE_8192)
10654
    WOLFSSL_FFDHE_8192,
10655
#endif
10656
#ifndef WOLFSSL_NO_ML_KEM
10657
#ifdef WOLFSSL_WC_MLKEM
10658
    #ifndef WOLFSSL_NO_ML_KEM_512
10659
    WOLFSSL_ML_KEM_512,
10660
    WOLFSSL_SECP256R1MLKEM512,
10661
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10662
    WOLFSSL_X25519MLKEM512,
10663
    #endif
10664
    #endif
10665
    #ifndef WOLFSSL_NO_ML_KEM_768
10666
    WOLFSSL_ML_KEM_768,
10667
    WOLFSSL_SECP384R1MLKEM768,
10668
    WOLFSSL_SECP256R1MLKEM768,
10669
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10670
    WOLFSSL_X25519MLKEM768,
10671
    #endif
10672
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10673
    WOLFSSL_X448MLKEM768,
10674
    #endif
10675
    #endif
10676
    #ifndef WOLFSSL_NO_ML_KEM_1024
10677
    WOLFSSL_ML_KEM_1024,
10678
    WOLFSSL_SECP521R1MLKEM1024,
10679
    WOLFSSL_SECP384R1MLKEM1024,
10680
    #endif
10681
#elif defined(HAVE_LIBOQS)
10682
    /* These require a runtime call to TLSX_IsGroupSupported to use */
10683
    WOLFSSL_ML_KEM_512,
10684
    WOLFSSL_ML_KEM_768,
10685
    WOLFSSL_ML_KEM_1024,
10686
    WOLFSSL_SECP256R1MLKEM512,
10687
    WOLFSSL_SECP384R1MLKEM768,
10688
    WOLFSSL_SECP256R1MLKEM768,
10689
    WOLFSSL_SECP521R1MLKEM1024,
10690
    WOLFSSL_SECP384R1MLKEM1024,
10691
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10692
    WOLFSSL_X25519MLKEM512,
10693
    WOLFSSL_X25519MLKEM768,
10694
    #endif
10695
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10696
    WOLFSSL_X448MLKEM768,
10697
    #endif
10698
#endif
10699
#endif /* !WOLFSSL_NO_ML_KEM */
10700
#ifdef WOLFSSL_MLKEM_KYBER
10701
#ifdef WOLFSSL_WC_MLKEM
10702
    #ifdef WOLFSSL_KYBER512
10703
    WOLFSSL_KYBER_LEVEL1,
10704
    WOLFSSL_P256_KYBER_LEVEL1,
10705
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10706
    WOLFSSL_X25519_KYBER_LEVEL1,
10707
    #endif
10708
    #endif
10709
    #ifdef WOLFSSL_KYBER768
10710
    WOLFSSL_KYBER_LEVEL3,
10711
    WOLFSSL_P384_KYBER_LEVEL3,
10712
    WOLFSSL_P256_KYBER_LEVEL3,
10713
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10714
    WOLFSSL_X25519_KYBER_LEVEL3,
10715
    #endif
10716
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10717
    WOLFSSL_X448_KYBER_LEVEL3,
10718
    #endif
10719
    #endif
10720
    #ifdef WOLFSSL_KYBER1024
10721
    WOLFSSL_KYBER_LEVEL5,
10722
    WOLFSSL_P521_KYBER_LEVEL5,
10723
    #endif
10724
#elif defined(HAVE_LIBOQS)
10725
    /* These require a runtime call to TLSX_IsGroupSupported to use */
10726
    WOLFSSL_KYBER_LEVEL1,
10727
    WOLFSSL_KYBER_LEVEL3,
10728
    WOLFSSL_KYBER_LEVEL5,
10729
    WOLFSSL_P256_KYBER_LEVEL1,
10730
    WOLFSSL_P384_KYBER_LEVEL3,
10731
    WOLFSSL_P256_KYBER_LEVEL3,
10732
    WOLFSSL_P521_KYBER_LEVEL5,
10733
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10734
    WOLFSSL_X25519_KYBER_LEVEL1,
10735
    WOLFSSL_X25519_KYBER_LEVEL3,
10736
    #endif
10737
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10738
    WOLFSSL_X448_KYBER_LEVEL3,
10739
    #endif
10740
#endif
10741
#endif /* WOLFSSL_MLKEM_KYBER */
10742
    WOLFSSL_NAMED_GROUP_INVALID
10743
};
10744
10745
#define PREFERRED_GROUP_SZ \
10746
    ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
10747
                                            /* -1 for the invalid group */
10748
10749
/* Examines the application specified group ranking and returns the rank of the
10750
 * group.
10751
 * If no group ranking set then all groups are rank 0 (highest).
10752
 *
10753
 * ssl    The SSL/TLS object.
10754
 * group  The group to check ranking for.
10755
 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
10756
 */
10757
static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
10758
1.19k
{
10759
1.19k
    byte i;
10760
1.19k
    const word16* groups;
10761
1.19k
    byte numGroups;
10762
10763
1.19k
    if (ssl->numGroups == 0) {
10764
1.19k
        return 0;
10765
1.19k
    }
10766
0
    else {
10767
0
        groups = ssl->group;
10768
0
        numGroups = ssl->numGroups;
10769
0
    }
10770
10771
#ifdef HAVE_LIBOQS
10772
      if (!TLSX_IsGroupSupported(group))
10773
          return WOLFSSL_FATAL_ERROR;
10774
#endif
10775
10776
0
    for (i = 0; i < numGroups; i++) {
10777
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
10778
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
10779
             groups[i] == WOLFSSL_SECP256R1MLKEM512) ||
10780
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
10781
             groups[i] == WOLFSSL_SECP384R1MLKEM768) ||
10782
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
10783
             groups[i] == WOLFSSL_SECP521R1MLKEM1024)) {
10784
            return i;
10785
        }
10786
#endif
10787
0
        if (groups[i] == (word16)group)
10788
0
            return i;
10789
0
    }
10790
10791
0
    return WOLFSSL_FATAL_ERROR;
10792
0
}
10793
10794
/* Set a key share that is supported by the client into extensions.
10795
 *
10796
 * ssl  The SSL/TLS object.
10797
 * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
10798
 * 0 if a supported group has a key share and other values indicate an error.
10799
 */
10800
int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, TLSX** extensions)
10801
166
{
10802
166
    int             ret;
10803
166
#ifdef HAVE_SUPPORTED_CURVES
10804
166
    TLSX*           extension;
10805
166
    SupportedCurve* curve = NULL;
10806
166
    SupportedCurve* preferredCurve = NULL;
10807
166
    word16          name = WOLFSSL_NAMED_GROUP_INVALID;
10808
166
    KeyShareEntry*  kse = NULL;
10809
166
    int             preferredRank = WOLFSSL_MAX_GROUP_COUNT;
10810
166
    int             rank;
10811
10812
166
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
10813
166
    if (extension != NULL)
10814
156
        curve = (SupportedCurve*)extension->data;
10815
374
    for (; curve != NULL; curve = curve->next) {
10816
        /* Use server's preference order. Common group was found but key share
10817
         * was missing */
10818
208
        if (!TLSX_IsGroupSupported(curve->name))
10819
0
            continue;
10820
208
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
10821
0
            continue;
10822
10823
208
        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
10824
208
        if (rank == -1)
10825
0
            continue;
10826
208
        if (rank < preferredRank) {
10827
156
            preferredCurve = curve;
10828
156
            preferredRank = rank;
10829
156
        }
10830
208
    }
10831
166
    curve = preferredCurve;
10832
10833
166
    if (curve == NULL) {
10834
10
        byte i;
10835
        /* Fallback to user selected group */
10836
10
        preferredRank = WOLFSSL_MAX_GROUP_COUNT;
10837
10
        for (i = 0; i < ssl->numGroups; i++) {
10838
0
            rank = TLSX_KeyShare_GroupRank(ssl, ssl->group[i]);
10839
0
            if (rank == -1)
10840
0
                continue;
10841
0
            if (rank < preferredRank) {
10842
0
                name = ssl->group[i];
10843
0
                preferredRank = rank;
10844
0
            }
10845
0
        }
10846
10
        if (name == WOLFSSL_NAMED_GROUP_INVALID) {
10847
            /* No group selected or specified by the server */
10848
10
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10849
10
            return BAD_KEY_SHARE_DATA;
10850
10
        }
10851
10
    }
10852
156
    else {
10853
156
        name = curve->name;
10854
156
    }
10855
10856
    #ifdef WOLFSSL_ASYNC_CRYPT
10857
    /* Check the old key share data list. */
10858
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10859
    if (extension != NULL) {
10860
        kse = (KeyShareEntry*)extension->data;
10861
        /* We should not be computing keys if we are only going to advertise
10862
         * our choice here. */
10863
        if (kse != NULL && kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10864
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10865
            return BAD_KEY_SHARE_DATA;
10866
        }
10867
    }
10868
    #endif
10869
10870
    /* Push new KeyShare extension. This will also free the old one */
10871
156
    ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10872
156
    if (ret != 0)
10873
17
        return ret;
10874
    /* Extension got pushed to head */
10875
139
    extension = *extensions;
10876
    /* Push the selected curve */
10877
139
    ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, name,
10878
139
                            ssl->heap, &kse);
10879
139
    if (ret != 0)
10880
5
        return ret;
10881
    /* Set extension to be in response. */
10882
134
    extension->resp = 1;
10883
#else
10884
10885
    (void)ssl;
10886
10887
    WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN);
10888
    ret = NOT_COMPILED_IN;
10889
#endif
10890
10891
134
    return ret;
10892
139
}
10893
10894
#ifdef WOLFSSL_DUAL_ALG_CERTS
10895
/* Writes the CKS objects of a list in a buffer. */
10896
static word16 CKS_WRITE(WOLFSSL* ssl, byte* output)
10897
{
10898
    XMEMCPY(output, ssl->sigSpec, ssl->sigSpecSz);
10899
    return ssl->sigSpecSz;
10900
}
10901
10902
static int TLSX_UseCKS(TLSX** extensions, WOLFSSL* ssl, void* heap)
10903
{
10904
    int ret = 0;
10905
    TLSX* extension;
10906
10907
    if (extensions == NULL) {
10908
        return BAD_FUNC_ARG;
10909
    }
10910
10911
    extension = TLSX_Find(*extensions, TLSX_CKS);
10912
    /* If it is already present, do nothing. */
10913
    if (extension == NULL) {
10914
        /* The data required is in the ssl struct, so push it in. */
10915
        ret = TLSX_Push(extensions, TLSX_CKS, (void*)ssl, heap);
10916
    }
10917
10918
    return ret;
10919
}
10920
10921
int TLSX_CKS_Set(WOLFSSL* ssl, TLSX** extensions)
10922
{
10923
    int ret;
10924
    TLSX* extension;
10925
    /* Push new KeyShare extension. This will also free the old one */
10926
    ret = TLSX_Push(extensions, TLSX_CKS, NULL, ssl->heap);
10927
    if (ret != 0)
10928
        return ret;
10929
    /* Extension got pushed to head */
10930
    extension = *extensions;
10931
    /* Need ssl->sigSpecSz during extension length calculation. */
10932
    extension->data = ssl;
10933
    /* Set extension to be in response. */
10934
    extension->resp = 1;
10935
    return ret;
10936
}
10937
10938
int TLSX_CKS_Parse(WOLFSSL* ssl, byte* input, word16 length,
10939
                   TLSX** extensions)
10940
{
10941
    int ret;
10942
    int i, j;
10943
10944
    (void) extensions;
10945
10946
    /* Validating the input. */
10947
    if (length == 0)
10948
        return BUFFER_ERROR;
10949
    for (i = 0; i < length; i++) {
10950
        switch (input[i])
10951
        {
10952
            case WOLFSSL_CKS_SIGSPEC_NATIVE:
10953
            case WOLFSSL_CKS_SIGSPEC_ALTERNATIVE:
10954
            case WOLFSSL_CKS_SIGSPEC_BOTH:
10955
                /* These are all valid values; do nothing */
10956
                break;
10957
            case WOLFSSL_CKS_SIGSPEC_EXTERNAL:
10958
            default:
10959
                /* All other values (including external) are not. */
10960
                return BAD_FUNC_ARG;
10961
        }
10962
    }
10963
10964
    /* This could be a situation where the client tried to start with TLS 1.3
10965
     * when it sent ClientHello and the server down-graded to TLS 1.2. In that
10966
     * case, erroring out because it is TLS 1.2 is not a reasonable thing to do.
10967
     * In the case of TLS 1.2, the CKS values will be ignored. */
10968
    if (!IsAtLeastTLSv1_3(ssl->version)) {
10969
        ssl->sigSpec = NULL;
10970
        ssl->sigSpecSz = 0;
10971
        return 0;
10972
    }
10973
10974
    /* Extension data is valid, but if we are the server and we don't have an
10975
     * alt private key, do not respond with CKS extension. */
10976
    if (wolfSSL_is_server(ssl) && ssl->buffers.altKey == NULL) {
10977
        ssl->sigSpec = NULL;
10978
        ssl->sigSpecSz = 0;
10979
        return 0;
10980
    }
10981
10982
    /* Copy as the lifetime of input seems to be ephemeral. */
10983
    ssl->peerSigSpec = (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_TLSX);
10984
    if (ssl->peerSigSpec == NULL) {
10985
        return BUFFER_ERROR;
10986
    }
10987
    XMEMCPY(ssl->peerSigSpec, input, length);
10988
    ssl->peerSigSpecSz = length;
10989
10990
    /* If there is no preference set, use theirs... */
10991
    if (ssl->sigSpec == NULL) {
10992
        ret = wolfSSL_UseCKS(ssl, ssl->peerSigSpec, 1);
10993
        if (ret == WOLFSSL_SUCCESS) {
10994
            ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
10995
            TLSX_SetResponse(ssl, TLSX_CKS);
10996
        }
10997
        return ret;
10998
    }
10999
11000
    /* ...otherwise, prioritize our preference. */
11001
    for (i = 0; i < ssl->sigSpecSz; i++) {
11002
        for (j = 0; j < length; j++) {
11003
            if (ssl->sigSpec[i] == input[j]) {
11004
                /* Got the match, set to this one. */
11005
                ret = wolfSSL_UseCKS(ssl, &ssl->sigSpec[i], 1);
11006
                if (ret == WOLFSSL_SUCCESS) {
11007
                    ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11008
                    TLSX_SetResponse(ssl, TLSX_CKS);
11009
                }
11010
                return ret;
11011
            }
11012
        }
11013
    }
11014
11015
    /* No match found. Cannot continue. */
11016
    return MATCH_SUITE_ERROR;
11017
}
11018
#endif /* WOLFSSL_DUAL_ALG_CERTS */
11019
11020
/* Server side KSE processing */
11021
int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
11022
    byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, byte* searched)
11023
{
11024
    TLSX*          extension;
11025
    KeyShareEntry* clientKSE = NULL;
11026
    KeyShareEntry* list = NULL;
11027
    KeyShareEntry* preferredKSE = NULL;
11028
    int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11029
    int rank;
11030
11031
    (void)cipherSuite0;
11032
    (void)cipherSuite;
11033
11034
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11035
        return BAD_FUNC_ARG;
11036
11037
    *searched = 0;
11038
11039
    /* Find the KeyShare extension if it exists. */
11040
    extension = TLSX_Find(extensions, TLSX_KEY_SHARE);
11041
    if (extension != NULL)
11042
        list = (KeyShareEntry*)extension->data;
11043
11044
    if (extension && extension->resp == 1) {
11045
        /* Outside of the async case this path should not be taken. */
11046
        int ret = WC_NO_ERR_TRACE(INCOMPLETE_DATA);
11047
    #ifdef WOLFSSL_ASYNC_CRYPT
11048
        /* in async case make sure key generation is finalized */
11049
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
11050
        if (serverKSE && serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11051
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
11052
                *searched = 1;
11053
            ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11054
        }
11055
        else
11056
    #endif
11057
        {
11058
            ret = INCOMPLETE_DATA;
11059
        }
11060
        return ret;
11061
    }
11062
11063
    /* Use server's preference order. */
11064
    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
11065
        if ((clientKSE->ke == NULL) &&
11066
            (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) &&
11067
            (!WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)))
11068
            continue;
11069
11070
#ifdef WOLFSSL_SM2
11071
        if ((cipherSuite0 == CIPHER_BYTE) &&
11072
            ((cipherSuite == TLS_SM4_GCM_SM3) ||
11073
             (cipherSuite == TLS_SM4_CCM_SM3))) {
11074
           if (clientKSE->group != WOLFSSL_ECC_SM2P256V1) {
11075
               continue;
11076
           }
11077
        }
11078
        else if (clientKSE->group == WOLFSSL_ECC_SM2P256V1) {
11079
           continue;
11080
        }
11081
#endif
11082
11083
        /* Check consistency now - extensions in any order. */
11084
        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions))
11085
            continue;
11086
11087
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(clientKSE->group)) {
11088
            /* Check max value supported. */
11089
            if (clientKSE->group > WOLFSSL_ECC_MAX) {
11090
#ifdef WOLFSSL_HAVE_MLKEM
11091
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) &&
11092
                    !WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group))
11093
#endif
11094
                    continue;
11095
            }
11096
            if (wolfSSL_curve_is_disabled(ssl, clientKSE->group))
11097
                continue;
11098
        }
11099
        if (!TLSX_IsGroupSupported(clientKSE->group))
11100
            continue;
11101
11102
        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
11103
        if (rank == -1)
11104
            continue;
11105
        if (rank < preferredRank) {
11106
            preferredKSE = clientKSE;
11107
            preferredRank = rank;
11108
        }
11109
    }
11110
    *kse = preferredKSE;
11111
    *searched = 1;
11112
    return 0;
11113
}
11114
11115
/* Server side KSE processing */
11116
int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
11117
956
{
11118
956
    int            ret;
11119
956
    TLSX*          extension;
11120
956
    KeyShareEntry* serverKSE;
11121
956
    KeyShareEntry* list = NULL;
11122
11123
956
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11124
0
        return BAD_FUNC_ARG;
11125
11126
956
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11127
956
    if (extension == NULL)
11128
0
        return BAD_STATE_E;
11129
11130
956
    if (clientKSE == NULL) {
11131
#ifdef WOLFSSL_ASYNC_CRYPT
11132
        /* Not necessarily an error. The key may have already been setup. */
11133
        if (extension != NULL && extension->resp == 1) {
11134
            serverKSE = (KeyShareEntry*)extension->data;
11135
            if (serverKSE != NULL) {
11136
                /* in async case make sure key generation is finalized */
11137
                if (serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E))
11138
                    return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11139
                else if (serverKSE->lastRet == 0)
11140
                    return 0;
11141
            }
11142
        }
11143
#endif
11144
0
        return BAD_FUNC_ARG;
11145
0
    }
11146
11147
    /* Generate a new key pair except in the case of PQC KEM because we
11148
     * are going to encapsulate and that does not require us to generate a
11149
     * key pair.
11150
     */
11151
956
    ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
11152
956
    if (ret != 0)
11153
11
        return ret;
11154
11155
945
    if (clientKSE->key == NULL) {
11156
#ifdef WOLFSSL_HAVE_MLKEM
11157
        if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) ||
11158
            WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
11159
            /* Going to need the public key (AKA ciphertext). */
11160
            serverKSE->pubKey = clientKSE->pubKey;
11161
            clientKSE->pubKey = NULL;
11162
            serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11163
            clientKSE->pubKeyLen = 0;
11164
        }
11165
        else
11166
#endif
11167
945
        {
11168
945
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
11169
945
        }
11170
11171
        /* for async do setup of serverKSE below, but return WC_PENDING_E */
11172
945
        if (ret != 0
11173
        #ifdef WOLFSSL_ASYNC_CRYPT
11174
            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
11175
        #endif
11176
945
        ) {
11177
191
            TLSX_KeyShare_FreeAll(list, ssl->heap);
11178
191
            return ret;
11179
191
        }
11180
945
    }
11181
0
    else {
11182
        /* transfer buffers to serverKSE */
11183
0
        serverKSE->key = clientKSE->key;
11184
0
        clientKSE->key = NULL;
11185
0
        serverKSE->keyLen = clientKSE->keyLen;
11186
0
        serverKSE->pubKey = clientKSE->pubKey;
11187
0
        clientKSE->pubKey = NULL;
11188
0
        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11189
0
    #ifndef NO_DH
11190
0
        serverKSE->privKey = clientKSE->privKey;
11191
0
        clientKSE->privKey = NULL;
11192
0
    #endif
11193
0
    }
11194
754
    serverKSE->ke = clientKSE->ke;
11195
754
    serverKSE->keLen = clientKSE->keLen;
11196
754
    clientKSE->ke = NULL;
11197
754
    clientKSE->keLen = 0;
11198
754
    ssl->namedGroup = serverKSE->group;
11199
11200
754
    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
11201
754
    extension->data = (void *)serverKSE;
11202
11203
754
    extension->resp = 1;
11204
754
    return ret;
11205
945
}
11206
11207
/* Ensure there is a key pair that can be used for key exchange.
11208
 *
11209
 * ssl  The SSL/TLS object.
11210
 * doHelloRetry If set to non-zero will do hello_retry
11211
 * returns 0 on success and other values indicate failure.
11212
 */
11213
int TLSX_KeyShare_Establish(WOLFSSL *ssl, int* doHelloRetry)
11214
0
{
11215
0
    int            ret;
11216
0
    KeyShareEntry* clientKSE = NULL;
11217
0
    byte           searched = 0;
11218
11219
0
    *doHelloRetry = 0;
11220
11221
0
    ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, ssl->cipher.cipherSuite0,
11222
0
        ssl->cipher.cipherSuite, &clientKSE, &searched);
11223
0
    if (ret != 0 || !searched)
11224
0
        return ret;
11225
11226
    /* No supported group found - send HelloRetryRequest. */
11227
0
    if (clientKSE == NULL) {
11228
        /* Set KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
11229
0
        *doHelloRetry = 1;
11230
0
        return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
11231
0
    }
11232
11233
0
    return TLSX_KeyShare_Setup(ssl, clientKSE);
11234
0
}
11235
11236
/* Derive the shared secret of the key exchange.
11237
 *
11238
 * ssl  The SSL/TLS object.
11239
 * returns 0 on success and other values indicate failure.
11240
 */
11241
int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
11242
718
{
11243
718
    int            ret;
11244
718
    TLSX*          extension;
11245
718
    KeyShareEntry* list = NULL;
11246
11247
#ifdef WOLFSSL_ASYNC_CRYPT
11248
    ret = wolfSSL_AsyncPop(ssl, NULL);
11249
    /* Check for error */
11250
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) && ret < 0) {
11251
        return ret;
11252
    }
11253
#endif
11254
11255
    /* Find the KeyShare extension if it exists. */
11256
718
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11257
718
    if (extension != NULL)
11258
718
        list = (KeyShareEntry*)extension->data;
11259
11260
718
    if (list == NULL)
11261
0
        return KEY_SHARE_ERROR;
11262
11263
    /* Calculate secret. */
11264
718
    ret = TLSX_KeyShare_Process(ssl, list);
11265
11266
718
    return ret;
11267
718
}
11268
11269
0
#define KS_FREE_ALL  TLSX_KeyShare_FreeAll
11270
#define KS_GET_SIZE  TLSX_KeyShare_GetSize
11271
#define KS_WRITE     TLSX_KeyShare_Write
11272
#define KS_PARSE     TLSX_KeyShare_Parse
11273
11274
#else
11275
11276
#define KS_FREE_ALL(a, b) WC_DO_NOTHING
11277
#define KS_GET_SIZE(a, b)    0
11278
#define KS_WRITE(a, b, c)    0
11279
#define KS_PARSE(a, b, c, d) 0
11280
11281
#endif /* WOLFSSL_TLS13 */
11282
11283
/******************************************************************************/
11284
/* Pre-Shared Key                                                             */
11285
/******************************************************************************/
11286
11287
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
11288
/* Free the pre-shared key dynamic data.
11289
 *
11290
 * list  The linked list of key share entry objects.
11291
 * heap  The heap used for allocation.
11292
 */
11293
static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
11294
{
11295
    PreSharedKey* current;
11296
11297
    while ((current = list) != NULL) {
11298
        list = current->next;
11299
        XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
11300
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
11301
    }
11302
11303
    (void)heap;
11304
}
11305
11306
/* Get the size of the encoded pre shared key extension.
11307
 *
11308
 * list     The linked list of pre-shared key extensions.
11309
 * msgType  The type of the message this extension is being written into.
11310
 * returns the number of bytes of the encoded pre-shared key extension or
11311
 * SANITY_MSG_E to indicate invalid message type.
11312
 */
11313
static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
11314
                                     word16* pSz)
11315
{
11316
    if (msgType == client_hello) {
11317
        /* Length of identities + Length of binders. */
11318
        word16 len = OPAQUE16_LEN + OPAQUE16_LEN;
11319
        while (list != NULL) {
11320
            /* Each entry has: identity, ticket age and binder. */
11321
            len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
11322
                   OPAQUE8_LEN + (word16)list->binderLen;
11323
            list = list->next;
11324
        }
11325
        *pSz += len;
11326
        return 0;
11327
    }
11328
11329
    if (msgType == server_hello) {
11330
        *pSz += OPAQUE16_LEN;
11331
        return 0;
11332
    }
11333
11334
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11335
    return SANITY_MSG_E;
11336
}
11337
11338
/* The number of bytes to be written for the binders.
11339
 *
11340
 * list     The linked list of pre-shared key extensions.
11341
 * msgType  The type of the message this extension is being written into.
11342
 * returns the number of bytes of the encoded pre-shared key extension or
11343
 * SANITY_MSG_E to indicate invalid message type.
11344
 */
11345
int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
11346
                                     word16* pSz)
11347
{
11348
    word16 len;
11349
11350
    if (msgType != client_hello) {
11351
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11352
        return SANITY_MSG_E;
11353
    }
11354
11355
    /* Length of all binders. */
11356
    len = OPAQUE16_LEN;
11357
    while (list != NULL) {
11358
        len += OPAQUE8_LEN + (word16)list->binderLen;
11359
        list = list->next;
11360
    }
11361
11362
    *pSz = len;
11363
    return 0;
11364
}
11365
11366
/* Writes the pre-shared key extension into the output buffer - binders only.
11367
 * Assumes that the the output buffer is big enough to hold data.
11368
 *
11369
 * list     The linked list of key share entries.
11370
 * output   The buffer to write into.
11371
 * msgType  The type of the message this extension is being written into.
11372
 * returns the number of bytes written into the buffer.
11373
 */
11374
int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
11375
                                   byte msgType, word16* pSz)
11376
{
11377
    PreSharedKey* current = list;
11378
    word16 idx = 0;
11379
    word16 lenIdx;
11380
    word16 len;
11381
11382
    if (msgType != client_hello) {
11383
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11384
        return SANITY_MSG_E;
11385
    }
11386
11387
    /* Skip length of all binders. */
11388
    lenIdx = idx;
11389
    idx += OPAQUE16_LEN;
11390
    while (current != NULL) {
11391
        /* Binder data length. */
11392
        output[idx++] = (byte)current->binderLen;
11393
        /* Binder data. */
11394
        XMEMCPY(output + idx, current->binder, current->binderLen);
11395
        idx += (word16)current->binderLen;
11396
11397
        current = current->next;
11398
    }
11399
    /* Length of the binders. */
11400
    len = idx - lenIdx - OPAQUE16_LEN;
11401
    c16toa(len, output + lenIdx);
11402
11403
    *pSz = idx;
11404
    return 0;
11405
}
11406
11407
11408
/* Writes the pre-shared key extension into the output buffer.
11409
 * Assumes that the the output buffer is big enough to hold data.
11410
 *
11411
 * list     The linked list of key share entries.
11412
 * output   The buffer to write into.
11413
 * msgType  The type of the message this extension is being written into.
11414
 * returns the number of bytes written into the buffer.
11415
 */
11416
static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
11417
                                   byte msgType, word16* pSz)
11418
{
11419
    if (msgType == client_hello) {
11420
        PreSharedKey* current = list;
11421
        word16 idx = 0;
11422
        word16 lenIdx;
11423
        word16 len;
11424
        int ret;
11425
11426
        /* Write identities only. Binders after HMACing over this. */
11427
        lenIdx = idx;
11428
        idx += OPAQUE16_LEN;
11429
        while (current != NULL) {
11430
            /* Identity length */
11431
            c16toa(current->identityLen, output + idx);
11432
            idx += OPAQUE16_LEN;
11433
            /* Identity data */
11434
            XMEMCPY(output + idx, current->identity, current->identityLen);
11435
            idx += current->identityLen;
11436
11437
            /* Obfuscated ticket age. */
11438
            c32toa(current->ticketAge, output + idx);
11439
            idx += OPAQUE32_LEN;
11440
11441
            current = current->next;
11442
        }
11443
        /* Length of the identities. */
11444
        len = idx - lenIdx - OPAQUE16_LEN;
11445
        c16toa(len, output + lenIdx);
11446
11447
        /* Don't include binders here.
11448
         * The binders are based on the hash of all the ClientHello data up to
11449
         * and include the identities written above.
11450
         */
11451
        ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
11452
        if (ret < 0)
11453
            return ret;
11454
        *pSz += idx + len;
11455
    }
11456
    else if (msgType == server_hello) {
11457
        word16 i;
11458
11459
        /* Find the index of the chosen identity. */
11460
        for (i=0; list != NULL && !list->chosen; i++)
11461
            list = list->next;
11462
        if (list == NULL) {
11463
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
11464
            return BUILD_MSG_ERROR;
11465
        }
11466
11467
        /* The index of the identity chosen by the server from the list supplied
11468
         * by the client.
11469
         */
11470
        c16toa(i, output);
11471
        *pSz += OPAQUE16_LEN;
11472
    }
11473
    else {
11474
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11475
        return SANITY_MSG_E;
11476
    }
11477
11478
    return 0;
11479
}
11480
11481
int TLSX_PreSharedKey_Parse_ClientHello(TLSX** extensions, const byte* input,
11482
                                        word16 length, void* heap)
11483
{
11484
11485
    int    ret;
11486
    word16 len;
11487
    word16 idx = 0;
11488
    TLSX*         extension;
11489
    PreSharedKey* list;
11490
11491
    TLSX_Remove(extensions, TLSX_PRE_SHARED_KEY, heap);
11492
11493
    /* Length of identities and of binders. */
11494
    if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
11495
        return BUFFER_E;
11496
11497
    /* Length of identities. */
11498
    ato16(input + idx, &len);
11499
    idx += OPAQUE16_LEN;
11500
    if (len < MIN_PSK_ID_LEN || length - idx < len)
11501
        return BUFFER_E;
11502
11503
    /* Create a pre-shared key object for each identity. */
11504
    while (len > 0) {
11505
        const byte* identity;
11506
        word16      identityLen;
11507
        word32      age;
11508
11509
        if (len < OPAQUE16_LEN)
11510
            return BUFFER_E;
11511
11512
        /* Length of identity. */
11513
        ato16(input + idx, &identityLen);
11514
        idx += OPAQUE16_LEN;
11515
        if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
11516
                identityLen > MAX_PSK_ID_LEN)
11517
            return BUFFER_E;
11518
        /* Cache identity pointer. */
11519
        identity = input + idx;
11520
        idx += identityLen;
11521
        /* Ticket age. */
11522
        ato32(input + idx, &age);
11523
        idx += OPAQUE32_LEN;
11524
11525
        ret = TLSX_PreSharedKey_Use(extensions, identity, identityLen, age, no_mac,
11526
                                    0, 0, 1, NULL, heap);
11527
        if (ret != 0)
11528
            return ret;
11529
11530
        /* Done with this identity. */
11531
        len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
11532
    }
11533
11534
    /* Find the list of identities sent to server. */
11535
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11536
    if (extension == NULL)
11537
        return PSK_KEY_ERROR;
11538
    list = (PreSharedKey*)extension->data;
11539
11540
    /* Length of binders. */
11541
    if (idx + OPAQUE16_LEN > length)
11542
        return BUFFER_E;
11543
    ato16(input + idx, &len);
11544
    idx += OPAQUE16_LEN;
11545
    if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
11546
        return BUFFER_E;
11547
11548
    /* Set binder for each identity. */
11549
    while (list != NULL && len > 0) {
11550
        /* Length of binder */
11551
        list->binderLen = input[idx++];
11552
        if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
11553
                list->binderLen > WC_MAX_DIGEST_SIZE)
11554
            return BUFFER_E;
11555
        if (len < OPAQUE8_LEN + list->binderLen)
11556
            return BUFFER_E;
11557
11558
        /* Copy binder into static buffer. */
11559
        XMEMCPY(list->binder, input + idx, list->binderLen);
11560
        idx += (word16)list->binderLen;
11561
11562
        /* Done with binder entry. */
11563
        len -= OPAQUE8_LEN + (word16)list->binderLen;
11564
11565
        /* Next identity. */
11566
        list = list->next;
11567
    }
11568
    if (list != NULL || len != 0)
11569
        return BUFFER_E;
11570
11571
    return 0;
11572
11573
}
11574
11575
/* Parse the pre-shared key extension.
11576
 * Different formats in different messages.
11577
 *
11578
 * ssl      The SSL/TLS object.
11579
 * input    The extension data.
11580
 * length   The length of the extension data.
11581
 * msgType  The type of the message this extension is being parsed from.
11582
 * returns 0 on success and other values indicate failure.
11583
 */
11584
static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, const byte* input,
11585
                                   word16 length, byte msgType)
11586
{
11587
11588
    if (msgType == client_hello) {
11589
        return TLSX_PreSharedKey_Parse_ClientHello(&ssl->extensions, input,
11590
                                                   length, ssl->heap);
11591
    }
11592
11593
    if (msgType == server_hello) {
11594
        word16 idx;
11595
        PreSharedKey* list;
11596
        TLSX*         extension;
11597
11598
        /* Index of identity chosen by server. */
11599
        if (length != OPAQUE16_LEN)
11600
            return BUFFER_E;
11601
        ato16(input, &idx);
11602
11603
    #ifdef WOLFSSL_EARLY_DATA
11604
        ssl->options.pskIdIndex = idx + 1;
11605
    #endif
11606
11607
        /* Find the list of identities sent to server. */
11608
        extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
11609
        if (extension == NULL)
11610
            return PSK_KEY_ERROR;
11611
        list = (PreSharedKey*)extension->data;
11612
11613
        /* Mark the identity as chosen. */
11614
        for (; list != NULL && idx > 0; idx--)
11615
            list = list->next;
11616
        if (list == NULL) {
11617
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
11618
            return PSK_KEY_ERROR;
11619
        }
11620
        list->chosen = 1;
11621
11622
    #ifdef HAVE_SESSION_TICKET
11623
        if (list->resumption) {
11624
           /* Check that the session's details are the same as the server's. */
11625
           if (ssl->options.cipherSuite0  != ssl->session->cipherSuite0       ||
11626
               ssl->options.cipherSuite   != ssl->session->cipherSuite        ||
11627
               ssl->session->version.major != ssl->ctx->method->version.major ||
11628
               ssl->session->version.minor != ssl->ctx->method->version.minor) {
11629
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
11630
               return PSK_KEY_ERROR;
11631
           }
11632
        }
11633
    #endif
11634
11635
        return 0;
11636
    }
11637
11638
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11639
    return SANITY_MSG_E;
11640
}
11641
11642
/* Create a new pre-shared key and put it into the list.
11643
 *
11644
 * list          The linked list of pre-shared key.
11645
 * identity      The identity.
11646
 * len           The length of the identity data.
11647
 * heap          The memory to allocate with.
11648
 * preSharedKey  The new pre-shared key object.
11649
 * returns 0 on success and other values indicate failure.
11650
 */
11651
static int TLSX_PreSharedKey_New(PreSharedKey** list, const byte* identity,
11652
                                 word16 len, void *heap,
11653
                                 PreSharedKey** preSharedKey)
11654
{
11655
    PreSharedKey* psk;
11656
    PreSharedKey** next;
11657
11658
    psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
11659
    if (psk == NULL)
11660
        return MEMORY_E;
11661
    XMEMSET(psk, 0, sizeof(*psk));
11662
11663
    /* Make a copy of the identity data. */
11664
    psk->identity = (byte*)XMALLOC(len + NULL_TERM_LEN, heap,
11665
                                   DYNAMIC_TYPE_TLSX);
11666
    if (psk->identity == NULL) {
11667
        XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
11668
        return MEMORY_E;
11669
    }
11670
    XMEMCPY(psk->identity, identity, len);
11671
    psk->identityLen = len;
11672
    /* Use a NULL terminator in case it is a C string */
11673
    psk->identity[psk->identityLen] = '\0';
11674
11675
    /* Add it to the end and maintain the links. */
11676
    while (*list != NULL) {
11677
        /* Assign to temporary to work around compiler bug found by customer. */
11678
        next = &((*list)->next);
11679
        list = next;
11680
    }
11681
    *list = psk;
11682
    *preSharedKey = psk;
11683
11684
    (void)heap;
11685
11686
    return 0;
11687
}
11688
11689
static WC_INLINE byte GetHmacLength(int hmac)
11690
{
11691
    switch (hmac) {
11692
    #ifndef NO_SHA256
11693
        case sha256_mac:
11694
            return WC_SHA256_DIGEST_SIZE;
11695
    #endif
11696
    #ifdef WOLFSSL_SHA384
11697
        case sha384_mac:
11698
            return WC_SHA384_DIGEST_SIZE;
11699
    #endif
11700
    #ifdef WOLFSSL_SHA512
11701
        case sha512_mac:
11702
            return WC_SHA512_DIGEST_SIZE;
11703
    #endif
11704
    #ifdef WOLFSSL_SM3
11705
        case sm3_mac:
11706
            return WC_SM3_DIGEST_SIZE;
11707
    #endif
11708
        default:
11709
            break;
11710
    }
11711
    return 0;
11712
}
11713
11714
/* Use the data to create a new pre-shared key object in the extensions.
11715
 *
11716
 * ssl           The SSL/TLS object.
11717
 * identity      The identity.
11718
 * len           The length of the identity data.
11719
 * age           The age of the identity.
11720
 * hmac          The HMAC algorithm.
11721
 * cipherSuite0  The first byte of the cipher suite to use.
11722
 * cipherSuite   The second byte of the cipher suite to use.
11723
 * resumption    The PSK is for resumption of a session.
11724
 * preSharedKey  The new pre-shared key object.
11725
 * returns 0 on success and other values indicate failure.
11726
 */
11727
int TLSX_PreSharedKey_Use(TLSX** extensions, const byte* identity, word16 len,
11728
                          word32 age, byte hmac, byte cipherSuite0,
11729
                          byte cipherSuite, byte resumption,
11730
                          PreSharedKey **preSharedKey, void* heap)
11731
{
11732
    int           ret = 0;
11733
    TLSX*         extension;
11734
    PreSharedKey* psk = NULL;
11735
11736
    /* Find the pre-shared key extension if it exists. */
11737
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11738
    if (extension == NULL) {
11739
        /* Push new pre-shared key extension. */
11740
        ret = TLSX_Push(extensions, TLSX_PRE_SHARED_KEY, NULL, heap);
11741
        if (ret != 0)
11742
            return ret;
11743
11744
        extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11745
        if (extension == NULL)
11746
            return MEMORY_E;
11747
    }
11748
11749
    /* Try to find the pre-shared key with this identity. */
11750
    psk = (PreSharedKey*)extension->data;
11751
    while (psk != NULL) {
11752
        if ((psk->identityLen == len) &&
11753
               (XMEMCMP(psk->identity, identity, len) == 0)) {
11754
            break;
11755
        }
11756
        psk = psk->next;
11757
    }
11758
11759
    /* Create a new pre-shared key object if not found. */
11760
    if (psk == NULL) {
11761
        ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
11762
                                    len, heap, &psk);
11763
        if (ret != 0)
11764
            return ret;
11765
    }
11766
11767
    /* Update/set age and HMAC algorithm. */
11768
    psk->ticketAge    = age;
11769
    psk->hmac         = hmac;
11770
    psk->cipherSuite0 = cipherSuite0;
11771
    psk->cipherSuite  = cipherSuite;
11772
    psk->resumption   = resumption;
11773
    psk->binderLen    = GetHmacLength(psk->hmac);
11774
11775
    if (preSharedKey != NULL)
11776
        *preSharedKey = psk;
11777
11778
    return 0;
11779
}
11780
11781
#define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
11782
#define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
11783
#define PSK_WRITE     TLSX_PreSharedKey_Write
11784
#define PSK_PARSE     TLSX_PreSharedKey_Parse
11785
11786
#else
11787
11788
#define PSK_FREE_ALL(a, b) WC_DO_NOTHING
11789
#define PSK_GET_SIZE(a, b, c) 0
11790
#define PSK_WRITE(a, b, c, d) 0
11791
#define PSK_PARSE(a, b, c, d) 0
11792
11793
#endif
11794
11795
/******************************************************************************/
11796
/* PSK Key Exchange Modes                                                     */
11797
/******************************************************************************/
11798
11799
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
11800
/* Get the size of the encoded PSK KE modes extension.
11801
 * Only in ClientHello.
11802
 *
11803
 * modes    The PSK KE mode bit string.
11804
 * msgType  The type of the message this extension is being written into.
11805
 * returns the number of bytes of the encoded PSK KE mode extension.
11806
 */
11807
static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
11808
{
11809
    if (msgType == client_hello) {
11810
        /* Format: Len | Modes* */
11811
        word16 len = OPAQUE8_LEN;
11812
        /* Check whether each possible mode is to be written. */
11813
        if (modes & (1 << PSK_KE))
11814
            len += OPAQUE8_LEN;
11815
        if (modes & (1 << PSK_DHE_KE))
11816
            len += OPAQUE8_LEN;
11817
        *pSz += len;
11818
        return 0;
11819
    }
11820
11821
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11822
    return SANITY_MSG_E;
11823
}
11824
11825
/* Writes the PSK KE modes extension into the output buffer.
11826
 * Assumes that the the output buffer is big enough to hold data.
11827
 * Only in ClientHello.
11828
 *
11829
 * modes    The PSK KE mode bit string.
11830
 * output   The buffer to write into.
11831
 * msgType  The type of the message this extension is being written into.
11832
 * returns the number of bytes written into the buffer.
11833
 */
11834
static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
11835
                                 word16* pSz)
11836
{
11837
    if (msgType == client_hello) {
11838
        /* Format: Len | Modes* */
11839
        word16 idx = OPAQUE8_LEN;
11840
11841
        /* Write out each possible mode. */
11842
        if (modes & (1 << PSK_KE))
11843
            output[idx++] = PSK_KE;
11844
        if (modes & (1 << PSK_DHE_KE))
11845
            output[idx++] = PSK_DHE_KE;
11846
        /* Write out length of mode list. */
11847
        output[0] = (byte)(idx - OPAQUE8_LEN);
11848
11849
        *pSz += idx;
11850
        return 0;
11851
    }
11852
11853
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11854
    return SANITY_MSG_E;
11855
}
11856
11857
int TLSX_PskKeyModes_Parse_Modes(const byte* input, word16 length, byte msgType,
11858
                                byte* modes)
11859
{
11860
    if (msgType == client_hello) {
11861
        /* Format: Len | Modes* */
11862
        int   idx = 0;
11863
        word16 len;
11864
        *modes = 0;
11865
11866
        /* Ensure length byte exists. */
11867
        if (length < OPAQUE8_LEN)
11868
            return BUFFER_E;
11869
11870
        /* Get length of mode list and ensure that is the only data. */
11871
        len = input[0];
11872
        if (length - OPAQUE8_LEN != len)
11873
            return BUFFER_E;
11874
11875
        idx = OPAQUE8_LEN;
11876
        /* Set a bit for each recognized modes. */
11877
        while (len > 0) {
11878
            /* Ignore unrecognized modes.  */
11879
            if (input[idx] <= PSK_DHE_KE)
11880
               *modes |= 1 << input[idx];
11881
            idx++;
11882
            len--;
11883
        }
11884
        return 0;
11885
    }
11886
11887
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11888
    return SANITY_MSG_E;
11889
}
11890
11891
/* Parse the PSK KE modes extension.
11892
 * Only in ClientHello.
11893
 *
11894
 * ssl      The SSL/TLS object.
11895
 * input    The extension data.
11896
 * length   The length of the extension data.
11897
 * msgType  The type of the message this extension is being parsed from.
11898
 * returns 0 on success and other values indicate failure.
11899
 */
11900
static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, const byte* input, word16 length,
11901
                                 byte msgType)
11902
{
11903
    int    ret;
11904
    byte modes;
11905
11906
    ret = TLSX_PskKeyModes_Parse_Modes(input, length, msgType, &modes);
11907
    if (ret == 0)
11908
        ret = TLSX_PskKeyModes_Use(ssl, modes);
11909
11910
    if (ret != 0) {
11911
        WOLFSSL_ERROR_VERBOSE(ret);
11912
    }
11913
11914
    return ret;
11915
}
11916
11917
/* Use the data to create a new PSK Key Exchange Modes object in the extensions.
11918
 *
11919
 * ssl    The SSL/TLS object.
11920
 * modes  The PSK key exchange modes.
11921
 * returns 0 on success and other values indicate failure.
11922
 */
11923
int TLSX_PskKeyModes_Use(WOLFSSL* ssl, byte modes)
11924
{
11925
    int           ret = 0;
11926
    TLSX*         extension;
11927
11928
    /* Find the PSK key exchange modes extension if it exists. */
11929
    extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
11930
    if (extension == NULL) {
11931
        /* Push new PSK key exchange modes extension. */
11932
        ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
11933
            ssl->heap);
11934
        if (ret != 0)
11935
            return ret;
11936
11937
        extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
11938
        if (extension == NULL)
11939
            return MEMORY_E;
11940
    }
11941
11942
    extension->val = modes;
11943
11944
    return 0;
11945
}
11946
11947
#define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
11948
#define PKM_WRITE     TLSX_PskKeModes_Write
11949
#define PKM_PARSE     TLSX_PskKeModes_Parse
11950
11951
#else
11952
11953
#define PKM_GET_SIZE(a, b, c) 0
11954
#define PKM_WRITE(a, b, c, d) 0
11955
#define PKM_PARSE(a, b, c, d) 0
11956
11957
#endif
11958
11959
/******************************************************************************/
11960
/* Post-Handshake Authentication                                              */
11961
/******************************************************************************/
11962
11963
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
11964
/* Get the size of the encoded Post-Handshake Authentication extension.
11965
 * Only in ClientHello.
11966
 *
11967
 * msgType  The type of the message this extension is being written into.
11968
 * returns the number of bytes of the encoded Post-Handshake Authentication
11969
 * extension.
11970
 */
11971
static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
11972
{
11973
    if (msgType == client_hello) {
11974
        *pSz += 0;
11975
        return 0;
11976
    }
11977
11978
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11979
    return SANITY_MSG_E;
11980
}
11981
11982
/* Writes the Post-Handshake Authentication extension into the output buffer.
11983
 * Assumes that the the output buffer is big enough to hold data.
11984
 * Only in ClientHello.
11985
 *
11986
 * output   The buffer to write into.
11987
 * msgType  The type of the message this extension is being written into.
11988
 * returns the number of bytes written into the buffer.
11989
 */
11990
static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
11991
{
11992
    (void)output;
11993
11994
    if (msgType == client_hello) {
11995
        *pSz += 0;
11996
        return 0;
11997
    }
11998
11999
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12000
    return SANITY_MSG_E;
12001
}
12002
12003
/* Parse the Post-Handshake Authentication extension.
12004
 * Only in ClientHello.
12005
 *
12006
 * ssl      The SSL/TLS object.
12007
 * input    The extension data.
12008
 * length   The length of the extension data.
12009
 * msgType  The type of the message this extension is being parsed from.
12010
 * returns 0 on success and other values indicate failure.
12011
 */
12012
static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, const byte* input,
12013
                                   word16 length, byte msgType)
12014
{
12015
    (void)input;
12016
12017
    if (msgType == client_hello) {
12018
        /* Ensure extension is empty. */
12019
        if (length != 0)
12020
            return BUFFER_E;
12021
12022
        ssl->options.postHandshakeAuth = 1;
12023
        return 0;
12024
    }
12025
12026
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12027
    return SANITY_MSG_E;
12028
}
12029
12030
/* Create a new Post-handshake authentication object in the extensions.
12031
 *
12032
 * ssl    The SSL/TLS object.
12033
 * returns 0 on success and other values indicate failure.
12034
 */
12035
static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
12036
{
12037
    int   ret = 0;
12038
    TLSX* extension;
12039
12040
    /* Find the PSK key exchange modes extension if it exists. */
12041
    extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
12042
    if (extension == NULL) {
12043
        /* Push new Post-handshake Authentication extension. */
12044
        ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
12045
            ssl->heap);
12046
        if (ret != 0)
12047
            return ret;
12048
    }
12049
12050
    return 0;
12051
}
12052
12053
#define PHA_GET_SIZE  TLSX_PostHandAuth_GetSize
12054
#define PHA_WRITE     TLSX_PostHandAuth_Write
12055
#define PHA_PARSE     TLSX_PostHandAuth_Parse
12056
12057
#else
12058
12059
#define PHA_GET_SIZE(a, b)    0
12060
#define PHA_WRITE(a, b, c)    0
12061
#define PHA_PARSE(a, b, c, d) 0
12062
12063
#endif
12064
12065
/******************************************************************************/
12066
/* Early Data Indication                                                      */
12067
/******************************************************************************/
12068
12069
#ifdef WOLFSSL_EARLY_DATA
12070
/* Get the size of the encoded Early Data Indication extension.
12071
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12072
 *
12073
 * msgType  The type of the message this extension is being written into.
12074
 * returns the number of bytes of the encoded Early Data Indication extension.
12075
 */
12076
static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
12077
{
12078
    int ret = 0;
12079
12080
    if (msgType == client_hello || msgType == encrypted_extensions)
12081
        *pSz += 0;
12082
    else if (msgType == session_ticket)
12083
        *pSz += OPAQUE32_LEN;
12084
    else {
12085
        ret = SANITY_MSG_E;
12086
        WOLFSSL_ERROR_VERBOSE(ret);
12087
    }
12088
12089
    return ret;
12090
}
12091
12092
/* Writes the Early Data Indicator extension into the output buffer.
12093
 * Assumes that the the output buffer is big enough to hold data.
12094
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12095
 *
12096
 * maxSz    The maximum early data size.
12097
 * output   The buffer to write into.
12098
 * msgType  The type of the message this extension is being written into.
12099
 * returns the number of bytes written into the buffer.
12100
 */
12101
static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
12102
                                word16* pSz)
12103
{
12104
    if (msgType == client_hello || msgType == encrypted_extensions)
12105
        return 0;
12106
    else if (msgType == session_ticket) {
12107
        c32toa(maxSz, output);
12108
        *pSz += OPAQUE32_LEN;
12109
        return 0;
12110
    }
12111
12112
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12113
    return SANITY_MSG_E;
12114
}
12115
12116
/* Parse the Early Data Indicator extension.
12117
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12118
 *
12119
 * ssl      The SSL/TLS object.
12120
 * input    The extension data.
12121
 * length   The length of the extension data.
12122
 * msgType  The type of the message this extension is being parsed from.
12123
 * returns 0 on success and other values indicate failure.
12124
 */
12125
static int TLSX_EarlyData_Parse(WOLFSSL* ssl, const byte* input, word16 length,
12126
                                 byte msgType)
12127
{
12128
    WOLFSSL_ENTER("TLSX_EarlyData_Parse");
12129
    if (msgType == client_hello) {
12130
        if (length != 0)
12131
            return BUFFER_E;
12132
12133
        if (ssl->earlyData == expecting_early_data) {
12134
12135
            if (ssl->options.maxEarlyDataSz != 0)
12136
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
12137
            else
12138
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
12139
12140
            return TLSX_EarlyData_Use(ssl, 0, 0);
12141
        }
12142
        ssl->earlyData = early_data_ext;
12143
12144
        return 0;
12145
    }
12146
    if (msgType == encrypted_extensions) {
12147
        if (length != 0)
12148
            return BUFFER_E;
12149
12150
        /* Ensure the index of PSK identity chosen by server is 0.
12151
         * Index is plus one to handle 'not set' value of 0.
12152
         */
12153
        if (ssl->options.pskIdIndex != 1) {
12154
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12155
            return PSK_KEY_ERROR;
12156
        }
12157
12158
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
12159
            /* the extension from server comes in */
12160
            ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
12161
        }
12162
12163
        return TLSX_EarlyData_Use(ssl, 1, 1);
12164
    }
12165
    if (msgType == session_ticket) {
12166
        word32 maxSz;
12167
12168
        if (length != OPAQUE32_LEN)
12169
            return BUFFER_E;
12170
        ato32(input, &maxSz);
12171
12172
        ssl->session->maxEarlyDataSz = maxSz;
12173
        return 0;
12174
    }
12175
12176
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12177
    return SANITY_MSG_E;
12178
}
12179
12180
/* Use the data to create a new Early Data object in the extensions.
12181
 *
12182
 * ssl    The SSL/TLS object.
12183
 * maxSz  The maximum early data size.
12184
 * is_response   if this extension is part of a response
12185
 * returns 0 on success and other values indicate failure.
12186
 */
12187
int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz, int is_response)
12188
{
12189
    int   ret = 0;
12190
    TLSX* extension;
12191
12192
    /* Find the early data extension if it exists. */
12193
    extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
12194
    if (extension == NULL) {
12195
        /* Push new early data extension. */
12196
        ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
12197
        if (ret != 0)
12198
            return ret;
12199
12200
        extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
12201
        if (extension == NULL)
12202
            return MEMORY_E;
12203
    }
12204
12205
    extension->resp = is_response;
12206
    /* In QUIC, earlydata size is either 0 or 0xffffffff.
12207
     * Override any size between, possibly left from our initial value */
12208
    extension->val  = (WOLFSSL_IS_QUIC(ssl) && is_response && maxSz > 0) ?
12209
                       WOLFSSL_MAX_32BIT : maxSz;
12210
12211
    return 0;
12212
}
12213
12214
#define EDI_GET_SIZE  TLSX_EarlyData_GetSize
12215
#define EDI_WRITE     TLSX_EarlyData_Write
12216
#define EDI_PARSE     TLSX_EarlyData_Parse
12217
12218
#else
12219
12220
#define EDI_GET_SIZE(a, b)    0
12221
#define EDI_WRITE(a, b, c, d) 0
12222
#define EDI_PARSE(a, b, c, d) 0
12223
12224
#endif
12225
12226
/******************************************************************************/
12227
/* QUIC transport parameter extension                                         */
12228
/******************************************************************************/
12229
#ifdef WOLFSSL_QUIC
12230
12231
static word16 TLSX_QuicTP_GetSize(TLSX* extension)
12232
{
12233
    const QuicTransportParam *tp = (QuicTransportParam*)extension->data;
12234
12235
    return tp ? tp->len : 0;
12236
}
12237
12238
int TLSX_QuicTP_Use(WOLFSSL* ssl, TLSX_Type ext_type, int is_response)
12239
{
12240
    int ret = 0;
12241
    TLSX* extension;
12242
12243
    WOLFSSL_ENTER("TLSX_QuicTP_Use");
12244
    if (ssl->quic.transport_local == NULL) {
12245
        /* RFC9000, ch 7.3: "An endpoint MUST treat the absence of [...]
12246
         *     from either endpoint [...] as a connection error of type
12247
         *     TRANSPORT_PARAMETER_ERROR."
12248
         */
12249
        ret = QUIC_TP_MISSING_E;
12250
        goto cleanup;
12251
    }
12252
12253
    extension = TLSX_Find(ssl->extensions, ext_type);
12254
    if (extension == NULL) {
12255
        ret = TLSX_Push(&ssl->extensions, ext_type, NULL, ssl->heap);
12256
        if (ret != 0)
12257
            goto cleanup;
12258
12259
        extension = TLSX_Find(ssl->extensions, ext_type);
12260
        if (extension == NULL) {
12261
            ret = MEMORY_E;
12262
            goto cleanup;
12263
        }
12264
    }
12265
    if (extension->data) {
12266
        QuicTransportParam_free((QuicTransportParam*)extension->data, ssl->heap);
12267
        extension->data = NULL;
12268
    }
12269
    extension->resp = is_response;
12270
    extension->data = (void*)QuicTransportParam_dup(ssl->quic.transport_local, ssl->heap);
12271
    if (!extension->data) {
12272
        ret = MEMORY_E;
12273
        goto cleanup;
12274
    }
12275
12276
cleanup:
12277
    WOLFSSL_LEAVE("TLSX_QuicTP_Use", ret);
12278
    return ret;
12279
}
12280
12281
static word16 TLSX_QuicTP_Write(QuicTransportParam *tp, byte* output)
12282
{
12283
    word16 len = 0;
12284
12285
    WOLFSSL_ENTER("TLSX_QuicTP_Write");
12286
    if (tp && tp->len) {
12287
        XMEMCPY(output, tp->data, tp->len);
12288
        len = tp->len;
12289
    }
12290
    WOLFSSL_LEAVE("TLSX_QuicTP_Write", len);
12291
    return len;
12292
}
12293
12294
static int TLSX_QuicTP_Parse(WOLFSSL *ssl, const byte *input, size_t len, int ext_type, int msgType)
12295
{
12296
    const QuicTransportParam *tp, **ptp;
12297
12298
    (void)msgType;
12299
    tp = QuicTransportParam_new(input, len, ssl->heap);
12300
    if (!tp) {
12301
        return MEMORY_E;
12302
    }
12303
    ptp = (ext_type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT) ?
12304
        &ssl->quic.transport_peer_draft : &ssl->quic.transport_peer;
12305
    if (*ptp) {
12306
        QTP_FREE(*ptp, ssl->heap);
12307
    }
12308
    *ptp = tp;
12309
    return 0;
12310
}
12311
12312
#define QTP_GET_SIZE    TLSX_QuicTP_GetSize
12313
#define QTP_USE         TLSX_QuicTP_Use
12314
#define QTP_WRITE       TLSX_QuicTP_Write
12315
#define QTP_PARSE       TLSX_QuicTP_Parse
12316
12317
#endif /* WOLFSSL_QUIC */
12318
12319
#if defined(WOLFSSL_DTLS_CID)
12320
#define CID_GET_SIZE  TLSX_ConnectionID_GetSize
12321
#define CID_WRITE  TLSX_ConnectionID_Write
12322
#define CID_PARSE  TLSX_ConnectionID_Parse
12323
#define CID_FREE  TLSX_ConnectionID_Free
12324
#else
12325
#define CID_GET_SIZE(a) 0
12326
#define CID_WRITE(a, b) 0
12327
#define CID_PARSE(a, b, c, d) 0
12328
#define CID_FREE(a, b) 0
12329
#endif /* defined(WOLFSSL_DTLS_CID) */
12330
12331
#if defined(HAVE_RPK)
12332
/******************************************************************************/
12333
/* Client_Certificate_Type extension                                          */
12334
/******************************************************************************/
12335
/* return 1 if specified type is included in the given list, otherwise 0 */
12336
static int IsCertTypeListed(byte type, byte cnt, const byte* list)
12337
{
12338
    int ret = 0;
12339
    int i;
12340
12341
    if (cnt == 0 || list == NULL)
12342
        return ret;
12343
12344
    if (cnt > 0 && cnt <= MAX_CLIENT_CERT_TYPE_CNT) {
12345
        for (i = 0; i < cnt; i++) {
12346
            if (list[i] == type)
12347
                return 1;
12348
        }
12349
    }
12350
    return 0;
12351
}
12352
12353
/* Search both arrays from above to find a common value between the two given
12354
 * arrays(a and b). return 1 if it finds a common value, otherwise return 0.
12355
 */
12356
static int GetCommonItem(const byte* a, byte aLen, const byte* b, byte bLen,
12357
                                                                    byte* type)
12358
{
12359
    int i, j;
12360
12361
    if (a == NULL || b == NULL)
12362
        return 0;
12363
12364
    for (i = 0; i < aLen; i++) {
12365
        for (j = 0; j < bLen; j++) {
12366
            if (a[i] == b[j]) {
12367
                *type = a[i];
12368
                return 1;
12369
            }
12370
        }
12371
    }
12372
    return 0;
12373
}
12374
12375
/* Creates a "client certificate type" extension if necessary.
12376
 * Returns 0 if no error occurred, negative value otherwise.
12377
 * A return of 0, it does not indicae that the extension was created.
12378
 */
12379
static int TLSX_ClientCertificateType_Use(WOLFSSL* ssl, byte isServer)
12380
{
12381
    int ret = 0;
12382
12383
    if (ssl == NULL)
12384
        return BAD_FUNC_ARG;
12385
12386
    if (isServer) {
12387
        /* [in server side]
12388
         */
12389
12390
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12391
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12392
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
12393
12394
            WOLFSSL_MSG("Adding Client Certificate Type extension");
12395
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
12396
                                                                    ssl->heap);
12397
            if (ret == 0) {
12398
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
12399
            }
12400
        }
12401
    }
12402
    else {
12403
        /* [in client side]
12404
         * This extension MUST be omitted from the ClientHello unless the RPK
12405
         * certificate is preferred by the user and actually loaded.
12406
         */
12407
12408
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12409
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12410
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
12411
12412
            if (ssl->options.rpkState.isRPKLoaded) {
12413
12414
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
12415
                ssl->options.rpkState.sending_ClientCertTypes[0] =
12416
                                                        WOLFSSL_CERT_TYPE_RPK;
12417
12418
                /* Push new client_certificate_type extension. */
12419
                WOLFSSL_MSG("Adding Client Certificate Type extension");
12420
                ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE,
12421
                                                                ssl, ssl->heap);
12422
            }
12423
            else {
12424
                WOLFSSL_MSG("Willing to use RPK cert but not loaded it");
12425
            }
12426
        }
12427
        else {
12428
            WOLFSSL_MSG("No will to use RPK cert");
12429
        }
12430
    }
12431
    return ret;
12432
}
12433
12434
/* Parse a "client certificate type" extension received from peer.
12435
 * returns 0 on success and other values indicate failure.
12436
 */
12437
static int TLSX_ClientCertificateType_Parse(WOLFSSL* ssl, const byte* input,
12438
                                                word16 length, byte msgType)
12439
{
12440
    byte typeCnt;
12441
    int idx = 0;
12442
    int ret = 0;
12443
    int i;
12444
    int populate = 0;
12445
    byte  cmnType;
12446
12447
12448
    if (msgType == client_hello) {
12449
        /* [parse ClientHello in server end]
12450
         * case 1) if peer verify is disabled, this extension must be omitted
12451
         *         from ServerHello.
12452
         * case 2) if user have not set his preference, find X509 in parsed
12453
         *         result, then populate "Client Certificate Type" extension.
12454
         * case 3) if user have not set his preference and X509 isn't included
12455
         *         in parsed result, send "unsupported certificate" alert.
12456
         * case 4) if user have set his preference, find a common cert type
12457
         *         in users preference and received cert types.
12458
         * case 5) if user have set his preference, but no common cert type
12459
         *         found.
12460
         */
12461
12462
        /* case 1 */
12463
        if (ssl->options.verifyNone) {
12464
            return ret;
12465
        }
12466
12467
        /* parse extension */
12468
        if (length < OPAQUE8_LEN)
12469
            return BUFFER_E;
12470
12471
        typeCnt = input[idx];
12472
12473
        if (typeCnt > MAX_CLIENT_CERT_TYPE_CNT)
12474
            return BUFFER_E;
12475
12476
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
12477
            return BUFFER_E;
12478
        }
12479
12480
        ssl->options.rpkState.received_ClientCertTypeCnt = input[idx];
12481
        idx += OPAQUE8_LEN;
12482
12483
        for (i = 0; i < typeCnt; i++) {
12484
            ssl->options.rpkState.received_ClientCertTypes[i] = input[idx];
12485
            idx += OPAQUE8_LEN;
12486
        }
12487
12488
        if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt == 0) {
12489
            /* case 2 */
12490
            if (IsCertTypeListed(WOLFSSL_CERT_TYPE_X509,
12491
                            ssl->options.rpkState.received_ClientCertTypeCnt,
12492
                            ssl->options.rpkState.received_ClientCertTypes)) {
12493
12494
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
12495
                ssl->options.rpkState.sending_ClientCertTypes[0] =
12496
                                                        WOLFSSL_CERT_TYPE_X509;
12497
                populate = 1;
12498
            }
12499
            /* case 3 */
12500
            else {
12501
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
12502
                SendAlert(ssl, alert_fatal, unsupported_certificate);
12503
                return UNSUPPORTED_CERTIFICATE;
12504
            }
12505
        }
12506
        else if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt > 0) {
12507
            /* case 4 */
12508
            if (GetCommonItem(
12509
                            ssl->options.rpkConfig.preferred_ClientCertTypes,
12510
                            ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12511
                            ssl->options.rpkState.received_ClientCertTypes,
12512
                            ssl->options.rpkState.received_ClientCertTypeCnt,
12513
                            &cmnType)) {
12514
                ssl->options.rpkState.sending_ClientCertTypeCnt  = 1;
12515
                ssl->options.rpkState.sending_ClientCertTypes[0] = cmnType;
12516
                populate = 1;
12517
            }
12518
            /* case 5 */
12519
            else {
12520
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
12521
                SendAlert(ssl, alert_fatal, unsupported_certificate);
12522
                return UNSUPPORTED_CERTIFICATE;
12523
            }
12524
        }
12525
12526
        /* populate client_certificate_type extension */
12527
        if (populate) {
12528
            WOLFSSL_MSG("Adding Client Certificate Type extension");
12529
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
12530
                                                                    ssl->heap);
12531
            if (ret == 0) {
12532
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
12533
            }
12534
        }
12535
    }
12536
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12537
        /* parse it in client side */
12538
        if (length == 1) {
12539
            ssl->options.rpkState.received_ClientCertTypeCnt  = 1;
12540
            ssl->options.rpkState.received_ClientCertTypes[0] = *input;
12541
        }
12542
        else {
12543
            return BUFFER_E;
12544
        }
12545
    }
12546
12547
    return ret;
12548
}
12549
12550
/* Write out the "client certificate type" extension data into the given buffer.
12551
 * return the size wrote in the buffer on success, negative value on error.
12552
 */
12553
static word16 TLSX_ClientCertificateType_Write(void* data, byte* output,
12554
                                              byte msgType)
12555
{
12556
    WOLFSSL* ssl = (WOLFSSL*)data;
12557
    word16 idx = 0;
12558
    byte cnt = 0;
12559
    int i;
12560
12561
    /* skip to write extension if count is zero */
12562
    cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
12563
12564
    if (cnt == 0)
12565
        return 0;
12566
12567
    if (msgType == client_hello) {
12568
        /* client side */
12569
12570
        *(output + idx) = cnt;
12571
        idx += OPAQUE8_LEN;
12572
12573
        for (i = 0; i < cnt; i++) {
12574
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[i];
12575
            idx += OPAQUE8_LEN;
12576
        }
12577
        return idx;
12578
    }
12579
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12580
        /* sever side */
12581
        if (cnt == 1) {
12582
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[0];
12583
            idx += OPAQUE8_LEN;
12584
        }
12585
    }
12586
    return idx;
12587
}
12588
12589
/* Calculate then return the size of the "client certificate type" extension
12590
 * data.
12591
 * return the extension data size on success, negative value on error.
12592
*/
12593
static int TLSX_ClientCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
12594
{
12595
    int ret = 0;
12596
    byte cnt;
12597
12598
    if (ssl == NULL)
12599
        return BAD_FUNC_ARG;
12600
12601
    if (msgType == client_hello) {
12602
        /* client side */
12603
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
12604
        ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
12605
    }
12606
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12607
        /* server side */
12608
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;/* must be one */
12609
        if (cnt != 1)
12610
            return SANITY_MSG_E;
12611
        ret = OPAQUE8_LEN;
12612
    }
12613
    else {
12614
        return SANITY_MSG_E;
12615
    }
12616
    return ret;
12617
}
12618
12619
    #define CCT_GET_SIZE  TLSX_ClientCertificateType_GetSize
12620
    #define CCT_WRITE     TLSX_ClientCertificateType_Write
12621
    #define CCT_PARSE     TLSX_ClientCertificateType_Parse
12622
#else
12623
    #define CCT_GET_SIZE(a)  0
12624
    #define CCT_WRITE(a, b)  0
12625
    #define CCT_PARSE(a, b, c, d) 0
12626
#endif /* HAVE_RPK */
12627
12628
#if defined(HAVE_RPK)
12629
/******************************************************************************/
12630
/* Server_Certificate_Type extension                                          */
12631
/******************************************************************************/
12632
/* Creates a "server certificate type" extension if necessary.
12633
 * Returns 0 if no error occurred, negative value otherwise.
12634
 * A return of 0, it does not indicae that the extension was created.
12635
 */
12636
static int TLSX_ServerCertificateType_Use(WOLFSSL* ssl, byte isServer)
12637
{
12638
    int ret = 0;
12639
    byte ctype;
12640
12641
    if (ssl == NULL)
12642
        return BAD_FUNC_ARG;
12643
12644
    if (isServer) {
12645
        /* [in server side] */
12646
        /* find common cert type to both end */
12647
        if (GetCommonItem(
12648
                ssl->options.rpkConfig.preferred_ServerCertTypes,
12649
                ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
12650
                ssl->options.rpkState.received_ServerCertTypes,
12651
                ssl->options.rpkState.received_ServerCertTypeCnt,
12652
                &ctype)) {
12653
            ssl->options.rpkState.sending_ServerCertTypeCnt = 1;
12654
            ssl->options.rpkState.sending_ServerCertTypes[0] = ctype;
12655
12656
            /* Push new server_certificate_type extension. */
12657
            WOLFSSL_MSG("Adding Server Certificate Type extension");
12658
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
12659
                                                                    ssl->heap);
12660
            if (ret == 0) {
12661
                TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
12662
            }
12663
        }
12664
        else {
12665
            /* no common cert type found */
12666
            WOLFSSL_MSG("No common cert type found in server_certificate_type ext");
12667
            SendAlert(ssl, alert_fatal, unsupported_certificate);
12668
            ret = UNSUPPORTED_CERTIFICATE;
12669
        }
12670
    }
12671
    else {
12672
        /* [in client side] */
12673
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12674
                            ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
12675
                            ssl->options.rpkConfig.preferred_ServerCertTypes)) {
12676
12677
            ssl->options.rpkState.sending_ServerCertTypeCnt =
12678
                        ssl->options.rpkConfig.preferred_ServerCertTypeCnt;
12679
            XMEMCPY(ssl->options.rpkState.sending_ServerCertTypes,
12680
                    ssl->options.rpkConfig.preferred_ServerCertTypes,
12681
                    ssl->options.rpkConfig.preferred_ServerCertTypeCnt);
12682
12683
            /* Push new server_certificate_type extension. */
12684
            WOLFSSL_MSG("Adding Server Certificate Type extension");
12685
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
12686
                                                                    ssl->heap);
12687
        }
12688
        else {
12689
            WOLFSSL_MSG("No will to accept RPK cert");
12690
        }
12691
    }
12692
12693
    return ret;
12694
}
12695
12696
/* Parse a "server certificate type" extension received from peer.
12697
 * returns 0 on success and other values indicate failure.
12698
 */
12699
static int TLSX_ServerCertificateType_Parse(WOLFSSL* ssl, const byte* input,
12700
                                                word16 length, byte msgType)
12701
{
12702
    byte typeCnt;
12703
    int idx = 0;
12704
    int ret = 0;
12705
    int i;
12706
12707
    if (msgType == client_hello) {
12708
        /* in server side */
12709
12710
        if (length < OPAQUE8_LEN)
12711
            return BUFFER_E;
12712
12713
        typeCnt = input[idx];
12714
12715
        if (typeCnt > MAX_SERVER_CERT_TYPE_CNT)
12716
            return BUFFER_E;
12717
12718
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
12719
            return BUFFER_E;
12720
        }
12721
        ssl->options.rpkState.received_ServerCertTypeCnt = input[idx];
12722
        idx += OPAQUE8_LEN;
12723
12724
        for (i = 0; i < typeCnt; i++) {
12725
            ssl->options.rpkState.received_ServerCertTypes[i] = input[idx];
12726
            idx += OPAQUE8_LEN;
12727
        }
12728
12729
        ret = TLSX_ServerCertificateType_Use(ssl, 1);
12730
        if (ret == 0) {
12731
            TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
12732
        }
12733
    }
12734
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12735
        /* in client side */
12736
        if (length != 1)                     /* length slould be 1 */
12737
            return BUFFER_E;
12738
12739
        ssl->options.rpkState.received_ServerCertTypeCnt  = 1;
12740
        ssl->options.rpkState.received_ServerCertTypes[0] = *input;
12741
    }
12742
12743
    return 0;
12744
}
12745
12746
/* Write out the "server certificate type" extension data into the given buffer.
12747
 * return the size wrote in the buffer on success, negative value on error.
12748
 */
12749
static word16 TLSX_ServerCertificateType_Write(void* data, byte* output,
12750
                                                                byte msgType)
12751
{
12752
    WOLFSSL* ssl = (WOLFSSL*)data;
12753
    word16 idx = 0;
12754
    int cnt = 0;
12755
    int i;
12756
12757
    /* skip to write extension if count is zero */
12758
    cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
12759
12760
    if (cnt == 0)
12761
        return 0;
12762
12763
    if (msgType == client_hello) {
12764
        /* in client side */
12765
12766
        *(output + idx) = cnt;
12767
        idx += OPAQUE8_LEN;
12768
12769
        for (i = 0; i < cnt; i++) {
12770
            *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[i];
12771
            idx += OPAQUE8_LEN;
12772
        }
12773
    }
12774
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12775
        /* in server side */
12776
        /* ensure cnt is one */
12777
        if (cnt != 1)
12778
            return 0;
12779
12780
        *(output + idx) =  ssl->options.rpkState.sending_ServerCertTypes[0];
12781
        idx += OPAQUE8_LEN;
12782
    }
12783
    return idx;
12784
}
12785
12786
/* Calculate then return the size of the "server certificate type" extension
12787
 * data.
12788
 * return the extension data size on success, negative value on error.
12789
*/
12790
static int TLSX_ServerCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
12791
{
12792
    int ret = 0;
12793
    int cnt;
12794
12795
    if (ssl == NULL)
12796
        return BAD_FUNC_ARG;
12797
12798
    if (msgType == client_hello) {
12799
        /* in clent side */
12800
        cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
12801
        if (cnt > 0) {
12802
            ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
12803
        }
12804
    }
12805
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12806
        /* in server side */
12807
        ret = (int)OPAQUE8_LEN;
12808
    }
12809
    else {
12810
        return SANITY_MSG_E;
12811
    }
12812
    return ret;
12813
}
12814
12815
    #define SCT_GET_SIZE  TLSX_ServerCertificateType_GetSize
12816
    #define SCT_WRITE     TLSX_ServerCertificateType_Write
12817
    #define SCT_PARSE     TLSX_ServerCertificateType_Parse
12818
#else
12819
    #define SCT_GET_SIZE(a)  0
12820
    #define SCT_WRITE(a, b)  0
12821
    #define SCT_PARSE(a, b, c, d) 0
12822
#endif /* HAVE_RPK */
12823
12824
/******************************************************************************/
12825
/* TLS Extensions Framework                                                   */
12826
/******************************************************************************/
12827
12828
/** Finds an extension in the provided list. */
12829
TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
12830
593k
{
12831
593k
    TLSX* extension = list;
12832
12833
1.22M
    while (extension && extension->type != type)
12834
630k
        extension = extension->next;
12835
12836
593k
    return extension;
12837
593k
}
12838
12839
/** Remove an extension. */
12840
void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
12841
6.14k
{
12842
6.14k
    TLSX* extension;
12843
6.14k
    TLSX** next;
12844
12845
6.14k
    if (list == NULL)
12846
0
        return;
12847
12848
6.14k
    extension = *list;
12849
6.14k
    next = list;
12850
12851
47.0k
    while (extension && extension->type != type) {
12852
40.8k
        next = &extension->next;
12853
40.8k
        extension = extension->next;
12854
40.8k
    }
12855
12856
6.14k
    if (extension) {
12857
23
        *next = extension->next;
12858
23
        extension->next = NULL;
12859
23
        TLSX_FreeAll(extension, heap);
12860
23
    }
12861
6.14k
}
12862
12863
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
12864
#define GREASE_ECH_SIZE 160
12865
#define MAX_PUBLIC_NAME_SZ 256
12866
#define TLS_INFO_CONST_STRING "tls ech"
12867
#define TLS_INFO_CONST_STRING_SZ 7
12868
12869
/* return status after setting up ech to write a grease ech */
12870
static int TLSX_GreaseECH_Use(TLSX** extensions, void* heap, WC_RNG* rng)
12871
{
12872
    int ret = 0;
12873
    WOLFSSL_ECH* ech;
12874
12875
    if (extensions == NULL)
12876
        return BAD_FUNC_ARG;
12877
12878
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
12879
        DYNAMIC_TYPE_TMP_BUFFER);
12880
12881
    if (ech == NULL)
12882
        return MEMORY_E;
12883
12884
    ForceZero(ech, sizeof(WOLFSSL_ECH));
12885
12886
    ech->state = ECH_WRITE_GREASE;
12887
12888
    /* 0 for outer */
12889
    ech->type = ECH_TYPE_OUTER;
12890
    /* kemId */
12891
    ech->kemId = DHKEM_X25519_HKDF_SHA256;
12892
    /* cipherSuite kdf */
12893
    ech->cipherSuite.kdfId = HKDF_SHA256;
12894
    /* cipherSuite aead */
12895
    ech->cipherSuite.aeadId = HPKE_AES_128_GCM;
12896
12897
    /* random configId */
12898
    ret = wc_RNG_GenerateByte(rng, &(ech->configId));
12899
12900
    /* curve25519 encLen */
12901
    ech->encLen = DHKEM_X25519_ENC_LEN;
12902
12903
    if (ret == 0)
12904
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
12905
12906
    if (ret != 0) {
12907
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
12908
    }
12909
12910
    return ret;
12911
}
12912
12913
/* return status after setting up ech to write real ech */
12914
static int TLSX_ECH_Use(WOLFSSL_EchConfig* echConfig, TLSX** extensions,
12915
    void* heap, WC_RNG* rng)
12916
{
12917
    int ret = 0;
12918
    int suiteIndex;
12919
    TLSX* echX;
12920
    WOLFSSL_ECH* ech;
12921
    if (extensions == NULL)
12922
        return BAD_FUNC_ARG;
12923
    /* skip if we already have an ech extension, we will for hrr */
12924
    echX = TLSX_Find(*extensions, TLSX_ECH);
12925
    if (echX != NULL)
12926
        return 0;
12927
    /* find a supported cipher suite */
12928
    suiteIndex = EchConfigGetSupportedCipherSuite(echConfig);
12929
    if (suiteIndex < 0)
12930
        return suiteIndex;
12931
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
12932
        DYNAMIC_TYPE_TMP_BUFFER);
12933
    if (ech == NULL)
12934
        return MEMORY_E;
12935
    ForceZero(ech, sizeof(WOLFSSL_ECH));
12936
    ech->state = ECH_WRITE_REAL;
12937
    ech->echConfig = echConfig;
12938
    /* 0 for outer */
12939
    ech->type = ECH_TYPE_OUTER;
12940
    /* kemId */
12941
    ech->kemId = echConfig->kemId;
12942
    /* cipherSuite kdf */
12943
    ech->cipherSuite.kdfId = echConfig->cipherSuites[suiteIndex].kdfId;
12944
    /* cipherSuite aead */
12945
    ech->cipherSuite.aeadId = echConfig->cipherSuites[suiteIndex].aeadId;
12946
    /* configId */
12947
    ech->configId = echConfig->configId;
12948
    /* encLen */
12949
    switch (echConfig->kemId)
12950
    {
12951
        case DHKEM_P256_HKDF_SHA256:
12952
            ech->encLen = DHKEM_P256_ENC_LEN;
12953
            break;
12954
        case DHKEM_P384_HKDF_SHA384:
12955
            ech->encLen = DHKEM_P384_ENC_LEN;
12956
            break;
12957
        case DHKEM_P521_HKDF_SHA512:
12958
            ech->encLen = DHKEM_P521_ENC_LEN;
12959
            break;
12960
        case DHKEM_X25519_HKDF_SHA256:
12961
            ech->encLen = DHKEM_X25519_ENC_LEN;
12962
            break;
12963
        case DHKEM_X448_HKDF_SHA512:
12964
            ech->encLen = DHKEM_X448_ENC_LEN;
12965
            break;
12966
    }
12967
    /* setup hpke */
12968
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
12969
    if (ech->hpke == NULL) {
12970
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
12971
        return MEMORY_E;
12972
    }
12973
    ret = wc_HpkeInit(ech->hpke, ech->kemId, ech->cipherSuite.kdfId,
12974
        ech->cipherSuite.aeadId, heap);
12975
    /* setup the ephemeralKey */
12976
    if (ret == 0)
12977
        ret = wc_HpkeGenerateKeyPair(ech->hpke, &ech->ephemeralKey, rng);
12978
    if (ret == 0)
12979
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
12980
    if (ret != 0) {
12981
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
12982
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
12983
    }
12984
    return ret;
12985
}
12986
12987
/* return status after setting up ech to read and decrypt */
12988
static int TLSX_ServerECH_Use(TLSX** extensions, void* heap,
12989
    WOLFSSL_EchConfig* configs)
12990
{
12991
    int ret;
12992
    WOLFSSL_ECH* ech;
12993
    TLSX* echX;
12994
    if (extensions == NULL)
12995
        return BAD_FUNC_ARG;
12996
    /* if we already have ech don't override it */
12997
    echX = TLSX_Find(*extensions, TLSX_ECH);
12998
    if (echX != NULL)
12999
        return 0;
13000
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13001
        DYNAMIC_TYPE_TMP_BUFFER);
13002
    if (ech == NULL)
13003
        return MEMORY_E;
13004
    ForceZero(ech, sizeof(WOLFSSL_ECH));
13005
    ech->state = ECH_WRITE_NONE;
13006
    /* 0 for outer */
13007
    ech->type = ECH_TYPE_OUTER;
13008
    ech->echConfig = configs;
13009
    /* setup the rest of the settings when we receive ech from the client */
13010
    ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13011
    if (ret != 0)
13012
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13013
    return ret;
13014
}
13015
13016
/* return status after writing the ech and updating offset */
13017
static int TLSX_ECH_Write(WOLFSSL_ECH* ech, byte msgType, byte* writeBuf,
13018
    word16* offset)
13019
{
13020
    int ret = 0;
13021
    int rngRet = -1;
13022
    word32 configsLen = 0;
13023
    void* ephemeralKey = NULL;
13024
    byte* writeBuf_p = writeBuf;
13025
#ifdef WOLFSSL_SMALL_STACK
13026
    Hpke* hpke = NULL;
13027
    WC_RNG* rng = NULL;
13028
#else
13029
    Hpke hpke[1];
13030
    WC_RNG rng[1];
13031
#endif
13032
    WOLFSSL_MSG("TLSX_ECH_Write");
13033
    if (msgType == hello_retry_request) {
13034
        /* reserve space to write the confirmation to */
13035
        *offset += ECH_ACCEPT_CONFIRMATION_SZ;
13036
        /* set confBuf */
13037
        ech->confBuf = writeBuf;
13038
        return 0;
13039
    }
13040
    if (ech->state == ECH_WRITE_NONE || ech->state == ECH_PARSED_INTERNAL)
13041
        return 0;
13042
    if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
13043
        /* get size then write */
13044
        ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen);
13045
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13046
            return ret;
13047
        ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen);
13048
        if (ret != WOLFSSL_SUCCESS)
13049
            return ret;
13050
        *offset += configsLen;
13051
        return 0;
13052
    }
13053
    /* type */
13054
    *writeBuf_p = ech->type;
13055
    writeBuf_p += sizeof(ech->type);
13056
    /* outer has body, inner does not */
13057
    if (ech->type == ECH_TYPE_OUTER) {
13058
        /* kdfId */
13059
        c16toa(ech->cipherSuite.kdfId, writeBuf_p);
13060
        writeBuf_p += sizeof(ech->cipherSuite.kdfId);
13061
        /* aeadId */
13062
        c16toa(ech->cipherSuite.aeadId, writeBuf_p);
13063
        writeBuf_p += sizeof(ech->cipherSuite.aeadId);
13064
        /* configId */
13065
        *writeBuf_p = ech->configId;
13066
        writeBuf_p += sizeof(ech->configId);
13067
        /* encLen */
13068
        if (ech->hpkeContext == NULL) {
13069
            c16toa(ech->encLen, writeBuf_p);
13070
        }
13071
        else {
13072
            /* set to 0 if this is clientInner 2 */
13073
            c16toa(0, writeBuf_p);
13074
        }
13075
        writeBuf_p += 2;
13076
        if (ech->state == ECH_WRITE_GREASE) {
13077
#ifdef WOLFSSL_SMALL_STACK
13078
            hpke = (Hpke*)XMALLOC(sizeof(Hpke), NULL, DYNAMIC_TYPE_TMP_BUFFER);
13079
            if (hpke == NULL)
13080
                return MEMORY_E;
13081
            rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
13082
            if (rng == NULL) {
13083
                XFREE(hpke, NULL, DYNAMIC_TYPE_RNG);
13084
                return MEMORY_E;
13085
            }
13086
#endif
13087
            /* hpke init */
13088
            ret = wc_HpkeInit(hpke, ech->kemId, ech->cipherSuite.kdfId,
13089
                ech->cipherSuite.aeadId, NULL);
13090
            if (ret == 0)
13091
                rngRet = ret = wc_InitRng(rng);
13092
            /* create the ephemeralKey */
13093
            if (ret == 0)
13094
                ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng);
13095
            /* enc */
13096
            if (ret == 0) {
13097
                ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey, writeBuf_p,
13098
                    &ech->encLen);
13099
                writeBuf_p += ech->encLen;
13100
            }
13101
            if (ret == 0) {
13102
                /* innerClientHelloLen */
13103
                c16toa(GREASE_ECH_SIZE + ((writeBuf_p + 2 - writeBuf) % 32),
13104
                    writeBuf_p);
13105
                writeBuf_p += 2;
13106
13107
                /* innerClientHello */
13108
                ret = wc_RNG_GenerateBlock(rng, writeBuf_p, GREASE_ECH_SIZE +
13109
                    ((writeBuf_p - writeBuf) % 32));
13110
                writeBuf_p += GREASE_ECH_SIZE + ((writeBuf_p - writeBuf) % 32);
13111
            }
13112
            if (rngRet == 0)
13113
                wc_FreeRng(rng);
13114
            if (ephemeralKey != NULL)
13115
                wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap);
13116
            WC_FREE_VAR_EX(hpke, NULL, DYNAMIC_TYPE_TMP_BUFFER);
13117
            WC_FREE_VAR_EX(rng, NULL, DYNAMIC_TYPE_RNG);
13118
        }
13119
        else {
13120
            /* only write enc if this is our first ech, no hpke context */
13121
            if (ech->hpkeContext == NULL) {
13122
                /* write enc to writeBuf_p */
13123
                ret = wc_HpkeSerializePublicKey(ech->hpke, ech->ephemeralKey,
13124
                    writeBuf_p, &ech->encLen);
13125
                writeBuf_p += ech->encLen;
13126
            }
13127
            /* innerClientHelloLen */
13128
            c16toa(ech->innerClientHelloLen, writeBuf_p);
13129
            writeBuf_p += 2;
13130
            /* set payload offset for when we finalize */
13131
            ech->outerClientPayload = writeBuf_p;
13132
            /* write zeros for payload */
13133
            XMEMSET(writeBuf_p, 0, ech->innerClientHelloLen);
13134
            writeBuf_p += ech->innerClientHelloLen;
13135
        }
13136
    }
13137
    if (ret == 0)
13138
        *offset += (writeBuf_p - writeBuf);
13139
    return ret;
13140
}
13141
13142
/* return the size needed for the ech extension */
13143
static int TLSX_ECH_GetSize(WOLFSSL_ECH* ech, byte msgType)
13144
{
13145
    int ret;
13146
    word32 size = 0;
13147
13148
    if (ech->state == ECH_WRITE_GREASE) {
13149
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
13150
            sizeof(ech->configId) + sizeof(word16) + ech->encLen +
13151
            sizeof(word16);
13152
13153
        size += GREASE_ECH_SIZE + (size % 32);
13154
    }
13155
    else if (msgType == hello_retry_request) {
13156
        size = ECH_ACCEPT_CONFIRMATION_SZ;
13157
    }
13158
    else if (ech->state == ECH_WRITE_NONE ||
13159
        ech->state == ECH_PARSED_INTERNAL) {
13160
        size = 0;
13161
    }
13162
    else if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
13163
        /* get the size of the raw configs */
13164
        ret = GetEchConfigsEx(ech->echConfig, NULL, &size);
13165
13166
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13167
            return ret;
13168
    }
13169
    else if (ech->type == ECH_TYPE_INNER)
13170
    {
13171
        size = sizeof(ech->type);
13172
    }
13173
    else
13174
    {
13175
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
13176
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16) +
13177
            ech->innerClientHelloLen;
13178
        /* only set encLen if this is inner hello 1 */
13179
        if (ech->hpkeContext == NULL)
13180
            size += ech->encLen;
13181
    }
13182
13183
    return (int)size;
13184
}
13185
13186
/* return status after attempting to open the hpke encrypted ech extension, if
13187
 * successful the inner client hello will be stored in
13188
 * ech->innerClientHelloLen */
13189
static int TLSX_ExtractEch(WOLFSSL_ECH* ech, WOLFSSL_EchConfig* echConfig,
13190
    byte* aad, word32 aadLen, void* heap)
13191
{
13192
    int ret = 0;
13193
    int expectedEncLen;
13194
    int i;
13195
    word32 rawConfigLen = 0;
13196
    byte* info = NULL;
13197
    word32 infoLen = 0;
13198
    if (ech == NULL || echConfig == NULL || aad == NULL)
13199
        return BAD_FUNC_ARG;
13200
    /* verify the kem and key len */
13201
    switch (echConfig->kemId)
13202
    {
13203
        case DHKEM_P256_HKDF_SHA256:
13204
            expectedEncLen = DHKEM_P256_ENC_LEN;
13205
            break;
13206
        case DHKEM_P384_HKDF_SHA384:
13207
            expectedEncLen = DHKEM_P384_ENC_LEN;
13208
            break;
13209
        case DHKEM_P521_HKDF_SHA512:
13210
            expectedEncLen = DHKEM_P521_ENC_LEN;
13211
            break;
13212
        case DHKEM_X25519_HKDF_SHA256:
13213
            expectedEncLen = DHKEM_X25519_ENC_LEN;
13214
            break;
13215
        case DHKEM_X448_HKDF_SHA512:
13216
            expectedEncLen = DHKEM_X448_ENC_LEN;
13217
            break;
13218
        default:
13219
            expectedEncLen = 0;
13220
            break;
13221
    }
13222
    if (expectedEncLen != ech->encLen)
13223
        return BAD_FUNC_ARG;
13224
    /* verify the cipher suite */
13225
    for (i = 0; i < echConfig->numCipherSuites; i++) {
13226
        if (echConfig->cipherSuites[i].kdfId == ech->cipherSuite.kdfId &&
13227
            echConfig->cipherSuites[i].aeadId == ech->cipherSuite.aeadId) {
13228
            break;
13229
        }
13230
    }
13231
    if (i >= echConfig->numCipherSuites) {
13232
        return BAD_FUNC_ARG;
13233
    }
13234
    /* check if hpke already exists, may if HelloRetryRequest */
13235
    if (ech->hpke == NULL) {
13236
        ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
13237
        if (ech->hpke == NULL)
13238
            ret = MEMORY_E;
13239
        /* init the hpke struct */
13240
        if (ret == 0) {
13241
            ret = wc_HpkeInit(ech->hpke, echConfig->kemId,
13242
                ech->cipherSuite.kdfId, ech->cipherSuite.aeadId, heap);
13243
        }
13244
        if (ret == 0) {
13245
            /* allocate hpkeContext */
13246
            ech->hpkeContext =
13247
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
13248
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13249
            if (ech->hpkeContext == NULL)
13250
                ret = MEMORY_E;
13251
        }
13252
        /* get the rawConfigLen */
13253
        if (ret == 0)
13254
            ret = GetEchConfig(echConfig, NULL, &rawConfigLen);
13255
        if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13256
            ret = 0;
13257
        /* create info */
13258
        if (ret == 0) {
13259
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + rawConfigLen;
13260
            info = (byte*)XMALLOC(infoLen, heap, DYNAMIC_TYPE_TMP_BUFFER);
13261
13262
            if (info == NULL)
13263
                ret = MEMORY_E;
13264
            else {
13265
                XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
13266
                    TLS_INFO_CONST_STRING_SZ + 1);
13267
                ret = GetEchConfig(echConfig, info +
13268
                    TLS_INFO_CONST_STRING_SZ + 1, &rawConfigLen);
13269
            }
13270
        }
13271
        /* init the context for opening */
13272
        if (ret == 0) {
13273
            ret = wc_HpkeInitOpenContext(ech->hpke, ech->hpkeContext,
13274
                echConfig->receiverPrivkey, ech->enc, ech->encLen, info,
13275
                infoLen);
13276
        }
13277
    }
13278
    /* decrypt the ech payload */
13279
    if (ret == 0) {
13280
        ret = wc_HpkeContextOpenBase(ech->hpke, ech->hpkeContext, aad, aadLen,
13281
            ech->outerClientPayload, ech->innerClientHelloLen,
13282
            ech->innerClientHello + HANDSHAKE_HEADER_SZ);
13283
    }
13284
    /* free the hpke and context on failure */
13285
    if (ret != 0) {
13286
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13287
        ech->hpke = NULL;
13288
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
13289
        ech->hpkeContext = NULL;
13290
    }
13291
13292
    if (info != NULL)
13293
        XFREE(info, heap, DYNAMIC_TYPE_TMP_BUFFER);
13294
13295
    return ret;
13296
}
13297
13298
/* parse the ech extension, if internal update ech->state and return, if
13299
 * external attempt to extract the inner client_hello, return the status */
13300
static int TLSX_ECH_Parse(WOLFSSL* ssl, const byte* readBuf, word16 size,
13301
    byte msgType)
13302
{
13303
    int ret = 0;
13304
    int i;
13305
    TLSX* echX;
13306
    WOLFSSL_ECH* ech;
13307
    WOLFSSL_EchConfig* echConfig;
13308
    byte* aadCopy;
13309
    byte* readBuf_p = (byte*)readBuf;
13310
    WOLFSSL_MSG("TLSX_ECH_Parse");
13311
    if (size == 0)
13312
        return BAD_FUNC_ARG;
13313
    if (ssl->options.disableECH) {
13314
        WOLFSSL_MSG("TLSX_ECH_Parse: ECH disabled. Ignoring.");
13315
        return 0;
13316
    }
13317
    /* retry configs */
13318
    if (msgType == encrypted_extensions) {
13319
        ret = wolfSSL_SetEchConfigs(ssl, readBuf, size);
13320
13321
        if (ret == WOLFSSL_SUCCESS)
13322
            ret = 0;
13323
    }
13324
    /* HRR with special confirmation */
13325
    else if (msgType == hello_retry_request && ssl->options.useEch) {
13326
        /* length must be 8 */
13327
        if (size != ECH_ACCEPT_CONFIRMATION_SZ)
13328
            return BAD_FUNC_ARG;
13329
        /* get extension */
13330
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13331
        if (echX == NULL)
13332
            return BAD_FUNC_ARG;
13333
        ech = (WOLFSSL_ECH*)echX->data;
13334
        ech->confBuf = (byte*)readBuf;
13335
    }
13336
    else if (msgType == client_hello && ssl->ctx->echConfigs != NULL) {
13337
        /* get extension */
13338
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13339
        if (echX == NULL)
13340
            return BAD_FUNC_ARG;
13341
        ech = (WOLFSSL_ECH*)echX->data;
13342
        /* read the ech parameters before the payload */
13343
        ech->type = *readBuf_p;
13344
        readBuf_p++;
13345
        if (ech->type == ECH_TYPE_INNER) {
13346
            ech->state = ECH_PARSED_INTERNAL;
13347
            return 0;
13348
        }
13349
        /* technically the payload would only be 1 byte at this length */
13350
        if (size < 11 + ech->encLen)
13351
            return BAD_FUNC_ARG;
13352
        /* read kdfId */
13353
        ato16(readBuf_p, &ech->cipherSuite.kdfId);
13354
        readBuf_p += 2;
13355
        /* read aeadId */
13356
        ato16(readBuf_p, &ech->cipherSuite.aeadId);
13357
        readBuf_p += 2;
13358
        /* read configId */
13359
        ech->configId = *readBuf_p;
13360
        readBuf_p++;
13361
        /* only get enc if we don't already have the hpke context */
13362
        if (ech->hpkeContext == NULL) {
13363
            /* read encLen */
13364
            ato16(readBuf_p, &ech->encLen);
13365
            readBuf_p += 2;
13366
            if (ech->encLen > HPKE_Npk_MAX)
13367
                return BAD_FUNC_ARG;
13368
            /* read enc */
13369
            XMEMCPY(ech->enc, readBuf_p, ech->encLen);
13370
            readBuf_p += ech->encLen;
13371
        }
13372
        else {
13373
            readBuf_p += 2;
13374
        }
13375
        /* read hello inner len */
13376
        ato16(readBuf_p, &ech->innerClientHelloLen);
13377
        ech->innerClientHelloLen -= WC_AES_BLOCK_SIZE;
13378
        readBuf_p += 2;
13379
        ech->outerClientPayload = readBuf_p;
13380
        /* make a copy of the aad */
13381
        aadCopy = (byte*)XMALLOC(ech->aadLen, ssl->heap,
13382
            DYNAMIC_TYPE_TMP_BUFFER);
13383
        if (aadCopy == NULL)
13384
            return MEMORY_E;
13385
        XMEMCPY(aadCopy, ech->aad, ech->aadLen);
13386
        /* set the ech payload of the copy to zeros */
13387
        XMEMSET(aadCopy + (readBuf_p - ech->aad), 0,
13388
            ech->innerClientHelloLen + WC_AES_BLOCK_SIZE);
13389
        /* free the old ech in case this is our second client hello */
13390
        if (ech->innerClientHello != NULL)
13391
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13392
        /* allocate the inner payload buffer */
13393
        ech->innerClientHello =
13394
            (byte*)XMALLOC(ech->innerClientHelloLen + HANDSHAKE_HEADER_SZ,
13395
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13396
        if (ech->innerClientHello == NULL) {
13397
            XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13398
            return MEMORY_E;
13399
        }
13400
        /* first check if the config id matches */
13401
        echConfig = ssl->ctx->echConfigs;
13402
        while (echConfig != NULL) {
13403
            /* decrypt with this config */
13404
            if (echConfig->configId == ech->configId) {
13405
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
13406
                    ssl->heap);
13407
                break;
13408
            }
13409
            echConfig = echConfig->next;
13410
        }
13411
        /* try to decrypt with all configs */
13412
        if (echConfig == NULL || ret != 0) {
13413
            echConfig = ssl->ctx->echConfigs;
13414
            while (echConfig != NULL) {
13415
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
13416
                    ssl->heap);
13417
                if (ret== 0)
13418
                    break;
13419
                echConfig = echConfig->next;
13420
            }
13421
        }
13422
        /* if we failed to extract, set state to retry configs */
13423
        if (ret != 0) {
13424
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13425
            ech->innerClientHello = NULL;
13426
            ech->state = ECH_WRITE_RETRY_CONFIGS;
13427
        }
13428
        else {
13429
            i = 0;
13430
            /* decrement until before the padding */
13431
            while (ech->innerClientHello[ech->innerClientHelloLen +
13432
                HANDSHAKE_HEADER_SZ - i - 1] != ECH_TYPE_INNER) {
13433
                i++;
13434
            }
13435
            /* subtract the length of the padding from the length */
13436
            ech->innerClientHelloLen -= i;
13437
        }
13438
        XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13439
        return 0;
13440
    }
13441
13442
    return ret;
13443
}
13444
13445
/* free the ech struct and the dynamic buffer it uses */
13446
static void TLSX_ECH_Free(WOLFSSL_ECH* ech, void* heap)
13447
{
13448
    XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
13449
    if (ech->ephemeralKey != NULL)
13450
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
13451
            ech->hpke->heap);
13452
    if (ech->hpke != NULL)
13453
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13454
    if (ech->hpkeContext != NULL)
13455
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
13456
13457
    XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13458
    (void)heap;
13459
}
13460
13461
/* encrypt the client hello and store it in ech->outerClientPayload, return
13462
 * status */
13463
int TLSX_FinalizeEch(WOLFSSL_ECH* ech, byte* aad, word32 aadLen)
13464
{
13465
    int ret = 0;
13466
    void* receiverPubkey = NULL;
13467
    byte* info = NULL;
13468
    int infoLen = 0;
13469
    byte* aadCopy = NULL;
13470
    /* setup hpke context to seal, should be done at most once per connection */
13471
    if (ech->hpkeContext == NULL) {
13472
        /* import the server public key */
13473
        ret = wc_HpkeDeserializePublicKey(ech->hpke, &receiverPubkey,
13474
            ech->echConfig->receiverPubkey, ech->encLen);
13475
        if (ret == 0) {
13476
            /* allocate hpke context */
13477
            ech->hpkeContext =
13478
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
13479
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13480
            if (ech->hpkeContext == NULL)
13481
                ret = MEMORY_E;
13482
        }
13483
        if (ret == 0) {
13484
            /* create info */
13485
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + ech->echConfig->rawLen;
13486
            info = (byte*)XMALLOC(infoLen, ech->hpke->heap,
13487
                DYNAMIC_TYPE_TMP_BUFFER);
13488
            if (info == NULL)
13489
                ret = MEMORY_E;
13490
        }
13491
        if (ret == 0) {
13492
            /* puts the null byte in for me */
13493
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
13494
                TLS_INFO_CONST_STRING_SZ + 1);
13495
            XMEMCPY(info + TLS_INFO_CONST_STRING_SZ + 1,
13496
                ech->echConfig->raw, ech->echConfig->rawLen);
13497
            /* init the context for seal with info and keys */
13498
            ret = wc_HpkeInitSealContext(ech->hpke, ech->hpkeContext,
13499
                ech->ephemeralKey, receiverPubkey, info, infoLen);
13500
        }
13501
    }
13502
    if (ret == 0) {
13503
        /* make a copy of the aad since we overwrite it */
13504
        aadCopy = (byte*)XMALLOC(aadLen, ech->hpke->heap,
13505
            DYNAMIC_TYPE_TMP_BUFFER);
13506
        if (aadCopy == NULL) {
13507
            ret = MEMORY_E;
13508
        }
13509
    }
13510
    if (ret == 0) {
13511
        XMEMCPY(aadCopy, aad, aadLen);
13512
        /* seal the payload with context */
13513
        ret = wc_HpkeContextSealBase(ech->hpke, ech->hpkeContext, aadCopy,
13514
            aadLen, ech->innerClientHello,
13515
            ech->innerClientHelloLen - ech->hpke->Nt, ech->outerClientPayload);
13516
    }
13517
    if (info != NULL)
13518
        XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13519
    if (aadCopy != NULL)
13520
        XFREE(aadCopy, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13521
    if (receiverPubkey != NULL)
13522
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, receiverPubkey,
13523
            ech->hpke->heap);
13524
    return ret;
13525
}
13526
13527
#define GREASE_ECH_USE TLSX_GreaseECH_Use
13528
#define ECH_USE TLSX_ECH_Use
13529
#define SERVER_ECH_USE TLSX_ServerECH_Use
13530
#define ECH_WRITE TLSX_ECH_Write
13531
#define ECH_GET_SIZE TLSX_ECH_GetSize
13532
#define ECH_PARSE TLSX_ECH_Parse
13533
#define ECH_FREE TLSX_ECH_Free
13534
13535
#endif
13536
13537
/** Releases all extensions in the provided list. */
13538
void TLSX_FreeAll(TLSX* list, void* heap)
13539
4.85k
{
13540
4.85k
    TLSX* extension;
13541
13542
4.85k
    while ((extension = list)) {
13543
0
        list = extension->next;
13544
13545
0
        switch (extension->type) {
13546
#if defined(HAVE_RPK)
13547
            case TLSX_CLIENT_CERTIFICATE_TYPE:
13548
                WOLFSSL_MSG("Client Certificate Type extension free");
13549
                /* nothing to do */
13550
                break;
13551
            case TLSX_SERVER_CERTIFICATE_TYPE:
13552
                WOLFSSL_MSG("Server Certificate Type extension free");
13553
                /* nothing to do */
13554
                break;
13555
#endif
13556
13557
0
#ifdef HAVE_SNI
13558
0
            case TLSX_SERVER_NAME:
13559
0
                WOLFSSL_MSG("SNI extension free");
13560
0
                SNI_FREE_ALL((SNI*)extension->data, heap);
13561
0
                break;
13562
0
#endif
13563
13564
0
            case TLSX_TRUSTED_CA_KEYS:
13565
0
                WOLFSSL_MSG("Trusted CA Indication extension free");
13566
0
                TCA_FREE_ALL((TCA*)extension->data, heap);
13567
0
                break;
13568
13569
0
            case TLSX_MAX_FRAGMENT_LENGTH:
13570
0
                WOLFSSL_MSG("Max Fragment Length extension free");
13571
0
                MFL_FREE_ALL(extension->data, heap);
13572
0
                break;
13573
13574
0
            case TLSX_EXTENDED_MASTER_SECRET:
13575
0
                WOLFSSL_MSG("Extended Master Secret free");
13576
                /* Nothing to do. */
13577
0
                break;
13578
0
            case TLSX_TRUNCATED_HMAC:
13579
0
                WOLFSSL_MSG("Truncated HMAC extension free");
13580
                /* Nothing to do. */
13581
0
                break;
13582
13583
0
            case TLSX_SUPPORTED_GROUPS:
13584
0
                WOLFSSL_MSG("Supported Groups extension free");
13585
0
                EC_FREE_ALL((SupportedCurve*)extension->data, heap);
13586
0
                break;
13587
13588
0
            case TLSX_EC_POINT_FORMATS:
13589
0
                WOLFSSL_MSG("Point Formats extension free");
13590
0
                PF_FREE_ALL((PointFormat*)extension->data, heap);
13591
0
                break;
13592
13593
0
            case TLSX_STATUS_REQUEST:
13594
0
                WOLFSSL_MSG("Certificate Status Request extension free");
13595
0
                CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
13596
0
                break;
13597
13598
0
            case TLSX_STATUS_REQUEST_V2:
13599
0
                WOLFSSL_MSG("Certificate Status Request v2 extension free");
13600
0
                CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
13601
0
                        heap);
13602
0
                break;
13603
13604
0
            case TLSX_RENEGOTIATION_INFO:
13605
0
                WOLFSSL_MSG("Secure Renegotiation extension free");
13606
0
                SCR_FREE_ALL(extension->data, heap);
13607
0
                break;
13608
13609
0
            case TLSX_SESSION_TICKET:
13610
0
                WOLFSSL_MSG("Session Ticket extension free");
13611
0
                WOLF_STK_FREE(extension->data, heap);
13612
0
                break;
13613
13614
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
13615
0
                WOLFSSL_MSG("ALPN extension free");
13616
0
                ALPN_FREE_ALL((ALPN*)extension->data, heap);
13617
0
                break;
13618
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13619
0
            case TLSX_SIGNATURE_ALGORITHMS:
13620
0
                WOLFSSL_MSG("Signature Algorithms extension to free");
13621
0
                SA_FREE_ALL((SignatureAlgorithms*)extension->data, heap);
13622
0
                break;
13623
0
#endif
13624
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
13625
0
            case TLSX_ENCRYPT_THEN_MAC:
13626
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension free");
13627
0
                break;
13628
0
#endif
13629
13630
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13631
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13632
            case TLSX_PRE_SHARED_KEY:
13633
                WOLFSSL_MSG("Pre-Shared Key extension free");
13634
                PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
13635
                break;
13636
13637
        #ifdef WOLFSSL_TLS13
13638
            case TLSX_PSK_KEY_EXCHANGE_MODES:
13639
                WOLFSSL_MSG("PSK Key Exchange Modes extension free");
13640
                break;
13641
        #endif
13642
    #endif
13643
13644
0
            case TLSX_KEY_SHARE:
13645
0
                WOLFSSL_MSG("Key Share extension free");
13646
0
                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
13647
0
                break;
13648
0
#endif
13649
0
#ifdef WOLFSSL_TLS13
13650
0
            case TLSX_SUPPORTED_VERSIONS:
13651
0
                WOLFSSL_MSG("Supported Versions extension free");
13652
0
                break;
13653
13654
    #ifdef WOLFSSL_SEND_HRR_COOKIE
13655
            case TLSX_COOKIE:
13656
                WOLFSSL_MSG("Cookie extension free");
13657
                CKE_FREE_ALL((Cookie*)extension->data, heap);
13658
                break;
13659
    #endif
13660
13661
    #ifdef WOLFSSL_EARLY_DATA
13662
            case TLSX_EARLY_DATA:
13663
                WOLFSSL_MSG("Early Data extension free");
13664
                break;
13665
    #endif
13666
13667
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13668
            case TLSX_POST_HANDSHAKE_AUTH:
13669
                WOLFSSL_MSG("Post-Handshake Authentication extension free");
13670
                break;
13671
    #endif
13672
13673
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13674
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
13675
0
                WOLFSSL_MSG("Signature Algorithms extension free");
13676
0
                break;
13677
0
    #endif
13678
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13679
            case TLSX_CERTIFICATE_AUTHORITIES:
13680
                WOLFSSL_MSG("Certificate Authorities extension free");
13681
                break;
13682
    #endif
13683
0
#endif
13684
#ifdef WOLFSSL_SRTP
13685
            case TLSX_USE_SRTP:
13686
                WOLFSSL_MSG("SRTP extension free");
13687
                SRTP_FREE((TlsxSrtp*)extension->data, heap);
13688
                break;
13689
#endif
13690
13691
    #ifdef WOLFSSL_QUIC
13692
            case TLSX_KEY_QUIC_TP_PARAMS:
13693
                FALL_THROUGH;
13694
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
13695
                WOLFSSL_MSG("QUIC transport parameter free");
13696
                QTP_FREE((QuicTransportParam*)extension->data, heap);
13697
                break;
13698
    #endif
13699
13700
#ifdef WOLFSSL_DTLS_CID
13701
            case TLSX_CONNECTION_ID:
13702
                WOLFSSL_MSG("Connection ID extension free");
13703
                CID_FREE((byte*)extension->data, heap);
13704
                break;
13705
#endif /* WOLFSSL_DTLS_CID */
13706
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13707
            case TLSX_ECH:
13708
                WOLFSSL_MSG("ECH extension free");
13709
                ECH_FREE((WOLFSSL_ECH*)extension->data, heap);
13710
                break;
13711
#endif
13712
#ifdef WOLFSSL_DUAL_ALG_CERTS
13713
            case TLSX_CKS:
13714
                WOLFSSL_MSG("CKS extension free");
13715
                /* nothing to do */
13716
                break;
13717
#endif
13718
0
            default:
13719
0
                break;
13720
0
        }
13721
13722
0
        XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
13723
0
    }
13724
13725
4.85k
    (void)heap;
13726
4.85k
}
13727
13728
/** Checks if the tls extensions are supported based on the protocol version. */
13729
68.1k
int TLSX_SupportExtensions(WOLFSSL* ssl) {
13730
68.1k
    return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
13731
68.1k
}
13732
13733
/** Tells the buffered size of the extensions in a list. */
13734
static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
13735
                        word16* pLength)
13736
{
13737
    int    ret = 0;
13738
    TLSX*  extension;
13739
    word16 length = 0;
13740
    byte   isRequest = (msgType == client_hello ||
13741
                        msgType == certificate_request);
13742
13743
    while ((extension = list)) {
13744
        list = extension->next;
13745
13746
        /* only extensions marked as response are sent back to the client. */
13747
        if (!isRequest && !extension->resp)
13748
            continue; /* skip! */
13749
13750
        /* ssl level extensions are expected to override ctx level ones. */
13751
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
13752
            continue; /* skip! */
13753
13754
        /* extension type + extension data length. */
13755
        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
13756
13757
        switch (extension->type) {
13758
#ifdef WOLFSSL_DUAL_ALG_CERTS
13759
            case TLSX_CKS:
13760
                length += ((WOLFSSL*)extension->data)->sigSpecSz ;
13761
                break;
13762
#endif
13763
#ifdef HAVE_SNI
13764
            case TLSX_SERVER_NAME:
13765
                /* SNI only sends the name on the request. */
13766
                if (isRequest)
13767
                    length += SNI_GET_SIZE((SNI*)extension->data);
13768
                break;
13769
#endif
13770
13771
            case TLSX_TRUSTED_CA_KEYS:
13772
                /* TCA only sends the list on the request. */
13773
                if (isRequest)
13774
                    length += TCA_GET_SIZE((TCA*)extension->data);
13775
                break;
13776
13777
            case TLSX_MAX_FRAGMENT_LENGTH:
13778
                length += MFL_GET_SIZE(extension->data);
13779
                break;
13780
13781
            case TLSX_EXTENDED_MASTER_SECRET:
13782
            case TLSX_TRUNCATED_HMAC:
13783
                /* always empty. */
13784
                break;
13785
13786
            case TLSX_SUPPORTED_GROUPS:
13787
                length += EC_GET_SIZE((SupportedCurve*)extension->data);
13788
                break;
13789
13790
            case TLSX_EC_POINT_FORMATS:
13791
                length += PF_GET_SIZE((PointFormat*)extension->data);
13792
                break;
13793
13794
            case TLSX_STATUS_REQUEST:
13795
                length += CSR_GET_SIZE(
13796
                         (CertificateStatusRequest*)extension->data, isRequest);
13797
                break;
13798
13799
            case TLSX_STATUS_REQUEST_V2:
13800
                length += CSR2_GET_SIZE(
13801
                        (CertificateStatusRequestItemV2*)extension->data,
13802
                        isRequest);
13803
                break;
13804
13805
            case TLSX_RENEGOTIATION_INFO:
13806
                length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
13807
                        isRequest);
13808
                break;
13809
13810
            case TLSX_SESSION_TICKET:
13811
                length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
13812
                        isRequest);
13813
                break;
13814
13815
            case TLSX_APPLICATION_LAYER_PROTOCOL:
13816
                length += ALPN_GET_SIZE((ALPN*)extension->data);
13817
                break;
13818
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13819
            case TLSX_SIGNATURE_ALGORITHMS:
13820
                length += SA_GET_SIZE(extension->data);
13821
                break;
13822
#endif
13823
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
13824
            case TLSX_ENCRYPT_THEN_MAC:
13825
                ret = ETM_GET_SIZE(msgType, &length);
13826
                break;
13827
#endif /* HAVE_ENCRYPT_THEN_MAC */
13828
13829
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13830
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13831
            case TLSX_PRE_SHARED_KEY:
13832
                ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
13833
                                                                       &length);
13834
                break;
13835
        #ifdef WOLFSSL_TLS13
13836
            case TLSX_PSK_KEY_EXCHANGE_MODES:
13837
                ret = PKM_GET_SIZE((byte)extension->val, msgType, &length);
13838
                break;
13839
        #endif
13840
    #endif
13841
            case TLSX_KEY_SHARE:
13842
                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
13843
                break;
13844
#endif
13845
13846
#ifdef WOLFSSL_TLS13
13847
            case TLSX_SUPPORTED_VERSIONS:
13848
                ret = SV_GET_SIZE(extension->data, msgType, &length);
13849
                break;
13850
13851
    #ifdef WOLFSSL_SEND_HRR_COOKIE
13852
            case TLSX_COOKIE:
13853
                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &length);
13854
                break;
13855
    #endif
13856
13857
    #ifdef WOLFSSL_EARLY_DATA
13858
            case TLSX_EARLY_DATA:
13859
                ret = EDI_GET_SIZE(msgType, &length);
13860
                break;
13861
    #endif
13862
13863
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13864
            case TLSX_POST_HANDSHAKE_AUTH:
13865
                ret = PHA_GET_SIZE(msgType, &length);
13866
                break;
13867
    #endif
13868
13869
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13870
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
13871
                length += SAC_GET_SIZE(extension->data);
13872
                break;
13873
    #endif
13874
13875
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13876
            case TLSX_CERTIFICATE_AUTHORITIES:
13877
                length += CAN_GET_SIZE(extension->data);
13878
                break;
13879
    #endif
13880
#endif
13881
#ifdef WOLFSSL_SRTP
13882
            case TLSX_USE_SRTP:
13883
                length += SRTP_GET_SIZE((TlsxSrtp*)extension->data);
13884
                break;
13885
#endif
13886
13887
#ifdef HAVE_RPK
13888
            case TLSX_CLIENT_CERTIFICATE_TYPE:
13889
                length += CCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
13890
                break;
13891
13892
            case TLSX_SERVER_CERTIFICATE_TYPE:
13893
                length += SCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
13894
                break;
13895
#endif /* HAVE_RPK */
13896
13897
#ifdef WOLFSSL_QUIC
13898
            case TLSX_KEY_QUIC_TP_PARAMS:
13899
                FALL_THROUGH; /* followed by */
13900
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
13901
                length += QTP_GET_SIZE(extension);
13902
                break;
13903
#endif
13904
#ifdef WOLFSSL_DTLS_CID
13905
            case TLSX_CONNECTION_ID:
13906
                length += CID_GET_SIZE((byte*)extension->data);
13907
                break;
13908
#endif /* WOLFSSL_DTLS_CID */
13909
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13910
            case TLSX_ECH:
13911
                length += ECH_GET_SIZE((WOLFSSL_ECH*)extension->data, msgType);
13912
                break;
13913
#endif
13914
            default:
13915
                break;
13916
        }
13917
13918
        /* marks the extension as processed so ctx level */
13919
        /* extensions don't overlap with ssl level ones. */
13920
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
13921
    }
13922
13923
    *pLength += length;
13924
13925
    return ret;
13926
}
13927
13928
/** Writes the extensions of a list in a buffer. */
13929
static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
13930
                         byte msgType, word16* pOffset)
13931
{
13932
    int    ret = 0;
13933
    TLSX*  extension;
13934
    word16 offset = 0;
13935
    word16 length_offset = 0;
13936
    byte   isRequest = (msgType == client_hello ||
13937
                        msgType == certificate_request);
13938
13939
    while ((extension = list)) {
13940
        list = extension->next;
13941
13942
        /* only extensions marked as response are written in a response. */
13943
        if (!isRequest && !extension->resp)
13944
            continue; /* skip! */
13945
13946
        /* ssl level extensions are expected to override ctx level ones. */
13947
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
13948
            continue; /* skip! */
13949
13950
        /* writes extension type. */
13951
        c16toa((word16)extension->type, output + offset);
13952
        offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
13953
        length_offset = offset;
13954
13955
        /* extension data should be written internally. */
13956
        switch (extension->type) {
13957
#ifdef WOLFSSL_DUAL_ALG_CERTS
13958
            case TLSX_CKS:
13959
                WOLFSSL_MSG("CKS extension to write");
13960
                offset += CKS_WRITE(((WOLFSSL*)extension->data),
13961
                                    output + offset);
13962
                break;
13963
#endif
13964
#ifdef HAVE_SNI
13965
            case TLSX_SERVER_NAME:
13966
                if (isRequest) {
13967
                    WOLFSSL_MSG("SNI extension to write");
13968
                    offset += SNI_WRITE((SNI*)extension->data, output + offset);
13969
                }
13970
                break;
13971
#endif
13972
13973
            case TLSX_TRUSTED_CA_KEYS:
13974
                WOLFSSL_MSG("Trusted CA Indication extension to write");
13975
                if (isRequest) {
13976
                    offset += TCA_WRITE((TCA*)extension->data, output + offset);
13977
                }
13978
                break;
13979
13980
            case TLSX_MAX_FRAGMENT_LENGTH:
13981
                WOLFSSL_MSG("Max Fragment Length extension to write");
13982
                offset += MFL_WRITE((byte*)extension->data, output + offset);
13983
                break;
13984
13985
            case TLSX_EXTENDED_MASTER_SECRET:
13986
                WOLFSSL_MSG("Extended Master Secret");
13987
                /* always empty. */
13988
                break;
13989
13990
            case TLSX_TRUNCATED_HMAC:
13991
                WOLFSSL_MSG("Truncated HMAC extension to write");
13992
                /* always empty. */
13993
                break;
13994
13995
            case TLSX_SUPPORTED_GROUPS:
13996
                WOLFSSL_MSG("Supported Groups extension to write");
13997
                offset += EC_WRITE((SupportedCurve*)extension->data,
13998
                                    output + offset);
13999
                break;
14000
14001
            case TLSX_EC_POINT_FORMATS:
14002
                WOLFSSL_MSG("Point Formats extension to write");
14003
                offset += PF_WRITE((PointFormat*)extension->data,
14004
                                    output + offset);
14005
                break;
14006
14007
            case TLSX_STATUS_REQUEST:
14008
                WOLFSSL_MSG("Certificate Status Request extension to write");
14009
                ret = CSR_WRITE((CertificateStatusRequest*)extension->data,
14010
                        output + offset, isRequest);
14011
                if (ret > 0) {
14012
                    offset += (word16)ret;
14013
                    ret = 0;
14014
                }
14015
                break;
14016
14017
            case TLSX_STATUS_REQUEST_V2:
14018
                WOLFSSL_MSG("Certificate Status Request v2 extension to write");
14019
                ret = CSR2_WRITE(
14020
                        (CertificateStatusRequestItemV2*)extension->data,
14021
                        output + offset, isRequest);
14022
                if (ret > 0) {
14023
                    offset += (word16)ret;
14024
                    ret = 0;
14025
                }
14026
                break;
14027
14028
            case TLSX_RENEGOTIATION_INFO:
14029
                WOLFSSL_MSG("Secure Renegotiation extension to write");
14030
                offset += SCR_WRITE((SecureRenegotiation*)extension->data,
14031
                        output + offset, isRequest);
14032
                break;
14033
14034
            case TLSX_SESSION_TICKET:
14035
                WOLFSSL_MSG("Session Ticket extension to write");
14036
                offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
14037
                        output + offset, isRequest);
14038
                break;
14039
14040
            case TLSX_APPLICATION_LAYER_PROTOCOL:
14041
                WOLFSSL_MSG("ALPN extension to write");
14042
                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
14043
                break;
14044
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14045
            case TLSX_SIGNATURE_ALGORITHMS:
14046
                WOLFSSL_MSG("Signature Algorithms extension to write");
14047
                offset += SA_WRITE(extension->data, output + offset);
14048
                break;
14049
#endif
14050
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
14051
            case TLSX_ENCRYPT_THEN_MAC:
14052
                WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
14053
                ret = ETM_WRITE(extension->data, output, msgType, &offset);
14054
                break;
14055
#endif /* HAVE_ENCRYPT_THEN_MAC */
14056
14057
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
14058
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14059
            case TLSX_PRE_SHARED_KEY:
14060
                WOLFSSL_MSG("Pre-Shared Key extension to write");
14061
                ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
14062
                                                              msgType, &offset);
14063
                break;
14064
14065
        #ifdef WOLFSSL_TLS13
14066
            case TLSX_PSK_KEY_EXCHANGE_MODES:
14067
                WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
14068
                ret = PKM_WRITE((byte)extension->val, output + offset, msgType,
14069
                                                                       &offset);
14070
                break;
14071
        #endif
14072
    #endif
14073
            case TLSX_KEY_SHARE:
14074
                WOLFSSL_MSG("Key Share extension to write");
14075
                offset += KS_WRITE((KeyShareEntry*)extension->data,
14076
                                                      output + offset, msgType);
14077
                break;
14078
#endif
14079
#ifdef WOLFSSL_TLS13
14080
            case TLSX_SUPPORTED_VERSIONS:
14081
                WOLFSSL_MSG("Supported Versions extension to write");
14082
                ret = SV_WRITE(extension->data, output + offset, msgType,
14083
                                                                       &offset);
14084
                break;
14085
14086
    #ifdef WOLFSSL_SEND_HRR_COOKIE
14087
            case TLSX_COOKIE:
14088
                WOLFSSL_MSG("Cookie extension to write");
14089
                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
14090
                                msgType, &offset);
14091
                break;
14092
    #endif
14093
14094
    #ifdef WOLFSSL_EARLY_DATA
14095
            case TLSX_EARLY_DATA:
14096
                WOLFSSL_MSG("Early Data extension to write");
14097
                ret = EDI_WRITE(extension->val, output + offset, msgType,
14098
                                                                       &offset);
14099
                break;
14100
    #endif
14101
14102
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
14103
            case TLSX_POST_HANDSHAKE_AUTH:
14104
                WOLFSSL_MSG("Post-Handshake Authentication extension to write");
14105
                ret = PHA_WRITE(output + offset, msgType, &offset);
14106
                break;
14107
    #endif
14108
14109
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14110
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
14111
                WOLFSSL_MSG("Signature Algorithms extension to write");
14112
                offset += SAC_WRITE(extension->data, output + offset);
14113
                break;
14114
    #endif
14115
14116
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14117
            case TLSX_CERTIFICATE_AUTHORITIES:
14118
                WOLFSSL_MSG("Certificate Authorities extension to write");
14119
                offset += CAN_WRITE(extension->data, output + offset);
14120
                break;
14121
    #endif
14122
#endif
14123
#ifdef WOLFSSL_SRTP
14124
            case TLSX_USE_SRTP:
14125
                WOLFSSL_MSG("SRTP extension to write");
14126
                offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset);
14127
                break;
14128
#endif
14129
14130
#ifdef HAVE_RPK
14131
            case TLSX_CLIENT_CERTIFICATE_TYPE:
14132
                WOLFSSL_MSG("Client Certificate Type extension to write");
14133
                offset += CCT_WRITE(extension->data, output + offset, msgType);
14134
                break;
14135
14136
            case TLSX_SERVER_CERTIFICATE_TYPE:
14137
                WOLFSSL_MSG("Server Certificate Type extension to write");
14138
                offset += SCT_WRITE(extension->data, output + offset, msgType);
14139
                break;
14140
#endif /* HAVE_RPK */
14141
14142
#ifdef WOLFSSL_QUIC
14143
            case TLSX_KEY_QUIC_TP_PARAMS:
14144
                FALL_THROUGH;
14145
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
14146
                WOLFSSL_MSG("QUIC transport parameter to write");
14147
                offset += QTP_WRITE((QuicTransportParam*)extension->data,
14148
                                    output + offset);
14149
                break;
14150
#endif
14151
#ifdef WOLFSSL_DTLS_CID
14152
            case TLSX_CONNECTION_ID:
14153
                WOLFSSL_MSG("Connection ID extension to write");
14154
                offset += CID_WRITE((byte*)extension->data, output+offset);
14155
                break;
14156
14157
#endif /* WOLFSSL_DTLS_CID */
14158
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
14159
            case TLSX_ECH:
14160
                WOLFSSL_MSG("ECH extension to write");
14161
                ret = ECH_WRITE((WOLFSSL_ECH*)extension->data, msgType,
14162
                    output + offset, &offset);
14163
                break;
14164
#endif
14165
            default:
14166
                break;
14167
        }
14168
14169
        /* writes extension data length. */
14170
        c16toa(offset - length_offset, output + length_offset - OPAQUE16_LEN);
14171
14172
        /* marks the extension as processed so ctx level */
14173
        /* extensions don't overlap with ssl level ones. */
14174
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
14175
14176
        /* if we encountered an error propagate it */
14177
        if (ret != 0)
14178
            break;
14179
    }
14180
14181
    *pOffset += offset;
14182
14183
    return ret;
14184
}
14185
14186
#ifdef HAVE_SUPPORTED_CURVES
14187
14188
/* Populates the default supported groups / curves */
14189
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
14190
0
{
14191
0
    int ret = WOLFSSL_SUCCESS;
14192
0
#ifdef WOLFSSL_TLS13
14193
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14194
    if (ssl->options.resuming && ssl->session->namedGroup != 0) {
14195
        return TLSX_UseSupportedCurve(extensions, ssl->session->namedGroup,
14196
                                                                     ssl->heap);
14197
    }
14198
#endif
14199
14200
0
    if (ssl->numGroups != 0) {
14201
0
        int i;
14202
0
        for (i = 0; i < ssl->numGroups; i++) {
14203
0
            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap);
14204
0
            if (ret != WOLFSSL_SUCCESS)
14205
0
                return ret;
14206
0
        }
14207
0
        return WOLFSSL_SUCCESS;
14208
0
    }
14209
0
#endif /* WOLFSSL_TLS13 */
14210
14211
0
#if defined(HAVE_ECC)
14212
        /* list in order by strength, since not all servers choose by strength */
14213
0
        #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
14214
0
            #ifndef NO_ECC_SECP
14215
0
                ret = TLSX_UseSupportedCurve(extensions,
14216
0
                                              WOLFSSL_ECC_SECP521R1, ssl->heap);
14217
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14218
0
            #endif
14219
0
        #endif
14220
0
        #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
14221
0
            #ifdef HAVE_ECC_BRAINPOOL
14222
0
                ret = TLSX_UseSupportedCurve(extensions,
14223
0
                                        WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
14224
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14225
0
            #endif
14226
0
        #endif
14227
0
        #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
14228
0
            #ifndef NO_ECC_SECP
14229
0
                ret = TLSX_UseSupportedCurve(extensions,
14230
0
                                              WOLFSSL_ECC_SECP384R1, ssl->heap);
14231
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14232
0
            #endif
14233
0
            #ifdef HAVE_ECC_BRAINPOOL
14234
0
                ret = TLSX_UseSupportedCurve(extensions,
14235
0
                                        WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
14236
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14237
0
            #endif
14238
0
        #endif
14239
0
#endif /* HAVE_ECC */
14240
14241
0
        #ifndef HAVE_FIPS
14242
0
            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14243
0
                ret = TLSX_UseSupportedCurve(extensions,
14244
0
                                                   WOLFSSL_ECC_X448, ssl->heap);
14245
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14246
0
            #endif
14247
0
        #endif /* HAVE_FIPS */
14248
14249
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
14250
0
        #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
14251
0
            #ifndef NO_ECC_SECP
14252
0
                ret = TLSX_UseSupportedCurve(extensions,
14253
0
                                              WOLFSSL_ECC_SECP256R1, ssl->heap);
14254
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14255
0
            #endif
14256
0
            #ifdef HAVE_ECC_KOBLITZ
14257
0
                ret = TLSX_UseSupportedCurve(extensions,
14258
0
                                              WOLFSSL_ECC_SECP256K1, ssl->heap);
14259
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14260
0
            #endif
14261
0
            #ifdef HAVE_ECC_BRAINPOOL
14262
0
                ret = TLSX_UseSupportedCurve(extensions,
14263
0
                                        WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
14264
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14265
0
            #endif
14266
0
            #ifdef WOLFSSL_SM2
14267
0
                ret = TLSX_UseSupportedCurve(extensions,
14268
0
                                              WOLFSSL_ECC_SM2P256V1, ssl->heap);
14269
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14270
0
            #endif
14271
0
        #endif
14272
0
#endif /* HAVE_ECC */
14273
14274
0
        #ifndef HAVE_FIPS
14275
0
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14276
0
                ret = TLSX_UseSupportedCurve(extensions,
14277
0
                                                 WOLFSSL_ECC_X25519, ssl->heap);
14278
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14279
0
            #endif
14280
0
        #endif /* HAVE_FIPS */
14281
14282
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
14283
0
        #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
14284
0
            #ifndef NO_ECC_SECP
14285
0
                ret = TLSX_UseSupportedCurve(extensions,
14286
0
                                              WOLFSSL_ECC_SECP224R1, ssl->heap);
14287
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14288
0
            #endif
14289
0
            #ifdef HAVE_ECC_KOBLITZ
14290
0
                ret = TLSX_UseSupportedCurve(extensions,
14291
0
                                              WOLFSSL_ECC_SECP224K1, ssl->heap);
14292
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14293
0
            #endif
14294
0
        #endif
14295
14296
0
    #ifndef HAVE_FIPS
14297
0
        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
14298
0
            #ifndef NO_ECC_SECP
14299
0
                ret = TLSX_UseSupportedCurve(extensions,
14300
0
                                              WOLFSSL_ECC_SECP192R1, ssl->heap);
14301
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14302
0
            #endif
14303
0
            #ifdef HAVE_ECC_KOBLITZ
14304
0
                ret = TLSX_UseSupportedCurve(extensions,
14305
0
                                              WOLFSSL_ECC_SECP192K1, ssl->heap);
14306
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14307
0
            #endif
14308
0
        #endif
14309
0
        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
14310
0
            #ifndef NO_ECC_SECP
14311
0
                ret = TLSX_UseSupportedCurve(extensions,
14312
0
                                              WOLFSSL_ECC_SECP160R1, ssl->heap);
14313
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14314
0
            #endif
14315
0
            #ifdef HAVE_ECC_SECPR2
14316
0
                ret = TLSX_UseSupportedCurve(extensions,
14317
0
                                              WOLFSSL_ECC_SECP160R2, ssl->heap);
14318
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14319
0
            #endif
14320
0
            #ifdef HAVE_ECC_KOBLITZ
14321
0
                ret = TLSX_UseSupportedCurve(extensions,
14322
0
                                              WOLFSSL_ECC_SECP160K1, ssl->heap);
14323
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14324
0
            #endif
14325
0
        #endif
14326
0
    #endif /* HAVE_FIPS */
14327
0
#endif /* HAVE_ECC */
14328
14329
0
#ifndef NO_DH
14330
            /* Add FFDHE supported groups. */
14331
        #ifdef HAVE_FFDHE_8192
14332
            if (8192/8 >= ssl->options.minDhKeySz &&
14333
                                            8192/8 <= ssl->options.maxDhKeySz) {
14334
                ret = TLSX_UseSupportedCurve(extensions,
14335
                                             WOLFSSL_FFDHE_8192, ssl->heap);
14336
                if (ret != WOLFSSL_SUCCESS)
14337
                    return ret;
14338
            }
14339
        #endif
14340
        #ifdef HAVE_FFDHE_6144
14341
            if (6144/8 >= ssl->options.minDhKeySz &&
14342
                                            6144/8 <= ssl->options.maxDhKeySz) {
14343
                ret = TLSX_UseSupportedCurve(extensions,
14344
                                             WOLFSSL_FFDHE_6144, ssl->heap);
14345
                if (ret != WOLFSSL_SUCCESS)
14346
                    return ret;
14347
            }
14348
        #endif
14349
        #ifdef HAVE_FFDHE_4096
14350
            if (4096/8 >= ssl->options.minDhKeySz &&
14351
                                            4096/8 <= ssl->options.maxDhKeySz) {
14352
                ret = TLSX_UseSupportedCurve(extensions,
14353
                                             WOLFSSL_FFDHE_4096, ssl->heap);
14354
                if (ret != WOLFSSL_SUCCESS)
14355
                    return ret;
14356
            }
14357
        #endif
14358
        #ifdef HAVE_FFDHE_3072
14359
            if (3072/8 >= ssl->options.minDhKeySz &&
14360
                                            3072/8 <= ssl->options.maxDhKeySz) {
14361
                ret = TLSX_UseSupportedCurve(extensions,
14362
                                             WOLFSSL_FFDHE_3072, ssl->heap);
14363
                if (ret != WOLFSSL_SUCCESS)
14364
                    return ret;
14365
            }
14366
        #endif
14367
0
        #ifdef HAVE_FFDHE_2048
14368
0
            if (2048/8 >= ssl->options.minDhKeySz &&
14369
0
                                            2048/8 <= ssl->options.maxDhKeySz) {
14370
0
                ret = TLSX_UseSupportedCurve(extensions,
14371
0
                                             WOLFSSL_FFDHE_2048, ssl->heap);
14372
0
                if (ret != WOLFSSL_SUCCESS)
14373
0
                    return ret;
14374
0
            }
14375
0
        #endif
14376
0
#endif
14377
14378
#ifdef WOLFSSL_HAVE_MLKEM
14379
#ifndef WOLFSSL_NO_ML_KEM
14380
#ifdef WOLFSSL_WC_MLKEM
14381
#ifndef WOLFSSL_NO_ML_KEM_512
14382
    if (ret == WOLFSSL_SUCCESS)
14383
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512,
14384
                                     ssl->heap);
14385
    if (ret == WOLFSSL_SUCCESS)
14386
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM512,
14387
                                     ssl->heap);
14388
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14389
    if (ret == WOLFSSL_SUCCESS)
14390
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM512,
14391
                                     ssl->heap);
14392
    #endif
14393
#endif
14394
#ifndef WOLFSSL_NO_ML_KEM_768
14395
    if (ret == WOLFSSL_SUCCESS)
14396
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
14397
                                     ssl->heap);
14398
    if (ret == WOLFSSL_SUCCESS)
14399
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM768,
14400
                                     ssl->heap);
14401
    if (ret == WOLFSSL_SUCCESS)
14402
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM768,
14403
                                     ssl->heap);
14404
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14405
    if (ret == WOLFSSL_SUCCESS)
14406
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM768,
14407
                                     ssl->heap);
14408
    #endif
14409
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14410
    if (ret == WOLFSSL_SUCCESS)
14411
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448MLKEM768,
14412
                                     ssl->heap);
14413
    #endif
14414
#endif
14415
#ifndef WOLFSSL_NO_ML_KEM_1024
14416
    if (ret == WOLFSSL_SUCCESS)
14417
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
14418
                                     ssl->heap);
14419
    if (ret == WOLFSSL_SUCCESS)
14420
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP521R1MLKEM1024,
14421
                                     ssl->heap);
14422
    if (ret == WOLFSSL_SUCCESS)
14423
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM1024,
14424
                                     ssl->heap);
14425
#endif
14426
#elif defined(HAVE_LIBOQS)
14427
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512, ssl->heap);
14428
    if (ret == WOLFSSL_SUCCESS)
14429
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
14430
                                     ssl->heap);
14431
    if (ret == WOLFSSL_SUCCESS)
14432
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
14433
                                     ssl->heap);
14434
    if (ret == WOLFSSL_SUCCESS)
14435
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM512,
14436
                                     ssl->heap);
14437
    if (ret == WOLFSSL_SUCCESS)
14438
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM768,
14439
                                     ssl->heap);
14440
    if (ret == WOLFSSL_SUCCESS)
14441
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP256R1MLKEM768,
14442
                                     ssl->heap);
14443
    if (ret == WOLFSSL_SUCCESS)
14444
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP521R1MLKEM1024,
14445
                                     ssl->heap);
14446
    if (ret == WOLFSSL_SUCCESS)
14447
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_SECP384R1MLKEM1024,
14448
                                     ssl->heap);
14449
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14450
    if (ret == WOLFSSL_SUCCESS)
14451
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM512,
14452
                                     ssl->heap);
14453
    if (ret == WOLFSSL_SUCCESS)
14454
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519MLKEM768,
14455
                                     ssl->heap);
14456
    #endif
14457
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14458
    if (ret == WOLFSSL_SUCCESS)
14459
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448MLKEM768,
14460
                                     ssl->heap);
14461
    #endif
14462
#endif /* HAVE_LIBOQS */
14463
#endif /* !WOLFSSL_NO_ML_KEM */
14464
#ifdef WOLFSSL_MLKEM_KYBER
14465
#ifdef WOLFSSL_WC_MLKEM
14466
#ifdef WOLFSSL_KYBER512
14467
    if (ret == WOLFSSL_SUCCESS)
14468
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1,
14469
                                     ssl->heap);
14470
    if (ret == WOLFSSL_SUCCESS)
14471
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
14472
                                     ssl->heap);
14473
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14474
    if (ret == WOLFSSL_SUCCESS)
14475
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
14476
                                     ssl->heap);
14477
    #endif
14478
#endif
14479
#ifdef WOLFSSL_KYBER768
14480
    if (ret == WOLFSSL_SUCCESS)
14481
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
14482
                                     ssl->heap);
14483
    if (ret == WOLFSSL_SUCCESS)
14484
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
14485
                                     ssl->heap);
14486
    if (ret == WOLFSSL_SUCCESS)
14487
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
14488
                                     ssl->heap);
14489
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14490
    if (ret == WOLFSSL_SUCCESS)
14491
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
14492
                                     ssl->heap);
14493
    #endif
14494
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14495
    if (ret == WOLFSSL_SUCCESS)
14496
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
14497
                                     ssl->heap);
14498
    #endif
14499
#endif
14500
#ifdef WOLFSSL_KYBER1024
14501
    if (ret == WOLFSSL_SUCCESS)
14502
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
14503
                                     ssl->heap);
14504
    if (ret == WOLFSSL_SUCCESS)
14505
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
14506
                                     ssl->heap);
14507
#endif
14508
#elif defined(HAVE_LIBOQS)
14509
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap);
14510
    if (ret == WOLFSSL_SUCCESS)
14511
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
14512
                                     ssl->heap);
14513
    if (ret == WOLFSSL_SUCCESS)
14514
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
14515
                                     ssl->heap);
14516
    if (ret == WOLFSSL_SUCCESS)
14517
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
14518
                                     ssl->heap);
14519
    if (ret == WOLFSSL_SUCCESS)
14520
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
14521
                                     ssl->heap);
14522
    if (ret == WOLFSSL_SUCCESS)
14523
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
14524
                                     ssl->heap);
14525
    if (ret == WOLFSSL_SUCCESS)
14526
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
14527
                                     ssl->heap);
14528
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14529
    if (ret == WOLFSSL_SUCCESS)
14530
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
14531
                                     ssl->heap);
14532
    if (ret == WOLFSSL_SUCCESS)
14533
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
14534
                                     ssl->heap);
14535
    #endif
14536
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14537
    if (ret == WOLFSSL_SUCCESS)
14538
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
14539
                                     ssl->heap);
14540
    #endif
14541
#endif /* HAVE_LIBOQS */
14542
#endif /* WOLFSSL_MLKEM_KYBER */
14543
#endif /* WOLFSSL_HAVE_MLKEM */
14544
14545
0
    (void)ssl;
14546
0
    (void)extensions;
14547
14548
0
    return ret;
14549
0
}
14550
14551
#endif /* HAVE_SUPPORTED_CURVES */
14552
14553
int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
14554
0
{
14555
0
    int ret = 0;
14556
0
    byte* public_key      = NULL;
14557
0
    word16 public_key_len = 0;
14558
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
14559
    int usingPSK = 0;
14560
#endif
14561
0
#if defined(HAVE_SUPPORTED_CURVES) && defined(WOLFSSL_TLS13)
14562
0
    TLSX* extension = NULL;
14563
0
    word16 namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
14564
0
#endif
14565
14566
    /* server will add extension depending on what is parsed from client */
14567
0
    if (!isServer) {
14568
#if defined(HAVE_RPK)
14569
        ret = TLSX_ClientCertificateType_Use(ssl, isServer);
14570
        if (ret != 0)
14571
            return ret;
14572
14573
        ret = TLSX_ServerCertificateType_Use(ssl, isServer);
14574
        if (ret != 0)
14575
            return ret;
14576
#endif /* HAVE_RPK */
14577
14578
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) && \
14579
0
    !defined(WOLFSSL_NO_TLS12)
14580
0
        if (!ssl->options.disallowEncThenMac) {
14581
0
            ret = TLSX_EncryptThenMac_Use(ssl);
14582
0
            if (ret != 0)
14583
0
                return ret;
14584
0
        }
14585
0
#endif
14586
14587
0
#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
14588
0
                       defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
14589
0
        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
14590
0
            if (TLSX_Find(ssl->ctx->extensions,
14591
0
                                               TLSX_SUPPORTED_GROUPS) == NULL) {
14592
0
                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
14593
0
                if (ret != WOLFSSL_SUCCESS)
14594
0
                    return ret;
14595
0
            }
14596
0
        }
14597
0
        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
14598
0
               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
14599
0
               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
14600
0
             ret = TLSX_UsePointFormat(&ssl->extensions,
14601
0
                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
14602
0
             if (ret != WOLFSSL_SUCCESS)
14603
0
                 return ret;
14604
0
        }
14605
0
#endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
14606
14607
#ifdef WOLFSSL_SRTP
14608
        if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
14609
            WOLFSSL_MSG("Adding DTLS SRTP extension");
14610
            if ((ret = TLSX_UseSRTP(&ssl->extensions, ssl->dtlsSrtpProfiles,
14611
                                                                ssl->heap)) != 0) {
14612
                return ret;
14613
            }
14614
        }
14615
#endif
14616
#ifdef WOLFSSL_DUAL_ALG_CERTS
14617
        if ((IsAtLeastTLSv1_3(ssl->version)) && (ssl->sigSpec != NULL)) {
14618
            WOLFSSL_MSG("Adding CKS extension");
14619
            if ((ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap)) != 0) {
14620
                return ret;
14621
            }
14622
        }
14623
#endif
14624
0
    } /* is not server */
14625
14626
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14627
0
    WOLFSSL_MSG("Adding signature algorithms extension");
14628
0
    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
14629
0
                                                                         != 0) {
14630
0
            return ret;
14631
0
    }
14632
#else
14633
    ret = 0;
14634
#endif
14635
0
#ifdef WOLFSSL_TLS13
14636
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14637
        if (IsAtLeastTLSv1_3(ssl->version) &&
14638
                SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
14639
            WOLFSSL_MSG("Adding certificate authorities extension");
14640
            if ((ret = TLSX_Push(&ssl->extensions,
14641
                    TLSX_CERTIFICATE_AUTHORITIES, ssl, ssl->heap)) != 0) {
14642
                    return ret;
14643
            }
14644
        }
14645
    #endif
14646
0
        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
14647
            /* Add mandatory TLS v1.3 extension: supported version */
14648
0
            WOLFSSL_MSG("Adding supported versions extension");
14649
0
            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
14650
0
                                                             ssl->heap)) != 0) {
14651
0
                return ret;
14652
0
            }
14653
14654
    #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && \
14655
                       !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)
14656
        if (TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
14657
            /* Put in DH groups for TLS 1.3 only. */
14658
            ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
14659
            if (ret != WOLFSSL_SUCCESS)
14660
                return ret;
14661
        /* ret value will be overwritten in !NO_PSK case */
14662
        #ifdef NO_PSK
14663
            ret = 0;
14664
        #endif
14665
        }
14666
    #endif /* !(HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
14667
14668
0
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14669
0
            if (ssl->certHashSigAlgoSz > 0) {
14670
0
                WOLFSSL_MSG("Adding signature algorithms cert extension");
14671
0
                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
14672
0
                                                        ssl, ssl->heap)) != 0) {
14673
0
                    return ret;
14674
0
                }
14675
0
            }
14676
0
        #endif
14677
14678
0
        #if defined(HAVE_SUPPORTED_CURVES)
14679
0
            extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
14680
0
            if (extension == NULL) {
14681
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14682
                if (ssl->options.resuming && ssl->session->namedGroup != 0)
14683
                    namedGroup = ssl->session->namedGroup;
14684
                else
14685
            #endif
14686
0
                if (ssl->numGroups > 0) {
14687
0
                    int set = 0;
14688
0
                    int i, j;
14689
14690
                    /* try to find the highest element in ssl->group[]
14691
                     * that is contained in preferredGroup[].
14692
                     */
14693
0
                    namedGroup = preferredGroup[0];
14694
0
                    for (i = 0; i < ssl->numGroups && !set; i++) {
14695
0
                        for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
14696
0
                            if (preferredGroup[j] == ssl->group[i]
14697
#ifdef HAVE_LIBOQS
14698
                                && TLSX_IsGroupSupported(preferredGroup[j])
14699
#endif
14700
0
                                                                ) {
14701
0
                                namedGroup = ssl->group[i];
14702
0
                                set = 1;
14703
0
                                break;
14704
0
                            }
14705
0
                        }
14706
0
                    }
14707
0
                    if (!set)
14708
0
                        namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
14709
0
                }
14710
0
                else {
14711
                    /* Choose the most preferred group. */
14712
0
                    namedGroup = preferredGroup[0];
14713
#ifdef HAVE_LIBOQS
14714
                    if (!TLSX_IsGroupSupported(namedGroup)) {
14715
                        int i = 1;
14716
                        for (;preferredGroup[i] != WOLFSSL_NAMED_GROUP_INVALID;
14717
                              i++) {
14718
                            if (TLSX_IsGroupSupported(preferredGroup[i]))
14719
                                break;
14720
                        }
14721
                        namedGroup = preferredGroup[i];
14722
                    }
14723
#endif
14724
0
                }
14725
0
            }
14726
0
            else {
14727
0
                KeyShareEntry* kse = (KeyShareEntry*)extension->data;
14728
0
                if (kse)
14729
0
                    namedGroup = kse->group;
14730
0
            }
14731
0
            if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
14732
0
                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
14733
0
                        &ssl->extensions);
14734
0
                if (ret != 0)
14735
0
                    return ret;
14736
0
            }
14737
0
        #endif /* HAVE_SUPPORTED_CURVES */
14738
14739
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14740
            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
14741
        #endif
14742
        #if defined(HAVE_SESSION_TICKET)
14743
            if (ssl->options.resuming && ssl->session->ticketLen > 0) {
14744
                WOLFSSL_SESSION* sess = ssl->session;
14745
            #ifdef WOLFSSL_32BIT_MILLI_TIME
14746
                word32 now, milli;
14747
            #else
14748
                word64 now, milli;
14749
            #endif
14750
14751
                /* Determine the MAC algorithm for the cipher suite used. */
14752
                ssl->options.cipherSuite0 = sess->cipherSuite0;
14753
                ssl->options.cipherSuite  = sess->cipherSuite;
14754
                ret = SetCipherSpecs(ssl);
14755
                if (ret != 0)
14756
                    return ret;
14757
                now = (word64)TimeNowInMilliseconds();
14758
                if (now == 0)
14759
                    return GETTIME_ERROR;
14760
            #ifdef WOLFSSL_32BIT_MILLI_TIME
14761
                if (now < sess->ticketSeen)
14762
                    milli = (0xFFFFFFFFU - sess->ticketSeen) + 1 + now;
14763
                else
14764
                    milli = now - sess->ticketSeen;
14765
                milli += sess->ticketAdd;
14766
14767
                /* Pre-shared key is mandatory extension for resumption. */
14768
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
14769
                    sess->ticketLen, milli, ssl->specs.mac_algorithm,
14770
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
14771
                    NULL, ssl->heap);
14772
            #else
14773
                milli = now - sess->ticketSeen + sess->ticketAdd;
14774
14775
                /* Pre-shared key is mandatory extension for resumption. */
14776
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
14777
                    sess->ticketLen, (word32)milli, ssl->specs.mac_algorithm,
14778
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
14779
                    NULL, ssl->heap);
14780
            #endif
14781
                if (ret != 0)
14782
                    return ret;
14783
14784
                usingPSK = 1;
14785
            }
14786
        #endif
14787
    #ifndef NO_PSK
14788
        #ifndef WOLFSSL_PSK_ONE_ID
14789
            if (ssl->options.client_psk_cs_cb != NULL) {
14790
                int i;
14791
                const Suites* suites = WOLFSSL_SUITES(ssl);
14792
                for (i = 0; i < suites->suiteSz; i += 2) {
14793
                    byte cipherSuite0 = suites->suites[i + 0];
14794
                    byte cipherSuite = suites->suites[i + 1];
14795
                    unsigned int keySz;
14796
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14797
                    int cnt = 0;
14798
                #endif
14799
14800
                #ifdef HAVE_NULL_CIPHER
14801
                    if (cipherSuite0 == ECC_BYTE ||
14802
                        cipherSuite0 == ECDHE_PSK_BYTE) {
14803
                        if (cipherSuite != TLS_SHA256_SHA256 &&
14804
                                             cipherSuite != TLS_SHA384_SHA384) {
14805
                            continue;
14806
                        }
14807
                    }
14808
                    else
14809
                #endif
14810
                #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
14811
                    defined(WOLFSSL_SM3)
14812
                    if (cipherSuite0 == CIPHER_BYTE) {
14813
                        if ((cipherSuite != TLS_SM4_GCM_SM3) &&
14814
                            (cipherSuite != TLS_SM4_CCM_SM3)) {
14815
                            continue;
14816
                        }
14817
                    }
14818
                    else
14819
                #endif
14820
                    if (cipherSuite0 != TLS13_BYTE)
14821
                        continue;
14822
14823
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14824
                    do {
14825
                        ssl->arrays->client_identity[0] = cnt;
14826
                #endif
14827
14828
                        ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
14829
                        keySz = ssl->options.client_psk_cs_cb(
14830
                            ssl, ssl->arrays->server_hint,
14831
                            ssl->arrays->client_identity, MAX_PSK_ID_LEN,
14832
                            ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
14833
                            GetCipherNameInternal(cipherSuite0, cipherSuite));
14834
                        if (keySz > 0) {
14835
                            ssl->arrays->psk_keySz = keySz;
14836
                            ret = TLSX_PreSharedKey_Use(&ssl->extensions,
14837
                                (byte*)ssl->arrays->client_identity,
14838
                                (word16)XSTRLEN(ssl->arrays->client_identity),
14839
                                0, SuiteMac(WOLFSSL_SUITES(ssl)->suites + i),
14840
                                cipherSuite0, cipherSuite, 0, NULL, ssl->heap);
14841
                            if (ret != 0)
14842
                                return ret;
14843
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14844
                            cnt++;
14845
                #endif
14846
                        }
14847
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14848
                    }
14849
                    while (keySz > 0);
14850
                #endif
14851
                }
14852
14853
                usingPSK = 1;
14854
            }
14855
            else
14856
        #endif
14857
            if (ssl->options.client_psk_cb != NULL ||
14858
                ssl->options.client_psk_tls13_cb != NULL) {
14859
                /* Default cipher suite. */
14860
                byte cipherSuite0 = TLS13_BYTE;
14861
                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
14862
                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
14863
                const char* cipherName = NULL;
14864
14865
                if (ssl->options.client_psk_tls13_cb != NULL) {
14866
                    ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
14867
                        ssl, ssl->arrays->server_hint,
14868
                        ssl->arrays->client_identity, MAX_PSK_ID_LEN,
14869
                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
14870
                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
14871
                            &cipherSuite, NULL, NULL, &cipherSuiteFlags) != 0) {
14872
                        return PSK_KEY_ERROR;
14873
                    }
14874
                }
14875
                else {
14876
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
14877
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
14878
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
14879
                }
14880
                if (
14881
                #ifdef OPENSSL_EXTRA
14882
                    /* OpenSSL treats a PSK key length of 0
14883
                     * to indicate no PSK available.
14884
                     */
14885
                    ssl->arrays->psk_keySz == 0 ||
14886
                #endif
14887
                         (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
14888
                     (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
14889
                #ifndef OPENSSL_EXTRA
14890
                    ret = PSK_KEY_ERROR;
14891
                #endif
14892
                }
14893
                else {
14894
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
14895
14896
                    ssl->options.cipherSuite0 = cipherSuite0;
14897
                    ssl->options.cipherSuite  = cipherSuite;
14898
                    (void)cipherSuiteFlags;
14899
                    ret = SetCipherSpecs(ssl);
14900
                    if (ret == 0) {
14901
                        ret = TLSX_PreSharedKey_Use(
14902
                            &ssl->extensions,
14903
                                     (byte*)ssl->arrays->client_identity,
14904
                            (word16)XSTRLEN(ssl->arrays->client_identity),
14905
                            0, ssl->specs.mac_algorithm,
14906
                            cipherSuite0, cipherSuite, 0,
14907
                            NULL, ssl->heap);
14908
                    }
14909
                    if (ret == 0)
14910
                        usingPSK = 1;
14911
                }
14912
                if (ret != 0)
14913
                    return ret;
14914
            }
14915
    #endif /* !NO_PSK */
14916
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14917
14918
            /* Some servers do not generate session tickets unless
14919
             * the extension is seen in a non-resume client hello.
14920
             * We used to send it only if we were otherwise using PSK.
14921
             * Now always send it. Define NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
14922
             * to revert to the old behaviour. */
14923
            #ifdef NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
14924
            if (usingPSK)
14925
            #endif
14926
            {
14927
                byte modes = 0;
14928
14929
                (void)usingPSK;
14930
                /* Pre-shared key modes: mandatory extension for resumption. */
14931
            #ifdef HAVE_SUPPORTED_CURVES
14932
                if (!ssl->options.onlyPskDheKe)
14933
            #endif
14934
                {
14935
                    modes = 1 << PSK_KE;
14936
                }
14937
            #if !defined(NO_DH) || defined(HAVE_ECC) || \
14938
                              defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
14939
                if (!ssl->options.noPskDheKe) {
14940
                    modes |= 1 << PSK_DHE_KE;
14941
                }
14942
            #endif
14943
                ret = TLSX_PskKeyModes_Use(ssl, modes);
14944
                if (ret != 0)
14945
                    return ret;
14946
            }
14947
        #endif
14948
        #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
14949
            if (!isServer && ssl->options.postHandshakeAuth) {
14950
                ret = TLSX_PostHandAuth_Use(ssl);
14951
                if (ret != 0)
14952
                    return ret;
14953
            }
14954
        #endif
14955
#if defined(HAVE_ECH)
14956
            /* GREASE ECH */
14957
            if (!ssl->options.disableECH) {
14958
                if (ssl->echConfigs == NULL) {
14959
                    ret = GREASE_ECH_USE(&(ssl->extensions), ssl->heap,
14960
                            ssl->rng);
14961
                }
14962
                else if (ssl->echConfigs != NULL) {
14963
                    ret = ECH_USE(ssl->echConfigs, &(ssl->extensions),
14964
                            ssl->heap, ssl->rng);
14965
                }
14966
            }
14967
#endif
14968
0
        }
14969
#if defined(HAVE_ECH)
14970
        else if (IsAtLeastTLSv1_3(ssl->version)) {
14971
            if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
14972
                ret = SERVER_ECH_USE(&(ssl->extensions), ssl->heap,
14973
                    ssl->ctx->echConfigs);
14974
14975
                if (ret == 0)
14976
                    TLSX_SetResponse(ssl, TLSX_ECH);
14977
            }
14978
        }
14979
#endif
14980
14981
0
#endif
14982
14983
0
    (void)isServer;
14984
0
    (void)public_key;
14985
0
    (void)public_key_len;
14986
0
    (void)ssl;
14987
14988
0
    return ret;
14989
0
}
14990
14991
14992
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
14993
14994
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
14995
static int TLSX_EchChangeSNI(WOLFSSL* ssl, TLSX** pEchX,
14996
                             char* serverName, TLSX** pServerNameX,
14997
                             TLSX*** pExtensions)
14998
{
14999
    int ret = 0;
15000
    TLSX* echX = NULL;
15001
    TLSX* serverNameX = NULL;
15002
    TLSX** extensions = NULL;
15003
15004
    /* calculate the rest of the extensions length with inner ech */
15005
    if (ssl->extensions)
15006
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
15007
15008
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions)
15009
        /* if not NULL the semaphore will stop it from being counted */
15010
        echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
15011
15012
    /* if type is outer change sni to public name */
15013
    if (echX != NULL &&
15014
        ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER &&
15015
        (ssl->options.echAccepted ||
15016
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
15017
        if (ssl->extensions) {
15018
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
15019
15020
            if (serverNameX != NULL)
15021
                extensions = &ssl->extensions;
15022
        }
15023
15024
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
15025
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
15026
            extensions = &ssl->ctx->extensions;
15027
        }
15028
15029
        /* store the inner server name */
15030
        if (serverNameX != NULL) {
15031
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
15032
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
15033
15034
            /* truncate if too long */
15035
            if (hostNameSz > MAX_PUBLIC_NAME_SZ)
15036
                hostNameSz = MAX_PUBLIC_NAME_SZ;
15037
15038
            XMEMCPY(serverName, hostName, hostNameSz);
15039
        }
15040
15041
        /* remove the inner server name */
15042
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15043
15044
        /* set the public name as the server name */
15045
        if ((ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
15046
                ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
15047
                XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
15048
                ssl->heap)) == WOLFSSL_SUCCESS)
15049
            ret = 0;
15050
    }
15051
    *pServerNameX = serverNameX;
15052
    *pExtensions = extensions;
15053
    *pEchX = echX;
15054
    return ret;
15055
}
15056
15057
static int TLSX_EchRestoreSNI(WOLFSSL* ssl, char* serverName,
15058
                              TLSX* serverNameX, TLSX** extensions)
15059
{
15060
    int ret = 0;
15061
15062
    if (serverNameX != NULL) {
15063
        /* remove the public name SNI */
15064
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15065
15066
        /* restore the inner server name */
15067
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
15068
            serverName, XSTRLEN(serverName), ssl->heap);
15069
15070
        if (ret == WOLFSSL_SUCCESS)
15071
            ret = 0;
15072
    }
15073
    return ret;
15074
}
15075
15076
/* because the size of ech depends on the size of other extensions we need to
15077
 * get the size with ech special and process ech last, return status */
15078
static int TLSX_GetSizeWithEch(WOLFSSL* ssl, byte* semaphore, byte msgType,
15079
    word16* pLength)
15080
{
15081
    int ret = 0, r = 0;
15082
    TLSX* echX = NULL;
15083
    TLSX* serverNameX = NULL;
15084
    TLSX** extensions = NULL;
15085
    WC_DECLARE_VAR(serverName, char, MAX_PUBLIC_NAME_SZ, 0);
15086
15087
    WC_ALLOC_VAR_EX(serverName, char, MAX_PUBLIC_NAME_SZ, NULL,
15088
                    DYNAMIC_TYPE_TMP_BUFFER, return MEMORY_E);
15089
    r = TLSX_EchChangeSNI(ssl, &echX, serverName, &serverNameX, &extensions);
15090
    if (r == 0 && ssl->extensions)
15091
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, pLength);
15092
    if (r == 0 && ret == 0 && ssl->ctx && ssl->ctx->extensions)
15093
        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, pLength);
15094
    if (r == 0)
15095
        r = TLSX_EchRestoreSNI(ssl, serverName, serverNameX, extensions);
15096
15097
    WC_FREE_VAR_EX(serverName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15098
    if (ret == 0 && r != 0)
15099
        ret = r;
15100
    return ret;
15101
}
15102
#endif
15103
15104
/** Tells the buffered size of extensions to be sent into the client hello. */
15105
int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word32* pLength)
15106
{
15107
    int ret = 0;
15108
    word16 length = 0;
15109
    byte semaphore[SEMAPHORE_SIZE] = {0};
15110
15111
    if (!TLSX_SupportExtensions(ssl))
15112
        return 0;
15113
    if (msgType == client_hello) {
15114
        EC_VALIDATE_REQUEST(ssl, semaphore);
15115
        PF_VALIDATE_REQUEST(ssl, semaphore);
15116
        WOLF_STK_VALIDATE_REQUEST(ssl);
15117
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15118
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
15119
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15120
#endif
15121
#if defined(WOLFSSL_TLS13)
15122
        if (!IsAtLeastTLSv1_2(ssl)) {
15123
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15124
        }
15125
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15126
        if (!IsAtLeastTLSv1_3(ssl->version)) {
15127
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15128
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15129
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15130
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
15131
        #endif
15132
        #ifdef WOLFSSL_EARLY_DATA
15133
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15134
        #endif
15135
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15136
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15137
        #endif
15138
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15139
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
15140
        #endif
15141
        }
15142
    #endif
15143
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15144
        if (!IsAtLeastTLSv1_3(ssl->version) ||
15145
                SSL_CA_NAMES(ssl) == NULL) {
15146
            TURN_ON(semaphore,
15147
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15148
        }
15149
    #endif
15150
#endif /* WOLFSSL_TLS13 */
15151
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
15152
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
15153
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
15154
            /* mark already sent, so it won't send it */
15155
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15156
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15157
        }
15158
    #endif
15159
    }
15160
15161
#ifdef WOLFSSL_TLS13
15162
    #ifndef NO_CERTS
15163
    else if (msgType == certificate_request) {
15164
        /* Don't send out any extension except those that are turned off. */
15165
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15166
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15167
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15168
#endif
15169
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15170
        if (SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
15171
            TURN_OFF(semaphore,
15172
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15173
        }
15174
#endif
15175
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, OID_FILTERS
15176
         *       TLSX_STATUS_REQUEST
15177
         */
15178
    }
15179
    #endif
15180
#if defined(HAVE_ECH)
15181
    if (ssl->options.useEch == 1 && !ssl->options.disableECH
15182
            && msgType == client_hello) {
15183
        ret = TLSX_GetSizeWithEch(ssl, semaphore, msgType, &length);
15184
        if (ret != 0)
15185
            return ret;
15186
    }
15187
    else
15188
#endif /* HAVE_ECH */
15189
#endif /* WOLFSSL_TLS13 */
15190
    {
15191
        if (ssl->extensions) {
15192
            ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
15193
            if (ret != 0)
15194
                return ret;
15195
        }
15196
        if (ssl->ctx && ssl->ctx->extensions) {
15197
            ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType,
15198
                &length);
15199
            if (ret != 0)
15200
                return ret;
15201
        }
15202
    }
15203
15204
#ifdef HAVE_EXTENDED_MASTER
15205
    if (msgType == client_hello && ssl->options.haveEMS &&
15206
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
15207
        length += HELLO_EXT_SZ;
15208
    }
15209
#endif
15210
15211
    if (length)
15212
        length += OPAQUE16_LEN; /* for total length storage. */
15213
15214
    *pLength += length;
15215
15216
    return ret;
15217
}
15218
15219
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15220
/* return status after writing the extensions with ech written last */
15221
static int TLSX_WriteWithEch(WOLFSSL* ssl, byte* output, byte* semaphore,
15222
    byte msgType, word16* pOffset)
15223
{
15224
    int r = 0, ret = 0;
15225
    TLSX* echX = NULL;
15226
    TLSX* serverNameX = NULL;
15227
    TLSX** extensions = NULL;
15228
    WC_DECLARE_VAR(serverName, char, MAX_PUBLIC_NAME_SZ, 0);
15229
15230
    WC_ALLOC_VAR_EX(serverName, char, MAX_PUBLIC_NAME_SZ, NULL,
15231
                    DYNAMIC_TYPE_TMP_BUFFER, return MEMORY_E);
15232
    r = TLSX_EchChangeSNI(ssl, &echX, serverName, &serverNameX, &extensions);
15233
    ret = r;
15234
    if (ret == 0 && echX != NULL)
15235
        /* turn ech on so it doesn't write, then write it last */
15236
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
15237
15238
    if (ret == 0 && ssl->extensions) {
15239
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
15240
                         msgType, pOffset);
15241
    }
15242
15243
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
15244
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
15245
                         msgType, pOffset);
15246
    }
15247
15248
    /* only write if have a shot at acceptance */
15249
    if (ret == 0 && echX != NULL &&
15250
        (ssl->options.echAccepted ||
15251
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
15252
        if (echX != NULL) {
15253
            /* turn off and write it last */
15254
            TURN_OFF(semaphore, TLSX_ToSemaphore(echX->type));
15255
        }
15256
15257
        if (ret == 0 && ssl->extensions) {
15258
            ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
15259
                msgType, pOffset);
15260
        }
15261
15262
        if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
15263
            ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
15264
                msgType, pOffset);
15265
        }
15266
    }
15267
15268
    if (r == 0)
15269
        r = TLSX_EchRestoreSNI(ssl, serverName, serverNameX, extensions);
15270
    WC_FREE_VAR_EX(serverName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15271
15272
    if (ret == 0 && r != 0)
15273
        ret = r;
15274
    return ret;
15275
}
15276
#endif
15277
15278
/** Writes the extensions to be sent into the client hello. */
15279
int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word32* pOffset)
15280
0
{
15281
0
    int ret = 0;
15282
0
    word16 offset = 0;
15283
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
15284
15285
0
    if (!TLSX_SupportExtensions(ssl) || output == NULL)
15286
0
        return 0;
15287
15288
0
    offset += OPAQUE16_LEN; /* extensions length */
15289
15290
0
    if (msgType == client_hello) {
15291
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
15292
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
15293
0
        WOLF_STK_VALIDATE_REQUEST(ssl);
15294
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15295
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
15296
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15297
0
#endif
15298
0
#ifdef WOLFSSL_TLS13
15299
0
        if (!IsAtLeastTLSv1_2(ssl)) {
15300
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15301
0
        }
15302
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15303
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
15304
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15305
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15306
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
15307
        #endif
15308
        #ifdef WOLFSSL_EARLY_DATA
15309
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15310
        #endif
15311
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15312
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15313
        #endif
15314
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15315
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
15316
        #endif
15317
        #ifdef WOLFSSL_DUAL_ALG_CERTS
15318
            TURN_ON(semaphore,
15319
                    TLSX_ToSemaphore(TLSX_CKS));
15320
        #endif
15321
0
        }
15322
0
    #endif
15323
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15324
        if (!IsAtLeastTLSv1_3(ssl->version) || SSL_CA_NAMES(ssl) == NULL) {
15325
            TURN_ON(semaphore,
15326
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15327
        }
15328
    #endif
15329
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15330
        /* Must write Pre-shared Key extension at the end in TLS v1.3.
15331
         * Must not write out Pre-shared Key extension in earlier versions of
15332
         * protocol.
15333
         */
15334
        TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15335
    #endif
15336
0
#endif /* WOLFSSL_TLS13 */
15337
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
15338
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
15339
         /* mark already sent, so it won't send it */
15340
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
15341
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15342
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15343
        }
15344
    #endif
15345
0
    }
15346
0
#ifdef WOLFSSL_TLS13
15347
0
    #ifndef NO_CERTS
15348
0
    else if (msgType == certificate_request) {
15349
        /* Don't send out any extension except those that are turned off. */
15350
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15351
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15352
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15353
0
#endif
15354
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15355
        if (SSL_PRIORITY_CA_NAMES(ssl) != NULL) {
15356
            TURN_OFF(semaphore,
15357
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15358
        }
15359
#endif
15360
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, TLSX_OID_FILTERS
15361
         *       TLSX_STATUS_REQUEST
15362
         */
15363
0
    }
15364
0
    #endif
15365
0
#endif
15366
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15367
    if (ssl->options.useEch == 1 && !ssl->options.disableECH
15368
            && msgType == client_hello) {
15369
        ret = TLSX_WriteWithEch(ssl, output, semaphore,
15370
                         msgType, &offset);
15371
        if (ret != 0)
15372
            return ret;
15373
    }
15374
    else
15375
#endif
15376
0
    {
15377
0
        if (ssl->extensions) {
15378
0
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15379
0
                             msgType, &offset);
15380
0
            if (ret != 0)
15381
0
                return ret;
15382
0
        }
15383
0
        if (ssl->ctx && ssl->ctx->extensions) {
15384
0
            ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
15385
0
                             msgType, &offset);
15386
0
            if (ret != 0)
15387
0
                return ret;
15388
0
        }
15389
0
    }
15390
15391
0
#ifdef HAVE_EXTENDED_MASTER
15392
0
    if (msgType == client_hello && ssl->options.haveEMS &&
15393
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
15394
0
        WOLFSSL_MSG("EMS extension to write");
15395
0
        c16toa(HELLO_EXT_EXTMS, output + offset);
15396
0
        offset += HELLO_EXT_TYPE_SZ;
15397
0
        c16toa(0, output + offset);
15398
0
        offset += HELLO_EXT_SZ_SZ;
15399
0
    }
15400
0
#endif
15401
15402
0
#ifdef WOLFSSL_TLS13
15403
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15404
    if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
15405
        /* Write out what we can of Pre-shared key extension.  */
15406
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15407
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15408
                         client_hello, &offset);
15409
        if (ret != 0)
15410
            return ret;
15411
    }
15412
    #endif
15413
0
#endif
15414
15415
0
    if (offset > OPAQUE16_LEN || msgType != client_hello)
15416
0
        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
15417
15418
0
     *pOffset += offset;
15419
15420
0
    return ret;
15421
0
}
15422
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
15423
15424
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
15425
15426
/** Tells the buffered size of extensions to be sent into the server hello. */
15427
int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
15428
{
15429
    int ret = 0;
15430
    word16 length = 0;
15431
    byte semaphore[SEMAPHORE_SIZE] = {0};
15432
15433
    switch (msgType) {
15434
#ifndef NO_WOLFSSL_SERVER
15435
        case server_hello:
15436
            PF_VALIDATE_RESPONSE(ssl, semaphore);
15437
        #ifdef WOLFSSL_TLS13
15438
                if (IsAtLeastTLSv1_3(ssl->version)) {
15439
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15440
                    TURN_OFF(semaphore,
15441
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15442
                #if defined(HAVE_SUPPORTED_CURVES)
15443
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15444
                    if (!ssl->options.noPskDheKe)
15445
                #endif
15446
                    {
15447
                        /* Expect KeyShare extension in ServerHello. */
15448
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15449
                    }
15450
                #endif
15451
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15452
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15453
                #endif
15454
                }
15455
            #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15456
                else {
15457
                #ifdef HAVE_SUPPORTED_CURVES
15458
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15459
                #endif
15460
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15461
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15462
                #endif
15463
                }
15464
            #endif
15465
            #ifdef WOLFSSL_DTLS_CID
15466
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15467
            #endif
15468
        #endif /* WOLFSSL_TLS13 */
15469
            break;
15470
15471
    #ifdef WOLFSSL_TLS13
15472
        case hello_retry_request:
15473
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15474
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15475
        #ifdef HAVE_SUPPORTED_CURVES
15476
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15477
            if (!ssl->options.noPskDheKe)
15478
        #endif
15479
            {
15480
                /* Expect KeyShare extension in HelloRetryRequest. */
15481
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15482
            }
15483
        #endif
15484
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15485
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15486
        #endif
15487
#ifdef HAVE_ECH
15488
            /* send the special confirmation */
15489
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
15490
#endif
15491
            break;
15492
    #endif
15493
15494
    #ifdef WOLFSSL_TLS13
15495
        case encrypted_extensions:
15496
            /* Send out all extension except those that are turned on. */
15497
        #ifdef HAVE_ECC
15498
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
15499
        #endif
15500
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15501
        #ifdef HAVE_SESSION_TICKET
15502
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
15503
        #endif
15504
        #ifdef HAVE_SUPPORTED_CURVES
15505
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15506
        #endif
15507
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15508
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15509
        #endif
15510
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
15511
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15512
        #endif
15513
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
15514
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15515
        #endif
15516
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
15517
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
15518
        #endif
15519
        #ifdef WOLFSSL_DTLS_CID
15520
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15521
        #endif /* WOLFSSL_DTLS_CID */
15522
            break;
15523
15524
        #ifdef WOLFSSL_EARLY_DATA
15525
        case session_ticket:
15526
            if (ssl->options.tls1_3) {
15527
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15528
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15529
            }
15530
            break;
15531
        #endif
15532
    #endif
15533
#endif
15534
15535
#ifdef WOLFSSL_TLS13
15536
    #ifndef NO_CERTS
15537
        case certificate:
15538
            /* Don't send out any extension except those that are turned off. */
15539
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15540
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15541
            /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
15542
             *       TLSX_SERVER_CERTIFICATE_TYPE
15543
             */
15544
            break;
15545
    #endif
15546
#endif
15547
    }
15548
15549
#ifdef HAVE_EXTENDED_MASTER
15550
    if (ssl->options.haveEMS && msgType == server_hello &&
15551
                                              !IsAtLeastTLSv1_3(ssl->version)) {
15552
        length += HELLO_EXT_SZ;
15553
    }
15554
#endif
15555
15556
    if (TLSX_SupportExtensions(ssl)) {
15557
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
15558
        if (ret != 0)
15559
            return ret;
15560
    }
15561
15562
    /* All the response data is set at the ssl object only, so no ctx here. */
15563
15564
    if (length || msgType != server_hello)
15565
        length += OPAQUE16_LEN; /* for total length storage. */
15566
15567
    *pLength += length;
15568
15569
    return ret;
15570
}
15571
15572
/** Writes the server hello extensions into a buffer. */
15573
int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
15574
0
{
15575
0
    int ret = 0;
15576
0
    word16 offset = 0;
15577
15578
0
    if (TLSX_SupportExtensions(ssl) && output) {
15579
0
        byte semaphore[SEMAPHORE_SIZE] = {0};
15580
15581
0
        switch (msgType) {
15582
0
#ifndef NO_WOLFSSL_SERVER
15583
0
            case server_hello:
15584
0
                PF_VALIDATE_RESPONSE(ssl, semaphore);
15585
0
        #ifdef WOLFSSL_TLS13
15586
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
15587
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15588
0
                    TURN_OFF(semaphore,
15589
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15590
0
            #ifdef HAVE_SUPPORTED_CURVES
15591
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15592
                    if (!ssl->options.noPskDheKe)
15593
                #endif
15594
0
                    {
15595
                        /* Write out KeyShare in ServerHello. */
15596
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15597
0
                    }
15598
0
            #endif
15599
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15600
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15601
            #endif
15602
0
                }
15603
0
                else
15604
0
        #endif /* WOLFSSL_TLS13 */
15605
0
                {
15606
0
        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15607
0
            #ifdef HAVE_SUPPORTED_CURVES
15608
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15609
0
            #endif
15610
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15611
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15612
            #endif
15613
0
        #endif
15614
0
                    WC_DO_NOTHING; /* avoid empty brackets */
15615
0
                }
15616
        #ifdef WOLFSSL_DTLS_CID
15617
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15618
        #endif /* WOLFSSL_DTLS_CID */
15619
0
                break;
15620
15621
0
    #ifdef WOLFSSL_TLS13
15622
0
            case hello_retry_request:
15623
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15624
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15625
0
        #ifdef HAVE_SUPPORTED_CURVES
15626
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15627
                if (!ssl->options.noPskDheKe)
15628
            #endif
15629
0
                {
15630
                    /* Write out KeyShare in HelloRetryRequest. */
15631
0
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15632
0
                }
15633
0
        #endif
15634
#ifdef HAVE_ECH
15635
                /* send the special confirmation */
15636
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
15637
#endif
15638
                /* Cookie is written below as last extension. */
15639
0
                break;
15640
0
    #endif
15641
15642
0
    #ifdef WOLFSSL_TLS13
15643
0
            case encrypted_extensions:
15644
                /* Send out all extension except those that are turned on. */
15645
0
        #ifdef HAVE_ECC
15646
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
15647
0
        #endif
15648
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15649
        #ifdef HAVE_SESSION_TICKET
15650
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
15651
        #endif
15652
0
        #ifdef HAVE_SUPPORTED_CURVES
15653
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15654
0
        #endif
15655
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15656
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15657
        #endif
15658
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
15659
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15660
        #endif
15661
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
15662
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15663
        #endif
15664
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
15665
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
15666
0
        #endif
15667
        #ifdef WOLFSSL_DTLS_CID
15668
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15669
        #endif /* WOLFSSL_DTLS_CID */
15670
0
                break;
15671
15672
        #ifdef WOLFSSL_EARLY_DATA
15673
            case session_ticket:
15674
                if (ssl->options.tls1_3) {
15675
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15676
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15677
                }
15678
                break;
15679
        #endif
15680
0
    #endif
15681
0
#endif
15682
15683
0
    #ifdef WOLFSSL_TLS13
15684
0
        #ifndef NO_CERTS
15685
0
            case certificate:
15686
                /* Don't send out any extension except those that are turned
15687
                 * off. */
15688
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15689
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15690
                /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
15691
                 *       TLSX_SERVER_CERTIFICATE_TYPE
15692
                 */
15693
0
                break;
15694
0
        #endif
15695
0
    #endif
15696
15697
0
            default:
15698
0
                break;
15699
0
        }
15700
15701
0
        offset += OPAQUE16_LEN; /* extensions length */
15702
15703
0
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15704
0
                         msgType, &offset);
15705
0
        if (ret != 0)
15706
0
            return ret;
15707
15708
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
15709
        if (msgType == hello_retry_request) {
15710
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15711
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15712
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15713
                             msgType, &offset);
15714
            if (ret != 0)
15715
                return ret;
15716
        }
15717
#endif
15718
15719
0
#ifdef HAVE_EXTENDED_MASTER
15720
0
        if (ssl->options.haveEMS && msgType == server_hello &&
15721
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
15722
0
            WOLFSSL_MSG("EMS extension to write");
15723
0
            c16toa(HELLO_EXT_EXTMS, output + offset);
15724
0
            offset += HELLO_EXT_TYPE_SZ;
15725
0
            c16toa(0, output + offset);
15726
0
            offset += HELLO_EXT_SZ_SZ;
15727
0
        }
15728
0
#endif
15729
15730
0
        if (offset > OPAQUE16_LEN || msgType != server_hello)
15731
0
            c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
15732
0
    }
15733
15734
0
    if (pOffset)
15735
0
        *pOffset += offset;
15736
15737
0
    return ret;
15738
0
}
15739
15740
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
15741
15742
#ifdef WOLFSSL_TLS13
15743
int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
15744
                      byte msgType, int* found)
15745
3.16k
{
15746
3.16k
    int ret = 0;
15747
3.16k
    int offset = 0;
15748
15749
3.16k
    *found = 0;
15750
19.4k
    while (offset < (int)length) {
15751
19.3k
        word16 type;
15752
19.3k
        word16 size;
15753
15754
19.3k
        if (offset + (2 * OPAQUE16_LEN) > length) {
15755
21
            ret = BUFFER_ERROR;
15756
21
            break;
15757
21
        }
15758
15759
19.2k
        ato16(input + offset, &type);
15760
19.2k
        offset += HELLO_EXT_TYPE_SZ;
15761
15762
19.2k
        ato16(input + offset, &size);
15763
19.2k
        offset += OPAQUE16_LEN;
15764
15765
19.2k
        if (offset + size > length) {
15766
265
            ret = BUFFER_ERROR;
15767
265
            break;
15768
265
        }
15769
15770
19.0k
        if (type == TLSX_SUPPORTED_VERSIONS) {
15771
2.72k
            *found = 1;
15772
15773
2.72k
            WOLFSSL_MSG("Supported Versions extension received");
15774
15775
2.72k
            ret = SV_PARSE(ssl, input + offset, size, msgType, &ssl->version,
15776
2.72k
                           &ssl->options, &ssl->extensions);
15777
2.72k
            break;
15778
2.72k
        }
15779
15780
16.2k
        offset += size;
15781
16.2k
    }
15782
15783
3.16k
    return ret;
15784
3.16k
}
15785
#endif
15786
/* Jump Table to check minimum size values for client case in TLSX_Parse */
15787
#ifndef NO_WOLFSSL_SERVER
15788
static word16 TLSX_GetMinSize_Client(word16* type)
15789
71.2k
{
15790
71.2k
    switch (*type) {
15791
752
        case TLSXT_SERVER_NAME:
15792
752
            return WOLFSSL_SNI_MIN_SIZE_CLIENT;
15793
3.37k
        case TLSXT_EARLY_DATA:
15794
3.37k
            return WOLFSSL_EDI_MIN_SIZE_CLIENT;
15795
210
        case TLSXT_MAX_FRAGMENT_LENGTH:
15796
210
            return WOLFSSL_MFL_MIN_SIZE_CLIENT;
15797
74
        case TLSXT_TRUSTED_CA_KEYS:
15798
74
            return WOLFSSL_TCA_MIN_SIZE_CLIENT;
15799
309
        case TLSXT_TRUNCATED_HMAC:
15800
309
            return WOLFSSL_THM_MIN_SIZE_CLIENT;
15801
577
        case TLSXT_STATUS_REQUEST:
15802
577
            return WOLFSSL_CSR_MIN_SIZE_CLIENT;
15803
8.62k
        case TLSXT_SUPPORTED_GROUPS:
15804
8.62k
            return WOLFSSL_EC_MIN_SIZE_CLIENT;
15805
1.93k
        case TLSXT_EC_POINT_FORMATS:
15806
1.93k
            return WOLFSSL_PF_MIN_SIZE_CLIENT;
15807
5.52k
        case TLSXT_SIGNATURE_ALGORITHMS:
15808
5.52k
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
15809
125
        case TLSXT_USE_SRTP:
15810
125
            return WOLFSSL_SRTP_MIN_SIZE_CLIENT;
15811
222
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
15812
222
            return WOLFSSL_ALPN_MIN_SIZE_CLIENT;
15813
169
        case TLSXT_STATUS_REQUEST_V2:
15814
169
            return WOLFSSL_CSR2_MIN_SIZE_CLIENT;
15815
125
        case TLSXT_CLIENT_CERTIFICATE:
15816
125
            return WOLFSSL_CCT_MIN_SIZE_CLIENT;
15817
83
        case TLSXT_SERVER_CERTIFICATE:
15818
83
            return WOLFSSL_SCT_MIN_SIZE_CLIENT;
15819
2.44k
        case TLSXT_ENCRYPT_THEN_MAC:
15820
2.44k
            return WOLFSSL_ETM_MIN_SIZE_CLIENT;
15821
906
        case TLSXT_SESSION_TICKET:
15822
906
            return WOLFSSL_STK_MIN_SIZE_CLIENT;
15823
1.56k
        case TLSXT_PRE_SHARED_KEY:
15824
1.56k
            return WOLFSSL_PSK_MIN_SIZE_CLIENT;
15825
91
        case TLSXT_COOKIE:
15826
91
            return WOLFSSL_CKE_MIN_SIZE_CLIENT;
15827
1.47k
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
15828
1.47k
            return WOLFSSL_PKM_MIN_SIZE_CLIENT;
15829
241
        case TLSXT_CERTIFICATE_AUTHORITIES:
15830
241
            return WOLFSSL_CAN_MIN_SIZE_CLIENT;
15831
136
        case TLSXT_POST_HANDSHAKE_AUTH:
15832
136
            return WOLFSSL_PHA_MIN_SIZE_CLIENT;
15833
212
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
15834
212
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
15835
4.35k
        case TLSXT_KEY_SHARE:
15836
4.35k
            return WOLFSSL_KS_MIN_SIZE_CLIENT;
15837
84
        case TLSXT_CONNECTION_ID:
15838
84
            return WOLFSSL_CID_MIN_SIZE_CLIENT;
15839
357
        case TLSXT_RENEGOTIATION_INFO:
15840
357
            return WOLFSSL_SCR_MIN_SIZE_CLIENT;
15841
12
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
15842
12
            return WOLFSSL_QTP_MIN_SIZE_CLIENT;
15843
29
        case TLSXT_ECH:
15844
29
            return WOLFSSL_ECH_MIN_SIZE_CLIENT;
15845
37.1k
        default:
15846
37.1k
            return 0;
15847
71.2k
    }
15848
71.2k
}
15849
    #define TLSX_GET_MIN_SIZE_CLIENT(type) TLSX_GetMinSize_Client(type)
15850
#else
15851
    #define TLSX_GET_MIN_SIZE_CLIENT(type) 0
15852
#endif
15853
15854
15855
#ifndef NO_WOLFSSL_CLIENT
15856
/* Jump Table to check minimum size values for server case in TLSX_Parse */
15857
static word16 TLSX_GetMinSize_Server(const word16 *type)
15858
4.74k
{
15859
4.74k
    switch (*type) {
15860
27
        case TLSXT_SERVER_NAME:
15861
27
            return WOLFSSL_SNI_MIN_SIZE_SERVER;
15862
8
        case TLSXT_EARLY_DATA:
15863
8
            return WOLFSSL_EDI_MIN_SIZE_SERVER;
15864
10
        case TLSXT_MAX_FRAGMENT_LENGTH:
15865
10
            return WOLFSSL_MFL_MIN_SIZE_SERVER;
15866
3
        case TLSXT_TRUSTED_CA_KEYS:
15867
3
            return WOLFSSL_TCA_MIN_SIZE_SERVER;
15868
6
        case TLSXT_TRUNCATED_HMAC:
15869
6
            return WOLFSSL_THM_MIN_SIZE_SERVER;
15870
2.31k
        case TLSXT_STATUS_REQUEST:
15871
2.31k
            return WOLFSSL_CSR_MIN_SIZE_SERVER;
15872
4
        case TLSXT_SUPPORTED_GROUPS:
15873
4
            return WOLFSSL_EC_MIN_SIZE_SERVER;
15874
13
        case TLSXT_EC_POINT_FORMATS:
15875
13
            return WOLFSSL_PF_MIN_SIZE_SERVER;
15876
6
        case TLSXT_SIGNATURE_ALGORITHMS:
15877
6
            return WOLFSSL_SA_MIN_SIZE_SERVER;
15878
24
        case TLSXT_USE_SRTP:
15879
24
            return WOLFSSL_SRTP_MIN_SIZE_SERVER;
15880
63
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
15881
63
            return WOLFSSL_ALPN_MIN_SIZE_SERVER;
15882
3
        case TLSXT_STATUS_REQUEST_V2:
15883
3
            return WOLFSSL_CSR2_MIN_SIZE_SERVER;
15884
3
        case TLSXT_CLIENT_CERTIFICATE:
15885
3
            return WOLFSSL_CCT_MIN_SIZE_SERVER;
15886
4
        case TLSXT_SERVER_CERTIFICATE:
15887
4
            return WOLFSSL_SCT_MIN_SIZE_SERVER;
15888
14
        case TLSXT_ENCRYPT_THEN_MAC:
15889
14
            return WOLFSSL_ETM_MIN_SIZE_SERVER;
15890
60
        case TLSXT_SESSION_TICKET:
15891
60
            return WOLFSSL_STK_MIN_SIZE_SERVER;
15892
17
        case TLSXT_PRE_SHARED_KEY:
15893
17
            return WOLFSSL_PSK_MIN_SIZE_SERVER;
15894
35
        case TLSXT_COOKIE:
15895
35
            return WOLFSSL_CKE_MIN_SIZE_SERVER;
15896
6
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
15897
6
            return WOLFSSL_PKM_MIN_SIZE_SERVER;
15898
5
        case TLSXT_CERTIFICATE_AUTHORITIES:
15899
5
            return WOLFSSL_CAN_MIN_SIZE_SERVER;
15900
5
        case TLSXT_POST_HANDSHAKE_AUTH:
15901
5
            return WOLFSSL_PHA_MIN_SIZE_SERVER;
15902
4
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
15903
4
            return WOLFSSL_SA_MIN_SIZE_SERVER;
15904
280
        case TLSXT_KEY_SHARE:
15905
280
            return WOLFSSL_KS_MIN_SIZE_SERVER;
15906
4
        case TLSXT_CONNECTION_ID:
15907
4
            return WOLFSSL_CID_MIN_SIZE_SERVER;
15908
5
        case TLSXT_RENEGOTIATION_INFO:
15909
5
            return WOLFSSL_SCR_MIN_SIZE_SERVER;
15910
2
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
15911
2
            return WOLFSSL_QTP_MIN_SIZE_SERVER;
15912
0
        case TLSXT_ECH:
15913
0
            return WOLFSSL_ECH_MIN_SIZE_SERVER;
15914
1.81k
        default:
15915
1.81k
            return 0;
15916
4.74k
    }
15917
4.74k
}
15918
    #define TLSX_GET_MIN_SIZE_SERVER(type) TLSX_GetMinSize_Server(type)
15919
#else
15920
    #define TLSX_GET_MIN_SIZE_SERVER(type) 0
15921
#endif
15922
15923
15924
/** Parses a buffer of TLS extensions. */
15925
int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType,
15926
                                                                 Suites *suites)
15927
{
15928
    int ret = 0;
15929
    word16 offset = 0;
15930
    byte isRequest = (msgType == client_hello ||
15931
                      msgType == certificate_request);
15932
15933
#ifdef HAVE_EXTENDED_MASTER
15934
    byte pendingEMS = 0;
15935
#endif
15936
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
15937
    int pskDone = 0;
15938
#endif
15939
    byte seenType[SEMAPHORE_SIZE];  /* Seen known extensions. */
15940
15941
    if (!ssl || !input || (isRequest && !suites))
15942
        return BAD_FUNC_ARG;
15943
15944
    /* No known extensions seen yet. */
15945
    XMEMSET(seenType, 0, sizeof(seenType));
15946
15947
    while (ret == 0 && offset < length) {
15948
        word16 type;
15949
        word16 size;
15950
15951
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
15952
        if (msgType == client_hello && pskDone) {
15953
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
15954
            return PSK_KEY_ERROR;
15955
        }
15956
#endif
15957
15958
        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
15959
            return BUFFER_ERROR;
15960
15961
        ato16(input + offset, &type);
15962
        offset += HELLO_EXT_TYPE_SZ;
15963
15964
        ato16(input + offset, &size);
15965
        offset += OPAQUE16_LEN;
15966
15967
        /* Check we have a bit for extension type. */
15968
        if ((type <= 62) || (type == TLSX_RENEGOTIATION_INFO)
15969
        #ifdef WOLFSSL_QUIC
15970
            || (type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT)
15971
        #endif
15972
        #ifdef WOLFSSL_DUAL_ALG_CERTS
15973
            || (type == TLSX_CKS)
15974
        #endif
15975
            )
15976
        {
15977
            /* Detect duplicate recognized extensions. */
15978
            if (IS_OFF(seenType, TLSX_ToSemaphore(type))) {
15979
                TURN_ON(seenType, TLSX_ToSemaphore(type));
15980
            }
15981
            else {
15982
                return DUPLICATE_TLS_EXT_E;
15983
            }
15984
        }
15985
15986
        if (length - offset < size)
15987
            return BUFFER_ERROR;
15988
15989
        /* Check minimum size required for TLSX, even if disabled */
15990
        switch (msgType) {
15991
            #ifndef NO_WOLFSSL_SERVER
15992
            case client_hello:
15993
                if (size < TLSX_GET_MIN_SIZE_CLIENT(&type)){
15994
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
15995
                    return BUFFER_ERROR;
15996
                }
15997
            break;
15998
            #endif
15999
            #ifndef NO_WOLFSSL_CLIENT
16000
            case server_hello:
16001
            case hello_retry_request:
16002
                if (size < TLSX_GET_MIN_SIZE_SERVER(&type)){
16003
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
16004
                    return BUFFER_ERROR;
16005
                }
16006
            break;
16007
            #endif
16008
            default:
16009
            break;
16010
        }
16011
16012
        switch (type) {
16013
#ifdef HAVE_SNI
16014
            case TLSX_SERVER_NAME:
16015
                WOLFSSL_MSG("SNI extension received");
16016
            #ifdef WOLFSSL_DEBUG_TLS
16017
                WOLFSSL_BUFFER(input + offset, size);
16018
            #endif
16019
16020
#ifdef WOLFSSL_TLS13
16021
                if (IsAtLeastTLSv1_3(ssl->version)) {
16022
                    if (msgType != client_hello &&
16023
                        msgType != encrypted_extensions)
16024
                        return EXT_NOT_ALLOWED;
16025
                }
16026
                else
16027
#endif
16028
                {
16029
                    if (msgType != client_hello &&
16030
                        msgType != server_hello)
16031
                        return EXT_NOT_ALLOWED;
16032
                }
16033
                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
16034
                break;
16035
#endif
16036
16037
            case TLSX_TRUSTED_CA_KEYS:
16038
                WOLFSSL_MSG("Trusted CA extension received");
16039
            #ifdef WOLFSSL_DEBUG_TLS
16040
                WOLFSSL_BUFFER(input + offset, size);
16041
            #endif
16042
16043
#ifdef WOLFSSL_TLS13
16044
                /* RFC 8446 4.2.4 states trusted_ca_keys is not used
16045
                   in TLS 1.3. */
16046
                if (IsAtLeastTLSv1_3(ssl->version)) {
16047
                    break;
16048
                }
16049
                else
16050
#endif
16051
                {
16052
                    if (msgType != client_hello &&
16053
                        msgType != server_hello)
16054
                        return EXT_NOT_ALLOWED;
16055
                }
16056
                ret = TCA_PARSE(ssl, input + offset, size, isRequest);
16057
                break;
16058
16059
            case TLSX_MAX_FRAGMENT_LENGTH:
16060
                WOLFSSL_MSG("Max Fragment Length extension received");
16061
            #ifdef WOLFSSL_DEBUG_TLS
16062
                WOLFSSL_BUFFER(input + offset, size);
16063
            #endif
16064
16065
#ifdef WOLFSSL_TLS13
16066
                if (IsAtLeastTLSv1_3(ssl->version)) {
16067
                    if (msgType != client_hello &&
16068
                        msgType != encrypted_extensions) {
16069
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16070
                        return EXT_NOT_ALLOWED;
16071
                    }
16072
                }
16073
                else
16074
#endif
16075
                {
16076
                    if (msgType != client_hello &&
16077
                        msgType != server_hello) {
16078
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16079
                        return EXT_NOT_ALLOWED;
16080
                    }
16081
                }
16082
                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
16083
                break;
16084
16085
            case TLSX_TRUNCATED_HMAC:
16086
                WOLFSSL_MSG("Truncated HMAC extension received");
16087
            #ifdef WOLFSSL_DEBUG_TLS
16088
                WOLFSSL_BUFFER(input + offset, size);
16089
            #endif
16090
16091
#ifdef WOLFSSL_TLS13
16092
                if (IsAtLeastTLSv1_3(ssl->version))
16093
                    break;
16094
#endif
16095
                if (msgType != client_hello)
16096
                    return EXT_NOT_ALLOWED;
16097
                ret = THM_PARSE(ssl, input + offset, size, isRequest);
16098
                break;
16099
16100
            case TLSX_SUPPORTED_GROUPS:
16101
                WOLFSSL_MSG("Supported Groups extension received");
16102
            #ifdef WOLFSSL_DEBUG_TLS
16103
                WOLFSSL_BUFFER(input + offset, size);
16104
            #endif
16105
16106
#ifdef WOLFSSL_TLS13
16107
                if (IsAtLeastTLSv1_3(ssl->version)) {
16108
                    if (msgType != client_hello &&
16109
                        msgType != encrypted_extensions) {
16110
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16111
                        return EXT_NOT_ALLOWED;
16112
                    }
16113
                }
16114
                else
16115
#endif
16116
                {
16117
                    if (msgType != client_hello) {
16118
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16119
                        return EXT_NOT_ALLOWED;
16120
                    }
16121
                }
16122
                ret = EC_PARSE(ssl, input + offset, size, isRequest,
16123
                        &ssl->extensions);
16124
                break;
16125
#ifdef WOLFSSL_DUAL_ALG_CERTS
16126
            case TLSX_CKS:
16127
                WOLFSSL_MSG("CKS extension received");
16128
                if (msgType != client_hello &&
16129
                     msgType != encrypted_extensions) {
16130
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16131
                        return EXT_NOT_ALLOWED;
16132
                }
16133
                ret = TLSX_CKS_Parse(ssl, (byte *)(input + offset), size,
16134
                                     &ssl->extensions);
16135
            break;
16136
#endif /* WOLFSSL_DUAL_ALG_CERTS */
16137
            case TLSX_EC_POINT_FORMATS:
16138
                WOLFSSL_MSG("Point Formats extension received");
16139
            #ifdef WOLFSSL_DEBUG_TLS
16140
                WOLFSSL_BUFFER(input + offset, size);
16141
            #endif
16142
16143
#ifdef WOLFSSL_TLS13
16144
                if (IsAtLeastTLSv1_3(ssl->version))
16145
                    break;
16146
#endif
16147
                if (msgType != client_hello &&
16148
                    msgType != server_hello) {
16149
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16150
                    return EXT_NOT_ALLOWED;
16151
                }
16152
16153
                ret = PF_PARSE(ssl, input + offset, size, isRequest);
16154
                break;
16155
16156
            case TLSX_STATUS_REQUEST:
16157
                WOLFSSL_MSG("Certificate Status Request extension received");
16158
            #ifdef WOLFSSL_DEBUG_TLS
16159
                WOLFSSL_BUFFER(input + offset, size);
16160
            #endif
16161
16162
#ifdef WOLFSSL_TLS13
16163
                if (IsAtLeastTLSv1_3(ssl->version)) {
16164
                    if (msgType != client_hello &&
16165
                        msgType != certificate_request &&
16166
                        msgType != certificate)
16167
                        return EXT_NOT_ALLOWED;
16168
                }
16169
                else
16170
 #endif
16171
                {
16172
                    if (msgType != client_hello &&
16173
                        msgType != server_hello)
16174
                        return EXT_NOT_ALLOWED;
16175
                }
16176
                ret = CSR_PARSE(ssl, input + offset, size, isRequest);
16177
                break;
16178
16179
            case TLSX_STATUS_REQUEST_V2:
16180
                WOLFSSL_MSG("Certificate Status Request v2 extension received");
16181
            #ifdef WOLFSSL_DEBUG_TLS
16182
                WOLFSSL_BUFFER(input + offset, size);
16183
            #endif
16184
16185
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
16186
                if (IsAtLeastTLSv1_3(ssl->version)) {
16187
                    if (msgType != client_hello &&
16188
                        msgType != certificate_request &&
16189
                        msgType != certificate)
16190
                        return EXT_NOT_ALLOWED;
16191
                }
16192
                else
16193
#endif
16194
                {
16195
                    if (msgType != client_hello &&
16196
                        msgType != server_hello)
16197
                        return EXT_NOT_ALLOWED;
16198
                }
16199
                ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
16200
                break;
16201
16202
#ifdef HAVE_EXTENDED_MASTER
16203
            case HELLO_EXT_EXTMS:
16204
                WOLFSSL_MSG("Extended Master Secret extension received");
16205
            #ifdef WOLFSSL_DEBUG_TLS
16206
                WOLFSSL_BUFFER(input + offset, size);
16207
            #endif
16208
16209
#if defined(WOLFSSL_TLS13)
16210
                if (IsAtLeastTLSv1_3(ssl->version))
16211
                    break;
16212
#endif
16213
                if (msgType != client_hello &&
16214
                    msgType != server_hello)
16215
                    return EXT_NOT_ALLOWED;
16216
                if (size != 0)
16217
                    return BUFFER_ERROR;
16218
16219
#ifndef NO_WOLFSSL_SERVER
16220
                if (isRequest)
16221
                    ssl->options.haveEMS = 1;
16222
#endif
16223
                pendingEMS = 1;
16224
                break;
16225
#endif
16226
16227
            case TLSX_RENEGOTIATION_INFO:
16228
                WOLFSSL_MSG("Secure Renegotiation extension received");
16229
            #ifdef WOLFSSL_DEBUG_TLS
16230
                WOLFSSL_BUFFER(input + offset, size);
16231
            #endif
16232
16233
#ifdef WOLFSSL_TLS13
16234
                if (IsAtLeastTLSv1_3(ssl->version))
16235
                    break;
16236
#endif
16237
                if (msgType != client_hello &&
16238
                    msgType != server_hello)
16239
                    return EXT_NOT_ALLOWED;
16240
                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
16241
                break;
16242
16243
            case TLSX_SESSION_TICKET:
16244
                WOLFSSL_MSG("Session Ticket extension received");
16245
            #ifdef WOLFSSL_DEBUG_TLS
16246
                WOLFSSL_BUFFER(input + offset, size);
16247
            #endif
16248
16249
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
16250
                if (IsAtLeastTLSv1_3(ssl->version)) {
16251
                    if (msgType != client_hello)
16252
                        return EXT_NOT_ALLOWED;
16253
                }
16254
                else
16255
#endif
16256
                {
16257
                    if (msgType != client_hello &&
16258
                        msgType != server_hello)
16259
                        return EXT_NOT_ALLOWED;
16260
                }
16261
                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
16262
                break;
16263
16264
            case TLSX_APPLICATION_LAYER_PROTOCOL:
16265
                WOLFSSL_MSG("ALPN extension received");
16266
16267
            #ifdef WOLFSSL_DEBUG_TLS
16268
                WOLFSSL_BUFFER(input + offset, size);
16269
            #endif
16270
16271
#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
16272
                if (IsAtLeastTLSv1_3(ssl->version)) {
16273
                    if (msgType != client_hello &&
16274
                        msgType != encrypted_extensions)
16275
                        return EXT_NOT_ALLOWED;
16276
                }
16277
                else
16278
#endif
16279
                {
16280
                    if (msgType != client_hello &&
16281
                        msgType != server_hello)
16282
                        return EXT_NOT_ALLOWED;
16283
                }
16284
                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
16285
                break;
16286
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16287
            case TLSX_SIGNATURE_ALGORITHMS:
16288
                WOLFSSL_MSG("Signature Algorithms extension received");
16289
            #ifdef WOLFSSL_DEBUG_TLS
16290
                WOLFSSL_BUFFER(input + offset, size);
16291
            #endif
16292
16293
                if (!IsAtLeastTLSv1_2(ssl))
16294
                    break;
16295
            #ifdef WOLFSSL_TLS13
16296
                if (IsAtLeastTLSv1_3(ssl->version)) {
16297
                    if (msgType != client_hello &&
16298
                        msgType != certificate_request)
16299
                        return EXT_NOT_ALLOWED;
16300
                }
16301
                else
16302
            #endif
16303
                {
16304
                    if (msgType != client_hello)
16305
                        return EXT_NOT_ALLOWED;
16306
                }
16307
                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
16308
                break;
16309
#endif
16310
16311
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
16312
            case TLSX_ENCRYPT_THEN_MAC:
16313
                WOLFSSL_MSG("Encrypt-Then-Mac extension received");
16314
16315
                /* Ignore for TLS 1.3+ */
16316
                if (IsAtLeastTLSv1_3(ssl->version))
16317
                    break;
16318
                if (msgType != client_hello &&
16319
                    msgType != server_hello)
16320
                    return EXT_NOT_ALLOWED;
16321
16322
                ret = ETM_PARSE(ssl, input + offset, size, msgType);
16323
                break;
16324
#endif /* HAVE_ENCRYPT_THEN_MAC */
16325
16326
#ifdef WOLFSSL_TLS13
16327
            case TLSX_SUPPORTED_VERSIONS:
16328
                WOLFSSL_MSG("Skipping Supported Versions - already processed");
16329
            #ifdef WOLFSSL_DEBUG_TLS
16330
                WOLFSSL_BUFFER(input + offset, size);
16331
            #endif
16332
                if (msgType != client_hello &&
16333
                    msgType != server_hello &&
16334
                    msgType != hello_retry_request)
16335
                    return EXT_NOT_ALLOWED;
16336
16337
                break;
16338
16339
    #ifdef WOLFSSL_SEND_HRR_COOKIE
16340
            case TLSX_COOKIE:
16341
                WOLFSSL_MSG("Cookie extension received");
16342
            #ifdef WOLFSSL_DEBUG_TLS
16343
                WOLFSSL_BUFFER(input + offset, size);
16344
            #endif
16345
16346
                if (!IsAtLeastTLSv1_3(ssl->version))
16347
                    break;
16348
16349
                if (msgType != client_hello &&
16350
                    msgType != hello_retry_request) {
16351
                    return EXT_NOT_ALLOWED;
16352
                }
16353
16354
                ret = CKE_PARSE(ssl, input + offset, size, msgType);
16355
                break;
16356
    #endif
16357
16358
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16359
            case TLSX_PRE_SHARED_KEY:
16360
                WOLFSSL_MSG("Pre-Shared Key extension received");
16361
            #ifdef WOLFSSL_DEBUG_TLS
16362
                WOLFSSL_BUFFER(input + offset, size);
16363
            #endif
16364
16365
                if (!IsAtLeastTLSv1_3(ssl->version))
16366
                    break;
16367
16368
                if (msgType != client_hello &&
16369
                    msgType != server_hello) {
16370
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16371
                    return EXT_NOT_ALLOWED;
16372
                }
16373
16374
                ret = PSK_PARSE(ssl, input + offset, size, msgType);
16375
                pskDone = 1;
16376
                break;
16377
16378
            case TLSX_PSK_KEY_EXCHANGE_MODES:
16379
                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
16380
            #ifdef WOLFSSL_DEBUG_TLS
16381
                WOLFSSL_BUFFER(input + offset, size);
16382
            #endif
16383
16384
                if (!IsAtLeastTLSv1_3(ssl->version))
16385
                    break;
16386
16387
                if (msgType != client_hello) {
16388
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16389
                    return EXT_NOT_ALLOWED;
16390
                }
16391
16392
                ret = PKM_PARSE(ssl, input + offset, size, msgType);
16393
                break;
16394
    #endif
16395
16396
    #ifdef WOLFSSL_EARLY_DATA
16397
            case TLSX_EARLY_DATA:
16398
                WOLFSSL_MSG("Early Data extension received");
16399
            #ifdef WOLFSSL_DEBUG_TLS
16400
                WOLFSSL_BUFFER(input + offset, size);
16401
            #endif
16402
16403
                if (!IsAtLeastTLSv1_3(ssl->version))
16404
                    break;
16405
16406
                if (msgType != client_hello && msgType != session_ticket &&
16407
                    msgType != encrypted_extensions) {
16408
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16409
                    return EXT_NOT_ALLOWED;
16410
                }
16411
                ret = EDI_PARSE(ssl, input + offset, size, msgType);
16412
                break;
16413
    #endif
16414
16415
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
16416
            case TLSX_POST_HANDSHAKE_AUTH:
16417
                WOLFSSL_MSG("Post Handshake Authentication extension received");
16418
            #ifdef WOLFSSL_DEBUG_TLS
16419
                WOLFSSL_BUFFER(input + offset, size);
16420
            #endif
16421
16422
                if (!IsAtLeastTLSv1_3(ssl->version))
16423
                    break;
16424
16425
                if (msgType != client_hello) {
16426
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16427
                    return EXT_NOT_ALLOWED;
16428
                }
16429
16430
                ret = PHA_PARSE(ssl, input + offset, size, msgType);
16431
                break;
16432
    #endif
16433
16434
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16435
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
16436
                WOLFSSL_MSG("Signature Algorithms extension received");
16437
            #ifdef WOLFSSL_DEBUG_TLS
16438
                WOLFSSL_BUFFER(input + offset, size);
16439
            #endif
16440
16441
                if (!IsAtLeastTLSv1_3(ssl->version))
16442
                    break;
16443
16444
                if (msgType != client_hello &&
16445
                        msgType != certificate_request) {
16446
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16447
                    return EXT_NOT_ALLOWED;
16448
                }
16449
16450
                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
16451
                break;
16452
    #endif
16453
16454
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16455
            case TLSX_CERTIFICATE_AUTHORITIES:
16456
                WOLFSSL_MSG("Certificate Authorities extension received");
16457
            #ifdef WOLFSSL_DEBUG_TLS
16458
                WOLFSSL_BUFFER(input + offset, size);
16459
            #endif
16460
16461
                if (!IsAtLeastTLSv1_3(ssl->version))
16462
                    break;
16463
16464
                if (msgType != client_hello &&
16465
                        msgType != certificate_request) {
16466
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16467
                    return EXT_NOT_ALLOWED;
16468
                }
16469
16470
                ret = CAN_PARSE(ssl, input + offset, size, isRequest);
16471
                break;
16472
    #endif
16473
16474
            case TLSX_KEY_SHARE:
16475
                WOLFSSL_MSG("Key Share extension received");
16476
            #ifdef WOLFSSL_DEBUG_TLS
16477
                WOLFSSL_BUFFER(input + offset, size);
16478
            #endif
16479
16480
    #ifdef HAVE_SUPPORTED_CURVES
16481
                if (!IsAtLeastTLSv1_3(ssl->version))
16482
                    break;
16483
16484
                if (msgType != client_hello && msgType != server_hello &&
16485
                        msgType != hello_retry_request) {
16486
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16487
                    return EXT_NOT_ALLOWED;
16488
                }
16489
    #endif
16490
16491
                ret = KS_PARSE(ssl, input + offset, size, msgType);
16492
                break;
16493
#endif
16494
#ifdef WOLFSSL_SRTP
16495
            case TLSX_USE_SRTP:
16496
                WOLFSSL_MSG("Use SRTP extension received");
16497
                ret = SRTP_PARSE(ssl, input + offset, size, isRequest);
16498
                break;
16499
#endif
16500
#ifdef WOLFSSL_QUIC
16501
            case TLSX_KEY_QUIC_TP_PARAMS:
16502
                FALL_THROUGH;
16503
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
16504
                WOLFSSL_MSG("QUIC transport parameter received");
16505
            #ifdef WOLFSSL_DEBUG_TLS
16506
                WOLFSSL_BUFFER(input + offset, size);
16507
            #endif
16508
16509
                if (IsAtLeastTLSv1_3(ssl->version) &&
16510
                        msgType != client_hello &&
16511
                        msgType != server_hello &&
16512
                        msgType != encrypted_extensions) {
16513
                    return EXT_NOT_ALLOWED;
16514
                }
16515
                else if (!IsAtLeastTLSv1_3(ssl->version) &&
16516
                         msgType == encrypted_extensions) {
16517
                    return EXT_NOT_ALLOWED;
16518
                }
16519
                else if (WOLFSSL_IS_QUIC(ssl)) {
16520
                    ret = QTP_PARSE(ssl, input + offset, size, type, msgType);
16521
                }
16522
                else {
16523
                    WOLFSSL_MSG("QUIC transport param TLS extension type, but no QUIC");
16524
                    return EXT_NOT_ALLOWED; /* be safe, this should not happen */
16525
                }
16526
                break;
16527
#endif /* WOLFSSL_QUIC */
16528
#if defined(WOLFSSL_DTLS_CID)
16529
            case TLSX_CONNECTION_ID:
16530
                if (msgType != client_hello && msgType != server_hello)
16531
                    return EXT_NOT_ALLOWED;
16532
16533
                WOLFSSL_MSG("ConnectionID extension received");
16534
                ret = CID_PARSE(ssl, input + offset, size, isRequest);
16535
                break;
16536
16537
#endif /* defined(WOLFSSL_DTLS_CID) */
16538
#if defined(HAVE_RPK)
16539
            case TLSX_CLIENT_CERTIFICATE_TYPE:
16540
                WOLFSSL_MSG("Client Certificate Type extension received");
16541
                ret = CCT_PARSE(ssl, input + offset, size, msgType);
16542
                break;
16543
16544
            case TLSX_SERVER_CERTIFICATE_TYPE:
16545
                WOLFSSL_MSG("Server Certificate Type extension received");
16546
                ret = SCT_PARSE(ssl, input + offset, size, msgType);
16547
                break;
16548
#endif /* HAVE_RPK */
16549
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
16550
            case TLSX_ECH:
16551
                WOLFSSL_MSG("ECH extension received");
16552
                ret = ECH_PARSE(ssl, input + offset, size, msgType);
16553
                break;
16554
#endif
16555
            default:
16556
                WOLFSSL_MSG("Unknown TLS extension type");
16557
        }
16558
16559
        /* offset should be updated here! */
16560
        offset += size;
16561
    }
16562
16563
#ifdef HAVE_EXTENDED_MASTER
16564
    if (IsAtLeastTLSv1_3(ssl->version) &&
16565
        (msgType == hello_retry_request || msgType == hello_verify_request)) {
16566
        /* Don't change EMS status until server_hello received.
16567
         * Second ClientHello must have same extensions.
16568
         */
16569
    }
16570
    else if (!isRequest && ssl->options.haveEMS && !pendingEMS)
16571
        ssl->options.haveEMS = 0;
16572
#endif
16573
#if defined(WOLFSSL_TLS13) && !defined(NO_PSK)
16574
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == server_hello &&
16575
        IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE))) {
16576
        ssl->options.noPskDheKe = 1;
16577
    }
16578
#endif
16579
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
16580
    /* RFC 8446 Section 9.2: ClientHello with KeyShare must
16581
     * contain SupportedGroups and vice-versa. */
16582
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == client_hello && isRequest) {
16583
        int hasKeyShare = !IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE));
16584
        int hasSupportedGroups = !IS_OFF(seenType,
16585
            TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
16586
16587
        if (hasKeyShare && !hasSupportedGroups) {
16588
            WOLFSSL_MSG("ClientHello with KeyShare extension missing required "
16589
                        "SupportedGroups extension");
16590
            return INCOMPLETE_DATA;
16591
        }
16592
        if (hasSupportedGroups && !hasKeyShare) {
16593
            WOLFSSL_MSG("ClientHello with SupportedGroups extension missing "
16594
                        "required KeyShare extension");
16595
            return INCOMPLETE_DATA;
16596
        }
16597
    }
16598
#endif
16599
16600
    if (ret == 0)
16601
        ret = SNI_VERIFY_PARSE(ssl, isRequest);
16602
    if (ret == 0)
16603
        ret = TCA_VERIFY_PARSE(ssl, isRequest);
16604
16605
    WOLFSSL_LEAVE("Leaving TLSX_Parse", ret);
16606
    return ret;
16607
}
16608
16609
/* undefining semaphore macros */
16610
#undef IS_OFF
16611
#undef TURN_ON
16612
#undef SEMAPHORE_SIZE
16613
16614
#endif /* HAVE_TLS_EXTENSIONS */
16615
16616
#ifndef NO_WOLFSSL_CLIENT
16617
16618
    WOLFSSL_METHOD* wolfTLS_client_method(void)
16619
0
    {
16620
0
        return wolfTLS_client_method_ex(NULL);
16621
0
    }
16622
    WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
16623
0
    {
16624
0
        WOLFSSL_METHOD* method =
16625
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16626
0
                                                     heap, DYNAMIC_TYPE_METHOD);
16627
0
        (void)heap;
16628
0
        WOLFSSL_ENTER("TLS_client_method_ex");
16629
0
        if (method) {
16630
0
        #if defined(WOLFSSL_TLS13)
16631
0
            InitSSL_Method(method, MakeTLSv1_3());
16632
        #elif !defined(WOLFSSL_NO_TLS12)
16633
            InitSSL_Method(method, MakeTLSv1_2());
16634
        #elif !defined(NO_OLD_TLS)
16635
            InitSSL_Method(method, MakeTLSv1_1());
16636
        #elif defined(WOLFSSL_ALLOW_TLSV10)
16637
            InitSSL_Method(method, MakeTLSv1());
16638
        #else
16639
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
16640
        #endif
16641
16642
0
            method->downgrade = 1;
16643
0
            method->side      = WOLFSSL_CLIENT_END;
16644
0
        }
16645
0
        return method;
16646
0
    }
16647
16648
#ifndef NO_OLD_TLS
16649
    #ifdef WOLFSSL_ALLOW_TLSV10
16650
    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
16651
    {
16652
        return wolfTLSv1_client_method_ex(NULL);
16653
    }
16654
    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
16655
    {
16656
        WOLFSSL_METHOD* method =
16657
                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16658
                                                     heap, DYNAMIC_TYPE_METHOD);
16659
        (void)heap;
16660
        WOLFSSL_ENTER("TLSv1_client_method_ex");
16661
        if (method)
16662
            InitSSL_Method(method, MakeTLSv1());
16663
        return method;
16664
    }
16665
    #endif /* WOLFSSL_ALLOW_TLSV10 */
16666
16667
    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
16668
    {
16669
        return wolfTLSv1_1_client_method_ex(NULL);
16670
    }
16671
    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
16672
    {
16673
        WOLFSSL_METHOD* method =
16674
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16675
                                                     heap, DYNAMIC_TYPE_METHOD);
16676
        (void)heap;
16677
        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
16678
        if (method)
16679
            InitSSL_Method(method, MakeTLSv1_1());
16680
        return method;
16681
    }
16682
#endif /* !NO_OLD_TLS */
16683
16684
#ifndef WOLFSSL_NO_TLS12
16685
    WOLFSSL_ABI
16686
    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
16687
4
    {
16688
4
        return wolfTLSv1_2_client_method_ex(NULL);
16689
4
    }
16690
    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
16691
4
    {
16692
4
        WOLFSSL_METHOD* method =
16693
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16694
4
                                                     heap, DYNAMIC_TYPE_METHOD);
16695
4
        (void)heap;
16696
4
        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
16697
4
        if (method)
16698
4
            InitSSL_Method(method, MakeTLSv1_2());
16699
4
        return method;
16700
4
    }
16701
#endif /* WOLFSSL_NO_TLS12 */
16702
16703
#ifdef WOLFSSL_TLS13
16704
    /* The TLS v1.3 client method data.
16705
     *
16706
     * returns the method data for a TLS v1.3 client.
16707
     */
16708
    WOLFSSL_ABI
16709
    WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
16710
4
    {
16711
4
        return wolfTLSv1_3_client_method_ex(NULL);
16712
4
    }
16713
16714
    /* The TLS v1.3 client method data.
16715
     *
16716
     * heap  The heap used for allocation.
16717
     * returns the method data for a TLS v1.3 client.
16718
     */
16719
    WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
16720
4
    {
16721
4
        WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
16722
4
                                 XMALLOC(sizeof(WOLFSSL_METHOD), heap,
16723
4
                                         DYNAMIC_TYPE_METHOD);
16724
4
        (void)heap;
16725
4
        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
16726
4
        if (method)
16727
4
            InitSSL_Method(method, MakeTLSv1_3());
16728
4
        return method;
16729
4
    }
16730
#endif /* WOLFSSL_TLS13 */
16731
16732
#ifdef WOLFSSL_DTLS
16733
16734
    WOLFSSL_METHOD* wolfDTLS_client_method(void)
16735
    {
16736
        return wolfDTLS_client_method_ex(NULL);
16737
    }
16738
    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
16739
    {
16740
        WOLFSSL_METHOD* method =
16741
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16742
                                                     heap, DYNAMIC_TYPE_METHOD);
16743
        (void)heap;
16744
        WOLFSSL_ENTER("DTLS_client_method_ex");
16745
        if (method) {
16746
        #if defined(WOLFSSL_DTLS13)
16747
            InitSSL_Method(method, MakeDTLSv1_3());
16748
        #elif !defined(WOLFSSL_NO_TLS12)
16749
            InitSSL_Method(method, MakeDTLSv1_2());
16750
        #elif !defined(NO_OLD_TLS)
16751
            InitSSL_Method(method, MakeDTLSv1());
16752
        #else
16753
            #error No DTLS version enabled!
16754
        #endif
16755
16756
            method->downgrade = 1;
16757
            method->side      = WOLFSSL_CLIENT_END;
16758
        }
16759
        return method;
16760
    }
16761
16762
    #ifndef NO_OLD_TLS
16763
    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
16764
    {
16765
        return wolfDTLSv1_client_method_ex(NULL);
16766
    }
16767
    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
16768
    {
16769
        WOLFSSL_METHOD* method =
16770
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16771
                                                 heap, DYNAMIC_TYPE_METHOD);
16772
        (void)heap;
16773
        WOLFSSL_ENTER("DTLSv1_client_method_ex");
16774
        if (method)
16775
            InitSSL_Method(method, MakeDTLSv1());
16776
        return method;
16777
    }
16778
    #endif  /* NO_OLD_TLS */
16779
16780
    #ifndef WOLFSSL_NO_TLS12
16781
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
16782
    {
16783
        return wolfDTLSv1_2_client_method_ex(NULL);
16784
    }
16785
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
16786
    {
16787
        WOLFSSL_METHOD* method =
16788
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16789
                                                 heap, DYNAMIC_TYPE_METHOD);
16790
        (void)heap;
16791
        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
16792
        if (method)
16793
            InitSSL_Method(method, MakeDTLSv1_2());
16794
        (void)heap;
16795
        return method;
16796
    }
16797
    #endif /* !WOLFSSL_NO_TLS12 */
16798
#endif /* WOLFSSL_DTLS */
16799
16800
#endif /* NO_WOLFSSL_CLIENT */
16801
16802
16803
/* EITHER SIDE METHODS */
16804
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
16805
    #ifndef NO_OLD_TLS
16806
    #ifdef WOLFSSL_ALLOW_TLSV10
16807
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16808
     *
16809
     * Returns a pointer to a WOLFSSL_METHOD struct
16810
     */
16811
    WOLFSSL_METHOD* wolfTLSv1_method(void)
16812
    {
16813
        return wolfTLSv1_method_ex(NULL);
16814
    }
16815
    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
16816
    {
16817
        WOLFSSL_METHOD* m;
16818
        WOLFSSL_ENTER("TLSv1_method");
16819
    #ifndef NO_WOLFSSL_CLIENT
16820
        m = wolfTLSv1_client_method_ex(heap);
16821
    #else
16822
        m = wolfTLSv1_server_method_ex(heap);
16823
    #endif
16824
        if (m != NULL) {
16825
            m->side = WOLFSSL_NEITHER_END;
16826
        }
16827
16828
        return m;
16829
    }
16830
    #endif /* WOLFSSL_ALLOW_TLSV10 */
16831
16832
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16833
     *
16834
     * Returns a pointer to a WOLFSSL_METHOD struct
16835
     */
16836
    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
16837
    {
16838
        return wolfTLSv1_1_method_ex(NULL);
16839
    }
16840
    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
16841
    {
16842
        WOLFSSL_METHOD* m;
16843
        WOLFSSL_ENTER("TLSv1_1_method");
16844
    #ifndef NO_WOLFSSL_CLIENT
16845
        m = wolfTLSv1_1_client_method_ex(heap);
16846
    #else
16847
        m = wolfTLSv1_1_server_method_ex(heap);
16848
    #endif
16849
        if (m != NULL) {
16850
            m->side = WOLFSSL_NEITHER_END;
16851
        }
16852
        return m;
16853
    }
16854
    #endif /* !NO_OLD_TLS */
16855
16856
    #ifndef WOLFSSL_NO_TLS12
16857
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16858
     *
16859
     * Returns a pointer to a WOLFSSL_METHOD struct
16860
     */
16861
    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
16862
    {
16863
        return wolfTLSv1_2_method_ex(NULL);
16864
    }
16865
    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
16866
    {
16867
        WOLFSSL_METHOD* m;
16868
        WOLFSSL_ENTER("TLSv1_2_method");
16869
    #ifndef NO_WOLFSSL_CLIENT
16870
        m = wolfTLSv1_2_client_method_ex(heap);
16871
    #else
16872
        m = wolfTLSv1_2_server_method_ex(heap);
16873
    #endif
16874
        if (m != NULL) {
16875
            m->side = WOLFSSL_NEITHER_END;
16876
        }
16877
        return m;
16878
    }
16879
    #endif /* !WOLFSSL_NO_TLS12 */
16880
16881
    #ifdef WOLFSSL_TLS13
16882
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16883
     *
16884
     * Returns a pointer to a WOLFSSL_METHOD struct
16885
     */
16886
    WOLFSSL_METHOD* wolfTLSv1_3_method(void)
16887
    {
16888
        return wolfTLSv1_3_method_ex(NULL);
16889
    }
16890
    WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
16891
    {
16892
        WOLFSSL_METHOD* m;
16893
        WOLFSSL_ENTER("TLSv1_3_method");
16894
    #ifndef NO_WOLFSSL_CLIENT
16895
        m = wolfTLSv1_3_client_method_ex(heap);
16896
    #else
16897
        m = wolfTLSv1_3_server_method_ex(heap);
16898
    #endif
16899
        if (m != NULL) {
16900
            m->side = WOLFSSL_NEITHER_END;
16901
        }
16902
        return m;
16903
    }
16904
    #endif /* WOLFSSL_TLS13 */
16905
16906
#ifdef WOLFSSL_DTLS
16907
    WOLFSSL_METHOD* wolfDTLS_method(void)
16908
    {
16909
        return wolfDTLS_method_ex(NULL);
16910
    }
16911
    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
16912
    {
16913
        WOLFSSL_METHOD* m;
16914
        WOLFSSL_ENTER("DTLS_method_ex");
16915
    #ifndef NO_WOLFSSL_CLIENT
16916
        m = wolfDTLS_client_method_ex(heap);
16917
    #else
16918
        m = wolfDTLS_server_method_ex(heap);
16919
    #endif
16920
        if (m != NULL) {
16921
            m->side = WOLFSSL_NEITHER_END;
16922
        }
16923
        return m;
16924
    }
16925
16926
    #ifndef NO_OLD_TLS
16927
    WOLFSSL_METHOD* wolfDTLSv1_method(void)
16928
    {
16929
        return wolfDTLSv1_method_ex(NULL);
16930
    }
16931
    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
16932
    {
16933
        WOLFSSL_METHOD* m;
16934
        WOLFSSL_ENTER("DTLSv1_method_ex");
16935
    #ifndef NO_WOLFSSL_CLIENT
16936
        m = wolfDTLSv1_client_method_ex(heap);
16937
    #else
16938
        m = wolfDTLSv1_server_method_ex(heap);
16939
    #endif
16940
        if (m != NULL) {
16941
            m->side = WOLFSSL_NEITHER_END;
16942
        }
16943
        return m;
16944
    }
16945
    #endif /* !NO_OLD_TLS */
16946
    #ifndef WOLFSSL_NO_TLS12
16947
    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
16948
    {
16949
        return wolfDTLSv1_2_method_ex(NULL);
16950
    }
16951
    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
16952
    {
16953
        WOLFSSL_METHOD* m;
16954
        WOLFSSL_ENTER("DTLSv1_2_method");
16955
    #ifndef NO_WOLFSSL_CLIENT
16956
        m = wolfDTLSv1_2_client_method_ex(heap);
16957
    #else
16958
        m = wolfDTLSv1_2_server_method_ex(heap);
16959
    #endif
16960
        if (m != NULL) {
16961
            m->side = WOLFSSL_NEITHER_END;
16962
        }
16963
        return m;
16964
    }
16965
    #endif /* !WOLFSSL_NO_TLS12 */
16966
    #ifdef WOLFSSL_DTLS13
16967
    WOLFSSL_METHOD* wolfDTLSv1_3_method(void)
16968
    {
16969
        return wolfDTLSv1_3_method_ex(NULL);
16970
    }
16971
    WOLFSSL_METHOD* wolfDTLSv1_3_method_ex(void* heap)
16972
    {
16973
        WOLFSSL_METHOD* m;
16974
        WOLFSSL_ENTER("DTLSv1_3_method");
16975
    #ifndef NO_WOLFSSL_CLIENT
16976
        m = wolfDTLSv1_3_client_method_ex(heap);
16977
    #else
16978
        m = wolfDTLSv1_3_server_method_ex(heap);
16979
    #endif
16980
        if (m != NULL) {
16981
            m->side = WOLFSSL_NEITHER_END;
16982
        }
16983
        return m;
16984
    }
16985
    #endif /* WOLFSSL_DTLS13 */
16986
#endif /* WOLFSSL_DTLS */
16987
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
16988
16989
16990
#ifndef NO_WOLFSSL_SERVER
16991
16992
    WOLFSSL_METHOD* wolfTLS_server_method(void)
16993
0
    {
16994
0
        return wolfTLS_server_method_ex(NULL);
16995
0
    }
16996
16997
    WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
16998
0
    {
16999
0
        WOLFSSL_METHOD* method =
17000
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17001
0
                                                     heap, DYNAMIC_TYPE_METHOD);
17002
0
        (void)heap;
17003
0
        WOLFSSL_ENTER("TLS_server_method_ex");
17004
0
        if (method) {
17005
0
        #if defined(WOLFSSL_TLS13)
17006
0
            InitSSL_Method(method, MakeTLSv1_3());
17007
        #elif !defined(WOLFSSL_NO_TLS12)
17008
            InitSSL_Method(method, MakeTLSv1_2());
17009
        #elif !defined(NO_OLD_TLS)
17010
            InitSSL_Method(method, MakeTLSv1_1());
17011
        #elif defined(WOLFSSL_ALLOW_TLSV10)
17012
            InitSSL_Method(method, MakeTLSv1());
17013
        #else
17014
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
17015
        #endif
17016
17017
0
            method->downgrade = 1;
17018
0
            method->side      = WOLFSSL_SERVER_END;
17019
0
        }
17020
0
        return method;
17021
0
    }
17022
17023
#ifndef NO_OLD_TLS
17024
    #ifdef WOLFSSL_ALLOW_TLSV10
17025
    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
17026
    {
17027
        return wolfTLSv1_server_method_ex(NULL);
17028
    }
17029
    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
17030
    {
17031
        WOLFSSL_METHOD* method =
17032
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17033
                                                     heap, DYNAMIC_TYPE_METHOD);
17034
        (void)heap;
17035
        WOLFSSL_ENTER("TLSv1_server_method_ex");
17036
        if (method) {
17037
            InitSSL_Method(method, MakeTLSv1());
17038
            method->side = WOLFSSL_SERVER_END;
17039
        }
17040
        return method;
17041
    }
17042
    #endif /* WOLFSSL_ALLOW_TLSV10 */
17043
17044
    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
17045
    {
17046
        return wolfTLSv1_1_server_method_ex(NULL);
17047
    }
17048
    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
17049
    {
17050
        WOLFSSL_METHOD* method =
17051
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17052
                                                     heap, DYNAMIC_TYPE_METHOD);
17053
        (void)heap;
17054
        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
17055
        if (method) {
17056
            InitSSL_Method(method, MakeTLSv1_1());
17057
            method->side = WOLFSSL_SERVER_END;
17058
        }
17059
        return method;
17060
    }
17061
#endif /* !NO_OLD_TLS */
17062
17063
17064
#ifndef WOLFSSL_NO_TLS12
17065
    WOLFSSL_ABI
17066
    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
17067
4.85k
    {
17068
4.85k
        return wolfTLSv1_2_server_method_ex(NULL);
17069
4.85k
    }
17070
    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
17071
4.85k
    {
17072
4.85k
        WOLFSSL_METHOD* method =
17073
4.85k
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17074
4.85k
                                                     heap, DYNAMIC_TYPE_METHOD);
17075
4.85k
        (void)heap;
17076
4.85k
        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
17077
4.85k
        if (method) {
17078
4.85k
            InitSSL_Method(method, MakeTLSv1_2());
17079
4.85k
            method->side = WOLFSSL_SERVER_END;
17080
4.85k
        }
17081
4.85k
        return method;
17082
4.85k
    }
17083
#endif /* !WOLFSSL_NO_TLS12 */
17084
17085
#ifdef WOLFSSL_TLS13
17086
    /* The TLS v1.3 server method data.
17087
     *
17088
     * returns the method data for a TLS v1.3 server.
17089
     */
17090
    WOLFSSL_ABI
17091
    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
17092
4
    {
17093
4
        return wolfTLSv1_3_server_method_ex(NULL);
17094
4
    }
17095
17096
    /* The TLS v1.3 server method data.
17097
     *
17098
     * heap  The heap used for allocation.
17099
     * returns the method data for a TLS v1.3 server.
17100
     */
17101
    WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
17102
4
    {
17103
4
        WOLFSSL_METHOD* method =
17104
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17105
4
                                                     heap, DYNAMIC_TYPE_METHOD);
17106
4
        (void)heap;
17107
4
        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
17108
4
        if (method) {
17109
4
            InitSSL_Method(method, MakeTLSv1_3());
17110
4
            method->side = WOLFSSL_SERVER_END;
17111
4
        }
17112
4
        return method;
17113
4
    }
17114
#endif /* WOLFSSL_TLS13 */
17115
17116
#ifdef WOLFSSL_DTLS
17117
    WOLFSSL_METHOD* wolfDTLS_server_method(void)
17118
    {
17119
        return wolfDTLS_server_method_ex(NULL);
17120
    }
17121
    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
17122
    {
17123
        WOLFSSL_METHOD* method =
17124
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17125
                                                     heap, DYNAMIC_TYPE_METHOD);
17126
        (void)heap;
17127
        WOLFSSL_ENTER("DTLS_server_method_ex");
17128
        if (method) {
17129
        #if defined(WOLFSSL_DTLS13)
17130
            InitSSL_Method(method, MakeDTLSv1_3());
17131
        #elif !defined(WOLFSSL_NO_TLS12)
17132
            InitSSL_Method(method, MakeDTLSv1_2());
17133
        #elif !defined(NO_OLD_TLS)
17134
            InitSSL_Method(method, MakeDTLSv1());
17135
        #else
17136
            #error No DTLS version enabled!
17137
        #endif
17138
17139
            method->downgrade = 1;
17140
            method->side      = WOLFSSL_SERVER_END;
17141
        }
17142
        return method;
17143
    }
17144
17145
    #ifndef NO_OLD_TLS
17146
    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
17147
    {
17148
        return wolfDTLSv1_server_method_ex(NULL);
17149
    }
17150
    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
17151
    {
17152
        WOLFSSL_METHOD* method =
17153
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17154
                                                 heap, DYNAMIC_TYPE_METHOD);
17155
        (void)heap;
17156
        WOLFSSL_ENTER("DTLSv1_server_method_ex");
17157
        if (method) {
17158
            InitSSL_Method(method, MakeDTLSv1());
17159
            method->side = WOLFSSL_SERVER_END;
17160
        }
17161
        return method;
17162
    }
17163
    #endif /* !NO_OLD_TLS */
17164
17165
    #ifndef WOLFSSL_NO_TLS12
17166
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
17167
    {
17168
        return wolfDTLSv1_2_server_method_ex(NULL);
17169
    }
17170
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
17171
    {
17172
        WOLFSSL_METHOD* method =
17173
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17174
                                                 heap, DYNAMIC_TYPE_METHOD);
17175
        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
17176
        (void)heap;
17177
        if (method) {
17178
            InitSSL_Method(method, MakeDTLSv1_2());
17179
            method->side = WOLFSSL_SERVER_END;
17180
        }
17181
        (void)heap;
17182
        return method;
17183
    }
17184
    #endif /* !WOLFSSL_NO_TLS12 */
17185
#endif /* WOLFSSL_DTLS */
17186
17187
#endif /* NO_WOLFSSL_SERVER */
17188
17189
#endif /* NO_TLS */
17190
17191
#endif /* WOLFCRYPT_ONLY */