Coverage Report

Created: 2025-07-23 06:59

/src/wolfssl-openssl-api/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
1.04k
    #define HSHASH_SZ WC_SHA384_DIGEST_SIZE
115
#else
116
    #define HSHASH_SZ FINISHED_SZ
117
#endif
118
119
int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
120
0
{
121
0
    int ret = 0;
122
0
    word32 hashSz = FINISHED_SZ;
123
124
0
    if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
125
0
        return BAD_FUNC_ARG;
126
127
    /* for constant timing perform these even if error */
128
#ifndef NO_OLD_TLS
129
    ret |= wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
130
    ret |= wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
131
#endif
132
133
0
    if (IsAtLeastTLSv1_2(ssl)) {
134
0
#ifndef NO_SHA256
135
0
        if (ssl->specs.mac_algorithm <= sha256_mac ||
136
0
            ssl->specs.mac_algorithm == blake2b_mac) {
137
0
            ret |= wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
138
0
            hashSz = WC_SHA256_DIGEST_SIZE;
139
0
        }
140
0
#endif
141
0
#ifdef WOLFSSL_SHA384
142
0
        if (ssl->specs.mac_algorithm == sha384_mac) {
143
0
            ret |= wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
144
0
            hashSz = WC_SHA384_DIGEST_SIZE;
145
0
        }
146
0
#endif
147
0
#ifdef WOLFSSL_SM3
148
0
        if (ssl->specs.mac_algorithm == sm3_mac) {
149
0
            ret |= wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
150
0
            hashSz = WC_SM3_DIGEST_SIZE;
151
0
        }
152
0
#endif
153
0
    }
154
155
0
    *hashLen = hashSz;
156
#ifdef WOLFSSL_CHECK_MEM_ZERO
157
     wc_MemZero_Add("TLS handshake hash", hash, hashSz);
158
#endif
159
160
0
    if (ret != 0) {
161
0
        ret = BUILD_MSG_ERROR;
162
0
        WOLFSSL_ERROR_VERBOSE(ret);
163
0
    }
164
165
0
    return ret;
166
0
}
167
168
169
int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
170
1.00k
{
171
1.00k
    int ret;
172
1.00k
    const byte* side = NULL;
173
1.00k
    word32 hashSz = HSHASH_SZ;
174
1.00k
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
175
1.00k
    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
1.00k
    XMEMSET(handshake_hash, 0, HSHASH_SZ);
184
1.00k
    ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
185
1.00k
    if (ret == 0) {
186
989
        if (XSTRNCMP((const char*)sender, (const char*)kTlsClientStr,
187
989
                                                          SIZEOF_SENDER) == 0) {
188
698
            side = kTlsClientFinStr;
189
698
        }
190
291
        else if (XSTRNCMP((const char*)sender, (const char*)kTlsServerStr,
191
291
                                                          SIZEOF_SENDER) == 0) {
192
291
            side = kTlsServerFinStr;
193
291
        }
194
0
        else {
195
0
            ret = BAD_FUNC_ARG;
196
0
            WOLFSSL_MSG("Unexpected sender value");
197
0
        }
198
989
    }
199
200
1.00k
    if (ret == 0) {
201
989
#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
989
        {
212
989
            PRIVATE_KEY_UNLOCK();
213
989
            ret = wc_PRF_TLS((byte*)hashes, TLS_FINISHED_SZ,
214
989
                      ssl->arrays->masterSecret, SECRET_LEN, side,
215
989
                      FINISHED_LABEL_SZ, handshake_hash, hashSz,
216
989
                      IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
217
989
                      ssl->heap, ssl->devId);
218
989
            PRIVATE_KEY_LOCK();
219
989
        }
220
989
        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
989
    }
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
1.00k
    return ret;
239
1.00k
}
240
241
#endif /* !WOLFSSL_NO_TLS12 */
242
243
#ifndef NO_OLD_TLS
244
245
#ifdef WOLFSSL_ALLOW_TLSV10
246
ProtocolVersion MakeTLSv1(void)
247
{
248
    ProtocolVersion pv;
249
    pv.major = SSLv3_MAJOR;
250
    pv.minor = TLSv1_MINOR;
251
252
    return pv;
253
}
254
#endif /* WOLFSSL_ALLOW_TLSV10 */
255
256
257
ProtocolVersion MakeTLSv1_1(void)
258
{
259
    ProtocolVersion pv;
260
    pv.major = SSLv3_MAJOR;
261
    pv.minor = TLSv1_1_MINOR;
262
263
    return pv;
264
}
265
266
#endif /* !NO_OLD_TLS */
267
268
269
#ifndef WOLFSSL_NO_TLS12
270
271
ProtocolVersion MakeTLSv1_2(void)
272
4.88k
{
273
4.88k
    ProtocolVersion pv;
274
4.88k
    pv.major = SSLv3_MAJOR;
275
4.88k
    pv.minor = TLSv1_2_MINOR;
276
277
4.88k
    return pv;
278
4.88k
}
279
280
#endif /* !WOLFSSL_NO_TLS12 */
281
282
#ifdef WOLFSSL_TLS13
283
/* The TLS v1.3 protocol version.
284
 *
285
 * returns the protocol version data for TLS v1.3.
286
 */
287
ProtocolVersion MakeTLSv1_3(void)
288
8
{
289
8
    ProtocolVersion pv;
290
8
    pv.major = SSLv3_MAJOR;
291
8
    pv.minor = TLSv1_3_MINOR;
292
293
8
    return pv;
294
8
}
295
#endif
296
297
#if defined(HAVE_SUPPORTED_CURVES)
298
/* Sets the key exchange groups in rank order on a context.
299
 *
300
 * ctx     SSL/TLS context object.
301
 * groups  Array of groups.
302
 * count   Number of groups in array.
303
 * returns BAD_FUNC_ARG when ctx or groups is NULL, not using TLS v1.3 or
304
 * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success.
305
 */
306
int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count)
307
0
{
308
0
    int ret, i;
309
310
0
    WOLFSSL_ENTER("wolfSSL_CTX_set_groups");
311
0
    if (ctx == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT)
312
0
        return BAD_FUNC_ARG;
313
0
    if (!IsTLS_ex(ctx->method->version))
314
0
        return BAD_FUNC_ARG;
315
316
0
    #ifdef WOLFSSL_TLS13
317
0
    ctx->numGroups = 0;
318
0
    #endif
319
0
    #if !defined(NO_TLS)
320
0
    TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
321
0
    #endif /* !NO_TLS */
322
0
    for (i = 0; i < count; i++) {
323
        /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups
324
         * are valid */
325
0
        if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, (word16)groups[i]))
326
0
                != WOLFSSL_SUCCESS) {
327
0
    #if !defined(NO_TLS)
328
0
            TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap);
329
0
    #endif /* !NO_TLS */
330
0
            return ret;
331
0
        }
332
0
        #ifdef WOLFSSL_TLS13
333
0
        ctx->group[i] = (word16)groups[i];
334
0
        #endif
335
0
    }
336
0
    #ifdef WOLFSSL_TLS13
337
0
    ctx->numGroups = (byte)count;
338
0
    #endif
339
340
0
    return WOLFSSL_SUCCESS;
341
0
}
342
343
/* Sets the key exchange groups in rank order.
344
 *
345
 * ssl     SSL/TLS object.
346
 * groups  Array of groups.
347
 * count   Number of groups in array.
348
 * returns BAD_FUNC_ARG when ssl or groups is NULL, not using TLS v1.3 or
349
 * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success.
350
 */
351
int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count)
352
0
{
353
0
    int ret, i;
354
355
0
    WOLFSSL_ENTER("wolfSSL_set_groups");
356
0
    if (ssl == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT)
357
0
        return BAD_FUNC_ARG;
358
0
    if (!IsTLS_ex(ssl->version))
359
0
        return BAD_FUNC_ARG;
360
361
0
    #ifdef WOLFSSL_TLS13
362
0
    ssl->numGroups = 0;
363
0
    #endif
364
0
    #if !defined(NO_TLS)
365
0
    TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
366
0
    #endif /* !NO_TLS */
367
0
    for (i = 0; i < count; i++) {
368
        /* Call to wolfSSL_UseSupportedCurve also checks if input groups
369
                 * are valid */
370
0
        if ((ret = wolfSSL_UseSupportedCurve(ssl, (word16)groups[i]))
371
0
                != WOLFSSL_SUCCESS) {
372
0
    #if !defined(NO_TLS)
373
0
            TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap);
374
0
    #endif /* !NO_TLS */
375
0
            return ret;
376
0
        }
377
0
        #ifdef WOLFSSL_TLS13
378
0
        ssl->group[i] = (word16)groups[i];
379
0
        #endif
380
0
    }
381
0
    #ifdef WOLFSSL_TLS13
382
0
    ssl->numGroups = (byte)count;
383
0
    #endif
384
385
0
    return WOLFSSL_SUCCESS;
386
0
}
387
#endif /* HAVE_SUPPORTED_CURVES */
388
389
#ifndef WOLFSSL_NO_TLS12
390
391
#ifdef HAVE_EXTENDED_MASTER
392
static const byte ext_master_label[EXT_MASTER_LABEL_SZ + 1] =
393
                                                      "extended master secret";
394
#endif
395
static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
396
static const byte key_label   [KEY_LABEL_SZ + 1]    = "key expansion";
397
398
static int _DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
399
                         const byte* ms, word32 msLen,
400
                         const byte* sr, const byte* cr,
401
                         int tls1_2, int hash_type,
402
                         void* heap, int devId)
403
1.41k
{
404
1.41k
    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
1.41k
    byte seed[SEED_LEN];
412
1.41k
#endif
413
414
1.41k
    XMEMCPY(seed,           sr, RAN_LEN);
415
1.41k
    XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
416
417
1.41k
#ifdef WOLFSSL_HAVE_PRF
418
1.41k
    PRIVATE_KEY_UNLOCK();
419
1.41k
    ret = wc_PRF_TLS(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
420
1.41k
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
421
1.41k
    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
1.41k
    return ret;
448
1.41k
}
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
1.41k
{
463
1.41k
    int   ret;
464
1.41k
    int   key_dig_len = 2 * ssl->specs.hash_size +
465
1.41k
                        2 * ssl->specs.key_size  +
466
1.41k
                        2 * ssl->specs.iv_size;
467
1.41k
#ifdef WOLFSSL_SMALL_STACK
468
1.41k
    byte* key_dig;
469
#else
470
    byte  key_dig[MAX_PRF_DIG];
471
#endif
472
473
1.41k
#ifdef WOLFSSL_SMALL_STACK
474
1.41k
    key_dig = (byte*)XMALLOC(MAX_PRF_DIG, ssl->heap, DYNAMIC_TYPE_DIGEST);
475
1.41k
    if (key_dig == NULL) {
476
2
        return MEMORY_E;
477
2
    }
478
1.41k
#endif
479
480
1.41k
    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
1.41k
    ret = _DeriveTlsKeys(key_dig, (word32)key_dig_len,
492
1.41k
                     ssl->arrays->masterSecret, SECRET_LEN,
493
1.41k
                     ssl->arrays->serverRandom, ssl->arrays->clientRandom,
494
1.41k
                     IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
495
1.41k
                     ssl->heap, ssl->devId);
496
1.41k
    if (ret == 0)
497
1.36k
        ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
498
499
1.41k
#ifdef WOLFSSL_SMALL_STACK
500
1.41k
    XFREE(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
501
1.41k
#endif
502
503
1.41k
    return ret;
504
1.41k
}
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
1.42k
{
512
1.42k
    int ret;
513
1.42k
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
514
1.42k
    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
1.42k
    XMEMCPY(seed,           cr, RAN_LEN);
523
1.42k
    XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
524
525
1.42k
#ifdef WOLFSSL_HAVE_PRF
526
1.42k
    PRIVATE_KEY_UNLOCK();
527
1.42k
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
528
1.42k
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
529
1.42k
    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
1.42k
    return ret;
550
1.42k
}
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
33
{
571
33
    int ret;
572
573
33
#ifdef WOLFSSL_HAVE_PRF
574
33
    PRIVATE_KEY_UNLOCK();
575
33
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
576
33
               sHash, sHashLen, tls1_2, hash_type, heap, devId);
577
33
    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
33
    return ret;
595
33
}
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
1.45k
{
612
1.45k
    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
1.45k
#ifdef HAVE_EXTENDED_MASTER
630
1.45k
    if (ssl->options.haveEMS) {
631
33
        word32 hashSz = HSHASH_SZ;
632
33
    #ifdef WOLFSSL_SMALL_STACK
633
33
        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
634
33
                                              DYNAMIC_TYPE_DIGEST);
635
33
        if (handshake_hash == NULL)
636
0
            return MEMORY_E;
637
    #else
638
        byte handshake_hash[HSHASH_SZ];
639
    #endif
640
641
33
        XMEMSET(handshake_hash, 0, HSHASH_SZ);
642
33
        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
643
33
        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
33
            {
655
33
                ret = _MakeTlsExtendedMasterSecret(
656
33
                    ssl->arrays->masterSecret, SECRET_LEN,
657
33
                    ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
658
33
                    handshake_hash, hashSz,
659
33
                    IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
660
33
                    ssl->heap, ssl->devId);
661
33
            }
662
33
            ForceZero(handshake_hash, hashSz);
663
33
        }
664
665
33
    #ifdef WOLFSSL_SMALL_STACK
666
33
        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
33
    }
671
1.42k
    else
672
1.42k
#endif /* HAVE_EXTENDED_MASTER */
673
1.42k
    {
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
1.42k
        {
685
1.42k
            ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret,
686
1.42k
                      SECRET_LEN, ssl->arrays->preMasterSecret,
687
1.42k
                      ssl->arrays->preMasterSz, ssl->arrays->clientRandom,
688
1.42k
                      ssl->arrays->serverRandom, IsAtLeastTLSv1_2(ssl),
689
1.42k
                      ssl->specs.mac_algorithm, ssl->heap, ssl->devId);
690
1.42k
        }
691
1.42k
    }
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
1.45k
    if (ret == 0) {
699
1.41k
        ret = DeriveTlsKeys(ssl);
700
1.41k
    }
701
702
1.45k
    return ret;
703
1.45k
}
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
0
#ifdef WOLFSSL_SMALL_STACK
713
0
    byte* seed;
714
#else
715
    byte  seed[SEED_LEN];
716
#endif
717
718
0
#ifdef WOLFSSL_SMALL_STACK
719
0
    seed = (byte*)XMALLOC(SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED);
720
0
    if (seed == NULL)
721
0
        return MEMORY_E;
722
0
#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
0
#ifdef WOLFSSL_SMALL_STACK
749
0
    XFREE(seed, ssl->heap, DYNAMIC_TYPE_SEED);
750
0
#endif
751
752
0
    return ret;
753
0
}
754
755
/* return HMAC digest type in wolfSSL format */
756
int wolfSSL_GetHmacType(WOLFSSL* ssl)
757
687
{
758
687
    if (ssl == NULL)
759
0
        return BAD_FUNC_ARG;
760
761
687
    return wolfSSL_GetHmacType_ex(&ssl->specs);
762
687
}
763
764
765
int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
766
                           int verify)
767
{
768
    if (ssl == NULL || inner == NULL)
769
        return BAD_FUNC_ARG;
770
771
    if (content == dtls12_cid
772
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_DTLS_CID)
773
       || (ssl->options.dtls && DtlsGetCidTxSize(ssl) > 0)
774
#endif
775
    ) {
776
        WOLFSSL_MSG("wolfSSL_SetTlsHmacInner doesn't support CID");
777
        return BAD_FUNC_ARG;
778
    }
779
780
    XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
781
782
    WriteSEQ(ssl, verify, inner);
783
    inner[SEQ_SZ] = (byte)content;
784
    inner[SEQ_SZ + ENUM_LEN]            = ssl->version.major;
785
    inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
786
    c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
787
788
    return 0;
789
}
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
0
    #ifdef WOLFSSL_SM3
833
0
        case WC_SM3:
834
0
            ret = wc_Sm3Update(&hmac->hash.sm3, data, sz);
835
0
            break;
836
0
    #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
0
    #ifdef WOLFSSL_SM3
882
0
        case WC_SM3:
883
0
            ret = wc_Sm3FinalRaw(&hmac->hash.sm3, hash);
884
0
            break;
885
0
    #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
132
{
903
132
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
904
132
    wc_HashAlg hash;
905
132
    enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
906
132
    int digestSz = wc_HashGetDigestSize(hashType);
907
132
    int blockSz = wc_HashGetBlockSize(hashType);
908
909
132
    if ((digestSz >= 0) && (blockSz >= 0)) {
910
132
        ret = wc_HashInit(&hash, hashType);
911
132
    }
912
0
    else {
913
0
        ret = BAD_FUNC_ARG;
914
0
    }
915
916
132
    if (ret == 0) {
917
132
        ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->opad,
918
132
            (word32)blockSz);
919
132
        if (ret == 0)
920
126
            ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->innerHash,
921
126
                (word32)digestSz);
922
132
        if (ret == 0)
923
126
            ret = wc_HashFinal(&hash, hashType, mac);
924
132
        wc_HashFree(&hash, hashType);
925
132
    }
926
927
132
    return ret;
928
132
}
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
0
    #ifdef WOLFSSL_SM3
990
0
        case WC_SM3:
991
0
            blockSz = WC_SM3_BLOCK_SIZE;
992
0
            blockBits = 6;
993
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
994
0
            break;
995
0
    #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
0
{
1114
0
    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
1115
0
    int        ret = 0;
1116
0
    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
1117
0
    word32     offset = 0;
1118
0
    int        msgBlocks, blocks, blockBits;
1119
0
    int        i;
1120
1121
0
    switch (hmac->macType) {
1122
0
    #ifndef NO_SHA
1123
0
        case WC_SHA:
1124
0
            blockSz = WC_SHA_BLOCK_SIZE;
1125
0
            blockBits = 6;
1126
0
            macSz = WC_SHA_DIGEST_SIZE;
1127
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1128
0
            break;
1129
0
    #endif /* !NO_SHA */
1130
1131
0
    #ifndef NO_SHA256
1132
0
        case WC_SHA256:
1133
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1134
0
            blockBits = 6;
1135
0
            macSz = WC_SHA256_DIGEST_SIZE;
1136
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1137
0
            break;
1138
0
    #endif /* !NO_SHA256 */
1139
1140
0
    #ifdef WOLFSSL_SHA384
1141
0
        case WC_SHA384:
1142
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1143
0
            blockBits = 7;
1144
0
            macSz = WC_SHA384_DIGEST_SIZE;
1145
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1146
0
            break;
1147
0
    #endif /* WOLFSSL_SHA384 */
1148
1149
0
    #ifdef WOLFSSL_SHA512
1150
0
        case WC_SHA512:
1151
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1152
0
            blockBits = 7;
1153
0
            macSz = WC_SHA512_DIGEST_SIZE;
1154
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1155
0
            break;
1156
0
    #endif /* WOLFSSL_SHA512 */
1157
1158
0
    #ifdef HAVE_BLAKE2
1159
0
        case WC_HASH_TYPE_BLAKE2B:
1160
0
            blockSz = BLAKE2B_BLOCKBYTES;
1161
0
            blockBits = 7;
1162
0
            macSz = BLAKE2B_256;
1163
0
            padSz = 0;
1164
0
            break;
1165
0
    #endif /* HAVE_BLAKE2 */
1166
1167
0
    #ifdef WOLFSSL_SM3
1168
0
        case WC_SM3:
1169
0
            blockSz = WC_SM3_BLOCK_SIZE;
1170
0
            blockBits = 6;
1171
0
            macSz = WC_SM3_DIGEST_SIZE;
1172
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1173
0
            break;
1174
0
    #endif
1175
1176
0
        default:
1177
0
            WOLFSSL_MSG("ERROR: Hmac_UpdateFinal failed, no hmac->macType");
1178
0
            return BAD_FUNC_ARG;
1179
0
    }
1180
1181
0
    msgSz = sz - (1 + in[sz - 1] + macSz);
1182
    /* Make negative result 0 */
1183
0
    msgSz &= ~(0 - (msgSz >> 31));
1184
0
    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
1185
0
    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
1186
    /* Make negative result 0 */
1187
0
    maxSz &= ~(0 - (maxSz >> 31));
1188
1189
    /* Calculate #blocks processed in HMAC for max and real data. */
1190
0
    blocks      = (int)(maxSz >> blockBits);
1191
0
    blocks     += ((maxSz + padSz) % blockSz) < padSz;
1192
0
    msgBlocks   = (int)(realSz >> blockBits);
1193
    /* #Extra blocks to process. */
1194
0
    blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0);
1195
    /* Calculate whole blocks. */
1196
0
    msgBlocks--;
1197
1198
0
    ret = wc_HmacUpdate(hmac, header, headerSz);
1199
0
    if (ret == 0) {
1200
        /* Fill the rest of the block with any available data. */
1201
0
        word32 currSz = ctMaskLT((int)msgSz, (int)blockSz) & msgSz;
1202
0
        currSz |= ctMaskGTE((int)msgSz, (int)blockSz) & blockSz;
1203
0
        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
1204
0
        currSz &= ~(0 - (currSz >> 31));
1205
0
        ret = wc_HmacUpdate(hmac, in, currSz);
1206
0
        offset = currSz;
1207
0
    }
1208
0
    if (ret == 0) {
1209
        /* Do the hash operations on a block basis. */
1210
0
        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
1211
0
            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
1212
0
            if (ret != 0)
1213
0
                break;
1214
0
        }
1215
0
    }
1216
0
    if (ret == 0)
1217
0
        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
1218
0
    if (ret == 0)
1219
0
        ret = wc_HmacFinal(hmac, digest);
1220
0
    if (ret == 0) {
1221
        /* Do the dummy hash operations. Do at least one. */
1222
0
        for (i = 0; i < blocks + 1; i++) {
1223
0
            ret = wc_HmacUpdate(hmac, dummy, blockSz);
1224
0
            if (ret != 0)
1225
0
                break;
1226
0
        }
1227
0
    }
1228
1229
0
    return ret;
1230
0
}
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
{
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
    *innerSz = WOLFSSL_TLS_HMAC_INNER_SZ;
1278
    return wolfSSL_SetTlsHmacInner(ssl, inner, sz, content,
1279
            !ssl->options.dtls ? verify : epochOrder);
1280
}
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
#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
{
1291
    Hmac   hmac;
1292
    byte   myInner[TLS_HMAC_INNER_SZ];
1293
    word32 innerSz = TLS_HMAC_INNER_SZ;
1294
    int    ret = 0;
1295
    const byte* macSecret = NULL;
1296
    word32 hashSz = 0;
1297
1298
    if (ssl == NULL)
1299
        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
    hashSz = ssl->specs.hash_size;
1306
#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
    ret = TLS_hmac_SetInner(ssl, myInner, &innerSz, sz, content, verify,
1322
                            epochOrder);
1323
    if (ret != 0)
1324
        return ret;
1325
1326
    ret = wc_HmacInit(&hmac, ssl->heap, ssl->devId);
1327
    if (ret != 0)
1328
        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
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
1337
    ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
1338
                                              macSecret,
1339
                                              ssl->specs.hash_size);
1340
1341
    if (ret == 0) {
1342
        /* Constant time verification required. */
1343
        if (verify && padSz >= 0) {
1344
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
1345
    !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
            {
1354
                ret = Hmac_UpdateFinal_CT(&hmac, digest, in,
1355
                                      (sz + hashSz + (word32)padSz + 1),
1356
                                      (int)hashSz, myInner, innerSz);
1357
1358
            }
1359
#else
1360
            ret = Hmac_UpdateFinal(&hmac, digest, in, sz + hashSz +
1361
                                        (word32)(padSz) + 1,
1362
                                        myInner, innerSz);
1363
#endif
1364
        }
1365
        else {
1366
            ret = wc_HmacUpdate(&hmac, myInner, innerSz);
1367
            if (ret == 0)
1368
                ret = wc_HmacUpdate(&hmac, in, sz);                /* content */
1369
            if (ret == 0)
1370
                ret = wc_HmacFinal(&hmac, digest);
1371
        }
1372
    }
1373
1374
    wc_HmacFree(&hmac);
1375
1376
    return ret;
1377
}
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
0
        #ifndef NO_MD5
1389
0
        case md5_mac:
1390
0
        {
1391
0
            return WC_MD5;
1392
0
        }
1393
0
        #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
0
        #ifdef WOLFSSL_SM3
1407
0
        case sm3_mac:
1408
0
        {
1409
0
            return WC_SM3;
1410
0
        }
1411
0
        #endif
1412
0
        #ifndef NO_SHA
1413
0
        case sha_mac:
1414
0
        {
1415
0
            return WC_SHA;
1416
0
        }
1417
0
        #endif
1418
0
        #ifdef HAVE_BLAKE2
1419
0
        case blake2b_mac:
1420
0
        {
1421
0
            return BLAKE2B_ID;
1422
0
        }
1423
0
        #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
{
1464
    switch (type) {
1465
1466
        case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
1467
            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
        default:
1481
            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
                WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
1489
            }
1490
    }
1491
1492
    return type;
1493
}
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
133k
{
1511
133k
    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
1512
1513
133k
    (void)heap;
1514
1515
133k
    if (extension) {
1516
133k
        extension->type = type;
1517
133k
        extension->data = (void*)data;
1518
133k
        extension->resp = 0;
1519
133k
        extension->next = NULL;
1520
133k
    }
1521
1522
133k
    return extension;
1523
133k
}
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
133k
{
1563
133k
    TLSX* extension = TLSX_New(type, data, heap);
1564
1565
133k
    if (extension == NULL)
1566
334
        return MEMORY_E;
1567
1568
    /* pushes the new extension on the list. */
1569
133k
    extension->next = *list;
1570
133k
    *list = extension;
1571
1572
    /* remove duplicate extensions, there should be only one of each type. */
1573
401k
    do {
1574
401k
        if (extension->next && extension->next->type == type) {
1575
216
            TLSX *next = extension->next;
1576
1577
216
            extension->next = next->next;
1578
216
            next->next = NULL;
1579
1580
216
            TLSX_FreeAll(next, heap);
1581
1582
            /* there is no way to occur more than
1583
             * two extensions of the same type.
1584
             */
1585
216
            break;
1586
216
        }
1587
401k
    } while ((extension = extension->next));
1588
1589
0
    return 0;
1590
133k
}
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
277
{
1598
277
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1599
1600
277
    if (!extension)
1601
277
        extension = TLSX_Find(ssl->ctx->extensions, type);
1602
1603
277
    return extension == NULL;
1604
277
}
1605
1606
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
1607
1608
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
1609
14
{
1610
14
    SendAlert(ssl, alert_fatal, unsupported_extension);
1611
14
    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
1612
14
    return UNSUPPORTED_EXTENSION;
1613
14
}
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
2.89k
{
1627
2.89k
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1628
1629
2.89k
    if (extension)
1630
2.89k
        extension->resp = 1;
1631
2.89k
}
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
#define ALPN_FREE_ALL(list, heap) WC_DO_NOTHING
2072
#define ALPN_GET_SIZE(list)     0
2073
0
#define ALPN_WRITE(a, b)        0
2074
#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
28
{
2087
28
    SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
2088
2089
28
    (void)heap;
2090
2091
28
    if (sni) {
2092
28
        sni->type = type;
2093
28
        sni->next = NULL;
2094
2095
28
    #ifndef NO_WOLFSSL_SERVER
2096
28
        sni->options = 0;
2097
28
        sni->status  = WOLFSSL_SNI_NO_MATCH;
2098
28
    #endif
2099
2100
28
        switch (sni->type) {
2101
28
            case WOLFSSL_SNI_HOST_NAME:
2102
28
                sni->data.host_name = (char*)XMALLOC(size + 1, heap,
2103
28
                                                     DYNAMIC_TYPE_TLSX);
2104
28
                if (sni->data.host_name) {
2105
28
                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
2106
28
                    sni->data.host_name[size] = '\0';
2107
28
                } else {
2108
0
                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2109
0
                    sni = NULL;
2110
0
                }
2111
28
            break;
2112
2113
0
            default: /* invalid type */
2114
0
                XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
2115
0
                sni = NULL;
2116
28
        }
2117
28
    }
2118
2119
28
    return sni;
2120
28
}
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
17.0k
{
2151
17.0k
    SNI* sni;
2152
17.0k
    word16 length = OPAQUE16_LEN; /* list length */
2153
2154
34.1k
    while ((sni = list)) {
2155
17.0k
        list = sni->next;
2156
2157
17.0k
        length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
2158
2159
17.0k
        switch (sni->type) {
2160
17.0k
            case WOLFSSL_SNI_HOST_NAME:
2161
17.0k
                length += (word16)XSTRLEN((char*)sni->data.host_name);
2162
17.0k
            break;
2163
17.0k
        }
2164
17.0k
    }
2165
2166
17.0k
    return length;
2167
17.0k
}
2168
2169
/** Writes the SNI objects of a list in a buffer. */
2170
static word16 TLSX_SNI_Write(SNI* list, byte* output)
2171
17.0k
{
2172
17.0k
    SNI* sni;
2173
17.0k
    word16 length = 0;
2174
17.0k
    word16 offset = OPAQUE16_LEN; /* list length offset */
2175
2176
34.0k
    while ((sni = list)) {
2177
17.0k
        list = sni->next;
2178
2179
17.0k
        output[offset++] = sni->type; /* sni type */
2180
2181
17.0k
        switch (sni->type) {
2182
17.0k
            case WOLFSSL_SNI_HOST_NAME:
2183
17.0k
                length = (word16)XSTRLEN((char*)sni->data.host_name);
2184
2185
17.0k
                c16toa(length, output + offset); /* sni length */
2186
17.0k
                offset += OPAQUE16_LEN;
2187
2188
17.0k
                XMEMCPY(output + offset, sni->data.host_name, length);
2189
2190
17.0k
                offset += length;
2191
17.0k
            break;
2192
17.0k
        }
2193
17.0k
    }
2194
2195
17.0k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2196
2197
17.0k
    return offset;
2198
17.0k
}
2199
2200
/** Finds a SNI object in the provided list. */
2201
static SNI* TLSX_SNI_Find(SNI *list, byte type)
2202
20
{
2203
20
    SNI* sni = list;
2204
2205
20
    while (sni && sni->type != type)
2206
0
        sni = sni->next;
2207
2208
20
    return sni;
2209
20
}
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
20
{
2215
20
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2216
20
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2217
2218
20
    if (sni)
2219
0
        sni->status = status;
2220
20
}
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
794
{
2239
794
#ifndef NO_WOLFSSL_SERVER
2240
794
    word16 size = 0;
2241
794
    word16 offset = 0;
2242
794
    int cacheOnly = 0;
2243
794
    SNI *sni = NULL;
2244
794
    byte type;
2245
794
    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
794
#endif /* !NO_WOLFSSL_SERVER */
2252
794
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
2253
2254
794
    if (!extension)
2255
794
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2256
2257
794
    if (!isRequest) {
2258
27
        #ifndef NO_WOLFSSL_CLIENT
2259
27
            if (!extension || !extension->data)
2260
0
                return TLSX_HandleUnsupportedExtension(ssl);
2261
2262
27
            if (length > 0)
2263
7
                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
20
            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
2274
20
                                                        WOLFSSL_SNI_REAL_MATCH);
2275
2276
20
            return 0;
2277
27
        #endif
2278
27
    }
2279
2280
767
#ifndef NO_WOLFSSL_SERVER
2281
767
    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
767
        if (ssl->ctx->sniRecvCb) {
2290
0
            cacheOnly = 1;
2291
0
        }
2292
2293
767
        if (cacheOnly) {
2294
0
            WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
2295
0
        }
2296
767
        else {
2297
            /* Skipping, SNI not enabled at server side. */
2298
767
            return 0;
2299
767
        }
2300
767
    }
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
14.5k
{
2403
14.5k
    (void)ssl;
2404
2405
14.5k
    if (isRequest) {
2406
9.12k
    #ifndef NO_WOLFSSL_SERVER
2407
9.12k
        TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2408
9.12k
        TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
2409
9.12k
        SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
2410
9.12k
        SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
2411
9.12k
        SNI* sni = NULL;
2412
2413
9.12k
        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
9.12k
        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
9.12k
    #endif /* NO_WOLFSSL_SERVER */
2443
9.12k
    }
2444
2445
14.5k
    return 0;
2446
14.5k
}
2447
2448
int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
2449
                                                                     void* heap)
2450
28
{
2451
28
    TLSX* extension;
2452
28
    SNI* sni = NULL;
2453
2454
28
    if (extensions == NULL || data == NULL)
2455
0
        return BAD_FUNC_ARG;
2456
2457
28
    if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
2458
0
        return MEMORY_E;
2459
2460
28
    extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
2461
28
    if (!extension) {
2462
28
        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
2463
2464
28
        if (ret != 0) {
2465
0
            TLSX_SNI_Free(sni, heap);
2466
0
            return ret;
2467
0
        }
2468
28
    }
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
28
    return WOLFSSL_SUCCESS;
2491
28
}
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
#define SNI_FREE_ALL     TLSX_SNI_FreeAll
2682
#define SNI_GET_SIZE     TLSX_SNI_GetSize
2683
0
#define SNI_WRITE        TLSX_SNI_Write
2684
#define SNI_PARSE        TLSX_SNI_Parse
2685
#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
#define TCA_FREE_ALL(list, heap) WC_DO_NOTHING
3034
#define TCA_GET_SIZE(list)     0
3035
0
#define TCA_WRITE(a, b)        0
3036
#define TCA_PARSE(a, b, c, d)  0
3037
#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
#define MFL_FREE_ALL(a, b) WC_DO_NOTHING
3131
#define MFL_GET_SIZE(a)       0
3132
0
#define MFL_WRITE(a, b)       0
3133
#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
#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
#define CSR_FREE_ALL(data, heap) WC_DO_NOTHING
3897
#define CSR_GET_SIZE(a, b)    0
3898
0
#define CSR_WRITE(a, b, c)    0
3899
#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
#define CSR2_FREE_ALL(data, heap) WC_DO_NOTHING
4453
#define CSR2_GET_SIZE(a, b)    0
4454
0
#define CSR2_WRITE(a, b, c)    0
4455
#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
0
        #ifdef HAVE_ECC_KOBLITZ
4498
0
        case WOLFSSL_ECC_SECP256K1:
4499
0
            break;
4500
0
        #endif
4501
0
        #ifndef NO_ECC_SECP
4502
0
        case WOLFSSL_ECC_SECP256R1:
4503
0
            break;
4504
0
        #endif /* !NO_ECC_SECP */
4505
0
        #ifdef HAVE_ECC_BRAINPOOL
4506
0
        case WOLFSSL_ECC_BRAINPOOLP256R1:
4507
0
            break;
4508
0
        #endif
4509
0
        #ifdef WOLFSSL_SM2
4510
0
        case WOLFSSL_ECC_SM2P256V1:
4511
0
            break;
4512
0
        #endif /* WOLFSSL_SM2 */
4513
0
    #endif
4514
0
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
4515
0
        case WOLFSSL_ECC_X25519:
4516
0
            break;
4517
0
    #endif
4518
0
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
4519
0
        case WOLFSSL_ECC_X448:
4520
0
            break;
4521
0
    #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
0
        #ifdef HAVE_ECC_BRAINPOOL
4528
0
        case WOLFSSL_ECC_BRAINPOOLP384R1:
4529
0
            break;
4530
0
        #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
0
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
4539
0
        #ifdef HAVE_ECC_KOBLITZ
4540
0
        case WOLFSSL_ECC_SECP160K1:
4541
0
            break;
4542
0
        #endif
4543
0
        #ifndef NO_ECC_SECP
4544
0
        case WOLFSSL_ECC_SECP160R1:
4545
0
            break;
4546
0
        #endif
4547
0
        #ifdef HAVE_ECC_SECPR2
4548
0
        case WOLFSSL_ECC_SECP160R2:
4549
0
            break;
4550
0
        #endif
4551
0
    #endif
4552
0
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
4553
0
        #ifdef HAVE_ECC_KOBLITZ
4554
0
        case WOLFSSL_ECC_SECP192K1:
4555
0
            break;
4556
0
        #endif
4557
0
        #ifndef NO_ECC_SECP
4558
0
        case WOLFSSL_ECC_SECP192R1:
4559
0
            break;
4560
0
        #endif
4561
0
    #endif
4562
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
4563
0
        #ifdef HAVE_ECC_KOBLITZ
4564
0
        case WOLFSSL_ECC_SECP224K1:
4565
0
            break;
4566
0
        #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
0
        #ifdef HAVE_ECC_BRAINPOOL
4574
0
        case WOLFSSL_ECC_BRAINPOOLP512R1:
4575
0
            break;
4576
0
        #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
353k
{
4743
353k
    if (curve == NULL)
4744
0
        return BAD_FUNC_ARG;
4745
4746
353k
    (void)heap;
4747
4748
353k
    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
4749
353k
                                                             DYNAMIC_TYPE_TLSX);
4750
353k
    if (*curve == NULL)
4751
206
        return MEMORY_E;
4752
4753
352k
    (*curve)->name = name;
4754
352k
    (*curve)->next = NULL;
4755
4756
352k
    return 0;
4757
353k
}
4758
4759
static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
4760
15.6k
{
4761
15.6k
    if (point == NULL)
4762
0
        return BAD_FUNC_ARG;
4763
4764
15.6k
    (void)heap;
4765
4766
15.6k
    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
4767
15.6k
                                                             DYNAMIC_TYPE_TLSX);
4768
15.6k
    if (*point == NULL)
4769
10
        return MEMORY_E;
4770
4771
15.6k
    (*point)->format = format;
4772
15.6k
    (*point)->next = NULL;
4773
4774
15.6k
    return 0;
4775
15.6k
}
4776
4777
static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
4778
28.3k
{
4779
28.3k
    SupportedCurve* curve;
4780
4781
381k
    while ((curve = list)) {
4782
352k
        list = curve->next;
4783
352k
        XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
4784
352k
    }
4785
28.3k
    (void)heap;
4786
28.3k
}
4787
4788
static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
4789
15.6k
{
4790
15.6k
    PointFormat* point;
4791
4792
31.3k
    while ((point = list)) {
4793
15.6k
        list = point->next;
4794
15.6k
        XFREE(point, heap, DYNAMIC_TYPE_TLSX);
4795
15.6k
    }
4796
15.6k
    (void)heap;
4797
15.6k
}
4798
4799
static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
4800
                                                                     void* heap)
4801
327k
{
4802
327k
    int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG);
4803
4804
2.74M
    while (list) {
4805
2.74M
        if (list->name == name) {
4806
2.93k
            ret = 0; /* curve already in use */
4807
2.93k
            break;
4808
2.93k
        }
4809
4810
2.73M
        if (list->next == NULL) {
4811
324k
            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
4812
324k
            break;
4813
324k
        }
4814
4815
2.41M
        list = list->next;
4816
2.41M
    }
4817
4818
327k
    return ret;
4819
327k
}
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
34.0k
{
4849
    /* If all pre-defined parameter types for key exchange are supported then
4850
     * always send SupportedGroups extension.
4851
     */
4852
34.0k
    (void)ssl;
4853
34.0k
    (void)semaphore;
4854
34.0k
}
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
34.0k
{
4903
34.0k
#ifdef HAVE_FFDHE
4904
34.0k
    (void)ssl;
4905
34.0k
    (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
34.0k
}
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
{
4951
#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4952
                                                          defined(HAVE_CURVE448)
4953
    (void)semaphore;
4954
#endif
4955
4956
    if (ssl->options.cipherSuite0 == TLS13_BYTE)
4957
        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
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
4974
    if (ssl->options.cipherSuite0 == ECC_BYTE ||
4975
        ssl->options.cipherSuite0 == ECDHE_PSK_BYTE ||
4976
        ssl->options.cipherSuite0 == CHACHA_BYTE) {
4977
        return;
4978
    }
4979
#endif
4980
4981
    /* turns semaphore on to avoid sending this extension. */
4982
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4983
}
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
17.5k
{
4991
17.5k
    SupportedCurve* curve;
4992
17.5k
    word16 length = OPAQUE16_LEN; /* list length */
4993
4994
315k
    while ((curve = list)) {
4995
297k
        list = curve->next;
4996
297k
        length += OPAQUE16_LEN; /* curve length */
4997
297k
    }
4998
4999
17.5k
    return length;
5000
17.5k
}
5001
5002
#endif
5003
5004
static word16 TLSX_PointFormat_GetSize(PointFormat* list)
5005
14.9k
{
5006
14.9k
    PointFormat* point;
5007
14.9k
    word16 length = ENUM_LEN; /* list length */
5008
5009
29.8k
    while ((point = list)) {
5010
14.9k
        list = point->next;
5011
14.9k
        length += ENUM_LEN; /* format length */
5012
14.9k
    }
5013
5014
14.9k
    return length;
5015
14.9k
}
5016
5017
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5018
5019
static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
5020
17.4k
{
5021
17.4k
    word16 offset = OPAQUE16_LEN;
5022
5023
314k
    while (list) {
5024
297k
        c16toa(list->name, output + offset);
5025
297k
        offset += OPAQUE16_LEN;
5026
297k
        list = list->next;
5027
297k
    }
5028
5029
17.4k
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
5030
5031
17.4k
    return offset;
5032
17.4k
}
5033
5034
#endif
5035
5036
static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
5037
14.8k
{
5038
14.8k
    word16 offset = ENUM_LEN;
5039
5040
29.7k
    while (list) {
5041
14.8k
        output[offset++] = list->format;
5042
14.8k
        list = list->next;
5043
14.8k
    }
5044
5045
14.8k
    output[0] = (byte)(offset - ENUM_LEN);
5046
5047
14.8k
    return offset;
5048
14.8k
}
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
8.95k
{
5056
8.95k
    word16 offset;
5057
8.95k
    word16 name;
5058
8.95k
    int ret = 0;
5059
8.95k
    TLSX* extension;
5060
5061
8.95k
    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
8.95k
    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
5069
81
        return BUFFER_ERROR;
5070
8.87k
    ato16(input, &offset);
5071
    /* validating curve list length */
5072
8.87k
    if (length != OPAQUE16_LEN + offset)
5073
74
        return BUFFER_ERROR;
5074
8.79k
    offset = OPAQUE16_LEN;
5075
8.79k
    if (offset == length)
5076
12
        return 0;
5077
5078
8.78k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5079
8.78k
    if (extension == NULL) {
5080
        /* Just accept what the peer wants to use */
5081
48.3k
        for (; offset < length; offset += OPAQUE16_LEN) {
5082
39.6k
            ato16(input + offset, &name);
5083
5084
39.6k
            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
39.6k
            if (ret != WOLFSSL_SUCCESS &&
5088
39.6k
                    ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
5089
98
                break;
5090
39.5k
            ret = 0;
5091
39.5k
        }
5092
8.78k
    }
5093
4
    else {
5094
        /* Find the intersection with what the user has set */
5095
4
        SupportedCurve* commonCurves = NULL;
5096
8
        for (; offset < length; offset += OPAQUE16_LEN) {
5097
4
            SupportedCurve* foundCurve = (SupportedCurve*)extension->data;
5098
4
            ato16(input + offset, &name);
5099
5100
5
            while (foundCurve != NULL && foundCurve->name != name)
5101
1
                foundCurve = foundCurve->next;
5102
5103
4
            if (foundCurve != NULL) {
5104
3
                ret = commonCurves == NULL ?
5105
3
                      TLSX_SupportedCurve_New(&commonCurves, name, ssl->heap) :
5106
3
                      TLSX_SupportedCurve_Append(commonCurves, name, ssl->heap);
5107
3
                if (ret != 0)
5108
0
                    break;
5109
3
            }
5110
4
        }
5111
        /* If no common curves return error. In TLS 1.3 we can still try to save
5112
         * this by using HRR. */
5113
4
        if (ret == 0 && commonCurves == NULL &&
5114
4
                !IsAtLeastTLSv1_3(ssl->version))
5115
0
            ret = ECC_CURVE_ERROR;
5116
4
        if (ret == 0) {
5117
            /* Now swap out the curves in the extension */
5118
4
            TLSX_SupportedCurve_FreeAll((SupportedCurve*)extension->data,
5119
4
                                        ssl->heap);
5120
4
            extension->data = commonCurves;
5121
4
            commonCurves = NULL;
5122
4
        }
5123
4
        TLSX_SupportedCurve_FreeAll(commonCurves, ssl->heap);
5124
4
    }
5125
5126
8.78k
    return ret;
5127
8.79k
}
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
589
{
5142
589
    int ret;
5143
589
    TLSX* extension;
5144
589
    TLSX* priority = NULL;
5145
589
    TLSX* ext = NULL;
5146
589
    word16 name;
5147
589
    SupportedCurve* curve;
5148
5149
589
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5150
    /* May be doing PSK with no key exchange. */
5151
589
    if (extension == NULL)
5152
0
        return 0;
5153
5154
589
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5155
589
    if (ret != WOLFSSL_SUCCESS) {
5156
9
        TLSX_FreeAll(priority, ssl->heap);
5157
9
        return ret;
5158
9
    }
5159
5160
580
    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5161
580
    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
580
    curve = (SupportedCurve*)ext->data;
5168
580
    name = curve->name;
5169
5170
580
    curve = (SupportedCurve*)extension->data;
5171
1.71k
    while (curve != NULL) {
5172
1.19k
        if (curve->name == name)
5173
55
            break;
5174
1.13k
        curve = curve->next;
5175
1.13k
    }
5176
5177
580
    if (curve == NULL) {
5178
        /* Couldn't find the preferred group in client list. */
5179
525
        extension->resp = 1;
5180
5181
        /* Send server list back and free client list. */
5182
525
        curve = (SupportedCurve*)extension->data;
5183
525
        extension->data = ext->data;
5184
525
        ext->data = curve;
5185
525
    }
5186
5187
580
    TLSX_FreeAll(priority, ssl->heap);
5188
5189
580
    return 0;
5190
580
}
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
1.77k
{
5199
1.77k
    int ret = 0;
5200
1.77k
    SupportedCurve* group;
5201
1.77k
    const DhParams* params = NULL;
5202
5203
30.1k
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
5204
30.1k
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(serverGroup->name))
5205
28.4k
            continue;
5206
5207
3.29k
        for (group = clientGroup; group != NULL; group = group->next) {
5208
3.29k
            if (serverGroup->name != group->name)
5209
1.52k
                continue;
5210
5211
1.77k
            switch (serverGroup->name) {
5212
0
            #ifdef HAVE_FFDHE_2048
5213
1.77k
                case WOLFSSL_FFDHE_2048:
5214
1.77k
                    params = wc_Dh_ffdhe2048_Get();
5215
1.77k
                    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
1.77k
            }
5240
1.77k
            if (params == NULL) {
5241
0
                ret = BAD_FUNC_ARG;
5242
0
                break;
5243
0
            }
5244
1.77k
            if (params->p_len >= ssl->options.minDhKeySz &&
5245
1.77k
                                     params->p_len <= ssl->options.maxDhKeySz) {
5246
1.77k
                break;
5247
1.77k
            }
5248
1.77k
        }
5249
5250
1.77k
        if (ret != 0)
5251
0
            break;
5252
1.77k
        if ((group != NULL) && (serverGroup->name == group->name))
5253
1.77k
            break;
5254
1.77k
    }
5255
5256
1.77k
    if ((ret == 0) && (serverGroup != NULL) && (params != NULL)) {
5257
1.77k
        ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
5258
1.77k
        ssl->buffers.serverDH_P.length = params->p_len;
5259
1.77k
        ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
5260
1.77k
        ssl->buffers.serverDH_G.length = params->g_len;
5261
5262
1.77k
        ssl->namedGroup = serverGroup->name;
5263
1.77k
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
5264
1.77k
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
5265
1.77k
        ssl->options.dhDoKeyTest = 0;
5266
1.77k
    #endif
5267
1.77k
        ssl->options.haveDH = 1;
5268
1.77k
    }
5269
5270
1.77k
    return ret;
5271
1.77k
}
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
6.23k
{
5371
6.23k
    int ret;
5372
6.23k
    TLSX* priority = NULL;
5373
6.23k
    TLSX* ext = NULL;
5374
6.23k
    TLSX* extension;
5375
6.23k
    SupportedCurve* clientGroup;
5376
6.23k
    SupportedCurve* group;
5377
6.23k
    int found = 0;
5378
5379
6.23k
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
5380
    /* May be doing PSK with no key exchange. */
5381
6.23k
    if (extension == NULL)
5382
0
        return 0;
5383
6.23k
    clientGroup = (SupportedCurve*)extension->data;
5384
13.2k
    for (group = clientGroup; group != NULL; group = group->next) {
5385
8.94k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(group->name)) {
5386
1.89k
            found = 1;
5387
1.89k
            break;
5388
1.89k
        }
5389
8.94k
    }
5390
6.23k
    if (!found)
5391
4.33k
        return 0;
5392
5393
1.89k
    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
1.89k
    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
1.89k
    ssl->buffers.serverDH_P.buffer = NULL;
5402
1.89k
    ssl->buffers.serverDH_G.buffer = NULL;
5403
1.89k
    ssl->buffers.weOwnDH = 0;
5404
1.89k
    ssl->options.haveDH = 0;
5405
5406
1.89k
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
5407
1.89k
    if (ret == WOLFSSL_SUCCESS) {
5408
1.77k
        SupportedCurve* serverGroup;
5409
5410
1.77k
        ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
5411
1.77k
        serverGroup = (SupportedCurve*)ext->data;
5412
5413
1.77k
        ret = tlsx_ffdhe_find_group(ssl, clientGroup, serverGroup);
5414
1.77k
    }
5415
5416
1.89k
    TLSX_FreeAll(priority, ssl->heap);
5417
5418
1.89k
    return ret;
5419
6.23k
}
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
1.45k
{
5457
1.45k
    int ret;
5458
5459
    /* validating formats list length */
5460
1.45k
    if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
5461
115
        return BUFFER_ERROR;
5462
5463
1.34k
    if (isRequest) {
5464
        /* adding uncompressed point format to response */
5465
1.34k
        ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
5466
1.34k
                                                                     ssl->heap);
5467
1.34k
        if (ret != WOLFSSL_SUCCESS)
5468
10
            return ret; /* throw error */
5469
5470
1.33k
        TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
5471
1.33k
    }
5472
5473
1.33k
    return 0;
5474
1.34k
}
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
0
    #ifdef OPENSSL_EXTRA
5517
        /* skip if name is not in supported ECC range
5518
         * or disabled by user */
5519
0
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
5520
0
            continue;
5521
0
    #endif
5522
5523
        /* find supported curve */
5524
0
        switch (curve->name) {
5525
0
#ifdef HAVE_ECC
5526
0
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
5527
0
        #ifndef NO_ECC_SECP
5528
0
            case WOLFSSL_ECC_SECP160R1:
5529
0
                oid = ECC_SECP160R1_OID;
5530
0
                octets = 20;
5531
0
                break;
5532
0
        #endif /* !NO_ECC_SECP */
5533
0
        #ifdef HAVE_ECC_SECPR2
5534
0
            case WOLFSSL_ECC_SECP160R2:
5535
0
                oid = ECC_SECP160R2_OID;
5536
0
                octets = 20;
5537
0
                break;
5538
0
        #endif /* HAVE_ECC_SECPR2 */
5539
0
        #ifdef HAVE_ECC_KOBLITZ
5540
0
            case WOLFSSL_ECC_SECP160K1:
5541
0
                oid = ECC_SECP160K1_OID;
5542
0
                octets = 20;
5543
0
                break;
5544
0
        #endif /* HAVE_ECC_KOBLITZ */
5545
0
        #endif
5546
0
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
5547
0
        #ifndef NO_ECC_SECP
5548
0
            case WOLFSSL_ECC_SECP192R1:
5549
0
                oid = ECC_SECP192R1_OID;
5550
0
                octets = 24;
5551
0
                break;
5552
0
        #endif /* !NO_ECC_SECP */
5553
0
        #ifdef HAVE_ECC_KOBLITZ
5554
0
            case WOLFSSL_ECC_SECP192K1:
5555
0
                oid = ECC_SECP192K1_OID;
5556
0
                octets = 24;
5557
0
                break;
5558
0
        #endif /* HAVE_ECC_KOBLITZ */
5559
0
    #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
0
        #ifdef HAVE_ECC_KOBLITZ
5568
0
            case WOLFSSL_ECC_SECP224K1:
5569
0
                oid = ECC_SECP224K1_OID;
5570
0
                octets = 28;
5571
0
                break;
5572
0
        #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
0
        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
5584
0
            case WOLFSSL_ECC_X25519:
5585
0
                oid = ECC_X25519_OID;
5586
0
                octets = 32;
5587
0
                break;
5588
0
        #endif /* HAVE_CURVE25519 */
5589
0
#ifdef HAVE_ECC
5590
0
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
5591
0
        #ifdef HAVE_ECC_KOBLITZ
5592
0
            case WOLFSSL_ECC_SECP256K1:
5593
0
                oid = ECC_SECP256K1_OID;
5594
0
                octets = 32;
5595
0
                break;
5596
0
        #endif /* HAVE_ECC_KOBLITZ */
5597
0
        #ifdef HAVE_ECC_BRAINPOOL
5598
0
            case WOLFSSL_ECC_BRAINPOOLP256R1:
5599
0
                oid = ECC_BRAINPOOLP256R1_OID;
5600
0
                octets = 32;
5601
0
                break;
5602
0
        #endif /* HAVE_ECC_BRAINPOOL */
5603
0
        #ifdef WOLFSSL_SM2
5604
0
            case WOLFSSL_ECC_SM2P256V1:
5605
0
                oid = ECC_SM2P256V1_OID;
5606
0
                octets = 32;
5607
0
                break;
5608
0
        #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
0
        #ifdef HAVE_ECC_BRAINPOOL
5618
0
            case WOLFSSL_ECC_BRAINPOOLP384R1:
5619
0
                oid = ECC_BRAINPOOLP384R1_OID;
5620
0
                octets = 48;
5621
0
                break;
5622
0
        #endif /* HAVE_ECC_BRAINPOOL */
5623
0
    #endif
5624
0
#endif
5625
0
        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
5626
0
            case WOLFSSL_ECC_X448:
5627
0
                oid = ECC_X448_OID;
5628
0
                octets = 57;
5629
0
                break;
5630
0
        #endif /* HAVE_CURVE448 */
5631
0
#ifdef HAVE_ECC
5632
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
5633
0
        #ifdef HAVE_ECC_BRAINPOOL
5634
0
            case WOLFSSL_ECC_BRAINPOOLP512R1:
5635
0
                oid = ECC_BRAINPOOLP512R1_OID;
5636
0
                octets = 64;
5637
0
                break;
5638
0
        #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
179
{
5837
179
    TLSX* extension;
5838
179
    int ret;
5839
5840
179
    extension = TLSX_Find(src, TLSX_SUPPORTED_GROUPS);
5841
179
    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
179
    return 0;
5852
179
}
5853
5854
int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
5855
381k
{
5856
381k
    TLSX* extension = NULL;
5857
381k
    SupportedCurve* curve = NULL;
5858
381k
    int ret;
5859
5860
381k
    if (extensions == NULL) {
5861
0
        return BAD_FUNC_ARG;
5862
0
    }
5863
5864
381k
    if (! TLSX_IsGroupSupported(name)) {
5865
25.2k
        return BAD_FUNC_ARG;
5866
25.2k
    }
5867
5868
356k
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5869
5870
356k
    if (!extension) {
5871
28.4k
        ret = TLSX_SupportedCurve_New(&curve, name, heap);
5872
28.4k
        if (ret != 0)
5873
49
            return ret;
5874
5875
28.4k
        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
5876
28.4k
        if (ret != 0) {
5877
41
            XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
5878
41
            return ret;
5879
41
        }
5880
28.4k
    }
5881
327k
    else {
5882
327k
        ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
5883
327k
                                                                          heap);
5884
327k
        if (ret != 0)
5885
157
            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
327k
    }
5904
5905
355k
    return WOLFSSL_SUCCESS;
5906
356k
}
5907
5908
int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
5909
15.6k
{
5910
15.6k
    TLSX* extension = NULL;
5911
15.6k
    PointFormat* point = NULL;
5912
15.6k
    int ret = 0;
5913
5914
15.6k
    if (extensions == NULL)
5915
0
        return BAD_FUNC_ARG;
5916
5917
15.6k
    extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
5918
5919
15.6k
    if (!extension) {
5920
15.6k
        ret = TLSX_PointFormat_New(&point, format, heap);
5921
15.6k
        if (ret != 0)
5922
10
            return ret;
5923
5924
15.6k
        ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
5925
15.6k
        if (ret != 0) {
5926
5
            XFREE(point, heap, DYNAMIC_TYPE_TLSX);
5927
5
            return ret;
5928
5
        }
5929
15.6k
    }
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
15.6k
    return WOLFSSL_SUCCESS;
5938
15.6k
}
5939
5940
#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
#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
#define EC_PARSE TLSX_SupportedCurve_Parse
5957
#else
5958
#define EC_PARSE(a, b, c, d, e)   0
5959
#endif
5960
5961
#define PF_FREE_ALL          TLSX_PointFormat_FreeAll
5962
0
#define PF_VALIDATE_REQUEST  TLSX_PointFormat_ValidateRequest
5963
#define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
5964
5965
#define PF_GET_SIZE TLSX_PointFormat_GetSize
5966
0
#define PF_WRITE    TLSX_PointFormat_Write
5967
5968
#ifndef NO_WOLFSSL_SERVER
5969
#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
1.55k
{
6001
1.55k
    byte length = OPAQUE8_LEN; /* empty info length */
6002
6003
    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
6004
1.55k
    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
1.55k
    return length;
6014
1.55k
}
6015
6016
static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
6017
                                                    byte* output, int isRequest)
6018
1.45k
{
6019
1.45k
    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
6020
1.45k
    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
1.45k
    output[0] = (byte)(offset - 1);  /* info length - self */
6033
6034
1.45k
    return offset;
6035
1.45k
}
6036
6037
static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input,
6038
                                          word16 length, byte isRequest)
6039
463
{
6040
463
    int ret = WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E);
6041
6042
463
    if (length >= OPAQUE8_LEN) {
6043
463
        if (isRequest) {
6044
460
        #ifndef NO_WOLFSSL_SERVER
6045
460
            if (ssl->secure_renegotiation == NULL) {
6046
283
                ret = wolfSSL_UseSecureRenegotiation(ssl);
6047
283
                if (ret == WOLFSSL_SUCCESS)
6048
278
                    ret = 0;
6049
283
            }
6050
460
            if (ret != 0 && ret != WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E)) {
6051
5
            }
6052
455
            else if (ssl->secure_renegotiation == NULL) {
6053
0
            }
6054
455
            else if (!ssl->secure_renegotiation->enabled) {
6055
278
                if (*input == 0) {
6056
182
                    input++; /* get past size */
6057
6058
182
                    ssl->secure_renegotiation->enabled = 1;
6059
182
                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6060
182
                    ret = 0;
6061
182
                }
6062
96
                else {
6063
                    /* already in error state */
6064
96
                    WOLFSSL_MSG("SCR client verify data present");
6065
96
                }
6066
278
            }
6067
177
            else if (*input == TLS_FINISHED_SZ) {
6068
166
                if (length < TLS_FINISHED_SZ + 1) {
6069
6
                    WOLFSSL_MSG("SCR malformed buffer");
6070
6
                    ret = BUFFER_E;
6071
6
                }
6072
160
                else {
6073
160
                    input++; /* get past size */
6074
6075
                    /* validate client verify data */
6076
160
                    if (XMEMCMP(input,
6077
160
                            ssl->secure_renegotiation->client_verify_data,
6078
160
                            TLS_FINISHED_SZ) == 0) {
6079
14
                        WOLFSSL_MSG("SCR client verify data match");
6080
14
                        TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
6081
14
                        ret = 0;  /* verified */
6082
14
                    }
6083
146
                    else {
6084
                        /* already in error state */
6085
146
                        WOLFSSL_MSG("SCR client verify data Failure");
6086
146
                    }
6087
160
                }
6088
166
            }
6089
460
        #endif
6090
460
        }
6091
3
        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
3
        else {
6121
3
            ret = SECURE_RENEGOTIATION_E;
6122
3
        }
6123
463
    }
6124
0
    else {
6125
0
        ret = SECURE_RENEGOTIATION_E;
6126
0
    }
6127
6128
463
    if (ret != 0) {
6129
171
        WOLFSSL_ERROR_VERBOSE(ret);
6130
171
        SendAlert(ssl, alert_fatal, handshake_failure);
6131
171
    }
6132
6133
463
    return ret;
6134
463
}
6135
6136
int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
6137
2.85k
{
6138
2.85k
    int ret = 0;
6139
2.85k
    SecureRenegotiation* data;
6140
6141
2.85k
    data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
6142
2.85k
                                                             DYNAMIC_TYPE_TLSX);
6143
2.85k
    if (data == NULL)
6144
25
        return MEMORY_E;
6145
6146
2.83k
    XMEMSET(data, 0, sizeof(SecureRenegotiation));
6147
6148
2.83k
    ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
6149
2.83k
    if (ret != 0) {
6150
8
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
6151
8
        return ret;
6152
8
    }
6153
6154
2.82k
    return WOLFSSL_SUCCESS;
6155
2.83k
}
6156
6157
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
6158
6159
int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
6160
2.57k
{
6161
2.57k
    int ret;
6162
6163
    /* send empty renegotiation_info extension */
6164
2.57k
    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6165
2.57k
    if (ext == NULL) {
6166
2.57k
        ret = TLSX_UseSecureRenegotiation(extensions, heap);
6167
2.57k
        if (ret != WOLFSSL_SUCCESS)
6168
28
            return ret;
6169
6170
2.54k
        ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
6171
2.54k
    }
6172
2.54k
    if (ext)
6173
2.54k
        ext->resp = 1;
6174
6175
2.54k
    return WOLFSSL_SUCCESS;
6176
2.57k
}
6177
6178
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
6179
6180
6181
#define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
6182
#define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
6183
0
#define SCR_WRITE          TLSX_SecureRenegotiation_Write
6184
#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
34.0k
{
6204
34.0k
    TLSX*          extension = TLSX_Find(ssl->extensions, TLSX_SESSION_TICKET);
6205
34.0k
    SessionTicket* ticket    = extension ?
6206
0
                                         (SessionTicket*)extension->data : NULL;
6207
6208
34.0k
    if (ticket) {
6209
        /* TODO validate ticket timeout here! */
6210
0
        if (ticket->lifetime == 0xfffffff) {
6211
            /* send empty ticket on timeout */
6212
0
            TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6213
0
        }
6214
0
    }
6215
34.0k
}
6216
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
6217
6218
6219
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
6220
17.7k
{
6221
17.7k
    (void)isRequest;
6222
17.7k
    return ticket ? ticket->size : 0;
6223
17.7k
}
6224
6225
static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
6226
                                       int isRequest)
6227
17.6k
{
6228
17.6k
    word16 offset = 0; /* empty ticket */
6229
6230
17.6k
    if (isRequest && ticket) {
6231
0
        XMEMCPY(output + offset, ticket->data, ticket->size);
6232
0
        offset += ticket->size;
6233
0
    }
6234
6235
17.6k
    return offset;
6236
17.6k
}
6237
6238
6239
static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, const byte* input,
6240
                                    word16 length, byte isRequest)
6241
0
{
6242
0
    int ret = 0;
6243
6244
0
    (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
6245
6246
0
    if (!isRequest) {
6247
0
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
6248
0
            return TLSX_HandleUnsupportedExtension(ssl);
6249
6250
0
        if (length != 0)
6251
0
            return BUFFER_ERROR;
6252
6253
0
#ifndef NO_WOLFSSL_CLIENT
6254
0
        ssl->expect_session_ticket = 1;
6255
0
#endif
6256
0
    }
6257
0
#ifndef NO_WOLFSSL_SERVER
6258
0
    else {
6259
        /* server side */
6260
0
        if (ssl->ctx->ticketEncCb == NULL) {
6261
0
            WOLFSSL_MSG("Client sent session ticket, server has no callback");
6262
0
            return 0;
6263
0
        }
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
0
        if (length > SESSION_TICKET_LEN) {
6273
0
            ret = BAD_TICKET_MSG_SZ;
6274
0
            WOLFSSL_ERROR_VERBOSE(ret);
6275
0
        } else if (IsAtLeastTLSv1_3(ssl->version)) {
6276
0
            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
6277
0
            ssl->options.rejectTicket = 1;
6278
0
            ret = 0;  /* not fatal */
6279
0
        } else if (ssl->options.noTicketTls12) {
6280
            /* ignore ticket request */
6281
0
        } else if (length == 0) {
6282
            /* blank ticket */
6283
0
            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6284
0
            if (ret == WOLFSSL_SUCCESS) {
6285
0
                ret = 0;
6286
                /* send blank ticket */
6287
0
                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6288
0
                ssl->options.createTicket = 1;  /* will send ticket msg */
6289
0
                ssl->options.useTicket    = 1;
6290
0
                ssl->options.resuming     = 0;  /* no standard resumption */
6291
0
                ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
6292
0
            }
6293
0
        } else {
6294
            /* got actual ticket from client */
6295
0
            ret = DoClientTicket(ssl, input, length);
6296
0
            if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
6297
0
                WOLFSSL_MSG("Using existing client ticket");
6298
0
                ssl->options.useTicket    = 1;
6299
0
                ssl->options.resuming     = 1;
6300
                /* SERVER: ticket is peer auth. */
6301
0
                ssl->options.peerAuthGood = 1;
6302
0
            } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
6303
0
                WOLFSSL_MSG("Using existing client ticket, creating new one");
6304
0
                ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
6305
0
                if (ret == WOLFSSL_SUCCESS) {
6306
0
                    ret = 0;
6307
0
                    TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6308
                                                    /* send blank ticket */
6309
0
                    ssl->options.createTicket = 1;  /* will send ticket msg */
6310
0
                    ssl->options.useTicket    = 1;
6311
0
                    ssl->options.resuming     = 1;
6312
                    /* SERVER: ticket is peer auth. */
6313
0
                    ssl->options.peerAuthGood = 1;
6314
0
                }
6315
0
            } else if (ret == WOLFSSL_TICKET_RET_REJECT ||
6316
0
                    ret == WC_NO_ERR_TRACE(VERSION_ERROR)) {
6317
0
                WOLFSSL_MSG("Process client ticket rejected, not using");
6318
0
                if (ret == WC_NO_ERR_TRACE(VERSION_ERROR))
6319
0
                    WOLFSSL_MSG("\tbad TLS version");
6320
0
                ret = 0;  /* not fatal */
6321
6322
0
                ssl->options.rejectTicket = 1;
6323
                /* If we have session tickets enabled then send a new ticket */
6324
0
                if (!TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET)) {
6325
0
                    ret = TLSX_UseSessionTicket(&ssl->extensions, NULL,
6326
0
                                                ssl->heap);
6327
0
                    if (ret == WOLFSSL_SUCCESS) {
6328
0
                        ret = 0;
6329
0
                        TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
6330
0
                        ssl->options.createTicket = 1;
6331
0
                        ssl->options.useTicket    = 1;
6332
0
                    }
6333
0
                }
6334
0
            } else if (ret == WOLFSSL_TICKET_RET_FATAL) {
6335
0
                WOLFSSL_MSG("Process client ticket fatal error, not using");
6336
0
            } else if (ret < 0) {
6337
0
                WOLFSSL_MSG("Process client ticket unknown error, not using");
6338
0
            }
6339
0
        }
6340
0
    }
6341
0
#endif /* NO_WOLFSSL_SERVER */
6342
6343
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
6344
    (void)ssl;
6345
#endif
6346
6347
0
    return ret;
6348
0
}
6349
6350
WOLFSSL_LOCAL SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
6351
                                            byte* data, word16 size, void* heap)
6352
0
{
6353
0
    SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
6354
0
                                                       heap, DYNAMIC_TYPE_TLSX);
6355
0
    if (ticket) {
6356
0
        ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
6357
0
        if (ticket->data == NULL) {
6358
0
            XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
6359
0
            return NULL;
6360
0
        }
6361
6362
0
        XMEMCPY(ticket->data, data, size);
6363
0
        ticket->size     = size;
6364
0
        ticket->lifetime = lifetime;
6365
0
    }
6366
6367
0
    (void)heap;
6368
6369
0
    return ticket;
6370
0
}
6371
WOLFSSL_LOCAL void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
6372
951
{
6373
951
    if (ticket) {
6374
0
        XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
6375
0
        XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
6376
0
    }
6377
6378
951
    (void)heap;
6379
951
}
6380
6381
int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
6382
982
{
6383
982
    int ret = 0;
6384
6385
982
    if (extensions == NULL)
6386
0
        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
982
    if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
6391
982
                                                                           != 0)
6392
3
        return ret;
6393
6394
979
    return WOLFSSL_SUCCESS;
6395
982
}
6396
6397
0
#define WOLF_STK_VALIDATE_REQUEST TLSX_SessionTicket_ValidateRequest
6398
#define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
6399
0
#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
#define WOLF_STK_FREE(a, b) WC_DO_NOTHING
6406
#define WOLF_STK_VALIDATE_REQUEST(a) WC_DO_NOTHING
6407
#define WOLF_STK_GET_SIZE(a, b)      0
6408
#define WOLF_STK_WRITE(a, b, c)      0
6409
#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
18.6k
{
6431
18.6k
    (void)pSz;
6432
6433
18.6k
    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
18.6k
    return 0;
6441
18.6k
}
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
18.5k
{
6456
18.5k
    (void)data;
6457
18.5k
    (void)output;
6458
18.5k
    (void)pSz;
6459
6460
18.5k
    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
18.5k
    return 0;
6468
18.5k
}
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
2.29k
{
6485
2.29k
    int ret;
6486
6487
2.29k
    (void)input;
6488
6489
2.29k
    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
2.29k
    if (length != 0)
6496
26
        return BUFFER_ERROR;
6497
6498
2.26k
    if (msgType == client_hello) {
6499
        /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
6500
2.25k
        if (!ssl->options.disallowEncThenMac) {
6501
2.25k
            ssl->options.encThenMac = 1;
6502
            /* Set the extension reply. */
6503
2.25k
            ret = TLSX_EncryptThenMac_Use(ssl);
6504
2.25k
            if (ret != 0)
6505
36
                return ret;
6506
2.25k
        }
6507
2.22k
        return 0;
6508
2.25k
    }
6509
6510
    /* Server Hello */
6511
5
    if (ssl->options.disallowEncThenMac) {
6512
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6513
0
        return SANITY_MSG_E;
6514
0
    }
6515
6516
5
    ssl->options.encThenMac = 1;
6517
5
    return 0;
6518
6519
5
}
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
19.9k
{
6529
19.9k
    int   ret = 0;
6530
19.9k
    TLSX* extension;
6531
6532
    /* Find the Encrypt-Then-Mac extension if it exists. */
6533
19.9k
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6534
19.9k
    if (extension == NULL) {
6535
        /* Push new Encrypt-Then-Mac extension. */
6536
19.8k
        ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
6537
19.8k
            ssl->heap);
6538
19.8k
        if (ret != 0)
6539
42
            return ret;
6540
19.8k
    }
6541
6542
19.9k
    return 0;
6543
19.9k
}
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
1.63k
{
6553
1.63k
    TLSX* extension;
6554
6555
1.63k
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
6556
1.63k
    if (extension == NULL)
6557
0
        return EXT_MISSING;
6558
1.63k
    extension->resp = 1;
6559
6560
1.63k
    return 0;
6561
1.63k
}
6562
6563
#define ETM_GET_SIZE  TLSX_EncryptThenMac_GetSize
6564
0
#define ETM_WRITE     TLSX_EncryptThenMac_Write
6565
#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
{
6782
    (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
    return a > b;
6791
}
6792
6793
static WC_INLINE int versionIsLesser(byte isDtls, byte a, byte b)
6794
{
6795
    (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
    return a < b;
6804
}
6805
6806
static WC_INLINE int versionIsAtLeast(byte isDtls, byte a, byte b)
6807
{
6808
    (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
    return a >= b;
6817
}
6818
6819
static WC_INLINE int versionIsLessEqual(byte isDtls, byte a, byte b)
6820
{
6821
    (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
    return a <= b;
6830
}
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
0
        #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6859
0
            defined(WOLFSSL_WPAS_SMALL)
6860
0
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
6861
0
        #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
0
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6871
0
    defined(WOLFSSL_WPAS_SMALL)
6872
0
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
6873
0
#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
0
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6956
0
    defined(WOLFSSL_WPAS_SMALL)
6957
0
            && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == 0
6958
0
#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
0
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6976
0
                defined(WOLFSSL_WPAS_SMALL)
6977
0
                && (ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == 0
6978
0
            #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
{
7043
    /* The client's greatest minor version that we support */
7044
    byte clientGreatestMinor = SSLv3_MINOR;
7045
    int ret;
7046
    byte major, minor;
7047
    byte tls13minor, tls12minor;
7048
    byte isDtls;
7049
7050
    tls13minor = TLSv1_3_MINOR;
7051
    tls12minor = TLSv1_2_MINOR;
7052
    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
    if (msgType == client_hello) {
7063
        int i;
7064
        int len;
7065
        int set = 0;
7066
7067
        /* Must contain a length and at least one version. */
7068
        if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1)
7069
            return BUFFER_ERROR;
7070
7071
        len = *input;
7072
7073
        /* Protocol version array must fill rest of data. */
7074
        if (length != (word16)OPAQUE8_LEN + len)
7075
            return BUFFER_ERROR;
7076
7077
        input++;
7078
7079
        /* Find first match. */
7080
        for (i = 0; i < len; i += OPAQUE16_LEN) {
7081
            major = input[i];
7082
            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
            if (major == TLS_DRAFT_MAJOR)
7091
                continue;
7092
#endif
7093
7094
            if (major != ssl->ctx->method->version.major)
7095
                continue;
7096
7097
            /* No upgrade allowed. */
7098
            if (versionIsGreater(isDtls, minor, ssl->version.minor))
7099
                continue;
7100
7101
            /* Check downgrade. */
7102
            if (versionIsLesser(isDtls, minor, ssl->version.minor)) {
7103
                if (!ssl->options.downgrade)
7104
                    continue;
7105
7106
                if (versionIsLesser(isDtls, minor, ssl->options.minDowngrade))
7107
                    continue;
7108
            }
7109
            if (versionIsGreater(isDtls, minor, clientGreatestMinor))
7110
                clientGreatestMinor = minor;
7111
7112
            set = 1;
7113
        }
7114
        if (!set) {
7115
            /* No common supported version was negotiated */
7116
            SendAlert((WOLFSSL*)ssl, alert_fatal,
7117
                      wolfssl_alert_protocol_version);
7118
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7119
            return VERSION_ERROR;
7120
        }
7121
        pv->minor = clientGreatestMinor;
7122
        if (versionIsAtLeast(isDtls, clientGreatestMinor, tls13minor)) {
7123
            if (opts != NULL)
7124
                opts->tls1_3 = 1;
7125
7126
            /* TLS v1.3 requires supported version extension */
7127
            if (exts != NULL &&
7128
                    TLSX_Find(*exts, TLSX_SUPPORTED_VERSIONS) == NULL) {
7129
                ret = TLSX_Push(exts,
7130
                          TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
7131
                if (ret != 0) {
7132
                    return ret;
7133
                }
7134
                /* *exts should be pointing to the TLSX_SUPPORTED_VERSIONS
7135
                 * ext in the list since it was pushed. */
7136
                (*exts)->resp = 1;
7137
            }
7138
        }
7139
7140
    }
7141
    else if (msgType == server_hello || msgType == hello_retry_request) {
7142
        /* Must contain one version. */
7143
        if (length != OPAQUE16_LEN)
7144
            return BUFFER_ERROR;
7145
7146
        major = input[0];
7147
        minor = input[OPAQUE8_LEN];
7148
7149
        if (major != ssl->ctx->method->version.major) {
7150
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7151
            return VERSION_ERROR;
7152
        }
7153
7154
        /* Can't downgrade with this extension below TLS v1.3. */
7155
        if (versionIsLesser(isDtls, minor, tls13minor)) {
7156
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7157
            return VERSION_ERROR;
7158
        }
7159
7160
        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
7161
        if (ssl->options.downgrade && ssl->version.minor == tls12minor) {
7162
            /* Set minor version back to TLS v1.3+ */
7163
            pv->minor = ssl->ctx->method->version.minor;
7164
        }
7165
7166
        /* No upgrade allowed. */
7167
        if (versionIsLesser(isDtls, ssl->version.minor, minor)) {
7168
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7169
            return VERSION_ERROR;
7170
        }
7171
7172
        /* Check downgrade. */
7173
        if (versionIsGreater(isDtls, ssl->version.minor, minor)) {
7174
            if (!ssl->options.downgrade) {
7175
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7176
                return VERSION_ERROR;
7177
            }
7178
7179
            if (versionIsLesser(
7180
                    isDtls, minor, ssl->options.minDowngrade)) {
7181
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
7182
                return VERSION_ERROR;
7183
            }
7184
7185
            /* Downgrade the version. */
7186
            pv->minor = minor;
7187
        }
7188
    }
7189
    else {
7190
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
7191
        return SANITY_MSG_E;
7192
    }
7193
7194
    return 0;
7195
}
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
3.33k
{
7207
3.33k
    if (extensions == NULL || data == NULL)
7208
0
        return BAD_FUNC_ARG;
7209
7210
3.33k
    return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, data, heap);
7211
3.33k
}
7212
7213
#define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
7214
0
#define SV_WRITE     TLSX_SupportedVersions_Write
7215
3.00k
#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
0
{
7424
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7425
0
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7426
0
    word16 size = 0;
7427
7428
0
    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
0
        WOLFSSL_MSG("We don't currently support sending the client's list.");
7434
0
        return 0;
7435
0
    }
7436
7437
    /* Length of names */
7438
0
    size += OPAQUE16_LEN;
7439
0
    for (names = SSL_CA_NAMES(ssl); names != NULL; names = names->next) {
7440
0
        byte seq[MAX_SEQ_SZ];
7441
0
        WOLFSSL_X509_NAME* name = names->data.name;
7442
7443
0
        if (name != NULL) {
7444
            /* 16-bit length | SEQ | Len | DER of name */
7445
0
            size += (word16)(OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
7446
0
                             name->rawLen);
7447
0
        }
7448
0
    }
7449
0
    return size;
7450
0
}
7451
7452
static word16 TLSX_CA_Names_Write(void* data, byte* output)
7453
0
{
7454
0
    WOLFSSL* ssl = (WOLFSSL*)data;
7455
0
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
7456
0
    byte* len;
7457
7458
0
    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
0
        WOLFSSL_MSG("We don't currently support sending the client's list.");
7464
0
        return 0;
7465
0
    }
7466
7467
    /* Reserve space for the length value */
7468
0
    len = output;
7469
0
    output += OPAQUE16_LEN;
7470
0
    for (names = SSL_CA_NAMES(ssl); names != NULL; names = names->next) {
7471
0
        byte seq[MAX_SEQ_SZ];
7472
0
        WOLFSSL_X509_NAME* name = names->data.name;
7473
7474
0
        if (name != NULL) {
7475
0
            c16toa((word16)name->rawLen +
7476
0
                   (word16)SetSequence(name->rawLen, seq), output);
7477
0
            output += OPAQUE16_LEN;
7478
0
            output += SetSequence(name->rawLen, output);
7479
0
            XMEMCPY(output, name->raw, name->rawLen);
7480
0
            output += name->rawLen;
7481
0
        }
7482
0
    }
7483
    /* Write the total length */
7484
0
    c16toa((word16)(output - len - OPAQUE16_LEN), len);
7485
0
    return (word16)(output - len);
7486
0
}
7487
7488
static int TLSX_CA_Names_Parse(WOLFSSL *ssl, const byte* input,
7489
                                  word16 length, byte isRequest)
7490
55
{
7491
55
    word16 extLen;
7492
7493
55
    (void)isRequest;
7494
7495
55
    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
55
        WOLFSSL_MSG("We don't currently support parsing the client's list.");
7501
55
        return 0;
7502
55
    }
7503
7504
0
    if (ssl->client_ca_names != ssl->ctx->client_ca_names)
7505
0
        wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
7506
0
    ssl->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
7507
0
    if (ssl->client_ca_names == NULL)
7508
0
        return MEMORY_ERROR;
7509
7510
0
    if (length < OPAQUE16_LEN)
7511
0
        return BUFFER_ERROR;
7512
7513
0
    ato16(input, &extLen);
7514
0
    input += OPAQUE16_LEN;
7515
0
    length -= OPAQUE16_LEN;
7516
0
    if (extLen != length)
7517
0
        return BUFFER_ERROR;
7518
7519
0
    while (length) {
7520
0
        word32 idx = 0;
7521
0
        WOLFSSL_X509_NAME* name = NULL;
7522
0
        int ret = 0;
7523
0
        int didInit = FALSE;
7524
        /* Use a DecodedCert struct to get access to GetName to
7525
         * parse DN name */
7526
0
#ifdef WOLFSSL_SMALL_STACK
7527
0
        DecodedCert *cert = (DecodedCert *)XMALLOC(
7528
0
            sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
7529
0
        if (cert == NULL)
7530
0
            return MEMORY_ERROR;
7531
#else
7532
        DecodedCert cert[1];
7533
#endif
7534
7535
0
        if (length < OPAQUE16_LEN) {
7536
0
            ret = BUFFER_ERROR;
7537
0
        }
7538
7539
0
        if (ret == 0) {
7540
0
            ato16(input, &extLen);
7541
0
            idx += OPAQUE16_LEN;
7542
7543
0
            if (idx + extLen > length)
7544
0
                ret = BUFFER_ERROR;
7545
0
        }
7546
7547
0
        if (ret == 0) {
7548
0
            InitDecodedCert(cert, input + idx, extLen, ssl->heap);
7549
0
            didInit = TRUE;
7550
0
            idx += extLen;
7551
0
            ret = GetName(cert, ASN_SUBJECT, extLen);
7552
0
        }
7553
7554
0
        if (ret == 0 && (name = wolfSSL_X509_NAME_new()) == NULL)
7555
0
            ret = MEMORY_ERROR;
7556
7557
0
        if (ret == 0) {
7558
0
            CopyDecodedName(name, cert, ASN_SUBJECT);
7559
0
            if (wolfSSL_sk_X509_NAME_push(ssl->client_ca_names, name) <= 0)
7560
0
                ret = MEMORY_ERROR;
7561
0
        }
7562
7563
0
        if (didInit)
7564
0
            FreeDecodedCert(cert);
7565
7566
0
#ifdef WOLFSSL_SMALL_STACK
7567
0
        XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
7568
0
#endif
7569
0
        if (ret != 0)
7570
0
            return ret;
7571
7572
0
        input += idx;
7573
0
        length -= (word16)idx;
7574
0
    }
7575
0
    return 0;
7576
0
}
7577
7578
#define CAN_GET_SIZE(data)      TLSX_CA_Names_GetSize(data)
7579
0
#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
17.0k
{
7604
17.0k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7605
7606
17.0k
    if (sa->hashSigAlgoSz == 0)
7607
17.0k
        return OPAQUE16_LEN + WOLFSSL_SUITES(sa->ssl)->hashSigAlgoSz;
7608
0
    else
7609
0
        return OPAQUE16_LEN + sa->hashSigAlgoSz;
7610
17.0k
}
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
20.7k
{
7625
20.7k
    word16 i;
7626
7627
20.7k
    if ((length & 1) == 1)
7628
0
        return BUFFER_ERROR;
7629
7630
20.7k
    ssl->pssAlgo = 0;
7631
362k
    for (i = 0; i < length; i += 2) {
7632
341k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
7633
55.6k
            ssl->pssAlgo |= 1 << input[i + 1];
7634
341k
    #ifdef WOLFSSL_TLS13
7635
341k
        if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
7636
341k
                                                   input[i + 1] <= pss_sha512) {
7637
52.3k
            ssl->pssAlgo |= 1 << input[i + 1];
7638
52.3k
        }
7639
341k
    #endif
7640
341k
    }
7641
7642
20.7k
    return 0;
7643
20.7k
}
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
17.0k
{
7653
17.0k
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
7654
17.0k
    const Suites* suites = WOLFSSL_SUITES(sa->ssl);
7655
17.0k
    word16 hashSigAlgoSz;
7656
7657
17.0k
    if (sa->hashSigAlgoSz == 0) {
7658
17.0k
        c16toa(suites->hashSigAlgoSz, output);
7659
17.0k
        XMEMCPY(output + OPAQUE16_LEN, suites->hashSigAlgo,
7660
17.0k
                suites->hashSigAlgoSz);
7661
17.0k
        hashSigAlgoSz = suites->hashSigAlgoSz;
7662
17.0k
    }
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
17.0k
#ifndef NO_RSA
7671
17.0k
    TLSX_SignatureAlgorithms_MapPss(sa->ssl, output + OPAQUE16_LEN,
7672
17.0k
            hashSigAlgoSz);
7673
17.0k
#endif
7674
7675
17.0k
    return OPAQUE16_LEN + hashSigAlgoSz;
7676
17.0k
}
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
3.82k
{
7688
3.82k
    word16 len;
7689
7690
3.82k
    if (!isRequest)
7691
0
        return BUFFER_ERROR;
7692
7693
    /* Must contain a length and at least algorithm. */
7694
3.82k
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7695
36
        return BUFFER_ERROR;
7696
7697
3.79k
    ato16(input, &len);
7698
3.79k
    input += OPAQUE16_LEN;
7699
7700
    /* Algorithm array must fill rest of data. */
7701
3.79k
    if (length != OPAQUE16_LEN + len)
7702
127
        return BUFFER_ERROR;
7703
7704
    /* Sig Algo list size must be even. */
7705
3.66k
    if (suites->hashSigAlgoSz % 2 != 0)
7706
0
        return BUFFER_ERROR;
7707
7708
    /* truncate hashSigAlgo list if too long */
7709
3.66k
    suites->hashSigAlgoSz = len;
7710
3.66k
    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7711
69
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7712
69
        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7713
69
    }
7714
3.66k
    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
7715
7716
3.66k
    return TLSX_SignatureAlgorithms_MapPss(ssl, input, len);
7717
3.66k
}
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
30.4k
{
7729
30.4k
    SignatureAlgorithms* sa;
7730
30.4k
    int ret;
7731
7732
30.4k
    if (extensions == NULL)
7733
0
        return BAD_FUNC_ARG;
7734
7735
    /* Already present */
7736
30.4k
    if (TLSX_Find(*extensions, TLSX_SIGNATURE_ALGORITHMS) != NULL)
7737
89
        return 0;
7738
7739
30.3k
    sa = TLSX_SignatureAlgorithms_New(ssl, 0, heap);
7740
30.3k
    if (sa == NULL)
7741
56
        return MEMORY_ERROR;
7742
7743
30.2k
    ret = TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, sa, heap);
7744
30.2k
    if (ret != 0)
7745
104
        TLSX_SignatureAlgorithms_FreeAll(sa, heap);
7746
30.2k
    return ret;
7747
30.3k
}
7748
7749
SignatureAlgorithms* TLSX_SignatureAlgorithms_New(WOLFSSL* ssl,
7750
        word16 hashSigAlgoSz, void* heap)
7751
30.3k
{
7752
30.3k
    SignatureAlgorithms* sa;
7753
30.3k
    (void)heap;
7754
7755
30.3k
    sa = (SignatureAlgorithms*)XMALLOC(sizeof(*sa) + hashSigAlgoSz, heap,
7756
30.3k
                                       DYNAMIC_TYPE_TLSX);
7757
30.3k
    if (sa != NULL) {
7758
30.2k
        XMEMSET(sa, 0, sizeof(*sa) + hashSigAlgoSz);
7759
30.2k
        sa->ssl = ssl;
7760
30.2k
        sa->hashSigAlgoSz = hashSigAlgoSz;
7761
30.2k
    }
7762
30.3k
    return sa;
7763
30.3k
}
7764
7765
void TLSX_SignatureAlgorithms_FreeAll(SignatureAlgorithms* sa,
7766
                                             void* heap)
7767
30.2k
{
7768
30.2k
    XFREE(sa, heap, DYNAMIC_TYPE_TLSX);
7769
30.2k
    (void)heap;
7770
30.2k
}
7771
7772
#define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
7773
0
#define SA_WRITE     TLSX_SignatureAlgorithms_Write
7774
#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
7775
#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
65
{
7821
65
    word16 len;
7822
7823
65
    if (!isRequest)
7824
0
        return BUFFER_ERROR;
7825
7826
    /* Must contain a length and at least algorithm. */
7827
65
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
7828
7
        return BUFFER_ERROR;
7829
7830
58
    ato16(input, &len);
7831
58
    input += OPAQUE16_LEN;
7832
7833
    /* Algorithm array must fill rest of data. */
7834
58
    if (length != OPAQUE16_LEN + len)
7835
45
        return BUFFER_ERROR;
7836
7837
    /* truncate hashSigAlgo list if too long */
7838
13
    ssl->certHashSigAlgoSz = len;
7839
13
    if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
7840
2
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
7841
2
        ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
7842
2
    }
7843
13
    XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
7844
7845
13
    return 0;
7846
58
}
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
#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
7865
0
#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
7866
#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
278
{
7884
278
    int ret = 0;
7885
278
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
7886
278
    word32 pSz = 0, pvtSz = 0;
7887
278
    DhKey* dhKey = (DhKey*)kse->key;
7888
7889
    /* Pick the parameters from the named group. */
7890
278
#ifdef HAVE_PUBLIC_FFDHE
7891
278
    const DhParams* params = NULL;
7892
278
    switch (kse->group) {
7893
0
    #ifdef HAVE_FFDHE_2048
7894
278
        case WOLFSSL_FFDHE_2048:
7895
278
            params = wc_Dh_ffdhe2048_Get();
7896
278
            pvtSz = 29;
7897
278
            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
278
    }
7926
278
    if (params == NULL)
7927
0
        return BAD_FUNC_ARG;
7928
278
    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
278
    if (kse->pubKey == NULL || kse->privKey == NULL) {
7942
277
        if (kse->key == NULL) {
7943
277
            kse->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
7944
277
                DYNAMIC_TYPE_DH);
7945
277
            if (kse->key == NULL)
7946
1
                return MEMORY_E;
7947
7948
            /* Setup Key */
7949
276
            ret = wc_InitDhKey_ex((DhKey*)kse->key, ssl->heap, ssl->devId);
7950
276
            if (ret == 0) {
7951
276
                dhKey = (DhKey*)kse->key;
7952
276
            #ifdef HAVE_PUBLIC_FFDHE
7953
276
                ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
7954
276
                                                                 params->g_len);
7955
            #else
7956
                ret = wc_DhSetNamedKey(dhKey, kse->group);
7957
            #endif
7958
276
            }
7959
276
        }
7960
7961
        /* Allocate space for the private and public key */
7962
276
        if (ret == 0 && kse->pubKey == NULL) {
7963
276
            kse->pubKey = (byte*)XMALLOC(pSz, ssl->heap,
7964
276
                DYNAMIC_TYPE_PUBLIC_KEY);
7965
276
            if (kse->pubKey == NULL)
7966
1
                ret = MEMORY_E;
7967
276
        }
7968
7969
276
        if (ret == 0 && kse->privKey == NULL) {
7970
275
            kse->privKey = (byte*)XMALLOC(pvtSz, ssl->heap,
7971
275
                DYNAMIC_TYPE_PRIVATE_KEY);
7972
275
            if (kse->privKey == NULL)
7973
1
                ret = MEMORY_E;
7974
275
        }
7975
7976
276
        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
274
            {
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
274
                kse->pubKeyLen = pSz;
7995
274
                kse->keyLen = pvtSz;
7996
274
                ret = DhGenKeyPair(ssl, dhKey,
7997
274
                    (byte*)kse->privKey, &kse->keyLen, /* private */
7998
274
                    kse->pubKey, &kse->pubKeyLen /* public */
7999
274
                );
8000
            #ifdef WOLFSSL_ASYNC_CRYPT
8001
                if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
8002
                    return ret;
8003
                }
8004
            #endif
8005
274
            }
8006
274
        }
8007
276
    }
8008
8009
277
    if (ret == 0) {
8010
157
        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
157
        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
157
    }
8031
8032
    /* Always release the DH key to free up memory.
8033
     * The DhKey will be setup again in TLSX_KeyShare_ProcessDh */
8034
277
    if (dhKey != NULL)
8035
276
        wc_FreeDhKey(dhKey);
8036
277
    XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
8037
277
    kse->key = NULL;
8038
8039
277
    if (ret != 0) {
8040
        /* Cleanup on error, otherwise data owned by key share entry */
8041
120
        if (kse->privKey) {
8042
118
            ForceZero(kse->privKey, pvtSz);
8043
118
            XFREE(kse->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8044
118
            kse->privKey = NULL;
8045
118
        }
8046
120
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8047
120
        kse->pubKey = NULL;
8048
120
    }
8049
#else
8050
    (void)ssl;
8051
    (void)kse;
8052
8053
    ret = NOT_COMPILED_IN;
8054
    WOLFSSL_ERROR_VERBOSE(ret);
8055
#endif
8056
8057
277
    return ret;
8058
278
}
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
593
{
8069
593
    int ret = 0;
8070
593
#ifdef HAVE_CURVE25519
8071
593
    curve25519_key* key = (curve25519_key*)kse->key;
8072
8073
593
    if (kse->key == NULL) {
8074
        /* Allocate a Curve25519 key to hold private key. */
8075
591
        kse->key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
8076
591
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8077
591
        if (kse->key == NULL) {
8078
2
            WOLFSSL_MSG("GenX25519Key memory error");
8079
2
            return MEMORY_E;
8080
2
        }
8081
8082
        /* Make an Curve25519 key. */
8083
589
        ret = wc_curve25519_init_ex((curve25519_key*)kse->key, ssl->heap,
8084
589
            INVALID_DEVID);
8085
589
        if (ret == 0) {
8086
            /* setting "key" means okay to call wc_curve25519_free */
8087
589
            key = (curve25519_key*)kse->key;
8088
589
            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
589
            {
8095
589
                ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
8096
589
            }
8097
589
        }
8098
589
    }
8099
8100
591
    if (ret == 0 && kse->pubKey == NULL) {
8101
        /* Allocate space for the public key. */
8102
578
        kse->pubKey = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
8103
578
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8104
578
        if (kse->pubKey == NULL) {
8105
1
            WOLFSSL_MSG("GenX25519Key pub memory error");
8106
1
            ret = MEMORY_E;
8107
1
        }
8108
578
    }
8109
8110
591
    if (ret == 0) {
8111
        /* Export Curve25519 public key. */
8112
579
        kse->pubKeyLen = CURVE25519_KEYSIZE;
8113
579
        if (wc_curve25519_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8114
579
                                                  EC25519_LITTLE_ENDIAN) != 0) {
8115
0
            ret = ECC_EXPORT_ERROR;
8116
0
            WOLFSSL_ERROR_VERBOSE(ret);
8117
0
        }
8118
579
        kse->pubKeyLen = CURVE25519_KEYSIZE; /* always CURVE25519_KEYSIZE */
8119
579
    }
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
591
    if (ret != 0) {
8129
        /* Data owned by key share entry otherwise. */
8130
12
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8131
12
        kse->pubKey = NULL;
8132
12
        if (key != NULL)
8133
12
            wc_curve25519_free(key);
8134
12
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8135
12
        kse->key = NULL;
8136
12
    }
8137
#else
8138
    (void)ssl;
8139
    (void)kse;
8140
8141
    ret = NOT_COMPILED_IN;
8142
    WOLFSSL_ERROR_VERBOSE(ret);
8143
#endif /* HAVE_CURVE25519 */
8144
8145
591
    return ret;
8146
593
}
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
26
{
8157
26
    int ret = 0;
8158
26
#ifdef HAVE_CURVE448
8159
26
    curve448_key* key = (curve448_key*)kse->key;
8160
8161
26
    if (kse->key == NULL) {
8162
        /* Allocate a Curve448 key to hold private key. */
8163
24
        kse->key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
8164
24
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
8165
24
        if (kse->key == NULL) {
8166
1
            WOLFSSL_MSG("GenX448Key memory error");
8167
1
            return MEMORY_E;
8168
1
        }
8169
8170
        /* Make an Curve448 key. */
8171
23
        ret = wc_curve448_init((curve448_key*)kse->key);
8172
23
        if (ret == 0) {
8173
23
            key = (curve448_key*)kse->key;
8174
23
            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
23
            {
8181
23
                ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
8182
23
            }
8183
23
        }
8184
23
    }
8185
8186
25
    if (ret == 0 && kse->pubKey == NULL) {
8187
        /* Allocate space for the public key. */
8188
21
        kse->pubKey = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
8189
21
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
8190
21
        if (kse->pubKey == NULL) {
8191
1
            WOLFSSL_MSG("GenX448Key pub memory error");
8192
1
            ret = MEMORY_E;
8193
1
        }
8194
21
    }
8195
8196
25
    if (ret == 0) {
8197
        /* Export Curve448 public key. */
8198
22
        kse->pubKeyLen = CURVE448_KEY_SIZE;
8199
22
        if (wc_curve448_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
8200
22
                                                    EC448_LITTLE_ENDIAN) != 0) {
8201
0
            ret = ECC_EXPORT_ERROR;
8202
0
        }
8203
22
        kse->pubKeyLen = CURVE448_KEY_SIZE; /* always CURVE448_KEY_SIZE */
8204
22
    }
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
25
    if (ret != 0) {
8214
        /* Data owned by key share entry otherwise. */
8215
3
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8216
3
        kse->pubKey = NULL;
8217
3
        if (key != NULL)
8218
3
            wc_curve448_free(key);
8219
3
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8220
3
        kse->key = NULL;
8221
3
    }
8222
#else
8223
    (void)ssl;
8224
    (void)kse;
8225
8226
    ret = NOT_COMPILED_IN;
8227
    WOLFSSL_ERROR_VERBOSE(ret);
8228
#endif /* HAVE_CURVE448 */
8229
8230
25
    return ret;
8231
26
}
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
0
        #ifdef WOLFSSL_SM2
8259
0
        case WOLFSSL_ECC_SM2P256V1:
8260
0
            curveId = ECC_SM2P256V1;
8261
0
            keySize = 32;
8262
0
            break;
8263
0
        #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
    KyberKey kem[1];
8541
    byte* privKey = NULL;
8542
    word32 privSz = 0;
8543
#else
8544
    KyberKey* kem = NULL;
8545
#endif
8546
8547
    /* This gets called twice. Once during parsing of the key share and once
8548
     * during the population of the extension. No need to do work the second
8549
     * time. Just return success if its already been done. */
8550
    if (kse->pubKey != NULL) {
8551
        return ret;
8552
    }
8553
8554
    /* Get the type of key we need from the key share group. */
8555
    ret = mlkem_id2type(kse->group, &type);
8556
    if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) {
8557
        WOLFSSL_MSG("Invalid Kyber algorithm specified.");
8558
        ret = BAD_FUNC_ARG;
8559
    }
8560
8561
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8562
    if (ret == 0) {
8563
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
8564
        if (ret != 0) {
8565
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
8566
        }
8567
    }
8568
8569
    if (ret == 0) {
8570
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
8571
    }
8572
    if (ret == 0) {
8573
        ret = wc_KyberKey_PublicKeySize(kem, &kse->pubKeyLen);
8574
    }
8575
8576
    if (ret == 0) {
8577
        privKey = (byte*)XMALLOC(privSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8578
        if (privKey == NULL) {
8579
            WOLFSSL_MSG("privkey memory allocation failure");
8580
            ret = MEMORY_ERROR;
8581
        }
8582
    }
8583
#else
8584
    if (ret == 0) {
8585
        /* Allocate a Kyber key to hold private key. */
8586
        kem = (KyberKey*)XMALLOC(sizeof(KyberKey), ssl->heap,
8587
                                 DYNAMIC_TYPE_PRIVATE_KEY);
8588
        if (kem == NULL) {
8589
            WOLFSSL_MSG("KEM memory allocation failure");
8590
            ret = MEMORY_ERROR;
8591
        }
8592
    }
8593
    if (ret == 0) {
8594
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
8595
        if (ret != 0) {
8596
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
8597
        }
8598
    }
8599
    if (ret == 0) {
8600
        ret = wc_KyberKey_PublicKeySize(kem, &kse->pubKeyLen);
8601
    }
8602
#endif
8603
8604
    if (ret == 0) {
8605
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
8606
                                     DYNAMIC_TYPE_PUBLIC_KEY);
8607
        if (kse->pubKey == NULL) {
8608
            WOLFSSL_MSG("pubkey memory allocation failure");
8609
            ret = MEMORY_ERROR;
8610
        }
8611
    }
8612
8613
    if (ret == 0) {
8614
        ret = wc_KyberKey_MakeKey(kem, ssl->rng);
8615
        if (ret != 0) {
8616
            WOLFSSL_MSG("Kyber keygen failure");
8617
        }
8618
    }
8619
    if (ret == 0) {
8620
        ret = wc_KyberKey_EncodePublicKey(kem, kse->pubKey,
8621
                                          kse->pubKeyLen);
8622
    }
8623
8624
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8625
    if (ret == 0) {
8626
        ret = wc_KyberKey_EncodePrivateKey(kem, privKey, privSz);
8627
    }
8628
#endif
8629
8630
#ifdef WOLFSSL_DEBUG_TLS
8631
    WOLFSSL_MSG("Public Kyber Key");
8632
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
8633
#endif
8634
8635
    if (ret != 0) {
8636
        /* Data owned by key share entry otherwise. */
8637
        wc_KyberKey_Free(kem);
8638
        XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8639
        kse->pubKey = NULL;
8640
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8641
        if (privKey) {
8642
            ForceZero(privKey, privSz);
8643
            XFREE(privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8644
            privKey = NULL;
8645
        }
8646
    #else
8647
        XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8648
        kse->key = NULL;
8649
    #endif
8650
    }
8651
    else {
8652
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8653
        wc_KyberKey_Free(kem);
8654
        kse->privKey = (byte*)privKey;
8655
        kse->privKeyLen = privSz;
8656
    #else
8657
        kse->key = kem;
8658
    #endif
8659
    }
8660
8661
    return ret;
8662
}
8663
8664
/* Create a key share entry using both ecdhe and pqc parameters groups.
8665
 * Generates two key pairs on the client side.
8666
 *
8667
 * ssl   The SSL/TLS object.
8668
 * kse   The key share entry object.
8669
 * returns 0 on success, otherwise failure.
8670
 */
8671
static int TLSX_KeyShare_GenPqcHybridKeyClient(WOLFSSL *ssl, KeyShareEntry* kse)
8672
{
8673
    int ret = 0;
8674
    KeyShareEntry *ecc_kse = NULL;
8675
    KeyShareEntry *pqc_kse = NULL;
8676
    int pqc_group = 0;
8677
    int ecc_group = 0;
8678
    int pqc_first = 0;
8679
8680
    /* This gets called twice. Once during parsing of the key share and once
8681
     * during the population of the extension. No need to do work the second
8682
     * time. Just return success if its already been done. */
8683
    if (kse->pubKey != NULL) {
8684
        return ret;
8685
    }
8686
8687
    /* Determine the ECC and PQC group of the hybrid combination */
8688
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, kse->group);
8689
    if (ecc_group == 0 || pqc_group == 0) {
8690
        WOLFSSL_MSG("Invalid hybrid group");
8691
        ret = BAD_FUNC_ARG;
8692
    }
8693
8694
    if (ret == 0) {
8695
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
8696
                   DYNAMIC_TYPE_TLSX);
8697
        if (ecc_kse == NULL) {
8698
            WOLFSSL_MSG("kse memory allocation failure");
8699
            ret = MEMORY_ERROR;
8700
        }
8701
        else {
8702
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
8703
        }
8704
    }
8705
    if (ret == 0) {
8706
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
8707
                   DYNAMIC_TYPE_TLSX);
8708
        if (pqc_kse == NULL) {
8709
            WOLFSSL_MSG("kse memory allocation failure");
8710
            ret = MEMORY_ERROR;
8711
        }
8712
        else {
8713
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
8714
        }
8715
    }
8716
8717
    /* Generate ECC key share part */
8718
    if (ret == 0) {
8719
        ecc_kse->group = ecc_group;
8720
    #ifdef HAVE_CURVE25519
8721
        if (ecc_group == WOLFSSL_ECC_X25519) {
8722
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
8723
        }
8724
        else
8725
    #endif
8726
    #ifdef HAVE_CURVE448
8727
        if (ecc_group == WOLFSSL_ECC_X448) {
8728
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
8729
        }
8730
        else
8731
    #endif
8732
        {
8733
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
8734
        }
8735
        /* No error message, TLSX_KeyShare_Gen*Key will do it. */
8736
    }
8737
8738
    /* Generate PQC key share part */
8739
    if (ret == 0) {
8740
        pqc_kse->group = pqc_group;
8741
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, pqc_kse);
8742
        /* No error message, TLSX_KeyShare_GenPqcKeyClient will do it. */
8743
    }
8744
8745
    /* Allocate memory for combined public key */
8746
    if (ret == 0) {
8747
        kse->pubKey = (byte*)XMALLOC(ecc_kse->pubKeyLen + pqc_kse->pubKeyLen,
8748
                                     ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8749
        if (kse->pubKey == NULL) {
8750
            WOLFSSL_MSG("pubkey memory allocation failure");
8751
            ret = MEMORY_ERROR;
8752
        }
8753
    }
8754
8755
    /* Create combined public key. The order of classic/pqc key material is
8756
     * indicated by the pqc_first variable. */
8757
    if (ret == 0) {
8758
        if (pqc_first) {
8759
            XMEMCPY(kse->pubKey, pqc_kse->pubKey, pqc_kse->pubKeyLen);
8760
            XMEMCPY(kse->pubKey + pqc_kse->pubKeyLen, ecc_kse->pubKey,
8761
                    ecc_kse->pubKeyLen);
8762
        }
8763
        else {
8764
            XMEMCPY(kse->pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen);
8765
            XMEMCPY(kse->pubKey + ecc_kse->pubKeyLen, pqc_kse->pubKey,
8766
                    pqc_kse->pubKeyLen);
8767
        }
8768
        kse->pubKeyLen = ecc_kse->pubKeyLen + pqc_kse->pubKeyLen;
8769
    }
8770
8771
    /* Store the private keys.
8772
     * Note we are saving the PQC private key and ECC private key
8773
     * separately. That's because the ECC private key is not simply a
8774
     * buffer. Its is an ecc_key struct. */
8775
    if (ret == 0) {
8776
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8777
        /* PQC private key is an encoded byte array */
8778
        kse->privKey = pqc_kse->privKey;
8779
        kse->privKeyLen = pqc_kse->privKeyLen;
8780
        pqc_kse->privKey = NULL;
8781
    #else
8782
        /* PQC private key is a pointer to KyberKey object */
8783
        kse->privKey = (byte*)pqc_kse->key;
8784
        kse->privKeyLen = 0;
8785
        pqc_kse->key = NULL;
8786
    #endif
8787
        /* ECC private key is a pointer to ecc_key object */
8788
        kse->key = ecc_kse->key;
8789
        kse->keyLen = ecc_kse->keyLen;
8790
        ecc_kse->key = NULL;
8791
    }
8792
8793
#ifdef WOLFSSL_DEBUG_TLS
8794
    WOLFSSL_MSG("Public Kyber Key");
8795
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
8796
#endif
8797
8798
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
8799
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
8800
8801
    return ret;
8802
}
8803
#endif /* !WOLFSSL_MLKEM_NO_MAKE_KEY */
8804
#endif /* WOLFSSL_HAVE_MLKEM */
8805
8806
/* Generate a secret/key using the key share entry.
8807
 *
8808
 * ssl  The SSL/TLS object.
8809
 * kse  The key share entry holding peer data.
8810
 */
8811
int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
8812
4.47k
{
8813
4.47k
    int ret;
8814
    /* Named FFDHE groups have a bit set to identify them. */
8815
4.47k
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(kse->group))
8816
278
        ret = TLSX_KeyShare_GenDhKey(ssl, kse);
8817
4.19k
    else if (kse->group == WOLFSSL_ECC_X25519)
8818
593
        ret = TLSX_KeyShare_GenX25519Key(ssl, kse);
8819
3.60k
    else if (kse->group == WOLFSSL_ECC_X448)
8820
26
        ret = TLSX_KeyShare_GenX448Key(ssl, kse);
8821
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY)
8822
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group))
8823
        ret = TLSX_KeyShare_GenPqcKeyClient(ssl, kse);
8824
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(kse->group))
8825
        ret = TLSX_KeyShare_GenPqcHybridKeyClient(ssl, kse);
8826
#endif
8827
3.57k
    else
8828
3.57k
        ret = TLSX_KeyShare_GenEccKey(ssl, kse);
8829
#ifdef WOLFSSL_ASYNC_CRYPT
8830
    kse->lastRet = ret;
8831
#endif
8832
4.47k
    return ret;
8833
4.47k
}
8834
8835
/* Free the key share dynamic data.
8836
 *
8837
 * list  The linked list of key share entry objects.
8838
 * heap  The heap used for allocation.
8839
 */
8840
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
8841
6.21k
{
8842
6.21k
    KeyShareEntry* current;
8843
8844
12.5k
    while ((current = list) != NULL) {
8845
6.34k
        list = current->next;
8846
6.34k
        if (WOLFSSL_NAMED_GROUP_IS_FFDHE(current->group)) {
8847
620
#ifndef NO_DH
8848
620
            wc_FreeDhKey((DhKey*)current->key);
8849
620
#endif
8850
620
        }
8851
5.72k
        else if (current->group == WOLFSSL_ECC_X25519) {
8852
1.41k
#ifdef HAVE_CURVE25519
8853
1.41k
            wc_curve25519_free((curve25519_key*)current->key);
8854
1.41k
#endif
8855
1.41k
        }
8856
4.31k
        else if (current->group == WOLFSSL_ECC_X448) {
8857
68
#ifdef HAVE_CURVE448
8858
68
            wc_curve448_free((curve448_key*)current->key);
8859
68
#endif
8860
68
        }
8861
#ifdef WOLFSSL_HAVE_MLKEM
8862
        else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
8863
            wc_KyberKey_Free((KyberKey*)current->key);
8864
        #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8865
            if (current->privKey != NULL) {
8866
                ForceZero(current->privKey, current->privKeyLen);
8867
            }
8868
        #endif
8869
        }
8870
        else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
8871
            int ecc_group = 0;
8872
            findEccPqc(&ecc_group, NULL, NULL, current->group);
8873
8874
            /* Free PQC private key */
8875
        #ifdef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
8876
            wc_KyberKey_Free((KyberKey*)current->privKey);
8877
        #else
8878
            if (current->privKey != NULL) {
8879
                ForceZero(current->privKey, current->privKeyLen);
8880
            }
8881
        #endif
8882
8883
            /* Free ECC private key */
8884
            if (ecc_group == WOLFSSL_ECC_X25519) {
8885
            #ifdef HAVE_CURVE25519
8886
                wc_curve25519_free((curve25519_key*)current->key);
8887
            #endif
8888
            }
8889
            else if (ecc_group == WOLFSSL_ECC_X448) {
8890
            #ifdef HAVE_CURVE448
8891
                wc_curve448_free((curve448_key*)current->key);
8892
            #endif
8893
            }
8894
            else {
8895
            #ifdef HAVE_ECC
8896
                wc_ecc_free((ecc_key*)current->key);
8897
            #endif
8898
            }
8899
        }
8900
#endif
8901
4.24k
        else {
8902
4.24k
#ifdef HAVE_ECC
8903
4.24k
            wc_ecc_free((ecc_key*)current->key);
8904
4.24k
#endif
8905
4.24k
        }
8906
6.34k
        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
8907
6.34k
    #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
8908
6.34k
        XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY);
8909
6.34k
    #endif
8910
6.34k
        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
8911
6.34k
        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
8912
6.34k
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
8913
6.34k
    }
8914
8915
6.21k
    (void)heap;
8916
6.21k
}
8917
8918
/* Get the size of the encoded key share extension.
8919
 *
8920
 * list     The linked list of key share extensions.
8921
 * msgType  The type of the message this extension is being written into.
8922
 * returns the number of bytes of the encoded key share extension.
8923
 */
8924
static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
8925
3.69k
{
8926
3.69k
    word16         len = 0;
8927
3.69k
    byte           isRequest = (msgType == client_hello);
8928
3.69k
    KeyShareEntry* current;
8929
8930
    /* The named group the server wants to use. */
8931
3.69k
    if (msgType == hello_retry_request)
8932
96
        return OPAQUE16_LEN;
8933
8934
    /* List of key exchange groups. */
8935
3.59k
    if (isRequest)
8936
2.85k
        len += OPAQUE16_LEN;
8937
7.19k
    while ((current = list) != NULL) {
8938
3.59k
        list = current->next;
8939
8940
3.59k
        if (!isRequest && current->pubKey == NULL)
8941
0
            continue;
8942
8943
3.59k
        len += (word16)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
8944
3.59k
    }
8945
8946
3.59k
    return len;
8947
3.69k
}
8948
8949
/* Writes the key share extension into the output buffer.
8950
 * Assumes that the the output buffer is big enough to hold data.
8951
 *
8952
 * list     The linked list of key share entries.
8953
 * output   The buffer to write into.
8954
 * msgType  The type of the message this extension is being written into.
8955
 * returns the number of bytes written into the buffer.
8956
 */
8957
static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
8958
                                  byte msgType)
8959
3.67k
{
8960
3.67k
    word16         i = 0;
8961
3.67k
    byte           isRequest = (msgType == client_hello);
8962
3.67k
    KeyShareEntry* current;
8963
8964
3.67k
    if (msgType == hello_retry_request) {
8965
93
        c16toa(list->group, output);
8966
93
        return OPAQUE16_LEN;
8967
93
    }
8968
8969
    /* ClientHello has a list but ServerHello is only the chosen. */
8970
3.58k
    if (isRequest)
8971
2.84k
        i += OPAQUE16_LEN;
8972
8973
    /* Write out all in the list. */
8974
7.16k
    while ((current = list) != NULL) {
8975
3.58k
        list = current->next;
8976
8977
3.58k
        if (!isRequest && current->pubKey == NULL)
8978
0
            continue;
8979
8980
3.58k
        c16toa(current->group, &output[i]);
8981
3.58k
        i += KE_GROUP_LEN;
8982
3.58k
        c16toa((word16)(current->pubKeyLen), &output[i]);
8983
3.58k
        i += OPAQUE16_LEN;
8984
3.58k
        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
8985
3.58k
        i += (word16)current->pubKeyLen;
8986
3.58k
    }
8987
    /* Write the length of the list if required. */
8988
3.58k
    if (isRequest)
8989
2.84k
        c16toa(i - OPAQUE16_LEN, output);
8990
8991
3.58k
    return i;
8992
3.67k
}
8993
8994
/* Process the DH key share extension on the client side.
8995
 *
8996
 * ssl            The SSL/TLS object.
8997
 * keyShareEntry  The key share entry object to use to calculate shared secret.
8998
 * returns 0 on success and other values indicate failure.
8999
 */
9000
static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9001
109
{
9002
109
    int ret = 0;
9003
109
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
9004
109
    word32 pSz = 0;
9005
109
    DhKey* dhKey = (DhKey*)keyShareEntry->key;
9006
9007
109
#ifdef HAVE_PUBLIC_FFDHE
9008
109
    const DhParams* params = NULL;
9009
109
    switch (keyShareEntry->group) {
9010
0
    #ifdef HAVE_FFDHE_2048
9011
109
        case WOLFSSL_FFDHE_2048:
9012
109
            params = wc_Dh_ffdhe2048_Get();
9013
109
            break;
9014
0
    #endif
9015
    #ifdef HAVE_FFDHE_3072
9016
        case WOLFSSL_FFDHE_3072:
9017
            params = wc_Dh_ffdhe3072_Get();
9018
            break;
9019
    #endif
9020
    #ifdef HAVE_FFDHE_4096
9021
        case WOLFSSL_FFDHE_4096:
9022
            params = wc_Dh_ffdhe4096_Get();
9023
            break;
9024
    #endif
9025
    #ifdef HAVE_FFDHE_6144
9026
        case WOLFSSL_FFDHE_6144:
9027
            params = wc_Dh_ffdhe6144_Get();
9028
            break;
9029
    #endif
9030
    #ifdef HAVE_FFDHE_8192
9031
        case WOLFSSL_FFDHE_8192:
9032
            params = wc_Dh_ffdhe8192_Get();
9033
            break;
9034
    #endif
9035
0
        default:
9036
0
            break;
9037
109
    }
9038
109
    if (params == NULL) {
9039
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9040
0
        return PEER_KEY_ERROR;
9041
0
    }
9042
109
    pSz = params->p_len;
9043
#else
9044
    ret = wc_DhGetNamedKeyParamSize(keyShareEntry->group, &pSz, NULL, NULL);
9045
    if (ret != 0 || pSz == 0) {
9046
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
9047
        return PEER_KEY_ERROR;
9048
    }
9049
#endif
9050
9051
    /* if DhKey is not setup, do it now */
9052
109
    if (keyShareEntry->key == NULL) {
9053
109
        keyShareEntry->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
9054
109
            DYNAMIC_TYPE_DH);
9055
109
        if (keyShareEntry->key == NULL)
9056
2
            return MEMORY_E;
9057
9058
        /* Setup Key */
9059
107
        ret = wc_InitDhKey_ex((DhKey*)keyShareEntry->key, ssl->heap, ssl->devId);
9060
107
        if (ret == 0) {
9061
107
            dhKey = (DhKey*)keyShareEntry->key;
9062
        /* Set key */
9063
107
        #ifdef HAVE_PUBLIC_FFDHE
9064
107
            ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
9065
107
                                                                params->g_len);
9066
        #else
9067
            ret = wc_DhSetNamedKey(dhKey, keyShareEntry->group);
9068
        #endif
9069
107
        }
9070
107
    }
9071
9072
107
    if (ret == 0
9073
    #ifdef WOLFSSL_ASYNC_CRYPT
9074
        && keyShareEntry->lastRet == 0 /* don't enter here if WC_PENDING_E */
9075
    #endif
9076
107
    ) {
9077
    #ifdef WOLFSSL_DEBUG_TLS
9078
        WOLFSSL_MSG("Peer DH Key");
9079
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9080
    #endif
9081
9082
107
        ssl->options.dhKeySz = (word16)pSz;
9083
9084
        /* Derive secret from private key and peer's public key. */
9085
107
        ret = DhAgree(ssl, dhKey,
9086
107
            (const byte*)keyShareEntry->privKey, keyShareEntry->keyLen, /* our private */
9087
107
            keyShareEntry->ke, keyShareEntry->keLen,                    /* peer's public key */
9088
107
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,    /* secret */
9089
107
            NULL, 0
9090
107
        );
9091
    #ifdef WOLFSSL_ASYNC_CRYPT
9092
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) {
9093
            return ret;
9094
        }
9095
    #endif
9096
107
    }
9097
9098
    /* RFC 8446 Section 7.4.1:
9099
     *     ... left-padded with zeros up to the size of the prime. ...
9100
     */
9101
107
    if (ret == 0 && (word32)ssl->options.dhKeySz > ssl->arrays->preMasterSz) {
9102
0
        word32 diff = (word32)ssl->options.dhKeySz - ssl->arrays->preMasterSz;
9103
0
        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
9104
0
                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9105
0
        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
9106
0
        ssl->arrays->preMasterSz = ssl->options.dhKeySz;
9107
0
    }
9108
9109
    /* done with key share, release resources */
9110
107
    if (dhKey)
9111
107
        wc_FreeDhKey(dhKey);
9112
107
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
9113
107
    keyShareEntry->key = NULL;
9114
107
    if (keyShareEntry->privKey) {
9115
107
        ForceZero(keyShareEntry->privKey, keyShareEntry->keyLen);
9116
107
        XFREE(keyShareEntry->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9117
107
        keyShareEntry->privKey = NULL;
9118
107
    }
9119
107
    XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9120
107
    keyShareEntry->pubKey = NULL;
9121
107
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9122
107
    keyShareEntry->ke = NULL;
9123
#else
9124
    (void)ssl;
9125
    (void)keyShareEntry;
9126
    ret = PEER_KEY_ERROR;
9127
    WOLFSSL_ERROR_VERBOSE(ret);
9128
#endif
9129
107
    return ret;
9130
109
}
9131
9132
/* Process the X25519 key share extension on the client side.
9133
 *
9134
 * ssl            The SSL/TLS object.
9135
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9136
 * ssOutput       The destination buffer for the shared secret.
9137
 * ssOutSz        The size of the generated shared secret.
9138
 *
9139
 * returns 0 on success and other values indicate failure.
9140
 */
9141
static int TLSX_KeyShare_ProcessX25519_ex(WOLFSSL* ssl,
9142
                                          KeyShareEntry* keyShareEntry,
9143
                                          unsigned char* ssOutput,
9144
                                          word32* ssOutSz)
9145
560
{
9146
560
    int ret;
9147
9148
560
#ifdef HAVE_CURVE25519
9149
560
    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
9150
560
    curve25519_key* peerX25519Key;
9151
9152
560
#ifdef HAVE_ECC
9153
560
    if (ssl->peerEccKey != NULL) {
9154
0
        wc_ecc_free(ssl->peerEccKey);
9155
0
        ssl->peerEccKey = NULL;
9156
0
        ssl->peerEccKeyPresent = 0;
9157
0
    }
9158
560
#endif
9159
9160
560
    peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
9161
560
                                                             DYNAMIC_TYPE_TLSX);
9162
560
    if (peerX25519Key == NULL) {
9163
1
        WOLFSSL_MSG("PeerEccKey Memory error");
9164
1
        return MEMORY_ERROR;
9165
1
    }
9166
559
    ret = wc_curve25519_init(peerX25519Key);
9167
559
    if (ret != 0) {
9168
0
        XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9169
0
        return ret;
9170
0
    }
9171
#ifdef WOLFSSL_DEBUG_TLS
9172
    WOLFSSL_MSG("Peer Curve25519 Key");
9173
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9174
#endif
9175
9176
559
    if (wc_curve25519_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9177
559
                                                  EC25519_LITTLE_ENDIAN) != 0) {
9178
8
        ret = ECC_PEERKEY_ERROR;
9179
8
        WOLFSSL_ERROR_VERBOSE(ret);
9180
8
    }
9181
9182
559
    if (ret == 0) {
9183
551
        if (wc_curve25519_import_public_ex(keyShareEntry->ke,
9184
551
                                            keyShareEntry->keLen, peerX25519Key,
9185
551
                                            EC25519_LITTLE_ENDIAN) != 0) {
9186
0
            ret = ECC_PEERKEY_ERROR;
9187
0
            WOLFSSL_ERROR_VERBOSE(ret);
9188
0
        }
9189
551
    }
9190
9191
559
    if (ret == 0) {
9192
551
        ssl->ecdhCurveOID = ECC_X25519_OID;
9193
551
    #ifdef WOLFSSL_CURVE25519_BLINDING
9194
551
        ret = wc_curve25519_set_rng(key, ssl->rng);
9195
551
    }
9196
559
    if (ret == 0) {
9197
551
    #endif
9198
551
        ret = wc_curve25519_shared_secret_ex(key, peerX25519Key,
9199
551
                    ssOutput, ssOutSz, EC25519_LITTLE_ENDIAN);
9200
551
    }
9201
9202
559
    wc_curve25519_free(peerX25519Key);
9203
559
    XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9204
559
    wc_curve25519_free((curve25519_key*)keyShareEntry->key);
9205
559
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9206
559
    keyShareEntry->key = NULL;
9207
559
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9208
559
    keyShareEntry->ke = NULL;
9209
#else
9210
    (void)ssl;
9211
    (void)keyShareEntry;
9212
    (void)ssOutput;
9213
    (void)ssOutSz;
9214
9215
    ret = PEER_KEY_ERROR;
9216
    WOLFSSL_ERROR_VERBOSE(ret);
9217
#endif /* HAVE_CURVE25519 */
9218
9219
559
    return ret;
9220
559
}
9221
9222
/* Process the X25519 key share extension on the client side.
9223
 *
9224
 * ssl            The SSL/TLS object.
9225
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9226
 *
9227
 * returns 0 on success and other values indicate failure.
9228
 */
9229
static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
9230
                                       KeyShareEntry* keyShareEntry)
9231
560
{
9232
560
    return TLSX_KeyShare_ProcessX25519_ex(ssl, keyShareEntry,
9233
560
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9234
560
}
9235
9236
/* Process the X448 key share extension on the client side.
9237
 *
9238
 * ssl            The SSL/TLS object.
9239
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9240
 * ssOutput       The destination buffer for the shared secret.
9241
 * ssOutSz        The size of the generated shared secret.
9242
 *
9243
 * returns 0 on success and other values indicate failure.
9244
 */
9245
static int TLSX_KeyShare_ProcessX448_ex(WOLFSSL* ssl,
9246
                                        KeyShareEntry* keyShareEntry,
9247
                                        unsigned char* ssOutput,
9248
                                        word32* ssOutSz)
9249
10
{
9250
10
    int ret;
9251
9252
10
#ifdef HAVE_CURVE448
9253
10
    curve448_key* key = (curve448_key*)keyShareEntry->key;
9254
10
    curve448_key* peerX448Key;
9255
9256
10
#ifdef HAVE_ECC
9257
10
    if (ssl->peerEccKey != NULL) {
9258
0
        wc_ecc_free(ssl->peerEccKey);
9259
0
        ssl->peerEccKey = NULL;
9260
0
        ssl->peerEccKeyPresent = 0;
9261
0
    }
9262
10
#endif
9263
9264
10
    peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
9265
10
                                                             DYNAMIC_TYPE_TLSX);
9266
10
    if (peerX448Key == NULL) {
9267
1
        WOLFSSL_MSG("PeerEccKey Memory error");
9268
1
        return MEMORY_ERROR;
9269
1
    }
9270
9
    ret = wc_curve448_init(peerX448Key);
9271
9
    if (ret != 0) {
9272
0
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9273
0
        return ret;
9274
0
    }
9275
#ifdef WOLFSSL_DEBUG_TLS
9276
    WOLFSSL_MSG("Peer Curve448 Key");
9277
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9278
#endif
9279
9280
9
    if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
9281
9
                                                    EC448_LITTLE_ENDIAN) != 0) {
9282
3
        ret = ECC_PEERKEY_ERROR;
9283
3
        WOLFSSL_ERROR_VERBOSE(ret);
9284
3
    }
9285
9286
9
    if (ret == 0) {
9287
6
        if (wc_curve448_import_public_ex(keyShareEntry->ke,
9288
6
                                              keyShareEntry->keLen, peerX448Key,
9289
6
                                              EC448_LITTLE_ENDIAN) != 0) {
9290
0
            ret = ECC_PEERKEY_ERROR;
9291
0
            WOLFSSL_ERROR_VERBOSE(ret);
9292
0
        }
9293
6
    }
9294
9295
9
    if (ret == 0) {
9296
6
        ssl->ecdhCurveOID = ECC_X448_OID;
9297
9298
6
        ret = wc_curve448_shared_secret_ex(key, peerX448Key,
9299
6
                    ssOutput, ssOutSz, EC448_LITTLE_ENDIAN);
9300
6
    }
9301
9302
9
    wc_curve448_free(peerX448Key);
9303
9
    XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
9304
9
    wc_curve448_free((curve448_key*)keyShareEntry->key);
9305
9
    XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9306
9
    keyShareEntry->key = NULL;
9307
9
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9308
9
    keyShareEntry->ke = NULL;
9309
#else
9310
    (void)ssl;
9311
    (void)keyShareEntry;
9312
    (void)ssOutput;
9313
    (void)ssOutSz;
9314
9315
    ret = PEER_KEY_ERROR;
9316
    WOLFSSL_ERROR_VERBOSE(ret);
9317
#endif /* HAVE_CURVE448 */
9318
9319
9
    return ret;
9320
9
}
9321
9322
/* Process the X448 key share extension on the client side.
9323
 *
9324
 * ssl            The SSL/TLS object.
9325
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9326
 * returns 0 on success and other values indicate failure.
9327
 */
9328
static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9329
10
{
9330
10
    return TLSX_KeyShare_ProcessX448_ex(ssl, keyShareEntry,
9331
10
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9332
10
}
9333
9334
/* Process the ECC key share extension on the client side.
9335
 *
9336
 * ssl            The SSL/TLS object.
9337
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9338
 * ssOutput       The destination buffer for the shared secret.
9339
 * ssOutSz        The size of the generated shared secret.
9340
 *
9341
 * returns 0 on success and other values indicate failure.
9342
 */
9343
static int TLSX_KeyShare_ProcessEcc_ex(WOLFSSL* ssl,
9344
                                       KeyShareEntry* keyShareEntry,
9345
                                       unsigned char* ssOutput,
9346
                                       word32* ssOutSz)
9347
{
9348
    int ret = 0;
9349
#ifdef HAVE_ECC
9350
    int curveId = ECC_CURVE_INVALID;
9351
    ecc_key* eccKey = (ecc_key*)keyShareEntry->key;
9352
9353
    /* find supported curve */
9354
    switch (keyShareEntry->group) {
9355
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
9356
        #ifndef NO_ECC_SECP
9357
        case WOLFSSL_ECC_SECP256R1:
9358
            curveId = ECC_SECP256R1;
9359
            break;
9360
        #endif /* !NO_ECC_SECP */
9361
        #ifdef WOLFSSL_SM2
9362
        case WOLFSSL_ECC_SM2P256V1:
9363
            curveId = ECC_SM2P256V1;
9364
            break;
9365
        #endif
9366
    #endif
9367
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
9368
        #ifndef NO_ECC_SECP
9369
        case WOLFSSL_ECC_SECP384R1:
9370
            curveId = ECC_SECP384R1;
9371
            break;
9372
        #endif /* !NO_ECC_SECP */
9373
    #endif
9374
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
9375
        #ifndef NO_ECC_SECP
9376
        case WOLFSSL_ECC_SECP521R1:
9377
            curveId = ECC_SECP521R1;
9378
            break;
9379
        #endif /* !NO_ECC_SECP */
9380
    #endif
9381
    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
9382
        case WOLFSSL_ECC_X448:
9383
            curveId = ECC_X448;
9384
            break;
9385
    #endif
9386
        default:
9387
            /* unsupported curve */
9388
            WOLFSSL_ERROR_VERBOSE(ECC_PEERKEY_ERROR);
9389
            return ECC_PEERKEY_ERROR;
9390
    }
9391
9392
#ifdef WOLFSSL_ASYNC_CRYPT
9393
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
9394
#endif
9395
    {
9396
    #ifdef WOLFSSL_DEBUG_TLS
9397
        WOLFSSL_MSG("Peer ECC Key");
9398
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
9399
    #endif
9400
9401
        if (ssl->peerEccKey != NULL) {
9402
            wc_ecc_free(ssl->peerEccKey);
9403
            XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9404
            ssl->peerEccKeyPresent = 0;
9405
        }
9406
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
9407
        ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry);
9408
        if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) {
9409
            return ret;
9410
        }
9411
        ret = 0;
9412
#endif
9413
9414
        ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
9415
                                            DYNAMIC_TYPE_ECC);
9416
        if (ssl->peerEccKey == NULL) {
9417
            WOLFSSL_MSG("PeerEccKey Memory error");
9418
            ret = MEMORY_ERROR;
9419
        }
9420
9421
        if (ret == 0) {
9422
            ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
9423
        }
9424
9425
        /* Point is validated by import function. */
9426
        if (ret == 0) {
9427
            ret = wc_ecc_import_x963_ex(keyShareEntry->ke, keyShareEntry->keLen,
9428
                                ssl->peerEccKey, curveId);
9429
            if (ret != 0) {
9430
                ret = ECC_PEERKEY_ERROR;
9431
                WOLFSSL_ERROR_VERBOSE(ret);
9432
            }
9433
        }
9434
9435
        if (ret == 0) {
9436
            ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
9437
            ssl->peerEccKeyPresent = 1;
9438
        }
9439
    }
9440
9441
    if (ret == 0 && eccKey == NULL)
9442
        ret = BAD_FUNC_ARG;
9443
    if (ret == 0) {
9444
        ret = EccSharedSecret(ssl, eccKey, ssl->peerEccKey,
9445
            keyShareEntry->ke, &keyShareEntry->keLen,
9446
            ssOutput, ssOutSz, ssl->options.side);
9447
    #ifdef WOLFSSL_ASYNC_CRYPT
9448
        if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
9449
            return ret;
9450
    #endif
9451
    }
9452
9453
    /* done with key share, release resources */
9454
    if (ssl->peerEccKey != NULL
9455
    #ifdef HAVE_PK_CALLBACKS
9456
        && ssl->ctx->EccSharedSecretCb == NULL
9457
    #endif
9458
    ) {
9459
        wc_ecc_free(ssl->peerEccKey);
9460
        XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
9461
        ssl->peerEccKey = NULL;
9462
        ssl->peerEccKeyPresent = 0;
9463
    }
9464
    if (keyShareEntry->key) {
9465
        wc_ecc_free((ecc_key*)keyShareEntry->key);
9466
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_ECC);
9467
        keyShareEntry->key = NULL;
9468
    }
9469
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9470
    keyShareEntry->ke = NULL;
9471
#else
9472
    (void)ssl;
9473
    (void)keyShareEntry;
9474
    (void)ssOutput;
9475
    (void)ssOutSz;
9476
9477
    ret = PEER_KEY_ERROR;
9478
    WOLFSSL_ERROR_VERBOSE(ret);
9479
#endif /* HAVE_ECC */
9480
9481
    return ret;
9482
}
9483
9484
/* Process the ECC key share extension on the client side.
9485
 *
9486
 * ssl            The SSL/TLS object.
9487
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9488
 * returns 0 on success and other values indicate failure.
9489
 */
9490
static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9491
228
{
9492
228
    return TLSX_KeyShare_ProcessEcc_ex(ssl, keyShareEntry,
9493
228
                ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
9494
228
}
9495
9496
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9497
/* Process the Kyber key share extension on the client side.
9498
 *
9499
 * ssl            The SSL/TLS object.
9500
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9501
 * ssOutput       The destination buffer for the shared secret.
9502
 * ssOutSz        The size of the generated shared secret.
9503
 *
9504
 * returns 0 on success and other values indicate failure.
9505
 */
9506
static int TLSX_KeyShare_ProcessPqcClient_ex(WOLFSSL* ssl,
9507
                                             KeyShareEntry* keyShareEntry,
9508
                                             unsigned char* ssOutput,
9509
                                             word32* ssOutSz)
9510
{
9511
    int       ret = 0;
9512
    KyberKey* kem = (KyberKey*)keyShareEntry->key;
9513
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9514
    word32    privSz = 0;
9515
#endif
9516
    word32    ctSz = 0;
9517
    word32    ssSz = 0;
9518
9519
    if (ssl->options.side == WOLFSSL_SERVER_END) {
9520
        /* I am the server, the shared secret has already been generated and
9521
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
9522
        return 0;
9523
    }
9524
9525
    if (keyShareEntry->ke == NULL) {
9526
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
9527
        return BAD_FUNC_ARG;
9528
    }
9529
    if (ssOutSz == NULL)
9530
        return BAD_FUNC_ARG;
9531
9532
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9533
    if (kem == NULL) {
9534
        int type = 0;
9535
9536
        /* Allocate a Kyber key to hold private key. */
9537
        kem = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
9538
                                  DYNAMIC_TYPE_PRIVATE_KEY);
9539
        if (kem == NULL) {
9540
            WOLFSSL_MSG("GenPqcKey memory error");
9541
            ret = MEMORY_E;
9542
        }
9543
        if (ret == 0) {
9544
            ret = mlkem_id2type(keyShareEntry->group, &type);
9545
        }
9546
        if (ret != 0) {
9547
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
9548
            ret = BAD_FUNC_ARG;
9549
        }
9550
        if (ret == 0) {
9551
            ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
9552
            if (ret != 0) {
9553
                WOLFSSL_MSG("Error creating Kyber KEM");
9554
            }
9555
        }
9556
    }
9557
#else
9558
    if (kem == NULL || keyShareEntry->privKeyLen != 0) {
9559
        WOLFSSL_MSG("Invalid Kyber key.");
9560
        ret = BAD_FUNC_ARG;
9561
    }
9562
#endif
9563
9564
    if (ret == 0) {
9565
        ret = wc_KyberKey_SharedSecretSize(kem, &ssSz);
9566
    }
9567
    if (ret == 0) {
9568
        ret = wc_KyberKey_CipherTextSize(kem, &ctSz);
9569
    }
9570
9571
#ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9572
    if (ret == 0) {
9573
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
9574
    }
9575
    if (ret == 0 && privSz != keyShareEntry->privKeyLen) {
9576
        WOLFSSL_MSG("Invalid private key size.");
9577
        ret = BAD_FUNC_ARG;
9578
    }
9579
    if (ret == 0) {
9580
        ret = wc_KyberKey_DecodePrivateKey(kem, keyShareEntry->privKey, privSz);
9581
    }
9582
#endif
9583
9584
    if (ret == 0) {
9585
        ret = wc_KyberKey_Decapsulate(kem, ssOutput,
9586
                                      keyShareEntry->ke, ctSz);
9587
        if (ret != 0) {
9588
            WOLFSSL_MSG("wc_KyberKey decapsulation failure.");
9589
            ret = BAD_FUNC_ARG;
9590
        }
9591
    }
9592
    if (ret == 0) {
9593
        *ssOutSz = ssSz;
9594
    }
9595
9596
    wc_KyberKey_Free(kem);
9597
9598
    XFREE(kem, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
9599
    keyShareEntry->key = NULL;
9600
9601
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9602
    keyShareEntry->ke = NULL;
9603
9604
    return ret;
9605
}
9606
9607
/* Process the Kyber key share extension on the client side.
9608
 *
9609
 * ssl            The SSL/TLS object.
9610
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9611
 *
9612
 * returns 0 on success and other values indicate failure.
9613
 */
9614
static int TLSX_KeyShare_ProcessPqcClient(WOLFSSL* ssl,
9615
                                          KeyShareEntry* keyShareEntry)
9616
{
9617
    return TLSX_KeyShare_ProcessPqcClient_ex(ssl, keyShareEntry,
9618
                                             ssl->arrays->preMasterSecret,
9619
                                             &ssl->arrays->preMasterSz);
9620
}
9621
9622
/* Process the hybrid key share extension on the client side.
9623
 *
9624
 * ssl            The SSL/TLS object.
9625
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9626
 * returns 0 on success and other values indicate failure.
9627
 */
9628
static int TLSX_KeyShare_ProcessPqcHybridClient(WOLFSSL* ssl,
9629
                                                KeyShareEntry* keyShareEntry)
9630
{
9631
    int      ret = 0;
9632
    int      pqc_group = 0;
9633
    int      ecc_group = 0;
9634
    int      pqc_first = 0;
9635
    KeyShareEntry* pqc_kse = NULL;
9636
    KeyShareEntry *ecc_kse = NULL;
9637
    word32   ctSz = 0;
9638
    word32   ssSzPqc = 0;
9639
    word32   ssSzEcc = 0;
9640
9641
    if (ssl->options.side == WOLFSSL_SERVER_END) {
9642
        /* I am the server, the shared secret has already been generated and
9643
         * is in ssl->arrays->preMasterSecret, so nothing really to do here. */
9644
        return 0;
9645
    }
9646
9647
    if (keyShareEntry->ke == NULL) {
9648
        WOLFSSL_MSG("Invalid PQC algorithm specified.");
9649
        return BAD_FUNC_ARG;
9650
    }
9651
9652
    /* I am the client, both the PQC ciphertext and the ECHD public key are in
9653
     * keyShareEntry->ke */
9654
9655
    /* Determine the ECC and PQC group of the hybrid combination */
9656
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
9657
    if (ecc_group == 0 || pqc_group == 0) {
9658
        WOLFSSL_MSG("Invalid hybrid group");
9659
        ret = BAD_FUNC_ARG;
9660
    }
9661
9662
    if (ret == 0) {
9663
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
9664
                   DYNAMIC_TYPE_TLSX);
9665
        if (ecc_kse == NULL) {
9666
            WOLFSSL_MSG("kse memory allocation failure");
9667
            ret = MEMORY_ERROR;
9668
        }
9669
        else {
9670
            XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
9671
        }
9672
    }
9673
    if (ret == 0) {
9674
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
9675
                   DYNAMIC_TYPE_TLSX);
9676
        if (pqc_kse == NULL) {
9677
            WOLFSSL_MSG("kse memory allocation failure");
9678
            ret = MEMORY_ERROR;
9679
        }
9680
        else {
9681
            XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
9682
        }
9683
    }
9684
9685
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
9686
     * decode these sizes to separate the KEM ciphertext from the ECDH public
9687
     * key. */
9688
    if (ret == 0) {
9689
    #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
9690
        int type;
9691
9692
        pqc_kse->privKey = keyShareEntry->privKey;
9693
9694
        ret = mlkem_id2type(pqc_group, &type);
9695
        if (ret != 0) {
9696
            WOLFSSL_MSG("Invalid Kyber algorithm specified.");
9697
            ret = BAD_FUNC_ARG;
9698
        }
9699
        if (ret == 0) {
9700
            pqc_kse->key = XMALLOC(sizeof(KyberKey), ssl->heap,
9701
                                DYNAMIC_TYPE_PRIVATE_KEY);
9702
            if (pqc_kse->key == NULL) {
9703
                WOLFSSL_MSG("GenPqcKey memory error");
9704
                ret = MEMORY_E;
9705
            }
9706
        }
9707
        if (ret == 0) {
9708
            ret = wc_KyberKey_Init(type, (KyberKey*)pqc_kse->key,
9709
                                   ssl->heap, ssl->devId);
9710
            if (ret != 0) {
9711
                WOLFSSL_MSG("Error creating Kyber KEM");
9712
            }
9713
        }
9714
    #else
9715
        pqc_kse->key = keyShareEntry->privKey;
9716
    #endif
9717
9718
        pqc_kse->group = pqc_group;
9719
        pqc_kse->privKeyLen = keyShareEntry->privKeyLen;
9720
9721
        if (ret == 0) {
9722
            ret = wc_KyberKey_SharedSecretSize((KyberKey*)pqc_kse->key,
9723
                                               &ssSzPqc);
9724
        }
9725
        if (ret == 0) {
9726
            ret = wc_KyberKey_CipherTextSize((KyberKey*)pqc_kse->key,
9727
                                             &ctSz);
9728
            if (ret == 0 && keyShareEntry->keLen <= ctSz) {
9729
                WOLFSSL_MSG("Invalid ciphertext size.");
9730
                ret = BAD_FUNC_ARG;
9731
            }
9732
        }
9733
        if (ret == 0) {
9734
            pqc_kse->keLen = ctSz;
9735
            pqc_kse->ke = (byte*)XMALLOC(pqc_kse->keLen, ssl->heap,
9736
                                         DYNAMIC_TYPE_PUBLIC_KEY);
9737
            if (pqc_kse->ke == NULL) {
9738
                WOLFSSL_MSG("pqc_kse memory allocation failure");
9739
                ret = MEMORY_ERROR;
9740
            }
9741
            /* Copy the PQC KEM ciphertext. Depending on the pqc_first flag,
9742
             * the KEM ciphertext comes before or after the ECDH public key. */
9743
            if (ret == 0) {
9744
                int offset = keyShareEntry->keLen - ctSz;
9745
9746
                if (pqc_first)
9747
                    offset = 0;
9748
9749
                XMEMCPY(pqc_kse->ke, keyShareEntry->ke + offset, ctSz);
9750
            }
9751
        }
9752
    }
9753
9754
    if (ret == 0) {
9755
        ecc_kse->group = ecc_group;
9756
        ecc_kse->keLen = keyShareEntry->keLen - ctSz;
9757
        ecc_kse->key = keyShareEntry->key;
9758
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
9759
                                        DYNAMIC_TYPE_PUBLIC_KEY);
9760
        if (ecc_kse->ke == NULL) {
9761
            WOLFSSL_MSG("ecc_kse memory allocation failure");
9762
            ret = MEMORY_ERROR;
9763
        }
9764
        /* Copy the ECDH public key. Depending on the pqc_first flag, the
9765
         * KEM ciphertext comes before or after the ECDH public key. */
9766
        if (ret == 0) {
9767
            int offset = 0;
9768
9769
            if (pqc_first)
9770
                offset = ctSz;
9771
9772
            XMEMCPY(ecc_kse->ke, keyShareEntry->ke + offset, ecc_kse->keLen);
9773
        }
9774
    }
9775
9776
    /* Process ECDH key share part. The generated shared secret is directly
9777
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
9778
     * pqc_first flag, the ECDH shared secret part goes before or after the
9779
     * KEM part. */
9780
    if (ret == 0) {
9781
        int offset = 0;
9782
9783
        /* Set the ECC size variable to the initial buffer size */
9784
        ssSzEcc = ssl->arrays->preMasterSz;
9785
9786
        if (pqc_first)
9787
            offset = ssSzPqc;
9788
9789
    #ifdef HAVE_CURVE25519
9790
        if (ecc_group == WOLFSSL_ECC_X25519) {
9791
            ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
9792
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9793
        }
9794
        else
9795
    #endif
9796
    #ifdef HAVE_CURVE448
9797
        if (ecc_group == WOLFSSL_ECC_X448) {
9798
            ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
9799
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9800
        }
9801
        else
9802
    #endif
9803
        {
9804
            ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
9805
                    ssl->arrays->preMasterSecret + offset, &ssSzEcc);
9806
        }
9807
    }
9808
9809
    if (ret == 0) {
9810
        keyShareEntry->key = ecc_kse->key;
9811
9812
        if ((ret == 0) && ((ssSzEcc + ssSzPqc) > ENCRYPT_LEN)) {
9813
            WOLFSSL_MSG("shared secret is too long.");
9814
            ret = LENGTH_ERROR;
9815
        }
9816
    }
9817
9818
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
9819
     * KEM shared secret part goes before or after the ECDH part. */
9820
    if (ret == 0) {
9821
        int offset = ssSzEcc;
9822
9823
        if (pqc_first)
9824
            offset = 0;
9825
9826
        ret = TLSX_KeyShare_ProcessPqcClient_ex(ssl, pqc_kse,
9827
                ssl->arrays->preMasterSecret + offset, &ssSzPqc);
9828
    }
9829
9830
    if (ret == 0) {
9831
        keyShareEntry->privKey = (byte*)pqc_kse->key;
9832
9833
        ssl->arrays->preMasterSz = ssSzEcc + ssSzPqc;
9834
    }
9835
9836
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
9837
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
9838
9839
    return ret;
9840
}
9841
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_DECAPSULATE */
9842
9843
/* Process the key share extension on the client side.
9844
 *
9845
 * ssl            The SSL/TLS object.
9846
 * keyShareEntry  The key share entry object to use to calculate shared secret.
9847
 * returns 0 on success and other values indicate failure.
9848
 */
9849
static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
9850
907
{
9851
907
    int ret;
9852
9853
907
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
9854
907
    ssl->session->namedGroup = keyShareEntry->group;
9855
907
#endif
9856
    /* reset the pre master secret size */
9857
907
    if (ssl->arrays->preMasterSz == 0)
9858
0
        ssl->arrays->preMasterSz = ENCRYPT_LEN;
9859
9860
    /* Use Key Share Data from server. */
9861
907
    if (WOLFSSL_NAMED_GROUP_IS_FFDHE(keyShareEntry->group))
9862
109
        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
9863
798
    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
9864
560
        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
9865
238
    else if (keyShareEntry->group == WOLFSSL_ECC_X448)
9866
10
        ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
9867
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_DECAPSULATE)
9868
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group))
9869
        ret = TLSX_KeyShare_ProcessPqcClient(ssl, keyShareEntry);
9870
    else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(keyShareEntry->group))
9871
        ret = TLSX_KeyShare_ProcessPqcHybridClient(ssl, keyShareEntry);
9872
#endif
9873
228
    else
9874
228
        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
9875
9876
#ifdef WOLFSSL_DEBUG_TLS
9877
    if (ret == 0) {
9878
        WOLFSSL_MSG("KE Secret");
9879
        WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
9880
    }
9881
#endif
9882
#ifdef WOLFSSL_ASYNC_CRYPT
9883
    keyShareEntry->lastRet = ret;
9884
#endif
9885
9886
907
    return ret;
9887
907
}
9888
9889
/* Parse an entry of the KeyShare extension.
9890
 *
9891
 * ssl     The SSL/TLS object.
9892
 * input   The extension data.
9893
 * length  The length of the extension data.
9894
 * kse     The new key share entry object.
9895
 * returns a positive number to indicate amount of data parsed and a negative
9896
 * number on error.
9897
 */
9898
static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
9899
            word16 length, KeyShareEntry **kse, TLSX** extensions)
9900
2.19k
{
9901
2.19k
    int    ret;
9902
2.19k
    word16 group;
9903
2.19k
    word16 keLen;
9904
2.19k
    int    offset = 0;
9905
2.19k
    byte*  ke;
9906
9907
2.19k
    if (length < OPAQUE16_LEN + OPAQUE16_LEN)
9908
20
        return BUFFER_ERROR;
9909
    /* Named group */
9910
2.17k
    ato16(&input[offset], &group);
9911
2.17k
    offset += OPAQUE16_LEN;
9912
    /* Key exchange data - public key. */
9913
2.17k
    ato16(&input[offset], &keLen);
9914
2.17k
    offset += OPAQUE16_LEN;
9915
2.17k
    if (keLen == 0)
9916
7
        return INVALID_PARAMETER;
9917
2.17k
    if (keLen > length - offset)
9918
66
        return BUFFER_ERROR;
9919
9920
#ifdef WOLFSSL_HAVE_MLKEM
9921
    if ((WOLFSSL_NAMED_GROUP_IS_PQC(group) ||
9922
         WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) &&
9923
        ssl->options.side == WOLFSSL_SERVER_END) {
9924
        /* When handling a key share containing a KEM public key on the server
9925
         * end, we have to perform the encapsulation immediately in order to
9926
         * send the resulting ciphertext back to the client in the ServerHello
9927
         * message. As the public key is not stored and we do not modify it, we
9928
         * don't have to create a copy of it.
9929
         * In case of a hybrid key exchange, the ECDH part is also performed
9930
         * immediately (to not split the generation of the master secret).
9931
         * Hence, we also don't have to store this public key either.  */
9932
        ke = (byte *)&input[offset];
9933
    } else
9934
#endif
9935
2.10k
    {
9936
        /* Store a copy in the key share object. */
9937
2.10k
        ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9938
2.10k
        if (ke == NULL)
9939
7
            return MEMORY_E;
9940
2.09k
        XMEMCPY(ke, &input[offset], keLen);
9941
2.09k
    }
9942
9943
    /* Populate a key share object in the extension. */
9944
0
    ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
9945
2.09k
    if (ret != 0) {
9946
7
        if (ke != &input[offset]) {
9947
7
            XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9948
7
        }
9949
7
        return ret;
9950
7
    }
9951
9952
    /* Total length of the parsed data. */
9953
2.09k
    return offset + keLen;
9954
2.09k
}
9955
9956
/* Searches the groups sent for the specified named group.
9957
 *
9958
 * ssl    SSL/TLS object.
9959
 * name   Group name to match.
9960
 * returns 1 when the extension has the group name and 0 otherwise.
9961
 */
9962
static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
9963
283
{
9964
283
    TLSX*          extension;
9965
283
    KeyShareEntry* list;
9966
9967
283
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
9968
283
    if (extension == NULL) {
9969
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
9970
0
        if (extension == NULL)
9971
0
            return 0;
9972
0
    }
9973
9974
283
    list = (KeyShareEntry*)extension->data;
9975
356
    while (list != NULL) {
9976
283
        if (list->group == group)
9977
210
            return 1;
9978
73
        list = list->next;
9979
73
    }
9980
9981
73
    return 0;
9982
283
}
9983
9984
9985
/* Searches the supported groups extension for the specified named group.
9986
 *
9987
 * ssl   The SSL/TLS object.
9988
 * name  The group name to match.
9989
 * returns 1 when the extension has the group name and 0 otherwise.
9990
 */
9991
static int TLSX_SupportedGroups_Find(const WOLFSSL* ssl, word16 name,
9992
                                     TLSX* extensions)
9993
1.71k
{
9994
1.71k
#ifdef HAVE_SUPPORTED_CURVES
9995
1.71k
    TLSX*          extension;
9996
1.71k
    SupportedCurve* curve = NULL;
9997
9998
1.71k
    if ((extension = TLSX_Find(extensions, TLSX_SUPPORTED_GROUPS)) == NULL) {
9999
62
        if ((extension = TLSX_Find(ssl->ctx->extensions,
10000
62
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
10001
62
            return 0;
10002
62
        }
10003
62
    }
10004
10005
3.97k
    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
10006
3.72k
        if (curve->name == name)
10007
1.40k
            return 1;
10008
3.72k
    }
10009
251
#endif
10010
10011
251
    (void)ssl;
10012
251
    (void)name;
10013
10014
251
    return 0;
10015
1.65k
}
10016
10017
int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl,
10018
        const byte* input, word16 length, TLSX** extensions)
10019
1.69k
{
10020
1.69k
    int ret;
10021
1.69k
    int    offset = 0;
10022
1.69k
    word16 len;
10023
1.69k
    TLSX*  extension;
10024
10025
    /* Add a KeyShare extension if it doesn't exist even if peer sent no
10026
     * entries. The presence of this extension signals that the peer can be
10027
     * negotiated with. */
10028
1.69k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10029
1.69k
    if (extension == NULL) {
10030
        /* Push new KeyShare extension. */
10031
1.69k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10032
1.69k
        if (ret != 0)
10033
9
            return ret;
10034
1.69k
    }
10035
10036
1.68k
    if (length < OPAQUE16_LEN)
10037
4
        return BUFFER_ERROR;
10038
10039
    /* ClientHello contains zero or more key share entries. */
10040
1.68k
    ato16(input, &len);
10041
1.68k
    if (len != length - OPAQUE16_LEN)
10042
39
        return BUFFER_ERROR;
10043
1.64k
    offset += OPAQUE16_LEN;
10044
10045
3.54k
    while (offset < (int)length) {
10046
1.99k
        ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset],
10047
1.99k
                length - (word16)offset, NULL, extensions);
10048
1.99k
        if (ret < 0)
10049
88
            return ret;
10050
10051
1.90k
        offset += ret;
10052
1.90k
    }
10053
10054
1.55k
    return 0;
10055
1.64k
}
10056
10057
/* Parse the KeyShare extension.
10058
 * Different formats in different messages.
10059
 *
10060
 * ssl      The SSL/TLS object.
10061
 * input    The extension data.
10062
 * length   The length of the extension data.
10063
 * msgType  The type of the message this extension is being parsed from.
10064
 * returns 0 on success and other values indicate failure.
10065
 */
10066
int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10067
                               byte msgType)
10068
1.98k
{
10069
1.98k
    int ret = 0;
10070
1.98k
    KeyShareEntry *keyShareEntry = NULL;
10071
1.98k
    word16 group;
10072
10073
1.98k
    if (msgType == client_hello) {
10074
1.69k
        ret = TLSX_KeyShare_Parse_ClientHello(ssl, input, length,
10075
1.69k
                                              &ssl->extensions);
10076
1.69k
    }
10077
296
    else if (msgType == server_hello) {
10078
221
        int len;
10079
10080
221
        if (length < OPAQUE16_LEN)
10081
1
            return BUFFER_ERROR;
10082
10083
        /* The data is the named group the server wants to use. */
10084
220
        ato16(input, &group);
10085
10086
        /* Check the selected group was supported by ClientHello extensions. */
10087
220
        if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10088
4
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10089
4
            return BAD_KEY_SHARE_DATA;
10090
4
        }
10091
10092
        /* Check if the group was sent. */
10093
216
        if (!TLSX_KeyShare_Find(ssl, group)) {
10094
7
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10095
7
            return BAD_KEY_SHARE_DATA;
10096
7
        }
10097
10098
        /* ServerHello contains one key share entry. */
10099
209
        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry,
10100
209
                &ssl->extensions);
10101
209
        if (len != (int)length)
10102
25
            return BUFFER_ERROR;
10103
10104
        /* Not in list sent if there isn't a private key. */
10105
184
        if (keyShareEntry == NULL || (keyShareEntry->key == NULL
10106
184
        #if !defined(NO_DH) || defined(WOLFSSL_HAVE_MLKEM)
10107
184
            && keyShareEntry->privKey == NULL
10108
184
        #endif
10109
184
        )) {
10110
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10111
0
            return BAD_KEY_SHARE_DATA;
10112
0
        }
10113
10114
        /* Process the entry to calculate the secret. */
10115
184
        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
10116
184
        if (ret == 0)
10117
180
            ssl->session->namedGroup = ssl->namedGroup = group;
10118
184
    }
10119
75
    else if (msgType == hello_retry_request) {
10120
75
        if (length != OPAQUE16_LEN)
10121
1
            return BUFFER_ERROR;
10122
10123
        /* The data is the named group the server wants to use. */
10124
74
        ato16(input, &group);
10125
10126
    #ifdef WOLFSSL_ASYNC_CRYPT
10127
        /* only perform find and clear TLSX if not returning from async */
10128
        if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E))
10129
    #endif
10130
74
        {
10131
            /* Check the selected group was supported by ClientHello extensions.
10132
             */
10133
74
            if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
10134
7
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10135
7
                return BAD_KEY_SHARE_DATA;
10136
7
            }
10137
10138
            /* Make sure KeyShare for server requested group was not sent in
10139
             * ClientHello. */
10140
67
            if (TLSX_KeyShare_Find(ssl, group)) {
10141
1
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10142
1
                return BAD_KEY_SHARE_DATA;
10143
1
            }
10144
10145
            /* Clear out unusable key shares. */
10146
66
            ret = TLSX_KeyShare_Empty(ssl);
10147
66
            if (ret != 0)
10148
0
                return ret;
10149
66
        }
10150
10151
66
        ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
10152
66
        if (ret == 0)
10153
59
            ssl->session->namedGroup = ssl->namedGroup = group;
10154
66
    }
10155
0
    else {
10156
        /* Not a message type that is allowed to have this extension. */
10157
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10158
0
        return SANITY_MSG_E;
10159
0
    }
10160
10161
1.94k
    return ret;
10162
1.98k
}
10163
10164
/* Create a new key share entry and put it into the list.
10165
 *
10166
 * list           The linked list of key share entries.
10167
 * group          The named group.
10168
 * heap           The memory to allocate with.
10169
 * keyShareEntry  The new key share entry object.
10170
 * returns 0 on success and other values indicate failure.
10171
 */
10172
static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
10173
                             KeyShareEntry** keyShareEntry)
10174
6.37k
{
10175
6.37k
    KeyShareEntry* kse;
10176
6.37k
    KeyShareEntry** next;
10177
10178
6.37k
    kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
10179
6.37k
                                  DYNAMIC_TYPE_TLSX);
10180
6.37k
    if (kse == NULL)
10181
30
        return MEMORY_E;
10182
10183
6.34k
    XMEMSET(kse, 0, sizeof(*kse));
10184
6.34k
    kse->group = (word16)group;
10185
10186
    /* Add it to the back and maintain the links. */
10187
6.95k
    while (*list != NULL) {
10188
        /* Assign to temporary to work around compiler bug found by customer. */
10189
613
        next = &((*list)->next);
10190
613
        list = next;
10191
613
    }
10192
6.34k
    *list = kse;
10193
6.34k
    *keyShareEntry = kse;
10194
10195
6.34k
    (void)heap;
10196
10197
6.34k
    return 0;
10198
6.37k
}
10199
10200
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
10201
/* Process the Kyber key share extension on the server side.
10202
 *
10203
 * ssl            The SSL/TLS object.
10204
 * keyShareEntry  The key share entry object to be sent to the client.
10205
 * data           The key share data received from the client.
10206
 * len            The length of the key share data from the client.
10207
 * ssOutput       The destination buffer for the shared secret.
10208
 * ssOutSz        The size of the generated shared secret.
10209
 *
10210
 * returns 0 on success and other values indicate failure.
10211
 */
10212
static int TLSX_KeyShare_HandlePqcKeyServer(WOLFSSL* ssl,
10213
    KeyShareEntry* keyShareEntry, byte* clientData, word16 clientLen,
10214
    unsigned char* ssOutput, word32* ssOutSz)
10215
{
10216
    /* We are on the server side. The key share contains a PQC KEM public key
10217
     * that we are using for an encapsulate operation. The resulting ciphertext
10218
     * is stored in the server key share. */
10219
    KyberKey* kemKey = (KyberKey*)keyShareEntry->key;
10220
    byte* ciphertext = NULL;
10221
    int ret = 0;
10222
    word32 pubSz = 0;
10223
    word32 ctSz = 0;
10224
    word32 ssSz = 0;
10225
10226
    if (clientData == NULL) {
10227
        WOLFSSL_MSG("No KEM public key from the client.");
10228
        return BAD_FUNC_ARG;
10229
    }
10230
10231
    if (kemKey == NULL) {
10232
        int type = 0;
10233
10234
        /* Allocate a Kyber key to hold private key. */
10235
        kemKey = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
10236
                                     DYNAMIC_TYPE_PRIVATE_KEY);
10237
        if (kemKey == NULL) {
10238
            WOLFSSL_MSG("GenPqcKey memory error");
10239
            ret = MEMORY_E;
10240
        }
10241
        if (ret == 0) {
10242
            ret = mlkem_id2type(keyShareEntry->group, &type);
10243
        }
10244
        if (ret != 0) {
10245
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10246
            ret = BAD_FUNC_ARG;
10247
        }
10248
        if (ret == 0) {
10249
            ret = wc_KyberKey_Init(type, kemKey, ssl->heap, ssl->devId);
10250
            if (ret != 0) {
10251
                WOLFSSL_MSG("Error creating Kyber KEM");
10252
            }
10253
        }
10254
    }
10255
10256
    if (ret == 0) {
10257
        ret = wc_KyberKey_PublicKeySize(kemKey, &pubSz);
10258
    }
10259
    if (ret == 0) {
10260
        ret = wc_KyberKey_CipherTextSize(kemKey, &ctSz);
10261
    }
10262
    if (ret == 0) {
10263
        ret = wc_KyberKey_SharedSecretSize(kemKey, &ssSz);
10264
    }
10265
10266
    if (ret == 0 && clientLen != pubSz) {
10267
        WOLFSSL_MSG("Invalid public key.");
10268
        ret = BAD_FUNC_ARG;
10269
    }
10270
10271
    if (ret == 0) {
10272
        ciphertext = (byte*)XMALLOC(ctSz, ssl->heap, DYNAMIC_TYPE_TLSX);
10273
10274
        if (ciphertext == NULL) {
10275
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10276
            ret = MEMORY_E;
10277
        }
10278
    }
10279
10280
    if (ret == 0) {
10281
        ret = wc_KyberKey_DecodePublicKey(kemKey, clientData, pubSz);
10282
    }
10283
    if (ret == 0) {
10284
        ret = wc_KyberKey_Encapsulate(kemKey, ciphertext,
10285
                                      ssOutput, ssl->rng);
10286
        if (ret != 0) {
10287
            WOLFSSL_MSG("wc_KyberKey encapsulation failure.");
10288
        }
10289
    }
10290
10291
    if (ret == 0) {
10292
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10293
10294
        *ssOutSz = ssSz;
10295
        keyShareEntry->ke = NULL;
10296
        keyShareEntry->keLen = 0;
10297
10298
        keyShareEntry->pubKey = ciphertext;
10299
        keyShareEntry->pubKeyLen = ctSz;
10300
        ciphertext = NULL;
10301
10302
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
10303
         * the server side. */
10304
        ssl->namedGroup = keyShareEntry->group;
10305
    }
10306
10307
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
10308
10309
    wc_KyberKey_Free(kemKey);
10310
    XFREE(kemKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
10311
    keyShareEntry->key = NULL;
10312
    return ret;
10313
}
10314
10315
static int TLSX_KeyShare_HandlePqcHybridKeyServer(WOLFSSL* ssl,
10316
    KeyShareEntry* keyShareEntry, byte* data, word16 len)
10317
{
10318
    /* I am the server. The data parameter is the concatenation of the client's
10319
     * ECDH public key and the KEM public key. I need to generate a matching
10320
     * public key for ECDH and encapsulate a shared secret using the KEM public
10321
     * key. We send the ECDH public key and the KEM ciphertext back to the
10322
     * client. Additionally, we create the ECDH shared secret here already.
10323
     */
10324
    int    type;
10325
    byte*  ciphertext = NULL;
10326
    int    ret = 0;
10327
    int    pqc_group = 0;
10328
    int    ecc_group = 0;
10329
    int    pqc_first = 0;
10330
    KeyShareEntry *ecc_kse = NULL;
10331
    KeyShareEntry *pqc_kse = NULL;
10332
    word32 pubSz = 0;
10333
    word32 ctSz = 0;
10334
    word32 ssSzPqc = 0;
10335
    word32 ssSzEcc = 0;
10336
10337
    if (data == NULL) {
10338
        WOLFSSL_MSG("No hybrid key share data from the client.");
10339
        return BAD_FUNC_ARG;
10340
    }
10341
10342
    /* Determine the ECC and PQC group of the hybrid combination */
10343
    findEccPqc(&ecc_group, &pqc_group, &pqc_first, keyShareEntry->group);
10344
    if (ecc_group == 0 || pqc_group == 0) {
10345
        WOLFSSL_MSG("Invalid hybrid group");
10346
        ret = BAD_FUNC_ARG;
10347
    }
10348
10349
    if (ret == 0) {
10350
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
10351
                   DYNAMIC_TYPE_TLSX);
10352
        pqc_kse = (KeyShareEntry*)XMALLOC(sizeof(*pqc_kse), ssl->heap,
10353
                   DYNAMIC_TYPE_TLSX);
10354
        if (ecc_kse == NULL || pqc_kse == NULL) {
10355
            WOLFSSL_MSG("kse memory allocation failure");
10356
            ret = MEMORY_ERROR;
10357
        }
10358
    }
10359
10360
    /* The ciphertext and shared secret sizes of a KEM are fixed. Hence, we
10361
     * decode these sizes to properly concatenate the KEM ciphertext with the
10362
     * ECDH public key. */
10363
    if (ret == 0) {
10364
        XMEMSET(pqc_kse, 0, sizeof(*pqc_kse));
10365
        pqc_kse->group = pqc_group;
10366
10367
        /* Allocate a Kyber key to hold private key. */
10368
        pqc_kse->key = (KyberKey*) XMALLOC(sizeof(KyberKey), ssl->heap,
10369
                                           DYNAMIC_TYPE_PRIVATE_KEY);
10370
        if (pqc_kse->key == NULL) {
10371
            WOLFSSL_MSG("GenPqcKey memory error");
10372
            ret = MEMORY_E;
10373
        }
10374
        if (ret == 0) {
10375
            ret = mlkem_id2type(pqc_kse->group, &type);
10376
        }
10377
        if (ret != 0) {
10378
            WOLFSSL_MSG("Invalid PQC algorithm specified.");
10379
            ret = BAD_FUNC_ARG;
10380
        }
10381
        if (ret == 0) {
10382
            ret = wc_KyberKey_Init(type, (KyberKey*)pqc_kse->key,
10383
                                   ssl->heap, ssl->devId);
10384
            if (ret != 0) {
10385
                WOLFSSL_MSG("Error creating Kyber KEM");
10386
            }
10387
        }
10388
        if (ret == 0) {
10389
            ret = wc_KyberKey_SharedSecretSize((KyberKey*)pqc_kse->key,
10390
                                               &ssSzPqc);
10391
        }
10392
        if (ret == 0) {
10393
            ret = wc_KyberKey_CipherTextSize((KyberKey*)pqc_kse->key,
10394
                                             &ctSz);
10395
        }
10396
        if (ret == 0) {
10397
            ret = wc_KyberKey_PublicKeySize((KyberKey*)pqc_kse->key,
10398
                                            &pubSz);
10399
        }
10400
    }
10401
10402
    /* Generate the ECDH key share part to be sent to the client */
10403
    if (ret == 0 && ecc_group != 0) {
10404
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
10405
        ecc_kse->group = ecc_group;
10406
    #ifdef HAVE_CURVE25519
10407
        if (ecc_group == WOLFSSL_ECC_X25519) {
10408
            ret = TLSX_KeyShare_GenX25519Key(ssl, ecc_kse);
10409
        }
10410
        else
10411
    #endif
10412
    #ifdef HAVE_CURVE448
10413
        if (ecc_group == WOLFSSL_ECC_X448) {
10414
            ret = TLSX_KeyShare_GenX448Key(ssl, ecc_kse);
10415
        }
10416
        else
10417
    #endif
10418
        {
10419
            ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
10420
        }
10421
        /* No error message, TLSX_KeyShare_GenKey will do it. */
10422
    }
10423
10424
    if (ret == 0 && len != pubSz + ecc_kse->pubKeyLen) {
10425
        WOLFSSL_MSG("Invalid public key.");
10426
        ret = BAD_FUNC_ARG;
10427
    }
10428
10429
    /* Allocate buffer for the concatenated client key share data
10430
     * (PQC KEM ciphertext + ECDH public key) */
10431
    if (ret == 0) {
10432
        ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap,
10433
            DYNAMIC_TYPE_TLSX);
10434
10435
        if (ciphertext == NULL) {
10436
            WOLFSSL_MSG("Ciphertext memory allocation failure.");
10437
            ret = MEMORY_E;
10438
        }
10439
    }
10440
10441
    /* Process ECDH key share part. The generated shared secret is directly
10442
     * stored in the ssl->arrays->preMasterSecret buffer. Depending on the
10443
     * pqc_first flag, the ECDH shared secret part goes before or after the
10444
     * KEM part. */
10445
    if (ret == 0) {
10446
        ecc_kse->keLen = len - pubSz;
10447
        ecc_kse->ke = (byte*)XMALLOC(ecc_kse->keLen, ssl->heap,
10448
                                     DYNAMIC_TYPE_PUBLIC_KEY);
10449
        if (ecc_kse->ke == NULL) {
10450
            WOLFSSL_MSG("ecc_kse memory allocation failure");
10451
            ret = MEMORY_ERROR;
10452
        }
10453
        if (ret == 0) {
10454
            int pubOffset = 0;
10455
            int ssOffset = 0;
10456
10457
            /* Set the ECC size variable to the initial buffer size */
10458
            ssSzEcc = ssl->arrays->preMasterSz;
10459
10460
            if (pqc_first) {
10461
                pubOffset = pubSz;
10462
                ssOffset = ssSzPqc;
10463
            }
10464
10465
            XMEMCPY(ecc_kse->ke, data + pubOffset, ecc_kse->keLen);
10466
10467
        #ifdef HAVE_CURVE25519
10468
            if (ecc_group == WOLFSSL_ECC_X25519) {
10469
                ret = TLSX_KeyShare_ProcessX25519_ex(ssl, ecc_kse,
10470
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10471
            }
10472
            else
10473
        #endif
10474
        #ifdef HAVE_CURVE448
10475
            if (ecc_group == WOLFSSL_ECC_X448) {
10476
                ret = TLSX_KeyShare_ProcessX448_ex(ssl, ecc_kse,
10477
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10478
            }
10479
            else
10480
        #endif
10481
            {
10482
                ret = TLSX_KeyShare_ProcessEcc_ex(ssl, ecc_kse,
10483
                        ssl->arrays->preMasterSecret + ssOffset, &ssSzEcc);
10484
            }
10485
        }
10486
        if (ret == 0) {
10487
            if (ssSzEcc != ecc_kse->keyLen) {
10488
                WOLFSSL_MSG("Data length mismatch.");
10489
                ret = BAD_FUNC_ARG;
10490
            }
10491
        }
10492
    }
10493
10494
    if (ret == 0 && ssSzEcc + ssSzPqc > ENCRYPT_LEN) {
10495
        WOLFSSL_MSG("shared secret is too long.");
10496
        ret = LENGTH_ERROR;
10497
    }
10498
10499
    /* Process PQC KEM key share part. Depending on the pqc_first flag, the
10500
     * KEM shared secret part goes before or after the ECDH part. */
10501
    if (ret == 0) {
10502
        int input_offset = ecc_kse->keLen;
10503
        int output_offset = ssSzEcc;
10504
10505
        if (pqc_first) {
10506
            input_offset = 0;
10507
            output_offset = 0;
10508
        }
10509
10510
        ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, pqc_kse,
10511
                data + input_offset, pubSz,
10512
                ssl->arrays->preMasterSecret + output_offset, &ssSzPqc);
10513
    }
10514
10515
    if (ret == 0) {
10516
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10517
10518
        ssl->arrays->preMasterSz = ssSzEcc + ssSzPqc;
10519
        keyShareEntry->ke = NULL;
10520
        keyShareEntry->keLen = 0;
10521
10522
        /* Concatenate the ECDH public key and the PQC KEM ciphertext. Based on
10523
         * the pqc_first flag, the ECDH public key goes before or after the KEM
10524
         * ciphertext. */
10525
        if (pqc_first) {
10526
            XMEMCPY(ciphertext, pqc_kse->pubKey, ctSz);
10527
            XMEMCPY(ciphertext + ctSz, ecc_kse->pubKey, ecc_kse->pubKeyLen);
10528
        }
10529
        else {
10530
            XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen);
10531
            XMEMCPY(ciphertext + ecc_kse->pubKeyLen, pqc_kse->pubKey, ctSz);
10532
        }
10533
10534
        keyShareEntry->pubKey = ciphertext;
10535
        keyShareEntry->pubKeyLen = ecc_kse->pubKeyLen + ctSz;
10536
        ciphertext = NULL;
10537
10538
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
10539
         * the server side. */
10540
        ssl->namedGroup = keyShareEntry->group;
10541
    }
10542
10543
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
10544
    TLSX_KeyShare_FreeAll(pqc_kse, ssl->heap);
10545
    XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
10546
    return ret;
10547
}
10548
#endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_MLKEM_NO_ENCAPSULATE */
10549
10550
/* Use the data to create a new key share object in the extensions.
10551
 *
10552
 * ssl    The SSL/TLS object.
10553
 * group  The named group.
10554
 * len    The length of the public key data.
10555
 * data   The public key data.
10556
 * kse    The new key share entry object.
10557
 * returns 0 on success and other values indicate failure.
10558
 */
10559
int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
10560
                      KeyShareEntry **kse, TLSX** extensions)
10561
5.49k
{
10562
5.49k
    int            ret = 0;
10563
5.49k
    TLSX*          extension;
10564
5.49k
    KeyShareEntry* keyShareEntry = NULL;
10565
10566
    /* Find the KeyShare extension if it exists. */
10567
5.49k
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10568
5.49k
    if (extension == NULL) {
10569
        /* Push new KeyShare extension. */
10570
3.25k
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10571
3.25k
        if (ret != 0)
10572
1
            return ret;
10573
10574
3.25k
        extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10575
3.25k
        if (extension == NULL)
10576
0
            return MEMORY_E;
10577
3.25k
    }
10578
5.49k
    extension->resp = 0;
10579
10580
    /* Try to find the key share entry with this group. */
10581
5.49k
    keyShareEntry = (KeyShareEntry*)extension->data;
10582
6.35k
    while (keyShareEntry != NULL) {
10583
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
10584
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
10585
                keyShareEntry->group == WOLFSSL_P256_ML_KEM_512) ||
10586
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
10587
                keyShareEntry->group == WOLFSSL_P384_ML_KEM_768) ||
10588
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
10589
                keyShareEntry->group == WOLFSSL_P521_ML_KEM_1024)) {
10590
            keyShareEntry->group = group;
10591
            break;
10592
        }
10593
        else
10594
#endif
10595
1.21k
        if (keyShareEntry->group == group)
10596
354
            break;
10597
859
        keyShareEntry = keyShareEntry->next;
10598
859
    }
10599
10600
    /* Create a new key share entry if not found. */
10601
5.49k
    if (keyShareEntry == NULL) {
10602
5.14k
        ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
10603
5.14k
                                ssl->heap, &keyShareEntry);
10604
5.14k
        if (ret != 0)
10605
8
            return ret;
10606
5.14k
    }
10607
10608
10609
#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
10610
    if (ssl->options.side == WOLFSSL_SERVER_END &&
10611
            WOLFSSL_NAMED_GROUP_IS_PQC(group)) {
10612
        ret = TLSX_KeyShare_HandlePqcKeyServer((WOLFSSL*)ssl,
10613
                                               keyShareEntry,
10614
                                               data, len,
10615
                                               ssl->arrays->preMasterSecret,
10616
                                               &ssl->arrays->preMasterSz);
10617
        if (ret != 0)
10618
            return ret;
10619
    }
10620
    else if (ssl->options.side == WOLFSSL_SERVER_END &&
10621
             WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) {
10622
        ret = TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
10623
                                                     keyShareEntry,
10624
                                                     data, len);
10625
        if (ret != 0)
10626
            return ret;
10627
    }
10628
    else
10629
#endif
10630
5.49k
    if (data != NULL) {
10631
2.09k
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10632
2.09k
        keyShareEntry->ke = data;
10633
2.09k
        keyShareEntry->keLen = len;
10634
2.09k
    }
10635
3.39k
    else {
10636
        /* Generate a key pair. Casting to non-const since changes inside are
10637
         * minimal but would require an extensive redesign to refactor. Also
10638
         * this path shouldn't be taken when parsing a ClientHello in stateless
10639
         * mode. */
10640
3.39k
        ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, keyShareEntry);
10641
3.39k
        if (ret != 0)
10642
476
            return ret;
10643
3.39k
    }
10644
10645
5.01k
    if (kse != NULL)
10646
190
        *kse = keyShareEntry;
10647
10648
5.01k
    return 0;
10649
5.49k
}
10650
10651
/* Set an empty Key Share extension.
10652
 *
10653
 * ssl  The SSL/TLS object.
10654
 * returns 0 on success and other values indicate failure.
10655
 */
10656
int TLSX_KeyShare_Empty(WOLFSSL* ssl)
10657
66
{
10658
66
    int   ret = 0;
10659
66
    TLSX* extension;
10660
10661
    /* Find the KeyShare extension if it exists. */
10662
66
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
10663
66
    if (extension == NULL) {
10664
        /* Push new KeyShare extension. */
10665
0
        ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10666
0
    }
10667
66
    else if (extension->data != NULL) {
10668
66
        TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
10669
66
        extension->data = NULL;
10670
66
    }
10671
10672
66
    return ret;
10673
66
}
10674
10675
static const word16 preferredGroup[] = {
10676
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
10677
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256
10678
    WOLFSSL_ECC_SECP256R1,
10679
#if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
10680
    WOLFSSL_ECC_SM2P256V1,
10681
#endif
10682
#endif
10683
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10684
    WOLFSSL_ECC_X25519,
10685
#endif
10686
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10687
    WOLFSSL_ECC_X448,
10688
#endif
10689
#if defined(HAVE_ECC) && (!defined(NO_ECC384) || \
10690
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384
10691
    WOLFSSL_ECC_SECP384R1,
10692
#endif
10693
#if defined(HAVE_ECC) && (!defined(NO_ECC521) || \
10694
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
10695
    WOLFSSL_ECC_SECP521R1,
10696
#endif
10697
#if defined(HAVE_FFDHE_2048)
10698
    WOLFSSL_FFDHE_2048,
10699
#endif
10700
#if defined(HAVE_FFDHE_3072)
10701
    WOLFSSL_FFDHE_3072,
10702
#endif
10703
#if defined(HAVE_FFDHE_4096)
10704
    WOLFSSL_FFDHE_4096,
10705
#endif
10706
#if defined(HAVE_FFDHE_6144)
10707
    WOLFSSL_FFDHE_6144,
10708
#endif
10709
#if defined(HAVE_FFDHE_8192)
10710
    WOLFSSL_FFDHE_8192,
10711
#endif
10712
#ifndef WOLFSSL_NO_ML_KEM
10713
#ifdef WOLFSSL_WC_MLKEM
10714
    #ifndef WOLFSSL_NO_ML_KEM_512
10715
    WOLFSSL_ML_KEM_512,
10716
    WOLFSSL_P256_ML_KEM_512,
10717
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10718
    WOLFSSL_X25519_ML_KEM_512,
10719
    #endif
10720
    #endif
10721
    #ifndef WOLFSSL_NO_ML_KEM_768
10722
    WOLFSSL_ML_KEM_768,
10723
    WOLFSSL_P384_ML_KEM_768,
10724
    WOLFSSL_P256_ML_KEM_768,
10725
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10726
    WOLFSSL_X25519_ML_KEM_768,
10727
    #endif
10728
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10729
    WOLFSSL_X448_ML_KEM_768,
10730
    #endif
10731
    #endif
10732
    #ifndef WOLFSSL_NO_ML_KEM_1024
10733
    WOLFSSL_ML_KEM_1024,
10734
    WOLFSSL_P521_ML_KEM_1024,
10735
    WOLFSSL_P384_ML_KEM_1024,
10736
    #endif
10737
#elif defined(HAVE_LIBOQS)
10738
    /* These require a runtime call to TLSX_IsGroupSupported to use */
10739
    WOLFSSL_ML_KEM_512,
10740
    WOLFSSL_ML_KEM_768,
10741
    WOLFSSL_ML_KEM_1024,
10742
    WOLFSSL_P256_ML_KEM_512,
10743
    WOLFSSL_P384_ML_KEM_768,
10744
    WOLFSSL_P256_ML_KEM_768,
10745
    WOLFSSL_P521_ML_KEM_1024,
10746
    WOLFSSL_P384_ML_KEM_1024,
10747
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10748
    WOLFSSL_X25519_ML_KEM_512,
10749
    WOLFSSL_X25519_ML_KEM_768,
10750
    #endif
10751
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10752
    WOLFSSL_X448_ML_KEM_768,
10753
    #endif
10754
#endif
10755
#endif /* !WOLFSSL_NO_ML_KEM */
10756
#ifdef WOLFSSL_MLKEM_KYBER
10757
#ifdef WOLFSSL_WC_MLKEM
10758
    #ifdef WOLFSSL_KYBER512
10759
    WOLFSSL_KYBER_LEVEL1,
10760
    WOLFSSL_P256_KYBER_LEVEL1,
10761
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10762
    WOLFSSL_X25519_KYBER_LEVEL1,
10763
    #endif
10764
    #endif
10765
    #ifdef WOLFSSL_KYBER768
10766
    WOLFSSL_KYBER_LEVEL3,
10767
    WOLFSSL_P384_KYBER_LEVEL3,
10768
    WOLFSSL_P256_KYBER_LEVEL3,
10769
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10770
    WOLFSSL_X25519_KYBER_LEVEL3,
10771
    #endif
10772
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
10773
    WOLFSSL_X448_KYBER_LEVEL3,
10774
    #endif
10775
    #endif
10776
    #ifdef WOLFSSL_KYBER1024
10777
    WOLFSSL_KYBER_LEVEL5,
10778
    WOLFSSL_P521_KYBER_LEVEL5,
10779
    #endif
10780
#elif defined(HAVE_LIBOQS)
10781
    /* These require a runtime call to TLSX_IsGroupSupported to use */
10782
    WOLFSSL_KYBER_LEVEL1,
10783
    WOLFSSL_KYBER_LEVEL3,
10784
    WOLFSSL_KYBER_LEVEL5,
10785
    WOLFSSL_P256_KYBER_LEVEL1,
10786
    WOLFSSL_P384_KYBER_LEVEL3,
10787
    WOLFSSL_P256_KYBER_LEVEL3,
10788
    WOLFSSL_P521_KYBER_LEVEL5,
10789
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
10790
    WOLFSSL_X25519_KYBER_LEVEL1,
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
#endif /* WOLFSSL_MLKEM_KYBER */
10798
    WOLFSSL_NAMED_GROUP_INVALID
10799
};
10800
10801
#define PREFERRED_GROUP_SZ \
10802
    ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
10803
                                            /* -1 for the invalid group */
10804
10805
/* Examines the application specified group ranking and returns the rank of the
10806
 * group.
10807
 * If no group ranking set then all groups are rank 0 (highest).
10808
 *
10809
 * ssl    The SSL/TLS object.
10810
 * group  The group to check ranking for.
10811
 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
10812
 */
10813
static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
10814
1.35k
{
10815
1.35k
    byte i;
10816
1.35k
    const word16* groups;
10817
1.35k
    byte numGroups;
10818
10819
1.35k
    if (ssl->numGroups == 0) {
10820
1.35k
        return 0;
10821
1.35k
    }
10822
0
    else {
10823
0
        groups = ssl->group;
10824
0
        numGroups = ssl->numGroups;
10825
0
    }
10826
10827
#ifdef HAVE_LIBOQS
10828
      if (!TLSX_IsGroupSupported(group))
10829
          return WOLFSSL_FATAL_ERROR;
10830
#endif
10831
10832
0
    for (i = 0; i < numGroups; i++) {
10833
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
10834
        if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
10835
             groups[i] == WOLFSSL_P256_ML_KEM_512) ||
10836
            (group == WOLFSSL_P384_ML_KEM_768_OLD &&
10837
             groups[i] == WOLFSSL_P384_ML_KEM_768) ||
10838
            (group == WOLFSSL_P521_ML_KEM_1024_OLD &&
10839
             groups[i] == WOLFSSL_P521_ML_KEM_1024)) {
10840
            return i;
10841
        }
10842
#endif
10843
0
        if (groups[i] == (word16)group)
10844
0
            return i;
10845
0
    }
10846
10847
0
    return WOLFSSL_FATAL_ERROR;
10848
0
}
10849
10850
/* Set a key share that is supported by the client into extensions.
10851
 *
10852
 * ssl  The SSL/TLS object.
10853
 * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
10854
 * 0 if a supported group has a key share and other values indicate an error.
10855
 */
10856
int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, TLSX** extensions)
10857
199
{
10858
199
    int             ret;
10859
199
#ifdef HAVE_SUPPORTED_CURVES
10860
199
    TLSX*           extension;
10861
199
    SupportedCurve* curve = NULL;
10862
199
    SupportedCurve* preferredCurve = NULL;
10863
199
    word16          name = WOLFSSL_NAMED_GROUP_INVALID;
10864
199
    KeyShareEntry*  kse = NULL;
10865
199
    int             preferredRank = WOLFSSL_MAX_GROUP_COUNT;
10866
199
    int             rank;
10867
10868
199
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
10869
199
    if (extension != NULL)
10870
170
        curve = (SupportedCurve*)extension->data;
10871
437
    for (; curve != NULL; curve = curve->next) {
10872
        /* Use server's preference order. Common group was found but key share
10873
         * was missing */
10874
238
        if (!TLSX_IsGroupSupported(curve->name))
10875
0
            continue;
10876
238
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
10877
0
            continue;
10878
10879
238
        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
10880
238
        if (rank == -1)
10881
0
            continue;
10882
238
        if (rank < preferredRank) {
10883
170
            preferredCurve = curve;
10884
170
            preferredRank = rank;
10885
170
        }
10886
238
    }
10887
199
    curve = preferredCurve;
10888
10889
199
    if (curve == NULL) {
10890
29
        byte i;
10891
        /* Fallback to user selected group */
10892
29
        preferredRank = WOLFSSL_MAX_GROUP_COUNT;
10893
29
        for (i = 0; i < ssl->numGroups; i++) {
10894
0
            rank = TLSX_KeyShare_GroupRank(ssl, ssl->group[i]);
10895
0
            if (rank == -1)
10896
0
                continue;
10897
0
            if (rank < preferredRank) {
10898
0
                name = ssl->group[i];
10899
0
                preferredRank = rank;
10900
0
            }
10901
0
        }
10902
29
        if (name == WOLFSSL_NAMED_GROUP_INVALID) {
10903
            /* No group selected or specified by the server */
10904
29
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10905
29
            return BAD_KEY_SHARE_DATA;
10906
29
        }
10907
29
    }
10908
170
    else {
10909
170
        name = curve->name;
10910
170
    }
10911
10912
    #ifdef WOLFSSL_ASYNC_CRYPT
10913
    /* Check the old key share data list. */
10914
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
10915
    if (extension != NULL) {
10916
        kse = (KeyShareEntry*)extension->data;
10917
        /* We should not be computing keys if we are only going to advertise
10918
         * our choice here. */
10919
        if (kse != NULL && kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
10920
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
10921
            return BAD_KEY_SHARE_DATA;
10922
        }
10923
    }
10924
    #endif
10925
10926
    /* Push new KeyShare extension. This will also free the old one */
10927
170
    ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
10928
170
    if (ret != 0)
10929
34
        return ret;
10930
    /* Extension got pushed to head */
10931
136
    extension = *extensions;
10932
    /* Push the selected curve */
10933
136
    ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, name,
10934
136
                            ssl->heap, &kse);
10935
136
    if (ret != 0)
10936
4
        return ret;
10937
    /* Set extension to be in response. */
10938
132
    extension->resp = 1;
10939
#else
10940
10941
    (void)ssl;
10942
10943
    WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN);
10944
    ret = NOT_COMPILED_IN;
10945
#endif
10946
10947
132
    return ret;
10948
136
}
10949
10950
#ifdef WOLFSSL_DUAL_ALG_CERTS
10951
/* Writes the CKS objects of a list in a buffer. */
10952
static word16 CKS_WRITE(WOLFSSL* ssl, byte* output)
10953
{
10954
    XMEMCPY(output, ssl->sigSpec, ssl->sigSpecSz);
10955
    return ssl->sigSpecSz;
10956
}
10957
10958
static int TLSX_UseCKS(TLSX** extensions, WOLFSSL* ssl, void* heap)
10959
{
10960
    int ret = 0;
10961
    TLSX* extension;
10962
10963
    if (extensions == NULL) {
10964
        return BAD_FUNC_ARG;
10965
    }
10966
10967
    extension = TLSX_Find(*extensions, TLSX_CKS);
10968
    /* If it is already present, do nothing. */
10969
    if (extension == NULL) {
10970
        /* The data required is in the ssl struct, so push it in. */
10971
        ret = TLSX_Push(extensions, TLSX_CKS, (void*)ssl, heap);
10972
    }
10973
10974
    return ret;
10975
}
10976
10977
int TLSX_CKS_Set(WOLFSSL* ssl, TLSX** extensions)
10978
{
10979
    int ret;
10980
    TLSX* extension;
10981
    /* Push new KeyShare extension. This will also free the old one */
10982
    ret = TLSX_Push(extensions, TLSX_CKS, NULL, ssl->heap);
10983
    if (ret != 0)
10984
        return ret;
10985
    /* Extension got pushed to head */
10986
    extension = *extensions;
10987
    /* Need ssl->sigSpecSz during extension length calculation. */
10988
    extension->data = ssl;
10989
    /* Set extension to be in response. */
10990
    extension->resp = 1;
10991
    return ret;
10992
}
10993
10994
int TLSX_CKS_Parse(WOLFSSL* ssl, byte* input, word16 length,
10995
                   TLSX** extensions)
10996
{
10997
    int ret;
10998
    int i, j;
10999
11000
    (void) extensions;
11001
11002
    /* Validating the input. */
11003
    if (length == 0)
11004
        return BUFFER_ERROR;
11005
    for (i = 0; i < length; i++) {
11006
        switch (input[i])
11007
        {
11008
            case WOLFSSL_CKS_SIGSPEC_NATIVE:
11009
            case WOLFSSL_CKS_SIGSPEC_ALTERNATIVE:
11010
            case WOLFSSL_CKS_SIGSPEC_BOTH:
11011
                /* These are all valid values; do nothing */
11012
                break;
11013
            case WOLFSSL_CKS_SIGSPEC_EXTERNAL:
11014
            default:
11015
                /* All other values (including external) are not. */
11016
                return BAD_FUNC_ARG;
11017
        }
11018
    }
11019
11020
    /* This could be a situation where the client tried to start with TLS 1.3
11021
     * when it sent ClientHello and the server down-graded to TLS 1.2. In that
11022
     * case, erroring out because it is TLS 1.2 is not a reasonable thing to do.
11023
     * In the case of TLS 1.2, the CKS values will be ignored. */
11024
    if (!IsAtLeastTLSv1_3(ssl->version)) {
11025
        ssl->sigSpec = NULL;
11026
        ssl->sigSpecSz = 0;
11027
        return 0;
11028
    }
11029
11030
    /* Extension data is valid, but if we are the server and we don't have an
11031
     * alt private key, do not respond with CKS extension. */
11032
    if (wolfSSL_is_server(ssl) && ssl->buffers.altKey == NULL) {
11033
        ssl->sigSpec = NULL;
11034
        ssl->sigSpecSz = 0;
11035
        return 0;
11036
    }
11037
11038
    /* Copy as the lifetime of input seems to be ephemeral. */
11039
    ssl->peerSigSpec = (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_TLSX);
11040
    if (ssl->peerSigSpec == NULL) {
11041
        return BUFFER_ERROR;
11042
    }
11043
    XMEMCPY(ssl->peerSigSpec, input, length);
11044
    ssl->peerSigSpecSz = length;
11045
11046
    /* If there is no preference set, use theirs... */
11047
    if (ssl->sigSpec == NULL) {
11048
        ret = wolfSSL_UseCKS(ssl, ssl->peerSigSpec, 1);
11049
        if (ret == WOLFSSL_SUCCESS) {
11050
            ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11051
            TLSX_SetResponse(ssl, TLSX_CKS);
11052
        }
11053
        return ret;
11054
    }
11055
11056
    /* ...otherwise, prioritize our preference. */
11057
    for (i = 0; i < ssl->sigSpecSz; i++) {
11058
        for (j = 0; j < length; j++) {
11059
            if (ssl->sigSpec[i] == input[j]) {
11060
                /* Got the match, set to this one. */
11061
                ret = wolfSSL_UseCKS(ssl, &ssl->sigSpec[i], 1);
11062
                if (ret == WOLFSSL_SUCCESS) {
11063
                    ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap);
11064
                    TLSX_SetResponse(ssl, TLSX_CKS);
11065
                }
11066
                return ret;
11067
            }
11068
        }
11069
    }
11070
11071
    /* No match found. Cannot continue. */
11072
    return MATCH_SUITE_ERROR;
11073
}
11074
#endif /* WOLFSSL_DUAL_ALG_CERTS */
11075
11076
/* Server side KSE processing */
11077
int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
11078
    byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, byte* searched)
11079
{
11080
    TLSX*          extension;
11081
    KeyShareEntry* clientKSE = NULL;
11082
    KeyShareEntry* list = NULL;
11083
    KeyShareEntry* preferredKSE = NULL;
11084
    int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
11085
    int rank;
11086
11087
    (void)cipherSuite0;
11088
    (void)cipherSuite;
11089
11090
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11091
        return BAD_FUNC_ARG;
11092
11093
    *searched = 0;
11094
11095
    /* Find the KeyShare extension if it exists. */
11096
    extension = TLSX_Find(extensions, TLSX_KEY_SHARE);
11097
    if (extension != NULL)
11098
        list = (KeyShareEntry*)extension->data;
11099
11100
    if (extension && extension->resp == 1) {
11101
        /* Outside of the async case this path should not be taken. */
11102
        int ret = WC_NO_ERR_TRACE(INCOMPLETE_DATA);
11103
    #ifdef WOLFSSL_ASYNC_CRYPT
11104
        /* in async case make sure key generation is finalized */
11105
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
11106
        if (serverKSE && serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) {
11107
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
11108
                *searched = 1;
11109
            ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11110
        }
11111
        else
11112
    #endif
11113
        {
11114
            ret = INCOMPLETE_DATA;
11115
        }
11116
        return ret;
11117
    }
11118
11119
    /* Use server's preference order. */
11120
    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
11121
        if ((clientKSE->ke == NULL) &&
11122
            (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) &&
11123
            (!WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)))
11124
            continue;
11125
11126
#ifdef WOLFSSL_SM2
11127
        if ((cipherSuite0 == CIPHER_BYTE) &&
11128
            ((cipherSuite == TLS_SM4_GCM_SM3) ||
11129
             (cipherSuite == TLS_SM4_CCM_SM3))) {
11130
           if (clientKSE->group != WOLFSSL_ECC_SM2P256V1) {
11131
               continue;
11132
           }
11133
        }
11134
        else if (clientKSE->group == WOLFSSL_ECC_SM2P256V1) {
11135
           continue;
11136
        }
11137
#endif
11138
11139
        /* Check consistency now - extensions in any order. */
11140
        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions))
11141
            continue;
11142
11143
        if (!WOLFSSL_NAMED_GROUP_IS_FFDHE(clientKSE->group)) {
11144
            /* Check max value supported. */
11145
            if (clientKSE->group > WOLFSSL_ECC_MAX) {
11146
#ifdef WOLFSSL_HAVE_MLKEM
11147
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) &&
11148
                    !WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group))
11149
#endif
11150
                    continue;
11151
            }
11152
            if (wolfSSL_curve_is_disabled(ssl, clientKSE->group))
11153
                continue;
11154
        }
11155
        if (!TLSX_IsGroupSupported(clientKSE->group))
11156
            continue;
11157
11158
        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
11159
        if (rank == -1)
11160
            continue;
11161
        if (rank < preferredRank) {
11162
            preferredKSE = clientKSE;
11163
            preferredRank = rank;
11164
        }
11165
    }
11166
    *kse = preferredKSE;
11167
    *searched = 1;
11168
    return 0;
11169
}
11170
11171
/* Server side KSE processing */
11172
int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
11173
1.09k
{
11174
1.09k
    int            ret;
11175
1.09k
    TLSX*          extension;
11176
1.09k
    KeyShareEntry* serverKSE;
11177
1.09k
    KeyShareEntry* list = NULL;
11178
11179
1.09k
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
11180
0
        return BAD_FUNC_ARG;
11181
11182
1.09k
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11183
1.09k
    if (extension == NULL)
11184
0
        return BAD_STATE_E;
11185
11186
1.09k
    if (clientKSE == NULL) {
11187
#ifdef WOLFSSL_ASYNC_CRYPT
11188
        /* Not necessarily an error. The key may have already been setup. */
11189
        if (extension != NULL && extension->resp == 1) {
11190
            serverKSE = (KeyShareEntry*)extension->data;
11191
            if (serverKSE != NULL) {
11192
                /* in async case make sure key generation is finalized */
11193
                if (serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E))
11194
                    return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
11195
                else if (serverKSE->lastRet == 0)
11196
                    return 0;
11197
            }
11198
        }
11199
#endif
11200
0
        return BAD_FUNC_ARG;
11201
0
    }
11202
11203
    /* Generate a new key pair except in the case of PQC KEM because we
11204
     * are going to encapsulate and that does not require us to generate a
11205
     * key pair.
11206
     */
11207
1.09k
    ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
11208
1.09k
    if (ret != 0)
11209
18
        return ret;
11210
11211
1.07k
    if (clientKSE->key == NULL) {
11212
#ifdef WOLFSSL_HAVE_MLKEM
11213
        if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group) ||
11214
            WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
11215
            /* Going to need the public key (AKA ciphertext). */
11216
            serverKSE->pubKey = clientKSE->pubKey;
11217
            clientKSE->pubKey = NULL;
11218
            serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11219
            clientKSE->pubKeyLen = 0;
11220
        }
11221
        else
11222
#endif
11223
1.07k
        {
11224
1.07k
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
11225
1.07k
        }
11226
11227
        /* for async do setup of serverKSE below, but return WC_PENDING_E */
11228
1.07k
        if (ret != 0
11229
        #ifdef WOLFSSL_ASYNC_CRYPT
11230
            && ret != WC_NO_ERR_TRACE(WC_PENDING_E)
11231
        #endif
11232
1.07k
        ) {
11233
285
            TLSX_KeyShare_FreeAll(list, ssl->heap);
11234
285
            return ret;
11235
285
        }
11236
1.07k
    }
11237
0
    else {
11238
        /* transfer buffers to serverKSE */
11239
0
        serverKSE->key = clientKSE->key;
11240
0
        clientKSE->key = NULL;
11241
0
        serverKSE->keyLen = clientKSE->keyLen;
11242
0
        serverKSE->pubKey = clientKSE->pubKey;
11243
0
        clientKSE->pubKey = NULL;
11244
0
        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11245
0
    #ifndef NO_DH
11246
0
        serverKSE->privKey = clientKSE->privKey;
11247
0
        clientKSE->privKey = NULL;
11248
0
    #endif
11249
0
    }
11250
793
    serverKSE->ke = clientKSE->ke;
11251
793
    serverKSE->keLen = clientKSE->keLen;
11252
793
    clientKSE->ke = NULL;
11253
793
    clientKSE->keLen = 0;
11254
793
    ssl->namedGroup = serverKSE->group;
11255
11256
793
    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
11257
793
    extension->data = (void *)serverKSE;
11258
11259
793
    extension->resp = 1;
11260
793
    return ret;
11261
1.07k
}
11262
11263
/* Ensure there is a key pair that can be used for key exchange.
11264
 *
11265
 * ssl  The SSL/TLS object.
11266
 * doHelloRetry If set to non-zero will do hello_retry
11267
 * returns 0 on success and other values indicate failure.
11268
 */
11269
int TLSX_KeyShare_Establish(WOLFSSL *ssl, int* doHelloRetry)
11270
0
{
11271
0
    int            ret;
11272
0
    KeyShareEntry* clientKSE = NULL;
11273
0
    byte           searched = 0;
11274
11275
0
    *doHelloRetry = 0;
11276
11277
0
    ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, ssl->cipher.cipherSuite0,
11278
0
        ssl->cipher.cipherSuite, &clientKSE, &searched);
11279
0
    if (ret != 0 || !searched)
11280
0
        return ret;
11281
11282
    /* No supported group found - send HelloRetryRequest. */
11283
0
    if (clientKSE == NULL) {
11284
        /* Set KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
11285
0
        *doHelloRetry = 1;
11286
0
        return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
11287
0
    }
11288
11289
0
    return TLSX_KeyShare_Setup(ssl, clientKSE);
11290
0
}
11291
11292
/* Derive the shared secret of the key exchange.
11293
 *
11294
 * ssl  The SSL/TLS object.
11295
 * returns 0 on success and other values indicate failure.
11296
 */
11297
int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
11298
723
{
11299
723
    int            ret;
11300
723
    TLSX*          extension;
11301
723
    KeyShareEntry* list = NULL;
11302
11303
#ifdef WOLFSSL_ASYNC_CRYPT
11304
    ret = wolfSSL_AsyncPop(ssl, NULL);
11305
    /* Check for error */
11306
    if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) && ret < 0) {
11307
        return ret;
11308
    }
11309
#endif
11310
11311
    /* Find the KeyShare extension if it exists. */
11312
723
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
11313
723
    if (extension != NULL)
11314
723
        list = (KeyShareEntry*)extension->data;
11315
11316
723
    if (list == NULL)
11317
0
        return KEY_SHARE_ERROR;
11318
11319
    /* Calculate secret. */
11320
723
    ret = TLSX_KeyShare_Process(ssl, list);
11321
11322
723
    return ret;
11323
723
}
11324
11325
#define KS_FREE_ALL  TLSX_KeyShare_FreeAll
11326
#define KS_GET_SIZE  TLSX_KeyShare_GetSize
11327
0
#define KS_WRITE     TLSX_KeyShare_Write
11328
#define KS_PARSE     TLSX_KeyShare_Parse
11329
11330
#else
11331
11332
#define KS_FREE_ALL(a, b) WC_DO_NOTHING
11333
#define KS_GET_SIZE(a, b)    0
11334
#define KS_WRITE(a, b, c)    0
11335
#define KS_PARSE(a, b, c, d) 0
11336
11337
#endif /* WOLFSSL_TLS13 */
11338
11339
/******************************************************************************/
11340
/* Pre-Shared Key                                                             */
11341
/******************************************************************************/
11342
11343
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
11344
/* Free the pre-shared key dynamic data.
11345
 *
11346
 * list  The linked list of key share entry objects.
11347
 * heap  The heap used for allocation.
11348
 */
11349
static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
11350
3.39k
{
11351
3.39k
    PreSharedKey* current;
11352
11353
7.00k
    while ((current = list) != NULL) {
11354
3.61k
        list = current->next;
11355
3.61k
        XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
11356
3.61k
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
11357
3.61k
    }
11358
11359
3.39k
    (void)heap;
11360
3.39k
}
11361
11362
/* Get the size of the encoded pre shared key extension.
11363
 *
11364
 * list     The linked list of pre-shared key extensions.
11365
 * msgType  The type of the message this extension is being written into.
11366
 * returns the number of bytes of the encoded pre-shared key extension or
11367
 * SANITY_MSG_E to indicate invalid message type.
11368
 */
11369
static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
11370
                                     word16* pSz)
11371
2.85k
{
11372
2.85k
    if (msgType == client_hello) {
11373
        /* Length of identities + Length of binders. */
11374
2.85k
        word16 len = OPAQUE16_LEN + OPAQUE16_LEN;
11375
5.70k
        while (list != NULL) {
11376
            /* Each entry has: identity, ticket age and binder. */
11377
2.85k
            len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
11378
2.85k
                   OPAQUE8_LEN + (word16)list->binderLen;
11379
2.85k
            list = list->next;
11380
2.85k
        }
11381
2.85k
        *pSz += len;
11382
2.85k
        return 0;
11383
2.85k
    }
11384
11385
0
    if (msgType == server_hello) {
11386
0
        *pSz += OPAQUE16_LEN;
11387
0
        return 0;
11388
0
    }
11389
11390
0
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11391
0
    return SANITY_MSG_E;
11392
0
}
11393
11394
/* The number of bytes to be written for the binders.
11395
 *
11396
 * list     The linked list of pre-shared key extensions.
11397
 * msgType  The type of the message this extension is being written into.
11398
 * returns the number of bytes of the encoded pre-shared key extension or
11399
 * SANITY_MSG_E to indicate invalid message type.
11400
 */
11401
int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
11402
                                     word16* pSz)
11403
6.00k
{
11404
6.00k
    word16 len;
11405
11406
6.00k
    if (msgType != client_hello) {
11407
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11408
0
        return SANITY_MSG_E;
11409
0
    }
11410
11411
    /* Length of all binders. */
11412
6.00k
    len = OPAQUE16_LEN;
11413
12.0k
    while (list != NULL) {
11414
6.00k
        len += OPAQUE8_LEN + (word16)list->binderLen;
11415
6.00k
        list = list->next;
11416
6.00k
    }
11417
11418
6.00k
    *pSz = len;
11419
6.00k
    return 0;
11420
6.00k
}
11421
11422
/* Writes the pre-shared key extension into the output buffer - binders only.
11423
 * Assumes that the the output buffer is big enough to hold data.
11424
 *
11425
 * list     The linked list of key share entries.
11426
 * output   The buffer to write into.
11427
 * msgType  The type of the message this extension is being written into.
11428
 * returns the number of bytes written into the buffer.
11429
 */
11430
int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
11431
                                   byte msgType, word16* pSz)
11432
2.82k
{
11433
2.82k
    PreSharedKey* current = list;
11434
2.82k
    word16 idx = 0;
11435
2.82k
    word16 lenIdx;
11436
2.82k
    word16 len;
11437
11438
2.82k
    if (msgType != client_hello) {
11439
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11440
0
        return SANITY_MSG_E;
11441
0
    }
11442
11443
    /* Skip length of all binders. */
11444
2.82k
    lenIdx = idx;
11445
2.82k
    idx += OPAQUE16_LEN;
11446
5.65k
    while (current != NULL) {
11447
        /* Binder data length. */
11448
2.82k
        output[idx++] = (byte)current->binderLen;
11449
        /* Binder data. */
11450
2.82k
        XMEMCPY(output + idx, current->binder, current->binderLen);
11451
2.82k
        idx += (word16)current->binderLen;
11452
11453
2.82k
        current = current->next;
11454
2.82k
    }
11455
    /* Length of the binders. */
11456
2.82k
    len = idx - lenIdx - OPAQUE16_LEN;
11457
2.82k
    c16toa(len, output + lenIdx);
11458
11459
2.82k
    *pSz = idx;
11460
2.82k
    return 0;
11461
2.82k
}
11462
11463
11464
/* Writes the pre-shared key extension into the output buffer.
11465
 * Assumes that the the output buffer is big enough to hold data.
11466
 *
11467
 * list     The linked list of key share entries.
11468
 * output   The buffer to write into.
11469
 * msgType  The type of the message this extension is being written into.
11470
 * returns the number of bytes written into the buffer.
11471
 */
11472
static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
11473
                                   byte msgType, word16* pSz)
11474
2.84k
{
11475
2.84k
    if (msgType == client_hello) {
11476
2.84k
        PreSharedKey* current = list;
11477
2.84k
        word16 idx = 0;
11478
2.84k
        word16 lenIdx;
11479
2.84k
        word16 len;
11480
2.84k
        int ret;
11481
11482
        /* Write identities only. Binders after HMACing over this. */
11483
2.84k
        lenIdx = idx;
11484
2.84k
        idx += OPAQUE16_LEN;
11485
5.69k
        while (current != NULL) {
11486
            /* Identity length */
11487
2.84k
            c16toa(current->identityLen, output + idx);
11488
2.84k
            idx += OPAQUE16_LEN;
11489
            /* Identity data */
11490
2.84k
            XMEMCPY(output + idx, current->identity, current->identityLen);
11491
2.84k
            idx += current->identityLen;
11492
11493
            /* Obfuscated ticket age. */
11494
2.84k
            c32toa(current->ticketAge, output + idx);
11495
2.84k
            idx += OPAQUE32_LEN;
11496
11497
2.84k
            current = current->next;
11498
2.84k
        }
11499
        /* Length of the identities. */
11500
2.84k
        len = idx - lenIdx - OPAQUE16_LEN;
11501
2.84k
        c16toa(len, output + lenIdx);
11502
11503
        /* Don't include binders here.
11504
         * The binders are based on the hash of all the ClientHello data up to
11505
         * and include the identities written above.
11506
         */
11507
2.84k
        ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
11508
2.84k
        if (ret < 0)
11509
0
            return ret;
11510
2.84k
        *pSz += idx + len;
11511
2.84k
    }
11512
0
    else if (msgType == server_hello) {
11513
0
        word16 i;
11514
11515
        /* Find the index of the chosen identity. */
11516
0
        for (i=0; list != NULL && !list->chosen; i++)
11517
0
            list = list->next;
11518
0
        if (list == NULL) {
11519
0
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
11520
0
            return BUILD_MSG_ERROR;
11521
0
        }
11522
11523
        /* The index of the identity chosen by the server from the list supplied
11524
         * by the client.
11525
         */
11526
0
        c16toa(i, output);
11527
0
        *pSz += OPAQUE16_LEN;
11528
0
    }
11529
0
    else {
11530
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11531
0
        return SANITY_MSG_E;
11532
0
    }
11533
11534
2.84k
    return 0;
11535
2.84k
}
11536
11537
int TLSX_PreSharedKey_Parse_ClientHello(TLSX** extensions, const byte* input,
11538
                                        word16 length, void* heap)
11539
598
{
11540
11541
598
    int    ret;
11542
598
    word16 len;
11543
598
    word16 idx = 0;
11544
598
    TLSX*         extension;
11545
598
    PreSharedKey* list;
11546
11547
598
    TLSX_Remove(extensions, TLSX_PRE_SHARED_KEY, heap);
11548
11549
    /* Length of identities and of binders. */
11550
598
    if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
11551
3
        return BUFFER_E;
11552
11553
    /* Length of identities. */
11554
595
    ato16(input + idx, &len);
11555
595
    idx += OPAQUE16_LEN;
11556
595
    if (len < MIN_PSK_ID_LEN || length - idx < len)
11557
30
        return BUFFER_E;
11558
11559
    /* Create a pre-shared key object for each identity. */
11560
1.54k
    while (len > 0) {
11561
1.16k
        const byte* identity;
11562
1.16k
        word16      identityLen;
11563
1.16k
        word32      age;
11564
11565
1.16k
        if (len < OPAQUE16_LEN)
11566
4
            return BUFFER_E;
11567
11568
        /* Length of identity. */
11569
1.15k
        ato16(input + idx, &identityLen);
11570
1.15k
        idx += OPAQUE16_LEN;
11571
1.15k
        if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
11572
1.15k
                identityLen > MAX_PSK_ID_LEN)
11573
87
            return BUFFER_E;
11574
        /* Cache identity pointer. */
11575
1.06k
        identity = input + idx;
11576
1.06k
        idx += identityLen;
11577
        /* Ticket age. */
11578
1.06k
        ato32(input + idx, &age);
11579
1.06k
        idx += OPAQUE32_LEN;
11580
11581
1.06k
        ret = TLSX_PreSharedKey_Use(extensions, identity, identityLen, age, no_mac,
11582
1.06k
                                    0, 0, 1, NULL, heap);
11583
1.06k
        if (ret != 0)
11584
86
            return ret;
11585
11586
        /* Done with this identity. */
11587
983
        len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
11588
983
    }
11589
11590
    /* Find the list of identities sent to server. */
11591
388
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11592
388
    if (extension == NULL)
11593
0
        return PSK_KEY_ERROR;
11594
388
    list = (PreSharedKey*)extension->data;
11595
11596
    /* Length of binders. */
11597
388
    if (idx + OPAQUE16_LEN > length)
11598
3
        return BUFFER_E;
11599
385
    ato16(input + idx, &len);
11600
385
    idx += OPAQUE16_LEN;
11601
385
    if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
11602
42
        return BUFFER_E;
11603
11604
    /* Set binder for each identity. */
11605
668
    while (list != NULL && len > 0) {
11606
        /* Length of binder */
11607
344
        list->binderLen = input[idx++];
11608
344
        if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
11609
344
                list->binderLen > WC_MAX_DIGEST_SIZE)
11610
15
            return BUFFER_E;
11611
329
        if (len < OPAQUE8_LEN + list->binderLen)
11612
4
            return BUFFER_E;
11613
11614
        /* Copy binder into static buffer. */
11615
325
        XMEMCPY(list->binder, input + idx, list->binderLen);
11616
325
        idx += (word16)list->binderLen;
11617
11618
        /* Done with binder entry. */
11619
325
        len -= OPAQUE8_LEN + (word16)list->binderLen;
11620
11621
        /* Next identity. */
11622
325
        list = list->next;
11623
325
    }
11624
324
    if (list != NULL || len != 0)
11625
10
        return BUFFER_E;
11626
11627
314
    return 0;
11628
11629
324
}
11630
11631
/* Parse the pre-shared key extension.
11632
 * Different formats in different messages.
11633
 *
11634
 * ssl      The SSL/TLS object.
11635
 * input    The extension data.
11636
 * length   The length of the extension data.
11637
 * msgType  The type of the message this extension is being parsed from.
11638
 * returns 0 on success and other values indicate failure.
11639
 */
11640
static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, const byte* input,
11641
                                   word16 length, byte msgType)
11642
605
{
11643
11644
605
    if (msgType == client_hello) {
11645
588
        return TLSX_PreSharedKey_Parse_ClientHello(&ssl->extensions, input,
11646
588
                                                   length, ssl->heap);
11647
588
    }
11648
11649
17
    if (msgType == server_hello) {
11650
17
        word16 idx;
11651
17
        PreSharedKey* list;
11652
17
        TLSX*         extension;
11653
11654
        /* Index of identity chosen by server. */
11655
17
        if (length != OPAQUE16_LEN)
11656
1
            return BUFFER_E;
11657
16
        ato16(input, &idx);
11658
11659
    #ifdef WOLFSSL_EARLY_DATA
11660
        ssl->options.pskIdIndex = idx + 1;
11661
    #endif
11662
11663
        /* Find the list of identities sent to server. */
11664
16
        extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
11665
16
        if (extension == NULL)
11666
0
            return PSK_KEY_ERROR;
11667
16
        list = (PreSharedKey*)extension->data;
11668
11669
        /* Mark the identity as chosen. */
11670
26
        for (; list != NULL && idx > 0; idx--)
11671
10
            list = list->next;
11672
16
        if (list == NULL) {
11673
10
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
11674
10
            return PSK_KEY_ERROR;
11675
10
        }
11676
6
        list->chosen = 1;
11677
11678
6
    #ifdef HAVE_SESSION_TICKET
11679
6
        if (list->resumption) {
11680
           /* Check that the session's details are the same as the server's. */
11681
0
           if (ssl->options.cipherSuite0  != ssl->session->cipherSuite0       ||
11682
0
               ssl->options.cipherSuite   != ssl->session->cipherSuite        ||
11683
0
               ssl->session->version.major != ssl->ctx->method->version.major ||
11684
0
               ssl->session->version.minor != ssl->ctx->method->version.minor) {
11685
0
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
11686
0
               return PSK_KEY_ERROR;
11687
0
           }
11688
0
        }
11689
6
    #endif
11690
11691
6
        return 0;
11692
6
    }
11693
11694
0
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11695
0
    return SANITY_MSG_E;
11696
17
}
11697
11698
/* Create a new pre-shared key and put it into the list.
11699
 *
11700
 * list          The linked list of pre-shared key.
11701
 * identity      The identity.
11702
 * len           The length of the identity data.
11703
 * heap          The memory to allocate with.
11704
 * preSharedKey  The new pre-shared key object.
11705
 * returns 0 on success and other values indicate failure.
11706
 */
11707
static int TLSX_PreSharedKey_New(PreSharedKey** list, const byte* identity,
11708
                                 word16 len, void *heap,
11709
                                 PreSharedKey** preSharedKey)
11710
3.69k
{
11711
3.69k
    PreSharedKey* psk;
11712
3.69k
    PreSharedKey** next;
11713
11714
3.69k
    psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
11715
3.69k
    if (psk == NULL)
11716
72
        return MEMORY_E;
11717
3.62k
    XMEMSET(psk, 0, sizeof(*psk));
11718
11719
    /* Make a copy of the identity data. */
11720
3.62k
    psk->identity = (byte*)XMALLOC(len + NULL_TERM_LEN, heap,
11721
3.62k
                                   DYNAMIC_TYPE_TLSX);
11722
3.62k
    if (psk->identity == NULL) {
11723
11
        XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
11724
11
        return MEMORY_E;
11725
11
    }
11726
3.61k
    XMEMCPY(psk->identity, identity, len);
11727
3.61k
    psk->identityLen = len;
11728
    /* Use a NULL terminator in case it is a C string */
11729
3.61k
    psk->identity[psk->identityLen] = '\0';
11730
11731
    /* Add it to the end and maintain the links. */
11732
4.07k
    while (*list != NULL) {
11733
        /* Assign to temporary to work around compiler bug found by customer. */
11734
459
        next = &((*list)->next);
11735
459
        list = next;
11736
459
    }
11737
3.61k
    *list = psk;
11738
3.61k
    *preSharedKey = psk;
11739
11740
3.61k
    (void)heap;
11741
11742
3.61k
    return 0;
11743
3.62k
}
11744
11745
static WC_INLINE byte GetHmacLength(int hmac)
11746
{
11747
    switch (hmac) {
11748
    #ifndef NO_SHA256
11749
        case sha256_mac:
11750
            return WC_SHA256_DIGEST_SIZE;
11751
    #endif
11752
    #ifdef WOLFSSL_SHA384
11753
        case sha384_mac:
11754
            return WC_SHA384_DIGEST_SIZE;
11755
    #endif
11756
    #ifdef WOLFSSL_SHA512
11757
        case sha512_mac:
11758
            return WC_SHA512_DIGEST_SIZE;
11759
    #endif
11760
    #ifdef WOLFSSL_SM3
11761
        case sm3_mac:
11762
            return WC_SM3_DIGEST_SIZE;
11763
    #endif
11764
        default:
11765
            break;
11766
    }
11767
    return 0;
11768
}
11769
11770
/* Use the data to create a new pre-shared key object in the extensions.
11771
 *
11772
 * ssl           The SSL/TLS object.
11773
 * identity      The identity.
11774
 * len           The length of the identity data.
11775
 * age           The age of the identity.
11776
 * hmac          The HMAC algorithm.
11777
 * cipherSuite0  The first byte of the cipher suite to use.
11778
 * cipherSuite   The second byte of the cipher suite to use.
11779
 * resumption    The PSK is for resumption of a session.
11780
 * preSharedKey  The new pre-shared key object.
11781
 * returns 0 on success and other values indicate failure.
11782
 */
11783
int TLSX_PreSharedKey_Use(TLSX** extensions, const byte* identity, word16 len,
11784
                          word32 age, byte hmac, byte cipherSuite0,
11785
                          byte cipherSuite, byte resumption,
11786
                          PreSharedKey **preSharedKey, void* heap)
11787
3.93k
{
11788
3.93k
    int           ret = 0;
11789
3.93k
    TLSX*         extension;
11790
3.93k
    PreSharedKey* psk = NULL;
11791
11792
    /* Find the pre-shared key extension if it exists. */
11793
3.93k
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11794
3.93k
    if (extension == NULL) {
11795
        /* Push new pre-shared key extension. */
11796
3.40k
        ret = TLSX_Push(extensions, TLSX_PRE_SHARED_KEY, NULL, heap);
11797
3.40k
        if (ret != 0)
11798
13
            return ret;
11799
11800
3.39k
        extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
11801
3.39k
        if (extension == NULL)
11802
0
            return MEMORY_E;
11803
3.39k
    }
11804
11805
    /* Try to find the pre-shared key with this identity. */
11806
3.91k
    psk = (PreSharedKey*)extension->data;
11807
4.87k
    while (psk != NULL) {
11808
1.18k
        if ((psk->identityLen == len) &&
11809
1.18k
               (XMEMCMP(psk->identity, identity, len) == 0)) {
11810
221
            break;
11811
221
        }
11812
959
        psk = psk->next;
11813
959
    }
11814
11815
    /* Create a new pre-shared key object if not found. */
11816
3.91k
    if (psk == NULL) {
11817
3.69k
        ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
11818
3.69k
                                    len, heap, &psk);
11819
3.69k
        if (ret != 0)
11820
83
            return ret;
11821
3.69k
    }
11822
11823
    /* Update/set age and HMAC algorithm. */
11824
3.83k
    psk->ticketAge    = age;
11825
3.83k
    psk->hmac         = hmac;
11826
3.83k
    psk->cipherSuite0 = cipherSuite0;
11827
3.83k
    psk->cipherSuite  = cipherSuite;
11828
3.83k
    psk->resumption   = resumption;
11829
3.83k
    psk->binderLen    = GetHmacLength(psk->hmac);
11830
11831
3.83k
    if (preSharedKey != NULL)
11832
0
        *preSharedKey = psk;
11833
11834
3.83k
    return 0;
11835
3.91k
}
11836
11837
#define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
11838
#define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
11839
0
#define PSK_WRITE     TLSX_PreSharedKey_Write
11840
#define PSK_PARSE     TLSX_PreSharedKey_Parse
11841
11842
#else
11843
11844
#define PSK_FREE_ALL(a, b) WC_DO_NOTHING
11845
#define PSK_GET_SIZE(a, b, c) 0
11846
#define PSK_WRITE(a, b, c, d) 0
11847
#define PSK_PARSE(a, b, c, d) 0
11848
11849
#endif
11850
11851
/******************************************************************************/
11852
/* PSK Key Exchange Modes                                                     */
11853
/******************************************************************************/
11854
11855
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
11856
/* Get the size of the encoded PSK KE modes extension.
11857
 * Only in ClientHello.
11858
 *
11859
 * modes    The PSK KE mode bit string.
11860
 * msgType  The type of the message this extension is being written into.
11861
 * returns the number of bytes of the encoded PSK KE mode extension.
11862
 */
11863
static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
11864
2.85k
{
11865
2.85k
    if (msgType == client_hello) {
11866
        /* Format: Len | Modes* */
11867
2.85k
        word16 len = OPAQUE8_LEN;
11868
        /* Check whether each possible mode is to be written. */
11869
2.85k
        if (modes & (1 << PSK_KE))
11870
2.85k
            len += OPAQUE8_LEN;
11871
2.85k
        if (modes & (1 << PSK_DHE_KE))
11872
2.85k
            len += OPAQUE8_LEN;
11873
2.85k
        *pSz += len;
11874
2.85k
        return 0;
11875
2.85k
    }
11876
11877
0
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11878
0
    return SANITY_MSG_E;
11879
2.85k
}
11880
11881
/* Writes the PSK KE modes extension into the output buffer.
11882
 * Assumes that the the output buffer is big enough to hold data.
11883
 * Only in ClientHello.
11884
 *
11885
 * modes    The PSK KE mode bit string.
11886
 * output   The buffer to write into.
11887
 * msgType  The type of the message this extension is being written into.
11888
 * returns the number of bytes written into the buffer.
11889
 */
11890
static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
11891
                                 word16* pSz)
11892
2.84k
{
11893
2.84k
    if (msgType == client_hello) {
11894
        /* Format: Len | Modes* */
11895
2.84k
        word16 idx = OPAQUE8_LEN;
11896
11897
        /* Write out each possible mode. */
11898
2.84k
        if (modes & (1 << PSK_KE))
11899
2.84k
            output[idx++] = PSK_KE;
11900
2.84k
        if (modes & (1 << PSK_DHE_KE))
11901
2.84k
            output[idx++] = PSK_DHE_KE;
11902
        /* Write out length of mode list. */
11903
2.84k
        output[0] = (byte)(idx - OPAQUE8_LEN);
11904
11905
2.84k
        *pSz += idx;
11906
2.84k
        return 0;
11907
2.84k
    }
11908
11909
0
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11910
0
    return SANITY_MSG_E;
11911
2.84k
}
11912
11913
int TLSX_PskKeyModes_Parse_Modes(const byte* input, word16 length, byte msgType,
11914
                                byte* modes)
11915
507
{
11916
507
    if (msgType == client_hello) {
11917
        /* Format: Len | Modes* */
11918
507
        int   idx = 0;
11919
507
        word16 len;
11920
507
        *modes = 0;
11921
11922
        /* Ensure length byte exists. */
11923
507
        if (length < OPAQUE8_LEN)
11924
0
            return BUFFER_E;
11925
11926
        /* Get length of mode list and ensure that is the only data. */
11927
507
        len = input[0];
11928
507
        if (length - OPAQUE8_LEN != len)
11929
23
            return BUFFER_E;
11930
11931
484
        idx = OPAQUE8_LEN;
11932
        /* Set a bit for each recognized modes. */
11933
2.76k
        while (len > 0) {
11934
            /* Ignore unrecognized modes.  */
11935
2.27k
            if (input[idx] <= PSK_DHE_KE)
11936
663
               *modes |= 1 << input[idx];
11937
2.27k
            idx++;
11938
2.27k
            len--;
11939
2.27k
        }
11940
484
        return 0;
11941
507
    }
11942
11943
0
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
11944
0
    return SANITY_MSG_E;
11945
507
}
11946
11947
/* Parse the PSK KE modes extension.
11948
 * Only in ClientHello.
11949
 *
11950
 * ssl      The SSL/TLS object.
11951
 * input    The extension data.
11952
 * length   The length of the extension data.
11953
 * msgType  The type of the message this extension is being parsed from.
11954
 * returns 0 on success and other values indicate failure.
11955
 */
11956
static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, const byte* input, word16 length,
11957
                                 byte msgType)
11958
507
{
11959
507
    int    ret;
11960
507
    byte modes;
11961
11962
507
    ret = TLSX_PskKeyModes_Parse_Modes(input, length, msgType, &modes);
11963
507
    if (ret == 0)
11964
484
        ret = TLSX_PskKeyModes_Use(ssl, modes);
11965
11966
507
    if (ret != 0) {
11967
39
        WOLFSSL_ERROR_VERBOSE(ret);
11968
39
    }
11969
11970
507
    return ret;
11971
507
}
11972
11973
/* Use the data to create a new PSK Key Exchange Modes object in the extensions.
11974
 *
11975
 * ssl    The SSL/TLS object.
11976
 * modes  The PSK key exchange modes.
11977
 * returns 0 on success and other values indicate failure.
11978
 */
11979
int TLSX_PskKeyModes_Use(WOLFSSL* ssl, byte modes)
11980
3.33k
{
11981
3.33k
    int           ret = 0;
11982
3.33k
    TLSX*         extension;
11983
11984
    /* Find the PSK key exchange modes extension if it exists. */
11985
3.33k
    extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
11986
3.33k
    if (extension == NULL) {
11987
        /* Push new PSK key exchange modes extension. */
11988
3.25k
        ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
11989
3.25k
            ssl->heap);
11990
3.25k
        if (ret != 0)
11991
17
            return ret;
11992
11993
3.24k
        extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
11994
3.24k
        if (extension == NULL)
11995
0
            return MEMORY_E;
11996
3.24k
    }
11997
11998
3.32k
    extension->val = modes;
11999
12000
3.32k
    return 0;
12001
3.33k
}
12002
12003
#define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
12004
0
#define PKM_WRITE     TLSX_PskKeModes_Write
12005
#define PKM_PARSE     TLSX_PskKeModes_Parse
12006
12007
#else
12008
12009
#define PKM_GET_SIZE(a, b, c) 0
12010
#define PKM_WRITE(a, b, c, d) 0
12011
#define PKM_PARSE(a, b, c, d) 0
12012
12013
#endif
12014
12015
/******************************************************************************/
12016
/* Post-Handshake Authentication                                              */
12017
/******************************************************************************/
12018
12019
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
12020
/* Get the size of the encoded Post-Handshake Authentication extension.
12021
 * Only in ClientHello.
12022
 *
12023
 * msgType  The type of the message this extension is being written into.
12024
 * returns the number of bytes of the encoded Post-Handshake Authentication
12025
 * extension.
12026
 */
12027
static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
12028
{
12029
    if (msgType == client_hello) {
12030
        *pSz += 0;
12031
        return 0;
12032
    }
12033
12034
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12035
    return SANITY_MSG_E;
12036
}
12037
12038
/* Writes the Post-Handshake Authentication extension into the output buffer.
12039
 * Assumes that the the output buffer is big enough to hold data.
12040
 * Only in ClientHello.
12041
 *
12042
 * output   The buffer to write into.
12043
 * msgType  The type of the message this extension is being written into.
12044
 * returns the number of bytes written into the buffer.
12045
 */
12046
static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
12047
{
12048
    (void)output;
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
/* Parse the Post-Handshake Authentication extension.
12060
 * Only in ClientHello.
12061
 *
12062
 * ssl      The SSL/TLS object.
12063
 * input    The extension data.
12064
 * length   The length of the extension data.
12065
 * msgType  The type of the message this extension is being parsed from.
12066
 * returns 0 on success and other values indicate failure.
12067
 */
12068
static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, const byte* input,
12069
                                   word16 length, byte msgType)
12070
{
12071
    (void)input;
12072
12073
    if (msgType == client_hello) {
12074
        /* Ensure extension is empty. */
12075
        if (length != 0)
12076
            return BUFFER_E;
12077
12078
        ssl->options.postHandshakeAuth = 1;
12079
        return 0;
12080
    }
12081
12082
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12083
    return SANITY_MSG_E;
12084
}
12085
12086
/* Create a new Post-handshake authentication object in the extensions.
12087
 *
12088
 * ssl    The SSL/TLS object.
12089
 * returns 0 on success and other values indicate failure.
12090
 */
12091
static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
12092
{
12093
    int   ret = 0;
12094
    TLSX* extension;
12095
12096
    /* Find the PSK key exchange modes extension if it exists. */
12097
    extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
12098
    if (extension == NULL) {
12099
        /* Push new Post-handshake Authentication extension. */
12100
        ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
12101
            ssl->heap);
12102
        if (ret != 0)
12103
            return ret;
12104
    }
12105
12106
    return 0;
12107
}
12108
12109
#define PHA_GET_SIZE  TLSX_PostHandAuth_GetSize
12110
#define PHA_WRITE     TLSX_PostHandAuth_Write
12111
#define PHA_PARSE     TLSX_PostHandAuth_Parse
12112
12113
#else
12114
12115
#define PHA_GET_SIZE(a, b)    0
12116
#define PHA_WRITE(a, b, c)    0
12117
#define PHA_PARSE(a, b, c, d) 0
12118
12119
#endif
12120
12121
/******************************************************************************/
12122
/* Early Data Indication                                                      */
12123
/******************************************************************************/
12124
12125
#ifdef WOLFSSL_EARLY_DATA
12126
/* Get the size of the encoded Early Data Indication extension.
12127
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12128
 *
12129
 * msgType  The type of the message this extension is being written into.
12130
 * returns the number of bytes of the encoded Early Data Indication extension.
12131
 */
12132
static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
12133
{
12134
    int ret = 0;
12135
12136
    if (msgType == client_hello || msgType == encrypted_extensions)
12137
        *pSz += 0;
12138
    else if (msgType == session_ticket)
12139
        *pSz += OPAQUE32_LEN;
12140
    else {
12141
        ret = SANITY_MSG_E;
12142
        WOLFSSL_ERROR_VERBOSE(ret);
12143
    }
12144
12145
    return ret;
12146
}
12147
12148
/* Writes the Early Data Indicator extension into the output buffer.
12149
 * Assumes that the the output buffer is big enough to hold data.
12150
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12151
 *
12152
 * maxSz    The maximum early data size.
12153
 * output   The buffer to write into.
12154
 * msgType  The type of the message this extension is being written into.
12155
 * returns the number of bytes written into the buffer.
12156
 */
12157
static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
12158
                                word16* pSz)
12159
{
12160
    if (msgType == client_hello || msgType == encrypted_extensions)
12161
        return 0;
12162
    else if (msgType == session_ticket) {
12163
        c32toa(maxSz, output);
12164
        *pSz += OPAQUE32_LEN;
12165
        return 0;
12166
    }
12167
12168
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12169
    return SANITY_MSG_E;
12170
}
12171
12172
/* Parse the Early Data Indicator extension.
12173
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
12174
 *
12175
 * ssl      The SSL/TLS object.
12176
 * input    The extension data.
12177
 * length   The length of the extension data.
12178
 * msgType  The type of the message this extension is being parsed from.
12179
 * returns 0 on success and other values indicate failure.
12180
 */
12181
static int TLSX_EarlyData_Parse(WOLFSSL* ssl, const byte* input, word16 length,
12182
                                 byte msgType)
12183
{
12184
    WOLFSSL_ENTER("TLSX_EarlyData_Parse");
12185
    if (msgType == client_hello) {
12186
        if (length != 0)
12187
            return BUFFER_E;
12188
12189
        if (ssl->earlyData == expecting_early_data) {
12190
12191
            if (ssl->options.maxEarlyDataSz != 0)
12192
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
12193
            else
12194
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
12195
12196
            return TLSX_EarlyData_Use(ssl, 0, 0);
12197
        }
12198
        ssl->earlyData = early_data_ext;
12199
12200
        return 0;
12201
    }
12202
    if (msgType == encrypted_extensions) {
12203
        if (length != 0)
12204
            return BUFFER_E;
12205
12206
        /* Ensure the index of PSK identity chosen by server is 0.
12207
         * Index is plus one to handle 'not set' value of 0.
12208
         */
12209
        if (ssl->options.pskIdIndex != 1) {
12210
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
12211
            return PSK_KEY_ERROR;
12212
        }
12213
12214
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
12215
            /* the extension from server comes in */
12216
            ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
12217
        }
12218
12219
        return TLSX_EarlyData_Use(ssl, 1, 1);
12220
    }
12221
    if (msgType == session_ticket) {
12222
        word32 maxSz;
12223
12224
        if (length != OPAQUE32_LEN)
12225
            return BUFFER_E;
12226
        ato32(input, &maxSz);
12227
12228
        ssl->session->maxEarlyDataSz = maxSz;
12229
        return 0;
12230
    }
12231
12232
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
12233
    return SANITY_MSG_E;
12234
}
12235
12236
/* Use the data to create a new Early Data object in the extensions.
12237
 *
12238
 * ssl    The SSL/TLS object.
12239
 * maxSz  The maximum early data size.
12240
 * is_response   if this extension is part of a response
12241
 * returns 0 on success and other values indicate failure.
12242
 */
12243
int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz, int is_response)
12244
{
12245
    int   ret = 0;
12246
    TLSX* extension;
12247
12248
    /* Find the early data extension if it exists. */
12249
    extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
12250
    if (extension == NULL) {
12251
        /* Push new early data extension. */
12252
        ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
12253
        if (ret != 0)
12254
            return ret;
12255
12256
        extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
12257
        if (extension == NULL)
12258
            return MEMORY_E;
12259
    }
12260
12261
    extension->resp = is_response;
12262
    /* In QUIC, earlydata size is either 0 or 0xffffffff.
12263
     * Override any size between, possibly left from our initial value */
12264
    extension->val  = (WOLFSSL_IS_QUIC(ssl) && is_response && maxSz > 0) ?
12265
                       WOLFSSL_MAX_32BIT : maxSz;
12266
12267
    return 0;
12268
}
12269
12270
#define EDI_GET_SIZE  TLSX_EarlyData_GetSize
12271
#define EDI_WRITE     TLSX_EarlyData_Write
12272
#define EDI_PARSE     TLSX_EarlyData_Parse
12273
12274
#else
12275
12276
#define EDI_GET_SIZE(a, b)    0
12277
#define EDI_WRITE(a, b, c, d) 0
12278
#define EDI_PARSE(a, b, c, d) 0
12279
12280
#endif
12281
12282
/******************************************************************************/
12283
/* QUIC transport parameter extension                                         */
12284
/******************************************************************************/
12285
#ifdef WOLFSSL_QUIC
12286
12287
static word16 TLSX_QuicTP_GetSize(TLSX* extension)
12288
{
12289
    const QuicTransportParam *tp = (QuicTransportParam*)extension->data;
12290
12291
    return tp ? tp->len : 0;
12292
}
12293
12294
int TLSX_QuicTP_Use(WOLFSSL* ssl, TLSX_Type ext_type, int is_response)
12295
{
12296
    int ret = 0;
12297
    TLSX* extension;
12298
12299
    WOLFSSL_ENTER("TLSX_QuicTP_Use");
12300
    if (ssl->quic.transport_local == NULL) {
12301
        /* RFC9000, ch 7.3: "An endpoint MUST treat the absence of [...]
12302
         *     from either endpoint [...] as a connection error of type
12303
         *     TRANSPORT_PARAMETER_ERROR."
12304
         */
12305
        ret = QUIC_TP_MISSING_E;
12306
        goto cleanup;
12307
    }
12308
12309
    extension = TLSX_Find(ssl->extensions, ext_type);
12310
    if (extension == NULL) {
12311
        ret = TLSX_Push(&ssl->extensions, ext_type, NULL, ssl->heap);
12312
        if (ret != 0)
12313
            goto cleanup;
12314
12315
        extension = TLSX_Find(ssl->extensions, ext_type);
12316
        if (extension == NULL) {
12317
            ret = MEMORY_E;
12318
            goto cleanup;
12319
        }
12320
    }
12321
    if (extension->data) {
12322
        QuicTransportParam_free((QuicTransportParam*)extension->data, ssl->heap);
12323
        extension->data = NULL;
12324
    }
12325
    extension->resp = is_response;
12326
    extension->data = (void*)QuicTransportParam_dup(ssl->quic.transport_local, ssl->heap);
12327
    if (!extension->data) {
12328
        ret = MEMORY_E;
12329
        goto cleanup;
12330
    }
12331
12332
cleanup:
12333
    WOLFSSL_LEAVE("TLSX_QuicTP_Use", ret);
12334
    return ret;
12335
}
12336
12337
static word16 TLSX_QuicTP_Write(QuicTransportParam *tp, byte* output)
12338
{
12339
    word16 len = 0;
12340
12341
    WOLFSSL_ENTER("TLSX_QuicTP_Write");
12342
    if (tp && tp->len) {
12343
        XMEMCPY(output, tp->data, tp->len);
12344
        len = tp->len;
12345
    }
12346
    WOLFSSL_LEAVE("TLSX_QuicTP_Write", len);
12347
    return len;
12348
}
12349
12350
static int TLSX_QuicTP_Parse(WOLFSSL *ssl, const byte *input, size_t len, int ext_type, int msgType)
12351
{
12352
    const QuicTransportParam *tp, **ptp;
12353
12354
    (void)msgType;
12355
    tp = QuicTransportParam_new(input, len, ssl->heap);
12356
    if (!tp) {
12357
        return MEMORY_E;
12358
    }
12359
    ptp = (ext_type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT) ?
12360
        &ssl->quic.transport_peer_draft : &ssl->quic.transport_peer;
12361
    if (*ptp) {
12362
        QTP_FREE(*ptp, ssl->heap);
12363
    }
12364
    *ptp = tp;
12365
    return 0;
12366
}
12367
12368
#define QTP_GET_SIZE    TLSX_QuicTP_GetSize
12369
#define QTP_USE         TLSX_QuicTP_Use
12370
#define QTP_WRITE       TLSX_QuicTP_Write
12371
#define QTP_PARSE       TLSX_QuicTP_Parse
12372
12373
#endif /* WOLFSSL_QUIC */
12374
12375
#if defined(WOLFSSL_DTLS_CID)
12376
#define CID_GET_SIZE  TLSX_ConnectionID_GetSize
12377
#define CID_WRITE  TLSX_ConnectionID_Write
12378
#define CID_PARSE  TLSX_ConnectionID_Parse
12379
#define CID_FREE  TLSX_ConnectionID_Free
12380
#else
12381
#define CID_GET_SIZE(a) 0
12382
#define CID_WRITE(a, b) 0
12383
#define CID_PARSE(a, b, c, d) 0
12384
#define CID_FREE(a, b) 0
12385
#endif /* defined(WOLFSSL_DTLS_CID) */
12386
12387
#if defined(HAVE_RPK)
12388
/******************************************************************************/
12389
/* Client_Certificate_Type extension                                          */
12390
/******************************************************************************/
12391
/* return 1 if specified type is included in the given list, otherwise 0 */
12392
static int IsCertTypeListed(byte type, byte cnt, const byte* list)
12393
{
12394
    int ret = 0;
12395
    int i;
12396
12397
    if (cnt == 0 || list == NULL)
12398
        return ret;
12399
12400
    if (cnt > 0 && cnt <= MAX_CLIENT_CERT_TYPE_CNT) {
12401
        for (i = 0; i < cnt; i++) {
12402
            if (list[i] == type)
12403
                return 1;
12404
        }
12405
    }
12406
    return 0;
12407
}
12408
12409
/* Search both arrays from above to find a common value between the two given
12410
 * arrays(a and b). return 1 if it finds a common value, otherwise return 0.
12411
 */
12412
static int GetCommonItem(const byte* a, byte aLen, const byte* b, byte bLen,
12413
                                                                    byte* type)
12414
{
12415
    int i, j;
12416
12417
    if (a == NULL || b == NULL)
12418
        return 0;
12419
12420
    for (i = 0; i < aLen; i++) {
12421
        for (j = 0; j < bLen; j++) {
12422
            if (a[i] == b[j]) {
12423
                *type = a[i];
12424
                return 1;
12425
            }
12426
        }
12427
    }
12428
    return 0;
12429
}
12430
12431
/* Creates a "client certificate type" extension if necessary.
12432
 * Returns 0 if no error occurred, negative value otherwise.
12433
 * A return of 0, it does not indicae that the extension was created.
12434
 */
12435
static int TLSX_ClientCertificateType_Use(WOLFSSL* ssl, byte isServer)
12436
{
12437
    int ret = 0;
12438
12439
    if (ssl == NULL)
12440
        return BAD_FUNC_ARG;
12441
12442
    if (isServer) {
12443
        /* [in server side]
12444
         */
12445
12446
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12447
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12448
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
12449
12450
            WOLFSSL_MSG("Adding Client Certificate Type extension");
12451
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
12452
                                                                    ssl->heap);
12453
            if (ret == 0) {
12454
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
12455
            }
12456
        }
12457
    }
12458
    else {
12459
        /* [in client side]
12460
         * This extension MUST be omitted from the ClientHello unless the RPK
12461
         * certificate is preferred by the user and actually loaded.
12462
         */
12463
12464
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12465
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12466
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
12467
12468
            if (ssl->options.rpkState.isRPKLoaded) {
12469
12470
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
12471
                ssl->options.rpkState.sending_ClientCertTypes[0] =
12472
                                                        WOLFSSL_CERT_TYPE_RPK;
12473
12474
                /* Push new client_certificate_type extension. */
12475
                WOLFSSL_MSG("Adding Client Certificate Type extension");
12476
                ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE,
12477
                                                                ssl, ssl->heap);
12478
            }
12479
            else {
12480
                WOLFSSL_MSG("Willing to use RPK cert but not loaded it");
12481
            }
12482
        }
12483
        else {
12484
            WOLFSSL_MSG("No will to use RPK cert");
12485
        }
12486
    }
12487
    return ret;
12488
}
12489
12490
/* Parse a "client certificate type" extension received from peer.
12491
 * returns 0 on success and other values indicate failure.
12492
 */
12493
static int TLSX_ClientCertificateType_Parse(WOLFSSL* ssl, const byte* input,
12494
                                                word16 length, byte msgType)
12495
{
12496
    byte typeCnt;
12497
    int idx = 0;
12498
    int ret = 0;
12499
    int i;
12500
    int populate = 0;
12501
    byte  cmnType;
12502
12503
12504
    if (msgType == client_hello) {
12505
        /* [parse ClientHello in server end]
12506
         * case 1) if peer verify is disabled, this extension must be omitted
12507
         *         from ServerHello.
12508
         * case 2) if user have not set his preference, find X509 in parsed
12509
         *         result, then populate "Client Certificate Type" extension.
12510
         * case 3) if user have not set his preference and X509 isn't included
12511
         *         in parsed result, send "unsupported certificate" alert.
12512
         * case 4) if user have set his preference, find a common cert type
12513
         *         in users preference and received cert types.
12514
         * case 5) if user have set his preference, but no common cert type
12515
         *         found.
12516
         */
12517
12518
        /* case 1 */
12519
        if (ssl->options.verifyNone) {
12520
            return ret;
12521
        }
12522
12523
        /* parse extension */
12524
        if (length < OPAQUE8_LEN)
12525
            return BUFFER_E;
12526
12527
        typeCnt = input[idx];
12528
12529
        if (typeCnt > MAX_CLIENT_CERT_TYPE_CNT)
12530
            return BUFFER_E;
12531
12532
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
12533
            return BUFFER_E;
12534
        }
12535
12536
        ssl->options.rpkState.received_ClientCertTypeCnt = input[idx];
12537
        idx += OPAQUE8_LEN;
12538
12539
        for (i = 0; i < typeCnt; i++) {
12540
            ssl->options.rpkState.received_ClientCertTypes[i] = input[idx];
12541
            idx += OPAQUE8_LEN;
12542
        }
12543
12544
        if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt == 0) {
12545
            /* case 2 */
12546
            if (IsCertTypeListed(WOLFSSL_CERT_TYPE_X509,
12547
                            ssl->options.rpkState.received_ClientCertTypeCnt,
12548
                            ssl->options.rpkState.received_ClientCertTypes)) {
12549
12550
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
12551
                ssl->options.rpkState.sending_ClientCertTypes[0] =
12552
                                                        WOLFSSL_CERT_TYPE_X509;
12553
                populate = 1;
12554
            }
12555
            /* case 3 */
12556
            else {
12557
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
12558
                SendAlert(ssl, alert_fatal, unsupported_certificate);
12559
                return UNSUPPORTED_CERTIFICATE;
12560
            }
12561
        }
12562
        else if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt > 0) {
12563
            /* case 4 */
12564
            if (GetCommonItem(
12565
                            ssl->options.rpkConfig.preferred_ClientCertTypes,
12566
                            ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
12567
                            ssl->options.rpkState.received_ClientCertTypes,
12568
                            ssl->options.rpkState.received_ClientCertTypeCnt,
12569
                            &cmnType)) {
12570
                ssl->options.rpkState.sending_ClientCertTypeCnt  = 1;
12571
                ssl->options.rpkState.sending_ClientCertTypes[0] = cmnType;
12572
                populate = 1;
12573
            }
12574
            /* case 5 */
12575
            else {
12576
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
12577
                SendAlert(ssl, alert_fatal, unsupported_certificate);
12578
                return UNSUPPORTED_CERTIFICATE;
12579
            }
12580
        }
12581
12582
        /* populate client_certificate_type extension */
12583
        if (populate) {
12584
            WOLFSSL_MSG("Adding Client Certificate Type extension");
12585
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
12586
                                                                    ssl->heap);
12587
            if (ret == 0) {
12588
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
12589
            }
12590
        }
12591
    }
12592
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12593
        /* parse it in client side */
12594
        if (length == 1) {
12595
            ssl->options.rpkState.received_ClientCertTypeCnt  = 1;
12596
            ssl->options.rpkState.received_ClientCertTypes[0] = *input;
12597
        }
12598
        else {
12599
            return BUFFER_E;
12600
        }
12601
    }
12602
12603
    return ret;
12604
}
12605
12606
/* Write out the "client certificate type" extension data into the given buffer.
12607
 * return the size wrote in the buffer on success, negative value on error.
12608
 */
12609
static word16 TLSX_ClientCertificateType_Write(void* data, byte* output,
12610
                                              byte msgType)
12611
{
12612
    WOLFSSL* ssl = (WOLFSSL*)data;
12613
    word16 idx = 0;
12614
    byte cnt = 0;
12615
    int i;
12616
12617
    /* skip to write extension if count is zero */
12618
    cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
12619
12620
    if (cnt == 0)
12621
        return 0;
12622
12623
    if (msgType == client_hello) {
12624
        /* client side */
12625
12626
        *(output + idx) = cnt;
12627
        idx += OPAQUE8_LEN;
12628
12629
        for (i = 0; i < cnt; i++) {
12630
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[i];
12631
            idx += OPAQUE8_LEN;
12632
        }
12633
        return idx;
12634
    }
12635
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12636
        /* sever side */
12637
        if (cnt == 1) {
12638
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[0];
12639
            idx += OPAQUE8_LEN;
12640
        }
12641
    }
12642
    return idx;
12643
}
12644
12645
/* Calculate then return the size of the "client certificate type" extension
12646
 * data.
12647
 * return the extension data size on success, negative value on error.
12648
*/
12649
static int TLSX_ClientCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
12650
{
12651
    int ret = 0;
12652
    byte cnt;
12653
12654
    if (ssl == NULL)
12655
        return BAD_FUNC_ARG;
12656
12657
    if (msgType == client_hello) {
12658
        /* client side */
12659
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
12660
        ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
12661
    }
12662
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12663
        /* server side */
12664
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;/* must be one */
12665
        if (cnt != 1)
12666
            return SANITY_MSG_E;
12667
        ret = OPAQUE8_LEN;
12668
    }
12669
    else {
12670
        return SANITY_MSG_E;
12671
    }
12672
    return ret;
12673
}
12674
12675
    #define CCT_GET_SIZE  TLSX_ClientCertificateType_GetSize
12676
    #define CCT_WRITE     TLSX_ClientCertificateType_Write
12677
    #define CCT_PARSE     TLSX_ClientCertificateType_Parse
12678
#else
12679
    #define CCT_GET_SIZE(a)  0
12680
    #define CCT_WRITE(a, b)  0
12681
    #define CCT_PARSE(a, b, c, d) 0
12682
#endif /* HAVE_RPK */
12683
12684
#if defined(HAVE_RPK)
12685
/******************************************************************************/
12686
/* Server_Certificate_Type extension                                          */
12687
/******************************************************************************/
12688
/* Creates a "server certificate type" extension if necessary.
12689
 * Returns 0 if no error occurred, negative value otherwise.
12690
 * A return of 0, it does not indicae that the extension was created.
12691
 */
12692
static int TLSX_ServerCertificateType_Use(WOLFSSL* ssl, byte isServer)
12693
{
12694
    int ret = 0;
12695
    byte ctype;
12696
12697
    if (ssl == NULL)
12698
        return BAD_FUNC_ARG;
12699
12700
    if (isServer) {
12701
        /* [in server side] */
12702
        /* find common cert type to both end */
12703
        if (GetCommonItem(
12704
                ssl->options.rpkConfig.preferred_ServerCertTypes,
12705
                ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
12706
                ssl->options.rpkState.received_ServerCertTypes,
12707
                ssl->options.rpkState.received_ServerCertTypeCnt,
12708
                &ctype)) {
12709
            ssl->options.rpkState.sending_ServerCertTypeCnt = 1;
12710
            ssl->options.rpkState.sending_ServerCertTypes[0] = ctype;
12711
12712
            /* Push new server_certificate_type extension. */
12713
            WOLFSSL_MSG("Adding Server Certificate Type extension");
12714
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
12715
                                                                    ssl->heap);
12716
            if (ret == 0) {
12717
                TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
12718
            }
12719
        }
12720
        else {
12721
            /* no common cert type found */
12722
            WOLFSSL_MSG("No common cert type found in server_certificate_type ext");
12723
            SendAlert(ssl, alert_fatal, unsupported_certificate);
12724
            ret = UNSUPPORTED_CERTIFICATE;
12725
        }
12726
    }
12727
    else {
12728
        /* [in client side] */
12729
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
12730
                            ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
12731
                            ssl->options.rpkConfig.preferred_ServerCertTypes)) {
12732
12733
            ssl->options.rpkState.sending_ServerCertTypeCnt =
12734
                        ssl->options.rpkConfig.preferred_ServerCertTypeCnt;
12735
            XMEMCPY(ssl->options.rpkState.sending_ServerCertTypes,
12736
                    ssl->options.rpkConfig.preferred_ServerCertTypes,
12737
                    ssl->options.rpkConfig.preferred_ServerCertTypeCnt);
12738
12739
            /* Push new server_certificate_type extension. */
12740
            WOLFSSL_MSG("Adding Server Certificate Type extension");
12741
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
12742
                                                                    ssl->heap);
12743
        }
12744
        else {
12745
            WOLFSSL_MSG("No will to accept RPK cert");
12746
        }
12747
    }
12748
12749
    return ret;
12750
}
12751
12752
/* Parse a "server certificate type" extension received from peer.
12753
 * returns 0 on success and other values indicate failure.
12754
 */
12755
static int TLSX_ServerCertificateType_Parse(WOLFSSL* ssl, const byte* input,
12756
                                                word16 length, byte msgType)
12757
{
12758
    byte typeCnt;
12759
    int idx = 0;
12760
    int ret = 0;
12761
    int i;
12762
12763
    if (msgType == client_hello) {
12764
        /* in server side */
12765
12766
        if (length < OPAQUE8_LEN)
12767
            return BUFFER_E;
12768
12769
        typeCnt = input[idx];
12770
12771
        if (typeCnt > MAX_SERVER_CERT_TYPE_CNT)
12772
            return BUFFER_E;
12773
12774
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
12775
            return BUFFER_E;
12776
        }
12777
        ssl->options.rpkState.received_ServerCertTypeCnt = input[idx];
12778
        idx += OPAQUE8_LEN;
12779
12780
        for (i = 0; i < typeCnt; i++) {
12781
            ssl->options.rpkState.received_ServerCertTypes[i] = input[idx];
12782
            idx += OPAQUE8_LEN;
12783
        }
12784
12785
        ret = TLSX_ServerCertificateType_Use(ssl, 1);
12786
        if (ret == 0) {
12787
            TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
12788
        }
12789
    }
12790
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12791
        /* in client side */
12792
        if (length != 1)                     /* length slould be 1 */
12793
            return BUFFER_E;
12794
12795
        ssl->options.rpkState.received_ServerCertTypeCnt  = 1;
12796
        ssl->options.rpkState.received_ServerCertTypes[0] = *input;
12797
    }
12798
12799
    return 0;
12800
}
12801
12802
/* Write out the "server certificate type" extension data into the given buffer.
12803
 * return the size wrote in the buffer on success, negative value on error.
12804
 */
12805
static word16 TLSX_ServerCertificateType_Write(void* data, byte* output,
12806
                                                                byte msgType)
12807
{
12808
    WOLFSSL* ssl = (WOLFSSL*)data;
12809
    word16 idx = 0;
12810
    int cnt = 0;
12811
    int i;
12812
12813
    /* skip to write extension if count is zero */
12814
    cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
12815
12816
    if (cnt == 0)
12817
        return 0;
12818
12819
    if (msgType == client_hello) {
12820
        /* in client side */
12821
12822
        *(output + idx) = cnt;
12823
        idx += OPAQUE8_LEN;
12824
12825
        for (i = 0; i < cnt; i++) {
12826
            *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[i];
12827
            idx += OPAQUE8_LEN;
12828
        }
12829
    }
12830
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12831
        /* in server side */
12832
        /* ensure cnt is one */
12833
        if (cnt != 1)
12834
            return 0;
12835
12836
        *(output + idx) =  ssl->options.rpkState.sending_ServerCertTypes[0];
12837
        idx += OPAQUE8_LEN;
12838
    }
12839
    return idx;
12840
}
12841
12842
/* Calculate then return the size of the "server certificate type" extension
12843
 * data.
12844
 * return the extension data size on success, negative value on error.
12845
*/
12846
static int TLSX_ServerCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
12847
{
12848
    int ret = 0;
12849
    int cnt;
12850
12851
    if (ssl == NULL)
12852
        return BAD_FUNC_ARG;
12853
12854
    if (msgType == client_hello) {
12855
        /* in clent side */
12856
        cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
12857
        if (cnt > 0) {
12858
            ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
12859
        }
12860
    }
12861
    else if (msgType == server_hello || msgType == encrypted_extensions) {
12862
        /* in server side */
12863
        ret = (int)OPAQUE8_LEN;
12864
    }
12865
    else {
12866
        return SANITY_MSG_E;
12867
    }
12868
    return ret;
12869
}
12870
12871
    #define SCT_GET_SIZE  TLSX_ServerCertificateType_GetSize
12872
    #define SCT_WRITE     TLSX_ServerCertificateType_Write
12873
    #define SCT_PARSE     TLSX_ServerCertificateType_Parse
12874
#else
12875
    #define SCT_GET_SIZE(a)  0
12876
    #define SCT_WRITE(a, b)  0
12877
    #define SCT_PARSE(a, b, c, d) 0
12878
#endif /* HAVE_RPK */
12879
12880
/******************************************************************************/
12881
/* TLS Extensions Framework                                                   */
12882
/******************************************************************************/
12883
12884
/** Finds an extension in the provided list. */
12885
TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
12886
641k
{
12887
641k
    TLSX* extension = list;
12888
12889
1.33M
    while (extension && extension->type != type)
12890
691k
        extension = extension->next;
12891
12892
641k
    return extension;
12893
641k
}
12894
12895
/** Remove an extension. */
12896
void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
12897
6.31k
{
12898
6.31k
    TLSX* extension;
12899
6.31k
    TLSX** next;
12900
12901
6.31k
    if (list == NULL)
12902
0
        return;
12903
12904
6.31k
    extension = *list;
12905
6.31k
    next = list;
12906
12907
48.1k
    while (extension && extension->type != type) {
12908
41.8k
        next = &extension->next;
12909
41.8k
        extension = extension->next;
12910
41.8k
    }
12911
12912
6.31k
    if (extension) {
12913
80
        *next = extension->next;
12914
80
        extension->next = NULL;
12915
80
        TLSX_FreeAll(extension, heap);
12916
80
    }
12917
6.31k
}
12918
12919
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
12920
#define GREASE_ECH_SIZE 160
12921
#define MAX_PUBLIC_NAME_SZ 256
12922
#define TLS_INFO_CONST_STRING "tls ech"
12923
#define TLS_INFO_CONST_STRING_SZ 7
12924
12925
/* return status after setting up ech to write a grease ech */
12926
static int TLSX_GreaseECH_Use(TLSX** extensions, void* heap, WC_RNG* rng)
12927
{
12928
    int ret = 0;
12929
    WOLFSSL_ECH* ech;
12930
12931
    if (extensions == NULL)
12932
        return BAD_FUNC_ARG;
12933
12934
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
12935
        DYNAMIC_TYPE_TMP_BUFFER);
12936
12937
    if (ech == NULL)
12938
        return MEMORY_E;
12939
12940
    ForceZero(ech, sizeof(WOLFSSL_ECH));
12941
12942
    ech->state = ECH_WRITE_GREASE;
12943
12944
    /* 0 for outer */
12945
    ech->type = ECH_TYPE_OUTER;
12946
    /* kemId */
12947
    ech->kemId = DHKEM_X25519_HKDF_SHA256;
12948
    /* cipherSuite kdf */
12949
    ech->cipherSuite.kdfId = HKDF_SHA256;
12950
    /* cipherSuite aead */
12951
    ech->cipherSuite.aeadId = HPKE_AES_128_GCM;
12952
12953
    /* random configId */
12954
    ret = wc_RNG_GenerateByte(rng, &(ech->configId));
12955
12956
    /* curve25519 encLen */
12957
    ech->encLen = DHKEM_X25519_ENC_LEN;
12958
12959
    if (ret == 0)
12960
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
12961
12962
    if (ret != 0) {
12963
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
12964
    }
12965
12966
    return ret;
12967
}
12968
12969
/* return status after setting up ech to write real ech */
12970
static int TLSX_ECH_Use(WOLFSSL_EchConfig* echConfig, TLSX** extensions,
12971
    void* heap, WC_RNG* rng)
12972
{
12973
    int ret = 0;
12974
    int suiteIndex;
12975
    TLSX* echX;
12976
    WOLFSSL_ECH* ech;
12977
    if (extensions == NULL)
12978
        return BAD_FUNC_ARG;
12979
    /* skip if we already have an ech extension, we will for hrr */
12980
    echX = TLSX_Find(*extensions, TLSX_ECH);
12981
    if (echX != NULL)
12982
        return 0;
12983
    /* find a supported cipher suite */
12984
    suiteIndex = EchConfigGetSupportedCipherSuite(echConfig);
12985
    if (suiteIndex < 0)
12986
        return suiteIndex;
12987
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
12988
        DYNAMIC_TYPE_TMP_BUFFER);
12989
    if (ech == NULL)
12990
        return MEMORY_E;
12991
    ForceZero(ech, sizeof(WOLFSSL_ECH));
12992
    ech->state = ECH_WRITE_REAL;
12993
    ech->echConfig = echConfig;
12994
    /* 0 for outer */
12995
    ech->type = ECH_TYPE_OUTER;
12996
    /* kemId */
12997
    ech->kemId = echConfig->kemId;
12998
    /* cipherSuite kdf */
12999
    ech->cipherSuite.kdfId = echConfig->cipherSuites[suiteIndex].kdfId;
13000
    /* cipherSuite aead */
13001
    ech->cipherSuite.aeadId = echConfig->cipherSuites[suiteIndex].aeadId;
13002
    /* configId */
13003
    ech->configId = echConfig->configId;
13004
    /* encLen */
13005
    switch (echConfig->kemId)
13006
    {
13007
        case DHKEM_P256_HKDF_SHA256:
13008
            ech->encLen = DHKEM_P256_ENC_LEN;
13009
            break;
13010
        case DHKEM_P384_HKDF_SHA384:
13011
            ech->encLen = DHKEM_P384_ENC_LEN;
13012
            break;
13013
        case DHKEM_P521_HKDF_SHA512:
13014
            ech->encLen = DHKEM_P521_ENC_LEN;
13015
            break;
13016
        case DHKEM_X25519_HKDF_SHA256:
13017
            ech->encLen = DHKEM_X25519_ENC_LEN;
13018
            break;
13019
        case DHKEM_X448_HKDF_SHA512:
13020
            ech->encLen = DHKEM_X448_ENC_LEN;
13021
            break;
13022
    }
13023
    /* setup hpke */
13024
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
13025
    if (ech->hpke == NULL) {
13026
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13027
        return MEMORY_E;
13028
    }
13029
    ret = wc_HpkeInit(ech->hpke, ech->kemId, ech->cipherSuite.kdfId,
13030
        ech->cipherSuite.aeadId, heap);
13031
    /* setup the ephemeralKey */
13032
    if (ret == 0)
13033
        ret = wc_HpkeGenerateKeyPair(ech->hpke, &ech->ephemeralKey, rng);
13034
    if (ret == 0)
13035
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13036
    if (ret != 0) {
13037
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13038
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13039
    }
13040
    return ret;
13041
}
13042
13043
/* return status after setting up ech to read and decrypt */
13044
static int TLSX_ServerECH_Use(TLSX** extensions, void* heap,
13045
    WOLFSSL_EchConfig* configs)
13046
{
13047
    int ret;
13048
    WOLFSSL_ECH* ech;
13049
    TLSX* echX;
13050
    if (extensions == NULL)
13051
        return BAD_FUNC_ARG;
13052
    /* if we already have ech don't override it */
13053
    echX = TLSX_Find(*extensions, TLSX_ECH);
13054
    if (echX != NULL)
13055
        return 0;
13056
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
13057
        DYNAMIC_TYPE_TMP_BUFFER);
13058
    if (ech == NULL)
13059
        return MEMORY_E;
13060
    ForceZero(ech, sizeof(WOLFSSL_ECH));
13061
    ech->state = ECH_WRITE_NONE;
13062
    /* 0 for outer */
13063
    ech->type = ECH_TYPE_OUTER;
13064
    ech->echConfig = configs;
13065
    /* setup the rest of the settings when we receive ech from the client */
13066
    ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
13067
    if (ret != 0)
13068
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13069
    return ret;
13070
}
13071
13072
/* return status after writing the ech and updating offset */
13073
static int TLSX_ECH_Write(WOLFSSL_ECH* ech, byte msgType, byte* writeBuf,
13074
    word16* offset)
13075
{
13076
    int ret = 0;
13077
    int rngRet = -1;
13078
    word32 configsLen = 0;
13079
    void* ephemeralKey = NULL;
13080
    byte* writeBuf_p = writeBuf;
13081
#ifdef WOLFSSL_SMALL_STACK
13082
    Hpke* hpke = NULL;
13083
    WC_RNG* rng = NULL;
13084
#else
13085
    Hpke hpke[1];
13086
    WC_RNG rng[1];
13087
#endif
13088
    WOLFSSL_MSG("TLSX_ECH_Write");
13089
    if (msgType == hello_retry_request) {
13090
        /* reserve space to write the confirmation to */
13091
        *offset += ECH_ACCEPT_CONFIRMATION_SZ;
13092
        /* set confBuf */
13093
        ech->confBuf = writeBuf;
13094
        return 0;
13095
    }
13096
    if (ech->state == ECH_WRITE_NONE || ech->state == ECH_PARSED_INTERNAL)
13097
        return 0;
13098
    if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
13099
        /* get size then write */
13100
        ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen);
13101
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13102
            return ret;
13103
        ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen);
13104
        if (ret != WOLFSSL_SUCCESS)
13105
            return ret;
13106
        *offset += configsLen;
13107
        return 0;
13108
    }
13109
    /* type */
13110
    *writeBuf_p = ech->type;
13111
    writeBuf_p += sizeof(ech->type);
13112
    /* outer has body, inner does not */
13113
    if (ech->type == ECH_TYPE_OUTER) {
13114
        /* kdfId */
13115
        c16toa(ech->cipherSuite.kdfId, writeBuf_p);
13116
        writeBuf_p += sizeof(ech->cipherSuite.kdfId);
13117
        /* aeadId */
13118
        c16toa(ech->cipherSuite.aeadId, writeBuf_p);
13119
        writeBuf_p += sizeof(ech->cipherSuite.aeadId);
13120
        /* configId */
13121
        *writeBuf_p = ech->configId;
13122
        writeBuf_p += sizeof(ech->configId);
13123
        /* encLen */
13124
        if (ech->hpkeContext == NULL) {
13125
            c16toa(ech->encLen, writeBuf_p);
13126
        }
13127
        else {
13128
            /* set to 0 if this is clientInner 2 */
13129
            c16toa(0, writeBuf_p);
13130
        }
13131
        writeBuf_p += 2;
13132
        if (ech->state == ECH_WRITE_GREASE) {
13133
#ifdef WOLFSSL_SMALL_STACK
13134
            hpke = (Hpke*)XMALLOC(sizeof(Hpke), NULL, DYNAMIC_TYPE_TMP_BUFFER);
13135
            if (hpke == NULL)
13136
                return MEMORY_E;
13137
            rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
13138
            if (rng == NULL) {
13139
                XFREE(hpke, NULL, DYNAMIC_TYPE_RNG);
13140
                return MEMORY_E;
13141
            }
13142
#endif
13143
            /* hpke init */
13144
            ret = wc_HpkeInit(hpke, ech->kemId, ech->cipherSuite.kdfId,
13145
                ech->cipherSuite.aeadId, NULL);
13146
            if (ret == 0)
13147
                rngRet = ret = wc_InitRng(rng);
13148
            /* create the ephemeralKey */
13149
            if (ret == 0)
13150
                ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng);
13151
            /* enc */
13152
            if (ret == 0) {
13153
                ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey, writeBuf_p,
13154
                    &ech->encLen);
13155
                writeBuf_p += ech->encLen;
13156
            }
13157
            if (ret == 0) {
13158
                /* innerClientHelloLen */
13159
                c16toa(GREASE_ECH_SIZE + ((writeBuf_p + 2 - writeBuf) % 32),
13160
                    writeBuf_p);
13161
                writeBuf_p += 2;
13162
13163
                /* innerClientHello */
13164
                ret = wc_RNG_GenerateBlock(rng, writeBuf_p, GREASE_ECH_SIZE +
13165
                    ((writeBuf_p - writeBuf) % 32));
13166
                writeBuf_p += GREASE_ECH_SIZE + ((writeBuf_p - writeBuf) % 32);
13167
            }
13168
            if (rngRet == 0)
13169
                wc_FreeRng(rng);
13170
            if (ephemeralKey != NULL)
13171
                wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap);
13172
#ifdef WOLFSSL_SMALL_STACK
13173
            XFREE(hpke, NULL, DYNAMIC_TYPE_TMP_BUFFER);
13174
            XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
13175
#endif
13176
        }
13177
        else {
13178
            /* only write enc if this is our first ech, no hpke context */
13179
            if (ech->hpkeContext == NULL) {
13180
                /* write enc to writeBuf_p */
13181
                ret = wc_HpkeSerializePublicKey(ech->hpke, ech->ephemeralKey,
13182
                    writeBuf_p, &ech->encLen);
13183
                writeBuf_p += ech->encLen;
13184
            }
13185
            /* innerClientHelloLen */
13186
            c16toa(ech->innerClientHelloLen, writeBuf_p);
13187
            writeBuf_p += 2;
13188
            /* set payload offset for when we finalize */
13189
            ech->outerClientPayload = writeBuf_p;
13190
            /* write zeros for payload */
13191
            XMEMSET(writeBuf_p, 0, ech->innerClientHelloLen);
13192
            writeBuf_p += ech->innerClientHelloLen;
13193
        }
13194
    }
13195
    if (ret == 0)
13196
        *offset += (writeBuf_p - writeBuf);
13197
    return ret;
13198
}
13199
13200
/* return the size needed for the ech extension */
13201
static int TLSX_ECH_GetSize(WOLFSSL_ECH* ech, byte msgType)
13202
{
13203
    int ret;
13204
    word32 size = 0;
13205
13206
    if (ech->state == ECH_WRITE_GREASE) {
13207
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
13208
            sizeof(ech->configId) + sizeof(word16) + ech->encLen +
13209
            sizeof(word16);
13210
13211
        size += GREASE_ECH_SIZE + (size % 32);
13212
    }
13213
    else if (msgType == hello_retry_request) {
13214
        size = ECH_ACCEPT_CONFIRMATION_SZ;
13215
    }
13216
    else if (ech->state == ECH_WRITE_NONE ||
13217
        ech->state == ECH_PARSED_INTERNAL) {
13218
        size = 0;
13219
    }
13220
    else if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
13221
        /* get the size of the raw configs */
13222
        ret = GetEchConfigsEx(ech->echConfig, NULL, &size);
13223
13224
        if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13225
            return ret;
13226
    }
13227
    else if (ech->type == ECH_TYPE_INNER)
13228
    {
13229
        size = sizeof(ech->type);
13230
    }
13231
    else
13232
    {
13233
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
13234
            sizeof(ech->configId) + sizeof(word16) + sizeof(word16) +
13235
            ech->innerClientHelloLen;
13236
        /* only set encLen if this is inner hello 1 */
13237
        if (ech->hpkeContext == NULL)
13238
            size += ech->encLen;
13239
    }
13240
13241
    return (int)size;
13242
}
13243
13244
/* return status after attempting to open the hpke encrypted ech extension, if
13245
 * successful the inner client hello will be stored in
13246
 * ech->innerClientHelloLen */
13247
static int TLSX_ExtractEch(WOLFSSL_ECH* ech, WOLFSSL_EchConfig* echConfig,
13248
    byte* aad, word32 aadLen, void* heap)
13249
{
13250
    int ret = 0;
13251
    int expectedEncLen;
13252
    int i;
13253
    word32 rawConfigLen = 0;
13254
    byte* info = NULL;
13255
    word32 infoLen = 0;
13256
    if (ech == NULL || echConfig == NULL || aad == NULL)
13257
        return BAD_FUNC_ARG;
13258
    /* verify the kem and key len */
13259
    switch (echConfig->kemId)
13260
    {
13261
        case DHKEM_P256_HKDF_SHA256:
13262
            expectedEncLen = DHKEM_P256_ENC_LEN;
13263
            break;
13264
        case DHKEM_P384_HKDF_SHA384:
13265
            expectedEncLen = DHKEM_P384_ENC_LEN;
13266
            break;
13267
        case DHKEM_P521_HKDF_SHA512:
13268
            expectedEncLen = DHKEM_P521_ENC_LEN;
13269
            break;
13270
        case DHKEM_X25519_HKDF_SHA256:
13271
            expectedEncLen = DHKEM_X25519_ENC_LEN;
13272
            break;
13273
        case DHKEM_X448_HKDF_SHA512:
13274
            expectedEncLen = DHKEM_X448_ENC_LEN;
13275
            break;
13276
        default:
13277
            expectedEncLen = 0;
13278
            break;
13279
    }
13280
    if (expectedEncLen != ech->encLen)
13281
        return BAD_FUNC_ARG;
13282
    /* verify the cipher suite */
13283
    for (i = 0; i < echConfig->numCipherSuites; i++) {
13284
        if (echConfig->cipherSuites[i].kdfId == ech->cipherSuite.kdfId &&
13285
            echConfig->cipherSuites[i].aeadId == ech->cipherSuite.aeadId) {
13286
            break;
13287
        }
13288
    }
13289
    if (i >= echConfig->numCipherSuites) {
13290
        return BAD_FUNC_ARG;
13291
    }
13292
    /* check if hpke already exists, may if HelloRetryRequest */
13293
    if (ech->hpke == NULL) {
13294
        ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
13295
        if (ech->hpke == NULL)
13296
            ret = MEMORY_E;
13297
        /* init the hpke struct */
13298
        if (ret == 0) {
13299
            ret = wc_HpkeInit(ech->hpke, echConfig->kemId,
13300
                ech->cipherSuite.kdfId, ech->cipherSuite.aeadId, heap);
13301
        }
13302
        if (ret == 0) {
13303
            /* allocate hpkeContext */
13304
            ech->hpkeContext =
13305
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
13306
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13307
            if (ech->hpkeContext == NULL)
13308
                ret = MEMORY_E;
13309
        }
13310
        /* get the rawConfigLen */
13311
        if (ret == 0)
13312
            ret = GetEchConfig(echConfig, NULL, &rawConfigLen);
13313
        if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E))
13314
            ret = 0;
13315
        /* create info */
13316
        if (ret == 0) {
13317
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + rawConfigLen;
13318
            info = (byte*)XMALLOC(infoLen, heap, DYNAMIC_TYPE_TMP_BUFFER);
13319
13320
            if (info == NULL)
13321
                ret = MEMORY_E;
13322
            else {
13323
                XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
13324
                    TLS_INFO_CONST_STRING_SZ + 1);
13325
                ret = GetEchConfig(echConfig, info +
13326
                    TLS_INFO_CONST_STRING_SZ + 1, &rawConfigLen);
13327
            }
13328
        }
13329
        /* init the context for opening */
13330
        if (ret == 0) {
13331
            ret = wc_HpkeInitOpenContext(ech->hpke, ech->hpkeContext,
13332
                echConfig->receiverPrivkey, ech->enc, ech->encLen, info,
13333
                infoLen);
13334
        }
13335
    }
13336
    /* decrypt the ech payload */
13337
    if (ret == 0) {
13338
        ret = wc_HpkeContextOpenBase(ech->hpke, ech->hpkeContext, aad, aadLen,
13339
            ech->outerClientPayload, ech->innerClientHelloLen,
13340
            ech->innerClientHello + HANDSHAKE_HEADER_SZ);
13341
    }
13342
    /* free the hpke and context on failure */
13343
    if (ret != 0) {
13344
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13345
        ech->hpke = NULL;
13346
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
13347
        ech->hpkeContext = NULL;
13348
    }
13349
13350
    if (info != NULL)
13351
        XFREE(info, heap, DYNAMIC_TYPE_TMP_BUFFER);
13352
13353
    return ret;
13354
}
13355
13356
/* parse the ech extension, if internal update ech->state and return, if
13357
 * external attempt to extract the inner client_hello, return the status */
13358
static int TLSX_ECH_Parse(WOLFSSL* ssl, const byte* readBuf, word16 size,
13359
    byte msgType)
13360
{
13361
    int ret = 0;
13362
    int i;
13363
    TLSX* echX;
13364
    WOLFSSL_ECH* ech;
13365
    WOLFSSL_EchConfig* echConfig;
13366
    byte* aadCopy;
13367
    byte* readBuf_p = (byte*)readBuf;
13368
    WOLFSSL_MSG("TLSX_ECH_Parse");
13369
    if (size == 0)
13370
        return BAD_FUNC_ARG;
13371
    if (ssl->options.disableECH) {
13372
        WOLFSSL_MSG("TLSX_ECH_Parse: ECH disabled. Ignoring.");
13373
        return 0;
13374
    }
13375
    /* retry configs */
13376
    if (msgType == encrypted_extensions) {
13377
        ret = wolfSSL_SetEchConfigs(ssl, readBuf, size);
13378
13379
        if (ret == WOLFSSL_SUCCESS)
13380
            ret = 0;
13381
    }
13382
    /* HRR with special confirmation */
13383
    else if (msgType == hello_retry_request && ssl->options.useEch) {
13384
        /* length must be 8 */
13385
        if (size != ECH_ACCEPT_CONFIRMATION_SZ)
13386
            return BAD_FUNC_ARG;
13387
        /* get extension */
13388
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13389
        if (echX == NULL)
13390
            return BAD_FUNC_ARG;
13391
        ech = (WOLFSSL_ECH*)echX->data;
13392
        ech->confBuf = (byte*)readBuf;
13393
    }
13394
    else if (msgType == client_hello && ssl->ctx->echConfigs != NULL) {
13395
        /* get extension */
13396
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13397
        if (echX == NULL)
13398
            return BAD_FUNC_ARG;
13399
        ech = (WOLFSSL_ECH*)echX->data;
13400
        /* read the ech parameters before the payload */
13401
        ech->type = *readBuf_p;
13402
        readBuf_p++;
13403
        if (ech->type == ECH_TYPE_INNER) {
13404
            ech->state = ECH_PARSED_INTERNAL;
13405
            return 0;
13406
        }
13407
        /* technically the payload would only be 1 byte at this length */
13408
        if (size < 11 + ech->encLen)
13409
            return BAD_FUNC_ARG;
13410
        /* read kdfId */
13411
        ato16(readBuf_p, &ech->cipherSuite.kdfId);
13412
        readBuf_p += 2;
13413
        /* read aeadId */
13414
        ato16(readBuf_p, &ech->cipherSuite.aeadId);
13415
        readBuf_p += 2;
13416
        /* read configId */
13417
        ech->configId = *readBuf_p;
13418
        readBuf_p++;
13419
        /* only get enc if we don't already have the hpke context */
13420
        if (ech->hpkeContext == NULL) {
13421
            /* read encLen */
13422
            ato16(readBuf_p, &ech->encLen);
13423
            readBuf_p += 2;
13424
            if (ech->encLen > HPKE_Npk_MAX)
13425
                return BAD_FUNC_ARG;
13426
            /* read enc */
13427
            XMEMCPY(ech->enc, readBuf_p, ech->encLen);
13428
            readBuf_p += ech->encLen;
13429
        }
13430
        else {
13431
            readBuf_p += 2;
13432
        }
13433
        /* read hello inner len */
13434
        ato16(readBuf_p, &ech->innerClientHelloLen);
13435
        ech->innerClientHelloLen -= WC_AES_BLOCK_SIZE;
13436
        readBuf_p += 2;
13437
        ech->outerClientPayload = readBuf_p;
13438
        /* make a copy of the aad */
13439
        aadCopy = (byte*)XMALLOC(ech->aadLen, ssl->heap,
13440
            DYNAMIC_TYPE_TMP_BUFFER);
13441
        if (aadCopy == NULL)
13442
            return MEMORY_E;
13443
        XMEMCPY(aadCopy, ech->aad, ech->aadLen);
13444
        /* set the ech payload of the copy to zeros */
13445
        XMEMSET(aadCopy + (readBuf_p - ech->aad), 0,
13446
            ech->innerClientHelloLen + WC_AES_BLOCK_SIZE);
13447
        /* free the old ech in case this is our second client hello */
13448
        if (ech->innerClientHello != NULL)
13449
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13450
        /* allocate the inner payload buffer */
13451
        ech->innerClientHello =
13452
            (byte*)XMALLOC(ech->innerClientHelloLen + HANDSHAKE_HEADER_SZ,
13453
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13454
        if (ech->innerClientHello == NULL) {
13455
            XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13456
            return MEMORY_E;
13457
        }
13458
        /* first check if the config id matches */
13459
        echConfig = ssl->ctx->echConfigs;
13460
        while (echConfig != NULL) {
13461
            /* decrypt with this config */
13462
            if (echConfig->configId == ech->configId) {
13463
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
13464
                    ssl->heap);
13465
                break;
13466
            }
13467
            echConfig = echConfig->next;
13468
        }
13469
        /* try to decrypt with all configs */
13470
        if (echConfig == NULL || ret != 0) {
13471
            echConfig = ssl->ctx->echConfigs;
13472
            while (echConfig != NULL) {
13473
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
13474
                    ssl->heap);
13475
                if (ret== 0)
13476
                    break;
13477
                echConfig = echConfig->next;
13478
            }
13479
        }
13480
        /* if we failed to extract, set state to retry configs */
13481
        if (ret != 0) {
13482
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13483
            ech->innerClientHello = NULL;
13484
            ech->state = ECH_WRITE_RETRY_CONFIGS;
13485
        }
13486
        else {
13487
            i = 0;
13488
            /* decrement until before the padding */
13489
            while (ech->innerClientHello[ech->innerClientHelloLen +
13490
                HANDSHAKE_HEADER_SZ - i - 1] != ECH_TYPE_INNER) {
13491
                i++;
13492
            }
13493
            /* subtract the length of the padding from the length */
13494
            ech->innerClientHelloLen -= i;
13495
        }
13496
        XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13497
        return 0;
13498
    }
13499
13500
    return ret;
13501
}
13502
13503
/* free the ech struct and the dynamic buffer it uses */
13504
static void TLSX_ECH_Free(WOLFSSL_ECH* ech, void* heap)
13505
{
13506
    XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
13507
    if (ech->ephemeralKey != NULL)
13508
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
13509
            ech->hpke->heap);
13510
    if (ech->hpke != NULL)
13511
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
13512
    if (ech->hpkeContext != NULL)
13513
        XFREE(ech->hpkeContext, heap, DYNAMIC_TYPE_TMP_BUFFER);
13514
13515
    XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
13516
    (void)heap;
13517
}
13518
13519
/* encrypt the client hello and store it in ech->outerClientPayload, return
13520
 * status */
13521
int TLSX_FinalizeEch(WOLFSSL_ECH* ech, byte* aad, word32 aadLen)
13522
{
13523
    int ret = 0;
13524
    void* receiverPubkey = NULL;
13525
    byte* info = NULL;
13526
    int infoLen = 0;
13527
    byte* aadCopy = NULL;
13528
    /* setup hpke context to seal, should be done at most once per connection */
13529
    if (ech->hpkeContext == NULL) {
13530
        /* import the server public key */
13531
        ret = wc_HpkeDeserializePublicKey(ech->hpke, &receiverPubkey,
13532
            ech->echConfig->receiverPubkey, ech->encLen);
13533
        if (ret == 0) {
13534
            /* allocate hpke context */
13535
            ech->hpkeContext =
13536
                (HpkeBaseContext*)XMALLOC(sizeof(HpkeBaseContext),
13537
                ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13538
            if (ech->hpkeContext == NULL)
13539
                ret = MEMORY_E;
13540
        }
13541
        if (ret == 0) {
13542
            /* create info */
13543
            infoLen = TLS_INFO_CONST_STRING_SZ + 1 + ech->echConfig->rawLen;
13544
            info = (byte*)XMALLOC(infoLen, ech->hpke->heap,
13545
                DYNAMIC_TYPE_TMP_BUFFER);
13546
            if (info == NULL)
13547
                ret = MEMORY_E;
13548
        }
13549
        if (ret == 0) {
13550
            /* puts the null byte in for me */
13551
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
13552
                TLS_INFO_CONST_STRING_SZ + 1);
13553
            XMEMCPY(info + TLS_INFO_CONST_STRING_SZ + 1,
13554
                ech->echConfig->raw, ech->echConfig->rawLen);
13555
            /* init the context for seal with info and keys */
13556
            ret = wc_HpkeInitSealContext(ech->hpke, ech->hpkeContext,
13557
                ech->ephemeralKey, receiverPubkey, info, infoLen);
13558
        }
13559
    }
13560
    if (ret == 0) {
13561
        /* make a copy of the aad since we overwrite it */
13562
        aadCopy = (byte*)XMALLOC(aadLen, ech->hpke->heap,
13563
            DYNAMIC_TYPE_TMP_BUFFER);
13564
        if (aadCopy == NULL) {
13565
            ret = MEMORY_E;
13566
        }
13567
    }
13568
    if (ret == 0) {
13569
        XMEMCPY(aadCopy, aad, aadLen);
13570
        /* seal the payload with context */
13571
        ret = wc_HpkeContextSealBase(ech->hpke, ech->hpkeContext, aadCopy,
13572
            aadLen, ech->innerClientHello,
13573
            ech->innerClientHelloLen - ech->hpke->Nt, ech->outerClientPayload);
13574
    }
13575
    if (info != NULL)
13576
        XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13577
    if (aadCopy != NULL)
13578
        XFREE(aadCopy, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
13579
    if (receiverPubkey != NULL)
13580
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, receiverPubkey,
13581
            ech->hpke->heap);
13582
    return ret;
13583
}
13584
13585
#define GREASE_ECH_USE TLSX_GreaseECH_Use
13586
#define ECH_USE TLSX_ECH_Use
13587
#define SERVER_ECH_USE TLSX_ServerECH_Use
13588
#define ECH_WRITE TLSX_ECH_Write
13589
#define ECH_GET_SIZE TLSX_ECH_GetSize
13590
#define ECH_PARSE TLSX_ECH_Parse
13591
#define ECH_FREE TLSX_ECH_Free
13592
13593
#endif
13594
13595
/** Releases all extensions in the provided list. */
13596
void TLSX_FreeAll(TLSX* list, void* heap)
13597
{
13598
    TLSX* extension;
13599
13600
    while ((extension = list)) {
13601
        list = extension->next;
13602
13603
        switch (extension->type) {
13604
#if defined(HAVE_RPK)
13605
            case TLSX_CLIENT_CERTIFICATE_TYPE:
13606
                WOLFSSL_MSG("Client Certificate Type extension free");
13607
                /* nothing to do */
13608
                break;
13609
            case TLSX_SERVER_CERTIFICATE_TYPE:
13610
                WOLFSSL_MSG("Server Certificate Type extension free");
13611
                /* nothing to do */
13612
                break;
13613
#endif
13614
13615
#ifdef HAVE_SNI
13616
            case TLSX_SERVER_NAME:
13617
                WOLFSSL_MSG("SNI extension free");
13618
                SNI_FREE_ALL((SNI*)extension->data, heap);
13619
                break;
13620
#endif
13621
13622
            case TLSX_TRUSTED_CA_KEYS:
13623
                WOLFSSL_MSG("Trusted CA Indication extension free");
13624
                TCA_FREE_ALL((TCA*)extension->data, heap);
13625
                break;
13626
13627
            case TLSX_MAX_FRAGMENT_LENGTH:
13628
                WOLFSSL_MSG("Max Fragment Length extension free");
13629
                MFL_FREE_ALL(extension->data, heap);
13630
                break;
13631
13632
            case TLSX_EXTENDED_MASTER_SECRET:
13633
                WOLFSSL_MSG("Extended Master Secret free");
13634
                /* Nothing to do. */
13635
                break;
13636
            case TLSX_TRUNCATED_HMAC:
13637
                WOLFSSL_MSG("Truncated HMAC extension free");
13638
                /* Nothing to do. */
13639
                break;
13640
13641
            case TLSX_SUPPORTED_GROUPS:
13642
                WOLFSSL_MSG("Supported Groups extension free");
13643
                EC_FREE_ALL((SupportedCurve*)extension->data, heap);
13644
                break;
13645
13646
            case TLSX_EC_POINT_FORMATS:
13647
                WOLFSSL_MSG("Point Formats extension free");
13648
                PF_FREE_ALL((PointFormat*)extension->data, heap);
13649
                break;
13650
13651
            case TLSX_STATUS_REQUEST:
13652
                WOLFSSL_MSG("Certificate Status Request extension free");
13653
                CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
13654
                break;
13655
13656
            case TLSX_STATUS_REQUEST_V2:
13657
                WOLFSSL_MSG("Certificate Status Request v2 extension free");
13658
                CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
13659
                        heap);
13660
                break;
13661
13662
            case TLSX_RENEGOTIATION_INFO:
13663
                WOLFSSL_MSG("Secure Renegotiation extension free");
13664
                SCR_FREE_ALL(extension->data, heap);
13665
                break;
13666
13667
            case TLSX_SESSION_TICKET:
13668
                WOLFSSL_MSG("Session Ticket extension free");
13669
                WOLF_STK_FREE(extension->data, heap);
13670
                break;
13671
13672
            case TLSX_APPLICATION_LAYER_PROTOCOL:
13673
                WOLFSSL_MSG("ALPN extension free");
13674
                ALPN_FREE_ALL((ALPN*)extension->data, heap);
13675
                break;
13676
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13677
            case TLSX_SIGNATURE_ALGORITHMS:
13678
                WOLFSSL_MSG("Signature Algorithms extension to free");
13679
                SA_FREE_ALL((SignatureAlgorithms*)extension->data, heap);
13680
                break;
13681
#endif
13682
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
13683
            case TLSX_ENCRYPT_THEN_MAC:
13684
                WOLFSSL_MSG("Encrypt-Then-Mac extension free");
13685
                break;
13686
#endif
13687
13688
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13689
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13690
            case TLSX_PRE_SHARED_KEY:
13691
                WOLFSSL_MSG("Pre-Shared Key extension free");
13692
                PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
13693
                break;
13694
13695
        #ifdef WOLFSSL_TLS13
13696
            case TLSX_PSK_KEY_EXCHANGE_MODES:
13697
                WOLFSSL_MSG("PSK Key Exchange Modes extension free");
13698
                break;
13699
        #endif
13700
    #endif
13701
13702
            case TLSX_KEY_SHARE:
13703
                WOLFSSL_MSG("Key Share extension free");
13704
                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
13705
                break;
13706
#endif
13707
#ifdef WOLFSSL_TLS13
13708
            case TLSX_SUPPORTED_VERSIONS:
13709
                WOLFSSL_MSG("Supported Versions extension free");
13710
                break;
13711
13712
    #ifdef WOLFSSL_SEND_HRR_COOKIE
13713
            case TLSX_COOKIE:
13714
                WOLFSSL_MSG("Cookie extension free");
13715
                CKE_FREE_ALL((Cookie*)extension->data, heap);
13716
                break;
13717
    #endif
13718
13719
    #ifdef WOLFSSL_EARLY_DATA
13720
            case TLSX_EARLY_DATA:
13721
                WOLFSSL_MSG("Early Data extension free");
13722
                break;
13723
    #endif
13724
13725
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13726
            case TLSX_POST_HANDSHAKE_AUTH:
13727
                WOLFSSL_MSG("Post-Handshake Authentication extension free");
13728
                break;
13729
    #endif
13730
13731
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13732
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
13733
                WOLFSSL_MSG("Signature Algorithms extension free");
13734
                break;
13735
    #endif
13736
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13737
            case TLSX_CERTIFICATE_AUTHORITIES:
13738
                WOLFSSL_MSG("Certificate Authorities extension free");
13739
                break;
13740
    #endif
13741
#endif
13742
#ifdef WOLFSSL_SRTP
13743
            case TLSX_USE_SRTP:
13744
                WOLFSSL_MSG("SRTP extension free");
13745
                SRTP_FREE((TlsxSrtp*)extension->data, heap);
13746
                break;
13747
#endif
13748
13749
    #ifdef WOLFSSL_QUIC
13750
            case TLSX_KEY_QUIC_TP_PARAMS:
13751
                FALL_THROUGH;
13752
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
13753
                WOLFSSL_MSG("QUIC transport parameter free");
13754
                QTP_FREE((QuicTransportParam*)extension->data, heap);
13755
                break;
13756
    #endif
13757
13758
#ifdef WOLFSSL_DTLS_CID
13759
            case TLSX_CONNECTION_ID:
13760
                WOLFSSL_MSG("Connection ID extension free");
13761
                CID_FREE((byte*)extension->data, heap);
13762
                break;
13763
#endif /* WOLFSSL_DTLS_CID */
13764
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13765
            case TLSX_ECH:
13766
                WOLFSSL_MSG("ECH extension free");
13767
                ECH_FREE((WOLFSSL_ECH*)extension->data, heap);
13768
                break;
13769
#endif
13770
#ifdef WOLFSSL_DUAL_ALG_CERTS
13771
            case TLSX_CKS:
13772
                WOLFSSL_MSG("CKS extension free");
13773
                /* nothing to do */
13774
                break;
13775
#endif
13776
            default:
13777
                break;
13778
        }
13779
13780
        XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
13781
    }
13782
13783
    (void)heap;
13784
}
13785
13786
/** Checks if the tls extensions are supported based on the protocol version. */
13787
72.9k
int TLSX_SupportExtensions(WOLFSSL* ssl) {
13788
72.9k
    return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
13789
72.9k
}
13790
13791
/** Tells the buffered size of the extensions in a list. */
13792
static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
13793
                        word16* pLength)
13794
{
13795
    int    ret = 0;
13796
    TLSX*  extension;
13797
    word16 length = 0;
13798
    byte   isRequest = (msgType == client_hello ||
13799
                        msgType == certificate_request);
13800
13801
    while ((extension = list)) {
13802
        list = extension->next;
13803
13804
        /* only extensions marked as response are sent back to the client. */
13805
        if (!isRequest && !extension->resp)
13806
            continue; /* skip! */
13807
13808
        /* ssl level extensions are expected to override ctx level ones. */
13809
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
13810
            continue; /* skip! */
13811
13812
        /* extension type + extension data length. */
13813
        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
13814
13815
        switch (extension->type) {
13816
#ifdef WOLFSSL_DUAL_ALG_CERTS
13817
            case TLSX_CKS:
13818
                length += ((WOLFSSL*)extension->data)->sigSpecSz ;
13819
                break;
13820
#endif
13821
#ifdef HAVE_SNI
13822
            case TLSX_SERVER_NAME:
13823
                /* SNI only sends the name on the request. */
13824
                if (isRequest)
13825
                    length += SNI_GET_SIZE((SNI*)extension->data);
13826
                break;
13827
#endif
13828
13829
            case TLSX_TRUSTED_CA_KEYS:
13830
                /* TCA only sends the list on the request. */
13831
                if (isRequest)
13832
                    length += TCA_GET_SIZE((TCA*)extension->data);
13833
                break;
13834
13835
            case TLSX_MAX_FRAGMENT_LENGTH:
13836
                length += MFL_GET_SIZE(extension->data);
13837
                break;
13838
13839
            case TLSX_EXTENDED_MASTER_SECRET:
13840
            case TLSX_TRUNCATED_HMAC:
13841
                /* always empty. */
13842
                break;
13843
13844
            case TLSX_SUPPORTED_GROUPS:
13845
                length += EC_GET_SIZE((SupportedCurve*)extension->data);
13846
                break;
13847
13848
            case TLSX_EC_POINT_FORMATS:
13849
                length += PF_GET_SIZE((PointFormat*)extension->data);
13850
                break;
13851
13852
            case TLSX_STATUS_REQUEST:
13853
                length += CSR_GET_SIZE(
13854
                         (CertificateStatusRequest*)extension->data, isRequest);
13855
                break;
13856
13857
            case TLSX_STATUS_REQUEST_V2:
13858
                length += CSR2_GET_SIZE(
13859
                        (CertificateStatusRequestItemV2*)extension->data,
13860
                        isRequest);
13861
                break;
13862
13863
            case TLSX_RENEGOTIATION_INFO:
13864
                length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
13865
                        isRequest);
13866
                break;
13867
13868
            case TLSX_SESSION_TICKET:
13869
                length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
13870
                        isRequest);
13871
                break;
13872
13873
            case TLSX_APPLICATION_LAYER_PROTOCOL:
13874
                length += ALPN_GET_SIZE((ALPN*)extension->data);
13875
                break;
13876
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13877
            case TLSX_SIGNATURE_ALGORITHMS:
13878
                length += SA_GET_SIZE(extension->data);
13879
                break;
13880
#endif
13881
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
13882
            case TLSX_ENCRYPT_THEN_MAC:
13883
                ret = ETM_GET_SIZE(msgType, &length);
13884
                break;
13885
#endif /* HAVE_ENCRYPT_THEN_MAC */
13886
13887
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13888
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13889
            case TLSX_PRE_SHARED_KEY:
13890
                ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
13891
                                                                       &length);
13892
                break;
13893
        #ifdef WOLFSSL_TLS13
13894
            case TLSX_PSK_KEY_EXCHANGE_MODES:
13895
                ret = PKM_GET_SIZE((byte)extension->val, msgType, &length);
13896
                break;
13897
        #endif
13898
    #endif
13899
            case TLSX_KEY_SHARE:
13900
                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
13901
                break;
13902
#endif
13903
13904
#ifdef WOLFSSL_TLS13
13905
            case TLSX_SUPPORTED_VERSIONS:
13906
                ret = SV_GET_SIZE(extension->data, msgType, &length);
13907
                break;
13908
13909
    #ifdef WOLFSSL_SEND_HRR_COOKIE
13910
            case TLSX_COOKIE:
13911
                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &length);
13912
                break;
13913
    #endif
13914
13915
    #ifdef WOLFSSL_EARLY_DATA
13916
            case TLSX_EARLY_DATA:
13917
                ret = EDI_GET_SIZE(msgType, &length);
13918
                break;
13919
    #endif
13920
13921
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13922
            case TLSX_POST_HANDSHAKE_AUTH:
13923
                ret = PHA_GET_SIZE(msgType, &length);
13924
                break;
13925
    #endif
13926
13927
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13928
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
13929
                length += SAC_GET_SIZE(extension->data);
13930
                break;
13931
    #endif
13932
13933
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13934
            case TLSX_CERTIFICATE_AUTHORITIES:
13935
                length += CAN_GET_SIZE(extension->data);
13936
                break;
13937
    #endif
13938
#endif
13939
#ifdef WOLFSSL_SRTP
13940
            case TLSX_USE_SRTP:
13941
                length += SRTP_GET_SIZE((TlsxSrtp*)extension->data);
13942
                break;
13943
#endif
13944
13945
#ifdef HAVE_RPK
13946
            case TLSX_CLIENT_CERTIFICATE_TYPE:
13947
                length += CCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
13948
                break;
13949
13950
            case TLSX_SERVER_CERTIFICATE_TYPE:
13951
                length += SCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
13952
                break;
13953
#endif /* HAVE_RPK */
13954
13955
#ifdef WOLFSSL_QUIC
13956
            case TLSX_KEY_QUIC_TP_PARAMS:
13957
                FALL_THROUGH; /* followed by */
13958
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
13959
                length += QTP_GET_SIZE(extension);
13960
                break;
13961
#endif
13962
#ifdef WOLFSSL_DTLS_CID
13963
            case TLSX_CONNECTION_ID:
13964
                length += CID_GET_SIZE((byte*)extension->data);
13965
                break;
13966
#endif /* WOLFSSL_DTLS_CID */
13967
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13968
            case TLSX_ECH:
13969
                length += ECH_GET_SIZE((WOLFSSL_ECH*)extension->data, msgType);
13970
                break;
13971
#endif
13972
            default:
13973
                break;
13974
        }
13975
13976
        /* marks the extension as processed so ctx level */
13977
        /* extensions don't overlap with ssl level ones. */
13978
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
13979
    }
13980
13981
    *pLength += length;
13982
13983
    return ret;
13984
}
13985
13986
/** Writes the extensions of a list in a buffer. */
13987
static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
13988
                         byte msgType, word16* pOffset)
13989
0
{
13990
0
    int    ret = 0;
13991
0
    TLSX*  extension;
13992
0
    word16 offset = 0;
13993
0
    word16 length_offset = 0;
13994
0
    byte   isRequest = (msgType == client_hello ||
13995
0
                        msgType == certificate_request);
13996
13997
0
    while ((extension = list)) {
13998
0
        list = extension->next;
13999
14000
        /* only extensions marked as response are written in a response. */
14001
0
        if (!isRequest && !extension->resp)
14002
0
            continue; /* skip! */
14003
14004
        /* ssl level extensions are expected to override ctx level ones. */
14005
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore((word16)extension->type)))
14006
0
            continue; /* skip! */
14007
14008
        /* writes extension type. */
14009
0
        c16toa((word16)extension->type, output + offset);
14010
0
        offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
14011
0
        length_offset = offset;
14012
14013
        /* extension data should be written internally. */
14014
0
        switch (extension->type) {
14015
#ifdef WOLFSSL_DUAL_ALG_CERTS
14016
            case TLSX_CKS:
14017
                WOLFSSL_MSG("CKS extension to write");
14018
                offset += CKS_WRITE(((WOLFSSL*)extension->data),
14019
                                    output + offset);
14020
                break;
14021
#endif
14022
0
#ifdef HAVE_SNI
14023
0
            case TLSX_SERVER_NAME:
14024
0
                if (isRequest) {
14025
0
                    WOLFSSL_MSG("SNI extension to write");
14026
0
                    offset += SNI_WRITE((SNI*)extension->data, output + offset);
14027
0
                }
14028
0
                break;
14029
0
#endif
14030
14031
0
            case TLSX_TRUSTED_CA_KEYS:
14032
0
                WOLFSSL_MSG("Trusted CA Indication extension to write");
14033
0
                if (isRequest) {
14034
0
                    offset += TCA_WRITE((TCA*)extension->data, output + offset);
14035
0
                }
14036
0
                break;
14037
14038
0
            case TLSX_MAX_FRAGMENT_LENGTH:
14039
0
                WOLFSSL_MSG("Max Fragment Length extension to write");
14040
0
                offset += MFL_WRITE((byte*)extension->data, output + offset);
14041
0
                break;
14042
14043
0
            case TLSX_EXTENDED_MASTER_SECRET:
14044
0
                WOLFSSL_MSG("Extended Master Secret");
14045
                /* always empty. */
14046
0
                break;
14047
14048
0
            case TLSX_TRUNCATED_HMAC:
14049
0
                WOLFSSL_MSG("Truncated HMAC extension to write");
14050
                /* always empty. */
14051
0
                break;
14052
14053
0
            case TLSX_SUPPORTED_GROUPS:
14054
0
                WOLFSSL_MSG("Supported Groups extension to write");
14055
0
                offset += EC_WRITE((SupportedCurve*)extension->data,
14056
0
                                    output + offset);
14057
0
                break;
14058
14059
0
            case TLSX_EC_POINT_FORMATS:
14060
0
                WOLFSSL_MSG("Point Formats extension to write");
14061
0
                offset += PF_WRITE((PointFormat*)extension->data,
14062
0
                                    output + offset);
14063
0
                break;
14064
14065
0
            case TLSX_STATUS_REQUEST:
14066
0
                WOLFSSL_MSG("Certificate Status Request extension to write");
14067
0
                ret = CSR_WRITE((CertificateStatusRequest*)extension->data,
14068
0
                        output + offset, isRequest);
14069
0
                if (ret > 0) {
14070
0
                    offset += (word16)ret;
14071
0
                    ret = 0;
14072
0
                }
14073
0
                break;
14074
14075
0
            case TLSX_STATUS_REQUEST_V2:
14076
0
                WOLFSSL_MSG("Certificate Status Request v2 extension to write");
14077
0
                ret = CSR2_WRITE(
14078
0
                        (CertificateStatusRequestItemV2*)extension->data,
14079
0
                        output + offset, isRequest);
14080
0
                if (ret > 0) {
14081
0
                    offset += (word16)ret;
14082
0
                    ret = 0;
14083
0
                }
14084
0
                break;
14085
14086
0
            case TLSX_RENEGOTIATION_INFO:
14087
0
                WOLFSSL_MSG("Secure Renegotiation extension to write");
14088
0
                offset += SCR_WRITE((SecureRenegotiation*)extension->data,
14089
0
                        output + offset, isRequest);
14090
0
                break;
14091
14092
0
            case TLSX_SESSION_TICKET:
14093
0
                WOLFSSL_MSG("Session Ticket extension to write");
14094
0
                offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
14095
0
                        output + offset, isRequest);
14096
0
                break;
14097
14098
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
14099
0
                WOLFSSL_MSG("ALPN extension to write");
14100
0
                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
14101
0
                break;
14102
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14103
0
            case TLSX_SIGNATURE_ALGORITHMS:
14104
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
14105
0
                offset += SA_WRITE(extension->data, output + offset);
14106
0
                break;
14107
0
#endif
14108
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
14109
0
            case TLSX_ENCRYPT_THEN_MAC:
14110
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
14111
0
                ret = ETM_WRITE(extension->data, output, msgType, &offset);
14112
0
                break;
14113
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
14114
14115
0
#if defined(WOLFSSL_TLS13) || !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
14116
0
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14117
0
            case TLSX_PRE_SHARED_KEY:
14118
0
                WOLFSSL_MSG("Pre-Shared Key extension to write");
14119
0
                ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
14120
0
                                                              msgType, &offset);
14121
0
                break;
14122
14123
0
        #ifdef WOLFSSL_TLS13
14124
0
            case TLSX_PSK_KEY_EXCHANGE_MODES:
14125
0
                WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
14126
0
                ret = PKM_WRITE((byte)extension->val, output + offset, msgType,
14127
0
                                                                       &offset);
14128
0
                break;
14129
0
        #endif
14130
0
    #endif
14131
0
            case TLSX_KEY_SHARE:
14132
0
                WOLFSSL_MSG("Key Share extension to write");
14133
0
                offset += KS_WRITE((KeyShareEntry*)extension->data,
14134
0
                                                      output + offset, msgType);
14135
0
                break;
14136
0
#endif
14137
0
#ifdef WOLFSSL_TLS13
14138
0
            case TLSX_SUPPORTED_VERSIONS:
14139
0
                WOLFSSL_MSG("Supported Versions extension to write");
14140
0
                ret = SV_WRITE(extension->data, output + offset, msgType,
14141
0
                                                                       &offset);
14142
0
                break;
14143
14144
    #ifdef WOLFSSL_SEND_HRR_COOKIE
14145
            case TLSX_COOKIE:
14146
                WOLFSSL_MSG("Cookie extension to write");
14147
                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
14148
                                msgType, &offset);
14149
                break;
14150
    #endif
14151
14152
    #ifdef WOLFSSL_EARLY_DATA
14153
            case TLSX_EARLY_DATA:
14154
                WOLFSSL_MSG("Early Data extension to write");
14155
                ret = EDI_WRITE(extension->val, output + offset, msgType,
14156
                                                                       &offset);
14157
                break;
14158
    #endif
14159
14160
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
14161
            case TLSX_POST_HANDSHAKE_AUTH:
14162
                WOLFSSL_MSG("Post-Handshake Authentication extension to write");
14163
                ret = PHA_WRITE(output + offset, msgType, &offset);
14164
                break;
14165
    #endif
14166
14167
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14168
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
14169
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
14170
0
                offset += SAC_WRITE(extension->data, output + offset);
14171
0
                break;
14172
0
    #endif
14173
14174
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14175
0
            case TLSX_CERTIFICATE_AUTHORITIES:
14176
0
                WOLFSSL_MSG("Certificate Authorities extension to write");
14177
0
                offset += CAN_WRITE(extension->data, output + offset);
14178
0
                break;
14179
0
    #endif
14180
0
#endif
14181
#ifdef WOLFSSL_SRTP
14182
            case TLSX_USE_SRTP:
14183
                WOLFSSL_MSG("SRTP extension to write");
14184
                offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset);
14185
                break;
14186
#endif
14187
14188
#ifdef HAVE_RPK
14189
            case TLSX_CLIENT_CERTIFICATE_TYPE:
14190
                WOLFSSL_MSG("Client Certificate Type extension to write");
14191
                offset += CCT_WRITE(extension->data, output + offset, msgType);
14192
                break;
14193
14194
            case TLSX_SERVER_CERTIFICATE_TYPE:
14195
                WOLFSSL_MSG("Server Certificate Type extension to write");
14196
                offset += SCT_WRITE(extension->data, output + offset, msgType);
14197
                break;
14198
#endif /* HAVE_RPK */
14199
14200
#ifdef WOLFSSL_QUIC
14201
            case TLSX_KEY_QUIC_TP_PARAMS:
14202
                FALL_THROUGH;
14203
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
14204
                WOLFSSL_MSG("QUIC transport parameter to write");
14205
                offset += QTP_WRITE((QuicTransportParam*)extension->data,
14206
                                    output + offset);
14207
                break;
14208
#endif
14209
#ifdef WOLFSSL_DTLS_CID
14210
            case TLSX_CONNECTION_ID:
14211
                WOLFSSL_MSG("Connection ID extension to write");
14212
                offset += CID_WRITE((byte*)extension->data, output+offset);
14213
                break;
14214
14215
#endif /* WOLFSSL_DTLS_CID */
14216
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
14217
            case TLSX_ECH:
14218
                WOLFSSL_MSG("ECH extension to write");
14219
                ret = ECH_WRITE((WOLFSSL_ECH*)extension->data, msgType,
14220
                    output + offset, &offset);
14221
                break;
14222
#endif
14223
0
            default:
14224
0
                break;
14225
0
        }
14226
14227
        /* writes extension data length. */
14228
0
        c16toa(offset - length_offset, output + length_offset - OPAQUE16_LEN);
14229
14230
        /* marks the extension as processed so ctx level */
14231
        /* extensions don't overlap with ssl level ones. */
14232
0
        TURN_ON(semaphore, TLSX_ToSemaphore((word16)extension->type));
14233
14234
        /* if we encountered an error propagate it */
14235
0
        if (ret != 0)
14236
0
            break;
14237
0
    }
14238
14239
0
    *pOffset += offset;
14240
14241
0
    return ret;
14242
0
}
14243
14244
#ifdef HAVE_SUPPORTED_CURVES
14245
14246
/* Populates the default supported groups / curves */
14247
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
14248
{
14249
    int ret = WOLFSSL_SUCCESS;
14250
#ifdef WOLFSSL_TLS13
14251
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14252
    if (ssl->options.resuming && ssl->session->namedGroup != 0) {
14253
        return TLSX_UseSupportedCurve(extensions, ssl->session->namedGroup,
14254
                                                                     ssl->heap);
14255
    }
14256
#endif
14257
14258
    if (ssl->numGroups != 0) {
14259
        int i;
14260
        for (i = 0; i < ssl->numGroups; i++) {
14261
            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap);
14262
            if (ret != WOLFSSL_SUCCESS)
14263
                return ret;
14264
        }
14265
        return WOLFSSL_SUCCESS;
14266
    }
14267
#endif /* WOLFSSL_TLS13 */
14268
14269
#if defined(HAVE_ECC)
14270
        /* list in order by strength, since not all servers choose by strength */
14271
        #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
14272
            #ifndef NO_ECC_SECP
14273
                ret = TLSX_UseSupportedCurve(extensions,
14274
                                              WOLFSSL_ECC_SECP521R1, ssl->heap);
14275
                if (ret != WOLFSSL_SUCCESS) return ret;
14276
            #endif
14277
        #endif
14278
        #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
14279
            #ifdef HAVE_ECC_BRAINPOOL
14280
                ret = TLSX_UseSupportedCurve(extensions,
14281
                                        WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
14282
                if (ret != WOLFSSL_SUCCESS) return ret;
14283
            #endif
14284
        #endif
14285
        #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
14286
            #ifndef NO_ECC_SECP
14287
                ret = TLSX_UseSupportedCurve(extensions,
14288
                                              WOLFSSL_ECC_SECP384R1, ssl->heap);
14289
                if (ret != WOLFSSL_SUCCESS) return ret;
14290
            #endif
14291
            #ifdef HAVE_ECC_BRAINPOOL
14292
                ret = TLSX_UseSupportedCurve(extensions,
14293
                                        WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
14294
                if (ret != WOLFSSL_SUCCESS) return ret;
14295
            #endif
14296
        #endif
14297
#endif /* HAVE_ECC */
14298
14299
        #ifndef HAVE_FIPS
14300
            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14301
                ret = TLSX_UseSupportedCurve(extensions,
14302
                                                   WOLFSSL_ECC_X448, ssl->heap);
14303
                if (ret != WOLFSSL_SUCCESS) return ret;
14304
            #endif
14305
        #endif /* HAVE_FIPS */
14306
14307
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
14308
        #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
14309
            #ifndef NO_ECC_SECP
14310
                ret = TLSX_UseSupportedCurve(extensions,
14311
                                              WOLFSSL_ECC_SECP256R1, ssl->heap);
14312
                if (ret != WOLFSSL_SUCCESS) return ret;
14313
            #endif
14314
            #ifdef HAVE_ECC_KOBLITZ
14315
                ret = TLSX_UseSupportedCurve(extensions,
14316
                                              WOLFSSL_ECC_SECP256K1, ssl->heap);
14317
                if (ret != WOLFSSL_SUCCESS) return ret;
14318
            #endif
14319
            #ifdef HAVE_ECC_BRAINPOOL
14320
                ret = TLSX_UseSupportedCurve(extensions,
14321
                                        WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
14322
                if (ret != WOLFSSL_SUCCESS) return ret;
14323
            #endif
14324
            #ifdef WOLFSSL_SM2
14325
                ret = TLSX_UseSupportedCurve(extensions,
14326
                                              WOLFSSL_ECC_SM2P256V1, ssl->heap);
14327
                if (ret != WOLFSSL_SUCCESS) return ret;
14328
            #endif
14329
        #endif
14330
#endif /* HAVE_ECC */
14331
14332
        #ifndef HAVE_FIPS
14333
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14334
                ret = TLSX_UseSupportedCurve(extensions,
14335
                                                 WOLFSSL_ECC_X25519, ssl->heap);
14336
                if (ret != WOLFSSL_SUCCESS) return ret;
14337
            #endif
14338
        #endif /* HAVE_FIPS */
14339
14340
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
14341
        #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
14342
            #ifndef NO_ECC_SECP
14343
                ret = TLSX_UseSupportedCurve(extensions,
14344
                                              WOLFSSL_ECC_SECP224R1, ssl->heap);
14345
                if (ret != WOLFSSL_SUCCESS) return ret;
14346
            #endif
14347
            #ifdef HAVE_ECC_KOBLITZ
14348
                ret = TLSX_UseSupportedCurve(extensions,
14349
                                              WOLFSSL_ECC_SECP224K1, ssl->heap);
14350
                if (ret != WOLFSSL_SUCCESS) return ret;
14351
            #endif
14352
        #endif
14353
14354
    #ifndef HAVE_FIPS
14355
        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
14356
            #ifndef NO_ECC_SECP
14357
                ret = TLSX_UseSupportedCurve(extensions,
14358
                                              WOLFSSL_ECC_SECP192R1, ssl->heap);
14359
                if (ret != WOLFSSL_SUCCESS) return ret;
14360
            #endif
14361
            #ifdef HAVE_ECC_KOBLITZ
14362
                ret = TLSX_UseSupportedCurve(extensions,
14363
                                              WOLFSSL_ECC_SECP192K1, ssl->heap);
14364
                if (ret != WOLFSSL_SUCCESS) return ret;
14365
            #endif
14366
        #endif
14367
        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
14368
            #ifndef NO_ECC_SECP
14369
                ret = TLSX_UseSupportedCurve(extensions,
14370
                                              WOLFSSL_ECC_SECP160R1, ssl->heap);
14371
                if (ret != WOLFSSL_SUCCESS) return ret;
14372
            #endif
14373
            #ifdef HAVE_ECC_SECPR2
14374
                ret = TLSX_UseSupportedCurve(extensions,
14375
                                              WOLFSSL_ECC_SECP160R2, ssl->heap);
14376
                if (ret != WOLFSSL_SUCCESS) return ret;
14377
            #endif
14378
            #ifdef HAVE_ECC_KOBLITZ
14379
                ret = TLSX_UseSupportedCurve(extensions,
14380
                                              WOLFSSL_ECC_SECP160K1, ssl->heap);
14381
                if (ret != WOLFSSL_SUCCESS) return ret;
14382
            #endif
14383
        #endif
14384
    #endif /* HAVE_FIPS */
14385
#endif /* HAVE_ECC */
14386
14387
#ifndef NO_DH
14388
            /* Add FFDHE supported groups. */
14389
        #ifdef HAVE_FFDHE_8192
14390
            if (8192/8 >= ssl->options.minDhKeySz &&
14391
                                            8192/8 <= ssl->options.maxDhKeySz) {
14392
                ret = TLSX_UseSupportedCurve(extensions,
14393
                                             WOLFSSL_FFDHE_8192, ssl->heap);
14394
                if (ret != WOLFSSL_SUCCESS)
14395
                    return ret;
14396
            }
14397
        #endif
14398
        #ifdef HAVE_FFDHE_6144
14399
            if (6144/8 >= ssl->options.minDhKeySz &&
14400
                                            6144/8 <= ssl->options.maxDhKeySz) {
14401
                ret = TLSX_UseSupportedCurve(extensions,
14402
                                             WOLFSSL_FFDHE_6144, ssl->heap);
14403
                if (ret != WOLFSSL_SUCCESS)
14404
                    return ret;
14405
            }
14406
        #endif
14407
        #ifdef HAVE_FFDHE_4096
14408
            if (4096/8 >= ssl->options.minDhKeySz &&
14409
                                            4096/8 <= ssl->options.maxDhKeySz) {
14410
                ret = TLSX_UseSupportedCurve(extensions,
14411
                                             WOLFSSL_FFDHE_4096, ssl->heap);
14412
                if (ret != WOLFSSL_SUCCESS)
14413
                    return ret;
14414
            }
14415
        #endif
14416
        #ifdef HAVE_FFDHE_3072
14417
            if (3072/8 >= ssl->options.minDhKeySz &&
14418
                                            3072/8 <= ssl->options.maxDhKeySz) {
14419
                ret = TLSX_UseSupportedCurve(extensions,
14420
                                             WOLFSSL_FFDHE_3072, ssl->heap);
14421
                if (ret != WOLFSSL_SUCCESS)
14422
                    return ret;
14423
            }
14424
        #endif
14425
        #ifdef HAVE_FFDHE_2048
14426
            if (2048/8 >= ssl->options.minDhKeySz &&
14427
                                            2048/8 <= ssl->options.maxDhKeySz) {
14428
                ret = TLSX_UseSupportedCurve(extensions,
14429
                                             WOLFSSL_FFDHE_2048, ssl->heap);
14430
                if (ret != WOLFSSL_SUCCESS)
14431
                    return ret;
14432
            }
14433
        #endif
14434
#endif
14435
14436
#ifdef WOLFSSL_HAVE_MLKEM
14437
#ifndef WOLFSSL_NO_ML_KEM
14438
#ifdef WOLFSSL_WC_MLKEM
14439
#ifndef WOLFSSL_NO_ML_KEM_512
14440
    if (ret == WOLFSSL_SUCCESS)
14441
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512,
14442
                                     ssl->heap);
14443
    if (ret == WOLFSSL_SUCCESS)
14444
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_ML_KEM_512,
14445
                                     ssl->heap);
14446
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14447
    if (ret == WOLFSSL_SUCCESS)
14448
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_ML_KEM_512,
14449
                                     ssl->heap);
14450
    #endif
14451
#endif
14452
#ifndef WOLFSSL_NO_ML_KEM_768
14453
    if (ret == WOLFSSL_SUCCESS)
14454
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
14455
                                     ssl->heap);
14456
    if (ret == WOLFSSL_SUCCESS)
14457
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_ML_KEM_768,
14458
                                     ssl->heap);
14459
    if (ret == WOLFSSL_SUCCESS)
14460
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_ML_KEM_768,
14461
                                     ssl->heap);
14462
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14463
    if (ret == WOLFSSL_SUCCESS)
14464
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_ML_KEM_768,
14465
                                     ssl->heap);
14466
    #endif
14467
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14468
    if (ret == WOLFSSL_SUCCESS)
14469
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_ML_KEM_768,
14470
                                     ssl->heap);
14471
    #endif
14472
#endif
14473
#ifndef WOLFSSL_NO_ML_KEM_1024
14474
    if (ret == WOLFSSL_SUCCESS)
14475
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
14476
                                     ssl->heap);
14477
    if (ret == WOLFSSL_SUCCESS)
14478
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_ML_KEM_1024,
14479
                                     ssl->heap);
14480
    if (ret == WOLFSSL_SUCCESS)
14481
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_ML_KEM_1024,
14482
                                     ssl->heap);
14483
#endif
14484
#elif defined(HAVE_LIBOQS)
14485
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_512, ssl->heap);
14486
    if (ret == WOLFSSL_SUCCESS)
14487
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_768,
14488
                                     ssl->heap);
14489
    if (ret == WOLFSSL_SUCCESS)
14490
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ML_KEM_1024,
14491
                                     ssl->heap);
14492
    if (ret == WOLFSSL_SUCCESS)
14493
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_ML_KEM_512,
14494
                                     ssl->heap);
14495
    if (ret == WOLFSSL_SUCCESS)
14496
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_ML_KEM_768,
14497
                                     ssl->heap);
14498
    if (ret == WOLFSSL_SUCCESS)
14499
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_ML_KEM_768,
14500
                                     ssl->heap);
14501
    if (ret == WOLFSSL_SUCCESS)
14502
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_ML_KEM_1024,
14503
                                     ssl->heap);
14504
    if (ret == WOLFSSL_SUCCESS)
14505
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_ML_KEM_1024,
14506
                                     ssl->heap);
14507
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14508
    if (ret == WOLFSSL_SUCCESS)
14509
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_ML_KEM_512,
14510
                                     ssl->heap);
14511
    if (ret == WOLFSSL_SUCCESS)
14512
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_ML_KEM_768,
14513
                                     ssl->heap);
14514
    #endif
14515
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14516
    if (ret == WOLFSSL_SUCCESS)
14517
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_ML_KEM_768,
14518
                                     ssl->heap);
14519
    #endif
14520
#endif /* HAVE_LIBOQS */
14521
#endif /* !WOLFSSL_NO_ML_KEM */
14522
#ifdef WOLFSSL_MLKEM_KYBER
14523
#ifdef WOLFSSL_WC_MLKEM
14524
#ifdef WOLFSSL_KYBER512
14525
    if (ret == WOLFSSL_SUCCESS)
14526
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1,
14527
                                     ssl->heap);
14528
    if (ret == WOLFSSL_SUCCESS)
14529
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
14530
                                     ssl->heap);
14531
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14532
    if (ret == WOLFSSL_SUCCESS)
14533
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
14534
                                     ssl->heap);
14535
    #endif
14536
#endif
14537
#ifdef WOLFSSL_KYBER768
14538
    if (ret == WOLFSSL_SUCCESS)
14539
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
14540
                                     ssl->heap);
14541
    if (ret == WOLFSSL_SUCCESS)
14542
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
14543
                                     ssl->heap);
14544
    if (ret == WOLFSSL_SUCCESS)
14545
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
14546
                                     ssl->heap);
14547
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14548
    if (ret == WOLFSSL_SUCCESS)
14549
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
14550
                                     ssl->heap);
14551
    #endif
14552
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14553
    if (ret == WOLFSSL_SUCCESS)
14554
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
14555
                                     ssl->heap);
14556
    #endif
14557
#endif
14558
#ifdef WOLFSSL_KYBER1024
14559
    if (ret == WOLFSSL_SUCCESS)
14560
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
14561
                                     ssl->heap);
14562
    if (ret == WOLFSSL_SUCCESS)
14563
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
14564
                                     ssl->heap);
14565
#endif
14566
#elif defined(HAVE_LIBOQS)
14567
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap);
14568
    if (ret == WOLFSSL_SUCCESS)
14569
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
14570
                                     ssl->heap);
14571
    if (ret == WOLFSSL_SUCCESS)
14572
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
14573
                                     ssl->heap);
14574
    if (ret == WOLFSSL_SUCCESS)
14575
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
14576
                                     ssl->heap);
14577
    if (ret == WOLFSSL_SUCCESS)
14578
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
14579
                                     ssl->heap);
14580
    if (ret == WOLFSSL_SUCCESS)
14581
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL3,
14582
                                     ssl->heap);
14583
    if (ret == WOLFSSL_SUCCESS)
14584
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
14585
                                     ssl->heap);
14586
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
14587
    if (ret == WOLFSSL_SUCCESS)
14588
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL1,
14589
                                     ssl->heap);
14590
    if (ret == WOLFSSL_SUCCESS)
14591
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X25519_KYBER_LEVEL3,
14592
                                     ssl->heap);
14593
    #endif
14594
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
14595
    if (ret == WOLFSSL_SUCCESS)
14596
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_X448_KYBER_LEVEL3,
14597
                                     ssl->heap);
14598
    #endif
14599
#endif /* HAVE_LIBOQS */
14600
#endif /* WOLFSSL_MLKEM_KYBER */
14601
#endif /* WOLFSSL_HAVE_MLKEM */
14602
14603
    (void)ssl;
14604
    (void)extensions;
14605
14606
    return ret;
14607
}
14608
14609
#endif /* HAVE_SUPPORTED_CURVES */
14610
14611
int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
14612
0
{
14613
0
    int ret = 0;
14614
0
    byte* public_key      = NULL;
14615
0
    word16 public_key_len = 0;
14616
0
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
14617
0
    int usingPSK = 0;
14618
0
#endif
14619
0
#if defined(HAVE_SUPPORTED_CURVES) && defined(WOLFSSL_TLS13)
14620
0
    TLSX* extension = NULL;
14621
0
    word16 namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
14622
0
#endif
14623
14624
    /* server will add extension depending on what is parsed from client */
14625
0
    if (!isServer) {
14626
#if defined(HAVE_RPK)
14627
        ret = TLSX_ClientCertificateType_Use(ssl, isServer);
14628
        if (ret != 0)
14629
            return ret;
14630
14631
        ret = TLSX_ServerCertificateType_Use(ssl, isServer);
14632
        if (ret != 0)
14633
            return ret;
14634
#endif /* HAVE_RPK */
14635
14636
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) && \
14637
0
    !defined(WOLFSSL_NO_TLS12)
14638
0
        if (!ssl->options.disallowEncThenMac) {
14639
0
            ret = TLSX_EncryptThenMac_Use(ssl);
14640
0
            if (ret != 0)
14641
0
                return ret;
14642
0
        }
14643
0
#endif
14644
14645
0
#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
14646
0
                       defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
14647
0
        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
14648
0
            if (TLSX_Find(ssl->ctx->extensions,
14649
0
                                               TLSX_SUPPORTED_GROUPS) == NULL) {
14650
0
                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
14651
0
                if (ret != WOLFSSL_SUCCESS)
14652
0
                    return ret;
14653
0
            }
14654
0
        }
14655
0
        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
14656
0
               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
14657
0
               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
14658
0
             ret = TLSX_UsePointFormat(&ssl->extensions,
14659
0
                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
14660
0
             if (ret != WOLFSSL_SUCCESS)
14661
0
                 return ret;
14662
0
        }
14663
0
#endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
14664
14665
#ifdef WOLFSSL_SRTP
14666
        if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
14667
            WOLFSSL_MSG("Adding DTLS SRTP extension");
14668
            if ((ret = TLSX_UseSRTP(&ssl->extensions, ssl->dtlsSrtpProfiles,
14669
                                                                ssl->heap)) != 0) {
14670
                return ret;
14671
            }
14672
        }
14673
#endif
14674
#ifdef WOLFSSL_DUAL_ALG_CERTS
14675
        if ((IsAtLeastTLSv1_3(ssl->version)) && (ssl->sigSpec != NULL)) {
14676
            WOLFSSL_MSG("Adding CKS extension");
14677
            if ((ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap)) != 0) {
14678
                return ret;
14679
            }
14680
        }
14681
#endif
14682
0
    } /* is not server */
14683
14684
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14685
0
    WOLFSSL_MSG("Adding signature algorithms extension");
14686
0
    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
14687
0
                                                                         != 0) {
14688
0
            return ret;
14689
0
    }
14690
#else
14691
    ret = 0;
14692
#endif
14693
0
#ifdef WOLFSSL_TLS13
14694
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14695
0
        if (isServer && IsAtLeastTLSv1_3(ssl->version)) {
14696
0
            if (SSL_CA_NAMES(ssl) != NULL) {
14697
0
                WOLFSSL_MSG("Adding certificate authorities extension");
14698
0
                if ((ret = TLSX_Push(&ssl->extensions,
14699
0
                        TLSX_CERTIFICATE_AUTHORITIES, ssl, ssl->heap)) != 0) {
14700
0
                        return ret;
14701
0
                }
14702
0
            }
14703
0
        }
14704
0
    #endif
14705
0
        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
14706
            /* Add mandatory TLS v1.3 extension: supported version */
14707
0
            WOLFSSL_MSG("Adding supported versions extension");
14708
0
            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
14709
0
                                                             ssl->heap)) != 0) {
14710
0
                return ret;
14711
0
            }
14712
14713
    #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && \
14714
                       !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)
14715
        if (TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
14716
            /* Put in DH groups for TLS 1.3 only. */
14717
            ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
14718
            if (ret != WOLFSSL_SUCCESS)
14719
                return ret;
14720
        /* ret value will be overwritten in !NO_PSK case */
14721
        #ifdef NO_PSK
14722
            ret = 0;
14723
        #endif
14724
        }
14725
    #endif /* !(HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
14726
14727
0
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14728
0
            if (ssl->certHashSigAlgoSz > 0) {
14729
0
                WOLFSSL_MSG("Adding signature algorithms cert extension");
14730
0
                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
14731
0
                                                        ssl, ssl->heap)) != 0) {
14732
0
                    return ret;
14733
0
                }
14734
0
            }
14735
0
        #endif
14736
14737
0
        #if defined(HAVE_SUPPORTED_CURVES)
14738
0
            extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
14739
0
            if (extension == NULL) {
14740
0
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14741
0
                if (ssl->options.resuming && ssl->session->namedGroup != 0)
14742
0
                    namedGroup = ssl->session->namedGroup;
14743
0
                else
14744
0
            #endif
14745
0
                if (ssl->numGroups > 0) {
14746
0
                    int set = 0;
14747
0
                    int i, j;
14748
14749
                    /* try to find the highest element in ssl->group[]
14750
                     * that is contained in preferredGroup[].
14751
                     */
14752
0
                    namedGroup = preferredGroup[0];
14753
0
                    for (i = 0; i < ssl->numGroups && !set; i++) {
14754
0
                        for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
14755
0
                            if (preferredGroup[j] == ssl->group[i]
14756
#ifdef HAVE_LIBOQS
14757
                                && TLSX_IsGroupSupported(preferredGroup[j])
14758
#endif
14759
0
                                                                ) {
14760
0
                                namedGroup = ssl->group[i];
14761
0
                                set = 1;
14762
0
                                break;
14763
0
                            }
14764
0
                        }
14765
0
                    }
14766
0
                    if (!set)
14767
0
                        namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
14768
0
                }
14769
0
                else {
14770
                    /* Choose the most preferred group. */
14771
0
                    namedGroup = preferredGroup[0];
14772
#ifdef HAVE_LIBOQS
14773
                    if (!TLSX_IsGroupSupported(namedGroup)) {
14774
                        int i = 1;
14775
                        for (;preferredGroup[i] != WOLFSSL_NAMED_GROUP_INVALID;
14776
                              i++) {
14777
                            if (TLSX_IsGroupSupported(preferredGroup[i]))
14778
                                break;
14779
                        }
14780
                        namedGroup = preferredGroup[i];
14781
                    }
14782
#endif
14783
0
                }
14784
0
            }
14785
0
            else {
14786
0
                KeyShareEntry* kse = (KeyShareEntry*)extension->data;
14787
0
                if (kse)
14788
0
                    namedGroup = kse->group;
14789
0
            }
14790
0
            if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
14791
0
                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
14792
0
                        &ssl->extensions);
14793
0
                if (ret != 0)
14794
0
                    return ret;
14795
0
            }
14796
0
        #endif /* HAVE_SUPPORTED_CURVES */
14797
14798
0
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14799
0
            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
14800
0
        #endif
14801
0
        #if defined(HAVE_SESSION_TICKET)
14802
0
            if (ssl->options.resuming && ssl->session->ticketLen > 0) {
14803
0
                WOLFSSL_SESSION* sess = ssl->session;
14804
            #ifdef WOLFSSL_32BIT_MILLI_TIME
14805
                word32 now, milli;
14806
            #else
14807
0
                word64 now, milli;
14808
0
            #endif
14809
14810
                /* Determine the MAC algorithm for the cipher suite used. */
14811
0
                ssl->options.cipherSuite0 = sess->cipherSuite0;
14812
0
                ssl->options.cipherSuite  = sess->cipherSuite;
14813
0
                ret = SetCipherSpecs(ssl);
14814
0
                if (ret != 0)
14815
0
                    return ret;
14816
0
                now = (word64)TimeNowInMilliseconds();
14817
0
                if (now == 0)
14818
0
                    return GETTIME_ERROR;
14819
            #ifdef WOLFSSL_32BIT_MILLI_TIME
14820
                if (now < sess->ticketSeen)
14821
                    milli = (0xFFFFFFFFU - sess->ticketSeen) + 1 + now;
14822
                else
14823
                    milli = now - sess->ticketSeen;
14824
                milli += sess->ticketAdd;
14825
14826
                /* Pre-shared key is mandatory extension for resumption. */
14827
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
14828
                    sess->ticketLen, milli, ssl->specs.mac_algorithm,
14829
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
14830
                    NULL, ssl->heap);
14831
            #else
14832
0
                milli = now - sess->ticketSeen + sess->ticketAdd;
14833
14834
                /* Pre-shared key is mandatory extension for resumption. */
14835
0
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
14836
0
                    sess->ticketLen, (word32)milli, ssl->specs.mac_algorithm,
14837
0
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
14838
0
                    NULL, ssl->heap);
14839
0
            #endif
14840
0
                if (ret != 0)
14841
0
                    return ret;
14842
14843
0
                usingPSK = 1;
14844
0
            }
14845
0
        #endif
14846
    #ifndef NO_PSK
14847
        #ifndef WOLFSSL_PSK_ONE_ID
14848
            if (ssl->options.client_psk_cs_cb != NULL) {
14849
                int i;
14850
                const Suites* suites = WOLFSSL_SUITES(ssl);
14851
                for (i = 0; i < suites->suiteSz; i += 2) {
14852
                    byte cipherSuite0 = suites->suites[i + 0];
14853
                    byte cipherSuite = suites->suites[i + 1];
14854
                    unsigned int keySz;
14855
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14856
                    int cnt = 0;
14857
                #endif
14858
14859
                #ifdef HAVE_NULL_CIPHER
14860
                    if (cipherSuite0 == ECC_BYTE ||
14861
                        cipherSuite0 == ECDHE_PSK_BYTE) {
14862
                        if (cipherSuite != TLS_SHA256_SHA256 &&
14863
                                             cipherSuite != TLS_SHA384_SHA384) {
14864
                            continue;
14865
                        }
14866
                    }
14867
                    else
14868
                #endif
14869
                #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
14870
                    defined(WOLFSSL_SM3)
14871
                    if (cipherSuite0 == CIPHER_BYTE) {
14872
                        if ((cipherSuite != TLS_SM4_GCM_SM3) &&
14873
                            (cipherSuite != TLS_SM4_CCM_SM3)) {
14874
                            continue;
14875
                        }
14876
                    }
14877
                    else
14878
                #endif
14879
                    if (cipherSuite0 != TLS13_BYTE)
14880
                        continue;
14881
14882
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14883
                    do {
14884
                        ssl->arrays->client_identity[0] = cnt;
14885
                #endif
14886
14887
                        ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
14888
                        keySz = ssl->options.client_psk_cs_cb(
14889
                            ssl, ssl->arrays->server_hint,
14890
                            ssl->arrays->client_identity, MAX_PSK_ID_LEN,
14891
                            ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
14892
                            GetCipherNameInternal(cipherSuite0, cipherSuite));
14893
                        if (keySz > 0) {
14894
                            ssl->arrays->psk_keySz = keySz;
14895
                            ret = TLSX_PreSharedKey_Use(&ssl->extensions,
14896
                                (byte*)ssl->arrays->client_identity,
14897
                                (word16)XSTRLEN(ssl->arrays->client_identity),
14898
                                0, SuiteMac(WOLFSSL_SUITES(ssl)->suites + i),
14899
                                cipherSuite0, cipherSuite, 0, NULL, ssl->heap);
14900
                            if (ret != 0)
14901
                                return ret;
14902
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14903
                            cnt++;
14904
                #endif
14905
                        }
14906
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
14907
                    }
14908
                    while (keySz > 0);
14909
                #endif
14910
                }
14911
14912
                usingPSK = 1;
14913
            }
14914
            else
14915
        #endif
14916
            if (ssl->options.client_psk_cb != NULL ||
14917
                ssl->options.client_psk_tls13_cb != NULL) {
14918
                /* Default cipher suite. */
14919
                byte cipherSuite0 = TLS13_BYTE;
14920
                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
14921
                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
14922
                const char* cipherName = NULL;
14923
14924
                if (ssl->options.client_psk_tls13_cb != NULL) {
14925
                    ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
14926
                        ssl, ssl->arrays->server_hint,
14927
                        ssl->arrays->client_identity, MAX_PSK_ID_LEN,
14928
                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
14929
                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
14930
                            &cipherSuite, NULL, NULL, &cipherSuiteFlags) != 0) {
14931
                        return PSK_KEY_ERROR;
14932
                    }
14933
                }
14934
                else {
14935
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
14936
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
14937
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
14938
                }
14939
                if (
14940
                #ifdef OPENSSL_EXTRA
14941
                    /* OpenSSL treats a PSK key length of 0
14942
                     * to indicate no PSK available.
14943
                     */
14944
                    ssl->arrays->psk_keySz == 0 ||
14945
                #endif
14946
                         (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
14947
                     (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
14948
                #ifndef OPENSSL_EXTRA
14949
                    ret = PSK_KEY_ERROR;
14950
                #endif
14951
                }
14952
                else {
14953
                    ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
14954
14955
                    ssl->options.cipherSuite0 = cipherSuite0;
14956
                    ssl->options.cipherSuite  = cipherSuite;
14957
                    (void)cipherSuiteFlags;
14958
                    ret = SetCipherSpecs(ssl);
14959
                    if (ret == 0) {
14960
                        ret = TLSX_PreSharedKey_Use(
14961
                            &ssl->extensions,
14962
                                     (byte*)ssl->arrays->client_identity,
14963
                            (word16)XSTRLEN(ssl->arrays->client_identity),
14964
                            0, ssl->specs.mac_algorithm,
14965
                            cipherSuite0, cipherSuite, 0,
14966
                            NULL, ssl->heap);
14967
                    }
14968
                    if (ret == 0)
14969
                        usingPSK = 1;
14970
                }
14971
                if (ret != 0)
14972
                    return ret;
14973
            }
14974
    #endif /* !NO_PSK */
14975
0
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14976
14977
            /* Some servers do not generate session tickets unless
14978
             * the extension is seen in a non-resume client hello.
14979
             * We used to send it only if we were otherwise using PSK.
14980
             * Now always send it. Define NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
14981
             * to revert to the old behaviour. */
14982
            #ifdef NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
14983
            if (usingPSK)
14984
            #endif
14985
0
            {
14986
0
                byte modes = 0;
14987
14988
0
                (void)usingPSK;
14989
                /* Pre-shared key modes: mandatory extension for resumption. */
14990
0
            #ifdef HAVE_SUPPORTED_CURVES
14991
0
                if (!ssl->options.onlyPskDheKe)
14992
0
            #endif
14993
0
                {
14994
0
                    modes = 1 << PSK_KE;
14995
0
                }
14996
0
            #if !defined(NO_DH) || defined(HAVE_ECC) || \
14997
0
                              defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
14998
0
                if (!ssl->options.noPskDheKe) {
14999
0
                    modes |= 1 << PSK_DHE_KE;
15000
0
                }
15001
0
            #endif
15002
0
                ret = TLSX_PskKeyModes_Use(ssl, modes);
15003
0
                if (ret != 0)
15004
0
                    return ret;
15005
0
            }
15006
0
        #endif
15007
        #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
15008
            if (!isServer && ssl->options.postHandshakeAuth) {
15009
                ret = TLSX_PostHandAuth_Use(ssl);
15010
                if (ret != 0)
15011
                    return ret;
15012
            }
15013
        #endif
15014
#if defined(HAVE_ECH)
15015
            /* GREASE ECH */
15016
            if (!ssl->options.disableECH) {
15017
                if (ssl->echConfigs == NULL) {
15018
                    ret = GREASE_ECH_USE(&(ssl->extensions), ssl->heap,
15019
                            ssl->rng);
15020
                }
15021
                else if (ssl->echConfigs != NULL) {
15022
                    ret = ECH_USE(ssl->echConfigs, &(ssl->extensions),
15023
                            ssl->heap, ssl->rng);
15024
                }
15025
            }
15026
#endif
15027
0
        }
15028
#if defined(HAVE_ECH)
15029
        else if (IsAtLeastTLSv1_3(ssl->version)) {
15030
            if (ssl->ctx->echConfigs != NULL && !ssl->options.disableECH) {
15031
                ret = SERVER_ECH_USE(&(ssl->extensions), ssl->heap,
15032
                    ssl->ctx->echConfigs);
15033
15034
                if (ret == 0)
15035
                    TLSX_SetResponse(ssl, TLSX_ECH);
15036
            }
15037
        }
15038
#endif
15039
15040
0
#endif
15041
15042
0
    (void)isServer;
15043
0
    (void)public_key;
15044
0
    (void)public_key_len;
15045
0
    (void)ssl;
15046
15047
0
    return ret;
15048
0
}
15049
15050
15051
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
15052
15053
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15054
/* because the size of ech depends on the size of other extensions we need to
15055
 * get the size with ech special and process ech last, return status */
15056
static int TLSX_GetSizeWithEch(WOLFSSL* ssl, byte* semaphore, byte msgType,
15057
    word16* pLength)
15058
{
15059
    int ret = 0;
15060
    TLSX* echX = NULL;
15061
    TLSX* serverNameX = NULL;
15062
    TLSX** extensions = NULL;
15063
#ifdef WOLFSSL_SMALL_STACK
15064
    char* tmpServerName = NULL;
15065
#else
15066
    char tmpServerName[MAX_PUBLIC_NAME_SZ];
15067
#endif
15068
15069
    /* calculate the rest of the extensions length with inner ech */
15070
    if (ssl->extensions)
15071
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
15072
15073
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions)
15074
        echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
15075
15076
    /* if type is outer change sni to public name */
15077
    if (echX != NULL && ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER &&
15078
        (ssl->options.echAccepted ||
15079
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
15080
        if (ssl->extensions) {
15081
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
15082
15083
            if (serverNameX != NULL)
15084
                extensions = &ssl->extensions;
15085
        }
15086
15087
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
15088
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
15089
            extensions = &ssl->ctx->extensions;
15090
        }
15091
15092
        /* store the inner server name */
15093
        if (serverNameX != NULL) {
15094
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
15095
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
15096
15097
        #ifdef WOLFSSL_SMALL_STACK
15098
            tmpServerName = (char*)XMALLOC(hostNameSz, ssl->heap,
15099
                DYNAMIC_TYPE_TMP_BUFFER);
15100
            if (tmpServerName == NULL)
15101
                return MEMORY_E;
15102
        #else
15103
            /* truncate if too long */
15104
            if (hostNameSz > MAX_PUBLIC_NAME_SZ)
15105
                hostNameSz = MAX_PUBLIC_NAME_SZ;
15106
        #endif
15107
15108
            XMEMCPY(tmpServerName, hostName, hostNameSz);
15109
        }
15110
15111
        /* remove the inner server name */
15112
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15113
15114
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
15115
            ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
15116
            XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
15117
            ssl->heap);
15118
15119
        /* set the public name as the server name */
15120
        if (ret == WOLFSSL_SUCCESS)
15121
            ret = 0;
15122
    }
15123
15124
    if (ret == 0 && ssl->extensions)
15125
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, pLength);
15126
15127
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions)
15128
        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, pLength);
15129
15130
    if (serverNameX != NULL) {
15131
        /* remove the public name SNI */
15132
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15133
15134
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
15135
            tmpServerName, XSTRLEN(tmpServerName), ssl->heap);
15136
15137
        /* restore the inner server name */
15138
        if (ret == WOLFSSL_SUCCESS)
15139
            ret = 0;
15140
    }
15141
15142
#ifdef WOLFSSL_SMALL_STACK
15143
    XFREE(tmpServerName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15144
#endif
15145
15146
    return ret;
15147
}
15148
#endif
15149
15150
/** Tells the buffered size of extensions to be sent into the client hello. */
15151
int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word32* pLength)
15152
0
{
15153
0
    int ret = 0;
15154
0
    word16 length = 0;
15155
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
15156
15157
0
    if (!TLSX_SupportExtensions(ssl))
15158
0
        return 0;
15159
0
    if (msgType == client_hello) {
15160
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
15161
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
15162
0
        WOLF_STK_VALIDATE_REQUEST(ssl);
15163
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15164
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
15165
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15166
0
#endif
15167
0
#if defined(WOLFSSL_TLS13)
15168
0
        if (!IsAtLeastTLSv1_2(ssl)) {
15169
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15170
0
        }
15171
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15172
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
15173
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15174
0
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15175
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15176
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
15177
0
        #endif
15178
        #ifdef WOLFSSL_EARLY_DATA
15179
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15180
        #endif
15181
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15182
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15183
        #endif
15184
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15185
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
15186
        #endif
15187
0
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15188
0
            TURN_ON(semaphore,
15189
0
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15190
0
        #endif
15191
0
        }
15192
0
    #endif
15193
0
#endif /* WOLFSSL_TLS13 */
15194
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
15195
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
15196
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
15197
            /* mark already sent, so it won't send it */
15198
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15199
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15200
        }
15201
    #endif
15202
0
    }
15203
15204
0
#ifdef WOLFSSL_TLS13
15205
0
    #ifndef NO_CERTS
15206
0
    else if (msgType == certificate_request) {
15207
        /* Don't send out any extension except those that are turned off. */
15208
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15209
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15210
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15211
0
#endif
15212
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15213
0
        if (SSL_CA_NAMES(ssl) != NULL)
15214
0
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15215
0
#endif
15216
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, OID_FILTERS
15217
         *       TLSX_STATUS_REQUEST
15218
         */
15219
0
    }
15220
0
    #endif
15221
#if defined(HAVE_ECH)
15222
    if (ssl->options.useEch == 1 && !ssl->options.disableECH
15223
            && msgType == client_hello) {
15224
        ret = TLSX_GetSizeWithEch(ssl, semaphore, msgType, &length);
15225
        if (ret != 0)
15226
            return ret;
15227
    }
15228
    else
15229
#endif /* HAVE_ECH */
15230
0
#endif /* WOLFSSL_TLS13 */
15231
0
    {
15232
0
        if (ssl->extensions) {
15233
0
            ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
15234
0
            if (ret != 0)
15235
0
                return ret;
15236
0
        }
15237
0
        if (ssl->ctx && ssl->ctx->extensions) {
15238
0
            ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType,
15239
0
                &length);
15240
0
            if (ret != 0)
15241
0
                return ret;
15242
0
        }
15243
0
    }
15244
15245
0
#ifdef HAVE_EXTENDED_MASTER
15246
0
    if (msgType == client_hello && ssl->options.haveEMS &&
15247
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
15248
0
        length += HELLO_EXT_SZ;
15249
0
    }
15250
0
#endif
15251
15252
0
    if (length)
15253
0
        length += OPAQUE16_LEN; /* for total length storage. */
15254
15255
0
    *pLength += length;
15256
15257
0
    return ret;
15258
0
}
15259
15260
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15261
/* return status after writing the extensions with ech written last */
15262
static int TLSX_WriteWithEch(WOLFSSL* ssl, byte* output, byte* semaphore,
15263
    byte msgType, word16* pOffset)
15264
{
15265
    int ret = 0;
15266
    TLSX* echX = NULL;
15267
    TLSX* serverNameX = NULL;
15268
    TLSX** extensions = NULL;
15269
#ifdef WOLFSSL_SMALL_STACK
15270
    char* tmpServerName = NULL;
15271
#else
15272
    char tmpServerName[MAX_PUBLIC_NAME_SZ];
15273
#endif
15274
15275
    /* get the echX from either extensions or ctx */
15276
    if (ssl->extensions)
15277
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
15278
15279
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions) {
15280
        /* if not NULL the semaphore will stop it from being counted */
15281
        if (echX == NULL)
15282
            echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
15283
    }
15284
15285
    /* if type is outer change sni to public name */
15286
    if (echX != NULL && ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER &&
15287
        (ssl->options.echAccepted ||
15288
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
15289
        if (ssl->extensions) {
15290
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
15291
15292
            if (serverNameX != NULL)
15293
                extensions = &ssl->extensions;
15294
        }
15295
15296
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
15297
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
15298
            extensions = &ssl->ctx->extensions;
15299
        }
15300
15301
        /* store the inner server name */
15302
        if (serverNameX != NULL) {
15303
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
15304
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
15305
15306
        #ifdef WOLFSSL_SMALL_STACK
15307
            tmpServerName = (char*)XMALLOC(hostNameSz, ssl->heap,
15308
                DYNAMIC_TYPE_TMP_BUFFER);
15309
            if (tmpServerName == NULL)
15310
                return MEMORY_E;
15311
        #else
15312
            /* truncate if too long */
15313
            if (hostNameSz > MAX_PUBLIC_NAME_SZ)
15314
                hostNameSz = MAX_PUBLIC_NAME_SZ;
15315
        #endif
15316
15317
            XMEMCPY(tmpServerName, hostName, hostNameSz);
15318
        }
15319
15320
        /* remove the inner server name */
15321
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15322
15323
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
15324
            ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
15325
            XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
15326
            ssl->heap);
15327
15328
        /* set the public name as the server name */
15329
        if (ret == WOLFSSL_SUCCESS)
15330
            ret = 0;
15331
    }
15332
15333
    if (echX != NULL) {
15334
        /* turn ech on so it doesn't write, then write it last */
15335
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
15336
    }
15337
15338
    if (ret == 0 && ssl->extensions) {
15339
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
15340
            msgType, pOffset);
15341
    }
15342
15343
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
15344
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
15345
            msgType, pOffset);
15346
    }
15347
15348
    /* only write if have a shot at acceptance */
15349
    if (echX != NULL &&
15350
        (ssl->options.echAccepted ||
15351
        ((WOLFSSL_ECH*)echX->data)->innerCount == 0)) {
15352
        if (echX != NULL) {
15353
            /* turn off and write it last */
15354
            TURN_OFF(semaphore, TLSX_ToSemaphore(echX->type));
15355
        }
15356
15357
        if (ret == 0 && ssl->extensions) {
15358
            ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
15359
                msgType, pOffset);
15360
        }
15361
15362
        if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
15363
            ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
15364
                msgType, pOffset);
15365
        }
15366
15367
        if (serverNameX != NULL) {
15368
            /* remove the public name SNI */
15369
            TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
15370
15371
            ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME, tmpServerName,
15372
                XSTRLEN(tmpServerName), ssl->heap);
15373
15374
            /* restore the inner server name */
15375
            if (ret == WOLFSSL_SUCCESS)
15376
                ret = 0;
15377
        }
15378
    }
15379
15380
#ifdef WOLFSSL_SMALL_STACK
15381
    XFREE(tmpServerName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
15382
#endif
15383
15384
    return ret;
15385
}
15386
#endif
15387
15388
/** Writes the extensions to be sent into the client hello. */
15389
int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word32* pOffset)
15390
{
15391
    int ret = 0;
15392
    word16 offset = 0;
15393
    byte semaphore[SEMAPHORE_SIZE] = {0};
15394
15395
    if (!TLSX_SupportExtensions(ssl) || output == NULL)
15396
        return 0;
15397
15398
    offset += OPAQUE16_LEN; /* extensions length */
15399
15400
    if (msgType == client_hello) {
15401
        EC_VALIDATE_REQUEST(ssl, semaphore);
15402
        PF_VALIDATE_REQUEST(ssl, semaphore);
15403
        WOLF_STK_VALIDATE_REQUEST(ssl);
15404
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15405
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
15406
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15407
#endif
15408
#ifdef WOLFSSL_TLS13
15409
        if (!IsAtLeastTLSv1_2(ssl)) {
15410
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15411
        }
15412
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15413
        if (!IsAtLeastTLSv1_3(ssl->version)) {
15414
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15415
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15416
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
15417
        #endif
15418
        #ifdef WOLFSSL_EARLY_DATA
15419
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15420
        #endif
15421
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15422
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15423
        #endif
15424
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
15425
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
15426
        #endif
15427
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15428
            TURN_ON(semaphore,
15429
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15430
        #endif
15431
        #ifdef WOLFSSL_DUAL_ALG_CERTS
15432
            TURN_ON(semaphore,
15433
                    TLSX_ToSemaphore(TLSX_CKS));
15434
        #endif
15435
        }
15436
    #endif
15437
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15438
        /* Must write Pre-shared Key extension at the end in TLS v1.3.
15439
         * Must not write out Pre-shared Key extension in earlier versions of
15440
         * protocol.
15441
         */
15442
        TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15443
    #endif
15444
#endif /* WOLFSSL_TLS13 */
15445
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
15446
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
15447
         /* mark already sent, so it won't send it */
15448
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
15449
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15450
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15451
        }
15452
    #endif
15453
    }
15454
#ifdef WOLFSSL_TLS13
15455
    #ifndef NO_CERTS
15456
    else if (msgType == certificate_request) {
15457
        /* Don't send out any extension except those that are turned off. */
15458
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15459
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
15460
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
15461
#endif
15462
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
15463
        if (SSL_CA_NAMES(ssl) != NULL) {
15464
            TURN_OFF(semaphore,
15465
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
15466
        }
15467
#endif
15468
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, TLSX_OID_FILTERS
15469
         *       TLSX_STATUS_REQUEST
15470
         */
15471
    }
15472
    #endif
15473
#endif
15474
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
15475
    if (ssl->options.useEch == 1 && !ssl->options.disableECH
15476
            && msgType == client_hello) {
15477
        ret = TLSX_WriteWithEch(ssl, output, semaphore,
15478
                         msgType, &offset);
15479
        if (ret != 0)
15480
            return ret;
15481
    }
15482
    else
15483
#endif
15484
    {
15485
        if (ssl->extensions) {
15486
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15487
                             msgType, &offset);
15488
            if (ret != 0)
15489
                return ret;
15490
        }
15491
        if (ssl->ctx && ssl->ctx->extensions) {
15492
            ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
15493
                             msgType, &offset);
15494
            if (ret != 0)
15495
                return ret;
15496
        }
15497
    }
15498
15499
#ifdef HAVE_EXTENDED_MASTER
15500
    if (msgType == client_hello && ssl->options.haveEMS &&
15501
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
15502
        WOLFSSL_MSG("EMS extension to write");
15503
        c16toa(HELLO_EXT_EXTMS, output + offset);
15504
        offset += HELLO_EXT_TYPE_SZ;
15505
        c16toa(0, output + offset);
15506
        offset += HELLO_EXT_SZ_SZ;
15507
    }
15508
#endif
15509
15510
#ifdef WOLFSSL_TLS13
15511
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15512
    if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
15513
        /* Write out what we can of Pre-shared key extension.  */
15514
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15515
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15516
                         client_hello, &offset);
15517
        if (ret != 0)
15518
            return ret;
15519
    }
15520
    #endif
15521
#endif
15522
15523
    if (offset > OPAQUE16_LEN || msgType != client_hello)
15524
        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
15525
15526
     *pOffset += offset;
15527
15528
    return ret;
15529
}
15530
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
15531
15532
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
15533
15534
/** Tells the buffered size of extensions to be sent into the server hello. */
15535
int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
15536
{
15537
    int ret = 0;
15538
    word16 length = 0;
15539
    byte semaphore[SEMAPHORE_SIZE] = {0};
15540
15541
    switch (msgType) {
15542
#ifndef NO_WOLFSSL_SERVER
15543
        case server_hello:
15544
            PF_VALIDATE_RESPONSE(ssl, semaphore);
15545
        #ifdef WOLFSSL_TLS13
15546
                if (IsAtLeastTLSv1_3(ssl->version)) {
15547
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15548
                    TURN_OFF(semaphore,
15549
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15550
                #if defined(HAVE_SUPPORTED_CURVES)
15551
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15552
                    if (!ssl->options.noPskDheKe)
15553
                #endif
15554
                    {
15555
                        /* Expect KeyShare extension in ServerHello. */
15556
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15557
                    }
15558
                #endif
15559
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15560
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15561
                #endif
15562
                }
15563
            #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15564
                else {
15565
                #ifdef HAVE_SUPPORTED_CURVES
15566
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15567
                #endif
15568
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15569
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15570
                #endif
15571
                }
15572
            #endif
15573
            #ifdef WOLFSSL_DTLS_CID
15574
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15575
            #endif
15576
        #endif /* WOLFSSL_TLS13 */
15577
            break;
15578
15579
    #ifdef WOLFSSL_TLS13
15580
        case hello_retry_request:
15581
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15582
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15583
        #ifdef HAVE_SUPPORTED_CURVES
15584
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15585
            if (!ssl->options.noPskDheKe)
15586
        #endif
15587
            {
15588
                /* Expect KeyShare extension in HelloRetryRequest. */
15589
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15590
            }
15591
        #endif
15592
        #ifdef WOLFSSL_SEND_HRR_COOKIE
15593
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15594
        #endif
15595
#ifdef HAVE_ECH
15596
            /* send the special confirmation */
15597
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
15598
#endif
15599
            break;
15600
    #endif
15601
15602
    #ifdef WOLFSSL_TLS13
15603
        case encrypted_extensions:
15604
            /* Send out all extension except those that are turned on. */
15605
        #ifdef HAVE_ECC
15606
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
15607
        #endif
15608
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15609
        #ifdef HAVE_SESSION_TICKET
15610
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
15611
        #endif
15612
        #ifdef HAVE_SUPPORTED_CURVES
15613
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15614
        #endif
15615
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15616
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15617
        #endif
15618
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
15619
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15620
        #endif
15621
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
15622
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15623
        #endif
15624
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
15625
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
15626
        #endif
15627
        #ifdef WOLFSSL_DTLS_CID
15628
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15629
        #endif /* WOLFSSL_DTLS_CID */
15630
            break;
15631
15632
        #ifdef WOLFSSL_EARLY_DATA
15633
        case session_ticket:
15634
            if (ssl->options.tls1_3) {
15635
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15636
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15637
            }
15638
            break;
15639
        #endif
15640
    #endif
15641
#endif
15642
15643
#ifdef WOLFSSL_TLS13
15644
    #ifndef NO_CERTS
15645
        case certificate:
15646
            /* Don't send out any extension except those that are turned off. */
15647
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15648
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15649
            /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
15650
             *       TLSX_SERVER_CERTIFICATE_TYPE
15651
             */
15652
            break;
15653
    #endif
15654
#endif
15655
    }
15656
15657
#ifdef HAVE_EXTENDED_MASTER
15658
    if (ssl->options.haveEMS && msgType == server_hello &&
15659
                                              !IsAtLeastTLSv1_3(ssl->version)) {
15660
        length += HELLO_EXT_SZ;
15661
    }
15662
#endif
15663
15664
    if (TLSX_SupportExtensions(ssl)) {
15665
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
15666
        if (ret != 0)
15667
            return ret;
15668
    }
15669
15670
    /* All the response data is set at the ssl object only, so no ctx here. */
15671
15672
    if (length || msgType != server_hello)
15673
        length += OPAQUE16_LEN; /* for total length storage. */
15674
15675
    *pLength += length;
15676
15677
    return ret;
15678
}
15679
15680
/** Writes the server hello extensions into a buffer. */
15681
int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
15682
{
15683
    int ret = 0;
15684
    word16 offset = 0;
15685
15686
    if (TLSX_SupportExtensions(ssl) && output) {
15687
        byte semaphore[SEMAPHORE_SIZE] = {0};
15688
15689
        switch (msgType) {
15690
#ifndef NO_WOLFSSL_SERVER
15691
            case server_hello:
15692
                PF_VALIDATE_RESPONSE(ssl, semaphore);
15693
        #ifdef WOLFSSL_TLS13
15694
                if (IsAtLeastTLSv1_3(ssl->version)) {
15695
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15696
                    TURN_OFF(semaphore,
15697
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15698
            #ifdef HAVE_SUPPORTED_CURVES
15699
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15700
                    if (!ssl->options.noPskDheKe)
15701
                #endif
15702
                    {
15703
                        /* Write out KeyShare in ServerHello. */
15704
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15705
                    }
15706
            #endif
15707
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15708
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15709
            #endif
15710
                }
15711
                else
15712
        #endif /* WOLFSSL_TLS13 */
15713
                {
15714
        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
15715
            #ifdef HAVE_SUPPORTED_CURVES
15716
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15717
            #endif
15718
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15719
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15720
            #endif
15721
        #endif
15722
                    WC_DO_NOTHING; /* avoid empty brackets */
15723
                }
15724
        #ifdef WOLFSSL_DTLS_CID
15725
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15726
        #endif /* WOLFSSL_DTLS_CID */
15727
                break;
15728
15729
    #ifdef WOLFSSL_TLS13
15730
            case hello_retry_request:
15731
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15732
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15733
        #ifdef HAVE_SUPPORTED_CURVES
15734
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15735
                if (!ssl->options.noPskDheKe)
15736
            #endif
15737
                {
15738
                    /* Write out KeyShare in HelloRetryRequest. */
15739
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15740
                }
15741
        #endif
15742
#ifdef HAVE_ECH
15743
                /* send the special confirmation */
15744
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_ECH));
15745
#endif
15746
                /* Cookie is written below as last extension. */
15747
                break;
15748
    #endif
15749
15750
    #ifdef WOLFSSL_TLS13
15751
            case encrypted_extensions:
15752
                /* Send out all extension except those that are turned on. */
15753
        #ifdef HAVE_ECC
15754
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
15755
        #endif
15756
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
15757
        #ifdef HAVE_SESSION_TICKET
15758
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
15759
        #endif
15760
        #ifdef HAVE_SUPPORTED_CURVES
15761
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
15762
        #endif
15763
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
15764
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
15765
        #endif
15766
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
15767
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15768
        #endif
15769
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
15770
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
15771
        #endif
15772
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
15773
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
15774
        #endif
15775
        #ifdef WOLFSSL_DTLS_CID
15776
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
15777
        #endif /* WOLFSSL_DTLS_CID */
15778
                break;
15779
15780
        #ifdef WOLFSSL_EARLY_DATA
15781
            case session_ticket:
15782
                if (ssl->options.tls1_3) {
15783
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15784
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
15785
                }
15786
                break;
15787
        #endif
15788
    #endif
15789
#endif
15790
15791
    #ifdef WOLFSSL_TLS13
15792
        #ifndef NO_CERTS
15793
            case certificate:
15794
                /* Don't send out any extension except those that are turned
15795
                 * off. */
15796
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15797
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
15798
                /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
15799
                 *       TLSX_SERVER_CERTIFICATE_TYPE
15800
                 */
15801
                break;
15802
        #endif
15803
    #endif
15804
15805
            default:
15806
                break;
15807
        }
15808
15809
        offset += OPAQUE16_LEN; /* extensions length */
15810
15811
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15812
                         msgType, &offset);
15813
        if (ret != 0)
15814
            return ret;
15815
15816
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
15817
        if (msgType == hello_retry_request) {
15818
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
15819
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
15820
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
15821
                             msgType, &offset);
15822
            if (ret != 0)
15823
                return ret;
15824
        }
15825
#endif
15826
15827
#ifdef HAVE_EXTENDED_MASTER
15828
        if (ssl->options.haveEMS && msgType == server_hello &&
15829
                                              !IsAtLeastTLSv1_3(ssl->version)) {
15830
            WOLFSSL_MSG("EMS extension to write");
15831
            c16toa(HELLO_EXT_EXTMS, output + offset);
15832
            offset += HELLO_EXT_TYPE_SZ;
15833
            c16toa(0, output + offset);
15834
            offset += HELLO_EXT_SZ_SZ;
15835
        }
15836
#endif
15837
15838
        if (offset > OPAQUE16_LEN || msgType != server_hello)
15839
            c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
15840
    }
15841
15842
    if (pOffset)
15843
        *pOffset += offset;
15844
15845
    return ret;
15846
}
15847
15848
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
15849
15850
#ifdef WOLFSSL_TLS13
15851
int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
15852
                      byte msgType, int* found)
15853
3.51k
{
15854
3.51k
    int ret = 0;
15855
3.51k
    int offset = 0;
15856
15857
3.51k
    *found = 0;
15858
21.3k
    while (offset < (int)length) {
15859
21.1k
        word16 type;
15860
21.1k
        word16 size;
15861
15862
21.1k
        if (offset + (2 * OPAQUE16_LEN) > length) {
15863
26
            ret = BUFFER_ERROR;
15864
26
            break;
15865
26
        }
15866
15867
21.1k
        ato16(input + offset, &type);
15868
21.1k
        offset += HELLO_EXT_TYPE_SZ;
15869
15870
21.1k
        ato16(input + offset, &size);
15871
21.1k
        offset += OPAQUE16_LEN;
15872
15873
21.1k
        if (offset + size > length) {
15874
337
            ret = BUFFER_ERROR;
15875
337
            break;
15876
337
        }
15877
15878
20.7k
        if (type == TLSX_SUPPORTED_VERSIONS) {
15879
3.00k
            *found = 1;
15880
15881
3.00k
            WOLFSSL_MSG("Supported Versions extension received");
15882
15883
3.00k
            ret = SV_PARSE(ssl, input + offset, size, msgType, &ssl->version,
15884
3.00k
                           &ssl->options, &ssl->extensions);
15885
3.00k
            break;
15886
3.00k
        }
15887
15888
17.7k
        offset += size;
15889
17.7k
    }
15890
15891
3.51k
    return ret;
15892
3.51k
}
15893
#endif
15894
/* Jump Table to check minimum size values for client case in TLSX_Parse */
15895
#ifndef NO_WOLFSSL_SERVER
15896
static word16 TLSX_GetMinSize_Client(word16* type)
15897
78.6k
{
15898
78.6k
    switch (*type) {
15899
950
        case TLSXT_SERVER_NAME:
15900
950
            return WOLFSSL_SNI_MIN_SIZE_CLIENT;
15901
3.69k
        case TLSXT_EARLY_DATA:
15902
3.69k
            return WOLFSSL_EDI_MIN_SIZE_CLIENT;
15903
228
        case TLSXT_MAX_FRAGMENT_LENGTH:
15904
228
            return WOLFSSL_MFL_MIN_SIZE_CLIENT;
15905
70
        case TLSXT_TRUSTED_CA_KEYS:
15906
70
            return WOLFSSL_TCA_MIN_SIZE_CLIENT;
15907
321
        case TLSXT_TRUNCATED_HMAC:
15908
321
            return WOLFSSL_THM_MIN_SIZE_CLIENT;
15909
689
        case TLSXT_STATUS_REQUEST:
15910
689
            return WOLFSSL_CSR_MIN_SIZE_CLIENT;
15911
8.88k
        case TLSXT_SUPPORTED_GROUPS:
15912
8.88k
            return WOLFSSL_EC_MIN_SIZE_CLIENT;
15913
1.99k
        case TLSXT_EC_POINT_FORMATS:
15914
1.99k
            return WOLFSSL_PF_MIN_SIZE_CLIENT;
15915
6.14k
        case TLSXT_SIGNATURE_ALGORITHMS:
15916
6.14k
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
15917
150
        case TLSXT_USE_SRTP:
15918
150
            return WOLFSSL_SRTP_MIN_SIZE_CLIENT;
15919
243
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
15920
243
            return WOLFSSL_ALPN_MIN_SIZE_CLIENT;
15921
210
        case TLSXT_STATUS_REQUEST_V2:
15922
210
            return WOLFSSL_CSR2_MIN_SIZE_CLIENT;
15923
156
        case TLSXT_CLIENT_CERTIFICATE:
15924
156
            return WOLFSSL_CCT_MIN_SIZE_CLIENT;
15925
120
        case TLSXT_SERVER_CERTIFICATE:
15926
120
            return WOLFSSL_SCT_MIN_SIZE_CLIENT;
15927
3.42k
        case TLSXT_ENCRYPT_THEN_MAC:
15928
3.42k
            return WOLFSSL_ETM_MIN_SIZE_CLIENT;
15929
1.52k
        case TLSXT_SESSION_TICKET:
15930
1.52k
            return WOLFSSL_STK_MIN_SIZE_CLIENT;
15931
1.60k
        case TLSXT_PRE_SHARED_KEY:
15932
1.60k
            return WOLFSSL_PSK_MIN_SIZE_CLIENT;
15933
88
        case TLSXT_COOKIE:
15934
88
            return WOLFSSL_CKE_MIN_SIZE_CLIENT;
15935
1.45k
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
15936
1.45k
            return WOLFSSL_PKM_MIN_SIZE_CLIENT;
15937
139
        case TLSXT_CERTIFICATE_AUTHORITIES:
15938
139
            return WOLFSSL_CAN_MIN_SIZE_CLIENT;
15939
183
        case TLSXT_POST_HANDSHAKE_AUTH:
15940
183
            return WOLFSSL_PHA_MIN_SIZE_CLIENT;
15941
193
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
15942
193
            return WOLFSSL_SA_MIN_SIZE_CLIENT;
15943
4.98k
        case TLSXT_KEY_SHARE:
15944
4.98k
            return WOLFSSL_KS_MIN_SIZE_CLIENT;
15945
96
        case TLSXT_CONNECTION_ID:
15946
96
            return WOLFSSL_CID_MIN_SIZE_CLIENT;
15947
503
        case TLSXT_RENEGOTIATION_INFO:
15948
503
            return WOLFSSL_SCR_MIN_SIZE_CLIENT;
15949
12
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
15950
12
            return WOLFSSL_QTP_MIN_SIZE_CLIENT;
15951
30
        case TLSXT_ECH:
15952
30
            return WOLFSSL_ECH_MIN_SIZE_CLIENT;
15953
40.5k
        default:
15954
40.5k
            return 0;
15955
78.6k
    }
15956
78.6k
}
15957
    #define TLSX_GET_MIN_SIZE_CLIENT(type) TLSX_GetMinSize_Client(type)
15958
#else
15959
    #define TLSX_GET_MIN_SIZE_CLIENT(type) 0
15960
#endif
15961
15962
15963
#ifndef NO_WOLFSSL_CLIENT
15964
/* Jump Table to check minimum size values for server case in TLSX_Parse */
15965
static word16 TLSX_GetMinSize_Server(const word16 *type)
15966
5.51k
{
15967
5.51k
    switch (*type) {
15968
32
        case TLSXT_SERVER_NAME:
15969
32
            return WOLFSSL_SNI_MIN_SIZE_SERVER;
15970
6
        case TLSXT_EARLY_DATA:
15971
6
            return WOLFSSL_EDI_MIN_SIZE_SERVER;
15972
7
        case TLSXT_MAX_FRAGMENT_LENGTH:
15973
7
            return WOLFSSL_MFL_MIN_SIZE_SERVER;
15974
3
        case TLSXT_TRUSTED_CA_KEYS:
15975
3
            return WOLFSSL_TCA_MIN_SIZE_SERVER;
15976
6
        case TLSXT_TRUNCATED_HMAC:
15977
6
            return WOLFSSL_THM_MIN_SIZE_SERVER;
15978
2.67k
        case TLSXT_STATUS_REQUEST:
15979
2.67k
            return WOLFSSL_CSR_MIN_SIZE_SERVER;
15980
5
        case TLSXT_SUPPORTED_GROUPS:
15981
5
            return WOLFSSL_EC_MIN_SIZE_SERVER;
15982
12
        case TLSXT_EC_POINT_FORMATS:
15983
12
            return WOLFSSL_PF_MIN_SIZE_SERVER;
15984
6
        case TLSXT_SIGNATURE_ALGORITHMS:
15985
6
            return WOLFSSL_SA_MIN_SIZE_SERVER;
15986
8
        case TLSXT_USE_SRTP:
15987
8
            return WOLFSSL_SRTP_MIN_SIZE_SERVER;
15988
66
        case TLSXT_APPLICATION_LAYER_PROTOCOL:
15989
66
            return WOLFSSL_ALPN_MIN_SIZE_SERVER;
15990
3
        case TLSXT_STATUS_REQUEST_V2:
15991
3
            return WOLFSSL_CSR2_MIN_SIZE_SERVER;
15992
5
        case TLSXT_CLIENT_CERTIFICATE:
15993
5
            return WOLFSSL_CCT_MIN_SIZE_SERVER;
15994
4
        case TLSXT_SERVER_CERTIFICATE:
15995
4
            return WOLFSSL_SCT_MIN_SIZE_SERVER;
15996
12
        case TLSXT_ENCRYPT_THEN_MAC:
15997
12
            return WOLFSSL_ETM_MIN_SIZE_SERVER;
15998
109
        case TLSXT_SESSION_TICKET:
15999
109
            return WOLFSSL_STK_MIN_SIZE_SERVER;
16000
22
        case TLSXT_PRE_SHARED_KEY:
16001
22
            return WOLFSSL_PSK_MIN_SIZE_SERVER;
16002
28
        case TLSXT_COOKIE:
16003
28
            return WOLFSSL_CKE_MIN_SIZE_SERVER;
16004
8
        case TLSXT_PSK_KEY_EXCHANGE_MODES:
16005
8
            return WOLFSSL_PKM_MIN_SIZE_SERVER;
16006
6
        case TLSXT_CERTIFICATE_AUTHORITIES:
16007
6
            return WOLFSSL_CAN_MIN_SIZE_SERVER;
16008
7
        case TLSXT_POST_HANDSHAKE_AUTH:
16009
7
            return WOLFSSL_PHA_MIN_SIZE_SERVER;
16010
4
        case TLSXT_SIGNATURE_ALGORITHMS_CERT:
16011
4
            return WOLFSSL_SA_MIN_SIZE_SERVER;
16012
300
        case TLSXT_KEY_SHARE:
16013
300
            return WOLFSSL_KS_MIN_SIZE_SERVER;
16014
4
        case TLSXT_CONNECTION_ID:
16015
4
            return WOLFSSL_CID_MIN_SIZE_SERVER;
16016
8
        case TLSXT_RENEGOTIATION_INFO:
16017
8
            return WOLFSSL_SCR_MIN_SIZE_SERVER;
16018
2
        case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT:
16019
2
            return WOLFSSL_QTP_MIN_SIZE_SERVER;
16020
0
        case TLSXT_ECH:
16021
0
            return WOLFSSL_ECH_MIN_SIZE_SERVER;
16022
2.16k
        default:
16023
2.16k
            return 0;
16024
5.51k
    }
16025
5.51k
}
16026
    #define TLSX_GET_MIN_SIZE_SERVER(type) TLSX_GetMinSize_Server(type)
16027
#else
16028
    #define TLSX_GET_MIN_SIZE_SERVER(type) 0
16029
#endif
16030
16031
16032
/** Parses a buffer of TLS extensions. */
16033
int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType,
16034
                                                                 Suites *suites)
16035
{
16036
    int ret = 0;
16037
    word16 offset = 0;
16038
    byte isRequest = (msgType == client_hello ||
16039
                      msgType == certificate_request);
16040
16041
#ifdef HAVE_EXTENDED_MASTER
16042
    byte pendingEMS = 0;
16043
#endif
16044
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
16045
    int pskDone = 0;
16046
#endif
16047
    byte seenType[SEMAPHORE_SIZE];  /* Seen known extensions. */
16048
16049
    if (!ssl || !input || (isRequest && !suites))
16050
        return BAD_FUNC_ARG;
16051
16052
    /* No known extensions seen yet. */
16053
    XMEMSET(seenType, 0, sizeof(seenType));
16054
16055
    while (ret == 0 && offset < length) {
16056
        word16 type;
16057
        word16 size;
16058
16059
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
16060
        if (msgType == client_hello && pskDone) {
16061
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
16062
            return PSK_KEY_ERROR;
16063
        }
16064
#endif
16065
16066
        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
16067
            return BUFFER_ERROR;
16068
16069
        ato16(input + offset, &type);
16070
        offset += HELLO_EXT_TYPE_SZ;
16071
16072
        ato16(input + offset, &size);
16073
        offset += OPAQUE16_LEN;
16074
16075
        /* Check we have a bit for extension type. */
16076
        if ((type <= 62) || (type == TLSX_RENEGOTIATION_INFO)
16077
        #ifdef WOLFSSL_QUIC
16078
            || (type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT)
16079
        #endif
16080
            )
16081
        {
16082
            /* Detect duplicate recognized extensions. */
16083
            if (IS_OFF(seenType, TLSX_ToSemaphore(type))) {
16084
                TURN_ON(seenType, TLSX_ToSemaphore(type));
16085
            }
16086
            else {
16087
                return DUPLICATE_TLS_EXT_E;
16088
            }
16089
        }
16090
16091
        if (length - offset < size)
16092
            return BUFFER_ERROR;
16093
16094
        /* Check minimum size required for TLSX, even if disabled */
16095
        switch (msgType) {
16096
            #ifndef NO_WOLFSSL_SERVER
16097
            case client_hello:
16098
                if (size < TLSX_GET_MIN_SIZE_CLIENT(&type)){
16099
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
16100
                    return BUFFER_ERROR;
16101
                }
16102
            break;
16103
            #endif
16104
            #ifndef NO_WOLFSSL_CLIENT
16105
            case server_hello:
16106
            case hello_retry_request:
16107
                if (size < TLSX_GET_MIN_SIZE_SERVER(&type)){
16108
                    WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied");
16109
                    return BUFFER_ERROR;
16110
                }
16111
            break;
16112
            #endif
16113
            default:
16114
            break;
16115
        }
16116
16117
        switch (type) {
16118
#ifdef HAVE_SNI
16119
            case TLSX_SERVER_NAME:
16120
                WOLFSSL_MSG("SNI extension received");
16121
            #ifdef WOLFSSL_DEBUG_TLS
16122
                WOLFSSL_BUFFER(input + offset, size);
16123
            #endif
16124
16125
#ifdef WOLFSSL_TLS13
16126
                if (IsAtLeastTLSv1_3(ssl->version)) {
16127
                    if (msgType != client_hello &&
16128
                        msgType != encrypted_extensions)
16129
                        return EXT_NOT_ALLOWED;
16130
                }
16131
                else
16132
#endif
16133
                {
16134
                    if (msgType != client_hello &&
16135
                        msgType != server_hello)
16136
                        return EXT_NOT_ALLOWED;
16137
                }
16138
                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
16139
                break;
16140
#endif
16141
16142
            case TLSX_TRUSTED_CA_KEYS:
16143
                WOLFSSL_MSG("Trusted CA extension received");
16144
            #ifdef WOLFSSL_DEBUG_TLS
16145
                WOLFSSL_BUFFER(input + offset, size);
16146
            #endif
16147
16148
#ifdef WOLFSSL_TLS13
16149
                /* RFC 8446 4.2.4 states trusted_ca_keys is not used
16150
                   in TLS 1.3. */
16151
                if (IsAtLeastTLSv1_3(ssl->version)) {
16152
                    break;
16153
                }
16154
                else
16155
#endif
16156
                {
16157
                    if (msgType != client_hello &&
16158
                        msgType != server_hello)
16159
                        return EXT_NOT_ALLOWED;
16160
                }
16161
                ret = TCA_PARSE(ssl, input + offset, size, isRequest);
16162
                break;
16163
16164
            case TLSX_MAX_FRAGMENT_LENGTH:
16165
                WOLFSSL_MSG("Max Fragment Length extension received");
16166
            #ifdef WOLFSSL_DEBUG_TLS
16167
                WOLFSSL_BUFFER(input + offset, size);
16168
            #endif
16169
16170
#ifdef WOLFSSL_TLS13
16171
                if (IsAtLeastTLSv1_3(ssl->version)) {
16172
                    if (msgType != client_hello &&
16173
                        msgType != encrypted_extensions) {
16174
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16175
                        return EXT_NOT_ALLOWED;
16176
                    }
16177
                }
16178
                else
16179
#endif
16180
                {
16181
                    if (msgType != client_hello &&
16182
                        msgType != server_hello) {
16183
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16184
                        return EXT_NOT_ALLOWED;
16185
                    }
16186
                }
16187
                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
16188
                break;
16189
16190
            case TLSX_TRUNCATED_HMAC:
16191
                WOLFSSL_MSG("Truncated HMAC extension received");
16192
            #ifdef WOLFSSL_DEBUG_TLS
16193
                WOLFSSL_BUFFER(input + offset, size);
16194
            #endif
16195
16196
#ifdef WOLFSSL_TLS13
16197
                if (IsAtLeastTLSv1_3(ssl->version))
16198
                    break;
16199
#endif
16200
                if (msgType != client_hello)
16201
                    return EXT_NOT_ALLOWED;
16202
                ret = THM_PARSE(ssl, input + offset, size, isRequest);
16203
                break;
16204
16205
            case TLSX_SUPPORTED_GROUPS:
16206
                WOLFSSL_MSG("Supported Groups extension received");
16207
            #ifdef WOLFSSL_DEBUG_TLS
16208
                WOLFSSL_BUFFER(input + offset, size);
16209
            #endif
16210
16211
#ifdef WOLFSSL_TLS13
16212
                if (IsAtLeastTLSv1_3(ssl->version)) {
16213
                    if (msgType != client_hello &&
16214
                        msgType != encrypted_extensions) {
16215
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16216
                        return EXT_NOT_ALLOWED;
16217
                    }
16218
                }
16219
                else
16220
#endif
16221
                {
16222
                    if (msgType != client_hello) {
16223
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16224
                        return EXT_NOT_ALLOWED;
16225
                    }
16226
                }
16227
                ret = EC_PARSE(ssl, input + offset, size, isRequest,
16228
                        &ssl->extensions);
16229
                break;
16230
#ifdef WOLFSSL_DUAL_ALG_CERTS
16231
            case TLSX_CKS:
16232
                WOLFSSL_MSG("CKS extension received");
16233
                if (msgType != client_hello &&
16234
                     msgType != encrypted_extensions) {
16235
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16236
                        return EXT_NOT_ALLOWED;
16237
                }
16238
                ret = TLSX_CKS_Parse(ssl, (byte *)(input + offset), size,
16239
                                     &ssl->extensions);
16240
            break;
16241
#endif /* WOLFSSL_DUAL_ALG_CERTS */
16242
            case TLSX_EC_POINT_FORMATS:
16243
                WOLFSSL_MSG("Point Formats extension received");
16244
            #ifdef WOLFSSL_DEBUG_TLS
16245
                WOLFSSL_BUFFER(input + offset, size);
16246
            #endif
16247
16248
#ifdef WOLFSSL_TLS13
16249
                if (IsAtLeastTLSv1_3(ssl->version))
16250
                    break;
16251
#endif
16252
                if (msgType != client_hello &&
16253
                    msgType != server_hello) {
16254
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16255
                    return EXT_NOT_ALLOWED;
16256
                }
16257
16258
                ret = PF_PARSE(ssl, input + offset, size, isRequest);
16259
                break;
16260
16261
            case TLSX_STATUS_REQUEST:
16262
                WOLFSSL_MSG("Certificate Status Request extension received");
16263
            #ifdef WOLFSSL_DEBUG_TLS
16264
                WOLFSSL_BUFFER(input + offset, size);
16265
            #endif
16266
16267
#ifdef WOLFSSL_TLS13
16268
                if (IsAtLeastTLSv1_3(ssl->version)) {
16269
                    if (msgType != client_hello &&
16270
                        msgType != certificate_request &&
16271
                        msgType != certificate)
16272
                        return EXT_NOT_ALLOWED;
16273
                }
16274
                else
16275
 #endif
16276
                {
16277
                    if (msgType != client_hello &&
16278
                        msgType != server_hello)
16279
                        return EXT_NOT_ALLOWED;
16280
                }
16281
                ret = CSR_PARSE(ssl, input + offset, size, isRequest);
16282
                break;
16283
16284
            case TLSX_STATUS_REQUEST_V2:
16285
                WOLFSSL_MSG("Certificate Status Request v2 extension received");
16286
            #ifdef WOLFSSL_DEBUG_TLS
16287
                WOLFSSL_BUFFER(input + offset, size);
16288
            #endif
16289
16290
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
16291
                if (IsAtLeastTLSv1_3(ssl->version)) {
16292
                    if (msgType != client_hello &&
16293
                        msgType != certificate_request &&
16294
                        msgType != certificate)
16295
                        return EXT_NOT_ALLOWED;
16296
                }
16297
                else
16298
#endif
16299
                {
16300
                    if (msgType != client_hello &&
16301
                        msgType != server_hello)
16302
                        return EXT_NOT_ALLOWED;
16303
                }
16304
                ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
16305
                break;
16306
16307
#ifdef HAVE_EXTENDED_MASTER
16308
            case HELLO_EXT_EXTMS:
16309
                WOLFSSL_MSG("Extended Master Secret extension received");
16310
            #ifdef WOLFSSL_DEBUG_TLS
16311
                WOLFSSL_BUFFER(input + offset, size);
16312
            #endif
16313
16314
#if defined(WOLFSSL_TLS13)
16315
                if (IsAtLeastTLSv1_3(ssl->version))
16316
                    break;
16317
#endif
16318
                if (msgType != client_hello &&
16319
                    msgType != server_hello)
16320
                    return EXT_NOT_ALLOWED;
16321
                if (size != 0)
16322
                    return BUFFER_ERROR;
16323
16324
#ifndef NO_WOLFSSL_SERVER
16325
                if (isRequest)
16326
                    ssl->options.haveEMS = 1;
16327
#endif
16328
                pendingEMS = 1;
16329
                break;
16330
#endif
16331
16332
            case TLSX_RENEGOTIATION_INFO:
16333
                WOLFSSL_MSG("Secure Renegotiation extension received");
16334
            #ifdef WOLFSSL_DEBUG_TLS
16335
                WOLFSSL_BUFFER(input + offset, size);
16336
            #endif
16337
16338
#ifdef WOLFSSL_TLS13
16339
                if (IsAtLeastTLSv1_3(ssl->version))
16340
                    break;
16341
#endif
16342
                if (msgType != client_hello &&
16343
                    msgType != server_hello)
16344
                    return EXT_NOT_ALLOWED;
16345
                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
16346
                break;
16347
16348
            case TLSX_SESSION_TICKET:
16349
                WOLFSSL_MSG("Session Ticket extension received");
16350
            #ifdef WOLFSSL_DEBUG_TLS
16351
                WOLFSSL_BUFFER(input + offset, size);
16352
            #endif
16353
16354
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
16355
                if (IsAtLeastTLSv1_3(ssl->version)) {
16356
                    if (msgType != client_hello)
16357
                        return EXT_NOT_ALLOWED;
16358
                }
16359
                else
16360
#endif
16361
                {
16362
                    if (msgType != client_hello &&
16363
                        msgType != server_hello)
16364
                        return EXT_NOT_ALLOWED;
16365
                }
16366
                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
16367
                break;
16368
16369
            case TLSX_APPLICATION_LAYER_PROTOCOL:
16370
                WOLFSSL_MSG("ALPN extension received");
16371
16372
            #ifdef WOLFSSL_DEBUG_TLS
16373
                WOLFSSL_BUFFER(input + offset, size);
16374
            #endif
16375
16376
#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
16377
                if (IsAtLeastTLSv1_3(ssl->version)) {
16378
                    if (msgType != client_hello &&
16379
                        msgType != encrypted_extensions)
16380
                        return EXT_NOT_ALLOWED;
16381
                }
16382
                else
16383
#endif
16384
                {
16385
                    if (msgType != client_hello &&
16386
                        msgType != server_hello)
16387
                        return EXT_NOT_ALLOWED;
16388
                }
16389
                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
16390
                break;
16391
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16392
            case TLSX_SIGNATURE_ALGORITHMS:
16393
                WOLFSSL_MSG("Signature Algorithms extension received");
16394
            #ifdef WOLFSSL_DEBUG_TLS
16395
                WOLFSSL_BUFFER(input + offset, size);
16396
            #endif
16397
16398
                if (!IsAtLeastTLSv1_2(ssl))
16399
                    break;
16400
            #ifdef WOLFSSL_TLS13
16401
                if (IsAtLeastTLSv1_3(ssl->version)) {
16402
                    if (msgType != client_hello &&
16403
                        msgType != certificate_request)
16404
                        return EXT_NOT_ALLOWED;
16405
                }
16406
                else
16407
            #endif
16408
                {
16409
                    if (msgType != client_hello)
16410
                        return EXT_NOT_ALLOWED;
16411
                }
16412
                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
16413
                break;
16414
#endif
16415
16416
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
16417
            case TLSX_ENCRYPT_THEN_MAC:
16418
                WOLFSSL_MSG("Encrypt-Then-Mac extension received");
16419
16420
                /* Ignore for TLS 1.3+ */
16421
                if (IsAtLeastTLSv1_3(ssl->version))
16422
                    break;
16423
                if (msgType != client_hello &&
16424
                    msgType != server_hello)
16425
                    return EXT_NOT_ALLOWED;
16426
16427
                ret = ETM_PARSE(ssl, input + offset, size, msgType);
16428
                break;
16429
#endif /* HAVE_ENCRYPT_THEN_MAC */
16430
16431
#ifdef WOLFSSL_TLS13
16432
            case TLSX_SUPPORTED_VERSIONS:
16433
                WOLFSSL_MSG("Skipping Supported Versions - already processed");
16434
            #ifdef WOLFSSL_DEBUG_TLS
16435
                WOLFSSL_BUFFER(input + offset, size);
16436
            #endif
16437
                if (msgType != client_hello &&
16438
                    msgType != server_hello &&
16439
                    msgType != hello_retry_request)
16440
                    return EXT_NOT_ALLOWED;
16441
16442
                break;
16443
16444
    #ifdef WOLFSSL_SEND_HRR_COOKIE
16445
            case TLSX_COOKIE:
16446
                WOLFSSL_MSG("Cookie extension received");
16447
            #ifdef WOLFSSL_DEBUG_TLS
16448
                WOLFSSL_BUFFER(input + offset, size);
16449
            #endif
16450
16451
                if (!IsAtLeastTLSv1_3(ssl->version))
16452
                    break;
16453
16454
                if (msgType != client_hello &&
16455
                    msgType != hello_retry_request) {
16456
                    return EXT_NOT_ALLOWED;
16457
                }
16458
16459
                ret = CKE_PARSE(ssl, input + offset, size, msgType);
16460
                break;
16461
    #endif
16462
16463
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
16464
            case TLSX_PRE_SHARED_KEY:
16465
                WOLFSSL_MSG("Pre-Shared Key extension received");
16466
            #ifdef WOLFSSL_DEBUG_TLS
16467
                WOLFSSL_BUFFER(input + offset, size);
16468
            #endif
16469
16470
                if (!IsAtLeastTLSv1_3(ssl->version))
16471
                    break;
16472
16473
                if (msgType != client_hello &&
16474
                    msgType != server_hello) {
16475
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16476
                    return EXT_NOT_ALLOWED;
16477
                }
16478
16479
                ret = PSK_PARSE(ssl, input + offset, size, msgType);
16480
                pskDone = 1;
16481
                break;
16482
16483
            case TLSX_PSK_KEY_EXCHANGE_MODES:
16484
                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
16485
            #ifdef WOLFSSL_DEBUG_TLS
16486
                WOLFSSL_BUFFER(input + offset, size);
16487
            #endif
16488
16489
                if (!IsAtLeastTLSv1_3(ssl->version))
16490
                    break;
16491
16492
                if (msgType != client_hello) {
16493
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16494
                    return EXT_NOT_ALLOWED;
16495
                }
16496
16497
                ret = PKM_PARSE(ssl, input + offset, size, msgType);
16498
                break;
16499
    #endif
16500
16501
    #ifdef WOLFSSL_EARLY_DATA
16502
            case TLSX_EARLY_DATA:
16503
                WOLFSSL_MSG("Early Data extension received");
16504
            #ifdef WOLFSSL_DEBUG_TLS
16505
                WOLFSSL_BUFFER(input + offset, size);
16506
            #endif
16507
16508
                if (!IsAtLeastTLSv1_3(ssl->version))
16509
                    break;
16510
16511
                if (msgType != client_hello && msgType != session_ticket &&
16512
                    msgType != encrypted_extensions) {
16513
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16514
                    return EXT_NOT_ALLOWED;
16515
                }
16516
                ret = EDI_PARSE(ssl, input + offset, size, msgType);
16517
                break;
16518
    #endif
16519
16520
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
16521
            case TLSX_POST_HANDSHAKE_AUTH:
16522
                WOLFSSL_MSG("Post Handshake Authentication extension received");
16523
            #ifdef WOLFSSL_DEBUG_TLS
16524
                WOLFSSL_BUFFER(input + offset, size);
16525
            #endif
16526
16527
                if (!IsAtLeastTLSv1_3(ssl->version))
16528
                    break;
16529
16530
                if (msgType != client_hello) {
16531
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16532
                    return EXT_NOT_ALLOWED;
16533
                }
16534
16535
                ret = PHA_PARSE(ssl, input + offset, size, msgType);
16536
                break;
16537
    #endif
16538
16539
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
16540
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
16541
                WOLFSSL_MSG("Signature Algorithms extension received");
16542
            #ifdef WOLFSSL_DEBUG_TLS
16543
                WOLFSSL_BUFFER(input + offset, size);
16544
            #endif
16545
16546
                if (!IsAtLeastTLSv1_3(ssl->version))
16547
                    break;
16548
16549
                if (msgType != client_hello &&
16550
                        msgType != certificate_request) {
16551
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16552
                    return EXT_NOT_ALLOWED;
16553
                }
16554
16555
                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
16556
                break;
16557
    #endif
16558
16559
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
16560
            case TLSX_CERTIFICATE_AUTHORITIES:
16561
                WOLFSSL_MSG("Certificate Authorities extension received");
16562
            #ifdef WOLFSSL_DEBUG_TLS
16563
                WOLFSSL_BUFFER(input + offset, size);
16564
            #endif
16565
16566
                if (!IsAtLeastTLSv1_3(ssl->version))
16567
                    break;
16568
16569
                if (msgType != client_hello &&
16570
                        msgType != certificate_request) {
16571
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16572
                    return EXT_NOT_ALLOWED;
16573
                }
16574
16575
                ret = CAN_PARSE(ssl, input + offset, size, isRequest);
16576
                break;
16577
    #endif
16578
16579
            case TLSX_KEY_SHARE:
16580
                WOLFSSL_MSG("Key Share extension received");
16581
            #ifdef WOLFSSL_DEBUG_TLS
16582
                WOLFSSL_BUFFER(input + offset, size);
16583
            #endif
16584
16585
    #ifdef HAVE_SUPPORTED_CURVES
16586
                if (!IsAtLeastTLSv1_3(ssl->version))
16587
                    break;
16588
16589
                if (msgType != client_hello && msgType != server_hello &&
16590
                        msgType != hello_retry_request) {
16591
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
16592
                    return EXT_NOT_ALLOWED;
16593
                }
16594
    #endif
16595
16596
                ret = KS_PARSE(ssl, input + offset, size, msgType);
16597
                break;
16598
#endif
16599
#ifdef WOLFSSL_SRTP
16600
            case TLSX_USE_SRTP:
16601
                WOLFSSL_MSG("Use SRTP extension received");
16602
                ret = SRTP_PARSE(ssl, input + offset, size, isRequest);
16603
                break;
16604
#endif
16605
#ifdef WOLFSSL_QUIC
16606
            case TLSX_KEY_QUIC_TP_PARAMS:
16607
                FALL_THROUGH;
16608
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
16609
                WOLFSSL_MSG("QUIC transport parameter received");
16610
            #ifdef WOLFSSL_DEBUG_TLS
16611
                WOLFSSL_BUFFER(input + offset, size);
16612
            #endif
16613
16614
                if (IsAtLeastTLSv1_3(ssl->version) &&
16615
                        msgType != client_hello &&
16616
                        msgType != server_hello &&
16617
                        msgType != encrypted_extensions) {
16618
                    return EXT_NOT_ALLOWED;
16619
                }
16620
                else if (!IsAtLeastTLSv1_3(ssl->version) &&
16621
                         msgType == encrypted_extensions) {
16622
                    return EXT_NOT_ALLOWED;
16623
                }
16624
                else if (WOLFSSL_IS_QUIC(ssl)) {
16625
                    ret = QTP_PARSE(ssl, input + offset, size, type, msgType);
16626
                }
16627
                else {
16628
                    WOLFSSL_MSG("QUIC transport param TLS extension type, but no QUIC");
16629
                    return EXT_NOT_ALLOWED; /* be safe, this should not happen */
16630
                }
16631
                break;
16632
#endif /* WOLFSSL_QUIC */
16633
#if defined(WOLFSSL_DTLS_CID)
16634
            case TLSX_CONNECTION_ID:
16635
                if (msgType != client_hello && msgType != server_hello)
16636
                    return EXT_NOT_ALLOWED;
16637
16638
                WOLFSSL_MSG("ConnectionID extension received");
16639
                ret = CID_PARSE(ssl, input + offset, size, isRequest);
16640
                break;
16641
16642
#endif /* defined(WOLFSSL_DTLS_CID) */
16643
#if defined(HAVE_RPK)
16644
            case TLSX_CLIENT_CERTIFICATE_TYPE:
16645
                WOLFSSL_MSG("Client Certificate Type extension received");
16646
                ret = CCT_PARSE(ssl, input + offset, size, msgType);
16647
                break;
16648
16649
            case TLSX_SERVER_CERTIFICATE_TYPE:
16650
                WOLFSSL_MSG("Server Certificate Type extension received");
16651
                ret = SCT_PARSE(ssl, input + offset, size, msgType);
16652
                break;
16653
#endif /* HAVE_RPK */
16654
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
16655
            case TLSX_ECH:
16656
                WOLFSSL_MSG("ECH extension received");
16657
                ret = ECH_PARSE(ssl, input + offset, size, msgType);
16658
                break;
16659
#endif
16660
            default:
16661
                WOLFSSL_MSG("Unknown TLS extension type");
16662
        }
16663
16664
        /* offset should be updated here! */
16665
        offset += size;
16666
    }
16667
16668
#ifdef HAVE_EXTENDED_MASTER
16669
    if (IsAtLeastTLSv1_3(ssl->version) &&
16670
        (msgType == hello_retry_request || msgType == hello_verify_request)) {
16671
        /* Don't change EMS status until server_hello received.
16672
         * Second ClientHello must have same extensions.
16673
         */
16674
    }
16675
    else if (!isRequest && ssl->options.haveEMS && !pendingEMS)
16676
        ssl->options.haveEMS = 0;
16677
#endif
16678
#if defined(WOLFSSL_TLS13) && !defined(NO_PSK)
16679
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == server_hello &&
16680
        IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE))) {
16681
        ssl->options.noPskDheKe = 1;
16682
    }
16683
#endif
16684
16685
    if (ret == 0)
16686
        ret = SNI_VERIFY_PARSE(ssl, isRequest);
16687
    if (ret == 0)
16688
        ret = TCA_VERIFY_PARSE(ssl, isRequest);
16689
16690
    return ret;
16691
}
16692
16693
/* undefining semaphore macros */
16694
#undef IS_OFF
16695
#undef TURN_ON
16696
#undef SEMAPHORE_SIZE
16697
16698
#endif /* HAVE_TLS_EXTENSIONS */
16699
16700
#ifndef NO_WOLFSSL_CLIENT
16701
16702
    WOLFSSL_METHOD* wolfTLS_client_method(void)
16703
0
    {
16704
0
        return wolfTLS_client_method_ex(NULL);
16705
0
    }
16706
    WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
16707
0
    {
16708
0
        WOLFSSL_METHOD* method =
16709
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16710
0
                                                     heap, DYNAMIC_TYPE_METHOD);
16711
0
        (void)heap;
16712
0
        WOLFSSL_ENTER("TLS_client_method_ex");
16713
0
        if (method) {
16714
0
        #if defined(WOLFSSL_TLS13)
16715
0
            InitSSL_Method(method, MakeTLSv1_3());
16716
        #elif !defined(WOLFSSL_NO_TLS12)
16717
            InitSSL_Method(method, MakeTLSv1_2());
16718
        #elif !defined(NO_OLD_TLS)
16719
            InitSSL_Method(method, MakeTLSv1_1());
16720
        #elif defined(WOLFSSL_ALLOW_TLSV10)
16721
            InitSSL_Method(method, MakeTLSv1());
16722
        #else
16723
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
16724
        #endif
16725
16726
0
            method->downgrade = 1;
16727
0
            method->side      = WOLFSSL_CLIENT_END;
16728
0
        }
16729
0
        return method;
16730
0
    }
16731
16732
#ifndef NO_OLD_TLS
16733
    #ifdef WOLFSSL_ALLOW_TLSV10
16734
    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
16735
    {
16736
        return wolfTLSv1_client_method_ex(NULL);
16737
    }
16738
    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
16739
    {
16740
        WOLFSSL_METHOD* method =
16741
                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16742
                                                     heap, DYNAMIC_TYPE_METHOD);
16743
        (void)heap;
16744
        WOLFSSL_ENTER("TLSv1_client_method_ex");
16745
        if (method)
16746
            InitSSL_Method(method, MakeTLSv1());
16747
        return method;
16748
    }
16749
    #endif /* WOLFSSL_ALLOW_TLSV10 */
16750
16751
    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
16752
    {
16753
        return wolfTLSv1_1_client_method_ex(NULL);
16754
    }
16755
    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
16756
    {
16757
        WOLFSSL_METHOD* method =
16758
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16759
                                                     heap, DYNAMIC_TYPE_METHOD);
16760
        (void)heap;
16761
        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
16762
        if (method)
16763
            InitSSL_Method(method, MakeTLSv1_1());
16764
        return method;
16765
    }
16766
#endif /* !NO_OLD_TLS */
16767
16768
#ifndef WOLFSSL_NO_TLS12
16769
    WOLFSSL_ABI
16770
    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
16771
4
    {
16772
4
        return wolfTLSv1_2_client_method_ex(NULL);
16773
4
    }
16774
    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
16775
4
    {
16776
4
        WOLFSSL_METHOD* method =
16777
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16778
4
                                                     heap, DYNAMIC_TYPE_METHOD);
16779
4
        (void)heap;
16780
4
        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
16781
4
        if (method)
16782
4
            InitSSL_Method(method, MakeTLSv1_2());
16783
4
        return method;
16784
4
    }
16785
#endif /* WOLFSSL_NO_TLS12 */
16786
16787
#ifdef WOLFSSL_TLS13
16788
    /* The TLS v1.3 client method data.
16789
     *
16790
     * returns the method data for a TLS v1.3 client.
16791
     */
16792
    WOLFSSL_ABI
16793
    WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
16794
4
    {
16795
4
        return wolfTLSv1_3_client_method_ex(NULL);
16796
4
    }
16797
16798
    /* The TLS v1.3 client method data.
16799
     *
16800
     * heap  The heap used for allocation.
16801
     * returns the method data for a TLS v1.3 client.
16802
     */
16803
    WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
16804
4
    {
16805
4
        WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
16806
4
                                 XMALLOC(sizeof(WOLFSSL_METHOD), heap,
16807
4
                                         DYNAMIC_TYPE_METHOD);
16808
4
        (void)heap;
16809
4
        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
16810
4
        if (method)
16811
4
            InitSSL_Method(method, MakeTLSv1_3());
16812
4
        return method;
16813
4
    }
16814
#endif /* WOLFSSL_TLS13 */
16815
16816
#ifdef WOLFSSL_DTLS
16817
16818
    WOLFSSL_METHOD* wolfDTLS_client_method(void)
16819
    {
16820
        return wolfDTLS_client_method_ex(NULL);
16821
    }
16822
    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
16823
    {
16824
        WOLFSSL_METHOD* method =
16825
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16826
                                                     heap, DYNAMIC_TYPE_METHOD);
16827
        (void)heap;
16828
        WOLFSSL_ENTER("DTLS_client_method_ex");
16829
        if (method) {
16830
        #if defined(WOLFSSL_DTLS13)
16831
            InitSSL_Method(method, MakeDTLSv1_3());
16832
        #elif !defined(WOLFSSL_NO_TLS12)
16833
            InitSSL_Method(method, MakeDTLSv1_2());
16834
        #elif !defined(NO_OLD_TLS)
16835
            InitSSL_Method(method, MakeDTLSv1());
16836
        #else
16837
            #error No DTLS version enabled!
16838
        #endif
16839
16840
            method->downgrade = 1;
16841
            method->side      = WOLFSSL_CLIENT_END;
16842
        }
16843
        return method;
16844
    }
16845
16846
    #ifndef NO_OLD_TLS
16847
    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
16848
    {
16849
        return wolfDTLSv1_client_method_ex(NULL);
16850
    }
16851
    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
16852
    {
16853
        WOLFSSL_METHOD* method =
16854
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16855
                                                 heap, DYNAMIC_TYPE_METHOD);
16856
        (void)heap;
16857
        WOLFSSL_ENTER("DTLSv1_client_method_ex");
16858
        if (method)
16859
            InitSSL_Method(method, MakeDTLSv1());
16860
        return method;
16861
    }
16862
    #endif  /* NO_OLD_TLS */
16863
16864
    #ifndef WOLFSSL_NO_TLS12
16865
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
16866
    {
16867
        return wolfDTLSv1_2_client_method_ex(NULL);
16868
    }
16869
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
16870
    {
16871
        WOLFSSL_METHOD* method =
16872
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
16873
                                                 heap, DYNAMIC_TYPE_METHOD);
16874
        (void)heap;
16875
        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
16876
        if (method)
16877
            InitSSL_Method(method, MakeDTLSv1_2());
16878
        (void)heap;
16879
        return method;
16880
    }
16881
    #endif /* !WOLFSSL_NO_TLS12 */
16882
#endif /* WOLFSSL_DTLS */
16883
16884
#endif /* NO_WOLFSSL_CLIENT */
16885
16886
16887
/* EITHER SIDE METHODS */
16888
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
16889
    #ifndef NO_OLD_TLS
16890
    #ifdef WOLFSSL_ALLOW_TLSV10
16891
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16892
     *
16893
     * Returns a pointer to a WOLFSSL_METHOD struct
16894
     */
16895
    WOLFSSL_METHOD* wolfTLSv1_method(void)
16896
    {
16897
        return wolfTLSv1_method_ex(NULL);
16898
    }
16899
    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
16900
    {
16901
        WOLFSSL_METHOD* m;
16902
        WOLFSSL_ENTER("TLSv1_method");
16903
    #ifndef NO_WOLFSSL_CLIENT
16904
        m = wolfTLSv1_client_method_ex(heap);
16905
    #else
16906
        m = wolfTLSv1_server_method_ex(heap);
16907
    #endif
16908
        if (m != NULL) {
16909
            m->side = WOLFSSL_NEITHER_END;
16910
        }
16911
16912
        return m;
16913
    }
16914
    #endif /* WOLFSSL_ALLOW_TLSV10 */
16915
16916
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16917
     *
16918
     * Returns a pointer to a WOLFSSL_METHOD struct
16919
     */
16920
    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
16921
    {
16922
        return wolfTLSv1_1_method_ex(NULL);
16923
    }
16924
    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
16925
    {
16926
        WOLFSSL_METHOD* m;
16927
        WOLFSSL_ENTER("TLSv1_1_method");
16928
    #ifndef NO_WOLFSSL_CLIENT
16929
        m = wolfTLSv1_1_client_method_ex(heap);
16930
    #else
16931
        m = wolfTLSv1_1_server_method_ex(heap);
16932
    #endif
16933
        if (m != NULL) {
16934
            m->side = WOLFSSL_NEITHER_END;
16935
        }
16936
        return m;
16937
    }
16938
    #endif /* !NO_OLD_TLS */
16939
16940
    #ifndef WOLFSSL_NO_TLS12
16941
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16942
     *
16943
     * Returns a pointer to a WOLFSSL_METHOD struct
16944
     */
16945
    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
16946
0
    {
16947
0
        return wolfTLSv1_2_method_ex(NULL);
16948
0
    }
16949
    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
16950
0
    {
16951
0
        WOLFSSL_METHOD* m;
16952
0
        WOLFSSL_ENTER("TLSv1_2_method");
16953
0
    #ifndef NO_WOLFSSL_CLIENT
16954
0
        m = wolfTLSv1_2_client_method_ex(heap);
16955
    #else
16956
        m = wolfTLSv1_2_server_method_ex(heap);
16957
    #endif
16958
0
        if (m != NULL) {
16959
0
            m->side = WOLFSSL_NEITHER_END;
16960
0
        }
16961
0
        return m;
16962
0
    }
16963
    #endif /* !WOLFSSL_NO_TLS12 */
16964
16965
    #ifdef WOLFSSL_TLS13
16966
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
16967
     *
16968
     * Returns a pointer to a WOLFSSL_METHOD struct
16969
     */
16970
    WOLFSSL_METHOD* wolfTLSv1_3_method(void)
16971
0
    {
16972
0
        return wolfTLSv1_3_method_ex(NULL);
16973
0
    }
16974
    WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
16975
0
    {
16976
0
        WOLFSSL_METHOD* m;
16977
0
        WOLFSSL_ENTER("TLSv1_3_method");
16978
0
    #ifndef NO_WOLFSSL_CLIENT
16979
0
        m = wolfTLSv1_3_client_method_ex(heap);
16980
    #else
16981
        m = wolfTLSv1_3_server_method_ex(heap);
16982
    #endif
16983
0
        if (m != NULL) {
16984
0
            m->side = WOLFSSL_NEITHER_END;
16985
0
        }
16986
0
        return m;
16987
0
    }
16988
    #endif /* WOLFSSL_TLS13 */
16989
16990
#ifdef WOLFSSL_DTLS
16991
    WOLFSSL_METHOD* wolfDTLS_method(void)
16992
    {
16993
        return wolfDTLS_method_ex(NULL);
16994
    }
16995
    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
16996
    {
16997
        WOLFSSL_METHOD* m;
16998
        WOLFSSL_ENTER("DTLS_method_ex");
16999
    #ifndef NO_WOLFSSL_CLIENT
17000
        m = wolfDTLS_client_method_ex(heap);
17001
    #else
17002
        m = wolfDTLS_server_method_ex(heap);
17003
    #endif
17004
        if (m != NULL) {
17005
            m->side = WOLFSSL_NEITHER_END;
17006
        }
17007
        return m;
17008
    }
17009
17010
    #ifndef NO_OLD_TLS
17011
    WOLFSSL_METHOD* wolfDTLSv1_method(void)
17012
    {
17013
        return wolfDTLSv1_method_ex(NULL);
17014
    }
17015
    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
17016
    {
17017
        WOLFSSL_METHOD* m;
17018
        WOLFSSL_ENTER("DTLSv1_method_ex");
17019
    #ifndef NO_WOLFSSL_CLIENT
17020
        m = wolfDTLSv1_client_method_ex(heap);
17021
    #else
17022
        m = wolfDTLSv1_server_method_ex(heap);
17023
    #endif
17024
        if (m != NULL) {
17025
            m->side = WOLFSSL_NEITHER_END;
17026
        }
17027
        return m;
17028
    }
17029
    #endif /* !NO_OLD_TLS */
17030
    #ifndef WOLFSSL_NO_TLS12
17031
    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
17032
    {
17033
        return wolfDTLSv1_2_method_ex(NULL);
17034
    }
17035
    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
17036
    {
17037
        WOLFSSL_METHOD* m;
17038
        WOLFSSL_ENTER("DTLSv1_2_method");
17039
    #ifndef NO_WOLFSSL_CLIENT
17040
        m = wolfDTLSv1_2_client_method_ex(heap);
17041
    #else
17042
        m = wolfDTLSv1_2_server_method_ex(heap);
17043
    #endif
17044
        if (m != NULL) {
17045
            m->side = WOLFSSL_NEITHER_END;
17046
        }
17047
        return m;
17048
    }
17049
    #endif /* !WOLFSSL_NO_TLS12 */
17050
    #ifdef WOLFSSL_DTLS13
17051
    WOLFSSL_METHOD* wolfDTLSv1_3_method(void)
17052
    {
17053
        return wolfDTLSv1_3_method_ex(NULL);
17054
    }
17055
    WOLFSSL_METHOD* wolfDTLSv1_3_method_ex(void* heap)
17056
    {
17057
        WOLFSSL_METHOD* m;
17058
        WOLFSSL_ENTER("DTLSv1_3_method");
17059
    #ifndef NO_WOLFSSL_CLIENT
17060
        m = wolfDTLSv1_3_client_method_ex(heap);
17061
    #else
17062
        m = wolfDTLSv1_3_server_method_ex(heap);
17063
    #endif
17064
        if (m != NULL) {
17065
            m->side = WOLFSSL_NEITHER_END;
17066
        }
17067
        return m;
17068
    }
17069
    #endif /* WOLFSSL_DTLS13 */
17070
#endif /* WOLFSSL_DTLS */
17071
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
17072
17073
17074
#ifndef NO_WOLFSSL_SERVER
17075
17076
    WOLFSSL_METHOD* wolfTLS_server_method(void)
17077
0
    {
17078
0
        return wolfTLS_server_method_ex(NULL);
17079
0
    }
17080
17081
    WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
17082
0
    {
17083
0
        WOLFSSL_METHOD* method =
17084
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17085
0
                                                     heap, DYNAMIC_TYPE_METHOD);
17086
0
        (void)heap;
17087
0
        WOLFSSL_ENTER("TLS_server_method_ex");
17088
0
        if (method) {
17089
0
        #if defined(WOLFSSL_TLS13)
17090
0
            InitSSL_Method(method, MakeTLSv1_3());
17091
        #elif !defined(WOLFSSL_NO_TLS12)
17092
            InitSSL_Method(method, MakeTLSv1_2());
17093
        #elif !defined(NO_OLD_TLS)
17094
            InitSSL_Method(method, MakeTLSv1_1());
17095
        #elif defined(WOLFSSL_ALLOW_TLSV10)
17096
            InitSSL_Method(method, MakeTLSv1());
17097
        #else
17098
        #error No TLS version enabled! Consider using NO_TLS or WOLFCRYPT_ONLY.
17099
        #endif
17100
17101
0
            method->downgrade = 1;
17102
0
            method->side      = WOLFSSL_SERVER_END;
17103
0
        }
17104
0
        return method;
17105
0
    }
17106
17107
#ifndef NO_OLD_TLS
17108
    #ifdef WOLFSSL_ALLOW_TLSV10
17109
    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
17110
    {
17111
        return wolfTLSv1_server_method_ex(NULL);
17112
    }
17113
    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
17114
    {
17115
        WOLFSSL_METHOD* method =
17116
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17117
                                                     heap, DYNAMIC_TYPE_METHOD);
17118
        (void)heap;
17119
        WOLFSSL_ENTER("TLSv1_server_method_ex");
17120
        if (method) {
17121
            InitSSL_Method(method, MakeTLSv1());
17122
            method->side = WOLFSSL_SERVER_END;
17123
        }
17124
        return method;
17125
    }
17126
    #endif /* WOLFSSL_ALLOW_TLSV10 */
17127
17128
    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
17129
    {
17130
        return wolfTLSv1_1_server_method_ex(NULL);
17131
    }
17132
    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
17133
    {
17134
        WOLFSSL_METHOD* method =
17135
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17136
                                                     heap, DYNAMIC_TYPE_METHOD);
17137
        (void)heap;
17138
        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
17139
        if (method) {
17140
            InitSSL_Method(method, MakeTLSv1_1());
17141
            method->side = WOLFSSL_SERVER_END;
17142
        }
17143
        return method;
17144
    }
17145
#endif /* !NO_OLD_TLS */
17146
17147
17148
#ifndef WOLFSSL_NO_TLS12
17149
    WOLFSSL_ABI
17150
    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
17151
4.88k
    {
17152
4.88k
        return wolfTLSv1_2_server_method_ex(NULL);
17153
4.88k
    }
17154
    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
17155
4.88k
    {
17156
4.88k
        WOLFSSL_METHOD* method =
17157
4.88k
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17158
4.88k
                                                     heap, DYNAMIC_TYPE_METHOD);
17159
4.88k
        (void)heap;
17160
4.88k
        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
17161
4.88k
        if (method) {
17162
4.88k
            InitSSL_Method(method, MakeTLSv1_2());
17163
4.88k
            method->side = WOLFSSL_SERVER_END;
17164
4.88k
        }
17165
4.88k
        return method;
17166
4.88k
    }
17167
#endif /* !WOLFSSL_NO_TLS12 */
17168
17169
#ifdef WOLFSSL_TLS13
17170
    /* The TLS v1.3 server method data.
17171
     *
17172
     * returns the method data for a TLS v1.3 server.
17173
     */
17174
    WOLFSSL_ABI
17175
    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
17176
4
    {
17177
4
        return wolfTLSv1_3_server_method_ex(NULL);
17178
4
    }
17179
17180
    /* The TLS v1.3 server method data.
17181
     *
17182
     * heap  The heap used for allocation.
17183
     * returns the method data for a TLS v1.3 server.
17184
     */
17185
    WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
17186
4
    {
17187
4
        WOLFSSL_METHOD* method =
17188
4
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17189
4
                                                     heap, DYNAMIC_TYPE_METHOD);
17190
4
        (void)heap;
17191
4
        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
17192
4
        if (method) {
17193
4
            InitSSL_Method(method, MakeTLSv1_3());
17194
4
            method->side = WOLFSSL_SERVER_END;
17195
4
        }
17196
4
        return method;
17197
4
    }
17198
#endif /* WOLFSSL_TLS13 */
17199
17200
#ifdef WOLFSSL_DTLS
17201
    WOLFSSL_METHOD* wolfDTLS_server_method(void)
17202
    {
17203
        return wolfDTLS_server_method_ex(NULL);
17204
    }
17205
    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
17206
    {
17207
        WOLFSSL_METHOD* method =
17208
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17209
                                                     heap, DYNAMIC_TYPE_METHOD);
17210
        (void)heap;
17211
        WOLFSSL_ENTER("DTLS_server_method_ex");
17212
        if (method) {
17213
        #if defined(WOLFSSL_DTLS13)
17214
            InitSSL_Method(method, MakeDTLSv1_3());
17215
        #elif !defined(WOLFSSL_NO_TLS12)
17216
            InitSSL_Method(method, MakeDTLSv1_2());
17217
        #elif !defined(NO_OLD_TLS)
17218
            InitSSL_Method(method, MakeDTLSv1());
17219
        #else
17220
            #error No DTLS version enabled!
17221
        #endif
17222
17223
            method->downgrade = 1;
17224
            method->side      = WOLFSSL_SERVER_END;
17225
        }
17226
        return method;
17227
    }
17228
17229
    #ifndef NO_OLD_TLS
17230
    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
17231
    {
17232
        return wolfDTLSv1_server_method_ex(NULL);
17233
    }
17234
    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
17235
    {
17236
        WOLFSSL_METHOD* method =
17237
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17238
                                                 heap, DYNAMIC_TYPE_METHOD);
17239
        (void)heap;
17240
        WOLFSSL_ENTER("DTLSv1_server_method_ex");
17241
        if (method) {
17242
            InitSSL_Method(method, MakeDTLSv1());
17243
            method->side = WOLFSSL_SERVER_END;
17244
        }
17245
        return method;
17246
    }
17247
    #endif /* !NO_OLD_TLS */
17248
17249
    #ifndef WOLFSSL_NO_TLS12
17250
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
17251
    {
17252
        return wolfDTLSv1_2_server_method_ex(NULL);
17253
    }
17254
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
17255
    {
17256
        WOLFSSL_METHOD* method =
17257
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
17258
                                                 heap, DYNAMIC_TYPE_METHOD);
17259
        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
17260
        (void)heap;
17261
        if (method) {
17262
            InitSSL_Method(method, MakeDTLSv1_2());
17263
            method->side = WOLFSSL_SERVER_END;
17264
        }
17265
        (void)heap;
17266
        return method;
17267
    }
17268
    #endif /* !WOLFSSL_NO_TLS12 */
17269
#endif /* WOLFSSL_DTLS */
17270
17271
#endif /* NO_WOLFSSL_SERVER */
17272
17273
#endif /* NO_TLS */
17274
17275
#endif /* WOLFCRYPT_ONLY */