Coverage Report

Created: 2024-06-28 06:19

/src/wolfssl/src/tls.c
Line
Count
Source (jump to first uncovered line)
1
/* tls.c
2
 *
3
 * Copyright (C) 2006-2023 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 2 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * wolfSSL is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20
 */
21
22
23
24
#ifdef HAVE_CONFIG_H
25
    #include <config.h>
26
#endif
27
28
#include <wolfssl/wolfcrypt/settings.h>
29
30
#ifndef WOLFCRYPT_ONLY
31
32
#include <wolfssl/ssl.h>
33
#include <wolfssl/internal.h>
34
#include <wolfssl/error-ssl.h>
35
#include <wolfssl/wolfcrypt/hash.h>
36
#include <wolfssl/wolfcrypt/hmac.h>
37
#include <wolfssl/wolfcrypt/kdf.h>
38
#ifdef NO_INLINE
39
    #include <wolfssl/wolfcrypt/misc.h>
40
#else
41
    #define WOLFSSL_MISC_INCLUDED
42
    #include <wolfcrypt/src/misc.c>
43
#endif
44
45
#ifdef HAVE_CURVE25519
46
    #include <wolfssl/wolfcrypt/curve25519.h>
47
#endif
48
#ifdef HAVE_CURVE448
49
    #include <wolfssl/wolfcrypt/curve448.h>
50
#endif
51
#ifdef HAVE_PQC
52
    #include <wolfssl/wolfcrypt/kyber.h>
53
#ifdef WOLFSSL_WC_KYBER
54
    #include <wolfssl/wolfcrypt/wc_kyber.h>
55
#elif defined(HAVE_LIBOQS) || defined(HAVE_PQM4)
56
    #include <wolfssl/wolfcrypt/ext_kyber.h>
57
#endif
58
#endif
59
60
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
61
    #include <wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h>
62
#endif
63
64
#include <wolfssl/wolfcrypt/hpke.h>
65
66
#ifndef NO_TLS
67
68
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
69
static int TLSX_KeyShare_IsSupported(int namedGroup);
70
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap);
71
#endif
72
73
#ifdef HAVE_SUPPORTED_CURVES
74
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions);
75
#endif
76
77
/* Digest enable checks */
78
#ifdef NO_OLD_TLS /* TLS 1.2 only */
79
    #if defined(NO_SHA256) && !defined(WOLFSSL_SHA384) && \
80
            !defined(WOLFSSL_SHA512)
81
        #error Must have SHA256, SHA384 or SHA512 enabled for TLS 1.2
82
    #endif
83
#else  /* TLS 1.1 or older */
84
    #if defined(NO_MD5) && defined(NO_SHA)
85
        #error Must have SHA1 and MD5 enabled for old TLS
86
    #endif
87
#endif
88
89
#ifdef WOLFSSL_TLS13
90
    #if !defined(NO_DH) && \
91
        !defined(HAVE_FFDHE_2048) && !defined(HAVE_FFDHE_3072) && \
92
        !defined(HAVE_FFDHE_4096) && !defined(HAVE_FFDHE_6144) && \
93
        !defined(HAVE_FFDHE_8192)
94
        #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
95
    #endif
96
    #if !defined(NO_RSA) && !defined(WC_RSA_PSS)
97
        #error The build option WC_RSA_PSS is required for TLS 1.3 with RSA
98
    #endif
99
    #ifndef HAVE_TLS_EXTENSIONS
100
        #ifndef _MSC_VER
101
            #error "The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3"
102
        #else
103
            #pragma message("Error: The build option HAVE_TLS_EXTENSIONS is required for TLS 1.3")
104
        #endif
105
    #endif
106
#endif
107
108
/* Warn if secrets logging is enabled */
109
#if (defined(SHOW_SECRETS) || defined(WOLFSSL_SSLKEYLOGFILE)) && \
110
    !defined(WOLFSSL_KEYLOG_EXPORT_WARNED)
111
    #ifndef _MSC_VER
112
        #warning The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment
113
    #else
114
        #pragma message("Warning: The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment")
115
    #endif
116
#endif
117
118
#ifndef WOLFSSL_NO_TLS12
119
120
#ifdef WOLFSSL_SHA384
121
0
    #define HSHASH_SZ WC_SHA384_DIGEST_SIZE
122
#else
123
    #define HSHASH_SZ FINISHED_SZ
124
#endif
125
126
int BuildTlsHandshakeHash(WOLFSSL* ssl, byte* hash, word32* hashLen)
127
0
{
128
0
    int ret = 0;
129
0
    word32 hashSz = FINISHED_SZ;
130
131
0
    if (ssl == NULL || hash == NULL || hashLen == NULL || *hashLen < HSHASH_SZ)
132
0
        return BAD_FUNC_ARG;
133
134
    /* for constant timing perform these even if error */
135
#ifndef NO_OLD_TLS
136
    ret |= wc_Md5GetHash(&ssl->hsHashes->hashMd5, hash);
137
    ret |= wc_ShaGetHash(&ssl->hsHashes->hashSha, &hash[WC_MD5_DIGEST_SIZE]);
138
#endif
139
140
0
    if (IsAtLeastTLSv1_2(ssl)) {
141
0
#ifndef NO_SHA256
142
0
        if (ssl->specs.mac_algorithm <= sha256_mac ||
143
0
            ssl->specs.mac_algorithm == blake2b_mac) {
144
0
            ret |= wc_Sha256GetHash(&ssl->hsHashes->hashSha256, hash);
145
0
            hashSz = WC_SHA256_DIGEST_SIZE;
146
0
        }
147
0
#endif
148
0
#ifdef WOLFSSL_SHA384
149
0
        if (ssl->specs.mac_algorithm == sha384_mac) {
150
0
            ret |= wc_Sha384GetHash(&ssl->hsHashes->hashSha384, hash);
151
0
            hashSz = WC_SHA384_DIGEST_SIZE;
152
0
        }
153
0
#endif
154
0
#ifdef WOLFSSL_SM3
155
0
        if (ssl->specs.mac_algorithm == sm3_mac) {
156
0
            ret |= wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash);
157
0
            hashSz = WC_SM3_DIGEST_SIZE;
158
0
        }
159
0
#endif
160
0
    }
161
162
0
    *hashLen = hashSz;
163
#ifdef WOLFSSL_CHECK_MEM_ZERO
164
     wc_MemZero_Add("TLS handshake hash", hash, hashSz);
165
#endif
166
167
0
    if (ret != 0) {
168
0
        ret = BUILD_MSG_ERROR;
169
0
        WOLFSSL_ERROR_VERBOSE(ret);
170
0
    }
171
172
0
    return ret;
173
0
}
174
175
176
int BuildTlsFinished(WOLFSSL* ssl, Hashes* hashes, const byte* sender)
177
0
{
178
0
    int ret;
179
0
    const byte* side = NULL;
180
0
    word32 hashSz = HSHASH_SZ;
181
0
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
182
0
    byte handshake_hash[HSHASH_SZ];
183
#else
184
    WC_DECLARE_VAR(handshake_hash, byte, HSHASH_SZ, ssl->heap);
185
    if (handshake_hash == NULL)
186
        return MEMORY_E;
187
#endif
188
189
0
    ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
190
0
    if (ret == 0) {
191
0
        if (XSTRNCMP((const char*)sender, (const char*)kTlsClientStr,
192
0
                                                          SIZEOF_SENDER) == 0) {
193
0
            side = kTlsClientFinStr;
194
0
        }
195
0
        else if (XSTRNCMP((const char*)sender, (const char*)kTlsServerStr,
196
0
                                                          SIZEOF_SENDER) == 0) {
197
0
            side = kTlsServerFinStr;
198
0
        }
199
0
        else {
200
0
            ret = BAD_FUNC_ARG;
201
0
            WOLFSSL_MSG("Unexpected sender value");
202
0
        }
203
0
    }
204
205
0
    if (ret == 0) {
206
0
#ifdef WOLFSSL_HAVE_PRF
207
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
208
        if (ssl->ctx->TlsFinishedCb) {
209
            void* ctx = wolfSSL_GetTlsFinishedCtx(ssl);
210
            ret = ssl->ctx->TlsFinishedCb(ssl, side, handshake_hash, hashSz,
211
                                          (byte*)hashes, ctx);
212
        }
213
        if (!ssl->ctx->TlsFinishedCb || ret == PROTOCOLCB_UNAVAILABLE)
214
#endif
215
0
        {
216
0
            PRIVATE_KEY_UNLOCK();
217
0
            ret = wc_PRF_TLS((byte*)hashes, TLS_FINISHED_SZ,
218
0
                      ssl->arrays->masterSecret, SECRET_LEN, side,
219
0
                      FINISHED_LABEL_SZ, handshake_hash, hashSz,
220
0
                      IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
221
0
                      ssl->heap, ssl->devId);
222
0
            PRIVATE_KEY_LOCK();
223
0
        }
224
0
        ForceZero(handshake_hash, hashSz);
225
#else
226
        /* Pseudo random function must be enabled in the configuration. */
227
        ret = PRF_MISSING;
228
        WOLFSSL_ERROR_VERBOSE(ret);
229
        WOLFSSL_MSG("Pseudo-random function is not enabled");
230
231
        (void)side;
232
        (void)hashes;
233
#endif
234
0
    }
235
236
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
237
    WC_FREE_VAR(handshake_hash, ssl->heap);
238
#elif defined(WOLFSSL_CHECK_MEM_ZERO)
239
    wc_MemZero_Check(handshake_hash, HSHASH_SZ);
240
#endif
241
242
0
    return ret;
243
0
}
244
245
#endif /* !WOLFSSL_NO_TLS12 */
246
247
#ifndef NO_OLD_TLS
248
249
#ifdef WOLFSSL_ALLOW_TLSV10
250
ProtocolVersion MakeTLSv1(void)
251
{
252
    ProtocolVersion pv;
253
    pv.major = SSLv3_MAJOR;
254
    pv.minor = TLSv1_MINOR;
255
256
    return pv;
257
}
258
#endif /* WOLFSSL_ALLOW_TLSV10 */
259
260
261
ProtocolVersion MakeTLSv1_1(void)
262
{
263
    ProtocolVersion pv;
264
    pv.major = SSLv3_MAJOR;
265
    pv.minor = TLSv1_1_MINOR;
266
267
    return pv;
268
}
269
270
#endif /* !NO_OLD_TLS */
271
272
273
#ifndef WOLFSSL_NO_TLS12
274
275
ProtocolVersion MakeTLSv1_2(void)
276
0
{
277
0
    ProtocolVersion pv;
278
0
    pv.major = SSLv3_MAJOR;
279
0
    pv.minor = TLSv1_2_MINOR;
280
281
0
    return pv;
282
0
}
283
284
#endif /* !WOLFSSL_NO_TLS12 */
285
286
#ifdef WOLFSSL_TLS13
287
/* The TLS v1.3 protocol version.
288
 *
289
 * returns the protocol version data for TLS v1.3.
290
 */
291
ProtocolVersion MakeTLSv1_3(void)
292
0
{
293
0
    ProtocolVersion pv;
294
0
    pv.major = SSLv3_MAJOR;
295
0
    pv.minor = TLSv1_3_MINOR;
296
297
0
    return pv;
298
0
}
299
#endif
300
301
#ifndef WOLFSSL_NO_TLS12
302
303
#ifdef HAVE_EXTENDED_MASTER
304
static const byte ext_master_label[EXT_MASTER_LABEL_SZ + 1] =
305
                                                      "extended master secret";
306
#endif
307
static const byte master_label[MASTER_LABEL_SZ + 1] = "master secret";
308
static const byte key_label   [KEY_LABEL_SZ + 1]    = "key expansion";
309
310
static int _DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
311
                         const byte* ms, word32 msLen,
312
                         const byte* sr, const byte* cr,
313
                         int tls1_2, int hash_type,
314
                         void* heap, int devId)
315
0
{
316
0
    int ret;
317
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
318
    WC_DECLARE_VAR(seed, byte, SEED_LEN, heap);
319
    if (seed == NULL)
320
        return MEMORY_E;
321
#else
322
0
    byte seed[SEED_LEN];
323
0
#endif
324
325
0
    XMEMCPY(seed,           sr, RAN_LEN);
326
0
    XMEMCPY(seed + RAN_LEN, cr, RAN_LEN);
327
328
0
#ifdef WOLFSSL_HAVE_PRF
329
0
    PRIVATE_KEY_UNLOCK();
330
0
    ret = wc_PRF_TLS(key_dig, key_dig_len, ms, msLen, key_label, KEY_LABEL_SZ,
331
0
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
332
0
    PRIVATE_KEY_LOCK();
333
#else
334
    /* Pseudo random function must be enabled in the configuration. */
335
    ret = PRF_MISSING;
336
    WOLFSSL_ERROR_VERBOSE(ret);
337
    WOLFSSL_MSG("Pseudo-random function is not enabled");
338
339
    (void)key_dig;
340
    (void)key_dig_len;
341
    (void)ms;
342
    (void)msLen;
343
    (void)tls1_2;
344
    (void)hash_type;
345
    (void)heap;
346
    (void)devId;
347
    (void)key_label;
348
    (void)master_label;
349
#ifdef HAVE_EXTENDED_MASTER
350
    (void)ext_master_label;
351
#endif
352
#endif
353
354
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
355
    WC_FREE_VAR(seed, heap);
356
#endif
357
358
0
    return ret;
359
0
}
360
361
/* External facing wrapper so user can call as well, 0 on success */
362
int wolfSSL_DeriveTlsKeys(byte* key_dig, word32 key_dig_len,
363
                         const byte* ms, word32 msLen,
364
                         const byte* sr, const byte* cr,
365
                         int tls1_2, int hash_type)
366
0
{
367
0
    return _DeriveTlsKeys(key_dig, key_dig_len, ms, msLen, sr, cr, tls1_2,
368
0
        hash_type, NULL, INVALID_DEVID);
369
0
}
370
371
372
int DeriveTlsKeys(WOLFSSL* ssl)
373
0
{
374
0
    int   ret;
375
0
    int   key_dig_len = 2 * ssl->specs.hash_size +
376
0
                        2 * ssl->specs.key_size  +
377
0
                        2 * ssl->specs.iv_size;
378
0
#ifdef WOLFSSL_SMALL_STACK
379
0
    byte* key_dig;
380
#else
381
    byte  key_dig[MAX_PRF_DIG];
382
#endif
383
384
0
#ifdef WOLFSSL_SMALL_STACK
385
0
    key_dig = (byte*)XMALLOC(MAX_PRF_DIG, ssl->heap, DYNAMIC_TYPE_DIGEST);
386
0
    if (key_dig == NULL) {
387
0
        return MEMORY_E;
388
0
    }
389
0
#endif
390
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
391
        ret = PROTOCOLCB_UNAVAILABLE;
392
        if (ssl->ctx->GenSessionKeyCb) {
393
            void* ctx = wolfSSL_GetGenSessionKeyCtx(ssl);
394
            ret = ssl->ctx->GenSessionKeyCb(ssl, ctx);
395
        }
396
        if (!ssl->ctx->GenSessionKeyCb || ret == PROTOCOLCB_UNAVAILABLE)
397
#endif
398
0
        ret = _DeriveTlsKeys(key_dig, key_dig_len,
399
0
                         ssl->arrays->masterSecret, SECRET_LEN,
400
0
                         ssl->arrays->serverRandom, ssl->arrays->clientRandom,
401
0
                         IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
402
0
                         ssl->heap, ssl->devId);
403
0
    if (ret == 0)
404
0
        ret = StoreKeys(ssl, key_dig, PROVISION_CLIENT_SERVER);
405
406
0
#ifdef WOLFSSL_SMALL_STACK
407
0
    XFREE(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST);
408
0
#endif
409
410
0
    return ret;
411
0
}
412
413
static int _MakeTlsMasterSecret(byte* ms, word32 msLen,
414
                               const byte* pms, word32 pmsLen,
415
                               const byte* cr, const byte* sr,
416
                               int tls1_2, int hash_type,
417
                               void* heap, int devId)
418
0
{
419
0
    int ret;
420
0
#if !defined(WOLFSSL_ASYNC_CRYPT) || defined(WC_ASYNC_NO_HASH)
421
0
    byte seed[SEED_LEN];
422
#else
423
    WC_DECLARE_VAR(seed, byte, SEED_LEN, heap);
424
    if (seed == NULL)
425
        return MEMORY_E;
426
#endif
427
428
0
    XMEMCPY(seed,           cr, RAN_LEN);
429
0
    XMEMCPY(seed + RAN_LEN, sr, RAN_LEN);
430
431
0
#ifdef WOLFSSL_HAVE_PRF
432
0
    PRIVATE_KEY_UNLOCK();
433
0
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, master_label, MASTER_LABEL_SZ,
434
0
               seed, SEED_LEN, tls1_2, hash_type, heap, devId);
435
0
    PRIVATE_KEY_LOCK();
436
#else
437
    /* Pseudo random function must be enabled in the configuration. */
438
    ret = PRF_MISSING;
439
    WOLFSSL_MSG("Pseudo-random function is not enabled");
440
441
    (void)ms;
442
    (void)msLen;
443
    (void)pms;
444
    (void)pmsLen;
445
    (void)tls1_2;
446
    (void)hash_type;
447
    (void)heap;
448
    (void)devId;
449
#endif
450
451
#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH)
452
    WC_FREE_VAR(seed, heap);
453
#endif
454
455
0
    return ret;
456
0
}
457
458
/* External facing wrapper so user can call as well, 0 on success */
459
int wolfSSL_MakeTlsMasterSecret(byte* ms, word32 msLen,
460
                               const byte* pms, word32 pmsLen,
461
                               const byte* cr, const byte* sr,
462
                               int tls1_2, int hash_type)
463
0
{
464
0
    return _MakeTlsMasterSecret(ms, msLen, pms, pmsLen, cr, sr, tls1_2,
465
0
        hash_type, NULL, INVALID_DEVID);
466
0
}
467
468
469
#ifdef HAVE_EXTENDED_MASTER
470
471
static int _MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
472
                                        const byte* pms, word32 pmsLen,
473
                                        const byte* sHash, word32 sHashLen,
474
                                        int tls1_2, int hash_type,
475
                                        void* heap, int devId)
476
0
{
477
0
    int ret;
478
479
0
#ifdef WOLFSSL_HAVE_PRF
480
0
    PRIVATE_KEY_UNLOCK();
481
0
    ret = wc_PRF_TLS(ms, msLen, pms, pmsLen, ext_master_label, EXT_MASTER_LABEL_SZ,
482
0
               sHash, sHashLen, tls1_2, hash_type, heap, devId);
483
0
    PRIVATE_KEY_LOCK();
484
#else
485
    /* Pseudo random function must be enabled in the configuration. */
486
    ret = PRF_MISSING;
487
    WOLFSSL_MSG("Pseudo-random function is not enabled");
488
489
    (void)ms;
490
    (void)msLen;
491
    (void)pms;
492
    (void)pmsLen;
493
    (void)sHash;
494
    (void)sHashLen;
495
    (void)tls1_2;
496
    (void)hash_type;
497
    (void)heap;
498
    (void)devId;
499
#endif
500
0
    return ret;
501
0
}
502
503
/* External facing wrapper so user can call as well, 0 on success */
504
int wolfSSL_MakeTlsExtendedMasterSecret(byte* ms, word32 msLen,
505
                                        const byte* pms, word32 pmsLen,
506
                                        const byte* sHash, word32 sHashLen,
507
                                        int tls1_2, int hash_type)
508
0
{
509
0
    return _MakeTlsExtendedMasterSecret(ms, msLen, pms, pmsLen, sHash, sHashLen,
510
0
        tls1_2, hash_type, NULL, INVALID_DEVID);
511
0
}
512
513
#endif /* HAVE_EXTENDED_MASTER */
514
515
516
int MakeTlsMasterSecret(WOLFSSL* ssl)
517
0
{
518
0
    int ret;
519
520
#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE)
521
    /* If this is called from a sniffer session with keylog file support, obtain
522
     * the master secret from the callback */
523
    if (ssl->snifferSecretCb != NULL) {
524
        ret = ssl->snifferSecretCb(ssl->arrays->clientRandom,
525
                                   SNIFFER_SECRET_TLS12_MASTER_SECRET,
526
                                   ssl->arrays->masterSecret);
527
        if (ret != 0) {
528
            return ret;
529
        }
530
        ret = DeriveTlsKeys(ssl);
531
        return ret;
532
    }
533
#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */
534
535
0
#ifdef HAVE_EXTENDED_MASTER
536
0
    if (ssl->options.haveEMS) {
537
0
        word32 hashSz = HSHASH_SZ;
538
0
    #ifdef WOLFSSL_SMALL_STACK
539
0
        byte* handshake_hash = (byte*)XMALLOC(HSHASH_SZ, ssl->heap,
540
0
                                              DYNAMIC_TYPE_DIGEST);
541
0
        if (handshake_hash == NULL)
542
0
            return MEMORY_E;
543
    #else
544
        byte handshake_hash[HSHASH_SZ];
545
    #endif
546
547
0
        ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz);
548
0
        if (ret == 0) {
549
0
            ret = _MakeTlsExtendedMasterSecret(
550
0
                ssl->arrays->masterSecret, SECRET_LEN,
551
0
                ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz,
552
0
                handshake_hash, hashSz,
553
0
                IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
554
0
                ssl->heap, ssl->devId);
555
0
            ForceZero(handshake_hash, hashSz);
556
0
        }
557
558
0
    #ifdef WOLFSSL_SMALL_STACK
559
0
        XFREE(handshake_hash, ssl->heap, DYNAMIC_TYPE_DIGEST);
560
    #elif defined(WOLFSSL_CHECK_MEM_ZERO)
561
        wc_MemZero_Check(handshake_hash, HSHASH_SZ);
562
    #endif
563
0
    }
564
0
    else
565
0
#endif /* HAVE_EXTENDED_MASTER */
566
0
    {
567
568
#if !defined(NO_CERTS) && defined(HAVE_PK_CALLBACKS)
569
        ret = PROTOCOLCB_UNAVAILABLE;
570
        if (ssl->ctx->GenMasterCb) {
571
            void* ctx = wolfSSL_GetGenMasterSecretCtx(ssl);
572
            ret = ssl->ctx->GenMasterCb(ssl, ctx);
573
        }
574
        if (!ssl->ctx->GenMasterCb || ret == PROTOCOLCB_UNAVAILABLE)
575
#endif
576
0
        {
577
0
            ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret,
578
0
                      SECRET_LEN, ssl->arrays->preMasterSecret,
579
0
                      ssl->arrays->preMasterSz, ssl->arrays->clientRandom,
580
0
                      ssl->arrays->serverRandom, IsAtLeastTLSv1_2(ssl),
581
0
                      ssl->specs.mac_algorithm, ssl->heap, ssl->devId);
582
0
        }
583
0
    }
584
0
    if (ret == 0) {
585
    #ifdef SHOW_SECRETS
586
        /* Wireshark Pre-Master-Secret Format:
587
         *  CLIENT_RANDOM <clientrandom> <mastersecret>
588
         */
589
        const char* CLIENT_RANDOM_LABEL = "CLIENT_RANDOM";
590
        int i, pmsPos = 0;
591
        char pmsBuf[13 + 1 + 64 + 1 + 96 + 1 + 1];
592
593
        XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%s ",
594
            CLIENT_RANDOM_LABEL);
595
        pmsPos += XSTRLEN(CLIENT_RANDOM_LABEL) + 1;
596
        for (i = 0; i < RAN_LEN; i++) {
597
            XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x",
598
                ssl->arrays->clientRandom[i]);
599
            pmsPos += 2;
600
        }
601
        XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, " ");
602
        pmsPos += 1;
603
        for (i = 0; i < SECRET_LEN; i++) {
604
            XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x",
605
                ssl->arrays->masterSecret[i]);
606
            pmsPos += 2;
607
        }
608
        XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "\n");
609
        pmsPos += 1;
610
611
        /* print master secret */
612
        puts(pmsBuf);
613
614
        #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE)
615
        {
616
            FILE* f = XFOPEN(WOLFSSL_SSLKEYLOGFILE_OUTPUT, "a");
617
            if (f != XBADFILE) {
618
                XFWRITE(pmsBuf, 1, pmsPos, f);
619
                XFCLOSE(f);
620
            }
621
        }
622
        #endif
623
    #endif /* SHOW_SECRETS */
624
625
0
        ret = DeriveTlsKeys(ssl);
626
0
    }
627
628
0
    return ret;
629
0
}
630
631
632
/* Used by EAP-TLS and EAP-TTLS to derive keying material from
633
 * the master_secret. */
634
int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* msk, unsigned int len,
635
                                                              const char* label)
636
0
{
637
0
    int   ret;
638
0
#ifdef WOLFSSL_SMALL_STACK
639
0
    byte* seed;
640
#else
641
    byte  seed[SEED_LEN];
642
#endif
643
644
0
#ifdef WOLFSSL_SMALL_STACK
645
0
    seed = (byte*)XMALLOC(SEED_LEN, ssl->heap, DYNAMIC_TYPE_SEED);
646
0
    if (seed == NULL)
647
0
        return MEMORY_E;
648
0
#endif
649
650
    /*
651
     * As per RFC-5281, the order of the client and server randoms is reversed
652
     * from that used by the TLS protocol to derive keys.
653
     */
654
0
    XMEMCPY(seed,           ssl->arrays->clientRandom, RAN_LEN);
655
0
    XMEMCPY(seed + RAN_LEN, ssl->arrays->serverRandom, RAN_LEN);
656
657
0
#ifdef WOLFSSL_HAVE_PRF
658
0
    PRIVATE_KEY_UNLOCK();
659
0
    ret = wc_PRF_TLS((byte*)msk, len, ssl->arrays->masterSecret, SECRET_LEN,
660
0
              (const byte *)label, (word32)XSTRLEN(label), seed, SEED_LEN,
661
0
              IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm,
662
0
              ssl->heap, ssl->devId);
663
0
    PRIVATE_KEY_LOCK();
664
#else
665
    /* Pseudo random function must be enabled in the configuration. */
666
    ret = PRF_MISSING;
667
    WOLFSSL_MSG("Pseudo-random function is not enabled");
668
669
    (void)msk;
670
    (void)len;
671
    (void)label;
672
#endif
673
674
0
#ifdef WOLFSSL_SMALL_STACK
675
0
    XFREE(seed, ssl->heap, DYNAMIC_TYPE_SEED);
676
0
#endif
677
678
0
    return ret;
679
0
}
680
681
/* return HMAC digest type in wolfSSL format */
682
int wolfSSL_GetHmacType(WOLFSSL* ssl)
683
0
{
684
0
    if (ssl == NULL)
685
0
        return BAD_FUNC_ARG;
686
687
0
    return wolfSSL_GetHmacType_ex(&ssl->specs);
688
0
}
689
690
691
int wolfSSL_SetTlsHmacInner(WOLFSSL* ssl, byte* inner, word32 sz, int content,
692
                           int verify)
693
0
{
694
0
    if (ssl == NULL || inner == NULL)
695
0
        return BAD_FUNC_ARG;
696
697
0
    XMEMSET(inner, 0, WOLFSSL_TLS_HMAC_INNER_SZ);
698
699
0
    WriteSEQ(ssl, verify, inner);
700
0
    inner[SEQ_SZ] = (byte)content;
701
0
    inner[SEQ_SZ + ENUM_LEN]            = ssl->version.major;
702
0
    inner[SEQ_SZ + ENUM_LEN + ENUM_LEN] = ssl->version.minor;
703
0
    c16toa((word16)sz, inner + SEQ_SZ + ENUM_LEN + VERSION_SZ);
704
705
0
    return 0;
706
0
}
707
708
709
#ifndef WOLFSSL_AEAD_ONLY
710
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
711
    !defined(HAVE_SELFTEST)
712
713
/* Update the hash in the HMAC.
714
 *
715
 * hmac  HMAC object.
716
 * data  Data to be hashed.
717
 * sz    Size of data to hash.
718
 * returns 0 on success, otherwise failure.
719
 */
720
static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz)
721
0
{
722
0
    int ret = BAD_FUNC_ARG;
723
724
0
    switch (hmac->macType) {
725
0
    #ifndef NO_SHA
726
0
        case WC_SHA:
727
0
            ret = wc_ShaUpdate(&hmac->hash.sha, data, sz);
728
0
            break;
729
0
    #endif /* !NO_SHA */
730
731
0
    #ifndef NO_SHA256
732
0
        case WC_SHA256:
733
0
            ret = wc_Sha256Update(&hmac->hash.sha256, data, sz);
734
0
            break;
735
0
    #endif /* !NO_SHA256 */
736
737
0
    #ifdef WOLFSSL_SHA384
738
0
        case WC_SHA384:
739
0
            ret = wc_Sha384Update(&hmac->hash.sha384, data, sz);
740
0
            break;
741
0
    #endif /* WOLFSSL_SHA384 */
742
743
0
    #ifdef WOLFSSL_SHA512
744
0
        case WC_SHA512:
745
0
            ret = wc_Sha512Update(&hmac->hash.sha512, data, sz);
746
0
            break;
747
0
    #endif /* WOLFSSL_SHA512 */
748
749
0
    #ifdef WOLFSSL_SM3
750
0
        case WC_SM3:
751
0
            ret = wc_Sm3Update(&hmac->hash.sm3, data, sz);
752
0
            break;
753
0
    #endif /* WOLFSSL_SM3 */
754
755
0
        default:
756
0
            break;
757
0
    }
758
759
0
    return ret;
760
0
}
761
762
/* Finalize the hash but don't put the EOC, padding or length in.
763
 *
764
 * hmac  HMAC object.
765
 * hash  Hash result.
766
 * returns 0 on success, otherwise failure.
767
 */
768
static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash)
769
0
{
770
0
    int ret = BAD_FUNC_ARG;
771
772
0
    switch (hmac->macType) {
773
0
    #ifndef NO_SHA
774
0
        case WC_SHA:
775
0
            ret = wc_ShaFinalRaw(&hmac->hash.sha, hash);
776
0
            break;
777
0
    #endif /* !NO_SHA */
778
779
0
    #ifndef NO_SHA256
780
0
        case WC_SHA256:
781
0
            ret = wc_Sha256FinalRaw(&hmac->hash.sha256, hash);
782
0
            break;
783
0
    #endif /* !NO_SHA256 */
784
785
0
    #ifdef WOLFSSL_SHA384
786
0
        case WC_SHA384:
787
0
            ret = wc_Sha384FinalRaw(&hmac->hash.sha384, hash);
788
0
            break;
789
0
    #endif /* WOLFSSL_SHA384 */
790
791
0
    #ifdef WOLFSSL_SHA512
792
0
        case WC_SHA512:
793
0
            ret = wc_Sha512FinalRaw(&hmac->hash.sha512, hash);
794
0
            break;
795
0
    #endif /* WOLFSSL_SHA512 */
796
797
0
    #ifdef WOLFSSL_SM3
798
0
        case WC_SM3:
799
0
            ret = wc_Sm3FinalRaw(&hmac->hash.sm3, hash);
800
0
            break;
801
0
    #endif /* WOLFSSL_SM3 */
802
803
0
        default:
804
0
            break;
805
0
    }
806
807
0
    return ret;
808
0
}
809
810
/* Finalize the HMAC by performing outer hash.
811
 *
812
 * hmac  HMAC object.
813
 * mac   MAC result.
814
 * returns 0 on success, otherwise failure.
815
 */
816
static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac)
817
0
{
818
0
    int ret = BAD_FUNC_ARG;
819
0
    wc_HashAlg hash;
820
0
    enum wc_HashType hashType = (enum wc_HashType)hmac->macType;
821
0
    int digestSz = wc_HashGetDigestSize(hashType);
822
0
    int blockSz = wc_HashGetBlockSize(hashType);
823
824
0
    if ((digestSz >= 0) && (blockSz >= 0)) {
825
0
        ret = wc_HashInit(&hash, hashType);
826
0
    }
827
0
    if (ret == 0) {
828
0
        ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->opad,
829
0
            blockSz);
830
0
        if (ret == 0)
831
0
            ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->innerHash,
832
0
                digestSz);
833
0
        if (ret == 0)
834
0
            ret = wc_HashFinal(&hash, hashType, mac);
835
0
        wc_HashFree(&hash, hashType);
836
0
    }
837
838
0
    return ret;
839
0
}
840
841
/* Calculate the HMAC of the header + message data.
842
 * Constant time implementation using wc_Sha*FinalRaw().
843
 *
844
 * hmac    HMAC object.
845
 * digest  MAC result.
846
 * in      Message data.
847
 * sz      Size of the message data.
848
 * header  Constructed record header with length of handshake data.
849
 * returns 0 on success, otherwise failure.
850
 */
851
static int Hmac_UpdateFinal_CT(Hmac* hmac, byte* digest, const byte* in,
852
                               word32 sz, int macLen, byte* header)
853
0
{
854
0
    byte         lenBytes[8];
855
0
    int          i, j;
856
0
    unsigned int k;
857
0
    int          blockBits, blockMask;
858
0
    int          lastBlockLen, extraLen, eocIndex;
859
0
    int          blocks, safeBlocks, lenBlock, eocBlock;
860
0
    unsigned int maxLen;
861
0
    int          blockSz, padSz;
862
0
    int          ret;
863
0
    word32       realLen;
864
0
    byte         extraBlock;
865
866
0
    switch (hmac->macType) {
867
0
    #ifndef NO_SHA
868
0
        case WC_SHA:
869
0
            blockSz = WC_SHA_BLOCK_SIZE;
870
0
            blockBits = 6;
871
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
872
0
            break;
873
0
    #endif /* !NO_SHA */
874
875
0
    #ifndef NO_SHA256
876
0
        case WC_SHA256:
877
0
            blockSz = WC_SHA256_BLOCK_SIZE;
878
0
            blockBits = 6;
879
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
880
0
            break;
881
0
    #endif /* !NO_SHA256 */
882
883
0
    #ifdef WOLFSSL_SHA384
884
0
        case WC_SHA384:
885
0
            blockSz = WC_SHA384_BLOCK_SIZE;
886
0
            blockBits = 7;
887
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
888
0
            break;
889
0
    #endif /* WOLFSSL_SHA384 */
890
891
0
    #ifdef WOLFSSL_SHA512
892
0
        case WC_SHA512:
893
0
            blockSz = WC_SHA512_BLOCK_SIZE;
894
0
            blockBits = 7;
895
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
896
0
            break;
897
0
    #endif /* WOLFSSL_SHA512 */
898
899
0
    #ifdef WOLFSSL_SM3
900
0
        case WC_SM3:
901
0
            blockSz = WC_SM3_BLOCK_SIZE;
902
0
            blockBits = 6;
903
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
904
0
            break;
905
0
    #endif /* WOLFSSL_SM3 */
906
907
0
        default:
908
0
            return BAD_FUNC_ARG;
909
0
    }
910
0
    blockMask = blockSz - 1;
911
912
    /* Size of data to HMAC if padding length byte is zero. */
913
0
    maxLen = WOLFSSL_TLS_HMAC_INNER_SZ + sz - 1 - macLen;
914
    /* Complete data (including padding) has block for EOC and/or length. */
915
0
    extraBlock = ctSetLTE((maxLen + padSz) & blockMask, padSz);
916
    /* Total number of blocks for data including padding. */
917
0
    blocks = ((maxLen + blockSz - 1) >> blockBits) + extraBlock;
918
    /* Up to last 6 blocks can be hashed safely. */
919
0
    safeBlocks = blocks - 6;
920
921
    /* Length of message data. */
922
0
    realLen = maxLen - in[sz - 1];
923
    /* Number of message bytes in last block. */
924
0
    lastBlockLen = realLen & blockMask;
925
    /* Number of padding bytes in last block. */
926
0
    extraLen = ((blockSz * 2 - padSz - lastBlockLen) & blockMask) + 1;
927
    /* Number of blocks to create for hash. */
928
0
    lenBlock = (realLen + extraLen) >> blockBits;
929
    /* Block containing EOC byte. */
930
0
    eocBlock = realLen >> blockBits;
931
    /* Index of EOC byte in block. */
932
0
    eocIndex = realLen & blockMask;
933
934
    /* Add length of hmac's ipad to total length. */
935
0
    realLen += blockSz;
936
    /* Length as bits - 8 bytes bigendian. */
937
0
    c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes);
938
0
    c32toa(realLen << 3, lenBytes + sizeof(word32));
939
940
0
    ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, blockSz);
941
0
    if (ret != 0)
942
0
        return ret;
943
944
0
    XMEMSET(hmac->innerHash, 0, macLen);
945
946
0
    if (safeBlocks > 0) {
947
0
        ret = Hmac_HashUpdate(hmac, header, WOLFSSL_TLS_HMAC_INNER_SZ);
948
0
        if (ret != 0)
949
0
            return ret;
950
0
        ret = Hmac_HashUpdate(hmac, in, safeBlocks * blockSz -
951
0
                                                     WOLFSSL_TLS_HMAC_INNER_SZ);
952
0
        if (ret != 0)
953
0
            return ret;
954
0
    }
955
0
    else
956
0
        safeBlocks = 0;
957
958
0
    XMEMSET(digest, 0, macLen);
959
0
    k = safeBlocks * blockSz;
960
0
    for (i = safeBlocks; i < blocks; i++) {
961
0
        unsigned char hashBlock[WC_MAX_BLOCK_SIZE];
962
0
        unsigned char isEocBlock = ctMaskEq(i, eocBlock);
963
0
        unsigned char isOutBlock = ctMaskEq(i, lenBlock);
964
965
0
        for (j = 0; j < blockSz; j++) {
966
0
            unsigned char atEoc = ctMaskEq(j, eocIndex) & isEocBlock;
967
0
            unsigned char pastEoc = ctMaskGT(j, eocIndex) & isEocBlock;
968
0
            unsigned char b = 0;
969
970
0
            if (k < WOLFSSL_TLS_HMAC_INNER_SZ)
971
0
                b = header[k];
972
0
            else if (k < maxLen)
973
0
                b = in[k - WOLFSSL_TLS_HMAC_INNER_SZ];
974
0
            k++;
975
976
0
            b = ctMaskSel(atEoc, 0x80, b);
977
0
            b &= (unsigned char)~(word32)pastEoc;
978
0
            b &= ((unsigned char)~(word32)isOutBlock) | isEocBlock;
979
980
0
            if (j >= blockSz - 8) {
981
0
                b = ctMaskSel(isOutBlock, lenBytes[j - (blockSz - 8)], b);
982
0
            }
983
984
0
            hashBlock[j] = b;
985
0
        }
986
987
0
        ret = Hmac_HashUpdate(hmac, hashBlock, blockSz);
988
0
        if (ret != 0)
989
0
            return ret;
990
0
        ret = Hmac_HashFinalRaw(hmac, hashBlock);
991
0
        if (ret != 0)
992
0
            return ret;
993
0
        for (j = 0; j < macLen; j++)
994
0
            ((unsigned char*)hmac->innerHash)[j] |= hashBlock[j] & isOutBlock;
995
0
    }
996
997
0
    ret = Hmac_OuterHash(hmac, digest);
998
999
0
    return ret;
1000
0
}
1001
1002
#endif
1003
1004
#if defined(WOLFSSL_NO_HASH_RAW) || defined(HAVE_FIPS) || \
1005
    defined(HAVE_SELFTEST) || defined(HAVE_BLAKE2)
1006
1007
/* Calculate the HMAC of the header + message data.
1008
 * Constant time implementation using normal hashing operations.
1009
 * Update-Final need to be constant time.
1010
 *
1011
 * hmac    HMAC object.
1012
 * digest  MAC result.
1013
 * in      Message data.
1014
 * sz      Size of the message data.
1015
 * header  Constructed record header with length of handshake data.
1016
 * returns 0 on success, otherwise failure.
1017
 */
1018
static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
1019
                            word32 sz, byte* header)
1020
0
{
1021
0
    byte       dummy[WC_MAX_BLOCK_SIZE] = {0};
1022
0
    int        ret = 0;
1023
0
    word32     msgSz, blockSz, macSz, padSz, maxSz, realSz;
1024
0
    word32     offset = 0;
1025
0
    int        msgBlocks, blocks, blockBits;
1026
0
    int        i;
1027
1028
0
    switch (hmac->macType) {
1029
0
    #ifndef NO_SHA
1030
0
        case WC_SHA:
1031
0
            blockSz = WC_SHA_BLOCK_SIZE;
1032
0
            blockBits = 6;
1033
0
            macSz = WC_SHA_DIGEST_SIZE;
1034
0
            padSz = WC_SHA_BLOCK_SIZE - WC_SHA_PAD_SIZE + 1;
1035
0
            break;
1036
0
    #endif /* !NO_SHA */
1037
1038
0
    #ifndef NO_SHA256
1039
0
        case WC_SHA256:
1040
0
            blockSz = WC_SHA256_BLOCK_SIZE;
1041
0
            blockBits = 6;
1042
0
            macSz = WC_SHA256_DIGEST_SIZE;
1043
0
            padSz = WC_SHA256_BLOCK_SIZE - WC_SHA256_PAD_SIZE + 1;
1044
0
            break;
1045
0
    #endif /* !NO_SHA256 */
1046
1047
0
    #ifdef WOLFSSL_SHA384
1048
0
        case WC_SHA384:
1049
0
            blockSz = WC_SHA384_BLOCK_SIZE;
1050
0
            blockBits = 7;
1051
0
            macSz = WC_SHA384_DIGEST_SIZE;
1052
0
            padSz = WC_SHA384_BLOCK_SIZE - WC_SHA384_PAD_SIZE + 1;
1053
0
            break;
1054
0
    #endif /* WOLFSSL_SHA384 */
1055
1056
0
    #ifdef WOLFSSL_SHA512
1057
0
        case WC_SHA512:
1058
0
            blockSz = WC_SHA512_BLOCK_SIZE;
1059
0
            blockBits = 7;
1060
0
            macSz = WC_SHA512_DIGEST_SIZE;
1061
0
            padSz = WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE + 1;
1062
0
            break;
1063
0
    #endif /* WOLFSSL_SHA512 */
1064
1065
0
    #ifdef HAVE_BLAKE2
1066
0
        case WC_HASH_TYPE_BLAKE2B:
1067
0
            blockSz = BLAKE2B_BLOCKBYTES;
1068
0
            blockBits = 7;
1069
0
            macSz = BLAKE2B_256;
1070
0
            padSz = 0;
1071
0
            break;
1072
0
    #endif /* HAVE_BLAKE2 */
1073
1074
0
    #ifdef WOLFSSL_SM3
1075
0
        case WC_SM3:
1076
0
            blockSz = WC_SM3_BLOCK_SIZE;
1077
0
            blockBits = 6;
1078
0
            macSz = WC_SM3_DIGEST_SIZE;
1079
0
            padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1;
1080
0
            break;
1081
0
    #endif
1082
1083
0
        default:
1084
0
            WOLFSSL_MSG("ERROR: Hmac_UpdateFinal failed, no hmac->macType");
1085
0
            return BAD_FUNC_ARG;
1086
0
    }
1087
1088
0
    msgSz = sz - (1 + in[sz - 1] + macSz);
1089
    /* Make negative result 0 */
1090
0
    msgSz &= ~(0 - (msgSz >> 31));
1091
0
    realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz;
1092
0
    maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz;
1093
    /* Make negative result 0 */
1094
0
    maxSz &= ~(0 - (maxSz >> 31));
1095
1096
    /* Calculate #blocks processed in HMAC for max and real data. */
1097
0
    blocks      = maxSz >> blockBits;
1098
0
    blocks     += ((maxSz + padSz) % blockSz) < padSz;
1099
0
    msgBlocks   = realSz >> blockBits;
1100
    /* #Extra blocks to process. */
1101
0
    blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0);
1102
    /* Calculate whole blocks. */
1103
0
    msgBlocks--;
1104
1105
0
    ret = wc_HmacUpdate(hmac, header, WOLFSSL_TLS_HMAC_INNER_SZ);
1106
0
    if (ret == 0) {
1107
        /* Fill the rest of the block with any available data. */
1108
0
        word32 currSz = ctMaskLT(msgSz, blockSz) & msgSz;
1109
0
        currSz |= ctMaskGTE(msgSz, blockSz) & blockSz;
1110
0
        currSz -= WOLFSSL_TLS_HMAC_INNER_SZ;
1111
0
        currSz &= ~(0 - (currSz >> 31));
1112
0
        ret = wc_HmacUpdate(hmac, in, currSz);
1113
0
        offset = currSz;
1114
0
    }
1115
0
    if (ret == 0) {
1116
        /* Do the hash operations on a block basis. */
1117
0
        for (i = 0; i < msgBlocks; i++, offset += blockSz) {
1118
0
            ret = wc_HmacUpdate(hmac, in + offset, blockSz);
1119
0
            if (ret != 0)
1120
0
                break;
1121
0
        }
1122
0
    }
1123
0
    if (ret == 0)
1124
0
        ret = wc_HmacUpdate(hmac, in + offset, msgSz - offset);
1125
0
    if (ret == 0)
1126
0
        ret = wc_HmacFinal(hmac, digest);
1127
0
    if (ret == 0) {
1128
        /* Do the dummy hash operations. Do at least one. */
1129
0
        for (i = 0; i < blocks + 1; i++) {
1130
0
            ret = wc_HmacUpdate(hmac, dummy, blockSz);
1131
0
            if (ret != 0)
1132
0
                break;
1133
0
        }
1134
0
    }
1135
1136
0
    return ret;
1137
0
}
1138
1139
#endif
1140
1141
int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
1142
             int content, int verify, int epochOrder)
1143
0
{
1144
0
    Hmac   hmac;
1145
0
    byte   myInner[WOLFSSL_TLS_HMAC_INNER_SZ];
1146
0
    int    ret = 0;
1147
0
    const byte* macSecret = NULL;
1148
0
    word32 hashSz = 0;
1149
1150
0
    if (ssl == NULL)
1151
0
        return BAD_FUNC_ARG;
1152
1153
#ifdef HAVE_TRUNCATED_HMAC
1154
    hashSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ
1155
                                        : ssl->specs.hash_size;
1156
#else
1157
0
    hashSz = ssl->specs.hash_size;
1158
0
#endif
1159
1160
#ifdef HAVE_FUZZER
1161
    /* Fuzz "in" buffer with sz to be used in HMAC algorithm */
1162
    if (ssl->fuzzerCb) {
1163
        if (verify && padSz >= 0) {
1164
            ssl->fuzzerCb(ssl, in, sz + hashSz + padSz + 1, FUZZ_HMAC,
1165
                          ssl->fuzzerCtx);
1166
        }
1167
        else {
1168
            ssl->fuzzerCb(ssl, in, sz, FUZZ_HMAC, ssl->fuzzerCtx);
1169
        }
1170
    }
1171
#endif
1172
1173
0
    if (!ssl->options.dtls)
1174
0
        wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
1175
0
    else
1176
0
        wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, epochOrder);
1177
1178
0
    ret = wc_HmacInit(&hmac, ssl->heap, ssl->devId);
1179
0
    if (ret != 0)
1180
0
        return ret;
1181
1182
1183
#ifdef WOLFSSL_DTLS
1184
    if (ssl->options.dtls)
1185
        macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
1186
    else
1187
        macSecret = wolfSSL_GetMacSecret(ssl, verify);
1188
#else
1189
0
    macSecret = wolfSSL_GetMacSecret(ssl, verify);
1190
0
#endif
1191
0
    ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
1192
0
                                              macSecret,
1193
0
                                              ssl->specs.hash_size);
1194
1195
0
    if (ret == 0) {
1196
        /* Constant time verification required. */
1197
0
        if (verify && padSz >= 0) {
1198
0
#if !defined(WOLFSSL_NO_HASH_RAW) && !defined(HAVE_FIPS) && \
1199
0
    !defined(HAVE_SELFTEST)
1200
0
    #ifdef HAVE_BLAKE2
1201
0
            if (wolfSSL_GetHmacType(ssl) == WC_HASH_TYPE_BLAKE2B) {
1202
0
                ret = Hmac_UpdateFinal(&hmac, digest, in,
1203
0
                                              sz + hashSz + padSz + 1, myInner);
1204
0
            }
1205
0
            else
1206
0
    #endif
1207
0
            {
1208
0
                ret = Hmac_UpdateFinal_CT(&hmac, digest, in,
1209
0
                                      sz + hashSz + padSz + 1, hashSz, myInner);
1210
0
            }
1211
#else
1212
            ret = Hmac_UpdateFinal(&hmac, digest, in, sz + hashSz + padSz + 1,
1213
                                                                       myInner);
1214
#endif
1215
0
        }
1216
0
        else {
1217
0
            ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner));
1218
0
            if (ret == 0)
1219
0
                ret = wc_HmacUpdate(&hmac, in, sz);                /* content */
1220
0
            if (ret == 0)
1221
0
                ret = wc_HmacFinal(&hmac, digest);
1222
0
        }
1223
0
    }
1224
1225
0
    wc_HmacFree(&hmac);
1226
1227
0
    return ret;
1228
0
}
1229
#endif /* WOLFSSL_AEAD_ONLY */
1230
1231
#endif /* !WOLFSSL_NO_TLS12 */
1232
1233
int wolfSSL_GetHmacType_ex(CipherSpecs* specs)
1234
0
{
1235
0
    if (specs == NULL)
1236
0
        return BAD_FUNC_ARG;
1237
1238
0
    switch (specs->mac_algorithm) {
1239
0
        #ifndef NO_MD5
1240
0
        case md5_mac:
1241
0
        {
1242
0
            return WC_MD5;
1243
0
        }
1244
0
        #endif
1245
0
        #ifndef NO_SHA256
1246
0
        case sha256_mac:
1247
0
        {
1248
0
            return WC_SHA256;
1249
0
        }
1250
0
        #endif
1251
0
        #ifdef WOLFSSL_SHA384
1252
0
        case sha384_mac:
1253
0
        {
1254
0
            return WC_SHA384;
1255
0
        }
1256
0
        #endif
1257
0
        #ifdef WOLFSSL_SM3
1258
0
        case sm3_mac:
1259
0
        {
1260
0
            return WC_SM3;
1261
0
        }
1262
0
        #endif
1263
0
        #ifndef NO_SHA
1264
0
        case sha_mac:
1265
0
        {
1266
0
            return WC_SHA;
1267
0
        }
1268
0
        #endif
1269
0
        #ifdef HAVE_BLAKE2
1270
0
        case blake2b_mac:
1271
0
        {
1272
0
            return BLAKE2B_ID;
1273
0
        }
1274
0
        #endif
1275
0
        default:
1276
0
        {
1277
0
            return WOLFSSL_FATAL_ERROR;
1278
0
        }
1279
0
    }
1280
0
}
1281
1282
#ifdef HAVE_TLS_EXTENSIONS
1283
1284
/**
1285
 * The TLSX semaphore is used to calculate the size of the extensions to be sent
1286
 * from one peer to another.
1287
 */
1288
1289
/** Supports up to 72 flags. Increase as needed. */
1290
#define SEMAPHORE_SIZE 9
1291
1292
/**
1293
 * Converts the extension type (id) to an index in the semaphore.
1294
 *
1295
 * Official reference for TLS extension types:
1296
 *   http://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xml
1297
 *
1298
 * Motivation:
1299
 *   Previously, we used the extension type itself as the index of that
1300
 *   extension in the semaphore as the extension types were declared
1301
 *   sequentially, but maintain a semaphore as big as the number of available
1302
 *   extensions is no longer an option since the release of renegotiation_info.
1303
 *
1304
 * How to update:
1305
 *   Assign extension types that extrapolate the number of available semaphores
1306
 *   to the first available index going backwards in the semaphore array.
1307
 *   When adding a new extension type that don't extrapolate the number of
1308
 *   available semaphores, check for a possible collision with with a
1309
 *   'remapped' extension type.
1310
 *
1311
 * Update TLSX_Parse for duplicate detection if more added above 62.
1312
 */
1313
static WC_INLINE word16 TLSX_ToSemaphore(word16 type)
1314
0
{
1315
0
    switch (type) {
1316
1317
0
        case TLSX_RENEGOTIATION_INFO: /* 0xFF01 */
1318
0
            return 63;
1319
#ifdef WOLFSSL_QUIC
1320
        case TLSX_KEY_QUIC_TP_PARAMS_DRAFT: /* 0xffa5 */
1321
            return 64;
1322
#endif
1323
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
1324
        case TLSX_ECH: /* 0xfe0d */
1325
            return 65;
1326
#endif
1327
0
        default:
1328
0
            if (type > 62) {
1329
                /* This message SHOULD only happens during the adding of
1330
                   new TLS extensions in which its IANA number overflows
1331
                   the current semaphore's range, or if its number already
1332
                   is assigned to be used by another extension.
1333
                   Use this check value for the new extension and decrement
1334
                   the check value by one. */
1335
0
                WOLFSSL_MSG("### TLSX semaphore collision or overflow detected!");
1336
0
            }
1337
0
    }
1338
1339
0
    return type;
1340
0
}
1341
1342
/** Checks if a specific light (tls extension) is not set in the semaphore. */
1343
#define IS_OFF(semaphore, light) \
1344
0
    (!(((semaphore)[(light) / 8] &  (byte) (0x01 << ((light) % 8)))))
1345
1346
/** Turn on a specific light (tls extension) in the semaphore. */
1347
/* the semaphore marks the extensions already written to the message */
1348
#define TURN_ON(semaphore, light) \
1349
0
    ((semaphore)[(light) / 8] |= (byte) (0x01 << ((light) % 8)))
1350
1351
/** Turn off a specific light (tls extension) in the semaphore. */
1352
#define TURN_OFF(semaphore, light) \
1353
0
    ((semaphore)[(light) / 8] &= (byte) ~(0x01 << ((light) % 8)))
1354
1355
/** Creates a new extension. */
1356
static TLSX* TLSX_New(TLSX_Type type, const void* data, void* heap)
1357
0
{
1358
0
    TLSX* extension = (TLSX*)XMALLOC(sizeof(TLSX), heap, DYNAMIC_TYPE_TLSX);
1359
1360
0
    (void)heap;
1361
1362
0
    if (extension) {
1363
0
        extension->type = type;
1364
0
        extension->data = (void*)data;
1365
0
        extension->resp = 0;
1366
0
        extension->next = NULL;
1367
0
    }
1368
1369
0
    return extension;
1370
0
}
1371
1372
/**
1373
 * Creates a new extension and appends it to the provided list.
1374
 * Checks for duplicate extensions, keeps the newest.
1375
 */
1376
int TLSX_Append(TLSX** list, TLSX_Type type, const void* data, void* heap)
1377
0
{
1378
0
    TLSX* extension = TLSX_New(type, data, heap);
1379
0
    TLSX* cur;
1380
0
    TLSX** prevNext = list;
1381
1382
0
    if (extension == NULL)
1383
0
        return MEMORY_E;
1384
1385
0
    for (cur = *list; cur != NULL;) {
1386
0
        if (cur->type == type) {
1387
0
            *prevNext = cur->next;
1388
0
            cur->next = NULL;
1389
0
            TLSX_FreeAll(cur, heap);
1390
0
            cur = *prevNext;
1391
0
        }
1392
0
        else {
1393
0
            prevNext = &cur->next;
1394
0
            cur = cur->next;
1395
0
        }
1396
0
    }
1397
1398
    /* Append the extension to the list */
1399
0
    *prevNext = extension;
1400
1401
0
    return 0;
1402
0
}
1403
1404
/**
1405
 * Creates a new extension and pushes it to the provided list.
1406
 * Checks for duplicate extensions, keeps the newest.
1407
 */
1408
int TLSX_Push(TLSX** list, TLSX_Type type, const void* data, void* heap)
1409
0
{
1410
0
    TLSX* extension = TLSX_New(type, data, heap);
1411
1412
0
    if (extension == NULL)
1413
0
        return MEMORY_E;
1414
1415
    /* pushes the new extension on the list. */
1416
0
    extension->next = *list;
1417
0
    *list = extension;
1418
1419
    /* remove duplicate extensions, there should be only one of each type. */
1420
0
    do {
1421
0
        if (extension->next && extension->next->type == type) {
1422
0
            TLSX *next = extension->next;
1423
1424
0
            extension->next = next->next;
1425
0
            next->next = NULL;
1426
1427
0
            TLSX_FreeAll(next, heap);
1428
1429
            /* there is no way to occur more than
1430
             * two extensions of the same type.
1431
             */
1432
0
            break;
1433
0
        }
1434
0
    } while ((extension = extension->next));
1435
1436
0
    return 0;
1437
0
}
1438
1439
#ifndef NO_WOLFSSL_CLIENT
1440
1441
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type);
1442
1443
int TLSX_CheckUnsupportedExtension(WOLFSSL* ssl, TLSX_Type type)
1444
0
{
1445
0
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1446
1447
0
    if (!extension)
1448
0
        extension = TLSX_Find(ssl->ctx->extensions, type);
1449
1450
0
    return extension == NULL;
1451
0
}
1452
1453
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl);
1454
1455
int TLSX_HandleUnsupportedExtension(WOLFSSL* ssl)
1456
0
{
1457
0
    SendAlert(ssl, alert_fatal, unsupported_extension);
1458
0
    WOLFSSL_ERROR_VERBOSE(UNSUPPORTED_EXTENSION);
1459
0
    return UNSUPPORTED_EXTENSION;
1460
0
}
1461
1462
#else
1463
1464
#define TLSX_CheckUnsupportedExtension(ssl, type) 0
1465
#define TLSX_HandleUnsupportedExtension(ssl) 0
1466
1467
#endif
1468
1469
#if !defined(NO_WOLFSSL_SERVER) || defined(WOLFSSL_TLS13)
1470
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type);
1471
/** Mark an extension to be sent back to the client. */
1472
void TLSX_SetResponse(WOLFSSL* ssl, TLSX_Type type)
1473
0
{
1474
0
    TLSX *extension = TLSX_Find(ssl->extensions, type);
1475
1476
0
    if (extension)
1477
0
        extension->resp = 1;
1478
0
}
1479
#endif
1480
1481
/******************************************************************************/
1482
/* Application-Layer Protocol Negotiation                                     */
1483
/******************************************************************************/
1484
1485
#ifdef HAVE_ALPN
1486
/** Creates a new ALPN object, providing protocol name to use. */
1487
static ALPN* TLSX_ALPN_New(char *protocol_name, word16 protocol_nameSz,
1488
                                                                     void* heap)
1489
{
1490
    ALPN *alpn;
1491
1492
    WOLFSSL_ENTER("TLSX_ALPN_New");
1493
1494
    if (protocol_name == NULL ||
1495
        protocol_nameSz > WOLFSSL_MAX_ALPN_PROTO_NAME_LEN) {
1496
        WOLFSSL_MSG("Invalid arguments");
1497
        return NULL;
1498
    }
1499
1500
    alpn = (ALPN*)XMALLOC(sizeof(ALPN), heap, DYNAMIC_TYPE_TLSX);
1501
    if (alpn == NULL) {
1502
        WOLFSSL_MSG("Memory failure");
1503
        return NULL;
1504
    }
1505
1506
    alpn->next = NULL;
1507
    alpn->negotiated = 0;
1508
    alpn->options = 0;
1509
1510
    alpn->protocol_name = (char*)XMALLOC(protocol_nameSz + 1,
1511
                                         heap, DYNAMIC_TYPE_TLSX);
1512
    if (alpn->protocol_name == NULL) {
1513
        WOLFSSL_MSG("Memory failure");
1514
        XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1515
        return NULL;
1516
    }
1517
1518
    XMEMCPY(alpn->protocol_name, protocol_name, protocol_nameSz);
1519
    alpn->protocol_name[protocol_nameSz] = 0;
1520
1521
    (void)heap;
1522
1523
    return alpn;
1524
}
1525
1526
/** Releases an ALPN object. */
1527
static void TLSX_ALPN_Free(ALPN *alpn, void* heap)
1528
{
1529
    (void)heap;
1530
1531
    if (alpn == NULL)
1532
        return;
1533
1534
    XFREE(alpn->protocol_name, heap, DYNAMIC_TYPE_TLSX);
1535
    XFREE(alpn, heap, DYNAMIC_TYPE_TLSX);
1536
}
1537
1538
/** Releases all ALPN objects in the provided list. */
1539
static void TLSX_ALPN_FreeAll(ALPN *list, void* heap)
1540
{
1541
    ALPN* alpn;
1542
1543
    while ((alpn = list)) {
1544
        list = alpn->next;
1545
        TLSX_ALPN_Free(alpn, heap);
1546
    }
1547
}
1548
1549
/** Tells the buffered size of the ALPN objects in a list. */
1550
static word16 TLSX_ALPN_GetSize(ALPN *list)
1551
{
1552
    ALPN* alpn;
1553
    word16 length = OPAQUE16_LEN; /* list length */
1554
1555
    while ((alpn = list)) {
1556
        list = alpn->next;
1557
1558
        length++; /* protocol name length is on one byte */
1559
        length += (word16)XSTRLEN(alpn->protocol_name);
1560
    }
1561
1562
    return length;
1563
}
1564
1565
/** Writes the ALPN objects of a list in a buffer. */
1566
static word16 TLSX_ALPN_Write(ALPN *list, byte *output)
1567
{
1568
    ALPN* alpn;
1569
    word16 length = 0;
1570
    word16 offset = OPAQUE16_LEN; /* list length offset */
1571
1572
    while ((alpn = list)) {
1573
        list = alpn->next;
1574
1575
        length = (word16)XSTRLEN(alpn->protocol_name);
1576
1577
        /* protocol name length */
1578
        output[offset++] = (byte)length;
1579
1580
        /* protocol name value */
1581
        XMEMCPY(output + offset, alpn->protocol_name, length);
1582
1583
        offset += length;
1584
    }
1585
1586
    /* writing list length */
1587
    c16toa(offset - OPAQUE16_LEN, output);
1588
1589
    return offset;
1590
}
1591
1592
/** Finds a protocol name in the provided ALPN list */
1593
static ALPN* TLSX_ALPN_Find(ALPN *list, char *protocol_name, word16 size)
1594
{
1595
    ALPN *alpn;
1596
1597
    if (list == NULL || protocol_name == NULL)
1598
        return NULL;
1599
1600
    alpn = list;
1601
    while (alpn != NULL && (
1602
           (word16)XSTRLEN(alpn->protocol_name) != size ||
1603
           XSTRNCMP(alpn->protocol_name, protocol_name, size)))
1604
        alpn = alpn->next;
1605
1606
    return alpn;
1607
}
1608
1609
/** Set the ALPN matching client and server requirements */
1610
static int TLSX_SetALPN(TLSX** extensions, const void* data, word16 size,
1611
                                                                     void* heap)
1612
{
1613
    ALPN *alpn;
1614
    int  ret;
1615
1616
    if (extensions == NULL || data == NULL)
1617
        return BAD_FUNC_ARG;
1618
1619
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1620
    if (alpn == NULL) {
1621
        WOLFSSL_MSG("Memory failure");
1622
        return MEMORY_E;
1623
    }
1624
1625
    alpn->negotiated = 1;
1626
1627
    ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL, (void*)alpn,
1628
                                                                          heap);
1629
    if (ret != 0) {
1630
        TLSX_ALPN_Free(alpn, heap);
1631
        return ret;
1632
    }
1633
1634
    return WOLFSSL_SUCCESS;
1635
}
1636
1637
static int ALPN_find_match(WOLFSSL *ssl, TLSX **pextension,
1638
                           const byte **psel, byte *psel_len,
1639
                           const byte *alpn_val, word16 alpn_val_len)
1640
{
1641
    TLSX    *extension;
1642
    ALPN    *alpn, *list;
1643
    const byte *sel = NULL, *s;
1644
    byte sel_len = 0, wlen;
1645
1646
    extension = TLSX_Find(ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1647
    if (extension == NULL)
1648
        extension = TLSX_Find(ssl->ctx->extensions,
1649
                              TLSX_APPLICATION_LAYER_PROTOCOL);
1650
1651
    /* No ALPN configured here */
1652
    if (extension == NULL || extension->data == NULL) {
1653
        *pextension = NULL;
1654
        *psel = NULL;
1655
        *psel_len = 0;
1656
        return 0;
1657
    }
1658
1659
    list = (ALPN*)extension->data;
1660
    for (s = alpn_val;
1661
         (s - alpn_val) < alpn_val_len;
1662
         s += wlen) {
1663
        wlen = *s++; /* bounds already checked on save */
1664
        alpn = TLSX_ALPN_Find(list, (char*)s, wlen);
1665
        if (alpn != NULL) {
1666
            WOLFSSL_MSG("ALPN protocol match");
1667
            sel = s,
1668
            sel_len = wlen;
1669
            break;
1670
        }
1671
    }
1672
1673
    if (sel == NULL) {
1674
        WOLFSSL_MSG("No ALPN protocol match");
1675
1676
        /* do nothing if no protocol match between client and server and option
1677
         is set to continue (like OpenSSL) */
1678
        if (list->options & WOLFSSL_ALPN_CONTINUE_ON_MISMATCH) {
1679
            WOLFSSL_MSG("Continue on mismatch");
1680
        }
1681
        else {
1682
            SendAlert(ssl, alert_fatal, no_application_protocol);
1683
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1684
            return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1685
        }
1686
    }
1687
1688
    *pextension = extension;
1689
    *psel = sel;
1690
    *psel_len = sel_len;
1691
    return 0;
1692
}
1693
1694
int ALPN_Select(WOLFSSL *ssl)
1695
{
1696
    TLSX *extension;
1697
    const byte *sel = NULL;
1698
    byte sel_len = 0;
1699
    int r = 0;
1700
1701
    WOLFSSL_ENTER("ALPN_Select");
1702
    if (ssl->alpn_peer_requested == NULL)
1703
        return 0;
1704
1705
#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY)
1706
    if (ssl->alpnSelect != NULL && ssl->options.side == WOLFSSL_SERVER_END) {
1707
        r = ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested,
1708
                ssl->alpn_peer_requested_length, ssl->alpnSelectArg);
1709
        switch (r) {
1710
            case SSL_TLSEXT_ERR_OK:
1711
                WOLFSSL_MSG("ALPN protocol match");
1712
                break;
1713
            case SSL_TLSEXT_ERR_NOACK:
1714
                WOLFSSL_MSG("ALPN cb no match but not fatal");
1715
                sel = NULL;
1716
                sel_len = 0;
1717
                break;
1718
            case SSL_TLSEXT_ERR_ALERT_FATAL:
1719
            default:
1720
                WOLFSSL_MSG("ALPN cb no match and fatal");
1721
                SendAlert(ssl, alert_fatal, no_application_protocol);
1722
                WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E);
1723
                return UNKNOWN_ALPN_PROTOCOL_NAME_E;
1724
        }
1725
    }
1726
    else
1727
#endif
1728
    {
1729
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len,
1730
                            ssl->alpn_peer_requested,
1731
                            ssl->alpn_peer_requested_length);
1732
        if (r != 0)
1733
            return r;
1734
    }
1735
1736
    if (sel != NULL) {
1737
        /* set the matching negotiated protocol */
1738
        r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
1739
        if (r != WOLFSSL_SUCCESS) {
1740
            WOLFSSL_MSG("TLSX_SetALPN failed");
1741
            return BUFFER_ERROR;
1742
        }
1743
        /* reply to ALPN extension sent from peer */
1744
#ifndef NO_WOLFSSL_SERVER
1745
        TLSX_SetResponse(ssl, TLSX_APPLICATION_LAYER_PROTOCOL);
1746
#endif
1747
    }
1748
    return 0;
1749
}
1750
1751
/** Parses a buffer of ALPN extensions and set the first one matching
1752
 * client and server requirements */
1753
static int TLSX_ALPN_ParseAndSet(WOLFSSL *ssl, const byte *input, word16 length,
1754
                                 byte isRequest)
1755
{
1756
    word16  size = 0, offset = 0, wlen;
1757
    int     r = BUFFER_ERROR;
1758
    const byte *s;
1759
1760
    if (OPAQUE16_LEN > length)
1761
        return BUFFER_ERROR;
1762
1763
    ato16(input, &size);
1764
    offset += OPAQUE16_LEN;
1765
1766
    /* validating alpn list length */
1767
    if (size == 0 || length != OPAQUE16_LEN + size)
1768
        return BUFFER_ERROR;
1769
1770
    /* validating length of entries before accepting */
1771
    for (s = input + offset; (s - input) < size; s += wlen) {
1772
        wlen = *s++;
1773
        if (wlen == 0 || (s + wlen - input) > length)
1774
            return BUFFER_ERROR;
1775
    }
1776
1777
    if (isRequest) {
1778
        /* keep the list sent by peer, if this is from a request. We
1779
         * use it later in ALPN_Select() for evaluation. */
1780
        if (ssl->alpn_peer_requested != NULL) {
1781
            XFREE(ssl->alpn_peer_requested, ssl->heap, DYNAMIC_TYPE_ALPN);
1782
            ssl->alpn_peer_requested_length = 0;
1783
        }
1784
        ssl->alpn_peer_requested = (byte *)XMALLOC(size, ssl->heap,
1785
                                                   DYNAMIC_TYPE_ALPN);
1786
        if (ssl->alpn_peer_requested == NULL) {
1787
            return MEMORY_ERROR;
1788
        }
1789
        ssl->alpn_peer_requested_length = size;
1790
        XMEMCPY(ssl->alpn_peer_requested, (char*)input + offset, size);
1791
    }
1792
    else {
1793
        /* a response, we should find the value in our config */
1794
        const byte *sel = NULL;
1795
        byte sel_len = 0;
1796
        TLSX *extension = NULL;
1797
1798
        r = ALPN_find_match(ssl, &extension, &sel, &sel_len, input + offset, size);
1799
        if (r != 0)
1800
            return r;
1801
1802
        if (sel != NULL) {
1803
            /* set the matching negotiated protocol */
1804
            r = TLSX_SetALPN(&ssl->extensions, sel, sel_len, ssl->heap);
1805
            if (r != WOLFSSL_SUCCESS) {
1806
                WOLFSSL_MSG("TLSX_SetALPN failed");
1807
                return BUFFER_ERROR;
1808
            }
1809
        }
1810
        /* If we had nothing configured, the response is unexpected */
1811
        else if (extension == NULL) {
1812
            r = TLSX_HandleUnsupportedExtension(ssl);
1813
            if (r != 0)
1814
                return r;
1815
        }
1816
    }
1817
    return 0;
1818
}
1819
1820
/** Add a protocol name to the list of accepted usable ones */
1821
int TLSX_UseALPN(TLSX** extensions, const void* data, word16 size, byte options,
1822
                                                                     void* heap)
1823
{
1824
    ALPN *alpn;
1825
    TLSX *extension;
1826
    int  ret;
1827
1828
    if (extensions == NULL || data == NULL)
1829
        return BAD_FUNC_ARG;
1830
1831
    alpn = TLSX_ALPN_New((char *)data, size, heap);
1832
    if (alpn == NULL) {
1833
        WOLFSSL_MSG("Memory failure");
1834
        return MEMORY_E;
1835
    }
1836
1837
    /* Set Options of ALPN */
1838
    alpn->options = options;
1839
1840
    extension = TLSX_Find(*extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1841
    if (extension == NULL) {
1842
        ret = TLSX_Push(extensions, TLSX_APPLICATION_LAYER_PROTOCOL,
1843
                                                             (void*)alpn, heap);
1844
        if (ret != 0) {
1845
            TLSX_ALPN_Free(alpn, heap);
1846
            return ret;
1847
        }
1848
    }
1849
    else {
1850
        /* push new ALPN object to extension data. */
1851
        alpn->next = (ALPN*)extension->data;
1852
        extension->data = (void*)alpn;
1853
    }
1854
1855
    return WOLFSSL_SUCCESS;
1856
}
1857
1858
/** Get the protocol name set by the server */
1859
int TLSX_ALPN_GetRequest(TLSX* extensions, void** data, word16 *dataSz)
1860
{
1861
    TLSX *extension;
1862
    ALPN *alpn;
1863
1864
    if (extensions == NULL || data == NULL || dataSz == NULL)
1865
        return BAD_FUNC_ARG;
1866
1867
    *data = NULL;
1868
    *dataSz = 0;
1869
1870
    extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL);
1871
    if (extension == NULL) {
1872
        WOLFSSL_MSG("TLS extension not found");
1873
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
1874
        return WOLFSSL_ALPN_NOT_FOUND;
1875
    }
1876
1877
    alpn = (ALPN *)extension->data;
1878
    if (alpn == NULL) {
1879
        WOLFSSL_MSG("ALPN extension not found");
1880
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
1881
        return WOLFSSL_FATAL_ERROR;
1882
    }
1883
1884
    if (alpn->negotiated != 1) {
1885
1886
        /* consider as an error */
1887
        if (alpn->options & WOLFSSL_ALPN_FAILED_ON_MISMATCH) {
1888
            WOLFSSL_MSG("No protocol match with peer -> Failed");
1889
            WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
1890
            return WOLFSSL_FATAL_ERROR;
1891
        }
1892
1893
        /* continue without negotiated protocol */
1894
        WOLFSSL_MSG("No protocol match with peer -> Continue");
1895
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_ALPN_NOT_FOUND);
1896
        return WOLFSSL_ALPN_NOT_FOUND;
1897
    }
1898
1899
    if (alpn->next != NULL) {
1900
        WOLFSSL_MSG("Only one protocol name must be accepted");
1901
        WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR);
1902
        return WOLFSSL_FATAL_ERROR;
1903
    }
1904
1905
    *data = alpn->protocol_name;
1906
    *dataSz = (word16)XSTRLEN((char*)*data);
1907
1908
    return WOLFSSL_SUCCESS;
1909
}
1910
1911
#define ALPN_FREE_ALL     TLSX_ALPN_FreeAll
1912
#define ALPN_GET_SIZE     TLSX_ALPN_GetSize
1913
#define ALPN_WRITE        TLSX_ALPN_Write
1914
#define ALPN_PARSE        TLSX_ALPN_ParseAndSet
1915
1916
#else /* HAVE_ALPN */
1917
1918
0
#define ALPN_FREE_ALL(list, heap) WC_DO_NOTHING
1919
0
#define ALPN_GET_SIZE(list)     0
1920
0
#define ALPN_WRITE(a, b)        0
1921
0
#define ALPN_PARSE(a, b, c, d)  0
1922
1923
#endif /* HAVE_ALPN */
1924
1925
/******************************************************************************/
1926
/* Server Name Indication                                                     */
1927
/******************************************************************************/
1928
1929
#ifdef HAVE_SNI
1930
1931
/** Creates a new SNI object. */
1932
static SNI* TLSX_SNI_New(byte type, const void* data, word16 size, void* heap)
1933
0
{
1934
0
    SNI* sni = (SNI*)XMALLOC(sizeof(SNI), heap, DYNAMIC_TYPE_TLSX);
1935
1936
0
    (void)heap;
1937
1938
0
    if (sni) {
1939
0
        sni->type = type;
1940
0
        sni->next = NULL;
1941
1942
0
    #ifndef NO_WOLFSSL_SERVER
1943
0
        sni->options = 0;
1944
0
        sni->status  = WOLFSSL_SNI_NO_MATCH;
1945
0
    #endif
1946
1947
0
        switch (sni->type) {
1948
0
            case WOLFSSL_SNI_HOST_NAME:
1949
0
                sni->data.host_name = (char*)XMALLOC(size + 1, heap,
1950
0
                                                     DYNAMIC_TYPE_TLSX);
1951
0
                if (sni->data.host_name) {
1952
0
                    XSTRNCPY(sni->data.host_name, (const char*)data, size);
1953
0
                    sni->data.host_name[size] = '\0';
1954
0
                } else {
1955
0
                    XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
1956
0
                    sni = NULL;
1957
0
                }
1958
0
            break;
1959
1960
0
            default: /* invalid type */
1961
0
                XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
1962
0
                sni = NULL;
1963
0
        }
1964
0
    }
1965
1966
0
    return sni;
1967
0
}
1968
1969
/** Releases a SNI object. */
1970
static void TLSX_SNI_Free(SNI* sni, void* heap)
1971
0
{
1972
0
    if (sni) {
1973
0
        switch (sni->type) {
1974
0
            case WOLFSSL_SNI_HOST_NAME:
1975
0
                XFREE(sni->data.host_name, heap, DYNAMIC_TYPE_TLSX);
1976
0
            break;
1977
0
        }
1978
1979
0
        XFREE(sni, heap, DYNAMIC_TYPE_TLSX);
1980
0
    }
1981
0
    (void)heap;
1982
0
}
1983
1984
/** Releases all SNI objects in the provided list. */
1985
static void TLSX_SNI_FreeAll(SNI* list, void* heap)
1986
0
{
1987
0
    SNI* sni;
1988
1989
0
    while ((sni = list)) {
1990
0
        list = sni->next;
1991
0
        TLSX_SNI_Free(sni, heap);
1992
0
    }
1993
0
}
1994
1995
/** Tells the buffered size of the SNI objects in a list. */
1996
static word16 TLSX_SNI_GetSize(SNI* list)
1997
0
{
1998
0
    SNI* sni;
1999
0
    word16 length = OPAQUE16_LEN; /* list length */
2000
2001
0
    while ((sni = list)) {
2002
0
        list = sni->next;
2003
2004
0
        length += ENUM_LEN + OPAQUE16_LEN; /* sni type + sni length */
2005
2006
0
        switch (sni->type) {
2007
0
            case WOLFSSL_SNI_HOST_NAME:
2008
0
                length += (word16)XSTRLEN((char*)sni->data.host_name);
2009
0
            break;
2010
0
        }
2011
0
    }
2012
2013
0
    return length;
2014
0
}
2015
2016
/** Writes the SNI objects of a list in a buffer. */
2017
static word16 TLSX_SNI_Write(SNI* list, byte* output)
2018
0
{
2019
0
    SNI* sni;
2020
0
    word16 length = 0;
2021
0
    word16 offset = OPAQUE16_LEN; /* list length offset */
2022
2023
0
    while ((sni = list)) {
2024
0
        list = sni->next;
2025
2026
0
        output[offset++] = sni->type; /* sni type */
2027
2028
0
        switch (sni->type) {
2029
0
            case WOLFSSL_SNI_HOST_NAME:
2030
0
                length = (word16)XSTRLEN((char*)sni->data.host_name);
2031
2032
0
                c16toa(length, output + offset); /* sni length */
2033
0
                offset += OPAQUE16_LEN;
2034
2035
0
                XMEMCPY(output + offset, sni->data.host_name, length);
2036
2037
0
                offset += length;
2038
0
            break;
2039
0
        }
2040
0
    }
2041
2042
0
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2043
2044
0
    return offset;
2045
0
}
2046
2047
/** Finds a SNI object in the provided list. */
2048
static SNI* TLSX_SNI_Find(SNI *list, byte type)
2049
0
{
2050
0
    SNI* sni = list;
2051
2052
0
    while (sni && sni->type != type)
2053
0
        sni = sni->next;
2054
2055
0
    return sni;
2056
0
}
2057
2058
#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER))
2059
/** Sets the status of a SNI object. */
2060
static void TLSX_SNI_SetStatus(TLSX* extensions, byte type, byte status)
2061
0
{
2062
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2063
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2064
2065
0
    if (sni)
2066
0
        sni->status = status;
2067
0
}
2068
#endif
2069
2070
/** Gets the status of a SNI object. */
2071
byte TLSX_SNI_Status(TLSX* extensions, byte type)
2072
0
{
2073
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2074
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2075
2076
0
    if (sni)
2077
0
        return sni->status;
2078
2079
0
    return 0;
2080
0
}
2081
2082
/** Parses a buffer of SNI extensions. */
2083
static int TLSX_SNI_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2084
                          byte isRequest)
2085
0
{
2086
0
#ifndef NO_WOLFSSL_SERVER
2087
0
    word16 size = 0;
2088
0
    word16 offset = 0;
2089
0
    int cacheOnly = 0;
2090
0
    SNI *sni = NULL;
2091
0
    byte type;
2092
0
    byte matched;
2093
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2094
    WOLFSSL_ECH* ech = NULL;
2095
    WOLFSSL_EchConfig* workingConfig;
2096
    TLSX* echX;
2097
#endif
2098
0
#endif /* !NO_WOLFSSL_SERVER */
2099
0
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
2100
2101
0
    if (!extension)
2102
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2103
2104
0
    if (!isRequest) {
2105
0
        #ifndef NO_WOLFSSL_CLIENT
2106
0
            if (!extension || !extension->data)
2107
0
                return TLSX_HandleUnsupportedExtension(ssl);
2108
2109
0
            if (length > 0)
2110
0
                return BUFFER_ERROR; /* SNI response MUST be empty. */
2111
2112
            /* This call enables wolfSSL_SNI_GetRequest() to be called in the
2113
             * client side to fetch the used SNI. It will only work if the SNI
2114
             * was set at the SSL object level. Right now we only support one
2115
             * name type, WOLFSSL_SNI_HOST_NAME, but in the future, the
2116
             * inclusion of other name types will turn this method inaccurate,
2117
             * as the extension response doesn't contains information of which
2118
             * name was accepted.
2119
             */
2120
0
            TLSX_SNI_SetStatus(ssl->extensions, WOLFSSL_SNI_HOST_NAME,
2121
0
                                                        WOLFSSL_SNI_REAL_MATCH);
2122
2123
0
            return 0;
2124
0
        #endif
2125
0
    }
2126
2127
0
#ifndef NO_WOLFSSL_SERVER
2128
0
    if (!extension || !extension->data) {
2129
        /* This will keep SNI even though TLSX_UseSNI has not been called.
2130
         * Enable it so that the received sni is available to functions
2131
         * that use a custom callback when SNI is received.
2132
         */
2133
    #ifdef WOLFSSL_ALWAYS_KEEP_SNI
2134
        cacheOnly = 1;
2135
    #endif
2136
0
        if (ssl->ctx->sniRecvCb) {
2137
0
            cacheOnly = 1;
2138
0
        }
2139
2140
0
        if (cacheOnly) {
2141
0
            WOLFSSL_MSG("Forcing SSL object to store SNI parameter");
2142
0
        }
2143
0
        else {
2144
            /* Skipping, SNI not enabled at server side. */
2145
0
            return 0;
2146
0
        }
2147
0
    }
2148
2149
0
    if (OPAQUE16_LEN > length)
2150
0
        return BUFFER_ERROR;
2151
2152
0
    ato16(input, &size);
2153
0
    offset += OPAQUE16_LEN;
2154
2155
    /* validating sni list length */
2156
0
    if (length != OPAQUE16_LEN + size || size == 0)
2157
0
        return BUFFER_ERROR;
2158
2159
    /* SNI was badly specified and only one type is now recognized and allowed.
2160
     * Only one SNI value per type (RFC6066), so, no loop. */
2161
0
    type = input[offset++];
2162
0
    if (type != WOLFSSL_SNI_HOST_NAME)
2163
0
        return BUFFER_ERROR;
2164
2165
0
    if (offset + OPAQUE16_LEN > length)
2166
0
        return BUFFER_ERROR;
2167
0
    ato16(input + offset, &size);
2168
0
    offset += OPAQUE16_LEN;
2169
2170
0
    if (offset + size != length || size == 0)
2171
0
        return BUFFER_ERROR;
2172
2173
0
    if (!cacheOnly && !(sni = TLSX_SNI_Find((SNI*)extension->data, type)))
2174
0
        return 0; /* not using this type of SNI. */
2175
2176
0
#ifdef WOLFSSL_TLS13
2177
    /* Don't process the second ClientHello SNI extension if there
2178
     * was problems with the first.
2179
     */
2180
0
    if (!cacheOnly && sni->status != 0)
2181
0
        return 0;
2182
0
#endif
2183
0
    matched = cacheOnly || (XSTRLEN(sni->data.host_name) == size &&
2184
0
         XSTRNCMP(sni->data.host_name, (const char*)input + offset, size) == 0);
2185
2186
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
2187
    echX = TLSX_Find(ssl->extensions, TLSX_ECH);
2188
    if (echX != NULL)
2189
        ech = (WOLFSSL_ECH*)(echX->data);
2190
2191
    if (!matched && ech != NULL) {
2192
        workingConfig = ech->echConfig;
2193
2194
        while (workingConfig != NULL) {
2195
            matched = XSTRLEN(workingConfig->publicName) == size &&
2196
                XSTRNCMP(workingConfig->publicName,
2197
                (const char*)input + offset, size) == 0;
2198
2199
            if (matched)
2200
                break;
2201
2202
            workingConfig = workingConfig->next;
2203
        }
2204
    }
2205
#endif
2206
2207
0
    if (matched || sni->options & WOLFSSL_SNI_ANSWER_ON_MISMATCH) {
2208
0
        int matchStat;
2209
0
        int r = TLSX_UseSNI(&ssl->extensions, type, input + offset, size,
2210
0
                                                                     ssl->heap);
2211
0
        if (r != WOLFSSL_SUCCESS)
2212
0
            return r; /* throws error. */
2213
2214
0
        if (cacheOnly) {
2215
0
            WOLFSSL_MSG("Forcing storage of SNI, Fake match");
2216
0
            matchStat = WOLFSSL_SNI_FORCE_KEEP;
2217
0
        }
2218
0
        else if (matched) {
2219
0
            WOLFSSL_MSG("SNI did match!");
2220
0
            matchStat = WOLFSSL_SNI_REAL_MATCH;
2221
0
        }
2222
0
        else {
2223
0
            WOLFSSL_MSG("fake SNI match from ANSWER_ON_MISMATCH");
2224
0
            matchStat = WOLFSSL_SNI_FAKE_MATCH;
2225
0
        }
2226
2227
0
        TLSX_SNI_SetStatus(ssl->extensions, type, (byte)matchStat);
2228
2229
0
        if (!cacheOnly)
2230
0
            TLSX_SetResponse(ssl, TLSX_SERVER_NAME);
2231
0
    }
2232
0
    else if (!(sni->options & WOLFSSL_SNI_CONTINUE_ON_MISMATCH)) {
2233
0
        SendAlert(ssl, alert_fatal, unrecognized_name);
2234
0
        WOLFSSL_ERROR_VERBOSE(UNKNOWN_SNI_HOST_NAME_E);
2235
0
        return UNKNOWN_SNI_HOST_NAME_E;
2236
0
    }
2237
#else
2238
    (void)input;
2239
#endif /* !NO_WOLFSSL_SERVER */
2240
2241
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
2242
    (void)length;
2243
#endif
2244
2245
0
    return 0;
2246
0
}
2247
2248
static int TLSX_SNI_VerifyParse(WOLFSSL* ssl,  byte isRequest)
2249
0
{
2250
0
    (void)ssl;
2251
2252
0
    if (isRequest) {
2253
0
    #ifndef NO_WOLFSSL_SERVER
2254
0
        TLSX* ctx_ext = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
2255
0
        TLSX* ssl_ext = TLSX_Find(ssl->extensions,      TLSX_SERVER_NAME);
2256
0
        SNI* ctx_sni = ctx_ext ? (SNI*)ctx_ext->data : NULL;
2257
0
        SNI* ssl_sni = ssl_ext ? (SNI*)ssl_ext->data : NULL;
2258
0
        SNI* sni = NULL;
2259
2260
0
        for (; ctx_sni; ctx_sni = ctx_sni->next) {
2261
0
            if (ctx_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2262
0
                sni = TLSX_SNI_Find(ssl_sni, ctx_sni->type);
2263
2264
0
                if (sni) {
2265
0
                    if (sni->status != WOLFSSL_SNI_NO_MATCH)
2266
0
                        continue;
2267
2268
                    /* if ssl level overrides ctx level, it is ok. */
2269
0
                    if ((sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) == 0)
2270
0
                        continue;
2271
0
                }
2272
2273
0
                SendAlert(ssl, alert_fatal, handshake_failure);
2274
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2275
0
                return SNI_ABSENT_ERROR;
2276
0
            }
2277
0
        }
2278
2279
0
        for (; ssl_sni; ssl_sni = ssl_sni->next) {
2280
0
            if (ssl_sni->options & WOLFSSL_SNI_ABORT_ON_ABSENCE) {
2281
0
                if (ssl_sni->status != WOLFSSL_SNI_NO_MATCH)
2282
0
                    continue;
2283
2284
0
                SendAlert(ssl, alert_fatal, handshake_failure);
2285
0
                WOLFSSL_ERROR_VERBOSE(SNI_ABSENT_ERROR);
2286
0
                return SNI_ABSENT_ERROR;
2287
0
            }
2288
0
        }
2289
0
    #endif /* NO_WOLFSSL_SERVER */
2290
0
    }
2291
2292
0
    return 0;
2293
0
}
2294
2295
int TLSX_UseSNI(TLSX** extensions, byte type, const void* data, word16 size,
2296
                                                                     void* heap)
2297
0
{
2298
0
    TLSX* extension;
2299
0
    SNI* sni = NULL;
2300
2301
0
    if (extensions == NULL || data == NULL)
2302
0
        return BAD_FUNC_ARG;
2303
2304
0
    if ((sni = TLSX_SNI_New(type, data, size, heap)) == NULL)
2305
0
        return MEMORY_E;
2306
2307
0
    extension = TLSX_Find(*extensions, TLSX_SERVER_NAME);
2308
0
    if (!extension) {
2309
0
        int ret = TLSX_Push(extensions, TLSX_SERVER_NAME, (void*)sni, heap);
2310
2311
0
        if (ret != 0) {
2312
0
            TLSX_SNI_Free(sni, heap);
2313
0
            return ret;
2314
0
        }
2315
0
    }
2316
0
    else {
2317
        /* push new SNI object to extension data. */
2318
0
        sni->next = (SNI*)extension->data;
2319
0
        extension->data = (void*)sni;
2320
2321
        /* remove duplicate SNI, there should be only one of each type. */
2322
0
        do {
2323
0
            if (sni->next && sni->next->type == type) {
2324
0
                SNI* next = sni->next;
2325
2326
0
                sni->next = next->next;
2327
0
                TLSX_SNI_Free(next, heap);
2328
2329
                /* there is no way to occur more than
2330
                 * two SNIs of the same type.
2331
                 */
2332
0
                break;
2333
0
            }
2334
0
        } while ((sni = sni->next));
2335
0
    }
2336
2337
0
    return WOLFSSL_SUCCESS;
2338
0
}
2339
2340
#ifndef NO_WOLFSSL_SERVER
2341
2342
/** Tells the SNI requested by the client. */
2343
word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data)
2344
0
{
2345
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2346
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2347
2348
0
    if (sni && sni->status != WOLFSSL_SNI_NO_MATCH) {
2349
0
        switch (sni->type) {
2350
0
            case WOLFSSL_SNI_HOST_NAME:
2351
0
                if (data) {
2352
0
                    *data = sni->data.host_name;
2353
0
                    return (word16)XSTRLEN((char*)*data);
2354
0
                }
2355
0
        }
2356
0
    }
2357
2358
0
    return 0;
2359
0
}
2360
2361
/** Sets the options for a SNI object. */
2362
void TLSX_SNI_SetOptions(TLSX* extensions, byte type, byte options)
2363
0
{
2364
0
    TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME);
2365
0
    SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type);
2366
2367
0
    if (sni)
2368
0
        sni->options = options;
2369
0
}
2370
2371
/** Retrieves a SNI request from a client hello buffer. */
2372
int TLSX_SNI_GetFromBuffer(const byte* clientHello, word32 helloSz,
2373
                           byte type, byte* sni, word32* inOutSz)
2374
0
{
2375
0
    word32 offset = 0;
2376
0
    word32 len32 = 0;
2377
0
    word16 len16 = 0;
2378
2379
0
    if (helloSz < RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + CLIENT_HELLO_FIRST)
2380
0
        return INCOMPLETE_DATA;
2381
2382
    /* TLS record header */
2383
0
    if ((enum ContentType) clientHello[offset++] != handshake) {
2384
2385
        /* checking for SSLv2.0 client hello according to: */
2386
        /* http://tools.ietf.org/html/rfc4346#appendix-E.1 */
2387
0
        if ((enum HandShakeType) clientHello[++offset] == client_hello) {
2388
0
            offset += ENUM_LEN + VERSION_SZ; /* skip version */
2389
2390
0
            ato16(clientHello + offset, &len16);
2391
0
            offset += OPAQUE16_LEN;
2392
2393
0
            if (len16 % 3) /* cipher_spec_length must be multiple of 3 */
2394
0
                return BUFFER_ERROR;
2395
2396
0
            ato16(clientHello + offset, &len16);
2397
            /* Returning SNI_UNSUPPORTED do not increment offset here */
2398
2399
0
            if (len16 != 0) /* session_id_length must be 0 */
2400
0
                return BUFFER_ERROR;
2401
2402
0
            WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2403
0
            return SNI_UNSUPPORTED;
2404
0
        }
2405
2406
0
        return BUFFER_ERROR;
2407
0
    }
2408
2409
0
    if (clientHello[offset++] != SSLv3_MAJOR)
2410
0
        return BUFFER_ERROR;
2411
2412
0
    if (clientHello[offset++] < TLSv1_MINOR) {
2413
0
        WOLFSSL_ERROR_VERBOSE(SNI_UNSUPPORTED);
2414
0
        return SNI_UNSUPPORTED;
2415
0
    }
2416
2417
0
    ato16(clientHello + offset, &len16);
2418
0
    offset += OPAQUE16_LEN;
2419
2420
0
    if (offset + len16 > helloSz)
2421
0
        return INCOMPLETE_DATA;
2422
2423
    /* Handshake header */
2424
0
    if ((enum HandShakeType) clientHello[offset] != client_hello)
2425
0
        return BUFFER_ERROR;
2426
2427
0
    c24to32(clientHello + offset + 1, &len32);
2428
0
    offset += HANDSHAKE_HEADER_SZ;
2429
2430
0
    if (offset + len32 > helloSz)
2431
0
        return BUFFER_ERROR;
2432
2433
    /* client hello */
2434
0
    offset += VERSION_SZ + RAN_LEN; /* version, random */
2435
2436
0
    if (helloSz < offset + clientHello[offset])
2437
0
        return BUFFER_ERROR;
2438
2439
0
    offset += ENUM_LEN + clientHello[offset]; /* skip session id */
2440
2441
    /* cypher suites */
2442
0
    if (helloSz < offset + OPAQUE16_LEN)
2443
0
        return BUFFER_ERROR;
2444
2445
0
    ato16(clientHello + offset, &len16);
2446
0
    offset += OPAQUE16_LEN;
2447
2448
0
    if (helloSz < offset + len16)
2449
0
        return BUFFER_ERROR;
2450
2451
0
    offset += len16; /* skip cypher suites */
2452
2453
    /* compression methods */
2454
0
    if (helloSz < offset + 1)
2455
0
        return BUFFER_ERROR;
2456
2457
0
    if (helloSz < offset + clientHello[offset])
2458
0
        return BUFFER_ERROR;
2459
2460
0
    offset += ENUM_LEN + clientHello[offset]; /* skip compression methods */
2461
2462
    /* extensions */
2463
0
    if (helloSz < offset + OPAQUE16_LEN)
2464
0
        return 0; /* no extensions in client hello. */
2465
2466
0
    ato16(clientHello + offset, &len16);
2467
0
    offset += OPAQUE16_LEN;
2468
2469
0
    if (helloSz < offset + len16)
2470
0
        return BUFFER_ERROR;
2471
2472
0
    while (len16 >= OPAQUE16_LEN + OPAQUE16_LEN) {
2473
0
        word16 extType;
2474
0
        word16 extLen;
2475
2476
0
        ato16(clientHello + offset, &extType);
2477
0
        offset += OPAQUE16_LEN;
2478
2479
0
        ato16(clientHello + offset, &extLen);
2480
0
        offset += OPAQUE16_LEN;
2481
2482
0
        if (helloSz < offset + extLen)
2483
0
            return BUFFER_ERROR;
2484
2485
0
        if (extType != TLSX_SERVER_NAME) {
2486
0
            offset += extLen; /* skip extension */
2487
0
        } else {
2488
0
            word16 listLen;
2489
2490
0
            ato16(clientHello + offset, &listLen);
2491
0
            offset += OPAQUE16_LEN;
2492
2493
0
            if (helloSz < offset + listLen)
2494
0
                return BUFFER_ERROR;
2495
2496
0
            while (listLen > ENUM_LEN + OPAQUE16_LEN) {
2497
0
                byte   sniType = clientHello[offset++];
2498
0
                word16 sniLen;
2499
2500
0
                ato16(clientHello + offset, &sniLen);
2501
0
                offset += OPAQUE16_LEN;
2502
2503
0
                if (helloSz < offset + sniLen)
2504
0
                    return BUFFER_ERROR;
2505
2506
0
                if (sniType != type) {
2507
0
                    offset  += sniLen;
2508
0
                    listLen -= min(ENUM_LEN + OPAQUE16_LEN + sniLen, listLen);
2509
0
                    continue;
2510
0
                }
2511
2512
0
                *inOutSz = min(sniLen, *inOutSz);
2513
0
                XMEMCPY(sni, clientHello + offset, *inOutSz);
2514
2515
0
                return WOLFSSL_SUCCESS;
2516
0
            }
2517
0
        }
2518
2519
0
        len16 -= min(2 * OPAQUE16_LEN + extLen, len16);
2520
0
    }
2521
2522
0
    return len16 ? BUFFER_ERROR : 0;
2523
0
}
2524
2525
#endif
2526
2527
0
#define SNI_FREE_ALL     TLSX_SNI_FreeAll
2528
0
#define SNI_GET_SIZE     TLSX_SNI_GetSize
2529
0
#define SNI_WRITE        TLSX_SNI_Write
2530
0
#define SNI_PARSE        TLSX_SNI_Parse
2531
0
#define SNI_VERIFY_PARSE TLSX_SNI_VerifyParse
2532
2533
#else
2534
2535
#define SNI_FREE_ALL(list, heap) WC_DO_NOTHING
2536
#define SNI_GET_SIZE(list)     0
2537
#define SNI_WRITE(a, b)        0
2538
#define SNI_PARSE(a, b, c, d)  0
2539
#define SNI_VERIFY_PARSE(a, b) 0
2540
2541
#endif /* HAVE_SNI */
2542
2543
/******************************************************************************/
2544
/* Trusted CA Key Indication                                                  */
2545
/******************************************************************************/
2546
2547
#ifdef HAVE_TRUSTED_CA
2548
2549
/** Creates a new TCA object. */
2550
static TCA* TLSX_TCA_New(byte type, const byte* id, word16 idSz, void* heap)
2551
{
2552
    TCA* tca = (TCA*)XMALLOC(sizeof(TCA), heap, DYNAMIC_TYPE_TLSX);
2553
2554
    if (tca) {
2555
        XMEMSET(tca, 0, sizeof(TCA));
2556
        tca->type = type;
2557
2558
        switch (type) {
2559
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2560
                break;
2561
2562
            #ifndef NO_SHA
2563
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2564
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2565
                if (idSz == WC_SHA_DIGEST_SIZE &&
2566
                        (tca->id =
2567
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2568
                    XMEMCPY(tca->id, id, idSz);
2569
                    tca->idSz = idSz;
2570
                }
2571
                else {
2572
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2573
                    tca = NULL;
2574
                }
2575
                break;
2576
            #endif
2577
2578
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2579
                if (idSz > 0 &&
2580
                        (tca->id =
2581
                            (byte*)XMALLOC(idSz, heap, DYNAMIC_TYPE_TLSX))) {
2582
                    XMEMCPY(tca->id, id, idSz);
2583
                    tca->idSz = idSz;
2584
                }
2585
                else {
2586
                    XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2587
                    tca = NULL;
2588
                }
2589
                break;
2590
2591
            default: /* invalid type */
2592
                XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2593
                tca = NULL;
2594
        }
2595
    }
2596
2597
    (void)heap;
2598
2599
    return tca;
2600
}
2601
2602
/** Releases a TCA object. */
2603
static void TLSX_TCA_Free(TCA* tca, void* heap)
2604
{
2605
    (void)heap;
2606
2607
    if (tca) {
2608
        if (tca->id)
2609
            XFREE(tca->id, heap, DYNAMIC_TYPE_TLSX);
2610
        XFREE(tca, heap, DYNAMIC_TYPE_TLSX);
2611
    }
2612
}
2613
2614
/** Releases all TCA objects in the provided list. */
2615
static void TLSX_TCA_FreeAll(TCA* list, void* heap)
2616
{
2617
    TCA* tca;
2618
2619
    while ((tca = list)) {
2620
        list = tca->next;
2621
        TLSX_TCA_Free(tca, heap);
2622
    }
2623
}
2624
2625
/** Tells the buffered size of the TCA objects in a list. */
2626
static word16 TLSX_TCA_GetSize(TCA* list)
2627
{
2628
    TCA* tca;
2629
    word16 length = OPAQUE16_LEN; /* list length */
2630
2631
    while ((tca = list)) {
2632
        list = tca->next;
2633
2634
        length += ENUM_LEN; /* tca type */
2635
2636
        switch (tca->type) {
2637
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2638
                break;
2639
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2640
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2641
                length += tca->idSz;
2642
                break;
2643
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2644
                length += OPAQUE16_LEN + tca->idSz;
2645
                break;
2646
        }
2647
    }
2648
2649
    return length;
2650
}
2651
2652
/** Writes the TCA objects of a list in a buffer. */
2653
static word16 TLSX_TCA_Write(TCA* list, byte* output)
2654
{
2655
    TCA* tca;
2656
    word16 offset = OPAQUE16_LEN; /* list length offset */
2657
2658
    while ((tca = list)) {
2659
        list = tca->next;
2660
2661
        output[offset++] = tca->type; /* tca type */
2662
2663
        switch (tca->type) {
2664
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2665
                break;
2666
            #ifndef NO_SHA
2667
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2668
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2669
                if (tca->id != NULL) {
2670
                    XMEMCPY(output + offset, tca->id, tca->idSz);
2671
                    offset += tca->idSz;
2672
                }
2673
                else {
2674
                    /* ID missing. Set to an empty string. */
2675
                    c16toa(0, output + offset);
2676
                    offset += OPAQUE16_LEN;
2677
                }
2678
                break;
2679
            #endif
2680
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2681
                if (tca->id != NULL) {
2682
                    c16toa(tca->idSz, output + offset); /* tca length */
2683
                    offset += OPAQUE16_LEN;
2684
                    XMEMCPY(output + offset, tca->id, tca->idSz);
2685
                    offset += tca->idSz;
2686
                }
2687
                else {
2688
                    /* ID missing. Set to an empty string. */
2689
                    c16toa(0, output + offset);
2690
                    offset += OPAQUE16_LEN;
2691
                }
2692
                break;
2693
            default:
2694
                /* ID unknown. Set to an empty string. */
2695
                c16toa(0, output + offset);
2696
                offset += OPAQUE16_LEN;
2697
        }
2698
    }
2699
2700
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
2701
2702
    return offset;
2703
}
2704
2705
#ifndef NO_WOLFSSL_SERVER
2706
static TCA* TLSX_TCA_Find(TCA *list, byte type, const byte* id, word16 idSz)
2707
{
2708
    TCA* tca = list;
2709
2710
    while (tca && tca->type != type && type != WOLFSSL_TRUSTED_CA_PRE_AGREED &&
2711
           idSz != tca->idSz && !XMEMCMP(id, tca->id, idSz))
2712
        tca = tca->next;
2713
2714
    return tca;
2715
}
2716
#endif /* NO_WOLFSSL_SERVER */
2717
2718
/** Parses a buffer of TCA extensions. */
2719
static int TLSX_TCA_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2720
                          byte isRequest)
2721
{
2722
#ifndef NO_WOLFSSL_SERVER
2723
    word16 size = 0;
2724
    word16 offset = 0;
2725
#endif
2726
2727
    TLSX *extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
2728
2729
    if (!extension)
2730
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_TRUSTED_CA_KEYS);
2731
2732
    if (!isRequest) {
2733
        #ifndef NO_WOLFSSL_CLIENT
2734
            if (!extension || !extension->data)
2735
                return TLSX_HandleUnsupportedExtension(ssl);
2736
2737
            if (length > 0)
2738
                return BUFFER_ERROR; /* TCA response MUST be empty. */
2739
2740
            /* Set the flag that we're good for keys */
2741
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
2742
2743
            return 0;
2744
        #endif
2745
    }
2746
2747
#ifndef NO_WOLFSSL_SERVER
2748
    if (!extension || !extension->data) {
2749
        /* Skipping, TCA not enabled at server side. */
2750
        return 0;
2751
    }
2752
2753
    if (OPAQUE16_LEN > length)
2754
        return BUFFER_ERROR;
2755
2756
    ato16(input, &size);
2757
    offset += OPAQUE16_LEN;
2758
2759
    /* validating tca list length */
2760
    if (length != OPAQUE16_LEN + size)
2761
        return BUFFER_ERROR;
2762
2763
    for (size = 0; offset < length; offset += size) {
2764
        TCA *tca = NULL;
2765
        byte type;
2766
        const byte* id = NULL;
2767
        word16 idSz = 0;
2768
2769
        if (offset + ENUM_LEN > length)
2770
            return BUFFER_ERROR;
2771
2772
        type = input[offset++];
2773
2774
        switch (type) {
2775
            case WOLFSSL_TRUSTED_CA_PRE_AGREED:
2776
                break;
2777
            #ifndef NO_SHA
2778
            case WOLFSSL_TRUSTED_CA_KEY_SHA1:
2779
            case WOLFSSL_TRUSTED_CA_CERT_SHA1:
2780
                if (offset + WC_SHA_DIGEST_SIZE > length)
2781
                    return BUFFER_ERROR;
2782
                idSz = WC_SHA_DIGEST_SIZE;
2783
                id = input + offset;
2784
                offset += idSz;
2785
                break;
2786
            #endif
2787
            case WOLFSSL_TRUSTED_CA_X509_NAME:
2788
                if (offset + OPAQUE16_LEN > length)
2789
                    return BUFFER_ERROR;
2790
                ato16(input + offset, &idSz);
2791
                offset += OPAQUE16_LEN;
2792
                if ((offset > length) || (idSz > length - offset))
2793
                    return BUFFER_ERROR;
2794
                id = input + offset;
2795
                offset += idSz;
2796
                break;
2797
            default:
2798
                WOLFSSL_ERROR_VERBOSE(TCA_INVALID_ID_TYPE);
2799
                return TCA_INVALID_ID_TYPE;
2800
        }
2801
2802
        /* Find the type/ID in the TCA list. */
2803
        tca = TLSX_TCA_Find((TCA*)extension->data, type, id, idSz);
2804
        if (tca != NULL) {
2805
            /* Found it. Set the response flag and break out of the loop. */
2806
            TLSX_SetResponse(ssl, TLSX_TRUSTED_CA_KEYS);
2807
            break;
2808
        }
2809
    }
2810
#else
2811
    (void)input;
2812
#endif
2813
2814
    return 0;
2815
}
2816
2817
/* Checks to see if the server sent a response for the TCA. */
2818
static int TLSX_TCA_VerifyParse(WOLFSSL* ssl, byte isRequest)
2819
{
2820
    (void)ssl;
2821
2822
    if (!isRequest) {
2823
    #ifndef NO_WOLFSSL_CLIENT
2824
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_TRUSTED_CA_KEYS);
2825
2826
        if (extension && !extension->resp) {
2827
            SendAlert(ssl, alert_fatal, handshake_failure);
2828
            WOLFSSL_ERROR_VERBOSE(TCA_ABSENT_ERROR);
2829
            return TCA_ABSENT_ERROR;
2830
        }
2831
    #endif /* NO_WOLFSSL_CLIENT */
2832
    }
2833
2834
    return 0;
2835
}
2836
2837
int TLSX_UseTrustedCA(TLSX** extensions, byte type,
2838
                    const byte* id, word16 idSz, void* heap)
2839
{
2840
    TLSX* extension;
2841
    TCA* tca = NULL;
2842
2843
    if (extensions == NULL)
2844
        return BAD_FUNC_ARG;
2845
2846
    if ((tca = TLSX_TCA_New(type, id, idSz, heap)) == NULL)
2847
        return MEMORY_E;
2848
2849
    extension = TLSX_Find(*extensions, TLSX_TRUSTED_CA_KEYS);
2850
    if (!extension) {
2851
        int ret = TLSX_Push(extensions, TLSX_TRUSTED_CA_KEYS, (void*)tca, heap);
2852
2853
        if (ret != 0) {
2854
            TLSX_TCA_Free(tca, heap);
2855
            return ret;
2856
        }
2857
    }
2858
    else {
2859
        /* push new TCA object to extension data. */
2860
        tca->next = (TCA*)extension->data;
2861
        extension->data = (void*)tca;
2862
    }
2863
2864
    return WOLFSSL_SUCCESS;
2865
}
2866
2867
#define TCA_FREE_ALL     TLSX_TCA_FreeAll
2868
#define TCA_GET_SIZE     TLSX_TCA_GetSize
2869
#define TCA_WRITE        TLSX_TCA_Write
2870
#define TCA_PARSE        TLSX_TCA_Parse
2871
#define TCA_VERIFY_PARSE TLSX_TCA_VerifyParse
2872
2873
#else /* HAVE_TRUSTED_CA */
2874
2875
0
#define TCA_FREE_ALL(list, heap) WC_DO_NOTHING
2876
0
#define TCA_GET_SIZE(list)     0
2877
0
#define TCA_WRITE(a, b)        0
2878
0
#define TCA_PARSE(a, b, c, d)  0
2879
0
#define TCA_VERIFY_PARSE(a, b) 0
2880
2881
#endif /* HAVE_TRUSTED_CA */
2882
2883
/******************************************************************************/
2884
/* Max Fragment Length Negotiation                                            */
2885
/******************************************************************************/
2886
2887
#ifdef HAVE_MAX_FRAGMENT
2888
2889
static word16 TLSX_MFL_Write(byte* data, byte* output)
2890
{
2891
    output[0] = data[0];
2892
2893
    return ENUM_LEN;
2894
}
2895
2896
static int TLSX_MFL_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2897
                          byte isRequest)
2898
{
2899
    if (length != ENUM_LEN)
2900
        return BUFFER_ERROR;
2901
2902
#ifdef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
2903
    (void) isRequest;
2904
#else
2905
    if (!isRequest)
2906
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_MAX_FRAGMENT_LENGTH))
2907
            return TLSX_HandleUnsupportedExtension(ssl);
2908
#endif
2909
2910
    switch (*input) {
2911
        case WOLFSSL_MFL_2_8 : ssl->max_fragment =  256; break;
2912
        case WOLFSSL_MFL_2_9 : ssl->max_fragment =  512; break;
2913
        case WOLFSSL_MFL_2_10: ssl->max_fragment = 1024; break;
2914
        case WOLFSSL_MFL_2_11: ssl->max_fragment = 2048; break;
2915
        case WOLFSSL_MFL_2_12: ssl->max_fragment = 4096; break;
2916
        case WOLFSSL_MFL_2_13: ssl->max_fragment = 8192; break;
2917
2918
        default:
2919
            SendAlert(ssl, alert_fatal, illegal_parameter);
2920
            WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E);
2921
            return UNKNOWN_MAX_FRAG_LEN_E;
2922
    }
2923
2924
#ifndef NO_WOLFSSL_SERVER
2925
    if (isRequest) {
2926
        int ret = TLSX_UseMaxFragment(&ssl->extensions, *input, ssl->heap);
2927
2928
        if (ret != WOLFSSL_SUCCESS)
2929
            return ret; /* throw error */
2930
2931
        TLSX_SetResponse(ssl, TLSX_MAX_FRAGMENT_LENGTH);
2932
    }
2933
#endif
2934
2935
    return 0;
2936
}
2937
2938
int TLSX_UseMaxFragment(TLSX** extensions, byte mfl, void* heap)
2939
{
2940
    byte* data = NULL;
2941
    int ret = 0;
2942
2943
    if (extensions == NULL || mfl < WOLFSSL_MFL_MIN || mfl > WOLFSSL_MFL_MAX)
2944
        return BAD_FUNC_ARG;
2945
2946
    data = (byte*)XMALLOC(ENUM_LEN, heap, DYNAMIC_TYPE_TLSX);
2947
    if (data == NULL)
2948
        return MEMORY_E;
2949
2950
    data[0] = mfl;
2951
2952
    ret = TLSX_Push(extensions, TLSX_MAX_FRAGMENT_LENGTH, data, heap);
2953
    if (ret != 0) {
2954
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
2955
        return ret;
2956
    }
2957
2958
    return WOLFSSL_SUCCESS;
2959
}
2960
2961
2962
#define MFL_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
2963
#define MFL_GET_SIZE(data) ENUM_LEN
2964
#define MFL_WRITE          TLSX_MFL_Write
2965
#define MFL_PARSE          TLSX_MFL_Parse
2966
2967
#else
2968
2969
0
#define MFL_FREE_ALL(a, b) WC_DO_NOTHING
2970
0
#define MFL_GET_SIZE(a)       0
2971
0
#define MFL_WRITE(a, b)       0
2972
0
#define MFL_PARSE(a, b, c, d) 0
2973
2974
#endif /* HAVE_MAX_FRAGMENT */
2975
2976
/******************************************************************************/
2977
/* Truncated HMAC                                                             */
2978
/******************************************************************************/
2979
2980
#ifdef HAVE_TRUNCATED_HMAC
2981
2982
static int TLSX_THM_Parse(WOLFSSL* ssl, const byte* input, word16 length,
2983
                          byte isRequest)
2984
{
2985
    if (length != 0 || input == NULL)
2986
        return BUFFER_ERROR;
2987
2988
    if (!isRequest) {
2989
    #ifndef WOLFSSL_OLD_UNSUPPORTED_EXTENSION
2990
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_TRUNCATED_HMAC))
2991
            return TLSX_HandleUnsupportedExtension(ssl);
2992
    #endif
2993
    }
2994
    else {
2995
        #ifndef NO_WOLFSSL_SERVER
2996
            int ret = TLSX_UseTruncatedHMAC(&ssl->extensions, ssl->heap);
2997
2998
            if (ret != WOLFSSL_SUCCESS)
2999
                return ret; /* throw error */
3000
3001
            TLSX_SetResponse(ssl, TLSX_TRUNCATED_HMAC);
3002
        #endif
3003
    }
3004
3005
    ssl->truncated_hmac = 1;
3006
3007
    return 0;
3008
}
3009
3010
int TLSX_UseTruncatedHMAC(TLSX** extensions, void* heap)
3011
{
3012
    int ret = 0;
3013
3014
    if (extensions == NULL)
3015
        return BAD_FUNC_ARG;
3016
3017
    ret = TLSX_Push(extensions, TLSX_TRUNCATED_HMAC, NULL, heap);
3018
    if (ret != 0)
3019
        return ret;
3020
3021
    return WOLFSSL_SUCCESS;
3022
}
3023
3024
#define THM_PARSE TLSX_THM_Parse
3025
3026
#else
3027
3028
0
#define THM_PARSE(a, b, c, d) 0
3029
3030
#endif /* HAVE_TRUNCATED_HMAC */
3031
3032
/******************************************************************************/
3033
/* Certificate Status Request                                                 */
3034
/******************************************************************************/
3035
3036
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3037
3038
static void TLSX_CSR_Free(CertificateStatusRequest* csr, void* heap)
3039
{
3040
    switch (csr->status_type) {
3041
        case WOLFSSL_CSR_OCSP:
3042
            FreeOcspRequest(&csr->request.ocsp);
3043
        break;
3044
    }
3045
3046
#ifdef WOLFSSL_TLS13
3047
    if (csr->response.buffer != NULL) {
3048
        XFREE(csr->response.buffer, csr->ssl->heap,
3049
                DYNAMIC_TYPE_TMP_BUFFER);
3050
    }
3051
#endif
3052
    XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3053
    (void)heap;
3054
}
3055
3056
static word16 TLSX_CSR_GetSize(CertificateStatusRequest* csr, byte isRequest)
3057
{
3058
    word16 size = 0;
3059
3060
    /* shut up compiler warnings */
3061
    (void) csr; (void) isRequest;
3062
3063
#ifndef NO_WOLFSSL_CLIENT
3064
    if (isRequest) {
3065
        switch (csr->status_type) {
3066
            case WOLFSSL_CSR_OCSP:
3067
                size += ENUM_LEN + 2 * OPAQUE16_LEN;
3068
3069
                if (csr->request.ocsp.nonceSz)
3070
                    size += OCSP_NONCE_EXT_SZ;
3071
            break;
3072
        }
3073
    }
3074
#endif
3075
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3076
    if (!isRequest && csr->ssl->options.tls1_3)
3077
        return OPAQUE8_LEN + OPAQUE24_LEN + csr->response.length;
3078
#endif
3079
3080
    return size;
3081
}
3082
3083
static word16 TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output,
3084
                                                                 byte isRequest)
3085
{
3086
    /* shut up compiler warnings */
3087
    (void) csr; (void) output; (void) isRequest;
3088
3089
#ifndef NO_WOLFSSL_CLIENT
3090
    if (isRequest) {
3091
        word16 offset = 0;
3092
        word16 length = 0;
3093
3094
        /* type */
3095
        output[offset++] = csr->status_type;
3096
3097
        switch (csr->status_type) {
3098
            case WOLFSSL_CSR_OCSP:
3099
                /* responder id list */
3100
                c16toa(0, output + offset);
3101
                offset += OPAQUE16_LEN;
3102
3103
                /* request extensions */
3104
                if (csr->request.ocsp.nonceSz)
3105
                    length = (word16)EncodeOcspRequestExtensions(
3106
                                                 &csr->request.ocsp,
3107
                                                 output + offset + OPAQUE16_LEN,
3108
                                                 OCSP_NONCE_EXT_SZ);
3109
3110
                c16toa(length, output + offset);
3111
                offset += OPAQUE16_LEN + length;
3112
3113
            break;
3114
        }
3115
3116
        return offset;
3117
    }
3118
#endif
3119
#if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER)
3120
    if (!isRequest && csr->ssl->options.tls1_3) {
3121
        word16 offset = 0;
3122
        output[offset++] = csr->status_type;
3123
        c32to24(csr->response.length, output + offset);
3124
        offset += OPAQUE24_LEN;
3125
        XMEMCPY(output + offset, csr->response.buffer, csr->response.length);
3126
        offset += csr->response.length;
3127
        return offset;
3128
    }
3129
#endif
3130
3131
    return 0;
3132
}
3133
3134
static int TLSX_CSR_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3135
                          byte isRequest)
3136
{
3137
    int ret;
3138
#if !defined(NO_WOLFSSL_SERVER)
3139
    byte status_type;
3140
    word16 size = 0;
3141
#if defined(WOLFSSL_TLS13)
3142
    DecodedCert* cert;
3143
#endif
3144
#endif
3145
3146
#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) \
3147
    && defined(WOLFSSL_TLS13)
3148
    OcspRequest* request;
3149
    TLSX* extension;
3150
    CertificateStatusRequest* csr;
3151
#endif
3152
3153
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13) \
3154
 || !defined(NO_WOLFSSL_SERVER)
3155
    word32 offset = 0;
3156
#endif
3157
3158
#if !defined(NO_WOLFSSL_CLIENT) && defined(WOLFSSL_TLS13)
3159
    word32 resp_length = 0;
3160
#endif
3161
3162
    /* shut up compiler warnings */
3163
    (void) ssl; (void) input;
3164
3165
    if (!isRequest) {
3166
#ifndef NO_WOLFSSL_CLIENT
3167
        extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3168
        csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3169
3170
        if (!csr) {
3171
            /* look at context level */
3172
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST);
3173
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3174
3175
            if (!csr) /* unexpected extension */
3176
                return TLSX_HandleUnsupportedExtension(ssl);
3177
3178
            /* enable extension at ssl level */
3179
            ret = TLSX_UseCertificateStatusRequest(&ssl->extensions,
3180
                                     csr->status_type, csr->options, ssl,
3181
                                     ssl->heap, ssl->devId);
3182
            if (ret != WOLFSSL_SUCCESS)
3183
                return ret == 0 ? -1 : ret;
3184
3185
            switch (csr->status_type) {
3186
                case WOLFSSL_CSR_OCSP:
3187
                    /* propagate nonce */
3188
                    if (csr->request.ocsp.nonceSz) {
3189
                        request =
3190
                            (OcspRequest*)TLSX_CSR_GetRequest(ssl->extensions);
3191
3192
                        if (request) {
3193
                            XMEMCPY(request->nonce, csr->request.ocsp.nonce,
3194
                                                    csr->request.ocsp.nonceSz);
3195
                            request->nonceSz = csr->request.ocsp.nonceSz;
3196
                        }
3197
                    }
3198
                break;
3199
            }
3200
        }
3201
3202
        ssl->status_request = 1;
3203
3204
    #ifdef WOLFSSL_TLS13
3205
        if (ssl->options.tls1_3) {
3206
            /* Get the new extension potentially created above. */
3207
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3208
            csr = extension ? (CertificateStatusRequest*)extension->data : NULL;
3209
            if (csr == NULL)
3210
                return MEMORY_ERROR;
3211
3212
            ret = 0;
3213
            if (OPAQUE8_LEN + OPAQUE24_LEN > length)
3214
                ret = BUFFER_ERROR;
3215
            if (ret == 0 && input[offset++] != WOLFSSL_CSR_OCSP) {
3216
                ret = BAD_CERTIFICATE_STATUS_ERROR;
3217
                WOLFSSL_ERROR_VERBOSE(ret);
3218
            }
3219
            if (ret == 0) {
3220
                c24to32(input + offset, &resp_length);
3221
                offset += OPAQUE24_LEN;
3222
                if (offset + resp_length != length)
3223
                    ret = BUFFER_ERROR;
3224
            }
3225
            if (ret == 0) {
3226
                csr->response.buffer = (byte*)XMALLOC(resp_length, ssl->heap,
3227
                        DYNAMIC_TYPE_TMP_BUFFER);
3228
                if (csr->response.buffer == NULL)
3229
                    ret = MEMORY_ERROR;
3230
            }
3231
            if (ret == 0) {
3232
                XMEMCPY(csr->response.buffer, input + offset, resp_length);
3233
                csr->response.length = resp_length;
3234
            }
3235
3236
            return ret;
3237
        }
3238
        else
3239
    #endif
3240
        {
3241
            /* extension_data MUST be empty. */
3242
            return length ? BUFFER_ERROR : 0;
3243
        }
3244
#endif
3245
    }
3246
    else {
3247
#ifndef NO_WOLFSSL_SERVER
3248
        if (length == 0)
3249
            return 0;
3250
3251
        status_type = input[offset++];
3252
3253
        switch (status_type) {
3254
            case WOLFSSL_CSR_OCSP: {
3255
3256
                /* skip responder_id_list */
3257
                if ((int)(length - offset) < OPAQUE16_LEN)
3258
                    return BUFFER_ERROR;
3259
3260
                ato16(input + offset, &size);
3261
                offset += OPAQUE16_LEN + size;
3262
3263
                /* skip request_extensions */
3264
                if ((int)(length - offset) < OPAQUE16_LEN)
3265
                    return BUFFER_ERROR;
3266
3267
                ato16(input + offset, &size);
3268
                offset += OPAQUE16_LEN + size;
3269
3270
                if (offset > length)
3271
                    return BUFFER_ERROR;
3272
3273
                /* is able to send OCSP response? */
3274
                if (SSL_CM(ssl) == NULL || !SSL_CM(ssl)->ocspStaplingEnabled)
3275
                    return 0;
3276
            }
3277
            break;
3278
3279
            /* unknown status type */
3280
            default:
3281
                return 0;
3282
        }
3283
3284
        /* if using status_request and already sending it, skip this one */
3285
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3286
        if (ssl->status_request_v2)
3287
            return 0;
3288
        #endif
3289
3290
        /* accept the first good status_type and return */
3291
        ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type,
3292
                                                 0, ssl, ssl->heap, ssl->devId);
3293
        if (ret != WOLFSSL_SUCCESS)
3294
            return ret == 0 ? -1 : ret; /* throw error */
3295
3296
    #if defined(WOLFSSL_TLS13)
3297
        if (ssl->options.tls1_3) {
3298
            if (ssl->buffers.certificate == NULL) {
3299
                WOLFSSL_MSG("Certificate buffer not set!");
3300
                return BUFFER_ERROR;
3301
            }
3302
            cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), ssl->heap,
3303
                                         DYNAMIC_TYPE_DCERT);
3304
            if (cert == NULL) {
3305
                return MEMORY_E;
3306
            }
3307
            InitDecodedCert(cert, ssl->buffers.certificate->buffer,
3308
                            ssl->buffers.certificate->length, ssl->heap);
3309
            ret = ParseCert(cert, CERT_TYPE, 1, SSL_CM(ssl));
3310
            if (ret != 0) {
3311
                FreeDecodedCert(cert);
3312
                XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3313
                /* Let's not error out the connection if we can't verify our
3314
                 * cert */
3315
                if (ret == ASN_SELF_SIGNED_E || ret == ASN_NO_SIGNER_E)
3316
                    ret = 0;
3317
                return ret;
3318
            }
3319
            ret = TLSX_CSR_InitRequest(ssl->extensions, cert, ssl->heap);
3320
            if (ret != 0 ) {
3321
                FreeDecodedCert(cert);
3322
                XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3323
                return ret;
3324
            }
3325
            FreeDecodedCert(cert);
3326
            XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
3327
3328
            extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3329
            csr = extension ?
3330
                (CertificateStatusRequest*)extension->data : NULL;
3331
            if (csr == NULL)
3332
                return MEMORY_ERROR;
3333
3334
            request = &csr->request.ocsp;
3335
            ret = CreateOcspResponse(ssl, &request, &csr->response);
3336
            if (ret != 0)
3337
                return ret;
3338
            if (csr->response.buffer)
3339
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3340
        }
3341
        else
3342
    #endif
3343
            TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST);
3344
        ssl->status_request = status_type;
3345
#endif
3346
    }
3347
3348
    return 0;
3349
}
3350
3351
int TLSX_CSR_InitRequest(TLSX* extensions, DecodedCert* cert, void* heap)
3352
{
3353
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3354
    CertificateStatusRequest* csr = extension ?
3355
        (CertificateStatusRequest*)extension->data : NULL;
3356
    int ret = 0;
3357
3358
    if (csr) {
3359
        switch (csr->status_type) {
3360
            case WOLFSSL_CSR_OCSP: {
3361
                byte nonce[MAX_OCSP_NONCE_SZ];
3362
                int  nonceSz = csr->request.ocsp.nonceSz;
3363
3364
                /* preserve nonce */
3365
                XMEMCPY(nonce, csr->request.ocsp.nonce, nonceSz);
3366
3367
                if ((ret = InitOcspRequest(&csr->request.ocsp, cert, 0, heap))
3368
                                                                           != 0)
3369
                    return ret;
3370
3371
                /* restore nonce */
3372
                XMEMCPY(csr->request.ocsp.nonce, nonce, nonceSz);
3373
                csr->request.ocsp.nonceSz = nonceSz;
3374
            }
3375
            break;
3376
        }
3377
    }
3378
3379
    return ret;
3380
}
3381
3382
void* TLSX_CSR_GetRequest(TLSX* extensions)
3383
{
3384
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST);
3385
    CertificateStatusRequest* csr = extension ?
3386
                              (CertificateStatusRequest*)extension->data : NULL;
3387
3388
    if (csr) {
3389
        switch (csr->status_type) {
3390
            case WOLFSSL_CSR_OCSP:
3391
                return &csr->request.ocsp;
3392
        }
3393
    }
3394
3395
    return NULL;
3396
}
3397
3398
int TLSX_CSR_ForceRequest(WOLFSSL* ssl)
3399
{
3400
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST);
3401
    CertificateStatusRequest* csr = extension ?
3402
                              (CertificateStatusRequest*)extension->data : NULL;
3403
3404
    if (csr) {
3405
        switch (csr->status_type) {
3406
            case WOLFSSL_CSR_OCSP:
3407
                if (SSL_CM(ssl)->ocspEnabled) {
3408
                    csr->request.ocsp.ssl = ssl;
3409
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
3410
                                              &csr->request.ocsp, NULL, NULL);
3411
                }
3412
                else {
3413
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
3414
                    return OCSP_LOOKUP_FAIL;
3415
                }
3416
        }
3417
    }
3418
3419
    return 0;
3420
}
3421
3422
int TLSX_UseCertificateStatusRequest(TLSX** extensions, byte status_type,
3423
                                         byte options, WOLFSSL* ssl, void* heap,
3424
                                                                      int devId)
3425
{
3426
    CertificateStatusRequest* csr = NULL;
3427
    int ret = 0;
3428
3429
    if (!extensions || status_type != WOLFSSL_CSR_OCSP)
3430
        return BAD_FUNC_ARG;
3431
3432
    csr = (CertificateStatusRequest*)
3433
             XMALLOC(sizeof(CertificateStatusRequest), heap, DYNAMIC_TYPE_TLSX);
3434
    if (!csr)
3435
        return MEMORY_E;
3436
3437
    ForceZero(csr, sizeof(CertificateStatusRequest));
3438
3439
    csr->status_type = status_type;
3440
    csr->options     = options;
3441
    csr->ssl         = ssl;
3442
3443
    switch (csr->status_type) {
3444
        case WOLFSSL_CSR_OCSP:
3445
            if (options & WOLFSSL_CSR_OCSP_USE_NONCE) {
3446
                WC_RNG rng;
3447
3448
            #ifndef HAVE_FIPS
3449
                ret = wc_InitRng_ex(&rng, heap, devId);
3450
            #else
3451
                ret = wc_InitRng(&rng);
3452
                (void)devId;
3453
            #endif
3454
                if (ret == 0) {
3455
                    if (wc_RNG_GenerateBlock(&rng, csr->request.ocsp.nonce,
3456
                                                        MAX_OCSP_NONCE_SZ) == 0)
3457
                        csr->request.ocsp.nonceSz = MAX_OCSP_NONCE_SZ;
3458
3459
                    wc_FreeRng(&rng);
3460
                }
3461
            }
3462
        break;
3463
    }
3464
3465
    if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST, csr, heap)) != 0) {
3466
        XFREE(csr, heap, DYNAMIC_TYPE_TLSX);
3467
        return ret;
3468
    }
3469
3470
    return WOLFSSL_SUCCESS;
3471
}
3472
3473
#define CSR_FREE_ALL TLSX_CSR_Free
3474
#define CSR_GET_SIZE TLSX_CSR_GetSize
3475
#define CSR_WRITE    TLSX_CSR_Write
3476
#define CSR_PARSE    TLSX_CSR_Parse
3477
3478
#else
3479
3480
0
#define CSR_FREE_ALL(data, heap) WC_DO_NOTHING
3481
0
#define CSR_GET_SIZE(a, b)    0
3482
0
#define CSR_WRITE(a, b, c)    0
3483
0
#define CSR_PARSE(a, b, c, d) 0
3484
3485
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST */
3486
3487
/******************************************************************************/
3488
/* Certificate Status Request v2                                              */
3489
/******************************************************************************/
3490
3491
#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
3492
3493
static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap)
3494
{
3495
    CertificateStatusRequestItemV2* next;
3496
3497
    for (; csr2; csr2 = next) {
3498
        next = csr2->next;
3499
3500
        switch (csr2->status_type) {
3501
            case WOLFSSL_CSR2_OCSP:
3502
            case WOLFSSL_CSR2_OCSP_MULTI:
3503
                while(csr2->requests--)
3504
                    FreeOcspRequest(&csr2->request.ocsp[csr2->requests]);
3505
            break;
3506
        }
3507
3508
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
3509
    }
3510
    (void)heap;
3511
}
3512
3513
static word16 TLSX_CSR2_GetSize(CertificateStatusRequestItemV2* csr2,
3514
                                                                 byte isRequest)
3515
{
3516
    word16 size = 0;
3517
3518
    /* shut up compiler warnings */
3519
    (void) csr2; (void) isRequest;
3520
3521
#ifndef NO_WOLFSSL_CLIENT
3522
    if (isRequest) {
3523
        CertificateStatusRequestItemV2* next;
3524
3525
        for (size = OPAQUE16_LEN; csr2; csr2 = next) {
3526
            next = csr2->next;
3527
3528
            switch (csr2->status_type) {
3529
                case WOLFSSL_CSR2_OCSP:
3530
                case WOLFSSL_CSR2_OCSP_MULTI:
3531
                    size += ENUM_LEN + 3 * OPAQUE16_LEN;
3532
3533
                    if (csr2->request.ocsp[0].nonceSz)
3534
                        size += OCSP_NONCE_EXT_SZ;
3535
                break;
3536
            }
3537
        }
3538
    }
3539
#endif
3540
3541
    return size;
3542
}
3543
3544
static word16 TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2,
3545
                                                   byte* output, byte isRequest)
3546
{
3547
    /* shut up compiler warnings */
3548
    (void) csr2; (void) output; (void) isRequest;
3549
3550
#ifndef NO_WOLFSSL_CLIENT
3551
    if (isRequest) {
3552
        word16 offset;
3553
        word16 length;
3554
3555
        for (offset = OPAQUE16_LEN; csr2 != NULL; csr2 = csr2->next) {
3556
            /* status_type */
3557
            output[offset++] = csr2->status_type;
3558
3559
            /* request */
3560
            switch (csr2->status_type) {
3561
                case WOLFSSL_CSR2_OCSP:
3562
                case WOLFSSL_CSR2_OCSP_MULTI:
3563
                    /* request_length */
3564
                    length = 2 * OPAQUE16_LEN;
3565
3566
                    if (csr2->request.ocsp[0].nonceSz)
3567
                        length += OCSP_NONCE_EXT_SZ;
3568
3569
                    c16toa(length, output + offset);
3570
                    offset += OPAQUE16_LEN;
3571
3572
                    /* responder id list */
3573
                    c16toa(0, output + offset);
3574
                    offset += OPAQUE16_LEN;
3575
3576
                    /* request extensions */
3577
                    length = 0;
3578
3579
                    if (csr2->request.ocsp[0].nonceSz)
3580
                        length = (word16)EncodeOcspRequestExtensions(
3581
                                                 &csr2->request.ocsp[0],
3582
                                                 output + offset + OPAQUE16_LEN,
3583
                                                 OCSP_NONCE_EXT_SZ);
3584
3585
                    c16toa(length, output + offset);
3586
                    offset += OPAQUE16_LEN + length;
3587
                break;
3588
            }
3589
        }
3590
3591
        /* list size */
3592
        c16toa(offset - OPAQUE16_LEN, output);
3593
3594
        return offset;
3595
    }
3596
#endif
3597
3598
    return 0;
3599
}
3600
3601
static int TLSX_CSR2_Parse(WOLFSSL* ssl, const byte* input, word16 length,
3602
                           byte isRequest)
3603
{
3604
    int ret;
3605
3606
    /* shut up compiler warnings */
3607
    (void) ssl; (void) input;
3608
3609
    if (!isRequest) {
3610
#ifndef NO_WOLFSSL_CLIENT
3611
        TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
3612
        CertificateStatusRequestItemV2* csr2 = extension ?
3613
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3614
3615
        if (!csr2) {
3616
            /* look at context level */
3617
            extension = TLSX_Find(ssl->ctx->extensions, TLSX_STATUS_REQUEST_V2);
3618
            csr2 = extension ?
3619
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3620
3621
            if (!csr2) /* unexpected extension */
3622
                return TLSX_HandleUnsupportedExtension(ssl);
3623
3624
            /* enable extension at ssl level */
3625
            for (; csr2; csr2 = csr2->next) {
3626
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
3627
                                    csr2->status_type, csr2->options, ssl->heap,
3628
                                                                    ssl->devId);
3629
                if (ret != WOLFSSL_SUCCESS)
3630
                    return ret;
3631
3632
                switch (csr2->status_type) {
3633
                    case WOLFSSL_CSR2_OCSP:
3634
                        /* followed by */
3635
                    case WOLFSSL_CSR2_OCSP_MULTI:
3636
                        /* propagate nonce */
3637
                        if (csr2->request.ocsp[0].nonceSz) {
3638
                            OcspRequest* request =
3639
                             (OcspRequest*)TLSX_CSR2_GetRequest(ssl->extensions,
3640
                                                          csr2->status_type, 0);
3641
3642
                            if (request) {
3643
                                XMEMCPY(request->nonce,
3644
                                        csr2->request.ocsp[0].nonce,
3645
                                        csr2->request.ocsp[0].nonceSz);
3646
3647
                                request->nonceSz =
3648
                                                  csr2->request.ocsp[0].nonceSz;
3649
                            }
3650
                        }
3651
                    break;
3652
                }
3653
            }
3654
        }
3655
3656
        ssl->status_request_v2 = 1;
3657
3658
        return length ? BUFFER_ERROR : 0; /* extension_data MUST be empty. */
3659
#endif
3660
    }
3661
    else {
3662
#ifndef NO_WOLFSSL_SERVER
3663
        byte   status_type;
3664
        word16 request_length;
3665
        word16 offset = 0;
3666
        word16 size = 0;
3667
3668
        /* list size */
3669
        if (offset + OPAQUE16_LEN >= length) {
3670
            return BUFFER_E;
3671
        }
3672
3673
        ato16(input + offset, &request_length);
3674
        offset += OPAQUE16_LEN;
3675
3676
        if (length - OPAQUE16_LEN != request_length)
3677
            return BUFFER_ERROR;
3678
3679
        while (length > offset) {
3680
            if ((int)(length - offset) < ENUM_LEN + OPAQUE16_LEN)
3681
                return BUFFER_ERROR;
3682
3683
            status_type = input[offset++];
3684
3685
            ato16(input + offset, &request_length);
3686
            offset += OPAQUE16_LEN;
3687
3688
            if (length - offset < request_length)
3689
                return BUFFER_ERROR;
3690
3691
            switch (status_type) {
3692
                case WOLFSSL_CSR2_OCSP:
3693
                case WOLFSSL_CSR2_OCSP_MULTI:
3694
                    /* skip responder_id_list */
3695
                    if ((int)(length - offset) < OPAQUE16_LEN)
3696
                        return BUFFER_ERROR;
3697
3698
                    ato16(input + offset, &size);
3699
                    if (length - offset < size)
3700
                        return BUFFER_ERROR;
3701
3702
                    offset += OPAQUE16_LEN + size;
3703
                    /* skip request_extensions */
3704
                    if ((int)(length - offset) < OPAQUE16_LEN)
3705
                        return BUFFER_ERROR;
3706
3707
                    ato16(input + offset, &size);
3708
                    if (length - offset < size)
3709
                        return BUFFER_ERROR;
3710
3711
                    offset += OPAQUE16_LEN + size;
3712
                    if (offset > length)
3713
                        return BUFFER_ERROR;
3714
3715
                    /* is able to send OCSP response? */
3716
                    if (SSL_CM(ssl) == NULL
3717
                    || !SSL_CM(ssl)->ocspStaplingEnabled)
3718
                        continue;
3719
                break;
3720
3721
                default:
3722
                    /* unknown status type, skipping! */
3723
                    offset += request_length;
3724
                    continue;
3725
            }
3726
3727
            /* if using status_request and already sending it, remove it
3728
             * and prefer to use the v2 version */
3729
            #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
3730
            if (ssl->status_request) {
3731
                ssl->status_request = 0;
3732
                TLSX_Remove(&ssl->extensions, TLSX_STATUS_REQUEST, ssl->heap);
3733
            }
3734
            #endif
3735
3736
            /* TLS 1.3 servers MUST NOT act upon presence or information in
3737
             * this extension (RFC 8448 Section 4.4.2.1).
3738
             */
3739
            if (!IsAtLeastTLSv1_3(ssl->version)) {
3740
                /* accept the first good status_type and return */
3741
                ret = TLSX_UseCertificateStatusRequestV2(&ssl->extensions,
3742
                                         status_type, 0, ssl->heap, ssl->devId);
3743
                if (ret != WOLFSSL_SUCCESS)
3744
                    return ret; /* throw error */
3745
3746
                TLSX_SetResponse(ssl, TLSX_STATUS_REQUEST_V2);
3747
                ssl->status_request_v2 = status_type;
3748
            }
3749
3750
            return 0;
3751
        }
3752
#endif
3753
    }
3754
3755
    return 0;
3756
}
3757
3758
int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer,
3759
                                                                     void* heap)
3760
{
3761
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
3762
    CertificateStatusRequestItemV2* csr2 = extension ?
3763
        (CertificateStatusRequestItemV2*)extension->data : NULL;
3764
    int ret = 0;
3765
3766
    for (; csr2; csr2 = csr2->next) {
3767
        switch (csr2->status_type) {
3768
            case WOLFSSL_CSR2_OCSP:
3769
                if (!isPeer || csr2->requests != 0)
3770
                    break;
3771
3772
                FALL_THROUGH; /* followed by */
3773
3774
            case WOLFSSL_CSR2_OCSP_MULTI: {
3775
                if (csr2->requests < 1 + MAX_CHAIN_DEPTH) {
3776
                    byte nonce[MAX_OCSP_NONCE_SZ];
3777
                    int  nonceSz = csr2->request.ocsp[0].nonceSz;
3778
3779
                    /* preserve nonce, replicating nonce of ocsp[0] */
3780
                    XMEMCPY(nonce, csr2->request.ocsp[0].nonce, nonceSz);
3781
3782
                    if ((ret = InitOcspRequest(
3783
                                      &csr2->request.ocsp[csr2->requests], cert,
3784
                                                                 0, heap)) != 0)
3785
                        return ret;
3786
3787
                    /* restore nonce */
3788
                    XMEMCPY(csr2->request.ocsp[csr2->requests].nonce,
3789
                                                                nonce, nonceSz);
3790
                    csr2->request.ocsp[csr2->requests].nonceSz = nonceSz;
3791
                    csr2->requests++;
3792
                }
3793
            }
3794
            break;
3795
        }
3796
    }
3797
3798
    (void)cert;
3799
    return ret;
3800
}
3801
3802
void* TLSX_CSR2_GetRequest(TLSX* extensions, byte status_type, byte idx)
3803
{
3804
    TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2);
3805
    CertificateStatusRequestItemV2* csr2 = extension ?
3806
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3807
3808
    for (; csr2; csr2 = csr2->next) {
3809
        if (csr2->status_type == status_type) {
3810
            switch (csr2->status_type) {
3811
                case WOLFSSL_CSR2_OCSP:
3812
                    /* followed by */
3813
3814
                case WOLFSSL_CSR2_OCSP_MULTI:
3815
                    /* requests are initialized in the reverse order */
3816
                    return idx < csr2->requests
3817
                         ? &csr2->request.ocsp[csr2->requests - idx - 1]
3818
                         : NULL;
3819
            }
3820
        }
3821
    }
3822
3823
    return NULL;
3824
}
3825
3826
int TLSX_CSR2_ForceRequest(WOLFSSL* ssl)
3827
{
3828
    TLSX* extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST_V2);
3829
    CertificateStatusRequestItemV2* csr2 = extension ?
3830
                        (CertificateStatusRequestItemV2*)extension->data : NULL;
3831
3832
    /* forces only the first one */
3833
    if (csr2) {
3834
        switch (csr2->status_type) {
3835
            case WOLFSSL_CSR2_OCSP:
3836
                /* followed by */
3837
3838
            case WOLFSSL_CSR2_OCSP_MULTI:
3839
                if (SSL_CM(ssl)->ocspEnabled) {
3840
                    csr2->request.ocsp[0].ssl = ssl;
3841
                    return CheckOcspRequest(SSL_CM(ssl)->ocsp,
3842
                                          &csr2->request.ocsp[0], NULL, NULL);
3843
                }
3844
                else {
3845
                    WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL);
3846
                    return OCSP_LOOKUP_FAIL;
3847
                }
3848
        }
3849
    }
3850
3851
    return 0;
3852
}
3853
3854
int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type,
3855
                                           byte options, void* heap, int devId)
3856
{
3857
    TLSX* extension = NULL;
3858
    CertificateStatusRequestItemV2* csr2 = NULL;
3859
    int ret = 0;
3860
3861
    if (!extensions)
3862
        return BAD_FUNC_ARG;
3863
3864
    if (status_type != WOLFSSL_CSR2_OCSP
3865
    &&  status_type != WOLFSSL_CSR2_OCSP_MULTI)
3866
        return BAD_FUNC_ARG;
3867
3868
    csr2 = (CertificateStatusRequestItemV2*)
3869
       XMALLOC(sizeof(CertificateStatusRequestItemV2), heap, DYNAMIC_TYPE_TLSX);
3870
    if (!csr2)
3871
        return MEMORY_E;
3872
3873
    ForceZero(csr2, sizeof(CertificateStatusRequestItemV2));
3874
3875
    csr2->status_type = status_type;
3876
    csr2->options     = options;
3877
    csr2->next        = NULL;
3878
3879
    switch (csr2->status_type) {
3880
        case WOLFSSL_CSR2_OCSP:
3881
        case WOLFSSL_CSR2_OCSP_MULTI:
3882
            if (options & WOLFSSL_CSR2_OCSP_USE_NONCE) {
3883
                WC_RNG rng;
3884
3885
            #ifndef HAVE_FIPS
3886
                ret = wc_InitRng_ex(&rng, heap, devId);
3887
            #else
3888
                ret = wc_InitRng(&rng);
3889
                (void)devId;
3890
            #endif
3891
                if (ret == 0) {
3892
                    if (wc_RNG_GenerateBlock(&rng, csr2->request.ocsp[0].nonce,
3893
                                                        MAX_OCSP_NONCE_SZ) == 0)
3894
                        csr2->request.ocsp[0].nonceSz = MAX_OCSP_NONCE_SZ;
3895
3896
                    wc_FreeRng(&rng);
3897
                }
3898
            }
3899
        break;
3900
    }
3901
3902
    /* append new item */
3903
    if ((extension = TLSX_Find(*extensions, TLSX_STATUS_REQUEST_V2))) {
3904
        CertificateStatusRequestItemV2* last =
3905
                               (CertificateStatusRequestItemV2*)extension->data;
3906
3907
        for (; last->next; last = last->next);
3908
3909
        last->next = csr2;
3910
    }
3911
    else if ((ret = TLSX_Push(extensions, TLSX_STATUS_REQUEST_V2, csr2,heap))) {
3912
        XFREE(csr2, heap, DYNAMIC_TYPE_TLSX);
3913
        return ret;
3914
    }
3915
3916
    return WOLFSSL_SUCCESS;
3917
}
3918
3919
#define CSR2_FREE_ALL TLSX_CSR2_FreeAll
3920
#define CSR2_GET_SIZE TLSX_CSR2_GetSize
3921
#define CSR2_WRITE    TLSX_CSR2_Write
3922
#define CSR2_PARSE    TLSX_CSR2_Parse
3923
3924
#else
3925
3926
0
#define CSR2_FREE_ALL(data, heap) WC_DO_NOTHING
3927
0
#define CSR2_GET_SIZE(a, b)    0
3928
0
#define CSR2_WRITE(a, b, c)    0
3929
0
#define CSR2_PARSE(a, b, c, d) 0
3930
3931
#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */
3932
3933
/******************************************************************************/
3934
/* Supported Elliptic Curves                                                  */
3935
/******************************************************************************/
3936
3937
#ifdef HAVE_SUPPORTED_CURVES
3938
3939
#if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \
3940
                       && !defined(HAVE_FFDHE) && !defined(HAVE_PQC)
3941
#error Elliptic Curves Extension requires Elliptic Curve Cryptography or liboqs groups. \
3942
       Use --enable-ecc and/or --enable-liboqs in the configure script or \
3943
       define HAVE_ECC. Alternatively use FFDHE for DH cipher suites.
3944
#endif
3945
3946
static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name,
3947
                                                                     void* heap)
3948
0
{
3949
0
    if (curve == NULL)
3950
0
        return BAD_FUNC_ARG;
3951
3952
0
    (void)heap;
3953
3954
0
    *curve = (SupportedCurve*)XMALLOC(sizeof(SupportedCurve), heap,
3955
0
                                                             DYNAMIC_TYPE_TLSX);
3956
0
    if (*curve == NULL)
3957
0
        return MEMORY_E;
3958
3959
0
    (*curve)->name = name;
3960
0
    (*curve)->next = NULL;
3961
3962
0
    return 0;
3963
0
}
3964
3965
static int TLSX_PointFormat_New(PointFormat** point, byte format, void* heap)
3966
0
{
3967
0
    if (point == NULL)
3968
0
        return BAD_FUNC_ARG;
3969
3970
0
    (void)heap;
3971
3972
0
    *point = (PointFormat*)XMALLOC(sizeof(PointFormat), heap,
3973
0
                                                             DYNAMIC_TYPE_TLSX);
3974
0
    if (*point == NULL)
3975
0
        return MEMORY_E;
3976
3977
0
    (*point)->format = format;
3978
0
    (*point)->next = NULL;
3979
3980
0
    return 0;
3981
0
}
3982
3983
static void TLSX_SupportedCurve_FreeAll(SupportedCurve* list, void* heap)
3984
0
{
3985
0
    SupportedCurve* curve;
3986
3987
0
    while ((curve = list)) {
3988
0
        list = curve->next;
3989
0
        XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
3990
0
    }
3991
0
    (void)heap;
3992
0
}
3993
3994
static void TLSX_PointFormat_FreeAll(PointFormat* list, void* heap)
3995
0
{
3996
0
    PointFormat* point;
3997
3998
0
    while ((point = list)) {
3999
0
        list = point->next;
4000
0
        XFREE(point, heap, DYNAMIC_TYPE_TLSX);
4001
0
    }
4002
0
    (void)heap;
4003
0
}
4004
4005
static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name,
4006
                                                                     void* heap)
4007
0
{
4008
0
    int ret = BAD_FUNC_ARG;
4009
4010
0
    while (list) {
4011
0
        if (list->name == name) {
4012
0
            ret = 0; /* curve already in use */
4013
0
            break;
4014
0
        }
4015
4016
0
        if (list->next == NULL) {
4017
0
            ret = TLSX_SupportedCurve_New(&list->next, name, heap);
4018
0
            break;
4019
0
        }
4020
4021
0
        list = list->next;
4022
0
    }
4023
4024
0
    return ret;
4025
0
}
4026
4027
static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap)
4028
0
{
4029
0
    int ret = BAD_FUNC_ARG;
4030
4031
0
    while (list) {
4032
0
        if (list->format == format) {
4033
0
            ret = 0; /* format already in use */
4034
0
            break;
4035
0
        }
4036
4037
0
        if (list->next == NULL) {
4038
0
            ret = TLSX_PointFormat_New(&list->next, format, heap);
4039
0
            break;
4040
0
        }
4041
4042
0
        list = list->next;
4043
0
    }
4044
4045
0
    return ret;
4046
0
}
4047
4048
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
4049
4050
#if defined(HAVE_FFDHE) && (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4051
                                                         defined(HAVE_CURVE448))
4052
static void TLSX_SupportedCurve_ValidateRequest(const WOLFSSL* ssl,
4053
                                                const byte* semaphore)
4054
0
{
4055
    /* If all pre-defined parameter types for key exchange are supported then
4056
     * always send SupportedGroups extension.
4057
     */
4058
0
    (void)ssl;
4059
0
    (void)semaphore;
4060
0
}
4061
#else
4062
static void TLSX_SupportedCurve_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4063
{
4064
    word16 i;
4065
    const Suites* suites = WOLFSSL_SUITES(ssl);
4066
4067
    for (i = 0; i < suites->suiteSz; i += 2) {
4068
        if (suites->suites[i] == TLS13_BYTE)
4069
            return;
4070
    #ifdef BUILD_TLS_SM4_GCM_SM3
4071
        if ((suites->suites[i] == CIPHER_BYTE) &&
4072
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
4073
            return;
4074
    #endif
4075
    #ifdef BUILD_TLS_SM4_CCM_SM3
4076
        if ((suites->suites[i] == CIPHER_BYTE) &&
4077
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
4078
            return;
4079
    #endif
4080
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4081
        if ((suites->suites[i] == SM_BYTE) &&
4082
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4083
            return;
4084
    #endif
4085
        if ((suites->suites[i] == ECC_BYTE) ||
4086
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4087
            (suites->suites[i] == CHACHA_BYTE)) {
4088
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4089
                                                          defined(HAVE_CURVE448)
4090
            return;
4091
        #endif
4092
        }
4093
        #ifdef HAVE_FFDHE
4094
        else {
4095
            return;
4096
        }
4097
        #endif
4098
    }
4099
4100
    /* turns semaphore on to avoid sending this extension. */
4101
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_GROUPS));
4102
}
4103
#endif
4104
4105
/* Only send PointFormats if TLSv13, ECC or CHACHA cipher suite present.
4106
 */
4107
static void TLSX_PointFormat_ValidateRequest(WOLFSSL* ssl, byte* semaphore)
4108
0
{
4109
0
#ifdef HAVE_FFDHE
4110
0
    (void)ssl;
4111
0
    (void)semaphore;
4112
#else
4113
    word16 i;
4114
    const Suites* suites = WOLFSSL_SUITES(ssl);
4115
4116
    if (suites == NULL)
4117
        return;
4118
4119
    for (i = 0; i < suites->suiteSz; i += 2) {
4120
        if (suites->suites[i] == TLS13_BYTE)
4121
            return;
4122
    #ifdef BUILD_TLS_SM4_GCM_SM3
4123
        if ((suites->suites[i] == CIPHER_BYTE) &&
4124
            (suites->suites[i+1] == TLS_SM4_GCM_SM3))
4125
            return;
4126
    #endif
4127
    #ifdef BUILD_TLS_SM4_CCM_SM3
4128
        if ((suites->suites[i] == CIPHER_BYTE) &&
4129
            (suites->suites[i+1] == TLS_SM4_CCM_SM3))
4130
            return;
4131
    #endif
4132
    #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4133
        if ((suites->suites[i] == SM_BYTE) &&
4134
            (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4135
            return;
4136
    #endif
4137
        if ((suites->suites[i] == ECC_BYTE) ||
4138
            (suites->suites[i] == ECDHE_PSK_BYTE) ||
4139
            (suites->suites[i] == CHACHA_BYTE)) {
4140
        #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4141
                                                          defined(HAVE_CURVE448)
4142
            return;
4143
        #endif
4144
        }
4145
    }
4146
   /* turns semaphore on to avoid sending this extension. */
4147
   TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4148
#endif
4149
0
}
4150
4151
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
4152
4153
#ifndef NO_WOLFSSL_SERVER
4154
4155
static void TLSX_PointFormat_ValidateResponse(WOLFSSL* ssl, byte* semaphore)
4156
0
{
4157
0
#if defined(HAVE_FFDHE) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4158
0
                                                          defined(HAVE_CURVE448)
4159
0
    (void)semaphore;
4160
0
#endif
4161
4162
0
    if (ssl->options.cipherSuite0 == TLS13_BYTE)
4163
0
        return;
4164
#ifdef BUILD_TLS_SM4_GCM_SM3
4165
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
4166
        (ssl->options.cipherSuite == TLS_SM4_GCM_SM3))
4167
        return;
4168
#endif
4169
#ifdef BUILD_TLS_SM4_CCM_SM3
4170
    if ((ssl->options.cipherSuite0 == CIPHER_BYTE) &&
4171
        (ssl->options.cipherSuite == TLS_SM4_CCM_SM3))
4172
        return;
4173
#endif
4174
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3
4175
    if ((ssl->options.cipherSuite0 == SM_BYTE) &&
4176
        (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3))
4177
        return;
4178
#endif
4179
0
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
4180
0
    if (ssl->options.cipherSuite0 == ECC_BYTE ||
4181
0
        ssl->options.cipherSuite0 == ECDHE_PSK_BYTE ||
4182
0
        ssl->options.cipherSuite0 == CHACHA_BYTE) {
4183
0
        return;
4184
0
    }
4185
0
#endif
4186
4187
    /* turns semaphore on to avoid sending this extension. */
4188
0
    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
4189
0
}
4190
4191
#endif /* !NO_WOLFSSL_SERVER */
4192
4193
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
4194
4195
static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list)
4196
0
{
4197
0
    SupportedCurve* curve;
4198
0
    word16 length = OPAQUE16_LEN; /* list length */
4199
4200
0
    while ((curve = list)) {
4201
0
        list = curve->next;
4202
0
        length += OPAQUE16_LEN; /* curve length */
4203
0
    }
4204
4205
0
    return length;
4206
0
}
4207
4208
#endif
4209
4210
static word16 TLSX_PointFormat_GetSize(PointFormat* list)
4211
0
{
4212
0
    PointFormat* point;
4213
0
    word16 length = ENUM_LEN; /* list length */
4214
4215
0
    while ((point = list)) {
4216
0
        list = point->next;
4217
0
        length += ENUM_LEN; /* format length */
4218
0
    }
4219
4220
0
    return length;
4221
0
}
4222
4223
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
4224
4225
static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output)
4226
0
{
4227
0
    word16 offset = OPAQUE16_LEN;
4228
4229
0
    while (list) {
4230
0
        c16toa(list->name, output + offset);
4231
0
        offset += OPAQUE16_LEN;
4232
0
        list = list->next;
4233
0
    }
4234
4235
0
    c16toa(offset - OPAQUE16_LEN, output); /* writing list length */
4236
4237
0
    return offset;
4238
0
}
4239
4240
#endif
4241
4242
static word16 TLSX_PointFormat_Write(PointFormat* list, byte* output)
4243
0
{
4244
0
    word16 offset = ENUM_LEN;
4245
4246
0
    while (list) {
4247
0
        output[offset++] = list->format;
4248
0
        list = list->next;
4249
0
    }
4250
4251
0
    output[0] = (byte)(offset - ENUM_LEN);
4252
4253
0
    return offset;
4254
0
}
4255
4256
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
4257
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
4258
4259
int TLSX_SupportedCurve_Parse(const WOLFSSL* ssl, const byte* input,
4260
                              word16 length, byte isRequest, TLSX** extensions)
4261
0
{
4262
0
    word16 offset;
4263
0
    word16 name;
4264
0
    int ret;
4265
4266
0
    if(!isRequest && !IsAtLeastTLSv1_3(ssl->version)) {
4267
#ifdef WOLFSSL_ALLOW_SERVER_SC_EXT
4268
        return 0;
4269
#else
4270
0
        return BUFFER_ERROR; /* servers doesn't send this extension. */
4271
0
#endif
4272
0
    }
4273
4274
0
    if (OPAQUE16_LEN > length || length % OPAQUE16_LEN)
4275
0
        return BUFFER_ERROR;
4276
4277
0
    ato16(input, &offset);
4278
4279
    /* validating curve list length */
4280
0
    if (length != OPAQUE16_LEN + offset)
4281
0
        return BUFFER_ERROR;
4282
4283
0
    offset = OPAQUE16_LEN;
4284
0
    if (offset == length)
4285
0
        return 0;
4286
4287
0
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
4288
0
    if (!isRequest) {
4289
0
        TLSX* extension;
4290
0
        SupportedCurve* curve;
4291
4292
0
        extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
4293
0
        if (extension != NULL) {
4294
            /* Replace client list with server list of supported groups. */
4295
0
            curve = (SupportedCurve*)extension->data;
4296
0
            extension->data = NULL;
4297
0
            TLSX_SupportedCurve_FreeAll(curve, ssl->heap);
4298
4299
0
            ato16(input + offset, &name);
4300
0
            offset += OPAQUE16_LEN;
4301
4302
0
            ret = TLSX_SupportedCurve_New(&curve, name, ssl->heap);
4303
0
            if (ret != 0)
4304
0
                return ret; /* throw error */
4305
0
            extension->data = (void*)curve;
4306
0
        }
4307
0
    }
4308
0
#endif
4309
4310
0
    for (; offset < length; offset += OPAQUE16_LEN) {
4311
0
        ato16(input + offset, &name);
4312
4313
0
        ret = TLSX_UseSupportedCurve(extensions, name, ssl->heap);
4314
        /* If it is BAD_FUNC_ARG then it is a group we do not support, but
4315
         * that is fine. */
4316
0
        if (ret != WOLFSSL_SUCCESS && ret != BAD_FUNC_ARG) {
4317
0
            return ret;
4318
0
        }
4319
0
    }
4320
4321
0
    return 0;
4322
0
}
4323
4324
#endif
4325
4326
#if !defined(NO_WOLFSSL_SERVER)
4327
4328
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
4329
4330
/* Checks the priority of the groups on the server and set the supported groups
4331
 * response if there is a group not advertised by the client that is preferred.
4332
 *
4333
 * ssl  SSL/TLS object.
4334
 * returns 0 on success, otherwise an error.
4335
 */
4336
int TLSX_SupportedCurve_CheckPriority(WOLFSSL* ssl)
4337
0
{
4338
0
    int ret;
4339
0
    TLSX* extension;
4340
0
    TLSX* priority = NULL;
4341
0
    TLSX* ext = NULL;
4342
0
    word16 name;
4343
0
    SupportedCurve* curve;
4344
4345
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
4346
    /* May be doing PSK with no key exchange. */
4347
0
    if (extension == NULL)
4348
0
        return 0;
4349
4350
0
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
4351
0
    if (ret != WOLFSSL_SUCCESS) {
4352
0
        TLSX_FreeAll(priority, ssl->heap);
4353
0
        return ret;
4354
0
    }
4355
4356
0
    ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
4357
0
    if (ext == NULL) {
4358
0
        WOLFSSL_MSG("Could not find supported groups extension");
4359
0
        TLSX_FreeAll(priority, ssl->heap);
4360
0
        return 0;
4361
0
    }
4362
4363
0
    curve = (SupportedCurve*)ext->data;
4364
0
    name = curve->name;
4365
4366
0
    curve = (SupportedCurve*)extension->data;
4367
0
    while (curve != NULL) {
4368
0
        if (curve->name == name)
4369
0
            break;
4370
0
        curve = curve->next;
4371
0
    }
4372
4373
0
    if (curve == NULL) {
4374
        /* Couldn't find the preferred group in client list. */
4375
0
        extension->resp = 1;
4376
4377
        /* Send server list back and free client list. */
4378
0
        curve = (SupportedCurve*)extension->data;
4379
0
        extension->data = ext->data;
4380
0
        ext->data = curve;
4381
0
    }
4382
4383
0
    TLSX_FreeAll(priority, ssl->heap);
4384
4385
0
    return 0;
4386
0
}
4387
4388
#endif /* WOLFSSL_TLS13 && !WOLFSSL_NO_SERVER_GROUPS_EXT */
4389
4390
#if defined(HAVE_FFDHE) && !defined(WOLFSSL_NO_TLS12)
4391
#ifdef HAVE_PUBLIC_FFDHE
4392
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
4393
    SupportedCurve* serverGroup)
4394
0
{
4395
0
    int ret = 0;
4396
0
    SupportedCurve* group;
4397
0
    const DhParams* params = NULL;
4398
4399
0
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
4400
0
        if (!WOLFSSL_NAMED_GROUP_IS_FFHDE(serverGroup->name))
4401
0
            continue;
4402
4403
0
        for (group = clientGroup; group != NULL; group = group->next) {
4404
0
            if (serverGroup->name != group->name)
4405
0
                continue;
4406
4407
0
            switch (serverGroup->name) {
4408
0
            #ifdef HAVE_FFDHE_2048
4409
0
                case WOLFSSL_FFDHE_2048:
4410
0
                    params = wc_Dh_ffdhe2048_Get();
4411
0
                    break;
4412
0
            #endif
4413
            #ifdef HAVE_FFDHE_3072
4414
                case WOLFSSL_FFDHE_3072:
4415
                    params = wc_Dh_ffdhe3072_Get();
4416
                    break;
4417
            #endif
4418
            #ifdef HAVE_FFDHE_4096
4419
                case WOLFSSL_FFDHE_4096:
4420
                    params = wc_Dh_ffdhe4096_Get();
4421
                    break;
4422
            #endif
4423
            #ifdef HAVE_FFDHE_6144
4424
                case WOLFSSL_FFDHE_6144:
4425
                    params = wc_Dh_ffdhe6144_Get();
4426
                    break;
4427
            #endif
4428
            #ifdef HAVE_FFDHE_8192
4429
                case WOLFSSL_FFDHE_8192:
4430
                    params = wc_Dh_ffdhe8192_Get();
4431
                    break;
4432
            #endif
4433
0
                default:
4434
0
                    break;
4435
0
            }
4436
0
            if (params == NULL) {
4437
0
                ret = BAD_FUNC_ARG;
4438
0
                break;
4439
0
            }
4440
0
            if (params->p_len >= ssl->options.minDhKeySz &&
4441
0
                                     params->p_len <= ssl->options.maxDhKeySz) {
4442
0
                break;
4443
0
            }
4444
0
        }
4445
4446
0
        if (ret != 0)
4447
0
            break;
4448
0
        if ((group != NULL) && (serverGroup->name == group->name))
4449
0
            break;
4450
0
    }
4451
4452
0
    if ((ret == 0) && (serverGroup != NULL) && (params != NULL)) {
4453
0
        ssl->buffers.serverDH_P.buffer = (unsigned char *)params->p;
4454
0
        ssl->buffers.serverDH_P.length = params->p_len;
4455
0
        ssl->buffers.serverDH_G.buffer = (unsigned char *)params->g;
4456
0
        ssl->buffers.serverDH_G.length = params->g_len;
4457
4458
0
        ssl->namedGroup = serverGroup->name;
4459
0
    #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
4460
0
        !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
4461
0
        ssl->options.dhDoKeyTest = 0;
4462
0
    #endif
4463
0
        ssl->options.haveDH = 1;
4464
0
    }
4465
4466
0
    return ret;
4467
0
}
4468
#else
4469
static int tlsx_ffdhe_find_group(WOLFSSL* ssl, SupportedCurve* clientGroup,
4470
    SupportedCurve* serverGroup)
4471
{
4472
    int ret = 0;
4473
    SupportedCurve* group;
4474
    word32 p_len;
4475
4476
    for (; serverGroup != NULL; serverGroup = serverGroup->next) {
4477
        if (!WOLFSSL_NAMED_GROUP_IS_FFHDE(serverGroup->name))
4478
            continue;
4479
4480
        for (group = clientGroup; group != NULL; group = group->next) {
4481
            if (serverGroup->name != group->name)
4482
                continue;
4483
4484
            wc_DhGetNamedKeyParamSize(serverGroup->name, &p_len, NULL, NULL);
4485
            if (p_len == 0) {
4486
                ret = BAD_FUNC_ARG;
4487
                break;
4488
            }
4489
            if (p_len >= ssl->options.minDhKeySz &&
4490
                                             p_len <= ssl->options.maxDhKeySz) {
4491
                break;
4492
            }
4493
        }
4494
4495
        if (ret != 0)
4496
            break;
4497
        if ((group != NULL) && (serverGroup->name == group->name))
4498
            break;
4499
    }
4500
4501
    if ((ret == 0) && (serverGroup != NULL)) {
4502
        word32 pSz, gSz;
4503
4504
        ssl->buffers.serverDH_P.buffer = NULL;
4505
        ssl->buffers.serverDH_G.buffer = NULL;
4506
        ret = wc_DhGetNamedKeyParamSize(serverGroup->name, &pSz, &gSz, NULL);
4507
        if (ret == 0) {
4508
            ssl->buffers.serverDH_P.buffer =
4509
                (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
4510
            if (ssl->buffers.serverDH_P.buffer == NULL)
4511
                ret = MEMORY_E;
4512
            else
4513
                ssl->buffers.serverDH_P.length = pSz;
4514
        }
4515
        if (ret == 0) {
4516
            ssl->buffers.serverDH_G.buffer =
4517
                (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
4518
            if (ssl->buffers.serverDH_G.buffer == NULL) {
4519
                ret = MEMORY_E;
4520
            } else
4521
                ssl->buffers.serverDH_G.length = gSz;
4522
        }
4523
        if (ret == 0) {
4524
            ret = wc_DhCopyNamedKey(serverGroup->name,
4525
                              ssl->buffers.serverDH_P.buffer, &pSz,
4526
                              ssl->buffers.serverDH_G.buffer, &gSz,
4527
                              NULL, NULL);
4528
        }
4529
        if (ret == 0) {
4530
            ssl->buffers.weOwnDH = 1;
4531
4532
            ssl->namedGroup = serverGroup->name;
4533
        #if !defined(WOLFSSL_OLD_PRIME_CHECK) && \
4534
            !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
4535
            ssl->options.dhDoKeyTest = 0;
4536
        #endif
4537
            ssl->options.haveDH = 1;
4538
        }
4539
        else {
4540
            if (ssl->buffers.serverDH_P.buffer != NULL) {
4541
                XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
4542
                    DYNAMIC_TYPE_PUBLIC_KEY);
4543
                ssl->buffers.serverDH_P.length = 0;
4544
                ssl->buffers.serverDH_P.buffer = NULL;
4545
            }
4546
            if (ssl->buffers.serverDH_G.buffer != NULL) {
4547
                XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
4548
                    DYNAMIC_TYPE_PUBLIC_KEY);
4549
                ssl->buffers.serverDH_G.length = 0;
4550
                ssl->buffers.serverDH_G.buffer = NULL;
4551
            }
4552
        }
4553
    }
4554
4555
    return ret;
4556
}
4557
#endif
4558
4559
/* Set the highest priority common FFDHE group on the server as compared to
4560
 * client extensions.
4561
 *
4562
 * ssl    SSL/TLS object.
4563
 * returns 0 on success, otherwise an error.
4564
 */
4565
int TLSX_SupportedFFDHE_Set(WOLFSSL* ssl)
4566
0
{
4567
0
    int ret;
4568
0
    TLSX* priority = NULL;
4569
0
    TLSX* ext = NULL;
4570
0
    TLSX* extension;
4571
0
    SupportedCurve* clientGroup;
4572
0
    SupportedCurve* group;
4573
0
    int found = 0;
4574
4575
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
4576
    /* May be doing PSK with no key exchange. */
4577
0
    if (extension == NULL)
4578
0
        return 0;
4579
0
    clientGroup = (SupportedCurve*)extension->data;
4580
0
    for (group = clientGroup; group != NULL; group = group->next) {
4581
0
        if (WOLFSSL_NAMED_GROUP_IS_FFHDE(group->name)) {
4582
0
            found = 1;
4583
0
            break;
4584
0
        }
4585
0
    }
4586
0
    if (!found)
4587
0
        return 0;
4588
4589
0
    if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) {
4590
0
        XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap,
4591
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
4592
0
    }
4593
0
    if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) {
4594
0
        XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap,
4595
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
4596
0
    }
4597
0
    ssl->buffers.serverDH_P.buffer = NULL;
4598
0
    ssl->buffers.serverDH_G.buffer = NULL;
4599
0
    ssl->buffers.weOwnDH = 0;
4600
0
    ssl->options.haveDH = 0;
4601
4602
0
    ret = TLSX_PopulateSupportedGroups(ssl, &priority);
4603
0
    if (ret == WOLFSSL_SUCCESS) {
4604
0
        SupportedCurve* serverGroup;
4605
4606
0
        ext = TLSX_Find(priority, TLSX_SUPPORTED_GROUPS);
4607
0
        serverGroup = (SupportedCurve*)ext->data;
4608
4609
0
        ret = tlsx_ffdhe_find_group(ssl, clientGroup, serverGroup);
4610
0
    }
4611
4612
0
    TLSX_FreeAll(priority, ssl->heap);
4613
4614
0
    return ret;
4615
0
}
4616
#endif /* HAVE_FFDHE && !WOLFSSL_NO_TLS12 */
4617
4618
#endif /* !NO_WOLFSSL_SERVER */
4619
4620
#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_SERVER_GROUPS_EXT)
4621
/* Return the preferred group.
4622
 *
4623
 * ssl             SSL/TLS object.
4624
 * checkSupported  Whether to check for the first supported group.
4625
 * returns BAD_FUNC_ARG if no group found, otherwise the group.
4626
 */
4627
int TLSX_SupportedCurve_Preferred(WOLFSSL* ssl, int checkSupported)
4628
0
{
4629
0
    TLSX* extension;
4630
0
    SupportedCurve* curve;
4631
4632
0
    extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
4633
0
    if (extension == NULL)
4634
0
        return BAD_FUNC_ARG;
4635
4636
0
    curve = (SupportedCurve*)extension->data;
4637
0
    while (curve != NULL) {
4638
0
        if (!checkSupported || TLSX_KeyShare_IsSupported(curve->name))
4639
0
            return curve->name;
4640
0
        curve = curve->next;
4641
0
    }
4642
4643
0
    return BAD_FUNC_ARG;
4644
0
}
4645
4646
#endif /* HAVE_SUPPORTED_CURVES */
4647
4648
#ifndef NO_WOLFSSL_SERVER
4649
4650
static int TLSX_PointFormat_Parse(WOLFSSL* ssl, const byte* input,
4651
                                  word16 length, byte isRequest)
4652
0
{
4653
0
    int ret;
4654
4655
    /* validating formats list length */
4656
0
    if (ENUM_LEN > length || length != (word16)ENUM_LEN + input[0])
4657
0
        return BUFFER_ERROR;
4658
4659
0
    if (isRequest) {
4660
        /* adding uncompressed point format to response */
4661
0
        ret = TLSX_UsePointFormat(&ssl->extensions, WOLFSSL_EC_PF_UNCOMPRESSED,
4662
0
                                                                     ssl->heap);
4663
0
        if (ret != WOLFSSL_SUCCESS)
4664
0
            return ret; /* throw error */
4665
4666
0
        TLSX_SetResponse(ssl, TLSX_EC_POINT_FORMATS);
4667
0
    }
4668
4669
0
    return 0;
4670
0
}
4671
4672
#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
4673
int TLSX_ValidateSupportedCurves(const WOLFSSL* ssl, byte first, byte second,
4674
0
                                 word32* ecdhCurveOID) {
4675
0
    TLSX*           extension = NULL;
4676
0
    SupportedCurve* curve     = NULL;
4677
0
    word32          oid       = 0;
4678
0
    word32          defOid    = 0;
4679
0
    word32          defSz     = 80; /* Maximum known curve size is 66. */
4680
0
    word32          nextOid   = 0;
4681
0
    word32          nextSz    = 80; /* Maximum known curve size is 66. */
4682
0
    word32          currOid   = ssl->ecdhCurveOID;
4683
0
    int             ephmSuite = 0;
4684
0
    word16          octets    = 0; /* according to 'ecc_set_type ecc_sets[];' */
4685
0
    int             key       = 0; /* validate key       */
4686
4687
0
    (void)oid;
4688
4689
0
    if (first == CHACHA_BYTE) {
4690
0
        switch (second) {
4691
0
            case TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
4692
0
            case TLS_PSK_WITH_CHACHA20_POLY1305_SHA256:
4693
0
            case TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
4694
0
            case TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
4695
0
                return 1; /* no suite restriction */
4696
0
            case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:
4697
0
            case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256:
4698
0
            case TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256:
4699
0
                break;
4700
0
        }
4701
0
    }
4702
0
    if (first == ECC_BYTE || first == ECDHE_PSK_BYTE || first == CHACHA_BYTE)
4703
0
        extension = TLSX_Find(ssl->extensions, TLSX_SUPPORTED_GROUPS);
4704
0
    if (!extension)
4705
0
        return 1; /* no suite restriction */
4706
4707
0
    for (curve = (SupportedCurve*)extension->data;
4708
0
         curve && !key;
4709
0
         curve = curve->next) {
4710
4711
    #ifdef OPENSSL_EXTRA
4712
        /* skip if name is not in supported ECC range
4713
         * or disabled by user */
4714
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
4715
            continue;
4716
    #endif
4717
4718
        /* find supported curve */
4719
0
        switch (curve->name) {
4720
0
#ifdef HAVE_ECC
4721
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
4722
        #ifndef NO_ECC_SECP
4723
            case WOLFSSL_ECC_SECP160R1:
4724
                oid = ECC_SECP160R1_OID;
4725
                octets = 20;
4726
                break;
4727
        #endif /* !NO_ECC_SECP */
4728
        #ifdef HAVE_ECC_SECPR2
4729
            case WOLFSSL_ECC_SECP160R2:
4730
                oid = ECC_SECP160R2_OID;
4731
                octets = 20;
4732
                break;
4733
        #endif /* HAVE_ECC_SECPR2 */
4734
        #ifdef HAVE_ECC_KOBLITZ
4735
            case WOLFSSL_ECC_SECP160K1:
4736
                oid = ECC_SECP160K1_OID;
4737
                octets = 20;
4738
                break;
4739
        #endif /* HAVE_ECC_KOBLITZ */
4740
        #endif
4741
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
4742
        #ifndef NO_ECC_SECP
4743
            case WOLFSSL_ECC_SECP192R1:
4744
                oid = ECC_SECP192R1_OID;
4745
                octets = 24;
4746
                break;
4747
        #endif /* !NO_ECC_SECP */
4748
        #ifdef HAVE_ECC_KOBLITZ
4749
            case WOLFSSL_ECC_SECP192K1:
4750
                oid = ECC_SECP192K1_OID;
4751
                octets = 24;
4752
                break;
4753
        #endif /* HAVE_ECC_KOBLITZ */
4754
    #endif
4755
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
4756
0
        #ifndef NO_ECC_SECP
4757
0
            case WOLFSSL_ECC_SECP224R1:
4758
0
                oid = ECC_SECP224R1_OID;
4759
0
                octets = 28;
4760
0
                break;
4761
0
        #endif /* !NO_ECC_SECP */
4762
0
        #ifdef HAVE_ECC_KOBLITZ
4763
0
            case WOLFSSL_ECC_SECP224K1:
4764
0
                oid = ECC_SECP224K1_OID;
4765
0
                octets = 28;
4766
0
                break;
4767
0
        #endif /* HAVE_ECC_KOBLITZ */
4768
0
    #endif
4769
0
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4770
0
        #ifndef NO_ECC_SECP
4771
0
            case WOLFSSL_ECC_SECP256R1:
4772
0
                oid = ECC_SECP256R1_OID;
4773
0
                octets = 32;
4774
0
                break;
4775
0
        #endif /* !NO_ECC_SECP */
4776
0
    #endif /* !NO_ECC256 || HAVE_ALL_CURVES */
4777
0
#endif
4778
0
        #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256
4779
0
            case WOLFSSL_ECC_X25519:
4780
0
                oid = ECC_X25519_OID;
4781
0
                octets = 32;
4782
0
                break;
4783
0
        #endif /* HAVE_CURVE25519 */
4784
0
#ifdef HAVE_ECC
4785
0
    #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
4786
0
        #ifdef HAVE_ECC_KOBLITZ
4787
0
            case WOLFSSL_ECC_SECP256K1:
4788
0
                oid = ECC_SECP256K1_OID;
4789
0
                octets = 32;
4790
0
                break;
4791
0
        #endif /* HAVE_ECC_KOBLITZ */
4792
0
        #ifdef HAVE_ECC_BRAINPOOL
4793
0
            case WOLFSSL_ECC_BRAINPOOLP256R1:
4794
0
                oid = ECC_BRAINPOOLP256R1_OID;
4795
0
                octets = 32;
4796
0
                break;
4797
0
        #endif /* HAVE_ECC_BRAINPOOL */
4798
0
        #ifdef WOLFSSL_SM2
4799
0
            case WOLFSSL_ECC_SM2P256V1:
4800
0
                oid = ECC_SM2P256V1_OID;
4801
0
                octets = 32;
4802
0
                break;
4803
0
        #endif /* WOLFSSL_SM2 */
4804
0
    #endif
4805
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
4806
0
        #ifndef NO_ECC_SECP
4807
0
            case WOLFSSL_ECC_SECP384R1:
4808
0
                oid = ECC_SECP384R1_OID;
4809
0
                octets = 48;
4810
0
                break;
4811
0
        #endif /* !NO_ECC_SECP */
4812
0
        #ifdef HAVE_ECC_BRAINPOOL
4813
0
            case WOLFSSL_ECC_BRAINPOOLP384R1:
4814
0
                oid = ECC_BRAINPOOLP384R1_OID;
4815
0
                octets = 48;
4816
0
                break;
4817
0
        #endif /* HAVE_ECC_BRAINPOOL */
4818
0
    #endif
4819
0
#endif
4820
0
        #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448
4821
0
            case WOLFSSL_ECC_X448:
4822
0
                oid = ECC_X448_OID;
4823
0
                octets = 57;
4824
0
                break;
4825
0
        #endif /* HAVE_CURVE448 */
4826
0
#ifdef HAVE_ECC
4827
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
4828
0
        #ifdef HAVE_ECC_BRAINPOOL
4829
0
            case WOLFSSL_ECC_BRAINPOOLP512R1:
4830
0
                oid = ECC_BRAINPOOLP512R1_OID;
4831
0
                octets = 64;
4832
0
                break;
4833
0
        #endif /* HAVE_ECC_BRAINPOOL */
4834
0
    #endif
4835
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
4836
0
        #ifndef NO_ECC_SECP
4837
0
            case WOLFSSL_ECC_SECP521R1:
4838
0
                oid = ECC_SECP521R1_OID;
4839
0
                octets = 66;
4840
0
                break;
4841
0
        #endif /* !NO_ECC_SECP */
4842
0
    #endif
4843
0
#endif
4844
0
            default: continue; /* unsupported curve */
4845
0
        }
4846
4847
0
    #ifdef HAVE_ECC
4848
        /* Set default Oid */
4849
0
        if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) {
4850
0
            defOid = oid;
4851
0
            defSz = octets;
4852
0
        }
4853
4854
        /* The eccTempKeySz is the preferred ephemeral key size */
4855
0
        if (currOid == 0 && ssl->eccTempKeySz == octets)
4856
0
            currOid = oid;
4857
0
        if ((nextOid == 0 || nextSz > octets) && ssl->eccTempKeySz <= octets) {
4858
0
            nextOid = oid;
4859
0
            nextSz  = octets;
4860
0
        }
4861
    #else
4862
        if (defOid == 0 && defSz > octets) {
4863
            defOid = oid;
4864
            defSz = octets;
4865
        }
4866
4867
        if (currOid == 0)
4868
            currOid = oid;
4869
        if (nextOid == 0 || nextSz > octets) {
4870
            nextOid = oid;
4871
            nextSz  = octets;
4872
        }
4873
    #endif
4874
4875
0
        if (first == ECC_BYTE) {
4876
0
            switch (second) {
4877
0
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
4878
                /* ECDHE_ECDSA */
4879
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
4880
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:
4881
0
                case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:
4882
0
                case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:
4883
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:
4884
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:
4885
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
4886
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
4887
0
                case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8:
4888
0
                case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8:
4889
0
                    key |= ssl->ecdhCurveOID == oid;
4890
0
                    ephmSuite = 1;
4891
0
                break;
4892
4893
    #ifdef WOLFSSL_STATIC_DH
4894
                /* ECDH_ECDSA */
4895
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
4896
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
4897
                case TLS_ECDH_ECDSA_WITH_RC4_128_SHA:
4898
                case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:
4899
                case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256:
4900
                case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384:
4901
                case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256:
4902
                case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384:
4903
                    if (oid == ECC_X25519_OID && defOid == oid) {
4904
                        defOid = 0;
4905
                        defSz = 80;
4906
                    }
4907
                    if (oid == ECC_X448_OID && defOid == oid) {
4908
                        defOid = 0;
4909
                        defSz = 80;
4910
                    }
4911
                    key |= ssl->pkCurveOID == oid;
4912
                break;
4913
    #endif /* WOLFSSL_STATIC_DH */
4914
0
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
4915
0
#ifndef NO_RSA
4916
                /* ECDHE_RSA */
4917
0
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
4918
0
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:
4919
0
                case TLS_ECDHE_RSA_WITH_RC4_128_SHA:
4920
0
                case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
4921
0
                case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:
4922
0
                case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
4923
0
                case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:
4924
0
                case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
4925
0
                    key |= ssl->ecdhCurveOID == oid;
4926
0
                    ephmSuite = 1;
4927
0
                break;
4928
4929
    #if defined(HAVE_ECC) && defined(WOLFSSL_STATIC_DH)
4930
                /* ECDH_RSA */
4931
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:
4932
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:
4933
                case TLS_ECDH_RSA_WITH_RC4_128_SHA:
4934
                case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:
4935
                case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256:
4936
                case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384:
4937
                case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256:
4938
                case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384:
4939
                    if (oid == ECC_X25519_OID && defOid == oid) {
4940
                        defOid = 0;
4941
                        defSz = 80;
4942
                    }
4943
                    if (oid == ECC_X448_OID && defOid == oid) {
4944
                        defOid = 0;
4945
                        defSz = 80;
4946
                    }
4947
                    key |= ssl->pkCurveOID == oid;
4948
                break;
4949
    #endif /* HAVE_ECC && WOLFSSL_STATIC_DH */
4950
0
#endif
4951
0
                default:
4952
0
                    if (oid == ECC_X25519_OID && defOid == oid) {
4953
0
                        defOid = 0;
4954
0
                        defSz = 80;
4955
0
                    }
4956
0
                    if (oid == ECC_X448_OID && defOid == oid) {
4957
0
                        defOid = 0;
4958
0
                        defSz = 80;
4959
0
                    }
4960
0
                    key = 1;
4961
0
                break;
4962
0
            }
4963
0
        }
4964
4965
        /* ChaCha20-Poly1305 ECC cipher suites */
4966
0
        if (first == CHACHA_BYTE) {
4967
0
            switch (second) {
4968
0
#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448)
4969
                /* ECDHE_ECDSA */
4970
0
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 :
4971
0
                case TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
4972
0
                    key |= ssl->ecdhCurveOID == oid;
4973
0
                    ephmSuite = 1;
4974
0
                break;
4975
0
#endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */
4976
0
#ifndef NO_RSA
4977
                /* ECDHE_RSA */
4978
0
                case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 :
4979
0
                case TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 :
4980
0
                    key |= ssl->ecdhCurveOID == oid;
4981
0
                    ephmSuite = 1;
4982
0
                break;
4983
0
#endif
4984
0
                default:
4985
0
                    key = 1;
4986
0
                break;
4987
0
            }
4988
0
        }
4989
0
    }
4990
4991
0
    *ecdhCurveOID = ssl->ecdhCurveOID;
4992
    /* Choose the default if it is at the required strength. */
4993
0
#ifdef HAVE_ECC
4994
0
    if (*ecdhCurveOID == 0 && defSz == ssl->eccTempKeySz)
4995
#else
4996
    if (*ecdhCurveOID == 0)
4997
#endif
4998
0
    {
4999
0
        key = 1;
5000
0
        *ecdhCurveOID = defOid;
5001
0
    }
5002
    /* Choose any curve at the required strength. */
5003
0
    if (*ecdhCurveOID == 0) {
5004
0
        key = 1;
5005
0
        *ecdhCurveOID = currOid;
5006
0
    }
5007
    /* Choose the default if it is at the next highest strength. */
5008
0
    if (*ecdhCurveOID == 0 && defSz == nextSz)
5009
0
        *ecdhCurveOID = defOid;
5010
    /* Choose any curve at the next highest strength. */
5011
0
    if (*ecdhCurveOID == 0)
5012
0
        *ecdhCurveOID = nextOid;
5013
    /* No curve and ephemeral ECC suite requires a matching curve. */
5014
0
    if (*ecdhCurveOID == 0 && ephmSuite)
5015
0
        key = 0;
5016
5017
0
    return key;
5018
0
}
5019
#endif
5020
5021
#endif /* NO_WOLFSSL_SERVER */
5022
5023
5024
int TLSX_SupportedCurve_Copy(TLSX* src, TLSX** dst, void* heap)
5025
0
{
5026
0
    TLSX* extension;
5027
0
    int ret;
5028
5029
0
    extension = TLSX_Find(src, TLSX_SUPPORTED_GROUPS);
5030
0
    if (extension != NULL) {
5031
0
        SupportedCurve* curve;
5032
0
        for (curve = (SupportedCurve*)extension->data; curve != NULL;
5033
0
                curve = curve->next) {
5034
0
            ret = TLSX_UseSupportedCurve(dst, curve->name, heap);
5035
0
            if (ret != WOLFSSL_SUCCESS)
5036
0
                return MEMORY_E;
5037
0
        }
5038
0
    }
5039
5040
0
    return 0;
5041
0
}
5042
5043
int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
5044
0
{
5045
0
    TLSX* extension = NULL;
5046
0
    SupportedCurve* curve = NULL;
5047
0
    int ret;
5048
5049
0
    if (extensions == NULL) {
5050
0
        return BAD_FUNC_ARG;
5051
0
    }
5052
5053
0
#ifdef WOLFSSL_TLS13
5054
0
    if (! TLSX_KeyShare_IsSupported(name)) {
5055
0
        return BAD_FUNC_ARG;
5056
0
    }
5057
0
#endif
5058
5059
0
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
5060
5061
0
    if (!extension) {
5062
0
        ret = TLSX_SupportedCurve_New(&curve, name, heap);
5063
0
        if (ret != 0)
5064
0
            return ret;
5065
5066
0
        ret = TLSX_Push(extensions, TLSX_SUPPORTED_GROUPS, curve, heap);
5067
0
        if (ret != 0) {
5068
0
            XFREE(curve, heap, DYNAMIC_TYPE_TLSX);
5069
0
            return ret;
5070
0
        }
5071
0
    }
5072
0
    else {
5073
0
        ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data, name,
5074
0
                                                                          heap);
5075
0
        if (ret != 0)
5076
0
            return ret;
5077
0
    }
5078
5079
0
    return WOLFSSL_SUCCESS;
5080
0
}
5081
5082
int TLSX_UsePointFormat(TLSX** extensions, byte format, void* heap)
5083
0
{
5084
0
    TLSX* extension = NULL;
5085
0
    PointFormat* point = NULL;
5086
0
    int ret = 0;
5087
5088
0
    if (extensions == NULL)
5089
0
        return BAD_FUNC_ARG;
5090
5091
0
    extension = TLSX_Find(*extensions, TLSX_EC_POINT_FORMATS);
5092
5093
0
    if (!extension) {
5094
0
        ret = TLSX_PointFormat_New(&point, format, heap);
5095
0
        if (ret != 0)
5096
0
            return ret;
5097
5098
0
        ret = TLSX_Push(extensions, TLSX_EC_POINT_FORMATS, point, heap);
5099
0
        if (ret != 0) {
5100
0
            XFREE(point, heap, DYNAMIC_TYPE_TLSX);
5101
0
            return ret;
5102
0
        }
5103
0
    }
5104
0
    else {
5105
0
        ret = TLSX_PointFormat_Append((PointFormat*)extension->data, format,
5106
0
                                                                          heap);
5107
0
        if (ret != 0)
5108
0
            return ret;
5109
0
    }
5110
5111
0
    return WOLFSSL_SUCCESS;
5112
0
}
5113
5114
0
#define EC_FREE_ALL         TLSX_SupportedCurve_FreeAll
5115
0
#define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest
5116
5117
/* In TLS 1.2 the server never sends supported curve extension, but in TLS 1.3
5118
 * the server can send supported groups extension to indicate what it will
5119
 * support for later connections. */
5120
#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13)
5121
0
#define EC_GET_SIZE TLSX_SupportedCurve_GetSize
5122
0
#define EC_WRITE    TLSX_SupportedCurve_Write
5123
#else
5124
#define EC_GET_SIZE(list)         0
5125
#define EC_WRITE(a, b)            0
5126
#endif
5127
5128
#if !defined(NO_WOLFSSL_SERVER) || (defined(WOLFSSL_TLS13) && \
5129
                                         !defined(WOLFSSL_NO_SERVER_GROUPS_EXT))
5130
0
#define EC_PARSE TLSX_SupportedCurve_Parse
5131
#else
5132
#define EC_PARSE(a, b, c, d, e)   0
5133
#endif
5134
5135
0
#define PF_FREE_ALL          TLSX_PointFormat_FreeAll
5136
0
#define PF_VALIDATE_REQUEST  TLSX_PointFormat_ValidateRequest
5137
0
#define PF_VALIDATE_RESPONSE TLSX_PointFormat_ValidateResponse
5138
5139
0
#define PF_GET_SIZE TLSX_PointFormat_GetSize
5140
0
#define PF_WRITE    TLSX_PointFormat_Write
5141
5142
#ifndef NO_WOLFSSL_SERVER
5143
0
#define PF_PARSE TLSX_PointFormat_Parse
5144
#else
5145
#define PF_PARSE(a, b, c, d)      0
5146
#endif
5147
5148
#else
5149
5150
#define EC_FREE_ALL(list, heap) WC_DO_NOTHING
5151
#define EC_GET_SIZE(list)         0
5152
#define EC_WRITE(a, b)            0
5153
#define EC_PARSE(a, b, c, d, e)   0
5154
#define EC_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
5155
5156
#define PF_FREE_ALL(list, heap)   WC_DO_NOTHING
5157
#define PF_GET_SIZE(list)         0
5158
#define PF_WRITE(a, b)            0
5159
#define PF_PARSE(a, b, c, d)      0
5160
#define PF_VALIDATE_REQUEST(a, b) WC_DO_NOTHING
5161
#define PF_VALIDATE_RESPONSE(a, b) WC_DO_NOTHING
5162
5163
#endif /* HAVE_SUPPORTED_CURVES */
5164
5165
/******************************************************************************/
5166
/* Renegotiation Indication                                                   */
5167
/******************************************************************************/
5168
5169
#if defined(HAVE_SECURE_RENEGOTIATION) \
5170
 || defined(HAVE_SERVER_RENEGOTIATION_INFO)
5171
5172
static byte TLSX_SecureRenegotiation_GetSize(SecureRenegotiation* data,
5173
                                                                  int isRequest)
5174
0
{
5175
0
    byte length = OPAQUE8_LEN; /* empty info length */
5176
5177
    /* data will be NULL for HAVE_SERVER_RENEGOTIATION_INFO only */
5178
0
    if (data && data->enabled && data->verifySet) {
5179
        /* client sends client_verify_data only */
5180
0
        length += TLS_FINISHED_SZ;
5181
5182
        /* server also sends server_verify_data */
5183
0
        if (!isRequest)
5184
0
            length += TLS_FINISHED_SZ;
5185
0
    }
5186
5187
0
    return length;
5188
0
}
5189
5190
static word16 TLSX_SecureRenegotiation_Write(SecureRenegotiation* data,
5191
                                                    byte* output, int isRequest)
5192
0
{
5193
0
    word16 offset = OPAQUE8_LEN; /* RenegotiationInfo length */
5194
0
    if (data && data->enabled && data->verifySet) {
5195
        /* client sends client_verify_data only */
5196
0
        XMEMCPY(output + offset, data->client_verify_data, TLS_FINISHED_SZ);
5197
0
        offset += TLS_FINISHED_SZ;
5198
5199
        /* server also sends server_verify_data */
5200
0
        if (!isRequest) {
5201
0
            XMEMCPY(output + offset, data->server_verify_data, TLS_FINISHED_SZ);
5202
0
            offset += TLS_FINISHED_SZ;
5203
0
        }
5204
0
    }
5205
5206
0
    output[0] = (byte)(offset - 1);  /* info length - self */
5207
5208
0
    return offset;
5209
0
}
5210
5211
static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input,
5212
                                          word16 length, byte isRequest)
5213
0
{
5214
0
    int ret = SECURE_RENEGOTIATION_E;
5215
5216
0
    if (length >= OPAQUE8_LEN) {
5217
0
        if (isRequest) {
5218
0
        #ifndef NO_WOLFSSL_SERVER
5219
0
            if (ssl->secure_renegotiation == NULL) {
5220
0
                ret = wolfSSL_UseSecureRenegotiation(ssl);
5221
0
                if (ret == WOLFSSL_SUCCESS)
5222
0
                    ret = 0;
5223
0
            }
5224
0
            if (ret != 0 && ret != SECURE_RENEGOTIATION_E) {
5225
0
            }
5226
0
            else if (ssl->secure_renegotiation == NULL) {
5227
0
            }
5228
0
            else if (!ssl->secure_renegotiation->enabled) {
5229
0
                if (*input == 0) {
5230
0
                    input++; /* get past size */
5231
5232
0
                    ssl->secure_renegotiation->enabled = 1;
5233
0
                    TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
5234
0
                    ret = 0;
5235
0
                }
5236
0
                else {
5237
                    /* already in error state */
5238
0
                    WOLFSSL_MSG("SCR client verify data present");
5239
0
                }
5240
0
            }
5241
0
            else if (*input == TLS_FINISHED_SZ) {
5242
0
                if (length < TLS_FINISHED_SZ + 1) {
5243
0
                    WOLFSSL_MSG("SCR malformed buffer");
5244
0
                    ret = BUFFER_E;
5245
0
                }
5246
0
                else {
5247
0
                    input++; /* get past size */
5248
5249
                    /* validate client verify data */
5250
0
                    if (XMEMCMP(input,
5251
0
                            ssl->secure_renegotiation->client_verify_data,
5252
0
                            TLS_FINISHED_SZ) == 0) {
5253
0
                        WOLFSSL_MSG("SCR client verify data match");
5254
0
                        TLSX_SetResponse(ssl, TLSX_RENEGOTIATION_INFO);
5255
0
                        ret = 0;  /* verified */
5256
0
                    }
5257
0
                    else {
5258
                        /* already in error state */
5259
0
                        WOLFSSL_MSG("SCR client verify data Failure");
5260
0
                    }
5261
0
                }
5262
0
            }
5263
0
        #endif
5264
0
        }
5265
0
        else if (ssl->secure_renegotiation != NULL) {
5266
0
        #ifndef NO_WOLFSSL_CLIENT
5267
0
            if (!ssl->secure_renegotiation->enabled) {
5268
0
                if (*input == 0) {
5269
0
                    ssl->secure_renegotiation->enabled = 1;
5270
0
                    ret = 0;
5271
0
                }
5272
0
            }
5273
0
            else if (*input == 2 * TLS_FINISHED_SZ &&
5274
0
                     length == 2 * TLS_FINISHED_SZ + OPAQUE8_LEN) {
5275
0
                input++;  /* get past size */
5276
5277
                /* validate client and server verify data */
5278
0
                if (XMEMCMP(input,
5279
0
                            ssl->secure_renegotiation->client_verify_data,
5280
0
                            TLS_FINISHED_SZ) == 0 &&
5281
0
                    XMEMCMP(input + TLS_FINISHED_SZ,
5282
0
                            ssl->secure_renegotiation->server_verify_data,
5283
0
                            TLS_FINISHED_SZ) == 0) {
5284
0
                    WOLFSSL_MSG("SCR client and server verify data match");
5285
0
                    ret = 0;  /* verified */
5286
0
                }
5287
0
                else {
5288
                    /* already in error state */
5289
0
                    WOLFSSL_MSG("SCR client and server verify data Failure");
5290
0
                }
5291
0
            }
5292
0
        #endif
5293
0
        }
5294
0
    }
5295
5296
0
    if (ret != 0) {
5297
0
        WOLFSSL_ERROR_VERBOSE(ret);
5298
0
        SendAlert(ssl, alert_fatal, handshake_failure);
5299
0
    }
5300
5301
0
    return ret;
5302
0
}
5303
5304
int TLSX_UseSecureRenegotiation(TLSX** extensions, void* heap)
5305
0
{
5306
0
    int ret = 0;
5307
0
    SecureRenegotiation* data;
5308
5309
0
    data = (SecureRenegotiation*)XMALLOC(sizeof(SecureRenegotiation), heap,
5310
0
                                                             DYNAMIC_TYPE_TLSX);
5311
0
    if (data == NULL)
5312
0
        return MEMORY_E;
5313
5314
0
    XMEMSET(data, 0, sizeof(SecureRenegotiation));
5315
5316
0
    ret = TLSX_Push(extensions, TLSX_RENEGOTIATION_INFO, data, heap);
5317
0
    if (ret != 0) {
5318
0
        XFREE(data, heap, DYNAMIC_TYPE_TLSX);
5319
0
        return ret;
5320
0
    }
5321
5322
0
    return WOLFSSL_SUCCESS;
5323
0
}
5324
5325
#ifdef HAVE_SERVER_RENEGOTIATION_INFO
5326
5327
int TLSX_AddEmptyRenegotiationInfo(TLSX** extensions, void* heap)
5328
0
{
5329
0
    int ret;
5330
5331
    /* send empty renegotiation_info extension */
5332
0
    TLSX* ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
5333
0
    if (ext == NULL) {
5334
0
        ret = TLSX_UseSecureRenegotiation(extensions, heap);
5335
0
        if (ret != WOLFSSL_SUCCESS)
5336
0
            return ret;
5337
5338
0
        ext = TLSX_Find(*extensions, TLSX_RENEGOTIATION_INFO);
5339
0
    }
5340
0
    if (ext)
5341
0
        ext->resp = 1;
5342
5343
0
    return WOLFSSL_SUCCESS;
5344
0
}
5345
5346
#endif /* HAVE_SERVER_RENEGOTIATION_INFO */
5347
5348
5349
0
#define SCR_FREE_ALL(data, heap) XFREE(data, (heap), DYNAMIC_TYPE_TLSX)
5350
0
#define SCR_GET_SIZE       TLSX_SecureRenegotiation_GetSize
5351
0
#define SCR_WRITE          TLSX_SecureRenegotiation_Write
5352
0
#define SCR_PARSE          TLSX_SecureRenegotiation_Parse
5353
5354
#else
5355
5356
#define SCR_FREE_ALL(a, heap) WC_DO_NOTHING
5357
#define SCR_GET_SIZE(a, b)    0
5358
#define SCR_WRITE(a, b, c)    0
5359
#define SCR_PARSE(a, b, c, d) 0
5360
5361
#endif /* HAVE_SECURE_RENEGOTIATION || HAVE_SERVER_RENEGOTIATION_INFO */
5362
5363
/******************************************************************************/
5364
/* Session Tickets                                                            */
5365
/******************************************************************************/
5366
5367
#ifdef HAVE_SESSION_TICKET
5368
5369
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
5370
static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl)
5371
{
5372
    TLSX*          extension = TLSX_Find(ssl->extensions, TLSX_SESSION_TICKET);
5373
    SessionTicket* ticket    = extension ?
5374
                                         (SessionTicket*)extension->data : NULL;
5375
5376
    if (ticket) {
5377
        /* TODO validate ticket timeout here! */
5378
        if (ticket->lifetime == 0xfffffff) {
5379
            /* send empty ticket on timeout */
5380
            TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
5381
        }
5382
    }
5383
}
5384
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
5385
5386
5387
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
5388
{
5389
    (void)isRequest;
5390
    return ticket ? ticket->size : 0;
5391
}
5392
5393
static word16 TLSX_SessionTicket_Write(SessionTicket* ticket, byte* output,
5394
                                       int isRequest)
5395
{
5396
    word16 offset = 0; /* empty ticket */
5397
5398
    if (isRequest && ticket) {
5399
        XMEMCPY(output + offset, ticket->data, ticket->size);
5400
        offset += ticket->size;
5401
    }
5402
5403
    return offset;
5404
}
5405
5406
5407
static int TLSX_SessionTicket_Parse(WOLFSSL* ssl, const byte* input,
5408
                                    word16 length, byte isRequest)
5409
{
5410
    int ret = 0;
5411
5412
    (void) input; /* avoid unused parameter if NO_WOLFSSL_SERVER defined */
5413
5414
    if (!isRequest) {
5415
        if (TLSX_CheckUnsupportedExtension(ssl, TLSX_SESSION_TICKET))
5416
            return TLSX_HandleUnsupportedExtension(ssl);
5417
5418
        if (length != 0)
5419
            return BUFFER_ERROR;
5420
5421
#ifndef NO_WOLFSSL_CLIENT
5422
        ssl->expect_session_ticket = 1;
5423
#endif
5424
    }
5425
#ifndef NO_WOLFSSL_SERVER
5426
    else {
5427
        /* server side */
5428
        if (ssl->ctx->ticketEncCb == NULL) {
5429
            WOLFSSL_MSG("Client sent session ticket, server has no callback");
5430
            return 0;
5431
        }
5432
5433
#ifdef HAVE_SECURE_RENEGOTIATION
5434
        if (IsSCR(ssl)) {
5435
            WOLFSSL_MSG("Client sent session ticket during SCR. Ignoring.");
5436
            return 0;
5437
        }
5438
#endif
5439
5440
        if (length > SESSION_TICKET_LEN) {
5441
            ret = BAD_TICKET_MSG_SZ;
5442
            WOLFSSL_ERROR_VERBOSE(ret);
5443
        } else if (IsAtLeastTLSv1_3(ssl->version)) {
5444
            WOLFSSL_MSG("Process client ticket rejected, TLS 1.3 no support");
5445
            ssl->options.rejectTicket = 1;
5446
            ret = 0;  /* not fatal */
5447
        } else if (ssl->options.noTicketTls12) {
5448
            /* ignore ticket request */
5449
        } else if (length == 0) {
5450
            /* blank ticket */
5451
            ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
5452
            if (ret == WOLFSSL_SUCCESS) {
5453
                ret = 0;
5454
                /* send blank ticket */
5455
                TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
5456
                ssl->options.createTicket = 1;  /* will send ticket msg */
5457
                ssl->options.useTicket    = 1;
5458
                ssl->options.resuming     = 0;  /* no standard resumption */
5459
                ssl->arrays->sessionIDSz  = 0;  /* no echo on blank ticket */
5460
            }
5461
        } else {
5462
            /* got actual ticket from client */
5463
            ret = DoClientTicket(ssl, input, length);
5464
            if (ret == WOLFSSL_TICKET_RET_OK) {    /* use ticket to resume */
5465
                WOLFSSL_MSG("Using existing client ticket");
5466
                ssl->options.useTicket    = 1;
5467
                ssl->options.resuming     = 1;
5468
                /* SERVER: ticket is peer auth. */
5469
                ssl->options.peerAuthGood = 1;
5470
            } else if (ret == WOLFSSL_TICKET_RET_CREATE) {
5471
                WOLFSSL_MSG("Using existing client ticket, creating new one");
5472
                ret = TLSX_UseSessionTicket(&ssl->extensions, NULL, ssl->heap);
5473
                if (ret == WOLFSSL_SUCCESS) {
5474
                    ret = 0;
5475
                    TLSX_SetResponse(ssl, TLSX_SESSION_TICKET);
5476
                                                    /* send blank ticket */
5477
                    ssl->options.createTicket = 1;  /* will send ticket msg */
5478
                    ssl->options.useTicket    = 1;
5479
                    ssl->options.resuming     = 1;
5480
                    /* SERVER: ticket is peer auth. */
5481
                    ssl->options.peerAuthGood = 1;
5482
                }
5483
            } else if (ret == WOLFSSL_TICKET_RET_REJECT) {
5484
                WOLFSSL_MSG("Process client ticket rejected, not using");
5485
                ssl->options.rejectTicket = 1;
5486
                ret = 0;  /* not fatal */
5487
            } else if (ret == VERSION_ERROR) {
5488
                WOLFSSL_MSG("Process client ticket rejected, bad TLS version");
5489
                ssl->options.rejectTicket = 1;
5490
                ret = 0;  /* not fatal */
5491
            } else if (ret == WOLFSSL_TICKET_RET_FATAL) {
5492
                WOLFSSL_MSG("Process client ticket fatal error, not using");
5493
            } else if (ret < 0) {
5494
                WOLFSSL_MSG("Process client ticket unknown error, not using");
5495
            }
5496
        }
5497
    }
5498
#endif /* NO_WOLFSSL_SERVER */
5499
5500
#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER)
5501
    (void)ssl;
5502
#endif
5503
5504
    return ret;
5505
}
5506
5507
WOLFSSL_LOCAL SessionTicket* TLSX_SessionTicket_Create(word32 lifetime,
5508
                                            byte* data, word16 size, void* heap)
5509
{
5510
    SessionTicket* ticket = (SessionTicket*)XMALLOC(sizeof(SessionTicket),
5511
                                                       heap, DYNAMIC_TYPE_TLSX);
5512
    if (ticket) {
5513
        ticket->data = (byte*)XMALLOC(size, heap, DYNAMIC_TYPE_TLSX);
5514
        if (ticket->data == NULL) {
5515
            XFREE(ticket, heap, DYNAMIC_TYPE_TLSX);
5516
            return NULL;
5517
        }
5518
5519
        XMEMCPY(ticket->data, data, size);
5520
        ticket->size     = size;
5521
        ticket->lifetime = lifetime;
5522
    }
5523
5524
    (void)heap;
5525
5526
    return ticket;
5527
}
5528
WOLFSSL_LOCAL void TLSX_SessionTicket_Free(SessionTicket* ticket, void* heap)
5529
{
5530
    if (ticket) {
5531
        XFREE(ticket->data, heap, DYNAMIC_TYPE_TLSX);
5532
        XFREE(ticket,       heap, DYNAMIC_TYPE_TLSX);
5533
    }
5534
5535
    (void)heap;
5536
}
5537
5538
int TLSX_UseSessionTicket(TLSX** extensions, SessionTicket* ticket, void* heap)
5539
{
5540
    int ret = 0;
5541
5542
    if (extensions == NULL)
5543
        return BAD_FUNC_ARG;
5544
5545
    /* If the ticket is NULL, the client will request a new ticket from the
5546
       server. Otherwise, the client will use it in the next client hello. */
5547
    if ((ret = TLSX_Push(extensions, TLSX_SESSION_TICKET, (void*)ticket, heap))
5548
                                                                           != 0)
5549
        return ret;
5550
5551
    return WOLFSSL_SUCCESS;
5552
}
5553
5554
#define WOLF_STK_VALIDATE_REQUEST TLSX_SessionTicket_ValidateRequest
5555
#define WOLF_STK_GET_SIZE         TLSX_SessionTicket_GetSize
5556
#define WOLF_STK_WRITE            TLSX_SessionTicket_Write
5557
#define WOLF_STK_PARSE            TLSX_SessionTicket_Parse
5558
#define WOLF_STK_FREE(stk, heap)  TLSX_SessionTicket_Free((SessionTicket*)(stk),(heap))
5559
5560
#else
5561
5562
0
#define WOLF_STK_FREE(a, b) WC_DO_NOTHING
5563
0
#define WOLF_STK_VALIDATE_REQUEST(a) WC_DO_NOTHING
5564
0
#define WOLF_STK_GET_SIZE(a, b)      0
5565
0
#define WOLF_STK_WRITE(a, b, c)      0
5566
0
#define WOLF_STK_PARSE(a, b, c, d)   0
5567
5568
#endif /* HAVE_SESSION_TICKET */
5569
5570
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
5571
/******************************************************************************/
5572
/* Encrypt-then-MAC                                                           */
5573
/******************************************************************************/
5574
5575
#ifndef WOLFSSL_NO_TLS12
5576
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl);
5577
5578
/**
5579
 * Get the size of the Encrypt-Then-MAC extension.
5580
 *
5581
 * msgType  Type of message to put extension into.
5582
 * pSz      Size of extension data.
5583
 * return SANITY_MSG_E when the message is not allowed to have extension and
5584
 *        0 otherwise.
5585
 */
5586
static int TLSX_EncryptThenMac_GetSize(byte msgType, word16* pSz)
5587
0
{
5588
0
    (void)pSz;
5589
5590
0
    if (msgType != client_hello && msgType != server_hello) {
5591
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
5592
0
        return SANITY_MSG_E;
5593
0
    }
5594
5595
    /* Empty extension */
5596
5597
0
    return 0;
5598
0
}
5599
5600
/**
5601
 * Write the Encrypt-Then-MAC extension.
5602
 *
5603
 * data     Unused
5604
 * output   Extension data buffer. Unused.
5605
 * msgType  Type of message to put extension into.
5606
 * pSz      Size of extension data.
5607
 * return SANITY_MSG_E when the message is not allowed to have extension and
5608
 *        0 otherwise.
5609
 */
5610
static int TLSX_EncryptThenMac_Write(void* data, byte* output, byte msgType,
5611
                                     word16* pSz)
5612
0
{
5613
0
    (void)data;
5614
0
    (void)output;
5615
0
    (void)pSz;
5616
5617
0
    if (msgType != client_hello && msgType != server_hello) {
5618
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
5619
0
        return SANITY_MSG_E;
5620
0
    }
5621
5622
    /* Empty extension */
5623
5624
0
    return 0;
5625
0
}
5626
5627
/**
5628
 * Parse the Encrypt-Then-MAC extension.
5629
 *
5630
 * ssl      SSL object
5631
 * input    Extension data buffer.
5632
 * length   Length of this extension's data.
5633
 * msgType  Type of message to extension appeared in.
5634
 * return SANITY_MSG_E when the message is not allowed to have extension,
5635
 *        BUFFER_ERROR when the extension's data is invalid,
5636
 *        MEMORY_E when unable to allocate memory and
5637
 *        0 otherwise.
5638
 */
5639
static int TLSX_EncryptThenMac_Parse(WOLFSSL* ssl, const byte* input,
5640
                                     word16 length, byte msgType)
5641
0
{
5642
0
    int ret;
5643
5644
0
    (void)input;
5645
5646
0
    if (msgType != client_hello && msgType != server_hello) {
5647
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
5648
0
        return SANITY_MSG_E;
5649
0
    }
5650
5651
    /* Empty extension */
5652
0
    if (length != 0)
5653
0
        return BUFFER_ERROR;
5654
5655
0
    if (msgType == client_hello) {
5656
        /* Check the user hasn't disallowed use of Encrypt-Then-Mac. */
5657
0
        if (!ssl->options.disallowEncThenMac) {
5658
0
            ssl->options.encThenMac = 1;
5659
            /* Set the extension reply. */
5660
0
            ret = TLSX_EncryptThenMac_Use(ssl);
5661
0
            if (ret != 0)
5662
0
                return ret;
5663
0
        }
5664
0
        return 0;
5665
0
    }
5666
5667
    /* Server Hello */
5668
0
    if (ssl->options.disallowEncThenMac) {
5669
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
5670
0
        return SANITY_MSG_E;
5671
0
    }
5672
5673
0
    ssl->options.encThenMac = 1;
5674
0
    return 0;
5675
5676
0
}
5677
5678
/**
5679
 * Add the Encrypt-Then-MAC extension to list.
5680
 *
5681
 * ssl      SSL object
5682
 * return MEMORY_E when unable to allocate memory and 0 otherwise.
5683
 */
5684
static int TLSX_EncryptThenMac_Use(WOLFSSL* ssl)
5685
0
{
5686
0
    int   ret = 0;
5687
0
    TLSX* extension;
5688
5689
    /* Find the Encrypt-Then-Mac extension if it exists. */
5690
0
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
5691
0
    if (extension == NULL) {
5692
        /* Push new Encrypt-Then-Mac extension. */
5693
0
        ret = TLSX_Push(&ssl->extensions, TLSX_ENCRYPT_THEN_MAC, NULL,
5694
0
            ssl->heap);
5695
0
        if (ret != 0)
5696
0
            return ret;
5697
0
    }
5698
5699
0
    return 0;
5700
0
}
5701
5702
/**
5703
 * Set the Encrypt-Then-MAC extension as one to respond too.
5704
 *
5705
 * ssl      SSL object
5706
 * return EXT_MISSING when EncryptThenMac extension not in list.
5707
 */
5708
int TLSX_EncryptThenMac_Respond(WOLFSSL* ssl)
5709
0
{
5710
0
    TLSX* extension;
5711
5712
0
    extension = TLSX_Find(ssl->extensions, TLSX_ENCRYPT_THEN_MAC);
5713
0
    if (extension == NULL)
5714
0
        return EXT_MISSING;
5715
0
    extension->resp = 1;
5716
5717
0
    return 0;
5718
0
}
5719
5720
0
#define ETM_GET_SIZE  TLSX_EncryptThenMac_GetSize
5721
0
#define ETM_WRITE     TLSX_EncryptThenMac_Write
5722
0
#define ETM_PARSE     TLSX_EncryptThenMac_Parse
5723
5724
#else
5725
5726
#define ETM_GET_SIZE(a, b)    0
5727
#define ETM_WRITE(a, b, c, d) 0
5728
#define ETM_PARSE(a, b, c, d) 0
5729
5730
#endif /* !WOLFSSL_NO_TLS12 */
5731
5732
#endif /* HAVE_ENCRYPT_THEN_MAC && !WOLFSSL_AEAD_ONLY */
5733
5734
5735
#ifdef WOLFSSL_SRTP
5736
5737
/******************************************************************************/
5738
/* DTLS SRTP (Secure Real-time Transport Protocol)                            */
5739
/******************************************************************************/
5740
5741
/* Only support single SRTP profile */
5742
typedef struct TlsxSrtp {
5743
    word16 profileCount;
5744
    word16 ids; /* selected bits */
5745
} TlsxSrtp;
5746
5747
static int TLSX_UseSRTP_GetSize(TlsxSrtp *srtp)
5748
{
5749
    /*   SRTP Profile Len (2)
5750
     *      SRTP Profiles (2)
5751
     *   MKI (master key id) Length */
5752
    return (OPAQUE16_LEN + (srtp->profileCount * OPAQUE16_LEN) + 1);
5753
}
5754
5755
static TlsxSrtp* TLSX_UseSRTP_New(word16 ids, void* heap)
5756
{
5757
    TlsxSrtp* srtp;
5758
    int i;
5759
5760
    srtp = (TlsxSrtp*)XMALLOC(sizeof(TlsxSrtp), heap, DYNAMIC_TYPE_TLSX);
5761
    if (srtp == NULL) {
5762
        WOLFSSL_MSG("TLSX SRTP Memory failure");
5763
        return NULL;
5764
    }
5765
5766
    /* count and test each bit set */
5767
    srtp->profileCount = 0;
5768
    for (i=0; i<16; i++) {
5769
        if (ids & (1 << i)) {
5770
            srtp->profileCount++;
5771
        }
5772
    }
5773
    srtp->ids = ids;
5774
5775
    return srtp;
5776
}
5777
5778
static void TLSX_UseSRTP_Free(TlsxSrtp *srtp, void* heap)
5779
{
5780
    if (srtp != NULL) {
5781
        XFREE(srtp, heap, DYNAMIC_TYPE_TLSX);
5782
    }
5783
    (void)heap;
5784
}
5785
5786
static int TLSX_UseSRTP_Parse(WOLFSSL* ssl, const byte* input, word16 length,
5787
    byte isRequest)
5788
{
5789
    int ret = BAD_FUNC_ARG;
5790
    word16 profile_len = 0;
5791
    word16 profile_value = 0;
5792
    word16 offset = 0;
5793
#ifndef NO_WOLFSSL_SERVER
5794
    int i;
5795
    TlsxSrtp* srtp = NULL;
5796
#endif
5797
5798
    if (length < OPAQUE16_LEN) {
5799
        return BUFFER_ERROR;
5800
    }
5801
5802
    /* reset selected DTLS SRTP profile ID */
5803
    ssl->dtlsSrtpId = 0;
5804
5805
    /* total length, not include itself */
5806
    ato16(input, &profile_len);
5807
    offset += OPAQUE16_LEN;
5808
5809
    if (!isRequest) {
5810
#ifndef NO_WOLFSSL_CLIENT
5811
        if (length < offset + OPAQUE16_LEN)
5812
            return BUFFER_ERROR;
5813
5814
        ato16(input + offset, &profile_value);
5815
5816
        /* check that the profile received was in the ones we support */
5817
        if (profile_value < 16 &&
5818
                               (ssl->dtlsSrtpProfiles & (1 << profile_value))) {
5819
            ssl->dtlsSrtpId = profile_value;
5820
            ret = 0; /* success */
5821
        }
5822
#endif
5823
    }
5824
#ifndef NO_WOLFSSL_SERVER
5825
    else {
5826
        /* parse remainder one profile at a time, looking for match in CTX */
5827
        ret = 0;
5828
        for (i=offset; i<length; i+=OPAQUE16_LEN) {
5829
            if (length < (i + OPAQUE16_LEN)) {
5830
                WOLFSSL_MSG("Unexpected length when parsing SRTP profile");
5831
                ret = BUFFER_ERROR;
5832
                break;
5833
            }
5834
5835
            ato16(input+i, &profile_value);
5836
            /* find first match */
5837
            if (profile_value < 16 &&
5838
                                 ssl->dtlsSrtpProfiles & (1 << profile_value)) {
5839
                ssl->dtlsSrtpId = profile_value;
5840
5841
                /* make sure we respond with selected SRTP id selected */
5842
                srtp = TLSX_UseSRTP_New((1 << profile_value), ssl->heap);
5843
                if (srtp != NULL) {
5844
                    ret = TLSX_Push(&ssl->extensions, TLSX_USE_SRTP,
5845
                        (void*)srtp, ssl->heap);
5846
                    if (ret == 0) {
5847
                        TLSX_SetResponse(ssl, TLSX_USE_SRTP);
5848
                        /* successfully set extension */
5849
                    }
5850
                }
5851
                else {
5852
                    ret = MEMORY_E;
5853
                }
5854
                break;
5855
            }
5856
        }
5857
    }
5858
5859
    if (ret == 0 && ssl->dtlsSrtpId == 0) {
5860
        WOLFSSL_MSG("TLSX_UseSRTP_Parse profile not found!");
5861
        /* not fatal */
5862
    }
5863
    else if (ret != 0) {
5864
        ssl->dtlsSrtpId = 0;
5865
        TLSX_UseSRTP_Free(srtp, ssl->heap);
5866
    }
5867
#endif
5868
    (void)profile_len;
5869
5870
    return ret;
5871
}
5872
5873
static word16 TLSX_UseSRTP_Write(TlsxSrtp* srtp, byte* output)
5874
{
5875
    word16 offset = 0;
5876
    int i, j;
5877
5878
    c16toa(srtp->profileCount * 2, output + offset);
5879
    offset += OPAQUE16_LEN;
5880
    j = 0;
5881
    for (i = 0; i < srtp->profileCount; i++) {
5882
        for (; j < 16; j++) {
5883
            if (srtp->ids & (1 << j)) {
5884
                c16toa(j, output + offset);
5885
                offset += OPAQUE16_LEN;
5886
            }
5887
        }
5888
    }
5889
    output[offset++] = 0x00; /* MKI Length */
5890
5891
    return offset;
5892
}
5893
5894
static int TLSX_UseSRTP(TLSX** extensions, word16 profiles, void* heap)
5895
{
5896
    int ret = 0;
5897
    TLSX* extension;
5898
5899
    if (extensions == NULL) {
5900
        return BAD_FUNC_ARG;
5901
    }
5902
5903
    extension = TLSX_Find(*extensions, TLSX_USE_SRTP);
5904
    if (extension == NULL) {
5905
        TlsxSrtp* srtp = TLSX_UseSRTP_New(profiles, heap);
5906
        if (srtp == NULL) {
5907
            return MEMORY_E;
5908
        }
5909
5910
        ret = TLSX_Push(extensions, TLSX_USE_SRTP, (void*)srtp, heap);
5911
        if (ret != 0) {
5912
            TLSX_UseSRTP_Free(srtp, heap);
5913
        }
5914
    }
5915
5916
    return ret;
5917
}
5918
5919
#ifndef NO_WOLFSSL_SERVER
5920
    #define SRTP_FREE     TLSX_UseSRTP_Free
5921
    #define SRTP_PARSE    TLSX_UseSRTP_Parse
5922
    #define SRTP_WRITE    TLSX_UseSRTP_Write
5923
    #define SRTP_GET_SIZE TLSX_UseSRTP_GetSize
5924
#else
5925
    #define SRTP_FREE(a, b) WC_DO_NOTHING
5926
    #define SRTP_PARSE(a, b, c, d)      0
5927
    #define SRTP_WRITE(a, b)            0
5928
    #define SRTP_GET_SIZE(a)            0
5929
#endif
5930
5931
#endif /* WOLFSSL_SRTP */
5932
5933
5934
/******************************************************************************/
5935
/* Supported Versions                                                         */
5936
/******************************************************************************/
5937
5938
#ifdef WOLFSSL_TLS13
5939
static WC_INLINE int versionIsGreater(byte isDtls, byte a, byte b)
5940
0
{
5941
0
    (void)isDtls;
5942
5943
#ifdef WOLFSSL_DTLS
5944
    /* DTLS version increases backwards (-1,-2,-3,etc) */
5945
    if (isDtls)
5946
        return a < b;
5947
#endif /* WOLFSSL_DTLS */
5948
5949
0
    return a > b;
5950
0
}
5951
5952
static WC_INLINE int versionIsLesser(byte isDtls, byte a, byte b)
5953
0
{
5954
0
    (void)isDtls;
5955
5956
#ifdef WOLFSSL_DTLS
5957
    /* DTLS version increases backwards (-1,-2,-3,etc) */
5958
    if (isDtls)
5959
        return a > b;
5960
#endif /* WOLFSSL_DTLS */
5961
5962
0
    return a < b;
5963
0
}
5964
5965
static WC_INLINE int versionIsAtLeast(byte isDtls, byte a, byte b)
5966
0
{
5967
0
    (void)isDtls;
5968
5969
#ifdef WOLFSSL_DTLS
5970
    /* DTLS version increases backwards (-1,-2,-3,etc) */
5971
    if (isDtls)
5972
        return a <= b;
5973
#endif /* WOLFSSL_DTLS */
5974
5975
0
    return a >= b;
5976
0
}
5977
5978
static WC_INLINE int versionIsLessEqual(byte isDtls, byte a, byte b)
5979
0
{
5980
0
    (void)isDtls;
5981
5982
#ifdef WOLFSSL_DTLS
5983
    /* DTLS version increases backwards (-1,-2,-3,etc) */
5984
    if (isDtls)
5985
        return a >= b;
5986
#endif /* WOLFSSL_DTLS */
5987
5988
0
    return a <= b;
5989
0
}
5990
5991
/* Return the size of the SupportedVersions extension's data.
5992
 *
5993
 * data       The SSL/TLS object.
5994
 * msgType The type of the message this extension is being written into.
5995
 * returns the length of data that will be in the extension.
5996
 */
5997
static int TLSX_SupportedVersions_GetSize(void* data, byte msgType, word16* pSz)
5998
0
{
5999
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6000
0
    byte tls13Minor, tls12Minor, tls11Minor, isDtls;
6001
6002
0
    isDtls = !!ssl->options.dtls;
6003
0
    tls13Minor = (byte)(isDtls ? DTLSv1_3_MINOR : TLSv1_3_MINOR);
6004
0
    tls12Minor = (byte)(isDtls ? DTLSv1_2_MINOR : TLSv1_2_MINOR);
6005
0
    tls11Minor = (byte)(isDtls ? DTLS_MINOR : TLSv1_1_MINOR);
6006
6007
    /* unused on some configuration */
6008
0
    (void)tls12Minor;
6009
0
    (void)tls13Minor;
6010
0
    (void)tls11Minor;
6011
6012
0
    if (msgType == client_hello) {
6013
        /* TLS v1.2 and TLS v1.3  */
6014
0
        int cnt = 0;
6015
6016
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13Minor)
6017
        #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6018
            defined(WOLFSSL_WPAS_SMALL)
6019
            && (ssl->options.mask & SSL_OP_NO_TLSv1_3) == 0
6020
        #endif
6021
0
        ) {
6022
0
            cnt++;
6023
0
        }
6024
6025
0
        if (ssl->options.downgrade) {
6026
0
    #ifndef WOLFSSL_NO_TLS12
6027
0
            if (versionIsLessEqual(
6028
0
                    isDtls, ssl->options.minDowngrade, tls12Minor)
6029
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6030
    defined(WOLFSSL_WPAS_SMALL)
6031
                && (ssl->options.mask & SSL_OP_NO_TLSv1_2) == 0
6032
#endif
6033
0
            ) {
6034
0
                cnt++;
6035
0
            }
6036
0
#endif
6037
    #ifndef NO_OLD_TLS
6038
            if (versionIsLessEqual(
6039
                    isDtls, ssl->options.minDowngrade, tls11Minor)
6040
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6041
                defined(WOLFSSL_WPAS_SMALL)
6042
                && (ssl->options.mask & SSL_OP_NO_TLSv1_1) == 0
6043
            #endif
6044
            ) {
6045
                cnt++;
6046
            }
6047
        #ifdef WOLFSSL_ALLOW_TLSV10
6048
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
6049
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6050
                defined(WOLFSSL_WPAS_SMALL)
6051
                && (ssl->options.mask & SSL_OP_NO_TLSv1) == 0
6052
            #endif
6053
            ) {
6054
                cnt++;
6055
            }
6056
        #endif
6057
    #endif
6058
0
        }
6059
6060
0
        *pSz += (word16)(OPAQUE8_LEN + cnt * OPAQUE16_LEN);
6061
0
    }
6062
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6063
0
        *pSz += OPAQUE16_LEN;
6064
0
    }
6065
0
    else {
6066
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6067
0
        return SANITY_MSG_E;
6068
0
    }
6069
6070
0
    return 0;
6071
0
}
6072
6073
/* Writes the SupportedVersions extension into the buffer.
6074
 *
6075
 * data    The SSL/TLS object.
6076
 * output  The buffer to write the extension into.
6077
 * msgType The type of the message this extension is being written into.
6078
 * returns the length of data that was written.
6079
 */
6080
static int TLSX_SupportedVersions_Write(void* data, byte* output,
6081
                                        byte msgType, word16* pSz)
6082
0
{
6083
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6084
0
    byte tls13minor, tls12minor, tls11minor, isDtls = 0;
6085
6086
0
    tls13minor = (byte)TLSv1_3_MINOR;
6087
0
    tls12minor = (byte)TLSv1_2_MINOR;
6088
0
    tls11minor = (byte)TLSv1_1_MINOR;
6089
6090
    /* unused in some configuration */
6091
0
    (void)tls11minor;
6092
0
    (void)tls12minor;
6093
6094
#ifdef WOLFSSL_DTLS13
6095
    if (ssl->options.dtls) {
6096
        tls13minor = (byte)DTLSv1_3_MINOR;
6097
        tls12minor = (byte)DTLSv1_2_MINOR;
6098
        tls11minor = (byte)DTLS_MINOR;
6099
        isDtls = 1;
6100
    }
6101
#endif /* WOLFSSL_DTLS13 */
6102
6103
0
    if (msgType == client_hello) {
6104
0
        byte major = ssl->ctx->method->version.major;
6105
6106
0
        byte* cnt = output++;
6107
0
        *cnt = 0;
6108
6109
0
        if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls13minor)
6110
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) ||                       \
6111
    defined(WOLFSSL_WPAS_SMALL)
6112
            && (ssl->options.mask & SSL_OP_NO_TLSv1_3) == 0
6113
#endif
6114
0
        ) {
6115
0
            *cnt += OPAQUE16_LEN;
6116
        #ifdef WOLFSSL_TLS13_DRAFT
6117
            /* The TLS draft major number. */
6118
            *(output++) = TLS_DRAFT_MAJOR;
6119
            /* Version of draft supported. */
6120
            *(output++) = TLS_DRAFT_MINOR;
6121
        #else
6122
0
            *(output++) = major;
6123
0
            *(output++) = tls13minor;
6124
0
        #endif
6125
0
        }
6126
6127
0
        if (ssl->options.downgrade) {
6128
0
        #ifndef WOLFSSL_NO_TLS12
6129
0
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls12minor)
6130
#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6131
                defined(WOLFSSL_WPAS_SMALL)
6132
                && (ssl->options.mask & SSL_OP_NO_TLSv1_2) == 0
6133
            #endif
6134
0
            ) {
6135
0
                *cnt += OPAQUE16_LEN;
6136
0
                *(output++) = major;
6137
0
                *(output++) = tls12minor;
6138
0
            }
6139
0
        #endif
6140
6141
    #ifndef NO_OLD_TLS
6142
            if (versionIsLessEqual(isDtls, ssl->options.minDowngrade, tls11minor)
6143
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6144
                defined(WOLFSSL_WPAS_SMALL)
6145
                && (ssl->options.mask & SSL_OP_NO_TLSv1_1) == 0
6146
            #endif
6147
            ) {
6148
                *cnt += OPAQUE16_LEN;
6149
                *(output++) = major;
6150
                *(output++) = tls11minor;
6151
            }
6152
        #ifdef WOLFSSL_ALLOW_TLSV10
6153
            if (!ssl->options.dtls && (ssl->options.minDowngrade <= TLSv1_MINOR)
6154
            #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \
6155
                defined(WOLFSSL_WPAS_SMALL)
6156
                && (ssl->options.mask & SSL_OP_NO_TLSv1) == 0
6157
            #endif
6158
            ) {
6159
                *cnt += OPAQUE16_LEN;
6160
                *(output++) = major;
6161
                *(output++) = (byte)TLSv1_MINOR;
6162
            }
6163
        #endif
6164
    #endif
6165
0
        }
6166
6167
0
        *pSz += (word16)(OPAQUE8_LEN + *cnt);
6168
0
    }
6169
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6170
0
        output[0] = ssl->version.major;
6171
0
        output[1] = ssl->version.minor;
6172
6173
0
        *pSz += OPAQUE16_LEN;
6174
0
    }
6175
0
    else {
6176
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6177
0
        return SANITY_MSG_E;
6178
0
    }
6179
6180
0
    return 0;
6181
0
}
6182
6183
/* Parse the SupportedVersions extension.
6184
 *
6185
 * ssl     The SSL/TLS object.
6186
 * input   The buffer with the extension data.
6187
 * length  The length of the extension data.
6188
 * msgType The type of the message this extension is being parsed from.
6189
 * pv      The output ProtocolVersion for the negotiated version
6190
 * opts    The output options structure. Can be NULL.
6191
 * exts    The output extensions list. Can be NULL.
6192
 * returns 0 on success, otherwise failure.
6193
 */
6194
int TLSX_SupportedVersions_Parse(const WOLFSSL* ssl, const byte* input,
6195
        word16 length, byte msgType, ProtocolVersion* pv, Options* opts,
6196
        TLSX** exts)
6197
0
{
6198
    /* The client's greatest minor version that we support */
6199
0
    byte clientGreatestMinor = SSLv3_MINOR;
6200
0
    int ret;
6201
0
    byte major, minor;
6202
0
    byte tls13minor, tls12minor;
6203
0
    byte isDtls;
6204
6205
0
    tls13minor = TLSv1_3_MINOR;
6206
0
    tls12minor = TLSv1_2_MINOR;
6207
0
    isDtls = ssl->options.dtls == 1;
6208
6209
#ifdef WOLFSSL_DTLS13
6210
    if (ssl->options.dtls) {
6211
        tls13minor = DTLSv1_3_MINOR;
6212
        tls12minor = DTLSv1_2_MINOR;
6213
        clientGreatestMinor = DTLS_MINOR;
6214
    }
6215
#endif /* WOLFSSL_DTLS13 */
6216
6217
0
    if (msgType == client_hello) {
6218
0
        int i;
6219
0
        int len;
6220
0
        int set = 0;
6221
6222
        /* Must contain a length and at least one version. */
6223
0
        if (length < OPAQUE8_LEN + OPAQUE16_LEN || (length & 1) != 1)
6224
0
            return BUFFER_ERROR;
6225
6226
0
        len = *input;
6227
6228
        /* Protocol version array must fill rest of data. */
6229
0
        if (length != (word16)OPAQUE8_LEN + len)
6230
0
            return BUFFER_ERROR;
6231
6232
0
        input++;
6233
6234
        /* Find first match. */
6235
0
        for (i = 0; i < len; i += OPAQUE16_LEN) {
6236
0
            major = input[i];
6237
0
            minor = input[i + OPAQUE8_LEN];
6238
6239
#ifdef WOLFSSL_TLS13_DRAFT
6240
            if (major == TLS_DRAFT_MAJOR && minor == TLS_DRAFT_MINOR) {
6241
                major = SSLv3_MAJOR;
6242
                minor = TLSv1_3_MINOR;
6243
            }
6244
#else
6245
0
            if (major == TLS_DRAFT_MAJOR)
6246
0
                continue;
6247
0
#endif
6248
6249
0
            if (major != ssl->ctx->method->version.major)
6250
0
                continue;
6251
6252
            /* No upgrade allowed. */
6253
0
            if (versionIsGreater(isDtls, minor, ssl->version.minor))
6254
0
                continue;
6255
6256
            /* Check downgrade. */
6257
0
            if (versionIsLesser(isDtls, minor, ssl->version.minor)) {
6258
0
                if (!ssl->options.downgrade)
6259
0
                    continue;
6260
6261
0
                if (versionIsLesser(isDtls, minor, ssl->options.minDowngrade))
6262
0
                    continue;
6263
0
            }
6264
0
            if (versionIsGreater(isDtls, minor, clientGreatestMinor))
6265
0
                clientGreatestMinor = minor;
6266
6267
0
            set = 1;
6268
0
        }
6269
0
        if (!set) {
6270
            /* No common supported version was negotiated */
6271
0
            SendAlert((WOLFSSL*)ssl, alert_fatal,
6272
0
                      wolfssl_alert_protocol_version);
6273
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6274
0
            return VERSION_ERROR;
6275
0
        }
6276
0
        pv->minor = clientGreatestMinor;
6277
0
        if (versionIsAtLeast(isDtls, clientGreatestMinor, tls13minor)) {
6278
0
            if (opts != NULL)
6279
0
                opts->tls1_3 = 1;
6280
6281
            /* TLS v1.3 requires supported version extension */
6282
0
            if (exts != NULL &&
6283
0
                    TLSX_Find(*exts, TLSX_SUPPORTED_VERSIONS) == NULL) {
6284
0
                ret = TLSX_Push(exts,
6285
0
                          TLSX_SUPPORTED_VERSIONS, ssl, ssl->heap);
6286
0
                if (ret != 0) {
6287
0
                    return ret;
6288
0
                }
6289
                /* *exts should be pointing to the TLSX_SUPPORTED_VERSIONS
6290
                 * ext in the list since it was pushed. */
6291
0
                (*exts)->resp = 1;
6292
0
            }
6293
0
        }
6294
6295
0
    }
6296
0
    else if (msgType == server_hello || msgType == hello_retry_request) {
6297
        /* Must contain one version. */
6298
0
        if (length != OPAQUE16_LEN)
6299
0
            return BUFFER_ERROR;
6300
6301
0
        major = input[0];
6302
0
        minor = input[OPAQUE8_LEN];
6303
6304
0
        if (major != ssl->ctx->method->version.major) {
6305
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6306
0
            return VERSION_ERROR;
6307
0
        }
6308
6309
        /* Can't downgrade with this extension below TLS v1.3. */
6310
0
        if (versionIsLesser(isDtls, minor, tls13minor)) {
6311
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6312
0
            return VERSION_ERROR;
6313
0
        }
6314
6315
        /* Version is TLS v1.2 to handle downgrading from TLS v1.3+. */
6316
0
        if (ssl->options.downgrade && ssl->version.minor == tls12minor) {
6317
            /* Set minor version back to TLS v1.3+ */
6318
0
            pv->minor = ssl->ctx->method->version.minor;
6319
0
        }
6320
6321
        /* No upgrade allowed. */
6322
0
        if (versionIsLesser(isDtls, ssl->version.minor, minor)) {
6323
0
            WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6324
0
            return VERSION_ERROR;
6325
0
        }
6326
6327
        /* Check downgrade. */
6328
0
        if (versionIsGreater(isDtls, ssl->version.minor, minor)) {
6329
0
            if (!ssl->options.downgrade) {
6330
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6331
0
                return VERSION_ERROR;
6332
0
            }
6333
6334
0
            if (versionIsLesser(
6335
0
                    isDtls, minor, ssl->options.minDowngrade)) {
6336
0
                WOLFSSL_ERROR_VERBOSE(VERSION_ERROR);
6337
0
                return VERSION_ERROR;
6338
0
            }
6339
6340
            /* Downgrade the version. */
6341
0
            pv->minor = minor;
6342
0
        }
6343
0
    }
6344
0
    else {
6345
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6346
0
        return SANITY_MSG_E;
6347
0
    }
6348
6349
0
    return 0;
6350
0
}
6351
6352
/* Sets a new SupportedVersions extension into the extension list.
6353
 *
6354
 * extensions  The list of extensions.
6355
 * data        The extensions specific data.
6356
 * heap        The heap used for allocation.
6357
 * returns 0 on success, otherwise failure.
6358
 */
6359
static int TLSX_SetSupportedVersions(TLSX** extensions, const void* data,
6360
                                     void* heap)
6361
0
{
6362
0
    if (extensions == NULL || data == NULL)
6363
0
        return BAD_FUNC_ARG;
6364
6365
0
    return TLSX_Push(extensions, TLSX_SUPPORTED_VERSIONS, data, heap);
6366
0
}
6367
6368
0
#define SV_GET_SIZE  TLSX_SupportedVersions_GetSize
6369
0
#define SV_WRITE     TLSX_SupportedVersions_Write
6370
0
#define SV_PARSE     TLSX_SupportedVersions_Parse
6371
6372
#else
6373
6374
#define SV_GET_SIZE(a, b, c) 0
6375
#define SV_WRITE(a, b, c, d) 0
6376
#define SV_PARSE(a, b, c, d, e, f, g) 0
6377
6378
#endif /* WOLFSSL_TLS13 */
6379
6380
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
6381
6382
/******************************************************************************/
6383
/* Cookie                                                                     */
6384
/******************************************************************************/
6385
6386
/* Free the cookie data.
6387
 *
6388
 * cookie  Cookie data.
6389
 * heap    The heap used for allocation.
6390
 */
6391
static void TLSX_Cookie_FreeAll(Cookie* cookie, void* heap)
6392
{
6393
    (void)heap;
6394
6395
    if (cookie != NULL)
6396
        XFREE(cookie, heap, DYNAMIC_TYPE_TLSX);
6397
}
6398
6399
/* Get the size of the encoded Cookie extension.
6400
 * In messages: ClientHello and HelloRetryRequest.
6401
 *
6402
 * cookie   The cookie to write.
6403
 * msgType  The type of the message this extension is being written into.
6404
 * returns the number of bytes of the encoded Cookie extension.
6405
 */
6406
static int TLSX_Cookie_GetSize(Cookie* cookie, byte msgType, word16* pSz)
6407
{
6408
    if (msgType == client_hello || msgType == hello_retry_request) {
6409
        *pSz += OPAQUE16_LEN + cookie->len;
6410
    }
6411
    else {
6412
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6413
        return SANITY_MSG_E;
6414
    }
6415
    return 0;
6416
}
6417
6418
/* Writes the Cookie extension into the output buffer.
6419
 * Assumes that the the output buffer is big enough to hold data.
6420
 * In messages: ClientHello and HelloRetryRequest.
6421
 *
6422
 * cookie   The cookie to write.
6423
 * output   The buffer to write into.
6424
 * msgType  The type of the message this extension is being written into.
6425
 * returns the number of bytes written into the buffer.
6426
 */
6427
static int TLSX_Cookie_Write(Cookie* cookie, byte* output, byte msgType,
6428
                             word16* pSz)
6429
{
6430
    if (msgType == client_hello || msgType == hello_retry_request) {
6431
        c16toa(cookie->len, output);
6432
        output += OPAQUE16_LEN;
6433
        XMEMCPY(output, cookie->data, cookie->len);
6434
        *pSz += OPAQUE16_LEN + cookie->len;
6435
    }
6436
    else {
6437
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6438
        return SANITY_MSG_E;
6439
    }
6440
    return 0;
6441
}
6442
6443
/* Parse the Cookie extension.
6444
 * In messages: ClientHello and HelloRetryRequest.
6445
 *
6446
 * ssl      The SSL/TLS object.
6447
 * input    The extension data.
6448
 * length   The length of the extension data.
6449
 * msgType  The type of the message this extension is being parsed from.
6450
 * returns 0 on success and other values indicate failure.
6451
 */
6452
static int TLSX_Cookie_Parse(WOLFSSL* ssl, const byte* input, word16 length,
6453
                             byte msgType)
6454
{
6455
    word16  len;
6456
    word16  idx = 0;
6457
    TLSX*   extension;
6458
    Cookie* cookie;
6459
6460
    if (msgType != client_hello && msgType != hello_retry_request) {
6461
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
6462
        return SANITY_MSG_E;
6463
    }
6464
6465
    /* Message contains length and Cookie which must be at least one byte
6466
     * in length.
6467
     */
6468
    if (length < OPAQUE16_LEN + 1)
6469
        return BUFFER_E;
6470
    ato16(input + idx, &len);
6471
    idx += OPAQUE16_LEN;
6472
    if (length - idx != len)
6473
        return BUFFER_E;
6474
6475
    if (msgType == hello_retry_request)
6476
        return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
6477
                               &ssl->extensions);
6478
6479
    /* client_hello */
6480
    extension = TLSX_Find(ssl->extensions, TLSX_COOKIE);
6481
    if (extension == NULL) {
6482
#ifdef WOLFSSL_DTLS13
6483
        if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version))
6484
            /* Allow a cookie extension with DTLS 1.3 because it is possible
6485
             * that a different SSL instance sent the cookie but we are now
6486
             * receiving it. */
6487
            return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0,
6488
                                   &ssl->extensions);
6489
        else
6490
#endif
6491
        {
6492
            WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
6493
            return HRR_COOKIE_ERROR;
6494
        }
6495
    }
6496
6497
    cookie = (Cookie*)extension->data;
6498
    if (cookie->len != len || XMEMCMP(cookie->data, input + idx, len) != 0) {
6499
        WOLFSSL_ERROR_VERBOSE(HRR_COOKIE_ERROR);
6500
        return HRR_COOKIE_ERROR;
6501
    }
6502
6503
    /* Request seen. */
6504
    extension->resp = 0;
6505
6506
    return 0;
6507
}
6508
6509
/* Use the data to create a new Cookie object in the extensions.
6510
 *
6511
 * ssl    SSL/TLS object.
6512
 * data   Cookie data.
6513
 * len    Length of cookie data in bytes.
6514
 * mac    MAC data.
6515
 * macSz  Length of MAC data in bytes.
6516
 * resp   Indicates the extension will go into a response (HelloRetryRequest).
6517
 * returns 0 on success and other values indicate failure.
6518
 */
6519
int TLSX_Cookie_Use(const WOLFSSL* ssl, const byte* data, word16 len, byte* mac,
6520
                    byte macSz, int resp, TLSX** exts)
6521
{
6522
    int     ret = 0;
6523
    TLSX*   extension;
6524
    Cookie* cookie;
6525
6526
    /* Find the cookie extension if it exists. */
6527
    extension = TLSX_Find(*exts, TLSX_COOKIE);
6528
    if (extension == NULL) {
6529
        /* Push new cookie extension. */
6530
        ret = TLSX_Push(exts, TLSX_COOKIE, NULL, ssl->heap);
6531
        if (ret != 0)
6532
            return ret;
6533
6534
        extension = TLSX_Find(*exts, TLSX_COOKIE);
6535
        if (extension == NULL)
6536
            return MEMORY_E;
6537
    }
6538
6539
    cookie = (Cookie*)XMALLOC(sizeof(Cookie) + len + macSz, ssl->heap,
6540
                              DYNAMIC_TYPE_TLSX);
6541
    if (cookie == NULL)
6542
        return MEMORY_E;
6543
6544
    cookie->len = len + macSz;
6545
    XMEMCPY(cookie->data, data, len);
6546
    if (mac != NULL)
6547
        XMEMCPY(cookie->data + len, mac, macSz);
6548
6549
    if (extension->data != NULL)
6550
        XFREE(extension->data, ssl->heap, DYNAMIC_TYPE_TLSX);
6551
6552
    extension->data = (void*)cookie;
6553
    extension->resp = (byte)resp;
6554
6555
    return 0;
6556
}
6557
6558
#define CKE_FREE_ALL  TLSX_Cookie_FreeAll
6559
#define CKE_GET_SIZE  TLSX_Cookie_GetSize
6560
#define CKE_WRITE     TLSX_Cookie_Write
6561
#define CKE_PARSE     TLSX_Cookie_Parse
6562
6563
#else
6564
6565
#define CKE_FREE_ALL(a, b)    0
6566
#define CKE_GET_SIZE(a, b, c) 0
6567
#define CKE_WRITE(a, b, c, d) 0
6568
#define CKE_PARSE(a, b, c, d) 0
6569
6570
#endif
6571
6572
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && \
6573
    !defined(WOLFSSL_NO_CA_NAMES) && defined(OPENSSL_EXTRA)
6574
/* Currently only settable through compatibility API */
6575
/******************************************************************************/
6576
/* Certificate Authorities                                                       */
6577
/******************************************************************************/
6578
6579
static word16 TLSX_CA_Names_GetSize(void* data)
6580
{
6581
    WOLFSSL* ssl = (WOLFSSL*)data;
6582
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
6583
    word16 size = 0;
6584
6585
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
6586
        /* To add support use a different member like ssl->ca_names and
6587
         * add accessor functions:
6588
         * - *_set0_CA_list
6589
         * - *_get0_CA_list */
6590
        WOLFSSL_MSG("We don't currently support sending the client's list.");
6591
        return 0;
6592
    }
6593
6594
    /* Length of names */
6595
    size += OPAQUE16_LEN;
6596
    for (names = SSL_CA_NAMES(ssl); names != NULL; names = names->next) {
6597
        byte seq[MAX_SEQ_SZ];
6598
        WOLFSSL_X509_NAME* name = names->data.name;
6599
6600
        if (name != NULL) {
6601
            /* 16-bit length | SEQ | Len | DER of name */
6602
            size += (word16)(OPAQUE16_LEN + SetSequence(name->rawLen, seq) +
6603
                             name->rawLen);
6604
        }
6605
    }
6606
    return size;
6607
}
6608
6609
static word16 TLSX_CA_Names_Write(void* data, byte* output)
6610
{
6611
    WOLFSSL* ssl = (WOLFSSL*)data;
6612
    WOLF_STACK_OF(WOLFSSL_X509_NAME)* names;
6613
    byte* len;
6614
6615
    if (ssl->options.side == WOLFSSL_CLIENT_END) {
6616
        /* To add support use a different member like ssl->ca_names and
6617
         * add accessor functions:
6618
         * - *_set0_CA_list
6619
         * - *_get0_CA_list */
6620
        WOLFSSL_MSG("We don't currently support sending the client's list.");
6621
        return 0;
6622
    }
6623
6624
    /* Reserve space for the length value */
6625
    len = output;
6626
    output += OPAQUE16_LEN;
6627
    for (names = SSL_CA_NAMES(ssl); names != NULL; names = names->next) {
6628
        byte seq[MAX_SEQ_SZ];
6629
        WOLFSSL_X509_NAME* name = names->data.name;
6630
6631
        if (name != NULL) {
6632
            c16toa((word16)name->rawLen +
6633
                   (word16)SetSequence(name->rawLen, seq), output);
6634
            output += OPAQUE16_LEN;
6635
            output += SetSequence(name->rawLen, output);
6636
            XMEMCPY(output, name->raw, name->rawLen);
6637
            output += name->rawLen;
6638
        }
6639
    }
6640
    /* Write the total length */
6641
    c16toa((word16)(output - len - OPAQUE16_LEN), len);
6642
    return (word16)(output - len);
6643
}
6644
6645
static int TLSX_CA_Names_Parse(WOLFSSL *ssl, const byte* input,
6646
                                  word16 length, byte isRequest)
6647
{
6648
    word16 extLen;
6649
6650
    (void)isRequest;
6651
6652
    if (ssl->options.side == WOLFSSL_SERVER_END) {
6653
        /* To add support use a different member like ssl->ca_names and
6654
         * add accessor functions:
6655
         * - *_set0_CA_list
6656
         * - *_get0_CA_list */
6657
        WOLFSSL_MSG("We don't currently support parsing the client's list.");
6658
        return 0;
6659
    }
6660
6661
    if (ssl->client_ca_names != ssl->ctx->client_ca_names)
6662
        wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL);
6663
    ssl->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL);
6664
    if (ssl->client_ca_names == NULL)
6665
        return MEMORY_ERROR;
6666
6667
    if (length < OPAQUE16_LEN)
6668
        return BUFFER_ERROR;
6669
6670
    ato16(input, &extLen);
6671
    input += OPAQUE16_LEN;
6672
    length -= OPAQUE16_LEN;
6673
    if (extLen != length)
6674
        return BUFFER_ERROR;
6675
6676
    while (length) {
6677
        word32 idx = 0;
6678
        WOLFSSL_X509_NAME* name = NULL;
6679
        int ret = 0;
6680
        int didInit = FALSE;
6681
        /* Use a DecodedCert struct to get access to GetName to
6682
         * parse DN name */
6683
#ifdef WOLFSSL_SMALL_STACK
6684
        DecodedCert *cert = (DecodedCert *)XMALLOC(
6685
            sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT);
6686
        if (cert == NULL)
6687
            return MEMORY_ERROR;
6688
#else
6689
        DecodedCert cert[1];
6690
#endif
6691
6692
        if (length < OPAQUE16_LEN) {
6693
            ret = BUFFER_ERROR;
6694
        }
6695
6696
        if (ret == 0) {
6697
            ato16(input, &extLen);
6698
            idx += OPAQUE16_LEN;
6699
6700
            if (idx + extLen > length)
6701
                ret = BUFFER_ERROR;
6702
        }
6703
6704
        if (ret == 0) {
6705
            InitDecodedCert(cert, input + idx, extLen, ssl->heap);
6706
            didInit = TRUE;
6707
            idx += extLen;
6708
            ret = GetName(cert, SUBJECT, extLen);
6709
        }
6710
6711
        if (ret == 0 && (name = wolfSSL_X509_NAME_new()) == NULL)
6712
            ret = MEMORY_ERROR;
6713
6714
        if (ret == 0) {
6715
            CopyDecodedName(name, cert, SUBJECT);
6716
            if (wolfSSL_sk_X509_NAME_push(ssl->client_ca_names, name)
6717
                    == WOLFSSL_FAILURE)
6718
                ret = MEMORY_ERROR;
6719
        }
6720
6721
        if (didInit)
6722
            FreeDecodedCert(cert);
6723
6724
#ifdef WOLFSSL_SMALL_STACK
6725
        XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT);
6726
#endif
6727
        if (ret != 0)
6728
            return ret;
6729
6730
        input += idx;
6731
        length -= (word16)idx;
6732
    }
6733
    return 0;
6734
}
6735
6736
#define CAN_GET_SIZE  TLSX_CA_Names_GetSize
6737
#define CAN_WRITE     TLSX_CA_Names_Write
6738
#define CAN_PARSE     TLSX_CA_Names_Parse
6739
6740
#else
6741
6742
#define CAN_GET_SIZE(...)  0
6743
#define CAN_WRITE(...)     0
6744
#define CAN_PARSE(...)     0
6745
6746
#endif
6747
6748
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
6749
/******************************************************************************/
6750
/* Signature Algorithms                                                       */
6751
/******************************************************************************/
6752
6753
/* Return the size of the SignatureAlgorithms extension's data.
6754
 *
6755
 * data  Unused
6756
 * returns the length of data that will be in the extension.
6757
 */
6758
6759
static word16 TLSX_SignatureAlgorithms_GetSize(void* data)
6760
0
{
6761
0
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
6762
6763
0
    if (sa->hashSigAlgoSz == 0)
6764
0
        return OPAQUE16_LEN + WOLFSSL_SUITES(sa->ssl)->hashSigAlgoSz;
6765
0
    else
6766
0
        return OPAQUE16_LEN + sa->hashSigAlgoSz;
6767
0
}
6768
6769
/* Creates a bit string of supported hash algorithms with RSA PSS.
6770
 * The bit string is used when determining which signature algorithm to use
6771
 * when creating the CertificateVerify message.
6772
 * Note: Valid data has an even length as each signature algorithm is two bytes.
6773
 *
6774
 * ssl     The SSL/TLS object.
6775
 * input   The buffer with the list of supported signature algorithms.
6776
 * length  The length of the list in bytes.
6777
 * returns 0 on success, BUFFER_ERROR when the length is not even.
6778
 */
6779
static int TLSX_SignatureAlgorithms_MapPss(WOLFSSL *ssl, const byte* input,
6780
                                           word16 length)
6781
0
{
6782
0
    word16 i;
6783
6784
0
    if ((length & 1) == 1)
6785
0
        return BUFFER_ERROR;
6786
6787
0
    ssl->pssAlgo = 0;
6788
0
    for (i = 0; i < length; i += 2) {
6789
0
        if (input[i] == rsa_pss_sa_algo && input[i + 1] <= sha512_mac)
6790
0
            ssl->pssAlgo |= 1 << input[i + 1];
6791
0
    #ifdef WOLFSSL_TLS13
6792
0
        if (input[i] == rsa_pss_sa_algo && input[i + 1] >= pss_sha256 &&
6793
0
                                                   input[i + 1] <= pss_sha512) {
6794
0
            ssl->pssAlgo |= 1 << input[i + 1];
6795
0
        }
6796
0
    #endif
6797
0
    }
6798
6799
0
    return 0;
6800
0
}
6801
6802
/* Writes the SignatureAlgorithms extension into the buffer.
6803
 *
6804
 * data    Unused
6805
 * output  The buffer to write the extension into.
6806
 * returns the length of data that was written.
6807
 */
6808
static word16 TLSX_SignatureAlgorithms_Write(void* data, byte* output)
6809
0
{
6810
0
    SignatureAlgorithms* sa = (SignatureAlgorithms*)data;
6811
0
    const Suites* suites = WOLFSSL_SUITES(sa->ssl);
6812
0
    word16 hashSigAlgoSz;
6813
6814
0
    if (sa->hashSigAlgoSz == 0) {
6815
0
        c16toa(suites->hashSigAlgoSz, output);
6816
0
        XMEMCPY(output + OPAQUE16_LEN, suites->hashSigAlgo,
6817
0
                suites->hashSigAlgoSz);
6818
0
        hashSigAlgoSz = suites->hashSigAlgoSz;
6819
0
    }
6820
0
    else {
6821
0
        c16toa(sa->hashSigAlgoSz, output);
6822
0
        XMEMCPY(output + OPAQUE16_LEN, sa->hashSigAlgo,
6823
0
                sa->hashSigAlgoSz);
6824
0
        hashSigAlgoSz = sa->hashSigAlgoSz;
6825
0
    }
6826
6827
0
#ifndef NO_RSA
6828
0
    TLSX_SignatureAlgorithms_MapPss(sa->ssl, output + OPAQUE16_LEN,
6829
0
            hashSigAlgoSz);
6830
0
#endif
6831
6832
0
    return OPAQUE16_LEN + hashSigAlgoSz;
6833
0
}
6834
6835
/* Parse the SignatureAlgorithms extension.
6836
 *
6837
 * ssl     The SSL/TLS object.
6838
 * input   The buffer with the extension data.
6839
 * length  The length of the extension data.
6840
 * returns 0 on success, otherwise failure.
6841
 */
6842
static int TLSX_SignatureAlgorithms_Parse(WOLFSSL *ssl, const byte* input,
6843
                                  word16 length, byte isRequest, Suites* suites)
6844
0
{
6845
0
    word16 len;
6846
6847
0
    if (!isRequest)
6848
0
        return BUFFER_ERROR;
6849
6850
    /* Must contain a length and at least algorithm. */
6851
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
6852
0
        return BUFFER_ERROR;
6853
6854
0
    ato16(input, &len);
6855
0
    input += OPAQUE16_LEN;
6856
6857
    /* Algorithm array must fill rest of data. */
6858
0
    if (length != OPAQUE16_LEN + len)
6859
0
        return BUFFER_ERROR;
6860
6861
    /* Sig Algo list size must be even. */
6862
0
    if (suites->hashSigAlgoSz % 2 != 0)
6863
0
        return BUFFER_ERROR;
6864
6865
    /* truncate hashSigAlgo list if too long */
6866
0
    suites->hashSigAlgoSz = len;
6867
0
    if (suites->hashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
6868
0
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
6869
0
        suites->hashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
6870
0
    }
6871
0
    XMEMCPY(suites->hashSigAlgo, input, suites->hashSigAlgoSz);
6872
6873
0
    return TLSX_SignatureAlgorithms_MapPss(ssl, input, len);
6874
0
}
6875
6876
/* Sets a new SignatureAlgorithms extension into the extension list.
6877
 *
6878
 * extensions  The list of extensions.
6879
 * data        The extensions specific data.
6880
 * heap        The heap used for allocation.
6881
 * returns 0 on success, otherwise failure.
6882
 */
6883
static int TLSX_SetSignatureAlgorithms(TLSX** extensions, WOLFSSL* ssl,
6884
                                       void* heap)
6885
0
{
6886
0
    SignatureAlgorithms* sa;
6887
0
    int ret;
6888
6889
0
    if (extensions == NULL)
6890
0
        return BAD_FUNC_ARG;
6891
6892
    /* Already present */
6893
0
    if (TLSX_Find(*extensions, TLSX_SIGNATURE_ALGORITHMS) != NULL)
6894
0
        return 0;
6895
6896
0
    sa = TLSX_SignatureAlgorithms_New(ssl, 0, heap);
6897
0
    if (sa == NULL)
6898
0
        return MEMORY_ERROR;
6899
6900
0
    ret = TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS, sa, heap);
6901
0
    if (ret != 0)
6902
0
        TLSX_SignatureAlgorithms_FreeAll(sa, heap);
6903
0
    return ret;
6904
0
}
6905
6906
SignatureAlgorithms* TLSX_SignatureAlgorithms_New(WOLFSSL* ssl,
6907
        word16 hashSigAlgoSz, void* heap)
6908
0
{
6909
0
    SignatureAlgorithms* sa;
6910
0
    (void)heap;
6911
6912
0
    sa = (SignatureAlgorithms*)XMALLOC(sizeof(*sa) + hashSigAlgoSz, heap,
6913
0
                                       DYNAMIC_TYPE_TLSX);
6914
0
    if (sa != NULL) {
6915
0
        XMEMSET(sa, 0, sizeof(*sa) + hashSigAlgoSz);
6916
0
        sa->ssl = ssl;
6917
0
        sa->hashSigAlgoSz = hashSigAlgoSz;
6918
0
    }
6919
0
    return sa;
6920
0
}
6921
6922
void TLSX_SignatureAlgorithms_FreeAll(SignatureAlgorithms* sa,
6923
                                             void* heap)
6924
0
{
6925
0
    XFREE(sa, heap, DYNAMIC_TYPE_TLSX);
6926
0
    (void)heap;
6927
0
}
6928
6929
0
#define SA_GET_SIZE  TLSX_SignatureAlgorithms_GetSize
6930
0
#define SA_WRITE     TLSX_SignatureAlgorithms_Write
6931
0
#define SA_PARSE     TLSX_SignatureAlgorithms_Parse
6932
0
#define SA_FREE_ALL  TLSX_SignatureAlgorithms_FreeAll
6933
#endif
6934
/******************************************************************************/
6935
/* Signature Algorithms Certificate                                           */
6936
/******************************************************************************/
6937
6938
#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
6939
/* Return the size of the SignatureAlgorithms extension's data.
6940
 *
6941
 * data  Unused
6942
 * returns the length of data that will be in the extension.
6943
 */
6944
static word16 TLSX_SignatureAlgorithmsCert_GetSize(void* data)
6945
0
{
6946
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6947
6948
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
6949
0
}
6950
6951
/* Writes the SignatureAlgorithmsCert extension into the buffer.
6952
 *
6953
 * data    Unused
6954
 * output  The buffer to write the extension into.
6955
 * returns the length of data that was written.
6956
 */
6957
static word16 TLSX_SignatureAlgorithmsCert_Write(void* data, byte* output)
6958
0
{
6959
0
    WOLFSSL* ssl = (WOLFSSL*)data;
6960
6961
0
    c16toa(ssl->certHashSigAlgoSz, output);
6962
0
    XMEMCPY(output + OPAQUE16_LEN, ssl->certHashSigAlgo,
6963
0
            ssl->certHashSigAlgoSz);
6964
6965
0
    return OPAQUE16_LEN + ssl->certHashSigAlgoSz;
6966
0
}
6967
6968
/* Parse the SignatureAlgorithmsCert extension.
6969
 *
6970
 * ssl     The SSL/TLS object.
6971
 * input   The buffer with the extension data.
6972
 * length  The length of the extension data.
6973
 * returns 0 on success, otherwise failure.
6974
 */
6975
static int TLSX_SignatureAlgorithmsCert_Parse(WOLFSSL *ssl, const byte* input,
6976
                                              word16 length, byte isRequest)
6977
0
{
6978
0
    word16 len;
6979
6980
0
    if (!isRequest)
6981
0
        return BUFFER_ERROR;
6982
6983
    /* Must contain a length and at least algorithm. */
6984
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN || (length & 1) != 0)
6985
0
        return BUFFER_ERROR;
6986
6987
0
    ato16(input, &len);
6988
0
    input += OPAQUE16_LEN;
6989
6990
    /* Algorithm array must fill rest of data. */
6991
0
    if (length != OPAQUE16_LEN + len)
6992
0
        return BUFFER_ERROR;
6993
6994
    /* truncate hashSigAlgo list if too long */
6995
0
    ssl->certHashSigAlgoSz = len;
6996
0
    if (ssl->certHashSigAlgoSz > WOLFSSL_MAX_SIGALGO) {
6997
0
        WOLFSSL_MSG("TLSX SigAlgo list exceeds max, truncating");
6998
0
        ssl->certHashSigAlgoSz = WOLFSSL_MAX_SIGALGO;
6999
0
    }
7000
0
    XMEMCPY(ssl->certHashSigAlgo, input, ssl->certHashSigAlgoSz);
7001
7002
0
    return 0;
7003
0
}
7004
7005
/* Sets a new SignatureAlgorithmsCert extension into the extension list.
7006
 *
7007
 * extensions  The list of extensions.
7008
 * data        The extensions specific data.
7009
 * heap        The heap used for allocation.
7010
 * returns 0 on success, otherwise failure.
7011
 */
7012
static int TLSX_SetSignatureAlgorithmsCert(TLSX** extensions,
7013
        const WOLFSSL* data, void* heap)
7014
0
{
7015
0
    if (extensions == NULL)
7016
0
        return BAD_FUNC_ARG;
7017
7018
0
    return TLSX_Push(extensions, TLSX_SIGNATURE_ALGORITHMS_CERT, data, heap);
7019
0
}
7020
7021
0
#define SAC_GET_SIZE  TLSX_SignatureAlgorithmsCert_GetSize
7022
0
#define SAC_WRITE     TLSX_SignatureAlgorithmsCert_Write
7023
0
#define SAC_PARSE     TLSX_SignatureAlgorithmsCert_Parse
7024
#endif /* WOLFSSL_TLS13 */
7025
7026
7027
/******************************************************************************/
7028
/* Key Share                                                                  */
7029
/******************************************************************************/
7030
7031
#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
7032
/* Create a key share entry using named Diffie-Hellman parameters group.
7033
 * Generates a key pair.
7034
 *
7035
 * ssl   The SSL/TLS object.
7036
 * kse   The key share entry object.
7037
 * returns 0 on success, otherwise failure.
7038
 */
7039
static int TLSX_KeyShare_GenDhKey(WOLFSSL *ssl, KeyShareEntry* kse)
7040
0
{
7041
0
    int ret = 0;
7042
0
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
7043
0
    word32 pSz = 0, pvtSz = 0;
7044
0
    DhKey* dhKey = (DhKey*)kse->key;
7045
7046
    /* Pick the parameters from the named group. */
7047
0
#ifdef HAVE_PUBLIC_FFDHE
7048
0
    const DhParams* params = NULL;
7049
0
    switch (kse->group) {
7050
0
    #ifdef HAVE_FFDHE_2048
7051
0
        case WOLFSSL_FFDHE_2048:
7052
0
            params = wc_Dh_ffdhe2048_Get();
7053
0
            pvtSz = 29;
7054
0
            break;
7055
0
    #endif
7056
    #ifdef HAVE_FFDHE_3072
7057
        case WOLFSSL_FFDHE_3072:
7058
            params = wc_Dh_ffdhe3072_Get();
7059
            pvtSz = 34;
7060
            break;
7061
    #endif
7062
    #ifdef HAVE_FFDHE_4096
7063
        case WOLFSSL_FFDHE_4096:
7064
            params = wc_Dh_ffdhe4096_Get();
7065
            pvtSz = 39;
7066
            break;
7067
    #endif
7068
    #ifdef HAVE_FFDHE_6144
7069
        case WOLFSSL_FFDHE_6144:
7070
            params = wc_Dh_ffdhe6144_Get();
7071
            pvtSz = 46;
7072
            break;
7073
    #endif
7074
    #ifdef HAVE_FFDHE_8192
7075
        case WOLFSSL_FFDHE_8192:
7076
            params = wc_Dh_ffdhe8192_Get();
7077
            pvtSz = 52;
7078
            break;
7079
    #endif
7080
0
        default:
7081
0
            break;
7082
0
    }
7083
0
    if (params == NULL)
7084
0
        return BAD_FUNC_ARG;
7085
0
    pSz = params->p_len;
7086
#else
7087
    pvtSz = wc_DhGetNamedKeyMinSize(kse->group);
7088
    if (pvtSz == 0) {
7089
        return BAD_FUNC_ARG;
7090
    }
7091
    ret = wc_DhGetNamedKeyParamSize(kse->group, &pSz, NULL, NULL);
7092
    if (ret != 0) {
7093
        return BAD_FUNC_ARG;
7094
    }
7095
#endif
7096
7097
    /* Trigger Key Generation */
7098
0
    if (kse->pubKey == NULL || kse->privKey == NULL) {
7099
0
        if (kse->key == NULL) {
7100
0
            kse->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
7101
0
                DYNAMIC_TYPE_DH);
7102
0
            if (kse->key == NULL)
7103
0
                return MEMORY_E;
7104
7105
            /* Setup Key */
7106
0
            ret = wc_InitDhKey_ex((DhKey*)kse->key, ssl->heap, ssl->devId);
7107
0
            if (ret == 0) {
7108
0
                dhKey = (DhKey*)kse->key;
7109
0
            #ifdef HAVE_PUBLIC_FFDHE
7110
0
                ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
7111
0
                                                                 params->g_len);
7112
            #else
7113
                ret = wc_DhSetNamedKey(dhKey, kse->group);
7114
            #endif
7115
0
            }
7116
0
        }
7117
7118
        /* Allocate space for the private and public key */
7119
0
        if (ret == 0 && kse->pubKey == NULL) {
7120
0
            kse->pubKey = (byte*)XMALLOC(pSz, ssl->heap,
7121
0
                DYNAMIC_TYPE_PUBLIC_KEY);
7122
0
            if (kse->pubKey == NULL)
7123
0
                ret = MEMORY_E;
7124
0
        }
7125
7126
0
        if (ret == 0 && kse->privKey == NULL) {
7127
0
            kse->privKey = (byte*)XMALLOC(pvtSz, ssl->heap,
7128
0
                DYNAMIC_TYPE_PRIVATE_KEY);
7129
0
            if (kse->privKey == NULL)
7130
0
                ret = MEMORY_E;
7131
0
        }
7132
7133
0
        if (ret == 0) {
7134
        #if defined(WOLFSSL_STATIC_EPHEMERAL) && defined(WOLFSSL_DH_EXTRA)
7135
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_DH, kse->key);
7136
            kse->pubKeyLen = pSz;
7137
            kse->keyLen = pvtSz;
7138
            if (ret == 0) {
7139
                ret = wc_DhExportKeyPair(dhKey,
7140
                    (byte*)kse->privKey, &kse->keyLen, /* private */
7141
                    kse->pubKey, &kse->pubKeyLen /* public */
7142
                );
7143
            }
7144
            else
7145
        #endif
7146
0
            {
7147
                /* Generate a new key pair */
7148
                /* For async this is called once and when event is done, the
7149
                 *   provided buffers will be populated.
7150
                 * Final processing is zero pad below. */
7151
0
                kse->pubKeyLen = pSz;
7152
0
                kse->keyLen = pvtSz;
7153
0
                ret = DhGenKeyPair(ssl, dhKey,
7154
0
                    (byte*)kse->privKey, &kse->keyLen, /* private */
7155
0
                    kse->pubKey, &kse->pubKeyLen /* public */
7156
0
                );
7157
            #ifdef WOLFSSL_ASYNC_CRYPT
7158
                if (ret == WC_PENDING_E) {
7159
                    return ret;
7160
                }
7161
            #endif
7162
0
            }
7163
0
        }
7164
0
    }
7165
7166
0
    if (ret == 0) {
7167
0
        if (pSz != kse->pubKeyLen) {
7168
            /* Zero pad the front of the public key to match prime "p" size */
7169
0
            XMEMMOVE(kse->pubKey + pSz - kse->pubKeyLen, kse->pubKey,
7170
0
                kse->pubKeyLen);
7171
0
            XMEMSET(kse->pubKey, 0, pSz - kse->pubKeyLen);
7172
0
            kse->pubKeyLen = pSz;
7173
0
        }
7174
7175
0
        if (pvtSz != kse->keyLen) {
7176
            /* Zero pad the front of the private key */
7177
0
            XMEMMOVE(kse->privKey + pvtSz - kse->keyLen, kse->privKey,
7178
0
                kse->keyLen);
7179
0
            XMEMSET(kse->privKey, 0, pvtSz - kse->keyLen);
7180
0
            kse->keyLen = pvtSz;
7181
0
        }
7182
7183
    #ifdef WOLFSSL_DEBUG_TLS
7184
        WOLFSSL_MSG("Public DH Key");
7185
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
7186
    #endif
7187
0
    }
7188
7189
    /* Always release the DH key to free up memory.
7190
     * The DhKey will be setup again in TLSX_KeyShare_ProcessDh */
7191
0
    if (dhKey != NULL)
7192
0
        wc_FreeDhKey(dhKey);
7193
0
    if (kse->key != NULL) {
7194
0
        XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_DH);
7195
0
        kse->key = NULL;
7196
0
    }
7197
7198
0
    if (ret != 0) {
7199
        /* Cleanup on error, otherwise data owned by key share entry */
7200
0
        if (kse->privKey != NULL) {
7201
0
            XFREE(kse->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7202
0
            kse->privKey = NULL;
7203
0
        }
7204
0
        if (kse->pubKey != NULL) {
7205
0
            XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7206
0
            kse->pubKey = NULL;
7207
0
        }
7208
0
    }
7209
#else
7210
    (void)ssl;
7211
    (void)kse;
7212
7213
    ret = NOT_COMPILED_IN;
7214
    WOLFSSL_ERROR_VERBOSE(ret);
7215
#endif
7216
7217
0
    return ret;
7218
0
}
7219
7220
/* Create a key share entry using X25519 parameters group.
7221
 * Generates a key pair.
7222
 *
7223
 * ssl   The SSL/TLS object.
7224
 * kse   The key share entry object.
7225
 * returns 0 on success, otherwise failure.
7226
 */
7227
static int TLSX_KeyShare_GenX25519Key(WOLFSSL *ssl, KeyShareEntry* kse)
7228
0
{
7229
0
    int ret = 0;
7230
0
#ifdef HAVE_CURVE25519
7231
0
    curve25519_key* key = (curve25519_key*)kse->key;
7232
7233
0
    if (kse->key == NULL) {
7234
        /* Allocate a Curve25519 key to hold private key. */
7235
0
        kse->key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
7236
0
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
7237
0
        if (kse->key == NULL) {
7238
0
            WOLFSSL_MSG("GenX25519Key memory error");
7239
0
            return MEMORY_E;
7240
0
        }
7241
7242
        /* Make an Curve25519 key. */
7243
0
        ret = wc_curve25519_init_ex((curve25519_key*)kse->key, ssl->heap,
7244
0
            INVALID_DEVID);
7245
0
        if (ret == 0) {
7246
            /* setting "key" means okay to call wc_curve25519_free */
7247
0
            key = (curve25519_key*)kse->key;
7248
7249
        #ifdef WOLFSSL_STATIC_EPHEMERAL
7250
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE25519, kse->key);
7251
            if (ret != 0)
7252
        #endif
7253
0
            {
7254
0
                ret = wc_curve25519_make_key(ssl->rng, CURVE25519_KEYSIZE, key);
7255
0
            }
7256
0
        }
7257
0
    }
7258
7259
0
    if (ret == 0 && kse->pubKey == NULL) {
7260
        /* Allocate space for the public key. */
7261
0
        kse->pubKey = (byte*)XMALLOC(CURVE25519_KEYSIZE, ssl->heap,
7262
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
7263
0
        if (kse->pubKey == NULL) {
7264
0
            WOLFSSL_MSG("GenX25519Key pub memory error");
7265
0
            ret = MEMORY_E;
7266
0
        }
7267
0
    }
7268
7269
0
    if (ret == 0) {
7270
        /* Export Curve25519 public key. */
7271
0
        kse->pubKeyLen = CURVE25519_KEYSIZE;
7272
0
        if (wc_curve25519_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
7273
0
                                                  EC25519_LITTLE_ENDIAN) != 0) {
7274
0
            ret = ECC_EXPORT_ERROR;
7275
0
            WOLFSSL_ERROR_VERBOSE(ret);
7276
0
        }
7277
0
        kse->pubKeyLen = CURVE25519_KEYSIZE; /* always CURVE25519_KEYSIZE */
7278
0
    }
7279
7280
#ifdef WOLFSSL_DEBUG_TLS
7281
    if (ret == 0) {
7282
        WOLFSSL_MSG("Public Curve25519 Key");
7283
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
7284
    }
7285
#endif
7286
7287
0
    if (ret != 0) {
7288
        /* Data owned by key share entry otherwise. */
7289
0
        if (kse->pubKey != NULL) {
7290
0
            XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7291
0
            kse->pubKey = NULL;
7292
0
        }
7293
0
        if (key != NULL)
7294
0
            wc_curve25519_free(key);
7295
0
        if (kse->key != NULL) {
7296
0
            XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7297
0
            kse->key = NULL;
7298
0
        }
7299
0
    }
7300
#else
7301
    (void)ssl;
7302
    (void)kse;
7303
7304
    ret = NOT_COMPILED_IN;
7305
    WOLFSSL_ERROR_VERBOSE(ret);
7306
#endif /* HAVE_CURVE25519 */
7307
7308
0
    return ret;
7309
0
}
7310
7311
/* Create a key share entry using X448 parameters group.
7312
 * Generates a key pair.
7313
 *
7314
 * ssl   The SSL/TLS object.
7315
 * kse   The key share entry object.
7316
 * returns 0 on success, otherwise failure.
7317
 */
7318
static int TLSX_KeyShare_GenX448Key(WOLFSSL *ssl, KeyShareEntry* kse)
7319
0
{
7320
0
    int ret = 0;
7321
0
#ifdef HAVE_CURVE448
7322
0
    curve448_key* key = (curve448_key*)kse->key;
7323
7324
0
    if (kse->key == NULL) {
7325
        /* Allocate a Curve448 key to hold private key. */
7326
0
        kse->key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
7327
0
                                                      DYNAMIC_TYPE_PRIVATE_KEY);
7328
0
        if (kse->key == NULL) {
7329
0
            WOLFSSL_MSG("GenX448Key memory error");
7330
0
            return MEMORY_E;
7331
0
        }
7332
7333
        /* Make an Curve448 key. */
7334
0
        ret = wc_curve448_init((curve448_key*)kse->key);
7335
0
        if (ret == 0) {
7336
0
            key = (curve448_key*)kse->key;
7337
7338
            #ifdef WOLFSSL_STATIC_EPHEMERAL
7339
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_CURVE448, kse->key);
7340
            if (ret != 0)
7341
        #endif
7342
0
            {
7343
0
                ret = wc_curve448_make_key(ssl->rng, CURVE448_KEY_SIZE, key);
7344
0
            }
7345
0
        }
7346
0
    }
7347
7348
0
    if (ret == 0 && kse->pubKey == NULL) {
7349
        /* Allocate space for the public key. */
7350
0
        kse->pubKey = (byte*)XMALLOC(CURVE448_KEY_SIZE, ssl->heap,
7351
0
                                                       DYNAMIC_TYPE_PUBLIC_KEY);
7352
0
        if (kse->pubKey == NULL) {
7353
0
            WOLFSSL_MSG("GenX448Key pub memory error");
7354
0
            ret = MEMORY_E;
7355
0
        }
7356
0
    }
7357
7358
0
    if (ret == 0) {
7359
        /* Export Curve448 public key. */
7360
0
        kse->pubKeyLen = CURVE448_KEY_SIZE;
7361
0
        if (wc_curve448_export_public_ex(key, kse->pubKey, &kse->pubKeyLen,
7362
0
                                                    EC448_LITTLE_ENDIAN) != 0) {
7363
0
            ret = ECC_EXPORT_ERROR;
7364
0
        }
7365
0
        kse->pubKeyLen = CURVE448_KEY_SIZE; /* always CURVE448_KEY_SIZE */
7366
0
    }
7367
7368
#ifdef WOLFSSL_DEBUG_TLS
7369
    if (ret == 0) {
7370
        WOLFSSL_MSG("Public Curve448 Key");
7371
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
7372
    }
7373
#endif
7374
7375
0
    if (ret != 0) {
7376
        /* Data owned by key share entry otherwise. */
7377
0
        if (kse->pubKey != NULL) {
7378
0
            XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7379
0
            kse->pubKey = NULL;
7380
0
        }
7381
0
        if (key != NULL)
7382
0
            wc_curve448_free(key);
7383
0
        if (kse->key != NULL) {
7384
0
            XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7385
0
            kse->key = NULL;
7386
0
        }
7387
0
    }
7388
#else
7389
    (void)ssl;
7390
    (void)kse;
7391
7392
    ret = NOT_COMPILED_IN;
7393
    WOLFSSL_ERROR_VERBOSE(ret);
7394
#endif /* HAVE_CURVE448 */
7395
7396
0
    return ret;
7397
0
}
7398
7399
/* Create a key share entry using named elliptic curve parameters group.
7400
 * Generates a key pair.
7401
 *
7402
 * ssl   The SSL/TLS object.
7403
 * kse   The key share entry object.
7404
 * returns 0 on success, otherwise failure.
7405
 */
7406
static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse)
7407
0
{
7408
0
    int ret = 0;
7409
0
#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)
7410
0
    word32 keySize = 0;
7411
0
    word16 curveId = (word16) ECC_CURVE_INVALID;
7412
0
    ecc_key* eccKey = (ecc_key*)kse->key;
7413
7414
    /* TODO: [TLS13] Get key sizes using wc_ecc_get_curve_size_from_id. */
7415
    /* Translate named group to a curve id. */
7416
0
    switch (kse->group) {
7417
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
7418
0
        #ifndef NO_ECC_SECP
7419
0
        case WOLFSSL_ECC_SECP256R1:
7420
0
            curveId = ECC_SECP256R1;
7421
0
            keySize = 32;
7422
0
            break;
7423
0
        #endif /* !NO_ECC_SECP */
7424
0
        #ifdef WOLFSSL_SM2
7425
0
        case WOLFSSL_ECC_SM2P256V1:
7426
0
            curveId = ECC_SM2P256V1;
7427
0
            keySize = 32;
7428
0
            break;
7429
0
        #endif /* !NO_ECC_SECP */
7430
0
    #endif
7431
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
7432
0
        #ifndef NO_ECC_SECP
7433
0
        case WOLFSSL_ECC_SECP384R1:
7434
0
            curveId = ECC_SECP384R1;
7435
0
            keySize = 48;
7436
0
            break;
7437
0
        #endif /* !NO_ECC_SECP */
7438
0
    #endif
7439
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
7440
0
        #ifndef NO_ECC_SECP
7441
0
        case WOLFSSL_ECC_SECP521R1:
7442
0
            curveId = ECC_SECP521R1;
7443
0
            keySize = 66;
7444
0
            break;
7445
0
        #endif /* !NO_ECC_SECP */
7446
0
    #endif
7447
0
        default:
7448
0
            WOLFSSL_ERROR_VERBOSE(BAD_FUNC_ARG);
7449
0
            return BAD_FUNC_ARG;
7450
0
    }
7451
7452
0
    if (kse->key == NULL) {
7453
        /* Allocate an ECC key to hold private key. */
7454
0
        kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC);
7455
0
        if (kse->key == NULL) {
7456
0
            WOLFSSL_MSG("EccTempKey Memory error");
7457
0
            return MEMORY_E;
7458
0
        }
7459
7460
        /* Initialize an ECC key struct for the ephemeral key */
7461
0
        ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId);
7462
7463
0
        if (ret == 0) {
7464
0
            kse->keyLen = keySize;
7465
0
            kse->pubKeyLen = keySize * 2 + 1;
7466
7467
        #if defined(WOLFSSL_RENESAS_TSIP_TLS)
7468
            ret = tsip_Tls13GenEccKeyPair(ssl, kse);
7469
            if (ret != CRYPTOCB_UNAVAILABLE) {
7470
                return ret;
7471
            }
7472
        #endif
7473
            /* setting eccKey means okay to call wc_ecc_free */
7474
0
            eccKey = (ecc_key*)kse->key;
7475
7476
        #ifdef WOLFSSL_STATIC_EPHEMERAL
7477
            ret = wolfSSL_StaticEphemeralKeyLoad(ssl, WC_PK_TYPE_ECDH, kse->key);
7478
            if (ret != 0)
7479
        #endif
7480
0
            {
7481
                /* set curve info for EccMakeKey "peer" info */
7482
0
                ret = wc_ecc_set_curve(eccKey, kse->keyLen, curveId);
7483
0
                if (ret == 0) {
7484
            #ifdef WOLFSSL_ASYNC_CRYPT
7485
                    /* Detect when private key generation is done */
7486
                    if (ssl->error == WC_PENDING_E &&
7487
                            eccKey->type == ECC_PRIVATEKEY) {
7488
                        ret = 0; /* ECC Key Generation is done */
7489
                    }
7490
                    else
7491
            #endif
7492
0
                    {
7493
                        /* Generate ephemeral ECC key */
7494
                        /* For async this is called once and when event is done, the
7495
                        *   provided buffers in key be populated.
7496
                        * Final processing is x963 key export below. */
7497
0
                        ret = EccMakeKey(ssl, eccKey, eccKey);
7498
0
                    }
7499
0
                }
7500
            #ifdef WOLFSSL_ASYNC_CRYPT
7501
                if (ret == WC_PENDING_E)
7502
                    return ret;
7503
            #endif
7504
0
            }
7505
0
        }
7506
0
    }
7507
7508
0
    if (ret == 0 && kse->pubKey == NULL) {
7509
        /* Allocate space for the public key */
7510
0
        kse->pubKey = (byte*)XMALLOC(kse->pubKeyLen, ssl->heap,
7511
0
            DYNAMIC_TYPE_PUBLIC_KEY);
7512
0
        if (kse->pubKey == NULL) {
7513
0
            WOLFSSL_MSG("Key data Memory error");
7514
0
            ret = MEMORY_E;
7515
0
        }
7516
0
    }
7517
7518
0
    if (ret == 0) {
7519
0
        XMEMSET(kse->pubKey, 0, kse->pubKeyLen);
7520
7521
        /* Export public key. */
7522
0
        PRIVATE_KEY_UNLOCK();
7523
0
        if (wc_ecc_export_x963(eccKey, kse->pubKey, &kse->pubKeyLen) != 0) {
7524
0
            ret = ECC_EXPORT_ERROR;
7525
0
            WOLFSSL_ERROR_VERBOSE(ret);
7526
0
        }
7527
0
        PRIVATE_KEY_LOCK();
7528
0
    }
7529
#ifdef WOLFSSL_DEBUG_TLS
7530
    if (ret == 0) {
7531
        WOLFSSL_MSG("Public ECC Key");
7532
        WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen);
7533
    }
7534
#endif
7535
7536
0
    if (ret != 0) {
7537
        /* Cleanup on error, otherwise data owned by key share entry */
7538
0
        if (kse->pubKey != NULL) {
7539
0
            XFREE(kse->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7540
0
            kse->pubKey = NULL;
7541
0
        }
7542
0
        if (eccKey != NULL)
7543
0
            wc_ecc_free(eccKey);
7544
0
        if (kse->key != NULL) {
7545
0
            XFREE(kse->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7546
0
            kse->key = NULL;
7547
0
        }
7548
0
    }
7549
#else
7550
    (void)ssl;
7551
    (void)kse;
7552
7553
    ret = NOT_COMPILED_IN;
7554
    WOLFSSL_ERROR_VERBOSE(ret);
7555
#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */
7556
7557
0
    return ret;
7558
0
}
7559
7560
#ifdef HAVE_PQC
7561
static int kyber_id2type(int id, int *type)
7562
{
7563
    int ret = 0;
7564
7565
    switch (id) {
7566
    #ifdef WOLFSSL_KYBER512
7567
        case WOLFSSL_KYBER_LEVEL1:
7568
            *type = KYBER512;
7569
            break;
7570
    #endif
7571
    #ifdef WOLFSSL_KYBER768
7572
        case WOLFSSL_KYBER_LEVEL3:
7573
            *type = KYBER768;
7574
            break;
7575
    #endif
7576
    #ifdef WOLFSSL_KYBER1024
7577
        case WOLFSSL_KYBER_LEVEL5:
7578
            *type = KYBER1024;
7579
            break;
7580
    #endif
7581
        default:
7582
            ret = NOT_COMPILED_IN;
7583
            break;
7584
    }
7585
7586
    return ret;
7587
}
7588
7589
typedef struct PqcHybridMapping {
7590
    int hybrid;
7591
    int ecc;
7592
    int pqc;
7593
} PqcHybridMapping;
7594
7595
static const PqcHybridMapping pqc_hybrid_mapping[] = {
7596
    {.hybrid = WOLFSSL_P256_KYBER_LEVEL1,     .ecc = WOLFSSL_ECC_SECP256R1,
7597
     .pqc = WOLFSSL_KYBER_LEVEL1},
7598
    {.hybrid = WOLFSSL_P384_KYBER_LEVEL3,     .ecc = WOLFSSL_ECC_SECP384R1,
7599
     .pqc = WOLFSSL_KYBER_LEVEL3},
7600
    {.hybrid = WOLFSSL_P521_KYBER_LEVEL5,     .ecc = WOLFSSL_ECC_SECP521R1,
7601
     .pqc = WOLFSSL_KYBER_LEVEL5},
7602
    {.hybrid = 0, .ecc = 0, .pqc = 0}
7603
};
7604
7605
/* This will map an ecc-pqs hybrid group into its ecc group and pqc kem group.
7606
 * If it cannot find a mapping then *pqc is set to group. ecc is optional. */
7607
static void findEccPqc(int *ecc, int *pqc, int group)
7608
{
7609
    int i;
7610
    if (pqc == NULL) {
7611
        return;
7612
    }
7613
7614
    *pqc = 0;
7615
    if (ecc != NULL) {
7616
        *ecc = 0;
7617
    }
7618
7619
    for (i = 0; pqc_hybrid_mapping[i].hybrid != 0; i++) {
7620
        if (pqc_hybrid_mapping[i].hybrid == group) {
7621
            *pqc = pqc_hybrid_mapping[i].pqc;
7622
            if (ecc != NULL) {
7623
                *ecc = pqc_hybrid_mapping[i].ecc;
7624
            }
7625
            break;
7626
        }
7627
    }
7628
7629
    if (*pqc == 0) {
7630
        /* It is not a hybrid, so maybe its simple. */
7631
        *pqc = group;
7632
    }
7633
}
7634
7635
/* Create a key share entry using liboqs parameters group.
7636
 * Generates a key pair.
7637
 *
7638
 * ssl   The SSL/TLS object.
7639
 * kse   The key share entry object.
7640
 * returns 0 on success, otherwise failure.
7641
 */
7642
static int TLSX_KeyShare_GenPqcKey(WOLFSSL *ssl, KeyShareEntry* kse)
7643
{
7644
    int ret = 0;
7645
    int type = 0;
7646
    KyberKey kem[1];
7647
    byte* pubKey = NULL;
7648
    byte* privKey = NULL;
7649
    KeyShareEntry *ecc_kse = NULL;
7650
    int oqs_group = 0;
7651
    int ecc_group = 0;
7652
    word32 privSz = 0;
7653
    word32 pubSz = 0;
7654
7655
    findEccPqc(&ecc_group, &oqs_group, kse->group);
7656
    ret = kyber_id2type(oqs_group, &type);
7657
    if (ret == NOT_COMPILED_IN) {
7658
        WOLFSSL_MSG("Invalid Kyber algorithm specified.");
7659
        ret = BAD_FUNC_ARG;
7660
    }
7661
7662
    if (ret == 0) {
7663
        ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId);
7664
        if (ret != 0) {
7665
            WOLFSSL_MSG("Failed to initialize Kyber Key.");
7666
        }
7667
    }
7668
7669
    if (ret == 0) {
7670
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
7671
                   DYNAMIC_TYPE_TLSX);
7672
        if (ecc_kse == NULL) {
7673
            WOLFSSL_MSG("ecc_kse memory allocation failure");
7674
            ret = MEMORY_ERROR;
7675
        }
7676
    }
7677
7678
    if (ret == 0) {
7679
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
7680
7681
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
7682
    }
7683
    if (ret == 0) {
7684
        ret = wc_KyberKey_PublicKeySize(kem, &pubSz);
7685
    }
7686
7687
    if (ret == 0 && ecc_group != 0) {
7688
        ecc_kse->group = ecc_group;
7689
        ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
7690
        /* If fail, no error message,  TLSX_KeyShare_GenEccKey will do it. */
7691
    }
7692
7693
    if (ret == 0) {
7694
        pubKey = (byte*)XMALLOC(ecc_kse->pubKeyLen + pubSz, ssl->heap,
7695
                                DYNAMIC_TYPE_PUBLIC_KEY);
7696
        if (pubKey == NULL) {
7697
            WOLFSSL_MSG("pubkey memory allocation failure");
7698
            ret = MEMORY_ERROR;
7699
        }
7700
    }
7701
7702
    if (ret == 0) {
7703
        privKey = (byte*)XMALLOC(privSz, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7704
        if (privKey == NULL) {
7705
            WOLFSSL_MSG("privkey memory allocation failure");
7706
            ret = MEMORY_ERROR;
7707
        }
7708
    }
7709
7710
    if (ret == 0) {
7711
        ret = wc_KyberKey_MakeKey(kem, ssl->rng);
7712
        if (ret != 0) {
7713
            WOLFSSL_MSG("Kyber keygen failure");
7714
        }
7715
    }
7716
    if (ret == 0) {
7717
        ret = wc_KyberKey_EncodePublicKey(kem, pubKey + ecc_kse->pubKeyLen,
7718
            pubSz);
7719
    }
7720
    if (ret == 0) {
7721
        ret = wc_KyberKey_EncodePrivateKey(kem, privKey, privSz);
7722
    }
7723
    if (ret == 0) {
7724
        XMEMCPY(pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen);
7725
        kse->pubKey = pubKey;
7726
        kse->pubKeyLen = ecc_kse->pubKeyLen + pubSz;
7727
        pubKey = NULL;
7728
7729
        /* Note we are saving the OQS private key and ECC private key
7730
         * separately. That's because the ECC private key is not simply a
7731
         * buffer. Its is an ecc_key struct.
7732
         */
7733
        kse->privKey = privKey;
7734
        privKey = NULL;
7735
7736
        kse->key = ecc_kse->key;
7737
        ecc_kse->key = NULL;
7738
    }
7739
7740
#ifdef WOLFSSL_DEBUG_TLS
7741
    WOLFSSL_MSG("Public Kyber Key");
7742
    WOLFSSL_BUFFER(kse->pubKey, kse->pubKeyLen );
7743
#endif
7744
7745
    wc_KyberKey_Free(kem);
7746
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
7747
    if (pubKey != NULL)
7748
        XFREE(pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
7749
    if (privKey != NULL)
7750
        XFREE(privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
7751
7752
    return ret;
7753
}
7754
#endif /* HAVE_PQC */
7755
7756
/* Generate a secret/key using the key share entry.
7757
 *
7758
 * ssl  The SSL/TLS object.
7759
 * kse  The key share entry holding peer data.
7760
 */
7761
int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse)
7762
0
{
7763
0
    int ret;
7764
    /* Named FFDHE groups have a bit set to identify them. */
7765
0
    if (WOLFSSL_NAMED_GROUP_IS_FFHDE(kse->group))
7766
0
        ret = TLSX_KeyShare_GenDhKey(ssl, kse);
7767
0
    else if (kse->group == WOLFSSL_ECC_X25519)
7768
0
        ret = TLSX_KeyShare_GenX25519Key(ssl, kse);
7769
0
    else if (kse->group == WOLFSSL_ECC_X448)
7770
0
        ret = TLSX_KeyShare_GenX448Key(ssl, kse);
7771
#ifdef HAVE_PQC
7772
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group))
7773
        ret = TLSX_KeyShare_GenPqcKey(ssl, kse);
7774
#endif
7775
0
    else
7776
0
        ret = TLSX_KeyShare_GenEccKey(ssl, kse);
7777
#ifdef WOLFSSL_ASYNC_CRYPT
7778
    kse->lastRet = ret;
7779
#endif
7780
0
    return ret;
7781
0
}
7782
7783
/* Free the key share dynamic data.
7784
 *
7785
 * list  The linked list of key share entry objects.
7786
 * heap  The heap used for allocation.
7787
 */
7788
static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
7789
0
{
7790
0
    KeyShareEntry* current;
7791
7792
0
    while ((current = list) != NULL) {
7793
0
        list = current->next;
7794
0
        if (WOLFSSL_NAMED_GROUP_IS_FFHDE(current->group)) {
7795
0
#ifndef NO_DH
7796
0
            wc_FreeDhKey((DhKey*)current->key);
7797
0
#endif
7798
0
        }
7799
0
        else if (current->group == WOLFSSL_ECC_X25519) {
7800
0
#ifdef HAVE_CURVE25519
7801
0
            wc_curve25519_free((curve25519_key*)current->key);
7802
0
#endif
7803
0
        }
7804
0
        else if (current->group == WOLFSSL_ECC_X448) {
7805
0
#ifdef HAVE_CURVE448
7806
0
            wc_curve448_free((curve448_key*)current->key);
7807
0
#endif
7808
0
        }
7809
#ifdef HAVE_PQC
7810
        else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group) &&
7811
                 current->key != NULL) {
7812
            ForceZero((byte*)current->key, current->keyLen);
7813
        }
7814
#endif
7815
0
        else {
7816
0
#ifdef HAVE_ECC
7817
0
            wc_ecc_free((ecc_key*)current->key);
7818
0
#endif
7819
0
        }
7820
0
        XFREE(current->key, heap, DYNAMIC_TYPE_PRIVATE_KEY);
7821
0
    #if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
7822
0
        XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY);
7823
0
    #endif
7824
0
        XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY);
7825
0
        XFREE(current->ke, heap, DYNAMIC_TYPE_PUBLIC_KEY);
7826
0
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
7827
0
    }
7828
7829
0
    (void)heap;
7830
0
}
7831
7832
/* Get the size of the encoded key share extension.
7833
 *
7834
 * list     The linked list of key share extensions.
7835
 * msgType  The type of the message this extension is being written into.
7836
 * returns the number of bytes of the encoded key share extension.
7837
 */
7838
static word16 TLSX_KeyShare_GetSize(KeyShareEntry* list, byte msgType)
7839
0
{
7840
0
    word16         len = 0;
7841
0
    byte           isRequest = (msgType == client_hello);
7842
0
    KeyShareEntry* current;
7843
7844
    /* The named group the server wants to use. */
7845
0
    if (msgType == hello_retry_request)
7846
0
        return OPAQUE16_LEN;
7847
7848
    /* List of key exchange groups. */
7849
0
    if (isRequest)
7850
0
        len += OPAQUE16_LEN;
7851
0
    while ((current = list) != NULL) {
7852
0
        list = current->next;
7853
7854
0
        if (!isRequest && current->pubKey == NULL)
7855
0
            continue;
7856
7857
0
        len += (word16)(KE_GROUP_LEN + OPAQUE16_LEN + current->pubKeyLen);
7858
0
    }
7859
7860
0
    return len;
7861
0
}
7862
7863
/* Writes the key share extension into the output buffer.
7864
 * Assumes that the the output buffer is big enough to hold data.
7865
 *
7866
 * list     The linked list of key share entries.
7867
 * output   The buffer to write into.
7868
 * msgType  The type of the message this extension is being written into.
7869
 * returns the number of bytes written into the buffer.
7870
 */
7871
static word16 TLSX_KeyShare_Write(KeyShareEntry* list, byte* output,
7872
                                  byte msgType)
7873
0
{
7874
0
    word16         i = 0;
7875
0
    byte           isRequest = (msgType == client_hello);
7876
0
    KeyShareEntry* current;
7877
7878
0
    if (msgType == hello_retry_request) {
7879
0
        c16toa(list->group, output);
7880
0
        return OPAQUE16_LEN;
7881
0
    }
7882
7883
    /* ClientHello has a list but ServerHello is only the chosen. */
7884
0
    if (isRequest)
7885
0
        i += OPAQUE16_LEN;
7886
7887
    /* Write out all in the list. */
7888
0
    while ((current = list) != NULL) {
7889
0
        list = current->next;
7890
7891
0
        if (!isRequest && current->pubKey == NULL)
7892
0
            continue;
7893
7894
0
        c16toa(current->group, &output[i]);
7895
0
        i += KE_GROUP_LEN;
7896
0
        c16toa((word16)(current->pubKeyLen), &output[i]);
7897
0
        i += OPAQUE16_LEN;
7898
0
        XMEMCPY(&output[i], current->pubKey, current->pubKeyLen);
7899
0
        i += (word16)current->pubKeyLen;
7900
0
    }
7901
    /* Write the length of the list if required. */
7902
0
    if (isRequest)
7903
0
        c16toa(i - OPAQUE16_LEN, output);
7904
7905
0
    return i;
7906
0
}
7907
7908
/* Process the DH key share extension on the client side.
7909
 *
7910
 * ssl            The SSL/TLS object.
7911
 * keyShareEntry  The key share entry object to use to calculate shared secret.
7912
 * returns 0 on success and other values indicate failure.
7913
 */
7914
static int TLSX_KeyShare_ProcessDh(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
7915
0
{
7916
0
    int ret = 0;
7917
0
#if !defined(NO_DH) && (!defined(NO_CERTS) || !defined(NO_PSK))
7918
0
    word32 pSz = 0;
7919
0
    DhKey* dhKey = (DhKey*)keyShareEntry->key;
7920
7921
0
#ifdef HAVE_PUBLIC_FFDHE
7922
0
    const DhParams* params = NULL;
7923
0
    switch (keyShareEntry->group) {
7924
0
    #ifdef HAVE_FFDHE_2048
7925
0
        case WOLFSSL_FFDHE_2048:
7926
0
            params = wc_Dh_ffdhe2048_Get();
7927
0
            break;
7928
0
    #endif
7929
    #ifdef HAVE_FFDHE_3072
7930
        case WOLFSSL_FFDHE_3072:
7931
            params = wc_Dh_ffdhe3072_Get();
7932
            break;
7933
    #endif
7934
    #ifdef HAVE_FFDHE_4096
7935
        case WOLFSSL_FFDHE_4096:
7936
            params = wc_Dh_ffdhe4096_Get();
7937
            break;
7938
    #endif
7939
    #ifdef HAVE_FFDHE_6144
7940
        case WOLFSSL_FFDHE_6144:
7941
            params = wc_Dh_ffdhe6144_Get();
7942
            break;
7943
    #endif
7944
    #ifdef HAVE_FFDHE_8192
7945
        case WOLFSSL_FFDHE_8192:
7946
            params = wc_Dh_ffdhe8192_Get();
7947
            break;
7948
    #endif
7949
0
        default:
7950
0
            break;
7951
0
    }
7952
0
    if (params == NULL) {
7953
0
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
7954
0
        return PEER_KEY_ERROR;
7955
0
    }
7956
0
    pSz = params->p_len;
7957
#else
7958
    ret = wc_DhGetNamedKeyParamSize(keyShareEntry->group, &pSz, NULL, NULL);
7959
    if (ret != 0 || pSz == 0) {
7960
        WOLFSSL_ERROR_VERBOSE(PEER_KEY_ERROR);
7961
        return PEER_KEY_ERROR;
7962
    }
7963
#endif
7964
7965
    /* if DhKey is not setup, do it now */
7966
0
    if (keyShareEntry->key == NULL) {
7967
0
        keyShareEntry->key = (DhKey*)XMALLOC(sizeof(DhKey), ssl->heap,
7968
0
            DYNAMIC_TYPE_DH);
7969
0
        if (keyShareEntry->key == NULL)
7970
0
            return MEMORY_E;
7971
7972
        /* Setup Key */
7973
0
        ret = wc_InitDhKey_ex((DhKey*)keyShareEntry->key, ssl->heap, ssl->devId);
7974
0
        if (ret == 0) {
7975
0
            dhKey = (DhKey*)keyShareEntry->key;
7976
        /* Set key */
7977
0
        #ifdef HAVE_PUBLIC_FFDHE
7978
0
            ret = wc_DhSetKey(dhKey, params->p, params->p_len, params->g,
7979
0
                                                                params->g_len);
7980
        #else
7981
            ret = wc_DhSetNamedKey(dhKey, keyShareEntry->group);
7982
        #endif
7983
0
        }
7984
0
    }
7985
7986
0
    if (ret == 0
7987
    #ifdef WOLFSSL_ASYNC_CRYPT
7988
        && keyShareEntry->lastRet == 0 /* don't enter here if WC_PENDING_E */
7989
    #endif
7990
0
    ) {
7991
    #ifdef WOLFSSL_DEBUG_TLS
7992
        WOLFSSL_MSG("Peer DH Key");
7993
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
7994
    #endif
7995
7996
0
        ssl->options.dhKeySz = (word16)pSz;
7997
7998
        /* Derive secret from private key and peer's public key. */
7999
0
        ret = DhAgree(ssl, dhKey,
8000
0
            (const byte*)keyShareEntry->privKey, keyShareEntry->keyLen, /* our private */
8001
0
            keyShareEntry->ke, keyShareEntry->keLen,                    /* peer's public key */
8002
0
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,    /* secret */
8003
0
            NULL, 0
8004
0
        );
8005
    #ifdef WOLFSSL_ASYNC_CRYPT
8006
        if (ret == WC_PENDING_E) {
8007
            return ret;
8008
        }
8009
    #endif
8010
0
    }
8011
8012
    /* RFC 8446 Section 7.4.1:
8013
     *     ... left-padded with zeros up to the size of the prime. ...
8014
     */
8015
0
    if (ret == 0 && (word32)ssl->options.dhKeySz > ssl->arrays->preMasterSz) {
8016
0
        word32 diff = (word32)ssl->options.dhKeySz - ssl->arrays->preMasterSz;
8017
0
        XMEMMOVE(ssl->arrays->preMasterSecret + diff,
8018
0
                        ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
8019
0
        XMEMSET(ssl->arrays->preMasterSecret, 0, diff);
8020
0
        ssl->arrays->preMasterSz = ssl->options.dhKeySz;
8021
0
    }
8022
8023
    /* done with key share, release resources */
8024
0
    if (dhKey)
8025
0
        wc_FreeDhKey(dhKey);
8026
0
    if (keyShareEntry->key) {
8027
0
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_DH);
8028
0
        keyShareEntry->key = NULL;
8029
0
    }
8030
0
    if (keyShareEntry->privKey != NULL) {
8031
0
        XFREE(keyShareEntry->privKey, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8032
0
        keyShareEntry->privKey = NULL;
8033
0
    }
8034
0
    if (keyShareEntry->pubKey != NULL) {
8035
0
        XFREE(keyShareEntry->pubKey, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8036
0
        keyShareEntry->pubKey = NULL;
8037
0
    }
8038
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8039
0
    keyShareEntry->ke = NULL;
8040
#else
8041
    (void)ssl;
8042
    (void)keyShareEntry;
8043
    ret = PEER_KEY_ERROR;
8044
    WOLFSSL_ERROR_VERBOSE(ret);
8045
#endif
8046
0
    return ret;
8047
0
}
8048
8049
/* Process the X25519 key share extension on the client side.
8050
 *
8051
 * ssl            The SSL/TLS object.
8052
 * keyShareEntry  The key share entry object to use to calculate shared secret.
8053
 * returns 0 on success and other values indicate failure.
8054
 */
8055
static int TLSX_KeyShare_ProcessX25519(WOLFSSL* ssl,
8056
                                       KeyShareEntry* keyShareEntry)
8057
0
{
8058
0
    int ret;
8059
8060
0
#ifdef HAVE_CURVE25519
8061
0
    curve25519_key* key = (curve25519_key*)keyShareEntry->key;
8062
0
    curve25519_key* peerX25519Key;
8063
8064
0
#ifdef HAVE_ECC
8065
0
    if (ssl->peerEccKey != NULL) {
8066
0
        wc_ecc_free(ssl->peerEccKey);
8067
0
        ssl->peerEccKey = NULL;
8068
0
        ssl->peerEccKeyPresent = 0;
8069
0
    }
8070
0
#endif
8071
8072
0
    peerX25519Key = (curve25519_key*)XMALLOC(sizeof(curve25519_key), ssl->heap,
8073
0
                                                             DYNAMIC_TYPE_TLSX);
8074
0
    if (peerX25519Key == NULL) {
8075
0
        WOLFSSL_MSG("PeerEccKey Memory error");
8076
0
        return MEMORY_ERROR;
8077
0
    }
8078
0
    ret = wc_curve25519_init(peerX25519Key);
8079
0
    if (ret != 0) {
8080
0
        XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
8081
0
        return ret;
8082
0
    }
8083
#ifdef WOLFSSL_DEBUG_TLS
8084
    WOLFSSL_MSG("Peer Curve25519 Key");
8085
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
8086
#endif
8087
8088
0
    if (wc_curve25519_check_public(keyShareEntry->ke, keyShareEntry->keLen,
8089
0
                                                  EC25519_LITTLE_ENDIAN) != 0) {
8090
0
        ret = ECC_PEERKEY_ERROR;
8091
0
        WOLFSSL_ERROR_VERBOSE(ret);
8092
0
    }
8093
8094
0
    if (ret == 0) {
8095
0
        if (wc_curve25519_import_public_ex(keyShareEntry->ke,
8096
0
                                            keyShareEntry->keLen, peerX25519Key,
8097
0
                                            EC25519_LITTLE_ENDIAN) != 0) {
8098
0
            ret = ECC_PEERKEY_ERROR;
8099
0
            WOLFSSL_ERROR_VERBOSE(ret);
8100
0
        }
8101
0
    }
8102
8103
0
    if (ret == 0) {
8104
0
        ssl->ecdhCurveOID = ECC_X25519_OID;
8105
8106
0
        ret = wc_curve25519_shared_secret_ex(key, peerX25519Key,
8107
0
                                                   ssl->arrays->preMasterSecret,
8108
0
                                                   &ssl->arrays->preMasterSz,
8109
0
                                                   EC25519_LITTLE_ENDIAN);
8110
0
    }
8111
8112
0
    wc_curve25519_free(peerX25519Key);
8113
0
    XFREE(peerX25519Key, ssl->heap, DYNAMIC_TYPE_TLSX);
8114
0
    wc_curve25519_free((curve25519_key*)keyShareEntry->key);
8115
0
    if (keyShareEntry->key != NULL) {
8116
0
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8117
0
        keyShareEntry->key = NULL;
8118
0
    }
8119
#else
8120
    (void)ssl;
8121
    (void)keyShareEntry;
8122
8123
    ret = PEER_KEY_ERROR;
8124
    WOLFSSL_ERROR_VERBOSE(ret);
8125
#endif /* HAVE_CURVE25519 */
8126
8127
0
    return ret;
8128
0
}
8129
8130
/* Process the X448 key share extension on the client side.
8131
 *
8132
 * ssl            The SSL/TLS object.
8133
 * keyShareEntry  The key share entry object to use to calculate shared secret.
8134
 * returns 0 on success and other values indicate failure.
8135
 */
8136
static int TLSX_KeyShare_ProcessX448(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
8137
0
{
8138
0
    int ret;
8139
8140
0
#ifdef HAVE_CURVE448
8141
0
    curve448_key* key = (curve448_key*)keyShareEntry->key;
8142
0
    curve448_key* peerX448Key;
8143
8144
0
#ifdef HAVE_ECC
8145
0
    if (ssl->peerEccKey != NULL) {
8146
0
        wc_ecc_free(ssl->peerEccKey);
8147
0
        ssl->peerEccKey = NULL;
8148
0
        ssl->peerEccKeyPresent = 0;
8149
0
    }
8150
0
#endif
8151
8152
0
    peerX448Key = (curve448_key*)XMALLOC(sizeof(curve448_key), ssl->heap,
8153
0
                                                             DYNAMIC_TYPE_TLSX);
8154
0
    if (peerX448Key == NULL) {
8155
0
        WOLFSSL_MSG("PeerEccKey Memory error");
8156
0
        return MEMORY_ERROR;
8157
0
    }
8158
0
    ret = wc_curve448_init(peerX448Key);
8159
0
    if (ret != 0) {
8160
0
        XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
8161
0
        return ret;
8162
0
    }
8163
#ifdef WOLFSSL_DEBUG_TLS
8164
    WOLFSSL_MSG("Peer Curve448 Key");
8165
    WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
8166
#endif
8167
8168
0
    if (wc_curve448_check_public(keyShareEntry->ke, keyShareEntry->keLen,
8169
0
                                                    EC448_LITTLE_ENDIAN) != 0) {
8170
0
        ret = ECC_PEERKEY_ERROR;
8171
0
        WOLFSSL_ERROR_VERBOSE(ret);
8172
0
    }
8173
8174
0
    if (ret == 0) {
8175
0
        if (wc_curve448_import_public_ex(keyShareEntry->ke,
8176
0
                                              keyShareEntry->keLen, peerX448Key,
8177
0
                                              EC448_LITTLE_ENDIAN) != 0) {
8178
0
            ret = ECC_PEERKEY_ERROR;
8179
0
            WOLFSSL_ERROR_VERBOSE(ret);
8180
0
        }
8181
0
    }
8182
8183
0
    if (ret == 0) {
8184
0
        ssl->ecdhCurveOID = ECC_X448_OID;
8185
8186
0
        ret = wc_curve448_shared_secret_ex(key, peerX448Key,
8187
0
                                                   ssl->arrays->preMasterSecret,
8188
0
                                                   &ssl->arrays->preMasterSz,
8189
0
                                                   EC448_LITTLE_ENDIAN);
8190
0
    }
8191
8192
0
    wc_curve448_free(peerX448Key);
8193
0
    XFREE(peerX448Key, ssl->heap, DYNAMIC_TYPE_TLSX);
8194
0
    wc_curve448_free((curve448_key*)keyShareEntry->key);
8195
0
    if (keyShareEntry->key != NULL) {
8196
0
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_PRIVATE_KEY);
8197
0
        keyShareEntry->key = NULL;
8198
0
    }
8199
#else
8200
    (void)ssl;
8201
    (void)keyShareEntry;
8202
8203
    ret = PEER_KEY_ERROR;
8204
    WOLFSSL_ERROR_VERBOSE(ret);
8205
#endif /* HAVE_CURVE448 */
8206
8207
0
    return ret;
8208
0
}
8209
8210
/* Process the ECC key share extension on the client side.
8211
 *
8212
 * ssl            The SSL/TLS object.
8213
 * keyShareEntry  The key share entry object to use to calculate shared secret.
8214
 * returns 0 on success and other values indicate failure.
8215
 */
8216
static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
8217
0
{
8218
0
    int ret = 0;
8219
0
#ifdef HAVE_ECC
8220
0
    int curveId = ECC_CURVE_INVALID;
8221
0
    ecc_key* eccKey = (ecc_key*)keyShareEntry->key;
8222
8223
    /* find supported curve */
8224
0
    switch (keyShareEntry->group) {
8225
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
8226
0
        #ifndef NO_ECC_SECP
8227
0
        case WOLFSSL_ECC_SECP256R1:
8228
0
            curveId = ECC_SECP256R1;
8229
0
            break;
8230
0
        #endif /* !NO_ECC_SECP */
8231
0
        #ifdef WOLFSSL_SM2
8232
0
        case WOLFSSL_ECC_SM2P256V1:
8233
0
            curveId = ECC_SM2P256V1;
8234
0
            break;
8235
0
        #endif
8236
0
    #endif
8237
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
8238
0
        #ifndef NO_ECC_SECP
8239
0
        case WOLFSSL_ECC_SECP384R1:
8240
0
            curveId = ECC_SECP384R1;
8241
0
            break;
8242
0
        #endif /* !NO_ECC_SECP */
8243
0
    #endif
8244
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
8245
0
        #ifndef NO_ECC_SECP
8246
0
        case WOLFSSL_ECC_SECP521R1:
8247
0
            curveId = ECC_SECP521R1;
8248
0
            break;
8249
0
        #endif /* !NO_ECC_SECP */
8250
0
    #endif
8251
    #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448
8252
        case WOLFSSL_ECC_X448:
8253
            curveId = ECC_X448;
8254
            break;
8255
    #endif
8256
0
        default:
8257
            /* unsupported curve */
8258
0
            WOLFSSL_ERROR_VERBOSE(ECC_PEERKEY_ERROR);
8259
0
            return ECC_PEERKEY_ERROR;
8260
0
    }
8261
8262
#ifdef WOLFSSL_ASYNC_CRYPT
8263
    if (keyShareEntry->lastRet == 0) /* don't enter here if WC_PENDING_E */
8264
#endif
8265
0
    {
8266
    #ifdef WOLFSSL_DEBUG_TLS
8267
        WOLFSSL_MSG("Peer ECC Key");
8268
        WOLFSSL_BUFFER(keyShareEntry->ke, keyShareEntry->keLen);
8269
    #endif
8270
8271
0
        if (ssl->peerEccKey != NULL) {
8272
0
            wc_ecc_free(ssl->peerEccKey);
8273
0
            XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
8274
0
            ssl->peerEccKeyPresent = 0;
8275
0
        }
8276
#if defined(WOLFSSL_RENESAS_TSIP_TLS)
8277
        ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry);
8278
        if (ret != CRYPTOCB_UNAVAILABLE) {
8279
            return ret;
8280
        }
8281
        ret = 0;
8282
#endif
8283
8284
0
        ssl->peerEccKey = (ecc_key*)XMALLOC(sizeof(ecc_key), ssl->heap,
8285
0
                                            DYNAMIC_TYPE_ECC);
8286
0
        if (ssl->peerEccKey == NULL) {
8287
0
            WOLFSSL_MSG("PeerEccKey Memory error");
8288
0
            ret = MEMORY_ERROR;
8289
0
        }
8290
8291
0
        if (ret == 0) {
8292
0
            ret = wc_ecc_init_ex(ssl->peerEccKey, ssl->heap, ssl->devId);
8293
0
        }
8294
8295
        /* Point is validated by import function. */
8296
0
        if (ret == 0) {
8297
0
            ret = wc_ecc_import_x963_ex(keyShareEntry->ke, keyShareEntry->keLen,
8298
0
                                ssl->peerEccKey, curveId);
8299
0
            if (ret != 0) {
8300
0
                ret = ECC_PEERKEY_ERROR;
8301
0
                WOLFSSL_ERROR_VERBOSE(ret);
8302
0
            }
8303
0
        }
8304
8305
0
        if (ret == 0) {
8306
0
            ssl->ecdhCurveOID = ssl->peerEccKey->dp->oidSum;
8307
0
            ssl->peerEccKeyPresent = 1;
8308
0
        }
8309
0
    }
8310
8311
0
    if (ret == 0 && eccKey == NULL)
8312
0
        ret = BAD_FUNC_ARG;
8313
0
    if (ret == 0) {
8314
0
        ret = EccSharedSecret(ssl, eccKey, ssl->peerEccKey,
8315
0
            keyShareEntry->ke, &keyShareEntry->keLen,
8316
0
            ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz,
8317
0
            ssl->options.side
8318
0
        );
8319
    #ifdef WOLFSSL_ASYNC_CRYPT
8320
        if (ret == WC_PENDING_E)
8321
            return ret;
8322
    #endif
8323
0
    }
8324
8325
    /* done with key share, release resources */
8326
0
    if (ssl->peerEccKey != NULL
8327
    #ifdef HAVE_PK_CALLBACKS
8328
        && ssl->ctx->EccSharedSecretCb == NULL
8329
    #endif
8330
0
    ) {
8331
0
        wc_ecc_free(ssl->peerEccKey);
8332
0
        XFREE(ssl->peerEccKey, ssl->heap, DYNAMIC_TYPE_ECC);
8333
0
        ssl->peerEccKey = NULL;
8334
0
        ssl->peerEccKeyPresent = 0;
8335
0
    }
8336
0
    if (keyShareEntry->key) {
8337
0
        wc_ecc_free((ecc_key*)keyShareEntry->key);
8338
0
        XFREE(keyShareEntry->key, ssl->heap, DYNAMIC_TYPE_ECC);
8339
0
        keyShareEntry->key = NULL;
8340
0
    }
8341
0
    XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8342
0
    keyShareEntry->ke = NULL;
8343
#else
8344
    (void)ssl;
8345
    (void)keyShareEntry;
8346
8347
    ret = PEER_KEY_ERROR;
8348
    WOLFSSL_ERROR_VERBOSE(ret);
8349
#endif /* HAVE_ECC */
8350
8351
0
    return ret;
8352
0
}
8353
8354
#ifdef HAVE_PQC
8355
/* Process the Kyber key share extension on the client side.
8356
 *
8357
 * ssl            The SSL/TLS object.
8358
 * keyShareEntry  The key share entry object to use to calculate shared secret.
8359
 * returns 0 on success and other values indicate failure.
8360
 */
8361
static int TLSX_KeyShare_ProcessPqc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
8362
{
8363
    int      ret = 0;
8364
    int      type;
8365
    KyberKey kem[1];
8366
    byte*    sharedSecret = NULL;
8367
    word32   sharedSecretLen = 0;
8368
    int      oqs_group = 0;
8369
    int      ecc_group = 0;
8370
    ecc_key  eccpubkey;
8371
    word32   outlen = 0;
8372
    word32   privSz = 0;
8373
    word32   ctSz = 0;
8374
    word32   ssSz = 0;
8375
8376
    if (keyShareEntry->ke == NULL) {
8377
        WOLFSSL_MSG("Invalid OQS algorithm specified.");
8378
        return BAD_FUNC_ARG;
8379
    }
8380
8381
    if (ssl->options.side == WOLFSSL_SERVER_END) {
8382
        /* I am the server, the shared secret has already been generated and
8383
         * is in keyShareEntry->ke; copy it to the pre-master secret
8384
         * pre-allocated buffer. */
8385
        if (keyShareEntry->keLen > ENCRYPT_LEN) {
8386
            WOLFSSL_MSG("shared secret is too long.");
8387
            return LENGTH_ERROR;
8388
        }
8389
8390
        XMEMCPY(ssl->arrays->preMasterSecret, keyShareEntry->ke,
8391
                keyShareEntry->keLen);
8392
        ssl->arrays->preMasterSz = keyShareEntry->keLen;
8393
        XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_SECRET)
8394
        keyShareEntry->ke = NULL;
8395
        keyShareEntry->keLen = 0;
8396
        return 0;
8397
    }
8398
8399
    /* I am the client, the ciphertext is in keyShareEntry->ke */
8400
    findEccPqc(&ecc_group, &oqs_group, keyShareEntry->group);
8401
8402
    ret = wc_ecc_init_ex(&eccpubkey, ssl->heap, ssl->devId);
8403
    if (ret != 0) {
8404
        WOLFSSL_MSG("Memory allocation error.");
8405
        return MEMORY_E;
8406
    }
8407
8408
    ret = kyber_id2type(oqs_group, &type);
8409
    if (ret != 0) {
8410
        wc_ecc_free(&eccpubkey);
8411
        WOLFSSL_MSG("Invalid OQS algorithm specified.");
8412
        return BAD_FUNC_ARG;
8413
    }
8414
8415
    ret = wc_KyberKey_Init(type, kem, ssl->heap, INVALID_DEVID);
8416
    if (ret != 0) {
8417
        wc_ecc_free(&eccpubkey);
8418
        WOLFSSL_MSG("Error creating Kyber KEM");
8419
        return MEMORY_E;
8420
    }
8421
8422
    if (ret == 0) {
8423
        ret = wc_KyberKey_SharedSecretSize(kem, &ssSz);
8424
    }
8425
    if (ret == 0) {
8426
        sharedSecretLen = ssSz;
8427
        switch (ecc_group) {
8428
        case WOLFSSL_ECC_SECP256R1:
8429
            sharedSecretLen += 32;
8430
            outlen = 32;
8431
            break;
8432
        case WOLFSSL_ECC_SECP384R1:
8433
            sharedSecretLen += 48;
8434
            outlen = 48;
8435
            break;
8436
        case WOLFSSL_ECC_SECP521R1:
8437
            sharedSecretLen += 66;
8438
            outlen = 66;
8439
            break;
8440
        default:
8441
            break;
8442
        }
8443
    }
8444
    if (ret == 0) {
8445
        sharedSecret = (byte*)XMALLOC(sharedSecretLen, ssl->heap,
8446
                                      DYNAMIC_TYPE_TLSX);
8447
        if (sharedSecret == NULL) {
8448
            WOLFSSL_MSG("Memory allocation error.");
8449
            ret = MEMORY_E;
8450
        }
8451
    }
8452
    if (ret == 0) {
8453
        ret = wc_KyberKey_CipherTextSize(kem, &ctSz);
8454
    }
8455
    if (ret == 0) {
8456
        ret = wc_KyberKey_PrivateKeySize(kem, &privSz);
8457
    }
8458
    if (ret == 0) {
8459
        ret = wc_KyberKey_DecodePrivateKey(kem, keyShareEntry->privKey, privSz);
8460
    }
8461
    if (ret == 0) {
8462
        ret = wc_KyberKey_Decapsulate(kem, sharedSecret + outlen,
8463
            keyShareEntry->ke + keyShareEntry->keLen - ctSz, ctSz);
8464
        if (ret != 0) {
8465
            WOLFSSL_MSG("wc_KyberKey decapsulation failure.");
8466
            ret = BAD_FUNC_ARG;
8467
        }
8468
    }
8469
8470
    if (ecc_group != 0) {
8471
        if (ret == 0) {
8472
            /* Point is validated by import function. */
8473
            ret = wc_ecc_import_x963(keyShareEntry->ke,
8474
                                     keyShareEntry->keLen - ctSz,
8475
                                     &eccpubkey);
8476
            if (ret != 0) {
8477
                WOLFSSL_MSG("ECC Public key import error.");
8478
            }
8479
        }
8480
8481
#if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
8482
    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \
8483
    !defined(HAVE_SELFTEST)
8484
        if (ret == 0) {
8485
            ret = wc_ecc_set_rng(keyShareEntry->key, ssl->rng);
8486
            if (ret != 0) {
8487
                WOLFSSL_MSG("Failure to set the ECC private key RNG.");
8488
            }
8489
        }
8490
#endif
8491
8492
        if (ret == 0) {
8493
            PRIVATE_KEY_UNLOCK();
8494
            ret = wc_ecc_shared_secret(keyShareEntry->key, &eccpubkey,
8495
                sharedSecret, &outlen);
8496
            PRIVATE_KEY_LOCK();
8497
            if (outlen != sharedSecretLen - ssSz) {
8498
                WOLFSSL_MSG("ECC shared secret derivation error.");
8499
                ret = BAD_FUNC_ARG;
8500
            }
8501
        }
8502
    }
8503
    if ((ret == 0) && (sharedSecretLen > ENCRYPT_LEN)) {
8504
        WOLFSSL_MSG("shared secret is too long.");
8505
        ret = LENGTH_ERROR;
8506
    }
8507
8508
    if (ret == 0) {
8509
         /* Copy the shared secret to the  pre-master secret pre-allocated
8510
          * buffer. */
8511
        XMEMCPY(ssl->arrays->preMasterSecret, sharedSecret, sharedSecretLen);
8512
        ssl->arrays->preMasterSz = (word32) sharedSecretLen;
8513
    }
8514
8515
    if (sharedSecret != NULL) {
8516
        XFREE(sharedSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
8517
    }
8518
8519
    wc_ecc_free(&eccpubkey);
8520
    wc_KyberKey_Free(kem);
8521
    return ret;
8522
}
8523
#endif /* HAVE_PQC */
8524
8525
/* Process the key share extension on the client side.
8526
 *
8527
 * ssl            The SSL/TLS object.
8528
 * keyShareEntry  The key share entry object to use to calculate shared secret.
8529
 * returns 0 on success and other values indicate failure.
8530
 */
8531
static int TLSX_KeyShare_Process(WOLFSSL* ssl, KeyShareEntry* keyShareEntry)
8532
0
{
8533
0
    int ret;
8534
8535
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
8536
    ssl->session->namedGroup = keyShareEntry->group;
8537
#endif
8538
    /* reset the pre master secret size */
8539
0
    if (ssl->arrays->preMasterSz == 0)
8540
0
        ssl->arrays->preMasterSz = ENCRYPT_LEN;
8541
8542
    /* Use Key Share Data from server. */
8543
0
    if (WOLFSSL_NAMED_GROUP_IS_FFHDE(keyShareEntry->group))
8544
0
        ret = TLSX_KeyShare_ProcessDh(ssl, keyShareEntry);
8545
0
    else if (keyShareEntry->group == WOLFSSL_ECC_X25519)
8546
0
        ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry);
8547
0
    else if (keyShareEntry->group == WOLFSSL_ECC_X448)
8548
0
        ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry);
8549
#ifdef HAVE_PQC
8550
    else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group))
8551
        ret = TLSX_KeyShare_ProcessPqc(ssl, keyShareEntry);
8552
#endif
8553
0
    else
8554
0
        ret = TLSX_KeyShare_ProcessEcc(ssl, keyShareEntry);
8555
8556
#ifdef WOLFSSL_DEBUG_TLS
8557
    if (ret == 0) {
8558
        WOLFSSL_MSG("KE Secret");
8559
        WOLFSSL_BUFFER(ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz);
8560
    }
8561
#endif
8562
#ifdef WOLFSSL_ASYNC_CRYPT
8563
    keyShareEntry->lastRet = ret;
8564
#endif
8565
8566
0
    return ret;
8567
0
}
8568
8569
/* Parse an entry of the KeyShare extension.
8570
 *
8571
 * ssl     The SSL/TLS object.
8572
 * input   The extension data.
8573
 * length  The length of the extension data.
8574
 * kse     The new key share entry object.
8575
 * returns a positive number to indicate amount of data parsed and a negative
8576
 * number on error.
8577
 */
8578
static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
8579
            word16 length, KeyShareEntry **kse, TLSX** extensions)
8580
0
{
8581
0
    int    ret;
8582
0
    word16 group;
8583
0
    word16 keLen;
8584
0
    int    offset = 0;
8585
0
    byte*  ke;
8586
8587
0
    if (length < OPAQUE16_LEN + OPAQUE16_LEN)
8588
0
        return BUFFER_ERROR;
8589
    /* Named group */
8590
0
    ato16(&input[offset], &group);
8591
0
    offset += OPAQUE16_LEN;
8592
    /* Key exchange data - public key. */
8593
0
    ato16(&input[offset], &keLen);
8594
0
    offset += OPAQUE16_LEN;
8595
0
    if (keLen == 0)
8596
0
        return INVALID_PARAMETER;
8597
0
    if (keLen > length - offset)
8598
0
        return BUFFER_ERROR;
8599
8600
#ifdef HAVE_PQC
8601
    if (WOLFSSL_NAMED_GROUP_IS_PQC(group) &&
8602
        ssl->options.side == WOLFSSL_SERVER_END) {
8603
        /* For KEMs, the public key is not stored. Casting away const because
8604
         * we know for KEMs, it will be read-only.*/
8605
        ke = (byte *)&input[offset];
8606
    } else
8607
#endif
8608
0
    {
8609
        /* Store a copy in the key share object. */
8610
0
        ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8611
0
        if (ke == NULL)
8612
0
            return MEMORY_E;
8613
0
        XMEMCPY(ke, &input[offset], keLen);
8614
0
    }
8615
8616
    /* Populate a key share object in the extension. */
8617
0
    ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
8618
0
    if (ret != 0) {
8619
0
        if (ke != &input[offset]) {
8620
0
            XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
8621
0
        }
8622
0
        return ret;
8623
0
    }
8624
8625
    /* Total length of the parsed data. */
8626
0
    return offset + keLen;
8627
0
}
8628
8629
/* Searches the groups sent for the specified named group.
8630
 *
8631
 * ssl    SSL/TLS object.
8632
 * name   Group name to match.
8633
 * returns 1 when the extension has the group name and 0 otherwise.
8634
 */
8635
static int TLSX_KeyShare_Find(WOLFSSL* ssl, word16 group)
8636
0
{
8637
0
    TLSX*          extension;
8638
0
    KeyShareEntry* list;
8639
8640
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
8641
0
    if (extension == NULL) {
8642
0
        extension = TLSX_Find(ssl->ctx->extensions, TLSX_KEY_SHARE);
8643
0
        if (extension == NULL)
8644
0
            return 0;
8645
0
    }
8646
8647
0
    list = (KeyShareEntry*)extension->data;
8648
0
    while (list != NULL) {
8649
0
        if (list->group == group)
8650
0
            return 1;
8651
0
        list = list->next;
8652
0
    }
8653
8654
0
    return 0;
8655
0
}
8656
8657
8658
/* Searches the supported groups extension for the specified named group.
8659
 *
8660
 * ssl   The SSL/TLS object.
8661
 * name  The group name to match.
8662
 * returns 1 when the extension has the group name and 0 otherwise.
8663
 */
8664
static int TLSX_SupportedGroups_Find(const WOLFSSL* ssl, word16 name,
8665
                                     TLSX* extensions)
8666
0
{
8667
0
#ifdef HAVE_SUPPORTED_CURVES
8668
0
    TLSX*          extension;
8669
0
    SupportedCurve* curve = NULL;
8670
8671
0
    if ((extension = TLSX_Find(extensions, TLSX_SUPPORTED_GROUPS)) == NULL) {
8672
0
        if ((extension = TLSX_Find(ssl->ctx->extensions,
8673
0
                                              TLSX_SUPPORTED_GROUPS)) == NULL) {
8674
0
            return 0;
8675
0
        }
8676
0
    }
8677
8678
0
    for (curve = (SupportedCurve*)extension->data; curve; curve = curve->next) {
8679
0
        if (curve->name == name)
8680
0
            return 1;
8681
0
    }
8682
0
#endif
8683
8684
0
    (void)ssl;
8685
0
    (void)name;
8686
8687
0
    return 0;
8688
0
}
8689
8690
int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl,
8691
        const byte* input, word16 length, TLSX** extensions)
8692
0
{
8693
0
    int ret;
8694
0
    int    offset = 0;
8695
0
    word16 len;
8696
0
    TLSX*  extension;
8697
8698
    /* Add a KeyShare extension if it doesn't exist even if peer sent no
8699
     * entries. The presence of this extension signals that the peer can be
8700
     * negotiated with. */
8701
0
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
8702
0
    if (extension == NULL) {
8703
        /* Push new KeyShare extension. */
8704
0
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
8705
0
        if (ret != 0)
8706
0
            return ret;
8707
0
    }
8708
8709
0
    if (length < OPAQUE16_LEN)
8710
0
        return BUFFER_ERROR;
8711
8712
    /* ClientHello contains zero or more key share entries. */
8713
0
    ato16(input, &len);
8714
0
    if (len != length - OPAQUE16_LEN)
8715
0
        return BUFFER_ERROR;
8716
0
    offset += OPAQUE16_LEN;
8717
8718
0
    while (offset < (int)length) {
8719
0
        ret = TLSX_KeyShareEntry_Parse(ssl, &input[offset],
8720
0
                length - (word16)offset, NULL, extensions);
8721
0
        if (ret < 0)
8722
0
            return ret;
8723
8724
0
        offset += ret;
8725
0
    }
8726
8727
0
    return 0;
8728
0
}
8729
8730
/* Parse the KeyShare extension.
8731
 * Different formats in different messages.
8732
 *
8733
 * ssl      The SSL/TLS object.
8734
 * input    The extension data.
8735
 * length   The length of the extension data.
8736
 * msgType  The type of the message this extension is being parsed from.
8737
 * returns 0 on success and other values indicate failure.
8738
 */
8739
int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length,
8740
                               byte msgType)
8741
0
{
8742
0
    int ret = 0;
8743
0
    KeyShareEntry *keyShareEntry = NULL;
8744
0
    word16 group;
8745
8746
0
    if (msgType == client_hello) {
8747
0
        ret = TLSX_KeyShare_Parse_ClientHello(ssl, input, length,
8748
0
                                              &ssl->extensions);
8749
0
    }
8750
0
    else if (msgType == server_hello) {
8751
0
        int len;
8752
8753
0
        if (length < OPAQUE16_LEN)
8754
0
            return BUFFER_ERROR;
8755
8756
        /* The data is the named group the server wants to use. */
8757
0
        ato16(input, &group);
8758
8759
        /* Check the selected group was supported by ClientHello extensions. */
8760
0
        if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
8761
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
8762
0
            return BAD_KEY_SHARE_DATA;
8763
0
        }
8764
8765
        /* Check if the group was sent. */
8766
0
        if (!TLSX_KeyShare_Find(ssl, group)) {
8767
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
8768
0
            return BAD_KEY_SHARE_DATA;
8769
0
        }
8770
8771
        /* ServerHello contains one key share entry. */
8772
0
        len = TLSX_KeyShareEntry_Parse(ssl, input, length, &keyShareEntry,
8773
0
                &ssl->extensions);
8774
0
        if (len != (int)length)
8775
0
            return BUFFER_ERROR;
8776
8777
        /* Not in list sent if there isn't a private key. */
8778
0
        if (keyShareEntry == NULL || (keyShareEntry->key == NULL
8779
0
        #if !defined(NO_DH) || defined(HAVE_PQC)
8780
0
            && keyShareEntry->privKey == NULL
8781
0
        #endif
8782
0
        )) {
8783
0
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
8784
0
            return BAD_KEY_SHARE_DATA;
8785
0
        }
8786
8787
        /* Process the entry to calculate the secret. */
8788
0
        ret = TLSX_KeyShare_Process(ssl, keyShareEntry);
8789
0
        if (ret == 0)
8790
0
            ssl->session->namedGroup = ssl->namedGroup = group;
8791
0
    }
8792
0
    else if (msgType == hello_retry_request) {
8793
0
        if (length != OPAQUE16_LEN)
8794
0
            return BUFFER_ERROR;
8795
8796
        /* The data is the named group the server wants to use. */
8797
0
        ato16(input, &group);
8798
8799
    #ifdef WOLFSSL_ASYNC_CRYPT
8800
        /* only perform find and clear TLSX if not returning from async */
8801
        if (ssl->error != WC_PENDING_E)
8802
    #endif
8803
0
        {
8804
            /* Check the selected group was supported by ClientHello extensions. */
8805
0
            if (!TLSX_SupportedGroups_Find(ssl, group, ssl->extensions)) {
8806
0
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
8807
0
                return BAD_KEY_SHARE_DATA;
8808
0
            }
8809
8810
            /* Check if the group was sent. */
8811
0
            if (TLSX_KeyShare_Find(ssl, group)) {
8812
0
                WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
8813
0
                return BAD_KEY_SHARE_DATA;
8814
0
            }
8815
8816
            /* Clear out unusable key shares. */
8817
0
            ret = TLSX_KeyShare_Empty(ssl);
8818
0
            if (ret != 0)
8819
0
                return ret;
8820
0
        }
8821
8822
0
        ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions);
8823
0
        if (ret == 0)
8824
0
            ssl->session->namedGroup = ssl->namedGroup = group;
8825
0
    }
8826
0
    else {
8827
        /* Not a message type that is allowed to have this extension. */
8828
0
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
8829
0
        return SANITY_MSG_E;
8830
0
    }
8831
8832
0
    return ret;
8833
0
}
8834
8835
/* Create a new key share entry and put it into the list.
8836
 *
8837
 * list           The linked list of key share entries.
8838
 * group          The named group.
8839
 * heap           The memory to allocate with.
8840
 * keyShareEntry  The new key share entry object.
8841
 * returns 0 on success and other values indicate failure.
8842
 */
8843
static int TLSX_KeyShare_New(KeyShareEntry** list, int group, void *heap,
8844
                             KeyShareEntry** keyShareEntry)
8845
0
{
8846
0
    KeyShareEntry* kse;
8847
0
    KeyShareEntry** next;
8848
8849
0
    kse = (KeyShareEntry*)XMALLOC(sizeof(KeyShareEntry), heap,
8850
0
                                  DYNAMIC_TYPE_TLSX);
8851
0
    if (kse == NULL)
8852
0
        return MEMORY_E;
8853
8854
0
    XMEMSET(kse, 0, sizeof(*kse));
8855
0
    kse->group = (word16)group;
8856
8857
    /* Add it to the back and maintain the links. */
8858
0
    while (*list != NULL) {
8859
        /* Assign to temporary to work around compiler bug found by customer. */
8860
0
        next = &((*list)->next);
8861
0
        list = next;
8862
0
    }
8863
0
    *list = kse;
8864
0
    *keyShareEntry = kse;
8865
8866
0
    (void)heap;
8867
8868
0
    return 0;
8869
0
}
8870
8871
#ifdef HAVE_PQC
8872
static int server_generate_pqc_ciphertext(WOLFSSL* ssl,
8873
    KeyShareEntry* keyShareEntry, byte* data, word16 len)
8874
{
8875
    /* I am the server. The data parameter is the client's public key. I need
8876
     * to generate the public information (AKA ciphertext) and shared secret
8877
     * here. Note the "public information" is equivalent to a the public key in
8878
     * key exchange parlance. That's why it is being assigned to pubKey.
8879
     */
8880
    int type;
8881
    KyberKey kem[1];
8882
    byte* sharedSecret = NULL;
8883
    byte* ciphertext = NULL;
8884
    int ret = 0;
8885
    int oqs_group = 0;
8886
    int ecc_group = 0;
8887
    KeyShareEntry *ecc_kse = NULL;
8888
    ecc_key eccpubkey;
8889
    word32 outlen = 0;
8890
    word32 pubSz = 0;
8891
    word32 ctSz = 0;
8892
    word32 ssSz = 0;
8893
8894
    findEccPqc(&ecc_group, &oqs_group, keyShareEntry->group);
8895
    ret = kyber_id2type(oqs_group, &type);
8896
    if (ret != 0) {
8897
        WOLFSSL_MSG("Invalid Kyber algorithm specified.");
8898
        return BAD_FUNC_ARG;
8899
    }
8900
8901
    ret = wc_ecc_init_ex(&eccpubkey, ssl->heap, ssl->devId);
8902
    if (ret != 0) {
8903
        WOLFSSL_MSG("Could not do ECC public key initialization.");
8904
        return MEMORY_E;
8905
    }
8906
8907
    ret = wc_KyberKey_Init(type, kem, ssl->heap, INVALID_DEVID);
8908
    if (ret != 0) {
8909
        wc_ecc_free(&eccpubkey);
8910
        WOLFSSL_MSG("Error creating Kyber KEM");
8911
        return MEMORY_E;
8912
    }
8913
8914
    if (ret == 0) {
8915
        ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap,
8916
            DYNAMIC_TYPE_TLSX);
8917
        if (ecc_kse == NULL) {
8918
            WOLFSSL_MSG("ecc_kse memory allocation failure");
8919
            ret = MEMORY_ERROR;
8920
        }
8921
    }
8922
8923
    if (ret == 0) {
8924
        XMEMSET(ecc_kse, 0, sizeof(*ecc_kse));
8925
    }
8926
8927
    if (ret == 0 && ecc_group != 0) {
8928
        ecc_kse->group = ecc_group;
8929
        ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse);
8930
        /* No message, TLSX_KeyShare_GenEccKey() will do it. */
8931
    }
8932
8933
    if (ret == 0) {
8934
        ret = wc_KyberKey_PublicKeySize(kem, &pubSz);
8935
    }
8936
    if (ret == 0) {
8937
        ret = wc_KyberKey_CipherTextSize(kem, &ctSz);
8938
    }
8939
    if (ret == 0) {
8940
        ret = wc_KyberKey_SharedSecretSize(kem, &ssSz);
8941
    }
8942
8943
    if (ret == 0 && len != pubSz + ecc_kse->pubKeyLen) {
8944
        WOLFSSL_MSG("Invalid public key.");
8945
        ret = BAD_FUNC_ARG;
8946
    }
8947
8948
    if (ret == 0) {
8949
        sharedSecret = (byte*)XMALLOC(ecc_kse->keyLen + ssSz, ssl->heap,
8950
            DYNAMIC_TYPE_SECRET);
8951
        ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap,
8952
            DYNAMIC_TYPE_TLSX);
8953
8954
        if (sharedSecret == NULL || ciphertext == NULL) {
8955
            WOLFSSL_MSG("Ciphertext/shared secret memory allocation failure.");
8956
            ret = MEMORY_E;
8957
        }
8958
    }
8959
8960
    if (ecc_group != 0) {
8961
        if (ret == 0) {
8962
            /* Point is validated by import function. */
8963
            ret = wc_ecc_import_x963(data, len - pubSz, &eccpubkey);
8964
            if (ret != 0) {
8965
                WOLFSSL_MSG("Bad ECC public key.");
8966
            }
8967
        }
8968
8969
#if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \
8970
    (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \
8971
    !defined(HAVE_SELFTEST)
8972
        if (ret == 0) {
8973
            ret = wc_ecc_set_rng(ecc_kse->key, ssl->rng);
8974
        }
8975
#endif
8976
8977
        if (ret == 0) {
8978
            outlen = ecc_kse->keyLen;
8979
            PRIVATE_KEY_UNLOCK();
8980
            ret = wc_ecc_shared_secret(ecc_kse->key, &eccpubkey,
8981
                                       sharedSecret,
8982
                                       &outlen);
8983
            PRIVATE_KEY_LOCK();
8984
            if (outlen != ecc_kse->keyLen) {
8985
                WOLFSSL_MSG("Data length mismatch.");
8986
                ret = BAD_FUNC_ARG;
8987
            }
8988
        }
8989
    }
8990
8991
    if (ret == 0) {
8992
        ret = wc_KyberKey_DecodePublicKey(kem, data + ecc_kse->pubKeyLen,
8993
            pubSz);
8994
    }
8995
    if (ret == 0) {
8996
        ret = wc_KyberKey_Encapsulate(kem, ciphertext + ecc_kse->pubKeyLen,
8997
            sharedSecret + outlen, ssl->rng);
8998
        if (ret != 0) {
8999
            WOLFSSL_MSG("wc_KyberKey encapsulation failure.");
9000
        }
9001
    }
9002
9003
    if (ret == 0) {
9004
        if (keyShareEntry->ke != NULL) {
9005
            XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9006
        }
9007
9008
        keyShareEntry->ke = sharedSecret;
9009
        keyShareEntry->keLen = outlen + ssSz;
9010
        sharedSecret = NULL;
9011
9012
        XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen);
9013
        keyShareEntry->pubKey = ciphertext;
9014
        keyShareEntry->pubKeyLen = (word32)(ecc_kse->pubKeyLen + ctSz);
9015
        ciphertext = NULL;
9016
9017
        /* Set namedGroup so wolfSSL_get_curve_name() can function properly on
9018
         * the server side. */
9019
        ssl->namedGroup = keyShareEntry->group;
9020
    }
9021
9022
    TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap);
9023
    if (sharedSecret != NULL)
9024
        XFREE(sharedSecret, ssl->heap, DYNAMIC_TYPE_SECRET);
9025
    if (ciphertext != NULL)
9026
        XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX);
9027
    wc_ecc_free(&eccpubkey);
9028
    wc_KyberKey_Free(kem);
9029
    return ret;
9030
}
9031
#endif /* HAVE_PQC */
9032
9033
/* Use the data to create a new key share object in the extensions.
9034
 *
9035
 * ssl    The SSL/TLS object.
9036
 * group  The named group.
9037
 * len    The length of the public key data.
9038
 * data   The public key data.
9039
 * kse    The new key share entry object.
9040
 * returns 0 on success and other values indicate failure.
9041
 */
9042
int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
9043
                      KeyShareEntry **kse, TLSX** extensions)
9044
0
{
9045
0
    int            ret = 0;
9046
0
    TLSX*          extension;
9047
0
    KeyShareEntry* keyShareEntry = NULL;
9048
9049
    /* Find the KeyShare extension if it exists. */
9050
0
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
9051
0
    if (extension == NULL) {
9052
        /* Push new KeyShare extension. */
9053
0
        ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
9054
0
        if (ret != 0)
9055
0
            return ret;
9056
9057
0
        extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
9058
0
        if (extension == NULL)
9059
0
            return MEMORY_E;
9060
0
    }
9061
0
    extension->resp = 0;
9062
9063
    /* Try to find the key share entry with this group. */
9064
0
    keyShareEntry = (KeyShareEntry*)extension->data;
9065
0
    while (keyShareEntry != NULL) {
9066
0
        if (keyShareEntry->group == group)
9067
0
            break;
9068
0
        keyShareEntry = keyShareEntry->next;
9069
0
    }
9070
9071
    /* Create a new key share entry if not found. */
9072
0
    if (keyShareEntry == NULL) {
9073
0
        ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, group,
9074
0
                                ssl->heap, &keyShareEntry);
9075
0
        if (ret != 0)
9076
0
            return ret;
9077
0
    }
9078
9079
9080
#ifdef HAVE_PQC
9081
    if (WOLFSSL_NAMED_GROUP_IS_PQC(group) &&
9082
        ssl->options.side == WOLFSSL_SERVER_END) {
9083
        ret = server_generate_pqc_ciphertext((WOLFSSL*)ssl, keyShareEntry, data,
9084
                                             len);
9085
        if (ret != 0)
9086
            return ret;
9087
    }
9088
    else
9089
#endif
9090
0
    if (data != NULL) {
9091
0
        if (keyShareEntry->ke != NULL) {
9092
0
            XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
9093
0
        }
9094
0
        keyShareEntry->ke = data;
9095
0
        keyShareEntry->keLen = len;
9096
0
    }
9097
0
    else {
9098
        /* Generate a key pair. Casting to non-const since changes inside are
9099
         * minimal but would require an extensive redesign to refactor. Also
9100
         * this path shouldn't be taken when parsing a ClientHello in stateless
9101
         * mode. */
9102
0
        ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, keyShareEntry);
9103
0
        if (ret != 0)
9104
0
            return ret;
9105
0
    }
9106
9107
0
    if (kse != NULL)
9108
0
        *kse = keyShareEntry;
9109
9110
0
    return 0;
9111
0
}
9112
9113
/* Set an empty Key Share extension.
9114
 *
9115
 * ssl  The SSL/TLS object.
9116
 * returns 0 on success and other values indicate failure.
9117
 */
9118
int TLSX_KeyShare_Empty(WOLFSSL* ssl)
9119
0
{
9120
0
    int   ret = 0;
9121
0
    TLSX* extension;
9122
9123
    /* Find the KeyShare extension if it exists. */
9124
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
9125
0
    if (extension == NULL) {
9126
        /* Push new KeyShare extension. */
9127
0
        ret = TLSX_Push(&ssl->extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
9128
0
    }
9129
0
    else if (extension->data != NULL) {
9130
0
        TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
9131
0
        extension->data = NULL;
9132
0
    }
9133
9134
0
    return ret;
9135
0
}
9136
9137
/* Returns whether this group is supported.
9138
 *
9139
 * namedGroup  The named group to check.
9140
 * returns 1 when supported or 0 otherwise.
9141
 */
9142
static int TLSX_KeyShare_IsSupported(int namedGroup)
9143
0
{
9144
0
    switch (namedGroup) {
9145
0
    #ifdef HAVE_FFDHE_2048
9146
0
        case WOLFSSL_FFDHE_2048:
9147
0
            break;
9148
0
    #endif
9149
    #ifdef HAVE_FFDHE_3072
9150
        case WOLFSSL_FFDHE_3072:
9151
            break;
9152
    #endif
9153
    #ifdef HAVE_FFDHE_4096
9154
        case WOLFSSL_FFDHE_4096:
9155
            break;
9156
    #endif
9157
    #ifdef HAVE_FFDHE_6144
9158
        case WOLFSSL_FFDHE_6144:
9159
            break;
9160
    #endif
9161
    #ifdef HAVE_FFDHE_8192
9162
        case WOLFSSL_FFDHE_8192:
9163
            break;
9164
    #endif
9165
0
    #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
9166
0
        #ifdef HAVE_ECC_KOBLITZ
9167
0
        case WOLFSSL_ECC_SECP256K1:
9168
0
            break;
9169
0
        #endif
9170
0
        #ifndef NO_ECC_SECP
9171
0
        case WOLFSSL_ECC_SECP256R1:
9172
0
            break;
9173
0
        #endif /* !NO_ECC_SECP */
9174
0
        #ifdef HAVE_ECC_BRAINPOOL
9175
0
        case WOLFSSL_ECC_BRAINPOOLP256R1:
9176
0
            break;
9177
0
        #endif
9178
0
        #ifdef WOLFSSL_SM2
9179
0
        case WOLFSSL_ECC_SM2P256V1:
9180
0
            break;
9181
0
        #endif /* WOLFSSL_SM2 */
9182
0
    #endif
9183
0
    #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
9184
0
        case WOLFSSL_ECC_X25519:
9185
0
            break;
9186
0
    #endif
9187
0
    #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
9188
0
        case WOLFSSL_ECC_X448:
9189
0
            break;
9190
0
    #endif
9191
0
    #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
9192
0
        #ifndef NO_ECC_SECP
9193
0
        case WOLFSSL_ECC_SECP384R1:
9194
0
            break;
9195
0
        #endif /* !NO_ECC_SECP */
9196
0
        #ifdef HAVE_ECC_BRAINPOOL
9197
0
        case WOLFSSL_ECC_BRAINPOOLP384R1:
9198
0
            break;
9199
0
        #endif
9200
0
    #endif
9201
0
    #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
9202
0
        #ifndef NO_ECC_SECP
9203
0
        case WOLFSSL_ECC_SECP521R1:
9204
0
            break;
9205
0
        #endif /* !NO_ECC_SECP */
9206
0
    #endif
9207
    #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
9208
        #ifdef HAVE_ECC_KOBLITZ
9209
        case WOLFSSL_ECC_SECP160K1:
9210
            break;
9211
        #endif
9212
        #ifndef NO_ECC_SECP
9213
        case WOLFSSL_ECC_SECP160R1:
9214
            break;
9215
        #endif
9216
        #ifdef HAVE_ECC_SECPR2
9217
        case WOLFSSL_ECC_SECP160R2:
9218
            break;
9219
        #endif
9220
    #endif
9221
    #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
9222
        #ifdef HAVE_ECC_KOBLITZ
9223
        case WOLFSSL_ECC_SECP192K1:
9224
            break;
9225
        #endif
9226
        #ifndef NO_ECC_SECP
9227
        case WOLFSSL_ECC_SECP192R1:
9228
            break;
9229
        #endif
9230
    #endif
9231
0
    #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
9232
0
        #ifdef HAVE_ECC_KOBLITZ
9233
0
        case WOLFSSL_ECC_SECP224K1:
9234
0
            break;
9235
0
        #endif
9236
0
        #ifndef NO_ECC_SECP
9237
0
        case WOLFSSL_ECC_SECP224R1:
9238
0
            break;
9239
0
        #endif
9240
0
    #endif
9241
0
    #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
9242
0
        #ifdef HAVE_ECC_BRAINPOOL
9243
0
        case WOLFSSL_ECC_BRAINPOOLP512R1:
9244
0
            break;
9245
0
        #endif
9246
0
    #endif
9247
    #ifdef HAVE_PQC
9248
    #ifdef WOLFSSL_WC_KYBER
9249
        #ifdef WOLFSSL_KYBER512
9250
            case WOLFSSL_KYBER_LEVEL1:
9251
        #endif
9252
        #ifdef WOLFSSL_KYBER768
9253
            case WOLFSSL_KYBER_LEVEL3:
9254
        #endif
9255
        #ifdef WOLFSSL_KYBER1024
9256
            case WOLFSSL_KYBER_LEVEL5:
9257
        #endif
9258
                break;
9259
    #elif defined(HAVE_LIBOQS)
9260
        case WOLFSSL_KYBER_LEVEL1:
9261
        case WOLFSSL_KYBER_LEVEL3:
9262
        case WOLFSSL_KYBER_LEVEL5:
9263
        case WOLFSSL_P256_KYBER_LEVEL1:
9264
        case WOLFSSL_P384_KYBER_LEVEL3:
9265
        case WOLFSSL_P521_KYBER_LEVEL5:
9266
        {
9267
            int ret;
9268
            int id;
9269
            findEccPqc(NULL, &namedGroup, namedGroup);
9270
            ret = kyber_id2type(namedGroup, &id);
9271
            if (ret == NOT_COMPILED_IN) {
9272
                return 0;
9273
            }
9274
9275
            if (! ext_kyber_enabled(id)) {
9276
                return 0;
9277
            }
9278
            break;
9279
        }
9280
    #elif defined(HAVE_PQM4)
9281
        case WOLFSSL_KYBER_LEVEL1:
9282
            break;
9283
    #endif
9284
    #endif /* HAVE_PQC */
9285
0
        default:
9286
0
            return 0;
9287
0
    }
9288
9289
0
    return 1;
9290
0
}
9291
9292
9293
static const word16 preferredGroup[] = {
9294
#if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
9295
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256
9296
    WOLFSSL_ECC_SECP256R1,
9297
#if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
9298
    WOLFSSL_ECC_SM2P256V1,
9299
#endif
9300
#endif
9301
#if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
9302
    WOLFSSL_ECC_X25519,
9303
#endif
9304
#if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
9305
    WOLFSSL_ECC_X448,
9306
#endif
9307
#if defined(HAVE_ECC) && (!defined(NO_ECC384) || \
9308
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384
9309
    WOLFSSL_ECC_SECP384R1,
9310
#endif
9311
#if defined(HAVE_ECC) && (!defined(NO_ECC521) || \
9312
    defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
9313
    WOLFSSL_ECC_SECP521R1,
9314
#endif
9315
#if defined(HAVE_FFDHE_2048)
9316
    WOLFSSL_FFDHE_2048,
9317
#endif
9318
#if defined(HAVE_FFDHE_3072)
9319
    WOLFSSL_FFDHE_3072,
9320
#endif
9321
#if defined(HAVE_FFDHE_4096)
9322
    WOLFSSL_FFDHE_4096,
9323
#endif
9324
#if defined(HAVE_FFDHE_6144)
9325
    WOLFSSL_FFDHE_6144,
9326
#endif
9327
#if defined(HAVE_FFDHE_8192)
9328
    WOLFSSL_FFDHE_8192,
9329
#endif
9330
#ifdef WOLFSSL_WC_KYBER
9331
    #ifdef WOLFSSL_KYBER512
9332
    WOLFSSL_KYBER_LEVEL1,
9333
    #endif
9334
    #ifdef WOLFSSL_KYBER768
9335
    WOLFSSL_KYBER_LEVEL3,
9336
    #endif
9337
    #ifdef WOLFSSL_KYBER1024
9338
    WOLFSSL_KYBER_LEVEL5,
9339
    #endif
9340
#elif defined(HAVE_LIBOQS)
9341
    /* These require a runtime call to TLSX_KeyShare_IsSupported to use */
9342
    WOLFSSL_KYBER_LEVEL1,
9343
    WOLFSSL_KYBER_LEVEL3,
9344
    WOLFSSL_KYBER_LEVEL5,
9345
    WOLFSSL_P256_KYBER_LEVEL1,
9346
    WOLFSSL_P384_KYBER_LEVEL3,
9347
    WOLFSSL_P521_KYBER_LEVEL5,
9348
#elif defined(HAVE_PQM4)
9349
    WOLFSSL_KYBER_LEVEL1,
9350
#endif
9351
    WOLFSSL_NAMED_GROUP_INVALID
9352
};
9353
9354
#define PREFERRED_GROUP_SZ \
9355
0
    ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
9356
                                            /* -1 for the invalid group */
9357
9358
/* Examines the application specified group ranking and returns the rank of the
9359
 * group.
9360
 * If no group ranking set then all groups are rank 0 (highest).
9361
 *
9362
 * ssl    The SSL/TLS object.
9363
 * group  The group to check ranking for.
9364
 * returns ranking from 0 to MAX_GROUP_COUNT-1 or -1 when group not in list.
9365
 */
9366
static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
9367
0
{
9368
0
    byte i;
9369
0
    const word16* groups;
9370
0
    byte numGroups;
9371
9372
0
    if (ssl->numGroups == 0) {
9373
0
        groups = preferredGroup;
9374
0
        numGroups = PREFERRED_GROUP_SZ;
9375
0
    }
9376
0
    else {
9377
0
        groups = ssl->group;
9378
0
        numGroups = ssl->numGroups;
9379
0
    }
9380
9381
#ifdef HAVE_LIBOQS
9382
      if (!TLSX_KeyShare_IsSupported(group))
9383
          return -1;
9384
#endif
9385
9386
0
    for (i = 0; i < numGroups; i++)
9387
0
        if (groups[i] == (word16)group)
9388
0
            return i;
9389
9390
0
    return -1;
9391
0
}
9392
9393
/* Set a key share that is supported by the client into extensions.
9394
 *
9395
 * ssl  The SSL/TLS object.
9396
 * returns BAD_KEY_SHARE_DATA if no supported group has a key share,
9397
 * 0 if a supported group has a key share and other values indicate an error.
9398
 */
9399
int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, TLSX** extensions)
9400
0
{
9401
0
    int             ret;
9402
0
#ifdef HAVE_SUPPORTED_CURVES
9403
0
    TLSX*           extension;
9404
0
    SupportedCurve* curve = NULL;
9405
0
    SupportedCurve* preferredCurve = NULL;
9406
0
    KeyShareEntry*  kse = NULL;
9407
0
    int             preferredRank = WOLFSSL_MAX_GROUP_COUNT;
9408
0
    int             rank;
9409
9410
0
    extension = TLSX_Find(*extensions, TLSX_SUPPORTED_GROUPS);
9411
0
    if (extension != NULL)
9412
0
        curve = (SupportedCurve*)extension->data;
9413
    /* Use server's preference order. */
9414
0
    for (; curve != NULL; curve = curve->next) {
9415
0
        if (!TLSX_KeyShare_IsSupported(curve->name))
9416
0
            continue;
9417
0
        if (wolfSSL_curve_is_disabled(ssl, curve->name))
9418
0
            continue;
9419
9420
0
        rank = TLSX_KeyShare_GroupRank(ssl, curve->name);
9421
0
        if (rank == -1)
9422
0
            continue;
9423
0
        if (rank < preferredRank) {
9424
0
            preferredCurve = curve;
9425
0
            preferredRank = rank;
9426
0
        }
9427
0
    }
9428
0
    curve = preferredCurve;
9429
9430
0
    if (curve == NULL) {
9431
0
        WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
9432
0
        return BAD_KEY_SHARE_DATA;
9433
0
    }
9434
9435
    #ifdef WOLFSSL_ASYNC_CRYPT
9436
    /* Check the old key share data list. */
9437
    extension = TLSX_Find(*extensions, TLSX_KEY_SHARE);
9438
    if (extension != NULL) {
9439
        kse = (KeyShareEntry*)extension->data;
9440
        /* We should not be computing keys if we are only going to advertise
9441
         * our choice here. */
9442
        if (kse != NULL && kse->lastRet == WC_PENDING_E) {
9443
            WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA);
9444
            return BAD_KEY_SHARE_DATA;
9445
        }
9446
    }
9447
    #endif
9448
9449
    /* Push new KeyShare extension. This will also free the old one */
9450
0
    ret = TLSX_Push(extensions, TLSX_KEY_SHARE, NULL, ssl->heap);
9451
0
    if (ret != 0)
9452
0
        return ret;
9453
    /* Extension got pushed to head */
9454
0
    extension = *extensions;
9455
    /* Push the selected curve */
9456
0
    ret = TLSX_KeyShare_New((KeyShareEntry**)&extension->data, curve->name,
9457
0
                            ssl->heap, &kse);
9458
0
    if (ret != 0)
9459
0
        return ret;
9460
    /* Set extension to be in response. */
9461
0
    extension->resp = 1;
9462
#else
9463
9464
    (void)ssl;
9465
9466
    WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN);
9467
    ret = NOT_COMPILED_IN;
9468
#endif
9469
9470
0
    return ret;
9471
0
}
9472
9473
/* Server side KSE processing */
9474
int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
9475
    byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, byte* searched)
9476
0
{
9477
0
    TLSX*          extension;
9478
0
    KeyShareEntry* clientKSE = NULL;
9479
0
    KeyShareEntry* list = NULL;
9480
0
    KeyShareEntry* preferredKSE = NULL;
9481
0
    int preferredRank = WOLFSSL_MAX_GROUP_COUNT;
9482
0
    int rank;
9483
9484
0
    (void)cipherSuite0;
9485
0
    (void)cipherSuite;
9486
9487
0
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
9488
0
        return BAD_FUNC_ARG;
9489
9490
0
    *searched = 0;
9491
9492
    /* Find the KeyShare extension if it exists. */
9493
0
    extension = TLSX_Find(extensions, TLSX_KEY_SHARE);
9494
0
    if (extension != NULL)
9495
0
        list = (KeyShareEntry*)extension->data;
9496
9497
0
    if (extension && extension->resp == 1) {
9498
        /* Outside of the async case this path should not be taken. */
9499
0
        int ret = INCOMPLETE_DATA;
9500
    #ifdef WOLFSSL_ASYNC_CRYPT
9501
        /* in async case make sure key generation is finalized */
9502
        KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data;
9503
        if (serverKSE && serverKSE->lastRet == WC_PENDING_E) {
9504
            if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE)
9505
                *searched = 1;
9506
            ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
9507
        }
9508
    #endif
9509
0
        return ret;
9510
0
    }
9511
9512
    /* Use server's preference order. */
9513
0
    for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
9514
0
        if (clientKSE->ke == NULL)
9515
0
            continue;
9516
9517
0
#ifdef WOLFSSL_SM2
9518
0
        if ((cipherSuite0 == CIPHER_BYTE) &&
9519
0
            ((cipherSuite == TLS_SM4_GCM_SM3) ||
9520
0
             (cipherSuite == TLS_SM4_CCM_SM3))) {
9521
0
           if (clientKSE->group != WOLFSSL_ECC_SM2P256V1) {
9522
0
               continue;
9523
0
           }
9524
0
        }
9525
0
        else if (clientKSE->group == WOLFSSL_ECC_SM2P256V1) {
9526
0
           continue;
9527
0
        }
9528
0
#endif
9529
9530
        /* Check consistency now - extensions in any order. */
9531
0
        if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions))
9532
0
            continue;
9533
9534
0
        if (!WOLFSSL_NAMED_GROUP_IS_FFHDE(clientKSE->group)) {
9535
            /* Check max value supported. */
9536
0
            if (clientKSE->group > WOLFSSL_ECC_MAX) {
9537
#ifdef HAVE_PQC
9538
                if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group))
9539
#endif
9540
0
                    continue;
9541
0
            }
9542
0
            if (wolfSSL_curve_is_disabled(ssl, clientKSE->group))
9543
0
                continue;
9544
0
        }
9545
0
        if (!TLSX_KeyShare_IsSupported(clientKSE->group))
9546
0
            continue;
9547
9548
0
        rank = TLSX_KeyShare_GroupRank(ssl, clientKSE->group);
9549
0
        if (rank == -1)
9550
0
            continue;
9551
0
        if (rank < preferredRank) {
9552
0
            preferredKSE = clientKSE;
9553
0
            preferredRank = rank;
9554
0
        }
9555
0
    }
9556
0
    *kse = preferredKSE;
9557
0
    *searched = 1;
9558
0
    return 0;
9559
0
}
9560
9561
/* Server side KSE processing */
9562
int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
9563
0
{
9564
0
    int            ret;
9565
0
    TLSX*          extension;
9566
0
    KeyShareEntry* serverKSE;
9567
0
    KeyShareEntry* list = NULL;
9568
9569
0
    if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END)
9570
0
        return BAD_FUNC_ARG;
9571
9572
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
9573
0
    if (extension == NULL)
9574
0
        return BAD_STATE_E;
9575
9576
0
    if (clientKSE == NULL) {
9577
#ifdef WOLFSSL_ASYNC_CRYPT
9578
        /* Not necessarily an error. The key may have already been setup. */
9579
        if (extension != NULL && extension->resp == 1) {
9580
            serverKSE = (KeyShareEntry*)extension->data;
9581
            if (serverKSE != NULL) {
9582
                /* in async case make sure key generation is finalized */
9583
                if (serverKSE->lastRet == WC_PENDING_E)
9584
                    return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE);
9585
                else if (serverKSE->lastRet == 0)
9586
                    return 0;
9587
            }
9588
        }
9589
#endif
9590
0
        return BAD_FUNC_ARG;
9591
0
    }
9592
9593
    /* Generate a new key pair except in the case of OQS KEM because we
9594
     * are going to encapsulate and that does not require us to generate a
9595
     * key pair.
9596
     */
9597
0
    ret = TLSX_KeyShare_New(&list, clientKSE->group, ssl->heap, &serverKSE);
9598
0
    if (ret != 0)
9599
0
        return ret;
9600
9601
0
    if (clientKSE->key == NULL) {
9602
#ifdef HAVE_PQC
9603
        if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) {
9604
            /* Going to need the public key (AKA ciphertext). */
9605
            serverKSE->pubKey = clientKSE->pubKey;
9606
            clientKSE->pubKey = NULL;
9607
            serverKSE->pubKeyLen = clientKSE->pubKeyLen;
9608
            clientKSE->pubKeyLen = 0;
9609
        }
9610
        else
9611
#endif
9612
0
        {
9613
0
            ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
9614
0
        }
9615
9616
        /* for async do setup of serverKSE below, but return WC_PENDING_E */
9617
0
        if (ret != 0
9618
        #ifdef WOLFSSL_ASYNC_CRYPT
9619
            && ret != WC_PENDING_E
9620
        #endif
9621
0
        ) {
9622
0
            TLSX_KeyShare_FreeAll(list, ssl->heap);
9623
0
            return ret;
9624
0
        }
9625
0
    }
9626
0
    else {
9627
        /* transfer buffers to serverKSE */
9628
0
        serverKSE->key = clientKSE->key;
9629
0
        clientKSE->key = NULL;
9630
0
        serverKSE->keyLen = clientKSE->keyLen;
9631
0
        serverKSE->pubKey = clientKSE->pubKey;
9632
0
        clientKSE->pubKey = NULL;
9633
0
        serverKSE->pubKeyLen = clientKSE->pubKeyLen;
9634
0
    #ifndef NO_DH
9635
0
        serverKSE->privKey = clientKSE->privKey;
9636
0
        clientKSE->privKey = NULL;
9637
0
    #endif
9638
0
    }
9639
0
    serverKSE->ke = clientKSE->ke;
9640
0
    serverKSE->keLen = clientKSE->keLen;
9641
0
    clientKSE->ke = NULL;
9642
0
    clientKSE->keLen = 0;
9643
0
    ssl->namedGroup = serverKSE->group;
9644
9645
0
    TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap);
9646
0
    extension->data = (void *)serverKSE;
9647
9648
0
    extension->resp = 1;
9649
0
    return ret;
9650
0
}
9651
9652
/* Ensure there is a key pair that can be used for key exchange.
9653
 *
9654
 * ssl  The SSL/TLS object.
9655
 * doHelloRetry If set to non-zero will do hello_retry
9656
 * returns 0 on success and other values indicate failure.
9657
 */
9658
int TLSX_KeyShare_Establish(WOLFSSL *ssl, int* doHelloRetry)
9659
0
{
9660
0
    int            ret;
9661
0
    KeyShareEntry* clientKSE = NULL;
9662
0
    byte           searched = 0;
9663
9664
0
    *doHelloRetry = 0;
9665
9666
0
    ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, ssl->cipher.cipherSuite0,
9667
0
        ssl->cipher.cipherSuite, &clientKSE, &searched);
9668
0
    if (ret != 0 || !searched)
9669
0
        return ret;
9670
9671
    /* No supported group found - send HelloRetryRequest. */
9672
0
    if (clientKSE == NULL) {
9673
        /* Set KEY_SHARE_ERROR to indicate HelloRetryRequest required. */
9674
0
        *doHelloRetry = 1;
9675
0
        return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions);
9676
0
    }
9677
9678
0
    return TLSX_KeyShare_Setup(ssl, clientKSE);
9679
0
}
9680
9681
/* Derive the shared secret of the key exchange.
9682
 *
9683
 * ssl  The SSL/TLS object.
9684
 * returns 0 on success and other values indicate failure.
9685
 */
9686
int TLSX_KeyShare_DeriveSecret(WOLFSSL *ssl)
9687
0
{
9688
0
    int            ret;
9689
0
    TLSX*          extension;
9690
0
    KeyShareEntry* list = NULL;
9691
9692
#ifdef WOLFSSL_ASYNC_CRYPT
9693
    ret = wolfSSL_AsyncPop(ssl, NULL);
9694
    /* Check for error */
9695
    if (ret != WC_NO_PENDING_E && ret < 0) {
9696
        return ret;
9697
    }
9698
#endif
9699
9700
    /* Find the KeyShare extension if it exists. */
9701
0
    extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
9702
0
    if (extension != NULL)
9703
0
        list = (KeyShareEntry*)extension->data;
9704
9705
0
    if (list == NULL)
9706
0
        return KEY_SHARE_ERROR;
9707
9708
    /* Calculate secret. */
9709
0
    ret = TLSX_KeyShare_Process(ssl, list);
9710
9711
0
    return ret;
9712
0
}
9713
9714
0
#define KS_FREE_ALL  TLSX_KeyShare_FreeAll
9715
0
#define KS_GET_SIZE  TLSX_KeyShare_GetSize
9716
0
#define KS_WRITE     TLSX_KeyShare_Write
9717
0
#define KS_PARSE     TLSX_KeyShare_Parse
9718
9719
#else
9720
9721
#define KS_FREE_ALL(a, b) WC_DO_NOTHING
9722
#define KS_GET_SIZE(a, b)    0
9723
#define KS_WRITE(a, b, c)    0
9724
#define KS_PARSE(a, b, c, d) 0
9725
9726
#endif /* WOLFSSL_TLS13 */
9727
9728
/******************************************************************************/
9729
/* Pre-Shared Key                                                             */
9730
/******************************************************************************/
9731
9732
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
9733
/* Free the pre-shared key dynamic data.
9734
 *
9735
 * list  The linked list of key share entry objects.
9736
 * heap  The heap used for allocation.
9737
 */
9738
static void TLSX_PreSharedKey_FreeAll(PreSharedKey* list, void* heap)
9739
{
9740
    PreSharedKey* current;
9741
9742
    while ((current = list) != NULL) {
9743
        list = current->next;
9744
        XFREE(current->identity, heap, DYNAMIC_TYPE_TLSX);
9745
        XFREE(current, heap, DYNAMIC_TYPE_TLSX);
9746
    }
9747
9748
    (void)heap;
9749
}
9750
9751
/* Get the size of the encoded pre shared key extension.
9752
 *
9753
 * list     The linked list of pre-shared key extensions.
9754
 * msgType  The type of the message this extension is being written into.
9755
 * returns the number of bytes of the encoded pre-shared key extension or
9756
 * SANITY_MSG_E to indicate invalid message type.
9757
 */
9758
static int TLSX_PreSharedKey_GetSize(PreSharedKey* list, byte msgType,
9759
                                     word16* pSz)
9760
{
9761
    if (msgType == client_hello) {
9762
        /* Length of identities + Length of binders. */
9763
        word16 len = OPAQUE16_LEN + OPAQUE16_LEN;
9764
        while (list != NULL) {
9765
            /* Each entry has: identity, ticket age and binder. */
9766
            len += OPAQUE16_LEN + list->identityLen + OPAQUE32_LEN +
9767
                   OPAQUE8_LEN + (word16)list->binderLen;
9768
            list = list->next;
9769
        }
9770
        *pSz += len;
9771
        return 0;
9772
    }
9773
9774
    if (msgType == server_hello) {
9775
        *pSz += OPAQUE16_LEN;
9776
        return 0;
9777
    }
9778
9779
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9780
    return SANITY_MSG_E;
9781
}
9782
9783
/* The number of bytes to be written for the binders.
9784
 *
9785
 * list     The linked list of pre-shared key extensions.
9786
 * msgType  The type of the message this extension is being written into.
9787
 * returns the number of bytes of the encoded pre-shared key extension or
9788
 * SANITY_MSG_E to indicate invalid message type.
9789
 */
9790
int TLSX_PreSharedKey_GetSizeBinders(PreSharedKey* list, byte msgType,
9791
                                     word16* pSz)
9792
{
9793
    word16 len;
9794
9795
    if (msgType != client_hello) {
9796
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9797
        return SANITY_MSG_E;
9798
    }
9799
9800
    /* Length of all binders. */
9801
    len = OPAQUE16_LEN;
9802
    while (list != NULL) {
9803
        len += OPAQUE8_LEN + (word16)list->binderLen;
9804
        list = list->next;
9805
    }
9806
9807
    *pSz = len;
9808
    return 0;
9809
}
9810
9811
/* Writes the pre-shared key extension into the output buffer - binders only.
9812
 * Assumes that the the output buffer is big enough to hold data.
9813
 *
9814
 * list     The linked list of key share entries.
9815
 * output   The buffer to write into.
9816
 * msgType  The type of the message this extension is being written into.
9817
 * returns the number of bytes written into the buffer.
9818
 */
9819
int TLSX_PreSharedKey_WriteBinders(PreSharedKey* list, byte* output,
9820
                                   byte msgType, word16* pSz)
9821
{
9822
    PreSharedKey* current = list;
9823
    word16 idx = 0;
9824
    word16 lenIdx;
9825
    word16 len;
9826
9827
    if (msgType != client_hello) {
9828
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9829
        return SANITY_MSG_E;
9830
    }
9831
9832
    /* Skip length of all binders. */
9833
    lenIdx = idx;
9834
    idx += OPAQUE16_LEN;
9835
    while (current != NULL) {
9836
        /* Binder data length. */
9837
        output[idx++] = (byte)current->binderLen;
9838
        /* Binder data. */
9839
        XMEMCPY(output + idx, current->binder, current->binderLen);
9840
        idx += (word16)current->binderLen;
9841
9842
        current = current->next;
9843
    }
9844
    /* Length of the binders. */
9845
    len = idx - lenIdx - OPAQUE16_LEN;
9846
    c16toa(len, output + lenIdx);
9847
9848
    *pSz = idx;
9849
    return 0;
9850
}
9851
9852
9853
/* Writes the pre-shared key extension into the output buffer.
9854
 * Assumes that the the output buffer is big enough to hold data.
9855
 *
9856
 * list     The linked list of key share entries.
9857
 * output   The buffer to write into.
9858
 * msgType  The type of the message this extension is being written into.
9859
 * returns the number of bytes written into the buffer.
9860
 */
9861
static int TLSX_PreSharedKey_Write(PreSharedKey* list, byte* output,
9862
                                   byte msgType, word16* pSz)
9863
{
9864
    if (msgType == client_hello) {
9865
        PreSharedKey* current = list;
9866
        word16 idx = 0;
9867
        word16 lenIdx;
9868
        word16 len;
9869
        int ret;
9870
9871
        /* Write identities only. Binders after HMACing over this. */
9872
        lenIdx = idx;
9873
        idx += OPAQUE16_LEN;
9874
        while (current != NULL) {
9875
            /* Identity length */
9876
            c16toa(current->identityLen, output + idx);
9877
            idx += OPAQUE16_LEN;
9878
            /* Identity data */
9879
            XMEMCPY(output + idx, current->identity, current->identityLen);
9880
            idx += current->identityLen;
9881
9882
            /* Obfuscated ticket age. */
9883
            c32toa(current->ticketAge, output + idx);
9884
            idx += OPAQUE32_LEN;
9885
9886
            current = current->next;
9887
        }
9888
        /* Length of the identities. */
9889
        len = idx - lenIdx - OPAQUE16_LEN;
9890
        c16toa(len, output + lenIdx);
9891
9892
        /* Don't include binders here.
9893
         * The binders are based on the hash of all the ClientHello data up to
9894
         * and include the identities written above.
9895
         */
9896
        ret = TLSX_PreSharedKey_GetSizeBinders(list, msgType, &len);
9897
        if (ret < 0)
9898
            return ret;
9899
        *pSz += idx + len;
9900
    }
9901
    else if (msgType == server_hello) {
9902
        word16 i;
9903
9904
        /* Find the index of the chosen identity. */
9905
        for (i=0; list != NULL && !list->chosen; i++)
9906
            list = list->next;
9907
        if (list == NULL) {
9908
            WOLFSSL_ERROR_VERBOSE(BUILD_MSG_ERROR);
9909
            return BUILD_MSG_ERROR;
9910
        }
9911
9912
        /* The index of the identity chosen by the server from the list supplied
9913
         * by the client.
9914
         */
9915
        c16toa(i, output);
9916
        *pSz += OPAQUE16_LEN;
9917
    }
9918
    else {
9919
        WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
9920
        return SANITY_MSG_E;
9921
    }
9922
9923
    return 0;
9924
}
9925
9926
int TLSX_PreSharedKey_Parse_ClientHello(TLSX** extensions, const byte* input,
9927
                                        word16 length, void* heap)
9928
{
9929
9930
    int    ret;
9931
    word16 len;
9932
    word16 idx = 0;
9933
    TLSX*         extension;
9934
    PreSharedKey* list;
9935
9936
    TLSX_Remove(extensions, TLSX_PRE_SHARED_KEY, heap);
9937
9938
    /* Length of identities and of binders. */
9939
    if ((int)(length - idx) < OPAQUE16_LEN + OPAQUE16_LEN)
9940
        return BUFFER_E;
9941
9942
    /* Length of identities. */
9943
    ato16(input + idx, &len);
9944
    idx += OPAQUE16_LEN;
9945
    if (len < MIN_PSK_ID_LEN || length - idx < len)
9946
        return BUFFER_E;
9947
9948
    /* Create a pre-shared key object for each identity. */
9949
    while (len > 0) {
9950
        const byte* identity;
9951
        word16      identityLen;
9952
        word32      age;
9953
9954
        if (len < OPAQUE16_LEN)
9955
            return BUFFER_E;
9956
9957
        /* Length of identity. */
9958
        ato16(input + idx, &identityLen);
9959
        idx += OPAQUE16_LEN;
9960
        if (len < OPAQUE16_LEN + identityLen + OPAQUE32_LEN ||
9961
                identityLen > MAX_PSK_ID_LEN)
9962
            return BUFFER_E;
9963
        /* Cache identity pointer. */
9964
        identity = input + idx;
9965
        idx += identityLen;
9966
        /* Ticket age. */
9967
        ato32(input + idx, &age);
9968
        idx += OPAQUE32_LEN;
9969
9970
        ret = TLSX_PreSharedKey_Use(extensions, identity, identityLen, age, no_mac,
9971
                                    0, 0, 1, NULL, heap);
9972
        if (ret != 0)
9973
            return ret;
9974
9975
        /* Done with this identity. */
9976
        len -= OPAQUE16_LEN + identityLen + OPAQUE32_LEN;
9977
    }
9978
9979
    /* Find the list of identities sent to server. */
9980
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
9981
    if (extension == NULL)
9982
        return PSK_KEY_ERROR;
9983
    list = (PreSharedKey*)extension->data;
9984
9985
    /* Length of binders. */
9986
    if (idx + OPAQUE16_LEN > length)
9987
        return BUFFER_E;
9988
    ato16(input + idx, &len);
9989
    idx += OPAQUE16_LEN;
9990
    if (len < MIN_PSK_BINDERS_LEN || length - idx < len)
9991
        return BUFFER_E;
9992
9993
    /* Set binder for each identity. */
9994
    while (list != NULL && len > 0) {
9995
        /* Length of binder */
9996
        list->binderLen = input[idx++];
9997
        if (list->binderLen < WC_SHA256_DIGEST_SIZE ||
9998
                list->binderLen > WC_MAX_DIGEST_SIZE)
9999
            return BUFFER_E;
10000
        if (len < OPAQUE8_LEN + list->binderLen)
10001
            return BUFFER_E;
10002
10003
        /* Copy binder into static buffer. */
10004
        XMEMCPY(list->binder, input + idx, list->binderLen);
10005
        idx += (word16)list->binderLen;
10006
10007
        /* Done with binder entry. */
10008
        len -= OPAQUE8_LEN + (word16)list->binderLen;
10009
10010
        /* Next identity. */
10011
        list = list->next;
10012
    }
10013
    if (list != NULL || len != 0)
10014
        return BUFFER_E;
10015
10016
    return 0;
10017
10018
}
10019
10020
/* Parse the pre-shared key extension.
10021
 * Different formats in different messages.
10022
 *
10023
 * ssl      The SSL/TLS object.
10024
 * input    The extension data.
10025
 * length   The length of the extension data.
10026
 * msgType  The type of the message this extension is being parsed from.
10027
 * returns 0 on success and other values indicate failure.
10028
 */
10029
static int TLSX_PreSharedKey_Parse(WOLFSSL* ssl, const byte* input,
10030
                                   word16 length, byte msgType)
10031
{
10032
10033
    if (msgType == client_hello) {
10034
        return TLSX_PreSharedKey_Parse_ClientHello(&ssl->extensions, input,
10035
                                                   length, ssl->heap);
10036
    }
10037
10038
    if (msgType == server_hello) {
10039
        word16 idx;
10040
        PreSharedKey* list;
10041
        TLSX*         extension;
10042
10043
        /* Index of identity chosen by server. */
10044
        if (length != OPAQUE16_LEN)
10045
            return BUFFER_E;
10046
        ato16(input, &idx);
10047
10048
    #ifdef WOLFSSL_EARLY_DATA
10049
        ssl->options.pskIdIndex = idx + 1;
10050
    #endif
10051
10052
        /* Find the list of identities sent to server. */
10053
        extension = TLSX_Find(ssl->extensions, TLSX_PRE_SHARED_KEY);
10054
        if (extension == NULL)
10055
            return PSK_KEY_ERROR;
10056
        list = (PreSharedKey*)extension->data;
10057
10058
        /* Mark the identity as chosen. */
10059
        for (; list != NULL && idx > 0; idx--)
10060
            list = list->next;
10061
        if (list == NULL) {
10062
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
10063
            return PSK_KEY_ERROR;
10064
        }
10065
        list->chosen = 1;
10066
10067
    #ifdef HAVE_SESSION_TICKET
10068
        if (list->resumption) {
10069
           /* Check that the session's details are the same as the server's. */
10070
           if (ssl->options.cipherSuite0  != ssl->session->cipherSuite0       ||
10071
               ssl->options.cipherSuite   != ssl->session->cipherSuite        ||
10072
               ssl->session->version.major != ssl->ctx->method->version.major ||
10073
               ssl->session->version.minor != ssl->ctx->method->version.minor) {
10074
                WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
10075
               return PSK_KEY_ERROR;
10076
           }
10077
        }
10078
    #endif
10079
10080
        return 0;
10081
    }
10082
10083
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10084
    return SANITY_MSG_E;
10085
}
10086
10087
/* Create a new pre-shared key and put it into the list.
10088
 *
10089
 * list          The linked list of pre-shared key.
10090
 * identity      The identity.
10091
 * len           The length of the identity data.
10092
 * heap          The memory to allocate with.
10093
 * preSharedKey  The new pre-shared key object.
10094
 * returns 0 on success and other values indicate failure.
10095
 */
10096
static int TLSX_PreSharedKey_New(PreSharedKey** list, const byte* identity,
10097
                                 word16 len, void *heap,
10098
                                 PreSharedKey** preSharedKey)
10099
{
10100
    PreSharedKey* psk;
10101
    PreSharedKey** next;
10102
10103
    psk = (PreSharedKey*)XMALLOC(sizeof(PreSharedKey), heap, DYNAMIC_TYPE_TLSX);
10104
    if (psk == NULL)
10105
        return MEMORY_E;
10106
    XMEMSET(psk, 0, sizeof(*psk));
10107
10108
    /* Make a copy of the identity data. */
10109
    psk->identity = (byte*)XMALLOC(len + NULL_TERM_LEN, heap,
10110
                                   DYNAMIC_TYPE_TLSX);
10111
    if (psk->identity == NULL) {
10112
        XFREE(psk, heap, DYNAMIC_TYPE_TLSX);
10113
        return MEMORY_E;
10114
    }
10115
    XMEMCPY(psk->identity, identity, len);
10116
    psk->identityLen = len;
10117
    /* Use a NULL terminator in case it is a C string */
10118
    psk->identity[psk->identityLen] = '\0';
10119
10120
    /* Add it to the end and maintain the links. */
10121
    while (*list != NULL) {
10122
        /* Assign to temporary to work around compiler bug found by customer. */
10123
        next = &((*list)->next);
10124
        list = next;
10125
    }
10126
    *list = psk;
10127
    *preSharedKey = psk;
10128
10129
    (void)heap;
10130
10131
    return 0;
10132
}
10133
10134
static WC_INLINE byte GetHmacLength(int hmac)
10135
{
10136
    switch (hmac) {
10137
    #ifndef NO_SHA256
10138
        case sha256_mac:
10139
            return WC_SHA256_DIGEST_SIZE;
10140
    #endif
10141
    #ifdef WOLFSSL_SHA384
10142
        case sha384_mac:
10143
            return WC_SHA384_DIGEST_SIZE;
10144
    #endif
10145
    #ifdef WOLFSSL_SHA512
10146
        case sha512_mac:
10147
            return WC_SHA512_DIGEST_SIZE;
10148
    #endif
10149
    #ifdef WOLFSSL_SM3
10150
        case sm3_mac:
10151
            return WC_SM3_DIGEST_SIZE;
10152
    #endif
10153
        default:
10154
            break;
10155
    }
10156
    return 0;
10157
}
10158
10159
/* Use the data to create a new pre-shared key object in the extensions.
10160
 *
10161
 * ssl           The SSL/TLS object.
10162
 * identity      The identity.
10163
 * len           The length of the identity data.
10164
 * age           The age of the identity.
10165
 * hmac          The HMAC algorithm.
10166
 * cipherSuite0  The first byte of the cipher suite to use.
10167
 * cipherSuite   The second byte of the cipher suite to use.
10168
 * resumption    The PSK is for resumption of a session.
10169
 * preSharedKey  The new pre-shared key object.
10170
 * returns 0 on success and other values indicate failure.
10171
 */
10172
int TLSX_PreSharedKey_Use(TLSX** extensions, const byte* identity, word16 len,
10173
                          word32 age, byte hmac, byte cipherSuite0,
10174
                          byte cipherSuite, byte resumption,
10175
                          PreSharedKey **preSharedKey, void* heap)
10176
{
10177
    int           ret = 0;
10178
    TLSX*         extension;
10179
    PreSharedKey* psk = NULL;
10180
10181
    /* Find the pre-shared key extension if it exists. */
10182
    extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
10183
    if (extension == NULL) {
10184
        /* Push new pre-shared key extension. */
10185
        ret = TLSX_Push(extensions, TLSX_PRE_SHARED_KEY, NULL, heap);
10186
        if (ret != 0)
10187
            return ret;
10188
10189
        extension = TLSX_Find(*extensions, TLSX_PRE_SHARED_KEY);
10190
        if (extension == NULL)
10191
            return MEMORY_E;
10192
    }
10193
10194
    /* Try to find the pre-shared key with this identity. */
10195
    psk = (PreSharedKey*)extension->data;
10196
    while (psk != NULL) {
10197
        if ((psk->identityLen == len) &&
10198
               (XMEMCMP(psk->identity, identity, len) == 0)) {
10199
            break;
10200
        }
10201
        psk = psk->next;
10202
    }
10203
10204
    /* Create a new pre-shared key object if not found. */
10205
    if (psk == NULL) {
10206
        ret = TLSX_PreSharedKey_New((PreSharedKey**)&extension->data, identity,
10207
                                    len, heap, &psk);
10208
        if (ret != 0)
10209
            return ret;
10210
    }
10211
10212
    /* Update/set age and HMAC algorithm. */
10213
    psk->ticketAge    = age;
10214
    psk->hmac         = hmac;
10215
    psk->cipherSuite0 = cipherSuite0;
10216
    psk->cipherSuite  = cipherSuite;
10217
    psk->resumption   = resumption;
10218
    psk->binderLen    = GetHmacLength(psk->hmac);
10219
10220
    if (preSharedKey != NULL)
10221
        *preSharedKey = psk;
10222
10223
    return 0;
10224
}
10225
10226
#define PSK_FREE_ALL  TLSX_PreSharedKey_FreeAll
10227
#define PSK_GET_SIZE  TLSX_PreSharedKey_GetSize
10228
#define PSK_WRITE     TLSX_PreSharedKey_Write
10229
#define PSK_PARSE     TLSX_PreSharedKey_Parse
10230
10231
#else
10232
10233
#define PSK_FREE_ALL(a, b) WC_DO_NOTHING
10234
#define PSK_GET_SIZE(a, b, c) 0
10235
#define PSK_WRITE(a, b, c, d) 0
10236
#define PSK_PARSE(a, b, c, d) 0
10237
10238
#endif
10239
10240
/******************************************************************************/
10241
/* PSK Key Exchange Modes                                                     */
10242
/******************************************************************************/
10243
10244
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
10245
/* Get the size of the encoded PSK KE modes extension.
10246
 * Only in ClientHello.
10247
 *
10248
 * modes    The PSK KE mode bit string.
10249
 * msgType  The type of the message this extension is being written into.
10250
 * returns the number of bytes of the encoded PSK KE mode extension.
10251
 */
10252
static int TLSX_PskKeModes_GetSize(byte modes, byte msgType, word16* pSz)
10253
{
10254
    if (msgType == client_hello) {
10255
        /* Format: Len | Modes* */
10256
        word16 len = OPAQUE8_LEN;
10257
        /* Check whether each possible mode is to be written. */
10258
        if (modes & (1 << PSK_KE))
10259
            len += OPAQUE8_LEN;
10260
        if (modes & (1 << PSK_DHE_KE))
10261
            len += OPAQUE8_LEN;
10262
        *pSz += len;
10263
        return 0;
10264
    }
10265
10266
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10267
    return SANITY_MSG_E;
10268
}
10269
10270
/* Writes the PSK KE modes extension into the output buffer.
10271
 * Assumes that the the output buffer is big enough to hold data.
10272
 * Only in ClientHello.
10273
 *
10274
 * modes    The PSK KE mode bit string.
10275
 * output   The buffer to write into.
10276
 * msgType  The type of the message this extension is being written into.
10277
 * returns the number of bytes written into the buffer.
10278
 */
10279
static int TLSX_PskKeModes_Write(byte modes, byte* output, byte msgType,
10280
                                 word16* pSz)
10281
{
10282
    if (msgType == client_hello) {
10283
        /* Format: Len | Modes* */
10284
        word16 idx = OPAQUE8_LEN;
10285
10286
        /* Write out each possible mode. */
10287
        if (modes & (1 << PSK_KE))
10288
            output[idx++] = PSK_KE;
10289
        if (modes & (1 << PSK_DHE_KE))
10290
            output[idx++] = PSK_DHE_KE;
10291
        /* Write out length of mode list. */
10292
        output[0] = (byte)(idx - OPAQUE8_LEN);
10293
10294
        *pSz += idx;
10295
        return 0;
10296
    }
10297
10298
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10299
    return SANITY_MSG_E;
10300
}
10301
10302
int TLSX_PskKeyModes_Parse_Modes(const byte* input, word16 length, byte msgType,
10303
                                byte* modes)
10304
{
10305
    if (msgType == client_hello) {
10306
        /* Format: Len | Modes* */
10307
        int   idx = 0;
10308
        word16 len;
10309
        *modes = 0;
10310
10311
        /* Ensure length byte exists. */
10312
        if (length < OPAQUE8_LEN)
10313
            return BUFFER_E;
10314
10315
        /* Get length of mode list and ensure that is the only data. */
10316
        len = input[0];
10317
        if (length - OPAQUE8_LEN != len)
10318
            return BUFFER_E;
10319
10320
        idx = OPAQUE8_LEN;
10321
        /* Set a bit for each recognized modes. */
10322
        while (len > 0) {
10323
            /* Ignore unrecognized modes.  */
10324
            if (input[idx] <= PSK_DHE_KE)
10325
               *modes |= 1 << input[idx];
10326
            idx++;
10327
            len--;
10328
        }
10329
        return 0;
10330
    }
10331
10332
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10333
    return SANITY_MSG_E;
10334
}
10335
10336
/* Parse the PSK KE modes extension.
10337
 * Only in ClientHello.
10338
 *
10339
 * ssl      The SSL/TLS object.
10340
 * input    The extension data.
10341
 * length   The length of the extension data.
10342
 * msgType  The type of the message this extension is being parsed from.
10343
 * returns 0 on success and other values indicate failure.
10344
 */
10345
static int TLSX_PskKeModes_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10346
                                 byte msgType)
10347
{
10348
    int    ret;
10349
    byte modes;
10350
10351
    ret = TLSX_PskKeyModes_Parse_Modes(input, length, msgType, &modes);
10352
    if (ret == 0)
10353
        ret = TLSX_PskKeyModes_Use(ssl, modes);
10354
10355
    if (ret != 0) {
10356
        WOLFSSL_ERROR_VERBOSE(ret);
10357
    }
10358
10359
    return ret;
10360
}
10361
10362
/* Use the data to create a new PSK Key Exchange Modes object in the extensions.
10363
 *
10364
 * ssl    The SSL/TLS object.
10365
 * modes  The PSK key exchange modes.
10366
 * returns 0 on success and other values indicate failure.
10367
 */
10368
int TLSX_PskKeyModes_Use(WOLFSSL* ssl, byte modes)
10369
{
10370
    int           ret = 0;
10371
    TLSX*         extension;
10372
10373
    /* Find the PSK key exchange modes extension if it exists. */
10374
    extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
10375
    if (extension == NULL) {
10376
        /* Push new PSK key exchange modes extension. */
10377
        ret = TLSX_Push(&ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES, NULL,
10378
            ssl->heap);
10379
        if (ret != 0)
10380
            return ret;
10381
10382
        extension = TLSX_Find(ssl->extensions, TLSX_PSK_KEY_EXCHANGE_MODES);
10383
        if (extension == NULL)
10384
            return MEMORY_E;
10385
    }
10386
10387
    extension->val = modes;
10388
10389
    return 0;
10390
}
10391
10392
#define PKM_GET_SIZE  TLSX_PskKeModes_GetSize
10393
#define PKM_WRITE     TLSX_PskKeModes_Write
10394
#define PKM_PARSE     TLSX_PskKeModes_Parse
10395
10396
#else
10397
10398
#define PKM_GET_SIZE(a, b, c) 0
10399
#define PKM_WRITE(a, b, c, d) 0
10400
#define PKM_PARSE(a, b, c, d) 0
10401
10402
#endif
10403
10404
/******************************************************************************/
10405
/* Post-Handshake Authentication                                              */
10406
/******************************************************************************/
10407
10408
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH)
10409
/* Get the size of the encoded Post-Handshake Authentication extension.
10410
 * Only in ClientHello.
10411
 *
10412
 * msgType  The type of the message this extension is being written into.
10413
 * returns the number of bytes of the encoded Post-Handshake Authentication
10414
 * extension.
10415
 */
10416
static int TLSX_PostHandAuth_GetSize(byte msgType, word16* pSz)
10417
{
10418
    if (msgType == client_hello) {
10419
        *pSz += 0;
10420
        return 0;
10421
    }
10422
10423
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10424
    return SANITY_MSG_E;
10425
}
10426
10427
/* Writes the Post-Handshake Authentication extension into the output buffer.
10428
 * Assumes that the the output buffer is big enough to hold data.
10429
 * Only in ClientHello.
10430
 *
10431
 * output   The buffer to write into.
10432
 * msgType  The type of the message this extension is being written into.
10433
 * returns the number of bytes written into the buffer.
10434
 */
10435
static int TLSX_PostHandAuth_Write(byte* output, byte msgType, word16* pSz)
10436
{
10437
    (void)output;
10438
10439
    if (msgType == client_hello) {
10440
        *pSz += 0;
10441
        return 0;
10442
    }
10443
10444
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10445
    return SANITY_MSG_E;
10446
}
10447
10448
/* Parse the Post-Handshake Authentication extension.
10449
 * Only in ClientHello.
10450
 *
10451
 * ssl      The SSL/TLS object.
10452
 * input    The extension data.
10453
 * length   The length of the extension data.
10454
 * msgType  The type of the message this extension is being parsed from.
10455
 * returns 0 on success and other values indicate failure.
10456
 */
10457
static int TLSX_PostHandAuth_Parse(WOLFSSL* ssl, const byte* input,
10458
                                   word16 length, byte msgType)
10459
{
10460
    (void)input;
10461
10462
    if (msgType == client_hello) {
10463
        /* Ensure extension is empty. */
10464
        if (length != 0)
10465
            return BUFFER_E;
10466
10467
        ssl->options.postHandshakeAuth = 1;
10468
        return 0;
10469
    }
10470
10471
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10472
    return SANITY_MSG_E;
10473
}
10474
10475
/* Create a new Post-handshake authentication object in the extensions.
10476
 *
10477
 * ssl    The SSL/TLS object.
10478
 * returns 0 on success and other values indicate failure.
10479
 */
10480
static int TLSX_PostHandAuth_Use(WOLFSSL* ssl)
10481
{
10482
    int   ret = 0;
10483
    TLSX* extension;
10484
10485
    /* Find the PSK key exchange modes extension if it exists. */
10486
    extension = TLSX_Find(ssl->extensions, TLSX_POST_HANDSHAKE_AUTH);
10487
    if (extension == NULL) {
10488
        /* Push new Post-handshake Authentication extension. */
10489
        ret = TLSX_Push(&ssl->extensions, TLSX_POST_HANDSHAKE_AUTH, NULL,
10490
            ssl->heap);
10491
        if (ret != 0)
10492
            return ret;
10493
    }
10494
10495
    return 0;
10496
}
10497
10498
#define PHA_GET_SIZE  TLSX_PostHandAuth_GetSize
10499
#define PHA_WRITE     TLSX_PostHandAuth_Write
10500
#define PHA_PARSE     TLSX_PostHandAuth_Parse
10501
10502
#else
10503
10504
#define PHA_GET_SIZE(a, b)    0
10505
#define PHA_WRITE(a, b, c)    0
10506
#define PHA_PARSE(a, b, c, d) 0
10507
10508
#endif
10509
10510
/******************************************************************************/
10511
/* Early Data Indication                                                      */
10512
/******************************************************************************/
10513
10514
#ifdef WOLFSSL_EARLY_DATA
10515
/* Get the size of the encoded Early Data Indication extension.
10516
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
10517
 *
10518
 * msgType  The type of the message this extension is being written into.
10519
 * returns the number of bytes of the encoded Early Data Indication extension.
10520
 */
10521
static int TLSX_EarlyData_GetSize(byte msgType, word16* pSz)
10522
{
10523
    int ret = 0;
10524
10525
    if (msgType == client_hello || msgType == encrypted_extensions)
10526
        *pSz += 0;
10527
    else if (msgType == session_ticket)
10528
        *pSz += OPAQUE32_LEN;
10529
    else {
10530
        ret = SANITY_MSG_E;
10531
        WOLFSSL_ERROR_VERBOSE(ret);
10532
    }
10533
10534
    return ret;
10535
}
10536
10537
/* Writes the Early Data Indicator extension into the output buffer.
10538
 * Assumes that the the output buffer is big enough to hold data.
10539
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
10540
 *
10541
 * maxSz    The maximum early data size.
10542
 * output   The buffer to write into.
10543
 * msgType  The type of the message this extension is being written into.
10544
 * returns the number of bytes written into the buffer.
10545
 */
10546
static int TLSX_EarlyData_Write(word32 maxSz, byte* output, byte msgType,
10547
                                word16* pSz)
10548
{
10549
    if (msgType == client_hello || msgType == encrypted_extensions)
10550
        return 0;
10551
    else if (msgType == session_ticket) {
10552
        c32toa(maxSz, output);
10553
        *pSz += OPAQUE32_LEN;
10554
        return 0;
10555
    }
10556
10557
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10558
    return SANITY_MSG_E;
10559
}
10560
10561
/* Parse the Early Data Indicator extension.
10562
 * In messages: ClientHello, EncryptedExtensions and NewSessionTicket.
10563
 *
10564
 * ssl      The SSL/TLS object.
10565
 * input    The extension data.
10566
 * length   The length of the extension data.
10567
 * msgType  The type of the message this extension is being parsed from.
10568
 * returns 0 on success and other values indicate failure.
10569
 */
10570
static int TLSX_EarlyData_Parse(WOLFSSL* ssl, const byte* input, word16 length,
10571
                                 byte msgType)
10572
{
10573
    WOLFSSL_ENTER("TLSX_EarlyData_Parse");
10574
    if (msgType == client_hello) {
10575
        if (length != 0)
10576
            return BUFFER_E;
10577
10578
        if (ssl->earlyData == expecting_early_data) {
10579
10580
            if (ssl->options.maxEarlyDataSz != 0)
10581
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
10582
            else
10583
                ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_REJECTED;
10584
10585
            return TLSX_EarlyData_Use(ssl, 0, 0);
10586
        }
10587
        ssl->earlyData = early_data_ext;
10588
10589
        return 0;
10590
    }
10591
    if (msgType == encrypted_extensions) {
10592
        if (length != 0)
10593
            return BUFFER_E;
10594
10595
        /* Ensure the index of PSK identity chosen by server is 0.
10596
         * Index is plus one to handle 'not set' value of 0.
10597
         */
10598
        if (ssl->options.pskIdIndex != 1) {
10599
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
10600
            return PSK_KEY_ERROR;
10601
        }
10602
10603
        if (ssl->options.side == WOLFSSL_CLIENT_END) {
10604
            /* the extension from server comes in */
10605
            ssl->earlyDataStatus = WOLFSSL_EARLY_DATA_ACCEPTED;
10606
        }
10607
10608
        return TLSX_EarlyData_Use(ssl, 1, 1);
10609
    }
10610
    if (msgType == session_ticket) {
10611
        word32 maxSz;
10612
10613
        if (length != OPAQUE32_LEN)
10614
            return BUFFER_E;
10615
        ato32(input, &maxSz);
10616
10617
        ssl->session->maxEarlyDataSz = maxSz;
10618
        return 0;
10619
    }
10620
10621
    WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E);
10622
    return SANITY_MSG_E;
10623
}
10624
10625
/* Use the data to create a new Early Data object in the extensions.
10626
 *
10627
 * ssl    The SSL/TLS object.
10628
 * maxSz  The maximum early data size.
10629
 * is_response   if this extension is part of a response
10630
 * returns 0 on success and other values indicate failure.
10631
 */
10632
int TLSX_EarlyData_Use(WOLFSSL* ssl, word32 maxSz, int is_response)
10633
{
10634
    int   ret = 0;
10635
    TLSX* extension;
10636
10637
    /* Find the early data extension if it exists. */
10638
    extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
10639
    if (extension == NULL) {
10640
        /* Push new early data extension. */
10641
        ret = TLSX_Push(&ssl->extensions, TLSX_EARLY_DATA, NULL, ssl->heap);
10642
        if (ret != 0)
10643
            return ret;
10644
10645
        extension = TLSX_Find(ssl->extensions, TLSX_EARLY_DATA);
10646
        if (extension == NULL)
10647
            return MEMORY_E;
10648
    }
10649
10650
    extension->resp = is_response;
10651
    /* In QUIC, earlydata size is either 0 or 0xffffffff.
10652
     * Override any size between, possibly left from our initial value */
10653
    extension->val  = (WOLFSSL_IS_QUIC(ssl) && is_response && maxSz > 0) ?
10654
                       WOLFSSL_MAX_32BIT : maxSz;
10655
10656
    return 0;
10657
}
10658
10659
#define EDI_GET_SIZE  TLSX_EarlyData_GetSize
10660
#define EDI_WRITE     TLSX_EarlyData_Write
10661
#define EDI_PARSE     TLSX_EarlyData_Parse
10662
10663
#else
10664
10665
#define EDI_GET_SIZE(a, b)    0
10666
#define EDI_WRITE(a, b, c, d) 0
10667
#define EDI_PARSE(a, b, c, d) 0
10668
10669
#endif
10670
10671
/******************************************************************************/
10672
/* QUIC transport parameter extension                                         */
10673
/******************************************************************************/
10674
#ifdef WOLFSSL_QUIC
10675
10676
static word16 TLSX_QuicTP_GetSize(TLSX* extension)
10677
{
10678
    const QuicTransportParam *tp = (QuicTransportParam*)extension->data;
10679
10680
    return tp ? tp->len : 0;
10681
}
10682
10683
int TLSX_QuicTP_Use(WOLFSSL* ssl, TLSX_Type ext_type, int is_response)
10684
{
10685
    int ret = 0;
10686
    TLSX* extension;
10687
10688
    WOLFSSL_ENTER("TLSX_QuicTP_Use");
10689
    if (ssl->quic.transport_local == NULL) {
10690
        /* RFC9000, ch 7.3: "An endpoint MUST treat the absence of [...]
10691
         *     from either endpoint [...] as a connection error of type
10692
         *     TRANSPORT_PARAMETER_ERROR."
10693
         */
10694
        ret = QUIC_TP_MISSING_E;
10695
        goto cleanup;
10696
    }
10697
10698
    extension = TLSX_Find(ssl->extensions, ext_type);
10699
    if (extension == NULL) {
10700
        ret = TLSX_Push(&ssl->extensions, ext_type, NULL, ssl->heap);
10701
        if (ret != 0)
10702
            goto cleanup;
10703
10704
        extension = TLSX_Find(ssl->extensions, ext_type);
10705
        if (extension == NULL) {
10706
            ret = MEMORY_E;
10707
            goto cleanup;
10708
        }
10709
    }
10710
    if (extension->data) {
10711
        QuicTransportParam_free((QuicTransportParam*)extension->data, ssl->heap);
10712
        extension->data = NULL;
10713
    }
10714
    extension->resp = is_response;
10715
    extension->data = (void*)QuicTransportParam_dup(ssl->quic.transport_local, ssl->heap);
10716
    if (!extension->data) {
10717
        ret = MEMORY_E;
10718
        goto cleanup;
10719
    }
10720
10721
cleanup:
10722
    WOLFSSL_LEAVE("TLSX_QuicTP_Use", ret);
10723
    return ret;
10724
}
10725
10726
static word16 TLSX_QuicTP_Write(QuicTransportParam *tp, byte* output)
10727
{
10728
    word16 len = 0;
10729
10730
    WOLFSSL_ENTER("TLSX_QuicTP_Write");
10731
    if (tp && tp->len) {
10732
        XMEMCPY(output, tp->data, tp->len);
10733
        len = tp->len;
10734
    }
10735
    WOLFSSL_LEAVE("TLSX_QuicTP_Write", len);
10736
    return len;
10737
}
10738
10739
static int TLSX_QuicTP_Parse(WOLFSSL *ssl, const byte *input, size_t len, int ext_type, int msgType)
10740
{
10741
    const QuicTransportParam *tp, **ptp;
10742
10743
    (void)msgType;
10744
    tp = QuicTransportParam_new(input, len, ssl->heap);
10745
    if (!tp) {
10746
        return MEMORY_E;
10747
    }
10748
    ptp = (ext_type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT) ?
10749
        &ssl->quic.transport_peer_draft : &ssl->quic.transport_peer;
10750
    if (*ptp) {
10751
        QTP_FREE(*ptp, ssl->heap);
10752
    }
10753
    *ptp = tp;
10754
    return 0;
10755
}
10756
10757
#define QTP_GET_SIZE    TLSX_QuicTP_GetSize
10758
#define QTP_USE         TLSX_QuicTP_Use
10759
#define QTP_WRITE       TLSX_QuicTP_Write
10760
#define QTP_PARSE       TLSX_QuicTP_Parse
10761
10762
#endif /* WOLFSSL_QUIC */
10763
10764
#if defined(WOLFSSL_DTLS_CID)
10765
#define CID_GET_SIZE  TLSX_ConnectionID_GetSize
10766
#define CID_WRITE  TLSX_ConnectionID_Write
10767
#define CID_PARSE  TLSX_ConnectionID_Parse
10768
#define CID_FREE  TLSX_ConnectionID_Free
10769
#else
10770
#define CID_GET_SIZE(a) 0
10771
#define CID_WRITE(a, b) 0
10772
#define CID_PARSE(a, b, c, d) 0
10773
#define CID_FREE(a, b) 0
10774
#endif /* defined(WOLFSSL_DTLS_CID) */
10775
10776
#if defined(HAVE_RPK)
10777
/******************************************************************************/
10778
/* Client_Certificate_Type extension                                          */
10779
/******************************************************************************/
10780
/* return 1 if specified type is included in the given list, otherwise 0 */
10781
static int IsCertTypeListed(byte type, byte cnt, const byte* list)
10782
{
10783
    int ret = 0;
10784
    int i;
10785
10786
    if (cnt == 0 || list == NULL)
10787
        return ret;
10788
10789
    if (cnt > 0 && cnt <= MAX_CLIENT_CERT_TYPE_CNT) {
10790
        for (i = 0; i < cnt; i++) {
10791
            if (list[i] == type)
10792
                return 1;
10793
        }
10794
    }
10795
    return 0;
10796
}
10797
10798
/* Search both arrays from above to find a common value between the two given
10799
 * arrays(a and b). return 1 if it finds a common value, otherwise return 0.
10800
 */
10801
static int GetCommonItem(const byte* a, byte aLen, const byte* b, byte bLen,
10802
                                                                    byte* type)
10803
{
10804
    int i, j;
10805
10806
    if (a == NULL || b == NULL)
10807
        return 0;
10808
10809
    for (i = 0; i < aLen; i++) {
10810
        for (j = 0; j < bLen; j++) {
10811
            if (a[i] == b[j]) {
10812
                *type = a[i];
10813
                return 1;
10814
            }
10815
        }
10816
    }
10817
    return 0;
10818
}
10819
10820
/* Creates a "client certificate type" extension if necessary.
10821
 * Returns 0 if no error occurred, negative value otherwise.
10822
 * A return of 0, it does not indicae that the extension was created.
10823
 */
10824
static int TLSX_ClientCertificateType_Use(WOLFSSL* ssl, byte isServer)
10825
{
10826
    int ret = 0;
10827
10828
    if (ssl == NULL)
10829
        return BAD_FUNC_ARG;
10830
10831
    if (isServer) {
10832
        /* [in server side]
10833
         */
10834
10835
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
10836
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
10837
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
10838
10839
            WOLFSSL_MSG("Adding Client Certificate Type extension");
10840
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
10841
                                                                    ssl->heap);
10842
            if (ret == 0) {
10843
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
10844
            }
10845
        }
10846
    }
10847
    else {
10848
        /* [in client side]
10849
         * This extension MUST be omitted from the ClientHello unless the RPK
10850
         * certificate is preferred by the user and actually loaded.
10851
         */
10852
10853
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
10854
                        ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
10855
                        ssl->options.rpkConfig.preferred_ClientCertTypes)) {
10856
10857
            if (ssl->options.rpkState.isRPKLoaded) {
10858
10859
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
10860
                ssl->options.rpkState.sending_ClientCertTypes[0] =
10861
                                                        WOLFSSL_CERT_TYPE_RPK;
10862
10863
                /* Push new client_certificate_type extension. */
10864
                WOLFSSL_MSG("Adding Client Certificate Type extension");
10865
                ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE,
10866
                                                                ssl, ssl->heap);
10867
            }
10868
            else {
10869
                WOLFSSL_MSG("Willing to use RPK cert but not loaded it");
10870
            }
10871
        }
10872
        else {
10873
            WOLFSSL_MSG("No will to use RPK cert");
10874
        }
10875
    }
10876
    return ret;
10877
}
10878
10879
/* Parse a "client certificate type" extension received from peer.
10880
 * returns 0 on success and other values indicate failure.
10881
 */
10882
static int TLSX_ClientCertificateType_Parse(WOLFSSL* ssl, const byte* input,
10883
                                                word16 length, byte msgType)
10884
{
10885
    byte typeCnt;
10886
    int idx = 0;
10887
    int ret = 0;
10888
    int i;
10889
    int populate = 0;
10890
    byte  cmnType;
10891
10892
10893
    if (msgType == client_hello) {
10894
        /* [parse ClientHello in server end]
10895
         * case 1) if peer verify is disabled, this extension must be omitted
10896
         *         from ServerHello.
10897
         * case 2) if user have not set his preference, find X509 in parsed
10898
         *         result, then populate "Client Certificate Type" extension.
10899
         * case 3) if user have not set his preference and X509 isn't included
10900
         *         in parsed result, send "unsupported certificate" alert.
10901
         * case 4) if user have set his preference, find a common cert type
10902
         *         in users preference and received cert types.
10903
         * case 5) if user have set his preference, but no common cert type
10904
         *         found.
10905
         */
10906
10907
        /* case 1 */
10908
        if (ssl->options.verifyNone) {
10909
            return ret;
10910
        }
10911
10912
        /* parse extension */
10913
        if (length < OPAQUE8_LEN)
10914
            return BUFFER_E;
10915
10916
        typeCnt = input[idx];
10917
10918
        if (typeCnt > MAX_CLIENT_CERT_TYPE_CNT)
10919
            return BUFFER_E;
10920
10921
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
10922
            return BUFFER_E;
10923
        }
10924
10925
        ssl->options.rpkState.received_ClientCertTypeCnt = input[idx];
10926
        idx += OPAQUE8_LEN;
10927
10928
        for (i = 0; i < typeCnt; i++) {
10929
            ssl->options.rpkState.received_ClientCertTypes[i] = input[idx];
10930
            idx += OPAQUE8_LEN;
10931
        }
10932
10933
        if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt == 0) {
10934
            /* case 2 */
10935
            if (IsCertTypeListed(WOLFSSL_CERT_TYPE_X509,
10936
                            ssl->options.rpkState.received_ClientCertTypeCnt,
10937
                            ssl->options.rpkState.received_ClientCertTypes)) {
10938
10939
                ssl->options.rpkState.sending_ClientCertTypeCnt = 1;
10940
                ssl->options.rpkState.sending_ClientCertTypes[0] =
10941
                                                        WOLFSSL_CERT_TYPE_X509;
10942
                populate = 1;
10943
            }
10944
            /* case 3 */
10945
            else {
10946
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
10947
                SendAlert(ssl, alert_fatal, unsupported_certificate);
10948
                return UNSUPPORTED_CERTIFICATE;
10949
            }
10950
        }
10951
        else if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt > 0) {
10952
            /* case 4 */
10953
            if (GetCommonItem(
10954
                            ssl->options.rpkConfig.preferred_ClientCertTypes,
10955
                            ssl->options.rpkConfig.preferred_ClientCertTypeCnt,
10956
                            ssl->options.rpkState.received_ClientCertTypes,
10957
                            ssl->options.rpkState.received_ClientCertTypeCnt,
10958
                            &cmnType)) {
10959
                ssl->options.rpkState.sending_ClientCertTypeCnt  = 1;
10960
                ssl->options.rpkState.sending_ClientCertTypes[0] = cmnType;
10961
                populate = 1;
10962
            }
10963
            /* case 5 */
10964
            else {
10965
                WOLFSSL_MSG("No common cert type found in client_certificate_type ext");
10966
                SendAlert(ssl, alert_fatal, unsupported_certificate);
10967
                return UNSUPPORTED_CERTIFICATE;
10968
            }
10969
        }
10970
10971
        /* populate client_certificate_type extension */
10972
        if (populate) {
10973
            WOLFSSL_MSG("Adding Client Certificate Type extension");
10974
            ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl,
10975
                                                                    ssl->heap);
10976
            if (ret == 0) {
10977
                TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE);
10978
            }
10979
        }
10980
    }
10981
    else if (msgType == server_hello || msgType == encrypted_extensions) {
10982
        /* parse it in client side */
10983
        if (length == 1) {
10984
            ssl->options.rpkState.received_ClientCertTypeCnt  = 1;
10985
            ssl->options.rpkState.received_ClientCertTypes[0] = *input;
10986
        }
10987
        else {
10988
            return BUFFER_E;
10989
        }
10990
    }
10991
10992
    return ret;
10993
}
10994
10995
/* Write out the "client certificate type" extension data into the given buffer.
10996
 * return the size wrote in the buffer on success, negative value on error.
10997
 */
10998
static word16 TLSX_ClientCertificateType_Write(void* data, byte* output,
10999
                                              byte msgType)
11000
{
11001
    WOLFSSL* ssl = (WOLFSSL*)data;
11002
    word16 idx = 0;
11003
    byte cnt = 0;
11004
    int i;
11005
11006
    /* skip to write extension if count is zero */
11007
    cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
11008
11009
    if (cnt == 0)
11010
        return 0;
11011
11012
    if (msgType == client_hello) {
11013
        /* client side */
11014
11015
        *(output + idx) = cnt;
11016
        idx += OPAQUE8_LEN;
11017
11018
        for (i = 0; i < cnt; i++) {
11019
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[i];
11020
            idx += OPAQUE8_LEN;
11021
        }
11022
        return idx;
11023
    }
11024
    else if (msgType == server_hello || msgType == encrypted_extensions) {
11025
        /* sever side */
11026
        if (cnt == 1) {
11027
            *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[0];
11028
            idx += OPAQUE8_LEN;
11029
        }
11030
    }
11031
    return idx;
11032
}
11033
11034
/* Calculate then return the size of the "client certificate type" extension
11035
 * data.
11036
 * return the extension data size on success, negative value on error.
11037
*/
11038
static int TLSX_ClientCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
11039
{
11040
    int ret = 0;
11041
    byte cnt;
11042
11043
    if (ssl == NULL)
11044
        return BAD_FUNC_ARG;
11045
11046
    if (msgType == client_hello) {
11047
        /* client side */
11048
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;
11049
        ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
11050
    }
11051
    else if (msgType == server_hello || msgType == encrypted_extensions) {
11052
        /* sever side */
11053
        cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;/* must be one */
11054
        ret = OPAQUE8_LEN;
11055
    }
11056
    else {
11057
        return SANITY_MSG_E;
11058
    }
11059
    return ret;
11060
}
11061
11062
    #define CCT_GET_SIZE  TLSX_ClientCertificateType_GetSize
11063
    #define CCT_WRITE     TLSX_ClientCertificateType_Write
11064
    #define CCT_PARSE     TLSX_ClientCertificateType_Parse
11065
#else
11066
    #define CCT_GET_SIZE(a)  0
11067
    #define CCT_WRITE(a, b)  0
11068
    #define CCT_PARSE(a, b, c, d) 0
11069
#endif /* HAVE_RPK */
11070
11071
#if defined(HAVE_RPK)
11072
/******************************************************************************/
11073
/* Server_Certificate_Type extension                                          */
11074
/******************************************************************************/
11075
/* Creates a "server certificate type" extension if necessary.
11076
 * Returns 0 if no error occurred, negative value otherwise.
11077
 * A return of 0, it does not indicae that the extension was created.
11078
 */
11079
static int TLSX_ServerCertificateType_Use(WOLFSSL* ssl, byte isServer)
11080
{
11081
    int ret = 0;
11082
    byte ctype;
11083
11084
    if (ssl == NULL)
11085
        return BAD_FUNC_ARG;
11086
11087
    if (isServer) {
11088
        /* [in server side] */
11089
        /* find common cert type to both end */
11090
        if (GetCommonItem(
11091
                ssl->options.rpkConfig.preferred_ServerCertTypes,
11092
                ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
11093
                ssl->options.rpkState.received_ServerCertTypes,
11094
                ssl->options.rpkState.received_ServerCertTypeCnt,
11095
                &ctype)) {
11096
            ssl->options.rpkState.sending_ServerCertTypeCnt = 1;
11097
            ssl->options.rpkState.sending_ServerCertTypes[0] = ctype;
11098
11099
            /* Push new server_certificate_type extension. */
11100
            WOLFSSL_MSG("Adding Server Certificate Type extension");
11101
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
11102
                                                                    ssl->heap);
11103
            if (ret == 0) {
11104
                TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
11105
            }
11106
        }
11107
        else {
11108
            /* no common cert type found */
11109
            WOLFSSL_MSG("No common cert type found in server_certificate_type ext");
11110
            SendAlert(ssl, alert_fatal, unsupported_certificate);
11111
            ret = UNSUPPORTED_CERTIFICATE;
11112
        }
11113
    }
11114
    else {
11115
        /* [in client side] */
11116
        if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK,
11117
                            ssl->options.rpkConfig.preferred_ServerCertTypeCnt,
11118
                            ssl->options.rpkConfig.preferred_ServerCertTypes)) {
11119
11120
            ssl->options.rpkState.sending_ServerCertTypeCnt =
11121
                        ssl->options.rpkConfig.preferred_ServerCertTypeCnt;
11122
            XMEMCPY(ssl->options.rpkState.sending_ServerCertTypes,
11123
                    ssl->options.rpkConfig.preferred_ServerCertTypes,
11124
                    ssl->options.rpkConfig.preferred_ServerCertTypeCnt);
11125
11126
            /* Push new server_certificate_type extension. */
11127
            WOLFSSL_MSG("Adding Server Certificate Type extension");
11128
            ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl,
11129
                                                                    ssl->heap);
11130
        }
11131
        else {
11132
            WOLFSSL_MSG("No will to accept RPK cert");
11133
        }
11134
    }
11135
11136
    return ret;
11137
}
11138
11139
/* Parse a "server certificate type" extension received from peer.
11140
 * returns 0 on success and other values indicate failure.
11141
 */
11142
static int TLSX_ServerCertificateType_Parse(WOLFSSL* ssl, const byte* input,
11143
                                                word16 length, byte msgType)
11144
{
11145
    byte typeCnt;
11146
    int idx = 0;
11147
    int ret = 0;
11148
    int i;
11149
11150
    if (msgType == client_hello) {
11151
        /* in server side */
11152
11153
        if (length < OPAQUE8_LEN)
11154
            return BUFFER_E;
11155
11156
        typeCnt = input[idx];
11157
11158
        if (typeCnt > MAX_SERVER_CERT_TYPE_CNT)
11159
            return BUFFER_E;
11160
11161
        if ((typeCnt + 1) * OPAQUE8_LEN != length){
11162
            return BUFFER_E;
11163
        }
11164
        ssl->options.rpkState.received_ServerCertTypeCnt = input[idx];
11165
        idx += OPAQUE8_LEN;
11166
11167
        for (i = 0; i < typeCnt; i++) {
11168
            ssl->options.rpkState.received_ServerCertTypes[i] = input[idx];
11169
            idx += OPAQUE8_LEN;
11170
        }
11171
11172
        ret = TLSX_ServerCertificateType_Use(ssl, 1);
11173
        if (ret == 0) {
11174
            TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE);
11175
        }
11176
    }
11177
    else if (msgType == server_hello || msgType == encrypted_extensions) {
11178
        /* in client side */
11179
        if (length != 1)                     /* length slould be 1 */
11180
            return BUFFER_E;
11181
11182
        ssl->options.rpkState.received_ServerCertTypeCnt  = 1;
11183
        ssl->options.rpkState.received_ServerCertTypes[0] = *input;
11184
    }
11185
11186
    return 0;
11187
}
11188
11189
/* Write out the "server certificate type" extension data into the given buffer.
11190
 * return the size wrote in the buffer on success, negative value on error.
11191
 */
11192
static word16 TLSX_ServerCertificateType_Write(void* data, byte* output,
11193
                                                                byte msgType)
11194
{
11195
    WOLFSSL* ssl = (WOLFSSL*)data;
11196
    word16 idx = 0;
11197
    int cnt = 0;
11198
    int i;
11199
11200
    /* skip to write extension if count is zero */
11201
    cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
11202
11203
    if (cnt == 0)
11204
        return 0;
11205
11206
    if (msgType == client_hello) {
11207
        /* in client side */
11208
11209
        *(output + idx) = cnt;
11210
        idx += OPAQUE8_LEN;
11211
11212
        for (i = 0; i < cnt; i++) {
11213
            *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[i];
11214
            idx += OPAQUE8_LEN;
11215
        }
11216
    }
11217
    else if (msgType == server_hello || msgType == encrypted_extensions) {
11218
        /* in server side */
11219
        /* ensure cnt is one */
11220
        if (cnt != 1)
11221
            return 0;
11222
11223
        *(output + idx) =  ssl->options.rpkState.sending_ServerCertTypes[0];
11224
        idx += OPAQUE8_LEN;
11225
    }
11226
    return idx;
11227
}
11228
11229
/* Calculate then return the size of the "server certificate type" extension
11230
 * data.
11231
 * return the extension data size on success, negative value on error.
11232
*/
11233
static int TLSX_ServerCertificateType_GetSize(WOLFSSL* ssl, byte msgType)
11234
{
11235
    int ret = 0;
11236
    int cnt;
11237
11238
    if (ssl == NULL)
11239
        return BAD_FUNC_ARG;
11240
11241
    if (msgType == client_hello) {
11242
        /* in clent side */
11243
        cnt = ssl->options.rpkState.sending_ServerCertTypeCnt;
11244
        if (cnt > 0) {
11245
            ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN);
11246
        }
11247
    }
11248
    else if (msgType == server_hello || msgType == encrypted_extensions) {
11249
        /* in server side */
11250
        ret = (int)OPAQUE8_LEN;
11251
    }
11252
    else {
11253
        return SANITY_MSG_E;
11254
    }
11255
    return ret;
11256
}
11257
11258
    #define SCT_GET_SIZE  TLSX_ServerCertificateType_GetSize
11259
    #define SCT_WRITE     TLSX_ServerCertificateType_Write
11260
    #define SCT_PARSE     TLSX_ServerCertificateType_Parse
11261
#else
11262
    #define SCT_GET_SIZE(a)  0
11263
    #define SCT_WRITE(a, b)  0
11264
    #define SCT_PARSE(a, b, c, d) 0
11265
#endif /* HAVE_RPK */
11266
11267
/******************************************************************************/
11268
/* TLS Extensions Framework                                                   */
11269
/******************************************************************************/
11270
11271
/** Finds an extension in the provided list. */
11272
TLSX* TLSX_Find(TLSX* list, TLSX_Type type)
11273
0
{
11274
0
    TLSX* extension = list;
11275
11276
0
    while (extension && extension->type != type)
11277
0
        extension = extension->next;
11278
11279
0
    return extension;
11280
0
}
11281
11282
/** Remove an extension. */
11283
void TLSX_Remove(TLSX** list, TLSX_Type type, void* heap)
11284
0
{
11285
0
    TLSX* extension;
11286
0
    TLSX** next;
11287
11288
0
    if (list == NULL)
11289
0
        return;
11290
11291
0
    extension = *list;
11292
0
    next = list;
11293
11294
0
    while (extension && extension->type != type) {
11295
0
        next = &extension->next;
11296
0
        extension = extension->next;
11297
0
    }
11298
11299
0
    if (extension) {
11300
0
        *next = extension->next;
11301
0
        extension->next = NULL;
11302
0
        TLSX_FreeAll(extension, heap);
11303
0
    }
11304
0
}
11305
11306
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
11307
#define GREASE_ECH_SIZE 160
11308
#define MAX_PUBLIC_NAME_SZ 256
11309
#define TLS_INFO_CONST_STRING "tls ech"
11310
#define TLS_INFO_CONST_STRING_SZ 7
11311
11312
/* return status after setting up ech to write a grease ech */
11313
static int TLSX_GreaseECH_Use(TLSX** extensions, void* heap, WC_RNG* rng)
11314
{
11315
    int ret = 0;
11316
    WOLFSSL_ECH* ech;
11317
11318
    if (extensions == NULL)
11319
        return BAD_FUNC_ARG;
11320
11321
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
11322
        DYNAMIC_TYPE_TMP_BUFFER);
11323
11324
    if (ech == NULL)
11325
        return MEMORY_E;
11326
11327
    ForceZero(ech, sizeof(WOLFSSL_ECH));
11328
11329
    ech->state = ECH_WRITE_GREASE;
11330
11331
    /* 0 for outer */
11332
    ech->type = ECH_TYPE_OUTER;
11333
    /* kemId */
11334
    ech->kemId = DHKEM_X25519_HKDF_SHA256;
11335
    /* cipherSuite kdf */
11336
    ech->cipherSuite.kdfId = HKDF_SHA256;
11337
    /* cipherSuite aead */
11338
    ech->cipherSuite.aeadId = HPKE_AES_128_GCM;
11339
11340
    /* random configId */
11341
    ret = wc_RNG_GenerateByte(rng, &(ech->configId));
11342
11343
    /* curve25519 encLen */
11344
    ech->encLen = DHKEM_X25519_ENC_LEN;
11345
11346
    if (ret == 0)
11347
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
11348
11349
    if (ret != 0) {
11350
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
11351
    }
11352
11353
    return ret;
11354
}
11355
11356
/* return status after setting up ech to write real ech */
11357
static int TLSX_ECH_Use(WOLFSSL_EchConfig* echConfig, TLSX** extensions,
11358
    void* heap, WC_RNG* rng)
11359
{
11360
    int ret = 0;
11361
    int suiteIndex;
11362
    WOLFSSL_ECH* ech;
11363
11364
    if (extensions == NULL)
11365
        return BAD_FUNC_ARG;
11366
11367
    /* find a supported cipher suite */
11368
    suiteIndex = EchConfigGetSupportedCipherSuite(echConfig);
11369
11370
    if (suiteIndex < 0)
11371
        return suiteIndex;
11372
11373
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
11374
        DYNAMIC_TYPE_TMP_BUFFER);
11375
11376
    if (ech == NULL)
11377
        return MEMORY_E;
11378
11379
    ForceZero(ech, sizeof(WOLFSSL_ECH));
11380
11381
    ech->state = ECH_WRITE_REAL;
11382
11383
    ech->echConfig = echConfig;
11384
11385
    /* 0 for outer */
11386
    ech->type = ECH_TYPE_OUTER;
11387
    /* kemId */
11388
    ech->kemId = echConfig->kemId;
11389
11390
    /* cipherSuite kdf */
11391
    ech->cipherSuite.kdfId = echConfig->cipherSuites[suiteIndex].kdfId;
11392
    /* cipherSuite aead */
11393
    ech->cipherSuite.aeadId = echConfig->cipherSuites[suiteIndex].aeadId;
11394
    /* configId */
11395
    ech->configId = echConfig->configId;
11396
11397
    /* encLen */
11398
    switch (echConfig->kemId)
11399
    {
11400
        case DHKEM_P256_HKDF_SHA256:
11401
            ech->encLen = DHKEM_P256_ENC_LEN;
11402
            break;
11403
        case DHKEM_P384_HKDF_SHA384:
11404
            ech->encLen = DHKEM_P384_ENC_LEN;
11405
            break;
11406
        case DHKEM_P521_HKDF_SHA512:
11407
            ech->encLen = DHKEM_P521_ENC_LEN;
11408
            break;
11409
        case DHKEM_X25519_HKDF_SHA256:
11410
            ech->encLen = DHKEM_X25519_ENC_LEN;
11411
            break;
11412
        case DHKEM_X448_HKDF_SHA512:
11413
            ech->encLen = DHKEM_X448_ENC_LEN;
11414
            break;
11415
    }
11416
11417
    /* setup hpke */
11418
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
11419
11420
    if (ech->hpke == NULL) {
11421
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
11422
        return MEMORY_E;
11423
    }
11424
11425
    ret = wc_HpkeInit(ech->hpke, ech->kemId, ech->cipherSuite.kdfId,
11426
        ech->cipherSuite.aeadId, heap);
11427
11428
    /* setup the ephemeralKey */
11429
    if (ret == 0)
11430
        ret = wc_HpkeGenerateKeyPair(ech->hpke, &ech->ephemeralKey, rng);
11431
11432
    if (ret == 0)
11433
        ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
11434
11435
    if (ret != 0) {
11436
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
11437
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
11438
    }
11439
11440
    return ret;
11441
}
11442
11443
/* return status after setting up ech to read and decrypt */
11444
static int TLSX_ServerECH_Use(TLSX** extensions, void* heap,
11445
    WOLFSSL_EchConfig* configs)
11446
{
11447
    int ret;
11448
    WOLFSSL_ECH* ech;
11449
    TLSX* echX;
11450
11451
    if (extensions == NULL)
11452
        return BAD_FUNC_ARG;
11453
11454
    /* if we already have ech don't override it */
11455
    echX = TLSX_Find(*extensions, TLSX_ECH);
11456
    if (echX != NULL)
11457
        return 0;
11458
11459
    ech = (WOLFSSL_ECH*)XMALLOC(sizeof(WOLFSSL_ECH), heap,
11460
        DYNAMIC_TYPE_TMP_BUFFER);
11461
11462
    if (ech == NULL)
11463
        return MEMORY_E;
11464
11465
    ForceZero(ech, sizeof(WOLFSSL_ECH));
11466
11467
    ech->state = ECH_WRITE_NONE;
11468
11469
    /* 0 for outer */
11470
    ech->type = ECH_TYPE_OUTER;
11471
11472
    ech->echConfig = configs;
11473
11474
    /* setup the rest of the settings when we receive ech from the client */
11475
    ret = TLSX_Push(extensions, TLSX_ECH, ech, heap);
11476
11477
    if (ret != 0)
11478
        XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
11479
11480
    return ret;
11481
}
11482
11483
/* return length after writing the ech */
11484
static int TLSX_ECH_Write(WOLFSSL_ECH* ech, byte* writeBuf, word16* offset)
11485
{
11486
    int ret = 0;
11487
    int rngRet = -1;
11488
    word32 configsLen = 0;
11489
    void* ephemeralKey = NULL;
11490
    byte* writeBuf_p = writeBuf;
11491
#ifdef WOLFSSL_SMALL_STACK
11492
    Hpke* hpke = NULL;
11493
    WC_RNG* rng = NULL;
11494
#else
11495
    Hpke hpke[1];
11496
    WC_RNG rng[1];
11497
#endif
11498
11499
    WOLFSSL_MSG("TLSX_ECH_Write");
11500
11501
    if (ech->state == ECH_WRITE_NONE || ech->state == ECH_PARSED_INTERNAL)
11502
        return 0;
11503
11504
    if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
11505
        /* get size then write */
11506
        ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen);
11507
11508
        if (ret != LENGTH_ONLY_E)
11509
            return ret;
11510
11511
        ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen);
11512
11513
        if (ret != WOLFSSL_SUCCESS)
11514
            return ret;
11515
11516
        *offset += configsLen;
11517
11518
        return 0;
11519
    }
11520
11521
#ifdef WOLFSSL_SMALL_STACK
11522
    hpke = (Hpke*)XMALLOC(sizeof(Hpke), NULL, DYNAMIC_TYPE_TMP_BUFFER);
11523
11524
    if (hpke == NULL)
11525
        return MEMORY_E;
11526
11527
    rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
11528
11529
    if (rng == NULL) {
11530
        XFREE(hpke, NULL, DYNAMIC_TYPE_RNG);
11531
        return MEMORY_E;
11532
    }
11533
#endif
11534
11535
    /* type */
11536
    *writeBuf_p = ech->type;
11537
    writeBuf_p += sizeof(ech->type);
11538
11539
    /* outer has body, inner does not */
11540
    if (ech->type == ECH_TYPE_OUTER) {
11541
        /* kdfId */
11542
        c16toa(ech->cipherSuite.kdfId, writeBuf_p);
11543
        writeBuf_p += sizeof(ech->cipherSuite.kdfId);
11544
11545
        /* aeadId */
11546
        c16toa(ech->cipherSuite.aeadId, writeBuf_p);
11547
        writeBuf_p += sizeof(ech->cipherSuite.aeadId);
11548
11549
        /* configId */
11550
        *writeBuf_p = ech->configId;
11551
        writeBuf_p += sizeof(ech->configId);
11552
11553
        /* encLen */
11554
        c16toa(ech->encLen, writeBuf_p);
11555
        writeBuf_p += 2;
11556
11557
        if (ech->state == ECH_WRITE_GREASE) {
11558
            /* hpke init */
11559
            ret = wc_HpkeInit(hpke, ech->kemId, ech->cipherSuite.kdfId,
11560
                ech->cipherSuite.aeadId, NULL);
11561
11562
            if (ret == 0)
11563
                rngRet = ret = wc_InitRng(rng);
11564
11565
            /* create the ephemeralKey */
11566
            if (ret == 0)
11567
                ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng);
11568
11569
            /* enc */
11570
            if (ret == 0) {
11571
                ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey, writeBuf_p,
11572
                    &ech->encLen);
11573
                writeBuf_p += ech->encLen;
11574
            }
11575
11576
            if (ret == 0) {
11577
                /* innerClientHelloLen */
11578
                c16toa(GREASE_ECH_SIZE + ((writeBuf_p + 2 - writeBuf) % 32),
11579
                    writeBuf_p);
11580
                writeBuf_p += 2;
11581
11582
                /* innerClientHello */
11583
                ret = wc_RNG_GenerateBlock(rng, writeBuf_p, GREASE_ECH_SIZE +
11584
                    ((writeBuf_p - writeBuf) % 32));
11585
                writeBuf_p += GREASE_ECH_SIZE + ((writeBuf_p - writeBuf) % 32);
11586
            }
11587
11588
            if (rngRet == 0)
11589
                wc_FreeRng(rng);
11590
11591
            if (ephemeralKey != NULL)
11592
                wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap);
11593
        }
11594
        else {
11595
            /* write enc to writeBuf_p */
11596
            ret = wc_HpkeSerializePublicKey(ech->hpke, ech->ephemeralKey,
11597
                writeBuf_p, &ech->encLen);
11598
            writeBuf_p += ech->encLen;
11599
11600
            /* innerClientHelloLen */
11601
            c16toa(ech->innerClientHelloLen, writeBuf_p);
11602
            writeBuf_p += 2;
11603
11604
            /* set payload offset for when we finalize */
11605
            ech->outerClientPayload = writeBuf_p;
11606
11607
            /* write zeros for payload */
11608
            XMEMSET(writeBuf_p, 0, ech->innerClientHelloLen);
11609
            writeBuf_p += ech->innerClientHelloLen;
11610
        }
11611
    }
11612
11613
#ifdef WOLFSSL_SMALL_STACK
11614
    XFREE(hpke, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11615
    XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
11616
#endif
11617
11618
    if (ret == 0)
11619
        *offset += (writeBuf_p - writeBuf);
11620
11621
    return ret;
11622
}
11623
11624
/* return the size needed for the ech extension */
11625
static int TLSX_ECH_GetSize(WOLFSSL_ECH* ech)
11626
{
11627
    int ret;
11628
    word32 size;
11629
11630
    if (ech->state == ECH_WRITE_GREASE) {
11631
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
11632
            sizeof(ech->configId) + sizeof(word16) + ech->encLen +
11633
            sizeof(word16);
11634
11635
        size += GREASE_ECH_SIZE + (size % 32);
11636
    }
11637
    else if (ech->state == ECH_WRITE_NONE ||
11638
        ech->state == ECH_PARSED_INTERNAL) {
11639
        size = 0;
11640
    }
11641
    else if (ech->state == ECH_WRITE_RETRY_CONFIGS) {
11642
        /* get the size of the raw configs */
11643
        ret = GetEchConfigsEx(ech->echConfig, NULL, &size);
11644
11645
        if (ret != LENGTH_ONLY_E)
11646
            return ret;
11647
    }
11648
    else if (ech->type == ECH_TYPE_INNER)
11649
    {
11650
        size = sizeof(ech->type);
11651
    }
11652
    else
11653
    {
11654
        size = sizeof(ech->type) + sizeof(ech->cipherSuite) +
11655
            sizeof(ech->configId) + sizeof(word16) + ech->encLen +
11656
            sizeof(word16) + ech->innerClientHelloLen;
11657
    }
11658
11659
    return (int)size;
11660
}
11661
11662
/* return status after attempting to open the hpke encrypted ech extension, if
11663
 * successful the inner client hello will be stored in
11664
 * ech->innerClientHelloLen */
11665
static int TLSX_ExtractEch(WOLFSSL_ECH* ech, WOLFSSL_EchConfig* echConfig,
11666
    byte* aad, word32 aadLen, void* heap)
11667
{
11668
    int ret = 0;
11669
    int expectedEncLen;
11670
    int i;
11671
    word32 rawConfigLen = 0;
11672
    byte* info = NULL;
11673
    word32 infoLen = 0;
11674
11675
    if (ech == NULL || echConfig == NULL || aad == NULL)
11676
        return BAD_FUNC_ARG;
11677
11678
    /* verify the kem and key len */
11679
    switch (echConfig->kemId)
11680
    {
11681
        case DHKEM_P256_HKDF_SHA256:
11682
            expectedEncLen = DHKEM_P256_ENC_LEN;
11683
            break;
11684
        case DHKEM_P384_HKDF_SHA384:
11685
            expectedEncLen = DHKEM_P384_ENC_LEN;
11686
            break;
11687
        case DHKEM_P521_HKDF_SHA512:
11688
            expectedEncLen = DHKEM_P521_ENC_LEN;
11689
            break;
11690
        case DHKEM_X25519_HKDF_SHA256:
11691
            expectedEncLen = DHKEM_X25519_ENC_LEN;
11692
            break;
11693
        case DHKEM_X448_HKDF_SHA512:
11694
            expectedEncLen = DHKEM_X448_ENC_LEN;
11695
            break;
11696
        default:
11697
            expectedEncLen = 0;
11698
            break;
11699
    }
11700
11701
    if (expectedEncLen != ech->encLen)
11702
        return BAD_FUNC_ARG;
11703
11704
    /* verify the cipher suite */
11705
    for (i = 0; i < echConfig->numCipherSuites; i++) {
11706
        if (echConfig->cipherSuites[i].kdfId == ech->cipherSuite.kdfId &&
11707
            echConfig->cipherSuites[i].aeadId == ech->cipherSuite.aeadId) {
11708
            break;
11709
        }
11710
    }
11711
11712
    if (i >= echConfig->numCipherSuites) {
11713
        return BAD_FUNC_ARG;
11714
    }
11715
11716
    ech->hpke = (Hpke*)XMALLOC(sizeof(Hpke), heap, DYNAMIC_TYPE_TMP_BUFFER);
11717
11718
    if (ech->hpke == NULL)
11719
        return MEMORY_E;
11720
11721
    ret = wc_HpkeInit(ech->hpke, echConfig->kemId, ech->cipherSuite.kdfId,
11722
        ech->cipherSuite.aeadId, heap);
11723
11724
    /* get the rawConfigLen */
11725
    if (ret == 0)
11726
        ret = GetEchConfig(echConfig, NULL, &rawConfigLen);
11727
11728
    if (ret == LENGTH_ONLY_E)
11729
        ret = 0;
11730
11731
    /* create info */
11732
    if (ret == 0) {
11733
        infoLen = TLS_INFO_CONST_STRING_SZ + 1 + rawConfigLen;
11734
        info = (byte*)XMALLOC(infoLen, heap, DYNAMIC_TYPE_TMP_BUFFER);
11735
11736
        if (info == NULL)
11737
            ret = MEMORY_E;
11738
        else {
11739
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING,
11740
                TLS_INFO_CONST_STRING_SZ + 1);
11741
            ret = GetEchConfig(echConfig, info +
11742
                TLS_INFO_CONST_STRING_SZ + 1, &rawConfigLen);
11743
        }
11744
    }
11745
11746
    /* decrypt the ech payload */
11747
    if (ret == 0)
11748
        ret = wc_HpkeOpenBase(ech->hpke, echConfig->receiverPrivkey, ech->enc,
11749
            ech->encLen, info, infoLen, aad, aadLen, ech->outerClientPayload,
11750
            ech->innerClientHelloLen,
11751
            ech->innerClientHello + HANDSHAKE_HEADER_SZ);
11752
11753
    if (ret != 0) {
11754
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
11755
        ech->hpke = NULL;
11756
    }
11757
11758
    if (info != NULL)
11759
        XFREE(info, heap, DYNAMIC_TYPE_TMP_BUFFER);
11760
11761
    return ret;
11762
}
11763
11764
/* parse the ech extension, if internal update ech->state and return, if
11765
 * external attempt to extract the inner client_hello, return the status */
11766
static int TLSX_ECH_Parse(WOLFSSL* ssl, const byte* readBuf, word16 size,
11767
    byte msgType)
11768
{
11769
    int ret = 0;
11770
    int i;
11771
    TLSX* echX;
11772
    WOLFSSL_ECH* ech;
11773
    WOLFSSL_EchConfig* echConfig;
11774
    byte* aadCopy;
11775
    byte* readBuf_p = (byte*)readBuf;
11776
11777
    WOLFSSL_MSG("TLSX_ECH_Parse");
11778
11779
    if (size == 0)
11780
        return BAD_FUNC_ARG;
11781
11782
    if (msgType == encrypted_extensions) {
11783
        ret = wolfSSL_SetEchConfigs(ssl, readBuf, size);
11784
11785
        if (ret == WOLFSSL_SUCCESS)
11786
            ret = 0;
11787
    }
11788
    else if (msgType == client_hello && ssl->ctx->echConfigs != NULL) {
11789
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
11790
11791
        if (echX == NULL)
11792
            return BAD_FUNC_ARG;
11793
11794
        ech = (WOLFSSL_ECH*)echX->data;
11795
11796
        /* read the ech parameters before the payload */
11797
        ech->type = *readBuf_p;
11798
        readBuf_p++;
11799
11800
        if (ech->type == ECH_TYPE_INNER) {
11801
            ech->state = ECH_PARSED_INTERNAL;
11802
            return 0;
11803
        }
11804
11805
        /* technically the payload would only be 1 byte at this length */
11806
        if (size < 11 + ech->encLen)
11807
            return BAD_FUNC_ARG;
11808
11809
        ato16(readBuf_p, &ech->cipherSuite.kdfId);
11810
        readBuf_p += 2;
11811
11812
        ato16(readBuf_p, &ech->cipherSuite.aeadId);
11813
        readBuf_p += 2;
11814
11815
        ech->configId = *readBuf_p;
11816
        readBuf_p++;
11817
11818
        ato16(readBuf_p, &ech->encLen);
11819
        readBuf_p += 2;
11820
11821
        if (ech->encLen > HPKE_Npk_MAX)
11822
            return BAD_FUNC_ARG;
11823
11824
        XMEMCPY(ech->enc, readBuf_p, ech->encLen);
11825
        readBuf_p += ech->encLen;
11826
11827
        ato16(readBuf_p, &ech->innerClientHelloLen);
11828
        ech->innerClientHelloLen -= AES_BLOCK_SIZE;
11829
        readBuf_p += 2;
11830
11831
        ech->outerClientPayload = readBuf_p;
11832
11833
        /* make a copy of the aad */
11834
        aadCopy = (byte*)XMALLOC(ech->aadLen, ssl->heap,
11835
            DYNAMIC_TYPE_TMP_BUFFER);
11836
11837
        if (aadCopy == NULL)
11838
            return MEMORY_E;
11839
11840
        XMEMCPY(aadCopy, ech->aad, ech->aadLen);
11841
11842
        /* set the ech payload of the copy to zeros */
11843
        XMEMSET(aadCopy + (readBuf_p - ech->aad), 0,
11844
            ech->innerClientHelloLen + AES_BLOCK_SIZE);
11845
11846
        /* allocate the inner payload buffer */
11847
        ech->innerClientHello =
11848
            (byte*)XMALLOC(ech->innerClientHelloLen + HANDSHAKE_HEADER_SZ,
11849
            ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
11850
11851
        if (ech->innerClientHello == NULL) {
11852
            XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
11853
            return MEMORY_E;
11854
        }
11855
11856
        /* first check if the config id matches */
11857
        echConfig = ssl->ctx->echConfigs;
11858
11859
        while (echConfig != NULL) {
11860
            /* decrypt with this config */
11861
            if (echConfig->configId == ech->configId) {
11862
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
11863
                    ssl->heap);
11864
                break;
11865
            }
11866
11867
            echConfig = echConfig->next;
11868
        }
11869
11870
        /* try to decrypt with all configs */
11871
        if (echConfig == NULL || ret != 0) {
11872
            echConfig = ssl->ctx->echConfigs;
11873
11874
            while (echConfig != NULL) {
11875
                ret = TLSX_ExtractEch(ech, echConfig, aadCopy, ech->aadLen,
11876
                    ssl->heap);
11877
11878
                if (ret== 0)
11879
                    break;
11880
11881
                echConfig = echConfig->next;
11882
            }
11883
        }
11884
11885
        /* if we failed to extract */
11886
        if (ret != 0) {
11887
            XFREE(ech->innerClientHello, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
11888
            ech->innerClientHello = NULL;
11889
            ech->state = ECH_WRITE_RETRY_CONFIGS;
11890
        }
11891
        else {
11892
            i = 0;
11893
11894
            /* decrement until before the padding */
11895
            while (ech->innerClientHello[ech->innerClientHelloLen +
11896
                HANDSHAKE_HEADER_SZ - i - 1] != ECH_TYPE_INNER) {
11897
                i++;
11898
            }
11899
11900
            /* subtract the length of the padding from the length */
11901
            ech->innerClientHelloLen -= i;
11902
        }
11903
11904
        XFREE(aadCopy, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
11905
11906
        return 0;
11907
    }
11908
11909
    return ret;
11910
}
11911
11912
/* free the ech struct and the dynamic buffer it uses */
11913
static void TLSX_ECH_Free(WOLFSSL_ECH* ech, void* heap)
11914
{
11915
    if (ech->innerClientHello != NULL)
11916
        XFREE(ech->innerClientHello, heap, DYNAMIC_TYPE_TMP_BUFFER);
11917
    if (ech->ephemeralKey != NULL)
11918
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, ech->ephemeralKey,
11919
            ech->hpke->heap);
11920
    if (ech->hpke != NULL)
11921
        XFREE(ech->hpke, heap, DYNAMIC_TYPE_TMP_BUFFER);
11922
11923
    XFREE(ech, heap, DYNAMIC_TYPE_TMP_BUFFER);
11924
    (void)heap;
11925
}
11926
11927
/* encrypt the client hello and store it in ech->outerClientPayload, return
11928
 * status */
11929
int TLSX_FinalizeEch(WOLFSSL_ECH* ech, byte* aad, word32 aadLen)
11930
{
11931
    int ret;
11932
    void* receiverPubkey = NULL;
11933
    byte* info;
11934
    int infoLen;
11935
    byte* aadCopy;
11936
11937
    /* import the server public key */
11938
    ret = wc_HpkeDeserializePublicKey(ech->hpke, &receiverPubkey,
11939
        ech->echConfig->receiverPubkey, ech->encLen);
11940
11941
    if (ret == 0) {
11942
        /* create info */
11943
        infoLen = TLS_INFO_CONST_STRING_SZ + 1 + ech->echConfig->rawLen;
11944
        info = (byte*)XMALLOC(infoLen, ech->hpke->heap,
11945
            DYNAMIC_TYPE_TMP_BUFFER);
11946
        if (info == NULL)
11947
            ret = MEMORY_E;
11948
11949
        if (ret == 0) {
11950
            /* puts the null byte in for me */
11951
            XMEMCPY(info, (byte*)TLS_INFO_CONST_STRING, TLS_INFO_CONST_STRING_SZ
11952
                + 1);
11953
            XMEMCPY(info + TLS_INFO_CONST_STRING_SZ + 1, ech->echConfig->raw,
11954
                ech->echConfig->rawLen);
11955
11956
            /* make a copy of the aad since we overwrite it */
11957
            aadCopy = (byte*)XMALLOC(aadLen, ech->hpke->heap,
11958
                DYNAMIC_TYPE_TMP_BUFFER);
11959
            if (aadCopy == NULL) {
11960
                XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
11961
                ret = MEMORY_E;
11962
            }
11963
        }
11964
11965
        if (ret == 0) {
11966
            XMEMCPY(aadCopy, aad, aadLen);
11967
11968
            /* seal the payload */
11969
            ret = wc_HpkeSealBase(ech->hpke, ech->ephemeralKey, receiverPubkey,
11970
                info, infoLen, aadCopy, aadLen, ech->innerClientHello,
11971
                ech->innerClientHelloLen - ech->hpke->Nt,
11972
                ech->outerClientPayload);
11973
11974
            XFREE(info, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
11975
            XFREE(aadCopy, ech->hpke->heap, DYNAMIC_TYPE_TMP_BUFFER);
11976
        }
11977
    }
11978
11979
    if (receiverPubkey != NULL)
11980
        wc_HpkeFreeKey(ech->hpke, ech->hpke->kem, receiverPubkey,
11981
            ech->hpke->heap);
11982
11983
    return ret;
11984
}
11985
11986
#define GREASE_ECH_USE TLSX_GreaseECH_Use
11987
#define ECH_USE TLSX_ECH_Use
11988
#define SERVER_ECH_USE TLSX_ServerECH_Use
11989
#define ECH_WRITE TLSX_ECH_Write
11990
#define ECH_GET_SIZE TLSX_ECH_GetSize
11991
#define ECH_PARSE TLSX_ECH_Parse
11992
#define ECH_FREE TLSX_ECH_Free
11993
11994
#endif
11995
11996
/** Releases all extensions in the provided list. */
11997
void TLSX_FreeAll(TLSX* list, void* heap)
11998
0
{
11999
0
    TLSX* extension;
12000
12001
0
    while ((extension = list)) {
12002
0
        list = extension->next;
12003
12004
0
        switch (extension->type) {
12005
12006
#if defined(HAVE_RPK)
12007
            case TLSX_CLIENT_CERTIFICATE_TYPE:
12008
                WOLFSSL_MSG("Client Certificate Type extension free");
12009
                /* nothing to do */
12010
                break;
12011
            case TLSX_SERVER_CERTIFICATE_TYPE:
12012
                WOLFSSL_MSG("Server Certificate Type extension free");
12013
                /* nothing to do */
12014
                break;
12015
#endif
12016
12017
0
#ifdef HAVE_SNI
12018
0
            case TLSX_SERVER_NAME:
12019
0
                WOLFSSL_MSG("SNI extension free");
12020
0
                SNI_FREE_ALL((SNI*)extension->data, heap);
12021
0
                break;
12022
0
#endif
12023
12024
0
            case TLSX_TRUSTED_CA_KEYS:
12025
0
                WOLFSSL_MSG("Trusted CA Indication extension free");
12026
0
                TCA_FREE_ALL((TCA*)extension->data, heap);
12027
0
                break;
12028
12029
0
            case TLSX_MAX_FRAGMENT_LENGTH:
12030
0
                WOLFSSL_MSG("Max Fragment Length extension free");
12031
0
                MFL_FREE_ALL(extension->data, heap);
12032
0
                break;
12033
12034
0
            case TLSX_EXTENDED_MASTER_SECRET:
12035
0
                WOLFSSL_MSG("Extended Master Secret free");
12036
                /* Nothing to do. */
12037
0
                break;
12038
0
            case TLSX_TRUNCATED_HMAC:
12039
0
                WOLFSSL_MSG("Truncated HMAC extension free");
12040
                /* Nothing to do. */
12041
0
                break;
12042
12043
0
            case TLSX_SUPPORTED_GROUPS:
12044
0
                WOLFSSL_MSG("Supported Groups extension free");
12045
0
                EC_FREE_ALL((SupportedCurve*)extension->data, heap);
12046
0
                break;
12047
12048
0
            case TLSX_EC_POINT_FORMATS:
12049
0
                WOLFSSL_MSG("Point Formats extension free");
12050
0
                PF_FREE_ALL((PointFormat*)extension->data, heap);
12051
0
                break;
12052
12053
0
            case TLSX_STATUS_REQUEST:
12054
0
                WOLFSSL_MSG("Certificate Status Request extension free");
12055
0
                CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap);
12056
0
                break;
12057
12058
0
            case TLSX_STATUS_REQUEST_V2:
12059
0
                WOLFSSL_MSG("Certificate Status Request v2 extension free");
12060
0
                CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data,
12061
0
                        heap);
12062
0
                break;
12063
12064
0
            case TLSX_RENEGOTIATION_INFO:
12065
0
                WOLFSSL_MSG("Secure Renegotiation extension free");
12066
0
                SCR_FREE_ALL(extension->data, heap);
12067
0
                break;
12068
12069
0
            case TLSX_SESSION_TICKET:
12070
0
                WOLFSSL_MSG("Session Ticket extension free");
12071
0
                WOLF_STK_FREE(extension->data, heap);
12072
0
                break;
12073
12074
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
12075
0
                WOLFSSL_MSG("ALPN extension free");
12076
0
                ALPN_FREE_ALL((ALPN*)extension->data, heap);
12077
0
                break;
12078
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12079
0
            case TLSX_SIGNATURE_ALGORITHMS:
12080
0
                WOLFSSL_MSG("Signature Algorithms extension to free");
12081
0
                SA_FREE_ALL((SignatureAlgorithms*)extension->data, heap);
12082
0
                break;
12083
0
#endif
12084
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
12085
0
            case TLSX_ENCRYPT_THEN_MAC:
12086
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension free");
12087
0
                break;
12088
0
#endif
12089
0
#ifdef WOLFSSL_TLS13
12090
0
            case TLSX_SUPPORTED_VERSIONS:
12091
0
                WOLFSSL_MSG("Supported Versions extension free");
12092
0
                break;
12093
12094
    #ifdef WOLFSSL_SEND_HRR_COOKIE
12095
            case TLSX_COOKIE:
12096
                WOLFSSL_MSG("Cookie extension free");
12097
                CKE_FREE_ALL((Cookie*)extension->data, heap);
12098
                break;
12099
    #endif
12100
12101
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12102
            case TLSX_PRE_SHARED_KEY:
12103
                WOLFSSL_MSG("Pre-Shared Key extension free");
12104
                PSK_FREE_ALL((PreSharedKey*)extension->data, heap);
12105
                break;
12106
12107
            case TLSX_PSK_KEY_EXCHANGE_MODES:
12108
                WOLFSSL_MSG("PSK Key Exchange Modes extension free");
12109
                break;
12110
    #endif
12111
12112
    #ifdef WOLFSSL_EARLY_DATA
12113
            case TLSX_EARLY_DATA:
12114
                WOLFSSL_MSG("Early Data extension free");
12115
                break;
12116
    #endif
12117
12118
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
12119
            case TLSX_POST_HANDSHAKE_AUTH:
12120
                WOLFSSL_MSG("Post-Handshake Authentication extension free");
12121
                break;
12122
    #endif
12123
12124
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12125
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
12126
0
                WOLFSSL_MSG("Signature Algorithms extension free");
12127
0
                break;
12128
0
    #endif
12129
12130
0
            case TLSX_KEY_SHARE:
12131
0
                WOLFSSL_MSG("Key Share extension free");
12132
0
                KS_FREE_ALL((KeyShareEntry*)extension->data, heap);
12133
0
                break;
12134
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
12135
            case TLSX_CERTIFICATE_AUTHORITIES:
12136
                WOLFSSL_MSG("Certificate Authorities extension free");
12137
                break;
12138
    #endif
12139
0
#endif
12140
#ifdef WOLFSSL_SRTP
12141
            case TLSX_USE_SRTP:
12142
                WOLFSSL_MSG("SRTP extension free");
12143
                SRTP_FREE((TlsxSrtp*)extension->data, heap);
12144
                break;
12145
#endif
12146
12147
    #ifdef WOLFSSL_QUIC
12148
            case TLSX_KEY_QUIC_TP_PARAMS:
12149
                FALL_THROUGH;
12150
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
12151
                WOLFSSL_MSG("QUIC transport parameter free");
12152
                QTP_FREE((QuicTransportParam*)extension->data, heap);
12153
                break;
12154
    #endif
12155
12156
#ifdef WOLFSSL_DTLS_CID
12157
            case TLSX_CONNECTION_ID:
12158
                WOLFSSL_MSG("Connection ID extension free");
12159
                CID_FREE((byte*)extension->data, heap);
12160
                break;
12161
#endif /* WOLFSSL_DTLS_CID */
12162
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
12163
            case TLSX_ECH:
12164
                WOLFSSL_MSG("ECH extension free");
12165
                ECH_FREE((WOLFSSL_ECH*)extension->data, heap);
12166
                break;
12167
#endif
12168
0
            default:
12169
0
                break;
12170
0
        }
12171
12172
0
        XFREE(extension, heap, DYNAMIC_TYPE_TLSX);
12173
0
    }
12174
12175
0
    (void)heap;
12176
0
}
12177
12178
/** Checks if the tls extensions are supported based on the protocol version. */
12179
0
int TLSX_SupportExtensions(WOLFSSL* ssl) {
12180
0
    return ssl && (IsTLS(ssl) || ssl->version.major == DTLS_MAJOR);
12181
0
}
12182
12183
/** Tells the buffered size of the extensions in a list. */
12184
static int TLSX_GetSize(TLSX* list, byte* semaphore, byte msgType,
12185
                        word16* pLength)
12186
0
{
12187
0
    int    ret = 0;
12188
0
    TLSX*  extension;
12189
0
    word16 length = 0;
12190
0
    byte   isRequest = (msgType == client_hello ||
12191
0
                        msgType == certificate_request);
12192
12193
0
    while ((extension = list)) {
12194
0
        list = extension->next;
12195
12196
        /* only extensions marked as response are sent back to the client. */
12197
0
        if (!isRequest && !extension->resp)
12198
0
            continue; /* skip! */
12199
12200
        /* ssl level extensions are expected to override ctx level ones. */
12201
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore(extension->type)))
12202
0
            continue; /* skip! */
12203
12204
        /* extension type + extension data length. */
12205
0
        length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
12206
12207
0
        switch (extension->type) {
12208
12209
0
#ifdef HAVE_SNI
12210
0
            case TLSX_SERVER_NAME:
12211
                /* SNI only sends the name on the request. */
12212
0
                if (isRequest)
12213
0
                    length += SNI_GET_SIZE((SNI*)extension->data);
12214
0
                break;
12215
0
#endif
12216
12217
0
            case TLSX_TRUSTED_CA_KEYS:
12218
                /* TCA only sends the list on the request. */
12219
0
                if (isRequest)
12220
0
                    length += TCA_GET_SIZE((TCA*)extension->data);
12221
0
                break;
12222
12223
0
            case TLSX_MAX_FRAGMENT_LENGTH:
12224
0
                length += MFL_GET_SIZE(extension->data);
12225
0
                break;
12226
12227
0
            case TLSX_EXTENDED_MASTER_SECRET:
12228
0
            case TLSX_TRUNCATED_HMAC:
12229
                /* always empty. */
12230
0
                break;
12231
12232
0
            case TLSX_SUPPORTED_GROUPS:
12233
0
                length += EC_GET_SIZE((SupportedCurve*)extension->data);
12234
0
                break;
12235
12236
0
            case TLSX_EC_POINT_FORMATS:
12237
0
                length += PF_GET_SIZE((PointFormat*)extension->data);
12238
0
                break;
12239
12240
0
            case TLSX_STATUS_REQUEST:
12241
0
                length += CSR_GET_SIZE(
12242
0
                         (CertificateStatusRequest*)extension->data, isRequest);
12243
0
                break;
12244
12245
0
            case TLSX_STATUS_REQUEST_V2:
12246
0
                length += CSR2_GET_SIZE(
12247
0
                        (CertificateStatusRequestItemV2*)extension->data,
12248
0
                        isRequest);
12249
0
                break;
12250
12251
0
            case TLSX_RENEGOTIATION_INFO:
12252
0
                length += SCR_GET_SIZE((SecureRenegotiation*)extension->data,
12253
0
                        isRequest);
12254
0
                break;
12255
12256
0
            case TLSX_SESSION_TICKET:
12257
0
                length += WOLF_STK_GET_SIZE((SessionTicket*)extension->data,
12258
0
                        isRequest);
12259
0
                break;
12260
12261
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
12262
0
                length += ALPN_GET_SIZE((ALPN*)extension->data);
12263
0
                break;
12264
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12265
0
            case TLSX_SIGNATURE_ALGORITHMS:
12266
0
                length += SA_GET_SIZE(extension->data);
12267
0
                break;
12268
0
#endif
12269
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
12270
0
            case TLSX_ENCRYPT_THEN_MAC:
12271
0
                ret = ETM_GET_SIZE(msgType, &length);
12272
0
                break;
12273
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
12274
0
#ifdef WOLFSSL_TLS13
12275
0
            case TLSX_SUPPORTED_VERSIONS:
12276
0
                ret = SV_GET_SIZE(extension->data, msgType, &length);
12277
0
                break;
12278
12279
    #ifdef WOLFSSL_SEND_HRR_COOKIE
12280
            case TLSX_COOKIE:
12281
                ret = CKE_GET_SIZE((Cookie*)extension->data, msgType, &length);
12282
                break;
12283
    #endif
12284
12285
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12286
            case TLSX_PRE_SHARED_KEY:
12287
                ret = PSK_GET_SIZE((PreSharedKey*)extension->data, msgType,
12288
                                                                       &length);
12289
                break;
12290
12291
            case TLSX_PSK_KEY_EXCHANGE_MODES:
12292
                ret = PKM_GET_SIZE((byte)extension->val, msgType, &length);
12293
                break;
12294
    #endif
12295
12296
    #ifdef WOLFSSL_EARLY_DATA
12297
            case TLSX_EARLY_DATA:
12298
                ret = EDI_GET_SIZE(msgType, &length);
12299
                break;
12300
    #endif
12301
12302
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
12303
            case TLSX_POST_HANDSHAKE_AUTH:
12304
                ret = PHA_GET_SIZE(msgType, &length);
12305
                break;
12306
    #endif
12307
12308
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12309
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
12310
0
                length += SAC_GET_SIZE(extension->data);
12311
0
                break;
12312
0
    #endif
12313
12314
0
            case TLSX_KEY_SHARE:
12315
0
                length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType);
12316
0
                break;
12317
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
12318
            case TLSX_CERTIFICATE_AUTHORITIES:
12319
                length += CAN_GET_SIZE(extension->data);
12320
                break;
12321
    #endif
12322
0
#endif
12323
#ifdef WOLFSSL_SRTP
12324
            case TLSX_USE_SRTP:
12325
                length += SRTP_GET_SIZE((TlsxSrtp*)extension->data);
12326
                break;
12327
#endif
12328
12329
#ifdef HAVE_RPK
12330
            case TLSX_CLIENT_CERTIFICATE_TYPE:
12331
                length += CCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
12332
                break;
12333
12334
            case TLSX_SERVER_CERTIFICATE_TYPE:
12335
                length += SCT_GET_SIZE((WOLFSSL*)extension->data, msgType);
12336
                break;
12337
#endif /* HAVE_RPK */
12338
12339
#ifdef WOLFSSL_QUIC
12340
            case TLSX_KEY_QUIC_TP_PARAMS:
12341
                FALL_THROUGH; /* followed by */
12342
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
12343
                length += QTP_GET_SIZE(extension);
12344
                break;
12345
#endif
12346
#ifdef WOLFSSL_DTLS_CID
12347
            case TLSX_CONNECTION_ID:
12348
                length += CID_GET_SIZE((byte*)extension->data);
12349
                break;
12350
#endif /* WOLFSSL_DTLS_CID */
12351
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
12352
            case TLSX_ECH:
12353
                length += ECH_GET_SIZE((WOLFSSL_ECH*)extension->data);
12354
                break;
12355
#endif
12356
0
            default:
12357
0
                break;
12358
0
        }
12359
12360
        /* marks the extension as processed so ctx level */
12361
        /* extensions don't overlap with ssl level ones. */
12362
0
        TURN_ON(semaphore, TLSX_ToSemaphore(extension->type));
12363
0
    }
12364
12365
0
    *pLength += length;
12366
12367
0
    return ret;
12368
0
}
12369
12370
/** Writes the extensions of a list in a buffer. */
12371
static int TLSX_Write(TLSX* list, byte* output, byte* semaphore,
12372
                         byte msgType, word16* pOffset)
12373
0
{
12374
0
    int    ret = 0;
12375
0
    TLSX*  extension;
12376
0
    word16 offset = 0;
12377
0
    word16 length_offset = 0;
12378
0
    byte   isRequest = (msgType == client_hello ||
12379
0
                        msgType == certificate_request);
12380
12381
0
    while ((extension = list)) {
12382
0
        list = extension->next;
12383
12384
        /* only extensions marked as response are written in a response. */
12385
0
        if (!isRequest && !extension->resp)
12386
0
            continue; /* skip! */
12387
12388
        /* ssl level extensions are expected to override ctx level ones. */
12389
0
        if (!IS_OFF(semaphore, TLSX_ToSemaphore(extension->type)))
12390
0
            continue; /* skip! */
12391
12392
        /* writes extension type. */
12393
0
        c16toa(extension->type, output + offset);
12394
0
        offset += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN;
12395
0
        length_offset = offset;
12396
12397
        /* extension data should be written internally. */
12398
0
        switch (extension->type) {
12399
0
#ifdef HAVE_SNI
12400
0
            case TLSX_SERVER_NAME:
12401
0
                if (isRequest) {
12402
0
                    WOLFSSL_MSG("SNI extension to write");
12403
0
                    offset += SNI_WRITE((SNI*)extension->data, output + offset);
12404
0
                }
12405
0
                break;
12406
0
#endif
12407
12408
0
            case TLSX_TRUSTED_CA_KEYS:
12409
0
                WOLFSSL_MSG("Trusted CA Indication extension to write");
12410
0
                if (isRequest) {
12411
0
                    offset += TCA_WRITE((TCA*)extension->data, output + offset);
12412
0
                }
12413
0
                break;
12414
12415
0
            case TLSX_MAX_FRAGMENT_LENGTH:
12416
0
                WOLFSSL_MSG("Max Fragment Length extension to write");
12417
0
                offset += MFL_WRITE((byte*)extension->data, output + offset);
12418
0
                break;
12419
12420
0
            case TLSX_EXTENDED_MASTER_SECRET:
12421
0
                WOLFSSL_MSG("Extended Master Secret");
12422
                /* always empty. */
12423
0
                break;
12424
12425
0
            case TLSX_TRUNCATED_HMAC:
12426
0
                WOLFSSL_MSG("Truncated HMAC extension to write");
12427
                /* always empty. */
12428
0
                break;
12429
12430
0
            case TLSX_SUPPORTED_GROUPS:
12431
0
                WOLFSSL_MSG("Supported Groups extension to write");
12432
0
                offset += EC_WRITE((SupportedCurve*)extension->data,
12433
0
                                    output + offset);
12434
0
                break;
12435
12436
0
            case TLSX_EC_POINT_FORMATS:
12437
0
                WOLFSSL_MSG("Point Formats extension to write");
12438
0
                offset += PF_WRITE((PointFormat*)extension->data,
12439
0
                                    output + offset);
12440
0
                break;
12441
12442
0
            case TLSX_STATUS_REQUEST:
12443
0
                WOLFSSL_MSG("Certificate Status Request extension to write");
12444
0
                offset += CSR_WRITE((CertificateStatusRequest*)extension->data,
12445
0
                        output + offset, isRequest);
12446
0
                break;
12447
12448
0
            case TLSX_STATUS_REQUEST_V2:
12449
0
                WOLFSSL_MSG("Certificate Status Request v2 extension to write");
12450
0
                offset += CSR2_WRITE(
12451
0
                        (CertificateStatusRequestItemV2*)extension->data,
12452
0
                        output + offset, isRequest);
12453
0
                break;
12454
12455
0
            case TLSX_RENEGOTIATION_INFO:
12456
0
                WOLFSSL_MSG("Secure Renegotiation extension to write");
12457
0
                offset += SCR_WRITE((SecureRenegotiation*)extension->data,
12458
0
                        output + offset, isRequest);
12459
0
                break;
12460
12461
0
            case TLSX_SESSION_TICKET:
12462
0
                WOLFSSL_MSG("Session Ticket extension to write");
12463
0
                offset += WOLF_STK_WRITE((SessionTicket*)extension->data,
12464
0
                        output + offset, isRequest);
12465
0
                break;
12466
12467
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
12468
0
                WOLFSSL_MSG("ALPN extension to write");
12469
0
                offset += ALPN_WRITE((ALPN*)extension->data, output + offset);
12470
0
                break;
12471
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12472
0
            case TLSX_SIGNATURE_ALGORITHMS:
12473
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
12474
0
                offset += SA_WRITE(extension->data, output + offset);
12475
0
                break;
12476
0
#endif
12477
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
12478
0
            case TLSX_ENCRYPT_THEN_MAC:
12479
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension to write");
12480
0
                ret = ETM_WRITE(extension->data, output, msgType, &offset);
12481
0
                break;
12482
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
12483
0
#ifdef WOLFSSL_TLS13
12484
0
            case TLSX_SUPPORTED_VERSIONS:
12485
0
                WOLFSSL_MSG("Supported Versions extension to write");
12486
0
                ret = SV_WRITE(extension->data, output + offset, msgType, &offset);
12487
0
                break;
12488
12489
    #ifdef WOLFSSL_SEND_HRR_COOKIE
12490
            case TLSX_COOKIE:
12491
                WOLFSSL_MSG("Cookie extension to write");
12492
                ret = CKE_WRITE((Cookie*)extension->data, output + offset,
12493
                                msgType, &offset);
12494
                break;
12495
    #endif
12496
12497
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12498
            case TLSX_PRE_SHARED_KEY:
12499
                WOLFSSL_MSG("Pre-Shared Key extension to write");
12500
                ret = PSK_WRITE((PreSharedKey*)extension->data, output + offset,
12501
                                                              msgType, &offset);
12502
                break;
12503
12504
            case TLSX_PSK_KEY_EXCHANGE_MODES:
12505
                WOLFSSL_MSG("PSK Key Exchange Modes extension to write");
12506
                ret = PKM_WRITE((byte)extension->val, output + offset, msgType,
12507
                                                                       &offset);
12508
                break;
12509
    #endif
12510
12511
    #ifdef WOLFSSL_EARLY_DATA
12512
            case TLSX_EARLY_DATA:
12513
                WOLFSSL_MSG("Early Data extension to write");
12514
                ret = EDI_WRITE(extension->val, output + offset, msgType,
12515
                                                                       &offset);
12516
                break;
12517
    #endif
12518
12519
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
12520
            case TLSX_POST_HANDSHAKE_AUTH:
12521
                WOLFSSL_MSG("Post-Handshake Authentication extension to write");
12522
                ret = PHA_WRITE(output + offset, msgType, &offset);
12523
                break;
12524
    #endif
12525
12526
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12527
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
12528
0
                WOLFSSL_MSG("Signature Algorithms extension to write");
12529
0
                offset += SAC_WRITE(extension->data, output + offset);
12530
0
                break;
12531
0
    #endif
12532
12533
0
            case TLSX_KEY_SHARE:
12534
0
                WOLFSSL_MSG("Key Share extension to write");
12535
0
                offset += KS_WRITE((KeyShareEntry*)extension->data,
12536
0
                                                      output + offset, msgType);
12537
0
                break;
12538
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
12539
            case TLSX_CERTIFICATE_AUTHORITIES:
12540
                WOLFSSL_MSG("Certificate Authorities extension to write");
12541
                offset += CAN_WRITE(extension->data, output + offset);
12542
                break;
12543
    #endif
12544
0
#endif
12545
#ifdef WOLFSSL_SRTP
12546
            case TLSX_USE_SRTP:
12547
                WOLFSSL_MSG("SRTP extension to write");
12548
                offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset);
12549
                break;
12550
#endif
12551
12552
#ifdef HAVE_RPK
12553
            case TLSX_CLIENT_CERTIFICATE_TYPE:
12554
                WOLFSSL_MSG("Client Certificate Type extension to write");
12555
                offset += CCT_WRITE(extension->data, output + offset, msgType);
12556
                break;
12557
12558
            case TLSX_SERVER_CERTIFICATE_TYPE:
12559
                WOLFSSL_MSG("Server Certificate Type extension to write");
12560
                offset += SCT_WRITE(extension->data, output + offset, msgType);
12561
                break;
12562
#endif /* HAVE_RPK */
12563
12564
#ifdef WOLFSSL_QUIC
12565
            case TLSX_KEY_QUIC_TP_PARAMS:
12566
                FALL_THROUGH;
12567
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
12568
                WOLFSSL_MSG("QUIC transport parameter to write");
12569
                offset += QTP_WRITE((QuicTransportParam*)extension->data,
12570
                                    output + offset);
12571
                break;
12572
#endif
12573
#ifdef WOLFSSL_DTLS_CID
12574
            case TLSX_CONNECTION_ID:
12575
                WOLFSSL_MSG("Connection ID extension to write");
12576
                offset += CID_WRITE((byte*)extension->data, output+offset);
12577
                break;
12578
12579
#endif /* WOLFSSL_DTLS_CID */
12580
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
12581
            case TLSX_ECH:
12582
                WOLFSSL_MSG("ECH extension to write");
12583
                ret = ECH_WRITE((WOLFSSL_ECH*)extension->data,
12584
                    output + offset, &offset);
12585
                break;
12586
#endif
12587
0
            default:
12588
0
                break;
12589
0
        }
12590
12591
        /* writes extension data length. */
12592
0
        c16toa(offset - length_offset, output + length_offset - OPAQUE16_LEN);
12593
12594
        /* marks the extension as processed so ctx level */
12595
        /* extensions don't overlap with ssl level ones. */
12596
0
        TURN_ON(semaphore, TLSX_ToSemaphore(extension->type));
12597
12598
        /* if we encountered an error propagate it */
12599
0
        if (ret != 0)
12600
0
            break;
12601
0
    }
12602
12603
0
    *pOffset += offset;
12604
12605
0
    return ret;
12606
0
}
12607
12608
#ifdef HAVE_SUPPORTED_CURVES
12609
12610
/* Populates the default supported groups / curves */
12611
static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
12612
0
{
12613
0
    int ret = WOLFSSL_SUCCESS;
12614
0
#ifdef WOLFSSL_TLS13
12615
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12616
    if (ssl->options.resuming && ssl->session->namedGroup != 0) {
12617
        return TLSX_UseSupportedCurve(extensions, ssl->session->namedGroup,
12618
                                                                     ssl->heap);
12619
    }
12620
#endif
12621
12622
0
    if (ssl->numGroups != 0) {
12623
0
        int i;
12624
0
        for (i = 0; i < ssl->numGroups; i++) {
12625
0
            ret = TLSX_UseSupportedCurve(extensions, ssl->group[i], ssl->heap);
12626
0
            if (ret != WOLFSSL_SUCCESS)
12627
0
                return ret;
12628
0
        }
12629
0
        return WOLFSSL_SUCCESS;
12630
0
    }
12631
0
#endif /* WOLFSSL_TLS13 */
12632
12633
0
#if defined(HAVE_ECC)
12634
        /* list in order by strength, since not all servers choose by strength */
12635
0
        #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
12636
0
            #ifndef NO_ECC_SECP
12637
0
                ret = TLSX_UseSupportedCurve(extensions,
12638
0
                                              WOLFSSL_ECC_SECP521R1, ssl->heap);
12639
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12640
0
            #endif
12641
0
        #endif
12642
0
        #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512
12643
0
            #ifdef HAVE_ECC_BRAINPOOL
12644
0
                ret = TLSX_UseSupportedCurve(extensions,
12645
0
                                        WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap);
12646
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12647
0
            #endif
12648
0
        #endif
12649
0
        #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
12650
0
            #ifndef NO_ECC_SECP
12651
0
                ret = TLSX_UseSupportedCurve(extensions,
12652
0
                                              WOLFSSL_ECC_SECP384R1, ssl->heap);
12653
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12654
0
            #endif
12655
0
            #ifdef HAVE_ECC_BRAINPOOL
12656
0
                ret = TLSX_UseSupportedCurve(extensions,
12657
0
                                        WOLFSSL_ECC_BRAINPOOLP384R1, ssl->heap);
12658
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12659
0
            #endif
12660
0
        #endif
12661
0
#endif /* HAVE_ECC */
12662
12663
0
        #ifndef HAVE_FIPS
12664
0
            #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
12665
0
                ret = TLSX_UseSupportedCurve(extensions,
12666
0
                                                   WOLFSSL_ECC_X448, ssl->heap);
12667
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12668
0
            #endif
12669
0
        #endif /* HAVE_FIPS */
12670
12671
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
12672
0
        #if (!defined(NO_ECC256)  || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
12673
0
            #ifndef NO_ECC_SECP
12674
0
                ret = TLSX_UseSupportedCurve(extensions,
12675
0
                                              WOLFSSL_ECC_SECP256R1, ssl->heap);
12676
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12677
0
            #endif
12678
0
            #ifdef HAVE_ECC_KOBLITZ
12679
0
                ret = TLSX_UseSupportedCurve(extensions,
12680
0
                                              WOLFSSL_ECC_SECP256K1, ssl->heap);
12681
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12682
0
            #endif
12683
0
            #ifdef HAVE_ECC_BRAINPOOL
12684
0
                ret = TLSX_UseSupportedCurve(extensions,
12685
0
                                        WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap);
12686
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12687
0
            #endif
12688
0
            #ifdef WOLFSSL_SM2
12689
0
                ret = TLSX_UseSupportedCurve(extensions,
12690
0
                                              WOLFSSL_ECC_SM2P256V1, ssl->heap);
12691
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12692
0
            #endif
12693
0
        #endif
12694
0
#endif /* HAVE_ECC */
12695
12696
0
        #ifndef HAVE_FIPS
12697
0
            #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
12698
0
                ret = TLSX_UseSupportedCurve(extensions,
12699
0
                                                 WOLFSSL_ECC_X25519, ssl->heap);
12700
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12701
0
            #endif
12702
0
        #endif /* HAVE_FIPS */
12703
12704
0
#if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES)
12705
0
        #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224
12706
0
            #ifndef NO_ECC_SECP
12707
0
                ret = TLSX_UseSupportedCurve(extensions,
12708
0
                                              WOLFSSL_ECC_SECP224R1, ssl->heap);
12709
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12710
0
            #endif
12711
0
            #ifdef HAVE_ECC_KOBLITZ
12712
0
                ret = TLSX_UseSupportedCurve(extensions,
12713
0
                                              WOLFSSL_ECC_SECP224K1, ssl->heap);
12714
0
                if (ret != WOLFSSL_SUCCESS) return ret;
12715
0
            #endif
12716
0
        #endif
12717
12718
0
    #ifndef HAVE_FIPS
12719
        #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192
12720
            #ifndef NO_ECC_SECP
12721
                ret = TLSX_UseSupportedCurve(extensions,
12722
                                              WOLFSSL_ECC_SECP192R1, ssl->heap);
12723
                if (ret != WOLFSSL_SUCCESS) return ret;
12724
            #endif
12725
            #ifdef HAVE_ECC_KOBLITZ
12726
                ret = TLSX_UseSupportedCurve(extensions,
12727
                                              WOLFSSL_ECC_SECP192K1, ssl->heap);
12728
                if (ret != WOLFSSL_SUCCESS) return ret;
12729
            #endif
12730
        #endif
12731
        #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160
12732
            #ifndef NO_ECC_SECP
12733
                ret = TLSX_UseSupportedCurve(extensions,
12734
                                              WOLFSSL_ECC_SECP160R1, ssl->heap);
12735
                if (ret != WOLFSSL_SUCCESS) return ret;
12736
            #endif
12737
            #ifdef HAVE_ECC_SECPR2
12738
                ret = TLSX_UseSupportedCurve(extensions,
12739
                                              WOLFSSL_ECC_SECP160R2, ssl->heap);
12740
                if (ret != WOLFSSL_SUCCESS) return ret;
12741
            #endif
12742
            #ifdef HAVE_ECC_KOBLITZ
12743
                ret = TLSX_UseSupportedCurve(extensions,
12744
                                              WOLFSSL_ECC_SECP160K1, ssl->heap);
12745
                if (ret != WOLFSSL_SUCCESS) return ret;
12746
            #endif
12747
        #endif
12748
0
    #endif /* HAVE_FIPS */
12749
0
#endif /* HAVE_ECC */
12750
12751
0
#ifndef NO_DH
12752
            /* Add FFDHE supported groups. */
12753
        #ifdef HAVE_FFDHE_8192
12754
            if (8192/8 >= ssl->options.minDhKeySz &&
12755
                                            8192/8 <= ssl->options.maxDhKeySz) {
12756
                ret = TLSX_UseSupportedCurve(extensions,
12757
                                             WOLFSSL_FFDHE_8192, ssl->heap);
12758
                if (ret != WOLFSSL_SUCCESS)
12759
                    return ret;
12760
            }
12761
        #endif
12762
        #ifdef HAVE_FFDHE_6144
12763
            if (6144/8 >= ssl->options.minDhKeySz &&
12764
                                            6144/8 <= ssl->options.maxDhKeySz) {
12765
                ret = TLSX_UseSupportedCurve(extensions,
12766
                                             WOLFSSL_FFDHE_6144, ssl->heap);
12767
                if (ret != WOLFSSL_SUCCESS)
12768
                    return ret;
12769
            }
12770
        #endif
12771
        #ifdef HAVE_FFDHE_4096
12772
            if (4096/8 >= ssl->options.minDhKeySz &&
12773
                                            4096/8 <= ssl->options.maxDhKeySz) {
12774
                ret = TLSX_UseSupportedCurve(extensions,
12775
                                             WOLFSSL_FFDHE_4096, ssl->heap);
12776
                if (ret != WOLFSSL_SUCCESS)
12777
                    return ret;
12778
            }
12779
        #endif
12780
        #ifdef HAVE_FFDHE_3072
12781
            if (3072/8 >= ssl->options.minDhKeySz &&
12782
                                            3072/8 <= ssl->options.maxDhKeySz) {
12783
                ret = TLSX_UseSupportedCurve(extensions,
12784
                                             WOLFSSL_FFDHE_3072, ssl->heap);
12785
                if (ret != WOLFSSL_SUCCESS)
12786
                    return ret;
12787
            }
12788
        #endif
12789
0
        #ifdef HAVE_FFDHE_2048
12790
0
            if (2048/8 >= ssl->options.minDhKeySz &&
12791
0
                                            2048/8 <= ssl->options.maxDhKeySz) {
12792
0
                ret = TLSX_UseSupportedCurve(extensions,
12793
0
                                             WOLFSSL_FFDHE_2048, ssl->heap);
12794
0
                if (ret != WOLFSSL_SUCCESS)
12795
0
                    return ret;
12796
0
            }
12797
0
        #endif
12798
0
#endif
12799
12800
#ifdef HAVE_PQC
12801
#ifdef WOLFSSL_WC_KYBER
12802
#ifdef WOLFSSL_KYBER512
12803
    if (ret == WOLFSSL_SUCCESS)
12804
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1,
12805
                                     ssl->heap);
12806
#endif
12807
#ifdef WOLFSSL_KYBER768
12808
    if (ret == WOLFSSL_SUCCESS)
12809
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
12810
                                     ssl->heap);
12811
#endif
12812
#ifdef WOLFSSL_KYBER768
12813
    if (ret == WOLFSSL_SUCCESS)
12814
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
12815
                                     ssl->heap);
12816
#endif
12817
#elif defined(HAVE_LIBOQS)
12818
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap);
12819
    if (ret == WOLFSSL_SUCCESS)
12820
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3,
12821
                                     ssl->heap);
12822
    if (ret == WOLFSSL_SUCCESS)
12823
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5,
12824
                                     ssl->heap);
12825
    if (ret == WOLFSSL_SUCCESS)
12826
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1,
12827
                                     ssl->heap);
12828
    if (ret == WOLFSSL_SUCCESS)
12829
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3,
12830
                                     ssl->heap);
12831
    if (ret == WOLFSSL_SUCCESS)
12832
        ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5,
12833
                                     ssl->heap);
12834
#elif defined(HAVE_PQM4)
12835
    ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap);
12836
#endif /* HAVE_LIBOQS */
12837
#endif /* HAVE_PQC */
12838
12839
0
    (void)ssl;
12840
0
    (void)extensions;
12841
12842
0
    return ret;
12843
0
}
12844
12845
#endif /* HAVE_SUPPORTED_CURVES */
12846
12847
int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
12848
0
{
12849
0
    int ret = 0;
12850
0
    byte* public_key      = NULL;
12851
0
    word16 public_key_len = 0;
12852
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
12853
    int usingPSK = 0;
12854
#endif
12855
0
#if defined(HAVE_SUPPORTED_CURVES) && defined(WOLFSSL_TLS13)
12856
0
    TLSX* extension = NULL;
12857
0
    word16 namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
12858
0
#endif
12859
12860
    /* server will add extension depending on what is parsed from client */
12861
0
    if (!isServer) {
12862
#if defined(HAVE_RPK)
12863
        ret = TLSX_ClientCertificateType_Use(ssl, isServer);
12864
        if (ret != 0)
12865
            return ret;
12866
12867
        ret = TLSX_ServerCertificateType_Use(ssl, isServer);
12868
        if (ret != 0)
12869
            return ret;
12870
#endif /* HAVE_RPK */
12871
12872
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
12873
0
        if (!ssl->options.disallowEncThenMac) {
12874
0
            ret = TLSX_EncryptThenMac_Use(ssl);
12875
0
            if (ret != 0)
12876
0
                return ret;
12877
0
        }
12878
0
#endif
12879
12880
0
#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
12881
0
                       defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
12882
0
        if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
12883
0
            if (TLSX_Find(ssl->ctx->extensions,
12884
0
                                               TLSX_SUPPORTED_GROUPS) == NULL) {
12885
0
                ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
12886
0
                if (ret != WOLFSSL_SUCCESS)
12887
0
                    return ret;
12888
0
            }
12889
0
        }
12890
0
        if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
12891
0
               TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
12892
0
               TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
12893
0
             ret = TLSX_UsePointFormat(&ssl->extensions,
12894
0
                                         WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
12895
0
             if (ret != WOLFSSL_SUCCESS)
12896
0
                 return ret;
12897
0
        }
12898
0
#endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
12899
12900
#ifdef WOLFSSL_SRTP
12901
        if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
12902
            WOLFSSL_MSG("Adding DTLS SRTP extension");
12903
            if ((ret = TLSX_UseSRTP(&ssl->extensions, ssl->dtlsSrtpProfiles,
12904
                                                                ssl->heap)) != 0) {
12905
                return ret;
12906
            }
12907
        }
12908
#endif
12909
0
    } /* is not server */
12910
12911
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12912
0
    WOLFSSL_MSG("Adding signature algorithms extension");
12913
0
    if ((ret = TLSX_SetSignatureAlgorithms(&ssl->extensions, ssl, ssl->heap))
12914
0
                                                                         != 0) {
12915
0
            return ret;
12916
0
    }
12917
#else
12918
    ret = 0;
12919
#endif
12920
0
#ifdef WOLFSSL_TLS13
12921
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
12922
        if (isServer && IsAtLeastTLSv1_3(ssl->version)) {
12923
            if (SSL_CA_NAMES(ssl) != NULL) {
12924
                WOLFSSL_MSG("Adding certificate authorities extension");
12925
                if ((ret = TLSX_Push(&ssl->extensions,
12926
                        TLSX_CERTIFICATE_AUTHORITIES, ssl, ssl->heap)) != 0) {
12927
                        return ret;
12928
                }
12929
            }
12930
        }
12931
    #endif
12932
0
        if (!isServer && IsAtLeastTLSv1_3(ssl->version)) {
12933
            /* Add mandatory TLS v1.3 extension: supported version */
12934
0
            WOLFSSL_MSG("Adding supported versions extension");
12935
0
            if ((ret = TLSX_SetSupportedVersions(&ssl->extensions, ssl,
12936
0
                                                             ssl->heap)) != 0) {
12937
0
                return ret;
12938
0
            }
12939
12940
    #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && \
12941
                       !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)
12942
        if (TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
12943
            /* Put in DH groups for TLS 1.3 only. */
12944
            ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
12945
            if (ret != WOLFSSL_SUCCESS)
12946
                return ret;
12947
        /* ret value will be overwritten in !NO_PSK case */
12948
        #ifdef NO_PSK
12949
            ret = 0;
12950
        #endif
12951
        }
12952
    #endif /* !(HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
12953
12954
0
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
12955
0
            if (ssl->certHashSigAlgoSz > 0) {
12956
0
                WOLFSSL_MSG("Adding signature algorithms cert extension");
12957
0
                if ((ret = TLSX_SetSignatureAlgorithmsCert(&ssl->extensions,
12958
0
                                                        ssl, ssl->heap)) != 0) {
12959
0
                    return ret;
12960
0
                }
12961
0
            }
12962
0
        #endif
12963
12964
0
        #if defined(HAVE_SUPPORTED_CURVES)
12965
0
            extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE);
12966
0
            if (extension == NULL) {
12967
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
12968
                if (ssl->options.resuming && ssl->session->namedGroup != 0)
12969
                    namedGroup = ssl->session->namedGroup;
12970
                else
12971
            #endif
12972
0
                if (ssl->numGroups > 0) {
12973
0
                    int set = 0;
12974
0
                    int i, j;
12975
12976
                    /* try to find the highest element in ssl->group[]
12977
                     * that is contained in preferredGroup[].
12978
                     */
12979
0
                    namedGroup = preferredGroup[0];
12980
0
                    for (i = 0; i < ssl->numGroups && !set; i++) {
12981
0
                        for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
12982
0
                            if (preferredGroup[j] == ssl->group[i]
12983
#ifdef HAVE_LIBOQS
12984
                                && TLSX_KeyShare_IsSupported(preferredGroup[j])
12985
#endif
12986
0
                                                                ) {
12987
0
                                namedGroup = ssl->group[i];
12988
0
                                set = 1;
12989
0
                                break;
12990
0
                            }
12991
0
                        }
12992
0
                    }
12993
0
                    if (!set)
12994
0
                        namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
12995
0
                }
12996
0
                else {
12997
                    /* Choose the most preferred group. */
12998
0
                    namedGroup = preferredGroup[0];
12999
#ifdef HAVE_LIBOQS
13000
                    if (!TLSX_KeyShare_IsSupported(namedGroup)) {
13001
                        int i = 1;
13002
                        for (;preferredGroup[i] != WOLFSSL_NAMED_GROUP_INVALID;
13003
                              i++) {
13004
                            if (TLSX_KeyShare_IsSupported(preferredGroup[i]))
13005
                                break;
13006
                        }
13007
                        namedGroup = preferredGroup[i];
13008
                    }
13009
#endif
13010
0
                }
13011
0
            }
13012
0
            else {
13013
0
                KeyShareEntry* kse = (KeyShareEntry*)extension->data;
13014
0
                if (kse)
13015
0
                    namedGroup = kse->group;
13016
0
            }
13017
0
            if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
13018
0
                ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
13019
0
                        &ssl->extensions);
13020
0
                if (ret != 0)
13021
0
                    return ret;
13022
0
            }
13023
0
        #endif /* HAVE_SUPPORTED_CURVES */
13024
13025
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13026
            TLSX_Remove(&ssl->extensions, TLSX_PRE_SHARED_KEY, ssl->heap);
13027
        #endif
13028
        #if defined(HAVE_SESSION_TICKET)
13029
            if (ssl->options.resuming && ssl->session->ticketLen > 0) {
13030
                WOLFSSL_SESSION* sess = ssl->session;
13031
            #ifdef WOLFSSL_32BIT_MILLI_TIME
13032
                word32 now, milli;
13033
            #else
13034
                word64 now, milli;
13035
            #endif
13036
13037
                if (sess->ticketLen > MAX_PSK_ID_LEN) {
13038
                    WOLFSSL_MSG("Session ticket length for PSK ext is too large");
13039
                    return BUFFER_ERROR;
13040
                }
13041
13042
                /* Determine the MAC algorithm for the cipher suite used. */
13043
                ssl->options.cipherSuite0 = sess->cipherSuite0;
13044
                ssl->options.cipherSuite  = sess->cipherSuite;
13045
                ret = SetCipherSpecs(ssl);
13046
                if (ret != 0)
13047
                    return ret;
13048
                now = TimeNowInMilliseconds();
13049
                if (now == 0)
13050
                    return GETTIME_ERROR;
13051
            #ifdef WOLFSSL_32BIT_MILLI_TIME
13052
                if (now < sess->ticketSeen)
13053
                    milli = (0xFFFFFFFFU - sess->ticketSeen) + 1 + now;
13054
                else
13055
                    milli = now - sess->ticketSeen;
13056
                milli += sess->ticketAdd;
13057
13058
                /* Pre-shared key is mandatory extension for resumption. */
13059
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
13060
                    sess->ticketLen, milli, ssl->specs.mac_algorithm,
13061
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
13062
                    NULL, ssl->heap);
13063
            #else
13064
                milli = now - sess->ticketSeen + sess->ticketAdd;
13065
13066
                /* Pre-shared key is mandatory extension for resumption. */
13067
                ret = TLSX_PreSharedKey_Use(&ssl->extensions, sess->ticket,
13068
                    sess->ticketLen, (word32)milli, ssl->specs.mac_algorithm,
13069
                    ssl->options.cipherSuite0, ssl->options.cipherSuite, 1,
13070
                    NULL, ssl->heap);
13071
            #endif
13072
                if (ret != 0)
13073
                    return ret;
13074
13075
                usingPSK = 1;
13076
            }
13077
        #endif
13078
    #ifndef NO_PSK
13079
        #ifndef WOLFSSL_PSK_ONE_ID
13080
            if (ssl->options.client_psk_cs_cb != NULL) {
13081
                int i;
13082
                const Suites* suites = WOLFSSL_SUITES(ssl);
13083
                for (i = 0; i < suites->suiteSz; i += 2) {
13084
                    byte cipherSuite0 = suites->suites[i + 0];
13085
                    byte cipherSuite = suites->suites[i + 1];
13086
                    unsigned int keySz;
13087
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
13088
                    int cnt = 0;
13089
                #endif
13090
13091
                #ifdef HAVE_NULL_CIPHER
13092
                    if (cipherSuite0 == ECC_BYTE ||
13093
                        cipherSuite0 == ECDHE_PSK_BYTE) {
13094
                        if (cipherSuite != TLS_SHA256_SHA256 &&
13095
                                             cipherSuite != TLS_SHA384_SHA384) {
13096
                            continue;
13097
                        }
13098
                    }
13099
                    else
13100
                #endif
13101
                #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \
13102
                    defined(WOLFSSL_SM3)
13103
                    if (cipherSuite0 == CIPHER_BYTE) {
13104
                        if ((cipherSuite != TLS_SM4_GCM_SM3) &&
13105
                            (cipherSuite != TLS_SM4_CCM_SM3)) {
13106
                            continue;
13107
                        }
13108
                    }
13109
                    else
13110
                #endif
13111
                    if (cipherSuite0 != TLS13_BYTE)
13112
                        continue;
13113
13114
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
13115
                    do {
13116
                        ssl->arrays->client_identity[0] = cnt;
13117
                #endif
13118
13119
                        ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
13120
                        keySz = ssl->options.client_psk_cs_cb(
13121
                            ssl, ssl->arrays->server_hint,
13122
                            ssl->arrays->client_identity, MAX_PSK_ID_LEN,
13123
                            ssl->arrays->psk_key, MAX_PSK_KEY_LEN,
13124
                            GetCipherNameInternal(cipherSuite0, cipherSuite));
13125
                        if (keySz > 0) {
13126
                            ssl->arrays->psk_keySz = keySz;
13127
                            ret = TLSX_PreSharedKey_Use(&ssl->extensions,
13128
                                (byte*)ssl->arrays->client_identity,
13129
                                (word16)XSTRLEN(ssl->arrays->client_identity),
13130
                                0, SuiteMac(WOLFSSL_SUITES(ssl)->suites + i),
13131
                                cipherSuite0, cipherSuite, 0, NULL, ssl->heap);
13132
                            if (ret != 0)
13133
                                return ret;
13134
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
13135
                            cnt++;
13136
                #endif
13137
                        }
13138
                #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS
13139
                    }
13140
                    while (keySz > 0);
13141
                #endif
13142
                }
13143
13144
                usingPSK = 1;
13145
            }
13146
            else
13147
        #endif
13148
            if (ssl->options.client_psk_cb != NULL ||
13149
                                     ssl->options.client_psk_tls13_cb != NULL) {
13150
                /* Default cipher suite. */
13151
                byte cipherSuite0 = TLS13_BYTE;
13152
                byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER;
13153
                int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE;
13154
                const char* cipherName = NULL;
13155
13156
                if (ssl->options.client_psk_tls13_cb != NULL) {
13157
                    ssl->arrays->psk_keySz = ssl->options.client_psk_tls13_cb(
13158
                        ssl, ssl->arrays->server_hint,
13159
                        ssl->arrays->client_identity, MAX_PSK_ID_LEN,
13160
                        ssl->arrays->psk_key, MAX_PSK_KEY_LEN, &cipherName);
13161
                    if (GetCipherSuiteFromName(cipherName, &cipherSuite0,
13162
                                        &cipherSuite, &cipherSuiteFlags) != 0) {
13163
                        return PSK_KEY_ERROR;
13164
                    }
13165
                }
13166
                else {
13167
                    ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
13168
                        ssl->arrays->server_hint, ssl->arrays->client_identity,
13169
                        MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
13170
                }
13171
        #if defined(OPENSSL_EXTRA)
13172
                /* OpenSSL treats 0 as a PSK key length of 0
13173
                 * and meaning no PSK available.
13174
                 */
13175
                if (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
13176
                    return PSK_KEY_ERROR;
13177
                }
13178
                if (ssl->arrays->psk_keySz > 0) {
13179
        #else
13180
                if (ssl->arrays->psk_keySz == 0 ||
13181
                                     ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) {
13182
                    return PSK_KEY_ERROR;
13183
                }
13184
        #endif
13185
                ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0';
13186
13187
                ssl->options.cipherSuite0 = cipherSuite0;
13188
                ssl->options.cipherSuite  = cipherSuite;
13189
                (void)cipherSuiteFlags;
13190
                ret = SetCipherSpecs(ssl);
13191
                if (ret != 0)
13192
                    return ret;
13193
13194
                ret = TLSX_PreSharedKey_Use(&ssl->extensions,
13195
                                  (byte*)ssl->arrays->client_identity,
13196
                                  (word16)XSTRLEN(ssl->arrays->client_identity),
13197
                                  0, ssl->specs.mac_algorithm,
13198
                                  cipherSuite0, cipherSuite, 0,
13199
                                  NULL, ssl->heap);
13200
                if (ret != 0)
13201
                    return ret;
13202
13203
                usingPSK = 1;
13204
        #if defined(OPENSSL_EXTRA)
13205
                }
13206
        #endif
13207
            }
13208
    #endif /* !NO_PSK */
13209
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13210
13211
            /* Some servers do not generate session tickets unless
13212
             * the extension is seen in a non-resume client hello.
13213
             * We used to send it only if we were otherwise using PSK.
13214
             * Now always send it. Define NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
13215
             * to revert to the old behaviour. */
13216
            #ifdef NO_TLSX_PSKKEM_PLAIN_ANNOUNCE
13217
            if (usingPSK)
13218
            #endif
13219
            {
13220
                byte modes = 0;
13221
13222
                (void)usingPSK;
13223
                /* Pre-shared key modes: mandatory extension for resumption. */
13224
            #ifdef HAVE_SUPPORTED_CURVES
13225
                if (!ssl->options.onlyPskDheKe)
13226
            #endif
13227
                {
13228
                    modes = 1 << PSK_KE;
13229
                }
13230
            #if !defined(NO_DH) || defined(HAVE_ECC) || \
13231
                              defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
13232
                if (!ssl->options.noPskDheKe) {
13233
                    modes |= 1 << PSK_DHE_KE;
13234
                }
13235
            #endif
13236
                ret = TLSX_PskKeyModes_Use(ssl, modes);
13237
                if (ret != 0)
13238
                    return ret;
13239
            }
13240
        #endif
13241
        #if defined(WOLFSSL_POST_HANDSHAKE_AUTH)
13242
            if (!isServer && ssl->options.postHandshakeAuth) {
13243
                ret = TLSX_PostHandAuth_Use(ssl);
13244
                if (ret != 0)
13245
                    return ret;
13246
            }
13247
        #endif
13248
#if defined(HAVE_ECH)
13249
            /* GREASE ECH */
13250
            if (ssl->echConfigs == NULL) {
13251
                ret = GREASE_ECH_USE(&(ssl->extensions), ssl->heap, ssl->rng);
13252
            }
13253
            else if (ssl->echConfigs != NULL) {
13254
                ret = ECH_USE(ssl->echConfigs, &(ssl->extensions), ssl->heap,
13255
                    ssl->rng);
13256
            }
13257
#endif
13258
0
        }
13259
#if defined(HAVE_ECH)
13260
        else if (IsAtLeastTLSv1_3(ssl->version)) {
13261
            if (ssl->ctx->echConfigs != NULL) {
13262
                ret = SERVER_ECH_USE(&(ssl->extensions), ssl->heap,
13263
                    ssl->ctx->echConfigs);
13264
13265
                if (ret == 0)
13266
                    TLSX_SetResponse(ssl, TLSX_ECH);
13267
            }
13268
        }
13269
#endif
13270
13271
0
#endif
13272
13273
0
    (void)isServer;
13274
0
    (void)public_key;
13275
0
    (void)public_key_len;
13276
0
    (void)ssl;
13277
13278
0
    return ret;
13279
0
}
13280
13281
13282
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT)
13283
13284
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13285
/* because the size of ech depends on the size of other extensions we need to
13286
 * get the size with ech special and process ech last, return status */
13287
static int TLSX_GetSizeWithEch(WOLFSSL* ssl, byte* semaphore, byte msgType,
13288
    word16* pLength)
13289
{
13290
    int ret = 0;
13291
    TLSX* echX = NULL;
13292
    TLSX* serverNameX = NULL;
13293
    TLSX** extensions = NULL;
13294
#ifdef WOLFSSL_SMALL_STACK
13295
    char* tmpServerName = NULL;
13296
#else
13297
    char tmpServerName[MAX_PUBLIC_NAME_SZ];
13298
#endif
13299
13300
    /* calculate the rest of the extensions length with inner ech */
13301
    if (ssl->extensions)
13302
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13303
13304
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions)
13305
        echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
13306
13307
    /* if type is outer change sni to public name */
13308
    if (echX != NULL && ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER) {
13309
        if (ssl->extensions) {
13310
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
13311
13312
            if (serverNameX != NULL)
13313
                extensions = &ssl->extensions;
13314
        }
13315
13316
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
13317
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
13318
            extensions = &ssl->ctx->extensions;
13319
        }
13320
13321
        /* store the inner server name */
13322
        if (serverNameX != NULL) {
13323
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
13324
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
13325
13326
        #ifdef WOLFSSL_SMALL_STACK
13327
            tmpServerName = (char*)XMALLOC(hostNameSz, ssl->heap,
13328
                DYNAMIC_TYPE_TMP_BUFFER);
13329
            if (tmpServerName == NULL)
13330
                return MEMORY_E;
13331
        #else
13332
            /* truncate if too long */
13333
            if (hostNameSz > MAX_PUBLIC_NAME_SZ)
13334
                hostNameSz = MAX_PUBLIC_NAME_SZ;
13335
        #endif
13336
13337
            XMEMCPY(tmpServerName, hostName, hostNameSz);
13338
        }
13339
13340
        /* remove the inner server name */
13341
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
13342
13343
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
13344
            ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
13345
            XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
13346
            ssl->heap);
13347
13348
        /* set the public name as the server name */
13349
        if (ret == WOLFSSL_SUCCESS)
13350
            ret = 0;
13351
    }
13352
13353
    if (ret == 0 && ssl->extensions)
13354
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, pLength);
13355
13356
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions)
13357
        ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType, pLength);
13358
13359
    if (serverNameX != NULL) {
13360
        /* remove the public name SNI */
13361
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
13362
13363
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
13364
            tmpServerName, XSTRLEN(tmpServerName), ssl->heap);
13365
13366
        /* restore the inner server name */
13367
        if (ret == WOLFSSL_SUCCESS)
13368
            ret = 0;
13369
    }
13370
13371
#ifdef WOLFSSL_SMALL_STACK
13372
    XFREE(tmpServerName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13373
#endif
13374
13375
    return ret;
13376
}
13377
#endif
13378
13379
/** Tells the buffered size of extensions to be sent into the client hello. */
13380
int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word16* pLength)
13381
0
{
13382
0
    int ret = 0;
13383
0
    word16 length = 0;
13384
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
13385
13386
0
    if (!TLSX_SupportExtensions(ssl))
13387
0
        return 0;
13388
0
    if (msgType == client_hello) {
13389
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
13390
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
13391
0
        WOLF_STK_VALIDATE_REQUEST(ssl);
13392
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13393
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
13394
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
13395
0
#endif
13396
0
#if defined(WOLFSSL_TLS13)
13397
0
        if (!IsAtLeastTLSv1_2(ssl)) {
13398
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
13399
0
        }
13400
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13401
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
13402
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
13403
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13404
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
13405
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
13406
        #endif
13407
        #ifdef WOLFSSL_EARLY_DATA
13408
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
13409
        #endif
13410
        #ifdef WOLFSSL_SEND_HRR_COOKIE
13411
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
13412
        #endif
13413
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13414
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
13415
        #endif
13416
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13417
            TURN_ON(semaphore,
13418
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
13419
        #endif
13420
0
        }
13421
0
    #endif
13422
0
#endif /* WOLFSSL_TLS13 */
13423
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
13424
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
13425
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
13426
            /* mark already sent, so it won't send it */
13427
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
13428
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
13429
        }
13430
    #endif
13431
0
    }
13432
13433
0
#ifdef WOLFSSL_TLS13
13434
0
    #ifndef NO_CERTS
13435
0
    else if (msgType == certificate_request) {
13436
        /* Don't send out any extension except those that are turned off. */
13437
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13438
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13439
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
13440
0
#endif
13441
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13442
        if (SSL_CA_NAMES(ssl) != NULL)
13443
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
13444
#endif
13445
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, OID_FILTERS
13446
         *       TLSX_STATUS_REQUEST
13447
         */
13448
0
    }
13449
0
    #endif
13450
#if defined(HAVE_ECH)
13451
    if (ssl->options.useEch == 1 && msgType == client_hello) {
13452
        ret = TLSX_GetSizeWithEch(ssl, semaphore, msgType, &length);
13453
        if (ret != 0)
13454
            return ret;
13455
    }
13456
    else
13457
#endif /* HAVE_ECH */
13458
0
#endif /* WOLFSSL_TLS13 */
13459
0
    {
13460
0
        if (ssl->extensions) {
13461
0
            ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
13462
0
            if (ret != 0)
13463
0
                return ret;
13464
0
        }
13465
0
        if (ssl->ctx && ssl->ctx->extensions) {
13466
0
            ret = TLSX_GetSize(ssl->ctx->extensions, semaphore, msgType,
13467
0
                &length);
13468
0
            if (ret != 0)
13469
0
                return ret;
13470
0
        }
13471
0
    }
13472
13473
0
#ifdef HAVE_EXTENDED_MASTER
13474
0
    if (msgType == client_hello && ssl->options.haveEMS &&
13475
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
13476
0
        length += HELLO_EXT_SZ;
13477
0
    }
13478
0
#endif
13479
13480
0
    if (length)
13481
0
        length += OPAQUE16_LEN; /* for total length storage. */
13482
13483
0
    *pLength += length;
13484
13485
0
    return ret;
13486
0
}
13487
13488
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13489
/* return status after writing the extensions with ech written last */
13490
static int TLSX_WriteWithEch(WOLFSSL* ssl, byte* output, byte* semaphore,
13491
    byte msgType, word16* pOffset)
13492
{
13493
    int ret = 0;
13494
    TLSX* echX = NULL;
13495
    TLSX* serverNameX = NULL;
13496
    TLSX** extensions = NULL;
13497
#ifdef WOLFSSL_SMALL_STACK
13498
    char* tmpServerName = NULL;
13499
#else
13500
    char tmpServerName[MAX_PUBLIC_NAME_SZ];
13501
#endif
13502
13503
    /* get the echX from either extensions or ctx */
13504
    if (ssl->extensions)
13505
        echX = TLSX_Find(ssl->extensions, TLSX_ECH);
13506
13507
    if (echX == NULL && ssl->ctx && ssl->ctx->extensions) {
13508
        /* if not NULL the semaphore will stop it from being counted */
13509
        if (echX == NULL)
13510
            echX = TLSX_Find(ssl->ctx->extensions, TLSX_ECH);
13511
    }
13512
13513
    /* if type is outer change sni to public name */
13514
    if (echX != NULL && ((WOLFSSL_ECH*)echX->data)->type == ECH_TYPE_OUTER) {
13515
        if (ssl->extensions) {
13516
            serverNameX = TLSX_Find(ssl->extensions, TLSX_SERVER_NAME);
13517
13518
            if (serverNameX != NULL)
13519
                extensions = &ssl->extensions;
13520
        }
13521
13522
        if (serverNameX == NULL && ssl->ctx && ssl->ctx->extensions) {
13523
            serverNameX = TLSX_Find(ssl->ctx->extensions, TLSX_SERVER_NAME);
13524
            extensions = &ssl->ctx->extensions;
13525
        }
13526
13527
        /* store the inner server name */
13528
        if (serverNameX != NULL) {
13529
            char* hostName = ((SNI*)serverNameX->data)->data.host_name;
13530
            word32 hostNameSz = (word32)XSTRLEN(hostName) + 1;
13531
13532
        #ifdef WOLFSSL_SMALL_STACK
13533
            tmpServerName = (char*)XMALLOC(hostNameSz, ssl->heap,
13534
                DYNAMIC_TYPE_TMP_BUFFER);
13535
            if (tmpServerName == NULL)
13536
                return MEMORY_E;
13537
        #else
13538
            /* truncate if too long */
13539
            if (hostNameSz > MAX_PUBLIC_NAME_SZ)
13540
                hostNameSz = MAX_PUBLIC_NAME_SZ;
13541
        #endif
13542
13543
            XMEMCPY(tmpServerName, hostName, hostNameSz);
13544
        }
13545
13546
        /* remove the inner server name */
13547
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
13548
13549
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME,
13550
            ((WOLFSSL_ECH*)echX->data)->echConfig->publicName,
13551
            XSTRLEN(((WOLFSSL_ECH*)echX->data)->echConfig->publicName),
13552
            ssl->heap);
13553
13554
        /* set the public name as the server name */
13555
        if (ret == WOLFSSL_SUCCESS)
13556
            ret = 0;
13557
    }
13558
13559
    if (echX != NULL) {
13560
        /* turn ech on so it doesn't write, then write it last */
13561
        TURN_ON(semaphore, TLSX_ToSemaphore(echX->type));
13562
    }
13563
13564
    if (ret == 0 && ssl->extensions) {
13565
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
13566
            msgType, pOffset);
13567
    }
13568
13569
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
13570
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
13571
            msgType, pOffset);
13572
    }
13573
13574
    if (echX != NULL) {
13575
        /* turn off and write it last */
13576
        TURN_OFF(semaphore, TLSX_ToSemaphore(echX->type));
13577
    }
13578
13579
    if (ret == 0 && ssl->extensions) {
13580
        ret = TLSX_Write(ssl->extensions, output + *pOffset, semaphore,
13581
            msgType, pOffset);
13582
    }
13583
13584
    if (ret == 0 && ssl->ctx && ssl->ctx->extensions) {
13585
        ret = TLSX_Write(ssl->ctx->extensions, output + *pOffset, semaphore,
13586
            msgType, pOffset);
13587
    }
13588
13589
    if (serverNameX != NULL) {
13590
        /* remove the public name SNI */
13591
        TLSX_Remove(extensions, TLSX_SERVER_NAME, ssl->heap);
13592
13593
        ret = TLSX_UseSNI(extensions, WOLFSSL_SNI_HOST_NAME, tmpServerName,
13594
            XSTRLEN(tmpServerName), ssl->heap);
13595
13596
        /* restore the inner server name */
13597
        if (ret == WOLFSSL_SUCCESS)
13598
            ret = 0;
13599
    }
13600
13601
#ifdef WOLFSSL_SMALL_STACK
13602
    XFREE(tmpServerName, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER);
13603
#endif
13604
13605
    return ret;
13606
}
13607
#endif
13608
13609
/** Writes the extensions to be sent into the client hello. */
13610
int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word16* pOffset)
13611
0
{
13612
0
    int ret = 0;
13613
0
    word16 offset = 0;
13614
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
13615
13616
0
    if (!TLSX_SupportExtensions(ssl) || output == NULL)
13617
0
        return 0;
13618
13619
0
    offset += OPAQUE16_LEN; /* extensions length */
13620
13621
0
    if (msgType == client_hello) {
13622
0
        EC_VALIDATE_REQUEST(ssl, semaphore);
13623
0
        PF_VALIDATE_REQUEST(ssl, semaphore);
13624
0
        WOLF_STK_VALIDATE_REQUEST(ssl);
13625
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13626
0
        if (WOLFSSL_SUITES(ssl)->hashSigAlgoSz == 0)
13627
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
13628
0
#endif
13629
0
#ifdef WOLFSSL_TLS13
13630
0
        if (!IsAtLeastTLSv1_2(ssl)) {
13631
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
13632
0
        }
13633
0
    #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13634
0
        if (!IsAtLeastTLSv1_3(ssl->version)) {
13635
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
13636
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13637
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PSK_KEY_EXCHANGE_MODES));
13638
        #endif
13639
        #ifdef WOLFSSL_EARLY_DATA
13640
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
13641
        #endif
13642
        #ifdef WOLFSSL_SEND_HRR_COOKIE
13643
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
13644
        #endif
13645
        #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
13646
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH));
13647
        #endif
13648
        #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13649
            TURN_ON(semaphore,
13650
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
13651
        #endif
13652
0
        }
13653
0
    #endif
13654
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13655
        /* Must write Pre-shared Key extension at the end in TLS v1.3.
13656
         * Must not write out Pre-shared Key extension in earlier versions of
13657
         * protocol.
13658
         */
13659
        TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
13660
    #endif
13661
0
#endif /* WOLFSSL_TLS13 */
13662
    #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \
13663
     || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
13664
         /* mark already sent, so it won't send it */
13665
        if (!SSL_CM(ssl)->ocspStaplingEnabled) {
13666
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
13667
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
13668
        }
13669
    #endif
13670
0
    }
13671
0
#ifdef WOLFSSL_TLS13
13672
0
    #ifndef NO_CERTS
13673
0
    else if (msgType == certificate_request) {
13674
        /* Don't send out any extension except those that are turned off. */
13675
0
        XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13676
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
13677
0
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS));
13678
0
#endif
13679
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
13680
        if (SSL_CA_NAMES(ssl) != NULL) {
13681
            TURN_OFF(semaphore,
13682
                    TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES));
13683
        }
13684
#endif
13685
        /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, TLSX_OID_FILTERS
13686
         *       TLSX_STATUS_REQUEST
13687
         */
13688
0
    }
13689
0
    #endif
13690
0
#endif
13691
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
13692
    if (ssl->options.useEch == 1 && msgType == client_hello) {
13693
        ret = TLSX_WriteWithEch(ssl, output, semaphore,
13694
                         msgType, &offset);
13695
        if (ret != 0)
13696
            return ret;
13697
    }
13698
    else
13699
#endif
13700
0
    {
13701
0
        if (ssl->extensions) {
13702
0
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
13703
0
                             msgType, &offset);
13704
0
            if (ret != 0)
13705
0
                return ret;
13706
0
        }
13707
0
        if (ssl->ctx && ssl->ctx->extensions) {
13708
0
            ret = TLSX_Write(ssl->ctx->extensions, output + offset, semaphore,
13709
0
                             msgType, &offset);
13710
0
            if (ret != 0)
13711
0
                return ret;
13712
0
        }
13713
0
    }
13714
13715
0
#ifdef HAVE_EXTENDED_MASTER
13716
0
    if (msgType == client_hello && ssl->options.haveEMS &&
13717
0
                  (!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade)) {
13718
0
        WOLFSSL_MSG("EMS extension to write");
13719
0
        c16toa(HELLO_EXT_EXTMS, output + offset);
13720
0
        offset += HELLO_EXT_TYPE_SZ;
13721
0
        c16toa(0, output + offset);
13722
0
        offset += HELLO_EXT_SZ_SZ;
13723
0
    }
13724
0
#endif
13725
13726
0
#ifdef WOLFSSL_TLS13
13727
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13728
    if (msgType == client_hello && IsAtLeastTLSv1_3(ssl->version)) {
13729
        /* Write out what we can of Pre-shared key extension.  */
13730
        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
13731
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
13732
                         client_hello, &offset);
13733
        if (ret != 0)
13734
            return ret;
13735
    }
13736
    #endif
13737
0
#endif
13738
13739
0
    if (offset > OPAQUE16_LEN || msgType != client_hello)
13740
0
        c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
13741
13742
0
     *pOffset += offset;
13743
13744
0
    return ret;
13745
0
}
13746
13747
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
13748
13749
#if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER)
13750
13751
/** Tells the buffered size of extensions to be sent into the server hello. */
13752
int TLSX_GetResponseSize(WOLFSSL* ssl, byte msgType, word16* pLength)
13753
0
{
13754
0
    int ret = 0;
13755
0
    word16 length = 0;
13756
0
    byte semaphore[SEMAPHORE_SIZE] = {0};
13757
13758
0
    switch (msgType) {
13759
0
#ifndef NO_WOLFSSL_SERVER
13760
0
        case server_hello:
13761
0
            PF_VALIDATE_RESPONSE(ssl, semaphore);
13762
0
        #ifdef WOLFSSL_TLS13
13763
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
13764
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13765
0
                    TURN_OFF(semaphore,
13766
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
13767
0
                #if defined(HAVE_SUPPORTED_CURVES)
13768
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13769
                    if (!ssl->options.noPskDheKe)
13770
                #endif
13771
0
                    {
13772
                        /* Expect KeyShare extension in ServerHello. */
13773
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
13774
0
                    }
13775
0
                #endif
13776
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13777
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
13778
                #endif
13779
                #ifdef WOLFSSL_DTLS_CID
13780
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
13781
                #endif
13782
0
                }
13783
0
            #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13784
0
                else {
13785
0
                #ifdef HAVE_SUPPORTED_CURVES
13786
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
13787
0
                #endif
13788
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13789
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
13790
                #endif
13791
0
                }
13792
0
            #endif
13793
0
        #endif /* WOLFSSL_TLS13 */
13794
0
            break;
13795
13796
0
    #ifdef WOLFSSL_TLS13
13797
0
        case hello_retry_request:
13798
0
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13799
0
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
13800
0
        #ifdef HAVE_SUPPORTED_CURVES
13801
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13802
            if (!ssl->options.noPskDheKe)
13803
        #endif
13804
0
            {
13805
                /* Expect KeyShare extension in HelloRetryRequest. */
13806
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
13807
0
            }
13808
0
        #endif
13809
        #ifdef WOLFSSL_SEND_HRR_COOKIE
13810
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
13811
        #endif
13812
0
            break;
13813
0
    #endif
13814
13815
0
    #ifdef WOLFSSL_TLS13
13816
0
        case encrypted_extensions:
13817
            /* Send out all extension except those that are turned on. */
13818
0
        #ifdef HAVE_ECC
13819
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
13820
0
        #endif
13821
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
13822
        #ifdef HAVE_SESSION_TICKET
13823
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
13824
        #endif
13825
0
        #ifdef HAVE_SUPPORTED_CURVES
13826
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
13827
0
        #endif
13828
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13829
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
13830
        #endif
13831
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
13832
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
13833
        #endif
13834
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
13835
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
13836
        #endif
13837
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
13838
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
13839
0
        #endif
13840
        #ifdef WOLFSSL_DTLS_CID
13841
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
13842
        #endif /* WOLFSSL_DTLS_CID */
13843
0
            break;
13844
13845
        #ifdef WOLFSSL_EARLY_DATA
13846
        case session_ticket:
13847
            if (ssl->options.tls1_3) {
13848
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13849
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
13850
            }
13851
            break;
13852
        #endif
13853
0
    #endif
13854
0
#endif
13855
13856
0
#ifdef WOLFSSL_TLS13
13857
0
    #ifndef NO_CERTS
13858
0
        case certificate:
13859
            /* Don't send out any extension except those that are turned off. */
13860
0
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13861
0
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
13862
            /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
13863
             *       TLSX_SERVER_CERTIFICATE_TYPE
13864
             */
13865
0
            break;
13866
0
    #endif
13867
0
#endif
13868
0
    }
13869
13870
0
#ifdef HAVE_EXTENDED_MASTER
13871
0
    if (ssl->options.haveEMS && msgType == server_hello &&
13872
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
13873
0
        length += HELLO_EXT_SZ;
13874
0
    }
13875
0
#endif
13876
13877
0
    if (TLSX_SupportExtensions(ssl)) {
13878
0
        ret = TLSX_GetSize(ssl->extensions, semaphore, msgType, &length);
13879
0
        if (ret != 0)
13880
0
            return ret;
13881
0
    }
13882
13883
    /* All the response data is set at the ssl object only, so no ctx here. */
13884
13885
0
    if (length || msgType != server_hello)
13886
0
        length += OPAQUE16_LEN; /* for total length storage. */
13887
13888
0
    *pLength += length;
13889
13890
0
    return ret;
13891
0
}
13892
13893
/** Writes the server hello extensions into a buffer. */
13894
int TLSX_WriteResponse(WOLFSSL *ssl, byte* output, byte msgType, word16* pOffset)
13895
0
{
13896
0
    int ret = 0;
13897
0
    word16 offset = 0;
13898
13899
0
    if (TLSX_SupportExtensions(ssl) && output) {
13900
0
        byte semaphore[SEMAPHORE_SIZE] = {0};
13901
13902
0
        switch (msgType) {
13903
0
#ifndef NO_WOLFSSL_SERVER
13904
0
            case server_hello:
13905
0
                PF_VALIDATE_RESPONSE(ssl, semaphore);
13906
0
    #ifdef WOLFSSL_TLS13
13907
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
13908
0
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13909
0
                    TURN_OFF(semaphore,
13910
0
                                     TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
13911
0
            #ifdef HAVE_SUPPORTED_CURVES
13912
                #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13913
                    if (!ssl->options.noPskDheKe)
13914
                #endif
13915
0
                    {
13916
                        /* Write out KeyShare in ServerHello. */
13917
0
                        TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
13918
0
                    }
13919
0
            #endif
13920
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13921
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
13922
            #endif
13923
            #ifdef WOLFSSL_DTLS_CID
13924
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
13925
            #endif /* WOLFSSL_DTLS_CID */
13926
0
                }
13927
0
        #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS)
13928
0
                else {
13929
0
            #ifdef HAVE_SUPPORTED_CURVES
13930
0
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
13931
0
            #endif
13932
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13933
                    TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
13934
            #endif
13935
0
                }
13936
0
        #endif
13937
0
    #endif
13938
0
                break;
13939
13940
0
    #ifdef WOLFSSL_TLS13
13941
0
            case hello_retry_request:
13942
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13943
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
13944
0
        #ifdef HAVE_SUPPORTED_CURVES
13945
            #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13946
                if (!ssl->options.noPskDheKe)
13947
            #endif
13948
0
                {
13949
                    /* Write out KeyShare in HelloRetryRequest. */
13950
0
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
13951
0
                }
13952
0
        #endif
13953
                /* Cookie is written below as last extension. */
13954
0
                break;
13955
0
    #endif
13956
13957
0
    #ifdef WOLFSSL_TLS13
13958
0
            case encrypted_extensions:
13959
                /* Send out all extension except those that are turned on. */
13960
0
        #ifdef HAVE_ECC
13961
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_EC_POINT_FORMATS));
13962
0
        #endif
13963
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS));
13964
        #ifdef HAVE_SESSION_TICKET
13965
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SESSION_TICKET));
13966
        #endif
13967
0
        #ifdef HAVE_SUPPORTED_CURVES
13968
0
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE));
13969
0
        #endif
13970
        #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
13971
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_PRE_SHARED_KEY));
13972
        #endif
13973
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST
13974
                TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
13975
        #endif
13976
        #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2
13977
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST_V2));
13978
        #endif
13979
0
        #if defined(HAVE_SERVER_RENEGOTIATION_INFO)
13980
0
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_RENEGOTIATION_INFO));
13981
0
        #endif
13982
        #ifdef WOLFSSL_DTLS_CID
13983
            TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_CONNECTION_ID));
13984
        #endif /* WOLFSSL_DTLS_CID */
13985
0
                break;
13986
13987
        #ifdef WOLFSSL_EARLY_DATA
13988
            case session_ticket:
13989
                if (ssl->options.tls1_3) {
13990
                    XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
13991
                    TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_EARLY_DATA));
13992
                }
13993
                break;
13994
        #endif
13995
0
    #endif
13996
0
#endif
13997
13998
0
    #ifdef WOLFSSL_TLS13
13999
0
        #ifndef NO_CERTS
14000
0
            case certificate:
14001
                /* Don't send out any extension except those that are turned
14002
                 * off. */
14003
0
                XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
14004
0
                TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_STATUS_REQUEST));
14005
                /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP,
14006
                 *       TLSX_SERVER_CERTIFICATE_TYPE
14007
                 */
14008
0
                break;
14009
0
        #endif
14010
0
    #endif
14011
14012
0
            default:
14013
0
                break;
14014
0
        }
14015
14016
0
        offset += OPAQUE16_LEN; /* extensions length */
14017
14018
0
        ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
14019
0
                         msgType, &offset);
14020
0
        if (ret != 0)
14021
0
            return ret;
14022
14023
#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SEND_HRR_COOKIE)
14024
        if (msgType == hello_retry_request) {
14025
            XMEMSET(semaphore, 0xff, SEMAPHORE_SIZE);
14026
            TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_COOKIE));
14027
            ret = TLSX_Write(ssl->extensions, output + offset, semaphore,
14028
                             msgType, &offset);
14029
            if (ret != 0)
14030
                return ret;
14031
        }
14032
#endif
14033
14034
0
#ifdef HAVE_EXTENDED_MASTER
14035
0
        if (ssl->options.haveEMS && msgType == server_hello &&
14036
0
                                              !IsAtLeastTLSv1_3(ssl->version)) {
14037
0
            WOLFSSL_MSG("EMS extension to write");
14038
0
            c16toa(HELLO_EXT_EXTMS, output + offset);
14039
0
            offset += HELLO_EXT_TYPE_SZ;
14040
0
            c16toa(0, output + offset);
14041
0
            offset += HELLO_EXT_SZ_SZ;
14042
0
        }
14043
0
#endif
14044
14045
0
        if (offset > OPAQUE16_LEN || msgType != server_hello)
14046
0
            c16toa(offset - OPAQUE16_LEN, output); /* extensions length */
14047
0
    }
14048
14049
0
    if (pOffset)
14050
0
        *pOffset += offset;
14051
14052
0
    return ret;
14053
0
}
14054
14055
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_SERVER */
14056
14057
#ifdef WOLFSSL_TLS13
14058
int TLSX_ParseVersion(WOLFSSL* ssl, const byte* input, word16 length,
14059
                      byte msgType, int* found)
14060
0
{
14061
0
    int ret = 0;
14062
0
    int offset = 0;
14063
14064
0
    *found = 0;
14065
0
    while (offset < (int)length) {
14066
0
        word16 type;
14067
0
        word16 size;
14068
14069
0
        if (offset + (2 * OPAQUE16_LEN) > length) {
14070
0
            ret = BUFFER_ERROR;
14071
0
            break;
14072
0
        }
14073
14074
0
        ato16(input + offset, &type);
14075
0
        offset += HELLO_EXT_TYPE_SZ;
14076
14077
0
        ato16(input + offset, &size);
14078
0
        offset += OPAQUE16_LEN;
14079
14080
0
        if (offset + size > length) {
14081
0
            ret = BUFFER_ERROR;
14082
0
            break;
14083
0
        }
14084
14085
0
        if (type == TLSX_SUPPORTED_VERSIONS) {
14086
0
            *found = 1;
14087
14088
0
            WOLFSSL_MSG("Supported Versions extension received");
14089
14090
0
            ret = SV_PARSE(ssl, input + offset, size, msgType, &ssl->version,
14091
0
                           &ssl->options, &ssl->extensions);
14092
0
            break;
14093
0
        }
14094
14095
0
        offset += size;
14096
0
    }
14097
14098
0
    return ret;
14099
0
}
14100
#endif
14101
14102
/** Parses a buffer of TLS extensions. */
14103
int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType,
14104
                                                                 Suites *suites)
14105
0
{
14106
0
    int ret = 0;
14107
0
    word16 offset = 0;
14108
0
    byte isRequest = (msgType == client_hello ||
14109
0
                      msgType == certificate_request);
14110
14111
0
#ifdef HAVE_EXTENDED_MASTER
14112
0
    byte pendingEMS = 0;
14113
0
#endif
14114
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
14115
    int pskDone = 0;
14116
#endif
14117
0
    byte seenType[SEMAPHORE_SIZE];  /* Seen known extensions. */
14118
14119
0
    if (!ssl || !input || (isRequest && !suites))
14120
0
        return BAD_FUNC_ARG;
14121
14122
    /* No known extensions seen yet. */
14123
0
    XMEMSET(seenType, 0, sizeof(seenType));
14124
14125
0
    while (ret == 0 && offset < length) {
14126
0
        word16 type;
14127
0
        word16 size;
14128
14129
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
14130
        if (msgType == client_hello && pskDone) {
14131
            WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR);
14132
            return PSK_KEY_ERROR;
14133
        }
14134
#endif
14135
14136
0
        if (length - offset < HELLO_EXT_TYPE_SZ + OPAQUE16_LEN)
14137
0
            return BUFFER_ERROR;
14138
14139
0
        ato16(input + offset, &type);
14140
0
        offset += HELLO_EXT_TYPE_SZ;
14141
14142
0
        ato16(input + offset, &size);
14143
0
        offset += OPAQUE16_LEN;
14144
14145
        /* Check we have a bit for extension type. */
14146
0
        if ((type <= 62) || (type == TLSX_RENEGOTIATION_INFO)
14147
        #ifdef WOLFSSL_QUIC
14148
            || (type == TLSX_KEY_QUIC_TP_PARAMS_DRAFT)
14149
        #endif
14150
0
            )
14151
0
        {
14152
            /* Detect duplicate recognized extensions. */
14153
0
            if (IS_OFF(seenType, TLSX_ToSemaphore(type))) {
14154
0
                TURN_ON(seenType, TLSX_ToSemaphore(type));
14155
0
            }
14156
0
            else {
14157
0
                return DUPLICATE_TLS_EXT_E;
14158
0
            }
14159
0
        }
14160
14161
0
        if (length - offset < size)
14162
0
            return BUFFER_ERROR;
14163
14164
0
        switch (type) {
14165
0
#ifdef HAVE_SNI
14166
0
            case TLSX_SERVER_NAME:
14167
0
                WOLFSSL_MSG("SNI extension received");
14168
            #ifdef WOLFSSL_DEBUG_TLS
14169
                WOLFSSL_BUFFER(input + offset, size);
14170
            #endif
14171
14172
0
#ifdef WOLFSSL_TLS13
14173
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
14174
0
                    if (msgType != client_hello &&
14175
0
                        msgType != encrypted_extensions)
14176
0
                        return EXT_NOT_ALLOWED;
14177
0
                }
14178
0
                else
14179
0
#endif
14180
0
                {
14181
0
                    if (msgType != client_hello &&
14182
0
                        msgType != server_hello)
14183
0
                        return EXT_NOT_ALLOWED;
14184
0
                }
14185
0
                ret = SNI_PARSE(ssl, input + offset, size, isRequest);
14186
0
                break;
14187
0
#endif
14188
14189
0
            case TLSX_TRUSTED_CA_KEYS:
14190
0
                WOLFSSL_MSG("Trusted CA extension received");
14191
            #ifdef WOLFSSL_DEBUG_TLS
14192
                WOLFSSL_BUFFER(input + offset, size);
14193
            #endif
14194
14195
0
#ifdef WOLFSSL_TLS13
14196
                /* RFC 8446 4.2.4 states trusted_ca_keys is not used
14197
                   in TLS 1.3. */
14198
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
14199
0
                    return EXT_NOT_ALLOWED;
14200
0
                }
14201
0
                else
14202
0
#endif
14203
0
                {
14204
0
                    if (msgType != client_hello &&
14205
0
                        msgType != server_hello)
14206
0
                        return EXT_NOT_ALLOWED;
14207
0
                }
14208
0
                ret = TCA_PARSE(ssl, input + offset, size, isRequest);
14209
0
                break;
14210
14211
0
            case TLSX_MAX_FRAGMENT_LENGTH:
14212
0
                WOLFSSL_MSG("Max Fragment Length extension received");
14213
            #ifdef WOLFSSL_DEBUG_TLS
14214
                WOLFSSL_BUFFER(input + offset, size);
14215
            #endif
14216
14217
0
#ifdef WOLFSSL_TLS13
14218
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
14219
0
                    if (msgType != client_hello &&
14220
0
                        msgType != encrypted_extensions) {
14221
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14222
0
                        return EXT_NOT_ALLOWED;
14223
0
                    }
14224
0
                }
14225
0
                else
14226
0
#endif
14227
0
                {
14228
0
                    if (msgType != client_hello &&
14229
0
                        msgType != server_hello) {
14230
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14231
0
                        return EXT_NOT_ALLOWED;
14232
0
                    }
14233
0
                }
14234
0
                ret = MFL_PARSE(ssl, input + offset, size, isRequest);
14235
0
                break;
14236
14237
0
            case TLSX_TRUNCATED_HMAC:
14238
0
                WOLFSSL_MSG("Truncated HMAC extension received");
14239
            #ifdef WOLFSSL_DEBUG_TLS
14240
                WOLFSSL_BUFFER(input + offset, size);
14241
            #endif
14242
14243
0
#ifdef WOLFSSL_TLS13
14244
0
                if (IsAtLeastTLSv1_3(ssl->version))
14245
0
                    break;
14246
0
#endif
14247
0
                if (msgType != client_hello)
14248
0
                    return EXT_NOT_ALLOWED;
14249
0
                ret = THM_PARSE(ssl, input + offset, size, isRequest);
14250
0
                break;
14251
14252
0
            case TLSX_SUPPORTED_GROUPS:
14253
0
                WOLFSSL_MSG("Supported Groups extension received");
14254
            #ifdef WOLFSSL_DEBUG_TLS
14255
                WOLFSSL_BUFFER(input + offset, size);
14256
            #endif
14257
14258
0
#ifdef WOLFSSL_TLS13
14259
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
14260
0
                    if (msgType != client_hello &&
14261
0
                        msgType != encrypted_extensions) {
14262
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14263
0
                        return EXT_NOT_ALLOWED;
14264
0
                    }
14265
0
                }
14266
0
                else
14267
0
#endif
14268
0
                {
14269
0
                    if (msgType != client_hello) {
14270
0
                        WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14271
0
                        return EXT_NOT_ALLOWED;
14272
0
                    }
14273
0
                }
14274
0
                ret = EC_PARSE(ssl, input + offset, size, isRequest,
14275
0
                        &ssl->extensions);
14276
0
                break;
14277
14278
0
            case TLSX_EC_POINT_FORMATS:
14279
0
                WOLFSSL_MSG("Point Formats extension received");
14280
            #ifdef WOLFSSL_DEBUG_TLS
14281
                WOLFSSL_BUFFER(input + offset, size);
14282
            #endif
14283
14284
0
#ifdef WOLFSSL_TLS13
14285
0
                if (IsAtLeastTLSv1_3(ssl->version))
14286
0
                    break;
14287
0
#endif
14288
0
                if (msgType != client_hello &&
14289
0
                    msgType != server_hello) {
14290
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14291
0
                    return EXT_NOT_ALLOWED;
14292
0
                }
14293
14294
0
                ret = PF_PARSE(ssl, input + offset, size, isRequest);
14295
0
                break;
14296
14297
0
            case TLSX_STATUS_REQUEST:
14298
0
                WOLFSSL_MSG("Certificate Status Request extension received");
14299
            #ifdef WOLFSSL_DEBUG_TLS
14300
                WOLFSSL_BUFFER(input + offset, size);
14301
            #endif
14302
14303
0
#ifdef WOLFSSL_TLS13
14304
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
14305
0
                    if (msgType != client_hello &&
14306
0
                        msgType != certificate_request &&
14307
0
                        msgType != certificate)
14308
0
                        return EXT_NOT_ALLOWED;
14309
0
                }
14310
0
                else
14311
0
 #endif
14312
0
                {
14313
0
                    if (msgType != client_hello &&
14314
0
                        msgType != server_hello)
14315
0
                        return EXT_NOT_ALLOWED;
14316
0
                }
14317
0
                ret = CSR_PARSE(ssl, input + offset, size, isRequest);
14318
0
                break;
14319
14320
0
            case TLSX_STATUS_REQUEST_V2:
14321
0
                WOLFSSL_MSG("Certificate Status Request v2 extension received");
14322
            #ifdef WOLFSSL_DEBUG_TLS
14323
                WOLFSSL_BUFFER(input + offset, size);
14324
            #endif
14325
14326
#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)
14327
                if (IsAtLeastTLSv1_3(ssl->version)) {
14328
                    if (msgType != client_hello &&
14329
                        msgType != certificate_request &&
14330
                        msgType != certificate)
14331
                        return EXT_NOT_ALLOWED;
14332
                }
14333
                else
14334
#endif
14335
0
                {
14336
0
                    if (msgType != client_hello &&
14337
0
                        msgType != server_hello)
14338
0
                        return EXT_NOT_ALLOWED;
14339
0
                }
14340
0
                ret = CSR2_PARSE(ssl, input + offset, size, isRequest);
14341
0
                break;
14342
14343
0
#ifdef HAVE_EXTENDED_MASTER
14344
0
            case HELLO_EXT_EXTMS:
14345
0
                WOLFSSL_MSG("Extended Master Secret extension received");
14346
            #ifdef WOLFSSL_DEBUG_TLS
14347
                WOLFSSL_BUFFER(input + offset, size);
14348
            #endif
14349
14350
0
#if defined(WOLFSSL_TLS13)
14351
0
                if (IsAtLeastTLSv1_3(ssl->version))
14352
0
                    break;
14353
0
#endif
14354
0
                if (msgType != client_hello &&
14355
0
                    msgType != server_hello)
14356
0
                    return EXT_NOT_ALLOWED;
14357
0
                if (size != 0)
14358
0
                    return BUFFER_ERROR;
14359
14360
0
#ifndef NO_WOLFSSL_SERVER
14361
0
                if (isRequest)
14362
0
                    ssl->options.haveEMS = 1;
14363
0
#endif
14364
0
                pendingEMS = 1;
14365
0
                break;
14366
0
#endif
14367
14368
0
            case TLSX_RENEGOTIATION_INFO:
14369
0
                WOLFSSL_MSG("Secure Renegotiation extension received");
14370
            #ifdef WOLFSSL_DEBUG_TLS
14371
                WOLFSSL_BUFFER(input + offset, size);
14372
            #endif
14373
14374
0
#ifdef WOLFSSL_TLS13
14375
0
                if (IsAtLeastTLSv1_3(ssl->version))
14376
0
                    break;
14377
0
#endif
14378
0
                if (msgType != client_hello &&
14379
0
                    msgType != server_hello)
14380
0
                    return EXT_NOT_ALLOWED;
14381
0
                ret = SCR_PARSE(ssl, input + offset, size, isRequest);
14382
0
                break;
14383
14384
0
            case TLSX_SESSION_TICKET:
14385
0
                WOLFSSL_MSG("Session Ticket extension received");
14386
            #ifdef WOLFSSL_DEBUG_TLS
14387
                WOLFSSL_BUFFER(input + offset, size);
14388
            #endif
14389
14390
#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)
14391
                if (IsAtLeastTLSv1_3(ssl->version)) {
14392
                    if (msgType != client_hello)
14393
                        return EXT_NOT_ALLOWED;
14394
                }
14395
                else
14396
#endif
14397
0
                {
14398
0
                    if (msgType != client_hello &&
14399
0
                        msgType != server_hello)
14400
0
                        return EXT_NOT_ALLOWED;
14401
0
                }
14402
0
                ret = WOLF_STK_PARSE(ssl, input + offset, size, isRequest);
14403
0
                break;
14404
14405
0
            case TLSX_APPLICATION_LAYER_PROTOCOL:
14406
0
                WOLFSSL_MSG("ALPN extension received");
14407
14408
            #ifdef WOLFSSL_DEBUG_TLS
14409
                WOLFSSL_BUFFER(input + offset, size);
14410
            #endif
14411
14412
#if defined(WOLFSSL_TLS13) && defined(HAVE_ALPN)
14413
                if (IsAtLeastTLSv1_3(ssl->version)) {
14414
                    if (msgType != client_hello &&
14415
                        msgType != encrypted_extensions)
14416
                        return EXT_NOT_ALLOWED;
14417
                }
14418
                else
14419
#endif
14420
0
                {
14421
0
                    if (msgType != client_hello &&
14422
0
                        msgType != server_hello)
14423
0
                        return EXT_NOT_ALLOWED;
14424
0
                }
14425
0
                ret = ALPN_PARSE(ssl, input + offset, size, isRequest);
14426
0
                break;
14427
0
#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14428
0
            case TLSX_SIGNATURE_ALGORITHMS:
14429
0
                WOLFSSL_MSG("Signature Algorithms extension received");
14430
            #ifdef WOLFSSL_DEBUG_TLS
14431
                WOLFSSL_BUFFER(input + offset, size);
14432
            #endif
14433
14434
0
                if (!IsAtLeastTLSv1_2(ssl))
14435
0
                    break;
14436
0
            #ifdef WOLFSSL_TLS13
14437
0
                if (IsAtLeastTLSv1_3(ssl->version)) {
14438
0
                    if (msgType != client_hello &&
14439
0
                        msgType != certificate_request)
14440
0
                        return EXT_NOT_ALLOWED;
14441
0
                }
14442
0
                else
14443
0
            #endif
14444
0
                {
14445
0
                    if (msgType != client_hello)
14446
0
                        return EXT_NOT_ALLOWED;
14447
0
                }
14448
0
                ret = SA_PARSE(ssl, input + offset, size, isRequest, suites);
14449
0
                break;
14450
0
#endif
14451
14452
0
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
14453
0
            case TLSX_ENCRYPT_THEN_MAC:
14454
0
                WOLFSSL_MSG("Encrypt-Then-Mac extension received");
14455
14456
                /* Ignore for TLS 1.3+ */
14457
0
                if (IsAtLeastTLSv1_3(ssl->version))
14458
0
                    break;
14459
0
                if (msgType != client_hello &&
14460
0
                    msgType != server_hello)
14461
0
                    return EXT_NOT_ALLOWED;
14462
14463
0
                ret = ETM_PARSE(ssl, input + offset, size, msgType);
14464
0
                break;
14465
0
#endif /* HAVE_ENCRYPT_THEN_MAC */
14466
14467
0
#ifdef WOLFSSL_TLS13
14468
0
            case TLSX_SUPPORTED_VERSIONS:
14469
0
                WOLFSSL_MSG("Skipping Supported Versions - already processed");
14470
            #ifdef WOLFSSL_DEBUG_TLS
14471
                WOLFSSL_BUFFER(input + offset, size);
14472
            #endif
14473
0
                if (msgType != client_hello &&
14474
0
                    msgType != server_hello &&
14475
0
                    msgType != hello_retry_request)
14476
0
                    return EXT_NOT_ALLOWED;
14477
14478
0
                break;
14479
14480
    #ifdef WOLFSSL_SEND_HRR_COOKIE
14481
            case TLSX_COOKIE:
14482
                WOLFSSL_MSG("Cookie extension received");
14483
            #ifdef WOLFSSL_DEBUG_TLS
14484
                WOLFSSL_BUFFER(input + offset, size);
14485
            #endif
14486
14487
                if (!IsAtLeastTLSv1_3(ssl->version))
14488
                    break;
14489
14490
                if (msgType != client_hello &&
14491
                    msgType != hello_retry_request) {
14492
                    return EXT_NOT_ALLOWED;
14493
                }
14494
14495
                ret = CKE_PARSE(ssl, input + offset, size, msgType);
14496
                break;
14497
    #endif
14498
14499
    #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
14500
            case TLSX_PRE_SHARED_KEY:
14501
                WOLFSSL_MSG("Pre-Shared Key extension received");
14502
            #ifdef WOLFSSL_DEBUG_TLS
14503
                WOLFSSL_BUFFER(input + offset, size);
14504
            #endif
14505
14506
                if (!IsAtLeastTLSv1_3(ssl->version))
14507
                    break;
14508
14509
                if (msgType != client_hello &&
14510
                    msgType != server_hello) {
14511
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14512
                    return EXT_NOT_ALLOWED;
14513
                }
14514
14515
                ret = PSK_PARSE(ssl, input + offset, size, msgType);
14516
                pskDone = 1;
14517
                break;
14518
14519
            case TLSX_PSK_KEY_EXCHANGE_MODES:
14520
                WOLFSSL_MSG("PSK Key Exchange Modes extension received");
14521
            #ifdef WOLFSSL_DEBUG_TLS
14522
                WOLFSSL_BUFFER(input + offset, size);
14523
            #endif
14524
14525
                if (!IsAtLeastTLSv1_3(ssl->version))
14526
                    break;
14527
14528
                if (msgType != client_hello) {
14529
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14530
                    return EXT_NOT_ALLOWED;
14531
                }
14532
14533
                ret = PKM_PARSE(ssl, input + offset, size, msgType);
14534
                break;
14535
    #endif
14536
14537
    #ifdef WOLFSSL_EARLY_DATA
14538
            case TLSX_EARLY_DATA:
14539
                WOLFSSL_MSG("Early Data extension received");
14540
            #ifdef WOLFSSL_DEBUG_TLS
14541
                WOLFSSL_BUFFER(input + offset, size);
14542
            #endif
14543
14544
                if (!IsAtLeastTLSv1_3(ssl->version))
14545
                    break;
14546
14547
                if (msgType != client_hello && msgType != session_ticket &&
14548
                    msgType != encrypted_extensions) {
14549
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14550
                    return EXT_NOT_ALLOWED;
14551
                }
14552
                ret = EDI_PARSE(ssl, input + offset, size, msgType);
14553
                break;
14554
    #endif
14555
14556
    #ifdef WOLFSSL_POST_HANDSHAKE_AUTH
14557
            case TLSX_POST_HANDSHAKE_AUTH:
14558
                WOLFSSL_MSG("Post Handshake Authentication extension received");
14559
            #ifdef WOLFSSL_DEBUG_TLS
14560
                WOLFSSL_BUFFER(input + offset, size);
14561
            #endif
14562
14563
                if (!IsAtLeastTLSv1_3(ssl->version))
14564
                    break;
14565
14566
                if (msgType != client_hello) {
14567
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14568
                    return EXT_NOT_ALLOWED;
14569
                }
14570
14571
                ret = PHA_PARSE(ssl, input + offset, size, msgType);
14572
                break;
14573
    #endif
14574
14575
0
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
14576
0
            case TLSX_SIGNATURE_ALGORITHMS_CERT:
14577
0
                WOLFSSL_MSG("Signature Algorithms extension received");
14578
            #ifdef WOLFSSL_DEBUG_TLS
14579
                WOLFSSL_BUFFER(input + offset, size);
14580
            #endif
14581
14582
0
                if (!IsAtLeastTLSv1_3(ssl->version))
14583
0
                    break;
14584
14585
0
                if (msgType != client_hello &&
14586
0
                        msgType != certificate_request) {
14587
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14588
0
                    return EXT_NOT_ALLOWED;
14589
0
                }
14590
14591
0
                ret = SAC_PARSE(ssl, input + offset, size, isRequest);
14592
0
                break;
14593
0
    #endif
14594
14595
    #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES)
14596
            case TLSX_CERTIFICATE_AUTHORITIES:
14597
                WOLFSSL_MSG("Certificate Authorities extension received");
14598
            #ifdef WOLFSSL_DEBUG_TLS
14599
                WOLFSSL_BUFFER(input + offset, size);
14600
            #endif
14601
14602
                if (!IsAtLeastTLSv1_3(ssl->version))
14603
                    break;
14604
14605
                if (msgType != client_hello &&
14606
                        msgType != certificate_request) {
14607
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14608
                    return EXT_NOT_ALLOWED;
14609
                }
14610
14611
                ret = CAN_PARSE(ssl, input + offset, size, isRequest);
14612
                break;
14613
    #endif
14614
14615
0
            case TLSX_KEY_SHARE:
14616
0
                WOLFSSL_MSG("Key Share extension received");
14617
            #ifdef WOLFSSL_DEBUG_TLS
14618
                WOLFSSL_BUFFER(input + offset, size);
14619
            #endif
14620
14621
0
    #ifdef HAVE_SUPPORTED_CURVES
14622
0
                if (!IsAtLeastTLSv1_3(ssl->version))
14623
0
                    break;
14624
14625
0
                if (msgType != client_hello && msgType != server_hello &&
14626
0
                        msgType != hello_retry_request) {
14627
0
                    WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED);
14628
0
                    return EXT_NOT_ALLOWED;
14629
0
                }
14630
0
    #endif
14631
14632
0
                ret = KS_PARSE(ssl, input + offset, size, msgType);
14633
0
                break;
14634
0
#endif
14635
#ifdef WOLFSSL_SRTP
14636
            case TLSX_USE_SRTP:
14637
                WOLFSSL_MSG("Use SRTP extension received");
14638
                ret = SRTP_PARSE(ssl, input + offset, size, isRequest);
14639
                break;
14640
#endif
14641
#ifdef WOLFSSL_QUIC
14642
            case TLSX_KEY_QUIC_TP_PARAMS:
14643
                FALL_THROUGH;
14644
            case TLSX_KEY_QUIC_TP_PARAMS_DRAFT:
14645
                WOLFSSL_MSG("QUIC transport parameter received");
14646
            #ifdef WOLFSSL_DEBUG_TLS
14647
                WOLFSSL_BUFFER(input + offset, size);
14648
            #endif
14649
14650
                if (IsAtLeastTLSv1_3(ssl->version) &&
14651
                        msgType != client_hello &&
14652
                        msgType != server_hello &&
14653
                        msgType != encrypted_extensions) {
14654
                    return EXT_NOT_ALLOWED;
14655
                }
14656
                else if (!IsAtLeastTLSv1_3(ssl->version) &&
14657
                         msgType == encrypted_extensions) {
14658
                    return EXT_NOT_ALLOWED;
14659
                }
14660
                else if (WOLFSSL_IS_QUIC(ssl)) {
14661
                    ret = QTP_PARSE(ssl, input + offset, size, type, msgType);
14662
                }
14663
                else {
14664
                    WOLFSSL_MSG("QUIC transport param TLS extension type, but no QUIC");
14665
                    return EXT_NOT_ALLOWED; /* be safe, this should not happen */
14666
                }
14667
                break;
14668
#endif /* WOLFSSL_QUIC */
14669
#if defined(WOLFSSL_DTLS_CID)
14670
            case TLSX_CONNECTION_ID:
14671
                /* connection ID not supported in DTLSv1.2 */
14672
                if (!IsAtLeastTLSv1_3(ssl->version))
14673
                    break;
14674
14675
                if (msgType != client_hello && msgType != server_hello)
14676
                    return EXT_NOT_ALLOWED;
14677
14678
                WOLFSSL_MSG("ConnectionID extension received");
14679
                ret = CID_PARSE(ssl, input + offset, size, isRequest);
14680
                break;
14681
14682
#endif /* defined(WOLFSSL_DTLS_CID) */
14683
#if defined(HAVE_RPK)
14684
            case TLSX_CLIENT_CERTIFICATE_TYPE:
14685
                WOLFSSL_MSG("Client Certificate Type extension received");
14686
                ret = CCT_PARSE(ssl, input + offset, size, msgType);
14687
                break;
14688
14689
            case TLSX_SERVER_CERTIFICATE_TYPE:
14690
                WOLFSSL_MSG("Server Certificate Type extension received");
14691
                ret = SCT_PARSE(ssl, input + offset, size, msgType);
14692
                break;
14693
#endif /* HAVE_RPK */
14694
#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
14695
            case TLSX_ECH:
14696
                WOLFSSL_MSG("ECH extension received");
14697
                ret = ECH_PARSE(ssl, input + offset, size, msgType);
14698
                break;
14699
#endif
14700
0
            default:
14701
0
                WOLFSSL_MSG("Unknown TLS extension type");
14702
0
        }
14703
14704
        /* offset should be updated here! */
14705
0
        offset += size;
14706
0
    }
14707
14708
0
#ifdef HAVE_EXTENDED_MASTER
14709
0
    if (IsAtLeastTLSv1_3(ssl->version) && msgType == hello_retry_request) {
14710
        /* Don't change EMS status until server_hello received.
14711
         * Second ClientHello must have same extensions.
14712
         */
14713
0
    }
14714
0
    else if (!isRequest && ssl->options.haveEMS && !pendingEMS)
14715
0
        ssl->options.haveEMS = 0;
14716
0
#endif
14717
14718
0
    if (ret == 0)
14719
0
        ret = SNI_VERIFY_PARSE(ssl, isRequest);
14720
0
    if (ret == 0)
14721
0
        ret = TCA_VERIFY_PARSE(ssl, isRequest);
14722
14723
0
    return ret;
14724
0
}
14725
14726
/* undefining semaphore macros */
14727
#undef IS_OFF
14728
#undef TURN_ON
14729
#undef SEMAPHORE_SIZE
14730
14731
#endif /* HAVE_TLS_EXTENSIONS */
14732
14733
#ifndef NO_WOLFSSL_CLIENT
14734
14735
    WOLFSSL_METHOD* wolfTLS_client_method(void)
14736
0
    {
14737
0
        return wolfTLS_client_method_ex(NULL);
14738
0
    }
14739
    WOLFSSL_METHOD* wolfTLS_client_method_ex(void* heap)
14740
0
    {
14741
0
        WOLFSSL_METHOD* method =
14742
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14743
0
                                                     heap, DYNAMIC_TYPE_METHOD);
14744
0
        (void)heap;
14745
0
        WOLFSSL_ENTER("TLS_client_method_ex");
14746
0
        if (method) {
14747
0
        #if defined(WOLFSSL_TLS13)
14748
0
            InitSSL_Method(method, MakeTLSv1_3());
14749
        #elif !defined(WOLFSSL_NO_TLS12)
14750
            InitSSL_Method(method, MakeTLSv1_2());
14751
        #elif !defined(NO_OLD_TLS)
14752
            InitSSL_Method(method, MakeTLSv1_1());
14753
        #elif defined(WOLFSSL_ALLOW_TLSV10)
14754
            InitSSL_Method(method, MakeTLSv1());
14755
        #else
14756
            #error No TLS version enabled!
14757
        #endif
14758
14759
0
            method->downgrade = 1;
14760
0
            method->side      = WOLFSSL_CLIENT_END;
14761
0
        }
14762
0
        return method;
14763
0
    }
14764
14765
#ifndef NO_OLD_TLS
14766
    #ifdef WOLFSSL_ALLOW_TLSV10
14767
    WOLFSSL_METHOD* wolfTLSv1_client_method(void)
14768
    {
14769
        return wolfTLSv1_client_method_ex(NULL);
14770
    }
14771
    WOLFSSL_METHOD* wolfTLSv1_client_method_ex(void* heap)
14772
    {
14773
        WOLFSSL_METHOD* method =
14774
                             (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14775
                                                     heap, DYNAMIC_TYPE_METHOD);
14776
        (void)heap;
14777
        WOLFSSL_ENTER("TLSv1_client_method_ex");
14778
        if (method)
14779
            InitSSL_Method(method, MakeTLSv1());
14780
        return method;
14781
    }
14782
    #endif /* WOLFSSL_ALLOW_TLSV10 */
14783
14784
    WOLFSSL_METHOD* wolfTLSv1_1_client_method(void)
14785
    {
14786
        return wolfTLSv1_1_client_method_ex(NULL);
14787
    }
14788
    WOLFSSL_METHOD* wolfTLSv1_1_client_method_ex(void* heap)
14789
    {
14790
        WOLFSSL_METHOD* method =
14791
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14792
                                                     heap, DYNAMIC_TYPE_METHOD);
14793
        (void)heap;
14794
        WOLFSSL_ENTER("TLSv1_1_client_method_ex");
14795
        if (method)
14796
            InitSSL_Method(method, MakeTLSv1_1());
14797
        return method;
14798
    }
14799
#endif /* !NO_OLD_TLS */
14800
14801
#ifndef WOLFSSL_NO_TLS12
14802
    WOLFSSL_ABI
14803
    WOLFSSL_METHOD* wolfTLSv1_2_client_method(void)
14804
0
    {
14805
0
        return wolfTLSv1_2_client_method_ex(NULL);
14806
0
    }
14807
    WOLFSSL_METHOD* wolfTLSv1_2_client_method_ex(void* heap)
14808
0
    {
14809
0
        WOLFSSL_METHOD* method =
14810
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14811
0
                                                     heap, DYNAMIC_TYPE_METHOD);
14812
0
        (void)heap;
14813
0
        WOLFSSL_ENTER("TLSv1_2_client_method_ex");
14814
0
        if (method)
14815
0
            InitSSL_Method(method, MakeTLSv1_2());
14816
0
        return method;
14817
0
    }
14818
#endif /* WOLFSSL_NO_TLS12 */
14819
14820
#ifdef WOLFSSL_TLS13
14821
    /* The TLS v1.3 client method data.
14822
     *
14823
     * returns the method data for a TLS v1.3 client.
14824
     */
14825
    WOLFSSL_ABI
14826
    WOLFSSL_METHOD* wolfTLSv1_3_client_method(void)
14827
0
    {
14828
0
        return wolfTLSv1_3_client_method_ex(NULL);
14829
0
    }
14830
14831
    /* The TLS v1.3 client method data.
14832
     *
14833
     * heap  The heap used for allocation.
14834
     * returns the method data for a TLS v1.3 client.
14835
     */
14836
    WOLFSSL_METHOD* wolfTLSv1_3_client_method_ex(void* heap)
14837
0
    {
14838
0
        WOLFSSL_METHOD* method = (WOLFSSL_METHOD*)
14839
0
                                 XMALLOC(sizeof(WOLFSSL_METHOD), heap,
14840
0
                                         DYNAMIC_TYPE_METHOD);
14841
0
        (void)heap;
14842
0
        WOLFSSL_ENTER("TLSv1_3_client_method_ex");
14843
0
        if (method)
14844
0
            InitSSL_Method(method, MakeTLSv1_3());
14845
0
        return method;
14846
0
    }
14847
#endif /* WOLFSSL_TLS13 */
14848
14849
#ifdef WOLFSSL_DTLS
14850
14851
    WOLFSSL_METHOD* wolfDTLS_client_method(void)
14852
    {
14853
        return wolfDTLS_client_method_ex(NULL);
14854
    }
14855
    WOLFSSL_METHOD* wolfDTLS_client_method_ex(void* heap)
14856
    {
14857
        WOLFSSL_METHOD* method =
14858
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14859
                                                     heap, DYNAMIC_TYPE_METHOD);
14860
        (void)heap;
14861
        WOLFSSL_ENTER("DTLS_client_method_ex");
14862
        if (method) {
14863
        #if defined(WOLFSSL_DTLS13)
14864
            InitSSL_Method(method, MakeDTLSv1_3());
14865
        #elif !defined(WOLFSSL_NO_TLS12)
14866
            InitSSL_Method(method, MakeDTLSv1_2());
14867
        #elif !defined(NO_OLD_TLS)
14868
            InitSSL_Method(method, MakeDTLSv1());
14869
        #else
14870
            #error No DTLS version enabled!
14871
        #endif
14872
14873
            method->downgrade = 1;
14874
            method->side      = WOLFSSL_CLIENT_END;
14875
        }
14876
        return method;
14877
    }
14878
14879
    #ifndef NO_OLD_TLS
14880
    WOLFSSL_METHOD* wolfDTLSv1_client_method(void)
14881
    {
14882
        return wolfDTLSv1_client_method_ex(NULL);
14883
    }
14884
    WOLFSSL_METHOD* wolfDTLSv1_client_method_ex(void* heap)
14885
    {
14886
        WOLFSSL_METHOD* method =
14887
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14888
                                                 heap, DYNAMIC_TYPE_METHOD);
14889
        (void)heap;
14890
        WOLFSSL_ENTER("DTLSv1_client_method_ex");
14891
        if (method)
14892
            InitSSL_Method(method, MakeDTLSv1());
14893
        return method;
14894
    }
14895
    #endif  /* NO_OLD_TLS */
14896
14897
    #ifndef WOLFSSL_NO_TLS12
14898
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method(void)
14899
    {
14900
        return wolfDTLSv1_2_client_method_ex(NULL);
14901
    }
14902
    WOLFSSL_METHOD* wolfDTLSv1_2_client_method_ex(void* heap)
14903
    {
14904
        WOLFSSL_METHOD* method =
14905
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
14906
                                                 heap, DYNAMIC_TYPE_METHOD);
14907
        (void)heap;
14908
        WOLFSSL_ENTER("DTLSv1_2_client_method_ex");
14909
        if (method)
14910
            InitSSL_Method(method, MakeDTLSv1_2());
14911
        (void)heap;
14912
        return method;
14913
    }
14914
    #endif /* !WOLFSSL_NO_TLS12 */
14915
#endif /* WOLFSSL_DTLS */
14916
14917
#endif /* NO_WOLFSSL_CLIENT */
14918
14919
14920
/* EITHER SIDE METHODS */
14921
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)
14922
    #ifndef NO_OLD_TLS
14923
    #ifdef WOLFSSL_ALLOW_TLSV10
14924
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
14925
     *
14926
     * Returns a pointer to a WOLFSSL_METHOD struct
14927
     */
14928
    WOLFSSL_METHOD* wolfTLSv1_method(void)
14929
    {
14930
        return wolfTLSv1_method_ex(NULL);
14931
    }
14932
    WOLFSSL_METHOD* wolfTLSv1_method_ex(void* heap)
14933
    {
14934
        WOLFSSL_METHOD* m;
14935
        WOLFSSL_ENTER("TLSv1_method");
14936
    #ifndef NO_WOLFSSL_CLIENT
14937
        m = wolfTLSv1_client_method_ex(heap);
14938
    #else
14939
        m = wolfTLSv1_server_method_ex(heap);
14940
    #endif
14941
        if (m != NULL) {
14942
            m->side = WOLFSSL_NEITHER_END;
14943
        }
14944
14945
        return m;
14946
    }
14947
    #endif /* WOLFSSL_ALLOW_TLSV10 */
14948
14949
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
14950
     *
14951
     * Returns a pointer to a WOLFSSL_METHOD struct
14952
     */
14953
    WOLFSSL_METHOD* wolfTLSv1_1_method(void)
14954
    {
14955
        return wolfTLSv1_1_method_ex(NULL);
14956
    }
14957
    WOLFSSL_METHOD* wolfTLSv1_1_method_ex(void* heap)
14958
    {
14959
        WOLFSSL_METHOD* m;
14960
        WOLFSSL_ENTER("TLSv1_1_method");
14961
    #ifndef NO_WOLFSSL_CLIENT
14962
        m = wolfTLSv1_1_client_method_ex(heap);
14963
    #else
14964
        m = wolfTLSv1_1_server_method_ex(heap);
14965
    #endif
14966
        if (m != NULL) {
14967
            m->side = WOLFSSL_NEITHER_END;
14968
        }
14969
        return m;
14970
    }
14971
    #endif /* !NO_OLD_TLS */
14972
14973
    #ifndef WOLFSSL_NO_TLS12
14974
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
14975
     *
14976
     * Returns a pointer to a WOLFSSL_METHOD struct
14977
     */
14978
    WOLFSSL_METHOD* wolfTLSv1_2_method(void)
14979
    {
14980
        return wolfTLSv1_2_method_ex(NULL);
14981
    }
14982
    WOLFSSL_METHOD* wolfTLSv1_2_method_ex(void* heap)
14983
    {
14984
        WOLFSSL_METHOD* m;
14985
        WOLFSSL_ENTER("TLSv1_2_method");
14986
    #ifndef NO_WOLFSSL_CLIENT
14987
        m = wolfTLSv1_2_client_method_ex(heap);
14988
    #else
14989
        m = wolfTLSv1_2_server_method_ex(heap);
14990
    #endif
14991
        if (m != NULL) {
14992
            m->side = WOLFSSL_NEITHER_END;
14993
        }
14994
        return m;
14995
    }
14996
    #endif /* !WOLFSSL_NO_TLS12 */
14997
14998
    #ifdef WOLFSSL_TLS13
14999
    /* Gets a WOLFSSL_METHOD type that is not set as client or server
15000
     *
15001
     * Returns a pointer to a WOLFSSL_METHOD struct
15002
     */
15003
    WOLFSSL_METHOD* wolfTLSv1_3_method(void)
15004
    {
15005
        return wolfTLSv1_3_method_ex(NULL);
15006
    }
15007
    WOLFSSL_METHOD* wolfTLSv1_3_method_ex(void* heap)
15008
    {
15009
        WOLFSSL_METHOD* m;
15010
        WOLFSSL_ENTER("TLSv1_3_method");
15011
    #ifndef NO_WOLFSSL_CLIENT
15012
        m = wolfTLSv1_3_client_method_ex(heap);
15013
    #else
15014
        m = wolfTLSv1_3_server_method_ex(heap);
15015
    #endif
15016
        if (m != NULL) {
15017
            m->side = WOLFSSL_NEITHER_END;
15018
        }
15019
        return m;
15020
    }
15021
    #endif /* WOLFSSL_TLS13 */
15022
15023
#ifdef WOLFSSL_DTLS
15024
    WOLFSSL_METHOD* wolfDTLS_method(void)
15025
    {
15026
        return wolfDTLS_method_ex(NULL);
15027
    }
15028
    WOLFSSL_METHOD* wolfDTLS_method_ex(void* heap)
15029
    {
15030
        WOLFSSL_METHOD* m;
15031
        WOLFSSL_ENTER("DTLS_method_ex");
15032
    #ifndef NO_WOLFSSL_CLIENT
15033
        m = wolfDTLS_client_method_ex(heap);
15034
    #else
15035
        m = wolfDTLS_server_method_ex(heap);
15036
    #endif
15037
        if (m != NULL) {
15038
            m->side = WOLFSSL_NEITHER_END;
15039
        }
15040
        return m;
15041
    }
15042
15043
    #ifndef NO_OLD_TLS
15044
    WOLFSSL_METHOD* wolfDTLSv1_method(void)
15045
    {
15046
        return wolfDTLSv1_method_ex(NULL);
15047
    }
15048
    WOLFSSL_METHOD* wolfDTLSv1_method_ex(void* heap)
15049
    {
15050
        WOLFSSL_METHOD* m;
15051
        WOLFSSL_ENTER("DTLSv1_method_ex");
15052
    #ifndef NO_WOLFSSL_CLIENT
15053
        m = wolfDTLSv1_client_method_ex(heap);
15054
    #else
15055
        m = wolfDTLSv1_server_method_ex(heap);
15056
    #endif
15057
        if (m != NULL) {
15058
            m->side = WOLFSSL_NEITHER_END;
15059
        }
15060
        return m;
15061
    }
15062
    #endif /* !NO_OLD_TLS */
15063
    #ifndef WOLFSSL_NO_TLS12
15064
    WOLFSSL_METHOD* wolfDTLSv1_2_method(void)
15065
    {
15066
        return wolfDTLSv1_2_method_ex(NULL);
15067
    }
15068
    WOLFSSL_METHOD* wolfDTLSv1_2_method_ex(void* heap)
15069
    {
15070
        WOLFSSL_METHOD* m;
15071
        WOLFSSL_ENTER("DTLSv1_2_method");
15072
    #ifndef NO_WOLFSSL_CLIENT
15073
        m = wolfDTLSv1_2_client_method_ex(heap);
15074
    #else
15075
        m = wolfDTLSv1_2_server_method_ex(heap);
15076
    #endif
15077
        if (m != NULL) {
15078
            m->side = WOLFSSL_NEITHER_END;
15079
        }
15080
        return m;
15081
    }
15082
    #endif /* !WOLFSSL_NO_TLS12 */
15083
#endif /* WOLFSSL_DTLS */
15084
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
15085
15086
15087
#ifndef NO_WOLFSSL_SERVER
15088
15089
    WOLFSSL_METHOD* wolfTLS_server_method(void)
15090
0
    {
15091
0
        return wolfTLS_server_method_ex(NULL);
15092
0
    }
15093
15094
    WOLFSSL_METHOD* wolfTLS_server_method_ex(void* heap)
15095
0
    {
15096
0
        WOLFSSL_METHOD* method =
15097
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
15098
0
                                                     heap, DYNAMIC_TYPE_METHOD);
15099
0
        (void)heap;
15100
0
        WOLFSSL_ENTER("TLS_server_method_ex");
15101
0
        if (method) {
15102
0
        #if defined(WOLFSSL_TLS13)
15103
0
            InitSSL_Method(method, MakeTLSv1_3());
15104
        #elif !defined(WOLFSSL_NO_TLS12)
15105
            InitSSL_Method(method, MakeTLSv1_2());
15106
        #elif !defined(NO_OLD_TLS)
15107
            InitSSL_Method(method, MakeTLSv1_1());
15108
        #elif defined(WOLFSSL_ALLOW_TLSV10)
15109
            InitSSL_Method(method, MakeTLSv1());
15110
        #else
15111
            #error No TLS version enabled!
15112
        #endif
15113
15114
0
            method->downgrade = 1;
15115
0
            method->side      = WOLFSSL_SERVER_END;
15116
0
        }
15117
0
        return method;
15118
0
    }
15119
15120
#ifndef NO_OLD_TLS
15121
    #ifdef WOLFSSL_ALLOW_TLSV10
15122
    WOLFSSL_METHOD* wolfTLSv1_server_method(void)
15123
    {
15124
        return wolfTLSv1_server_method_ex(NULL);
15125
    }
15126
    WOLFSSL_METHOD* wolfTLSv1_server_method_ex(void* heap)
15127
    {
15128
        WOLFSSL_METHOD* method =
15129
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
15130
                                                     heap, DYNAMIC_TYPE_METHOD);
15131
        (void)heap;
15132
        WOLFSSL_ENTER("TLSv1_server_method_ex");
15133
        if (method) {
15134
            InitSSL_Method(method, MakeTLSv1());
15135
            method->side = WOLFSSL_SERVER_END;
15136
        }
15137
        return method;
15138
    }
15139
    #endif /* WOLFSSL_ALLOW_TLSV10 */
15140
15141
    WOLFSSL_METHOD* wolfTLSv1_1_server_method(void)
15142
    {
15143
        return wolfTLSv1_1_server_method_ex(NULL);
15144
    }
15145
    WOLFSSL_METHOD* wolfTLSv1_1_server_method_ex(void* heap)
15146
    {
15147
        WOLFSSL_METHOD* method =
15148
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
15149
                                                     heap, DYNAMIC_TYPE_METHOD);
15150
        (void)heap;
15151
        WOLFSSL_ENTER("TLSv1_1_server_method_ex");
15152
        if (method) {
15153
            InitSSL_Method(method, MakeTLSv1_1());
15154
            method->side = WOLFSSL_SERVER_END;
15155
        }
15156
        return method;
15157
    }
15158
#endif /* !NO_OLD_TLS */
15159
15160
15161
#ifndef WOLFSSL_NO_TLS12
15162
    WOLFSSL_ABI
15163
    WOLFSSL_METHOD* wolfTLSv1_2_server_method(void)
15164
0
    {
15165
0
        return wolfTLSv1_2_server_method_ex(NULL);
15166
0
    }
15167
    WOLFSSL_METHOD* wolfTLSv1_2_server_method_ex(void* heap)
15168
0
    {
15169
0
        WOLFSSL_METHOD* method =
15170
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
15171
0
                                                     heap, DYNAMIC_TYPE_METHOD);
15172
0
        (void)heap;
15173
0
        WOLFSSL_ENTER("TLSv1_2_server_method_ex");
15174
0
        if (method) {
15175
0
            InitSSL_Method(method, MakeTLSv1_2());
15176
0
            method->side = WOLFSSL_SERVER_END;
15177
0
        }
15178
0
        return method;
15179
0
    }
15180
#endif /* !WOLFSSL_NO_TLS12 */
15181
15182
#ifdef WOLFSSL_TLS13
15183
    /* The TLS v1.3 server method data.
15184
     *
15185
     * returns the method data for a TLS v1.3 server.
15186
     */
15187
    WOLFSSL_ABI
15188
    WOLFSSL_METHOD* wolfTLSv1_3_server_method(void)
15189
0
    {
15190
0
        return wolfTLSv1_3_server_method_ex(NULL);
15191
0
    }
15192
15193
    /* The TLS v1.3 server method data.
15194
     *
15195
     * heap  The heap used for allocation.
15196
     * returns the method data for a TLS v1.3 server.
15197
     */
15198
    WOLFSSL_METHOD* wolfTLSv1_3_server_method_ex(void* heap)
15199
0
    {
15200
0
        WOLFSSL_METHOD* method =
15201
0
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
15202
0
                                                     heap, DYNAMIC_TYPE_METHOD);
15203
0
        (void)heap;
15204
0
        WOLFSSL_ENTER("TLSv1_3_server_method_ex");
15205
0
        if (method) {
15206
0
            InitSSL_Method(method, MakeTLSv1_3());
15207
0
            method->side = WOLFSSL_SERVER_END;
15208
0
        }
15209
0
        return method;
15210
0
    }
15211
#endif /* WOLFSSL_TLS13 */
15212
15213
#ifdef WOLFSSL_DTLS
15214
    WOLFSSL_METHOD* wolfDTLS_server_method(void)
15215
    {
15216
        return wolfDTLS_server_method_ex(NULL);
15217
    }
15218
    WOLFSSL_METHOD* wolfDTLS_server_method_ex(void* heap)
15219
    {
15220
        WOLFSSL_METHOD* method =
15221
                              (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
15222
                                                     heap, DYNAMIC_TYPE_METHOD);
15223
        (void)heap;
15224
        WOLFSSL_ENTER("DTLS_server_method_ex");
15225
        if (method) {
15226
        #if defined(WOLFSSL_DTLS13)
15227
            InitSSL_Method(method, MakeDTLSv1_3());
15228
        #elif !defined(WOLFSSL_NO_TLS12)
15229
            InitSSL_Method(method, MakeDTLSv1_2());
15230
        #elif !defined(NO_OLD_TLS)
15231
            InitSSL_Method(method, MakeDTLSv1());
15232
        #else
15233
            #error No DTLS version enabled!
15234
        #endif
15235
15236
            method->downgrade = 1;
15237
            method->side      = WOLFSSL_SERVER_END;
15238
        }
15239
        return method;
15240
    }
15241
15242
    #ifndef NO_OLD_TLS
15243
    WOLFSSL_METHOD* wolfDTLSv1_server_method(void)
15244
    {
15245
        return wolfDTLSv1_server_method_ex(NULL);
15246
    }
15247
    WOLFSSL_METHOD* wolfDTLSv1_server_method_ex(void* heap)
15248
    {
15249
        WOLFSSL_METHOD* method =
15250
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
15251
                                                 heap, DYNAMIC_TYPE_METHOD);
15252
        (void)heap;
15253
        WOLFSSL_ENTER("DTLSv1_server_method_ex");
15254
        if (method) {
15255
            InitSSL_Method(method, MakeDTLSv1());
15256
            method->side = WOLFSSL_SERVER_END;
15257
        }
15258
        return method;
15259
    }
15260
    #endif /* !NO_OLD_TLS */
15261
15262
    #ifndef WOLFSSL_NO_TLS12
15263
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method(void)
15264
    {
15265
        return wolfDTLSv1_2_server_method_ex(NULL);
15266
    }
15267
    WOLFSSL_METHOD* wolfDTLSv1_2_server_method_ex(void* heap)
15268
    {
15269
        WOLFSSL_METHOD* method =
15270
                          (WOLFSSL_METHOD*) XMALLOC(sizeof(WOLFSSL_METHOD),
15271
                                                 heap, DYNAMIC_TYPE_METHOD);
15272
        WOLFSSL_ENTER("DTLSv1_2_server_method_ex");
15273
        (void)heap;
15274
        if (method) {
15275
            InitSSL_Method(method, MakeDTLSv1_2());
15276
            method->side = WOLFSSL_SERVER_END;
15277
        }
15278
        (void)heap;
15279
        return method;
15280
    }
15281
    #endif /* !WOLFSSL_NO_TLS12 */
15282
#endif /* WOLFSSL_DTLS */
15283
15284
#endif /* NO_WOLFSSL_SERVER */
15285
15286
#endif /* NO_TLS */
15287
15288
#endif /* WOLFCRYPT_ONLY */