Coverage Report

Created: 2025-07-31 06:22

/src/wolfssl/src/tls.c
Line
Count
Source (jump to first uncovered line)
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
0
    #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
#ifdef WOLFSSL_SM3
148
        if (ssl->specs.mac_algorithm == sm3_mac) {
149
            ret |= wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
150
            hashSz = WC_SM3_DIGEST_SIZE;
151
        }
152
#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
0
{
171
0
    int ret;
172
0
    const byte* side = NULL;
173
0
    word32 hashSz = HSHASH_SZ;
174
0
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
175
0
    byte handshake_hash[HSHASH_SZ];
176
#else
177
    WC_DECLARE_VAR(handshake_hash, byte, HSHASH_SZ, ssl->heap);
178
    WC_ALLOC_VAR(handshake_hash, byte, HSHASH_SZ, ssl->heap);
179
    if (handshake_hash == NULL)
180
        return MEMORY_E;
181
#endif
182
183
0
    XMEMSET(handshake_hash, 0, HSHASH_SZ);
184
0
    ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
185
0
    if (ret == 0) {
186
0
        if (XSTRNCMP((const char*)sender, (const char*)kTlsClientStr,
187
0
                                                          SIZEOF_SENDER) == 0) {
188
0
            side = kTlsClientFinStr;
189
0
        }
190
0
        else if (XSTRNCMP((const char*)sender, (const char*)kTlsServerStr,
191
0
                                                          SIZEOF_SENDER) == 0) {
192
0
            side = kTlsServerFinStr;
193
0
        }
194
0
        else {
195
0
            ret = BAD_FUNC_ARG;
196
0
            WOLFSSL_MSG("Unexpected sender value");
197
0
        }
198
0
    }
199
200
0
    if (ret == 0) {
201
0
#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
0
        {
212
0
            PRIVATE_KEY_UNLOCK();
213
0
            ret = wc_PRF_TLS((byte*)hashes, TLS_FINISHED_SZ,
214
0
                      ssl->arrays->masterSecret, SECRET_LEN, side,
215
0
                      FINISHED_LABEL_SZ, handshake_hash, hashSz,
216
0
                      IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
217
0
                      ssl->heap, ssl->devId);
218
0
            PRIVATE_KEY_LOCK();
219
0
        }
220
0
        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
0
    }
231
232
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
233
    WC_FREE_VAR(handshake_hash, ssl->heap);
234
#elif defined(WOLFSSL_CHECK_MEM_ZERO)
235
    wc_MemZero_Check(handshake_hash, HSHASH_SZ);
236
#endif
237
238
0
    return ret;
239
0
}
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
0
{
273
0
    ProtocolVersion pv;
274
0
    pv.major = SSLv3_MAJOR;
275
0
    pv.minor = TLSv1_2_MINOR;
276
277
0
    return pv;
278
0
}
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
0
{
289
0
    ProtocolVersion pv;
290
0
    pv.major = SSLv3_MAJOR;
291
0
    pv.minor = TLSv1_3_MINOR;
292
293
0
    return pv;
294
0
}
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
0
{
404
0
    int ret;
405
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
406
    WC_DECLARE_VAR(seed, byte, SEED_LEN, heap);
407
    WC_ALLOC_VAR(seed, byte, SEED_LEN, heap);
408
    if (seed == NULL)
409
        return MEMORY_E;
410
#else
411
0
    byte seed[SEED_LEN];
412
0
#endif
413
414
0
    XMEMCPY(seed,           sr, RAN_LEN);
415
0
    XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
416
417
0
#ifdef WOLFSSL_HAVE_PRF
418
0
    PRIVATE_KEY_UNLOCK();
419
0
    ret = wc_PRF_TLS(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
420
0
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
421
0
    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
    WC_FREE_VAR(seed, heap);
445
#endif
446
447
0
    return ret;
448
0
}
449
450
/* External facing wrapper so user can call as well, 0 on success */
451
int wolfSSL_DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
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_dig, key_dig_len, ms, msLen, sr, cr, tls1_2,
457
0
        hash_type, NULL, INVALID_DEVID);
458
0
}
459
460
461
int DeriveTlsKeys(WOLFSSL* ssl)
462
0
{
463
0
    int   ret;
464
0
    int   key_dig_len = 2 * ssl->specs.hash_size +
465
0
                        2 * ssl->specs.key_size  +
466
0
                        2 * ssl->specs.iv_size;
467
#ifdef WOLFSSL_SMALL_STACK
468
    byte* key_dig;
469
#else
470
0
    byte  key_dig[MAX_PRF_DIG];
471
0
#endif
472
473
#ifdef WOLFSSL_SMALL_STACK
474
    key_dig = (byte*)XMALLOC(MAX_PRF_DIG, ssl->heap, DYNAMIC_TYPE_DIGEST);
475
    if (key_dig == NULL) {
476
        return MEMORY_E;
477
    }
478
#endif
479
480
0
    XMEMSET(key_dig, 0, MAX_PRF_DIG);
481
482
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
483
    ret = PROTOCOLCB_UNAVAILABLE;
484
    if (ssl->ctx->GenSessionKeyCb) {
485
        void* ctx = wolfSSL_GetGenSessionKeyCtx(ssl);
486
        ret = ssl->ctx->GenSessionKeyCb(ssl, ctx);
487
    }
488
    if (!ssl->ctx->GenSessionKeyCb ||
489
        ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
490
#endif
491
0
    ret = _DeriveTlsKeys(key_dig, (word32)key_dig_len,
492
0
                     ssl->arrays->masterSecret, SECRET_LEN,
493
0
                     ssl->arrays->serverRandom, ssl->arrays->clientRandom,
494
0
                     IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
495
0
                     ssl->heap, ssl->devId);
496
0
    if (ret == 0)
497
0
        ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
498
499
#ifdef WOLFSSL_SMALL_STACK
500
    XFREE(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
501
#endif
502
503
0
    return ret;
504
0
}
505
506
static int _MakeTlsMasterSecret(byte* ms, word32 msLen,
507
                               const byte* pms, word32 pmsLen,
508
                               const byte* cr, const byte* sr,
509
                               int tls1_2, int hash_type,
510
                               void* heap, int devId)
511
0
{
512
0
    int ret;
513
0
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
514
0
    byte seed[SEED_LEN];
515
#else
516
    WC_DECLARE_VAR(seed, byte, SEED_LEN, heap);
517
    WC_ALLOC_VAR(seed, byte, SEED_LEN, heap);
518
    if (seed == NULL)
519
        return MEMORY_E;
520
#endif
521
522
0
    XMEMCPY(seed,           cr, RAN_LEN);
523
0
    XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
524
525
0
#ifdef WOLFSSL_HAVE_PRF
526
0
    PRIVATE_KEY_UNLOCK();
527
0
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
528
0
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
529
0
    PRIVATE_KEY_LOCK();
530
#else
531
    /* Pseudo random function must be enabled in the configuration. */
532
    ret = PRF_MISSING;
533
    WOLFSSL_MSG("Pseudo-random function is not enabled");
534
535
    (void)ms;
536
    (void)msLen;
537
    (void)pms;
538
    (void)pmsLen;
539
    (void)tls1_2;
540
    (void)hash_type;
541
    (void)heap;
542
    (void)devId;
543
#endif
544
545
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
546
    WC_FREE_VAR(seed, heap);
547
#endif
548
549
0
    return ret;
550
0
}
551
552
/* External facing wrapper so user can call as well, 0 on success */
553
int wolfSSL_MakeTlsMasterSecret(byte* ms, word32 msLen,
554
                               const byte* pms, word32 pmsLen,
555
                               const byte* cr, const byte* sr,
556
                               int tls1_2, int hash_type)
557
0
{
558
0
    return _MakeTlsMasterSecret(ms, msLen, pms, pmsLen, cr, sr, tls1_2,
559
0
        hash_type, NULL, INVALID_DEVID);
560
0
}
561
562
563
#ifdef HAVE_EXTENDED_MASTER
564
565
static int _MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
566
                                        const byte* pms, word32 pmsLen,
567
                                        const byte* sHash, word32 sHashLen,
568
                                        int tls1_2, int hash_type,
569
                                        void* heap, int devId)
570
0
{
571
0
    int ret;
572
573
0
#ifdef WOLFSSL_HAVE_PRF
574
0
    PRIVATE_KEY_UNLOCK();
575
0
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
576
0
               sHash, sHashLen, tls1_2, hash_type, heap, devId);
577
0
    PRIVATE_KEY_LOCK();
578
#else
579
    /* Pseudo random function must be enabled in the configuration. */
580
    ret = PRF_MISSING;
581
    WOLFSSL_MSG("Pseudo-random function is not enabled");
582
583
    (void)ms;
584
    (void)msLen;
585
    (void)pms;
586
    (void)pmsLen;
587
    (void)sHash;
588
    (void)sHashLen;
589
    (void)tls1_2;
590
    (void)hash_type;
591
    (void)heap;
592
    (void)devId;
593
#endif
594
0
    return ret;
595
0
}
596
597
/* External facing wrapper so user can call as well, 0 on success */
598
int wolfSSL_MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
599
                                        const byte* pms, word32 pmsLen,
600
                                        const byte* sHash, word32 sHashLen,
601
                                        int tls1_2, int hash_type)
602
0
{
603
0
    return _MakeTlsExtendedMasterSecret(ms, msLen, pms, pmsLen, sHash, sHashLen,
604
0
        tls1_2, hash_type, NULL, INVALID_DEVID);
605
0
}
606
607
#endif /* HAVE_EXTENDED_MASTER */
608
609
610
int MakeTlsMasterSecret(WOLFSSL* ssl)
611
0
{
612
0
    int ret;
613
614
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
615
    /* If this is called from a sniffer session with keylog file support, obtain
616
     * the master secret from the callback */
617
    if (ssl->snifferSecretCb != NULL) {
618
        ret = ssl->snifferSecretCb(ssl->arrays->clientRandom,
619
                                   SNIFFER_SECRET_TLS12_MASTER_SECRET,
620
                                   ssl->arrays->masterSecret);
621
        if (ret != 0) {
622
            return ret;
623
        }
624
        ret = DeriveTlsKeys(ssl);
625
        return ret;
626
    }
627
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
628
629
0
#ifdef HAVE_EXTENDED_MASTER
630
0
    if (ssl->options.haveEMS) {
631
0
        word32 hashSz = HSHASH_SZ;
632
    #ifdef WOLFSSL_SMALL_STACK
633
        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
634
                                              DYNAMIC_TYPE_DIGEST);
635
        if (handshake_hash == NULL)
636
            return MEMORY_E;
637
    #else
638
0
        byte handshake_hash[HSHASH_SZ];
639
0
    #endif
640
641
0
        XMEMSET(handshake_hash, 0, HSHASH_SZ);
642
0
        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
643
0
        if (ret == 0) {
644
        #if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
645
            ret = PROTOCOLCB_UNAVAILABLE;
646
            if (ssl->ctx->GenExtMasterCb) {
647
                void* ctx = wolfSSL_GetGenExtMasterSecretCtx(ssl);
648
                ret = ssl->ctx->GenExtMasterCb(ssl, handshake_hash, hashSz,
649
                                                ctx);
650
            }
651
            if (!ssl->ctx->GenExtMasterCb ||
652
                ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
653
        #endif /* (HAVE_SECRET_CALLBACK) && (HAVE_EXT_SECRET_CALLBACK) */
654
0
            {
655
0
                ret = _MakeTlsExtendedMasterSecret(
656
0
                    ssl->arrays->masterSecret, SECRET_LEN,
657
0
                    ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
658
0
                    handshake_hash, hashSz,
659
0
                    IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
660
0
                    ssl->heap, ssl->devId);
661
0
            }
662
0
            ForceZero(handshake_hash, hashSz);
663
0
        }
664
665
    #ifdef WOLFSSL_SMALL_STACK
666
        XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
667
    #elif defined(WOLFSSL_CHECK_MEM_ZERO)
668
        wc_MemZero_Check(handshake_hash, HSHASH_SZ);
669
    #endif
670
0
    }
671
0
    else
672
0
#endif /* HAVE_EXTENDED_MASTER */
673
0
    {
674
675
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
676
        ret = PROTOCOLCB_UNAVAILABLE;
677
        if (ssl->ctx->GenMasterCb) {
678
            void* ctx = wolfSSL_GetGenMasterSecretCtx(ssl);
679
            ret = ssl->ctx->GenMasterCb(ssl, ctx);
680
        }
681
        if (!ssl->ctx->GenMasterCb ||
682
            ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE))
683
#endif
684
0
        {
685
0
            ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret,
686
0
                      SECRET_LEN, ssl->arrays->preMasterSecret,
687
0
                      ssl->arrays->preMasterSz, ssl->arrays->clientRandom,
688
0
                      ssl->arrays->serverRandom, IsAtLeastTLSv1_2(ssl),
689
0
                      ssl->specs.mac_algorithm, ssl->heap, ssl->devId);
690
0
        }
691
0
    }
692
#ifdef HAVE_SECRET_CALLBACK
693
    if (ret == 0 && ssl->tlsSecretCb != NULL) {
694
        ret = ssl->tlsSecretCb(ssl, ssl->arrays->masterSecret,
695
                SECRET_LEN, ssl->tlsSecretCtx);
696
    }
697
#endif /* HAVE_SECRET_CALLBACK */
698
0
    if (ret == 0) {
699
0
        ret = DeriveTlsKeys(ssl);
700
0
    }
701
702
0
    return ret;
703
0
}
704
705
706
/* Used by EAP-TLS and EAP-TTLS to derive keying material from
707
 * the master_secret. */
708
int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* msk, unsigned int len,
709
                                                              const char* label)
710
0
{
711
0
    int   ret;
712
#ifdef WOLFSSL_SMALL_STACK
713
    byte* seed;
714
#else
715
0
    byte  seed[SEED_LEN];
716
0
#endif
717
718
#ifdef WOLFSSL_SMALL_STACK
719
    seed = (byte*)XMALLOC(SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED);
720
    if (seed == NULL)
721
        return MEMORY_E;
722
#endif
723
724
    /*
725
     * As per RFC-5281, the order of the client and server randoms is reversed
726
     * from that used by the TLS protocol to derive keys.
727
     */
728
0
    XMEMCPY(seed,           ssl->arrays->clientRandom, RAN_LEN);
729
0
    XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
730
731
0
#ifdef WOLFSSL_HAVE_PRF
732
0
    PRIVATE_KEY_UNLOCK();
733
0
    ret = wc_PRF_TLS((byte*)msk, len, ssl->arrays->masterSecret, SECRET_LEN,
734
0
              (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
735
0
              IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
736
0
              ssl->heap, ssl->devId);
737
0
    PRIVATE_KEY_LOCK();
738
#else
739
    /* Pseudo random function must be enabled in the configuration. */
740
    ret = PRF_MISSING;
741
    WOLFSSL_MSG("Pseudo-random function is not enabled");
742
743
    (void)msk;
744
    (void)len;
745
    (void)label;
746
#endif
747
748
#ifdef WOLFSSL_SMALL_STACK
749
    XFREE(seed, ssl->heap, DYNAMIC_TYPE_SEED);
750
#endif
751
752
0
    return ret;
753
0
}
754
755
/* return HMAC digest type in wolfSSL format */
756
int wolfSSL_GetHmacType(WOLFSSL* ssl)
757
0
{
758
0
    if (ssl == NULL)
759
0
        return BAD_FUNC_ARG;
760
761
0
    return wolfSSL_GetHmacType_ex(&ssl->specs);
762
0
}
763
764
765
int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
766
                           int verify)
767
0
{
768
0
    if (ssl == NULL || inner == NULL)
769
0
        return BAD_FUNC_ARG;
770
771
0
    if (content == dtls12_cid
772
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
773
       || (ssl->options.dtls && DtlsGetCidTxSize(ssl) > 0)
774
#endif
775
0
    ) {
776
0
        WOLFSSL_MSG("wolfSSL_SetTlsHmacInner doesn't support CID");
777
0
        return BAD_FUNC_ARG;
778
0
    }
779
780
0
    XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
781
782
0
    WriteSEQ(ssl, verify, inner);
783
0
    inner[SEQ_SZ] = (byte)content;
784
0
    inner[SEQ_SZ + ENUM_LEN]            = ssl->version.major;
785
0
    inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
786
0
    c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
787
788
0
    return 0;
789
0
}
790
791
792
#ifndef WOLFSSL_AEAD_ONLY
793
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
794
    !defined(HAVE_SELFTEST)
795
796
/* Update the hash in the HMAC.
797
 *
798
 * hmac  HMAC object.
799
 * data  Data to be hashed.
800
 * sz    Size of data to hash.
801
 * returns 0 on success, otherwise failure.
802
 */
803
static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz)
804
0
{
805
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
806
807
0
    switch (hmac->macType) {
808
0
    #ifndef NO_SHA
809
0
        case WC_SHA:
810
0
            ret = wc_ShaUpdate(&hmac->hash.sha, data, sz);
811
0
            break;
812
0
    #endif /* !NO_SHA */
813
814
0
    #ifndef NO_SHA256
815
0
        case WC_SHA256:
816
0
            ret = wc_Sha256Update(&hmac->hash.sha256, data, sz);
817
0
            break;
818
0
    #endif /* !NO_SHA256 */
819
820
0
    #ifdef WOLFSSL_SHA384
821
0
        case WC_SHA384:
822
0
            ret = wc_Sha384Update(&hmac->hash.sha384, data, sz);
823
0
            break;
824
0
    #endif /* WOLFSSL_SHA384 */
825
826
0
    #ifdef WOLFSSL_SHA512
827
0
        case WC_SHA512:
828
0
            ret = wc_Sha512Update(&hmac->hash.sha512, data, sz);
829
0
            break;
830
0
    #endif /* WOLFSSL_SHA512 */
831
832
    #ifdef WOLFSSL_SM3
833
        case WC_SM3:
834
            ret = wc_Sm3Update(&hmac->hash.sm3, data, sz);
835
            break;
836
    #endif /* WOLFSSL_SM3 */
837
838
0
        default:
839
0
            ret = BAD_FUNC_ARG;
840
0
            break;
841
0
    }
842
843
0
    return ret;
844
0
}
845
846
/* Finalize the hash but don't put the EOC, padding or length in.
847
 *
848
 * hmac  HMAC object.
849
 * hash  Hash result.
850
 * returns 0 on success, otherwise failure.
851
 */
852
static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash)
853
0
{
854
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
855
856
0
    switch (hmac->macType) {
857
0
    #ifndef NO_SHA
858
0
        case WC_SHA:
859
0
            ret = wc_ShaFinalRaw(&hmac->hash.sha, hash);
860
0
            break;
861
0
    #endif /* !NO_SHA */
862
863
0
    #ifndef NO_SHA256
864
0
        case WC_SHA256:
865
0
            ret = wc_Sha256FinalRaw(&hmac->hash.sha256, hash);
866
0
            break;
867
0
    #endif /* !NO_SHA256 */
868
869
0
    #ifdef WOLFSSL_SHA384
870
0
        case WC_SHA384:
871
0
            ret = wc_Sha384FinalRaw(&hmac->hash.sha384, hash);
872
0
            break;
873
0
    #endif /* WOLFSSL_SHA384 */
874
875
0
    #ifdef WOLFSSL_SHA512
876
0
        case WC_SHA512:
877
0
            ret = wc_Sha512FinalRaw(&hmac->hash.sha512, hash);
878
0
            break;
879
0
    #endif /* WOLFSSL_SHA512 */
880
881
    #ifdef WOLFSSL_SM3
882
        case WC_SM3:
883
            ret = wc_Sm3FinalRaw(&hmac->hash.sm3, hash);
884
            break;
885
    #endif /* WOLFSSL_SM3 */
886
887
0
        default:
888
0
            ret = BAD_FUNC_ARG;
889
0
            break;
890
0
    }
891
892
0
    return ret;
893
0
}
894
895
/* Finalize the HMAC by performing outer hash.
896
 *
897
 * hmac  HMAC object.
898
 * mac   MAC result.
899
 * returns 0 on success, otherwise failure.
900
 */
901
static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac)
902
0
{
903
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
904
0
    wc_HashAlg hash;
905
0
    enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
906
0
    int digestSz = wc_HashGetDigestSize(hashType);
907
0
    int blockSz = wc_HashGetBlockSize(hashType);
908
909
0
    if ((digestSz >= 0) && (blockSz >= 0)) {
910
0
        ret = wc_HashInit(&hash, hashType);
911
0
    }
912
0
    else {
913
0
        ret = BAD_FUNC_ARG;
914
0
    }
915
916
0
    if (ret == 0) {
917
0
        ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->opad,
918
0
            (word32)blockSz);
919
0
        if (ret == 0)
920
0
            ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->innerHash,
921
0
                (word32)digestSz);
922
0
        if (ret == 0)
923
0
            ret = wc_HashFinal(&hash, hashType, mac);
924
0
        wc_HashFree(&hash, hashType);
925
0
    }
926
927
0
    return ret;
928
0
}
929
930
/* Calculate the HMAC of the header + message data.
931
 * Constant time implementation using wc_Sha*FinalRaw().
932
 *
933
 * hmac    HMAC object.
934
 * digest  MAC result.
935
 * in      Message data.
936
 * sz      Size of the message data.
937
 * header  Constructed record header with length of handshake data.
938
 * headerSz Length of header
939
 * returns 0 on success, otherwise failure.
940
 */
941
static int Hmac_UpdateFinal_CT(Hmac* hmac, byte* digest, const byte* in,
942
                           word32 sz, int macLen, byte* header, word32 headerSz)
943
0
{
944
0
    byte         lenBytes[8];
945
0
    int          i, j;
946
0
    unsigned int k;
947
0
    int          blockBits, blockMask;
948
0
    int          lastBlockLen, extraLen, eocIndex;
949
0
    int          blocks, safeBlocks, lenBlock, eocBlock;
950
0
    word32       maxLen;
951
0
    int          blockSz, padSz;
952
0
    int          ret;
953
0
    word32       realLen;
954
0
    byte         extraBlock;
955
956
0
    switch (hmac->macType) {
957
0
    #ifndef NO_SHA
958
0
        case WC_SHA:
959
0
            blockSz = WC_SHA_BLOCK_SIZE;
960
0
            blockBits = 6;
961
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
962
0
            break;
963
0
    #endif /* !NO_SHA */
964
965
0
    #ifndef NO_SHA256
966
0
        case WC_SHA256:
967
0
            blockSz = WC_SHA256_BLOCK_SIZE;
968
0
            blockBits = 6;
969
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
970
0
            break;
971
0
    #endif /* !NO_SHA256 */
972
973
0
    #ifdef WOLFSSL_SHA384
974
0
        case WC_SHA384:
975
0
            blockSz = WC_SHA384_BLOCK_SIZE;
976
0
            blockBits = 7;
977
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
978
0
            break;
979
0
    #endif /* WOLFSSL_SHA384 */
980
981
0
    #ifdef WOLFSSL_SHA512
982
0
        case WC_SHA512:
983
0
            blockSz = WC_SHA512_BLOCK_SIZE;
984
0
            blockBits = 7;
985
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
986
0
            break;
987
0
    #endif /* WOLFSSL_SHA512 */
988
989
    #ifdef WOLFSSL_SM3
990
        case WC_SM3:
991
            blockSz = WC_SM3_BLOCK_SIZE;
992
            blockBits = 6;
993
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
994
            break;
995
    #endif /* WOLFSSL_SM3 */
996
997
0
        default:
998
0
            return BAD_FUNC_ARG;
999
0
    }
1000
0
    blockMask = blockSz - 1;
1001
1002
    /* Size of data to HMAC if padding length byte is zero. */
1003
0
    maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - (word32)macLen;
1004
1005
    /* Complete data (including padding) has block for EOC and/or length. */
1006
0
    extraBlock = ctSetLTE(((int)maxLen + padSz) & blockMask, padSz);
1007
    /* Total number of blocks for data including padding. */
1008
0
    blocks = ((int)(maxLen + (word32)blockSz - 1) >> blockBits) + extraBlock;
1009
    /* Up to last 6 blocks can be hashed safely. */
1010
0
    safeBlocks = blocks - 6;
1011
1012
    /* Length of message data. */
1013
0
    realLen = maxLen - in[sz - 1];
1014
    /* Number of message bytes in last block. */
1015
0
    lastBlockLen = (int)realLen & blockMask;
1016
    /* Number of padding bytes in last block. */
1017
0
    extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
1018
    /* Number of blocks to create for hash. */
1019
0
    lenBlock = ((int)realLen + extraLen) >> blockBits;
1020
    /* Block containing EOC byte. */
1021
0
    eocBlock = (int)(realLen >> (word32)blockBits);
1022
    /* Index of EOC byte in block. */
1023
0
    eocIndex = (int)(realLen & (word32)blockMask);
1024
1025
    /* Add length of hmac's ipad to total length. */
1026
0
    realLen += (word32)blockSz;
1027
    /* Length as bits - 8 bytes bigendian. */
1028
0
    c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
1029
0
    c32toa(realLen << 3, lenBytes + sizeof(word32));
1030
1031
0
    ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, (word32)blockSz);
1032
0
    if (ret != 0)
1033
0
        return ret;
1034
1035
0
    XMEMSET(hmac->innerHash, 0, (size_t)macLen);
1036
1037
0
    if (safeBlocks > 0) {
1038
0
        ret = Hmac_HashUpdate(hmac, header, headerSz);
1039
0
        if (ret != 0)
1040
0
            return ret;
1041
0
        ret = Hmac_HashUpdate(hmac, in, (word32)(safeBlocks * blockSz -
1042
0
                                WOLFSSL_TLS_HMAC_INNER_SZ));
1043
1044
0
        if (ret != 0)
1045
0
            return ret;
1046
0
    }
1047
0
    else
1048
0
        safeBlocks = 0;
1049
1050
0
    XMEMSET(digest, 0, (size_t)macLen);
1051
0
    k = (unsigned int)(safeBlocks * blockSz);
1052
0
    for (i = safeBlocks; i < blocks; i++) {
1053
0
        unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
1054
0
        unsigned char isEocBlock = ctMaskEq(i, eocBlock);
1055
0
        unsigned char isOutBlock = ctMaskEq(i, lenBlock);
1056
1057
0
        for (j = 0; j < blockSz; j++) {
1058
0
            unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
1059
0
            unsigned char pastEoc = ctMaskGT(j, eocIndex) & isEocBlock;
1060
0
            unsigned char b = 0;
1061
1062
0
            if (k < headerSz)
1063
0
                b = header[k];
1064
0
            else if (k < maxLen)
1065
0
                b = in[k - headerSz];
1066
0
            k++;
1067
1068
0
            b = ctMaskSel(atEoc, 0x80, b);
1069
0
            b &= (unsigned char)~(word32)pastEoc;
1070
0
            b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
1071
1072
0
            if (j >= blockSz - 8) {
1073
0
                b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
1074
0
            }
1075
1076
0
            hashBlock[j] = b;
1077
0
        }
1078
1079
0
        ret = Hmac_HashUpdate(hmac, hashBlock, (word32)blockSz); /* cppcheck-suppress uninitvar */
1080
0
        if (ret != 0)
1081
0
            return ret;
1082
0
        ret = Hmac_HashFinalRaw(hmac, hashBlock);
1083
0
        if (ret != 0)
1084
0
            return ret;
1085
0
        for (j = 0; j < macLen; j++)
1086
0
            ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
1087
0
    }
1088
1089
0
    ret = Hmac_OuterHash(hmac, digest);
1090
1091
0
    return ret;
1092
0
}
1093
1094
#endif
1095
1096
#if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
1097
    defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2)
1098
1099
/* Calculate the HMAC of the header + message data.
1100
 * Constant time implementation using normal hashing operations.
1101
 * Update-Final need to be constant time.
1102
 *
1103
 * hmac    HMAC object.
1104
 * digest  MAC result.
1105
 * in      Message data.
1106
 * sz      Size of the message data.
1107
 * header  Constructed record header with length of handshake data.
1108
 * headerSz Length of header
1109
 * returns 0 on success, otherwise failure.
1110
 */
1111
static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
1112
                            word32 sz, byte* header, word32 headerSz)
1113
{
1114
    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
1115
    int        ret = 0;
1116
    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
1117
    word32     offset = 0;
1118
    int        msgBlocks, blocks, blockBits;
1119
    int        i;
1120
1121
    switch (hmac->macType) {
1122
    #ifndef NO_SHA
1123
        case WC_SHA:
1124
            blockSz = WC_SHA_BLOCK_SIZE;
1125
            blockBits = 6;
1126
            macSz = WC_SHA_DIGEST_SIZE;
1127
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1128
            break;
1129
    #endif /* !NO_SHA */
1130
1131
    #ifndef NO_SHA256
1132
        case WC_SHA256:
1133
            blockSz = WC_SHA256_BLOCK_SIZE;
1134
            blockBits = 6;
1135
            macSz = WC_SHA256_DIGEST_SIZE;
1136
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1137
            break;
1138
    #endif /* !NO_SHA256 */
1139
1140
    #ifdef WOLFSSL_SHA384
1141
        case WC_SHA384:
1142
            blockSz = WC_SHA384_BLOCK_SIZE;
1143
            blockBits = 7;
1144
            macSz = WC_SHA384_DIGEST_SIZE;
1145
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1146
            break;
1147
    #endif /* WOLFSSL_SHA384 */
1148
1149
    #ifdef WOLFSSL_SHA512
1150
        case WC_SHA512:
1151
            blockSz = WC_SHA512_BLOCK_SIZE;
1152
            blockBits = 7;
1153
            macSz = WC_SHA512_DIGEST_SIZE;
1154
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1155
            break;
1156
    #endif /* WOLFSSL_SHA512 */
1157
1158
    #ifdef HAVE_BLAKE2
1159
        case WC_HASH_TYPE_BLAKE2B:
1160
            blockSz = BLAKE2B_BLOCKBYTES;
1161
            blockBits = 7;
1162
            macSz = BLAKE2B_256;
1163
            padSz = 0;
1164
            break;
1165
    #endif /* HAVE_BLAKE2 */
1166
1167
    #ifdef WOLFSSL_SM3
1168
        case WC_SM3:
1169
            blockSz = WC_SM3_BLOCK_SIZE;
1170
            blockBits = 6;
1171
            macSz = WC_SM3_DIGEST_SIZE;
1172
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1173
            break;
1174
    #endif
1175
1176
        default:
1177
            WOLFSSL_MSG("ERROR: Hmac_UpdateFinal failed, no hmac->macType");
1178
            return BAD_FUNC_ARG;
1179
    }
1180
1181
    msgSz = sz - (1 + in[sz - 1] + macSz);
1182
    /* Make negative result 0 */
1183
    msgSz &= ~(0 - (msgSz >> 31));
1184
    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
1185
    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
1186
    /* Make negative result 0 */
1187
    maxSz &= ~(0 - (maxSz >> 31));
1188
1189
    /* Calculate #blocks processed in HMAC for max and real data. */
1190
    blocks      = (int)(maxSz >> blockBits);
1191
    blocks     += ((maxSz + padSz) % blockSz) < padSz;
1192
    msgBlocks   = (int)(realSz >> blockBits);
1193
    /* #Extra blocks to process. */
1194
    blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0);
1195
    /* Calculate whole blocks. */
1196
    msgBlocks--;
1197
1198
    ret = wc_HmacUpdate(hmac, header, headerSz);
1199
    if (ret == 0) {
1200
        /* Fill the rest of the block with any available data. */
1201
        word32 currSz = ctMaskLT((int)msgSz, (int)blockSz) & msgSz;
1202
        currSz |= ctMaskGTE((int)msgSz, (int)blockSz) & blockSz;
1203
        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
1204
        currSz &= ~(0 - (currSz >> 31));
1205
        ret = wc_HmacUpdate(hmac, in, currSz);
1206
        offset = currSz;
1207
    }
1208
    if (ret == 0) {
1209
        /* Do the hash operations on a block basis. */
1210
        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
1211
            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
1212
            if (ret != 0)
1213
                break;
1214
        }
1215
    }
1216
    if (ret == 0)
1217
        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
1218
    if (ret == 0)
1219
        ret = wc_HmacFinal(hmac, digest);
1220
    if (ret == 0) {
1221
        /* Do the dummy hash operations. Do at least one. */
1222
        for (i = 0; i < blocks + 1; i++) {
1223
            ret = wc_HmacUpdate(hmac, dummy, blockSz);
1224
            if (ret != 0)
1225
                break;
1226
        }
1227
    }
1228
1229
    return ret;
1230
}
1231
1232
#endif
1233
1234
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1235
#define TLS_HMAC_CID_SZ(s, v) \
1236
                ((v) ? DtlsGetCidRxSize((s)) \
1237
                     : DtlsGetCidTxSize((s)))
1238
#define TLS_HMAC_CID(s, v, b, c) \
1239
                ((v) ? wolfSSL_dtls_cid_get_rx((s), (b), (c)) \
1240
                     : wolfSSL_dtls_cid_get_tx((s), (b), (c)))
1241
#endif
1242
1243
static int TLS_hmac_SetInner(WOLFSSL* ssl, byte* inner, word32* innerSz,
1244
        word32 sz, int content, int verify, int epochOrder)
1245
0
{
1246
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1247
    unsigned int cidSz = 0;
1248
    if (ssl->options.dtls && (cidSz = TLS_HMAC_CID_SZ(ssl, verify)) > 0) {
1249
        word32 idx = 0;
1250
        if (cidSz > DTLS_CID_MAX_SIZE) {
1251
            WOLFSSL_MSG("DTLS CID too large");
1252
            return DTLS_CID_ERROR;
1253
        }
1254
1255
        XMEMSET(inner + idx, 0xFF, SEQ_SZ);
1256
        idx += SEQ_SZ;
1257
        inner[idx++] = dtls12_cid;
1258
        inner[idx++] = (byte)cidSz;
1259
        inner[idx++] = dtls12_cid;
1260
        inner[idx++] = ssl->version.major;
1261
        inner[idx++] = ssl->version.minor;
1262
        WriteSEQ(ssl, epochOrder, inner + idx);
1263
        idx += SEQ_SZ;
1264
        if (TLS_HMAC_CID(ssl, verify, inner + idx, cidSz) ==
1265
                WC_NO_ERR_TRACE(WOLFSSL_FAILURE)) {
1266
            WOLFSSL_MSG("DTLS CID write failed");
1267
            return DTLS_CID_ERROR;
1268
        }
1269
        idx += cidSz;
1270
        c16toa((word16)sz, inner + idx);
1271
        idx += LENGTH_SZ;
1272
1273
        *innerSz = idx;
1274
        return 0;
1275
    }
1276
#endif
1277
0
    *innerSz = WOLFSSL_TLS_HMAC_INNER_SZ;
1278
0
    return wolfSSL_SetTlsHmacInner(ssl, inner, sz, content,
1279
0
            !ssl->options.dtls ? verify : epochOrder);
1280
0
}
1281
1282
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
1283
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_CID_INNER_SZ
1284
#else
1285
0
#define TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_INNER_SZ
1286
#endif
1287
1288
int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
1289
             int content, int verify, int epochOrder)
1290
0
{
1291
0
    Hmac   hmac;
1292
0
    byte   myInner[TLS_HMAC_INNER_SZ];
1293
0
    word32 innerSz = TLS_HMAC_INNER_SZ;
1294
0
    int    ret = 0;
1295
0
    const byte* macSecret = NULL;
1296
0
    word32 hashSz = 0;
1297
1298
0
    if (ssl == NULL)
1299
0
        return BAD_FUNC_ARG;
1300
1301
#ifdef HAVE_TRUNCATED_HMAC
1302
    hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
1303
                                        : ssl->specs.hash_size;
1304
#else
1305
0
    hashSz = ssl->specs.hash_size;
1306
0
#endif
1307
1308
#ifdef HAVE_FUZZER
1309
    /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
1310
    if (ssl->fuzzerCb) {
1311
        if (verify && padSz >= 0) {
1312
            ssl->fuzzerCb(ssl, in, sz + hashSz + padSz + 1, FUZZ_HMAC,
1313
                          ssl->fuzzerCtx);
1314
        }
1315
        else {
1316
            ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
1317
        }
1318
    }
1319
#endif
1320
1321
0
    ret = TLS_hmac_SetInner(ssl, myInner, &innerSz, sz, content, verify,
1322
0
                            epochOrder);
1323
0
    if (ret != 0)
1324
0
        return ret;
1325
1326
0
    ret = wc_HmacInit(&hmac, ssl->heap, ssl->devId);
1327
0
    if (ret != 0)
1328
0
        return ret;
1329
1330
1331
#ifdef WOLFSSL_DTLS
1332
    if (ssl->options.dtls)
1333
        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
1334
    else
1335
#endif
1336
0
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
1337
0
    ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
1338
0
                                              macSecret,
1339
0
                                              ssl->specs.hash_size);
1340
1341
0
    if (ret == 0) {
1342
        /* Constant time verification required. */
1343
0
        if (verify && padSz >= 0) {
1344
0
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
1345
0
    !defined(HAVE_SELFTEST)
1346
    #ifdef HAVE_BLAKE2
1347
            if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
1348
                ret = Hmac_UpdateFinal(&hmac, digest, in,
1349
                        sz + hashSz + (word32)padSz + 1, myInner, innerSz);
1350
            }
1351
            else
1352
    #endif
1353
0
            {
1354
0
                ret = Hmac_UpdateFinal_CT(&hmac, digest, in,
1355
0
                                      (sz + hashSz + (word32)padSz + 1),
1356
0
                                      (int)hashSz, myInner, innerSz);
1357
1358
0
            }
1359
#else
1360
            ret = Hmac_UpdateFinal(&hmac, digest, in, sz + hashSz +
1361
                                        (word32)(padSz) + 1,
1362
                                        myInner, innerSz);
1363
#endif
1364
0
        }
1365
0
        else {
1366
0
            ret = wc_HmacUpdate(&hmac, myInner, innerSz);
1367
0
            if (ret == 0)
1368
0
                ret = wc_HmacUpdate(&hmac, in, sz);                /* content */
1369
0
            if (ret == 0)
1370
0
                ret = wc_HmacFinal(&hmac, digest);
1371
0
        }
1372
0
    }
1373
1374
0
    wc_HmacFree(&hmac);
1375
1376
0
    return ret;
1377
0
}
1378
#endif /* WOLFSSL_AEAD_ONLY */
1379
1380
#endif /* !WOLFSSL_NO_TLS12 */
1381
1382
int wolfSSL_GetHmacType_ex(CipherSpecs* specs)
1383
0
{
1384
0
    if (specs == NULL)
1385
0
        return BAD_FUNC_ARG;
1386
1387
0
    switch (specs->mac_algorithm) {
1388
        #ifndef NO_MD5
1389
        case md5_mac:
1390
        {
1391
            return WC_MD5;
1392
        }
1393
        #endif
1394
0
        #ifndef NO_SHA256
1395
0
        case sha256_mac:
1396
0
        {
1397
0
            return WC_SHA256;
1398
0
        }
1399
0
        #endif
1400
0
        #ifdef WOLFSSL_SHA384
1401
0
        case sha384_mac:
1402
0
        {
1403
0
            return WC_SHA384;
1404
0
        }
1405
0
        #endif
1406
        #ifdef WOLFSSL_SM3
1407
        case sm3_mac:
1408
        {
1409
            return WC_SM3;
1410
        }
1411
        #endif
1412
0
        #ifndef NO_SHA
1413
0
        case sha_mac:
1414
0
        {
1415
0
            return WC_SHA;
1416
0
        }
1417
0
        #endif
1418
        #ifdef HAVE_BLAKE2
1419
        case blake2b_mac:
1420
        {
1421
            return BLAKE2B_ID;
1422
        }
1423
        #endif
1424
0
        default:
1425
0
        {
1426
0
            return WOLFSSL_FATAL_ERROR;
1427
0
        }
1428
0
    }
1429
0
}
1430
1431
#ifdef HAVE_TLS_EXTENSIONS
1432
1433
/**
1434
 * The TLSX semaphore is used to calculate the size of the extensions to be sent
1435
 * from one peer to another.
1436
 */
1437
1438
/** Supports up to 72 flags. Increase as needed. */
1439
#define SEMAPHORE_SIZE 9
1440
1441
/**
1442
 * Converts the extension type (id) to an index in the semaphore.
1443
 *
1444
 * Official reference for TLS extension types:
1445
 *   http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
1446
 *
1447
 * Motivation:
1448
 *   Previously, we used the extension type itself as the index of that
1449
 *   extension in the semaphore as the extension types were declared
1450
 *   sequentially, but maintain a semaphore as big as the number of available
1451
 *   extensions is no longer an option since the release of renegotiation_info.
1452
 *
1453
 * How to update:
1454
 *   Assign extension types that extrapolate the number of available semaphores
1455
 *   to the first available index going backwards in the semaphore array.
1456
 *   When adding a new extension type that don't extrapolate the number of
1457
 *   available semaphores, check for a possible collision with with a
1458
 *   'remapped' extension type.
1459
 *
1460
 * Update TLSX_Parse for duplicate detection if more added above 62.
1461
 */
1462
static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
1463
0
{
1464
0
    switch (type) {
1465
1466
0
        case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
1467
0
            return 63;
1468
#ifdef WOLFSSL_QUIC
1469
        case TLSX_KEY_QUIC_TP_PARAMS_DRAFT: /* 0xffa5 */
1470
            return 64;
1471
#endif
1472
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
1473
        case TLSX_ECH: /* 0xfe0d */
1474
            return 65;
1475
#endif
1476
#ifdef WOLFSSL_DUAL_ALG_CERTS
1477
        case TLSX_CKS:
1478
            return 66;
1479
#endif
1480
0
        default:
1481
0
            if (type > 62) {
1482
                /* This message SHOULD only happens during the adding of
1483
                   new TLS extensions in which its IANA number overflows
1484
                   the current semaphore's range, or if its number already
1485
                   is assigned to be used by another extension.
1486
                   Use this check value for the new extension and decrement
1487
                   the check value by one. */
1488
0
                WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
1489
0
            }
1490
0
    }
1491
1492
0
    return type;
1493
0
}
1494
1495
/** Checks if a specific light (tls extension) is not set in the semaphore. */
1496
#define IS_OFF(semaphore, light) \
1497
0
    (!(((semaphore)[(light) / 8] &  (byte) (0x01 << ((light) % 8)))))
1498
1499
/** Turn on a specific light (tls extension) in the semaphore. */
1500
/* the semaphore marks the extensions already written to the message */
1501
#define TURN_ON(semaphore, light) \
1502
0
    ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
1503
1504
/** Turn off a specific light (tls extension) in the semaphore. */
1505
#define TURN_OFF(semaphore, light) \
1506
0
    ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
1507
1508
/** Creates a new extension. */
1509
static TLSX* TLSX_New(TLSX_Type type, const void* data, void* heap)
1510
0
{
1511
0
    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
1512
1513
0
    (void)heap;
1514
1515
0
    if (extension) {
1516
0
        extension->type = type;
1517
0
        extension->data = (void*)data;
1518
0
        extension->resp = 0;
1519
0
        extension->next = NULL;
1520
0
    }
1521
1522
0
    return extension;
1523
0
}
1524
1525
/**
1526
 * Creates a new extension and appends it to the provided list.
1527
 * Checks for duplicate extensions, keeps the newest.
1528
 */
1529
int TLSX_Append(TLSX** list, TLSX_Type type, const void* data, void* heap)
1530
0
{
1531
0
    TLSX* extension = TLSX_New(type, data, heap);
1532
0
    TLSX* cur;
1533
0
    TLSX** prevNext = list;
1534
1535
0
    if (extension == NULL)
1536
0
        return MEMORY_E;
1537
1538
0
    for (cur = *list; cur != NULL;) {
1539
0
        if (cur->type == type) {
1540
0
            *prevNext = cur->next;
1541
0
            cur->next = NULL;
1542
0
            TLSX_FreeAll(cur, heap);
1543
0
            cur = *prevNext;
1544
0
        }
1545
0
        else {
1546
0
            prevNext = &cur->next;
1547
0
            cur = cur->next;
1548
0
        }
1549
0
    }
1550
1551
    /* Append the extension to the list */
1552
0
    *prevNext = extension;
1553
1554
0
    return 0;
1555
0
}
1556
1557
/**
1558
 * Creates a new extension and pushes it to the provided list.
1559
 * Checks for duplicate extensions, keeps the newest.
1560
 */
1561
int TLSX_Push(TLSX** list, TLSX_Type type, const void* data, void* heap)
1562
0
{
1563
0
    TLSX* extension = TLSX_New(type, data, heap);
1564
1565
0
    if (extension == NULL)
1566
0
        return MEMORY_E;
1567
1568
    /* pushes the new extension on the list. */
1569
0
    extension->next = *list;
1570
0
    *list = extension;
1571
1572
    /* remove duplicate extensions, there should be only one of each type. */
1573
0
    do {
1574
0
        if (extension->next && extension->next->type == type) {
1575
0
            TLSX *next = extension->next;
1576
1577
0
            extension->next = next->next;
1578
0
            next->next = NULL;
1579
1580
0
            TLSX_FreeAll(next, heap);
1581
1582
            /* there is no way to occur more than
1583
             * two extensions of the same type.
1584
             */
1585
0
            break;
1586
0
        }
1587
0
    } while ((extension = extension->next));
1588
1589
0
    return 0;
1590
0
}
1591
1592
#ifndef NO_WOLFSSL_CLIENT
1593
1594
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
1595
1596
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
1597
0
{
1598
0
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1599
1600
0
    if (!extension)
1601
0
        extension = TLSX_Find(ssl->ctx->extensions, type);
1602
1603
0
    return extension == NULL;
1604
0
}
1605
1606
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
1607
1608
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
1609
0
{
1610
0
    SendAlert(ssl, alert_fatal, unsupported_extension);
1611
0
    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
1612
0
    return UNSUPPORTED_EXTENSION;
1613
0
}
1614
1615
#else
1616
1617
#define TLSX_CheckUnsupportedExtension(ssl, type) 0
1618
#define TLSX_HandleUnsupportedExtension(ssl) 0
1619
1620
#endif
1621
1622
#if !defined(NO_WOLFSSL_SERVER) || defined(WOLFSSL_TLS13)
1623
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
1624
/** Mark an extension to be sent back to the client. */
1625
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
1626
0
{
1627
0
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1628
1629
0
    if (extension)
1630
0
        extension->resp = 1;
1631
0
}
1632
#endif
1633
1634
/******************************************************************************/
1635
/* Application-Layer Protocol Negotiation                                     */
1636
/******************************************************************************/
1637
1638
#ifdef HAVE_ALPN
1639
/** Creates a new ALPN object, providing protocol name to use. */
1640
static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
1641
                                                                     void* heap)
1642
{
1643
    ALPN *alpn;
1644
1645
    WOLFSSL_ENTER("TLSX_ALPN_New");
1646
1647
    if (protocol_name == NULL ||
1648
        protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
1649
        WOLFSSL_MSG("Invalid arguments");
1650
        return NULL;
1651
    }
1652
1653
    alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
1654
    if (alpn == NULL) {
1655
        WOLFSSL_MSG("Memory failure");
1656
        return NULL;
1657
    }
1658
1659
    alpn->next = NULL;
1660
    alpn->negotiated = 0;
1661
    alpn->options = 0;
1662
1663
    alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
1664
                                         heap, DYNAMIC_TYPE_TLSX);
1665
    if (alpn->protocol_name == NULL) {
1666
        WOLFSSL_MSG("Memory failure");
1667
        XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1668
        return NULL;
1669
    }
1670
1671
    XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
1672
    alpn->protocol_name[protocol_nameSz] = 0;
1673
1674
    (void)heap;
1675
1676
    return alpn;
1677
}
1678
1679
/** Releases an ALPN object. */
1680
static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
1681
{
1682
    (void)heap;
1683
1684
    if (alpn == NULL)
1685
        return;
1686
1687
    XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
1688
    XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1689
}
1690
1691
/** Releases all ALPN objects in the provided list. */
1692
static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
1693
{
1694
    ALPN* alpn;
1695
1696
    while ((alpn = list)) {
1697
        list = alpn->next;
1698
        TLSX_ALPN_Free(alpn, heap);
1699
    }
1700
}
1701
1702
/** Tells the buffered size of the ALPN objects in a list. */
1703
static word16 TLSX_ALPN_GetSize(ALPN *list)
1704
{
1705
    ALPN* alpn;
1706
    word16 length = OPAQUE16_LEN; /* list length */
1707
1708
    while ((alpn = list)) {
1709
        list = alpn->next;
1710
1711
        length++; /* protocol name length is on one byte */
1712
        length += (word16)XSTRLEN(alpn->protocol_name);
1713
    }
1714
1715
    return length;
1716
}
1717
1718
/** Writes the ALPN objects of a list in a buffer. */
1719
static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
1720
{
1721
    ALPN* alpn;
1722
    word16 length = 0;
1723
    word16 offset = OPAQUE16_LEN; /* list length offset */
1724
1725
    while ((alpn = list)) {
1726
        list = alpn->next;
1727
1728
        length = (word16)XSTRLEN(alpn->protocol_name);
1729
1730
        /* protocol name length */
1731
        output[offset++] = (byte)length;
1732
1733
        /* protocol name value */
1734
        XMEMCPY(output + offset, alpn->protocol_name, length);
1735
1736
        offset += length;
1737
    }
1738
1739
    /* writing list length */
1740
    c16toa(offset - OPAQUE16_LEN, output);
1741
1742
    return offset;
1743
}
1744
1745
/** Finds a protocol name in the provided ALPN list */
1746
static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
1747
{
1748
    ALPN *alpn;
1749
1750
    if (list == NULL || protocol_name == NULL)
1751
        return NULL;
1752
1753
    alpn = list;
1754
    while (alpn != NULL && (
1755
           (word16)XSTRLEN(alpn->protocol_name) != size ||
1756
           XSTRNCMP(alpn->protocol_name, protocol_name, size)))
1757
        alpn = alpn->next;
1758
1759
    return alpn;
1760
}
1761
1762
/** Set the ALPN matching client and server requirements */
1763
static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
1764
                                                                     void* heap)
1765
{
1766
    ALPN *alpn;
1767
    int  ret;
1768
1769
    if (extensions == NULL || data == NULL)
1770
        return BAD_FUNC_ARG;
1771
1772
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1773
    if (alpn == NULL) {
1774
        WOLFSSL_MSG("Memory failure");
1775
        return MEMORY_E;
1776
    }
1777
1778
    alpn->negotiated = 1;
1779
1780
    ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
1781
                                                                          heap);
1782
    if (ret != 0) {
1783
        TLSX_ALPN_Free(alpn, heap);
1784
        return ret;
1785
    }
1786
1787
    return WOLFSSL_SUCCESS;
1788
}
1789
1790
static int ALPN_find_match(WOLFSSL *ssl, TLSX **pextension,
1791
                           const byte **psel, byte *psel_len,
1792
                           const byte *alpn_val, word16 alpn_val_len)
1793
{
1794
    TLSX    *extension;
1795
    ALPN    *alpn, *list;
1796
    const byte *sel = NULL, *s;
1797
    byte sel_len = 0, wlen;
1798
1799
    extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1800
    if (extension == NULL)
1801
        extension = TLSX_Find(ssl->ctx->extensions,
1802
                              TLSX_APPLICATION_LAYER_PROTOCOL);
1803
1804
    /* No ALPN configured here */
1805
    if (extension == NULL || extension->data == NULL) {
1806
        *pextension = NULL;
1807
        *psel = NULL;
1808
        *psel_len = 0;
1809
        return 0;
1810
    }
1811
1812
    list = (ALPN*)extension->data;
1813
    for (s = alpn_val;
1814
         (s - alpn_val) < alpn_val_len;
1815
         s += wlen) {
1816
        wlen = *s++; /* bounds already checked on save */
1817
        alpn = TLSX_ALPN_Find(list, (char*)s, wlen);
1818
        if (alpn != NULL) {
1819
            WOLFSSL_MSG("ALPN protocol match");
1820
            sel = s,
1821
            sel_len = wlen;
1822
            break;
1823
        }
1824
    }
1825
1826
    if (sel == NULL) {
1827
        WOLFSSL_MSG("No ALPN protocol match");
1828
1829
        /* do nothing if no protocol match between client and server and option
1830
         is set to continue (like OpenSSL) */
1831
        if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
1832
            WOLFSSL_MSG("Continue on mismatch");
1833
        }
1834
        else {
1835
            SendAlert(ssl, alert_fatal, no_application_protocol);
1836
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1837
            return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1838
        }
1839
    }
1840
1841
    *pextension = extension;
1842
    *psel = sel;
1843
    *psel_len = sel_len;
1844
    return 0;
1845
}
1846
1847
int ALPN_Select(WOLFSSL *ssl)
1848
{
1849
    TLSX *extension;
1850
    const byte *sel = NULL;
1851
    byte sel_len = 0;
1852
    int r = 0;
1853
1854
    WOLFSSL_ENTER("ALPN_Select");
1855
    if (ssl->alpn_peer_requested == NULL)
1856
        return 0;
1857
1858
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
1859
    if (ssl->alpnSelect != NULL && ssl->options.side == WOLFSSL_SERVER_END) {
1860
        r = ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested,
1861
                ssl->alpn_peer_requested_length, ssl->alpnSelectArg);
1862
        switch (r) {
1863
            case SSL_TLSEXT_ERR_OK:
1864
                WOLFSSL_MSG("ALPN protocol match");
1865
                break;
1866
            case SSL_TLSEXT_ERR_NOACK:
1867
                WOLFSSL_MSG("ALPN cb no match but not fatal");
1868
                sel = NULL;
1869
                sel_len = 0;
1870
                break;
1871
            case SSL_TLSEXT_ERR_ALERT_FATAL:
1872
            default:
1873
                WOLFSSL_MSG("ALPN cb no match and fatal");
1874
                SendAlert(ssl, alert_fatal, no_application_protocol);
1875
                WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1876
                return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1877
        }
1878
    }
1879
    else
1880
#endif
1881
    {
1882
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len,
1883
                            ssl->alpn_peer_requested,
1884
                            ssl->alpn_peer_requested_length);
1885
        if (r != 0)
1886
            return r;
1887
    }
1888
1889
    if (sel != NULL) {
1890
        /* set the matching negotiated protocol */
1891
        r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
1892
        if (r != WOLFSSL_SUCCESS) {
1893
            WOLFSSL_MSG("TLSX_SetALPN failed");
1894
            return BUFFER_ERROR;
1895
        }
1896
        /* reply to ALPN extension sent from peer */
1897
#ifndef NO_WOLFSSL_SERVER
1898
        TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
1899
#endif
1900
    }
1901
    return 0;
1902
}
1903
1904
/** Parses a buffer of ALPN extensions and set the first one matching
1905
 * client and server requirements */
1906
static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, const byte *input, word16 length,
1907
                                 byte isRequest)
1908
{
1909
    word16  size = 0, offset = 0, wlen;
1910
    int     r = WC_NO_ERR_TRACE(BUFFER_ERROR);
1911
    const byte *s;
1912
1913
    if (OPAQUE16_LEN > length)
1914
        return BUFFER_ERROR;
1915
1916
    ato16(input, &size);
1917
    offset += OPAQUE16_LEN;
1918
1919
    /* validating alpn list length */
1920
    if (size == 0 || length != OPAQUE16_LEN + size)
1921
        return BUFFER_ERROR;
1922
1923
    /* validating length of entries before accepting */
1924
    for (s = input + offset; (s - input) < size; s += wlen) {
1925
        wlen = *s++;
1926
        if (wlen == 0 || (s + wlen - input) > length)
1927
            return BUFFER_ERROR;
1928
    }
1929
1930
    if (isRequest) {
1931
        /* keep the list sent by peer, if this is from a request. We
1932
         * use it later in ALPN_Select() for evaluation. */
1933
        if (ssl->alpn_peer_requested != NULL) {
1934
            XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
1935
            ssl->alpn_peer_requested_length = 0;
1936
        }
1937
        ssl->alpn_peer_requested = (byte *)XMALLOC(size, ssl->heap,
1938
                                                   DYNAMIC_TYPE_ALPN);
1939
        if (ssl->alpn_peer_requested == NULL) {
1940
            return MEMORY_ERROR;
1941
        }
1942
        ssl->alpn_peer_requested_length = size;
1943
        XMEMCPY(ssl->alpn_peer_requested, (char*)input + offset, size);
1944
    }
1945
    else {
1946
        /* a response, we should find the value in our config */
1947
        const byte *sel = NULL;
1948
        byte sel_len = 0;
1949
        TLSX *extension = NULL;
1950
1951
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len, input + offset, size);
1952
        if (r != 0)
1953
            return r;
1954
1955
        if (sel != NULL) {
1956
            /* set the matching negotiated protocol */
1957
            r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
1958
            if (r != WOLFSSL_SUCCESS) {
1959
                WOLFSSL_MSG("TLSX_SetALPN failed");
1960
                return BUFFER_ERROR;
1961
            }
1962
        }
1963
        /* If we had nothing configured, the response is unexpected */
1964
        else if (extension == NULL) {
1965
            r = TLSX_HandleUnsupportedExtension(ssl);
1966
            if (r != 0)
1967
                return r;
1968
        }
1969
    }
1970
    return 0;
1971
}
1972
1973
/** Add a protocol name to the list of accepted usable ones */
1974
int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
1975
                                                                     void* heap)
1976
{
1977
    ALPN *alpn;
1978
    TLSX *extension;
1979
    int  ret;
1980
1981
    if (extensions == NULL || data == NULL)
1982
        return BAD_FUNC_ARG;
1983
1984
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1985
    if (alpn == NULL) {
1986
        WOLFSSL_MSG("Memory failure");
1987
        return MEMORY_E;
1988
    }
1989
1990
    /* Set Options of ALPN */
1991
    alpn->options = options;
1992
1993
    extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1994
    if (extension == NULL) {
1995
        ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
1996
                                                             (void*)alpn, heap);
1997
        if (ret != 0) {
1998
            TLSX_ALPN_Free(alpn, heap);
1999
            return ret;
2000
        }
2001
    }
2002
    else {
2003
        /* push new ALPN object to extension data. */
2004
        alpn->next = (ALPN*)extension->data;
2005
        extension->data = (void*)alpn;
2006
    }
2007
2008
    return WOLFSSL_SUCCESS;
2009
}
2010
2011
/** Get the protocol name set by the server */
2012
int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
2013
{
2014
    TLSX *extension;
2015
    ALPN *alpn;
2016
2017
    if (extensions == NULL || data == NULL || dataSz == NULL)
2018
        return BAD_FUNC_ARG;
2019
2020
    *data = NULL;
2021
    *dataSz = 0;
2022
2023
    extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
2024
    if (extension == NULL) {
2025
        WOLFSSL_MSG("TLS extension not found");
2026
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2027
        return WOLFSSL_ALPN_NOT_FOUND;
2028
    }
2029
2030
    alpn = (ALPN *)extension->data;
2031
    if (alpn == NULL) {
2032
        WOLFSSL_MSG("ALPN extension not found");
2033
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2034
        return WOLFSSL_FATAL_ERROR;
2035
    }
2036
2037
    if (alpn->negotiated != 1) {
2038
2039
        /* consider as an error */
2040
        if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
2041
            WOLFSSL_MSG("No protocol match with peer -> Failed");
2042
            WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2043
            return WOLFSSL_FATAL_ERROR;
2044
        }
2045
2046
        /* continue without negotiated protocol */
2047
        WOLFSSL_MSG("No protocol match with peer -> Continue");
2048
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
2049
        return WOLFSSL_ALPN_NOT_FOUND;
2050
    }
2051
2052
    if (alpn->next != NULL) {
2053
        WOLFSSL_MSG("Only one protocol name must be accepted");
2054
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
2055
        return WOLFSSL_FATAL_ERROR;
2056
    }
2057
2058
    *data = alpn->protocol_name;
2059
    *dataSz = (word16)XSTRLEN((char*)*data);
2060
2061
    return WOLFSSL_SUCCESS;
2062
}
2063
2064
#define ALPN_FREE_ALL     TLSX_ALPN_FreeAll
2065
#define ALPN_GET_SIZE     TLSX_ALPN_GetSize
2066
#define ALPN_WRITE        TLSX_ALPN_Write
2067
#define ALPN_PARSE        TLSX_ALPN_ParseAndSet
2068
2069
#else /* HAVE_ALPN */
2070
2071
0
#define ALPN_FREE_ALL(list, heap) WC_DO_NOTHING
2072
0
#define ALPN_GET_SIZE(list)     0
2073
0
#define ALPN_WRITE(a, b)        0
2074
0
#define ALPN_PARSE(a, b, c, d)  0
2075
2076
#endif /* HAVE_ALPN */
2077
2078
/******************************************************************************/
2079
/* Server Name Indication                                                     */
2080
/******************************************************************************/
2081
2082
#ifdef HAVE_SNI
2083
2084
/** Creates a new SNI object. */
2085
static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
2086
0
{
2087
0
    SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
2088
2089
0
    (void)heap;
2090
2091
0
    if (sni) {
2092
0
        sni->type = type;
2093
0
        sni->next = NULL;
2094
2095
0
    #ifndef NO_WOLFSSL_SERVER
2096
0
        sni->options = 0;
2097
0
        sni->status  = WOLFSSL_SNI_NO_MATCH;
2098
0
    #endif
2099
2100
0
        switch (sni->type) {
2101
0
            case WOLFSSL_SNI_HOST_NAME:
2102
0
                sni->data.host_name = (char*)XMALLOC(size + 1, heap,
2103
0
                                                     DYNAMIC_TYPE_TLSX);
2104
0
                if (sni->data.host_name) {
2105
0
                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
2106
0
                    sni->data.host_name[size] = '\0';
2107
0
                } else {
2108
0
                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2109
0
                    sni = NULL;
2110
0
                }
2111
0
            break;
2112
2113
0
            default: /* invalid type */
2114
0
                XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2115
0
                sni = NULL;
2116
0
        }
2117
0
    }
2118
2119
0
    return sni;
2120
0
}
2121
2122
/** Releases a SNI object. */
2123
static void TLSX_SNI_Free(SNI* sni, void* heap)
2124
0
{
2125
0
    if (sni) {
2126
0
        switch (sni->type) {
2127
0
            case WOLFSSL_SNI_HOST_NAME:
2128
0
                XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
2129
0
            break;
2130
0
        }
2131
2132
0
        XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2133
0
    }
2134
0
    (void)heap;
2135
0
}
2136
2137
/** Releases all SNI objects in the provided list. */
2138
static void TLSX_SNI_FreeAll(SNI* list, void* heap)
2139
0
{
2140
0
    SNI* sni;
2141
2142
0
    while ((sni = list)) {
2143
0
        list = sni->next;
2144
0
        TLSX_SNI_Free(sni, heap);
2145
0
    }
2146
0
}
2147
2148
/** Tells the buffered size of the SNI objects in a list. */
2149
static word16 TLSX_SNI_GetSize(SNI* list)
2150
0
{
2151
0
    SNI* sni;
2152
0
    word16 length = OPAQUE16_LEN; /* list length */
2153
2154
0
    while ((sni = list)) {
2155
0
        list = sni->next;
2156
2157
0
        length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
2158
2159
0
        switch (sni->type) {
2160
0
            case WOLFSSL_SNI_HOST_NAME:
2161
0
                length += (word16)XSTRLEN((char*)sni->data.host_name);
2162
0
            break;
2163
0
        }
2164
0
    }
2165
2166
0
    return length;
2167
0
}
2168
2169
/** Writes the SNI objects of a list in a buffer. */
2170
static word16 TLSX_SNI_Write(SNI* list, byte* output)
2171
0
{
2172
0
    SNI* sni;
2173
0
    word16 length = 0;
2174
0
    word16 offset = OPAQUE16_LEN; /* list length offset */
2175
2176
0
    while ((sni = list)) {
2177
0
        list = sni->next;
2178
2179
0
        output[offset++] = sni->type; /* sni type */
2180
2181
0
        switch (sni->type) {
2182
0
            case WOLFSSL_SNI_HOST_NAME:
2183
0
                length = (word16)XSTRLEN((char*)sni->data.host_name);
2184
2185
0
                c16toa(length, output + offset); /* sni length */
2186
0
                offset += OPAQUE16_LEN;
2187
2188
0
                XMEMCPY(output + offset, sni->data.host_name, length);
2189
2190
0
                offset += length;
2191
0
            break;
2192
0
        }
2193
0
    }
2194
2195
0
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2196
2197
0
    return offset;
2198
0
}
2199
2200
/** Finds a SNI object in the provided list. */
2201
static SNI* TLSX_SNI_Find(SNI *list, byte type)
2202
0
{
2203
0
    SNI* sni = list;
2204
2205
0
    while (sni && sni->type != type)
2206
0
        sni = sni->next;
2207
2208
0
    return sni;
2209
0
}
2210
2211
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
2212
/** Sets the status of a SNI object. */
2213
static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
2214
0
{
2215
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2216
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2217
2218
0
    if (sni)
2219
0
        sni->status = status;
2220
0
}
2221
#endif
2222
2223
/** Gets the status of a SNI object. */
2224
byte TLSX_SNI_Status(TLSX* extensions, byte type)
2225
0
{
2226
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2227
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2228
2229
0
    if (sni)
2230
0
        return sni->status;
2231
2232
0
    return 0;
2233
0
}
2234
2235
/** Parses a buffer of SNI extensions. */
2236
static int TLSX_SNI_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2237
                          byte isRequest)
2238
0
{
2239
0
#ifndef NO_WOLFSSL_SERVER
2240
0
    word16 size = 0;
2241
0
    word16 offset = 0;
2242
0
    int cacheOnly = 0;
2243
0
    SNI *sni = NULL;
2244
0
    byte type;
2245
0
    byte matched;
2246
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2247
    WOLFSSL_ECH* ech = NULL;
2248
    WOLFSSL_EchConfig* workingConfig;
2249
    TLSX* echX;
2250
#endif
2251
0
#endif /* !NO_WOLFSSL_SERVER */
2252
0
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
2253
2254
0
    if (!extension)
2255
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2256
2257
0
    if (!isRequest) {
2258
0
        #ifndef NO_WOLFSSL_CLIENT
2259
0
            if (!extension || !extension->data)
2260
0
                return TLSX_HandleUnsupportedExtension(ssl);
2261
2262
0
            if (length > 0)
2263
0
                return BUFFER_ERROR; /* SNI response MUST be empty. */
2264
2265
            /* This call enables wolfSSL_SNI_GetRequest() to be called in the
2266
             * client side to fetch the used SNI. It will only work if the SNI
2267
             * was set at the SSL object level. Right now we only support one
2268
             * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
2269
             * inclusion of other name types will turn this method inaccurate,
2270
             * as the extension response doesn't contains information of which
2271
             * name was accepted.
2272
             */
2273
0
            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
2274
0
                                                        WOLFSSL_SNI_REAL_MATCH);
2275
2276
0
            return 0;
2277
0
        #endif
2278
0
    }
2279
2280
0
#ifndef NO_WOLFSSL_SERVER
2281
0
    if (!extension || !extension->data) {
2282
        /* This will keep SNI even though TLSX_UseSNI has not been called.
2283
         * Enable it so that the received sni is available to functions
2284
         * that use a custom callback when SNI is received.
2285
         */
2286
    #ifdef WOLFSSL_ALWAYS_KEEP_SNI
2287
        cacheOnly = 1;
2288
    #endif
2289
0
        if (ssl->ctx->sniRecvCb) {
2290
0
            cacheOnly = 1;
2291
0
        }
2292
2293
0
        if (cacheOnly) {
2294
0
            WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
2295
0
        }
2296
0
        else {
2297
            /* Skipping, SNI not enabled at server side. */
2298
0
            return 0;
2299
0
        }
2300
0
    }
2301
2302
0
    if (OPAQUE16_LEN > length)
2303
0
        return BUFFER_ERROR;
2304
2305
0
    ato16(input, &size);
2306
0
    offset += OPAQUE16_LEN;
2307
2308
    /* validating sni list length */
2309
0
    if (length != OPAQUE16_LEN + size || size == 0)
2310
0
        return BUFFER_ERROR;
2311
2312
    /* SNI was badly specified and only one type is now recognized and allowed.
2313
     * Only one SNI value per type (RFC6066), so, no loop. */
2314
0
    type = input[offset++];
2315
0
    if (type != WOLFSSL_SNI_HOST_NAME)
2316
0
        return BUFFER_ERROR;
2317
2318
0
    if (offset + OPAQUE16_LEN > length)
2319
0
        return BUFFER_ERROR;
2320
0
    ato16(input + offset, &size);
2321
0
    offset += OPAQUE16_LEN;
2322
2323
0
    if (offset + size != length || size == 0)
2324
0
        return BUFFER_ERROR;
2325
2326
0
    if (!cacheOnly && !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
2327
0
        return 0; /* not using this type of SNI. */
2328
2329
0
#ifdef WOLFSSL_TLS13
2330
    /* Don't process the second ClientHello SNI extension if there
2331
     * was problems with the first.
2332
     */
2333
0
    if (!cacheOnly && sni->status != 0)
2334
0
        return 0;
2335
0
#endif
2336
0
    matched = cacheOnly || (XSTRLEN(sni->data.host_name) == size &&
2337
0
         XSTRNCMP(sni->data.host_name, (const char*)input + offset, size) == 0);
2338
2339
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2340
    echX = TLSX_Find(ssl->extensions, TLSX_ECH);
2341
    if (echX != NULL)
2342
        ech = (WOLFSSL_ECH*)(echX->data);
2343
2344
    if (!matched && ech != NULL) {
2345
        workingConfig = ech->echConfig;
2346
2347
        while (workingConfig != NULL) {
2348
            matched = XSTRLEN(workingConfig->publicName) == size &&
2349
                XSTRNCMP(workingConfig->publicName,
2350
                (const char*)input + offset, size) == 0;
2351
2352
            if (matched)
2353
                break;
2354
2355
            workingConfig = workingConfig->next;
2356
        }
2357
    }
2358
#endif
2359
2360
0
    if (matched || sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH) {
2361
0
        int matchStat;
2362
0
        int r = TLSX_UseSNI(&ssl->extensions, type, input + offset, size,
2363
0
                                                                     ssl->heap);
2364
0
        if (r != WOLFSSL_SUCCESS)
2365
0
            return r; /* throws error. */
2366
2367
0
        if (cacheOnly) {
2368
0
            WOLFSSL_MSG("Forcing storage of SNI, Fake match");
2369
0
            matchStat = WOLFSSL_SNI_FORCE_KEEP;
2370
0
        }
2371
0
        else if (matched) {
2372
0
            WOLFSSL_MSG("SNI did match!");
2373
0
            matchStat = WOLFSSL_SNI_REAL_MATCH;
2374
0
        }
2375
0
        else {
2376
0
            WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
2377
0
            matchStat = WOLFSSL_SNI_FAKE_MATCH;
2378
0
        }
2379
2380
0
        TLSX_SNI_SetStatus(ssl->extensions, type, (byte)matchStat);
2381
2382
0
        if (!cacheOnly)
2383
0
            TLSX_SetResponse(ssl, TLSX_SERVER_NAME);
2384
0
    }
2385
0
    else if (!(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
2386
0
        SendAlert(ssl, alert_fatal, unrecognized_name);
2387
0
        WOLFSSL_ERROR_VERBOSE(UNKNOWN_SNI_HOST_NAME_E);
2388
0
        return UNKNOWN_SNI_HOST_NAME_E;
2389
0
    }
2390
#else
2391
    (void)input;
2392
#endif /* !NO_WOLFSSL_SERVER */
2393
2394
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
2395
    (void)length;
2396
#endif
2397
2398
0
    return 0;
2399
0
}
2400
2401
static int TLSX_SNI_VerifyParse(WOLFSSL* ssl,  byte isRequest)
2402
0
{
2403
0
    (void)ssl;
2404
2405
0
    if (isRequest) {
2406
0
    #ifndef NO_WOLFSSL_SERVER
2407
0
        TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2408
0
        TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
2409
0
        SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
2410
0
        SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
2411
0
        SNI* sni = NULL;
2412
2413
0
        for (; ctx_sni; ctx_sni = ctx_sni->next) {
2414
0
            if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2415
0
                sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
2416
2417
0
                if (sni) {
2418
0
                    if (sni->status != WOLFSSL_SNI_NO_MATCH)
2419
0
                        continue;
2420
2421
                    /* if ssl level overrides ctx level, it is ok. */
2422
0
                    if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
2423
0
                        continue;
2424
0
                }
2425
2426
0
                SendAlert(ssl, alert_fatal, handshake_failure);
2427
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2428
0
                return SNI_ABSENT_ERROR;
2429
0
            }
2430
0
        }
2431
2432
0
        for (; ssl_sni; ssl_sni = ssl_sni->next) {
2433
0
            if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2434
0
                if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
2435
0
                    continue;
2436
2437
0
                SendAlert(ssl, alert_fatal, handshake_failure);
2438
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2439
0
                return SNI_ABSENT_ERROR;
2440
0
            }
2441
0
        }
2442
0
    #endif /* NO_WOLFSSL_SERVER */
2443
0
    }
2444
2445
0
    return 0;
2446
0
}
2447
2448
int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
2449
                                                                     void* heap)
2450
0
{
2451
0
    TLSX* extension;
2452
0
    SNI* sni = NULL;
2453
2454
0
    if (extensions == NULL || data == NULL)
2455
0
        return BAD_FUNC_ARG;
2456
2457
0
    if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
2458
0
        return MEMORY_E;
2459
2460
0
    extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
2461
0
    if (!extension) {
2462
0
        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
2463
2464
0
        if (ret != 0) {
2465
0
            TLSX_SNI_Free(sni, heap);
2466
0
            return ret;
2467
0
        }
2468
0
    }
2469
0
    else {
2470
        /* push new SNI object to extension data. */
2471
0
        sni->next = (SNI*)extension->data;
2472
0
        extension->data = (void*)sni;
2473
2474
        /* remove duplicate SNI, there should be only one of each type. */
2475
0
        do {
2476
0
            if (sni->next && sni->next->type == type) {
2477
0
                SNI* next = sni->next;
2478
2479
0
                sni->next = next->next;
2480
0
                TLSX_SNI_Free(next, heap);
2481
2482
                /* there is no way to occur more than
2483
                 * two SNIs of the same type.
2484
                 */
2485
0
                break;
2486
0
            }
2487
0
        } while ((sni = sni->next));
2488
0
    }
2489
2490
0
    return WOLFSSL_SUCCESS;
2491
0
}
2492
2493
#ifndef NO_WOLFSSL_SERVER
2494
2495
/** Tells the SNI requested by the client. */
2496
word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data,
2497
        byte ignoreStatus)
2498
0
{
2499
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2500
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2501
2502
0
    if (sni && (ignoreStatus || sni->status != WOLFSSL_SNI_NO_MATCH)) {
2503
0
        switch (sni->type) {
2504
0
            case WOLFSSL_SNI_HOST_NAME:
2505
0
                if (data) {
2506
0
                    *data = sni->data.host_name;
2507
0
                    return (word16)XSTRLEN((char*)*data);
2508
0
                }
2509
0
        }
2510
0
    }
2511
2512
0
    return 0;
2513
0
}
2514
2515
/** Sets the options for a SNI object. */
2516
void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
2517
0
{
2518
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2519
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2520
2521
0
    if (sni)
2522
0
        sni->options = options;
2523
0
}
2524
2525
/** Retrieves a SNI request from a client hello buffer. */
2526
int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
2527
                           byte type, byte* sni, word32* inOutSz)
2528
0
{
2529
0
    word32 offset = 0;
2530
0
    word32 len32 = 0;
2531
0
    word16 len16 = 0;
2532
2533
0
    if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
2534
0
        return INCOMPLETE_DATA;
2535
2536
    /* TLS record header */
2537
0
    if ((enum ContentType) clientHello[offset++] != handshake) {
2538
2539
        /* checking for SSLv2.0 client hello according to: */
2540
        /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
2541
0
        if ((enum HandShakeType) clientHello[++offset] == client_hello) {
2542
0
            offset += ENUM_LEN + VERSION_SZ; /* skip version */
2543
2544
0
            ato16(clientHello + offset, &len16);
2545
0
            offset += OPAQUE16_LEN;
2546
2547
0
            if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
2548
0
                return BUFFER_ERROR;
2549
2550
0
            ato16(clientHello + offset, &len16);
2551
            /* Returning SNI_UNSUPPORTED do not increment offset here */
2552
2553
0
            if (len16 != 0) /* session_id_length must be 0 */
2554
0
                return BUFFER_ERROR;
2555
2556
0
            WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2557
0
            return SNI_UNSUPPORTED;
2558
0
        }
2559
2560
0
        return BUFFER_ERROR;
2561
0
    }
2562
2563
0
    if (clientHello[offset++] != SSLv3_MAJOR)
2564
0
        return BUFFER_ERROR;
2565
2566
0
    if (clientHello[offset++] < TLSv1_MINOR) {
2567
0
        WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2568
0
        return SNI_UNSUPPORTED;
2569
0
    }
2570
2571
0
    ato16(clientHello + offset, &len16);
2572
0
    offset += OPAQUE16_LEN;
2573
2574
0
    if (offset + len16 > helloSz)
2575
0
        return INCOMPLETE_DATA;
2576
2577
    /* Handshake header */
2578
0
    if ((enum HandShakeType) clientHello[offset] != client_hello)
2579
0
        return BUFFER_ERROR;
2580
2581
0
    c24to32(clientHello + offset + 1, &len32);
2582
0
    offset += HANDSHAKE_HEADER_SZ;
2583
2584
0
    if (offset + len32 > helloSz)
2585
0
        return BUFFER_ERROR;
2586
2587
    /* client hello */
2588
0
    offset += VERSION_SZ + RAN_LEN; /* version, random */
2589
2590
0
    if (helloSz < offset + clientHello[offset])
2591
0
        return BUFFER_ERROR;
2592
2593
0
    offset += ENUM_LEN + clientHello[offset]; /* skip session id */
2594
2595
    /* cypher suites */
2596
0
    if (helloSz < offset + OPAQUE16_LEN)
2597
0
        return BUFFER_ERROR;
2598
2599
0
    ato16(clientHello + offset, &len16);
2600
0
    offset += OPAQUE16_LEN;
2601
2602
0
    if (helloSz < offset + len16)
2603
0
        return BUFFER_ERROR;
2604
2605
0
    offset += len16; /* skip cypher suites */
2606
2607
    /* compression methods */
2608
0
    if (helloSz < offset + 1)
2609
0
        return BUFFER_ERROR;
2610
2611
0
    if (helloSz < offset + clientHello[offset])
2612
0
        return BUFFER_ERROR;
2613
2614
0
    offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
2615
2616
    /* extensions */
2617
0
    if (helloSz < offset + OPAQUE16_LEN)
2618
0
        return 0; /* no extensions in client hello. */
2619
2620
0
    ato16(clientHello + offset, &len16);
2621
0
    offset += OPAQUE16_LEN;
2622
2623
0
    if (helloSz < offset + len16)
2624
0
        return BUFFER_ERROR;
2625
2626
0
    while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
2627
0
        word16 extType;
2628
0
        word16 extLen;
2629
2630
0
        ato16(clientHello + offset, &extType);
2631
0
        offset += OPAQUE16_LEN;
2632
2633
0
        ato16(clientHello + offset, &extLen);
2634
0
        offset += OPAQUE16_LEN;
2635
2636
0
        if (helloSz < offset + extLen)
2637
0
            return BUFFER_ERROR;
2638
2639
0
        if (extType != TLSX_SERVER_NAME) {
2640
0
            offset += extLen; /* skip extension */
2641
0
        } else {
2642
0
            word16 listLen;
2643
2644
0
            ato16(clientHello + offset, &listLen);
2645
0
            offset += OPAQUE16_LEN;
2646
2647
0
            if (helloSz < offset + listLen)
2648
0
                return BUFFER_ERROR;
2649
2650
0
            while (listLen > ENUM_LEN + OPAQUE16_LEN) {
2651
0
                byte   sniType = clientHello[offset++];
2652
0
                word16 sniLen;
2653
2654
0
                ato16(clientHello + offset, &sniLen);
2655
0
                offset += OPAQUE16_LEN;
2656
2657
0
                if (helloSz < offset + sniLen)
2658
0
                    return BUFFER_ERROR;
2659
2660
0
                if (sniType != type) {
2661
0
                    offset  += sniLen;
2662
0
                    listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
2663
0
                    continue;
2664
0
                }
2665
2666
0
                *inOutSz = min(sniLen, *inOutSz);
2667
0
                XMEMCPY(sni, clientHello + offset, *inOutSz);
2668
2669
0
                return WOLFSSL_SUCCESS;
2670
0
            }
2671
0
        }
2672
2673
0
        len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
2674
0
    }
2675
2676
0
    return len16 ? BUFFER_ERROR : 0;
2677
0
}
2678
2679
#endif
2680
2681
0
#define SNI_FREE_ALL     TLSX_SNI_FreeAll
2682
0
#define SNI_GET_SIZE     TLSX_SNI_GetSize
2683
0
#define SNI_WRITE        TLSX_SNI_Write
2684
0
#define SNI_PARSE        TLSX_SNI_Parse
2685
0
#define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
2686
2687
#else
2688
2689
#define SNI_FREE_ALL(list, heap) WC_DO_NOTHING
2690
#define SNI_GET_SIZE(list)     0
2691
#define SNI_WRITE(a, b)        0
2692
#define SNI_PARSE(a, b, c, d)  0
2693
#define SNI_VERIFY_PARSE(a, b) 0
2694
2695
#endif /* HAVE_SNI */
2696
2697
/******************************************************************************/
2698
/* Trusted CA Key Indication                                                  */
2699
/******************************************************************************/
2700
2701
#ifdef HAVE_TRUSTED_CA
2702
2703
/** Creates a new TCA object. */
2704
static TCA* TLSX_TCA_New(byte type, const byte* id, word16 idSz, void* heap)
2705
{
2706
    TCA* tca = (TCA*)XMALLOC(sizeof(TCA), heap, DYNAMIC_TYPE_TLSX);
2707
2708
    if (tca) {
2709
        XMEMSET(tca, 0, sizeof(TCA));
2710
        tca->type = type;
2711
2712
        switch (type) {
2713
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2714
                break;
2715
2716
            #ifndef NO_SHA
2717
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2718
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2719
                if (idSz == WC_SHA_DIGEST_SIZE &&
2720
                        (tca->id =
2721
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2722
                    XMEMCPY(tca->id, id, idSz);
2723
                    tca->idSz = idSz;
2724
                }
2725
                else {
2726
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2727
                    tca = NULL;
2728
                }
2729
                break;
2730
            #endif
2731
2732
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2733
                if (idSz > 0 &&
2734
                        (tca->id =
2735
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2736
                    XMEMCPY(tca->id, id, idSz);
2737
                    tca->idSz = idSz;
2738
                }
2739
                else {
2740
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2741
                    tca = NULL;
2742
                }
2743
                break;
2744
2745
            default: /* invalid type */
2746
                XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2747
                tca = NULL;
2748
        }
2749
    }
2750
2751
    (void)heap;
2752
2753
    return tca;
2754
}
2755
2756
/** Releases a TCA object. */
2757
static void TLSX_TCA_Free(TCA* tca, void* heap)
2758
{
2759
    (void)heap;
2760
2761
    if (tca) {
2762
        XFREE(tca->id, heap, DYNAMIC_TYPE_TLSX);
2763
        XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2764
    }
2765
}
2766
2767
/** Releases all TCA objects in the provided list. */
2768
static void TLSX_TCA_FreeAll(TCA* list, void* heap)
2769
{
2770
    TCA* tca;
2771
2772
    while ((tca = list)) {
2773
        list = tca->next;
2774
        TLSX_TCA_Free(tca, heap);
2775
    }
2776
}
2777
2778
/** Tells the buffered size of the TCA objects in a list. */
2779
static word16 TLSX_TCA_GetSize(TCA* list)
2780
{
2781
    TCA* tca;
2782
    word16 length = OPAQUE16_LEN; /* list length */
2783
2784
    while ((tca = list)) {
2785
        list = tca->next;
2786
2787
        length += ENUM_LEN; /* tca type */
2788
2789
        switch (tca->type) {
2790
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2791
                break;
2792
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2793
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2794
                length += tca->idSz;
2795
                break;
2796
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2797
                length += OPAQUE16_LEN + tca->idSz;
2798
                break;
2799
        }
2800
    }
2801
2802
    return length;
2803
}
2804
2805
/** Writes the TCA objects of a list in a buffer. */
2806
static word16 TLSX_TCA_Write(TCA* list, byte* output)
2807
{
2808
    TCA* tca;
2809
    word16 offset = OPAQUE16_LEN; /* list length offset */
2810
2811
    while ((tca = list)) {
2812
        list = tca->next;
2813
2814
        output[offset++] = tca->type; /* tca type */
2815
2816
        switch (tca->type) {
2817
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2818
                break;
2819
            #ifndef NO_SHA
2820
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2821
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2822
                if (tca->id != NULL) {
2823
                    XMEMCPY(output + offset, tca->id, tca->idSz);
2824
                    offset += tca->idSz;
2825
                }
2826
                else {
2827
                    /* ID missing. Set to an empty string. */
2828
                    c16toa(0, output + offset);
2829
                    offset += OPAQUE16_LEN;
2830
                }
2831
                break;
2832
            #endif
2833
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2834
                if (tca->id != NULL) {
2835
                    c16toa(tca->idSz, output + offset); /* tca length */
2836
                    offset += OPAQUE16_LEN;
2837
                    XMEMCPY(output + offset, tca->id, tca->idSz);
2838
                    offset += tca->idSz;
2839
                }
2840
                else {
2841
                    /* ID missing. Set to an empty string. */
2842
                    c16toa(0, output + offset);
2843
                    offset += OPAQUE16_LEN;
2844
                }
2845
                break;
2846
            default:
2847
                /* ID unknown. Set to an empty string. */
2848
                c16toa(0, output + offset);
2849
                offset += OPAQUE16_LEN;
2850
        }
2851
    }
2852
2853
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2854
2855
    return offset;
2856
}
2857
2858
#ifndef NO_WOLFSSL_SERVER
2859
static TCA* TLSX_TCA_Find(TCA *list, byte type, const byte* id, word16 idSz)
2860
{
2861
    TCA* tca = list;
2862
2863
    while (tca && tca->type != type && type != WOLFSSL_TRUSTED_CA_PRE_AGREED &&
2864
           idSz != tca->idSz && !XMEMCMP(id, tca->id, idSz))
2865
        tca = tca->next;
2866
2867
    return tca;
2868
}
2869
#endif /* NO_WOLFSSL_SERVER */
2870
2871
/** Parses a buffer of TCA extensions. */
2872
static int TLSX_TCA_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2873
                          byte isRequest)
2874
{
2875
#ifndef NO_WOLFSSL_SERVER
2876
    word16 size = 0;
2877
    word16 offset = 0;
2878
#endif
2879
2880
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
2881
2882
    if (!extension)
2883
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_TRUSTED_CA_KEYS);
2884
2885
    if (!isRequest) {
2886
        #ifndef NO_WOLFSSL_CLIENT
2887
            if (!extension || !extension->data)
2888
                return TLSX_HandleUnsupportedExtension(ssl);
2889
2890
            if (length > 0)
2891
                return BUFFER_ERROR; /* TCA response MUST be empty. */
2892
2893
            /* Set the flag that we're good for keys */
2894
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
2895
2896
            return 0;
2897
        #endif
2898
    }
2899
2900
#ifndef NO_WOLFSSL_SERVER
2901
    if (!extension || !extension->data) {
2902
        /* Skipping, TCA not enabled at server side. */
2903
        return 0;
2904
    }
2905
2906
    if (OPAQUE16_LEN > length)
2907
        return BUFFER_ERROR;
2908
2909
    ato16(input, &size);
2910
    offset += OPAQUE16_LEN;
2911
2912
    /* validating tca list length */
2913
    if (length != OPAQUE16_LEN + size)
2914
        return BUFFER_ERROR;
2915
2916
    for (size = 0; offset < length; offset += size) {
2917
        TCA *tca = NULL;
2918
        byte type;
2919
        const byte* id = NULL;
2920
        word16 idSz = 0;
2921
2922
        if (offset + ENUM_LEN > length)
2923
            return BUFFER_ERROR;
2924
2925
        type = input[offset++];
2926
2927
        switch (type) {
2928
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2929
                break;
2930
            #ifndef NO_SHA
2931
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2932
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2933
                if (offset + WC_SHA_DIGEST_SIZE > length)
2934
                    return BUFFER_ERROR;
2935
                idSz = WC_SHA_DIGEST_SIZE;
2936
                id = input + offset;
2937
                offset += idSz;
2938
                break;
2939
            #endif
2940
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2941
                if (offset + OPAQUE16_LEN > length)
2942
                    return BUFFER_ERROR;
2943
                ato16(input + offset, &idSz);
2944
                offset += OPAQUE16_LEN;
2945
                if ((offset > length) || (idSz > length - offset))
2946
                    return BUFFER_ERROR;
2947
                id = input + offset;
2948
                offset += idSz;
2949
                break;
2950
            default:
2951
                WOLFSSL_ERROR_VERBOSE(TCA_INVALID_ID_TYPE);
2952
                return TCA_INVALID_ID_TYPE;
2953
        }
2954
2955
        /* Find the type/ID in the TCA list. */
2956
        tca = TLSX_TCA_Find((TCA*)extension->data, type, id, idSz);
2957
        if (tca != NULL) {
2958
            /* Found it. Set the response flag and break out of the loop. */
2959
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
2960
            break;
2961
        }
2962
    }
2963
#else
2964
    (void)input;
2965
#endif
2966
2967
    return 0;
2968
}
2969
2970
/* Checks to see if the server sent a response for the TCA. */
2971
static int TLSX_TCA_VerifyParse(WOLFSSL* ssl, byte isRequest)
2972
{
2973
    (void)ssl;
2974
2975
    if (!isRequest) {
2976
        /* RFC 6066 section 6 states that the server responding
2977
         * to trusted_ca_keys is optional.  Do not error out unless
2978
         * opted into with the define WOLFSSL_REQUIRE_TCA. */
2979
    #if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_REQUIRE_TCA)
2980
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
2981
2982
        if (extension && !extension->resp) {
2983
            SendAlert(ssl, alert_fatal, handshake_failure);
2984
            WOLFSSL_ERROR_VERBOSE(TCA_ABSENT_ERROR);
2985
            return TCA_ABSENT_ERROR;
2986
        }
2987
    #else
2988
        WOLFSSL_MSG("No response received for trusted_ca_keys.  Continuing.");
2989
    #endif /* !NO_WOLFSSL_CLIENT && WOLFSSL_REQUIRE_TCA */
2990
    }
2991
2992
    return 0;
2993
}
2994
2995
int TLSX_UseTrustedCA(TLSX** extensions, byte type,
2996
                    const byte* id, word16 idSz, void* heap)
2997
{
2998
    TLSX* extension;
2999
    TCA* tca = NULL;
3000
3001
    if (extensions == NULL)
3002
        return BAD_FUNC_ARG;
3003
3004
    if ((tca = TLSX_TCA_New(type, id, idSz, heap)) == NULL)
3005
        return MEMORY_E;
3006
3007
    extension = TLSX_Find(*extensions, TLSX_TRUSTED_CA_KEYS);
3008
    if (!extension) {
3009
        int ret = TLSX_Push(extensions, TLSX_TRUSTED_CA_KEYS, (void*)tca, heap);
3010
3011
        if (ret != 0) {
3012
            TLSX_TCA_Free(tca, heap);
3013
            return ret;
3014
        }
3015
    }
3016
    else {
3017
        /* push new TCA object to extension data. */
3018
        tca->next = (TCA*)extension->data;
3019
        extension->data = (void*)tca;
3020
    }
3021
3022
    return WOLFSSL_SUCCESS;
3023
}
3024
3025
#define TCA_FREE_ALL     TLSX_TCA_FreeAll
3026
#define TCA_GET_SIZE     TLSX_TCA_GetSize
3027
#define TCA_WRITE        TLSX_TCA_Write
3028
#define TCA_PARSE        TLSX_TCA_Parse
3029
#define TCA_VERIFY_PARSE TLSX_TCA_VerifyParse
3030
3031
#else /* HAVE_TRUSTED_CA */
3032
3033
0
#define TCA_FREE_ALL(list, heap) WC_DO_NOTHING
3034
0
#define TCA_GET_SIZE(list)     0
3035
0
#define TCA_WRITE(a, b)        0
3036
0
#define TCA_PARSE(a, b, c, d)  0
3037
0
#define TCA_VERIFY_PARSE(a, b) 0
3038
3039
#endif /* HAVE_TRUSTED_CA */
3040
3041
/******************************************************************************/
3042
/* Max Fragment Length Negotiation                                            */
3043
/******************************************************************************/
3044
3045
#ifdef HAVE_MAX_FRAGMENT
3046
3047
static word16 TLSX_MFL_Write(byte* data, byte* output)
3048
{
3049
    output[0] = data[0];
3050
3051
    return ENUM_LEN;
3052
}
3053
3054
static int TLSX_MFL_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3055
                          byte isRequest)
3056
{
3057
    if (length != ENUM_LEN)
3058
        return BUFFER_ERROR;
3059
3060
#ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3061
    (void) isRequest;
3062
#else
3063
    if (!isRequest)
3064
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
3065
            return TLSX_HandleUnsupportedExtension(ssl);
3066
#endif
3067
3068
    switch (*input) {
3069
        case WOLFSSL_MFL_2_8 : ssl->max_fragment =  256; break;
3070
        case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
3071
        case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
3072
        case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
3073
        case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
3074
        case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
3075
3076
        default:
3077
            SendAlert(ssl, alert_fatal, illegal_parameter);
3078
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
3079
            return UNKNOWN_MAX_FRAG_LEN_E;
3080
    }
3081
    if (ssl->session != NULL) {
3082
        ssl->session->mfl = *input;
3083
    }
3084
3085
#ifndef NO_WOLFSSL_SERVER
3086
    if (isRequest) {
3087
        int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
3088
3089
        if (ret != WOLFSSL_SUCCESS)
3090
            return ret; /* throw error */
3091
3092
        TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
3093
    }
3094
#endif
3095
3096
    return 0;
3097
}
3098
3099
int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
3100
{
3101
    byte* data = NULL;
3102
    int ret = 0;
3103
3104
    if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
3105
        return BAD_FUNC_ARG;
3106
3107
    data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
3108
    if (data == NULL)
3109
        return MEMORY_E;
3110
3111
    data[0] = mfl;
3112
3113
    ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
3114
    if (ret != 0) {
3115
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
3116
        return ret;
3117
    }
3118
3119
    return WOLFSSL_SUCCESS;
3120
}
3121
3122
3123
#define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
3124
#define MFL_GET_SIZE(data) ENUM_LEN
3125
#define MFL_WRITE          TLSX_MFL_Write
3126
#define MFL_PARSE          TLSX_MFL_Parse
3127
3128
#else
3129
3130
0
#define MFL_FREE_ALL(a, b) WC_DO_NOTHING
3131
0
#define MFL_GET_SIZE(a)       0
3132
0
#define MFL_WRITE(a, b)       0
3133
0
#define MFL_PARSE(a, b, c, d) 0
3134
3135
#endif /* HAVE_MAX_FRAGMENT */
3136
3137
/******************************************************************************/
3138
/* Truncated HMAC                                                             */
3139
/******************************************************************************/
3140
3141
#ifdef HAVE_TRUNCATED_HMAC
3142
3143
static int TLSX_THM_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3144
                          byte isRequest)
3145
{
3146
    if (length != 0 || input == NULL)
3147
        return BUFFER_ERROR;
3148
3149
    if (!isRequest) {
3150
    #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
3151
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
3152
            return TLSX_HandleUnsupportedExtension(ssl);
3153
    #endif
3154
    }
3155
    else {
3156
        #ifndef NO_WOLFSSL_SERVER
3157
            int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
3158
3159
            if (ret != WOLFSSL_SUCCESS)
3160
                return ret; /* throw error */
3161
3162
            TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
3163
        #endif
3164
    }
3165
3166
    ssl->truncated_hmac = 1;
3167
3168
    return 0;
3169
}
3170
3171
int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
3172
{
3173
    int ret = 0;
3174
3175
    if (extensions == NULL)
3176
        return BAD_FUNC_ARG;
3177
3178
    ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
3179
    if (ret != 0)
3180
        return ret;
3181
3182
    return WOLFSSL_SUCCESS;
3183
}
3184
3185
#define THM_PARSE TLSX_THM_Parse
3186
3187
#else
3188
3189
0
#define THM_PARSE(a, b, c, d) 0
3190
3191
#endif /* HAVE_TRUNCATED_HMAC */
3192
3193
/******************************************************************************/
3194
/* Certificate Status Request                                                 */
3195
/******************************************************************************/
3196
3197
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3198
3199
static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
3200
{
3201
    int i;
3202
3203
    switch (csr->status_type) {
3204
        case WOLFSSL_CSR_OCSP:
3205
            for (i = 0; i <= csr->requests; i++) {
3206
                FreeOcspRequest(&csr->request.ocsp[i]);
3207
            }
3208
        break;
3209
    }
3210
#ifdef WOLFSSL_TLS13
3211
    for (i = 0; i < MAX_CERT_EXTENSIONS; i++) {
3212
        if (csr->responses[i].buffer != NULL) {
3213
            XFREE(csr->responses[i].buffer, heap,
3214
                DYNAMIC_TYPE_TMP_BUFFER);
3215
        }
3216
    }
3217
#endif
3218
    XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3219
    (void)heap;
3220
}
3221
3222
word16 TLSX_CSR_GetSize_ex(CertificateStatusRequest* csr, byte isRequest,
3223
                                                             int idx)
3224
{
3225
    word16 size = 0;
3226
3227
    /* shut up compiler warnings */
3228
    (void) csr; (void) isRequest;
3229
#ifndef NO_WOLFSSL_CLIENT
3230
    if (isRequest) {
3231
        switch (csr->status_type) {
3232
            case WOLFSSL_CSR_OCSP:
3233
                size += ENUM_LEN + 2 * OPAQUE16_LEN;
3234
3235
                if (csr->request.ocsp[0].nonceSz)
3236
                    size += OCSP_NONCE_EXT_SZ;
3237
            break;
3238
        }
3239
    }
3240
#endif
3241
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3242
    if (!isRequest && IsAtLeastTLSv1_3(csr->ssl->version)) {
3243
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
3244
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3245
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3246
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL &&
3247
                idx == 0) {
3248
            return OPAQUE8_LEN + OPAQUE24_LEN + csr->ssl->ocspRespSz;
3249
        }
3250
#endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
3251
        return (word16)(OPAQUE8_LEN + OPAQUE24_LEN +
3252
                csr->responses[idx].length);
3253
    }
3254
#else
3255
    (void)idx;
3256
#endif
3257
    return size;
3258
}
3259
3260
#if (defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)) && \
3261
(defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY))
3262
static int TLSX_CSR_SetResponseWithStatusCB(WOLFSSL *ssl)
3263
{
3264
    void *ioCtx = NULL;
3265
    WOLFSSL_OCSP *ocsp;
3266
    int ret;
3267
3268
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3269
        return BAD_FUNC_ARG;
3270
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3271
    if (ocsp == NULL || ocsp->statusCb == NULL)
3272
        return BAD_FUNC_ARG;
3273
    ioCtx = (ssl->ocspIOCtx != NULL) ? ssl->ocspIOCtx : ocsp->cm->ocspIOCtx;
3274
    ret = ocsp->statusCb(ssl, ioCtx);
3275
    switch (ret) {
3276
        case SSL_TLSEXT_ERR_OK:
3277
            if (ssl->ocspRespSz > 0) {
3278
                /* ack the extension, status cb provided the response in
3279
                 * ssl->ocspResp */
3280
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3281
                ssl->status_request = WOLFSSL_CSR_OCSP;
3282
            }
3283
            ret = 0;
3284
            break;
3285
        case SSL_TLSEXT_ERR_NOACK:
3286
            /* suppressing as not critical */
3287
            ret = 0;
3288
            break;
3289
        case SSL_TLSEXT_ERR_ALERT_FATAL:
3290
        default:
3291
            ret = WOLFSSL_FATAL_ERROR;
3292
            break;
3293
    }
3294
    return ret;
3295
}
3296
3297
static int TLSX_CSR_WriteWithStatusCB(CertificateStatusRequest* csr,
3298
    byte* output)
3299
{
3300
    WOLFSSL *ssl = csr->ssl;
3301
    WOLFSSL_OCSP *ocsp;
3302
    word16 offset = 0;
3303
    byte *response;
3304
    int respSz;
3305
3306
    if (ssl == NULL || SSL_CM(ssl) == NULL)
3307
        return BAD_FUNC_ARG;
3308
    ocsp = SSL_CM(ssl)->ocsp_stapling;
3309
    if (ocsp == NULL || ocsp->statusCb == NULL)
3310
        return BAD_FUNC_ARG;
3311
    response = ssl->ocspResp;
3312
    respSz = ssl->ocspRespSz;
3313
    if (response == NULL || respSz == 0)
3314
        return BAD_FUNC_ARG;
3315
    output[offset++] = WOLFSSL_CSR_OCSP;
3316
    c32to24(respSz, output + offset);
3317
    offset += OPAQUE24_LEN;
3318
    XMEMCPY(output + offset, response, respSz);
3319
    return offset + respSz;
3320
}
3321
#endif /* (TLS13 && !NO_WOLFSLL_SERVER) && (OPENSSL_ALL || WOLFSSL_NGINX ||
3322
WOLFSSL_HAPROXY) */
3323
3324
static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
3325
{
3326
    return TLSX_CSR_GetSize_ex(csr, isRequest, 0);
3327
}
3328
3329
int TLSX_CSR_Write_ex(CertificateStatusRequest* csr, byte* output,
3330
                          byte isRequest, int idx)
3331
{
3332
    /* shut up compiler warnings */
3333
    (void) csr; (void) output; (void) isRequest;
3334
3335
#ifndef NO_WOLFSSL_CLIENT
3336
    if (isRequest) {
3337
        int ret = 0;
3338
        word16 offset = 0;
3339
        word16 length = 0;
3340
3341
        /* type */
3342
        output[offset++] = csr->status_type;
3343
3344
        switch (csr->status_type) {
3345
            case WOLFSSL_CSR_OCSP:
3346
                /* responder id list */
3347
                c16toa(0, output + offset);
3348
                offset += OPAQUE16_LEN;
3349
3350
                /* request extensions */
3351
                if (csr->request.ocsp[0].nonceSz) {
3352
                    ret = (int)EncodeOcspRequestExtensions(&csr->request.ocsp[0],
3353
                                                 output + offset + OPAQUE16_LEN,
3354
                                                 OCSP_NONCE_EXT_SZ);
3355
3356
                    if (ret > 0) {
3357
                        length = (word16)ret;
3358
                    }
3359
                    else {
3360
                        return ret;
3361
                    }
3362
                }
3363
3364
                c16toa(length, output + offset);
3365
                offset += OPAQUE16_LEN + length;
3366
3367
            break;
3368
        }
3369
3370
        return (int)offset;
3371
    }
3372
#endif
3373
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3374
    if (!isRequest && IsAtLeastTLSv1_3(csr->ssl->version)) {
3375
        word16 offset = 0;
3376
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
3377
        if (csr->ssl != NULL && SSL_CM(csr->ssl) != NULL &&
3378
                SSL_CM(csr->ssl)->ocsp_stapling != NULL &&
3379
                SSL_CM(csr->ssl)->ocsp_stapling->statusCb != NULL &&
3380
                idx == 0) {
3381
            return TLSX_CSR_WriteWithStatusCB(csr, output);
3382
        }
3383
#endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
3384
        output[offset++] = csr->status_type;
3385
        c32to24(csr->responses[idx].length, output + offset);
3386
        offset += OPAQUE24_LEN;
3387
        XMEMCPY(output + offset, csr->responses[idx].buffer,
3388
                                        csr->responses[idx].length);
3389
        offset += (word16)csr->responses[idx].length;
3390
        return offset;
3391
    }
3392
#else
3393
    (void)idx;
3394
#endif
3395
3396
    return 0;
3397
}
3398
3399
static int TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
3400
                          byte isRequest)
3401
{
3402
    return TLSX_CSR_Write_ex(csr, output, isRequest, 0);
3403
}
3404
3405
#if !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_TLS13) && \
3406
    defined(WOLFSSL_TLS_OCSP_MULTI)
3407
/* Process OCSP request certificate chain
3408
 *
3409
 * ssl       SSL/TLS object.
3410
 * returns 0 on success, otherwise failure.
3411
 */
3412
static int ProcessChainOCSPRequest(WOLFSSL* ssl)
3413
{
3414
    DecodedCert* cert;
3415
    OcspRequest* request;
3416
    TLSX* extension;
3417
    CertificateStatusRequest* csr;
3418
    DerBuffer* chain;
3419
    word32 pos = 0;
3420
    buffer der;
3421
    int i = 1;
3422
    int ret = 0;
3423
    byte ctxOwnsRequest = 0;
3424
3425
    /* use certChain if available, otherwise use peer certificate */
3426
    chain = ssl->buffers.certChain;
3427
    if (chain == NULL) {
3428
        chain = ssl->buffers.certificate;
3429
    }
3430
3431
    extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3432
    csr = extension ?
3433
                (CertificateStatusRequest*)extension->data : NULL;
3434
    if (csr == NULL)
3435
        return MEMORY_ERROR;
3436
3437
    cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
3438
                                         DYNAMIC_TYPE_DCERT);
3439
    if (cert == NULL) {
3440
        return MEMORY_E;
3441
    }
3442
3443
    if (chain && chain->buffer) {
3444
        while (ret == 0 && pos + OPAQUE24_LEN < chain->length) {
3445
            c24to32(chain->buffer + pos, &der.length);
3446
            pos += OPAQUE24_LEN;
3447
            der.buffer = chain->buffer + pos;
3448
            pos += der.length;
3449
3450
            if (pos > chain->length)
3451
                break;
3452
            request = &csr->request.ocsp[i];
3453
            if (ret == 0) {
3454
                ret = CreateOcspRequest(ssl, request, cert,
3455
                        der.buffer, der.length, &ctxOwnsRequest);
3456
                if (ctxOwnsRequest) {
3457
                    wolfSSL_Mutex* ocspLock =
3458
                        &SSL_CM(ssl)->ocsp_stapling->ocspLock;
3459
                    if (wc_LockMutex(ocspLock) == 0) {
3460
                        /* the request is ours */
3461
                        ssl->ctx->certOcspRequest = NULL;
3462
                    }
3463
                    wc_UnLockMutex(ocspLock);
3464
                }
3465
            }
3466
3467
            if (ret == 0) {
3468
                request->ssl = ssl;
3469
                ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling,
3470
                                 request, &csr->responses[i], ssl->heap);
3471
                /* Suppressing, not critical */
3472
                if (ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED) ||
3473
                    ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) ||
3474
                    ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL)) {
3475
                    ret = 0;
3476
                }
3477
                i++;
3478
                csr->requests++;
3479
            }
3480
        }
3481
    }
3482
    XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3483
3484
    return ret;
3485
}
3486
#endif
3487
3488
static int TLSX_CSR_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3489
                          byte isRequest)
3490
{
3491
    int ret;
3492
#if !defined(NO_WOLFSSL_SERVER)
3493
    byte status_type;
3494
    word16 size = 0;
3495
#if defined(WOLFSSL_TLS13)
3496
    DecodedCert* cert;
3497
#endif
3498
#endif
3499
3500
#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) \
3501
    && defined(WOLFSSL_TLS13)
3502
    OcspRequest* request;
3503
    TLSX* extension;
3504
    CertificateStatusRequest* csr;
3505
#endif
3506
3507
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
3508
 || !defined(NO_WOLFSSL_SERVER)
3509
    word32 offset = 0;
3510
#endif
3511
3512
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
3513
    word32 resp_length = 0;
3514
#endif
3515
3516
    /* shut up compiler warnings */
3517
    (void) ssl; (void) input;
3518
3519
    if (!isRequest) {
3520
#ifndef NO_WOLFSSL_CLIENT
3521
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3522
        csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3523
3524
        if (!csr) {
3525
            /* look at context level */
3526
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
3527
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3528
3529
            if (!csr) /* unexpected extension */
3530
                return TLSX_HandleUnsupportedExtension(ssl);
3531
3532
            /* enable extension at ssl level */
3533
            ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
3534
                                     csr->status_type, csr->options, ssl,
3535
                                     ssl->heap, ssl->devId);
3536
            if (ret != WOLFSSL_SUCCESS)
3537
                return ret == 0 ? -1 : ret;
3538
3539
            switch (csr->status_type) {
3540
                case WOLFSSL_CSR_OCSP:
3541
                    /* propagate nonce */
3542
                    if (csr->request.ocsp[0].nonceSz) {
3543
                        request =
3544
                            (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
3545
3546
                        if (request) {
3547
                            XMEMCPY(request->nonce, csr->request.ocsp[0].nonce,
3548
                                        (size_t)csr->request.ocsp[0].nonceSz);
3549
                            request->nonceSz = csr->request.ocsp[0].nonceSz;
3550
                        }
3551
                    }
3552
                break;
3553
            }
3554
        }
3555
3556
        ssl->status_request = 1;
3557
3558
    #ifdef WOLFSSL_TLS13
3559
        if (ssl->options.tls1_3) {
3560
            /* Get the new extension potentially created above. */
3561
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3562
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3563
            if (csr == NULL)
3564
                return MEMORY_ERROR;
3565
3566
            ret = 0;
3567
            if (OPAQUE8_LEN + OPAQUE24_LEN > length)
3568
                ret = BUFFER_ERROR;
3569
            if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP) {
3570
                ret = BAD_CERTIFICATE_STATUS_ERROR;
3571
                WOLFSSL_ERROR_VERBOSE(ret);
3572
            }
3573
            if (ret == 0) {
3574
                c24to32(input + offset, &resp_length);
3575
                offset += OPAQUE24_LEN;
3576
                if (offset + resp_length != length)
3577
                    ret = BUFFER_ERROR;
3578
            }
3579
            if (ret == 0) {
3580
                if (ssl->response_idx < (1 + MAX_CHAIN_DEPTH))
3581
                    csr->responses[ssl->response_idx].buffer =
3582
                    (byte*)XMALLOC(resp_length, ssl->heap,
3583
                        DYNAMIC_TYPE_TMP_BUFFER);
3584
                else
3585
                    ret = BAD_FUNC_ARG;
3586
3587
                if (ret == 0 &&
3588
                        csr->responses[ssl->response_idx].buffer == NULL)
3589
                    ret = MEMORY_ERROR;
3590
            }
3591
            if (ret == 0) {
3592
                XMEMCPY(csr->responses[ssl->response_idx].buffer,
3593
                                            input + offset, resp_length);
3594
                csr->responses[ssl->response_idx].length = resp_length;
3595
            }
3596
3597
            return ret;
3598
        }
3599
        else
3600
    #endif
3601
        {
3602
            /* extension_data MUST be empty. */
3603
            return length ? BUFFER_ERROR : 0;
3604
        }
3605
#endif
3606
    }
3607
    else {
3608
#ifndef NO_WOLFSSL_SERVER
3609
        if (length == 0)
3610
            return 0;
3611
3612
        status_type = input[offset++];
3613
3614
        switch (status_type) {
3615
            case WOLFSSL_CSR_OCSP: {
3616
3617
                /* skip responder_id_list */
3618
                if ((int)(length - offset) < OPAQUE16_LEN)
3619
                    return BUFFER_ERROR;
3620
3621
                ato16(input + offset, &size);
3622
                offset += OPAQUE16_LEN + size;
3623
3624
                /* skip request_extensions */
3625
                if ((int)(length - offset) < OPAQUE16_LEN)
3626
                    return BUFFER_ERROR;
3627
3628
                ato16(input + offset, &size);
3629
                offset += OPAQUE16_LEN + size;
3630
3631
                if (offset > length)
3632
                    return BUFFER_ERROR;
3633
3634
                /* is able to send OCSP response? */
3635
                if (SSL_CM(ssl) == NULL || !SSL_CM(ssl)->ocspStaplingEnabled)
3636
                    return 0;
3637
            }
3638
            break;
3639
3640
            /* unknown status type */
3641
            default:
3642
                return 0;
3643
        }
3644
3645
        /* if using status_request and already sending it, skip this one */
3646
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3647
        if (ssl->status_request_v2)
3648
            return 0;
3649
        #endif
3650
3651
        /* accept the first good status_type and return */
3652
        ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
3653
                                                 0, ssl, ssl->heap, ssl->devId);
3654
        if (ret != WOLFSSL_SUCCESS)
3655
            return ret == 0 ? -1 : ret; /* throw error */
3656
3657
    #if defined(WOLFSSL_TLS13)
3658
        if (ssl->options.tls1_3) {
3659
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
3660
            if (ssl != NULL && SSL_CM(ssl) != NULL &&
3661
                    SSL_CM(ssl)->ocsp_stapling != NULL &&
3662
                    SSL_CM(ssl)->ocsp_stapling->statusCb != NULL) {
3663
            return TLSX_CSR_SetResponseWithStatusCB(ssl);
3664
}
3665
#endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */
3666
            if (ssl->buffers.certificate == NULL) {
3667
                WOLFSSL_MSG("Certificate buffer not set!");
3668
                return BUFFER_ERROR;
3669
            }
3670
            cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
3671
                                         DYNAMIC_TYPE_DCERT);
3672
            if (cert == NULL) {
3673
                return MEMORY_E;
3674
            }
3675
            InitDecodedCert(cert, ssl->buffers.certificate->buffer,
3676
                            ssl->buffers.certificate->length, ssl->heap);
3677
            ret = ParseCert(cert, CERT_TYPE, 1, SSL_CM(ssl));
3678
            if (ret != 0) {
3679
                FreeDecodedCert(cert);
3680
                XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3681
                /* Let's not error out the connection if we can't verify our
3682
                 * cert */
3683
                if (ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E) ||
3684
                    ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E))
3685
                    ret = 0;
3686
                return ret;
3687
            }
3688
            ret = TLSX_CSR_InitRequest(ssl->extensions, cert, ssl->heap);
3689
            if (ret != 0 ) {
3690
                FreeDecodedCert(cert);
3691
                XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3692
                return ret;
3693
            }
3694
            FreeDecodedCert(cert);
3695
            XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3696
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3697
            csr = extension ?
3698
                (CertificateStatusRequest*)extension->data : NULL;
3699
            if (csr == NULL)
3700
                return MEMORY_ERROR;
3701
3702
            request = &csr->request.ocsp[0];
3703
            ret = CreateOcspResponse(ssl, &request, &csr->responses[0]);
3704
            if (request != &csr->request.ocsp[0] &&
3705
                    ssl->buffers.weOwnCert) {
3706
                /* request will be allocated in CreateOcspResponse() */
3707
                FreeOcspRequest(request);
3708
                XFREE(request, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST);
3709
            }
3710
            if (ret != 0)
3711
                return ret;
3712
3713
            if (csr->responses[0].buffer)
3714
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3715
        #if defined(WOLFSSL_TLS_OCSP_MULTI)
3716
            /* process OCSP request in certificate chain */
3717
            if ((ret = ProcessChainOCSPRequest(ssl)) != 0) {
3718
                WOLFSSL_MSG("Process Cert Chain OCSP request failed");
3719
                WOLFSSL_ERROR_VERBOSE(ret);
3720
                return ret;
3721
            }
3722
        #endif
3723
        }
3724
        else
3725
    #endif
3726
            TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3727
        ssl->status_request = status_type;
3728
#endif
3729
    }
3730
3731
    return 0;
3732
}
3733
3734
int TLSX_CSR_InitRequest_ex(TLSX* extensions, DecodedCert* cert,
3735
                                                            void* heap, int idx)
3736
{
3737
     TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3738
    CertificateStatusRequest* csr = extension ?
3739
        (CertificateStatusRequest*)extension->data : NULL;
3740
    int ret = 0;
3741
3742
    if (csr) {
3743
        switch (csr->status_type) {
3744
            case WOLFSSL_CSR_OCSP: {
3745
                byte nonce[MAX_OCSP_NONCE_SZ];
3746
                int  req_cnt = idx == -1 ? csr->requests : idx;
3747
                int  nonceSz = csr->request.ocsp[0].nonceSz;
3748
                OcspRequest* request;
3749
3750
                request = &csr->request.ocsp[req_cnt];
3751
                if (request->serial != NULL) {
3752
                    /* clear request contents before reuse */
3753
                    FreeOcspRequest(request);
3754
                    if (csr->requests > 0)
3755
                        csr->requests--;
3756
                }
3757
                /* preserve nonce */
3758
                XMEMCPY(nonce, csr->request.ocsp->nonce, (size_t)nonceSz);
3759
3760
                if (req_cnt < MAX_CERT_EXTENSIONS) {
3761
                    if ((ret = InitOcspRequest(request, cert, 0, heap)) != 0)
3762
                        return ret;
3763
3764
                    /* restore nonce */
3765
                    XMEMCPY(csr->request.ocsp->nonce, nonce, (size_t)nonceSz);
3766
                    request->nonceSz = nonceSz;
3767
                    csr->requests++;
3768
                }
3769
                else {
3770
                    WOLFSSL_ERROR_VERBOSE(MAX_CERT_EXTENSIONS_ERR);
3771
                    return MAX_CERT_EXTENSIONS_ERR;
3772
                }
3773
            }
3774
            break;
3775
        }
3776
    }
3777
3778
    return ret;
3779
}
3780
3781
int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
3782
{
3783
    return TLSX_CSR_InitRequest_ex(extensions, cert, heap, -1);
3784
}
3785
3786
void* TLSX_CSR_GetRequest_ex(TLSX* extensions, int idx)
3787
{
3788
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3789
    CertificateStatusRequest* csr = extension ?
3790
                              (CertificateStatusRequest*)extension->data : NULL;
3791
3792
    if (csr && csr->ssl) {
3793
        switch (csr->status_type) {
3794
            case WOLFSSL_CSR_OCSP:
3795
                if (IsAtLeastTLSv1_3(csr->ssl->version)) {
3796
                    return idx < csr->requests ? &csr->request.ocsp[idx] : NULL;
3797
                }
3798
                else {
3799
                    return idx == 0 ? &csr->request.ocsp[0] : NULL;
3800
                }
3801
        }
3802
    }
3803
3804
    return NULL;
3805
}
3806
3807
void* TLSX_CSR_GetRequest(TLSX* extensions)
3808
{
3809
    return TLSX_CSR_GetRequest_ex(extensions, 0);
3810
}
3811
3812
int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
3813
{
3814
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3815
    CertificateStatusRequest* csr = extension ?
3816
                              (CertificateStatusRequest*)extension->data : NULL;
3817
3818
    if (csr) {
3819
        switch (csr->status_type) {
3820
            case WOLFSSL_CSR_OCSP:
3821
                if (SSL_CM(ssl)->ocspEnabled) {
3822
                    csr->request.ocsp[0].ssl = ssl;
3823
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
3824
                                              &csr->request.ocsp[0], NULL, NULL);
3825
                }
3826
                else {
3827
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
3828
                    return OCSP_LOOKUP_FAIL;
3829
                }
3830
        }
3831
    }
3832
3833
    return 0;
3834
}
3835
3836
int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
3837
                                         byte options, WOLFSSL* ssl, void* heap,
3838
                                                                      int devId)
3839
{
3840
    CertificateStatusRequest* csr = NULL;
3841
    int ret = 0;
3842
3843
    if (!extensions || status_type != WOLFSSL_CSR_OCSP)
3844
        return BAD_FUNC_ARG;
3845
3846
    csr = (CertificateStatusRequest*)
3847
             XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
3848
    if (!csr)
3849
        return MEMORY_E;
3850
3851
    ForceZero(csr, sizeof(CertificateStatusRequest));
3852
#if defined(WOLFSSL_TLS13)
3853
    XMEMSET(csr->responses, 0, sizeof(csr->responses));
3854
#endif
3855
    csr->status_type = status_type;
3856
    csr->options     = options;
3857
    csr->ssl         = ssl;
3858
3859
    switch (csr->status_type) {
3860
        case WOLFSSL_CSR_OCSP:
3861
            if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
3862
                WC_RNG rng;
3863
3864
            #ifndef HAVE_FIPS
3865
                ret = wc_InitRng_ex(&rng, heap, devId);
3866
            #else
3867
                ret = wc_InitRng(&rng);
3868
                (void)devId;
3869
            #endif
3870
                if (ret == 0) {
3871
                    if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp[0].nonce,
3872
                                                        MAX_OCSP_NONCE_SZ) == 0)
3873
                        csr->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
3874
3875
                    wc_FreeRng(&rng);
3876
                }
3877
            }
3878
        break;
3879
    }
3880
3881
    if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
3882
        XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3883
        return ret;
3884
    }
3885
3886
    return WOLFSSL_SUCCESS;
3887
}
3888
3889
#define CSR_FREE_ALL TLSX_CSR_Free
3890
#define CSR_GET_SIZE TLSX_CSR_GetSize
3891
#define CSR_WRITE    TLSX_CSR_Write
3892
#define CSR_PARSE    TLSX_CSR_Parse
3893
3894
#else
3895
3896
0
#define CSR_FREE_ALL(data, heap) WC_DO_NOTHING
3897
0
#define CSR_GET_SIZE(a, b)    0
3898
0
#define CSR_WRITE(a, b, c)    0
3899
0
#define CSR_PARSE(a, b, c, d) 0
3900
3901
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
3902
3903
/******************************************************************************/
3904
/* Certificate Status Request v2                                              */
3905
/******************************************************************************/
3906
3907
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3908
3909
static void TLSX_CSR2_FreePendingSigners(Signer *s, void* heap)
3910
{
3911
    Signer* next;
3912
    while(s) {
3913
        next = s->next;
3914
        FreeSigner(s, heap);
3915
        s = next;
3916
    }
3917
}
3918
static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
3919
{
3920
    CertificateStatusRequestItemV2* next;
3921
3922
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, heap);
3923
    for (; csr2; csr2 = next) {
3924
        next = csr2->next;
3925
3926
        switch (csr2->status_type) {
3927
            case WOLFSSL_CSR2_OCSP:
3928
            case WOLFSSL_CSR2_OCSP_MULTI:
3929
                while(csr2->requests--)
3930
                    FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
3931
            break;
3932
        }
3933
3934
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
3935
    }
3936
    (void)heap;
3937
}
3938
3939
static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
3940
                                                                 byte isRequest)
3941
{
3942
    word16 size = 0;
3943
3944
    /* shut up compiler warnings */
3945
    (void) csr2; (void) isRequest;
3946
3947
#ifndef NO_WOLFSSL_CLIENT
3948
    if (isRequest) {
3949
        CertificateStatusRequestItemV2* next;
3950
3951
        for (size = OPAQUE16_LEN; csr2; csr2 = next) {
3952
            next = csr2->next;
3953
3954
            switch (csr2->status_type) {
3955
                case WOLFSSL_CSR2_OCSP:
3956
                case WOLFSSL_CSR2_OCSP_MULTI:
3957
                    size += ENUM_LEN + 3 * OPAQUE16_LEN;
3958
3959
                    if (csr2->request.ocsp[0].nonceSz)
3960
                        size += OCSP_NONCE_EXT_SZ;
3961
                break;
3962
            }
3963
        }
3964
    }
3965
#endif
3966
3967
    return size;
3968
}
3969
3970
static int TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
3971
                                                   byte* output, byte isRequest)
3972
{
3973
    /* shut up compiler warnings */
3974
    (void) csr2; (void) output; (void) isRequest;
3975
3976
#ifndef NO_WOLFSSL_CLIENT
3977
    if (isRequest) {
3978
        int ret = 0;
3979
        word16 offset;
3980
        word16 length;
3981
3982
        for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
3983
            /* status_type */
3984
            output[offset++] = csr2->status_type;
3985
3986
            /* request */
3987
            switch (csr2->status_type) {
3988
                case WOLFSSL_CSR2_OCSP:
3989
                case WOLFSSL_CSR2_OCSP_MULTI:
3990
                    /* request_length */
3991
                    length = 2 * OPAQUE16_LEN;
3992
3993
                    if (csr2->request.ocsp[0].nonceSz)
3994
                        length += OCSP_NONCE_EXT_SZ;
3995
3996
                    c16toa(length, output + offset);
3997
                    offset += OPAQUE16_LEN;
3998
3999
                    /* responder id list */
4000
                    c16toa(0, output + offset);
4001
                    offset += OPAQUE16_LEN;
4002
4003
                    /* request extensions */
4004
                    length = 0;
4005
4006
                    if (csr2->request.ocsp[0].nonceSz) {
4007
                        ret = (int)EncodeOcspRequestExtensions(
4008
                                                 &csr2->request.ocsp[0],
4009
                                                 output + offset + OPAQUE16_LEN,
4010
                                                 OCSP_NONCE_EXT_SZ);
4011
4012
                        if (ret > 0) {
4013
                            length = (word16)ret;
4014
                        }
4015
                        else {
4016
                            return ret;
4017
                        }
4018
                    }
4019
4020
                    c16toa(length, output + offset);
4021
                    offset += OPAQUE16_LEN + length;
4022
                break;
4023
            }
4024
        }
4025
4026
        /* list size */
4027
        c16toa(offset - OPAQUE16_LEN, output);
4028
4029
        return (int)offset;
4030
    }
4031
#endif
4032
4033
    return 0;
4034
}
4035
4036
static int TLSX_CSR2_Parse(WOLFSSL* ssl, const byte* input, word16 length,
4037
                           byte isRequest)
4038
{
4039
    int ret;
4040
4041
    /* shut up compiler warnings */
4042
    (void) ssl; (void) input;
4043
4044
    if (!isRequest) {
4045
#ifndef NO_WOLFSSL_CLIENT
4046
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4047
        CertificateStatusRequestItemV2* csr2 = extension ?
4048
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4049
4050
        if (!csr2) {
4051
            /* look at context level */
4052
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
4053
            csr2 = extension ?
4054
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4055
4056
            if (!csr2) /* unexpected extension */
4057
                return TLSX_HandleUnsupportedExtension(ssl);
4058
4059
            /* enable extension at ssl level */
4060
            for (; csr2; csr2 = csr2->next) {
4061
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4062
                                    csr2->status_type, csr2->options, ssl->heap,
4063
                                                                    ssl->devId);
4064
                if (ret != WOLFSSL_SUCCESS)
4065
                    return ret;
4066
4067
                switch (csr2->status_type) {
4068
                    case WOLFSSL_CSR2_OCSP:
4069
                        /* followed by */
4070
                    case WOLFSSL_CSR2_OCSP_MULTI:
4071
                        /* propagate nonce */
4072
                        if (csr2->request.ocsp[0].nonceSz) {
4073
                            OcspRequest* request =
4074
                             (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
4075
                                                          csr2->status_type, 0);
4076
4077
                            if (request) {
4078
                                XMEMCPY(request->nonce,
4079
                                        csr2->request.ocsp[0].nonce,
4080
                                        (size_t)csr2->request.ocsp[0].nonceSz);
4081
4082
                                request->nonceSz =
4083
                                                  csr2->request.ocsp[0].nonceSz;
4084
                            }
4085
                        }
4086
                    break;
4087
                }
4088
            }
4089
        }
4090
4091
        ssl->status_request_v2 = 1;
4092
4093
        return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
4094
#endif
4095
    }
4096
    else {
4097
#ifndef NO_WOLFSSL_SERVER
4098
        byte   status_type;
4099
        word16 request_length;
4100
        word16 offset = 0;
4101
        word16 size = 0;
4102
4103
        /* list size */
4104
        if (offset + OPAQUE16_LEN >= length) {
4105
            return BUFFER_E;
4106
        }
4107
4108
        ato16(input + offset, &request_length);
4109
        offset += OPAQUE16_LEN;
4110
4111
        if (length - OPAQUE16_LEN != request_length)
4112
            return BUFFER_ERROR;
4113
4114
        while (length > offset) {
4115
            if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
4116
                return BUFFER_ERROR;
4117
4118
            status_type = input[offset++];
4119
4120
            ato16(input + offset, &request_length);
4121
            offset += OPAQUE16_LEN;
4122
4123
            if (length - offset < request_length)
4124
                return BUFFER_ERROR;
4125
4126
            switch (status_type) {
4127
                case WOLFSSL_CSR2_OCSP:
4128
                case WOLFSSL_CSR2_OCSP_MULTI:
4129
                    /* skip responder_id_list */
4130
                    if ((int)(length - offset) < OPAQUE16_LEN)
4131
                        return BUFFER_ERROR;
4132
4133
                    ato16(input + offset, &size);
4134
                    if (length - offset < size)
4135
                        return BUFFER_ERROR;
4136
4137
                    offset += OPAQUE16_LEN + size;
4138
                    /* skip request_extensions */
4139
                    if ((int)(length - offset) < OPAQUE16_LEN)
4140
                        return BUFFER_ERROR;
4141
4142
                    ato16(input + offset, &size);
4143
                    if (length - offset < size)
4144
                        return BUFFER_ERROR;
4145
4146
                    offset += OPAQUE16_LEN + size;
4147
                    if (offset > length)
4148
                        return BUFFER_ERROR;
4149
4150
                    /* is able to send OCSP response? */
4151
                    if (SSL_CM(ssl) == NULL
4152
                    || !SSL_CM(ssl)->ocspStaplingEnabled)
4153
                        continue;
4154
                break;
4155
4156
                default:
4157
                    /* unknown status type, skipping! */
4158
                    offset += request_length;
4159
                    continue;
4160
            }
4161
4162
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
4163
            /* OpenSSL status CB supports only CERTIFICATE STATUS REQ V1 */
4164
            if (ssl != NULL && SSL_CM(ssl) != NULL &&
4165
                    SSL_CM(ssl)->ocsp_stapling != NULL &&
4166
                    SSL_CM(ssl)->ocsp_stapling->statusCb != NULL) {
4167
                    return 0;
4168
            }
4169
#endif
4170
            /* if using status_request and already sending it, remove it
4171
             * and prefer to use the v2 version */
4172
            #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
4173
            if (ssl->status_request) {
4174
                ssl->status_request = 0;
4175
                TLSX_Remove(&ssl->extensions, TLSX_STATUS_REQUEST, ssl->heap);
4176
            }
4177
            #endif
4178
4179
            /* TLS 1.3 servers MUST NOT act upon presence or information in
4180
             * this extension (RFC 8448 Section 4.4.2.1).
4181
             */
4182
            if (!IsAtLeastTLSv1_3(ssl->version)) {
4183
                /* accept the first good status_type and return */
4184
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
4185
                                         status_type, 0, ssl->heap, ssl->devId);
4186
                if (ret != WOLFSSL_SUCCESS)
4187
                    return ret; /* throw error */
4188
4189
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
4190
                ssl->status_request_v2 = status_type;
4191
            }
4192
4193
            return 0;
4194
        }
4195
#endif
4196
    }
4197
4198
    return 0;
4199
}
4200
4201
static CertificateStatusRequestItemV2* TLSX_CSR2_GetMulti(TLSX *extensions)
4202
{
4203
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4204
    CertificateStatusRequestItemV2* csr2 = extension ?
4205
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4206
4207
    for (; csr2; csr2 = csr2->next) {
4208
        if (csr2->status_type == WOLFSSL_CSR2_OCSP_MULTI)
4209
            return csr2;
4210
    }
4211
    return NULL;
4212
}
4213
4214
int TLSX_CSR2_IsMulti(TLSX *extensions)
4215
{
4216
    return TLSX_CSR2_GetMulti(extensions) != NULL;
4217
}
4218
4219
int TLSX_CSR2_AddPendingSigner(TLSX *extensions, Signer *s)
4220
{
4221
    CertificateStatusRequestItemV2* csr2;
4222
4223
    csr2 = TLSX_CSR2_GetMulti(extensions);
4224
    if (!csr2)
4225
        return WOLFSSL_FATAL_ERROR;
4226
4227
    s->next = csr2->pendingSigners;
4228
    csr2->pendingSigners = s;
4229
    return 0;
4230
}
4231
4232
Signer* TLSX_CSR2_GetPendingSigners(TLSX *extensions)
4233
{
4234
    CertificateStatusRequestItemV2* csr2;
4235
4236
    csr2 = TLSX_CSR2_GetMulti(extensions);
4237
    if (!csr2)
4238
        return NULL;
4239
4240
    return csr2->pendingSigners;
4241
}
4242
4243
int TLSX_CSR2_ClearPendingCA(WOLFSSL *ssl)
4244
{
4245
    CertificateStatusRequestItemV2* csr2;
4246
4247
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4248
    if (csr2 == NULL)
4249
        return 0;
4250
4251
    TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, SSL_CM(ssl)->heap);
4252
    csr2->pendingSigners = NULL;
4253
    return 0;
4254
}
4255
4256
int TLSX_CSR2_MergePendingCA(WOLFSSL* ssl)
4257
{
4258
    CertificateStatusRequestItemV2* csr2;
4259
    Signer *s, *next;
4260
    int r = 0;
4261
4262
    csr2 = TLSX_CSR2_GetMulti(ssl->extensions);
4263
    if (csr2 == NULL)
4264
        return 0;
4265
4266
    s = csr2->pendingSigners;
4267
    while (s != NULL) {
4268
        next = s->next;
4269
        r = AddSigner(SSL_CM(ssl), s);
4270
        if (r != 0)
4271
            FreeSigner(s, SSL_CM(ssl)->heap);
4272
        s = next;
4273
    }
4274
    csr2->pendingSigners = NULL;
4275
    return r;
4276
}
4277
4278
int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
4279
                                                                     void* heap)
4280
{
4281
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4282
    CertificateStatusRequestItemV2* csr2 = extension ?
4283
        (CertificateStatusRequestItemV2*)extension->data : NULL;
4284
    int ret = 0;
4285
4286
    for (; csr2; csr2 = csr2->next) {
4287
        switch (csr2->status_type) {
4288
            case WOLFSSL_CSR2_OCSP:
4289
                if (!isPeer || csr2->requests != 0)
4290
                    break;
4291
4292
                FALL_THROUGH; /* followed by */
4293
4294
            case WOLFSSL_CSR2_OCSP_MULTI: {
4295
                if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
4296
                    byte nonce[MAX_OCSP_NONCE_SZ];
4297
                    int  nonceSz = csr2->request.ocsp[0].nonceSz;
4298
4299
                    /* preserve nonce, replicating nonce of ocsp[0] */
4300
                    XMEMCPY(nonce, csr2->request.ocsp[0].nonce,
4301
                    (size_t)nonceSz);
4302
4303
                    if ((ret = InitOcspRequest(
4304
                                      &csr2->request.ocsp[csr2->requests], cert,
4305
                                                                 0, heap)) != 0)
4306
                        return ret;
4307
4308
                    /* restore nonce */
4309
                    XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
4310
                                                        nonce, (size_t)nonceSz);
4311
                    csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
4312
                    csr2->requests++;
4313
                }
4314
            }
4315
            break;
4316
        }
4317
    }
4318
4319
    (void)cert;
4320
    return ret;
4321
}
4322
4323
void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
4324
{
4325
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
4326
    CertificateStatusRequestItemV2* csr2 = extension ?
4327
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4328
4329
    for (; csr2; csr2 = csr2->next) {
4330
        if (csr2->status_type == status_type) {
4331
            switch (csr2->status_type) {
4332
                case WOLFSSL_CSR2_OCSP:
4333
                    /* followed by */
4334
4335
                case WOLFSSL_CSR2_OCSP_MULTI:
4336
                    /* requests are initialized in the reverse order */
4337
                    return idx < csr2->requests
4338
                         ? &csr2->request.ocsp[csr2->requests - idx - 1]
4339
                         : NULL;
4340
            }
4341
        }
4342
    }
4343
4344
    return NULL;
4345
}
4346
4347
int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
4348
{
4349
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
4350
    CertificateStatusRequestItemV2* csr2 = extension ?
4351
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
4352
4353
    /* forces only the first one */
4354
    if (csr2) {
4355
        switch (csr2->status_type) {
4356
            case WOLFSSL_CSR2_OCSP:
4357
                /* followed by */
4358
4359
            case WOLFSSL_CSR2_OCSP_MULTI:
4360
                if (SSL_CM(ssl)->ocspEnabled && csr2->requests >= 1) {
4361
                    csr2->request.ocsp[csr2->requests-1].ssl = ssl;
4362
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
4363
                                          &csr2->request.ocsp[csr2->requests-1], NULL, NULL);
4364
                }
4365
                else {
4366
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
4367
                    return OCSP_LOOKUP_FAIL;
4368
                }
4369
        }
4370
    }
4371
4372
    return 0;
4373
}
4374
4375
int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
4376
                                           byte options, void* heap, int devId)
4377
{
4378
    TLSX* extension = NULL;
4379
    CertificateStatusRequestItemV2* csr2 = NULL;
4380
    int ret = 0;
4381
4382
    if (!extensions)
4383
        return BAD_FUNC_ARG;
4384
4385
    if (status_type != WOLFSSL_CSR2_OCSP
4386
    &&  status_type != WOLFSSL_CSR2_OCSP_MULTI)
4387
        return BAD_FUNC_ARG;
4388
4389
    csr2 = (CertificateStatusRequestItemV2*)
4390
       XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
4391
    if (!csr2)
4392
        return MEMORY_E;
4393
4394
    ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
4395
4396
    csr2->status_type = status_type;
4397
    csr2->options     = options;
4398
    csr2->next        = NULL;
4399
4400
    switch (csr2->status_type) {
4401
        case WOLFSSL_CSR2_OCSP:
4402
        case WOLFSSL_CSR2_OCSP_MULTI:
4403
            if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
4404
                WC_RNG rng;
4405
4406
            #ifndef HAVE_FIPS
4407
                ret = wc_InitRng_ex(&rng, heap, devId);
4408
            #else
4409
                ret = wc_InitRng(&rng);
4410
                (void)devId;
4411
            #endif
4412
                if (ret == 0) {
4413
                    if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
4414
                                                        MAX_OCSP_NONCE_SZ) == 0)
4415
                        csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
4416
4417
                    wc_FreeRng(&rng);
4418
                }
4419
            }
4420
        break;
4421
    }
4422
4423
    /* append new item */
4424
    if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
4425
        CertificateStatusRequestItemV2* last =
4426
                               (CertificateStatusRequestItemV2*)extension->data;
4427
4428
        if (last == NULL) {
4429
            XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4430
            return BAD_FUNC_ARG;
4431
        }
4432
4433
        for (; last->next; last = last->next);
4434
4435
        last->next = csr2;
4436
    }
4437
    else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
4438
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
4439
        return ret;
4440
    }
4441
4442
    return WOLFSSL_SUCCESS;
4443
}
4444
4445
#define CSR2_FREE_ALL TLSX_CSR2_FreeAll
4446
#define CSR2_GET_SIZE TLSX_CSR2_GetSize
4447
#define CSR2_WRITE    TLSX_CSR2_Write
4448
#define CSR2_PARSE    TLSX_CSR2_Parse
4449
4450
#else
4451
4452
0
#define CSR2_FREE_ALL(data, heap) WC_DO_NOTHING
4453
0
#define CSR2_GET_SIZE(a, b)    0
4454
0
#define CSR2_WRITE(a, b, c)    0
4455
0
#define CSR2_PARSE(a, b, c, d) 0
4456
4457
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
4458
4459
#if defined(HAVE_SUPPORTED_CURVES) || \
4460
    (defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES))
4461
4462
/* Functions needed by TLSX_IsGroupSupported */
4463
#ifdef HAVE_LIBOQS
4464
static int mlkem_id2type(int id, int *type);
4465
static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group);
4466
#endif
4467
4468
/* Returns whether this group is supported.
4469
 *
4470
 * namedGroup  The named group to check.
4471
 * returns 1 when supported or 0 otherwise.
4472
 */
4473
static int TLSX_IsGroupSupported(int namedGroup)
4474
0
{
4475
0
    switch (namedGroup) {
4476
0
    #ifdef HAVE_FFDHE_2048
4477
0
        case WOLFSSL_FFDHE_2048:
4478
0
            break;
4479
0
    #endif
4480
    #ifdef HAVE_FFDHE_3072
4481
        case WOLFSSL_FFDHE_3072:
4482
            break;
4483
    #endif
4484
    #ifdef HAVE_FFDHE_4096
4485
        case WOLFSSL_FFDHE_4096:
4486
            break;
4487
    #endif
4488
    #ifdef HAVE_FFDHE_6144
4489
        case WOLFSSL_FFDHE_6144:
4490
            break;
4491
    #endif
4492
    #ifdef HAVE_FFDHE_8192
4493
        case WOLFSSL_FFDHE_8192:
4494
            break;
4495
    #endif
4496
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4497
        #ifdef HAVE_ECC_KOBLITZ
4498
        case WOLFSSL_ECC_SECP256K1:
4499
            break;
4500
        #endif
4501
0
        #ifndef NO_ECC_SECP
4502
0
        case WOLFSSL_ECC_SECP256R1:
4503
0
            break;
4504
0
        #endif /* !NO_ECC_SECP */
4505
        #ifdef HAVE_ECC_BRAINPOOL
4506
        case WOLFSSL_ECC_BRAINPOOLP256R1:
4507
            break;
4508
        #endif
4509
        #ifdef WOLFSSL_SM2
4510
        case WOLFSSL_ECC_SM2P256V1:
4511
            break;
4512
        #endif /* WOLFSSL_SM2 */
4513
0
    #endif
4514
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4515
        case WOLFSSL_ECC_X25519:
4516
            break;
4517
    #endif
4518
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4519
        case WOLFSSL_ECC_X448:
4520
            break;
4521
    #endif
4522
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
4523
0
        #ifndef NO_ECC_SECP
4524
0
        case WOLFSSL_ECC_SECP384R1:
4525
0
            break;
4526
0
        #endif /* !NO_ECC_SECP */
4527
        #ifdef HAVE_ECC_BRAINPOOL
4528
        case WOLFSSL_ECC_BRAINPOOLP384R1:
4529
            break;
4530
        #endif
4531
0
    #endif
4532
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
4533
0
        #ifndef NO_ECC_SECP
4534
0
        case WOLFSSL_ECC_SECP521R1:
4535
0
            break;
4536
0
        #endif /* !NO_ECC_SECP */
4537
0
    #endif
4538
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
4539
        #ifdef HAVE_ECC_KOBLITZ
4540
        case WOLFSSL_ECC_SECP160K1:
4541
            break;
4542
        #endif
4543
        #ifndef NO_ECC_SECP
4544
        case WOLFSSL_ECC_SECP160R1:
4545
            break;
4546
        #endif
4547
        #ifdef HAVE_ECC_SECPR2
4548
        case WOLFSSL_ECC_SECP160R2:
4549
            break;
4550
        #endif
4551
    #endif
4552
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
4553
        #ifdef HAVE_ECC_KOBLITZ
4554
        case WOLFSSL_ECC_SECP192K1:
4555
            break;
4556
        #endif
4557
        #ifndef NO_ECC_SECP
4558
        case WOLFSSL_ECC_SECP192R1:
4559
            break;
4560
        #endif
4561
    #endif
4562
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
4563
        #ifdef HAVE_ECC_KOBLITZ
4564
        case WOLFSSL_ECC_SECP224K1:
4565
            break;
4566
        #endif
4567
0
        #ifndef NO_ECC_SECP
4568
0
        case WOLFSSL_ECC_SECP224R1:
4569
0
            break;
4570
0
        #endif
4571
0
    #endif
4572
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
4573
        #ifdef HAVE_ECC_BRAINPOOL
4574
        case WOLFSSL_ECC_BRAINPOOLP512R1:
4575
            break;
4576
        #endif
4577
0
    #endif
4578
#ifdef WOLFSSL_HAVE_MLKEM
4579
#ifndef WOLFSSL_NO_ML_KEM
4580
    #ifdef WOLFSSL_WC_MLKEM
4581
        #ifndef WOLFSSL_NO_ML_KEM_512
4582
            case WOLFSSL_ML_KEM_512:
4583
            case WOLFSSL_P256_ML_KEM_512:
4584
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4585
            case WOLFSSL_X25519_ML_KEM_512:
4586
        #endif
4587
        #endif
4588
        #ifndef WOLFSSL_NO_ML_KEM_768
4589
            case WOLFSSL_ML_KEM_768:
4590
            case WOLFSSL_P384_ML_KEM_768:
4591
            case WOLFSSL_P256_ML_KEM_768:
4592
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4593
            case WOLFSSL_X25519_ML_KEM_768:
4594
        #endif
4595
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4596
            case WOLFSSL_X448_ML_KEM_768:
4597
        #endif
4598
        #endif
4599
        #ifndef WOLFSSL_NO_ML_KEM_1024
4600
            case WOLFSSL_ML_KEM_1024:
4601
            case WOLFSSL_P521_ML_KEM_1024:
4602
            case WOLFSSL_P384_ML_KEM_1024:
4603
                break;
4604
        #endif
4605
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
4606
            case WOLFSSL_P256_ML_KEM_512_OLD:
4607
            case WOLFSSL_P384_ML_KEM_768_OLD:
4608
            case WOLFSSL_P521_ML_KEM_1024_OLD:
4609
                break;
4610
#endif
4611
    #elif defined(HAVE_LIBOQS)
4612
        case WOLFSSL_ML_KEM_512:
4613
        case WOLFSSL_ML_KEM_768:
4614
        case WOLFSSL_ML_KEM_1024:
4615
        {
4616
            int ret;
4617
            int id;
4618
            ret = mlkem_id2type(namedGroup, &id);
4619
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4620
                return 0;
4621
            }
4622
4623
            if (! ext_mlkem_enabled(id)) {
4624
                return 0;
4625
            }
4626
            break;
4627
        }
4628
4629
        case WOLFSSL_P256_ML_KEM_512:
4630
        case WOLFSSL_P384_ML_KEM_768:
4631
        case WOLFSSL_P256_ML_KEM_768:
4632
        case WOLFSSL_P521_ML_KEM_1024:
4633
        case WOLFSSL_P384_ML_KEM_1024:
4634
        case WOLFSSL_X25519_ML_KEM_512:
4635
        case WOLFSSL_X448_ML_KEM_768:
4636
        case WOLFSSL_X25519_ML_KEM_768:
4637
        {
4638
            int ret;
4639
            int id;
4640
            findEccPqc(NULL, &namedGroup, NULL, namedGroup);
4641
            ret = mlkem_id2type(namedGroup, &id);
4642
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4643
                return 0;
4644
            }
4645
4646
            if (! ext_mlkem_enabled(id)) {
4647
                return 0;
4648
            }
4649
            break;
4650
        }
4651
    #endif
4652
#endif /* WOLFSSL_NO_ML_KEM */
4653
#ifdef WOLFSSL_MLKEM_KYBER
4654
    #ifdef WOLFSSL_WC_MLKEM
4655
        #ifdef WOLFSSL_KYBER512
4656
            case WOLFSSL_KYBER_LEVEL1:
4657
            case WOLFSSL_P256_KYBER_LEVEL1:
4658
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4659
            case WOLFSSL_X25519_KYBER_LEVEL1:
4660
        #endif
4661
        #endif
4662
        #ifdef WOLFSSL_KYBER768
4663
            case WOLFSSL_KYBER_LEVEL3:
4664
            case WOLFSSL_P384_KYBER_LEVEL3:
4665
            case WOLFSSL_P256_KYBER_LEVEL3:
4666
        #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4667
            case WOLFSSL_X25519_KYBER_LEVEL3:
4668
        #endif
4669
        #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4670
            case WOLFSSL_X448_KYBER_LEVEL3:
4671
        #endif
4672
        #endif
4673
        #ifdef WOLFSSL_KYBER1024
4674
            case WOLFSSL_KYBER_LEVEL5:
4675
            case WOLFSSL_P521_KYBER_LEVEL5:
4676
        #endif
4677
                break;
4678
    #elif defined(HAVE_LIBOQS)
4679
        case WOLFSSL_KYBER_LEVEL1:
4680
        case WOLFSSL_KYBER_LEVEL3:
4681
        case WOLFSSL_KYBER_LEVEL5:
4682
        {
4683
            int ret;
4684
            int id;
4685
            ret = mlkem_id2type(namedGroup, &id);
4686
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4687
                return 0;
4688
            }
4689
4690
            if (! ext_mlkem_enabled(id)) {
4691
                return 0;
4692
            }
4693
            break;
4694
        }
4695
        case WOLFSSL_P256_KYBER_LEVEL1:
4696
        case WOLFSSL_P384_KYBER_LEVEL3:
4697
        case WOLFSSL_P256_KYBER_LEVEL3:
4698
        case WOLFSSL_P521_KYBER_LEVEL5:
4699
        case WOLFSSL_X25519_KYBER_LEVEL1:
4700
        case WOLFSSL_X448_KYBER_LEVEL3:
4701
        case WOLFSSL_X25519_KYBER_LEVEL3:
4702
        {
4703
            int ret;
4704
            int id;
4705
            findEccPqc(NULL, &namedGroup, NULL, namedGroup);
4706
            ret = mlkem_id2type(namedGroup, &id);
4707
            if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
4708
                return 0;
4709
            }
4710
4711
            if (! ext_mlkem_enabled(id)) {
4712
                return 0;
4713
            }
4714
            break;
4715
        }
4716
    #endif
4717
#endif
4718
#endif /* WOLFSSL_HAVE_MLKEM */
4719
0
        default:
4720
0
            return 0;
4721
0
    }
4722
4723
0
    return 1;
4724
0
}
4725
#endif
4726
4727
/******************************************************************************/
4728
/* Supported Elliptic Curves                                                  */
4729
/******************************************************************************/
4730
4731
#ifdef HAVE_SUPPORTED_CURVES
4732
4733
#if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \
4734
                       && !defined(HAVE_FFDHE) && !defined(WOLFSSL_HAVE_MLKEM)
4735
#error Elliptic Curves Extension requires Elliptic Curve Cryptography or liboqs groups. \
4736
       Use --enable-ecc and/or --enable-liboqs in the configure script or \
4737
       define HAVE_ECC. Alternatively use FFDHE for DH cipher suites.
4738
#endif
4739
4740
static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
4741
                                                                     void* heap)
4742
0
{
4743
0
    if (curve == NULL)
4744
0
        return BAD_FUNC_ARG;
4745
4746
0
    (void)heap;
4747
4748
0
    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
4749
0
                                                             DYNAMIC_TYPE_TLSX);
4750
0
    if (*curve == NULL)
4751
0
        return MEMORY_E;
4752
4753
0
    (*curve)->name = name;
4754
0
    (*curve)->next = NULL;
4755
4756
0
    return 0;
4757
0
}
4758
4759
static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
4760
0
{
4761
0
    if (point == NULL)
4762
0
        return BAD_FUNC_ARG;
4763
4764
0
    (void)heap;
4765
4766
0
    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
4767
0
                                                             DYNAMIC_TYPE_TLSX);
4768
0
    if (*point == NULL)
4769
0
        return MEMORY_E;
4770
4771
0
    (*point)->format = format;
4772
0
    (*point)->next = NULL;
4773
4774
0
    return 0;
4775
0
}
4776
4777
static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
4778
0
{
4779
0
    SupportedCurve* curve;
4780
4781
0
    while ((curve = list)) {
4782
0
        list = curve->next;
4783
0
        XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
4784
0
    }
4785
0
    (void)heap;
4786
0
}
4787
4788
static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
4789
0
{
4790
0
    PointFormat* point;
4791
4792
0
    while ((point = list)) {
4793
0
        list = point->next;
4794
0
        XFREE(point, heap, DYNAMIC_TYPE_TLSX);
4795
0
    }
4796
0
    (void)heap;
4797
0
}
4798
4799
static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
4800
                                                                     void* heap)
4801
0
{
4802
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
4803
4804
0
    while (list) {
4805
0
        if (list->name == name) {
4806
0
            ret = 0; /* curve already in use */
4807
0
            break;
4808
0
        }
4809
4810
0
        if (list->next == NULL) {
4811
0
            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
4812
0
            break;
4813
0
        }
4814
4815
0
        list = list->next;
4816
0
    }
4817
4818
0
    return ret;
4819
0
}
4820
4821
static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
4822
0
{
4823
0
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
4824
4825
0
    while (list) {
4826
0
        if (list->format == format) {
4827
0
            ret = 0; /* format already in use */
4828
0
            break;
4829
0
        }
4830
4831
0
        if (list->next == NULL) {
4832
0
            ret = TLSX_PointFormat_New(&list->next, format, heap);
4833
0
            break;
4834
0
        }
4835
4836
0
        list = list->next;
4837
0
    }
4838
4839
0
    return ret;
4840
0
}
4841
4842
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
4843
4844
#if defined(HAVE_FFDHE) && (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4845
                                                         defined(HAVE_CURVE448))
4846
static void TLSX_SupportedCurve_ValidateRequest(const WOLFSSL* ssl,
4847
                                                const byte* semaphore)
4848
0
{
4849
    /* If all pre-defined parameter types for key exchange are supported then
4850
     * always send SupportedGroups extension.
4851
     */
4852
0
    (void)ssl;
4853
0
    (void)semaphore;
4854
0
}
4855
#else
4856
static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4857
{
4858
    word16 i;
4859
    const Suites* suites = WOLFSSL_SUITES(ssl);
4860
4861
    for (i = 0; i < suites->suiteSz; i += 2) {
4862
        if (suites->suites[i] == TLS13_BYTE)
4863
            return;
4864
    #ifdef BUILD_TLS_SM4_GCM_SM3
4865
        if ((suites->suites[i] == CIPHER_BYTE) &&
4866
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
4867
            return;
4868
    #endif
4869
    #ifdef BUILD_TLS_SM4_CCM_SM3
4870
        if ((suites->suites[i] == CIPHER_BYTE) &&
4871
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
4872
            return;
4873
    #endif
4874
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4875
        if ((suites->suites[i] == SM_BYTE) &&
4876
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4877
            return;
4878
    #endif
4879
        if ((suites->suites[i] == ECC_BYTE) ||
4880
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4881
            (suites->suites[i] == CHACHA_BYTE)) {
4882
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4883
                                                          defined(HAVE_CURVE448)
4884
            return;
4885
        #endif
4886
        }
4887
        #ifdef HAVE_FFDHE
4888
        else {
4889
            return;
4890
        }
4891
        #endif
4892
    }
4893
4894
    /* turns semaphore on to avoid sending this extension. */
4895
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
4896
}
4897
#endif
4898
4899
/* Only send PointFormats if TLSv13, ECC or CHACHA cipher suite present.
4900
 */
4901
static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4902
0
{
4903
0
#ifdef HAVE_FFDHE
4904
0
    (void)ssl;
4905
0
    (void)semaphore;
4906
#else
4907
    word16 i;
4908
    const Suites* suites = WOLFSSL_SUITES(ssl);
4909
4910
    if (suites == NULL)
4911
        return;
4912
4913
    for (i = 0; i < suites->suiteSz; i += 2) {
4914
        if (suites->suites[i] == TLS13_BYTE)
4915
            return;
4916
    #ifdef BUILD_TLS_SM4_GCM_SM3
4917
        if ((suites->suites[i] == CIPHER_BYTE) &&
4918
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
4919
            return;
4920
    #endif
4921
    #ifdef BUILD_TLS_SM4_CCM_SM3
4922
        if ((suites->suites[i] == CIPHER_BYTE) &&
4923
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
4924
            return;
4925
    #endif
4926
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4927
        if ((suites->suites[i] == SM_BYTE) &&
4928
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4929
            return;
4930
    #endif
4931
        if ((suites->suites[i] == ECC_BYTE) ||
4932
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4933
            (suites->suites[i] == CHACHA_BYTE)) {
4934
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4935
                                                          defined(HAVE_CURVE448)
4936
            return;
4937
        #endif
4938
        }
4939
    }
4940
   /* turns semaphore on to avoid sending this extension. */
4941
   TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4942
#endif
4943
0
}
4944
4945
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
4946
4947
#ifndef NO_WOLFSSL_SERVER
4948
4949
static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
4950
0
{
4951
0
#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4952
0
                                                          defined(HAVE_CURVE448)
4953
0
    (void)semaphore;
4954
0
#endif
4955
4956
0
    if (ssl->options.cipherSuite0 == TLS13_BYTE)
4957
0
        return;
4958
#ifdef BUILD_TLS_SM4_GCM_SM3
4959
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
4960
        (ssl->options.cipherSuite == TLS_SM4_GCM_SM3))
4961
        return;
4962
#endif
4963
#ifdef BUILD_TLS_SM4_CCM_SM3
4964
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
4965
        (ssl->options.cipherSuite == TLS_SM4_CCM_SM3))
4966
        return;
4967
#endif
4968
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4969
    if ((ssl->options.cipherSuite0 == SM_BYTE) &&
4970
        (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4971
        return;
4972
#endif
4973
0
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
4974
0
    if (ssl->options.cipherSuite0 == ECC_BYTE ||
4975
0
        ssl->options.cipherSuite0 == ECDHE_PSK_BYTE ||
4976
0
        ssl->options.cipherSuite0 == CHACHA_BYTE) {
4977
0
        return;
4978
0
    }
4979
0
#endif
4980
4981
    /* turns semaphore on to avoid sending this extension. */
4982
0
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4983
0
}
4984
4985
#endif /* !NO_WOLFSSL_SERVER */
4986
4987
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
4988
4989
static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
4990
0
{
4991
0
    SupportedCurve* curve;
4992
0
    word16 length = OPAQUE16_LEN; /* list length */
4993
4994
0
    while ((curve = list)) {
4995
0
        list = curve->next;
4996
0
        length += OPAQUE16_LEN; /* curve length */
4997
0
    }
4998
4999
0
    return length;
5000
0
}
5001
5002
#endif
5003
5004
static word16 TLSX_PointFormat_GetSize(PointFormat* list)
5005
0
{
5006
0
    PointFormat* point;
5007
0
    word16 length = ENUM_LEN; /* list length */
5008
5009
0
    while ((point = list)) {
5010
0
        list = point->next;
5011
0
        length += ENUM_LEN; /* format length */
5012
0
    }
5013
5014
0
    return length;
5015
0
}
5016
5017
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5018
5019
static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
5020
0
{
5021
0
    word16 offset = OPAQUE16_LEN;
5022
5023
0
    while (list) {
5024
0
        c16toa(list->name, output + offset);
5025
0
        offset += OPAQUE16_LEN;
5026
0
        list = list->next;
5027
0
    }
5028
5029
0
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
5030
5031
0
    return offset;
5032
0
}
5033
5034
#endif
5035
5036
static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
5037
0
{
5038
0
    word16 offset = ENUM_LEN;
5039
5040
0
    while (list) {
5041
0
        output[offset++] = list->format;
5042
0
        list = list->next;
5043
0
    }
5044
5045
0
    output[0] = (byte)(offset - ENUM_LEN);
5046
5047
0
    return offset;
5048
0
}
5049
5050
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
5051
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
5052
5053
int TLSX_SupportedCurve_Parse(const WOLFSSL* ssl, const byte* input,
5054
                              word16 length, byte isRequest, TLSX** extensions)
5055
0
{
5056
0
    word16 offset;
5057
0
    word16 name;
5058
0
    int ret = 0;
5059
0
    TLSX* extension;
5060
5061
0
    if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
5062
#ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
5063
        return 0;
5064
#else
5065
0
        return BUFFER_ERROR; /* servers doesn't send this extension. */
5066
0
#endif
5067
0
    }
5068
0
    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
5069
0
        return BUFFER_ERROR;
5070
0
    ato16(input, &offset);
5071
    /* validating curve list length */
5072
0
    if (length != OPAQUE16_LEN + offset)
5073
0
        return BUFFER_ERROR;
5074
0
    offset = OPAQUE16_LEN;
5075
0
    if (offset == length)
5076
0
        return 0;
5077
5078
0
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5079
0
    if (extension == NULL) {
5080
        /* Just accept what the peer wants to use */
5081
0
        for (; offset < length; offset += OPAQUE16_LEN) {
5082
0
            ato16(input + offset, &name);
5083
5084
0
            ret = TLSX_UseSupportedCurve(extensions, name, ssl->heap);
5085
            /* If it is BAD_FUNC_ARG then it is a group we do not support, but
5086
             * that is fine. */
5087
0
            if (ret != WOLFSSL_SUCCESS &&
5088
0
                    ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
5089
0
                break;
5090
0
            ret = 0;
5091
0
        }
5092
0
    }
5093
0
    else {
5094
        /* Find the intersection with what the user has set */
5095
0
        SupportedCurve* commonCurves = NULL;
5096
0
        for (; offset < length; offset += OPAQUE16_LEN) {
5097
0
            SupportedCurve* foundCurve = (SupportedCurve*)extension->data;
5098
0
            ato16(input + offset, &name);
5099
5100
0
            while (foundCurve != NULL && foundCurve->name != name)
5101
0
                foundCurve = foundCurve->next;
5102
5103
0
            if (foundCurve != NULL) {
5104
0
                ret = commonCurves == NULL ?
5105
0
                      TLSX_SupportedCurve_New(&commonCurves, name, ssl->heap) :
5106
0
                      TLSX_SupportedCurve_Append(commonCurves, name, ssl->heap);
5107
0
                if (ret != 0)
5108
0
                    break;
5109
0
            }
5110
0
        }
5111
        /* If no common curves return error. In TLS 1.3 we can still try to save
5112
         * this by using HRR. */
5113
0
        if (ret == 0 && commonCurves == NULL &&
5114
0
                !IsAtLeastTLSv1_3(ssl->version))
5115
0
            ret = ECC_CURVE_ERROR;
5116
0
        if (ret == 0) {
5117
            /* Now swap out the curves in the extension */
5118
0
            TLSX_SupportedCurve_FreeAll((SupportedCurve*)extension->data,
5119
0
                                        ssl->heap);
5120
0
            extension->data = commonCurves;
5121
0
            commonCurves = NULL;
5122
0
        }
5123
0
        TLSX_SupportedCurve_FreeAll(commonCurves, ssl->heap);
5124
0
    }
5125
5126
0
    return ret;
5127
0
}
5128
#endif
5129
5130
#if !defined(NO_WOLFSSL_SERVER)
5131
5132
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5133
5134
/* Checks the priority of the groups on the server and set the supported groups
5135
 * response if there is a group not advertised by the client that is preferred.
5136
 *
5137
 * ssl  SSL/TLS object.
5138
 * returns 0 on success, otherwise an error.
5139
 */
5140
int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
5141
0
{
5142
0
    int ret;
5143
0
    TLSX* extension;
5144
0
    TLSX* priority = NULL;
5145
0
    TLSX* ext = NULL;
5146
0
    word16 name;
5147
0
    SupportedCurve* curve;
5148
5149
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5150
    /* May be doing PSK with no key exchange. */
5151
0
    if (extension == NULL)
5152
0
        return 0;
5153
5154
0
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5155
0
    if (ret != WOLFSSL_SUCCESS) {
5156
0
        TLSX_FreeAll(priority, ssl->heap);
5157
0
        return ret;
5158
0
    }
5159
5160
0
    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5161
0
    if (ext == NULL) {
5162
0
        WOLFSSL_MSG("Could not find supported groups extension");
5163
0
        TLSX_FreeAll(priority, ssl->heap);
5164
0
        return 0;
5165
0
    }
5166
5167
0
    curve = (SupportedCurve*)ext->data;
5168
0
    name = curve->name;
5169
5170
0
    curve = (SupportedCurve*)extension->data;
5171
0
    while (curve != NULL) {
5172
0
        if (curve->name == name)
5173
0
            break;
5174
0
        curve = curve->next;
5175
0
    }
5176
5177
0
    if (curve == NULL) {
5178
        /* Couldn't find the preferred group in client list. */
5179
0
        extension->resp = 1;
5180
5181
        /* Send server list back and free client list. */
5182
0
        curve = (SupportedCurve*)extension->data;
5183
0
        extension->data = ext->data;
5184
0
        ext->data = curve;
5185
0
    }
5186
5187
0
    TLSX_FreeAll(priority, ssl->heap);
5188
5189
0
    return 0;
5190
0
}
5191
5192
#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
5193
5194
#if defined(HAVE_FFDHE) && !defined(WOLFSSL_NO_TLS12)
5195
#ifdef HAVE_PUBLIC_FFDHE
5196
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5197
    SupportedCurve* serverGroup)
5198
0
{
5199
0
    int ret = 0;
5200
0
    SupportedCurve* group;
5201
0
    const DhParams* params = NULL;
5202
5203
0
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5204
0
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5205
0
            continue;
5206
5207
0
        for (group = clientGroup; group != NULL; group = group->next) {
5208
0
            if (serverGroup->name != group->name)
5209
0
                continue;
5210
5211
0
            switch (serverGroup->name) {
5212
0
            #ifdef HAVE_FFDHE_2048
5213
0
                case WOLFSSL_FFDHE_2048:
5214
0
                    params = wc_Dh_ffdhe2048_Get();
5215
0
                    break;
5216
0
            #endif
5217
            #ifdef HAVE_FFDHE_3072
5218
                case WOLFSSL_FFDHE_3072:
5219
                    params = wc_Dh_ffdhe3072_Get();
5220
                    break;
5221
            #endif
5222
            #ifdef HAVE_FFDHE_4096
5223
                case WOLFSSL_FFDHE_4096:
5224
                    params = wc_Dh_ffdhe4096_Get();
5225
                    break;
5226
            #endif
5227
            #ifdef HAVE_FFDHE_6144
5228
                case WOLFSSL_FFDHE_6144:
5229
                    params = wc_Dh_ffdhe6144_Get();
5230
                    break;
5231
            #endif
5232
            #ifdef HAVE_FFDHE_8192
5233
                case WOLFSSL_FFDHE_8192:
5234
                    params = wc_Dh_ffdhe8192_Get();
5235
                    break;
5236
            #endif
5237
0
                default:
5238
0
                    break;
5239
0
            }
5240
0
            if (params == NULL) {
5241
0
                ret = BAD_FUNC_ARG;
5242
0
                break;
5243
0
            }
5244
0
            if (params->p_len >= ssl->options.minDhKeySz &&
5245
0
                                     params->p_len <= ssl->options.maxDhKeySz) {
5246
0
                break;
5247
0
            }
5248
0
        }
5249
5250
0
        if (ret != 0)
5251
0
            break;
5252
0
        if ((group != NULL) && (serverGroup->name == group->name))
5253
0
            break;
5254
0
    }
5255
5256
0
    if ((ret == 0) && (serverGroup != NULL) && (params != NULL)) {
5257
0
        ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
5258
0
        ssl->buffers.serverDH_P.length = params->p_len;
5259
0
        ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
5260
0
        ssl->buffers.serverDH_G.length = params->g_len;
5261
5262
0
        ssl->namedGroup = serverGroup->name;
5263
0
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5264
0
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5265
0
        ssl->options.dhDoKeyTest = 0;
5266
0
    #endif
5267
0
        ssl->options.haveDH = 1;
5268
0
    }
5269
5270
0
    return ret;
5271
0
}
5272
#else
5273
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
5274
    SupportedCurve* serverGroup)
5275
{
5276
    int ret = 0;
5277
    SupportedCurve* group;
5278
    word32 p_len;
5279
5280
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5281
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5282
            continue;
5283
5284
        for (group = clientGroup; group != NULL; group = group->next) {
5285
            if (serverGroup->name != group->name)
5286
                continue;
5287
5288
            wc_DhGetNamedKeyParamSize(serverGroup->name, &p_len, NULL, NULL);
5289
            if (p_len == 0) {
5290
                ret = BAD_FUNC_ARG;
5291
                break;
5292
            }
5293
            if (p_len >= ssl->options.minDhKeySz &&
5294
                                             p_len <= ssl->options.maxDhKeySz) {
5295
                break;
5296
            }
5297
        }
5298
5299
        if (ret != 0)
5300
            break;
5301
        if ((group != NULL) && (serverGroup->name == group->name))
5302
            break;
5303
    }
5304
5305
    if ((ret == 0) && (serverGroup != NULL)) {
5306
        word32 pSz, gSz;
5307
5308
        ssl->buffers.serverDH_P.buffer = NULL;
5309
        ssl->buffers.serverDH_G.buffer = NULL;
5310
        ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &pSz, &gSz, NULL);
5311
        if (ret == 0) {
5312
            ssl->buffers.serverDH_P.buffer =
5313
                (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5314
            if (ssl->buffers.serverDH_P.buffer == NULL)
5315
                ret = MEMORY_E;
5316
            else
5317
                ssl->buffers.serverDH_P.length = pSz;
5318
        }
5319
        if (ret == 0) {
5320
            ssl->buffers.serverDH_G.buffer =
5321
                (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
5322
            if (ssl->buffers.serverDH_G.buffer == NULL) {
5323
                ret = MEMORY_E;
5324
            } else
5325
                ssl->buffers.serverDH_G.length = gSz;
5326
        }
5327
        if (ret == 0) {
5328
            ret = wc_DhCopyNamedKey(serverGroup->name,
5329
                              ssl->buffers.serverDH_P.buffer, &pSz,
5330
                              ssl->buffers.serverDH_G.buffer, &gSz,
5331
                              NULL, NULL);
5332
        }
5333
        if (ret == 0) {
5334
            ssl->buffers.weOwnDH = 1;
5335
5336
            ssl->namedGroup = serverGroup->name;
5337
        #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5338
            !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5339
            ssl->options.dhDoKeyTest = 0;
5340
        #endif
5341
            ssl->options.haveDH = 1;
5342
        }
5343
        else {
5344
            if (ssl->buffers.serverDH_P.buffer != NULL) {
5345
                XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5346
                    DYNAMIC_TYPE_PUBLIC_KEY);
5347
                ssl->buffers.serverDH_P.length = 0;
5348
                ssl->buffers.serverDH_P.buffer = NULL;
5349
            }
5350
            if (ssl->buffers.serverDH_G.buffer != NULL) {
5351
                XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5352
                    DYNAMIC_TYPE_PUBLIC_KEY);
5353
                ssl->buffers.serverDH_G.length = 0;
5354
                ssl->buffers.serverDH_G.buffer = NULL;
5355
            }
5356
        }
5357
    }
5358
5359
    return ret;
5360
}
5361
#endif
5362
5363
/* Set the highest priority common FFDHE group on the server as compared to
5364
 * client extensions.
5365
 *
5366
 * ssl    SSL/TLS object.
5367
 * returns 0 on success, otherwise an error.
5368
 */
5369
int TLSX_SupportedFFDHE_Set(WOLFSSL* ssl)
5370
0
{
5371
0
    int ret;
5372
0
    TLSX* priority = NULL;
5373
0
    TLSX* ext = NULL;
5374
0
    TLSX* extension;
5375
0
    SupportedCurve* clientGroup;
5376
0
    SupportedCurve* group;
5377
0
    int found = 0;
5378
5379
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5380
    /* May be doing PSK with no key exchange. */
5381
0
    if (extension == NULL)
5382
0
        return 0;
5383
0
    clientGroup = (SupportedCurve*)extension->data;
5384
0
    for (group = clientGroup; group != NULL; group = group->next) {
5385
0
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(group->name)) {
5386
0
            found = 1;
5387
0
            break;
5388
0
        }
5389
0
    }
5390
0
    if (!found)
5391
0
        return 0;
5392
5393
0
    if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
5394
0
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
5395
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5396
0
    }
5397
0
    if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
5398
0
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
5399
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
5400
0
    }
5401
0
    ssl->buffers.serverDH_P.buffer = NULL;
5402
0
    ssl->buffers.serverDH_G.buffer = NULL;
5403
0
    ssl->buffers.weOwnDH = 0;
5404
0
    ssl->options.haveDH = 0;
5405
5406
0
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5407
0
    if (ret == WOLFSSL_SUCCESS) {
5408
0
        SupportedCurve* serverGroup;
5409
5410
0
        ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5411
0
        serverGroup = (SupportedCurve*)ext->data;
5412
5413
0
        ret = tlsx_ffdhe_find_group(ssl, clientGroup, serverGroup);
5414
0
    }
5415
5416
0
    TLSX_FreeAll(priority, ssl->heap);
5417
5418
0
    return ret;
5419
0
}
5420
#endif /* HAVE_FFDHE && !WOLFSSL_NO_TLS12 */
5421
5422
#endif /* !NO_WOLFSSL_SERVER */
5423
5424
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
5425
/* Return the preferred group.
5426
 *
5427
 * ssl             SSL/TLS object.
5428
 * checkSupported  Whether to check for the first supported group.
5429
 * returns BAD_FUNC_ARG if no group found, otherwise the group.
5430
 */
5431
int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
5432
0
{
5433
0
    TLSX* extension;
5434
0
    SupportedCurve* curve;
5435
5436
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5437
0
    if (extension == NULL)
5438
0
        return BAD_FUNC_ARG;
5439
5440
0
    curve = (SupportedCurve*)extension->data;
5441
0
    while (curve != NULL) {
5442
0
        if (!checkSupported || TLSX_IsGroupSupported(curve->name))
5443
0
            return curve->name;
5444
0
        curve = curve->next;
5445
0
    }
5446
5447
0
    return BAD_FUNC_ARG;
5448
0
}
5449
5450
#endif /* HAVE_SUPPORTED_CURVES */
5451
5452
#ifndef NO_WOLFSSL_SERVER
5453
5454
static int TLSX_PointFormat_Parse(WOLFSSL* ssl, const byte* input,
5455
                                  word16 length, byte isRequest)
5456
0
{
5457
0
    int ret;
5458
5459
    /* validating formats list length */
5460
0
    if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
5461
0
        return BUFFER_ERROR;
5462
5463
0
    if (isRequest) {
5464
        /* adding uncompressed point format to response */
5465
0
        ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
5466
0
                                                                     ssl->heap);
5467
0
        if (ret != WOLFSSL_SUCCESS)
5468
0
            return ret; /* throw error */
5469
5470
0
        TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
5471
0
    }
5472
5473
0
    return 0;
5474
0
}
5475
5476
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
5477
int TLSX_ValidateSupportedCurves(const WOLFSSL* ssl, byte first, byte second,
5478
0
                                 word32* ecdhCurveOID) {
5479
0
    TLSX*           extension = NULL;
5480
0
    SupportedCurve* curve     = NULL;
5481
0
    word32          oid       = 0;
5482
0
    word32          defOid    = 0;
5483
0
    word32          defSz     = 80; /* Maximum known curve size is 66. */
5484
0
    word32          nextOid   = 0;
5485
0
    word32          nextSz    = 80; /* Maximum known curve size is 66. */
5486
0
    word32          currOid   = ssl->ecdhCurveOID;
5487
0
    int             ephmSuite = 0;
5488
0
    word16          octets    = 0; /* according to 'ecc_set_type ecc_sets[];' */
5489
0
    int             key       = 0; /* validate key       */
5490
0
    int             foundCurve = 0; /* Found at least one supported curve */
5491
5492
0
    (void)oid;
5493
5494
0
    if (first == CHACHA_BYTE) {
5495
0
        switch (second) {
5496
0
            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5497
0
            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
5498
0
            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5499
0
            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5500
0
                return 1; /* no suite restriction */
5501
0
            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
5502
0
            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
5503
0
            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
5504
0
                break;
5505
0
        }
5506
0
    }
5507
0
    if (first == ECC_BYTE || first == ECDHE_PSK_BYTE || first == CHACHA_BYTE)
5508
0
        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5509
0
    if (!extension)
5510
0
        return 1; /* no suite restriction */
5511
5512
0
    for (curve = (SupportedCurve*)extension->data;
5513
0
         curve && !key;
5514
0
         curve = curve->next) {
5515
5516
    #ifdef OPENSSL_EXTRA
5517
        /* skip if name is not in supported ECC range
5518
         * or disabled by user */
5519
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
5520
            continue;
5521
    #endif
5522
5523
        /* find supported curve */
5524
0
        switch (curve->name) {
5525
0
#ifdef HAVE_ECC
5526
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
5527
        #ifndef NO_ECC_SECP
5528
            case WOLFSSL_ECC_SECP160R1:
5529
                oid = ECC_SECP160R1_OID;
5530
                octets = 20;
5531
                break;
5532
        #endif /* !NO_ECC_SECP */
5533
        #ifdef HAVE_ECC_SECPR2
5534
            case WOLFSSL_ECC_SECP160R2:
5535
                oid = ECC_SECP160R2_OID;
5536
                octets = 20;
5537
                break;
5538
        #endif /* HAVE_ECC_SECPR2 */
5539
        #ifdef HAVE_ECC_KOBLITZ
5540
            case WOLFSSL_ECC_SECP160K1:
5541
                oid = ECC_SECP160K1_OID;
5542
                octets = 20;
5543
                break;
5544
        #endif /* HAVE_ECC_KOBLITZ */
5545
        #endif
5546
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
5547
        #ifndef NO_ECC_SECP
5548
            case WOLFSSL_ECC_SECP192R1:
5549
                oid = ECC_SECP192R1_OID;
5550
                octets = 24;
5551
                break;
5552
        #endif /* !NO_ECC_SECP */
5553
        #ifdef HAVE_ECC_KOBLITZ
5554
            case WOLFSSL_ECC_SECP192K1:
5555
                oid = ECC_SECP192K1_OID;
5556
                octets = 24;
5557
                break;
5558
        #endif /* HAVE_ECC_KOBLITZ */
5559
    #endif
5560
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
5561
0
        #ifndef NO_ECC_SECP
5562
0
            case WOLFSSL_ECC_SECP224R1:
5563
0
                oid = ECC_SECP224R1_OID;
5564
0
                octets = 28;
5565
0
                break;
5566
0
        #endif /* !NO_ECC_SECP */
5567
        #ifdef HAVE_ECC_KOBLITZ
5568
            case WOLFSSL_ECC_SECP224K1:
5569
                oid = ECC_SECP224K1_OID;
5570
                octets = 28;
5571
                break;
5572
        #endif /* HAVE_ECC_KOBLITZ */
5573
0
    #endif
5574
0
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5575
0
        #ifndef NO_ECC_SECP
5576
0
            case WOLFSSL_ECC_SECP256R1:
5577
0
                oid = ECC_SECP256R1_OID;
5578
0
                octets = 32;
5579
0
                break;
5580
0
        #endif /* !NO_ECC_SECP */
5581
0
    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
5582
0
#endif
5583
        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
5584
            case WOLFSSL_ECC_X25519:
5585
                oid = ECC_X25519_OID;
5586
                octets = 32;
5587
                break;
5588
        #endif /* HAVE_CURVE25519 */
5589
0
#ifdef HAVE_ECC
5590
0
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5591
        #ifdef HAVE_ECC_KOBLITZ
5592
            case WOLFSSL_ECC_SECP256K1:
5593
                oid = ECC_SECP256K1_OID;
5594
                octets = 32;
5595
                break;
5596
        #endif /* HAVE_ECC_KOBLITZ */
5597
        #ifdef HAVE_ECC_BRAINPOOL
5598
            case WOLFSSL_ECC_BRAINPOOLP256R1:
5599
                oid = ECC_BRAINPOOLP256R1_OID;
5600
                octets = 32;
5601
                break;
5602
        #endif /* HAVE_ECC_BRAINPOOL */
5603
        #ifdef WOLFSSL_SM2
5604
            case WOLFSSL_ECC_SM2P256V1:
5605
                oid = ECC_SM2P256V1_OID;
5606
                octets = 32;
5607
                break;
5608
        #endif /* WOLFSSL_SM2 */
5609
0
    #endif
5610
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
5611
0
        #ifndef NO_ECC_SECP
5612
0
            case WOLFSSL_ECC_SECP384R1:
5613
0
                oid = ECC_SECP384R1_OID;
5614
0
                octets = 48;
5615
0
                break;
5616
0
        #endif /* !NO_ECC_SECP */
5617
        #ifdef HAVE_ECC_BRAINPOOL
5618
            case WOLFSSL_ECC_BRAINPOOLP384R1:
5619
                oid = ECC_BRAINPOOLP384R1_OID;
5620
                octets = 48;
5621
                break;
5622
        #endif /* HAVE_ECC_BRAINPOOL */
5623
0
    #endif
5624
0
#endif
5625
        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
5626
            case WOLFSSL_ECC_X448:
5627
                oid = ECC_X448_OID;
5628
                octets = 57;
5629
                break;
5630
        #endif /* HAVE_CURVE448 */
5631
0
#ifdef HAVE_ECC
5632
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
5633
        #ifdef HAVE_ECC_BRAINPOOL
5634
            case WOLFSSL_ECC_BRAINPOOLP512R1:
5635
                oid = ECC_BRAINPOOLP512R1_OID;
5636
                octets = 64;
5637
                break;
5638
        #endif /* HAVE_ECC_BRAINPOOL */
5639
0
    #endif
5640
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
5641
0
        #ifndef NO_ECC_SECP
5642
0
            case WOLFSSL_ECC_SECP521R1:
5643
0
                oid = ECC_SECP521R1_OID;
5644
0
                octets = 66;
5645
0
                break;
5646
0
        #endif /* !NO_ECC_SECP */
5647
0
    #endif
5648
0
#endif
5649
0
            default: continue; /* unsupported curve */
5650
0
        }
5651
5652
0
        foundCurve = 1;
5653
5654
0
    #ifdef HAVE_ECC
5655
        /* Set default Oid */
5656
0
        if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
5657
0
            defOid = oid;
5658
0
            defSz = octets;
5659
0
        }
5660
5661
        /* The eccTempKeySz is the preferred ephemeral key size */
5662
0
        if (currOid == 0 && ssl->eccTempKeySz == octets)
5663
0
            currOid = oid;
5664
0
        if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
5665
0
            nextOid = oid;
5666
0
            nextSz  = octets;
5667
0
        }
5668
    #else
5669
        if (defOid == 0 && defSz > octets) {
5670
            defOid = oid;
5671
            defSz = octets;
5672
        }
5673
5674
        if (currOid == 0)
5675
            currOid = oid;
5676
        if (nextOid == 0 || nextSz > octets) {
5677
            nextOid = oid;
5678
            nextSz  = octets;
5679
        }
5680
    #endif
5681
5682
0
        if (first == ECC_BYTE) {
5683
0
            switch (second) {
5684
0
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
5685
                /* ECDHE_ECDSA */
5686
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
5687
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
5688
0
                case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
5689
0
                case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
5690
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
5691
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
5692
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
5693
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
5694
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
5695
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
5696
0
                    key |= ssl->ecdhCurveOID == oid;
5697
0
                    ephmSuite = 1;
5698
0
                break;
5699
5700
    #ifdef WOLFSSL_STATIC_DH
5701
                /* ECDH_ECDSA */
5702
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
5703
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
5704
                case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
5705
                case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
5706
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
5707
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
5708
                case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
5709
                case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
5710
                    if (oid == ECC_X25519_OID && defOid == oid) {
5711
                        defOid = 0;
5712
                        defSz = 80;
5713
                    }
5714
                    if (oid == ECC_X448_OID && defOid == oid) {
5715
                        defOid = 0;
5716
                        defSz = 80;
5717
                    }
5718
                    key |= ssl->pkCurveOID == oid;
5719
                break;
5720
    #endif /* WOLFSSL_STATIC_DH */
5721
0
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
5722
0
#ifndef NO_RSA
5723
                /* ECDHE_RSA */
5724
0
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
5725
0
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
5726
0
                case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
5727
0
                case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
5728
0
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
5729
0
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
5730
0
                case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
5731
0
                case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
5732
0
                    key |= ssl->ecdhCurveOID == oid;
5733
0
                    ephmSuite = 1;
5734
0
                break;
5735
5736
    #if defined(HAVE_ECC) && defined(WOLFSSL_STATIC_DH)
5737
                /* ECDH_RSA */
5738
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
5739
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
5740
                case TLS_ECDH_RSA_WITH_RC4_128_SHA:
5741
                case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
5742
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
5743
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
5744
                case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
5745
                case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
5746
                    if (oid == ECC_X25519_OID && defOid == oid) {
5747
                        defOid = 0;
5748
                        defSz = 80;
5749
                    }
5750
                    if (oid == ECC_X448_OID && defOid == oid) {
5751
                        defOid = 0;
5752
                        defSz = 80;
5753
                    }
5754
                    key |= ssl->pkCurveOID == oid;
5755
                break;
5756
    #endif /* HAVE_ECC && WOLFSSL_STATIC_DH */
5757
0
#endif
5758
0
                default:
5759
0
                    if (oid == ECC_X25519_OID && defOid == oid) {
5760
0
                        defOid = 0;
5761
0
                        defSz = 80;
5762
0
                    }
5763
0
                    if (oid == ECC_X448_OID && defOid == oid) {
5764
0
                        defOid = 0;
5765
0
                        defSz = 80;
5766
0
                    }
5767
0
                    key = 1;
5768
0
                break;
5769
0
            }
5770
0
        }
5771
5772
        /* ChaCha20-Poly1305 ECC cipher suites */
5773
0
        if (first == CHACHA_BYTE) {
5774
0
            switch (second) {
5775
0
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
5776
                /* ECDHE_ECDSA */
5777
0
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
5778
0
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
5779
0
                    key |= ssl->ecdhCurveOID == oid;
5780
0
                    ephmSuite = 1;
5781
0
                break;
5782
0
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
5783
0
#ifndef NO_RSA
5784
                /* ECDHE_RSA */
5785
0
                case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
5786
0
                case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
5787
0
                    key |= ssl->ecdhCurveOID == oid;
5788
0
                    ephmSuite = 1;
5789
0
                break;
5790
0
#endif
5791
0
                default:
5792
0
                    key = 1;
5793
0
                break;
5794
0
            }
5795
0
        }
5796
0
    }
5797
5798
    /* Check we found at least one supported curve */
5799
0
    if (!foundCurve)
5800
0
        return 0;
5801
5802
0
    *ecdhCurveOID = ssl->ecdhCurveOID;
5803
    /* Choose the default if it is at the required strength. */
5804
0
#ifdef HAVE_ECC
5805
0
    if (*ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
5806
#else
5807
    if (*ecdhCurveOID == 0)
5808
#endif
5809
0
    {
5810
0
        key = 1;
5811
0
        *ecdhCurveOID = defOid;
5812
0
    }
5813
    /* Choose any curve at the required strength. */
5814
0
    if (*ecdhCurveOID == 0) {
5815
0
        key = 1;
5816
0
        *ecdhCurveOID = currOid;
5817
0
    }
5818
    /* Choose the default if it is at the next highest strength. */
5819
0
    if (*ecdhCurveOID == 0 && defSz == nextSz)
5820
0
        *ecdhCurveOID = defOid;
5821
    /* Choose any curve at the next highest strength. */
5822
0
    if (*ecdhCurveOID == 0)
5823
0
        *ecdhCurveOID = nextOid;
5824
    /* No curve and ephemeral ECC suite requires a matching curve. */
5825
0
    if (*ecdhCurveOID == 0 && ephmSuite)
5826
0
        key = 0;
5827
5828
0
    return key;
5829
0
}
5830
#endif
5831
5832
#endif /* NO_WOLFSSL_SERVER */
5833
5834
5835
int TLSX_SupportedCurve_Copy(TLSX* src, TLSX** dst, void* heap)
5836
0
{
5837
0
    TLSX* extension;
5838
0
    int ret;
5839
5840
0
    extension = TLSX_Find(src, TLSX_SUPPORTED_GROUPS);
5841
0
    if (extension != NULL) {
5842
0
        SupportedCurve* curve;
5843
0
        for (curve = (SupportedCurve*)extension->data; curve != NULL;
5844
0
                curve = curve->next) {
5845
0
            ret = TLSX_UseSupportedCurve(dst, curve->name, heap);
5846
0
            if (ret != WOLFSSL_SUCCESS)
5847
0
                return MEMORY_E;
5848
0
        }
5849
0
    }
5850
5851
0
    return 0;
5852
0
}
5853
5854
int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
5855
0
{
5856
0
    TLSX* extension = NULL;
5857
0
    SupportedCurve* curve = NULL;
5858
0
    int ret;
5859
5860
0
    if (extensions == NULL) {
5861
0
        return BAD_FUNC_ARG;
5862
0
    }
5863
5864
0
    if (! TLSX_IsGroupSupported(name)) {
5865
0
        return BAD_FUNC_ARG;
5866
0
    }
5867
5868
0
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5869
5870
0
    if (!extension) {
5871
0
        ret = TLSX_SupportedCurve_New(&curve, name, heap);
5872
0
        if (ret != 0)
5873
0
            return ret;
5874
5875
0
        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
5876
0
        if (ret != 0) {
5877
0
            XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
5878
0
            return ret;
5879
0
        }
5880
0
    }
5881
0
    else {
5882
0
        ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
5883
0
                                                                          heap);
5884
0
        if (ret != 0)
5885
0
            return ret;
5886
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
5887
        if (name == WOLFSSL_P256_ML_KEM_512) {
5888
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5889
                WOLFSSL_P256_ML_KEM_512_OLD, heap);
5890
        }
5891
        else if (name == WOLFSSL_P384_ML_KEM_768) {
5892
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5893
                WOLFSSL_P384_ML_KEM_768_OLD, heap);
5894
        }
5895
        else if (name == WOLFSSL_P521_ML_KEM_1024) {
5896
            ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5897
                WOLFSSL_P521_ML_KEM_1024_OLD, heap);
5898
        }
5899
        if (ret != 0) {
5900
            return ret;
5901
        }
5902
#endif
5903
0
    }
5904
5905
0
    return WOLFSSL_SUCCESS;
5906
0
}
5907
5908
int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
5909
0
{
5910
0
    TLSX* extension = NULL;
5911
0
    PointFormat* point = NULL;
5912
0
    int ret = 0;
5913
5914
0
    if (extensions == NULL)
5915
0
        return BAD_FUNC_ARG;
5916
5917
0
    extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
5918
5919
0
    if (!extension) {
5920
0
        ret = TLSX_PointFormat_New(&point, format, heap);
5921
0
        if (ret != 0)
5922
0
            return ret;
5923
5924
0
        ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
5925
0
        if (ret != 0) {
5926
0
            XFREE(point, heap, DYNAMIC_TYPE_TLSX);
5927
0
            return ret;
5928
0
        }
5929
0
    }
5930
0
    else {
5931
0
        ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
5932
0
                                                                          heap);
5933
0
        if (ret != 0)
5934
0
            return ret;
5935
0
    }
5936
5937
0
    return WOLFSSL_SUCCESS;
5938
0
}
5939
5940
0
#define EC_FREE_ALL         TLSX_SupportedCurve_FreeAll
5941
0
#define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
5942
5943
/* In TLS 1.2 the server never sends supported curve extension, but in TLS 1.3
5944
 * the server can send supported groups extension to indicate what it will
5945
 * support for later connections. */
5946
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5947
0
#define EC_GET_SIZE TLSX_SupportedCurve_GetSize
5948
0
#define EC_WRITE    TLSX_SupportedCurve_Write
5949
#else
5950
#define EC_GET_SIZE(list)         0
5951
#define EC_WRITE(a, b)            0
5952
#endif
5953
5954
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
5955
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
5956
0
#define EC_PARSE TLSX_SupportedCurve_Parse
5957
#else
5958
#define EC_PARSE(a, b, c, d, e)   0
5959
#endif
5960
5961
0
#define PF_FREE_ALL          TLSX_PointFormat_FreeAll
5962
0
#define PF_VALIDATE_REQUEST  TLSX_PointFormat_ValidateRequest
5963
0
#define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
5964
5965
0
#define PF_GET_SIZE TLSX_PointFormat_GetSize
5966
0
#define PF_WRITE    TLSX_PointFormat_Write
5967
5968
#ifndef NO_WOLFSSL_SERVER
5969
0
#define PF_PARSE TLSX_PointFormat_Parse
5970
#else
5971
#define PF_PARSE(a, b, c, d)      0
5972
#endif
5973
5974
#else
5975
5976
#define EC_FREE_ALL(list, heap) WC_DO_NOTHING
5977
#define EC_GET_SIZE(list)         0
5978
#define EC_WRITE(a, b)            0
5979
#define EC_PARSE(a, b, c, d, e)   0
5980
#define EC_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
5981
5982
#define PF_FREE_ALL(list, heap)   WC_DO_NOTHING
5983
#define PF_GET_SIZE(list)         0
5984
#define PF_WRITE(a, b)            0
5985
#define PF_PARSE(a, b, c, d)      0
5986
#define PF_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
5987
#define PF_VALIDATE_RESPONSE(a, b) WC_DO_NOTHING
5988
5989
#endif /* HAVE_SUPPORTED_CURVES */
5990
5991
/******************************************************************************/
5992
/* Renegotiation Indication                                                   */
5993
/******************************************************************************/
5994
5995
#if defined(HAVE_SECURE_RENEGOTIATION) \
5996
 || defined(HAVE_SERVER_RENEGOTIATION_INFO)
5997
5998
static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
5999
                                                                  int isRequest)
6000
0
{
6001
0
    byte length = OPAQUE8_LEN; /* empty info length */
6002
6003
    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
6004
0
    if (data && data->enabled && data->verifySet) {
6005
        /* client sends client_verify_data only */
6006
0
        length += TLS_FINISHED_SZ;
6007
6008
        /* server also sends server_verify_data */
6009
0
        if (!isRequest)
6010
0
            length += TLS_FINISHED_SZ;
6011
0
    }
6012
6013
0
    return length;
6014
0
}
6015
6016
static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
6017
                                                    byte* output, int isRequest)
6018
0
{
6019
0
    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
6020
0
    if (data && data->enabled && data->verifySet) {
6021
        /* client sends client_verify_data only */
6022
0
        XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
6023
0
        offset += TLS_FINISHED_SZ;
6024
6025
        /* server also sends server_verify_data */
6026
0
        if (!isRequest) {
6027
0
            XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
6028
0
            offset += TLS_FINISHED_SZ;
6029
0
        }
6030
0
    }
6031
6032
0
    output[0] = (byte)(offset - 1);  /* info length - self */
6033
6034
0
    return offset;
6035
0
}
6036
6037
static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input,
6038
                                          word16 length, byte isRequest)
6039
0
{
6040
0
    int ret = WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E);
6041
6042
0
    if (length >= OPAQUE8_LEN) {
6043
0
        if (isRequest) {
6044
0
        #ifndef NO_WOLFSSL_SERVER
6045
0
            if (ssl->secure_renegotiation == NULL) {
6046
0
                ret = wolfSSL_UseSecureRenegotiation(ssl);
6047
0
                if (ret == WOLFSSL_SUCCESS)
6048
0
                    ret = 0;
6049
0
            }
6050
0
            if (ret != 0 && ret != WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E)) {
6051
0
            }
6052
0
            else if (ssl->secure_renegotiation == NULL) {
6053
0
            }
6054
0
            else if (!ssl->secure_renegotiation->enabled) {
6055
0
                if (*input == 0) {
6056
0
                    input++; /* get past size */
6057
6058
0
                    ssl->secure_renegotiation->enabled = 1;
6059
0
                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6060
0
                    ret = 0;
6061
0
                }
6062
0
                else {
6063
                    /* already in error state */
6064
0
                    WOLFSSL_MSG("SCR client verify data present");
6065
0
                }
6066
0
            }
6067
0
            else if (*input == TLS_FINISHED_SZ) {
6068
0
                if (length < TLS_FINISHED_SZ + 1) {
6069
0
                    WOLFSSL_MSG("SCR malformed buffer");
6070
0
                    ret = BUFFER_E;
6071
0
                }
6072
0
                else {
6073
0
                    input++; /* get past size */
6074
6075
                    /* validate client verify data */
6076
0
                    if (XMEMCMP(input,
6077
0
                            ssl->secure_renegotiation->client_verify_data,
6078
0
                            TLS_FINISHED_SZ) == 0) {
6079
0
                        WOLFSSL_MSG("SCR client verify data match");
6080
0
                        TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6081
0
                        ret = 0;  /* verified */
6082
0
                    }
6083
0
                    else {
6084
                        /* already in error state */
6085
0
                        WOLFSSL_MSG("SCR client verify data Failure");
6086
0
                    }
6087
0
                }
6088
0
            }
6089
0
        #endif
6090
0
        }
6091
0
        else if (ssl->secure_renegotiation != NULL) {
6092
0
        #ifndef NO_WOLFSSL_CLIENT
6093
0
            if (!ssl->secure_renegotiation->enabled) {
6094
0
                if (*input == 0) {
6095
0
                    ssl->secure_renegotiation->enabled = 1;
6096
0
                    ret = 0;
6097
0
                }
6098
0
            }
6099
0
            else if (*input == 2 * TLS_FINISHED_SZ &&
6100
0
                     length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
6101
0
                input++;  /* get past size */
6102
6103
                /* validate client and server verify data */
6104
0
                if (XMEMCMP(input,
6105
0
                            ssl->secure_renegotiation->client_verify_data,
6106
0
                            TLS_FINISHED_SZ) == 0 &&
6107
0
                    XMEMCMP(input + TLS_FINISHED_SZ,
6108
0
                            ssl->secure_renegotiation->server_verify_data,
6109
0
                            TLS_FINISHED_SZ) == 0) {
6110
0
                    WOLFSSL_MSG("SCR client and server verify data match");
6111
0
                    ret = 0;  /* verified */
6112
0
                }
6113
0
                else {
6114
                    /* already in error state */
6115
0
                    WOLFSSL_MSG("SCR client and server verify data Failure");
6116
0
                }
6117
0
            }
6118
0
        #endif
6119
0
        }
6120
0
        else {
6121
0
            ret = SECURE_RENEGOTIATION_E;
6122
0
        }
6123
0
    }
6124
0
    else {
6125
0
        ret = SECURE_RENEGOTIATION_E;
6126
0
    }
6127
6128
0
    if (ret != 0) {
6129
0
        WOLFSSL_ERROR_VERBOSE(ret);
6130
0
        SendAlert(ssl, alert_fatal, handshake_failure);
6131
0
    }
6132
6133
0
    return ret;
6134
0
}
6135
6136
int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
6137
0
{
6138
0
    int ret = 0;
6139
0
    SecureRenegotiation* data;
6140
6141
0
    data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
6142
0
                                                             DYNAMIC_TYPE_TLSX);
6143
0
    if (data == NULL)
6144
0
        return MEMORY_E;
6145
6146
0
    XMEMSET(data, 0, sizeof(SecureRenegotiation));
6147
6148
0
    ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
6149
0
    if (ret != 0) {
6150
0
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
6151
0
        return ret;
6152
0
    }
6153
6154
0
    return WOLFSSL_SUCCESS;
6155
0
}
6156
6157
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
6158
6159
int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
6160
0
{
6161
0
    int ret;
6162
6163
    /* send empty renegotiation_info extension */
6164
0
    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6165
0
    if (ext == NULL) {
6166
0
        ret = TLSX_UseSecureRenegotiation(extensions, heap);
6167
0
        if (ret != WOLFSSL_SUCCESS)
6168
0
            return ret;
6169
6170
0
        ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6171
0
    }
6172
0
    if (ext)
6173
0
        ext->resp = 1;
6174
6175
0
    return WOLFSSL_SUCCESS;
6176
0
}
6177
6178
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
6179
6180
6181
0
#define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
6182
0
#define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
6183
0
#define SCR_WRITE          TLSX_SecureRenegotiation_Write
6184
0
#define SCR_PARSE          TLSX_SecureRenegotiation_Parse
6185
6186
#else
6187
6188
#define SCR_FREE_ALL(a, heap) WC_DO_NOTHING
6189
#define SCR_GET_SIZE(a, b)    0
6190
#define SCR_WRITE(a, b, c)    0
6191
#define SCR_PARSE(a, b, c, d) 0
6192
6193
#endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
6194
6195
/******************************************************************************/
6196
/* Session Tickets                                                            */
6197
/******************************************************************************/
6198
6199
#ifdef HAVE_SESSION_TICKET
6200
6201
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
6202
static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl)
6203
{
6204
    TLSX*          extension = TLSX_Find(ssl->extensions, TLSX_SESSION_TICKET);
6205
    SessionTicket* ticket    = extension ?
6206
                                         (SessionTicket*)extension->data : NULL;
6207
6208
    if (ticket) {
6209
        /* TODO validate ticket timeout here! */
6210
        if (ticket->lifetime == 0xfffffff) {
6211
            /* send empty ticket on timeout */
6212
            TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6213
        }
6214
    }
6215
}
6216
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
6217
6218
6219
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
6220
{
6221
    (void)isRequest;
6222
    return ticket ? ticket->size : 0;
6223
}
6224
6225
static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
6226
                                       int isRequest)
6227
{
6228
    word16 offset = 0; /* empty ticket */
6229
6230
    if (isRequest && ticket) {
6231
        XMEMCPY(output + offset, ticket->data, ticket->size);
6232
        offset += ticket->size;
6233
    }
6234
6235
    return offset;
6236
}
6237
6238
6239
static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, const byte* input,
6240
                                    word16 length, byte isRequest)
6241
{
6242
    int ret = 0;
6243
6244
    (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
6245
6246
    if (!isRequest) {
6247
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
6248
            return TLSX_HandleUnsupportedExtension(ssl);
6249
6250
        if (length != 0)
6251
            return BUFFER_ERROR;
6252
6253
#ifndef NO_WOLFSSL_CLIENT
6254
        ssl->expect_session_ticket = 1;
6255
#endif
6256
    }
6257
#ifndef NO_WOLFSSL_SERVER
6258
    else {
6259
        /* server side */
6260
        if (ssl->ctx->ticketEncCb == NULL) {
6261
            WOLFSSL_MSG("Client sent session ticket, server has no callback");
6262
            return 0;
6263
        }
6264
6265
#ifdef HAVE_SECURE_RENEGOTIATION
6266
        if (IsSCR(ssl)) {
6267
            WOLFSSL_MSG("Client sent session ticket during SCR. Ignoring.");
6268
            return 0;
6269
        }
6270
#endif
6271
6272
        if (length > SESSION_TICKET_LEN) {
6273
            ret = BAD_TICKET_MSG_SZ;
6274
            WOLFSSL_ERROR_VERBOSE(ret);
6275
        } else if (IsAtLeastTLSv1_3(ssl->version)) {
6276
            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
6277
            ssl->options.rejectTicket = 1;
6278
            ret = 0;  /* not fatal */
6279
        } else if (ssl->options.noTicketTls12) {
6280
            /* ignore ticket request */
6281
        } else if (length == 0) {
6282
            /* blank ticket */
6283
            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6284
            if (ret == WOLFSSL_SUCCESS) {
6285
                ret = 0;
6286
                /* send blank ticket */
6287
                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6288
                ssl->options.createTicket = 1;  /* will send ticket msg */
6289
                ssl->options.useTicket    = 1;
6290
                ssl->options.resuming     = 0;  /* no standard resumption */
6291
                ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
6292
            }
6293
        } else {
6294
            /* got actual ticket from client */
6295
            ret = DoClientTicket(ssl, input, length);
6296
            if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
6297
                WOLFSSL_MSG("Using existing client ticket");
6298
                ssl->options.useTicket    = 1;
6299
                ssl->options.resuming     = 1;
6300
                /* SERVER: ticket is peer auth. */
6301
                ssl->options.peerAuthGood = 1;
6302
            } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
6303
                WOLFSSL_MSG("Using existing client ticket, creating new one");
6304
                ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6305
                if (ret == WOLFSSL_SUCCESS) {
6306
                    ret = 0;
6307
                    TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6308
                                                    /* send blank ticket */
6309
                    ssl->options.createTicket = 1;  /* will send ticket msg */
6310
                    ssl->options.useTicket    = 1;
6311
                    ssl->options.resuming     = 1;
6312
                    /* SERVER: ticket is peer auth. */
6313
                    ssl->options.peerAuthGood = 1;
6314
                }
6315
            } else if (ret == WOLFSSL_TICKET_RET_REJECT ||
6316
                    ret == WC_NO_ERR_TRACE(VERSION_ERROR)) {
6317
                WOLFSSL_MSG("Process client ticket rejected, not using");
6318
                if (ret == WC_NO_ERR_TRACE(VERSION_ERROR))
6319
                    WOLFSSL_MSG("\tbad TLS version");
6320
                ret = 0;  /* not fatal */
6321
6322
                ssl->options.rejectTicket = 1;
6323
                /* If we have session tickets enabled then send a new ticket */
6324
                if (!TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET)) {
6325
                    ret = TLSX_UseSessionTicket(&ssl->extensions, NULL,
6326
                                                ssl->heap);
6327
                    if (ret == WOLFSSL_SUCCESS) {
6328
                        ret = 0;
6329
                        TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6330
                        ssl->options.createTicket = 1;
6331
                        ssl->options.useTicket    = 1;
6332
                    }
6333
                }
6334
            } else if (ret == WOLFSSL_TICKET_RET_FATAL) {
6335
                WOLFSSL_MSG("Process client ticket fatal error, not using");
6336
            } else if (ret < 0) {
6337
                WOLFSSL_MSG("Process client ticket unknown error, not using");
6338
            }
6339
        }
6340
    }
6341
#endif /* NO_WOLFSSL_SERVER */
6342
6343
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
6344
    (void)ssl;
6345
#endif
6346
6347
    return ret;
6348
}
6349
6350
WOLFSSL_LOCAL SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
6351
                                            byte* data, word16 size, void* heap)
6352
{
6353
    SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
6354
                                                       heap, DYNAMIC_TYPE_TLSX);
6355
    if (ticket) {
6356
        ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
6357
        if (ticket->data == NULL) {
6358
            XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
6359
            return NULL;
6360
        }
6361
6362
        XMEMCPY(ticket->data, data, size);
6363
        ticket->size     = size;
6364
        ticket->lifetime = lifetime;
6365
    }
6366
6367
    (void)heap;
6368
6369
    return ticket;
6370
}
6371
WOLFSSL_LOCAL void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
6372
{
6373
    if (ticket) {
6374
        XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
6375
        XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
6376
    }
6377
6378
    (void)heap;
6379
}
6380
6381
int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
6382
{
6383
    int ret = 0;
6384
6385
    if (extensions == NULL)
6386
        return BAD_FUNC_ARG;
6387
6388
    /* If the ticket is NULL, the client will request a new ticket from the
6389
       server. Otherwise, the client will use it in the next client hello. */
6390
    if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
6391
                                                                           != 0)
6392
        return ret;
6393
6394
    return WOLFSSL_SUCCESS;
6395
}
6396
6397
#define WOLF_STK_VALIDATE_REQUEST TLSX_SessionTicket_ValidateRequest
6398
#define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
6399
#define WOLF_STK_WRITE            TLSX_SessionTicket_Write
6400
#define WOLF_STK_PARSE            TLSX_SessionTicket_Parse
6401
#define WOLF_STK_FREE(stk, heap)  TLSX_SessionTicket_Free((SessionTicket*)(stk),(heap))
6402
6403
#else
6404
6405
0
#define WOLF_STK_FREE(a, b) WC_DO_NOTHING
6406
0
#define WOLF_STK_VALIDATE_REQUEST(a) WC_DO_NOTHING
6407
0
#define WOLF_STK_GET_SIZE(a, b)      0
6408
0
#define WOLF_STK_WRITE(a, b, c)      0
6409
0
#define WOLF_STK_PARSE(a, b, c, d)   0
6410
6411
#endif /* HAVE_SESSION_TICKET */
6412
6413
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
6414
/******************************************************************************/
6415
/* Encrypt-then-MAC                                                           */
6416
/******************************************************************************/
6417
6418
#ifndef WOLFSSL_NO_TLS12
6419
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl);
6420
6421
/**
6422
 * Get the size of the Encrypt-Then-MAC extension.
6423
 *
6424
 * msgType  Type of message to put extension into.
6425
 * pSz      Size of extension data.
6426
 * return SANITY_MSG_E when the message is not allowed to have extension and
6427
 *        0 otherwise.
6428
 */
6429
static int TLSX_EncryptThenMac_GetSize(byte msgType, word16* pSz)
6430
0
{
6431
0
    (void)pSz;
6432
6433
0
    if (msgType != client_hello && msgType != server_hello) {
6434
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6435
0
        return SANITY_MSG_E;
6436
0
    }
6437
6438
    /* Empty extension */
6439
6440
0
    return 0;
6441
0
}
6442
6443
/**
6444
 * Write the Encrypt-Then-MAC extension.
6445
 *
6446
 * data     Unused
6447
 * output   Extension data buffer. Unused.
6448
 * msgType  Type of message to put extension into.
6449
 * pSz      Size of extension data.
6450
 * return SANITY_MSG_E when the message is not allowed to have extension and
6451
 *        0 otherwise.
6452
 */
6453
static int TLSX_EncryptThenMac_Write(void* data, byte* output, byte msgType,
6454
                                     word16* pSz)
6455
0
{
6456
0
    (void)data;
6457
0
    (void)output;
6458
0
    (void)pSz;
6459
6460
0
    if (msgType != client_hello && msgType != server_hello) {
6461
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6462
0
        return SANITY_MSG_E;
6463
0
    }
6464
6465
    /* Empty extension */
6466
6467
0
    return 0;
6468
0
}
6469
6470
/**
6471
 * Parse the Encrypt-Then-MAC extension.
6472
 *
6473
 * ssl      SSL object
6474
 * input    Extension data buffer.
6475
 * length   Length of this extension's data.
6476
 * msgType  Type of message to extension appeared in.
6477
 * return SANITY_MSG_E when the message is not allowed to have extension,
6478
 *        BUFFER_ERROR when the extension's data is invalid,
6479
 *        MEMORY_E when unable to allocate memory and
6480
 *        0 otherwise.
6481
 */
6482
static int TLSX_EncryptThenMac_Parse(WOLFSSL* ssl, const byte* input,
6483
                                     word16 length, byte msgType)
6484
0
{
6485
0
    int ret;
6486
6487
0
    (void)input;
6488
6489
0
    if (msgType != client_hello && msgType != server_hello) {
6490
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6491
0
        return SANITY_MSG_E;
6492
0
    }
6493
6494
    /* Empty extension */
6495
0
    if (length != 0)
6496
0
        return BUFFER_ERROR;
6497
6498
0
    if (msgType == client_hello) {
6499
        /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
6500
0
        if (!ssl->options.disallowEncThenMac) {
6501
0
            ssl->options.encThenMac = 1;
6502
            /* Set the extension reply. */
6503
0
            ret = TLSX_EncryptThenMac_Use(ssl);
6504
0
            if (ret != 0)
6505
0
                return ret;
6506
0
        }
6507
0
        return 0;
6508
0
    }
6509
6510
    /* Server Hello */
6511
0
    if (ssl->options.disallowEncThenMac) {
6512
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6513
0
        return SANITY_MSG_E;
6514
0
    }
6515
6516
0
    ssl->options.encThenMac = 1;
6517
0
    return 0;
6518
6519
0
}
6520
6521
/**
6522
 * Add the Encrypt-Then-MAC extension to list.
6523
 *
6524
 * ssl      SSL object
6525
 * return MEMORY_E when unable to allocate memory and 0 otherwise.
6526
 */
6527
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl)
6528
0
{
6529
0
    int   ret = 0;
6530
0
    TLSX* extension;
6531
6532
    /* Find the Encrypt-Then-Mac extension if it exists. */
6533
0
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6534
0
    if (extension == NULL) {
6535
        /* Push new Encrypt-Then-Mac extension. */
6536
0
        ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
6537
0
            ssl->heap);
6538
0
        if (ret != 0)
6539
0
            return ret;
6540
0
    }
6541
6542
0
    return 0;
6543
0
}
6544
6545
/**
6546
 * Set the Encrypt-Then-MAC extension as one to respond too.
6547
 *
6548
 * ssl      SSL object
6549
 * return EXT_MISSING when EncryptThenMac extension not in list.
6550
 */
6551
int TLSX_EncryptThenMac_Respond(WOLFSSL* ssl)
6552
0
{
6553
0
    TLSX* extension;
6554
6555
0
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6556
0
    if (extension == NULL)
6557
0
        return EXT_MISSING;
6558
0
    extension->resp = 1;
6559
6560
0
    return 0;
6561
0
}
6562
6563
0
#define ETM_GET_SIZE  TLSX_EncryptThenMac_GetSize
6564
0
#define ETM_WRITE     TLSX_EncryptThenMac_Write
6565
0
#define ETM_PARSE     TLSX_EncryptThenMac_Parse
6566
6567
#else
6568
6569
#define ETM_GET_SIZE(a, b)    0
6570
#define ETM_WRITE(a, b, c, d) 0
6571
#define ETM_PARSE(a, b, c, d) 0
6572
6573
#endif /* !WOLFSSL_NO_TLS12 */
6574
6575
#endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
6576
6577
6578
#ifdef WOLFSSL_SRTP
6579
6580
/******************************************************************************/
6581
/* DTLS SRTP (Secure Real-time Transport Protocol)                            */
6582
/******************************************************************************/
6583
6584
/* Only support single SRTP profile */
6585
typedef struct TlsxSrtp {
6586
    word16 profileCount;
6587
    word16 ids; /* selected bits */
6588
} TlsxSrtp;
6589
6590
static int TLSX_UseSRTP_GetSize(TlsxSrtp *srtp)
6591
{
6592
    /*   SRTP Profile Len (2)
6593
     *      SRTP Profiles (2)
6594
     *   MKI (master key id) Length */
6595
    return (OPAQUE16_LEN + (srtp->profileCount * OPAQUE16_LEN) + 1);
6596
}
6597
6598
static TlsxSrtp* TLSX_UseSRTP_New(word16 ids, void* heap)
6599
{
6600
    TlsxSrtp* srtp;
6601
    int i;
6602
6603
    srtp = (TlsxSrtp*)XMALLOC(sizeof(TlsxSrtp), heap, DYNAMIC_TYPE_TLSX);
6604
    if (srtp == NULL) {
6605
        WOLFSSL_MSG("TLSX SRTP Memory failure");
6606
        return NULL;
6607
    }
6608
6609
    /* count and test each bit set */
6610
    srtp->profileCount = 0;
6611
    for (i=0; i<16; i++) {
6612
        if (ids & (1 << i)) {
6613
            srtp->profileCount++;
6614
        }
6615
    }
6616
    srtp->ids = ids;
6617
6618
    return srtp;
6619
}
6620
6621
static void TLSX_UseSRTP_Free(TlsxSrtp *srtp, void* heap)
6622
{
6623
    XFREE(srtp, heap, DYNAMIC_TYPE_TLSX);
6624
    (void)heap;
6625
}
6626
6627
static int TLSX_UseSRTP_Parse(WOLFSSL* ssl, const byte* input, word16 length,
6628
    byte isRequest)
6629
{
6630
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
6631
    word16 profile_len = 0;
6632
    word16 profile_value = 0;
6633
    word16 offset = 0;
6634
#ifndef NO_WOLFSSL_SERVER
6635
    int i;
6636
    TlsxSrtp* srtp = NULL;
6637
#endif
6638
6639
    if (length < OPAQUE16_LEN) {
6640
        return BUFFER_ERROR;
6641
    }
6642
6643
    /* reset selected DTLS SRTP profile ID */
6644
    ssl->dtlsSrtpId = 0;
6645
6646
    /* total length, not include itself */
6647
    ato16(input, &profile_len);
6648
    offset += OPAQUE16_LEN;
6649
6650
    if (!isRequest) {
6651
#ifndef NO_WOLFSSL_CLIENT
6652
        if (length < offset + OPAQUE16_LEN)
6653
            return BUFFER_ERROR;
6654
6655
        ato16(input + offset, &profile_value);
6656
6657
        /* check that the profile received was in the ones we support */
6658
        if (profile_value < 16 &&
6659
                               (ssl->dtlsSrtpProfiles & (1 << profile_value))) {
6660
            ssl->dtlsSrtpId = profile_value;
6661
            ret = 0; /* success */
6662
        }
6663
#endif
6664
    }
6665
#ifndef NO_WOLFSSL_SERVER
6666
    else {
6667
        /* parse remainder one profile at a time, looking for match in CTX */
6668
        ret = 0;
6669
        for (i=offset; i<length; i+=OPAQUE16_LEN) {
6670
            if (length < (i + OPAQUE16_LEN)) {
6671
                WOLFSSL_MSG("Unexpected length when parsing SRTP profile");
6672
                ret = BUFFER_ERROR;
6673
                break;
6674
            }
6675
6676
            ato16(input+i, &profile_value);
6677
            /* find first match */
6678
            if (profile_value < 16 &&
6679
                                 ssl->dtlsSrtpProfiles & (1 << profile_value)) {
6680
                ssl->dtlsSrtpId = profile_value;
6681
6682
                /* make sure we respond with selected SRTP id selected */
6683
                srtp = TLSX_UseSRTP_New((1 << profile_value), ssl->heap);
6684
                if (srtp != NULL) {
6685
                    ret = TLSX_Push(&ssl->extensions, TLSX_USE_SRTP,
6686
                        (void*)srtp, ssl->heap);
6687
                    if (ret == 0) {
6688
                        TLSX_SetResponse(ssl, TLSX_USE_SRTP);
6689
                        /* successfully set extension */
6690
                    }
6691
                }
6692
                else {
6693
                    ret = MEMORY_E;
6694
                }
6695
                break;
6696
            }
6697
        }
6698
    }
6699
6700
    if (ret == 0 && ssl->dtlsSrtpId == 0) {
6701
        WOLFSSL_MSG("TLSX_UseSRTP_Parse profile not found!");
6702
        /* not fatal */
6703
    }
6704
    else if (ret != 0) {
6705
        ssl->dtlsSrtpId = 0;
6706
        TLSX_UseSRTP_Free(srtp, ssl->heap);
6707
    }
6708
#endif
6709
    (void)profile_len;
6710
6711
    return ret;
6712
}
6713
6714
static word16 TLSX_UseSRTP_Write(TlsxSrtp* srtp, byte* output)
6715
{
6716
    word16 offset = 0;
6717
    int i, j;
6718
6719
    c16toa(srtp->profileCount * 2, output + offset);
6720
    offset += OPAQUE16_LEN;
6721
    j = 0;
6722
    for (i = 0; i < srtp->profileCount; i++) {
6723
        for (; j < 16; j++) {
6724
            if (srtp->ids & (1 << j)) {
6725
                c16toa(j, output + offset);
6726
                offset += OPAQUE16_LEN;
6727
            }
6728
        }
6729
    }
6730
    output[offset++] = 0x00; /* MKI Length */
6731
6732
    return offset;
6733
}
6734
6735
static int TLSX_UseSRTP(TLSX** extensions, word16 profiles, void* heap)
6736
{
6737
    int ret = 0;
6738
    TLSX* extension;
6739
6740
    if (extensions == NULL) {
6741
        return BAD_FUNC_ARG;
6742
    }
6743
6744
    extension = TLSX_Find(*extensions, TLSX_USE_SRTP);
6745
    if (extension == NULL) {
6746
        TlsxSrtp* srtp = TLSX_UseSRTP_New(profiles, heap);
6747
        if (srtp == NULL) {
6748
            return MEMORY_E;
6749
        }
6750
6751
        ret = TLSX_Push(extensions, TLSX_USE_SRTP, (void*)srtp, heap);
6752
        if (ret != 0) {
6753
            TLSX_UseSRTP_Free(srtp, heap);
6754
        }
6755
    }
6756
6757
    return ret;
6758
}
6759
6760
#ifndef NO_WOLFSSL_SERVER
6761
    #define SRTP_FREE     TLSX_UseSRTP_Free
6762
    #define SRTP_PARSE    TLSX_UseSRTP_Parse
6763
    #define SRTP_WRITE    TLSX_UseSRTP_Write
6764
    #define SRTP_GET_SIZE TLSX_UseSRTP_GetSize
6765
#else
6766
    #define SRTP_FREE(a, b) WC_DO_NOTHING
6767
    #define SRTP_PARSE(a, b, c, d)      0
6768
    #define SRTP_WRITE(a, b)            0
6769
    #define SRTP_GET_SIZE(a)            0
6770
#endif
6771
6772
#endif /* WOLFSSL_SRTP */
6773
6774
6775
/******************************************************************************/
6776
/* Supported Versions                                                         */
6777
/******************************************************************************/
6778
6779
#ifdef WOLFSSL_TLS13
6780
static WC_INLINE int versionIsGreater(byte isDtls, byte a, byte b)
6781
0
{
6782
0
    (void)isDtls;
6783
6784
#ifdef WOLFSSL_DTLS
6785
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6786
    if (isDtls)
6787
        return a < b;
6788
#endif /* WOLFSSL_DTLS */
6789
6790
0
    return a > b;
6791
0
}
6792
6793
static WC_INLINE int versionIsLesser(byte isDtls, byte a, byte b)
6794
0
{
6795
0
    (void)isDtls;
6796
6797
#ifdef WOLFSSL_DTLS
6798
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6799
    if (isDtls)
6800
        return a > b;
6801
#endif /* WOLFSSL_DTLS */
6802
6803
0
    return a < b;
6804
0
}
6805
6806
static WC_INLINE int versionIsAtLeast(byte isDtls, byte a, byte b)
6807
0
{
6808
0
    (void)isDtls;
6809
6810
#ifdef WOLFSSL_DTLS
6811
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6812
    if (isDtls)
6813
        return a <= b;
6814
#endif /* WOLFSSL_DTLS */
6815
6816
0
    return a >= b;
6817
0
}
6818
6819
static WC_INLINE int versionIsLessEqual(byte isDtls, byte a, byte b)
6820
0
{
6821
0
    (void)isDtls;
6822
6823
#ifdef WOLFSSL_DTLS
6824
    /* DTLS version increases backwards (-1,-2,-3,etc) */
6825
    if (isDtls)
6826
        return a >= b;
6827
#endif /* WOLFSSL_DTLS */
6828
6829
0
    return a <= b;
6830
0
}
6831
6832
/* Return the size of the SupportedVersions extension's data.
6833
 *
6834
 * data       The SSL/TLS object.
6835
 * msgType The type of the message this extension is being written into.
6836
 * returns the length of data that will be in the extension.
6837
 */
6838
static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
6839
0
{
6840
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6841
0
    byte tls13Minor, tls12Minor, tls11Minor, isDtls;
6842
6843
0
    isDtls = !!ssl->options.dtls;
6844
0
    tls13Minor = (byte)(isDtls ? DTLSv1_3_MINOR : TLSv1_3_MINOR);
6845
0
    tls12Minor = (byte)(isDtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR);
6846
0
    tls11Minor = (byte)(isDtls ? DTLS_MINOR : TLSv1_1_MINOR);
6847
6848
    /* unused on some configuration */
6849
0
    (void)tls12Minor;
6850
0
    (void)tls13Minor;
6851
0
    (void)tls11Minor;
6852
6853
0
    if (msgType == client_hello) {
6854
        /* TLS v1.2 and TLS v1.3  */
6855
0
        int cnt = 0;
6856
6857
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13Minor)
6858
        #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6859
            defined(WOLFSSL_WPAS_SMALL)
6860
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
6861
        #endif
6862
0
        ) {
6863
0
            cnt++;
6864
0
        }
6865
6866
0
        if (ssl->options.downgrade) {
6867
0
    #ifndef WOLFSSL_NO_TLS12
6868
0
            if (versionIsLessEqual(
6869
0
                    isDtls, ssl->options.minDowngrade, tls12Minor)
6870
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6871
    defined(WOLFSSL_WPAS_SMALL)
6872
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
6873
#endif
6874
0
            ) {
6875
0
                cnt++;
6876
0
            }
6877
0
#endif
6878
    #ifndef NO_OLD_TLS
6879
            if (versionIsLessEqual(
6880
                    isDtls, ssl->options.minDowngrade, tls11Minor)
6881
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6882
                defined(WOLFSSL_WPAS_SMALL)
6883
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
6884
            #endif
6885
            ) {
6886
                cnt++;
6887
            }
6888
        #ifdef WOLFSSL_ALLOW_TLSV10
6889
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
6890
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6891
                defined(WOLFSSL_WPAS_SMALL)
6892
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
6893
            #endif
6894
            ) {
6895
                cnt++;
6896
            }
6897
        #endif
6898
    #endif
6899
0
        }
6900
6901
0
        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
6902
0
    }
6903
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6904
0
        *pSz += OPAQUE16_LEN;
6905
0
    }
6906
0
    else {
6907
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6908
0
        return SANITY_MSG_E;
6909
0
    }
6910
6911
0
    return 0;
6912
0
}
6913
6914
/* Writes the SupportedVersions extension into the buffer.
6915
 *
6916
 * data    The SSL/TLS object.
6917
 * output  The buffer to write the extension into.
6918
 * msgType The type of the message this extension is being written into.
6919
 * returns the length of data that was written.
6920
 */
6921
static int TLSX_SupportedVersions_Write(void* data, byte* output,
6922
                                        byte msgType, word16* pSz)
6923
0
{
6924
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6925
0
    byte tls13minor, tls12minor, tls11minor, isDtls = 0;
6926
6927
0
    tls13minor = (byte)TLSv1_3_MINOR;
6928
0
    tls12minor = (byte)TLSv1_2_MINOR;
6929
0
    tls11minor = (byte)TLSv1_1_MINOR;
6930
6931
    /* unused in some configuration */
6932
0
    (void)tls11minor;
6933
0
    (void)tls12minor;
6934
6935
#ifdef WOLFSSL_DTLS13
6936
    if (ssl->options.dtls) {
6937
        tls13minor = (byte)DTLSv1_3_MINOR;
6938
    #ifndef WOLFSSL_NO_TLS12
6939
        tls12minor = (byte)DTLSv1_2_MINOR;
6940
    #endif
6941
    #ifndef NO_OLD_TLS
6942
        tls11minor = (byte)DTLS_MINOR;
6943
    #endif
6944
        isDtls = 1;
6945
    }
6946
#endif /* WOLFSSL_DTLS13 */
6947
6948
0
    if (msgType == client_hello) {
6949
0
        byte major = ssl->ctx->method->version.major;
6950
6951
0
        byte* cnt = output++;
6952
0
        *cnt = 0;
6953
6954
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13minor)
6955
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6956
    defined(WOLFSSL_WPAS_SMALL)
6957
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
6958
#endif
6959
0
        ) {
6960
0
            *cnt += OPAQUE16_LEN;
6961
        #ifdef WOLFSSL_TLS13_DRAFT
6962
            /* The TLS draft major number. */
6963
            *(output++) = TLS_DRAFT_MAJOR;
6964
            /* Version of draft supported. */
6965
            *(output++) = TLS_DRAFT_MINOR;
6966
        #else
6967
0
            *(output++) = major;
6968
0
            *(output++) = tls13minor;
6969
0
        #endif
6970
0
        }
6971
6972
0
        if (ssl->options.downgrade) {
6973
0
        #ifndef WOLFSSL_NO_TLS12
6974
0
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls12minor)
6975
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6976
                defined(WOLFSSL_WPAS_SMALL)
6977
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
6978
            #endif
6979
0
            ) {
6980
0
                *cnt += OPAQUE16_LEN;
6981
0
                *(output++) = major;
6982
0
                *(output++) = tls12minor;
6983
0
            }
6984
0
        #endif
6985
6986
    #ifndef NO_OLD_TLS
6987
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls11minor)
6988
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6989
                defined(WOLFSSL_WPAS_SMALL)
6990
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == 0
6991
            #endif
6992
            ) {
6993
                *cnt += OPAQUE16_LEN;
6994
                *(output++) = major;
6995
                *(output++) = tls11minor;
6996
            }
6997
        #ifdef WOLFSSL_ALLOW_TLSV10
6998
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
6999
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
7000
                defined(WOLFSSL_WPAS_SMALL)
7001
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == 0
7002
            #endif
7003
            ) {
7004
                *cnt += OPAQUE16_LEN;
7005
                *(output++) = major;
7006
                *(output++) = (byte)TLSv1_MINOR;
7007
            }
7008
        #endif
7009
    #endif
7010
0
        }
7011
7012
0
        *pSz += (word16)(OPAQUE8_LEN + *cnt);
7013
0
    }
7014
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7015
0
        output[0] = ssl->version.major;
7016
0
        output[1] = ssl->version.minor;
7017
7018
0
        *pSz += OPAQUE16_LEN;
7019
0
    }
7020
0
    else {
7021
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7022
0
        return SANITY_MSG_E;
7023
0
    }
7024
7025
0
    return 0;
7026
0
}
7027
7028
/* Parse the SupportedVersions extension.
7029
 *
7030
 * ssl     The SSL/TLS object.
7031
 * input   The buffer with the extension data.
7032
 * length  The length of the extension data.
7033
 * msgType The type of the message this extension is being parsed from.
7034
 * pv      The output ProtocolVersion for the negotiated version
7035
 * opts    The output options structure. Can be NULL.
7036
 * exts    The output extensions list. Can be NULL.
7037
 * returns 0 on success, otherwise failure.
7038
 */
7039
int TLSX_SupportedVersions_Parse(const WOLFSSL* ssl, const byte* input,
7040
        word16 length, byte msgType, ProtocolVersion* pv, Options* opts,
7041
        TLSX** exts)
7042
0
{
7043
    /* The client's greatest minor version that we support */
7044
0
    byte clientGreatestMinor = SSLv3_MINOR;
7045
0
    int ret;
7046
0
    byte major, minor;
7047
0
    byte tls13minor, tls12minor;
7048
0
    byte isDtls;
7049
7050
0
    tls13minor = TLSv1_3_MINOR;
7051
0
    tls12minor = TLSv1_2_MINOR;
7052
0
    isDtls = ssl->options.dtls == 1;
7053
7054
#ifdef WOLFSSL_DTLS13
7055
    if (ssl->options.dtls) {
7056
        tls13minor = DTLSv1_3_MINOR;
7057
        tls12minor = DTLSv1_2_MINOR;
7058
        clientGreatestMinor = DTLS_MINOR;
7059
    }
7060
#endif /* WOLFSSL_DTLS13 */
7061
7062
0
    if (msgType == client_hello) {
7063
0
        int i;
7064
0
        int len;
7065
0
        int set = 0;
7066
7067
        /* Must contain a length and at least one version. */
7068
0
        if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1)
7069
0
            return BUFFER_ERROR;
7070
7071
0
        len = *input;
7072
7073
        /* Protocol version array must fill rest of data. */
7074
0
        if (length != (word16)OPAQUE8_LEN + len)
7075
0
            return BUFFER_ERROR;
7076
7077
0
        input++;
7078
7079
        /* Find first match. */
7080
0
        for (i = 0; i < len; i += OPAQUE16_LEN) {
7081
0
            major = input[i];
7082
0
            minor = input[i + OPAQUE8_LEN];
7083
7084
#ifdef WOLFSSL_TLS13_DRAFT
7085
            if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
7086
                major = SSLv3_MAJOR;
7087
                minor = TLSv1_3_MINOR;
7088
            }
7089
#else
7090
0
            if (major == TLS_DRAFT_MAJOR)
7091
0
                continue;
7092
0
#endif
7093
7094
0
            if (major != ssl->ctx->method->version.major)
7095
0
                continue;
7096
7097
            /* No upgrade allowed. */
7098
0
            if (versionIsGreater(isDtls, minor, ssl->version.minor))
7099
0
                continue;
7100
7101
            /* Check downgrade. */
7102
0
            if (versionIsLesser(isDtls, minor, ssl->version.minor)) {
7103
0
                if (!ssl->options.downgrade)
7104
0
                    continue;
7105
7106
0
                if (versionIsLesser(isDtls, minor, ssl->options.minDowngrade))
7107
0
                    continue;
7108
0
            }
7109
0
            if (versionIsGreater(isDtls, minor, clientGreatestMinor))
7110
0
                clientGreatestMinor = minor;
7111
7112
0
            set = 1;
7113
0
        }
7114
0
        if (!set) {
7115
            /* No common supported version was negotiated */
7116
0
            SendAlert((WOLFSSL*)ssl, alert_fatal,
7117
0
                      wolfssl_alert_protocol_version);
7118
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7119
0
            return VERSION_ERROR;
7120
0
        }
7121
0
        pv->minor = clientGreatestMinor;
7122
0
        if (versionIsAtLeast(isDtls, clientGreatestMinor, tls13minor)) {
7123
0
            if (opts != NULL)
7124
0
                opts->tls1_3 = 1;
7125
7126
            /* TLS v1.3 requires supported version extension */
7127
0
            if (exts != NULL &&
7128
0
                    TLSX_Find(*exts, TLSX_SUPPORTED_VERSIONS) == NULL) {
7129
0
                ret = TLSX_Push(exts,
7130
0
                          TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
7131
0
                if (ret != 0) {
7132
0
                    return ret;
7133
0
                }
7134
                /* *exts should be pointing to the TLSX_SUPPORTED_VERSIONS
7135
                 * ext in the list since it was pushed. */
7136
0
                (*exts)->resp = 1;
7137
0
            }
7138
0
        }
7139
7140
0
    }
7141
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
7142
        /* Must contain one version. */
7143
0
        if (length != OPAQUE16_LEN)
7144
0
            return BUFFER_ERROR;
7145
7146
0
        major = input[0];
7147
0
        minor = input[OPAQUE8_LEN];
7148
7149
0
        if (major != ssl->ctx->method->version.major) {
7150
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7151
0
            return VERSION_ERROR;
7152
0
        }
7153
7154
        /* Can't downgrade with this extension below TLS v1.3. */
7155
0
        if (versionIsLesser(isDtls, minor, tls13minor)) {
7156
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7157
0
            return VERSION_ERROR;
7158
0
        }
7159
7160
        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
7161
0
        if (ssl->options.downgrade && ssl->version.minor == tls12minor) {
7162
            /* Set minor version back to TLS v1.3+ */
7163
0
            pv->minor = ssl->ctx->method->version.minor;
7164
0
        }
7165
7166
        /* No upgrade allowed. */
7167
0
        if (versionIsLesser(isDtls, ssl->version.minor, minor)) {
7168
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7169
0
            return VERSION_ERROR;
7170
0
        }
7171
7172
        /* Check downgrade. */
7173
0
        if (versionIsGreater(isDtls, ssl->version.minor, minor)) {
7174
0
            if (!ssl->options.downgrade) {
7175
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7176
0
                return VERSION_ERROR;
7177
0
            }
7178
7179
0
            if (versionIsLesser(
7180
0
                    isDtls, minor, ssl->options.minDowngrade)) {
7181
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7182
0
                return VERSION_ERROR;
7183
0
            }
7184
7185
            /* Downgrade the version. */
7186
0
            pv->minor = minor;
7187
0
        }
7188
0
    }
7189
0
    else {
7190
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7191
0
        return SANITY_MSG_E;
7192
0
    }
7193
7194
0
    return 0;
7195
0
}
7196
7197
/* Sets a new SupportedVersions extension into the extension list.
7198
 *
7199
 * extensions  The list of extensions.
7200
 * data        The extensions specific data.
7201
 * heap        The heap used for allocation.
7202
 * returns 0 on success, otherwise failure.
7203
 */
7204
static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
7205
                                     void* heap)
7206
0
{
7207
0
    if (extensions == NULL || data == NULL)
7208
0
        return BAD_FUNC_ARG;
7209
7210
0
    return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, data, heap);
7211
0
}
7212
7213
0
#define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
7214
0
#define SV_WRITE     TLSX_SupportedVersions_Write
7215
0
#define SV_PARSE     TLSX_SupportedVersions_Parse
7216
7217
#else
7218
7219
#define SV_GET_SIZE(a, b, c) 0
7220
#define SV_WRITE(a, b, c, d) 0
7221
#define SV_PARSE(a, b, c, d, e, f, g) 0
7222
7223
#endif /* WOLFSSL_TLS13 */
7224
7225
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
7226
7227
/******************************************************************************/
7228
/* Cookie                                                                     */
7229
/******************************************************************************/
7230
7231
/* Free the cookie data.
7232
 *
7233
 * cookie  Cookie data.
7234
 * heap    The heap used for allocation.
7235
 */
7236
static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
7237
{
7238
    (void)heap;
7239
7240
    XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
7241
}
7242
7243
/* Get the size of the encoded Cookie extension.
7244
 * In messages: ClientHello and HelloRetryRequest.
7245
 *
7246
 * cookie   The cookie to write.
7247
 * msgType  The type of the message this extension is being written into.
7248
 * returns the number of bytes of the encoded Cookie extension.
7249
 */
7250
static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
7251
{
7252
    if (msgType == client_hello || msgType == hello_retry_request) {
7253
        *pSz += OPAQUE16_LEN + cookie->len;
7254
    }
7255
    else {
7256
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7257
        return SANITY_MSG_E;
7258
    }
7259
    return 0;
7260
}
7261
7262
/* Writes the Cookie extension into the output buffer.
7263
 * Assumes that the the output buffer is big enough to hold data.
7264
 * In messages: ClientHello and HelloRetryRequest.
7265
 *
7266
 * cookie   The cookie to write.
7267
 * output   The buffer to write into.
7268
 * msgType  The type of the message this extension is being written into.
7269
 * returns the number of bytes written into the buffer.
7270
 */
7271
static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType,
7272
                             word16* pSz)
7273
{
7274
    if (msgType == client_hello || msgType == hello_retry_request) {
7275
        c16toa(cookie->len, output);
7276
        output += OPAQUE16_LEN;
7277
        XMEMCPY(output, cookie->data, cookie->len);
7278
        *pSz += OPAQUE16_LEN + cookie->len;
7279
    }
7280
    else {
7281
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7282
        return SANITY_MSG_E;
7283
    }
7284
    return 0;
7285
}
7286
7287
/* Parse the Cookie extension.
7288
 * In messages: ClientHello and HelloRetryRequest.
7289
 *
7290
 * ssl      The SSL/TLS object.
7291
 * input    The extension data.
7292
 * length   The length of the extension data.
7293
 * msgType  The type of the message this extension is being parsed from.
7294
 * returns 0 on success and other values indicate failure.
7295
 */
7296
static int TLSX_Cookie_Parse(WOLFSSL* ssl, const byte* input, word16 length,
7297
                             byte msgType)
7298
{
7299
    word16  len;
7300
    word16  idx = 0;
7301
    TLSX*   extension;
7302
    Cookie* cookie;
7303
7304
    if (msgType != client_hello && msgType != hello_retry_request) {
7305
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7306
        return SANITY_MSG_E;
7307
    }
7308
7309
    /* Message contains length and Cookie which must be at least one byte
7310
     * in length.
7311
     */
7312
    if (length < OPAQUE16_LEN + 1)
7313
        return BUFFER_E;
7314
    ato16(input + idx, &len);
7315
    idx += OPAQUE16_LEN;
7316
    if (length - idx != len)
7317
        return BUFFER_E;
7318
7319
    if (msgType == hello_retry_request)
7320
        return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 1,
7321
                               &ssl->extensions);
7322
7323
    /* client_hello */
7324
    extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
7325
    if (extension == NULL) {
7326
#ifdef WOLFSSL_DTLS13
7327
        if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
7328
            /* Allow a cookie extension with DTLS 1.3 because it is possible
7329
             * that a different SSL instance sent the cookie but we are now
7330
             * receiving it. */
7331
            return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
7332
                                   &ssl->extensions);
7333
        else
7334
#endif
7335
        {
7336
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7337
            return HRR_COOKIE_ERROR;
7338
        }
7339
    }
7340
7341
    cookie = (Cookie*)extension->data;
7342
    if (cookie->len != len || XMEMCMP(cookie->data, input + idx, len) != 0) {
7343
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
7344
        return HRR_COOKIE_ERROR;
7345
    }
7346
7347
    /* Request seen. */
7348
    extension->resp = 0;
7349
7350
    return 0;
7351
}
7352
7353
/* Use the data to create a new Cookie object in the extensions.
7354
 *
7355
 * ssl    SSL/TLS object.
7356
 * data   Cookie data.
7357
 * len    Length of cookie data in bytes.
7358
 * mac    MAC data.
7359
 * macSz  Length of MAC data in bytes.
7360
 * resp   Indicates the extension will go into a response (HelloRetryRequest).
7361
 * returns 0 on success and other values indicate failure.
7362
 */
7363
int TLSX_Cookie_Use(const WOLFSSL* ssl, const byte* data, word16 len, byte* mac,
7364
                    byte macSz, int resp, TLSX** exts)
7365
{
7366
    int     ret = 0;
7367
    TLSX*   extension;
7368
    Cookie* cookie;
7369
7370
    /* Find the cookie extension if it exists. */
7371
    extension = TLSX_Find(*exts, TLSX_COOKIE);
7372
    if (extension == NULL) {
7373
        /* Push new cookie extension. */
7374
        ret = TLSX_Push(exts, TLSX_COOKIE, NULL, ssl->heap);
7375
        if (ret != 0)
7376
            return ret;
7377
7378
        extension = TLSX_Find(*exts, TLSX_COOKIE);
7379
        if (extension == NULL)
7380
            return MEMORY_E;
7381
    }
7382
7383
    cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz, ssl->heap,
7384
                              DYNAMIC_TYPE_TLSX);
7385
    if (cookie == NULL)
7386
        return MEMORY_E;
7387
7388
    cookie->len = len + macSz;
7389
    XMEMCPY(cookie->data, data, len);
7390
    if (mac != NULL)
7391
        XMEMCPY(cookie->data + len, mac, macSz);
7392
7393
    XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
7394
7395
    extension->data = (void*)cookie;
7396
    extension->resp = (byte)resp;
7397
7398
    return 0;
7399
}
7400
7401
#define CKE_FREE_ALL  TLSX_Cookie_FreeAll
7402
#define CKE_GET_SIZE  TLSX_Cookie_GetSize
7403
#define CKE_WRITE     TLSX_Cookie_Write
7404
#define CKE_PARSE     TLSX_Cookie_Parse
7405
7406
#else
7407
7408
#define CKE_FREE_ALL(a, b)    0
7409
#define CKE_GET_SIZE(a, b, c) 0
7410
#define CKE_WRITE(a, b, c, d) 0
7411
#define CKE_PARSE(a, b, c, d) 0
7412
7413
#endif
7414
7415
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && \
7416
    !defined(WOLFSSL_NO_CA_NAMES) && defined(OPENSSL_EXTRA)
7417
/* Currently only settable through compatibility API */
7418
/******************************************************************************/
7419
/* Certificate Authorities                                                       */
7420
/******************************************************************************/
7421
7422
static word16 TLSX_CA_Names_GetSize(void* data)
7423
{
7424
    WOLFSSL* ssl = (WOLFSSL*)data;
7425
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7426
    word16 size = 0;
7427
7428
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
7429
        /* To add support use a different member like ssl->ca_names and
7430
         * add accessor functions:
7431
         * - *_set0_CA_list
7432
         * - *_get0_CA_list */
7433
        WOLFSSL_MSG("We don't currently support sending the client's list.");
7434
        return 0;
7435
    }
7436
7437
    /* Length of names */
7438
    size += OPAQUE16_LEN;
7439
    for (names = SSL_CA_NAMES(ssl); names != NULL; names = names->next) {
7440
        byte seq[MAX_SEQ_SZ];
7441
        WOLFSSL_X509_NAME* name = names->data.name;
7442
7443
        if (name != NULL) {
7444
            /* 16-bit length | SEQ | Len | DER of name */
7445
            size += (word16)(OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
7446
                             name->rawLen);
7447
        }
7448
    }
7449
    return size;
7450
}
7451
7452
static word16 TLSX_CA_Names_Write(void* data, byte* output)
7453
{
7454
    WOLFSSL* ssl = (WOLFSSL*)data;
7455
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7456
    byte* len;
7457
7458
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
7459
        /* To add support use a different member like ssl->ca_names and
7460
         * add accessor functions:
7461
         * - *_set0_CA_list
7462
         * - *_get0_CA_list */
7463
        WOLFSSL_MSG("We don't currently support sending the client's list.");
7464
        return 0;
7465
    }
7466
7467
    /* Reserve space for the length value */
7468
    len = output;
7469
    output += OPAQUE16_LEN;
7470
    for (names = SSL_CA_NAMES(ssl); names != NULL; names = names->next) {
7471
        byte seq[MAX_SEQ_SZ];
7472
        WOLFSSL_X509_NAME* name = names->data.name;
7473
7474
        if (name != NULL) {
7475
            c16toa((word16)name->rawLen +
7476
                   (word16)SetSequence(name->rawLen, seq), output);
7477
            output += OPAQUE16_LEN;
7478
            output += SetSequence(name->rawLen, output);
7479
            XMEMCPY(output, name->raw, name->rawLen);
7480
            output += name->rawLen;
7481
        }
7482
    }
7483
    /* Write the total length */
7484
    c16toa((word16)(output - len - OPAQUE16_LEN), len);
7485
    return (word16)(output - len);
7486
}
7487
7488
static int TLSX_CA_Names_Parse(WOLFSSL *ssl, const byte* input,
7489
                                  word16 length, byte isRequest)
7490
{
7491
    word16 extLen;
7492
7493
    (void)isRequest;
7494
7495
    if (ssl->options.side == WOLFSSL_SERVER_END) {
7496
        /* To add support use a different member like ssl->ca_names and
7497
         * add accessor functions:
7498
         * - *_set0_CA_list
7499
         * - *_get0_CA_list */
7500
        WOLFSSL_MSG("We don't currently support parsing the client's list.");
7501
        return 0;
7502
    }
7503
7504
    if (ssl->client_ca_names != ssl->ctx->client_ca_names)
7505
        wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
7506
    ssl->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
7507
    if (ssl->client_ca_names == NULL)
7508
        return MEMORY_ERROR;
7509
7510
    if (length < OPAQUE16_LEN)
7511
        return BUFFER_ERROR;
7512
7513
    ato16(input, &extLen);
7514
    input += OPAQUE16_LEN;
7515
    length -= OPAQUE16_LEN;
7516
    if (extLen != length)
7517
        return BUFFER_ERROR;
7518
7519
    while (length) {
7520
        word32 idx = 0;
7521
        WOLFSSL_X509_NAME* name = NULL;
7522
        int ret = 0;
7523
        int didInit = FALSE;
7524
        /* Use a DecodedCert struct to get access to GetName to
7525
         * parse DN name */
7526
#ifdef WOLFSSL_SMALL_STACK
7527
        DecodedCert *cert = (DecodedCert *)XMALLOC(
7528
            sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
7529
        if (cert == NULL)
7530
            return MEMORY_ERROR;
7531
#else
7532
        DecodedCert cert[1];
7533
#endif
7534
7535
        if (length < OPAQUE16_LEN) {
7536
            ret = BUFFER_ERROR;
7537
        }
7538
7539
        if (ret == 0) {
7540
            ato16(input, &extLen);
7541
            idx += OPAQUE16_LEN;
7542
7543
            if (idx + extLen > length)
7544
                ret = BUFFER_ERROR;
7545
        }
7546
7547
        if (ret == 0) {
7548
            InitDecodedCert(cert, input + idx, extLen, ssl->heap);
7549
            didInit = TRUE;
7550
            idx += extLen;
7551
            ret = GetName(cert, ASN_SUBJECT, extLen);
7552
        }
7553
7554
        if (ret == 0 && (name = wolfSSL_X509_NAME_new()) == NULL)
7555
            ret = MEMORY_ERROR;
7556
7557
        if (ret == 0) {
7558
            CopyDecodedName(name, cert, ASN_SUBJECT);
7559
            if (wolfSSL_sk_X509_NAME_push(ssl->client_ca_names, name) <= 0)
7560
                ret = MEMORY_ERROR;
7561
        }
7562
7563
        if (didInit)
7564
            FreeDecodedCert(cert);
7565
7566
#ifdef WOLFSSL_SMALL_STACK
7567
        XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
7568
#endif
7569
        if (ret != 0)
7570
            return ret;
7571
7572
        input += idx;
7573
        length -= (word16)idx;
7574
    }
7575
    return 0;
7576
}
7577
7578
#define CAN_GET_SIZE(data)      TLSX_CA_Names_GetSize(data)
7579
#define CAN_WRITE(data, output) TLSX_CA_Names_Write(data, output)
7580
#define CAN_PARSE(ssl, input, length, isRequest) \
7581
                                TLSX_CA_Names_Parse(ssl, input, length, isRequest)
7582
7583
#else
7584
7585
#define CAN_GET_SIZE(data)                       0
7586
#define CAN_WRITE(data, output)                  0
7587
#define CAN_PARSE(ssl, input, length, isRequest) 0
7588
7589
#endif
7590
7591
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
7592
/******************************************************************************/
7593
/* Signature Algorithms                                                       */
7594
/******************************************************************************/
7595
7596
/* Return the size of the SignatureAlgorithms extension's data.
7597
 *
7598
 * data  Unused
7599
 * returns the length of data that will be in the extension.
7600
 */
7601
7602
static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
7603
0
{
7604
0
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7605
7606
0
    if (sa->hashSigAlgoSz == 0)
7607
0
        return OPAQUE16_LEN + WOLFSSL_SUITES(sa->ssl)->hashSigAlgoSz;
7608
0
    else
7609
0
        return OPAQUE16_LEN + sa->hashSigAlgoSz;
7610
0
}
7611
7612
/* Creates a bit string of supported hash algorithms with RSA PSS.
7613
 * The bit string is used when determining which signature algorithm to use
7614
 * when creating the CertificateVerify message.
7615
 * Note: Valid data has an even length as each signature algorithm is two bytes.
7616
 *
7617
 * ssl     The SSL/TLS object.
7618
 * input   The buffer with the list of supported signature algorithms.
7619
 * length  The length of the list in bytes.
7620
 * returns 0 on success, BUFFER_ERROR when the length is not even.
7621
 */
7622
static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, const byte* input,
7623
                                           word16 length)
7624
0
{
7625
0
    word16 i;
7626
7627
0
    if ((length & 1) == 1)
7628
0
        return BUFFER_ERROR;
7629
7630
0
    ssl->pssAlgo = 0;
7631
0
    for (i = 0; i < length; i += 2) {
7632
0
        if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
7633
0
            ssl->pssAlgo |= 1 << input[i + 1];
7634
0
    #ifdef WOLFSSL_TLS13
7635
0
        if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
7636
0
                                                   input[i + 1] <= pss_sha512) {
7637
0
            ssl->pssAlgo |= 1 << input[i + 1];
7638
0
        }
7639
0
    #endif
7640
0
    }
7641
7642
0
    return 0;
7643
0
}
7644
7645
/* Writes the SignatureAlgorithms extension into the buffer.
7646
 *
7647
 * data    Unused
7648
 * output  The buffer to write the extension into.
7649
 * returns the length of data that was written.
7650
 */
7651
static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
7652
0
{
7653
0
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7654
0
    const Suites* suites = WOLFSSL_SUITES(sa->ssl);
7655
0
    word16 hashSigAlgoSz;
7656
7657
0
    if (sa->hashSigAlgoSz == 0) {
7658
0
        c16toa(suites->hashSigAlgoSz, output);
7659
0
        XMEMCPY(output + OPAQUE16_LEN, suites->hashSigAlgo,
7660
0
                suites->hashSigAlgoSz);
7661
0
        hashSigAlgoSz = suites->hashSigAlgoSz;
7662
0
    }
7663
0
    else {
7664
0
        c16toa(sa->hashSigAlgoSz, output);
7665
0
        XMEMCPY(output + OPAQUE16_LEN, sa->hashSigAlgo,
7666
0
                sa->hashSigAlgoSz);
7667
0
        hashSigAlgoSz = sa->hashSigAlgoSz;
7668
0
    }
7669
7670
0
#ifndef NO_RSA
7671
0
    TLSX_SignatureAlgorithms_MapPss(sa->ssl, output + OPAQUE16_LEN,
7672
0
            hashSigAlgoSz);
7673
0
#endif
7674
7675
0
    return OPAQUE16_LEN + hashSigAlgoSz;
7676
0
}
7677
7678
/* Parse the SignatureAlgorithms extension.
7679
 *
7680
 * ssl     The SSL/TLS object.
7681
 * input   The buffer with the extension data.
7682
 * length  The length of the extension data.
7683
 * returns 0 on success, otherwise failure.
7684
 */
7685
static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, const byte* input,
7686
                                  word16 length, byte isRequest, Suites* suites)
7687
0
{
7688
0
    word16 len;
7689
7690
0
    if (!isRequest)
7691
0
        return BUFFER_ERROR;
7692
7693
    /* Must contain a length and at least algorithm. */
7694
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7695
0
        return BUFFER_ERROR;
7696
7697
0
    ato16(input, &len);
7698
0
    input += OPAQUE16_LEN;
7699
7700
    /* Algorithm array must fill rest of data. */
7701
0
    if (length != OPAQUE16_LEN + len)
7702
0
        return BUFFER_ERROR;
7703
7704
    /* Sig Algo list size must be even. */
7705
0
    if (suites->hashSigAlgoSz % 2 != 0)
7706
0
        return BUFFER_ERROR;
7707
7708
    /* truncate hashSigAlgo list if too long */
7709
0
    suites->hashSigAlgoSz = len;
7710
0
    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7711
0
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7712
0
        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7713
0
    }
7714
0
    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
7715
7716
0
    return TLSX_SignatureAlgorithms_MapPss(ssl, input, len);
7717
0
}
7718
7719
/* Sets a new SignatureAlgorithms extension into the extension list.
7720
 *
7721
 * extensions  The list of extensions.
7722
 * data        The extensions specific data.
7723
 * heap        The heap used for allocation.
7724
 * returns 0 on success, otherwise failure.
7725
 */
7726
static int TLSX_SetSignatureAlgorithms(TLSX** extensions, WOLFSSL* ssl,
7727
                                       void* heap)
7728
0
{
7729
0
    SignatureAlgorithms* sa;
7730
0
    int ret;
7731
7732
0
    if (extensions == NULL)
7733
0
        return BAD_FUNC_ARG;
7734
7735
    /* Already present */
7736
0
    if (TLSX_Find(*extensions, TLSX_SIGNATURE_ALGORITHMS) != NULL)
7737
0
        return 0;
7738
7739
0
    sa = TLSX_SignatureAlgorithms_New(ssl, 0, heap);
7740
0
    if (sa == NULL)
7741
0
        return MEMORY_ERROR;
7742
7743
0
    ret = TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, sa, heap);
7744
0
    if (ret != 0)
7745
0
        TLSX_SignatureAlgorithms_FreeAll(sa, heap);
7746
0
    return ret;
7747
0
}
7748
7749
SignatureAlgorithms* TLSX_SignatureAlgorithms_New(WOLFSSL* ssl,
7750
        word16 hashSigAlgoSz, void* heap)
7751
0
{
7752
0
    SignatureAlgorithms* sa;
7753
0
    (void)heap;
7754
7755
0
    sa = (SignatureAlgorithms*)XMALLOC(sizeof(*sa) + hashSigAlgoSz, heap,
7756
0
                                       DYNAMIC_TYPE_TLSX);
7757
0
    if (sa != NULL) {
7758
0
        XMEMSET(sa, 0, sizeof(*sa) + hashSigAlgoSz);
7759
0
        sa->ssl = ssl;
7760
0
        sa->hashSigAlgoSz = hashSigAlgoSz;
7761
0
    }
7762
0
    return sa;
7763
0
}
7764
7765
void TLSX_SignatureAlgorithms_FreeAll(SignatureAlgorithms* sa,
7766
                                             void* heap)
7767
0
{
7768
0
    XFREE(sa, heap, DYNAMIC_TYPE_TLSX);
7769
0
    (void)heap;
7770
0
}
7771
7772
0
#define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
7773
0
#define SA_WRITE     TLSX_SignatureAlgorithms_Write
7774
0
#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
7775
0
#define SA_FREE_ALL  TLSX_SignatureAlgorithms_FreeAll
7776
#endif
7777
/******************************************************************************/
7778
/* Signature Algorithms Certificate                                           */
7779
/******************************************************************************/
7780
7781
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
7782
/* Return the size of the SignatureAlgorithms extension's data.
7783
 *
7784
 * data  Unused
7785
 * returns the length of data that will be in the extension.
7786
 */
7787
static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
7788
0
{
7789
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7790
7791
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
7792
0
}
7793
7794
/* Writes the SignatureAlgorithmsCert extension into the buffer.
7795
 *
7796
 * data    Unused
7797
 * output  The buffer to write the extension into.
7798
 * returns the length of data that was written.
7799
 */
7800
static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
7801
0
{
7802
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7803
7804
0
    c16toa(ssl->certHashSigAlgoSz, output);
7805
0
    XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
7806
0
            ssl->certHashSigAlgoSz);
7807
7808
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
7809
0
}
7810
7811
/* Parse the SignatureAlgorithmsCert extension.
7812
 *
7813
 * ssl     The SSL/TLS object.
7814
 * input   The buffer with the extension data.
7815
 * length  The length of the extension data.
7816
 * returns 0 on success, otherwise failure.
7817
 */
7818
static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, const byte* input,
7819
                                              word16 length, byte isRequest)
7820
0
{
7821
0
    word16 len;
7822
7823
0
    if (!isRequest)
7824
0
        return BUFFER_ERROR;
7825
7826
    /* Must contain a length and at least algorithm. */
7827
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7828
0
        return BUFFER_ERROR;
7829
7830
0
    ato16(input, &len);
7831
0
    input += OPAQUE16_LEN;
7832
7833
    /* Algorithm array must fill rest of data. */
7834
0
    if (length != OPAQUE16_LEN + len)
7835
0
        return BUFFER_ERROR;
7836
7837
    /* truncate hashSigAlgo list if too long */
7838
0
    ssl->certHashSigAlgoSz = len;
7839
0
    if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7840
0
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7841
0
        ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7842
0
    }
7843
0
    XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
7844
7845
0
    return 0;
7846
0
}
7847
7848
/* Sets a new SignatureAlgorithmsCert extension into the extension list.
7849
 *
7850
 * extensions  The list of extensions.
7851
 * data        The extensions specific data.
7852
 * heap        The heap used for allocation.
7853
 * returns 0 on success, otherwise failure.
7854
 */
7855
static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions,
7856
        const WOLFSSL* data, void* heap)
7857
0
{
7858
0
    if (extensions == NULL)
7859
0
        return BAD_FUNC_ARG;
7860
7861
0
    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, data, heap);
7862
0
}
7863
7864
0
#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
7865
0
#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
7866
0
#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
7867
#endif /* WOLFSSL_TLS13 */
7868
7869
7870
/******************************************************************************/
7871
/* Key Share                                                                  */
7872
/******************************************************************************/
7873
7874
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
7875
/* Create a key share entry using named Diffie-Hellman parameters group.
7876
 * Generates a key pair.
7877
 *
7878
 * ssl   The SSL/TLS object.
7879
 * kse   The key share entry object.
7880
 * returns 0 on success, otherwise failure.
7881
 */
7882
static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
7883
0
{
7884
0
    int ret = 0;
7885
0
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
7886
0
    word32 pSz = 0, pvtSz = 0;
7887
0
    DhKey* dhKey = (DhKey*)kse->key;
7888
7889
    /* Pick the parameters from the named group. */
7890
0
#ifdef HAVE_PUBLIC_FFDHE
7891
0
    const DhParams* params = NULL;
7892
0
    switch (kse->group) {
7893
0
    #ifdef HAVE_FFDHE_2048
7894
0
        case WOLFSSL_FFDHE_2048:
7895
0
            params = wc_Dh_ffdhe2048_Get();
7896
0
            pvtSz = 29;
7897
0
            break;
7898
0
    #endif
7899
    #ifdef HAVE_FFDHE_3072
7900
        case WOLFSSL_FFDHE_3072:
7901
            params = wc_Dh_ffdhe3072_Get();
7902
            pvtSz = 34;
7903
            break;
7904
    #endif
7905
    #ifdef HAVE_FFDHE_4096
7906
        case WOLFSSL_FFDHE_4096:
7907
            params = wc_Dh_ffdhe4096_Get();
7908
            pvtSz = 39;
7909
            break;
7910
    #endif
7911
    #ifdef HAVE_FFDHE_6144
7912
        case WOLFSSL_FFDHE_6144:
7913
            params = wc_Dh_ffdhe6144_Get();
7914
            pvtSz = 46;
7915
            break;
7916
    #endif
7917
    #ifdef HAVE_FFDHE_8192
7918
        case WOLFSSL_FFDHE_8192:
7919
            params = wc_Dh_ffdhe8192_Get();
7920
            pvtSz = 52;
7921
            break;
7922
    #endif
7923
0
        default:
7924
0
            break;
7925
0
    }
7926
0
    if (params == NULL)
7927
0
        return BAD_FUNC_ARG;
7928
0
    pSz = params->p_len;
7929
#else
7930
    pvtSz = wc_DhGetNamedKeyMinSize(kse->group);
7931
    if (pvtSz == 0) {
7932
        return BAD_FUNC_ARG;
7933
    }
7934
    ret = wc_DhGetNamedKeyParamSize(kse->group, &pSz, NULL, NULL);
7935
    if (ret != 0) {
7936
        return BAD_FUNC_ARG;
7937
    }
7938
#endif
7939
7940
    /* Trigger Key Generation */
7941
0
    if (kse->pubKey == NULL || kse->privKey == NULL) {
7942
0
        if (kse->key == NULL) {
7943
0
            kse->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
7944
0
                DYNAMIC_TYPE_DH);
7945
0
            if (kse->key == NULL)
7946
0
                return MEMORY_E;
7947
7948
            /* Setup Key */
7949
0
            ret = wc_InitDhKey_ex((DhKey*)kse->key, ssl->heap, ssl->devId);
7950
0
            if (ret == 0) {
7951
0
                dhKey = (DhKey*)kse->key;
7952
0
            #ifdef HAVE_PUBLIC_FFDHE
7953
0
                ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
7954
0
                                                                 params->g_len);
7955
            #else
7956
                ret = wc_DhSetNamedKey(dhKey, kse->group);
7957
            #endif
7958
0
            }
7959
0
        }
7960
7961
        /* Allocate space for the private and public key */
7962
0
        if (ret == 0 && kse->pubKey == NULL) {
7963
0
            kse->pubKey = (byte*)XMALLOC(pSz, ssl->heap,
7964
0
                DYNAMIC_TYPE_PUBLIC_KEY);
7965
0
            if (kse->pubKey == NULL)
7966
0
                ret = MEMORY_E;
7967
0
        }
7968
7969
0
        if (ret == 0 && kse->privKey == NULL) {
7970
0
            kse->privKey = (byte*)XMALLOC(pvtSz, ssl->heap,
7971
0
                DYNAMIC_TYPE_PRIVATE_KEY);
7972
0
            if (kse->privKey == NULL)
7973
0
                ret = MEMORY_E;
7974
0
        }
7975
7976
0
        if (ret == 0) {
7977
        #if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
7978
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_DH, kse->key);
7979
            kse->pubKeyLen = pSz;
7980
            kse->keyLen = pvtSz;
7981
            if (ret == 0) {
7982
                ret = wc_DhExportKeyPair(dhKey,
7983
                    (byte*)kse->privKey, &kse->keyLen, /* private */
7984
                    kse->pubKey, &kse->pubKeyLen /* public */
7985
                );
7986
            }
7987
            else
7988
        #endif
7989
0
            {
7990
                /* Generate a new key pair */
7991
                /* For async this is called once and when event is done, the
7992
                 *   provided buffers will be populated.
7993
                 * Final processing is zero pad below. */
7994
0
                kse->pubKeyLen = pSz;
7995
0
                kse->keyLen = pvtSz;
7996
0
                ret = DhGenKeyPair(ssl, dhKey,
7997
0
                    (byte*)kse->privKey, &kse->keyLen, /* private */
7998
0
                    kse->pubKey, &kse->pubKeyLen /* public */
7999
0
                );
8000
            #ifdef WOLFSSL_ASYNC_CRYPT
8001
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8002
                    return ret;
8003
                }
8004
            #endif
8005
0
            }
8006
0
        }
8007
0
    }
8008
8009
0
    if (ret == 0) {
8010
0
        if (pSz != kse->pubKeyLen) {
8011
            /* Zero pad the front of the public key to match prime "p" size */
8012
0
            XMEMMOVE(kse->pubKey + pSz - kse->pubKeyLen, kse->pubKey,
8013
0
                kse->pubKeyLen);
8014
0
            XMEMSET(kse->pubKey, 0, pSz - kse->pubKeyLen);
8015
0
            kse->pubKeyLen = pSz;
8016
0
        }
8017
8018
0
        if (pvtSz != kse->keyLen) {
8019
            /* Zero pad the front of the private key */
8020
0
            XMEMMOVE(kse->privKey + pvtSz - kse->keyLen, kse->privKey,
8021
0
                kse->keyLen);
8022
0
            XMEMSET(kse->privKey, 0, pvtSz - kse->keyLen);
8023
0
            kse->keyLen = pvtSz;
8024
0
        }
8025
8026
    #ifdef WOLFSSL_DEBUG_TLS
8027
        WOLFSSL_MSG("Public DH Key");
8028
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8029
    #endif
8030
0
    }
8031
8032
    /* Always release the DH key to free up memory.
8033
     * The DhKey will be setup again in TLSX_KeyShare_ProcessDh */
8034
0
    if (dhKey != NULL)
8035
0
        wc_FreeDhKey(dhKey);
8036
0
    XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
8037
0
    kse->key = NULL;
8038
8039
0
    if (ret != 0) {
8040
        /* Cleanup on error, otherwise data owned by key share entry */
8041
0
        if (kse->privKey) {
8042
0
            ForceZero(kse->privKey, pvtSz);
8043
0
            XFREE(kse->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8044
0
            kse->privKey = NULL;
8045
0
        }
8046
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8047
0
        kse->pubKey = NULL;
8048
0
    }
8049
#else
8050
    (void)ssl;
8051
    (void)kse;
8052
8053
    ret = NOT_COMPILED_IN;
8054
    WOLFSSL_ERROR_VERBOSE(ret);
8055
#endif
8056
8057
0
    return ret;
8058
0
}
8059
8060
/* Create a key share entry using X25519 parameters group.
8061
 * Generates a key pair.
8062
 *
8063
 * ssl   The SSL/TLS object.
8064
 * kse   The key share entry object.
8065
 * returns 0 on success, otherwise failure.
8066
 */
8067
static int TLSX_KeyShare_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
8068
0
{
8069
0
    int ret = 0;
8070
#ifdef HAVE_CURVE25519
8071
    curve25519_key* key = (curve25519_key*)kse->key;
8072
8073
    if (kse->key == NULL) {
8074
        /* Allocate a Curve25519 key to hold private key. */
8075
        kse->key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
8076
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8077
        if (kse->key == NULL) {
8078
            WOLFSSL_MSG("GenX25519Key memory error");
8079
            return MEMORY_E;
8080
        }
8081
8082
        /* Make an Curve25519 key. */
8083
        ret = wc_curve25519_init_ex((curve25519_key*)kse->key, ssl->heap,
8084
            INVALID_DEVID);
8085
        if (ret == 0) {
8086
            /* setting "key" means okay to call wc_curve25519_free */
8087
            key = (curve25519_key*)kse->key;
8088
            kse->keyLen = CURVE25519_KEYSIZE;
8089
8090
        #ifdef WOLFSSL_STATIC_EPHEMERAL
8091
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE25519, kse->key);
8092
            if (ret != 0)
8093
        #endif
8094
            {
8095
                ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
8096
            }
8097
        }
8098
    }
8099
8100
    if (ret == 0 && kse->pubKey == NULL) {
8101
        /* Allocate space for the public key. */
8102
        kse->pubKey = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
8103
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8104
        if (kse->pubKey == NULL) {
8105
            WOLFSSL_MSG("GenX25519Key pub memory error");
8106
            ret = MEMORY_E;
8107
        }
8108
    }
8109
8110
    if (ret == 0) {
8111
        /* Export Curve25519 public key. */
8112
        kse->pubKeyLen = CURVE25519_KEYSIZE;
8113
        if (wc_curve25519_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8114
                                                  EC25519_LITTLE_ENDIAN) != 0) {
8115
            ret = ECC_EXPORT_ERROR;
8116
            WOLFSSL_ERROR_VERBOSE(ret);
8117
        }
8118
        kse->pubKeyLen = CURVE25519_KEYSIZE; /* always CURVE25519_KEYSIZE */
8119
    }
8120
8121
#ifdef WOLFSSL_DEBUG_TLS
8122
    if (ret == 0) {
8123
        WOLFSSL_MSG("Public Curve25519 Key");
8124
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8125
    }
8126
#endif
8127
8128
    if (ret != 0) {
8129
        /* Data owned by key share entry otherwise. */
8130
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8131
        kse->pubKey = NULL;
8132
        if (key != NULL)
8133
            wc_curve25519_free(key);
8134
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8135
        kse->key = NULL;
8136
    }
8137
#else
8138
0
    (void)ssl;
8139
0
    (void)kse;
8140
8141
0
    ret = NOT_COMPILED_IN;
8142
0
    WOLFSSL_ERROR_VERBOSE(ret);
8143
0
#endif /* HAVE_CURVE25519 */
8144
8145
0
    return ret;
8146
0
}
8147
8148
/* Create a key share entry using X448 parameters group.
8149
 * Generates a key pair.
8150
 *
8151
 * ssl   The SSL/TLS object.
8152
 * kse   The key share entry object.
8153
 * returns 0 on success, otherwise failure.
8154
 */
8155
static int TLSX_KeyShare_GenX448Key(WOLFSSL *ssl, KeyShareEntry* kse)
8156
0
{
8157
0
    int ret = 0;
8158
#ifdef HAVE_CURVE448
8159
    curve448_key* key = (curve448_key*)kse->key;
8160
8161
    if (kse->key == NULL) {
8162
        /* Allocate a Curve448 key to hold private key. */
8163
        kse->key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
8164
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8165
        if (kse->key == NULL) {
8166
            WOLFSSL_MSG("GenX448Key memory error");
8167
            return MEMORY_E;
8168
        }
8169
8170
        /* Make an Curve448 key. */
8171
        ret = wc_curve448_init((curve448_key*)kse->key);
8172
        if (ret == 0) {
8173
            key = (curve448_key*)kse->key;
8174
            kse->keyLen = CURVE448_KEY_SIZE;
8175
8176
            #ifdef WOLFSSL_STATIC_EPHEMERAL
8177
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE448, kse->key);
8178
            if (ret != 0)
8179
        #endif
8180
            {
8181
                ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
8182
            }
8183
        }
8184
    }
8185
8186
    if (ret == 0 && kse->pubKey == NULL) {
8187
        /* Allocate space for the public key. */
8188
        kse->pubKey = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
8189
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8190
        if (kse->pubKey == NULL) {
8191
            WOLFSSL_MSG("GenX448Key pub memory error");
8192
            ret = MEMORY_E;
8193
        }
8194
    }
8195
8196
    if (ret == 0) {
8197
        /* Export Curve448 public key. */
8198
        kse->pubKeyLen = CURVE448_KEY_SIZE;
8199
        if (wc_curve448_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8200
                                                    EC448_LITTLE_ENDIAN) != 0) {
8201
            ret = ECC_EXPORT_ERROR;
8202
        }
8203
        kse->pubKeyLen = CURVE448_KEY_SIZE; /* always CURVE448_KEY_SIZE */
8204
    }
8205
8206
#ifdef WOLFSSL_DEBUG_TLS
8207
    if (ret == 0) {
8208
        WOLFSSL_MSG("Public Curve448 Key");
8209
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8210
    }
8211
#endif
8212
8213
    if (ret != 0) {
8214
        /* Data owned by key share entry otherwise. */
8215
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8216
        kse->pubKey = NULL;
8217
        if (key != NULL)
8218
            wc_curve448_free(key);
8219
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8220
        kse->key = NULL;
8221
    }
8222
#else
8223
0
    (void)ssl;
8224
0
    (void)kse;
8225
8226
0
    ret = NOT_COMPILED_IN;
8227
0
    WOLFSSL_ERROR_VERBOSE(ret);
8228
0
#endif /* HAVE_CURVE448 */
8229
8230
0
    return ret;
8231
0
}
8232
8233
/* Create a key share entry using named elliptic curve parameters group.
8234
 * Generates a key pair.
8235
 *
8236
 * ssl   The SSL/TLS object.
8237
 * kse   The key share entry object.
8238
 * returns 0 on success, otherwise failure.
8239
 */
8240
static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
8241
0
{
8242
0
    int ret = 0;
8243
0
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
8244
0
    word32 keySize = 0;
8245
0
    word16 curveId = (word16) ECC_CURVE_INVALID;
8246
0
    ecc_key* eccKey = (ecc_key*)kse->key;
8247
8248
    /* TODO: [TLS13] Get key sizes using wc_ecc_get_curve_size_from_id. */
8249
    /* Translate named group to a curve id. */
8250
0
    switch (kse->group) {
8251
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
8252
0
        #ifndef NO_ECC_SECP
8253
0
        case WOLFSSL_ECC_SECP256R1:
8254
0
            curveId = ECC_SECP256R1;
8255
0
            keySize = 32;
8256
0
            break;
8257
0
        #endif /* !NO_ECC_SECP */
8258
        #ifdef WOLFSSL_SM2
8259
        case WOLFSSL_ECC_SM2P256V1:
8260
            curveId = ECC_SM2P256V1;
8261
            keySize = 32;
8262
            break;
8263
        #endif /* !NO_ECC_SECP */
8264
0
    #endif
8265
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
8266
0
        #ifndef NO_ECC_SECP
8267
0
        case WOLFSSL_ECC_SECP384R1:
8268
0
            curveId = ECC_SECP384R1;
8269
0
            keySize = 48;
8270
0
            break;
8271
0
        #endif /* !NO_ECC_SECP */
8272
0
    #endif
8273
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
8274
0
        #ifndef NO_ECC_SECP
8275
0
        case WOLFSSL_ECC_SECP521R1:
8276
0
            curveId = ECC_SECP521R1;
8277
0
            keySize = 66;
8278
0
            break;
8279
0
        #endif /* !NO_ECC_SECP */
8280
0
    #endif
8281
0
        default:
8282
0
            WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
8283
0
            return BAD_FUNC_ARG;
8284
0
    }
8285
8286
0
    if (kse->key == NULL) {
8287
        /* Allocate an ECC key to hold private key. */
8288
0
        kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC);
8289
0
        if (kse->key == NULL) {
8290
0
            WOLFSSL_MSG_EX("Failed to allocate %d bytes, ssl->heap: %p",
8291
0
                           (int)sizeof(ecc_key), (wc_ptr_t)ssl->heap);
8292
0
            WOLFSSL_MSG("EccTempKey Memory error!");
8293
0
            return MEMORY_E;
8294
0
        }
8295
8296
        /* Initialize an ECC key struct for the ephemeral key */
8297
0
        ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
8298
8299
0
        if (ret == 0) {
8300
0
            kse->keyLen = keySize;
8301
0
            kse->pubKeyLen = keySize * 2 + 1;
8302
8303
        #if defined(WOLFSSL_RENESAS_TSIP_TLS)
8304
            ret = tsip_Tls13GenEccKeyPair(ssl, kse);
8305
            if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
8306
                return ret;
8307
            }
8308
        #endif
8309
            /* setting eccKey means okay to call wc_ecc_free */
8310
0
            eccKey = (ecc_key*)kse->key;
8311
8312
        #ifdef WOLFSSL_STATIC_EPHEMERAL
8313
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_ECDH, kse->key);
8314
            if (ret != 0 || eccKey->dp->id != curveId)
8315
        #endif
8316
0
            {
8317
                /* set curve info for EccMakeKey "peer" info */
8318
0
                ret = wc_ecc_set_curve(eccKey, (int)kse->keyLen, curveId);
8319
0
                if (ret == 0) {
8320
            #ifdef WOLFSSL_ASYNC_CRYPT
8321
                    /* Detect when private key generation is done */
8322
                    if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) &&
8323
                            eccKey->type == ECC_PRIVATEKEY) {
8324
                        ret = 0; /* ECC Key Generation is done */
8325
                    }
8326
                    else
8327
            #endif
8328
0
                    {
8329
                        /* Generate ephemeral ECC key */
8330
                        /* For async this is called once and when event is done, the
8331
                        *   provided buffers in key be populated.
8332
                        * Final processing is x963 key export below. */
8333
0
                        ret = EccMakeKey(ssl, eccKey, eccKey);
8334
0
                    }
8335
0
                }
8336
            #ifdef WOLFSSL_ASYNC_CRYPT
8337
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
8338
                    return ret;
8339
            #endif
8340
0
            }
8341
0
        }
8342
0
    }
8343
8344
0
    if (ret == 0 && kse->pubKey == NULL) {
8345
        /* Allocate space for the public key */
8346
0
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8347
0
            DYNAMIC_TYPE_PUBLIC_KEY);
8348
0
        if (kse->pubKey == NULL) {
8349
0
            WOLFSSL_MSG("Key data Memory error");
8350
0
            ret = MEMORY_E;
8351
0
        }
8352
0
    }
8353
8354
0
    if (ret == 0) {
8355
0
        XMEMSET(kse->pubKey, 0, kse->pubKeyLen);
8356
8357
        /* Export public key. */
8358
0
        PRIVATE_KEY_UNLOCK();
8359
0
        if (wc_ecc_export_x963(eccKey, kse->pubKey, &kse->pubKeyLen) != 0) {
8360
0
            ret = ECC_EXPORT_ERROR;
8361
0
            WOLFSSL_ERROR_VERBOSE(ret);
8362
0
        }
8363
0
        PRIVATE_KEY_LOCK();
8364
0
    }
8365
#ifdef WOLFSSL_DEBUG_TLS
8366
    if (ret == 0) {
8367
        WOLFSSL_MSG("Public ECC Key");
8368
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
8369
    }
8370
#endif
8371
8372
0
    if (ret != 0) {
8373
        /* Cleanup on error, otherwise data owned by key share entry */
8374
0
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8375
0
        kse->pubKey = NULL;
8376
0
        if (eccKey != NULL)
8377
0
            wc_ecc_free(eccKey);
8378
0
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8379
0
        kse->key = NULL;
8380
0
    }
8381
#else
8382
    (void)ssl;
8383
    (void)kse;
8384
8385
    ret = NOT_COMPILED_IN;
8386
    WOLFSSL_ERROR_VERBOSE(ret);
8387
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
8388
8389
0
    return ret;
8390
0
}
8391
8392
#ifdef WOLFSSL_HAVE_MLKEM
8393
#if defined(WOLFSSL_MLKEM_CACHE_A) && \
8394
    !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY)
8395
    /* Store KyberKey object rather than private key bytes in key share entry.
8396
     * Improves performance at cost of more dynamic memory being used. */
8397
    #define WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8398
#endif
8399
#if defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY) && \
8400
    defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ)
8401
    #error "Choose WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY or "
8402
           "WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ"
8403
#endif
8404
8405
#if !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) || \
8406
    !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) || \
8407
    (!defined(WOLFSSL_MLKEM_NO_DECAPSULATE) && \
8408
     !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ))
8409
static int mlkem_id2type(int id, int *type)
8410
{
8411
    int ret = 0;
8412
8413
    switch (id) {
8414
#ifndef WOLFSSL_NO_ML_KEM
8415
    #ifndef WOLFSSL_NO_ML_KEM_512
8416
        case WOLFSSL_ML_KEM_512:
8417
            *type = WC_ML_KEM_512;
8418
            break;
8419
    #endif
8420
    #ifndef WOLFSSL_NO_ML_KEM_768
8421
        case WOLFSSL_ML_KEM_768:
8422
            *type = WC_ML_KEM_768;
8423
            break;
8424
    #endif
8425
    #ifndef WOLFSSL_NO_ML_KEM_1024
8426
        case WOLFSSL_ML_KEM_1024:
8427
            *type = WC_ML_KEM_1024;
8428
            break;
8429
    #endif
8430
#endif
8431
#ifdef WOLFSSL_MLKEM_KYBER
8432
    #ifdef WOLFSSL_KYBER512
8433
        case WOLFSSL_KYBER_LEVEL1:
8434
            *type = KYBER512;
8435
            break;
8436
    #endif
8437
    #ifdef WOLFSSL_KYBER768
8438
        case WOLFSSL_KYBER_LEVEL3:
8439
            *type = KYBER768;
8440
            break;
8441
    #endif
8442
    #ifdef WOLFSSL_KYBER1024
8443
        case WOLFSSL_KYBER_LEVEL5:
8444
            *type = KYBER1024;
8445
            break;
8446
    #endif
8447
#endif
8448
        default:
8449
            ret = NOT_COMPILED_IN;
8450
            break;
8451
    }
8452
8453
    return ret;
8454
}
8455
#endif
8456
8457
/* Structures and objects needed for hybrid key exchanges using both classic
8458
 * ECDHE and PQC KEM key material. */
8459
typedef struct PqcHybridMapping {
8460
    int hybrid;
8461
    int ecc;
8462
    int pqc;
8463
    int pqc_first;
8464
} PqcHybridMapping;
8465
8466
static const PqcHybridMapping pqc_hybrid_mapping[] = {
8467
#ifndef WOLFSSL_NO_ML_KEM
8468
    {WOLFSSL_P256_ML_KEM_512, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8469
    {WOLFSSL_P384_ML_KEM_768, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8470
    {WOLFSSL_P256_ML_KEM_768, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_768, 0},
8471
    {WOLFSSL_P521_ML_KEM_1024, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8472
    {WOLFSSL_P384_ML_KEM_1024, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_1024, 0},
8473
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
8474
    {WOLFSSL_P256_ML_KEM_512_OLD, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8475
    {WOLFSSL_P384_ML_KEM_768_OLD, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8476
    {WOLFSSL_P521_ML_KEM_1024_OLD, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8477
#endif
8478
#ifdef HAVE_CURVE25519
8479
    {WOLFSSL_X25519_ML_KEM_512, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_512, 1},
8480
    {WOLFSSL_X25519_ML_KEM_768, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_768, 1},
8481
#endif
8482
#ifdef HAVE_CURVE448
8483
    {WOLFSSL_X448_ML_KEM_768, WOLFSSL_ECC_X448, WOLFSSL_ML_KEM_768, 1},
8484
#endif
8485
#endif /* WOLFSSL_NO_ML_KEM */
8486
#ifdef WOLFSSL_MLKEM_KYBER
8487
    {WOLFSSL_P256_KYBER_LEVEL1, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL1, 0},
8488
    {WOLFSSL_P384_KYBER_LEVEL3, WOLFSSL_ECC_SECP384R1, WOLFSSL_KYBER_LEVEL3, 0},
8489
    {WOLFSSL_P256_KYBER_LEVEL3, WOLFSSL_ECC_SECP256R1, WOLFSSL_KYBER_LEVEL3, 0},
8490
    {WOLFSSL_P521_KYBER_LEVEL5, WOLFSSL_ECC_SECP521R1, WOLFSSL_KYBER_LEVEL5, 0},
8491
#ifdef HAVE_CURVE25519
8492
    {WOLFSSL_X25519_KYBER_LEVEL1, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL1, 0},
8493
    {WOLFSSL_X25519_KYBER_LEVEL3, WOLFSSL_ECC_X25519, WOLFSSL_KYBER_LEVEL3, 0},
8494
#endif
8495
#ifdef HAVE_CURVE448
8496
    {WOLFSSL_X448_KYBER_LEVEL3, WOLFSSL_ECC_X448, WOLFSSL_KYBER_LEVEL3, 0},
8497
#endif
8498
#endif /* WOLFSSL_MLKEM_KYBER */
8499
    {0, 0, 0, 0}
8500
};
8501
8502
/* Map an ecc-pqc hybrid group into its ecc group and pqc kem group. */
8503
static void findEccPqc(int *ecc, int *pqc, int *pqc_first, int group)
8504
{
8505
    int i;
8506
8507
    if (pqc != NULL)
8508
        *pqc = 0;
8509
    if (ecc != NULL)
8510
        *ecc = 0;
8511
    if (pqc_first != NULL)
8512
        *pqc_first = 0;
8513
8514
    for (i = 0; pqc_hybrid_mapping[i].hybrid != 0; i++) {
8515
        if (pqc_hybrid_mapping[i].hybrid == group) {
8516
            if (pqc != NULL)
8517
                *pqc = pqc_hybrid_mapping[i].pqc;
8518
            if (ecc != NULL)
8519
                *ecc = pqc_hybrid_mapping[i].ecc;
8520
            if (pqc_first != NULL)
8521
                *pqc_first = pqc_hybrid_mapping[i].pqc_first;
8522
            break;
8523
        }
8524
    }
8525
}
8526
8527
#ifndef WOLFSSL_MLKEM_NO_MAKE_KEY
8528
/* Create a key share entry using pqc parameters group on the client side.
8529
 * Generates a key pair.
8530
 *
8531
 * ssl   The SSL/TLS object.
8532
 * kse   The key share entry object.
8533
 * returns 0 on success, otherwise failure.
8534
 */
8535
static int TLSX_KeyShare_GenPqcKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
8536
{
8537
    int ret = 0;
8538
    int type = 0;
8539
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8540
    #ifdef WOLFSSL_SMALL_STACK
8541
        KyberKey *kem = NULL;
8542
    #else
8543
        KyberKey kem[1];
8544
    #endif
8545
    byte* privKey = NULL;
8546
    word32 privSz = 0;
8547
#else
8548
    KyberKey* kem = NULL;
8549
#endif
8550
8551
    /* This gets called twice. Once during parsing of the key share and once
8552
     * during the population of the extension. No need to do work the second
8553
     * time. Just return success if its already been done. */
8554
    if (kse->pubKey != NULL) {
8555
        return ret;
8556
    }
8557
8558
    /* Get the type of key we need from the key share group. */
8559
    ret = mlkem_id2type(kse->group, &type);
8560
    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
8561
        WOLFSSL_MSG("Invalid Kyber algorithm specified.");
8562
        ret = BAD_FUNC_ARG;
8563
    }
8564
8565
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8566
8567
    #ifdef WOLFSSL_SMALL_STACK
8568
    if (ret == 0) {
8569
        kem = (KyberKey *)XMALLOC(sizeof(*kem), ssl->heap,
8570
                                  DYNAMIC_TYPE_PRIVATE_KEY);
8571
        if (kem == NULL) {
8572
            WOLFSSL_MSG("KEM memory allocation failure");
8573
            ret = MEMORY_ERROR;
8574
        }
8575
    }
8576
    #endif /* WOLFSSL_SMALL_STACK */
8577
8578
    if (ret == 0) {
8579
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
8580
        if (ret != 0) {
8581
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
8582
        }
8583
    }
8584
8585
    if (ret == 0) {
8586
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
8587
    }
8588
    if (ret == 0) {
8589
        ret = wc_KyberKey_PublicKeySize(kem, &kse->pubKeyLen);
8590
    }
8591
8592
    if (ret == 0) {
8593
        privKey = (byte*)XMALLOC(privSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8594
        if (privKey == NULL) {
8595
            WOLFSSL_MSG("privkey memory allocation failure");
8596
            ret = MEMORY_ERROR;
8597
        }
8598
    }
8599
#else
8600
    if (ret == 0) {
8601
        /* Allocate a Kyber key to hold private key. */
8602
        kem = (KyberKey*)XMALLOC(sizeof(KyberKey), ssl->heap,
8603
                                 DYNAMIC_TYPE_PRIVATE_KEY);
8604
        if (kem == NULL) {
8605
            WOLFSSL_MSG("KEM memory allocation failure");
8606
            ret = MEMORY_ERROR;
8607
        }
8608
    }
8609
    if (ret == 0) {
8610
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
8611
        if (ret != 0) {
8612
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
8613
        }
8614
    }
8615
    if (ret == 0) {
8616
        ret = wc_KyberKey_PublicKeySize(kem, &kse->pubKeyLen);
8617
    }
8618
#endif
8619
8620
    if (ret == 0) {
8621
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8622
                                     DYNAMIC_TYPE_PUBLIC_KEY);
8623
        if (kse->pubKey == NULL) {
8624
            WOLFSSL_MSG("pubkey memory allocation failure");
8625
            ret = MEMORY_ERROR;
8626
        }
8627
    }
8628
8629
    if (ret == 0) {
8630
        ret = wc_KyberKey_MakeKey(kem, ssl->rng);
8631
        if (ret != 0) {
8632
            WOLFSSL_MSG("Kyber keygen failure");
8633
        }
8634
    }
8635
    if (ret == 0) {
8636
        ret = wc_KyberKey_EncodePublicKey(kem, kse->pubKey,
8637
                                          kse->pubKeyLen);
8638
    }
8639
8640
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8641
    if (ret == 0) {
8642
        ret = wc_KyberKey_EncodePrivateKey(kem, privKey, privSz);
8643
    }
8644
#endif
8645
8646
#ifdef WOLFSSL_DEBUG_TLS
8647
    WOLFSSL_MSG("Public Kyber Key");
8648
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
8649
#endif
8650
8651
    if (ret != 0) {
8652
        /* Data owned by key share entry otherwise. */
8653
        wc_KyberKey_Free(kem);
8654
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8655
        kse->pubKey = NULL;
8656
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8657
        if (privKey) {
8658
            ForceZero(privKey, privSz);
8659
            XFREE(privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8660
            privKey = NULL;
8661
        }
8662
    #else
8663
        XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8664
        kse->key = NULL;
8665
    #endif
8666
    }
8667
    else {
8668
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8669
        wc_KyberKey_Free(kem);
8670
        kse->privKey = (byte*)privKey;
8671
        kse->privKeyLen = privSz;
8672
    #else
8673
        kse->key = kem;
8674
    #endif
8675
    }
8676
8677
    #if !defined(WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ) && \
8678
        defined(WOLFSSL_SMALL_STACK)
8679
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8680
    #endif
8681
8682
    return ret;
8683
}
8684
8685
/* Create a key share entry using both ecdhe and pqc parameters groups.
8686
 * Generates two key pairs on the client side.
8687
 *
8688
 * ssl   The SSL/TLS object.
8689
 * kse   The key share entry object.
8690
 * returns 0 on success, otherwise failure.
8691
 */
8692
static int TLSX_KeyShare_GenPqcHybridKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
8693
{
8694
    int ret = 0;
8695
    KeyShareEntry *ecc_kse = NULL;
8696
    KeyShareEntry *pqc_kse = NULL;
8697
    int pqc_group = 0;
8698
    int ecc_group = 0;
8699
    int pqc_first = 0;
8700
8701
    /* This gets called twice. Once during parsing of the key share and once
8702
     * during the population of the extension. No need to do work the second
8703
     * time. Just return success if its already been done. */
8704
    if (kse->pubKey != NULL) {
8705
        return ret;
8706
    }
8707
8708
    /* Determine the ECC and PQC group of the hybrid combination */
8709
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, kse->group);
8710
    if (ecc_group == 0 || pqc_group == 0) {
8711
        WOLFSSL_MSG("Invalid hybrid group");
8712
        ret = BAD_FUNC_ARG;
8713
    }
8714
8715
    if (ret == 0) {
8716
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
8717
                   DYNAMIC_TYPE_TLSX);
8718
        if (ecc_kse == NULL) {
8719
            WOLFSSL_MSG("kse memory allocation failure");
8720
            ret = MEMORY_ERROR;
8721
        }
8722
        else {
8723
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
8724
        }
8725
    }
8726
    if (ret == 0) {
8727
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
8728
                   DYNAMIC_TYPE_TLSX);
8729
        if (pqc_kse == NULL) {
8730
            WOLFSSL_MSG("kse memory allocation failure");
8731
            ret = MEMORY_ERROR;
8732
        }
8733
        else {
8734
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
8735
        }
8736
    }
8737
8738
    /* Generate ECC key share part */
8739
    if (ret == 0) {
8740
        ecc_kse->group = ecc_group;
8741
    #ifdef HAVE_CURVE25519
8742
        if (ecc_group == WOLFSSL_ECC_X25519) {
8743
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
8744
        }
8745
        else
8746
    #endif
8747
    #ifdef HAVE_CURVE448
8748
        if (ecc_group == WOLFSSL_ECC_X448) {
8749
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
8750
        }
8751
        else
8752
    #endif
8753
        {
8754
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
8755
        }
8756
        /* No error message, TLSX_KeyShare_Gen*Key will do it. */
8757
    }
8758
8759
    /* Generate PQC key share part */
8760
    if (ret == 0) {
8761
        pqc_kse->group = pqc_group;
8762
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, pqc_kse);
8763
        /* No error message, TLSX_KeyShare_GenPqcKeyClient will do it. */
8764
    }
8765
8766
    /* Allocate memory for combined public key */
8767
    if (ret == 0) {
8768
        kse->pubKey = (byte*)XMALLOC(ecc_kse->pubKeyLen + pqc_kse->pubKeyLen,
8769
                                     ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8770
        if (kse->pubKey == NULL) {
8771
            WOLFSSL_MSG("pubkey memory allocation failure");
8772
            ret = MEMORY_ERROR;
8773
        }
8774
    }
8775
8776
    /* Create combined public key. The order of classic/pqc key material is
8777
     * indicated by the pqc_first variable. */
8778
    if (ret == 0) {
8779
        if (pqc_first) {
8780
            XMEMCPY(kse->pubKey, pqc_kse->pubKey, pqc_kse->pubKeyLen);
8781
            XMEMCPY(kse->pubKey + pqc_kse->pubKeyLen, ecc_kse->pubKey,
8782
                    ecc_kse->pubKeyLen);
8783
        }
8784
        else {
8785
            XMEMCPY(kse->pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen);
8786
            XMEMCPY(kse->pubKey + ecc_kse->pubKeyLen, pqc_kse->pubKey,
8787
                    pqc_kse->pubKeyLen);
8788
        }
8789
        kse->pubKeyLen = ecc_kse->pubKeyLen + pqc_kse->pubKeyLen;
8790
    }
8791
8792
    /* Store the private keys.
8793
     * Note we are saving the PQC private key and ECC private key
8794
     * separately. That's because the ECC private key is not simply a
8795
     * buffer. Its is an ecc_key struct. */
8796
    if (ret == 0) {
8797
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8798
        /* PQC private key is an encoded byte array */
8799
        kse->privKey = pqc_kse->privKey;
8800
        kse->privKeyLen = pqc_kse->privKeyLen;
8801
        pqc_kse->privKey = NULL;
8802
    #else
8803
        /* PQC private key is a pointer to KyberKey object */
8804
        kse->privKey = (byte*)pqc_kse->key;
8805
        kse->privKeyLen = 0;
8806
        pqc_kse->key = NULL;
8807
    #endif
8808
        /* ECC private key is a pointer to ecc_key object */
8809
        kse->key = ecc_kse->key;
8810
        kse->keyLen = ecc_kse->keyLen;
8811
        ecc_kse->key = NULL;
8812
    }
8813
8814
#ifdef WOLFSSL_DEBUG_TLS
8815
    WOLFSSL_MSG("Public Kyber Key");
8816
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
8817
#endif
8818
8819
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
8820
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
8821
8822
    return ret;
8823
}
8824
#endif /* !WOLFSSL_MLKEM_NO_MAKE_KEY */
8825
#endif /* WOLFSSL_HAVE_MLKEM */
8826
8827
/* Generate a secret/key using the key share entry.
8828
 *
8829
 * ssl  The SSL/TLS object.
8830
 * kse  The key share entry holding peer data.
8831
 */
8832
int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
8833
0
{
8834
0
    int ret;
8835
    /* Named FFDHE groups have a bit set to identify them. */
8836
0
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(kse->group))
8837
0
        ret = TLSX_KeyShare_GenDhKey(ssl, kse);
8838
0
    else if (kse->group == WOLFSSL_ECC_X25519)
8839
0
        ret = TLSX_KeyShare_GenX25519Key(ssl, kse);
8840
0
    else if (kse->group == WOLFSSL_ECC_X448)
8841
0
        ret = TLSX_KeyShare_GenX448Key(ssl, kse);
8842
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY)
8843
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group))
8844
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, kse);
8845
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(kse->group))
8846
        ret = TLSX_KeyShare_GenPqcHybridKeyClient(ssl, kse);
8847
#endif
8848
0
    else
8849
0
        ret = TLSX_KeyShare_GenEccKey(ssl, kse);
8850
#ifdef WOLFSSL_ASYNC_CRYPT
8851
    kse->lastRet = ret;
8852
#endif
8853
0
    return ret;
8854
0
}
8855
8856
/* Free the key share dynamic data.
8857
 *
8858
 * list  The linked list of key share entry objects.
8859
 * heap  The heap used for allocation.
8860
 */
8861
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
8862
0
{
8863
0
    KeyShareEntry* current;
8864
8865
0
    while ((current = list) != NULL) {
8866
0
        list = current->next;
8867
0
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(current->group)) {
8868
0
#ifndef NO_DH
8869
0
            wc_FreeDhKey((DhKey*)current->key);
8870
0
#endif
8871
0
        }
8872
0
        else if (current->group == WOLFSSL_ECC_X25519) {
8873
#ifdef HAVE_CURVE25519
8874
            wc_curve25519_free((curve25519_key*)current->key);
8875
#endif
8876
0
        }
8877
0
        else if (current->group == WOLFSSL_ECC_X448) {
8878
#ifdef HAVE_CURVE448
8879
            wc_curve448_free((curve448_key*)current->key);
8880
#endif
8881
0
        }
8882
#ifdef WOLFSSL_HAVE_MLKEM
8883
        else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
8884
            wc_KyberKey_Free((KyberKey*)current->key);
8885
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8886
            if (current->privKey != NULL) {
8887
                ForceZero(current->privKey, current->privKeyLen);
8888
            }
8889
        #endif
8890
        }
8891
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
8892
            int ecc_group = 0;
8893
            findEccPqc(&ecc_group, NULL, NULL, current->group);
8894
8895
            /* Free PQC private key */
8896
        #ifdef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8897
            wc_KyberKey_Free((KyberKey*)current->privKey);
8898
        #else
8899
            if (current->privKey != NULL) {
8900
                ForceZero(current->privKey, current->privKeyLen);
8901
            }
8902
        #endif
8903
8904
            /* Free ECC private key */
8905
            if (ecc_group == WOLFSSL_ECC_X25519) {
8906
            #ifdef HAVE_CURVE25519
8907
                wc_curve25519_free((curve25519_key*)current->key);
8908
            #endif
8909
            }
8910
            else if (ecc_group == WOLFSSL_ECC_X448) {
8911
            #ifdef HAVE_CURVE448
8912
                wc_curve448_free((curve448_key*)current->key);
8913
            #endif
8914
            }
8915
            else {
8916
            #ifdef HAVE_ECC
8917
                wc_ecc_free((ecc_key*)current->key);
8918
            #endif
8919
            }
8920
        }
8921
#endif
8922
0
        else {
8923
0
#ifdef HAVE_ECC
8924
0
            wc_ecc_free((ecc_key*)current->key);
8925
0
#endif
8926
0
        }
8927
0
        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
8928
0
    #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
8929
0
        XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY);
8930
0
    #endif
8931
0
        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
8932
0
        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
8933
0
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
8934
0
    }
8935
8936
0
    (void)heap;
8937
0
}
8938
8939
/* Get the size of the encoded key share extension.
8940
 *
8941
 * list     The linked list of key share extensions.
8942
 * msgType  The type of the message this extension is being written into.
8943
 * returns the number of bytes of the encoded key share extension.
8944
 */
8945
static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
8946
0
{
8947
0
    word16         len = 0;
8948
0
    byte           isRequest = (msgType == client_hello);
8949
0
    KeyShareEntry* current;
8950
8951
    /* The named group the server wants to use. */
8952
0
    if (msgType == hello_retry_request)
8953
0
        return OPAQUE16_LEN;
8954
8955
    /* List of key exchange groups. */
8956
0
    if (isRequest)
8957
0
        len += OPAQUE16_LEN;
8958
0
    while ((current = list) != NULL) {
8959
0
        list = current->next;
8960
8961
0
        if (!isRequest && current->pubKey == NULL)
8962
0
            continue;
8963
8964
0
        len += (word16)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
8965
0
    }
8966
8967
0
    return len;
8968
0
}
8969
8970
/* Writes the key share extension into the output buffer.
8971
 * Assumes that the the output buffer is big enough to hold data.
8972
 *
8973
 * list     The linked list of key share entries.
8974
 * output   The buffer to write into.
8975
 * msgType  The type of the message this extension is being written into.
8976
 * returns the number of bytes written into the buffer.
8977
 */
8978
static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
8979
                                  byte msgType)
8980
0
{
8981
0
    word16         i = 0;
8982
0
    byte           isRequest = (msgType == client_hello);
8983
0
    KeyShareEntry* current;
8984
8985
0
    if (msgType == hello_retry_request) {
8986
0
        c16toa(list->group, output);
8987
0
        return OPAQUE16_LEN;
8988
0
    }
8989
8990
    /* ClientHello has a list but ServerHello is only the chosen. */
8991
0
    if (isRequest)
8992
0
        i += OPAQUE16_LEN;
8993
8994
    /* Write out all in the list. */
8995
0
    while ((current = list) != NULL) {
8996
0
        list = current->next;
8997
8998
0
        if (!isRequest && current->pubKey == NULL)
8999
0
            continue;
9000
9001
0
        c16toa(current->group, &output[i]);
9002
0
        i += KE_GROUP_LEN;
9003
0
        c16toa((word16)(current->pubKeyLen), &output[i]);
9004
0
        i += OPAQUE16_LEN;
9005
0
        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
9006
0
        i += (word16)current->pubKeyLen;
9007
0
    }
9008
    /* Write the length of the list if required. */
9009
0
    if (isRequest)
9010
0
        c16toa(i - OPAQUE16_LEN, output);
9011
9012
0
    return i;
9013
0
}
9014
9015
/* Process the DH key share extension on the client side.
9016
 *
9017
 * ssl            The SSL/TLS object.
9018
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9019
 * returns 0 on success and other values indicate failure.
9020
 */
9021
static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9022
0
{
9023
0
    int ret = 0;
9024
0
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
9025
0
    word32 pSz = 0;
9026
0
    DhKey* dhKey = (DhKey*)keyShareEntry->key;
9027
9028
0
#ifdef HAVE_PUBLIC_FFDHE
9029
0
    const DhParams* params = NULL;
9030
0
    switch (keyShareEntry->group) {
9031
0
    #ifdef HAVE_FFDHE_2048
9032
0
        case WOLFSSL_FFDHE_2048:
9033
0
            params = wc_Dh_ffdhe2048_Get();
9034
0
            break;
9035
0
    #endif
9036
    #ifdef HAVE_FFDHE_3072
9037
        case WOLFSSL_FFDHE_3072:
9038
            params = wc_Dh_ffdhe3072_Get();
9039
            break;
9040
    #endif
9041
    #ifdef HAVE_FFDHE_4096
9042
        case WOLFSSL_FFDHE_4096:
9043
            params = wc_Dh_ffdhe4096_Get();
9044
            break;
9045
    #endif
9046
    #ifdef HAVE_FFDHE_6144
9047
        case WOLFSSL_FFDHE_6144:
9048
            params = wc_Dh_ffdhe6144_Get();
9049
            break;
9050
    #endif
9051
    #ifdef HAVE_FFDHE_8192
9052
        case WOLFSSL_FFDHE_8192:
9053
            params = wc_Dh_ffdhe8192_Get();
9054
            break;
9055
    #endif
9056
0
        default:
9057
0
            break;
9058
0
    }
9059
0
    if (params == NULL) {
9060
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9061
0
        return PEER_KEY_ERROR;
9062
0
    }
9063
0
    pSz = params->p_len;
9064
#else
9065
    ret = wc_DhGetNamedKeyParamSize(keyShareEntry->group, &pSz, NULL, NULL);
9066
    if (ret != 0 || pSz == 0) {
9067
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9068
        return PEER_KEY_ERROR;
9069
    }
9070
#endif
9071
9072
    /* if DhKey is not setup, do it now */
9073
0
    if (keyShareEntry->key == NULL) {
9074
0
        keyShareEntry->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
9075
0
            DYNAMIC_TYPE_DH);
9076
0
        if (keyShareEntry->key == NULL)
9077
0
            return MEMORY_E;
9078
9079
        /* Setup Key */
9080
0
        ret = wc_InitDhKey_ex((DhKey*)keyShareEntry->key, ssl->heap, ssl->devId);
9081
0
        if (ret == 0) {
9082
0
            dhKey = (DhKey*)keyShareEntry->key;
9083
        /* Set key */
9084
0
        #ifdef HAVE_PUBLIC_FFDHE
9085
0
            ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
9086
0
                                                                params->g_len);
9087
        #else
9088
            ret = wc_DhSetNamedKey(dhKey, keyShareEntry->group);
9089
        #endif
9090
0
        }
9091
0
    }
9092
9093
0
    if (ret == 0
9094
    #ifdef WOLFSSL_ASYNC_CRYPT
9095
        && keyShareEntry->lastRet == 0 /* don't enter here if WC_PENDING_E */
9096
    #endif
9097
0
    ) {
9098
    #ifdef WOLFSSL_DEBUG_TLS
9099
        WOLFSSL_MSG("Peer DH Key");
9100
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9101
    #endif
9102
9103
0
        ssl->options.dhKeySz = (word16)pSz;
9104
9105
        /* Derive secret from private key and peer's public key. */
9106
0
        ret = DhAgree(ssl, dhKey,
9107
0
            (const byte*)keyShareEntry->privKey, keyShareEntry->keyLen, /* our private */
9108
0
            keyShareEntry->ke, keyShareEntry->keLen,                    /* peer's public key */
9109
0
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,    /* secret */
9110
0
            NULL, 0
9111
0
        );
9112
    #ifdef WOLFSSL_ASYNC_CRYPT
9113
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9114
            return ret;
9115
        }
9116
    #endif
9117
0
    }
9118
9119
    /* RFC 8446 Section 7.4.1:
9120
     *     ... left-padded with zeros up to the size of the prime. ...
9121
     */
9122
0
    if (ret == 0 && (word32)ssl->options.dhKeySz > ssl->arrays->preMasterSz) {
9123
0
        word32 diff = (word32)ssl->options.dhKeySz - ssl->arrays->preMasterSz;
9124
0
        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
9125
0
                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9126
0
        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
9127
0
        ssl->arrays->preMasterSz = ssl->options.dhKeySz;
9128
0
    }
9129
9130
    /* done with key share, release resources */
9131
0
    if (dhKey)
9132
0
        wc_FreeDhKey(dhKey);
9133
0
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
9134
0
    keyShareEntry->key = NULL;
9135
0
    if (keyShareEntry->privKey) {
9136
0
        ForceZero(keyShareEntry->privKey, keyShareEntry->keyLen);
9137
0
        XFREE(keyShareEntry->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9138
0
        keyShareEntry->privKey = NULL;
9139
0
    }
9140
0
    XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9141
0
    keyShareEntry->pubKey = NULL;
9142
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9143
0
    keyShareEntry->ke = NULL;
9144
#else
9145
    (void)ssl;
9146
    (void)keyShareEntry;
9147
    ret = PEER_KEY_ERROR;
9148
    WOLFSSL_ERROR_VERBOSE(ret);
9149
#endif
9150
0
    return ret;
9151
0
}
9152
9153
/* Process the X25519 key share extension on the client side.
9154
 *
9155
 * ssl            The SSL/TLS object.
9156
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9157
 * ssOutput       The destination buffer for the shared secret.
9158
 * ssOutSz        The size of the generated shared secret.
9159
 *
9160
 * returns 0 on success and other values indicate failure.
9161
 */
9162
static int TLSX_KeyShare_ProcessX25519_ex(WOLFSSL* ssl,
9163
                                          KeyShareEntry* keyShareEntry,
9164
                                          unsigned char* ssOutput,
9165
                                          word32* ssOutSz)
9166
0
{
9167
0
    int ret;
9168
9169
#ifdef HAVE_CURVE25519
9170
    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
9171
    curve25519_key* peerX25519Key;
9172
9173
#ifdef HAVE_ECC
9174
    if (ssl->peerEccKey != NULL) {
9175
        wc_ecc_free(ssl->peerEccKey);
9176
        ssl->peerEccKey = NULL;
9177
        ssl->peerEccKeyPresent = 0;
9178
    }
9179
#endif
9180
9181
    peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
9182
                                                             DYNAMIC_TYPE_TLSX);
9183
    if (peerX25519Key == NULL) {
9184
        WOLFSSL_MSG("PeerEccKey Memory error");
9185
        return MEMORY_ERROR;
9186
    }
9187
    ret = wc_curve25519_init(peerX25519Key);
9188
    if (ret != 0) {
9189
        XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9190
        return ret;
9191
    }
9192
#ifdef WOLFSSL_DEBUG_TLS
9193
    WOLFSSL_MSG("Peer Curve25519 Key");
9194
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9195
#endif
9196
9197
    if (wc_curve25519_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9198
                                                  EC25519_LITTLE_ENDIAN) != 0) {
9199
        ret = ECC_PEERKEY_ERROR;
9200
        WOLFSSL_ERROR_VERBOSE(ret);
9201
    }
9202
9203
    if (ret == 0) {
9204
        if (wc_curve25519_import_public_ex(keyShareEntry->ke,
9205
                                            keyShareEntry->keLen, peerX25519Key,
9206
                                            EC25519_LITTLE_ENDIAN) != 0) {
9207
            ret = ECC_PEERKEY_ERROR;
9208
            WOLFSSL_ERROR_VERBOSE(ret);
9209
        }
9210
    }
9211
9212
    if (ret == 0) {
9213
        ssl->ecdhCurveOID = ECC_X25519_OID;
9214
    #ifdef WOLFSSL_CURVE25519_BLINDING
9215
        ret = wc_curve25519_set_rng(key, ssl->rng);
9216
    }
9217
    if (ret == 0) {
9218
    #endif
9219
        ret = wc_curve25519_shared_secret_ex(key, peerX25519Key,
9220
                    ssOutput, ssOutSz, EC25519_LITTLE_ENDIAN);
9221
    }
9222
9223
    wc_curve25519_free(peerX25519Key);
9224
    XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9225
    wc_curve25519_free((curve25519_key*)keyShareEntry->key);
9226
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9227
    keyShareEntry->key = NULL;
9228
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9229
    keyShareEntry->ke = NULL;
9230
#else
9231
0
    (void)ssl;
9232
0
    (void)keyShareEntry;
9233
0
    (void)ssOutput;
9234
0
    (void)ssOutSz;
9235
9236
0
    ret = PEER_KEY_ERROR;
9237
0
    WOLFSSL_ERROR_VERBOSE(ret);
9238
0
#endif /* HAVE_CURVE25519 */
9239
9240
0
    return ret;
9241
0
}
9242
9243
/* Process the X25519 key share extension on the client side.
9244
 *
9245
 * ssl            The SSL/TLS object.
9246
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9247
 *
9248
 * returns 0 on success and other values indicate failure.
9249
 */
9250
static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
9251
                                       KeyShareEntry* keyShareEntry)
9252
0
{
9253
0
    return TLSX_KeyShare_ProcessX25519_ex(ssl, keyShareEntry,
9254
0
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9255
0
}
9256
9257
/* Process the X448 key share extension on the client side.
9258
 *
9259
 * ssl            The SSL/TLS object.
9260
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9261
 * ssOutput       The destination buffer for the shared secret.
9262
 * ssOutSz        The size of the generated shared secret.
9263
 *
9264
 * returns 0 on success and other values indicate failure.
9265
 */
9266
static int TLSX_KeyShare_ProcessX448_ex(WOLFSSL* ssl,
9267
                                        KeyShareEntry* keyShareEntry,
9268
                                        unsigned char* ssOutput,
9269
                                        word32* ssOutSz)
9270
0
{
9271
0
    int ret;
9272
9273
#ifdef HAVE_CURVE448
9274
    curve448_key* key = (curve448_key*)keyShareEntry->key;
9275
    curve448_key* peerX448Key;
9276
9277
#ifdef HAVE_ECC
9278
    if (ssl->peerEccKey != NULL) {
9279
        wc_ecc_free(ssl->peerEccKey);
9280
        ssl->peerEccKey = NULL;
9281
        ssl->peerEccKeyPresent = 0;
9282
    }
9283
#endif
9284
9285
    peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
9286
                                                             DYNAMIC_TYPE_TLSX);
9287
    if (peerX448Key == NULL) {
9288
        WOLFSSL_MSG("PeerEccKey Memory error");
9289
        return MEMORY_ERROR;
9290
    }
9291
    ret = wc_curve448_init(peerX448Key);
9292
    if (ret != 0) {
9293
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9294
        return ret;
9295
    }
9296
#ifdef WOLFSSL_DEBUG_TLS
9297
    WOLFSSL_MSG("Peer Curve448 Key");
9298
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9299
#endif
9300
9301
    if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9302
                                                    EC448_LITTLE_ENDIAN) != 0) {
9303
        ret = ECC_PEERKEY_ERROR;
9304
        WOLFSSL_ERROR_VERBOSE(ret);
9305
    }
9306
9307
    if (ret == 0) {
9308
        if (wc_curve448_import_public_ex(keyShareEntry->ke,
9309
                                              keyShareEntry->keLen, peerX448Key,
9310
                                              EC448_LITTLE_ENDIAN) != 0) {
9311
            ret = ECC_PEERKEY_ERROR;
9312
            WOLFSSL_ERROR_VERBOSE(ret);
9313
        }
9314
    }
9315
9316
    if (ret == 0) {
9317
        ssl->ecdhCurveOID = ECC_X448_OID;
9318
9319
        ret = wc_curve448_shared_secret_ex(key, peerX448Key,
9320
                    ssOutput, ssOutSz, EC448_LITTLE_ENDIAN);
9321
    }
9322
9323
    wc_curve448_free(peerX448Key);
9324
    XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9325
    wc_curve448_free((curve448_key*)keyShareEntry->key);
9326
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9327
    keyShareEntry->key = NULL;
9328
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9329
    keyShareEntry->ke = NULL;
9330
#else
9331
0
    (void)ssl;
9332
0
    (void)keyShareEntry;
9333
0
    (void)ssOutput;
9334
0
    (void)ssOutSz;
9335
9336
0
    ret = PEER_KEY_ERROR;
9337
0
    WOLFSSL_ERROR_VERBOSE(ret);
9338
0
#endif /* HAVE_CURVE448 */
9339
9340
0
    return ret;
9341
0
}
9342
9343
/* Process the X448 key share extension on the client side.
9344
 *
9345
 * ssl            The SSL/TLS object.
9346
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9347
 * returns 0 on success and other values indicate failure.
9348
 */
9349
static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9350
0
{
9351
0
    return TLSX_KeyShare_ProcessX448_ex(ssl, keyShareEntry,
9352
0
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9353
0
}
9354
9355
/* Process the ECC key share extension on the client side.
9356
 *
9357
 * ssl            The SSL/TLS object.
9358
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9359
 * ssOutput       The destination buffer for the shared secret.
9360
 * ssOutSz        The size of the generated shared secret.
9361
 *
9362
 * returns 0 on success and other values indicate failure.
9363
 */
9364
static int TLSX_KeyShare_ProcessEcc_ex(WOLFSSL* ssl,
9365
                                       KeyShareEntry* keyShareEntry,
9366
                                       unsigned char* ssOutput,
9367
                                       word32* ssOutSz)
9368
0
{
9369
0
    int ret = 0;
9370
0
#ifdef HAVE_ECC
9371
0
    int curveId = ECC_CURVE_INVALID;
9372
0
    ecc_key* eccKey = (ecc_key*)keyShareEntry->key;
9373
9374
    /* find supported curve */
9375
0
    switch (keyShareEntry->group) {
9376
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
9377
0
        #ifndef NO_ECC_SECP
9378
0
        case WOLFSSL_ECC_SECP256R1:
9379
0
            curveId = ECC_SECP256R1;
9380
0
            break;
9381
0
        #endif /* !NO_ECC_SECP */
9382
        #ifdef WOLFSSL_SM2
9383
        case WOLFSSL_ECC_SM2P256V1:
9384
            curveId = ECC_SM2P256V1;
9385
            break;
9386
        #endif
9387
0
    #endif
9388
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
9389
0
        #ifndef NO_ECC_SECP
9390
0
        case WOLFSSL_ECC_SECP384R1:
9391
0
            curveId = ECC_SECP384R1;
9392
0
            break;
9393
0
        #endif /* !NO_ECC_SECP */
9394
0
    #endif
9395
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
9396
0
        #ifndef NO_ECC_SECP
9397
0
        case WOLFSSL_ECC_SECP521R1:
9398
0
            curveId = ECC_SECP521R1;
9399
0
            break;
9400
0
        #endif /* !NO_ECC_SECP */
9401
0
    #endif
9402
    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
9403
        case WOLFSSL_ECC_X448:
9404
            curveId = ECC_X448;
9405
            break;
9406
    #endif
9407
0
        default:
9408
            /* unsupported curve */
9409
0
            WOLFSSL_ERROR_VERBOSE(ECC_PEERKEY_ERROR);
9410
0
            return ECC_PEERKEY_ERROR;
9411
0
    }
9412
9413
#ifdef WOLFSSL_ASYNC_CRYPT
9414
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9415
#endif
9416
0
    {
9417
    #ifdef WOLFSSL_DEBUG_TLS
9418
        WOLFSSL_MSG("Peer ECC Key");
9419
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9420
    #endif
9421
9422
0
        if (ssl->peerEccKey != NULL) {
9423
0
            wc_ecc_free(ssl->peerEccKey);
9424
0
            XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9425
0
            ssl->peerEccKeyPresent = 0;
9426
0
        }
9427
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
9428
        ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry);
9429
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
9430
            return ret;
9431
        }
9432
        ret = 0;
9433
#endif
9434
9435
0
        ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
9436
0
                                            DYNAMIC_TYPE_ECC);
9437
0
        if (ssl->peerEccKey == NULL) {
9438
0
            WOLFSSL_MSG("PeerEccKey Memory error");
9439
0
            ret = MEMORY_ERROR;
9440
0
        }
9441
9442
0
        if (ret == 0) {
9443
0
            ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
9444
0
        }
9445
9446
        /* Point is validated by import function. */
9447
0
        if (ret == 0) {
9448
0
            ret = wc_ecc_import_x963_ex(keyShareEntry->ke, keyShareEntry->keLen,
9449
0
                                ssl->peerEccKey, curveId);
9450
0
            if (ret != 0) {
9451
0
                ret = ECC_PEERKEY_ERROR;
9452
0
                WOLFSSL_ERROR_VERBOSE(ret);
9453
0
            }
9454
0
        }
9455
9456
0
        if (ret == 0) {
9457
0
            ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
9458
0
            ssl->peerEccKeyPresent = 1;
9459
0
        }
9460
0
    }
9461
9462
0
    if (ret == 0 && eccKey == NULL)
9463
0
        ret = BAD_FUNC_ARG;
9464
0
    if (ret == 0) {
9465
0
        ret = EccSharedSecret(ssl, eccKey, ssl->peerEccKey,
9466
0
            keyShareEntry->ke, &keyShareEntry->keLen,
9467
0
            ssOutput, ssOutSz, ssl->options.side);
9468
    #ifdef WOLFSSL_ASYNC_CRYPT
9469
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
9470
            return ret;
9471
    #endif
9472
0
    }
9473
9474
    /* done with key share, release resources */
9475
0
    if (ssl->peerEccKey != NULL
9476
    #ifdef HAVE_PK_CALLBACKS
9477
        && ssl->ctx->EccSharedSecretCb == NULL
9478
    #endif
9479
0
    ) {
9480
0
        wc_ecc_free(ssl->peerEccKey);
9481
0
        XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9482
0
        ssl->peerEccKey = NULL;
9483
0
        ssl->peerEccKeyPresent = 0;
9484
0
    }
9485
0
    if (keyShareEntry->key) {
9486
0
        wc_ecc_free((ecc_key*)keyShareEntry->key);
9487
0
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_ECC);
9488
0
        keyShareEntry->key = NULL;
9489
0
    }
9490
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9491
0
    keyShareEntry->ke = NULL;
9492
#else
9493
    (void)ssl;
9494
    (void)keyShareEntry;
9495
    (void)ssOutput;
9496
    (void)ssOutSz;
9497
9498
    ret = PEER_KEY_ERROR;
9499
    WOLFSSL_ERROR_VERBOSE(ret);
9500
#endif /* HAVE_ECC */
9501
9502
0
    return ret;
9503
0
}
9504
9505
/* Process the ECC key share extension on the client side.
9506
 *
9507
 * ssl            The SSL/TLS object.
9508
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9509
 * returns 0 on success and other values indicate failure.
9510
 */
9511
static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9512
0
{
9513
0
    return TLSX_KeyShare_ProcessEcc_ex(ssl, keyShareEntry,
9514
0
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9515
0
}
9516
9517
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9518
/* Process the Kyber key share extension on the client side.
9519
 *
9520
 * ssl            The SSL/TLS object.
9521
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9522
 * ssOutput       The destination buffer for the shared secret.
9523
 * ssOutSz        The size of the generated shared secret.
9524
 *
9525
 * returns 0 on success and other values indicate failure.
9526
 */
9527
static int TLSX_KeyShare_ProcessPqcClient_ex(WOLFSSL* ssl,
9528
                                             KeyShareEntry* keyShareEntry,
9529
                                             unsigned char* ssOutput,
9530
                                             word32* ssOutSz)
9531
{
9532
    int       ret = 0;
9533
    KyberKey* kem = (KyberKey*)keyShareEntry->key;
9534
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9535
    word32    privSz = 0;
9536
#endif
9537
    word32    ctSz = 0;
9538
    word32    ssSz = 0;
9539
9540
    if (ssl->options.side == WOLFSSL_SERVER_END) {
9541
        /* I am the server, the shared secret has already been generated and
9542
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
9543
        return 0;
9544
    }
9545
9546
    if (keyShareEntry->ke == NULL) {
9547
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
9548
        return BAD_FUNC_ARG;
9549
    }
9550
    if (ssOutSz == NULL)
9551
        return BAD_FUNC_ARG;
9552
9553
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9554
    if (kem == NULL) {
9555
        int type = 0;
9556
9557
        /* Allocate a Kyber key to hold private key. */
9558
        kem = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
9559
                                  DYNAMIC_TYPE_PRIVATE_KEY);
9560
        if (kem == NULL) {
9561
            WOLFSSL_MSG("GenPqcKey memory error");
9562
            ret = MEMORY_E;
9563
        }
9564
        if (ret == 0) {
9565
            ret = mlkem_id2type(keyShareEntry->group, &type);
9566
        }
9567
        if (ret != 0) {
9568
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
9569
            ret = BAD_FUNC_ARG;
9570
        }
9571
        if (ret == 0) {
9572
            ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
9573
            if (ret != 0) {
9574
                WOLFSSL_MSG("Error creating Kyber KEM");
9575
            }
9576
        }
9577
    }
9578
#else
9579
    if (kem == NULL || keyShareEntry->privKeyLen != 0) {
9580
        WOLFSSL_MSG("Invalid Kyber key.");
9581
        ret = BAD_FUNC_ARG;
9582
    }
9583
#endif
9584
9585
    if (ret == 0) {
9586
        ret = wc_KyberKey_SharedSecretSize(kem, &ssSz);
9587
    }
9588
    if (ret == 0) {
9589
        ret = wc_KyberKey_CipherTextSize(kem, &ctSz);
9590
    }
9591
9592
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9593
    if (ret == 0) {
9594
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
9595
    }
9596
    if (ret == 0 && privSz != keyShareEntry->privKeyLen) {
9597
        WOLFSSL_MSG("Invalid private key size.");
9598
        ret = BAD_FUNC_ARG;
9599
    }
9600
    if (ret == 0) {
9601
        ret = wc_KyberKey_DecodePrivateKey(kem, keyShareEntry->privKey, privSz);
9602
    }
9603
#endif
9604
9605
    if (ret == 0) {
9606
        ret = wc_KyberKey_Decapsulate(kem, ssOutput,
9607
                                      keyShareEntry->ke, ctSz);
9608
        if (ret != 0) {
9609
            WOLFSSL_MSG("wc_KyberKey decapsulation failure.");
9610
            ret = BAD_FUNC_ARG;
9611
        }
9612
    }
9613
    if (ret == 0) {
9614
        *ssOutSz = ssSz;
9615
    }
9616
9617
    wc_KyberKey_Free(kem);
9618
9619
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9620
    keyShareEntry->key = NULL;
9621
9622
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9623
    keyShareEntry->ke = NULL;
9624
9625
    return ret;
9626
}
9627
9628
/* Process the Kyber key share extension on the client side.
9629
 *
9630
 * ssl            The SSL/TLS object.
9631
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9632
 *
9633
 * returns 0 on success and other values indicate failure.
9634
 */
9635
static int TLSX_KeyShare_ProcessPqcClient(WOLFSSL* ssl,
9636
                                          KeyShareEntry* keyShareEntry)
9637
{
9638
    return TLSX_KeyShare_ProcessPqcClient_ex(ssl, keyShareEntry,
9639
                                             ssl->arrays->preMasterSecret,
9640
                                             &ssl->arrays->preMasterSz);
9641
}
9642
9643
/* Process the hybrid key share extension on the client side.
9644
 *
9645
 * ssl            The SSL/TLS object.
9646
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9647
 * returns 0 on success and other values indicate failure.
9648
 */
9649
static int TLSX_KeyShare_ProcessPqcHybridClient(WOLFSSL* ssl,
9650
                                                KeyShareEntry* keyShareEntry)
9651
{
9652
    int      ret = 0;
9653
    int      pqc_group = 0;
9654
    int      ecc_group = 0;
9655
    int      pqc_first = 0;
9656
    KeyShareEntry* pqc_kse = NULL;
9657
    KeyShareEntry *ecc_kse = NULL;
9658
    word32   ctSz = 0;
9659
    word32   ssSzPqc = 0;
9660
    word32   ssSzEcc = 0;
9661
9662
    if (ssl->options.side == WOLFSSL_SERVER_END) {
9663
        /* I am the server, the shared secret has already been generated and
9664
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
9665
        return 0;
9666
    }
9667
9668
    if (keyShareEntry->ke == NULL) {
9669
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
9670
        return BAD_FUNC_ARG;
9671
    }
9672
9673
    /* I am the client, both the PQC ciphertext and the ECHD public key are in
9674
     * keyShareEntry->ke */
9675
9676
    /* Determine the ECC and PQC group of the hybrid combination */
9677
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
9678
    if (ecc_group == 0 || pqc_group == 0) {
9679
        WOLFSSL_MSG("Invalid hybrid group");
9680
        ret = BAD_FUNC_ARG;
9681
    }
9682
9683
    if (ret == 0) {
9684
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
9685
                   DYNAMIC_TYPE_TLSX);
9686
        if (ecc_kse == NULL) {
9687
            WOLFSSL_MSG("kse memory allocation failure");
9688
            ret = MEMORY_ERROR;
9689
        }
9690
        else {
9691
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
9692
        }
9693
    }
9694
    if (ret == 0) {
9695
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
9696
                   DYNAMIC_TYPE_TLSX);
9697
        if (pqc_kse == NULL) {
9698
            WOLFSSL_MSG("kse memory allocation failure");
9699
            ret = MEMORY_ERROR;
9700
        }
9701
        else {
9702
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
9703
        }
9704
    }
9705
9706
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
9707
     * decode these sizes to separate the KEM ciphertext from the ECDH public
9708
     * key. */
9709
    if (ret == 0) {
9710
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9711
        int type;
9712
9713
        pqc_kse->privKey = keyShareEntry->privKey;
9714
9715
        ret = mlkem_id2type(pqc_group, &type);
9716
        if (ret != 0) {
9717
            WOLFSSL_MSG("Invalid Kyber algorithm specified.");
9718
            ret = BAD_FUNC_ARG;
9719
        }
9720
        if (ret == 0) {
9721
            pqc_kse->key = XMALLOC(sizeof(KyberKey), ssl->heap,
9722
                                DYNAMIC_TYPE_PRIVATE_KEY);
9723
            if (pqc_kse->key == NULL) {
9724
                WOLFSSL_MSG("GenPqcKey memory error");
9725
                ret = MEMORY_E;
9726
            }
9727
        }
9728
        if (ret == 0) {
9729
            ret = wc_KyberKey_Init(type, (KyberKey*)pqc_kse->key,
9730
                                   ssl->heap, ssl->devId);
9731
            if (ret != 0) {
9732
                WOLFSSL_MSG("Error creating Kyber KEM");
9733
            }
9734
        }
9735
    #else
9736
        pqc_kse->key = keyShareEntry->privKey;
9737
    #endif
9738
9739
        pqc_kse->group = pqc_group;
9740
        pqc_kse->privKeyLen = keyShareEntry->privKeyLen;
9741
9742
        if (ret == 0) {
9743
            ret = wc_KyberKey_SharedSecretSize((KyberKey*)pqc_kse->key,
9744
                                               &ssSzPqc);
9745
        }
9746
        if (ret == 0) {
9747
            ret = wc_KyberKey_CipherTextSize((KyberKey*)pqc_kse->key,
9748
                                             &ctSz);
9749
            if (ret == 0 && keyShareEntry->keLen <= ctSz) {
9750
                WOLFSSL_MSG("Invalid ciphertext size.");
9751
                ret = BAD_FUNC_ARG;
9752
            }
9753
        }
9754
        if (ret == 0) {
9755
            pqc_kse->keLen = ctSz;
9756
            pqc_kse->ke = (byte*)XMALLOC(pqc_kse->keLen, ssl->heap,
9757
                                         DYNAMIC_TYPE_PUBLIC_KEY);
9758
            if (pqc_kse->ke == NULL) {
9759
                WOLFSSL_MSG("pqc_kse memory allocation failure");
9760
                ret = MEMORY_ERROR;
9761
            }
9762
            /* Copy the PQC KEM ciphertext. Depending on the pqc_first flag,
9763
             * the KEM ciphertext comes before or after the ECDH public key. */
9764
            if (ret == 0) {
9765
                int offset = keyShareEntry->keLen - ctSz;
9766
9767
                if (pqc_first)
9768
                    offset = 0;
9769
9770
                XMEMCPY(pqc_kse->ke, keyShareEntry->ke + offset, ctSz);
9771
            }
9772
        }
9773
    }
9774
9775
    if (ret == 0) {
9776
        ecc_kse->group = ecc_group;
9777
        ecc_kse->keLen = keyShareEntry->keLen - ctSz;
9778
        ecc_kse->key = keyShareEntry->key;
9779
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
9780
                                        DYNAMIC_TYPE_PUBLIC_KEY);
9781
        if (ecc_kse->ke == NULL) {
9782
            WOLFSSL_MSG("ecc_kse memory allocation failure");
9783
            ret = MEMORY_ERROR;
9784
        }
9785
        /* Copy the ECDH public key. Depending on the pqc_first flag, the
9786
         * KEM ciphertext comes before or after the ECDH public key. */
9787
        if (ret == 0) {
9788
            int offset = 0;
9789
9790
            if (pqc_first)
9791
                offset = ctSz;
9792
9793
            XMEMCPY(ecc_kse->ke, keyShareEntry->ke + offset, ecc_kse->keLen);
9794
        }
9795
    }
9796
9797
    /* Process ECDH key share part. The generated shared secret is directly
9798
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
9799
     * pqc_first flag, the ECDH shared secret part goes before or after the
9800
     * KEM part. */
9801
    if (ret == 0) {
9802
        int offset = 0;
9803
9804
        /* Set the ECC size variable to the initial buffer size */
9805
        ssSzEcc = ssl->arrays->preMasterSz;
9806
9807
        if (pqc_first)
9808
            offset = ssSzPqc;
9809
9810
    #ifdef HAVE_CURVE25519
9811
        if (ecc_group == WOLFSSL_ECC_X25519) {
9812
            ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
9813
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9814
        }
9815
        else
9816
    #endif
9817
    #ifdef HAVE_CURVE448
9818
        if (ecc_group == WOLFSSL_ECC_X448) {
9819
            ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
9820
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9821
        }
9822
        else
9823
    #endif
9824
        {
9825
            ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
9826
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9827
        }
9828
    }
9829
9830
    if (ret == 0) {
9831
        keyShareEntry->key = ecc_kse->key;
9832
9833
        if ((ret == 0) && ((ssSzEcc + ssSzPqc) > ENCRYPT_LEN)) {
9834
            WOLFSSL_MSG("shared secret is too long.");
9835
            ret = LENGTH_ERROR;
9836
        }
9837
    }
9838
9839
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
9840
     * KEM shared secret part goes before or after the ECDH part. */
9841
    if (ret == 0) {
9842
        int offset = ssSzEcc;
9843
9844
        if (pqc_first)
9845
            offset = 0;
9846
9847
        ret = TLSX_KeyShare_ProcessPqcClient_ex(ssl, pqc_kse,
9848
                ssl->arrays->preMasterSecret + offset, &ssSzPqc);
9849
    }
9850
9851
    if (ret == 0) {
9852
        keyShareEntry->privKey = (byte*)pqc_kse->key;
9853
9854
        ssl->arrays->preMasterSz = ssSzEcc + ssSzPqc;
9855
    }
9856
9857
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
9858
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
9859
9860
    return ret;
9861
}
9862
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_DECAPSULATE */
9863
9864
/* Process the key share extension on the client side.
9865
 *
9866
 * ssl            The SSL/TLS object.
9867
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9868
 * returns 0 on success and other values indicate failure.
9869
 */
9870
static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9871
0
{
9872
0
    int ret;
9873
9874
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
9875
    ssl->session->namedGroup = keyShareEntry->group;
9876
#endif
9877
    /* reset the pre master secret size */
9878
0
    if (ssl->arrays->preMasterSz == 0)
9879
0
        ssl->arrays->preMasterSz = ENCRYPT_LEN;
9880
9881
    /* Use Key Share Data from server. */
9882
0
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(keyShareEntry->group))
9883
0
        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
9884
0
    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
9885
0
        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
9886
0
    else if (keyShareEntry->group == WOLFSSL_ECC_X448)
9887
0
        ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
9888
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9889
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group))
9890
        ret = TLSX_KeyShare_ProcessPqcClient(ssl, keyShareEntry);
9891
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(keyShareEntry->group))
9892
        ret = TLSX_KeyShare_ProcessPqcHybridClient(ssl, keyShareEntry);
9893
#endif
9894
0
    else
9895
0
        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
9896
9897
#ifdef WOLFSSL_DEBUG_TLS
9898
    if (ret == 0) {
9899
        WOLFSSL_MSG("KE Secret");
9900
        WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9901
    }
9902
#endif
9903
#ifdef WOLFSSL_ASYNC_CRYPT
9904
    keyShareEntry->lastRet = ret;
9905
#endif
9906
9907
0
    return ret;
9908
0
}
9909
9910
/* Parse an entry of the KeyShare extension.
9911
 *
9912
 * ssl     The SSL/TLS object.
9913
 * input   The extension data.
9914
 * length  The length of the extension data.
9915
 * kse     The new key share entry object.
9916
 * returns a positive number to indicate amount of data parsed and a negative
9917
 * number on error.
9918
 */
9919
static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
9920
            word16 length, KeyShareEntry **kse, TLSX** extensions)
9921
0
{
9922
0
    int    ret;
9923
0
    word16 group;
9924
0
    word16 keLen;
9925
0
    int    offset = 0;
9926
0
    byte*  ke;
9927
9928
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN)
9929
0
        return BUFFER_ERROR;
9930
    /* Named group */
9931
0
    ato16(&input[offset], &group);
9932
0
    offset += OPAQUE16_LEN;
9933
    /* Key exchange data - public key. */
9934
0
    ato16(&input[offset], &keLen);
9935
0
    offset += OPAQUE16_LEN;
9936
0
    if (keLen == 0)
9937
0
        return INVALID_PARAMETER;
9938
0
    if (keLen > length - offset)
9939
0
        return BUFFER_ERROR;
9940
9941
#ifdef WOLFSSL_HAVE_MLKEM
9942
    if ((WOLFSSL_NAMED_GROUP_IS_PQC(group) ||
9943
         WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) &&
9944
        ssl->options.side == WOLFSSL_SERVER_END) {
9945
        /* When handling a key share containing a KEM public key on the server
9946
         * end, we have to perform the encapsulation immediately in order to
9947
         * send the resulting ciphertext back to the client in the ServerHello
9948
         * message. As the public key is not stored and we do not modify it, we
9949
         * don't have to create a copy of it.
9950
         * In case of a hybrid key exchange, the ECDH part is also performed
9951
         * immediately (to not split the generation of the master secret).
9952
         * Hence, we also don't have to store this public key either.  */
9953
        ke = (byte *)&input[offset];
9954
    } else
9955
#endif
9956
0
    {
9957
        /* Store a copy in the key share object. */
9958
0
        ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9959
0
        if (ke == NULL)
9960
0
            return MEMORY_E;
9961
0
        XMEMCPY(ke, &input[offset], keLen);
9962
0
    }
9963
9964
    /* Populate a key share object in the extension. */
9965
0
    ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
9966
0
    if (ret != 0) {
9967
0
        if (ke != &input[offset]) {
9968
0
            XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9969
0
        }
9970
0
        return ret;
9971
0
    }
9972
9973
    /* Total length of the parsed data. */
9974
0
    return offset + keLen;
9975
0
}
9976
9977
/* Searches the groups sent for the specified named group.
9978
 *
9979
 * ssl    SSL/TLS object.
9980
 * name   Group name to match.
9981
 * returns 1 when the extension has the group name and 0 otherwise.
9982
 */
9983
static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
9984
0
{
9985
0
    TLSX*          extension;
9986
0
    KeyShareEntry* list;
9987
9988
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
9989
0
    if (extension == NULL) {
9990
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
9991
0
        if (extension == NULL)
9992
0
            return 0;
9993
0
    }
9994
9995
0
    list = (KeyShareEntry*)extension->data;
9996
0
    while (list != NULL) {
9997
0
        if (list->group == group)
9998
0
            return 1;
9999
0
        list = list->next;
10000
0
    }
10001
10002
0
    return 0;
10003
0
}
10004
10005
10006
/* Searches the supported groups extension for the specified named group.
10007
 *
10008
 * ssl   The SSL/TLS object.
10009
 * name  The group name to match.
10010
 * returns 1 when the extension has the group name and 0 otherwise.
10011
 */
10012
static int TLSX_SupportedGroups_Find(const WOLFSSL* ssl, word16 name,
10013
                                     TLSX* extensions)
10014
0
{
10015
0
#ifdef HAVE_SUPPORTED_CURVES
10016
0
    TLSX*          extension;
10017
0
    SupportedCurve* curve = NULL;
10018
10019
0
    if ((extension = TLSX_Find(extensions, TLSX_SUPPORTED_GROUPS)) == NULL) {
10020
0
        if ((extension = TLSX_Find(ssl->ctx->extensions,
10021
0
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
10022
0
            return 0;
10023
0
        }
10024
0
    }
10025
10026
0
    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
10027
0
        if (curve->name == name)
10028
0
            return 1;
10029
0
    }
10030
0
#endif
10031
10032
0
    (void)ssl;
10033
0
    (void)name;
10034
10035
0
    return 0;
10036
0
}
10037
10038
int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl,
10039
        const byte* input, word16 length, TLSX** extensions)
10040
0
{
10041
0
    int ret;
10042
0
    int    offset = 0;
10043
0
    word16 len;
10044
0
    TLSX*  extension;
10045
10046
    /* Add a KeyShare extension if it doesn't exist even if peer sent no
10047
     * entries. The presence of this extension signals that the peer can be
10048
     * negotiated with. */
10049
0
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10050
0
    if (extension == NULL) {
10051
        /* Push new KeyShare extension. */
10052
0
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10053
0
        if (ret != 0)
10054
0
            return ret;
10055
0
    }
10056
10057
0
    if (length < OPAQUE16_LEN)
10058
0
        return BUFFER_ERROR;
10059
10060
    /* ClientHello contains zero or more key share entries. */
10061
0
    ato16(input, &len);
10062
0
    if (len != length - OPAQUE16_LEN)
10063
0
        return BUFFER_ERROR;
10064
0
    offset += OPAQUE16_LEN;
10065
10066
0
    while (offset < (int)length) {
10067
0
        ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset],
10068
0
                length - (word16)offset, NULL, extensions);
10069
0
        if (ret < 0)
10070
0
            return ret;
10071
10072
0
        offset += ret;
10073
0
    }
10074
10075
0
    return 0;
10076
0
}
10077
10078
/* Parse the KeyShare extension.
10079
 * Different formats in different messages.
10080
 *
10081
 * ssl      The SSL/TLS object.
10082
 * input    The extension data.
10083
 * length   The length of the extension data.
10084
 * msgType  The type of the message this extension is being parsed from.
10085
 * returns 0 on success and other values indicate failure.
10086
 */
10087
int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10088
                               byte msgType)
10089
0
{
10090
0
    int ret = 0;
10091
0
    KeyShareEntry *keyShareEntry = NULL;
10092
0
    word16 group;
10093
10094
0
    if (msgType == client_hello) {
10095
0
        ret = TLSX_KeyShare_Parse_ClientHello(ssl, input, length,
10096
0
                                              &ssl->extensions);
10097
0
    }
10098
0
    else if (msgType == server_hello) {
10099
0
        int len;
10100
10101
0
        if (length < OPAQUE16_LEN)
10102
0
            return BUFFER_ERROR;
10103
10104
        /* The data is the named group the server wants to use. */
10105
0
        ato16(input, &group);
10106
10107
        /* Check the selected group was supported by ClientHello extensions. */
10108
0
        if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10109
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10110
0
            return BAD_KEY_SHARE_DATA;
10111
0
        }
10112
10113
        /* Check if the group was sent. */
10114
0
        if (!TLSX_KeyShare_Find(ssl, group)) {
10115
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10116
0
            return BAD_KEY_SHARE_DATA;
10117
0
        }
10118
10119
        /* ServerHello contains one key share entry. */
10120
0
        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry,
10121
0
                &ssl->extensions);
10122
0
        if (len != (int)length)
10123
0
            return BUFFER_ERROR;
10124
10125
        /* Not in list sent if there isn't a private key. */
10126
0
        if (keyShareEntry == NULL || (keyShareEntry->key == NULL
10127
0
        #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
10128
0
            && keyShareEntry->privKey == NULL
10129
0
        #endif
10130
0
        )) {
10131
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10132
0
            return BAD_KEY_SHARE_DATA;
10133
0
        }
10134
10135
        /* Process the entry to calculate the secret. */
10136
0
        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
10137
0
        if (ret == 0)
10138
0
            ssl->session->namedGroup = ssl->namedGroup = group;
10139
0
    }
10140
0
    else if (msgType == hello_retry_request) {
10141
0
        if (length != OPAQUE16_LEN)
10142
0
            return BUFFER_ERROR;
10143
10144
        /* The data is the named group the server wants to use. */
10145
0
        ato16(input, &group);
10146
10147
    #ifdef WOLFSSL_ASYNC_CRYPT
10148
        /* only perform find and clear TLSX if not returning from async */
10149
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
10150
    #endif
10151
0
        {
10152
            /* Check the selected group was supported by ClientHello extensions.
10153
             */
10154
0
            if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10155
0
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10156
0
                return BAD_KEY_SHARE_DATA;
10157
0
            }
10158
10159
            /* Make sure KeyShare for server requested group was not sent in
10160
             * ClientHello. */
10161
0
            if (TLSX_KeyShare_Find(ssl, group)) {
10162
0
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10163
0
                return BAD_KEY_SHARE_DATA;
10164
0
            }
10165
10166
            /* Clear out unusable key shares. */
10167
0
            ret = TLSX_KeyShare_Empty(ssl);
10168
0
            if (ret != 0)
10169
0
                return ret;
10170
0
        }
10171
10172
0
        ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
10173
0
        if (ret == 0)
10174
0
            ssl->session->namedGroup = ssl->namedGroup = group;
10175
0
    }
10176
0
    else {
10177
        /* Not a message type that is allowed to have this extension. */
10178
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10179
0
        return SANITY_MSG_E;
10180
0
    }
10181
10182
0
    return ret;
10183
0
}
10184
10185
/* Create a new key share entry and put it into the list.
10186
 *
10187
 * list           The linked list of key share entries.
10188
 * group          The named group.
10189
 * heap           The memory to allocate with.
10190
 * keyShareEntry  The new key share entry object.
10191
 * returns 0 on success and other values indicate failure.
10192
 */
10193
static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
10194
                             KeyShareEntry** keyShareEntry)
10195
0
{
10196
0
    KeyShareEntry* kse;
10197
0
    KeyShareEntry** next;
10198
10199
0
    kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
10200
0
                                  DYNAMIC_TYPE_TLSX);
10201
0
    if (kse == NULL)
10202
0
        return MEMORY_E;
10203
10204
0
    XMEMSET(kse, 0, sizeof(*kse));
10205
0
    kse->group = (word16)group;
10206
10207
    /* Add it to the back and maintain the links. */
10208
0
    while (*list != NULL) {
10209
        /* Assign to temporary to work around compiler bug found by customer. */
10210
0
        next = &((*list)->next);
10211
0
        list = next;
10212
0
    }
10213
0
    *list = kse;
10214
0
    *keyShareEntry = kse;
10215
10216
0
    (void)heap;
10217
10218
0
    return 0;
10219
0
}
10220
10221
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
10222
/* Process the Kyber key share extension on the server side.
10223
 *
10224
 * ssl            The SSL/TLS object.
10225
 * keyShareEntry  The key share entry object to be sent to the client.
10226
 * data           The key share data received from the client.
10227
 * len            The length of the key share data from the client.
10228
 * ssOutput       The destination buffer for the shared secret.
10229
 * ssOutSz        The size of the generated shared secret.
10230
 *
10231
 * returns 0 on success and other values indicate failure.
10232
 */
10233
static int TLSX_KeyShare_HandlePqcKeyServer(WOLFSSL* ssl,
10234
    KeyShareEntry* keyShareEntry, byte* clientData, word16 clientLen,
10235
    unsigned char* ssOutput, word32* ssOutSz)
10236
{
10237
    /* We are on the server side. The key share contains a PQC KEM public key
10238
     * that we are using for an encapsulate operation. The resulting ciphertext
10239
     * is stored in the server key share. */
10240
    KyberKey* kemKey = (KyberKey*)keyShareEntry->key;
10241
    byte* ciphertext = NULL;
10242
    int ret = 0;
10243
    word32 pubSz = 0;
10244
    word32 ctSz = 0;
10245
    word32 ssSz = 0;
10246
10247
    if (clientData == NULL) {
10248
        WOLFSSL_MSG("No KEM public key from the client.");
10249
        return BAD_FUNC_ARG;
10250
    }
10251
10252
    if (kemKey == NULL) {
10253
        int type = 0;
10254
10255
        /* Allocate a Kyber key to hold private key. */
10256
        kemKey = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
10257
                                     DYNAMIC_TYPE_PRIVATE_KEY);
10258
        if (kemKey == NULL) {
10259
            WOLFSSL_MSG("GenPqcKey memory error");
10260
            ret = MEMORY_E;
10261
        }
10262
        if (ret == 0) {
10263
            ret = mlkem_id2type(keyShareEntry->group, &type);
10264
        }
10265
        if (ret != 0) {
10266
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10267
            ret = BAD_FUNC_ARG;
10268
        }
10269
        if (ret == 0) {
10270
            ret = wc_KyberKey_Init(type, kemKey, ssl->heap, ssl->devId);
10271
            if (ret != 0) {
10272
                WOLFSSL_MSG("Error creating Kyber KEM");
10273
            }
10274
        }
10275
    }
10276
10277
    if (ret == 0) {
10278
        ret = wc_KyberKey_PublicKeySize(kemKey, &pubSz);
10279
    }
10280
    if (ret == 0) {
10281
        ret = wc_KyberKey_CipherTextSize(kemKey, &ctSz);
10282
    }
10283
    if (ret == 0) {
10284
        ret = wc_KyberKey_SharedSecretSize(kemKey, &ssSz);
10285
    }
10286
10287
    if (ret == 0 && clientLen != pubSz) {
10288
        WOLFSSL_MSG("Invalid public key.");
10289
        ret = BAD_FUNC_ARG;
10290
    }
10291
10292
    if (ret == 0) {
10293
        ciphertext = (byte*)XMALLOC(ctSz, ssl->heap, DYNAMIC_TYPE_TLSX);
10294
10295
        if (ciphertext == NULL) {
10296
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10297
            ret = MEMORY_E;
10298
        }
10299
    }
10300
10301
    if (ret == 0) {
10302
        ret = wc_KyberKey_DecodePublicKey(kemKey, clientData, pubSz);
10303
    }
10304
    if (ret == 0) {
10305
        ret = wc_KyberKey_Encapsulate(kemKey, ciphertext,
10306
                                      ssOutput, ssl->rng);
10307
        if (ret != 0) {
10308
            WOLFSSL_MSG("wc_KyberKey encapsulation failure.");
10309
        }
10310
    }
10311
10312
    if (ret == 0) {
10313
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10314
10315
        *ssOutSz = ssSz;
10316
        keyShareEntry->ke = NULL;
10317
        keyShareEntry->keLen = 0;
10318
10319
        keyShareEntry->pubKey = ciphertext;
10320
        keyShareEntry->pubKeyLen = ctSz;
10321
        ciphertext = NULL;
10322
10323
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
10324
         * the server side. */
10325
        ssl->namedGroup = keyShareEntry->group;
10326
    }
10327
10328
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
10329
10330
    wc_KyberKey_Free(kemKey);
10331
    XFREE(kemKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10332
    keyShareEntry->key = NULL;
10333
    return ret;
10334
}
10335
10336
static int TLSX_KeyShare_HandlePqcHybridKeyServer(WOLFSSL* ssl,
10337
    KeyShareEntry* keyShareEntry, byte* data, word16 len)
10338
{
10339
    /* I am the server. The data parameter is the concatenation of the client's
10340
     * ECDH public key and the KEM public key. I need to generate a matching
10341
     * public key for ECDH and encapsulate a shared secret using the KEM public
10342
     * key. We send the ECDH public key and the KEM ciphertext back to the
10343
     * client. Additionally, we create the ECDH shared secret here already.
10344
     */
10345
    int    type;
10346
    byte*  ciphertext = NULL;
10347
    int    ret = 0;
10348
    int    pqc_group = 0;
10349
    int    ecc_group = 0;
10350
    int    pqc_first = 0;
10351
    KeyShareEntry *ecc_kse = NULL;
10352
    KeyShareEntry *pqc_kse = NULL;
10353
    word32 pubSz = 0;
10354
    word32 ctSz = 0;
10355
    word32 ssSzPqc = 0;
10356
    word32 ssSzEcc = 0;
10357
10358
    if (data == NULL) {
10359
        WOLFSSL_MSG("No hybrid key share data from the client.");
10360
        return BAD_FUNC_ARG;
10361
    }
10362
10363
    /* Determine the ECC and PQC group of the hybrid combination */
10364
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
10365
    if (ecc_group == 0 || pqc_group == 0) {
10366
        WOLFSSL_MSG("Invalid hybrid group");
10367
        ret = BAD_FUNC_ARG;
10368
    }
10369
10370
    if (ret == 0) {
10371
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
10372
                   DYNAMIC_TYPE_TLSX);
10373
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
10374
                   DYNAMIC_TYPE_TLSX);
10375
        if (ecc_kse == NULL || pqc_kse == NULL) {
10376
            WOLFSSL_MSG("kse memory allocation failure");
10377
            ret = MEMORY_ERROR;
10378
        }
10379
    }
10380
10381
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
10382
     * decode these sizes to properly concatenate the KEM ciphertext with the
10383
     * ECDH public key. */
10384
    if (ret == 0) {
10385
        XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
10386
        pqc_kse->group = pqc_group;
10387
10388
        /* Allocate a Kyber key to hold private key. */
10389
        pqc_kse->key = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
10390
                                           DYNAMIC_TYPE_PRIVATE_KEY);
10391
        if (pqc_kse->key == NULL) {
10392
            WOLFSSL_MSG("GenPqcKey memory error");
10393
            ret = MEMORY_E;
10394
        }
10395
        if (ret == 0) {
10396
            ret = mlkem_id2type(pqc_kse->group, &type);
10397
        }
10398
        if (ret != 0) {
10399
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10400
            ret = BAD_FUNC_ARG;
10401
        }
10402
        if (ret == 0) {
10403
            ret = wc_KyberKey_Init(type, (KyberKey*)pqc_kse->key,
10404
                                   ssl->heap, ssl->devId);
10405
            if (ret != 0) {
10406
                WOLFSSL_MSG("Error creating Kyber KEM");
10407
            }
10408
        }
10409
        if (ret == 0) {
10410
            ret = wc_KyberKey_SharedSecretSize((KyberKey*)pqc_kse->key,
10411
                                               &ssSzPqc);
10412
        }
10413
        if (ret == 0) {
10414
            ret = wc_KyberKey_CipherTextSize((KyberKey*)pqc_kse->key,
10415
                                             &ctSz);
10416
        }
10417
        if (ret == 0) {
10418
            ret = wc_KyberKey_PublicKeySize((KyberKey*)pqc_kse->key,
10419
                                            &pubSz);
10420
        }
10421
    }
10422
10423
    /* Generate the ECDH key share part to be sent to the client */
10424
    if (ret == 0 && ecc_group != 0) {
10425
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
10426
        ecc_kse->group = ecc_group;
10427
    #ifdef HAVE_CURVE25519
10428
        if (ecc_group == WOLFSSL_ECC_X25519) {
10429
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
10430
        }
10431
        else
10432
    #endif
10433
    #ifdef HAVE_CURVE448
10434
        if (ecc_group == WOLFSSL_ECC_X448) {
10435
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
10436
        }
10437
        else
10438
    #endif
10439
        {
10440
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
10441
        }
10442
        /* No error message, TLSX_KeyShare_GenKey will do it. */
10443
    }
10444
10445
    if (ret == 0 && len != pubSz + ecc_kse->pubKeyLen) {
10446
        WOLFSSL_MSG("Invalid public key.");
10447
        ret = BAD_FUNC_ARG;
10448
    }
10449
10450
    /* Allocate buffer for the concatenated client key share data
10451
     * (PQC KEM ciphertext + ECDH public key) */
10452
    if (ret == 0) {
10453
        ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap,
10454
            DYNAMIC_TYPE_TLSX);
10455
10456
        if (ciphertext == NULL) {
10457
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10458
            ret = MEMORY_E;
10459
        }
10460
    }
10461
10462
    /* Process ECDH key share part. The generated shared secret is directly
10463
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
10464
     * pqc_first flag, the ECDH shared secret part goes before or after the
10465
     * KEM part. */
10466
    if (ret == 0) {
10467
        ecc_kse->keLen = len - pubSz;
10468
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
10469
                                     DYNAMIC_TYPE_PUBLIC_KEY);
10470
        if (ecc_kse->ke == NULL) {
10471
            WOLFSSL_MSG("ecc_kse memory allocation failure");
10472
            ret = MEMORY_ERROR;
10473
        }
10474
        if (ret == 0) {
10475
            int pubOffset = 0;
10476
            int ssOffset = 0;
10477
10478
            /* Set the ECC size variable to the initial buffer size */
10479
            ssSzEcc = ssl->arrays->preMasterSz;
10480
10481
            if (pqc_first) {
10482
                pubOffset = pubSz;
10483
                ssOffset = ssSzPqc;
10484
            }
10485
10486
            XMEMCPY(ecc_kse->ke, data + pubOffset, ecc_kse->keLen);
10487
10488
        #ifdef HAVE_CURVE25519
10489
            if (ecc_group == WOLFSSL_ECC_X25519) {
10490
                ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
10491
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10492
            }
10493
            else
10494
        #endif
10495
        #ifdef HAVE_CURVE448
10496
            if (ecc_group == WOLFSSL_ECC_X448) {
10497
                ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
10498
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10499
            }
10500
            else
10501
        #endif
10502
            {
10503
                ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
10504
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10505
            }
10506
        }
10507
        if (ret == 0) {
10508
            if (ssSzEcc != ecc_kse->keyLen) {
10509
                WOLFSSL_MSG("Data length mismatch.");
10510
                ret = BAD_FUNC_ARG;
10511
            }
10512
        }
10513
    }
10514
10515
    if (ret == 0 && ssSzEcc + ssSzPqc > ENCRYPT_LEN) {
10516
        WOLFSSL_MSG("shared secret is too long.");
10517
        ret = LENGTH_ERROR;
10518
    }
10519
10520
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
10521
     * KEM shared secret part goes before or after the ECDH part. */
10522
    if (ret == 0) {
10523
        int input_offset = ecc_kse->keLen;
10524
        int output_offset = ssSzEcc;
10525
10526
        if (pqc_first) {
10527
            input_offset = 0;
10528
            output_offset = 0;
10529
        }
10530
10531
        ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, pqc_kse,
10532
                data + input_offset, pubSz,
10533
                ssl->arrays->preMasterSecret + output_offset, &ssSzPqc);
10534
    }
10535
10536
    if (ret == 0) {
10537
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10538
10539
        ssl->arrays->preMasterSz = ssSzEcc + ssSzPqc;
10540
        keyShareEntry->ke = NULL;
10541
        keyShareEntry->keLen = 0;
10542
10543
        /* Concatenate the ECDH public key and the PQC KEM ciphertext. Based on
10544
         * the pqc_first flag, the ECDH public key goes before or after the KEM
10545
         * ciphertext. */
10546
        if (pqc_first) {
10547
            XMEMCPY(ciphertext, pqc_kse->pubKey, ctSz);
10548
            XMEMCPY(ciphertext + ctSz, ecc_kse->pubKey, ecc_kse->pubKeyLen);
10549
        }
10550
        else {
10551
            XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen);
10552
            XMEMCPY(ciphertext + ecc_kse->pubKeyLen, pqc_kse->pubKey, ctSz);
10553
        }
10554
10555
        keyShareEntry->pubKey = ciphertext;
10556
        keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen + ctSz;
10557
        ciphertext = NULL;
10558
10559
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
10560
         * the server side. */
10561
        ssl->namedGroup = keyShareEntry->group;
10562
    }
10563
10564
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
10565
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
10566
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
10567
    return ret;
10568
}
10569
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_ENCAPSULATE */
10570
10571
/* Use the data to create a new key share object in the extensions.
10572
 *
10573
 * ssl    The SSL/TLS object.
10574
 * group  The named group.
10575
 * len    The length of the public key data.
10576
 * data   The public key data.
10577
 * kse    The new key share entry object.
10578
 * returns 0 on success and other values indicate failure.
10579
 */
10580
int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
10581
                      KeyShareEntry **kse, TLSX** extensions)
10582
0
{
10583
0
    int            ret = 0;
10584
0
    TLSX*          extension;
10585
0
    KeyShareEntry* keyShareEntry = NULL;
10586
10587
    /* Find the KeyShare extension if it exists. */
10588
0
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10589
0
    if (extension == NULL) {
10590
        /* Push new KeyShare extension. */
10591
0
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10592
0
        if (ret != 0)
10593
0
            return ret;
10594
10595
0
        extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10596
0
        if (extension == NULL)
10597
0
            return MEMORY_E;
10598
0
    }
10599
0
    extension->resp = 0;
10600
10601
    /* Try to find the key share entry with this group. */
10602
0
    keyShareEntry = (KeyShareEntry*)extension->data;
10603
0
    while (keyShareEntry != NULL) {
10604
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
10605
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
10606
                keyShareEntry->group == WOLFSSL_P256_ML_KEM_512) ||
10607
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
10608
                keyShareEntry->group == WOLFSSL_P384_ML_KEM_768) ||
10609
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
10610
                keyShareEntry->group == WOLFSSL_P521_ML_KEM_1024)) {
10611
            keyShareEntry->group = group;
10612
            break;
10613
        }
10614
        else
10615
#endif
10616
0
        if (keyShareEntry->group == group)
10617
0
            break;
10618
0
        keyShareEntry = keyShareEntry->next;
10619
0
    }
10620
10621
    /* Create a new key share entry if not found. */
10622
0
    if (keyShareEntry == NULL) {
10623
0
        ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
10624
0
                                ssl->heap, &keyShareEntry);
10625
0
        if (ret != 0)
10626
0
            return ret;
10627
0
    }
10628
10629
10630
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
10631
    if (ssl->options.side == WOLFSSL_SERVER_END &&
10632
            WOLFSSL_NAMED_GROUP_IS_PQC(group)) {
10633
        ret = TLSX_KeyShare_HandlePqcKeyServer((WOLFSSL*)ssl,
10634
                                               keyShareEntry,
10635
                                               data, len,
10636
                                               ssl->arrays->preMasterSecret,
10637
                                               &ssl->arrays->preMasterSz);
10638
        if (ret != 0)
10639
            return ret;
10640
    }
10641
    else if (ssl->options.side == WOLFSSL_SERVER_END &&
10642
             WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) {
10643
        ret = TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
10644
                                                     keyShareEntry,
10645
                                                     data, len);
10646
        if (ret != 0)
10647
            return ret;
10648
    }
10649
    else
10650
#endif
10651
0
    if (data != NULL) {
10652
0
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10653
0
        keyShareEntry->ke = data;
10654
0
        keyShareEntry->keLen = len;
10655
0
    }
10656
0
    else {
10657
        /* Generate a key pair. Casting to non-const since changes inside are
10658
         * minimal but would require an extensive redesign to refactor. Also
10659
         * this path shouldn't be taken when parsing a ClientHello in stateless
10660
         * mode. */
10661
0
        ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, keyShareEntry);
10662
0
        if (ret != 0)
10663
0
            return ret;
10664
0
    }
10665
10666
0
    if (kse != NULL)
10667
0
        *kse = keyShareEntry;
10668
10669
0
    return 0;
10670
0
}
10671
10672
/* Set an empty Key Share extension.
10673
 *
10674
 * ssl  The SSL/TLS object.
10675
 * returns 0 on success and other values indicate failure.
10676
 */
10677
int TLSX_KeyShare_Empty(WOLFSSL* ssl)
10678
0
{
10679
0
    int   ret = 0;
10680
0
    TLSX* extension;
10681
10682
    /* Find the KeyShare extension if it exists. */
10683
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
10684
0
    if (extension == NULL) {
10685
        /* Push new KeyShare extension. */
10686
0
        ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10687
0
    }
10688
0
    else if (extension->data != NULL) {
10689
0
        TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
10690
0
        extension->data = NULL;
10691
0
    }
10692
10693
0
    return ret;
10694
0
}
10695
10696
static const word16 preferredGroup[] = {
10697
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
10698
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256
10699
    WOLFSSL_ECC_SECP256R1,
10700
#if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
10701
    WOLFSSL_ECC_SM2P256V1,
10702
#endif
10703
#endif
10704
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10705
    WOLFSSL_ECC_X25519,
10706
#endif
10707
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10708
    WOLFSSL_ECC_X448,
10709
#endif
10710
#if defined(HAVE_ECC) && (!defined(NO_ECC384) || \
10711
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384
10712
    WOLFSSL_ECC_SECP384R1,
10713
#endif
10714
#if defined(HAVE_ECC) && (!defined(NO_ECC521) || \
10715
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
10716
    WOLFSSL_ECC_SECP521R1,
10717
#endif
10718
#if defined(HAVE_FFDHE_2048)
10719
    WOLFSSL_FFDHE_2048,
10720
#endif
10721
#if defined(HAVE_FFDHE_3072)
10722
    WOLFSSL_FFDHE_3072,
10723
#endif
10724
#if defined(HAVE_FFDHE_4096)
10725
    WOLFSSL_FFDHE_4096,
10726
#endif
10727
#if defined(HAVE_FFDHE_6144)
10728
    WOLFSSL_FFDHE_6144,
10729
#endif
10730
#if defined(HAVE_FFDHE_8192)
10731
    WOLFSSL_FFDHE_8192,
10732
#endif
10733
#ifndef WOLFSSL_NO_ML_KEM
10734
#ifdef WOLFSSL_WC_MLKEM
10735
    #ifndef WOLFSSL_NO_ML_KEM_512
10736
    WOLFSSL_ML_KEM_512,
10737
    WOLFSSL_P256_ML_KEM_512,
10738
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10739
    WOLFSSL_X25519_ML_KEM_512,
10740
    #endif
10741
    #endif
10742
    #ifndef WOLFSSL_NO_ML_KEM_768
10743
    WOLFSSL_ML_KEM_768,
10744
    WOLFSSL_P384_ML_KEM_768,
10745
    WOLFSSL_P256_ML_KEM_768,
10746
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10747
    WOLFSSL_X25519_ML_KEM_768,
10748
    #endif
10749
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10750
    WOLFSSL_X448_ML_KEM_768,
10751
    #endif
10752
    #endif
10753
    #ifndef WOLFSSL_NO_ML_KEM_1024
10754
    WOLFSSL_ML_KEM_1024,
10755
    WOLFSSL_P521_ML_KEM_1024,
10756
    WOLFSSL_P384_ML_KEM_1024,
10757
    #endif
10758
#elif defined(HAVE_LIBOQS)
10759
    /* These require a runtime call to TLSX_IsGroupSupported to use */
10760
    WOLFSSL_ML_KEM_512,
10761
    WOLFSSL_ML_KEM_768,
10762
    WOLFSSL_ML_KEM_1024,
10763
    WOLFSSL_P256_ML_KEM_512,
10764
    WOLFSSL_P384_ML_KEM_768,
10765
    WOLFSSL_P256_ML_KEM_768,
10766
    WOLFSSL_P521_ML_KEM_1024,
10767
    WOLFSSL_P384_ML_KEM_1024,
10768
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10769
    WOLFSSL_X25519_ML_KEM_512,
10770
    WOLFSSL_X25519_ML_KEM_768,
10771
    #endif
10772
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10773
    WOLFSSL_X448_ML_KEM_768,
10774
    #endif
10775
#endif
10776
#endif /* !WOLFSSL_NO_ML_KEM */
10777
#ifdef WOLFSSL_MLKEM_KYBER
10778
#ifdef WOLFSSL_WC_MLKEM
10779
    #ifdef WOLFSSL_KYBER512
10780
    WOLFSSL_KYBER_LEVEL1,
10781
    WOLFSSL_P256_KYBER_LEVEL1,
10782
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10783
    WOLFSSL_X25519_KYBER_LEVEL1,
10784
    #endif
10785
    #endif
10786
    #ifdef WOLFSSL_KYBER768
10787
    WOLFSSL_KYBER_LEVEL3,
10788
    WOLFSSL_P384_KYBER_LEVEL3,
10789
    WOLFSSL_P256_KYBER_LEVEL3,
10790
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10791
    WOLFSSL_X25519_KYBER_LEVEL3,
10792
    #endif
10793
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10794
    WOLFSSL_X448_KYBER_LEVEL3,
10795
    #endif
10796
    #endif
10797
    #ifdef WOLFSSL_KYBER1024
10798
    WOLFSSL_KYBER_LEVEL5,
10799
    WOLFSSL_P521_KYBER_LEVEL5,
10800
    #endif
10801
#elif defined(HAVE_LIBOQS)
10802
    /* These require a runtime call to TLSX_IsGroupSupported to use */
10803
    WOLFSSL_KYBER_LEVEL1,
10804
    WOLFSSL_KYBER_LEVEL3,
10805
    WOLFSSL_KYBER_LEVEL5,
10806
    WOLFSSL_P256_KYBER_LEVEL1,
10807
    WOLFSSL_P384_KYBER_LEVEL3,
10808
    WOLFSSL_P256_KYBER_LEVEL3,
10809
    WOLFSSL_P521_KYBER_LEVEL5,
10810
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10811
    WOLFSSL_X25519_KYBER_LEVEL1,
10812
    WOLFSSL_X25519_KYBER_LEVEL3,
10813
    #endif
10814
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10815
    WOLFSSL_X448_KYBER_LEVEL3,
10816
    #endif
10817
#endif
10818
#endif /* WOLFSSL_MLKEM_KYBER */
10819
    WOLFSSL_NAMED_GROUP_INVALID
10820
};
10821
10822
#define PREFERRED_GROUP_SZ \
10823
    ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
10824
                                            /* -1 for the invalid group */
10825
10826
/* Examines the application specified group ranking and returns the rank of the
10827
 * group.
10828
 * If no group ranking set then all groups are rank 0 (highest).
10829
 *
10830
 * ssl    The SSL/TLS object.
10831
 * group  The group to check ranking for.
10832
 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
10833
 */
10834
static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
10835
0
{
10836
0
    byte i;
10837
0
    const word16* groups;
10838
0
    byte numGroups;
10839
10840
0
    if (ssl->numGroups == 0) {
10841
0
        return 0;
10842
0
    }
10843
0
    else {
10844
0
        groups = ssl->group;
10845
0
        numGroups = ssl->numGroups;
10846
0
    }
10847
10848
#ifdef HAVE_LIBOQS
10849
      if (!TLSX_IsGroupSupported(group))
10850
          return WOLFSSL_FATAL_ERROR;
10851
#endif
10852
10853
0
    for (i = 0; i < numGroups; i++) {
10854
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
10855
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
10856
             groups[i] == WOLFSSL_P256_ML_KEM_512) ||
10857
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
10858
             groups[i] == WOLFSSL_P384_ML_KEM_768) ||
10859
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
10860
             groups[i] == WOLFSSL_P521_ML_KEM_1024)) {
10861
            return i;
10862
        }
10863
#endif
10864
0
        if (groups[i] == (word16)group)
10865
0
            return i;
10866
0
    }
10867
10868
0
    return WOLFSSL_FATAL_ERROR;
10869
0
}
10870
10871
/* Set a key share that is supported by the client into extensions.
10872
 *
10873
 * ssl  The SSL/TLS object.
10874
 * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
10875
 * 0 if a supported group has a key share and other values indicate an error.
10876
 */
10877
int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, TLSX** extensions)
10878
0
{
10879
0
    int             ret;
10880
0
#ifdef HAVE_SUPPORTED_CURVES
10881
0
    TLSX*           extension;
10882
0
    SupportedCurve* curve = NULL;
10883
0
    SupportedCurve* preferredCurve = NULL;
10884
0
    word16          name = WOLFSSL_NAMED_GROUP_INVALID;
10885
0
    KeyShareEntry*  kse = NULL;
10886
0
    int             preferredRank = WOLFSSL_MAX_GROUP_COUNT;
10887
0
    int             rank;
10888
10889
0
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
10890
0
    if (extension != NULL)
10891
0
        curve = (SupportedCurve*)extension->data;
10892
0
    for (; curve != NULL; curve = curve->next) {
10893
        /* Use server's preference order. Common group was found but key share
10894
         * was missing */
10895
0
        if (!TLSX_IsGroupSupported(curve->name))
10896
0
            continue;
10897
0
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
10898
0
            continue;
10899
10900
0
        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
10901
0
        if (rank == -1)
10902
0
            continue;
10903
0
        if (rank < preferredRank) {
10904
0
            preferredCurve = curve;
10905
0
            preferredRank = rank;
10906
0
        }
10907
0
    }
10908
0
    curve = preferredCurve;
10909
10910
0
    if (curve == NULL) {
10911
0
        byte i;
10912
        /* Fallback to user selected group */
10913
0
        preferredRank = WOLFSSL_MAX_GROUP_COUNT;
10914
0
        for (i = 0; i < ssl->numGroups; i++) {
10915
0
            rank = TLSX_KeyShare_GroupRank(ssl, ssl->group[i]);
10916
0
            if (rank == -1)
10917
0
                continue;
10918
0
            if (rank < preferredRank) {
10919
0
                name = ssl->group[i];
10920
0
                preferredRank = rank;
10921
0
            }
10922
0
        }
10923
0
        if (name == WOLFSSL_NAMED_GROUP_INVALID) {
10924
            /* No group selected or specified by the server */
10925
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10926
0
            return BAD_KEY_SHARE_DATA;
10927
0
        }
10928
0
    }
10929
0
    else {
10930
0
        name = curve->name;
10931
0
    }
10932
10933
    #ifdef WOLFSSL_ASYNC_CRYPT
10934
    /* Check the old key share data list. */
10935
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10936
    if (extension != NULL) {
10937
        kse = (KeyShareEntry*)extension->data;
10938
        /* We should not be computing keys if we are only going to advertise
10939
         * our choice here. */
10940
        if (kse != NULL && kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10941
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10942
            return BAD_KEY_SHARE_DATA;
10943
        }
10944
    }
10945
    #endif
10946
10947
    /* Push new KeyShare extension. This will also free the old one */
10948
0
    ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10949
0
    if (ret != 0)
10950
0
        return ret;
10951
    /* Extension got pushed to head */
10952
0
    extension = *extensions;
10953
    /* Push the selected curve */
10954
0
    ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, name,
10955
0
                            ssl->heap, &kse);
10956
0
    if (ret != 0)
10957
0
        return ret;
10958
    /* Set extension to be in response. */
10959
0
    extension->resp = 1;
10960
#else
10961
10962
    (void)ssl;
10963
10964
    WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN);
10965
    ret = NOT_COMPILED_IN;
10966
#endif
10967
10968
0
    return ret;
10969
0
}
10970
10971
#ifdef WOLFSSL_DUAL_ALG_CERTS
10972
/* Writes the CKS objects of a list in a buffer. */
10973
static word16 CKS_WRITE(WOLFSSL* ssl, byte* output)
10974
{
10975
    XMEMCPY(output, ssl->sigSpec, ssl->sigSpecSz);
10976
    return ssl->sigSpecSz;
10977
}
10978
10979
static int TLSX_UseCKS(TLSX** extensions, WOLFSSL* ssl, void* heap)
10980
{
10981
    int ret = 0;
10982
    TLSX* extension;
10983
10984
    if (extensions == NULL) {
10985
        return BAD_FUNC_ARG;
10986
    }
10987
10988
    extension = TLSX_Find(*extensions, TLSX_CKS);
10989
    /* If it is already present, do nothing. */
10990
    if (extension == NULL) {
10991
        /* The data required is in the ssl struct, so push it in. */
10992
        ret = TLSX_Push(extensions, TLSX_CKS, (void*)ssl, heap);
10993
    }
10994
10995
    return ret;
10996
}
10997
10998
int TLSX_CKS_Set(WOLFSSL* ssl, TLSX** extensions)
10999
{
11000
    int ret;
11001
    TLSX* extension;
11002
    /* Push new KeyShare extension. This will also free the old one */
11003
    ret = TLSX_Push(extensions, TLSX_CKS, NULL, ssl->heap);
11004
    if (ret != 0)
11005
        return ret;
11006
    /* Extension got pushed to head */
11007
    extension = *extensions;
11008
    /* Need ssl->sigSpecSz during extension length calculation. */
11009
    extension->data = ssl;
11010
    /* Set extension to be in response. */
11011
    extension->resp = 1;
11012
    return ret;
11013
}
11014
11015
int TLSX_CKS_Parse(WOLFSSL* ssl, byte* input, word16 length,
11016
                   TLSX** extensions)
11017
{
11018
    int ret;
11019
    int i, j;
11020
11021
    (void) extensions;
11022
11023
    /* Validating the input. */
11024
    if (length == 0)
11025
        return BUFFER_ERROR;
11026
    for (i = 0; i < length; i++) {
11027
        switch (input[i])
11028
        {
11029
            case WOLFSSL_CKS_SIGSPEC_NATIVE:
11030
            case WOLFSSL_CKS_SIGSPEC_ALTERNATIVE:
11031
            case WOLFSSL_CKS_SIGSPEC_BOTH:
11032
                /* These are all valid values; do nothing */
11033
                break;
11034
            case WOLFSSL_CKS_SIGSPEC_EXTERNAL:
11035
            default:
11036
                /* All other values (including external) are not. */
11037
                return BAD_FUNC_ARG;
11038
        }
11039
    }
11040
11041
    /* This could be a situation where the client tried to start with TLS 1.3
11042
     * when it sent ClientHello and the server down-graded to TLS 1.2. In that
11043
     * case, erroring out because it is TLS 1.2 is not a reasonable thing to do.
11044
     * In the case of TLS 1.2, the CKS values will be ignored. */
11045
    if (!IsAtLeastTLSv1_3(ssl->version)) {
11046
        ssl->sigSpec = NULL;
11047
        ssl->sigSpecSz = 0;
11048
        return 0;
11049
    }
11050
11051
    /* Extension data is valid, but if we are the server and we don't have an
11052
     * alt private key, do not respond with CKS extension. */
11053
    if (wolfSSL_is_server(ssl) && ssl->buffers.altKey == NULL) {
11054
        ssl->sigSpec = NULL;
11055
        ssl->sigSpecSz = 0;
11056
        return 0;
11057
    }
11058
11059
    /* Copy as the lifetime of input seems to be ephemeral. */
11060
    ssl->peerSigSpec = (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_TLSX);
11061
    if (ssl->peerSigSpec == NULL) {
11062
        return BUFFER_ERROR;
11063
    }
11064
    XMEMCPY(ssl->peerSigSpec, input, length);
11065
    ssl->peerSigSpecSz = length;
11066
11067
    /* If there is no preference set, use theirs... */
11068
    if (ssl->sigSpec == NULL) {
11069
        ret = wolfSSL_UseCKS(ssl, ssl->peerSigSpec, 1);
11070
        if (ret == WOLFSSL_SUCCESS) {
11071
            ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11072
            TLSX_SetResponse(ssl, TLSX_CKS);
11073
        }
11074
        return ret;
11075
    }
11076
11077
    /* ...otherwise, prioritize our preference. */
11078
    for (i = 0; i < ssl->sigSpecSz; i++) {
11079
        for (j = 0; j < length; j++) {
11080
            if (ssl->sigSpec[i] == input[j]) {
11081
                /* Got the match, set to this one. */
11082
                ret = wolfSSL_UseCKS(ssl, &ssl->sigSpec[i], 1);
11083
                if (ret == WOLFSSL_SUCCESS) {
11084
                    ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11085
                    TLSX_SetResponse(ssl, TLSX_CKS);
11086
                }
11087
                return ret;
11088
            }
11089
        }
11090
    }
11091
11092
    /* No match found. Cannot continue. */
11093
    return MATCH_SUITE_ERROR;
11094
}
11095
#endif /* WOLFSSL_DUAL_ALG_CERTS */
11096
11097
/* Server side KSE processing */
11098
int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
11099
    byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, byte* searched)
11100
0
{
11101
0
    TLSX*          extension;
11102
0
    KeyShareEntry* clientKSE = NULL;
11103
0
    KeyShareEntry* list = NULL;
11104
0
    KeyShareEntry* preferredKSE = NULL;
11105
0
    int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11106
0
    int rank;
11107
11108
0
    (void)cipherSuite0;
11109
0
    (void)cipherSuite;
11110
11111
0
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11112
0
        return BAD_FUNC_ARG;
11113
11114
0
    *searched = 0;
11115
11116
    /* Find the KeyShare extension if it exists. */
11117
0
    extension = TLSX_Find(extensions, TLSX_KEY_SHARE);
11118
0
    if (extension != NULL)
11119
0
        list = (KeyShareEntry*)extension->data;
11120
11121
0
    if (extension && extension->resp == 1) {
11122
        /* Outside of the async case this path should not be taken. */
11123
0
        int ret = WC_NO_ERR_TRACE(INCOMPLETE_DATA);
11124
    #ifdef WOLFSSL_ASYNC_CRYPT
11125
        /* in async case make sure key generation is finalized */
11126
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
11127
        if (serverKSE && serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11128
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
11129
                *searched = 1;
11130
            ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11131
        }
11132
        else
11133
    #endif
11134
0
        {
11135
0
            ret = INCOMPLETE_DATA;
11136
0
        }
11137
0
        return ret;
11138
0
    }
11139
11140
    /* Use server's preference order. */
11141
0
    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
11142
0
        if ((clientKSE->ke == NULL) &&
11143
0
            (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) &&
11144
0
            (!WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)))
11145
0
            continue;
11146
11147
#ifdef WOLFSSL_SM2
11148
        if ((cipherSuite0 == CIPHER_BYTE) &&
11149
            ((cipherSuite == TLS_SM4_GCM_SM3) ||
11150
             (cipherSuite == TLS_SM4_CCM_SM3))) {
11151
           if (clientKSE->group != WOLFSSL_ECC_SM2P256V1) {
11152
               continue;
11153
           }
11154
        }
11155
        else if (clientKSE->group == WOLFSSL_ECC_SM2P256V1) {
11156
           continue;
11157
        }
11158
#endif
11159
11160
        /* Check consistency now - extensions in any order. */
11161
0
        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions))
11162
0
            continue;
11163
11164
0
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(clientKSE->group)) {
11165
            /* Check max value supported. */
11166
0
            if (clientKSE->group > WOLFSSL_ECC_MAX) {
11167
#ifdef WOLFSSL_HAVE_MLKEM
11168
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) &&
11169
                    !WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group))
11170
#endif
11171
0
                    continue;
11172
0
            }
11173
0
            if (wolfSSL_curve_is_disabled(ssl, clientKSE->group))
11174
0
                continue;
11175
0
        }
11176
0
        if (!TLSX_IsGroupSupported(clientKSE->group))
11177
0
            continue;
11178
11179
0
        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
11180
0
        if (rank == -1)
11181
0
            continue;
11182
0
        if (rank < preferredRank) {
11183
0
            preferredKSE = clientKSE;
11184
0
            preferredRank = rank;
11185
0
        }
11186
0
    }
11187
0
    *kse = preferredKSE;
11188
0
    *searched = 1;
11189
0
    return 0;
11190
0
}
11191
11192
/* Server side KSE processing */
11193
int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
11194
0
{
11195
0
    int            ret;
11196
0
    TLSX*          extension;
11197
0
    KeyShareEntry* serverKSE;
11198
0
    KeyShareEntry* list = NULL;
11199
11200
0
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11201
0
        return BAD_FUNC_ARG;
11202
11203
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11204
0
    if (extension == NULL)
11205
0
        return BAD_STATE_E;
11206
11207
0
    if (clientKSE == NULL) {
11208
#ifdef WOLFSSL_ASYNC_CRYPT
11209
        /* Not necessarily an error. The key may have already been setup. */
11210
        if (extension != NULL && extension->resp == 1) {
11211
            serverKSE = (KeyShareEntry*)extension->data;
11212
            if (serverKSE != NULL) {
11213
                /* in async case make sure key generation is finalized */
11214
                if (serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E))
11215
                    return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11216
                else if (serverKSE->lastRet == 0)
11217
                    return 0;
11218
            }
11219
        }
11220
#endif
11221
0
        return BAD_FUNC_ARG;
11222
0
    }
11223
11224
    /* Generate a new key pair except in the case of PQC KEM because we
11225
     * are going to encapsulate and that does not require us to generate a
11226
     * key pair.
11227
     */
11228
0
    ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
11229
0
    if (ret != 0)
11230
0
        return ret;
11231
11232
0
    if (clientKSE->key == NULL) {
11233
#ifdef WOLFSSL_HAVE_MLKEM
11234
        if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) ||
11235
            WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
11236
            /* Going to need the public key (AKA ciphertext). */
11237
            serverKSE->pubKey = clientKSE->pubKey;
11238
            clientKSE->pubKey = NULL;
11239
            serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11240
            clientKSE->pubKeyLen = 0;
11241
        }
11242
        else
11243
#endif
11244
0
        {
11245
0
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
11246
0
        }
11247
11248
        /* for async do setup of serverKSE below, but return WC_PENDING_E */
11249
0
        if (ret != 0
11250
        #ifdef WOLFSSL_ASYNC_CRYPT
11251
            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
11252
        #endif
11253
0
        ) {
11254
0
            TLSX_KeyShare_FreeAll(list, ssl->heap);
11255
0
            return ret;
11256
0
        }
11257
0
    }
11258
0
    else {
11259
        /* transfer buffers to serverKSE */
11260
0
        serverKSE->key = clientKSE->key;
11261
0
        clientKSE->key = NULL;
11262
0
        serverKSE->keyLen = clientKSE->keyLen;
11263
0
        serverKSE->pubKey = clientKSE->pubKey;
11264
0
        clientKSE->pubKey = NULL;
11265
0
        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11266
0
    #ifndef NO_DH
11267
0
        serverKSE->privKey = clientKSE->privKey;
11268
0
        clientKSE->privKey = NULL;
11269
0
    #endif
11270
0
    }
11271
0
    serverKSE->ke = clientKSE->ke;
11272
0
    serverKSE->keLen = clientKSE->keLen;
11273
0
    clientKSE->ke = NULL;
11274
0
    clientKSE->keLen = 0;
11275
0
    ssl->namedGroup = serverKSE->group;
11276
11277
0
    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
11278
0
    extension->data = (void *)serverKSE;
11279
11280
0
    extension->resp = 1;
11281
0
    return ret;
11282
0
}
11283
11284
/* Ensure there is a key pair that can be used for key exchange.
11285
 *
11286
 * ssl  The SSL/TLS object.
11287
 * doHelloRetry If set to non-zero will do hello_retry
11288
 * returns 0 on success and other values indicate failure.
11289
 */
11290
int TLSX_KeyShare_Establish(WOLFSSL *ssl, int* doHelloRetry)
11291
0
{
11292
0
    int            ret;
11293
0
    KeyShareEntry* clientKSE = NULL;
11294
0
    byte           searched = 0;
11295
11296
0
    *doHelloRetry = 0;
11297
11298
0
    ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, ssl->cipher.cipherSuite0,
11299
0
        ssl->cipher.cipherSuite, &clientKSE, &searched);
11300
0
    if (ret != 0 || !searched)
11301
0
        return ret;
11302
11303
    /* No supported group found - send HelloRetryRequest. */
11304
0
    if (clientKSE == NULL) {
11305
        /* Set KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
11306
0
        *doHelloRetry = 1;
11307
0
        return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
11308
0
    }
11309
11310
0
    return TLSX_KeyShare_Setup(ssl, clientKSE);
11311
0
}
11312
11313
/* Derive the shared secret of the key exchange.
11314
 *
11315
 * ssl  The SSL/TLS object.
11316
 * returns 0 on success and other values indicate failure.
11317
 */
11318
int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
11319
0
{
11320
0
    int            ret;
11321
0
    TLSX*          extension;
11322
0
    KeyShareEntry* list = NULL;
11323
11324
#ifdef WOLFSSL_ASYNC_CRYPT
11325
    ret = wolfSSL_AsyncPop(ssl, NULL);
11326
    /* Check for error */
11327
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) && ret < 0) {
11328
        return ret;
11329
    }
11330
#endif
11331
11332
    /* Find the KeyShare extension if it exists. */
11333
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11334
0
    if (extension != NULL)
11335
0
        list = (KeyShareEntry*)extension->data;
11336
11337
0
    if (list == NULL)
11338
0
        return KEY_SHARE_ERROR;
11339
11340
    /* Calculate secret. */
11341
0
    ret = TLSX_KeyShare_Process(ssl, list);
11342
11343
0
    return ret;
11344
0
}
11345
11346
0
#define KS_FREE_ALL  TLSX_KeyShare_FreeAll
11347
0
#define KS_GET_SIZE  TLSX_KeyShare_GetSize
11348
0
#define KS_WRITE     TLSX_KeyShare_Write
11349
0
#define KS_PARSE     TLSX_KeyShare_Parse
11350
11351
#else
11352
11353
#define KS_FREE_ALL(a, b) WC_DO_NOTHING
11354
#define KS_GET_SIZE(a, b)    0
11355
#define KS_WRITE(a, b, c)    0
11356
#define KS_PARSE(a, b, c, d) 0
11357
11358
#endif /* WOLFSSL_TLS13 */
11359
11360
/******************************************************************************/
11361
/* Pre-Shared Key                                                             */
11362
/******************************************************************************/
11363
11364
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
11365
/* Free the pre-shared key dynamic data.
11366
 *
11367
 * list  The linked list of key share entry objects.
11368
 * heap  The heap used for allocation.
11369
 */
11370
static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
11371
{
11372
    PreSharedKey* current;
11373
11374
    while ((current = list) != NULL) {
11375
        list = current->next;
11376
        XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
11377
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
11378
    }
11379
11380
    (void)heap;
11381
}
11382
11383
/* Get the size of the encoded pre shared key extension.
11384
 *
11385
 * list     The linked list of pre-shared key extensions.
11386
 * msgType  The type of the message this extension is being written into.
11387
 * returns the number of bytes of the encoded pre-shared key extension or
11388
 * SANITY_MSG_E to indicate invalid message type.
11389
 */
11390
static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
11391
                                     word16* pSz)
11392
{
11393
    if (msgType == client_hello) {
11394
        /* Length of identities + Length of binders. */
11395
        word16 len = OPAQUE16_LEN + OPAQUE16_LEN;
11396
        while (list != NULL) {
11397
            /* Each entry has: identity, ticket age and binder. */
11398
            len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
11399
                   OPAQUE8_LEN + (word16)list->binderLen;
11400
            list = list->next;
11401
        }
11402
        *pSz += len;
11403
        return 0;
11404
    }
11405
11406
    if (msgType == server_hello) {
11407
        *pSz += OPAQUE16_LEN;
11408
        return 0;
11409
    }
11410
11411
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11412
    return SANITY_MSG_E;
11413
}
11414
11415
/* The number of bytes to be written for the binders.
11416
 *
11417
 * list     The linked list of pre-shared key extensions.
11418
 * msgType  The type of the message this extension is being written into.
11419
 * returns the number of bytes of the encoded pre-shared key extension or
11420
 * SANITY_MSG_E to indicate invalid message type.
11421
 */
11422
int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
11423
                                     word16* pSz)
11424
{
11425
    word16 len;
11426
11427
    if (msgType != client_hello) {
11428
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11429
        return SANITY_MSG_E;
11430
    }
11431
11432
    /* Length of all binders. */
11433
    len = OPAQUE16_LEN;
11434
    while (list != NULL) {
11435
        len += OPAQUE8_LEN + (word16)list->binderLen;
11436
        list = list->next;
11437
    }
11438
11439
    *pSz = len;
11440
    return 0;
11441
}
11442
11443
/* Writes the pre-shared key extension into the output buffer - binders only.
11444
 * Assumes that the the output buffer is big enough to hold data.
11445
 *
11446
 * list     The linked list of key share entries.
11447
 * output   The buffer to write into.
11448
 * msgType  The type of the message this extension is being written into.
11449
 * returns the number of bytes written into the buffer.
11450
 */
11451
int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
11452
                                   byte msgType, word16* pSz)
11453
{
11454
    PreSharedKey* current = list;
11455
    word16 idx = 0;
11456
    word16 lenIdx;
11457
    word16 len;
11458
11459
    if (msgType != client_hello) {
11460
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11461
        return SANITY_MSG_E;
11462
    }
11463
11464
    /* Skip length of all binders. */
11465
    lenIdx = idx;
11466
    idx += OPAQUE16_LEN;
11467
    while (current != NULL) {
11468
        /* Binder data length. */
11469
        output[idx++] = (byte)current->binderLen;
11470
        /* Binder data. */
11471
        XMEMCPY(output + idx, current->binder, current->binderLen);
11472
        idx += (word16)current->binderLen;
11473
11474
        current = current->next;
11475
    }
11476
    /* Length of the binders. */
11477
    len = idx - lenIdx - OPAQUE16_LEN;
11478
    c16toa(len, output + lenIdx);
11479
11480
    *pSz = idx;
11481
    return 0;
11482
}
11483
11484
11485
/* Writes the pre-shared key extension into the output buffer.
11486
 * Assumes that the the output buffer is big enough to hold data.
11487
 *
11488
 * list     The linked list of key share entries.
11489
 * output   The buffer to write into.
11490
 * msgType  The type of the message this extension is being written into.
11491
 * returns the number of bytes written into the buffer.
11492
 */
11493
static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
11494
                                   byte msgType, word16* pSz)
11495
{
11496
    if (msgType == client_hello) {
11497
        PreSharedKey* current = list;
11498
        word16 idx = 0;
11499
        word16 lenIdx;
11500
        word16 len;
11501
        int ret;
11502
11503
        /* Write identities only. Binders after HMACing over this. */
11504
        lenIdx = idx;
11505
        idx += OPAQUE16_LEN;
11506
        while (current != NULL) {
11507
            /* Identity length */
11508
            c16toa(current->identityLen, output + idx);
11509
            idx += OPAQUE16_LEN;
11510
            /* Identity data */
11511
            XMEMCPY(output + idx, current->identity, current->identityLen);
11512
            idx += current->identityLen;
11513
11514
            /* Obfuscated ticket age. */
11515
            c32toa(current->ticketAge, output + idx);
11516
            idx += OPAQUE32_LEN;
11517
11518
            current = current->next;
11519
        }
11520
        /* Length of the identities. */
11521
        len = idx - lenIdx - OPAQUE16_LEN;
11522
        c16toa(len, output + lenIdx);
11523
11524
        /* Don't include binders here.
11525
         * The binders are based on the hash of all the ClientHello data up to
11526
         * and include the identities written above.
11527
         */
11528
        ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
11529
        if (ret < 0)
11530
            return ret;
11531
        *pSz += idx + len;
11532
    }
11533
    else if (msgType == server_hello) {
11534
        word16 i;
11535
11536
        /* Find the index of the chosen identity. */
11537
        for (i=0; list != NULL && !list->chosen; i++)
11538
            list = list->next;
11539
        if (list == NULL) {
11540
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
11541
            return BUILD_MSG_ERROR;
11542
        }
11543
11544
        /* The index of the identity chosen by the server from the list supplied
11545
         * by the client.
11546
         */
11547
        c16toa(i, output);
11548
        *pSz += OPAQUE16_LEN;
11549
    }
11550
    else {
11551
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11552
        return SANITY_MSG_E;
11553
    }
11554
11555
    return 0;
11556
}
11557
11558
int TLSX_PreSharedKey_Parse_ClientHello(TLSX** extensions, const byte* input,
11559
                                        word16 length, void* heap)
11560
{
11561
11562
    int    ret;
11563
    word16 len;
11564
    word16 idx = 0;
11565
    TLSX*         extension;
11566
    PreSharedKey* list;
11567
11568
    TLSX_Remove(extensions, TLSX_PRE_SHARED_KEY, heap);
11569
11570
    /* Length of identities and of binders. */
11571
    if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
11572
        return BUFFER_E;
11573
11574
    /* Length of identities. */
11575
    ato16(input + idx, &len);
11576
    idx += OPAQUE16_LEN;
11577
    if (len < MIN_PSK_ID_LEN || length - idx < len)
11578
        return BUFFER_E;
11579
11580
    /* Create a pre-shared key object for each identity. */
11581
    while (len > 0) {
11582
        const byte* identity;
11583
        word16      identityLen;
11584
        word32      age;
11585
11586
        if (len < OPAQUE16_LEN)
11587
            return BUFFER_E;
11588
11589
        /* Length of identity. */
11590
        ato16(input + idx, &identityLen);
11591
        idx += OPAQUE16_LEN;
11592
        if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
11593
                identityLen > MAX_PSK_ID_LEN)
11594
            return BUFFER_E;
11595
        /* Cache identity pointer. */
11596
        identity = input + idx;
11597
        idx += identityLen;
11598
        /* Ticket age. */
11599
        ato32(input + idx, &age);
11600
        idx += OPAQUE32_LEN;
11601
11602
        ret = TLSX_PreSharedKey_Use(extensions, identity, identityLen, age, no_mac,
11603
                                    0, 0, 1, NULL, heap);
11604
        if (ret != 0)
11605
            return ret;
11606
11607
        /* Done with this identity. */
11608
        len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
11609
    }
11610
11611
    /* Find the list of identities sent to server. */
11612
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11613
    if (extension == NULL)
11614
        return PSK_KEY_ERROR;
11615
    list = (PreSharedKey*)extension->data;
11616
11617
    /* Length of binders. */
11618
    if (idx + OPAQUE16_LEN > length)
11619
        return BUFFER_E;
11620
    ato16(input + idx, &len);
11621
    idx += OPAQUE16_LEN;
11622
    if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
11623
        return BUFFER_E;
11624
11625
    /* Set binder for each identity. */
11626
    while (list != NULL && len > 0) {
11627
        /* Length of binder */
11628
        list->binderLen = input[idx++];
11629
        if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
11630
                list->binderLen > WC_MAX_DIGEST_SIZE)
11631
            return BUFFER_E;
11632
        if (len < OPAQUE8_LEN + list->binderLen)
11633
            return BUFFER_E;
11634
11635
        /* Copy binder into static buffer. */
11636
        XMEMCPY(list->binder, input + idx, list->binderLen);
11637
        idx += (word16)list->binderLen;
11638
11639
        /* Done with binder entry. */
11640
        len -= OPAQUE8_LEN + (word16)list->binderLen;
11641
11642
        /* Next identity. */
11643
        list = list->next;
11644
    }
11645
    if (list != NULL || len != 0)
11646
        return BUFFER_E;
11647
11648
    return 0;
11649
11650
}
11651
11652
/* Parse the pre-shared key extension.
11653
 * Different formats in different messages.
11654
 *
11655
 * ssl      The SSL/TLS object.
11656
 * input    The extension data.
11657
 * length   The length of the extension data.
11658
 * msgType  The type of the message this extension is being parsed from.
11659
 * returns 0 on success and other values indicate failure.
11660
 */
11661
static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, const byte* input,
11662
                                   word16 length, byte msgType)
11663
{
11664
11665
    if (msgType == client_hello) {
11666
        return TLSX_PreSharedKey_Parse_ClientHello(&ssl->extensions, input,
11667
                                                   length, ssl->heap);
11668
    }
11669
11670
    if (msgType == server_hello) {
11671
        word16 idx;
11672
        PreSharedKey* list;
11673
        TLSX*         extension;
11674
11675
        /* Index of identity chosen by server. */
11676
        if (length != OPAQUE16_LEN)
11677
            return BUFFER_E;
11678
        ato16(input, &idx);
11679
11680
    #ifdef WOLFSSL_EARLY_DATA
11681
        ssl->options.pskIdIndex = idx + 1;
11682
    #endif
11683
11684
        /* Find the list of identities sent to server. */
11685
        extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
11686
        if (extension == NULL)
11687
            return PSK_KEY_ERROR;
11688
        list = (PreSharedKey*)extension->data;
11689
11690
        /* Mark the identity as chosen. */
11691
        for (; list != NULL && idx > 0; idx--)
11692
            list = list->next;
11693
        if (list == NULL) {
11694
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
11695
            return PSK_KEY_ERROR;
11696
        }
11697
        list->chosen = 1;
11698
11699
    #ifdef HAVE_SESSION_TICKET
11700
        if (list->resumption) {
11701
           /* Check that the session's details are the same as the server's. */
11702
           if (ssl->options.cipherSuite0  != ssl->session->cipherSuite0       ||
11703
               ssl->options.cipherSuite   != ssl->session->cipherSuite        ||
11704
               ssl->session->version.major != ssl->ctx->method->version.major ||
11705
               ssl->session->version.minor != ssl->ctx->method->version.minor) {
11706
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
11707
               return PSK_KEY_ERROR;
11708
           }
11709
        }
11710
    #endif
11711
11712
        return 0;
11713
    }
11714
11715
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11716
    return SANITY_MSG_E;
11717
}
11718
11719
/* Create a new pre-shared key and put it into the list.
11720
 *
11721
 * list          The linked list of pre-shared key.
11722
 * identity      The identity.
11723
 * len           The length of the identity data.
11724
 * heap          The memory to allocate with.
11725
 * preSharedKey  The new pre-shared key object.
11726
 * returns 0 on success and other values indicate failure.
11727
 */
11728
static int TLSX_PreSharedKey_New(PreSharedKey** list, const byte* identity,
11729
                                 word16 len, void *heap,
11730
                                 PreSharedKey** preSharedKey)
11731
{
11732
    PreSharedKey* psk;
11733
    PreSharedKey** next;
11734
11735
    psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
11736
    if (psk == NULL)
11737
        return MEMORY_E;
11738
    XMEMSET(psk, 0, sizeof(*psk));
11739
11740
    /* Make a copy of the identity data. */
11741
    psk->identity = (byte*)XMALLOC(len + NULL_TERM_LEN, heap,
11742
                                   DYNAMIC_TYPE_TLSX);
11743
    if (psk->identity == NULL) {
11744
        XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
11745
        return MEMORY_E;
11746
    }
11747
    XMEMCPY(psk->identity, identity, len);
11748
    psk->identityLen = len;
11749
    /* Use a NULL terminator in case it is a C string */
11750
    psk->identity[psk->identityLen] = '\0';
11751
11752
    /* Add it to the end and maintain the links. */
11753
    while (*list != NULL) {
11754
        /* Assign to temporary to work around compiler bug found by customer. */
11755
        next = &((*list)->next);
11756
        list = next;
11757
    }
11758
    *list = psk;
11759
    *preSharedKey = psk;
11760
11761
    (void)heap;
11762
11763
    return 0;
11764
}
11765
11766
static WC_INLINE byte GetHmacLength(int hmac)
11767
{
11768
    switch (hmac) {
11769
    #ifndef NO_SHA256
11770
        case sha256_mac:
11771
            return WC_SHA256_DIGEST_SIZE;
11772
    #endif
11773
    #ifdef WOLFSSL_SHA384
11774
        case sha384_mac:
11775
            return WC_SHA384_DIGEST_SIZE;
11776
    #endif
11777
    #ifdef WOLFSSL_SHA512
11778
        case sha512_mac:
11779
            return WC_SHA512_DIGEST_SIZE;
11780
    #endif
11781
    #ifdef WOLFSSL_SM3
11782
        case sm3_mac:
11783
            return WC_SM3_DIGEST_SIZE;
11784
    #endif
11785
        default:
11786
            break;
11787
    }
11788
    return 0;
11789
}
11790
11791
/* Use the data to create a new pre-shared key object in the extensions.
11792
 *
11793
 * ssl           The SSL/TLS object.
11794
 * identity      The identity.
11795
 * len           The length of the identity data.
11796
 * age           The age of the identity.
11797
 * hmac          The HMAC algorithm.
11798
 * cipherSuite0  The first byte of the cipher suite to use.
11799
 * cipherSuite   The second byte of the cipher suite to use.
11800
 * resumption    The PSK is for resumption of a session.
11801
 * preSharedKey  The new pre-shared key object.
11802
 * returns 0 on success and other values indicate failure.
11803
 */
11804
int TLSX_PreSharedKey_Use(TLSX** extensions, const byte* identity, word16 len,
11805
                          word32 age, byte hmac, byte cipherSuite0,
11806
                          byte cipherSuite, byte resumption,
11807
                          PreSharedKey **preSharedKey, void* heap)
11808
{
11809
    int           ret = 0;
11810
    TLSX*         extension;
11811
    PreSharedKey* psk = NULL;
11812
11813
    /* Find the pre-shared key extension if it exists. */
11814
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11815
    if (extension == NULL) {
11816
        /* Push new pre-shared key extension. */
11817
        ret = TLSX_Push(extensions, TLSX_PRE_SHARED_KEY, NULL, heap);
11818
        if (ret != 0)
11819
            return ret;
11820
11821
        extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11822
        if (extension == NULL)
11823
            return MEMORY_E;
11824
    }
11825
11826
    /* Try to find the pre-shared key with this identity. */
11827
    psk = (PreSharedKey*)extension->data;
11828
    while (psk != NULL) {
11829
        if ((psk->identityLen == len) &&
11830
               (XMEMCMP(psk->identity, identity, len) == 0)) {
11831
            break;
11832
        }
11833
        psk = psk->next;
11834
    }
11835
11836
    /* Create a new pre-shared key object if not found. */
11837
    if (psk == NULL) {
11838
        ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
11839
                                    len, heap, &psk);
11840
        if (ret != 0)
11841
            return ret;
11842
    }
11843
11844
    /* Update/set age and HMAC algorithm. */
11845
    psk->ticketAge    = age;
11846
    psk->hmac         = hmac;
11847
    psk->cipherSuite0 = cipherSuite0;
11848
    psk->cipherSuite  = cipherSuite;
11849
    psk->resumption   = resumption;
11850
    psk->binderLen    = GetHmacLength(psk->hmac);
11851
11852
    if (preSharedKey != NULL)
11853
        *preSharedKey = psk;
11854
11855
    return 0;
11856
}
11857
11858
#define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
11859
#define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
11860
#define PSK_WRITE     TLSX_PreSharedKey_Write
11861
#define PSK_PARSE     TLSX_PreSharedKey_Parse
11862
11863
#else
11864
11865
#define PSK_FREE_ALL(a, b) WC_DO_NOTHING
11866
#define PSK_GET_SIZE(a, b, c) 0
11867
#define PSK_WRITE(a, b, c, d) 0
11868
#define PSK_PARSE(a, b, c, d) 0
11869
11870
#endif
11871
11872
/******************************************************************************/
11873
/* PSK Key Exchange Modes                                                     */
11874
/******************************************************************************/
11875
11876
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
11877
/* Get the size of the encoded PSK KE modes extension.
11878
 * Only in ClientHello.
11879
 *
11880
 * modes    The PSK KE mode bit string.
11881
 * msgType  The type of the message this extension is being written into.
11882
 * returns the number of bytes of the encoded PSK KE mode extension.
11883
 */
11884
static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
11885
{
11886
    if (msgType == client_hello) {
11887
        /* Format: Len | Modes* */
11888
        word16 len = OPAQUE8_LEN;
11889
        /* Check whether each possible mode is to be written. */
11890
        if (modes & (1 << PSK_KE))
11891
            len += OPAQUE8_LEN;
11892
        if (modes & (1 << PSK_DHE_KE))
11893
            len += OPAQUE8_LEN;
11894
        *pSz += len;
11895
        return 0;
11896
    }
11897
11898
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11899
    return SANITY_MSG_E;
11900
}
11901
11902
/* Writes the PSK KE modes extension into the output buffer.
11903
 * Assumes that the the output buffer is big enough to hold data.
11904
 * Only in ClientHello.
11905
 *
11906
 * modes    The PSK KE mode bit string.
11907
 * output   The buffer to write into.
11908
 * msgType  The type of the message this extension is being written into.
11909
 * returns the number of bytes written into the buffer.
11910
 */
11911
static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
11912
                                 word16* pSz)
11913
{
11914
    if (msgType == client_hello) {
11915
        /* Format: Len | Modes* */
11916
        word16 idx = OPAQUE8_LEN;
11917
11918
        /* Write out each possible mode. */
11919
        if (modes & (1 << PSK_KE))
11920
            output[idx++] = PSK_KE;
11921
        if (modes & (1 << PSK_DHE_KE))
11922
            output[idx++] = PSK_DHE_KE;
11923
        /* Write out length of mode list. */
11924
        output[0] = (byte)(idx - OPAQUE8_LEN);
11925
11926
        *pSz += idx;
11927
        return 0;
11928
    }
11929
11930
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11931
    return SANITY_MSG_E;
11932
}
11933
11934
int TLSX_PskKeyModes_Parse_Modes(const byte* input, word16 length, byte msgType,
11935
                                byte* modes)
11936
{
11937
    if (msgType == client_hello) {
11938
        /* Format: Len | Modes* */
11939
        int   idx = 0;
11940
        word16 len;
11941
        *modes = 0;
11942
11943
        /* Ensure length byte exists. */
11944
        if (length < OPAQUE8_LEN)
11945
            return BUFFER_E;
11946
11947
        /* Get length of mode list and ensure that is the only data. */
11948
        len = input[0];
11949
        if (length - OPAQUE8_LEN != len)
11950
            return BUFFER_E;
11951
11952
        idx = OPAQUE8_LEN;
11953
        /* Set a bit for each recognized modes. */
11954
        while (len > 0) {
11955
            /* Ignore unrecognized modes.  */
11956
            if (input[idx] <= PSK_DHE_KE)
11957
               *modes |= 1 << input[idx];
11958
            idx++;
11959
            len--;
11960
        }
11961
        return 0;
11962
    }
11963
11964
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11965
    return SANITY_MSG_E;
11966
}
11967
11968
/* Parse the PSK KE modes extension.
11969
 * Only in ClientHello.
11970
 *
11971
 * ssl      The SSL/TLS object.
11972
 * input    The extension data.
11973
 * length   The length of the extension data.
11974
 * msgType  The type of the message this extension is being parsed from.
11975
 * returns 0 on success and other values indicate failure.
11976
 */
11977
static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, const byte* input, word16 length,
11978
                                 byte msgType)
11979
{
11980
    int    ret;
11981
    byte modes;
11982
11983
    ret = TLSX_PskKeyModes_Parse_Modes(input, length, msgType, &modes);
11984
    if (ret == 0)
11985
        ret = TLSX_PskKeyModes_Use(ssl, modes);
11986
11987
    if (ret != 0) {
11988
        WOLFSSL_ERROR_VERBOSE(ret);
11989
    }
11990
11991
    return ret;
11992
}
11993
11994
/* Use the data to create a new PSK Key Exchange Modes object in the extensions.
11995
 *
11996
 * ssl    The SSL/TLS object.
11997
 * modes  The PSK key exchange modes.
11998
 * returns 0 on success and other values indicate failure.
11999
 */
12000
int TLSX_PskKeyModes_Use(WOLFSSL* ssl, byte modes)
12001
{
12002
    int           ret = 0;
12003
    TLSX*         extension;
12004
12005
    /* Find the PSK key exchange modes extension if it exists. */
12006
    extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
12007
    if (extension == NULL) {
12008
        /* Push new PSK key exchange modes extension. */
12009
        ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
12010
            ssl->heap);
12011
        if (ret != 0)
12012
            return ret;
12013
12014
        extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
12015
        if (extension == NULL)
12016
            return MEMORY_E;
12017
    }
12018
12019
    extension->val = modes;
12020
12021
    return 0;
12022
}
12023
12024
#define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
12025
#define PKM_WRITE     TLSX_PskKeModes_Write
12026
#define PKM_PARSE     TLSX_PskKeModes_Parse
12027
12028
#else
12029
12030
#define PKM_GET_SIZE(a, b, c) 0
12031
#define PKM_WRITE(a, b, c, d) 0
12032
#define PKM_PARSE(a, b, c, d) 0
12033
12034
#endif
12035
12036
/******************************************************************************/
12037
/* Post-Handshake Authentication                                              */
12038
/******************************************************************************/
12039
12040
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
12041
/* Get the size of the encoded Post-Handshake Authentication extension.
12042
 * Only in ClientHello.
12043
 *
12044
 * msgType  The type of the message this extension is being written into.
12045
 * returns the number of bytes of the encoded Post-Handshake Authentication
12046
 * extension.
12047
 */
12048
static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
12049
{
12050
    if (msgType == client_hello) {
12051
        *pSz += 0;
12052
        return 0;
12053
    }
12054
12055
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12056
    return SANITY_MSG_E;
12057
}
12058
12059
/* Writes the Post-Handshake Authentication extension into the output buffer.
12060
 * Assumes that the the output buffer is big enough to hold data.
12061
 * Only in ClientHello.
12062
 *
12063
 * output   The buffer to write into.
12064
 * msgType  The type of the message this extension is being written into.
12065
 * returns the number of bytes written into the buffer.
12066
 */
12067
static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
12068
{
12069
    (void)output;
12070
12071
    if (msgType == client_hello) {
12072
        *pSz += 0;
12073
        return 0;
12074
    }
12075
12076
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12077
    return SANITY_MSG_E;
12078
}
12079
12080
/* Parse the Post-Handshake Authentication extension.
12081
 * Only in ClientHello.
12082
 *
12083
 * ssl      The SSL/TLS object.
12084
 * input    The extension data.
12085
 * length   The length of the extension data.
12086
 * msgType  The type of the message this extension is being parsed from.
12087
 * returns 0 on success and other values indicate failure.
12088
 */
12089
static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, const byte* input,
12090
                                   word16 length, byte msgType)
12091
{
12092
    (void)input;
12093
12094
    if (msgType == client_hello) {
12095
        /* Ensure extension is empty. */
12096
        if (length != 0)
12097
            return BUFFER_E;
12098
12099
        ssl->options.postHandshakeAuth = 1;
12100
        return 0;
12101
    }
12102
12103
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12104
    return SANITY_MSG_E;
12105
}
12106
12107
/* Create a new Post-handshake authentication object in the extensions.
12108
 *
12109
 * ssl    The SSL/TLS object.
12110
 * returns 0 on success and other values indicate failure.
12111
 */
12112
static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
12113
{
12114
    int   ret = 0;
12115
    TLSX* extension;
12116
12117
    /* Find the PSK key exchange modes extension if it exists. */
12118
    extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
12119
    if (extension == NULL) {
12120
        /* Push new Post-handshake Authentication extension. */
12121
        ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
12122
            ssl->heap);
12123
        if (ret != 0)
12124
            return ret;
12125
    }
12126
12127
    return 0;
12128
}
12129
12130
#define PHA_GET_SIZE  TLSX_PostHandAuth_GetSize
12131
#define PHA_WRITE     TLSX_PostHandAuth_Write
12132
#define PHA_PARSE     TLSX_PostHandAuth_Parse
12133
12134
#else
12135
12136
#define PHA_GET_SIZE(a, b)    0
12137
#define PHA_WRITE(a, b, c)    0
12138
#define PHA_PARSE(a, b, c, d) 0
12139
12140
#endif
12141
12142
/******************************************************************************/
12143
/* Early Data Indication                                                      */
12144
/******************************************************************************/
12145
12146
#ifdef WOLFSSL_EARLY_DATA
12147
/* Get the size of the encoded Early Data Indication extension.
12148
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12149
 *
12150
 * msgType  The type of the message this extension is being written into.
12151
 * returns the number of bytes of the encoded Early Data Indication extension.
12152
 */
12153
static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
12154
{
12155
    int ret = 0;
12156
12157
    if (msgType == client_hello || msgType == encrypted_extensions)
12158
        *pSz += 0;
12159
    else if (msgType == session_ticket)
12160
        *pSz += OPAQUE32_LEN;
12161
    else {
12162
        ret = SANITY_MSG_E;
12163
        WOLFSSL_ERROR_VERBOSE(ret);
12164
    }
12165
12166
    return ret;
12167
}
12168
12169
/* Writes the Early Data Indicator extension into the output buffer.
12170
 * Assumes that the the output buffer is big enough to hold data.
12171
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12172
 *
12173
 * maxSz    The maximum early data size.
12174
 * output   The buffer to write into.
12175
 * msgType  The type of the message this extension is being written into.
12176
 * returns the number of bytes written into the buffer.
12177
 */
12178
static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
12179
                                word16* pSz)
12180
{
12181
    if (msgType == client_hello || msgType == encrypted_extensions)
12182
        return 0;
12183
    else if (msgType == session_ticket) {
12184
        c32toa(maxSz, output);
12185
        *pSz += OPAQUE32_LEN;
12186
        return 0;
12187
    }
12188
12189
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12190
    return SANITY_MSG_E;
12191
}
12192
12193
/* Parse the Early Data Indicator extension.
12194
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12195
 *
12196
 * ssl      The SSL/TLS object.
12197
 * input    The extension data.
12198
 * length   The length of the extension data.
12199
 * msgType  The type of the message this extension is being parsed from.
12200
 * returns 0 on success and other values indicate failure.
12201
 */
12202
static int TLSX_EarlyData_Parse(WOLFSSL* ssl, const byte* input, word16 length,
12203
                                 byte msgType)
12204
{
12205
    WOLFSSL_ENTER("TLSX_EarlyData_Parse");
12206
    if (msgType == client_hello) {
12207
        if (length != 0)
12208
            return BUFFER_E;
12209
12210
        if (ssl->earlyData == expecting_early_data) {
12211
12212
            if (ssl->options.maxEarlyDataSz != 0)
12213
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
12214
            else
12215
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
12216
12217
            return TLSX_EarlyData_Use(ssl, 0, 0);
12218
        }
12219
        ssl->earlyData = early_data_ext;
12220
12221
        return 0;
12222
    }
12223
    if (msgType == encrypted_extensions) {
12224
        if (length != 0)
12225
            return BUFFER_E;
12226
12227
        /* Ensure the index of PSK identity chosen by server is 0.
12228
         * Index is plus one to handle 'not set' value of 0.
12229
         */
12230
        if (ssl->options.pskIdIndex != 1) {
12231
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12232
            return PSK_KEY_ERROR;
12233
        }
12234
12235
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
12236
            /* the extension from server comes in */
12237
            ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
12238
        }
12239
12240
        return TLSX_EarlyData_Use(ssl, 1, 1);
12241
    }
12242
    if (msgType == session_ticket) {
12243
        word32 maxSz;
12244
12245
        if (length != OPAQUE32_LEN)
12246
            return BUFFER_E;
12247
        ato32(input, &maxSz);
12248
12249
        ssl->session->maxEarlyDataSz = maxSz;
12250
        return 0;
12251
    }
12252
12253
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12254
    return SANITY_MSG_E;
12255
}
12256
12257
/* Use the data to create a new Early Data object in the extensions.
12258
 *
12259
 * ssl    The SSL/TLS object.
12260
 * maxSz  The maximum early data size.
12261
 * is_response   if this extension is part of a response
12262
 * returns 0 on success and other values indicate failure.
12263
 */
12264
int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz, int is_response)
12265
{
12266
    int   ret = 0;
12267
    TLSX* extension;
12268
12269
    /* Find the early data extension if it exists. */
12270
    extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
12271
    if (extension == NULL) {
12272
        /* Push new early data extension. */
12273
        ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
12274
        if (ret != 0)
12275
            return ret;
12276
12277
        extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
12278
        if (extension == NULL)
12279
            return MEMORY_E;
12280
    }
12281
12282
    extension->resp = is_response;
12283
    /* In QUIC, earlydata size is either 0 or 0xffffffff.
12284
     * Override any size between, possibly left from our initial value */
12285
    extension->val  = (WOLFSSL_IS_QUIC(ssl) && is_response && maxSz > 0) ?
12286
                       WOLFSSL_MAX_32BIT : maxSz;
12287
12288
    return 0;
12289
}
12290
12291
#define EDI_GET_SIZE  TLSX_EarlyData_GetSize
12292
#define EDI_WRITE     TLSX_EarlyData_Write
12293
#define EDI_PARSE     TLSX_EarlyData_Parse
12294
12295
#else
12296
12297
#define EDI_GET_SIZE(a, b)    0
12298
#define EDI_WRITE(a, b, c, d) 0
12299
#define EDI_PARSE(a, b, c, d) 0
12300
12301
#endif
12302
12303
/******************************************************************************/
12304
/* QUIC transport parameter extension                                         */
12305
/******************************************************************************/
12306
#ifdef WOLFSSL_QUIC
12307
12308
static word16 TLSX_QuicTP_GetSize(TLSX* extension)
12309
{
12310
    const QuicTransportParam *tp = (QuicTransportParam*)extension->data;
12311
12312
    return tp ? tp->len : 0;
12313
}
12314
12315
int TLSX_QuicTP_Use(WOLFSSL* ssl, TLSX_Type ext_type, int is_response)
12316
{
12317
    int ret = 0;
12318
    TLSX* extension;
12319
12320
    WOLFSSL_ENTER("TLSX_QuicTP_Use");
12321
    if (ssl->quic.transport_local == NULL) {
12322
        /* RFC9000, ch 7.3: "An endpoint MUST treat the absence of [...]
12323
         *     from either endpoint [...] as a connection error of type
12324
         *     TRANSPORT_PARAMETER_ERROR."
12325
         */
12326
        ret = QUIC_TP_MISSING_E;
12327
        goto cleanup;
12328
    }
12329
12330
    extension = TLSX_Find(ssl->extensions, ext_type);
12331
    if (extension == NULL) {
12332
        ret = TLSX_Push(&ssl->extensions, ext_type, NULL, ssl->heap);
12333
        if (ret != 0)
12334
            goto cleanup;
12335
12336
        extension = TLSX_Find(ssl->extensions, ext_type);
12337
        if (extension == NULL) {
12338
            ret = MEMORY_E;
12339
            goto cleanup;
12340
        }
12341
    }
12342
    if (extension->data) {
12343
        QuicTransportParam_free((QuicTransportParam*)extension->data, ssl->heap);
12344
        extension->data = NULL;
12345
    }
12346
    extension->resp = is_response;
12347
    extension->data = (void*)QuicTransportParam_dup(ssl->quic.transport_local, ssl->heap);
12348
    if (!extension->data) {
12349
        ret = MEMORY_E;
12350
        goto cleanup;
12351
    }
12352
12353
cleanup:
12354
    WOLFSSL_LEAVE("TLSX_QuicTP_Use", ret);
12355
    return ret;
12356
}
12357
12358
static word16 TLSX_QuicTP_Write(QuicTransportParam *tp, byte* output)
12359
{
12360
    word16 len = 0;
12361
12362
    WOLFSSL_ENTER("TLSX_QuicTP_Write");
12363
    if (tp && tp->len) {
12364
        XMEMCPY(output, tp->data, tp->len);
12365
        len = tp->len;
12366
    }
12367
    WOLFSSL_LEAVE("TLSX_QuicTP_Write", len);
12368
    return len;
12369
}
12370
12371
static int TLSX_QuicTP_Parse(WOLFSSL *ssl, const byte *input, size_t len, int ext_type, int msgType)
12372
{
12373
    const QuicTransportParam *tp, **ptp;
12374
12375
    (void)msgType;
12376
    tp = QuicTransportParam_new(input, len, ssl->heap);
12377
    if (!tp) {
12378
        return MEMORY_E;
12379
    }
12380
    ptp = (ext_type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT) ?
12381
        &ssl->quic.transport_peer_draft : &ssl->quic.transport_peer;
12382
    if (*ptp) {
12383
        QTP_FREE(*ptp, ssl->heap);
12384
    }
12385
    *ptp = tp;
12386
    return 0;
12387
}
12388
12389
#define QTP_GET_SIZE    TLSX_QuicTP_GetSize
12390
#define QTP_USE         TLSX_QuicTP_Use
12391
#define QTP_WRITE       TLSX_QuicTP_Write
12392
#define QTP_PARSE       TLSX_QuicTP_Parse
12393
12394
#endif /* WOLFSSL_QUIC */
12395
12396
#if defined(WOLFSSL_DTLS_CID)
12397
#define CID_GET_SIZE  TLSX_ConnectionID_GetSize
12398
#define CID_WRITE  TLSX_ConnectionID_Write
12399
#define CID_PARSE  TLSX_ConnectionID_Parse
12400
#define CID_FREE  TLSX_ConnectionID_Free
12401
#else
12402
#define CID_GET_SIZE(a) 0
12403
#define CID_WRITE(a, b) 0
12404
#define CID_PARSE(a, b, c, d) 0
12405
#define CID_FREE(a, b) 0
12406
#endif /* defined(WOLFSSL_DTLS_CID) */
12407
12408
#if defined(HAVE_RPK)
12409
/******************************************************************************/
12410
/* Client_Certificate_Type extension                                          */
12411
/******************************************************************************/
12412
/* return 1 if specified type is included in the given list, otherwise 0 */
12413
static int IsCertTypeListed(byte type, byte cnt, const byte* list)
12414
{
12415
    int ret = 0;
12416
    int i;
12417
12418
    if (cnt == 0 || list == NULL)
12419
        return ret;
12420
12421
    if (cnt > 0 && cnt <= MAX_CLIENT_CERT_TYPE_CNT) {
12422
        for (i = 0; i < cnt; i++) {
12423
            if (list[i] == type)
12424
                return 1;
12425
        }
12426
    }
12427
    return 0;
12428
}
12429
12430
/* Search both arrays from above to find a common value between the two given
12431
 * arrays(a and b). return 1 if it finds a common value, otherwise return 0.
12432
 */
12433
static int GetCommonItem(const byte* a, byte aLen, const byte* b, byte bLen,
12434
                                                                    byte* type)
12435
{
12436
    int i, j;
12437
12438
    if (a == NULL || b == NULL)
12439
        return 0;
12440
12441
    for (i = 0; i < aLen; i++) {
12442
        for (j = 0; j < bLen; j++) {
12443
            if (a[i] == b[j]) {
12444
                *type = a[i];
12445
                return 1;
12446
            }
12447
        }
12448
    }
12449
    return 0;
12450
}
12451
12452
/* Creates a "client certificate type" extension if necessary.
12453
 * Returns 0 if no error occurred, negative value otherwise.
12454
 * A return of 0, it does not indicae that the extension was created.
12455
 */
12456
static int TLSX_ClientCertificateType_Use(WOLFSSL* ssl, byte isServer)
12457
{
12458
    int ret = 0;
12459
12460
    if (ssl == NULL)
12461
        return BAD_FUNC_ARG;
12462
12463
    if (isServer) {
12464
        /* [in server side]
12465
         */
12466
12467
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12468
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12469
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
12470
12471
            WOLFSSL_MSG("Adding Client Certificate Type extension");
12472
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
12473
                                                                    ssl->heap);
12474
            if (ret == 0) {
12475
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
12476
            }
12477
        }
12478
    }
12479
    else {
12480
        /* [in client side]
12481
         * This extension MUST be omitted from the ClientHello unless the RPK
12482
         * certificate is preferred by the user and actually loaded.
12483
         */
12484
12485
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12486
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12487
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
12488
12489
            if (ssl->options.rpkState.isRPKLoaded) {
12490
12491
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
12492
                ssl->options.rpkState.sending_ClientCertTypes[0] =
12493
                                                        WOLFSSL_CERT_TYPE_RPK;
12494
12495
                /* Push new client_certificate_type extension. */
12496
                WOLFSSL_MSG("Adding Client Certificate Type extension");
12497
                ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE,
12498
                                                                ssl, ssl->heap);
12499
            }
12500
            else {
12501
                WOLFSSL_MSG("Willing to use RPK cert but not loaded it");
12502
            }
12503
        }
12504
        else {
12505
            WOLFSSL_MSG("No will to use RPK cert");
12506
        }
12507
    }
12508
    return ret;
12509
}
12510
12511
/* Parse a "client certificate type" extension received from peer.
12512
 * returns 0 on success and other values indicate failure.
12513
 */
12514
static int TLSX_ClientCertificateType_Parse(WOLFSSL* ssl, const byte* input,
12515
                                                word16 length, byte msgType)
12516
{
12517
    byte typeCnt;
12518
    int idx = 0;
12519
    int ret = 0;
12520
    int i;
12521
    int populate = 0;
12522
    byte  cmnType;
12523
12524
12525
    if (msgType == client_hello) {
12526
        /* [parse ClientHello in server end]
12527
         * case 1) if peer verify is disabled, this extension must be omitted
12528
         *         from ServerHello.
12529
         * case 2) if user have not set his preference, find X509 in parsed
12530
         *         result, then populate "Client Certificate Type" extension.
12531
         * case 3) if user have not set his preference and X509 isn't included
12532
         *         in parsed result, send "unsupported certificate" alert.
12533
         * case 4) if user have set his preference, find a common cert type
12534
         *         in users preference and received cert types.
12535
         * case 5) if user have set his preference, but no common cert type
12536
         *         found.
12537
         */
12538
12539
        /* case 1 */
12540
        if (ssl->options.verifyNone) {
12541
            return ret;
12542
        }
12543
12544
        /* parse extension */
12545
        if (length < OPAQUE8_LEN)
12546
            return BUFFER_E;
12547
12548
        typeCnt = input[idx];
12549
12550
        if (typeCnt > MAX_CLIENT_CERT_TYPE_CNT)
12551
            return BUFFER_E;
12552
12553
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
12554
            return BUFFER_E;
12555
        }
12556
12557
        ssl->options.rpkState.received_ClientCertTypeCnt = input[idx];
12558
        idx += OPAQUE8_LEN;
12559
12560
        for (i = 0; i < typeCnt; i++) {
12561
            ssl->options.rpkState.received_ClientCertTypes[i] = input[idx];
12562
            idx += OPAQUE8_LEN;
12563
        }
12564
12565
        if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt == 0) {
12566
            /* case 2 */
12567
            if (IsCertTypeListed(WOLFSSL_CERT_TYPE_X509,
12568
                            ssl->options.rpkState.received_ClientCertTypeCnt,
12569
                            ssl->options.rpkState.received_ClientCertTypes)) {
12570
12571
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
12572
                ssl->options.rpkState.sending_ClientCertTypes[0] =
12573
                                                        WOLFSSL_CERT_TYPE_X509;
12574
                populate = 1;
12575
            }
12576
            /* case 3 */
12577
            else {
12578
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
12579
                SendAlert(ssl, alert_fatal, unsupported_certificate);
12580
                return UNSUPPORTED_CERTIFICATE;
12581
            }
12582
        }
12583
        else if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt > 0) {
12584
            /* case 4 */
12585
            if (GetCommonItem(
12586
                            ssl->options.rpkConfig.preferred_ClientCertTypes,
12587
                            ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12588
                            ssl->options.rpkState.received_ClientCertTypes,
12589
                            ssl->options.rpkState.received_ClientCertTypeCnt,
12590
                            &cmnType)) {
12591
                ssl->options.rpkState.sending_ClientCertTypeCnt  = 1;
12592
                ssl->options.rpkState.sending_ClientCertTypes[0] = cmnType;
12593
                populate = 1;
12594
            }
12595
            /* case 5 */
12596
            else {
12597
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
12598
                SendAlert(ssl, alert_fatal, unsupported_certificate);
12599
                return UNSUPPORTED_CERTIFICATE;
12600
            }
12601
        }
12602
12603
        /* populate client_certificate_type extension */
12604
        if (populate) {
12605
            WOLFSSL_MSG("Adding Client Certificate Type extension");
12606
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
12607
                                                                    ssl->heap);
12608
            if (ret == 0) {
12609
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
12610
            }
12611
        }
12612
    }
12613
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12614
        /* parse it in client side */
12615
        if (length == 1) {
12616
            ssl->options.rpkState.received_ClientCertTypeCnt  = 1;
12617
            ssl->options.rpkState.received_ClientCertTypes[0] = *input;
12618
        }
12619
        else {
12620
            return BUFFER_E;
12621
        }
12622
    }
12623
12624
    return ret;
12625
}
12626
12627
/* Write out the "client certificate type" extension data into the given buffer.
12628
 * return the size wrote in the buffer on success, negative value on error.
12629
 */
12630
static word16 TLSX_ClientCertificateType_Write(void* data, byte* output,
12631
                                              byte msgType)
12632
{
12633
    WOLFSSL* ssl = (WOLFSSL*)data;
12634
    word16 idx = 0;
12635
    byte cnt = 0;
12636
    int i;
12637
12638
    /* skip to write extension if count is zero */
12639
    cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
12640
12641
    if (cnt == 0)
12642
        return 0;
12643
12644
    if (msgType == client_hello) {
12645
        /* client side */
12646
12647
        *(output + idx) = cnt;
12648
        idx += OPAQUE8_LEN;
12649
12650
        for (i = 0; i < cnt; i++) {
12651
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[i];
12652
            idx += OPAQUE8_LEN;
12653
        }
12654
        return idx;
12655
    }
12656
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12657
        /* sever side */
12658
        if (cnt == 1) {
12659
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[0];
12660
            idx += OPAQUE8_LEN;
12661
        }
12662
    }
12663
    return idx;
12664
}
12665
12666
/* Calculate then return the size of the "client certificate type" extension
12667
 * data.
12668
 * return the extension data size on success, negative value on error.
12669
*/
12670
static int TLSX_ClientCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
12671
{
12672
    int ret = 0;
12673
    byte cnt;
12674
12675
    if (ssl == NULL)
12676
        return BAD_FUNC_ARG;
12677
12678
    if (msgType == client_hello) {
12679
        /* client side */
12680
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
12681
        ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
12682
    }
12683
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12684
        /* server side */
12685
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;/* must be one */
12686
        if (cnt != 1)
12687
            return SANITY_MSG_E;
12688
        ret = OPAQUE8_LEN;
12689
    }
12690
    else {
12691
        return SANITY_MSG_E;
12692
    }
12693
    return ret;
12694
}
12695
12696
    #define CCT_GET_SIZE  TLSX_ClientCertificateType_GetSize
12697
    #define CCT_WRITE     TLSX_ClientCertificateType_Write
12698
    #define CCT_PARSE     TLSX_ClientCertificateType_Parse
12699
#else
12700
    #define CCT_GET_SIZE(a)  0
12701
    #define CCT_WRITE(a, b)  0
12702
    #define CCT_PARSE(a, b, c, d) 0
12703
#endif /* HAVE_RPK */
12704
12705
#if defined(HAVE_RPK)
12706
/******************************************************************************/
12707
/* Server_Certificate_Type extension                                          */
12708
/******************************************************************************/
12709
/* Creates a "server certificate type" extension if necessary.
12710
 * Returns 0 if no error occurred, negative value otherwise.
12711
 * A return of 0, it does not indicae that the extension was created.
12712
 */
12713
static int TLSX_ServerCertificateType_Use(WOLFSSL* ssl, byte isServer)
12714
{
12715
    int ret = 0;
12716
    byte ctype;
12717
12718
    if (ssl == NULL)
12719
        return BAD_FUNC_ARG;
12720
12721
    if (isServer) {
12722
        /* [in server side] */
12723
        /* find common cert type to both end */
12724
        if (GetCommonItem(
12725
                ssl->options.rpkConfig.preferred_ServerCertTypes,
12726
                ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
12727
                ssl->options.rpkState.received_ServerCertTypes,
12728
                ssl->options.rpkState.received_ServerCertTypeCnt,
12729
                &ctype)) {
12730
            ssl->options.rpkState.sending_ServerCertTypeCnt = 1;
12731
            ssl->options.rpkState.sending_ServerCertTypes[0] = ctype;
12732
12733
            /* Push new server_certificate_type extension. */
12734
            WOLFSSL_MSG("Adding Server Certificate Type extension");
12735
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
12736
                                                                    ssl->heap);
12737
            if (ret == 0) {
12738
                TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
12739
            }
12740
        }
12741
        else {
12742
            /* no common cert type found */
12743
            WOLFSSL_MSG("No common cert type found in server_certificate_type ext");
12744
            SendAlert(ssl, alert_fatal, unsupported_certificate);
12745
            ret = UNSUPPORTED_CERTIFICATE;
12746
        }
12747
    }
12748
    else {
12749
        /* [in client side] */
12750
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12751
                            ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
12752
                            ssl->options.rpkConfig.preferred_ServerCertTypes)) {
12753
12754
            ssl->options.rpkState.sending_ServerCertTypeCnt =
12755
                        ssl->options.rpkConfig.preferred_ServerCertTypeCnt;
12756
            XMEMCPY(ssl->options.rpkState.sending_ServerCertTypes,
12757
                    ssl->options.rpkConfig.preferred_ServerCertTypes,
12758
                    ssl->options.rpkConfig.preferred_ServerCertTypeCnt);
12759
12760
            /* Push new server_certificate_type extension. */
12761
            WOLFSSL_MSG("Adding Server Certificate Type extension");
12762
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
12763
                                                                    ssl->heap);
12764
        }
12765
        else {
12766
            WOLFSSL_MSG("No will to accept RPK cert");
12767
        }
12768
    }
12769
12770
    return ret;
12771
}
12772
12773
/* Parse a "server certificate type" extension received from peer.
12774
 * returns 0 on success and other values indicate failure.
12775
 */
12776
static int TLSX_ServerCertificateType_Parse(WOLFSSL* ssl, const byte* input,
12777
                                                word16 length, byte msgType)
12778
{
12779
    byte typeCnt;
12780
    int idx = 0;
12781
    int ret = 0;
12782
    int i;
12783
12784
    if (msgType == client_hello) {
12785
        /* in server side */
12786
12787
        if (length < OPAQUE8_LEN)
12788
            return BUFFER_E;
12789
12790
        typeCnt = input[idx];
12791
12792
        if (typeCnt > MAX_SERVER_CERT_TYPE_CNT)
12793
            return BUFFER_E;
12794
12795
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
12796
            return BUFFER_E;
12797
        }
12798
        ssl->options.rpkState.received_ServerCertTypeCnt = input[idx];
12799
        idx += OPAQUE8_LEN;
12800
12801
        for (i = 0; i < typeCnt; i++) {
12802
            ssl->options.rpkState.received_ServerCertTypes[i] = input[idx];
12803
            idx += OPAQUE8_LEN;
12804
        }
12805
12806
        ret = TLSX_ServerCertificateType_Use(ssl, 1);
12807
        if (ret == 0) {
12808
            TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
12809
        }
12810
    }
12811
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12812
        /* in client side */
12813
        if (length != 1)                     /* length slould be 1 */
12814
            return BUFFER_E;
12815
12816
        ssl->options.rpkState.received_ServerCertTypeCnt  = 1;
12817
        ssl->options.rpkState.received_ServerCertTypes[0] = *input;
12818
    }
12819
12820
    return 0;
12821
}
12822
12823
/* Write out the "server certificate type" extension data into the given buffer.
12824
 * return the size wrote in the buffer on success, negative value on error.
12825
 */
12826
static word16 TLSX_ServerCertificateType_Write(void* data, byte* output,
12827
                                                                byte msgType)
12828
{
12829
    WOLFSSL* ssl = (WOLFSSL*)data;
12830
    word16 idx = 0;
12831
    int cnt = 0;
12832
    int i;
12833
12834
    /* skip to write extension if count is zero */
12835
    cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
12836
12837
    if (cnt == 0)
12838
        return 0;
12839
12840
    if (msgType == client_hello) {
12841
        /* in client side */
12842
12843
        *(output + idx) = cnt;
12844
        idx += OPAQUE8_LEN;
12845
12846
        for (i = 0; i < cnt; i++) {
12847
            *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[i];
12848
            idx += OPAQUE8_LEN;
12849
        }
12850
    }
12851
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12852
        /* in server side */
12853
        /* ensure cnt is one */
12854
        if (cnt != 1)
12855
            return 0;
12856
12857
        *(output + idx) =  ssl->options.rpkState.sending_ServerCertTypes[0];
12858
        idx += OPAQUE8_LEN;
12859
    }
12860
    return idx;
12861
}
12862
12863
/* Calculate then return the size of the "server certificate type" extension
12864
 * data.
12865
 * return the extension data size on success, negative value on error.
12866
*/
12867
static int TLSX_ServerCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
12868
{
12869
    int ret = 0;
12870
    int cnt;
12871
12872
    if (ssl == NULL)
12873
        return BAD_FUNC_ARG;
12874
12875
    if (msgType == client_hello) {
12876
        /* in clent side */
12877
        cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
12878
        if (cnt > 0) {
12879
            ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
12880
        }
12881
    }
12882
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12883
        /* in server side */
12884
        ret = (int)OPAQUE8_LEN;
12885
    }
12886
    else {
12887
        return SANITY_MSG_E;
12888
    }
12889
    return ret;
12890
}
12891
12892
    #define SCT_GET_SIZE  TLSX_ServerCertificateType_GetSize
12893
    #define SCT_WRITE     TLSX_ServerCertificateType_Write
12894
    #define SCT_PARSE     TLSX_ServerCertificateType_Parse
12895
#else
12896
    #define SCT_GET_SIZE(a)  0
12897
    #define SCT_WRITE(a, b)  0
12898
    #define SCT_PARSE(a, b, c, d) 0
12899
#endif /* HAVE_RPK */
12900
12901
/******************************************************************************/
12902
/* TLS Extensions Framework                                                   */
12903
/******************************************************************************/
12904
12905
/** Finds an extension in the provided list. */
12906
TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
12907
0
{
12908
0
    TLSX* extension = list;
12909
12910
0
    while (extension && extension->type != type)
12911
0
        extension = extension->next;
12912
12913
0
    return extension;
12914
0
}
12915
12916
/** Remove an extension. */
12917
void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
12918
0
{
12919
0
    TLSX* extension;
12920
0
    TLSX** next;
12921
12922
0
    if (list == NULL)
12923
0
        return;
12924
12925
0
    extension = *list;
12926
0
    next = list;
12927
12928
0
    while (extension && extension->type != type) {
12929
0
        next = &extension->next;
12930
0
        extension = extension->next;
12931
0
    }
12932
12933
0
    if (extension) {
12934
0
        *next = extension->next;
12935
0
        extension->next = NULL;
12936
0
        TLSX_FreeAll(extension, heap);
12937
0
    }
12938
0
}
12939
12940
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
12941
#define GREASE_ECH_SIZE 160
12942
#define MAX_PUBLIC_NAME_SZ 256
12943
#define TLS_INFO_CONST_STRING "tls ech"
12944
#define TLS_INFO_CONST_STRING_SZ 7
12945
12946
/* return status after setting up ech to write a grease ech */
12947
static int TLSX_GreaseECH_Use(TLSX** extensions, void* heap, WC_RNG* rng)
12948
{
12949
    int ret = 0;
12950
    WOLFSSL_ECH* ech;
12951
12952
    if (extensions == NULL)
12953
        return BAD_FUNC_ARG;
12954
12955
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
12956
        DYNAMIC_TYPE_TMP_BUFFER);
12957
12958
    if (ech == NULL)
12959
        return MEMORY_E;
12960
12961
    ForceZero(ech, sizeof(WOLFSSL_ECH));
12962
12963
    ech->state = ECH_WRITE_GREASE;
12964
12965
    /* 0 for outer */
12966
    ech->type = ECH_TYPE_OUTER;
12967
    /* kemId */
12968
    ech->kemId = DHKEM_X25519_HKDF_SHA256;
12969
    /* cipherSuite kdf */
12970
    ech->cipherSuite.kdfId = HKDF_SHA256;
12971
    /* cipherSuite aead */
12972
    ech->cipherSuite.aeadId = HPKE_AES_128_GCM;
12973
12974
    /* random configId */
12975
    ret = wc_RNG_GenerateByte(rng, &(ech->configId));
12976
12977
    /* curve25519 encLen */
12978
    ech->encLen = DHKEM_X25519_ENC_LEN;
12979
12980
    if (ret == 0)
12981
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
12982
12983
    if (ret != 0) {
12984
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
12985
    }
12986
12987
    return ret;
12988
}
12989
12990
/* return status after setting up ech to write real ech */
12991
static int TLSX_ECH_Use(WOLFSSL_EchConfig* echConfig, TLSX** extensions,
12992
    void* heap, WC_RNG* rng)
12993
{
12994
    int ret = 0;
12995
    int suiteIndex;
12996
    TLSX* echX;
12997
    WOLFSSL_ECH* ech;
12998
    if (extensions == NULL)
12999
        return BAD_FUNC_ARG;
13000
    /* skip if we already have an ech extension, we will for hrr */
13001
    echX = TLSX_Find(*extensions, TLSX_ECH);
13002
    if (echX != NULL)
13003
        return 0;
13004
    /* find a supported cipher suite */
13005
    suiteIndex = EchConfigGetSupportedCipherSuite(echConfig);
13006
    if (suiteIndex < 0)
13007
        return suiteIndex;
13008
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13009
        DYNAMIC_TYPE_TMP_BUFFER);
13010
    if (ech == NULL)
13011
        return MEMORY_E;
13012
    ForceZero(ech, sizeof(WOLFSSL_ECH));
13013
    ech->state = ECH_WRITE_REAL;
13014
    ech->echConfig = echConfig;
13015
    /* 0 for outer */
13016
    ech->type = ECH_TYPE_OUTER;
13017
    /* kemId */
13018
    ech->kemId = echConfig->kemId;
13019
    /* cipherSuite kdf */
13020
    ech->cipherSuite.kdfId = echConfig->cipherSuites[suiteIndex].kdfId;
13021
    /* cipherSuite aead */
13022
    ech->cipherSuite.aeadId = echConfig->cipherSuites[suiteIndex].aeadId;
13023
    /* configId */
13024
    ech->configId = echConfig->configId;
13025
    /* encLen */
13026
    switch (echConfig->kemId)
13027
    {
13028
        case DHKEM_P256_HKDF_SHA256:
13029
            ech->encLen = DHKEM_P256_ENC_LEN;
13030
            break;
13031
        case DHKEM_P384_HKDF_SHA384:
13032
            ech->encLen = DHKEM_P384_ENC_LEN;
13033
            break;
13034
        case DHKEM_P521_HKDF_SHA512:
13035
            ech->encLen = DHKEM_P521_ENC_LEN;
13036
            break;
13037
        case DHKEM_X25519_HKDF_SHA256:
13038
            ech->encLen = DHKEM_X25519_ENC_LEN;
13039
            break;
13040
        case DHKEM_X448_HKDF_SHA512:
13041
            ech->encLen = DHKEM_X448_ENC_LEN;
13042
            break;
13043
    }
13044
    /* setup hpke */
13045
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
13046
    if (ech->hpke == NULL) {
13047
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13048
        return MEMORY_E;
13049
    }
13050
    ret = wc_HpkeInit(ech->hpke, ech->kemId, ech->cipherSuite.kdfId,
13051
        ech->cipherSuite.aeadId, heap);
13052
    /* setup the ephemeralKey */
13053
    if (ret == 0)
13054
        ret = wc_HpkeGenerateKeyPair(ech->hpke, &ech->ephemeralKey, rng);
13055
    if (ret == 0)
13056
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13057
    if (ret != 0) {
13058
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13059
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13060
    }
13061
    return ret;
13062
}
13063
13064
/* return status after setting up ech to read and decrypt */
13065
static int TLSX_ServerECH_Use(TLSX** extensions, void* heap,
13066
    WOLFSSL_EchConfig* configs)
13067
{
13068
    int ret;
13069
    WOLFSSL_ECH* ech;
13070
    TLSX* echX;
13071
    if (extensions == NULL)
13072
        return BAD_FUNC_ARG;
13073
    /* if we already have ech don't override it */
13074
    echX = TLSX_Find(*extensions, TLSX_ECH);
13075
    if (echX != NULL)
13076
        return 0;
13077
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13078
        DYNAMIC_TYPE_TMP_BUFFER);
13079
    if (ech == NULL)
13080
        return MEMORY_E;
13081
    ForceZero(ech, sizeof(WOLFSSL_ECH));
13082
    ech->state = ECH_WRITE_NONE;
13083
    /* 0 for outer */
13084
    ech->type = ECH_TYPE_OUTER;
13085
    ech->echConfig = configs;
13086
    /* setup the rest of the settings when we receive ech from the client */
13087
    ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13088
    if (ret != 0)
13089
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13090
    return ret;
13091
}
13092
13093
/* return status after writing the ech and updating offset */
13094
static int TLSX_ECH_Write(WOLFSSL_ECH* ech, byte msgType, byte* writeBuf,
13095
    word16* offset)
13096
{
13097
    int ret = 0;
13098
    int rngRet = -1;
13099
    word32 configsLen = 0;
13100
    void* ephemeralKey = NULL;
13101
    byte* writeBuf_p = writeBuf;
13102
#ifdef WOLFSSL_SMALL_STACK
13103
    Hpke* hpke = NULL;
13104
    WC_RNG* rng = NULL;
13105
#else
13106
    Hpke hpke[1];
13107
    WC_RNG rng[1];
13108
#endif
13109
    WOLFSSL_MSG("TLSX_ECH_Write");
13110
    if (msgType == hello_retry_request) {
13111
        /* reserve space to write the confirmation to */
13112
        *offset += ECH_ACCEPT_CONFIRMATION_SZ;
13113
        /* set confBuf */
13114
        ech->confBuf = writeBuf;
13115
        return 0;
13116
    }
13117
    if (ech->state == ECH_WRITE_NONE || ech->state == ECH_PARSED_INTERNAL)
13118
        return 0;
13119
    if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
13120
        /* get size then write */
13121
        ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen);
13122
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13123
            return ret;
13124
        ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen);
13125
        if (ret != WOLFSSL_SUCCESS)
13126
            return ret;
13127
        *offset += configsLen;
13128
        return 0;
13129
    }
13130
    /* type */
13131
    *writeBuf_p = ech->type;
13132
    writeBuf_p += sizeof(ech->type);
13133
    /* outer has body, inner does not */
13134
    if (ech->type == ECH_TYPE_OUTER) {
13135
        /* kdfId */
13136
        c16toa(ech->cipherSuite.kdfId, writeBuf_p);
13137
        writeBuf_p += sizeof(ech->cipherSuite.kdfId);
13138
        /* aeadId */
13139
        c16toa(ech->cipherSuite.aeadId, writeBuf_p);
13140
        writeBuf_p += sizeof(ech->cipherSuite.aeadId);
13141
        /* configId */
13142
        *writeBuf_p = ech->configId;
13143
        writeBuf_p += sizeof(ech->configId);
13144
        /* encLen */
13145
        if (ech->hpkeContext == NULL) {
13146
            c16toa(ech->encLen, writeBuf_p);
13147
        }
13148
        else {
13149
            /* set to 0 if this is clientInner 2 */
13150
            c16toa(0, writeBuf_p);
13151
        }
13152
        writeBuf_p += 2;
13153
        if (ech->state == ECH_WRITE_GREASE) {
13154
#ifdef WOLFSSL_SMALL_STACK
13155
            hpke = (Hpke*)XMALLOC(sizeof(Hpke), NULL, DYNAMIC_TYPE_TMP_BUFFER);
13156
            if (hpke == NULL)
13157
                return MEMORY_E;
13158
            rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
13159
            if (rng == NULL) {
13160
                XFREE(hpke, NULL, DYNAMIC_TYPE_RNG);
13161
                return MEMORY_E;
13162
            }
13163
#endif
13164
            /* hpke init */
13165
            ret = wc_HpkeInit(hpke, ech->kemId, ech->cipherSuite.kdfId,
13166
                ech->cipherSuite.aeadId, NULL);
13167
            if (ret == 0)
13168
                rngRet = ret = wc_InitRng(rng);
13169
            /* create the ephemeralKey */
13170
            if (ret == 0)
13171
                ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng);
13172
            /* enc */
13173
            if (ret == 0) {
13174
                ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey, writeBuf_p,
13175
                    &ech->encLen);
13176
                writeBuf_p += ech->encLen;
13177
            }
13178
            if (ret == 0) {
13179
                /* innerClientHelloLen */
13180
                c16toa(GREASE_ECH_SIZE + ((writeBuf_p + 2 - writeBuf) % 32),
13181
                    writeBuf_p);
13182
                writeBuf_p += 2;
13183
13184
                /* innerClientHello */
13185
                ret = wc_RNG_GenerateBlock(rng, writeBuf_p, GREASE_ECH_SIZE +
13186
                    ((writeBuf_p - writeBuf) % 32));
13187
                writeBuf_p += GREASE_ECH_SIZE + ((writeBuf_p - writeBuf) % 32);
13188
            }
13189
            if (rngRet == 0)
13190
                wc_FreeRng(rng);
13191
            if (ephemeralKey != NULL)
13192
                wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap);
13193
#ifdef WOLFSSL_SMALL_STACK
13194
            XFREE(hpke, NULL, DYNAMIC_TYPE_TMP_BUFFER);
13195
            XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
13196
#endif
13197
        }
13198
        else {
13199
            /* only write enc if this is our first ech, no hpke context */
13200
            if (ech->hpkeContext == NULL) {
13201
                /* write enc to writeBuf_p */
13202
                ret = wc_HpkeSerializePublicKey(ech->hpke, ech->ephemeralKey,
13203
                    writeBuf_p, &ech->encLen);
13204
                writeBuf_p += ech->encLen;
13205
            }
13206
            /* innerClientHelloLen */
13207
            c16toa(ech->innerClientHelloLen, writeBuf_p);
13208
            writeBuf_p += 2;
13209
            /* set payload offset for when we finalize */
13210
            ech->outerClientPayload = writeBuf_p;
13211
            /* write zeros for payload */
13212
            XMEMSET(writeBuf_p, 0, ech->innerClientHelloLen);
13213
            writeBuf_p += ech->innerClientHelloLen;
13214
        }
13215
    }
13216
    if (ret == 0)
13217
        *offset += (writeBuf_p - writeBuf);
13218
    return ret;
13219
}
13220
13221
/* return the size needed for the ech extension */
13222
static int TLSX_ECH_GetSize(WOLFSSL_ECH* ech, byte msgType)
13223
{
13224
    int ret;
13225
    word32 size = 0;
13226
13227
    if (ech->state == ECH_WRITE_GREASE) {
13228
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
13229
            sizeof(ech->configId) + sizeof(word16) + ech->encLen +
13230
            sizeof(word16);
13231
13232
        size += GREASE_ECH_SIZE + (size % 32);
13233
    }
13234
    else if (msgType == hello_retry_request) {
13235
        size = ECH_ACCEPT_CONFIRMATION_SZ;
13236
    }
13237
    else if (ech->state == ECH_WRITE_NONE ||
13238
        ech->state == ECH_PARSED_INTERNAL) {
13239
        size = 0;
13240
    }
13241
    else if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
13242
        /* get the size of the raw configs */
13243
        ret = GetEchConfigsEx(ech->echConfig, NULL, &size);
13244
13245
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13246
            return ret;
13247
    }
13248
    else if (ech->type == ECH_TYPE_INNER)
13249
    {
13250
        size = sizeof(ech->type);
13251
    }
13252
    else
13253
    {
13254
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
13255
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16) +
13256
            ech->innerClientHelloLen;
13257
        /* only set encLen if this is inner hello 1 */
13258
        if (ech->hpkeContext == NULL)
13259
            size += ech->encLen;
13260
    }
13261
13262
    return (int)size;
13263
}
13264
13265
/* return status after attempting to open the hpke encrypted ech extension, if
13266
 * successful the inner client hello will be stored in
13267
 * ech->innerClientHelloLen */
13268
static int TLSX_ExtractEch(WOLFSSL_ECH* ech, WOLFSSL_EchConfig* echConfig,
13269
    byte* aad, word32 aadLen, void* heap)
13270
{
13271
    int ret = 0;
13272
    int expectedEncLen;
13273
    int i;
13274
    word32 rawConfigLen = 0;
13275
    byte* info = NULL;
13276
    word32 infoLen = 0;
13277
    if (ech == NULL || echConfig == NULL || aad == NULL)
13278
        return BAD_FUNC_ARG;
13279
    /* verify the kem and key len */
13280
    switch (echConfig->kemId)
13281
    {
13282
        case DHKEM_P256_HKDF_SHA256:
13283
            expectedEncLen = DHKEM_P256_ENC_LEN;
13284
            break;
13285
        case DHKEM_P384_HKDF_SHA384:
13286
            expectedEncLen = DHKEM_P384_ENC_LEN;
13287
            break;
13288
        case DHKEM_P521_HKDF_SHA512:
13289
            expectedEncLen = DHKEM_P521_ENC_LEN;
13290
            break;
13291
        case DHKEM_X25519_HKDF_SHA256:
13292
            expectedEncLen = DHKEM_X25519_ENC_LEN;
13293
            break;
13294
        case DHKEM_X448_HKDF_SHA512:
13295
            expectedEncLen = DHKEM_X448_ENC_LEN;
13296
            break;
13297
        default:
13298
            expectedEncLen = 0;
13299
            break;
13300
    }
13301
    if (expectedEncLen != ech->encLen)
13302
        return BAD_FUNC_ARG;
13303
    /* verify the cipher suite */
13304
    for (i = 0; i < echConfig->numCipherSuites; i++) {
13305
        if (echConfig->cipherSuites[i].kdfId == ech->cipherSuite.kdfId &&
13306
            echConfig->cipherSuites[i].aeadId == ech->cipherSuite.aeadId) {
13307
            break;
13308
        }
13309
    }
13310
    if (i >= echConfig->numCipherSuites) {
13311
        return BAD_FUNC_ARG;
13312
    }
13313
    /* check if hpke already exists, may if HelloRetryRequest */
13314
    if (ech->hpke == NULL) {
13315
        ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
13316
        if (ech->hpke == NULL)
13317
            ret = MEMORY_E;
13318
        /* init the hpke struct */
13319
        if (ret == 0) {
13320
            ret = wc_HpkeInit(ech->hpke, echConfig->kemId,
13321
                ech->cipherSuite.kdfId, ech->cipherSuite.aeadId, heap);
13322
        }
13323
        if (ret == 0) {
13324
            /* allocate hpkeContext */
13325
            ech->hpkeContext =
13326
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
13327
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13328
            if (ech->hpkeContext == NULL)
13329
                ret = MEMORY_E;
13330
        }
13331
        /* get the rawConfigLen */
13332
        if (ret == 0)
13333
            ret = GetEchConfig(echConfig, NULL, &rawConfigLen);
13334
        if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13335
            ret = 0;
13336
        /* create info */
13337
        if (ret == 0) {
13338
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + rawConfigLen;
13339
            info = (byte*)XMALLOC(infoLen, heap, DYNAMIC_TYPE_TMP_BUFFER);
13340
13341
            if (info == NULL)
13342
                ret = MEMORY_E;
13343
            else {
13344
                XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
13345
                    TLS_INFO_CONST_STRING_SZ + 1);
13346
                ret = GetEchConfig(echConfig, info +
13347
                    TLS_INFO_CONST_STRING_SZ + 1, &rawConfigLen);
13348
            }
13349
        }
13350
        /* init the context for opening */
13351
        if (ret == 0) {
13352
            ret = wc_HpkeInitOpenContext(ech->hpke, ech->hpkeContext,
13353
                echConfig->receiverPrivkey, ech->enc, ech->encLen, info,
13354
                infoLen);
13355
        }
13356
    }
13357
    /* decrypt the ech payload */
13358
    if (ret == 0) {
13359
        ret = wc_HpkeContextOpenBase(ech->hpke, ech->hpkeContext, aad, aadLen,
13360
            ech->outerClientPayload, ech->innerClientHelloLen,
13361
            ech->innerClientHello + HANDSHAKE_HEADER_SZ);
13362
    }
13363
    /* free the hpke and context on failure */
13364
    if (ret != 0) {
13365
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13366
        ech->hpke = NULL;
13367
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
13368
        ech->hpkeContext = NULL;
13369
    }
13370
13371
    if (info != NULL)
13372
        XFREE(info, heap, DYNAMIC_TYPE_TMP_BUFFER);
13373
13374
    return ret;
13375
}
13376
13377
/* parse the ech extension, if internal update ech->state and return, if
13378
 * external attempt to extract the inner client_hello, return the status */
13379
static int TLSX_ECH_Parse(WOLFSSL* ssl, const byte* readBuf, word16 size,
13380
    byte msgType)
13381
{
13382
    int ret = 0;
13383
    int i;
13384
    TLSX* echX;
13385
    WOLFSSL_ECH* ech;
13386
    WOLFSSL_EchConfig* echConfig;
13387
    byte* aadCopy;
13388
    byte* readBuf_p = (byte*)readBuf;
13389
    WOLFSSL_MSG("TLSX_ECH_Parse");
13390
    if (size == 0)
13391
        return BAD_FUNC_ARG;
13392
    if (ssl->options.disableECH) {
13393
        WOLFSSL_MSG("TLSX_ECH_Parse: ECH disabled. Ignoring.");
13394
        return 0;
13395
    }
13396
    /* retry configs */
13397
    if (msgType == encrypted_extensions) {
13398
        ret = wolfSSL_SetEchConfigs(ssl, readBuf, size);
13399
13400
        if (ret == WOLFSSL_SUCCESS)
13401
            ret = 0;
13402
    }
13403
    /* HRR with special confirmation */
13404
    else if (msgType == hello_retry_request && ssl->options.useEch) {
13405
        /* length must be 8 */
13406
        if (size != ECH_ACCEPT_CONFIRMATION_SZ)
13407
            return BAD_FUNC_ARG;
13408
        /* get extension */
13409
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13410
        if (echX == NULL)
13411
            return BAD_FUNC_ARG;
13412
        ech = (WOLFSSL_ECH*)echX->data;
13413
        ech->confBuf = (byte*)readBuf;
13414
    }
13415
    else if (msgType == client_hello && ssl->ctx->echConfigs != NULL) {
13416
        /* get extension */
13417
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13418
        if (echX == NULL)
13419
            return BAD_FUNC_ARG;
13420
        ech = (WOLFSSL_ECH*)echX->data;
13421
        /* read the ech parameters before the payload */
13422
        ech->type = *readBuf_p;
13423
        readBuf_p++;
13424
        if (ech->type == ECH_TYPE_INNER) {
13425
            ech->state = ECH_PARSED_INTERNAL;
13426
            return 0;
13427
        }
13428
        /* technically the payload would only be 1 byte at this length */
13429
        if (size < 11 + ech->encLen)
13430
            return BAD_FUNC_ARG;
13431
        /* read kdfId */
13432
        ato16(readBuf_p, &ech->cipherSuite.kdfId);
13433
        readBuf_p += 2;
13434
        /* read aeadId */
13435
        ato16(readBuf_p, &ech->cipherSuite.aeadId);
13436
        readBuf_p += 2;
13437
        /* read configId */
13438
        ech->configId = *readBuf_p;
13439
        readBuf_p++;
13440
        /* only get enc if we don't already have the hpke context */
13441
        if (ech->hpkeContext == NULL) {
13442
            /* read encLen */
13443
            ato16(readBuf_p, &ech->encLen);
13444
            readBuf_p += 2;
13445
            if (ech->encLen > HPKE_Npk_MAX)
13446
                return BAD_FUNC_ARG;
13447
            /* read enc */
13448
            XMEMCPY(ech->enc, readBuf_p, ech->encLen);
13449
            readBuf_p += ech->encLen;
13450
        }
13451
        else {
13452
            readBuf_p += 2;
13453
        }
13454
        /* read hello inner len */
13455
        ato16(readBuf_p, &ech->innerClientHelloLen);
13456
        ech->innerClientHelloLen -= WC_AES_BLOCK_SIZE;
13457
        readBuf_p += 2;
13458
        ech->outerClientPayload = readBuf_p;
13459
        /* make a copy of the aad */
13460
        aadCopy = (byte*)XMALLOC(ech->aadLen, ssl->heap,
13461
            DYNAMIC_TYPE_TMP_BUFFER);
13462
        if (aadCopy == NULL)
13463
            return MEMORY_E;
13464
        XMEMCPY(aadCopy, ech->aad, ech->aadLen);
13465
        /* set the ech payload of the copy to zeros */
13466
        XMEMSET(aadCopy + (readBuf_p - ech->aad), 0,
13467
            ech->innerClientHelloLen + WC_AES_BLOCK_SIZE);
13468
        /* free the old ech in case this is our second client hello */
13469
        if (ech->innerClientHello != NULL)
13470
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13471
        /* allocate the inner payload buffer */
13472
        ech->innerClientHello =
13473
            (byte*)XMALLOC(ech->innerClientHelloLen + HANDSHAKE_HEADER_SZ,
13474
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13475
        if (ech->innerClientHello == NULL) {
13476
            XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13477
            return MEMORY_E;
13478
        }
13479
        /* first check if the config id matches */
13480
        echConfig = ssl->ctx->echConfigs;
13481
        while (echConfig != NULL) {
13482
            /* decrypt with this config */
13483
            if (echConfig->configId == ech->configId) {
13484
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
13485
                    ssl->heap);
13486
                break;
13487
            }
13488
            echConfig = echConfig->next;
13489
        }
13490
        /* try to decrypt with all configs */
13491
        if (echConfig == NULL || ret != 0) {
13492
            echConfig = ssl->ctx->echConfigs;
13493
            while (echConfig != NULL) {
13494
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
13495
                    ssl->heap);
13496
                if (ret== 0)
13497
                    break;
13498
                echConfig = echConfig->next;
13499
            }
13500
        }
13501
        /* if we failed to extract, set state to retry configs */
13502
        if (ret != 0) {
13503
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13504
            ech->innerClientHello = NULL;
13505
            ech->state = ECH_WRITE_RETRY_CONFIGS;
13506
        }
13507
        else {
13508
            i = 0;
13509
            /* decrement until before the padding */
13510
            while (ech->innerClientHello[ech->innerClientHelloLen +
13511
                HANDSHAKE_HEADER_SZ - i - 1] != ECH_TYPE_INNER) {
13512
                i++;
13513
            }
13514
            /* subtract the length of the padding from the length */
13515
            ech->innerClientHelloLen -= i;
13516
        }
13517
        XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13518
        return 0;
13519
    }
13520
13521
    return ret;
13522
}
13523
13524
/* free the ech struct and the dynamic buffer it uses */
13525
static void TLSX_ECH_Free(WOLFSSL_ECH* ech, void* heap)
13526
{
13527
    XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
13528
    if (ech->ephemeralKey != NULL)
13529
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
13530
            ech->hpke->heap);
13531
    if (ech->hpke != NULL)
13532
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13533
    if (ech->hpkeContext != NULL)
13534
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
13535
13536
    XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13537
    (void)heap;
13538
}
13539
13540
/* encrypt the client hello and store it in ech->outerClientPayload, return
13541
 * status */
13542
int TLSX_FinalizeEch(WOLFSSL_ECH* ech, byte* aad, word32 aadLen)
13543
{
13544
    int ret = 0;
13545
    void* receiverPubkey = NULL;
13546
    byte* info = NULL;
13547
    int infoLen = 0;
13548
    byte* aadCopy = NULL;
13549
    /* setup hpke context to seal, should be done at most once per connection */
13550
    if (ech->hpkeContext == NULL) {
13551
        /* import the server public key */
13552
        ret = wc_HpkeDeserializePublicKey(ech->hpke, &receiverPubkey,
13553
            ech->echConfig->receiverPubkey, ech->encLen);
13554
        if (ret == 0) {
13555
            /* allocate hpke context */
13556
            ech->hpkeContext =
13557
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
13558
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13559
            if (ech->hpkeContext == NULL)
13560
                ret = MEMORY_E;
13561
        }
13562
        if (ret == 0) {
13563
            /* create info */
13564
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + ech->echConfig->rawLen;
13565
            info = (byte*)XMALLOC(infoLen, ech->hpke->heap,
13566
                DYNAMIC_TYPE_TMP_BUFFER);
13567
            if (info == NULL)
13568
                ret = MEMORY_E;
13569
        }
13570
        if (ret == 0) {
13571
            /* puts the null byte in for me */
13572
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
13573
                TLS_INFO_CONST_STRING_SZ + 1);
13574
            XMEMCPY(info + TLS_INFO_CONST_STRING_SZ + 1,
13575
                ech->echConfig->raw, ech->echConfig->rawLen);
13576
            /* init the context for seal with info and keys */
13577
            ret = wc_HpkeInitSealContext(ech->hpke, ech->hpkeContext,
13578
                ech->ephemeralKey, receiverPubkey, info, infoLen);
13579
        }
13580
    }
13581
    if (ret == 0) {
13582
        /* make a copy of the aad since we overwrite it */
13583
        aadCopy = (byte*)XMALLOC(aadLen, ech->hpke->heap,
13584
            DYNAMIC_TYPE_TMP_BUFFER);
13585
        if (aadCopy == NULL) {
13586
            ret = MEMORY_E;
13587
        }
13588
    }
13589
    if (ret == 0) {
13590
        XMEMCPY(aadCopy, aad, aadLen);
13591
        /* seal the payload with context */
13592
        ret = wc_HpkeContextSealBase(ech->hpke, ech->hpkeContext, aadCopy,
13593
            aadLen, ech->innerClientHello,
13594
            ech->innerClientHelloLen - ech->hpke->Nt, ech->outerClientPayload);
13595
    }
13596
    if (info != NULL)
13597
        XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13598
    if (aadCopy != NULL)
13599
        XFREE(aadCopy, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13600
    if (receiverPubkey != NULL)
13601
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, receiverPubkey,
13602
            ech->hpke->heap);
13603
    return ret;
13604
}
13605
13606
#define GREASE_ECH_USE TLSX_GreaseECH_Use
13607
#define ECH_USE TLSX_ECH_Use
13608
#define SERVER_ECH_USE TLSX_ServerECH_Use
13609
#define ECH_WRITE TLSX_ECH_Write
13610
#define ECH_GET_SIZE TLSX_ECH_GetSize
13611
#define ECH_PARSE TLSX_ECH_Parse
13612
#define ECH_FREE TLSX_ECH_Free
13613
13614
#endif
13615
13616
/** Releases all extensions in the provided list. */
13617
void TLSX_FreeAll(TLSX* list, void* heap)
13618
0
{
13619
0
    TLSX* extension;
13620
13621
0
    while ((extension = list)) {
13622
0
        list = extension->next;
13623
13624
0
        switch (extension->type) {
13625
#if defined(HAVE_RPK)
13626
            case TLSX_CLIENT_CERTIFICATE_TYPE:
13627
                WOLFSSL_MSG("Client Certificate Type extension free");
13628
                /* nothing to do */
13629
                break;
13630
            case TLSX_SERVER_CERTIFICATE_TYPE:
13631
                WOLFSSL_MSG("Server Certificate Type extension free");
13632
                /* nothing to do */
13633
                break;
13634
#endif
13635
13636
0
#ifdef HAVE_SNI
13637
0
            case TLSX_SERVER_NAME:
13638
0
                WOLFSSL_MSG("SNI extension free");
13639
0
                SNI_FREE_ALL((SNI*)extension->data, heap);
13640
0
                break;
13641
0
#endif
13642
13643
0
            case TLSX_TRUSTED_CA_KEYS:
13644
0
                WOLFSSL_MSG("Trusted CA Indication extension free");
13645
0
                TCA_FREE_ALL((TCA*)extension->data, heap);
13646
0
                break;
13647
13648
0
            case TLSX_MAX_FRAGMENT_LENGTH:
13649
0
                WOLFSSL_MSG("Max Fragment Length extension free");
13650
0
                MFL_FREE_ALL(extension->data, heap);
13651
0
                break;
13652
13653
0
            case TLSX_EXTENDED_MASTER_SECRET:
13654
0
                WOLFSSL_MSG("Extended Master Secret free");
13655
                /* Nothing to do. */
13656
0
                break;
13657
0
            case TLSX_TRUNCATED_HMAC:
13658
0
                WOLFSSL_MSG("Truncated HMAC extension free");
13659
                /* Nothing to do. */
13660
0
                break;
13661
13662
0
            case TLSX_SUPPORTED_GROUPS:
13663
0
                WOLFSSL_MSG("Supported Groups extension free");
13664
0
                EC_FREE_ALL((SupportedCurve*)extension->data, heap);
13665
0
                break;
13666
13667
0
            case TLSX_EC_POINT_FORMATS:
13668
0
                WOLFSSL_MSG("Point Formats extension free");
13669
0
                PF_FREE_ALL((PointFormat*)extension->data, heap);
13670
0
                break;
13671
13672
0
            case TLSX_STATUS_REQUEST:
13673
0
                WOLFSSL_MSG("Certificate Status Request extension free");
13674
0
                CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
13675
0
                break;
13676
13677
0
            case TLSX_STATUS_REQUEST_V2:
13678
0
                WOLFSSL_MSG("Certificate Status Request v2 extension free");
13679
0
                CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
13680
0
                        heap);
13681
0
                break;
13682
13683
0
            case TLSX_RENEGOTIATION_INFO:
13684
0
                WOLFSSL_MSG("Secure Renegotiation extension free");
13685
0
                SCR_FREE_ALL(extension->data, heap);
13686
0
                break;
13687
13688
0
            case TLSX_SESSION_TICKET:
13689
0
                WOLFSSL_MSG("Session Ticket extension free");
13690
0
                WOLF_STK_FREE(extension->data, heap);
13691
0
                break;
13692
13693
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
13694
0
                WOLFSSL_MSG("ALPN extension free");
13695
0
                ALPN_FREE_ALL((ALPN*)extension->data, heap);
13696
0
                break;
13697
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13698
0
            case TLSX_SIGNATURE_ALGORITHMS:
13699
0
                WOLFSSL_MSG("Signature Algorithms extension to free");
13700
0
                SA_FREE_ALL((SignatureAlgorithms*)extension->data, heap);
13701
0
                break;
13702
0
#endif
13703
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
13704
0
            case TLSX_ENCRYPT_THEN_MAC:
13705
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension free");
13706
0
                break;
13707
0
#endif
13708
13709
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13710
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13711
            case TLSX_PRE_SHARED_KEY:
13712
                WOLFSSL_MSG("Pre-Shared Key extension free");
13713
                PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
13714
                break;
13715
13716
        #ifdef WOLFSSL_TLS13
13717
            case TLSX_PSK_KEY_EXCHANGE_MODES:
13718
                WOLFSSL_MSG("PSK Key Exchange Modes extension free");
13719
                break;
13720
        #endif
13721
    #endif
13722
13723
0
            case TLSX_KEY_SHARE:
13724
0
                WOLFSSL_MSG("Key Share extension free");
13725
0
                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
13726
0
                break;
13727
0
#endif
13728
0
#ifdef WOLFSSL_TLS13
13729
0
            case TLSX_SUPPORTED_VERSIONS:
13730
0
                WOLFSSL_MSG("Supported Versions extension free");
13731
0
                break;
13732
13733
    #ifdef WOLFSSL_SEND_HRR_COOKIE
13734
            case TLSX_COOKIE:
13735
                WOLFSSL_MSG("Cookie extension free");
13736
                CKE_FREE_ALL((Cookie*)extension->data, heap);
13737
                break;
13738
    #endif
13739
13740
    #ifdef WOLFSSL_EARLY_DATA
13741
            case TLSX_EARLY_DATA:
13742
                WOLFSSL_MSG("Early Data extension free");
13743
                break;
13744
    #endif
13745
13746
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13747
            case TLSX_POST_HANDSHAKE_AUTH:
13748
                WOLFSSL_MSG("Post-Handshake Authentication extension free");
13749
                break;
13750
    #endif
13751
13752
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13753
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
13754
0
                WOLFSSL_MSG("Signature Algorithms extension free");
13755
0
                break;
13756
0
    #endif
13757
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13758
            case TLSX_CERTIFICATE_AUTHORITIES:
13759
                WOLFSSL_MSG("Certificate Authorities extension free");
13760
                break;
13761
    #endif
13762
0
#endif
13763
#ifdef WOLFSSL_SRTP
13764
            case TLSX_USE_SRTP:
13765
                WOLFSSL_MSG("SRTP extension free");
13766
                SRTP_FREE((TlsxSrtp*)extension->data, heap);
13767
                break;
13768
#endif
13769
13770
    #ifdef WOLFSSL_QUIC
13771
            case TLSX_KEY_QUIC_TP_PARAMS:
13772
                FALL_THROUGH;
13773
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
13774
                WOLFSSL_MSG("QUIC transport parameter free");
13775
                QTP_FREE((QuicTransportParam*)extension->data, heap);
13776
                break;
13777
    #endif
13778
13779
#ifdef WOLFSSL_DTLS_CID
13780
            case TLSX_CONNECTION_ID:
13781
                WOLFSSL_MSG("Connection ID extension free");
13782
                CID_FREE((byte*)extension->data, heap);
13783
                break;
13784
#endif /* WOLFSSL_DTLS_CID */
13785
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13786
            case TLSX_ECH:
13787
                WOLFSSL_MSG("ECH extension free");
13788
                ECH_FREE((WOLFSSL_ECH*)extension->data, heap);
13789
                break;
13790
#endif
13791
#ifdef WOLFSSL_DUAL_ALG_CERTS
13792
            case TLSX_CKS:
13793
                WOLFSSL_MSG("CKS extension free");
13794
                /* nothing to do */
13795
                break;
13796
#endif
13797
0
            default:
13798
0
                break;
13799
0
        }
13800
13801
0
        XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
13802
0
    }
13803
13804
0
    (void)heap;
13805
0
}
13806
13807
/** Checks if the tls extensions are supported based on the protocol version. */
13808
0
int TLSX_SupportExtensions(WOLFSSL* ssl) {
13809
0
    return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
13810
0
}
13811
13812
/** Tells the buffered size of the extensions in a list. */
13813
static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
13814
                        word16* pLength)
13815
0
{
13816
0
    int    ret = 0;
13817
0
    TLSX*  extension;
13818
0
    word16 length = 0;
13819
0
    byte   isRequest = (msgType == client_hello ||
13820
0
                        msgType == certificate_request);
13821
13822
0
    while ((extension = list)) {
13823
0
        list = extension->next;
13824
13825
        /* only extensions marked as response are sent back to the client. */
13826
0
        if (!isRequest && !extension->resp)
13827
0
            continue; /* skip! */
13828
13829
        /* ssl level extensions are expected to override ctx level ones. */
13830
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
13831
0
            continue; /* skip! */
13832
13833
        /* extension type + extension data length. */
13834
0
        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
13835
13836
0
        switch (extension->type) {
13837
#ifdef WOLFSSL_DUAL_ALG_CERTS
13838
            case TLSX_CKS:
13839
                length += ((WOLFSSL*)extension->data)->sigSpecSz ;
13840
                break;
13841
#endif
13842
0
#ifdef HAVE_SNI
13843
0
            case TLSX_SERVER_NAME:
13844
                /* SNI only sends the name on the request. */
13845
0
                if (isRequest)
13846
0
                    length += SNI_GET_SIZE((SNI*)extension->data);
13847
0
                break;
13848
0
#endif
13849
13850
0
            case TLSX_TRUSTED_CA_KEYS:
13851
                /* TCA only sends the list on the request. */
13852
0
                if (isRequest)
13853
0
                    length += TCA_GET_SIZE((TCA*)extension->data);
13854
0
                break;
13855
13856
0
            case TLSX_MAX_FRAGMENT_LENGTH:
13857
0
                length += MFL_GET_SIZE(extension->data);
13858
0
                break;
13859
13860
0
            case TLSX_EXTENDED_MASTER_SECRET:
13861
0
            case TLSX_TRUNCATED_HMAC:
13862
                /* always empty. */
13863
0
                break;
13864
13865
0
            case TLSX_SUPPORTED_GROUPS:
13866
0
                length += EC_GET_SIZE((SupportedCurve*)extension->data);
13867
0
                break;
13868
13869
0
            case TLSX_EC_POINT_FORMATS:
13870
0
                length += PF_GET_SIZE((PointFormat*)extension->data);
13871
0
                break;
13872
13873
0
            case TLSX_STATUS_REQUEST:
13874
0
                length += CSR_GET_SIZE(
13875
0
                         (CertificateStatusRequest*)extension->data, isRequest);
13876
0
                break;
13877
13878
0
            case TLSX_STATUS_REQUEST_V2:
13879
0
                length += CSR2_GET_SIZE(
13880
0
                        (CertificateStatusRequestItemV2*)extension->data,
13881
0
                        isRequest);
13882
0
                break;
13883
13884
0
            case TLSX_RENEGOTIATION_INFO:
13885
0
                length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
13886
0
                        isRequest);
13887
0
                break;
13888
13889
0
            case TLSX_SESSION_TICKET:
13890
0
                length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
13891
0
                        isRequest);
13892
0
                break;
13893
13894
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
13895
0
                length += ALPN_GET_SIZE((ALPN*)extension->data);
13896
0
                break;
13897
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13898
0
            case TLSX_SIGNATURE_ALGORITHMS:
13899
0
                length += SA_GET_SIZE(extension->data);
13900
0
                break;
13901
0
#endif
13902
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
13903
0
            case TLSX_ENCRYPT_THEN_MAC:
13904
0
                ret = ETM_GET_SIZE(msgType, &length);
13905
0
                break;
13906
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
13907
13908
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13909
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13910
            case TLSX_PRE_SHARED_KEY:
13911
                ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
13912
                                                                       &length);
13913
                break;
13914
        #ifdef WOLFSSL_TLS13
13915
            case TLSX_PSK_KEY_EXCHANGE_MODES:
13916
                ret = PKM_GET_SIZE((byte)extension->val, msgType, &length);
13917
                break;
13918
        #endif
13919
    #endif
13920
0
            case TLSX_KEY_SHARE:
13921
0
                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
13922
0
                break;
13923
0
#endif
13924
13925
0
#ifdef WOLFSSL_TLS13
13926
0
            case TLSX_SUPPORTED_VERSIONS:
13927
0
                ret = SV_GET_SIZE(extension->data, msgType, &length);
13928
0
                break;
13929
13930
    #ifdef WOLFSSL_SEND_HRR_COOKIE
13931
            case TLSX_COOKIE:
13932
                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &length);
13933
                break;
13934
    #endif
13935
13936
    #ifdef WOLFSSL_EARLY_DATA
13937
            case TLSX_EARLY_DATA:
13938
                ret = EDI_GET_SIZE(msgType, &length);
13939
                break;
13940
    #endif
13941
13942
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13943
            case TLSX_POST_HANDSHAKE_AUTH:
13944
                ret = PHA_GET_SIZE(msgType, &length);
13945
                break;
13946
    #endif
13947
13948
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13949
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
13950
0
                length += SAC_GET_SIZE(extension->data);
13951
0
                break;
13952
0
    #endif
13953
13954
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13955
            case TLSX_CERTIFICATE_AUTHORITIES:
13956
                length += CAN_GET_SIZE(extension->data);
13957
                break;
13958
    #endif
13959
0
#endif
13960
#ifdef WOLFSSL_SRTP
13961
            case TLSX_USE_SRTP:
13962
                length += SRTP_GET_SIZE((TlsxSrtp*)extension->data);
13963
                break;
13964
#endif
13965
13966
#ifdef HAVE_RPK
13967
            case TLSX_CLIENT_CERTIFICATE_TYPE:
13968
                length += CCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
13969
                break;
13970
13971
            case TLSX_SERVER_CERTIFICATE_TYPE:
13972
                length += SCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
13973
                break;
13974
#endif /* HAVE_RPK */
13975
13976
#ifdef WOLFSSL_QUIC
13977
            case TLSX_KEY_QUIC_TP_PARAMS:
13978
                FALL_THROUGH; /* followed by */
13979
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
13980
                length += QTP_GET_SIZE(extension);
13981
                break;
13982
#endif
13983
#ifdef WOLFSSL_DTLS_CID
13984
            case TLSX_CONNECTION_ID:
13985
                length += CID_GET_SIZE((byte*)extension->data);
13986
                break;
13987
#endif /* WOLFSSL_DTLS_CID */
13988
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13989
            case TLSX_ECH:
13990
                length += ECH_GET_SIZE((WOLFSSL_ECH*)extension->data, msgType);
13991
                break;
13992
#endif
13993
0
            default:
13994
0
                break;
13995
0
        }
13996
13997
        /* marks the extension as processed so ctx level */
13998
        /* extensions don't overlap with ssl level ones. */
13999
0
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
14000
0
    }
14001
14002
0
    *pLength += length;
14003
14004
0
    return ret;
14005
0
}
14006
14007
/** Writes the extensions of a list in a buffer. */
14008
static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
14009
                         byte msgType, word16* pOffset)
14010
0
{
14011
0
    int    ret = 0;
14012
0
    TLSX*  extension;
14013
0
    word16 offset = 0;
14014
0
    word16 length_offset = 0;
14015
0
    byte   isRequest = (msgType == client_hello ||
14016
0
                        msgType == certificate_request);
14017
14018
0
    while ((extension = list)) {
14019
0
        list = extension->next;
14020
14021
        /* only extensions marked as response are written in a response. */
14022
0
        if (!isRequest && !extension->resp)
14023
0
            continue; /* skip! */
14024
14025
        /* ssl level extensions are expected to override ctx level ones. */
14026
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
14027
0
            continue; /* skip! */
14028
14029
        /* writes extension type. */
14030
0
        c16toa((word16)extension->type, output + offset);
14031
0
        offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
14032
0
        length_offset = offset;
14033
14034
        /* extension data should be written internally. */
14035
0
        switch (extension->type) {
14036
#ifdef WOLFSSL_DUAL_ALG_CERTS
14037
            case TLSX_CKS:
14038
                WOLFSSL_MSG("CKS extension to write");
14039
                offset += CKS_WRITE(((WOLFSSL*)extension->data),
14040
                                    output + offset);
14041
                break;
14042
#endif
14043
0
#ifdef HAVE_SNI
14044
0
            case TLSX_SERVER_NAME:
14045
0
                if (isRequest) {
14046
0
                    WOLFSSL_MSG("SNI extension to write");
14047
0
                    offset += SNI_WRITE((SNI*)extension->data, output + offset);
14048
0
                }
14049
0
                break;
14050
0
#endif
14051
14052
0
            case TLSX_TRUSTED_CA_KEYS:
14053
0
                WOLFSSL_MSG("Trusted CA Indication extension to write");
14054
0
                if (isRequest) {
14055
0
                    offset += TCA_WRITE((TCA*)extension->data, output + offset);
14056
0
                }
14057
0
                break;
14058
14059
0
            case TLSX_MAX_FRAGMENT_LENGTH:
14060
0
                WOLFSSL_MSG("Max Fragment Length extension to write");
14061
0
                offset += MFL_WRITE((byte*)extension->data, output + offset);
14062
0
                break;
14063
14064
0
            case TLSX_EXTENDED_MASTER_SECRET:
14065
0
                WOLFSSL_MSG("Extended Master Secret");
14066
                /* always empty. */
14067
0
                break;
14068
14069
0
            case TLSX_TRUNCATED_HMAC:
14070
0
                WOLFSSL_MSG("Truncated HMAC extension to write");
14071
                /* always empty. */
14072
0
                break;
14073
14074
0
            case TLSX_SUPPORTED_GROUPS:
14075
0
                WOLFSSL_MSG("Supported Groups extension to write");
14076
0
                offset += EC_WRITE((SupportedCurve*)extension->data,
14077
0
                                    output + offset);
14078
0
                break;
14079
14080
0
            case TLSX_EC_POINT_FORMATS:
14081
0
                WOLFSSL_MSG("Point Formats extension to write");
14082
0
                offset += PF_WRITE((PointFormat*)extension->data,
14083
0
                                    output + offset);
14084
0
                break;
14085
14086
0
            case TLSX_STATUS_REQUEST:
14087
0
                WOLFSSL_MSG("Certificate Status Request extension to write");
14088
0
                ret = CSR_WRITE((CertificateStatusRequest*)extension->data,
14089
0
                        output + offset, isRequest);
14090
0
                if (ret > 0) {
14091
0
                    offset += (word16)ret;
14092
0
                    ret = 0;
14093
0
                }
14094
0
                break;
14095
14096
0
            case TLSX_STATUS_REQUEST_V2:
14097
0
                WOLFSSL_MSG("Certificate Status Request v2 extension to write");
14098
0
                ret = CSR2_WRITE(
14099
0
                        (CertificateStatusRequestItemV2*)extension->data,
14100
0
                        output + offset, isRequest);
14101
0
                if (ret > 0) {
14102
0
                    offset += (word16)ret;
14103
0
                    ret = 0;
14104
0
                }
14105
0
                break;
14106
14107
0
            case TLSX_RENEGOTIATION_INFO:
14108
0
                WOLFSSL_MSG("Secure Renegotiation extension to write");
14109
0
                offset += SCR_WRITE((SecureRenegotiation*)extension->data,
14110
0
                        output + offset, isRequest);
14111
0
                break;
14112
14113
0
            case TLSX_SESSION_TICKET:
14114
0
                WOLFSSL_MSG("Session Ticket extension to write");
14115
0
                offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
14116
0
                        output + offset, isRequest);
14117
0
                break;
14118
14119
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
14120
0
                WOLFSSL_MSG("ALPN extension to write");
14121
0
                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
14122
0
                break;
14123
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14124
0
            case TLSX_SIGNATURE_ALGORITHMS:
14125
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
14126
0
                offset += SA_WRITE(extension->data, output + offset);
14127
0
                break;
14128
0
#endif
14129
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
14130
0
            case TLSX_ENCRYPT_THEN_MAC:
14131
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
14132
0
                ret = ETM_WRITE(extension->data, output, msgType, &offset);
14133
0
                break;
14134
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
14135
14136
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
14137
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14138
            case TLSX_PRE_SHARED_KEY:
14139
                WOLFSSL_MSG("Pre-Shared Key extension to write");
14140
                ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
14141
                                                              msgType, &offset);
14142
                break;
14143
14144
        #ifdef WOLFSSL_TLS13
14145
            case TLSX_PSK_KEY_EXCHANGE_MODES:
14146
                WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
14147
                ret = PKM_WRITE((byte)extension->val, output + offset, msgType,
14148
                                                                       &offset);
14149
                break;
14150
        #endif
14151
    #endif
14152
0
            case TLSX_KEY_SHARE:
14153
0
                WOLFSSL_MSG("Key Share extension to write");
14154
0
                offset += KS_WRITE((KeyShareEntry*)extension->data,
14155
0
                                                      output + offset, msgType);
14156
0
                break;
14157
0
#endif
14158
0
#ifdef WOLFSSL_TLS13
14159
0
            case TLSX_SUPPORTED_VERSIONS:
14160
0
                WOLFSSL_MSG("Supported Versions extension to write");
14161
0
                ret = SV_WRITE(extension->data, output + offset, msgType,
14162
0
                                                                       &offset);
14163
0
                break;
14164
14165
    #ifdef WOLFSSL_SEND_HRR_COOKIE
14166
            case TLSX_COOKIE:
14167
                WOLFSSL_MSG("Cookie extension to write");
14168
                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
14169
                                msgType, &offset);
14170
                break;
14171
    #endif
14172
14173
    #ifdef WOLFSSL_EARLY_DATA
14174
            case TLSX_EARLY_DATA:
14175
                WOLFSSL_MSG("Early Data extension to write");
14176
                ret = EDI_WRITE(extension->val, output + offset, msgType,
14177
                                                                       &offset);
14178
                break;
14179
    #endif
14180
14181
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
14182
            case TLSX_POST_HANDSHAKE_AUTH:
14183
                WOLFSSL_MSG("Post-Handshake Authentication extension to write");
14184
                ret = PHA_WRITE(output + offset, msgType, &offset);
14185
                break;
14186
    #endif
14187
14188
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14189
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
14190
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
14191
0
                offset += SAC_WRITE(extension->data, output + offset);
14192
0
                break;
14193
0
    #endif
14194
14195
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14196
            case TLSX_CERTIFICATE_AUTHORITIES:
14197
                WOLFSSL_MSG("Certificate Authorities extension to write");
14198
                offset += CAN_WRITE(extension->data, output + offset);
14199
                break;
14200
    #endif
14201
0
#endif
14202
#ifdef WOLFSSL_SRTP
14203
            case TLSX_USE_SRTP:
14204
                WOLFSSL_MSG("SRTP extension to write");
14205
                offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset);
14206
                break;
14207
#endif
14208
14209
#ifdef HAVE_RPK
14210
            case TLSX_CLIENT_CERTIFICATE_TYPE:
14211
                WOLFSSL_MSG("Client Certificate Type extension to write");
14212
                offset += CCT_WRITE(extension->data, output + offset, msgType);
14213
                break;
14214
14215
            case TLSX_SERVER_CERTIFICATE_TYPE:
14216
                WOLFSSL_MSG("Server Certificate Type extension to write");
14217
                offset += SCT_WRITE(extension->data, output + offset, msgType);
14218
                break;
14219
#endif /* HAVE_RPK */
14220
14221
#ifdef WOLFSSL_QUIC
14222
            case TLSX_KEY_QUIC_TP_PARAMS:
14223
                FALL_THROUGH;
14224
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
14225
                WOLFSSL_MSG("QUIC transport parameter to write");
14226
                offset += QTP_WRITE((QuicTransportParam*)extension->data,
14227
                                    output + offset);
14228
                break;
14229
#endif
14230
#ifdef WOLFSSL_DTLS_CID
14231
            case TLSX_CONNECTION_ID:
14232
                WOLFSSL_MSG("Connection ID extension to write");
14233
                offset += CID_WRITE((byte*)extension->data, output+offset);
14234
                break;
14235
14236
#endif /* WOLFSSL_DTLS_CID */
14237
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
14238
            case TLSX_ECH:
14239
                WOLFSSL_MSG("ECH extension to write");
14240
                ret = ECH_WRITE((WOLFSSL_ECH*)extension->data, msgType,
14241
                    output + offset, &offset);
14242
                break;
14243
#endif
14244
0
            default:
14245
0
                break;
14246
0
        }
14247
14248
        /* writes extension data length. */
14249
0
        c16toa(offset - length_offset, output + length_offset - OPAQUE16_LEN);
14250
14251
        /* marks the extension as processed so ctx level */
14252
        /* extensions don't overlap with ssl level ones. */
14253
0
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
14254
14255
        /* if we encountered an error propagate it */
14256
0
        if (ret != 0)
14257
0
            break;
14258
0
    }
14259
14260
0
    *pOffset += offset;
14261
14262
0
    return ret;
14263
0
}
14264
14265
#ifdef HAVE_SUPPORTED_CURVES
14266
14267
/* Populates the default supported groups / curves */
14268
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
14269
0
{
14270
0
    int ret = WOLFSSL_SUCCESS;
14271
0
#ifdef WOLFSSL_TLS13
14272
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14273
    if (ssl->options.resuming && ssl->session->namedGroup != 0) {
14274
        return TLSX_UseSupportedCurve(extensions, ssl->session->namedGroup,
14275
                                                                     ssl->heap);
14276
    }
14277
#endif
14278
14279
0
    if (ssl->numGroups != 0) {
14280
0
        int i;
14281
0
        for (i = 0; i < ssl->numGroups; i++) {
14282
0
            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap);
14283
0
            if (ret != WOLFSSL_SUCCESS)
14284
0
                return ret;
14285
0
        }
14286
0
        return WOLFSSL_SUCCESS;
14287
0
    }
14288
0
#endif /* WOLFSSL_TLS13 */
14289
14290
0
#if defined(HAVE_ECC)
14291
        /* list in order by strength, since not all servers choose by strength */
14292
0
        #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
14293
0
            #ifndef NO_ECC_SECP
14294
0
                ret = TLSX_UseSupportedCurve(extensions,
14295
0
                                              WOLFSSL_ECC_SECP521R1, ssl->heap);
14296
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14297
0
            #endif
14298
0
        #endif
14299
0
        #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
14300
            #ifdef HAVE_ECC_BRAINPOOL
14301
                ret = TLSX_UseSupportedCurve(extensions,
14302
                                        WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
14303
                if (ret != WOLFSSL_SUCCESS) return ret;
14304
            #endif
14305
0
        #endif
14306
0
        #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
14307
0
            #ifndef NO_ECC_SECP
14308
0
                ret = TLSX_UseSupportedCurve(extensions,
14309
0
                                              WOLFSSL_ECC_SECP384R1, ssl->heap);
14310
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14311
0
            #endif
14312
            #ifdef HAVE_ECC_BRAINPOOL
14313
                ret = TLSX_UseSupportedCurve(extensions,
14314
                                        WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
14315
                if (ret != WOLFSSL_SUCCESS) return ret;
14316
            #endif
14317
0
        #endif
14318
0
#endif /* HAVE_ECC */
14319
14320
0
        #ifndef HAVE_FIPS
14321
            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14322
                ret = TLSX_UseSupportedCurve(extensions,
14323
                                                   WOLFSSL_ECC_X448, ssl->heap);
14324
                if (ret != WOLFSSL_SUCCESS) return ret;
14325
            #endif
14326
0
        #endif /* HAVE_FIPS */
14327
14328
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
14329
0
        #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
14330
0
            #ifndef NO_ECC_SECP
14331
0
                ret = TLSX_UseSupportedCurve(extensions,
14332
0
                                              WOLFSSL_ECC_SECP256R1, ssl->heap);
14333
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14334
0
            #endif
14335
            #ifdef HAVE_ECC_KOBLITZ
14336
                ret = TLSX_UseSupportedCurve(extensions,
14337
                                              WOLFSSL_ECC_SECP256K1, ssl->heap);
14338
                if (ret != WOLFSSL_SUCCESS) return ret;
14339
            #endif
14340
            #ifdef HAVE_ECC_BRAINPOOL
14341
                ret = TLSX_UseSupportedCurve(extensions,
14342
                                        WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
14343
                if (ret != WOLFSSL_SUCCESS) return ret;
14344
            #endif
14345
            #ifdef WOLFSSL_SM2
14346
                ret = TLSX_UseSupportedCurve(extensions,
14347
                                              WOLFSSL_ECC_SM2P256V1, ssl->heap);
14348
                if (ret != WOLFSSL_SUCCESS) return ret;
14349
            #endif
14350
0
        #endif
14351
0
#endif /* HAVE_ECC */
14352
14353
0
        #ifndef HAVE_FIPS
14354
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14355
                ret = TLSX_UseSupportedCurve(extensions,
14356
                                                 WOLFSSL_ECC_X25519, ssl->heap);
14357
                if (ret != WOLFSSL_SUCCESS) return ret;
14358
            #endif
14359
0
        #endif /* HAVE_FIPS */
14360
14361
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
14362
0
        #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
14363
0
            #ifndef NO_ECC_SECP
14364
0
                ret = TLSX_UseSupportedCurve(extensions,
14365
0
                                              WOLFSSL_ECC_SECP224R1, ssl->heap);
14366
0
                if (ret != WOLFSSL_SUCCESS) return ret;
14367
0
            #endif
14368
            #ifdef HAVE_ECC_KOBLITZ
14369
                ret = TLSX_UseSupportedCurve(extensions,
14370
                                              WOLFSSL_ECC_SECP224K1, ssl->heap);
14371
                if (ret != WOLFSSL_SUCCESS) return ret;
14372
            #endif
14373
0
        #endif
14374
14375
0
    #ifndef HAVE_FIPS
14376
        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
14377
            #ifndef NO_ECC_SECP
14378
                ret = TLSX_UseSupportedCurve(extensions,
14379
                                              WOLFSSL_ECC_SECP192R1, ssl->heap);
14380
                if (ret != WOLFSSL_SUCCESS) return ret;
14381
            #endif
14382
            #ifdef HAVE_ECC_KOBLITZ
14383
                ret = TLSX_UseSupportedCurve(extensions,
14384
                                              WOLFSSL_ECC_SECP192K1, ssl->heap);
14385
                if (ret != WOLFSSL_SUCCESS) return ret;
14386
            #endif
14387
        #endif
14388
        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
14389
            #ifndef NO_ECC_SECP
14390
                ret = TLSX_UseSupportedCurve(extensions,
14391
                                              WOLFSSL_ECC_SECP160R1, ssl->heap);
14392
                if (ret != WOLFSSL_SUCCESS) return ret;
14393
            #endif
14394
            #ifdef HAVE_ECC_SECPR2
14395
                ret = TLSX_UseSupportedCurve(extensions,
14396
                                              WOLFSSL_ECC_SECP160R2, ssl->heap);
14397
                if (ret != WOLFSSL_SUCCESS) return ret;
14398
            #endif
14399
            #ifdef HAVE_ECC_KOBLITZ
14400
                ret = TLSX_UseSupportedCurve(extensions,
14401
                                              WOLFSSL_ECC_SECP160K1, ssl->heap);
14402
                if (ret != WOLFSSL_SUCCESS) return ret;
14403
            #endif
14404
        #endif
14405
0
    #endif /* HAVE_FIPS */
14406
0
#endif /* HAVE_ECC */
14407
14408
0
#ifndef NO_DH
14409
            /* Add FFDHE supported groups. */
14410
        #ifdef HAVE_FFDHE_8192
14411
            if (8192/8 >= ssl->options.minDhKeySz &&
14412
                                            8192/8 <= ssl->options.maxDhKeySz) {
14413
                ret = TLSX_UseSupportedCurve(extensions,
14414
                                             WOLFSSL_FFDHE_8192, ssl->heap);
14415
                if (ret != WOLFSSL_SUCCESS)
14416
                    return ret;
14417
            }
14418
        #endif
14419
        #ifdef HAVE_FFDHE_6144
14420
            if (6144/8 >= ssl->options.minDhKeySz &&
14421
                                            6144/8 <= ssl->options.maxDhKeySz) {
14422
                ret = TLSX_UseSupportedCurve(extensions,
14423
                                             WOLFSSL_FFDHE_6144, ssl->heap);
14424
                if (ret != WOLFSSL_SUCCESS)
14425
                    return ret;
14426
            }
14427
        #endif
14428
        #ifdef HAVE_FFDHE_4096
14429
            if (4096/8 >= ssl->options.minDhKeySz &&
14430
                                            4096/8 <= ssl->options.maxDhKeySz) {
14431
                ret = TLSX_UseSupportedCurve(extensions,
14432
                                             WOLFSSL_FFDHE_4096, ssl->heap);
14433
                if (ret != WOLFSSL_SUCCESS)
14434
                    return ret;
14435
            }
14436
        #endif
14437
        #ifdef HAVE_FFDHE_3072
14438
            if (3072/8 >= ssl->options.minDhKeySz &&
14439
                                            3072/8 <= ssl->options.maxDhKeySz) {
14440
                ret = TLSX_UseSupportedCurve(extensions,
14441
                                             WOLFSSL_FFDHE_3072, ssl->heap);
14442
                if (ret != WOLFSSL_SUCCESS)
14443
                    return ret;
14444
            }
14445
        #endif
14446
0
        #ifdef HAVE_FFDHE_2048
14447
0
            if (2048/8 >= ssl->options.minDhKeySz &&
14448
0
                                            2048/8 <= ssl->options.maxDhKeySz) {
14449
0
                ret = TLSX_UseSupportedCurve(extensions,
14450
0
                                             WOLFSSL_FFDHE_2048, ssl->heap);
14451
0
                if (ret != WOLFSSL_SUCCESS)
14452
0
                    return ret;
14453
0
            }
14454
0
        #endif
14455
0
#endif
14456
14457
#ifdef WOLFSSL_HAVE_MLKEM
14458
#ifndef WOLFSSL_NO_ML_KEM
14459
#ifdef WOLFSSL_WC_MLKEM
14460
#ifndef WOLFSSL_NO_ML_KEM_512
14461
    if (ret == WOLFSSL_SUCCESS)
14462
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512,
14463
                                     ssl->heap);
14464
    if (ret == WOLFSSL_SUCCESS)
14465
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_ML_KEM_512,
14466
                                     ssl->heap);
14467
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14468
    if (ret == WOLFSSL_SUCCESS)
14469
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_ML_KEM_512,
14470
                                     ssl->heap);
14471
    #endif
14472
#endif
14473
#ifndef WOLFSSL_NO_ML_KEM_768
14474
    if (ret == WOLFSSL_SUCCESS)
14475
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
14476
                                     ssl->heap);
14477
    if (ret == WOLFSSL_SUCCESS)
14478
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_ML_KEM_768,
14479
                                     ssl->heap);
14480
    if (ret == WOLFSSL_SUCCESS)
14481
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_ML_KEM_768,
14482
                                     ssl->heap);
14483
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14484
    if (ret == WOLFSSL_SUCCESS)
14485
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_ML_KEM_768,
14486
                                     ssl->heap);
14487
    #endif
14488
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14489
    if (ret == WOLFSSL_SUCCESS)
14490
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_ML_KEM_768,
14491
                                     ssl->heap);
14492
    #endif
14493
#endif
14494
#ifndef WOLFSSL_NO_ML_KEM_1024
14495
    if (ret == WOLFSSL_SUCCESS)
14496
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
14497
                                     ssl->heap);
14498
    if (ret == WOLFSSL_SUCCESS)
14499
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_ML_KEM_1024,
14500
                                     ssl->heap);
14501
    if (ret == WOLFSSL_SUCCESS)
14502
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_ML_KEM_1024,
14503
                                     ssl->heap);
14504
#endif
14505
#elif defined(HAVE_LIBOQS)
14506
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512, ssl->heap);
14507
    if (ret == WOLFSSL_SUCCESS)
14508
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
14509
                                     ssl->heap);
14510
    if (ret == WOLFSSL_SUCCESS)
14511
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
14512
                                     ssl->heap);
14513
    if (ret == WOLFSSL_SUCCESS)
14514
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_ML_KEM_512,
14515
                                     ssl->heap);
14516
    if (ret == WOLFSSL_SUCCESS)
14517
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_ML_KEM_768,
14518
                                     ssl->heap);
14519
    if (ret == WOLFSSL_SUCCESS)
14520
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_ML_KEM_768,
14521
                                     ssl->heap);
14522
    if (ret == WOLFSSL_SUCCESS)
14523
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_ML_KEM_1024,
14524
                                     ssl->heap);
14525
    if (ret == WOLFSSL_SUCCESS)
14526
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_ML_KEM_1024,
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_ML_KEM_512,
14531
                                     ssl->heap);
14532
    if (ret == WOLFSSL_SUCCESS)
14533
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_ML_KEM_768,
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_ML_KEM_768,
14539
                                     ssl->heap);
14540
    #endif
14541
#endif /* HAVE_LIBOQS */
14542
#endif /* !WOLFSSL_NO_ML_KEM */
14543
#ifdef WOLFSSL_MLKEM_KYBER
14544
#ifdef WOLFSSL_WC_MLKEM
14545
#ifdef WOLFSSL_KYBER512
14546
    if (ret == WOLFSSL_SUCCESS)
14547
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1,
14548
                                     ssl->heap);
14549
    if (ret == WOLFSSL_SUCCESS)
14550
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
14551
                                     ssl->heap);
14552
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14553
    if (ret == WOLFSSL_SUCCESS)
14554
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
14555
                                     ssl->heap);
14556
    #endif
14557
#endif
14558
#ifdef WOLFSSL_KYBER768
14559
    if (ret == WOLFSSL_SUCCESS)
14560
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
14561
                                     ssl->heap);
14562
    if (ret == WOLFSSL_SUCCESS)
14563
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
14564
                                     ssl->heap);
14565
    if (ret == WOLFSSL_SUCCESS)
14566
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
14567
                                     ssl->heap);
14568
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14569
    if (ret == WOLFSSL_SUCCESS)
14570
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
14571
                                     ssl->heap);
14572
    #endif
14573
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14574
    if (ret == WOLFSSL_SUCCESS)
14575
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
14576
                                     ssl->heap);
14577
    #endif
14578
#endif
14579
#ifdef WOLFSSL_KYBER1024
14580
    if (ret == WOLFSSL_SUCCESS)
14581
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
14582
                                     ssl->heap);
14583
    if (ret == WOLFSSL_SUCCESS)
14584
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
14585
                                     ssl->heap);
14586
#endif
14587
#elif defined(HAVE_LIBOQS)
14588
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap);
14589
    if (ret == WOLFSSL_SUCCESS)
14590
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
14591
                                     ssl->heap);
14592
    if (ret == WOLFSSL_SUCCESS)
14593
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
14594
                                     ssl->heap);
14595
    if (ret == WOLFSSL_SUCCESS)
14596
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
14597
                                     ssl->heap);
14598
    if (ret == WOLFSSL_SUCCESS)
14599
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
14600
                                     ssl->heap);
14601
    if (ret == WOLFSSL_SUCCESS)
14602
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
14603
                                     ssl->heap);
14604
    if (ret == WOLFSSL_SUCCESS)
14605
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
14606
                                     ssl->heap);
14607
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14608
    if (ret == WOLFSSL_SUCCESS)
14609
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
14610
                                     ssl->heap);
14611
    if (ret == WOLFSSL_SUCCESS)
14612
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
14613
                                     ssl->heap);
14614
    #endif
14615
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14616
    if (ret == WOLFSSL_SUCCESS)
14617
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
14618
                                     ssl->heap);
14619
    #endif
14620
#endif /* HAVE_LIBOQS */
14621
#endif /* WOLFSSL_MLKEM_KYBER */
14622
#endif /* WOLFSSL_HAVE_MLKEM */
14623
14624
0
    (void)ssl;
14625
0
    (void)extensions;
14626
14627
0
    return ret;
14628
0
}
14629
14630
#endif /* HAVE_SUPPORTED_CURVES */
14631
14632
int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
14633
0
{
14634
0
    int ret = 0;
14635
0
    byte* public_key      = NULL;
14636
0
    word16 public_key_len = 0;
14637
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
14638
    int usingPSK = 0;
14639
#endif
14640
0
#if defined(HAVE_SUPPORTED_CURVES) && defined(WOLFSSL_TLS13)
14641
0
    TLSX* extension = NULL;
14642
0
    word16 namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
14643
0
#endif
14644
14645
    /* server will add extension depending on what is parsed from client */
14646
0
    if (!isServer) {
14647
#if defined(HAVE_RPK)
14648
        ret = TLSX_ClientCertificateType_Use(ssl, isServer);
14649
        if (ret != 0)
14650
            return ret;
14651
14652
        ret = TLSX_ServerCertificateType_Use(ssl, isServer);
14653
        if (ret != 0)
14654
            return ret;
14655
#endif /* HAVE_RPK */
14656
14657
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) && \
14658
0
    !defined(WOLFSSL_NO_TLS12)
14659
0
        if (!ssl->options.disallowEncThenMac) {
14660
0
            ret = TLSX_EncryptThenMac_Use(ssl);
14661
0
            if (ret != 0)
14662
0
                return ret;
14663
0
        }
14664
0
#endif
14665
14666
0
#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
14667
0
                       defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
14668
0
        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
14669
0
            if (TLSX_Find(ssl->ctx->extensions,
14670
0
                                               TLSX_SUPPORTED_GROUPS) == NULL) {
14671
0
                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
14672
0
                if (ret != WOLFSSL_SUCCESS)
14673
0
                    return ret;
14674
0
            }
14675
0
        }
14676
0
        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
14677
0
               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
14678
0
               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
14679
0
             ret = TLSX_UsePointFormat(&ssl->extensions,
14680
0
                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
14681
0
             if (ret != WOLFSSL_SUCCESS)
14682
0
                 return ret;
14683
0
        }
14684
0
#endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
14685
14686
#ifdef WOLFSSL_SRTP
14687
        if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
14688
            WOLFSSL_MSG("Adding DTLS SRTP extension");
14689
            if ((ret = TLSX_UseSRTP(&ssl->extensions, ssl->dtlsSrtpProfiles,
14690
                                                                ssl->heap)) != 0) {
14691
                return ret;
14692
            }
14693
        }
14694
#endif
14695
#ifdef WOLFSSL_DUAL_ALG_CERTS
14696
        if ((IsAtLeastTLSv1_3(ssl->version)) && (ssl->sigSpec != NULL)) {
14697
            WOLFSSL_MSG("Adding CKS extension");
14698
            if ((ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap)) != 0) {
14699
                return ret;
14700
            }
14701
        }
14702
#endif
14703
0
    } /* is not server */
14704
14705
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14706
0
    WOLFSSL_MSG("Adding signature algorithms extension");
14707
0
    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
14708
0
                                                                         != 0) {
14709
0
            return ret;
14710
0
    }
14711
#else
14712
    ret = 0;
14713
#endif
14714
0
#ifdef WOLFSSL_TLS13
14715
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14716
        if (isServer && IsAtLeastTLSv1_3(ssl->version)) {
14717
            if (SSL_CA_NAMES(ssl) != NULL) {
14718
                WOLFSSL_MSG("Adding certificate authorities extension");
14719
                if ((ret = TLSX_Push(&ssl->extensions,
14720
                        TLSX_CERTIFICATE_AUTHORITIES, ssl, ssl->heap)) != 0) {
14721
                        return ret;
14722
                }
14723
            }
14724
        }
14725
    #endif
14726
0
        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
14727
            /* Add mandatory TLS v1.3 extension: supported version */
14728
0
            WOLFSSL_MSG("Adding supported versions extension");
14729
0
            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
14730
0
                                                             ssl->heap)) != 0) {
14731
0
                return ret;
14732
0
            }
14733
14734
    #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && \
14735
                       !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)
14736
        if (TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
14737
            /* Put in DH groups for TLS 1.3 only. */
14738
            ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
14739
            if (ret != WOLFSSL_SUCCESS)
14740
                return ret;
14741
        /* ret value will be overwritten in !NO_PSK case */
14742
        #ifdef NO_PSK
14743
            ret = 0;
14744
        #endif
14745
        }
14746
    #endif /* !(HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
14747
14748
0
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14749
0
            if (ssl->certHashSigAlgoSz > 0) {
14750
0
                WOLFSSL_MSG("Adding signature algorithms cert extension");
14751
0
                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
14752
0
                                                        ssl, ssl->heap)) != 0) {
14753
0
                    return ret;
14754
0
                }
14755
0
            }
14756
0
        #endif
14757
14758
0
        #if defined(HAVE_SUPPORTED_CURVES)
14759
0
            extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
14760
0
            if (extension == NULL) {
14761
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14762
                if (ssl->options.resuming && ssl->session->namedGroup != 0)
14763
                    namedGroup = ssl->session->namedGroup;
14764
                else
14765
            #endif
14766
0
                if (ssl->numGroups > 0) {
14767
0
                    int set = 0;
14768
0
                    int i, j;
14769
14770
                    /* try to find the highest element in ssl->group[]
14771
                     * that is contained in preferredGroup[].
14772
                     */
14773
0
                    namedGroup = preferredGroup[0];
14774
0
                    for (i = 0; i < ssl->numGroups && !set; i++) {
14775
0
                        for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
14776
0
                            if (preferredGroup[j] == ssl->group[i]
14777
#ifdef HAVE_LIBOQS
14778
                                && TLSX_IsGroupSupported(preferredGroup[j])
14779
#endif
14780
0
                                                                ) {
14781
0
                                namedGroup = ssl->group[i];
14782
0
                                set = 1;
14783
0
                                break;
14784
0
                            }
14785
0
                        }
14786
0
                    }
14787
0
                    if (!set)
14788
0
                        namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
14789
0
                }
14790
0
                else {
14791
                    /* Choose the most preferred group. */
14792
0
                    namedGroup = preferredGroup[0];
14793
#ifdef HAVE_LIBOQS
14794
                    if (!TLSX_IsGroupSupported(namedGroup)) {
14795
                        int i = 1;
14796
                        for (;preferredGroup[i] != WOLFSSL_NAMED_GROUP_INVALID;
14797
                              i++) {
14798
                            if (TLSX_IsGroupSupported(preferredGroup[i]))
14799
                                break;
14800
                        }
14801
                        namedGroup = preferredGroup[i];
14802
                    }
14803
#endif
14804
0
                }
14805
0
            }
14806
0
            else {
14807
0
                KeyShareEntry* kse = (KeyShareEntry*)extension->data;
14808
0
                if (kse)
14809
0
                    namedGroup = kse->group;
14810
0
            }
14811
0
            if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
14812
0
                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
14813
0
                        &ssl->extensions);
14814
0
                if (ret != 0)
14815
0
                    return ret;
14816
0
            }
14817
0
        #endif /* HAVE_SUPPORTED_CURVES */
14818
14819
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14820
            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
14821
        #endif
14822
        #if defined(HAVE_SESSION_TICKET)
14823
            if (ssl->options.resuming && ssl->session->ticketLen > 0) {
14824
                WOLFSSL_SESSION* sess = ssl->session;
14825
            #ifdef WOLFSSL_32BIT_MILLI_TIME
14826
                word32 now, milli;
14827
            #else
14828
                word64 now, milli;
14829
            #endif
14830
14831
                /* Determine the MAC algorithm for the cipher suite used. */
14832
                ssl->options.cipherSuite0 = sess->cipherSuite0;
14833
                ssl->options.cipherSuite  = sess->cipherSuite;
14834
                ret = SetCipherSpecs(ssl);
14835
                if (ret != 0)
14836
                    return ret;
14837
                now = (word64)TimeNowInMilliseconds();
14838
                if (now == 0)
14839
                    return GETTIME_ERROR;
14840
            #ifdef WOLFSSL_32BIT_MILLI_TIME
14841
                if (now < sess->ticketSeen)
14842
                    milli = (0xFFFFFFFFU - sess->ticketSeen) + 1 + now;
14843
                else
14844
                    milli = now - sess->ticketSeen;
14845
                milli += sess->ticketAdd;
14846
14847
                /* Pre-shared key is mandatory extension for resumption. */
14848
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
14849
                    sess->ticketLen, milli, ssl->specs.mac_algorithm,
14850
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
14851
                    NULL, ssl->heap);
14852
            #else
14853
                milli = now - sess->ticketSeen + sess->ticketAdd;
14854
14855
                /* Pre-shared key is mandatory extension for resumption. */
14856
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
14857
                    sess->ticketLen, (word32)milli, ssl->specs.mac_algorithm,
14858
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
14859
                    NULL, ssl->heap);
14860
            #endif
14861
                if (ret != 0)
14862
                    return ret;
14863
14864
                usingPSK = 1;
14865
            }
14866
        #endif
14867
    #ifndef NO_PSK
14868
        #ifndef WOLFSSL_PSK_ONE_ID
14869
            if (ssl->options.client_psk_cs_cb != NULL) {
14870
                int i;
14871
                const Suites* suites = WOLFSSL_SUITES(ssl);
14872
                for (i = 0; i < suites->suiteSz; i += 2) {
14873
                    byte cipherSuite0 = suites->suites[i + 0];
14874
                    byte cipherSuite = suites->suites[i + 1];
14875
                    unsigned int keySz;
14876
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14877
                    int cnt = 0;
14878
                #endif
14879
14880
                #ifdef HAVE_NULL_CIPHER
14881
                    if (cipherSuite0 == ECC_BYTE ||
14882
                        cipherSuite0 == ECDHE_PSK_BYTE) {
14883
                        if (cipherSuite != TLS_SHA256_SHA256 &&
14884
                                             cipherSuite != TLS_SHA384_SHA384) {
14885
                            continue;
14886
                        }
14887
                    }
14888
                    else
14889
                #endif
14890
                #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
14891
                    defined(WOLFSSL_SM3)
14892
                    if (cipherSuite0 == CIPHER_BYTE) {
14893
                        if ((cipherSuite != TLS_SM4_GCM_SM3) &&
14894
                            (cipherSuite != TLS_SM4_CCM_SM3)) {
14895
                            continue;
14896
                        }
14897
                    }
14898
                    else
14899
                #endif
14900
                    if (cipherSuite0 != TLS13_BYTE)
14901
                        continue;
14902
14903
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14904
                    do {
14905
                        ssl->arrays->client_identity[0] = cnt;
14906
                #endif
14907
14908
                        ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
14909
                        keySz = ssl->options.client_psk_cs_cb(
14910
                            ssl, ssl->arrays->server_hint,
14911
                            ssl->arrays->client_identity, MAX_PSK_ID_LEN,
14912
                            ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
14913
                            GetCipherNameInternal(cipherSuite0, cipherSuite));
14914
                        if (keySz > 0) {
14915
                            ssl->arrays->psk_keySz = keySz;
14916
                            ret = TLSX_PreSharedKey_Use(&ssl->extensions,
14917
                                (byte*)ssl->arrays->client_identity,
14918
                                (word16)XSTRLEN(ssl->arrays->client_identity),
14919
                                0, SuiteMac(WOLFSSL_SUITES(ssl)->suites + i),
14920
                                cipherSuite0, cipherSuite, 0, NULL, ssl->heap);
14921
                            if (ret != 0)
14922
                                return ret;
14923
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14924
                            cnt++;
14925
                #endif
14926
                        }
14927
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14928
                    }
14929
                    while (keySz > 0);
14930
                #endif
14931
                }
14932
14933
                usingPSK = 1;
14934
            }
14935
            else
14936
        #endif
14937
            if (ssl->options.client_psk_cb != NULL ||
14938
                ssl->options.client_psk_tls13_cb != NULL) {
14939
                /* Default cipher suite. */
14940
                byte cipherSuite0 = TLS13_BYTE;
14941
                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
14942
                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
14943
                const char* cipherName = NULL;
14944
14945
                if (ssl->options.client_psk_tls13_cb != NULL) {
14946
                    ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
14947
                        ssl, ssl->arrays->server_hint,
14948
                        ssl->arrays->client_identity, MAX_PSK_ID_LEN,
14949
                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
14950
                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
14951
                            &cipherSuite, NULL, NULL, &cipherSuiteFlags) != 0) {
14952
                        return PSK_KEY_ERROR;
14953
                    }
14954
                }
14955
                else {
14956
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
14957
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
14958
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
14959
                }
14960
                if (
14961
                #ifdef OPENSSL_EXTRA
14962
                    /* OpenSSL treats a PSK key length of 0
14963
                     * to indicate no PSK available.
14964
                     */
14965
                    ssl->arrays->psk_keySz == 0 ||
14966
                #endif
14967
                         (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
14968
                     (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
14969
                #ifndef OPENSSL_EXTRA
14970
                    ret = PSK_KEY_ERROR;
14971
                #endif
14972
                }
14973
                else {
14974
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
14975
14976
                    ssl->options.cipherSuite0 = cipherSuite0;
14977
                    ssl->options.cipherSuite  = cipherSuite;
14978
                    (void)cipherSuiteFlags;
14979
                    ret = SetCipherSpecs(ssl);
14980
                    if (ret == 0) {
14981
                        ret = TLSX_PreSharedKey_Use(
14982
                            &ssl->extensions,
14983
                                     (byte*)ssl->arrays->client_identity,
14984
                            (word16)XSTRLEN(ssl->arrays->client_identity),
14985
                            0, ssl->specs.mac_algorithm,
14986
                            cipherSuite0, cipherSuite, 0,
14987
                            NULL, ssl->heap);
14988
                    }
14989
                    if (ret == 0)
14990
                        usingPSK = 1;
14991
                }
14992
                if (ret != 0)
14993
                    return ret;
14994
            }
14995
    #endif /* !NO_PSK */
14996
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14997
14998
            /* Some servers do not generate session tickets unless
14999
             * the extension is seen in a non-resume client hello.
15000
             * We used to send it only if we were otherwise using PSK.
15001
             * Now always send it. Define NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
15002
             * to revert to the old behaviour. */
15003
            #ifdef NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
15004
            if (usingPSK)
15005
            #endif
15006
            {
15007
                byte modes = 0;
15008
15009
                (void)usingPSK;
15010
                /* Pre-shared key modes: mandatory extension for resumption. */
15011
            #ifdef HAVE_SUPPORTED_CURVES
15012
                if (!ssl->options.onlyPskDheKe)
15013
            #endif
15014
                {
15015
                    modes = 1 << PSK_KE;
15016
                }
15017
            #if !defined(NO_DH) || defined(HAVE_ECC) || \
15018
                              defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
15019
                if (!ssl->options.noPskDheKe) {
15020
                    modes |= 1 << PSK_DHE_KE;
15021
                }
15022
            #endif
15023
                ret = TLSX_PskKeyModes_Use(ssl, modes);
15024
                if (ret != 0)
15025
                    return ret;
15026
            }
15027
        #endif
15028
        #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
15029
            if (!isServer && ssl->options.postHandshakeAuth) {
15030
                ret = TLSX_PostHandAuth_Use(ssl);
15031
                if (ret != 0)
15032
                    return ret;
15033
            }
15034
        #endif
15035
#if defined(HAVE_ECH)
15036
            /* GREASE ECH */
15037
            if (!ssl->options.disableECH) {
15038
                if (ssl->echConfigs == NULL) {
15039
                    ret = GREASE_ECH_USE(&(ssl->extensions), ssl->heap,
15040
                            ssl->rng);
15041
                }
15042
                else if (ssl->echConfigs != NULL) {
15043
                    ret = ECH_USE(ssl->echConfigs, &(ssl->extensions),
15044
                            ssl->heap, ssl->rng);
15045
                }
15046
            }
15047
#endif
15048
0
        }
15049
#if defined(HAVE_ECH)
15050
        else if (IsAtLeastTLSv1_3(ssl->version)) {
15051
            if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
15052
                ret = SERVER_ECH_USE(&(ssl->extensions), ssl->heap,
15053
                    ssl->ctx->echConfigs);
15054
15055
                if (ret == 0)
15056
                    TLSX_SetResponse(ssl, TLSX_ECH);
15057
            }
15058
        }
15059
#endif
15060
15061
0
#endif
15062
15063
0
    (void)isServer;
15064
0
    (void)public_key;
15065
0
    (void)public_key_len;
15066
0
    (void)ssl;
15067
15068
0
    return ret;
15069
0
}
15070
15071
15072
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
15073
15074
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15075
/* because the size of ech depends on the size of other extensions we need to
15076
 * get the size with ech special and process ech last, return status */
15077
static int TLSX_GetSizeWithEch(WOLFSSL* ssl, byte* semaphore, byte msgType,
15078
    word16* pLength)
15079
{
15080
    int ret = 0;
15081
    TLSX* echX = NULL;
15082
    TLSX* serverNameX = NULL;
15083
    TLSX** extensions = NULL;
15084
#ifdef WOLFSSL_SMALL_STACK
15085
    char* tmpServerName = NULL;
15086
#else
15087
    char tmpServerName[MAX_PUBLIC_NAME_SZ];
15088
#endif
15089
15090
    /* calculate the rest of the extensions length with inner ech */
15091
    if (ssl->extensions)
15092
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
15093
15094
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions)
15095
        echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
15096
15097
    /* if type is outer change sni to public name */
15098
    if (echX != NULL && ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER &&
15099
        (ssl->options.echAccepted ||
15100
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
15101
        if (ssl->extensions) {
15102
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
15103
15104
            if (serverNameX != NULL)
15105
                extensions = &ssl->extensions;
15106
        }
15107
15108
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
15109
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
15110
            extensions = &ssl->ctx->extensions;
15111
        }
15112
15113
        /* store the inner server name */
15114
        if (serverNameX != NULL) {
15115
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
15116
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
15117
15118
        #ifdef WOLFSSL_SMALL_STACK
15119
            tmpServerName = (char*)XMALLOC(hostNameSz, ssl->heap,
15120
                DYNAMIC_TYPE_TMP_BUFFER);
15121
            if (tmpServerName == NULL)
15122
                return MEMORY_E;
15123
        #else
15124
            /* truncate if too long */
15125
            if (hostNameSz > MAX_PUBLIC_NAME_SZ)
15126
                hostNameSz = MAX_PUBLIC_NAME_SZ;
15127
        #endif
15128
15129
            XMEMCPY(tmpServerName, hostName, hostNameSz);
15130
        }
15131
15132
        /* remove the inner server name */
15133
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15134
15135
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
15136
            ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
15137
            XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
15138
            ssl->heap);
15139
15140
        /* set the public name as the server name */
15141
        if (ret == WOLFSSL_SUCCESS)
15142
            ret = 0;
15143
    }
15144
15145
    if (ret == 0 && ssl->extensions)
15146
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, pLength);
15147
15148
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions)
15149
        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, pLength);
15150
15151
    if (serverNameX != NULL) {
15152
        /* remove the public name SNI */
15153
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15154
15155
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
15156
            tmpServerName, XSTRLEN(tmpServerName), ssl->heap);
15157
15158
        /* restore the inner server name */
15159
        if (ret == WOLFSSL_SUCCESS)
15160
            ret = 0;
15161
    }
15162
15163
#ifdef WOLFSSL_SMALL_STACK
15164
    XFREE(tmpServerName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15165
#endif
15166
15167
    return ret;
15168
}
15169
#endif
15170
15171
/** Tells the buffered size of extensions to be sent into the client hello. */
15172
int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word32* pLength)
15173
0
{
15174
0
    int ret = 0;
15175
0
    word16 length = 0;
15176
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
15177
15178
0
    if (!TLSX_SupportExtensions(ssl))
15179
0
        return 0;
15180
0
    if (msgType == client_hello) {
15181
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
15182
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
15183
0
        WOLF_STK_VALIDATE_REQUEST(ssl);
15184
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15185
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
15186
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15187
0
#endif
15188
0
#if defined(WOLFSSL_TLS13)
15189
0
        if (!IsAtLeastTLSv1_2(ssl)) {
15190
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15191
0
        }
15192
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15193
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
15194
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15195
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15196
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15197
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
15198
        #endif
15199
        #ifdef WOLFSSL_EARLY_DATA
15200
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15201
        #endif
15202
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15203
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15204
        #endif
15205
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15206
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
15207
        #endif
15208
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15209
            TURN_ON(semaphore,
15210
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15211
        #endif
15212
0
        }
15213
0
    #endif
15214
0
#endif /* WOLFSSL_TLS13 */
15215
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
15216
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
15217
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
15218
            /* mark already sent, so it won't send it */
15219
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15220
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15221
        }
15222
    #endif
15223
0
    }
15224
15225
0
#ifdef WOLFSSL_TLS13
15226
0
    #ifndef NO_CERTS
15227
0
    else if (msgType == certificate_request) {
15228
        /* Don't send out any extension except those that are turned off. */
15229
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15230
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15231
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15232
0
#endif
15233
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15234
        if (SSL_CA_NAMES(ssl) != NULL)
15235
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15236
#endif
15237
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, OID_FILTERS
15238
         *       TLSX_STATUS_REQUEST
15239
         */
15240
0
    }
15241
0
    #endif
15242
#if defined(HAVE_ECH)
15243
    if (ssl->options.useEch == 1 && !ssl->options.disableECH
15244
            && msgType == client_hello) {
15245
        ret = TLSX_GetSizeWithEch(ssl, semaphore, msgType, &length);
15246
        if (ret != 0)
15247
            return ret;
15248
    }
15249
    else
15250
#endif /* HAVE_ECH */
15251
0
#endif /* WOLFSSL_TLS13 */
15252
0
    {
15253
0
        if (ssl->extensions) {
15254
0
            ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
15255
0
            if (ret != 0)
15256
0
                return ret;
15257
0
        }
15258
0
        if (ssl->ctx && ssl->ctx->extensions) {
15259
0
            ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType,
15260
0
                &length);
15261
0
            if (ret != 0)
15262
0
                return ret;
15263
0
        }
15264
0
    }
15265
15266
0
#ifdef HAVE_EXTENDED_MASTER
15267
0
    if (msgType == client_hello && ssl->options.haveEMS &&
15268
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
15269
0
        length += HELLO_EXT_SZ;
15270
0
    }
15271
0
#endif
15272
15273
0
    if (length)
15274
0
        length += OPAQUE16_LEN; /* for total length storage. */
15275
15276
0
    *pLength += length;
15277
15278
0
    return ret;
15279
0
}
15280
15281
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15282
/* return status after writing the extensions with ech written last */
15283
static int TLSX_WriteWithEch(WOLFSSL* ssl, byte* output, byte* semaphore,
15284
    byte msgType, word16* pOffset)
15285
{
15286
    int ret = 0;
15287
    TLSX* echX = NULL;
15288
    TLSX* serverNameX = NULL;
15289
    TLSX** extensions = NULL;
15290
#ifdef WOLFSSL_SMALL_STACK
15291
    char* tmpServerName = NULL;
15292
#else
15293
    char tmpServerName[MAX_PUBLIC_NAME_SZ];
15294
#endif
15295
15296
    /* get the echX from either extensions or ctx */
15297
    if (ssl->extensions)
15298
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
15299
15300
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions) {
15301
        /* if not NULL the semaphore will stop it from being counted */
15302
        if (echX == NULL)
15303
            echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
15304
    }
15305
15306
    /* if type is outer change sni to public name */
15307
    if (echX != NULL && ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER &&
15308
        (ssl->options.echAccepted ||
15309
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
15310
        if (ssl->extensions) {
15311
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
15312
15313
            if (serverNameX != NULL)
15314
                extensions = &ssl->extensions;
15315
        }
15316
15317
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
15318
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
15319
            extensions = &ssl->ctx->extensions;
15320
        }
15321
15322
        /* store the inner server name */
15323
        if (serverNameX != NULL) {
15324
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
15325
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
15326
15327
        #ifdef WOLFSSL_SMALL_STACK
15328
            tmpServerName = (char*)XMALLOC(hostNameSz, ssl->heap,
15329
                DYNAMIC_TYPE_TMP_BUFFER);
15330
            if (tmpServerName == NULL)
15331
                return MEMORY_E;
15332
        #else
15333
            /* truncate if too long */
15334
            if (hostNameSz > MAX_PUBLIC_NAME_SZ)
15335
                hostNameSz = MAX_PUBLIC_NAME_SZ;
15336
        #endif
15337
15338
            XMEMCPY(tmpServerName, hostName, hostNameSz);
15339
        }
15340
15341
        /* remove the inner server name */
15342
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15343
15344
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
15345
            ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
15346
            XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
15347
            ssl->heap);
15348
15349
        /* set the public name as the server name */
15350
        if (ret == WOLFSSL_SUCCESS)
15351
            ret = 0;
15352
    }
15353
15354
    if (echX != NULL) {
15355
        /* turn ech on so it doesn't write, then write it last */
15356
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
15357
    }
15358
15359
    if (ret == 0 && ssl->extensions) {
15360
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
15361
            msgType, pOffset);
15362
    }
15363
15364
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
15365
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
15366
            msgType, pOffset);
15367
    }
15368
15369
    /* only write if have a shot at acceptance */
15370
    if (echX != NULL &&
15371
        (ssl->options.echAccepted ||
15372
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
15373
        if (echX != NULL) {
15374
            /* turn off and write it last */
15375
            TURN_OFF(semaphore, TLSX_ToSemaphore(echX->type));
15376
        }
15377
15378
        if (ret == 0 && ssl->extensions) {
15379
            ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
15380
                msgType, pOffset);
15381
        }
15382
15383
        if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
15384
            ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
15385
                msgType, pOffset);
15386
        }
15387
15388
        if (serverNameX != NULL) {
15389
            /* remove the public name SNI */
15390
            TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15391
15392
            ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME, tmpServerName,
15393
                XSTRLEN(tmpServerName), ssl->heap);
15394
15395
            /* restore the inner server name */
15396
            if (ret == WOLFSSL_SUCCESS)
15397
                ret = 0;
15398
        }
15399
    }
15400
15401
#ifdef WOLFSSL_SMALL_STACK
15402
    XFREE(tmpServerName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15403
#endif
15404
15405
    return ret;
15406
}
15407
#endif
15408
15409
/** Writes the extensions to be sent into the client hello. */
15410
int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word32* pOffset)
15411
0
{
15412
0
    int ret = 0;
15413
0
    word16 offset = 0;
15414
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
15415
15416
0
    if (!TLSX_SupportExtensions(ssl) || output == NULL)
15417
0
        return 0;
15418
15419
0
    offset += OPAQUE16_LEN; /* extensions length */
15420
15421
0
    if (msgType == client_hello) {
15422
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
15423
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
15424
0
        WOLF_STK_VALIDATE_REQUEST(ssl);
15425
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15426
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
15427
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15428
0
#endif
15429
0
#ifdef WOLFSSL_TLS13
15430
0
        if (!IsAtLeastTLSv1_2(ssl)) {
15431
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15432
0
        }
15433
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15434
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
15435
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15436
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15437
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
15438
        #endif
15439
        #ifdef WOLFSSL_EARLY_DATA
15440
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15441
        #endif
15442
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15443
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15444
        #endif
15445
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15446
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
15447
        #endif
15448
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15449
            TURN_ON(semaphore,
15450
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15451
        #endif
15452
        #ifdef WOLFSSL_DUAL_ALG_CERTS
15453
            TURN_ON(semaphore,
15454
                    TLSX_ToSemaphore(TLSX_CKS));
15455
        #endif
15456
0
        }
15457
0
    #endif
15458
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15459
        /* Must write Pre-shared Key extension at the end in TLS v1.3.
15460
         * Must not write out Pre-shared Key extension in earlier versions of
15461
         * protocol.
15462
         */
15463
        TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15464
    #endif
15465
0
#endif /* WOLFSSL_TLS13 */
15466
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
15467
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
15468
         /* mark already sent, so it won't send it */
15469
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
15470
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15471
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15472
        }
15473
    #endif
15474
0
    }
15475
0
#ifdef WOLFSSL_TLS13
15476
0
    #ifndef NO_CERTS
15477
0
    else if (msgType == certificate_request) {
15478
        /* Don't send out any extension except those that are turned off. */
15479
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15480
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15481
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15482
0
#endif
15483
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15484
        if (SSL_CA_NAMES(ssl) != NULL) {
15485
            TURN_OFF(semaphore,
15486
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15487
        }
15488
#endif
15489
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, TLSX_OID_FILTERS
15490
         *       TLSX_STATUS_REQUEST
15491
         */
15492
0
    }
15493
0
    #endif
15494
0
#endif
15495
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15496
    if (ssl->options.useEch == 1 && !ssl->options.disableECH
15497
            && msgType == client_hello) {
15498
        ret = TLSX_WriteWithEch(ssl, output, semaphore,
15499
                         msgType, &offset);
15500
        if (ret != 0)
15501
            return ret;
15502
    }
15503
    else
15504
#endif
15505
0
    {
15506
0
        if (ssl->extensions) {
15507
0
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15508
0
                             msgType, &offset);
15509
0
            if (ret != 0)
15510
0
                return ret;
15511
0
        }
15512
0
        if (ssl->ctx && ssl->ctx->extensions) {
15513
0
            ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
15514
0
                             msgType, &offset);
15515
0
            if (ret != 0)
15516
0
                return ret;
15517
0
        }
15518
0
    }
15519
15520
0
#ifdef HAVE_EXTENDED_MASTER
15521
0
    if (msgType == client_hello && ssl->options.haveEMS &&
15522
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
15523
0
        WOLFSSL_MSG("EMS extension to write");
15524
0
        c16toa(HELLO_EXT_EXTMS, output + offset);
15525
0
        offset += HELLO_EXT_TYPE_SZ;
15526
0
        c16toa(0, output + offset);
15527
0
        offset += HELLO_EXT_SZ_SZ;
15528
0
    }
15529
0
#endif
15530
15531
0
#ifdef WOLFSSL_TLS13
15532
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15533
    if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
15534
        /* Write out what we can of Pre-shared key extension.  */
15535
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15536
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15537
                         client_hello, &offset);
15538
        if (ret != 0)
15539
            return ret;
15540
    }
15541
    #endif
15542
0
#endif
15543
15544
0
    if (offset > OPAQUE16_LEN || msgType != client_hello)
15545
0
        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
15546
15547
0
     *pOffset += offset;
15548
15549
0
    return ret;
15550
0
}
15551
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
15552
15553
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
15554
15555
/** Tells the buffered size of extensions to be sent into the server hello. */
15556
int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
15557
0
{
15558
0
    int ret = 0;
15559
0
    word16 length = 0;
15560
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
15561
15562
0
    switch (msgType) {
15563
0
#ifndef NO_WOLFSSL_SERVER
15564
0
        case server_hello:
15565
0
            PF_VALIDATE_RESPONSE(ssl, semaphore);
15566
0
        #ifdef WOLFSSL_TLS13
15567
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
15568
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15569
0
                    TURN_OFF(semaphore,
15570
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15571
0
                #if defined(HAVE_SUPPORTED_CURVES)
15572
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15573
                    if (!ssl->options.noPskDheKe)
15574
                #endif
15575
0
                    {
15576
                        /* Expect KeyShare extension in ServerHello. */
15577
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15578
0
                    }
15579
0
                #endif
15580
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15581
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15582
                #endif
15583
0
                }
15584
0
            #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15585
0
                else {
15586
0
                #ifdef HAVE_SUPPORTED_CURVES
15587
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15588
0
                #endif
15589
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15590
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15591
                #endif
15592
0
                }
15593
0
            #endif
15594
            #ifdef WOLFSSL_DTLS_CID
15595
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15596
            #endif
15597
0
        #endif /* WOLFSSL_TLS13 */
15598
0
            break;
15599
15600
0
    #ifdef WOLFSSL_TLS13
15601
0
        case hello_retry_request:
15602
0
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15603
0
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15604
0
        #ifdef HAVE_SUPPORTED_CURVES
15605
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15606
            if (!ssl->options.noPskDheKe)
15607
        #endif
15608
0
            {
15609
                /* Expect KeyShare extension in HelloRetryRequest. */
15610
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15611
0
            }
15612
0
        #endif
15613
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15614
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15615
        #endif
15616
#ifdef HAVE_ECH
15617
            /* send the special confirmation */
15618
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
15619
#endif
15620
0
            break;
15621
0
    #endif
15622
15623
0
    #ifdef WOLFSSL_TLS13
15624
0
        case encrypted_extensions:
15625
            /* Send out all extension except those that are turned on. */
15626
0
        #ifdef HAVE_ECC
15627
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
15628
0
        #endif
15629
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15630
        #ifdef HAVE_SESSION_TICKET
15631
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
15632
        #endif
15633
0
        #ifdef HAVE_SUPPORTED_CURVES
15634
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15635
0
        #endif
15636
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15637
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15638
        #endif
15639
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
15640
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15641
        #endif
15642
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
15643
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15644
        #endif
15645
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
15646
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
15647
0
        #endif
15648
        #ifdef WOLFSSL_DTLS_CID
15649
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15650
        #endif /* WOLFSSL_DTLS_CID */
15651
0
            break;
15652
15653
        #ifdef WOLFSSL_EARLY_DATA
15654
        case session_ticket:
15655
            if (ssl->options.tls1_3) {
15656
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15657
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15658
            }
15659
            break;
15660
        #endif
15661
0
    #endif
15662
0
#endif
15663
15664
0
#ifdef WOLFSSL_TLS13
15665
0
    #ifndef NO_CERTS
15666
0
        case certificate:
15667
            /* Don't send out any extension except those that are turned off. */
15668
0
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15669
0
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15670
            /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
15671
             *       TLSX_SERVER_CERTIFICATE_TYPE
15672
             */
15673
0
            break;
15674
0
    #endif
15675
0
#endif
15676
0
    }
15677
15678
0
#ifdef HAVE_EXTENDED_MASTER
15679
0
    if (ssl->options.haveEMS && msgType == server_hello &&
15680
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
15681
0
        length += HELLO_EXT_SZ;
15682
0
    }
15683
0
#endif
15684
15685
0
    if (TLSX_SupportExtensions(ssl)) {
15686
0
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
15687
0
        if (ret != 0)
15688
0
            return ret;
15689
0
    }
15690
15691
    /* All the response data is set at the ssl object only, so no ctx here. */
15692
15693
0
    if (length || msgType != server_hello)
15694
0
        length += OPAQUE16_LEN; /* for total length storage. */
15695
15696
0
    *pLength += length;
15697
15698
0
    return ret;
15699
0
}
15700
15701
/** Writes the server hello extensions into a buffer. */
15702
int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
15703
0
{
15704
0
    int ret = 0;
15705
0
    word16 offset = 0;
15706
15707
0
    if (TLSX_SupportExtensions(ssl) && output) {
15708
0
        byte semaphore[SEMAPHORE_SIZE] = {0};
15709
15710
0
        switch (msgType) {
15711
0
#ifndef NO_WOLFSSL_SERVER
15712
0
            case server_hello:
15713
0
                PF_VALIDATE_RESPONSE(ssl, semaphore);
15714
0
        #ifdef WOLFSSL_TLS13
15715
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
15716
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15717
0
                    TURN_OFF(semaphore,
15718
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15719
0
            #ifdef HAVE_SUPPORTED_CURVES
15720
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15721
                    if (!ssl->options.noPskDheKe)
15722
                #endif
15723
0
                    {
15724
                        /* Write out KeyShare in ServerHello. */
15725
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15726
0
                    }
15727
0
            #endif
15728
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15729
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15730
            #endif
15731
0
                }
15732
0
                else
15733
0
        #endif /* WOLFSSL_TLS13 */
15734
0
                {
15735
0
        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15736
0
            #ifdef HAVE_SUPPORTED_CURVES
15737
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15738
0
            #endif
15739
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15740
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15741
            #endif
15742
0
        #endif
15743
0
                    WC_DO_NOTHING; /* avoid empty brackets */
15744
0
                }
15745
        #ifdef WOLFSSL_DTLS_CID
15746
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15747
        #endif /* WOLFSSL_DTLS_CID */
15748
0
                break;
15749
15750
0
    #ifdef WOLFSSL_TLS13
15751
0
            case hello_retry_request:
15752
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15753
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15754
0
        #ifdef HAVE_SUPPORTED_CURVES
15755
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15756
                if (!ssl->options.noPskDheKe)
15757
            #endif
15758
0
                {
15759
                    /* Write out KeyShare in HelloRetryRequest. */
15760
0
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15761
0
                }
15762
0
        #endif
15763
#ifdef HAVE_ECH
15764
                /* send the special confirmation */
15765
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
15766
#endif
15767
                /* Cookie is written below as last extension. */
15768
0
                break;
15769
0
    #endif
15770
15771
0
    #ifdef WOLFSSL_TLS13
15772
0
            case encrypted_extensions:
15773
                /* Send out all extension except those that are turned on. */
15774
0
        #ifdef HAVE_ECC
15775
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
15776
0
        #endif
15777
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15778
        #ifdef HAVE_SESSION_TICKET
15779
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
15780
        #endif
15781
0
        #ifdef HAVE_SUPPORTED_CURVES
15782
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15783
0
        #endif
15784
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15785
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15786
        #endif
15787
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
15788
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15789
        #endif
15790
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
15791
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15792
        #endif
15793
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
15794
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
15795
0
        #endif
15796
        #ifdef WOLFSSL_DTLS_CID
15797
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15798
        #endif /* WOLFSSL_DTLS_CID */
15799
0
                break;
15800
15801
        #ifdef WOLFSSL_EARLY_DATA
15802
            case session_ticket:
15803
                if (ssl->options.tls1_3) {
15804
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15805
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15806
                }
15807
                break;
15808
        #endif
15809
0
    #endif
15810
0
#endif
15811
15812
0
    #ifdef WOLFSSL_TLS13
15813
0
        #ifndef NO_CERTS
15814
0
            case certificate:
15815
                /* Don't send out any extension except those that are turned
15816
                 * off. */
15817
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15818
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15819
                /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
15820
                 *       TLSX_SERVER_CERTIFICATE_TYPE
15821
                 */
15822
0
                break;
15823
0
        #endif
15824
0
    #endif
15825
15826
0
            default:
15827
0
                break;
15828
0
        }
15829
15830
0
        offset += OPAQUE16_LEN; /* extensions length */
15831
15832
0
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15833
0
                         msgType, &offset);
15834
0
        if (ret != 0)
15835
0
            return ret;
15836
15837
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
15838
        if (msgType == hello_retry_request) {
15839
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15840
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15841
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15842
                             msgType, &offset);
15843
            if (ret != 0)
15844
                return ret;
15845
        }
15846
#endif
15847
15848
0
#ifdef HAVE_EXTENDED_MASTER
15849
0
        if (ssl->options.haveEMS && msgType == server_hello &&
15850
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
15851
0
            WOLFSSL_MSG("EMS extension to write");
15852
0
            c16toa(HELLO_EXT_EXTMS, output + offset);
15853
0
            offset += HELLO_EXT_TYPE_SZ;
15854
0
            c16toa(0, output + offset);
15855
0
            offset += HELLO_EXT_SZ_SZ;
15856
0
        }
15857
0
#endif
15858
15859
0
        if (offset > OPAQUE16_LEN || msgType != server_hello)
15860
0
            c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
15861
0
    }
15862
15863
0
    if (pOffset)
15864
0
        *pOffset += offset;
15865
15866
0
    return ret;
15867
0
}
15868
15869
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
15870
15871
#ifdef WOLFSSL_TLS13
15872
int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
15873
                      byte msgType, int* found)
15874
0
{
15875
0
    int ret = 0;
15876
0
    int offset = 0;
15877
15878
0
    *found = 0;
15879
0
    while (offset < (int)length) {
15880
0
        word16 type;
15881
0
        word16 size;
15882
15883
0
        if (offset + (2 * OPAQUE16_LEN) > length) {
15884
0
            ret = BUFFER_ERROR;
15885
0
            break;
15886
0
        }
15887
15888
0
        ato16(input + offset, &type);
15889
0
        offset += HELLO_EXT_TYPE_SZ;
15890
15891
0
        ato16(input + offset, &size);
15892
0
        offset += OPAQUE16_LEN;
15893
15894
0
        if (offset + size > length) {
15895
0
            ret = BUFFER_ERROR;
15896
0
            break;
15897
0
        }
15898
15899
0
        if (type == TLSX_SUPPORTED_VERSIONS) {
15900
0
            *found = 1;
15901
15902
0
            WOLFSSL_MSG("Supported Versions extension received");
15903
15904
0
            ret = SV_PARSE(ssl, input + offset, size, msgType, &ssl->version,
15905
0
                           &ssl->options, &ssl->extensions);
15906
0
            break;
15907
0
        }
15908
15909
0
        offset += size;
15910
0
    }
15911
15912
0
    return ret;
15913
0
}
15914
#endif
15915
/* Jump Table to check minimum size values for client case in TLSX_Parse */
15916
#ifndef NO_WOLFSSL_SERVER
15917
static word16 TLSX_GetMinSize_Client(word16* type)
15918
0
{
15919
0
    switch (*type) {
15920
0
        case TLSXT_SERVER_NAME:
15921
0
            return WOLFSSL_SNI_MIN_SIZE_CLIENT;
15922
0
        case TLSXT_EARLY_DATA:
15923
0
            return WOLFSSL_EDI_MIN_SIZE_CLIENT;
15924
0
        case TLSXT_MAX_FRAGMENT_LENGTH:
15925
0
            return WOLFSSL_MFL_MIN_SIZE_CLIENT;
15926
0
        case TLSXT_TRUSTED_CA_KEYS:
15927
0
            return WOLFSSL_TCA_MIN_SIZE_CLIENT;
15928
0
        case TLSXT_TRUNCATED_HMAC:
15929
0
            return WOLFSSL_THM_MIN_SIZE_CLIENT;
15930
0
        case TLSXT_STATUS_REQUEST:
15931
0
            return WOLFSSL_CSR_MIN_SIZE_CLIENT;
15932
0
        case TLSXT_SUPPORTED_GROUPS:
15933
0
            return WOLFSSL_EC_MIN_SIZE_CLIENT;
15934
0
        case TLSXT_EC_POINT_FORMATS:
15935
0
            return WOLFSSL_PF_MIN_SIZE_CLIENT;
15936
0
        case TLSXT_SIGNATURE_ALGORITHMS:
15937
0
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
15938
0
        case TLSXT_USE_SRTP:
15939
0
            return WOLFSSL_SRTP_MIN_SIZE_CLIENT;
15940
0
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
15941
0
            return WOLFSSL_ALPN_MIN_SIZE_CLIENT;
15942
0
        case TLSXT_STATUS_REQUEST_V2:
15943
0
            return WOLFSSL_CSR2_MIN_SIZE_CLIENT;
15944
0
        case TLSXT_CLIENT_CERTIFICATE:
15945
0
            return WOLFSSL_CCT_MIN_SIZE_CLIENT;
15946
0
        case TLSXT_SERVER_CERTIFICATE:
15947
0
            return WOLFSSL_SCT_MIN_SIZE_CLIENT;
15948
0
        case TLSXT_ENCRYPT_THEN_MAC:
15949
0
            return WOLFSSL_ETM_MIN_SIZE_CLIENT;
15950
0
        case TLSXT_SESSION_TICKET:
15951
0
            return WOLFSSL_STK_MIN_SIZE_CLIENT;
15952
0
        case TLSXT_PRE_SHARED_KEY:
15953
0
            return WOLFSSL_PSK_MIN_SIZE_CLIENT;
15954
0
        case TLSXT_COOKIE:
15955
0
            return WOLFSSL_CKE_MIN_SIZE_CLIENT;
15956
0
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
15957
0
            return WOLFSSL_PKM_MIN_SIZE_CLIENT;
15958
0
        case TLSXT_CERTIFICATE_AUTHORITIES:
15959
0
            return WOLFSSL_CAN_MIN_SIZE_CLIENT;
15960
0
        case TLSXT_POST_HANDSHAKE_AUTH:
15961
0
            return WOLFSSL_PHA_MIN_SIZE_CLIENT;
15962
0
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
15963
0
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
15964
0
        case TLSXT_KEY_SHARE:
15965
0
            return WOLFSSL_KS_MIN_SIZE_CLIENT;
15966
0
        case TLSXT_CONNECTION_ID:
15967
0
            return WOLFSSL_CID_MIN_SIZE_CLIENT;
15968
0
        case TLSXT_RENEGOTIATION_INFO:
15969
0
            return WOLFSSL_SCR_MIN_SIZE_CLIENT;
15970
0
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
15971
0
            return WOLFSSL_QTP_MIN_SIZE_CLIENT;
15972
0
        case TLSXT_ECH:
15973
0
            return WOLFSSL_ECH_MIN_SIZE_CLIENT;
15974
0
        default:
15975
0
            return 0;
15976
0
    }
15977
0
}
15978
0
    #define TLSX_GET_MIN_SIZE_CLIENT(type) TLSX_GetMinSize_Client(type)
15979
#else
15980
    #define TLSX_GET_MIN_SIZE_CLIENT(type) 0
15981
#endif
15982
15983
15984
#ifndef NO_WOLFSSL_CLIENT
15985
/* Jump Table to check minimum size values for server case in TLSX_Parse */
15986
static word16 TLSX_GetMinSize_Server(const word16 *type)
15987
0
{
15988
0
    switch (*type) {
15989
0
        case TLSXT_SERVER_NAME:
15990
0
            return WOLFSSL_SNI_MIN_SIZE_SERVER;
15991
0
        case TLSXT_EARLY_DATA:
15992
0
            return WOLFSSL_EDI_MIN_SIZE_SERVER;
15993
0
        case TLSXT_MAX_FRAGMENT_LENGTH:
15994
0
            return WOLFSSL_MFL_MIN_SIZE_SERVER;
15995
0
        case TLSXT_TRUSTED_CA_KEYS:
15996
0
            return WOLFSSL_TCA_MIN_SIZE_SERVER;
15997
0
        case TLSXT_TRUNCATED_HMAC:
15998
0
            return WOLFSSL_THM_MIN_SIZE_SERVER;
15999
0
        case TLSXT_STATUS_REQUEST:
16000
0
            return WOLFSSL_CSR_MIN_SIZE_SERVER;
16001
0
        case TLSXT_SUPPORTED_GROUPS:
16002
0
            return WOLFSSL_EC_MIN_SIZE_SERVER;
16003
0
        case TLSXT_EC_POINT_FORMATS:
16004
0
            return WOLFSSL_PF_MIN_SIZE_SERVER;
16005
0
        case TLSXT_SIGNATURE_ALGORITHMS:
16006
0
            return WOLFSSL_SA_MIN_SIZE_SERVER;
16007
0
        case TLSXT_USE_SRTP:
16008
0
            return WOLFSSL_SRTP_MIN_SIZE_SERVER;
16009
0
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
16010
0
            return WOLFSSL_ALPN_MIN_SIZE_SERVER;
16011
0
        case TLSXT_STATUS_REQUEST_V2:
16012
0
            return WOLFSSL_CSR2_MIN_SIZE_SERVER;
16013
0
        case TLSXT_CLIENT_CERTIFICATE:
16014
0
            return WOLFSSL_CCT_MIN_SIZE_SERVER;
16015
0
        case TLSXT_SERVER_CERTIFICATE:
16016
0
            return WOLFSSL_SCT_MIN_SIZE_SERVER;
16017
0
        case TLSXT_ENCRYPT_THEN_MAC:
16018
0
            return WOLFSSL_ETM_MIN_SIZE_SERVER;
16019
0
        case TLSXT_SESSION_TICKET:
16020
0
            return WOLFSSL_STK_MIN_SIZE_SERVER;
16021
0
        case TLSXT_PRE_SHARED_KEY:
16022
0
            return WOLFSSL_PSK_MIN_SIZE_SERVER;
16023
0
        case TLSXT_COOKIE:
16024
0
            return WOLFSSL_CKE_MIN_SIZE_SERVER;
16025
0
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
16026
0
            return WOLFSSL_PKM_MIN_SIZE_SERVER;
16027
0
        case TLSXT_CERTIFICATE_AUTHORITIES:
16028
0
            return WOLFSSL_CAN_MIN_SIZE_SERVER;
16029
0
        case TLSXT_POST_HANDSHAKE_AUTH:
16030
0
            return WOLFSSL_PHA_MIN_SIZE_SERVER;
16031
0
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
16032
0
            return WOLFSSL_SA_MIN_SIZE_SERVER;
16033
0
        case TLSXT_KEY_SHARE:
16034
0
            return WOLFSSL_KS_MIN_SIZE_SERVER;
16035
0
        case TLSXT_CONNECTION_ID:
16036
0
            return WOLFSSL_CID_MIN_SIZE_SERVER;
16037
0
        case TLSXT_RENEGOTIATION_INFO:
16038
0
            return WOLFSSL_SCR_MIN_SIZE_SERVER;
16039
0
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
16040
0
            return WOLFSSL_QTP_MIN_SIZE_SERVER;
16041
0
        case TLSXT_ECH:
16042
0
            return WOLFSSL_ECH_MIN_SIZE_SERVER;
16043
0
        default:
16044
0
            return 0;
16045
0
    }
16046
0
}
16047
0
    #define TLSX_GET_MIN_SIZE_SERVER(type) TLSX_GetMinSize_Server(type)
16048
#else
16049
    #define TLSX_GET_MIN_SIZE_SERVER(type) 0
16050
#endif
16051
16052
16053
/** Parses a buffer of TLS extensions. */
16054
int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType,
16055
                                                                 Suites *suites)
16056
0
{
16057
0
    int ret = 0;
16058
0
    word16 offset = 0;
16059
0
    byte isRequest = (msgType == client_hello ||
16060
0
                      msgType == certificate_request);
16061
16062
0
#ifdef HAVE_EXTENDED_MASTER
16063
0
    byte pendingEMS = 0;
16064
0
#endif
16065
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
16066
    int pskDone = 0;
16067
#endif
16068
0
    byte seenType[SEMAPHORE_SIZE];  /* Seen known extensions. */
16069
16070
0
    if (!ssl || !input || (isRequest && !suites))
16071
0
        return BAD_FUNC_ARG;
16072
16073
    /* No known extensions seen yet. */
16074
0
    XMEMSET(seenType, 0, sizeof(seenType));
16075
16076
0
    while (ret == 0 && offset < length) {
16077
0
        word16 type;
16078
0
        word16 size;
16079
16080
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
16081
        if (msgType == client_hello && pskDone) {
16082
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
16083
            return PSK_KEY_ERROR;
16084
        }
16085
#endif
16086
16087
0
        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
16088
0
            return BUFFER_ERROR;
16089
16090
0
        ato16(input + offset, &type);
16091
0
        offset += HELLO_EXT_TYPE_SZ;
16092
16093
0
        ato16(input + offset, &size);
16094
0
        offset += OPAQUE16_LEN;
16095
16096
        /* Check we have a bit for extension type. */
16097
0
        if ((type <= 62) || (type == TLSX_RENEGOTIATION_INFO)
16098
        #ifdef WOLFSSL_QUIC
16099
            || (type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT)
16100
        #endif
16101
0
            )
16102
0
        {
16103
            /* Detect duplicate recognized extensions. */
16104
0
            if (IS_OFF(seenType, TLSX_ToSemaphore(type))) {
16105
0
                TURN_ON(seenType, TLSX_ToSemaphore(type));
16106
0
            }
16107
0
            else {
16108
0
                return DUPLICATE_TLS_EXT_E;
16109
0
            }
16110
0
        }
16111
16112
0
        if (length - offset < size)
16113
0
            return BUFFER_ERROR;
16114
16115
        /* Check minimum size required for TLSX, even if disabled */
16116
0
        switch (msgType) {
16117
0
            #ifndef NO_WOLFSSL_SERVER
16118
0
            case client_hello:
16119
0
                if (size < TLSX_GET_MIN_SIZE_CLIENT(&type)){
16120
0
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
16121
0
                    return BUFFER_ERROR;
16122
0
                }
16123
0
            break;
16124
0
            #endif
16125
0
            #ifndef NO_WOLFSSL_CLIENT
16126
0
            case server_hello:
16127
0
            case hello_retry_request:
16128
0
                if (size < TLSX_GET_MIN_SIZE_SERVER(&type)){
16129
0
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
16130
0
                    return BUFFER_ERROR;
16131
0
                }
16132
0
            break;
16133
0
            #endif
16134
0
            default:
16135
0
            break;
16136
0
        }
16137
16138
0
        switch (type) {
16139
0
#ifdef HAVE_SNI
16140
0
            case TLSX_SERVER_NAME:
16141
0
                WOLFSSL_MSG("SNI extension received");
16142
            #ifdef WOLFSSL_DEBUG_TLS
16143
                WOLFSSL_BUFFER(input + offset, size);
16144
            #endif
16145
16146
0
#ifdef WOLFSSL_TLS13
16147
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
16148
0
                    if (msgType != client_hello &&
16149
0
                        msgType != encrypted_extensions)
16150
0
                        return EXT_NOT_ALLOWED;
16151
0
                }
16152
0
                else
16153
0
#endif
16154
0
                {
16155
0
                    if (msgType != client_hello &&
16156
0
                        msgType != server_hello)
16157
0
                        return EXT_NOT_ALLOWED;
16158
0
                }
16159
0
                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
16160
0
                break;
16161
0
#endif
16162
16163
0
            case TLSX_TRUSTED_CA_KEYS:
16164
0
                WOLFSSL_MSG("Trusted CA extension received");
16165
            #ifdef WOLFSSL_DEBUG_TLS
16166
                WOLFSSL_BUFFER(input + offset, size);
16167
            #endif
16168
16169
0
#ifdef WOLFSSL_TLS13
16170
                /* RFC 8446 4.2.4 states trusted_ca_keys is not used
16171
                   in TLS 1.3. */
16172
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
16173
0
                    break;
16174
0
                }
16175
0
                else
16176
0
#endif
16177
0
                {
16178
0
                    if (msgType != client_hello &&
16179
0
                        msgType != server_hello)
16180
0
                        return EXT_NOT_ALLOWED;
16181
0
                }
16182
0
                ret = TCA_PARSE(ssl, input + offset, size, isRequest);
16183
0
                break;
16184
16185
0
            case TLSX_MAX_FRAGMENT_LENGTH:
16186
0
                WOLFSSL_MSG("Max Fragment Length extension received");
16187
            #ifdef WOLFSSL_DEBUG_TLS
16188
                WOLFSSL_BUFFER(input + offset, size);
16189
            #endif
16190
16191
0
#ifdef WOLFSSL_TLS13
16192
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
16193
0
                    if (msgType != client_hello &&
16194
0
                        msgType != encrypted_extensions) {
16195
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16196
0
                        return EXT_NOT_ALLOWED;
16197
0
                    }
16198
0
                }
16199
0
                else
16200
0
#endif
16201
0
                {
16202
0
                    if (msgType != client_hello &&
16203
0
                        msgType != server_hello) {
16204
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16205
0
                        return EXT_NOT_ALLOWED;
16206
0
                    }
16207
0
                }
16208
0
                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
16209
0
                break;
16210
16211
0
            case TLSX_TRUNCATED_HMAC:
16212
0
                WOLFSSL_MSG("Truncated HMAC extension received");
16213
            #ifdef WOLFSSL_DEBUG_TLS
16214
                WOLFSSL_BUFFER(input + offset, size);
16215
            #endif
16216
16217
0
#ifdef WOLFSSL_TLS13
16218
0
                if (IsAtLeastTLSv1_3(ssl->version))
16219
0
                    break;
16220
0
#endif
16221
0
                if (msgType != client_hello)
16222
0
                    return EXT_NOT_ALLOWED;
16223
0
                ret = THM_PARSE(ssl, input + offset, size, isRequest);
16224
0
                break;
16225
16226
0
            case TLSX_SUPPORTED_GROUPS:
16227
0
                WOLFSSL_MSG("Supported Groups extension received");
16228
            #ifdef WOLFSSL_DEBUG_TLS
16229
                WOLFSSL_BUFFER(input + offset, size);
16230
            #endif
16231
16232
0
#ifdef WOLFSSL_TLS13
16233
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
16234
0
                    if (msgType != client_hello &&
16235
0
                        msgType != encrypted_extensions) {
16236
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16237
0
                        return EXT_NOT_ALLOWED;
16238
0
                    }
16239
0
                }
16240
0
                else
16241
0
#endif
16242
0
                {
16243
0
                    if (msgType != client_hello) {
16244
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16245
0
                        return EXT_NOT_ALLOWED;
16246
0
                    }
16247
0
                }
16248
0
                ret = EC_PARSE(ssl, input + offset, size, isRequest,
16249
0
                        &ssl->extensions);
16250
0
                break;
16251
#ifdef WOLFSSL_DUAL_ALG_CERTS
16252
            case TLSX_CKS:
16253
                WOLFSSL_MSG("CKS extension received");
16254
                if (msgType != client_hello &&
16255
                     msgType != encrypted_extensions) {
16256
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16257
                        return EXT_NOT_ALLOWED;
16258
                }
16259
                ret = TLSX_CKS_Parse(ssl, (byte *)(input + offset), size,
16260
                                     &ssl->extensions);
16261
            break;
16262
#endif /* WOLFSSL_DUAL_ALG_CERTS */
16263
0
            case TLSX_EC_POINT_FORMATS:
16264
0
                WOLFSSL_MSG("Point Formats extension received");
16265
            #ifdef WOLFSSL_DEBUG_TLS
16266
                WOLFSSL_BUFFER(input + offset, size);
16267
            #endif
16268
16269
0
#ifdef WOLFSSL_TLS13
16270
0
                if (IsAtLeastTLSv1_3(ssl->version))
16271
0
                    break;
16272
0
#endif
16273
0
                if (msgType != client_hello &&
16274
0
                    msgType != server_hello) {
16275
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16276
0
                    return EXT_NOT_ALLOWED;
16277
0
                }
16278
16279
0
                ret = PF_PARSE(ssl, input + offset, size, isRequest);
16280
0
                break;
16281
16282
0
            case TLSX_STATUS_REQUEST:
16283
0
                WOLFSSL_MSG("Certificate Status Request extension received");
16284
            #ifdef WOLFSSL_DEBUG_TLS
16285
                WOLFSSL_BUFFER(input + offset, size);
16286
            #endif
16287
16288
0
#ifdef WOLFSSL_TLS13
16289
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
16290
0
                    if (msgType != client_hello &&
16291
0
                        msgType != certificate_request &&
16292
0
                        msgType != certificate)
16293
0
                        return EXT_NOT_ALLOWED;
16294
0
                }
16295
0
                else
16296
0
 #endif
16297
0
                {
16298
0
                    if (msgType != client_hello &&
16299
0
                        msgType != server_hello)
16300
0
                        return EXT_NOT_ALLOWED;
16301
0
                }
16302
0
                ret = CSR_PARSE(ssl, input + offset, size, isRequest);
16303
0
                break;
16304
16305
0
            case TLSX_STATUS_REQUEST_V2:
16306
0
                WOLFSSL_MSG("Certificate Status Request v2 extension received");
16307
            #ifdef WOLFSSL_DEBUG_TLS
16308
                WOLFSSL_BUFFER(input + offset, size);
16309
            #endif
16310
16311
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
16312
                if (IsAtLeastTLSv1_3(ssl->version)) {
16313
                    if (msgType != client_hello &&
16314
                        msgType != certificate_request &&
16315
                        msgType != certificate)
16316
                        return EXT_NOT_ALLOWED;
16317
                }
16318
                else
16319
#endif
16320
0
                {
16321
0
                    if (msgType != client_hello &&
16322
0
                        msgType != server_hello)
16323
0
                        return EXT_NOT_ALLOWED;
16324
0
                }
16325
0
                ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
16326
0
                break;
16327
16328
0
#ifdef HAVE_EXTENDED_MASTER
16329
0
            case HELLO_EXT_EXTMS:
16330
0
                WOLFSSL_MSG("Extended Master Secret extension received");
16331
            #ifdef WOLFSSL_DEBUG_TLS
16332
                WOLFSSL_BUFFER(input + offset, size);
16333
            #endif
16334
16335
0
#if defined(WOLFSSL_TLS13)
16336
0
                if (IsAtLeastTLSv1_3(ssl->version))
16337
0
                    break;
16338
0
#endif
16339
0
                if (msgType != client_hello &&
16340
0
                    msgType != server_hello)
16341
0
                    return EXT_NOT_ALLOWED;
16342
0
                if (size != 0)
16343
0
                    return BUFFER_ERROR;
16344
16345
0
#ifndef NO_WOLFSSL_SERVER
16346
0
                if (isRequest)
16347
0
                    ssl->options.haveEMS = 1;
16348
0
#endif
16349
0
                pendingEMS = 1;
16350
0
                break;
16351
0
#endif
16352
16353
0
            case TLSX_RENEGOTIATION_INFO:
16354
0
                WOLFSSL_MSG("Secure Renegotiation extension received");
16355
            #ifdef WOLFSSL_DEBUG_TLS
16356
                WOLFSSL_BUFFER(input + offset, size);
16357
            #endif
16358
16359
0
#ifdef WOLFSSL_TLS13
16360
0
                if (IsAtLeastTLSv1_3(ssl->version))
16361
0
                    break;
16362
0
#endif
16363
0
                if (msgType != client_hello &&
16364
0
                    msgType != server_hello)
16365
0
                    return EXT_NOT_ALLOWED;
16366
0
                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
16367
0
                break;
16368
16369
0
            case TLSX_SESSION_TICKET:
16370
0
                WOLFSSL_MSG("Session Ticket extension received");
16371
            #ifdef WOLFSSL_DEBUG_TLS
16372
                WOLFSSL_BUFFER(input + offset, size);
16373
            #endif
16374
16375
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
16376
                if (IsAtLeastTLSv1_3(ssl->version)) {
16377
                    if (msgType != client_hello)
16378
                        return EXT_NOT_ALLOWED;
16379
                }
16380
                else
16381
#endif
16382
0
                {
16383
0
                    if (msgType != client_hello &&
16384
0
                        msgType != server_hello)
16385
0
                        return EXT_NOT_ALLOWED;
16386
0
                }
16387
0
                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
16388
0
                break;
16389
16390
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
16391
0
                WOLFSSL_MSG("ALPN extension received");
16392
16393
            #ifdef WOLFSSL_DEBUG_TLS
16394
                WOLFSSL_BUFFER(input + offset, size);
16395
            #endif
16396
16397
#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
16398
                if (IsAtLeastTLSv1_3(ssl->version)) {
16399
                    if (msgType != client_hello &&
16400
                        msgType != encrypted_extensions)
16401
                        return EXT_NOT_ALLOWED;
16402
                }
16403
                else
16404
#endif
16405
0
                {
16406
0
                    if (msgType != client_hello &&
16407
0
                        msgType != server_hello)
16408
0
                        return EXT_NOT_ALLOWED;
16409
0
                }
16410
0
                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
16411
0
                break;
16412
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16413
0
            case TLSX_SIGNATURE_ALGORITHMS:
16414
0
                WOLFSSL_MSG("Signature Algorithms extension received");
16415
            #ifdef WOLFSSL_DEBUG_TLS
16416
                WOLFSSL_BUFFER(input + offset, size);
16417
            #endif
16418
16419
0
                if (!IsAtLeastTLSv1_2(ssl))
16420
0
                    break;
16421
0
            #ifdef WOLFSSL_TLS13
16422
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
16423
0
                    if (msgType != client_hello &&
16424
0
                        msgType != certificate_request)
16425
0
                        return EXT_NOT_ALLOWED;
16426
0
                }
16427
0
                else
16428
0
            #endif
16429
0
                {
16430
0
                    if (msgType != client_hello)
16431
0
                        return EXT_NOT_ALLOWED;
16432
0
                }
16433
0
                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
16434
0
                break;
16435
0
#endif
16436
16437
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
16438
0
            case TLSX_ENCRYPT_THEN_MAC:
16439
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension received");
16440
16441
                /* Ignore for TLS 1.3+ */
16442
0
                if (IsAtLeastTLSv1_3(ssl->version))
16443
0
                    break;
16444
0
                if (msgType != client_hello &&
16445
0
                    msgType != server_hello)
16446
0
                    return EXT_NOT_ALLOWED;
16447
16448
0
                ret = ETM_PARSE(ssl, input + offset, size, msgType);
16449
0
                break;
16450
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
16451
16452
0
#ifdef WOLFSSL_TLS13
16453
0
            case TLSX_SUPPORTED_VERSIONS:
16454
0
                WOLFSSL_MSG("Skipping Supported Versions - already processed");
16455
            #ifdef WOLFSSL_DEBUG_TLS
16456
                WOLFSSL_BUFFER(input + offset, size);
16457
            #endif
16458
0
                if (msgType != client_hello &&
16459
0
                    msgType != server_hello &&
16460
0
                    msgType != hello_retry_request)
16461
0
                    return EXT_NOT_ALLOWED;
16462
16463
0
                break;
16464
16465
    #ifdef WOLFSSL_SEND_HRR_COOKIE
16466
            case TLSX_COOKIE:
16467
                WOLFSSL_MSG("Cookie extension received");
16468
            #ifdef WOLFSSL_DEBUG_TLS
16469
                WOLFSSL_BUFFER(input + offset, size);
16470
            #endif
16471
16472
                if (!IsAtLeastTLSv1_3(ssl->version))
16473
                    break;
16474
16475
                if (msgType != client_hello &&
16476
                    msgType != hello_retry_request) {
16477
                    return EXT_NOT_ALLOWED;
16478
                }
16479
16480
                ret = CKE_PARSE(ssl, input + offset, size, msgType);
16481
                break;
16482
    #endif
16483
16484
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16485
            case TLSX_PRE_SHARED_KEY:
16486
                WOLFSSL_MSG("Pre-Shared Key extension received");
16487
            #ifdef WOLFSSL_DEBUG_TLS
16488
                WOLFSSL_BUFFER(input + offset, size);
16489
            #endif
16490
16491
                if (!IsAtLeastTLSv1_3(ssl->version))
16492
                    break;
16493
16494
                if (msgType != client_hello &&
16495
                    msgType != server_hello) {
16496
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16497
                    return EXT_NOT_ALLOWED;
16498
                }
16499
16500
                ret = PSK_PARSE(ssl, input + offset, size, msgType);
16501
                pskDone = 1;
16502
                break;
16503
16504
            case TLSX_PSK_KEY_EXCHANGE_MODES:
16505
                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
16506
            #ifdef WOLFSSL_DEBUG_TLS
16507
                WOLFSSL_BUFFER(input + offset, size);
16508
            #endif
16509
16510
                if (!IsAtLeastTLSv1_3(ssl->version))
16511
                    break;
16512
16513
                if (msgType != client_hello) {
16514
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16515
                    return EXT_NOT_ALLOWED;
16516
                }
16517
16518
                ret = PKM_PARSE(ssl, input + offset, size, msgType);
16519
                break;
16520
    #endif
16521
16522
    #ifdef WOLFSSL_EARLY_DATA
16523
            case TLSX_EARLY_DATA:
16524
                WOLFSSL_MSG("Early Data extension received");
16525
            #ifdef WOLFSSL_DEBUG_TLS
16526
                WOLFSSL_BUFFER(input + offset, size);
16527
            #endif
16528
16529
                if (!IsAtLeastTLSv1_3(ssl->version))
16530
                    break;
16531
16532
                if (msgType != client_hello && msgType != session_ticket &&
16533
                    msgType != encrypted_extensions) {
16534
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16535
                    return EXT_NOT_ALLOWED;
16536
                }
16537
                ret = EDI_PARSE(ssl, input + offset, size, msgType);
16538
                break;
16539
    #endif
16540
16541
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
16542
            case TLSX_POST_HANDSHAKE_AUTH:
16543
                WOLFSSL_MSG("Post Handshake Authentication extension received");
16544
            #ifdef WOLFSSL_DEBUG_TLS
16545
                WOLFSSL_BUFFER(input + offset, size);
16546
            #endif
16547
16548
                if (!IsAtLeastTLSv1_3(ssl->version))
16549
                    break;
16550
16551
                if (msgType != client_hello) {
16552
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16553
                    return EXT_NOT_ALLOWED;
16554
                }
16555
16556
                ret = PHA_PARSE(ssl, input + offset, size, msgType);
16557
                break;
16558
    #endif
16559
16560
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16561
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
16562
0
                WOLFSSL_MSG("Signature Algorithms extension received");
16563
            #ifdef WOLFSSL_DEBUG_TLS
16564
                WOLFSSL_BUFFER(input + offset, size);
16565
            #endif
16566
16567
0
                if (!IsAtLeastTLSv1_3(ssl->version))
16568
0
                    break;
16569
16570
0
                if (msgType != client_hello &&
16571
0
                        msgType != certificate_request) {
16572
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16573
0
                    return EXT_NOT_ALLOWED;
16574
0
                }
16575
16576
0
                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
16577
0
                break;
16578
0
    #endif
16579
16580
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16581
            case TLSX_CERTIFICATE_AUTHORITIES:
16582
                WOLFSSL_MSG("Certificate Authorities extension received");
16583
            #ifdef WOLFSSL_DEBUG_TLS
16584
                WOLFSSL_BUFFER(input + offset, size);
16585
            #endif
16586
16587
                if (!IsAtLeastTLSv1_3(ssl->version))
16588
                    break;
16589
16590
                if (msgType != client_hello &&
16591
                        msgType != certificate_request) {
16592
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16593
                    return EXT_NOT_ALLOWED;
16594
                }
16595
16596
                ret = CAN_PARSE(ssl, input + offset, size, isRequest);
16597
                break;
16598
    #endif
16599
16600
0
            case TLSX_KEY_SHARE:
16601
0
                WOLFSSL_MSG("Key Share extension received");
16602
            #ifdef WOLFSSL_DEBUG_TLS
16603
                WOLFSSL_BUFFER(input + offset, size);
16604
            #endif
16605
16606
0
    #ifdef HAVE_SUPPORTED_CURVES
16607
0
                if (!IsAtLeastTLSv1_3(ssl->version))
16608
0
                    break;
16609
16610
0
                if (msgType != client_hello && msgType != server_hello &&
16611
0
                        msgType != hello_retry_request) {
16612
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16613
0
                    return EXT_NOT_ALLOWED;
16614
0
                }
16615
0
    #endif
16616
16617
0
                ret = KS_PARSE(ssl, input + offset, size, msgType);
16618
0
                break;
16619
0
#endif
16620
#ifdef WOLFSSL_SRTP
16621
            case TLSX_USE_SRTP:
16622
                WOLFSSL_MSG("Use SRTP extension received");
16623
                ret = SRTP_PARSE(ssl, input + offset, size, isRequest);
16624
                break;
16625
#endif
16626
#ifdef WOLFSSL_QUIC
16627
            case TLSX_KEY_QUIC_TP_PARAMS:
16628
                FALL_THROUGH;
16629
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
16630
                WOLFSSL_MSG("QUIC transport parameter received");
16631
            #ifdef WOLFSSL_DEBUG_TLS
16632
                WOLFSSL_BUFFER(input + offset, size);
16633
            #endif
16634
16635
                if (IsAtLeastTLSv1_3(ssl->version) &&
16636
                        msgType != client_hello &&
16637
                        msgType != server_hello &&
16638
                        msgType != encrypted_extensions) {
16639
                    return EXT_NOT_ALLOWED;
16640
                }
16641
                else if (!IsAtLeastTLSv1_3(ssl->version) &&
16642
                         msgType == encrypted_extensions) {
16643
                    return EXT_NOT_ALLOWED;
16644
                }
16645
                else if (WOLFSSL_IS_QUIC(ssl)) {
16646
                    ret = QTP_PARSE(ssl, input + offset, size, type, msgType);
16647
                }
16648
                else {
16649
                    WOLFSSL_MSG("QUIC transport param TLS extension type, but no QUIC");
16650
                    return EXT_NOT_ALLOWED; /* be safe, this should not happen */
16651
                }
16652
                break;
16653
#endif /* WOLFSSL_QUIC */
16654
#if defined(WOLFSSL_DTLS_CID)
16655
            case TLSX_CONNECTION_ID:
16656
                if (msgType != client_hello && msgType != server_hello)
16657
                    return EXT_NOT_ALLOWED;
16658
16659
                WOLFSSL_MSG("ConnectionID extension received");
16660
                ret = CID_PARSE(ssl, input + offset, size, isRequest);
16661
                break;
16662
16663
#endif /* defined(WOLFSSL_DTLS_CID) */
16664
#if defined(HAVE_RPK)
16665
            case TLSX_CLIENT_CERTIFICATE_TYPE:
16666
                WOLFSSL_MSG("Client Certificate Type extension received");
16667
                ret = CCT_PARSE(ssl, input + offset, size, msgType);
16668
                break;
16669
16670
            case TLSX_SERVER_CERTIFICATE_TYPE:
16671
                WOLFSSL_MSG("Server Certificate Type extension received");
16672
                ret = SCT_PARSE(ssl, input + offset, size, msgType);
16673
                break;
16674
#endif /* HAVE_RPK */
16675
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
16676
            case TLSX_ECH:
16677
                WOLFSSL_MSG("ECH extension received");
16678
                ret = ECH_PARSE(ssl, input + offset, size, msgType);
16679
                break;
16680
#endif
16681
0
            default:
16682
0
                WOLFSSL_MSG("Unknown TLS extension type");
16683
0
        }
16684
16685
        /* offset should be updated here! */
16686
0
        offset += size;
16687
0
    }
16688
16689
0
#ifdef HAVE_EXTENDED_MASTER
16690
0
    if (IsAtLeastTLSv1_3(ssl->version) &&
16691
0
        (msgType == hello_retry_request || msgType == hello_verify_request)) {
16692
        /* Don't change EMS status until server_hello received.
16693
         * Second ClientHello must have same extensions.
16694
         */
16695
0
    }
16696
0
    else if (!isRequest && ssl->options.haveEMS && !pendingEMS)
16697
0
        ssl->options.haveEMS = 0;
16698
0
#endif
16699
#if defined(WOLFSSL_TLS13) && !defined(NO_PSK)
16700
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == server_hello &&
16701
        IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE))) {
16702
        ssl->options.noPskDheKe = 1;
16703
    }
16704
#endif
16705
16706
0
    if (ret == 0)
16707
0
        ret = SNI_VERIFY_PARSE(ssl, isRequest);
16708
0
    if (ret == 0)
16709
0
        ret = TCA_VERIFY_PARSE(ssl, isRequest);
16710
16711
0
    return ret;
16712
0
}
16713
16714
/* undefining semaphore macros */
16715
#undef IS_OFF
16716
#undef TURN_ON
16717
#undef SEMAPHORE_SIZE
16718
16719
#endif /* HAVE_TLS_EXTENSIONS */
16720
16721
#ifndef NO_WOLFSSL_CLIENT
16722
16723
    WOLFSSL_METHOD* wolfTLS_client_method(void)
16724
0
    {
16725
0
        return wolfTLS_client_method_ex(NULL);
16726
0
    }
16727
    WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
16728
0
    {
16729
0
        WOLFSSL_METHOD* method =
16730
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16731
0
                                                     heap, DYNAMIC_TYPE_METHOD);
16732
0
        (void)heap;
16733
0
        WOLFSSL_ENTER("TLS_client_method_ex");
16734
0
        if (method) {
16735
0
        #if defined(WOLFSSL_TLS13)
16736
0
            InitSSL_Method(method, MakeTLSv1_3());
16737
        #elif !defined(WOLFSSL_NO_TLS12)
16738
            InitSSL_Method(method, MakeTLSv1_2());
16739
        #elif !defined(NO_OLD_TLS)
16740
            InitSSL_Method(method, MakeTLSv1_1());
16741
        #elif defined(WOLFSSL_ALLOW_TLSV10)
16742
            InitSSL_Method(method, MakeTLSv1());
16743
        #else
16744
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
16745
        #endif
16746
16747
0
            method->downgrade = 1;
16748
0
            method->side      = WOLFSSL_CLIENT_END;
16749
0
        }
16750
0
        return method;
16751
0
    }
16752
16753
#ifndef NO_OLD_TLS
16754
    #ifdef WOLFSSL_ALLOW_TLSV10
16755
    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
16756
    {
16757
        return wolfTLSv1_client_method_ex(NULL);
16758
    }
16759
    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
16760
    {
16761
        WOLFSSL_METHOD* method =
16762
                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16763
                                                     heap, DYNAMIC_TYPE_METHOD);
16764
        (void)heap;
16765
        WOLFSSL_ENTER("TLSv1_client_method_ex");
16766
        if (method)
16767
            InitSSL_Method(method, MakeTLSv1());
16768
        return method;
16769
    }
16770
    #endif /* WOLFSSL_ALLOW_TLSV10 */
16771
16772
    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
16773
    {
16774
        return wolfTLSv1_1_client_method_ex(NULL);
16775
    }
16776
    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
16777
    {
16778
        WOLFSSL_METHOD* method =
16779
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16780
                                                     heap, DYNAMIC_TYPE_METHOD);
16781
        (void)heap;
16782
        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
16783
        if (method)
16784
            InitSSL_Method(method, MakeTLSv1_1());
16785
        return method;
16786
    }
16787
#endif /* !NO_OLD_TLS */
16788
16789
#ifndef WOLFSSL_NO_TLS12
16790
    WOLFSSL_ABI
16791
    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
16792
0
    {
16793
0
        return wolfTLSv1_2_client_method_ex(NULL);
16794
0
    }
16795
    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
16796
0
    {
16797
0
        WOLFSSL_METHOD* method =
16798
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16799
0
                                                     heap, DYNAMIC_TYPE_METHOD);
16800
0
        (void)heap;
16801
0
        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
16802
0
        if (method)
16803
0
            InitSSL_Method(method, MakeTLSv1_2());
16804
0
        return method;
16805
0
    }
16806
#endif /* WOLFSSL_NO_TLS12 */
16807
16808
#ifdef WOLFSSL_TLS13
16809
    /* The TLS v1.3 client method data.
16810
     *
16811
     * returns the method data for a TLS v1.3 client.
16812
     */
16813
    WOLFSSL_ABI
16814
    WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
16815
0
    {
16816
0
        return wolfTLSv1_3_client_method_ex(NULL);
16817
0
    }
16818
16819
    /* The TLS v1.3 client method data.
16820
     *
16821
     * heap  The heap used for allocation.
16822
     * returns the method data for a TLS v1.3 client.
16823
     */
16824
    WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
16825
0
    {
16826
0
        WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
16827
0
                                 XMALLOC(sizeof(WOLFSSL_METHOD), heap,
16828
0
                                         DYNAMIC_TYPE_METHOD);
16829
0
        (void)heap;
16830
0
        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
16831
0
        if (method)
16832
0
            InitSSL_Method(method, MakeTLSv1_3());
16833
0
        return method;
16834
0
    }
16835
#endif /* WOLFSSL_TLS13 */
16836
16837
#ifdef WOLFSSL_DTLS
16838
16839
    WOLFSSL_METHOD* wolfDTLS_client_method(void)
16840
    {
16841
        return wolfDTLS_client_method_ex(NULL);
16842
    }
16843
    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
16844
    {
16845
        WOLFSSL_METHOD* method =
16846
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16847
                                                     heap, DYNAMIC_TYPE_METHOD);
16848
        (void)heap;
16849
        WOLFSSL_ENTER("DTLS_client_method_ex");
16850
        if (method) {
16851
        #if defined(WOLFSSL_DTLS13)
16852
            InitSSL_Method(method, MakeDTLSv1_3());
16853
        #elif !defined(WOLFSSL_NO_TLS12)
16854
            InitSSL_Method(method, MakeDTLSv1_2());
16855
        #elif !defined(NO_OLD_TLS)
16856
            InitSSL_Method(method, MakeDTLSv1());
16857
        #else
16858
            #error No DTLS version enabled!
16859
        #endif
16860
16861
            method->downgrade = 1;
16862
            method->side      = WOLFSSL_CLIENT_END;
16863
        }
16864
        return method;
16865
    }
16866
16867
    #ifndef NO_OLD_TLS
16868
    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
16869
    {
16870
        return wolfDTLSv1_client_method_ex(NULL);
16871
    }
16872
    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
16873
    {
16874
        WOLFSSL_METHOD* method =
16875
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16876
                                                 heap, DYNAMIC_TYPE_METHOD);
16877
        (void)heap;
16878
        WOLFSSL_ENTER("DTLSv1_client_method_ex");
16879
        if (method)
16880
            InitSSL_Method(method, MakeDTLSv1());
16881
        return method;
16882
    }
16883
    #endif  /* NO_OLD_TLS */
16884
16885
    #ifndef WOLFSSL_NO_TLS12
16886
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
16887
    {
16888
        return wolfDTLSv1_2_client_method_ex(NULL);
16889
    }
16890
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
16891
    {
16892
        WOLFSSL_METHOD* method =
16893
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16894
                                                 heap, DYNAMIC_TYPE_METHOD);
16895
        (void)heap;
16896
        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
16897
        if (method)
16898
            InitSSL_Method(method, MakeDTLSv1_2());
16899
        (void)heap;
16900
        return method;
16901
    }
16902
    #endif /* !WOLFSSL_NO_TLS12 */
16903
#endif /* WOLFSSL_DTLS */
16904
16905
#endif /* NO_WOLFSSL_CLIENT */
16906
16907
16908
/* EITHER SIDE METHODS */
16909
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
16910
    #ifndef NO_OLD_TLS
16911
    #ifdef WOLFSSL_ALLOW_TLSV10
16912
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16913
     *
16914
     * Returns a pointer to a WOLFSSL_METHOD struct
16915
     */
16916
    WOLFSSL_METHOD* wolfTLSv1_method(void)
16917
    {
16918
        return wolfTLSv1_method_ex(NULL);
16919
    }
16920
    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
16921
    {
16922
        WOLFSSL_METHOD* m;
16923
        WOLFSSL_ENTER("TLSv1_method");
16924
    #ifndef NO_WOLFSSL_CLIENT
16925
        m = wolfTLSv1_client_method_ex(heap);
16926
    #else
16927
        m = wolfTLSv1_server_method_ex(heap);
16928
    #endif
16929
        if (m != NULL) {
16930
            m->side = WOLFSSL_NEITHER_END;
16931
        }
16932
16933
        return m;
16934
    }
16935
    #endif /* WOLFSSL_ALLOW_TLSV10 */
16936
16937
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16938
     *
16939
     * Returns a pointer to a WOLFSSL_METHOD struct
16940
     */
16941
    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
16942
    {
16943
        return wolfTLSv1_1_method_ex(NULL);
16944
    }
16945
    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
16946
    {
16947
        WOLFSSL_METHOD* m;
16948
        WOLFSSL_ENTER("TLSv1_1_method");
16949
    #ifndef NO_WOLFSSL_CLIENT
16950
        m = wolfTLSv1_1_client_method_ex(heap);
16951
    #else
16952
        m = wolfTLSv1_1_server_method_ex(heap);
16953
    #endif
16954
        if (m != NULL) {
16955
            m->side = WOLFSSL_NEITHER_END;
16956
        }
16957
        return m;
16958
    }
16959
    #endif /* !NO_OLD_TLS */
16960
16961
    #ifndef WOLFSSL_NO_TLS12
16962
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16963
     *
16964
     * Returns a pointer to a WOLFSSL_METHOD struct
16965
     */
16966
    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
16967
    {
16968
        return wolfTLSv1_2_method_ex(NULL);
16969
    }
16970
    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
16971
    {
16972
        WOLFSSL_METHOD* m;
16973
        WOLFSSL_ENTER("TLSv1_2_method");
16974
    #ifndef NO_WOLFSSL_CLIENT
16975
        m = wolfTLSv1_2_client_method_ex(heap);
16976
    #else
16977
        m = wolfTLSv1_2_server_method_ex(heap);
16978
    #endif
16979
        if (m != NULL) {
16980
            m->side = WOLFSSL_NEITHER_END;
16981
        }
16982
        return m;
16983
    }
16984
    #endif /* !WOLFSSL_NO_TLS12 */
16985
16986
    #ifdef WOLFSSL_TLS13
16987
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16988
     *
16989
     * Returns a pointer to a WOLFSSL_METHOD struct
16990
     */
16991
    WOLFSSL_METHOD* wolfTLSv1_3_method(void)
16992
    {
16993
        return wolfTLSv1_3_method_ex(NULL);
16994
    }
16995
    WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
16996
    {
16997
        WOLFSSL_METHOD* m;
16998
        WOLFSSL_ENTER("TLSv1_3_method");
16999
    #ifndef NO_WOLFSSL_CLIENT
17000
        m = wolfTLSv1_3_client_method_ex(heap);
17001
    #else
17002
        m = wolfTLSv1_3_server_method_ex(heap);
17003
    #endif
17004
        if (m != NULL) {
17005
            m->side = WOLFSSL_NEITHER_END;
17006
        }
17007
        return m;
17008
    }
17009
    #endif /* WOLFSSL_TLS13 */
17010
17011
#ifdef WOLFSSL_DTLS
17012
    WOLFSSL_METHOD* wolfDTLS_method(void)
17013
    {
17014
        return wolfDTLS_method_ex(NULL);
17015
    }
17016
    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
17017
    {
17018
        WOLFSSL_METHOD* m;
17019
        WOLFSSL_ENTER("DTLS_method_ex");
17020
    #ifndef NO_WOLFSSL_CLIENT
17021
        m = wolfDTLS_client_method_ex(heap);
17022
    #else
17023
        m = wolfDTLS_server_method_ex(heap);
17024
    #endif
17025
        if (m != NULL) {
17026
            m->side = WOLFSSL_NEITHER_END;
17027
        }
17028
        return m;
17029
    }
17030
17031
    #ifndef NO_OLD_TLS
17032
    WOLFSSL_METHOD* wolfDTLSv1_method(void)
17033
    {
17034
        return wolfDTLSv1_method_ex(NULL);
17035
    }
17036
    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
17037
    {
17038
        WOLFSSL_METHOD* m;
17039
        WOLFSSL_ENTER("DTLSv1_method_ex");
17040
    #ifndef NO_WOLFSSL_CLIENT
17041
        m = wolfDTLSv1_client_method_ex(heap);
17042
    #else
17043
        m = wolfDTLSv1_server_method_ex(heap);
17044
    #endif
17045
        if (m != NULL) {
17046
            m->side = WOLFSSL_NEITHER_END;
17047
        }
17048
        return m;
17049
    }
17050
    #endif /* !NO_OLD_TLS */
17051
    #ifndef WOLFSSL_NO_TLS12
17052
    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
17053
    {
17054
        return wolfDTLSv1_2_method_ex(NULL);
17055
    }
17056
    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
17057
    {
17058
        WOLFSSL_METHOD* m;
17059
        WOLFSSL_ENTER("DTLSv1_2_method");
17060
    #ifndef NO_WOLFSSL_CLIENT
17061
        m = wolfDTLSv1_2_client_method_ex(heap);
17062
    #else
17063
        m = wolfDTLSv1_2_server_method_ex(heap);
17064
    #endif
17065
        if (m != NULL) {
17066
            m->side = WOLFSSL_NEITHER_END;
17067
        }
17068
        return m;
17069
    }
17070
    #endif /* !WOLFSSL_NO_TLS12 */
17071
    #ifdef WOLFSSL_DTLS13
17072
    WOLFSSL_METHOD* wolfDTLSv1_3_method(void)
17073
    {
17074
        return wolfDTLSv1_3_method_ex(NULL);
17075
    }
17076
    WOLFSSL_METHOD* wolfDTLSv1_3_method_ex(void* heap)
17077
    {
17078
        WOLFSSL_METHOD* m;
17079
        WOLFSSL_ENTER("DTLSv1_3_method");
17080
    #ifndef NO_WOLFSSL_CLIENT
17081
        m = wolfDTLSv1_3_client_method_ex(heap);
17082
    #else
17083
        m = wolfDTLSv1_3_server_method_ex(heap);
17084
    #endif
17085
        if (m != NULL) {
17086
            m->side = WOLFSSL_NEITHER_END;
17087
        }
17088
        return m;
17089
    }
17090
    #endif /* WOLFSSL_DTLS13 */
17091
#endif /* WOLFSSL_DTLS */
17092
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
17093
17094
17095
#ifndef NO_WOLFSSL_SERVER
17096
17097
    WOLFSSL_METHOD* wolfTLS_server_method(void)
17098
0
    {
17099
0
        return wolfTLS_server_method_ex(NULL);
17100
0
    }
17101
17102
    WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
17103
0
    {
17104
0
        WOLFSSL_METHOD* method =
17105
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17106
0
                                                     heap, DYNAMIC_TYPE_METHOD);
17107
0
        (void)heap;
17108
0
        WOLFSSL_ENTER("TLS_server_method_ex");
17109
0
        if (method) {
17110
0
        #if defined(WOLFSSL_TLS13)
17111
0
            InitSSL_Method(method, MakeTLSv1_3());
17112
        #elif !defined(WOLFSSL_NO_TLS12)
17113
            InitSSL_Method(method, MakeTLSv1_2());
17114
        #elif !defined(NO_OLD_TLS)
17115
            InitSSL_Method(method, MakeTLSv1_1());
17116
        #elif defined(WOLFSSL_ALLOW_TLSV10)
17117
            InitSSL_Method(method, MakeTLSv1());
17118
        #else
17119
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
17120
        #endif
17121
17122
0
            method->downgrade = 1;
17123
0
            method->side      = WOLFSSL_SERVER_END;
17124
0
        }
17125
0
        return method;
17126
0
    }
17127
17128
#ifndef NO_OLD_TLS
17129
    #ifdef WOLFSSL_ALLOW_TLSV10
17130
    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
17131
    {
17132
        return wolfTLSv1_server_method_ex(NULL);
17133
    }
17134
    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
17135
    {
17136
        WOLFSSL_METHOD* method =
17137
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17138
                                                     heap, DYNAMIC_TYPE_METHOD);
17139
        (void)heap;
17140
        WOLFSSL_ENTER("TLSv1_server_method_ex");
17141
        if (method) {
17142
            InitSSL_Method(method, MakeTLSv1());
17143
            method->side = WOLFSSL_SERVER_END;
17144
        }
17145
        return method;
17146
    }
17147
    #endif /* WOLFSSL_ALLOW_TLSV10 */
17148
17149
    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
17150
    {
17151
        return wolfTLSv1_1_server_method_ex(NULL);
17152
    }
17153
    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
17154
    {
17155
        WOLFSSL_METHOD* method =
17156
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17157
                                                     heap, DYNAMIC_TYPE_METHOD);
17158
        (void)heap;
17159
        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
17160
        if (method) {
17161
            InitSSL_Method(method, MakeTLSv1_1());
17162
            method->side = WOLFSSL_SERVER_END;
17163
        }
17164
        return method;
17165
    }
17166
#endif /* !NO_OLD_TLS */
17167
17168
17169
#ifndef WOLFSSL_NO_TLS12
17170
    WOLFSSL_ABI
17171
    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
17172
0
    {
17173
0
        return wolfTLSv1_2_server_method_ex(NULL);
17174
0
    }
17175
    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
17176
0
    {
17177
0
        WOLFSSL_METHOD* method =
17178
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17179
0
                                                     heap, DYNAMIC_TYPE_METHOD);
17180
0
        (void)heap;
17181
0
        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
17182
0
        if (method) {
17183
0
            InitSSL_Method(method, MakeTLSv1_2());
17184
0
            method->side = WOLFSSL_SERVER_END;
17185
0
        }
17186
0
        return method;
17187
0
    }
17188
#endif /* !WOLFSSL_NO_TLS12 */
17189
17190
#ifdef WOLFSSL_TLS13
17191
    /* The TLS v1.3 server method data.
17192
     *
17193
     * returns the method data for a TLS v1.3 server.
17194
     */
17195
    WOLFSSL_ABI
17196
    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
17197
0
    {
17198
0
        return wolfTLSv1_3_server_method_ex(NULL);
17199
0
    }
17200
17201
    /* The TLS v1.3 server method data.
17202
     *
17203
     * heap  The heap used for allocation.
17204
     * returns the method data for a TLS v1.3 server.
17205
     */
17206
    WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
17207
0
    {
17208
0
        WOLFSSL_METHOD* method =
17209
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17210
0
                                                     heap, DYNAMIC_TYPE_METHOD);
17211
0
        (void)heap;
17212
0
        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
17213
0
        if (method) {
17214
0
            InitSSL_Method(method, MakeTLSv1_3());
17215
0
            method->side = WOLFSSL_SERVER_END;
17216
0
        }
17217
0
        return method;
17218
0
    }
17219
#endif /* WOLFSSL_TLS13 */
17220
17221
#ifdef WOLFSSL_DTLS
17222
    WOLFSSL_METHOD* wolfDTLS_server_method(void)
17223
    {
17224
        return wolfDTLS_server_method_ex(NULL);
17225
    }
17226
    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
17227
    {
17228
        WOLFSSL_METHOD* method =
17229
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17230
                                                     heap, DYNAMIC_TYPE_METHOD);
17231
        (void)heap;
17232
        WOLFSSL_ENTER("DTLS_server_method_ex");
17233
        if (method) {
17234
        #if defined(WOLFSSL_DTLS13)
17235
            InitSSL_Method(method, MakeDTLSv1_3());
17236
        #elif !defined(WOLFSSL_NO_TLS12)
17237
            InitSSL_Method(method, MakeDTLSv1_2());
17238
        #elif !defined(NO_OLD_TLS)
17239
            InitSSL_Method(method, MakeDTLSv1());
17240
        #else
17241
            #error No DTLS version enabled!
17242
        #endif
17243
17244
            method->downgrade = 1;
17245
            method->side      = WOLFSSL_SERVER_END;
17246
        }
17247
        return method;
17248
    }
17249
17250
    #ifndef NO_OLD_TLS
17251
    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
17252
    {
17253
        return wolfDTLSv1_server_method_ex(NULL);
17254
    }
17255
    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
17256
    {
17257
        WOLFSSL_METHOD* method =
17258
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17259
                                                 heap, DYNAMIC_TYPE_METHOD);
17260
        (void)heap;
17261
        WOLFSSL_ENTER("DTLSv1_server_method_ex");
17262
        if (method) {
17263
            InitSSL_Method(method, MakeDTLSv1());
17264
            method->side = WOLFSSL_SERVER_END;
17265
        }
17266
        return method;
17267
    }
17268
    #endif /* !NO_OLD_TLS */
17269
17270
    #ifndef WOLFSSL_NO_TLS12
17271
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
17272
    {
17273
        return wolfDTLSv1_2_server_method_ex(NULL);
17274
    }
17275
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
17276
    {
17277
        WOLFSSL_METHOD* method =
17278
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17279
                                                 heap, DYNAMIC_TYPE_METHOD);
17280
        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
17281
        (void)heap;
17282
        if (method) {
17283
            InitSSL_Method(method, MakeDTLSv1_2());
17284
            method->side = WOLFSSL_SERVER_END;
17285
        }
17286
        (void)heap;
17287
        return method;
17288
    }
17289
    #endif /* !WOLFSSL_NO_TLS12 */
17290
#endif /* WOLFSSL_DTLS */
17291
17292
#endif /* NO_WOLFSSL_SERVER */
17293
17294
#endif /* NO_TLS */
17295
17296
#endif /* WOLFCRYPT_ONLY */